rsa-keygen.c 3.47 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
/* 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.
 */

25
26
27
28
29
30
31
#include "buffer.h"
#include "rsa.h"
#include "sexp.h"
#include "yarrow.h"

#include "io.h"

Niels Möller's avatar
Niels Möller committed
32
33
34
35
36
37
#include <ctype.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

38
/* For getopt */
Niels Möller's avatar
Niels Möller committed
39
#include <unistd.h>
Niels Möller's avatar
Niels Möller committed
40

Niels Möller's avatar
Niels Möller committed
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#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
61
62
  const char *priv_name = NULL;
  const char *random_name = NULL;
Niels Möller's avatar
Niels Möller committed
63
64
65
66
  
  struct nettle_buffer pub_buffer;
  struct nettle_buffer priv_buffer;

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

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

  if (!priv_name)
    {
91
      werror("No filename provided.\n");
Niels Möller's avatar
Niels Möller committed
92
93
94
      return EXIT_FAILURE;
    }

95
96
97
98
99
  pub_name = malloc(strlen(priv_name) + 5);  

  if (pub_name)
    sprintf(pub_name, "%s.pub", priv_name);
  else
Niels Möller's avatar
Niels Möller committed
100
    {
101
      werror("Memory exhausted.\n");
Niels Möller's avatar
Niels Möller committed
102
103
      return EXIT_FAILURE;
    }
104

Niels Möller's avatar
Niels Möller committed
105
106
  /* 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;
}