rsa-keygen.c 3.46 KB
Newer Older
Niels Möller's avatar
Niels Möller committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/* rsa-keygen.c
 *
 */

/* nettle, low-level cryptographics library
 *
 * Copyright (C) 2002 Niels Mller
 *  
 * 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.
 */

/* For asprintf */
#define _GNU_SOURCE

28
29
30
31
32
33
34
#include "buffer.h"
#include "rsa.h"
#include "sexp.h"
#include "yarrow.h"

#include "io.h"

Niels Möller's avatar
Niels Möller committed
35
36
37
38
39
40
#include <ctype.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

41
/* For getopt */
Niels Möller's avatar
Niels Möller committed
42
#include <unistd.h>
Niels Möller's avatar
Niels Möller committed
43

Niels Möller's avatar
Niels Möller committed
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#define KEYSIZE 500
#define ESIZE 30

static void
progress(void *ctx, int c)
{
  (void) ctx;
  fputc(c, stderr);
}


int
main(int argc, char **argv)
{
  struct yarrow256_ctx yarrow;
  struct rsa_public_key pub;
  struct rsa_private_key priv;

  int c;
  char *pub_name = NULL;
Niels Möller's avatar
Niels Möller committed
64
65
  const char *priv_name = NULL;
  const char *random_name = NULL;
Niels Möller's avatar
Niels Möller committed
66
67
68
69
  
  struct nettle_buffer pub_buffer;
  struct nettle_buffer priv_buffer;

Niels Möller's avatar
Niels Möller committed
70
  while ( (c = getopt(argc, argv, "o:r:")) != -1)
Niels Möller's avatar
Niels Möller committed
71
72
73
74
75
    switch (c)
      {
      case 'o':
	priv_name = optarg;
	break;
Niels Möller's avatar
Niels Möller committed
76
77
78
79
80

      case 'r':
	random_name = optarg;
	break;
	
Niels Möller's avatar
Niels Möller committed
81
82
      case '?':
	if (isprint (optopt))
83
	  werror("Unknown option `-%c'.\n", optopt);
Niels Möller's avatar
Niels Möller committed
84
	else
85
	  werror("Unknown option character `\\x%x'.\n",
Niels Möller's avatar
Niels Möller committed
86
87
88
89
90
91
92
93
		  optopt);
	return EXIT_FAILURE;
      default:
	abort();
      }

  if (!priv_name)
    {
94
      werror("No filename provided.\n");
Niels Möller's avatar
Niels Möller committed
95
96
97
98
99
100
      return EXIT_FAILURE;
    }

  asprintf(&pub_name, "%s.pub", priv_name);
  if (!pub_name)
    {
101
      werror("Memory exhausted.\n");
Niels Möller's avatar
Niels Möller committed
102
103
104
105
106
      return EXIT_FAILURE;
    }
  
  /* NOTE: No sources */
  yarrow256_init(&yarrow, 0, NULL);
Niels Möller's avatar
Niels Möller committed
107
108
109
110

  /* Read some data to seed the generator */
  simple_random(&yarrow, random_name);

Niels Möller's avatar
Niels Möller committed
111
112
113
114
115
116
117
118
119
  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))
    {
120
      werror("Key generation failed.\n");
Niels Möller's avatar
Niels Möller committed
121
122
123
124
125
126
127
128
      return EXIT_FAILURE;
    }

  nettle_buffer_init(&priv_buffer);
  nettle_buffer_init(&pub_buffer);
  
  if (!rsa_keypair_to_sexp(&pub_buffer, &pub, NULL))
    {
129
      werror("Formatting public key failed.\n");
Niels Möller's avatar
Niels Möller committed
130
131
132
      return EXIT_FAILURE;
    }

133
  if (!rsa_keypair_to_sexp(&priv_buffer, &pub, &priv))
Niels Möller's avatar
Niels Möller committed
134
    {
135
      werror("Formatting private key failed.\n");
Niels Möller's avatar
Niels Möller committed
136
137
138
      return EXIT_FAILURE;
    }
  
Niels Möller's avatar
Niels Möller committed
139
  if (!write_file(pub_name, pub_buffer.size, pub_buffer.contents))
Niels Möller's avatar
Niels Möller committed
140
    {
141
      werror("Failed to write public key: %s\n",
Niels Möller's avatar
Niels Möller committed
142
143
144
145
	      strerror(errno));
      return EXIT_FAILURE;
    }

146
147
  /* NOTE: This doesn't set up paranoid access restrictions on the
   * private key file, like a serious key generation tool would do. */
Niels Möller's avatar
Niels Möller committed
148
  if (!write_file(priv_name, priv_buffer.size, priv_buffer.contents))
Niels Möller's avatar
Niels Möller committed
149
    {
150
      werror("Failed to write private key: %s\n",
Niels Möller's avatar
Niels Möller committed
151
152
153
154
155
156
	      strerror(errno));
      return EXIT_FAILURE;
    }

  return EXIT_SUCCESS;
}