3 * Miscellaneous functions used by the example programs.
6 /* nettle, low-level cryptographics library
8 * Copyright (C) 2002 Niels Möller
10 * The nettle library is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU Lesser General Public License as published by
12 * the Free Software Foundation; either version 2.1 of the License, or (at your
13 * option) any later version.
15 * The nettle library is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
17 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
18 * License for more details.
20 * You should have received a copy of the GNU Lesser General Public License
21 * along with the nettle library; see the file COPYING.LIB. If not, write to
22 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
33 /* For errno and strerror */
39 #define RANDOM_DEVICE "/dev/urandom"
47 void *p
= malloc(size
);
50 fprintf(stderr
, "Virtual memory exhausted.\n");
58 werror(const char *format
, ...)
63 va_start(args
, format
);
64 vfprintf(stderr
, format
, args
);
69 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
72 read_file(const char *name
, unsigned max_size
, char **contents
)
78 f
= fopen(name
, "rb");
81 werror("Opening `%s' failed: %s\n", name
, strerror(errno
));
87 for (buffer
= NULL
, done
= 0;; size
*= 2)
91 if (max_size
&& size
> max_size
)
94 /* Space for terminating NUL */
95 p
= realloc(buffer
, size
+ 1);
107 done
+= fread(buffer
+ done
, 1, size
- done
, f
);
111 /* Short count means EOF or read error */
114 fprintf (stderr
, "Reading `%s' failed: %s\n",
115 name
, strerror(errno
));
120 /* Treat empty file as error */
126 if (size
== max_size
)
132 /* NUL-terminate the data. */
140 write_string(FILE *f
, unsigned size
, const char *buffer
)
142 size_t res
= fwrite(buffer
, 1, size
, f
);
148 write_file(const char *name
, unsigned size
, const char *buffer
)
150 FILE *f
= fopen(name
, "wb");
156 res
= write_string(f
, size
, buffer
);
157 return fclose(f
) == 0 && res
;
161 simple_random(struct yarrow256_ctx
*ctx
, const char *name
)
167 length
= read_file(name
, 0, &buffer
);
169 length
= read_file(RANDOM_DEVICE
, 20, &buffer
);
174 yarrow256_seed(ctx
, length
, buffer
);
182 hash_file(const struct nettle_hash
*hash
, void *ctx
, FILE *f
)
186 char buffer
[BUFSIZE
];
187 size_t res
= fread(buffer
, 1, sizeof(buffer
), f
);
191 hash
->update(ctx
, res
, buffer
);