diff options
Diffstat (limited to 'rsa.c')
-rw-r--r-- | rsa.c | 164 |
1 files changed, 164 insertions, 0 deletions
@@ -0,0 +1,164 @@ | |||
1 | /* | ||
2 | |||
3 | rsa.c | ||
4 | |||
5 | Author: Tatu Ylonen <ylo@cs.hut.fi> | ||
6 | |||
7 | Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland | ||
8 | All rights reserved | ||
9 | |||
10 | Created: Fri Mar 3 22:07:06 1995 ylo | ||
11 | |||
12 | Description of the RSA algorithm can be found e.g. from the following sources: | ||
13 | |||
14 | Bruce Schneier: Applied Cryptography. John Wiley & Sons, 1994. | ||
15 | |||
16 | Jennifer Seberry and Josed Pieprzyk: Cryptography: An Introduction to | ||
17 | Computer Security. Prentice-Hall, 1989. | ||
18 | |||
19 | Man Young Rhee: Cryptography and Secure Data Communications. McGraw-Hill, | ||
20 | 1994. | ||
21 | |||
22 | R. Rivest, A. Shamir, and L. M. Adleman: Cryptographic Communications | ||
23 | System and Method. US Patent 4,405,829, 1983. | ||
24 | |||
25 | Hans Riesel: Prime Numbers and Computer Methods for Factorization. | ||
26 | Birkhauser, 1994. | ||
27 | |||
28 | The RSA Frequently Asked Questions document by RSA Data Security, Inc., 1995. | ||
29 | |||
30 | RSA in 3 lines of perl by Adam Back <aba@atlax.ex.ac.uk>, 1995, as included | ||
31 | below: | ||
32 | |||
33 | gone - had to be deleted - what a pity | ||
34 | |||
35 | */ | ||
36 | |||
37 | #include "includes.h" | ||
38 | RCSID("$Id: rsa.c,v 1.1 1999/10/27 03:42:44 damien Exp $"); | ||
39 | |||
40 | #include "rsa.h" | ||
41 | #include "ssh.h" | ||
42 | #include "xmalloc.h" | ||
43 | |||
44 | int rsa_verbose = 1; | ||
45 | |||
46 | int | ||
47 | rsa_alive() | ||
48 | { | ||
49 | RSA *key; | ||
50 | |||
51 | key = RSA_generate_key(32, 3, NULL, NULL); | ||
52 | if (key == NULL) | ||
53 | return (0); | ||
54 | RSA_free(key); | ||
55 | return (1); | ||
56 | } | ||
57 | |||
58 | /* Generates RSA public and private keys. This initializes the data | ||
59 | structures; they should be freed with rsa_clear_private_key and | ||
60 | rsa_clear_public_key. */ | ||
61 | |||
62 | void | ||
63 | rsa_generate_key(RSA *prv, RSA *pub, unsigned int bits) | ||
64 | { | ||
65 | RSA *key; | ||
66 | |||
67 | if (rsa_verbose) { | ||
68 | printf("Generating RSA keys: "); | ||
69 | fflush(stdout); | ||
70 | } | ||
71 | |||
72 | key = RSA_generate_key(bits, 35, NULL, NULL); | ||
73 | |||
74 | assert(key != NULL); | ||
75 | |||
76 | /* Copy public key parameters */ | ||
77 | pub->n = BN_new(); | ||
78 | BN_copy(pub->n, key->n); | ||
79 | pub->e = BN_new(); | ||
80 | BN_copy(pub->e, key->e); | ||
81 | |||
82 | /* Copy private key parameters */ | ||
83 | prv->n = BN_new(); | ||
84 | BN_copy(prv->n, key->n); | ||
85 | prv->e = BN_new(); | ||
86 | BN_copy(prv->e, key->e); | ||
87 | prv->d = BN_new(); | ||
88 | BN_copy(prv->d, key->d); | ||
89 | prv->p = BN_new(); | ||
90 | BN_copy(prv->p, key->p); | ||
91 | prv->q = BN_new(); | ||
92 | BN_copy(prv->q, key->q); | ||
93 | |||
94 | prv->dmp1 = BN_new(); | ||
95 | BN_copy(prv->dmp1, key->dmp1); | ||
96 | |||
97 | prv->dmq1 = BN_new(); | ||
98 | BN_copy(prv->dmq1, key->dmq1); | ||
99 | |||
100 | prv->iqmp = BN_new(); | ||
101 | BN_copy(prv->iqmp, key->iqmp); | ||
102 | |||
103 | RSA_free(key); | ||
104 | |||
105 | if (rsa_verbose) | ||
106 | printf("Key generation complete.\n"); | ||
107 | } | ||
108 | |||
109 | void | ||
110 | rsa_public_encrypt(BIGNUM *out, BIGNUM *in, RSA* key) | ||
111 | { | ||
112 | char *inbuf, *outbuf; | ||
113 | int len; | ||
114 | |||
115 | if (BN_num_bits(key->e) < 2 || !BN_is_odd(key->e)) | ||
116 | fatal("rsa_public_encrypt() exponent too small or not odd"); | ||
117 | |||
118 | len = BN_num_bytes(key->n); | ||
119 | outbuf = xmalloc(len); | ||
120 | |||
121 | len = BN_num_bytes(in); | ||
122 | inbuf = xmalloc(len); | ||
123 | BN_bn2bin(in, inbuf); | ||
124 | |||
125 | if ((len = RSA_public_encrypt(len, inbuf, outbuf, key, | ||
126 | RSA_PKCS1_PADDING)) <= 0) | ||
127 | fatal("rsa_public_encrypt() failed"); | ||
128 | |||
129 | BN_bin2bn(outbuf, len, out); | ||
130 | |||
131 | xfree(outbuf); | ||
132 | xfree(inbuf); | ||
133 | } | ||
134 | |||
135 | void | ||
136 | rsa_private_decrypt(BIGNUM *out, BIGNUM *in, RSA *key) | ||
137 | { | ||
138 | char *inbuf, *outbuf; | ||
139 | int len; | ||
140 | |||
141 | len = BN_num_bytes(key->n); | ||
142 | outbuf = xmalloc(len); | ||
143 | |||
144 | len = BN_num_bytes(in); | ||
145 | inbuf = xmalloc(len); | ||
146 | BN_bn2bin(in, inbuf); | ||
147 | |||
148 | if ((len = RSA_private_decrypt(len, inbuf, outbuf, key, | ||
149 | RSA_SSLV23_PADDING)) <= 0) | ||
150 | fatal("rsa_private_decrypt() failed"); | ||
151 | |||
152 | BN_bin2bn(outbuf, len, out); | ||
153 | |||
154 | xfree(outbuf); | ||
155 | xfree(inbuf); | ||
156 | } | ||
157 | |||
158 | /* Set whether to output verbose messages during key generation. */ | ||
159 | |||
160 | void | ||
161 | rsa_set_verbose(int verbose) | ||
162 | { | ||
163 | rsa_verbose = verbose; | ||
164 | } | ||