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);