3 Copyright (C) 2002 Niels Möller
5 This file is part of GNU Nettle.
7 GNU Nettle is free software: you can redistribute it and/or
8 modify it under the terms of either:
10 * the GNU Lesser General Public License as published by the Free
11 Software Foundation; either version 3 of the License, or (at your
12 option) any later version.
16 * the GNU General Public License as published by the Free
17 Software Foundation; either version 2 of the License, or (at your
18 option) any later version.
20 or both in parallel, as here.
22 GNU Nettle is distributed in the hope that it will be useful,
23 but WITHOUT ANY WARRANTY; without even the implied warranty of
24 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
25 General Public License for more details.
27 You should have received copies of the GNU General Public License and
28 the GNU Lesser General Public License along with this program. If
29 not, see http://www.gnu.org/licenses/.
51 #define DEFAULT_KEYSIZE 2048
55 progress(void *ctx, int c)
62 uint_arg (char c, const char *arg)
67 val = strtoul(arg, &end, 0);
68 if (*arg == '\0' || *end != '\0')
70 werror ("Invalid integer argument for -%c option.\n", c);
78 main(int argc, char **argv)
80 struct yarrow256_ctx yarrow;
81 struct rsa_public_key pub;
82 struct rsa_private_key priv;
85 char *pub_name = NULL;
86 const char *priv_name = NULL;
87 const char *random_name = NULL;
89 struct nettle_buffer pub_buffer;
90 struct nettle_buffer priv_buffer;
92 unsigned long key_size = DEFAULT_KEYSIZE;
93 unsigned long key_e = 0;
95 enum { OPT_HELP = 300 };
96 static const struct option options[] =
98 /* Name, args, flag, val */
99 { "help", no_argument, NULL, OPT_HELP },
100 { "random", required_argument, NULL, 'r' },
104 while ( (c = getopt_long(argc, argv, "o:r:e:s:", options, NULL)) != -1)
112 random_name = optarg;
116 key_size = uint_arg ('s', optarg);
120 key_e = uint_arg ('e', optarg);
124 printf("FIXME: Usage information.\n");
136 werror("No filename provided.\n");
140 pub_name = xalloc(strlen(priv_name) + 5);
141 sprintf(pub_name, "%s.pub", priv_name);
143 /* NOTE: No sources */
144 yarrow256_init(&yarrow, 0, NULL);
146 /* Read some data to seed the generator */
147 if (!simple_random(&yarrow, random_name))
149 werror("Initialization of randomness generator failed.\n");
153 rsa_public_key_init(&pub);
154 rsa_private_key_init(&priv);
157 mpz_set_ui (pub.e, key_e);
159 if (!rsa_generate_keypair
161 (void *) &yarrow, (nettle_random_func *) yarrow256_random,
163 key_size, key_e == 0 ? ESIZE : 0))
165 werror("Key generation failed.\n");
169 nettle_buffer_init(&priv_buffer);
170 nettle_buffer_init(&pub_buffer);
172 if (!rsa_keypair_to_sexp(&pub_buffer, "rsa-pkcs1-sha1", &pub, NULL))
174 werror("Formatting public key failed.\n");
178 if (!rsa_keypair_to_sexp(&priv_buffer, "rsa-pkcs1-sha1", &pub, &priv))
180 werror("Formatting private key failed.\n");
184 if (!write_file(pub_name, pub_buffer.size, pub_buffer.contents))
186 werror("Failed to write public key: %s\n",
191 /* NOTE: This doesn't set up paranoid access restrictions on the
192 * private key file, like a serious key generation tool would do. */
193 if (!write_file(priv_name, priv_buffer.size, priv_buffer.contents))
195 werror("Failed to write private key: %s\n",
200 nettle_buffer_clear(&priv_buffer);
201 nettle_buffer_clear(&pub_buffer);
202 rsa_public_key_clear(&pub);
203 rsa_private_key_clear(&priv);