--- /dev/null
+/* io.c
+ *
+ * Miscellaneous functions used by the example programs.
+ */
+
+/* nettle, low-level cryptographics library
+ *
+ * Copyright (C) 2002 Niels Möller
+ *
+ * The nettle library is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or (at your
+ * option) any later version.
+ *
+ * The nettle library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with the nettle library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ */
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include "io.h"
+
+#include <stdarg.h>
+#include <stdlib.h>
+
+#define RANDOM_DEVICE "/dev/urandom"
+#define BUFSIZE 1000
+
+int quiet_flag = 0;
+
+void
+werror(const char *format, ...)
+{
+ if (!quiet_flag)
+ {
+ va_list args;
+ va_start(args, format);
+ vfprintf(stderr, format, args);
+ va_end(args);
+ }
+}
+
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+
+unsigned
+read_file(const char *name, unsigned max_size, char **buffer)
+{
+ unsigned size;
+ unsigned done;
+ FILE *f;
+
+ f = fopen(name, "rb");
+ if (!f)
+ return 0;
+
+ *buffer = NULL;
+
+ if (max_size && max_size < 100)
+ size = max_size;
+ else
+ size = 100;
+
+ for (size = 100, done = 0;
+ (!max_size || done < max_size) && !feof(f);
+ size *= 2)
+ {
+ char *p;
+
+ if (size > max_size)
+ size = max_size;
+
+ /* Space for terminating NUL */
+ p = realloc(*buffer, size + 1);
+
+ if (!p)
+ {
+ fail:
+ fclose(f);
+ free(*buffer);
+ *buffer = NULL;
+ return 0;
+ }
+
+ *buffer = p;
+ done += fread(buffer + done, 1, size - done, f);
+
+ if (ferror(f))
+ goto fail;
+ }
+
+ fclose(f);
+
+ /* NUL-terminate the data. */
+ (*buffer)[done] = '\0';
+ return done;
+}
+
+int
+write_file(const char *name, unsigned size, const char *buffer)
+{
+ FILE *f = fopen(name, "wb");
+ unsigned res;
+
+ if (!f)
+ return 0;
+
+ res = fwrite(buffer, 1, size, f);
+
+ if (res < size || ferror(f))
+ res = 0;
+
+ fclose(f);
+
+ return res > 0;
+}
+
+int
+simple_random(struct yarrow256_ctx *ctx, const char *name)
+{
+ unsigned length;
+ char *buffer;
+
+ if (name)
+ length = read_file(name, 0, &buffer);
+ else
+ length = read_file(RANDOM_DEVICE, 20, &buffer);
+
+ if (!length)
+ return 0;
+
+ yarrow256_seed(ctx, length, buffer);
+
+ return 1;
+}
+
+int
+hash_file(const struct nettle_hash *hash, void *ctx, FILE *f)
+{
+ for (;;)
+ {
+ char buffer[BUFSIZE];
+ size_t res = fread(buffer, 1, sizeof(buffer), f);
+ if (ferror(f))
+ return 0;
+
+ hash->update(ctx, res, buffer);
+ if (feof(f))
+ return 1;
+ }
+}
+
+#if WITH_PUBLIC_KEY
+int
+read_rsa_key(const char *name,
+ struct rsa_public_key *pub,
+ struct rsa_private_key *priv)
+{
+ unsigned length;
+ char *buffer;
+ int res;
+
+ length = read_file(name, 0, &buffer);
+ if (!length)
+ return 0;
+
+ res = rsa_keypair_from_sexp(pub, priv, length, buffer);
+ free(buffer);
+
+ return res;
+}
+#endif /* WITH_PUBLIC_KEY */
--- /dev/null
+/* io.c
+ *
+ * Miscellaneous functions used by the example programs.
+ */
+
+/* nettle, low-level cryptographics library
+ *
+ * Copyright (C) 2002 Niels Möller
+ *
+ * The nettle library is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or (at your
+ * option) any later version.
+ *
+ * The nettle library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with the nettle library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ */
+
+#ifndef NETTLE_EXAMPLES_IO_H_INCLUDED
+#define NETTLE_EXAMPLES_IO_H_INCLUDED
+
+#include "nettle-meta.h"
+#include "rsa.h"
+#include "yarrow.h"
+
+#include <stdio.h>
+
+extern int quiet_flag;
+
+void
+werror(const char *format, ...)
+#if __GNUC___
+ __attribute__((__format__ (__printf__,1, 2)))
+#endif
+ ;
+
+/* If size is > 0, read at most that many bytes. If size == 0,
+ * read until EOF. Allocates the buffer dynamically. */
+unsigned
+read_file(const char *name, unsigned size, char **buffer);
+
+int
+write_file(const char *name, unsigned size, const char *buffer);
+
+int
+simple_random(struct yarrow256_ctx *ctx, const char *name);
+
+int
+hash_file(const struct nettle_hash *hash, void *ctx, FILE *f);
+
+#if WITH_PUBLIC_KEY
+int
+read_rsa_key(const char *name,
+ struct rsa_public_key *pub,
+ struct rsa_private_key *priv);
+#endif
+
+#endif /* NETTLE_EXAMPLES_IO_H_INCLUDED */