diff --git a/examples/io.c b/examples/io.c new file mode 100644 index 0000000000000000000000000000000000000000..8ce412c072aae1e3df3b5eb1ba009e8fc13a28f7 --- /dev/null +++ b/examples/io.c @@ -0,0 +1,180 @@ +/* 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 */ diff --git a/examples/io.h b/examples/io.h new file mode 100644 index 0000000000000000000000000000000000000000..cecd8919dc2b657bcf70b9f186e9d259c67135d7 --- /dev/null +++ b/examples/io.h @@ -0,0 +1,65 @@ +/* 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 */