From c51f44c9fe0de34300fa678e5cd8bbc660fc4157 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se> Date: Sun, 29 Sep 2002 23:07:09 +0200 Subject: [PATCH] New file. Rev: src/nettle/examples/rsa-keygen.c:1.1 --- examples/rsa-keygen.c | 213 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 examples/rsa-keygen.c diff --git a/examples/rsa-keygen.c b/examples/rsa-keygen.c new file mode 100644 index 00000000..78806b7a --- /dev/null +++ b/examples/rsa-keygen.c @@ -0,0 +1,213 @@ +/* rsa-keygen.c + * + */ + +/* 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 */ + +/* For asprintf */ +#define _GNU_SOURCE + +#include <ctype.h> +#include <errno.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#if !HAVE_LIBGMP +int +main(int argc, char **argv) +{ + fprintf(stderr, + "You need to install GMP somewhere where Nettle can find it,\n" + "and recompile Nettle\n"); + return EXIT_FAILURE; +} +#endif /* !HAVE_LIBGMP */ + +#include <unistd.h> +#include <fcntl.h> +#include <sys/types.h> +#include <sys/stat.h> + +#include "buffer.h" +#include "rsa.h" +#include "sexp.h" +#include "yarrow.h" + +#define KEYSIZE 500 +#define ESIZE 30 + +#define RANDOM_DEVICE "/dev/urandom" + +static void +progress(void *ctx, int c) +{ + (void) ctx; + fputc(c, stderr); +} + +static int +write_file(const char *name, struct nettle_buffer *buffer) +{ + const uint8_t *data = buffer->contents; + unsigned length = buffer->size; + int fd = open(name, O_WRONLY | O_CREAT | O_TRUNC, 0600); + + if (fd < 0) + return 0; + + while (length) + { + int res = write(fd, data, length); + if (res < 0) + { + if (errno == EINTR) + continue; + else + return 0; + } + data += res; + length -= res; + } + + return 1; +} + +int +main(int argc, char **argv) +{ + struct yarrow256_ctx yarrow; + struct rsa_public_key pub; + struct rsa_private_key priv; + char buf[16]; + int fd; + + int c; + char *pub_name = NULL; + char *priv_name = NULL;; + struct stat sbuf; + + struct nettle_buffer pub_buffer; + struct nettle_buffer priv_buffer; + + while ( (c = getopt(argc, argv, "o:")) != -1) + switch (c) + { + case 'o': + priv_name = optarg; + break; + case '?': + if (isprint (optopt)) + fprintf(stderr, "Unknown option `-%c'.\n", optopt); + else + fprintf(stderr, "Unknown option character `\\x%x'.\n", + optopt); + return EXIT_FAILURE; + default: + abort(); + } + + if (!priv_name) + { + fprintf(stderr, "No filename provided.\n"); + return EXIT_FAILURE; + } + + if (stat(priv_name, &sbuf) == 0) + { + fprintf(stderr, "The output file `%s' already exists.\n", priv_name); + return EXIT_FAILURE; + } + + asprintf(&pub_name, "%s.pub", priv_name); + if (!pub_name) + { + fprintf(stderr, "Memory exhausted.\n"); + return EXIT_FAILURE; + } + + if (stat(pub_name, &sbuf) == 0) + { + fprintf(stderr, "The output file `%s' already exists.\n", pub_name); + return EXIT_FAILURE; + } + + /* Read some data to seed the generator */ + if ( ( (fd = open(RANDOM_DEVICE, O_RDONLY)) < 0) + || (sizeof(buf) != read(fd, buf, sizeof(buf)))) + { + fprintf(stderr, "Failed to open `%s': %s\n", + RANDOM_DEVICE, strerror(errno)); + return EXIT_FAILURE; + } + + /* NOTE: No sources */ + yarrow256_init(&yarrow, 0, NULL); + yarrow256_seed(&yarrow, sizeof(buf), buf); + + rsa_init_public_key(&pub); + rsa_init_private_key(&priv); + + if (!rsa_generate_keypair + (&pub, &priv, + (void *) &yarrow, (nettle_random_func) yarrow256_random, + NULL, progress, + KEYSIZE, ESIZE)) + { + fprintf(stderr, "Key generation failed.\n"); + return EXIT_FAILURE; + } + + nettle_buffer_init(&priv_buffer); + nettle_buffer_init(&pub_buffer); + + if (!rsa_keypair_to_sexp(&pub_buffer, &pub, NULL)) + { + fprintf(stderr, "Formatting public key failed.\n"); + return EXIT_FAILURE; + } + + if (!rsa_keypair_to_sexp(&pub_buffer, &pub, &priv)) + { + fprintf(stderr, "Formatting private key failed.\n"); + return EXIT_FAILURE; + } + + if (!write_file(pub_name, &pub_buffer)) + { + fprintf(stderr, "Failed to write public key: %s\n", + strerror(errno)); + return EXIT_FAILURE; + } + + if (!write_file(priv_name, &priv_buffer)) + { + fprintf(stderr, "Failed to write private key: %s\n", + strerror(errno)); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} -- GitLab