rubysl-openssl 1.0.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +5 -6
- data/ext/rubysl/openssl/.gitignore +3 -0
- data/ext/rubysl/openssl/deprecation.rb +21 -0
- data/ext/rubysl/openssl/extconf.rb +45 -32
- data/ext/rubysl/openssl/openssl_missing.c +20 -7
- data/ext/rubysl/openssl/openssl_missing.h +22 -15
- data/ext/rubysl/openssl/ossl.c +610 -61
- data/ext/rubysl/openssl/ossl.h +31 -17
- data/ext/rubysl/openssl/ossl_asn1.c +974 -183
- data/ext/rubysl/openssl/ossl_asn1.h +3 -3
- data/ext/rubysl/openssl/ossl_bio.c +4 -3
- data/ext/rubysl/openssl/ossl_bio.h +1 -1
- data/ext/rubysl/openssl/ossl_bn.c +32 -28
- data/ext/rubysl/openssl/ossl_bn.h +1 -1
- data/ext/rubysl/openssl/ossl_cipher.c +494 -93
- data/ext/rubysl/openssl/ossl_cipher.h +1 -1
- data/ext/rubysl/openssl/ossl_config.c +4 -5
- data/ext/rubysl/openssl/ossl_config.h +1 -1
- data/ext/rubysl/openssl/ossl_digest.c +206 -24
- data/ext/rubysl/openssl/ossl_digest.h +1 -1
- data/ext/rubysl/openssl/ossl_engine.c +48 -26
- data/ext/rubysl/openssl/ossl_engine.h +1 -1
- data/ext/rubysl/openssl/ossl_hmac.c +40 -38
- data/ext/rubysl/openssl/ossl_hmac.h +1 -1
- data/ext/rubysl/openssl/ossl_ns_spki.c +157 -25
- data/ext/rubysl/openssl/ossl_ns_spki.h +1 -1
- data/ext/rubysl/openssl/ossl_ocsp.c +57 -40
- data/ext/rubysl/openssl/ossl_ocsp.h +1 -1
- data/ext/rubysl/openssl/ossl_pkcs12.c +15 -13
- data/ext/rubysl/openssl/ossl_pkcs12.h +1 -1
- data/ext/rubysl/openssl/ossl_pkcs5.c +108 -18
- data/ext/rubysl/openssl/ossl_pkcs7.c +44 -37
- data/ext/rubysl/openssl/ossl_pkcs7.h +1 -1
- data/ext/rubysl/openssl/ossl_pkey.c +211 -15
- data/ext/rubysl/openssl/ossl_pkey.h +19 -9
- data/ext/rubysl/openssl/ossl_pkey_dh.c +180 -47
- data/ext/rubysl/openssl/ossl_pkey_dsa.c +184 -47
- data/ext/rubysl/openssl/ossl_pkey_ec.c +177 -93
- data/ext/rubysl/openssl/ossl_pkey_rsa.c +209 -102
- data/ext/rubysl/openssl/ossl_rand.c +15 -15
- data/ext/rubysl/openssl/ossl_rand.h +1 -1
- data/ext/rubysl/openssl/ossl_ssl.c +939 -192
- data/ext/rubysl/openssl/ossl_ssl.h +6 -6
- data/ext/rubysl/openssl/ossl_ssl_session.c +78 -62
- data/ext/rubysl/openssl/ossl_version.h +2 -2
- data/ext/rubysl/openssl/ossl_x509.c +1 -1
- data/ext/rubysl/openssl/ossl_x509.h +1 -1
- data/ext/rubysl/openssl/ossl_x509attr.c +20 -19
- data/ext/rubysl/openssl/ossl_x509cert.c +169 -67
- data/ext/rubysl/openssl/ossl_x509crl.c +41 -39
- data/ext/rubysl/openssl/ossl_x509ext.c +51 -38
- data/ext/rubysl/openssl/ossl_x509name.c +139 -29
- data/ext/rubysl/openssl/ossl_x509req.c +42 -40
- data/ext/rubysl/openssl/ossl_x509revoked.c +20 -20
- data/ext/rubysl/openssl/ossl_x509store.c +99 -47
- data/ext/rubysl/openssl/ruby_missing.h +3 -16
- data/lib/openssl/bn.rb +19 -19
- data/lib/openssl/buffering.rb +222 -14
- data/lib/openssl/cipher.rb +20 -20
- data/lib/openssl/config.rb +1 -4
- data/lib/openssl/digest.rb +47 -19
- data/lib/openssl/ssl.rb +197 -1
- data/lib/openssl/x509.rb +162 -1
- data/lib/rubysl/openssl.rb +4 -8
- data/lib/rubysl/openssl/version.rb +1 -1
- data/rubysl-openssl.gemspec +1 -2
- metadata +16 -34
- data/ext/rubysl/openssl/extconf.h +0 -50
- data/lib/openssl/net/ftptls.rb +0 -53
- data/lib/openssl/net/telnets.rb +0 -251
- data/lib/openssl/pkcs7.rb +0 -25
- data/lib/openssl/ssl-internal.rb +0 -187
- data/lib/openssl/x509-internal.rb +0 -153
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* $Id
|
2
|
+
* $Id$
|
3
3
|
* 'OpenSSL for Ruby' project
|
4
4
|
* Copyright (C) 2001-2002 Michal Rokos <m.rokos@sh.cvut.cz>
|
5
5
|
* All rights reserved.
|
@@ -13,8 +13,8 @@
|
|
13
13
|
#include "ossl.h"
|
14
14
|
|
15
15
|
#define GetPKeyRSA(obj, pkey) do { \
|
16
|
-
GetPKey(obj, pkey); \
|
17
|
-
if (EVP_PKEY_type(pkey->type) != EVP_PKEY_RSA) { /* PARANOIA? */ \
|
16
|
+
GetPKey((obj), (pkey)); \
|
17
|
+
if (EVP_PKEY_type((pkey)->type) != EVP_PKEY_RSA) { /* PARANOIA? */ \
|
18
18
|
ossl_raise(rb_eRuntimeError, "THIS IS NOT A RSA!") ; \
|
19
19
|
} \
|
20
20
|
} while (0)
|
@@ -36,7 +36,7 @@ rsa_instance(VALUE klass, RSA *rsa)
|
|
36
36
|
{
|
37
37
|
EVP_PKEY *pkey;
|
38
38
|
VALUE obj;
|
39
|
-
|
39
|
+
|
40
40
|
if (!rsa) {
|
41
41
|
return Qfalse;
|
42
42
|
}
|
@@ -48,7 +48,7 @@ rsa_instance(VALUE klass, RSA *rsa)
|
|
48
48
|
return Qfalse;
|
49
49
|
}
|
50
50
|
WrapPKey(klass, obj, pkey);
|
51
|
-
|
51
|
+
|
52
52
|
return obj;
|
53
53
|
}
|
54
54
|
|
@@ -76,22 +76,87 @@ ossl_rsa_new(EVP_PKEY *pkey)
|
|
76
76
|
/*
|
77
77
|
* Private
|
78
78
|
*/
|
79
|
+
#if defined(HAVE_RSA_GENERATE_KEY_EX) && HAVE_BN_GENCB
|
80
|
+
struct rsa_blocking_gen_arg {
|
81
|
+
RSA *rsa;
|
82
|
+
BIGNUM *e;
|
83
|
+
int size;
|
84
|
+
BN_GENCB *cb;
|
85
|
+
int result;
|
86
|
+
};
|
87
|
+
|
88
|
+
static void *
|
89
|
+
rsa_blocking_gen(void *arg)
|
90
|
+
{
|
91
|
+
struct rsa_blocking_gen_arg *gen = (struct rsa_blocking_gen_arg *)arg;
|
92
|
+
gen->result = RSA_generate_key_ex(gen->rsa, gen->size, gen->e, gen->cb);
|
93
|
+
return 0;
|
94
|
+
}
|
95
|
+
#endif
|
96
|
+
|
79
97
|
static RSA *
|
80
|
-
rsa_generate(int size,
|
98
|
+
rsa_generate(int size, unsigned long exp)
|
81
99
|
{
|
82
|
-
|
83
|
-
|
84
|
-
|
100
|
+
#if defined(HAVE_RSA_GENERATE_KEY_EX) && HAVE_BN_GENCB
|
101
|
+
int i;
|
102
|
+
BN_GENCB cb;
|
103
|
+
struct ossl_generate_cb_arg cb_arg;
|
104
|
+
struct rsa_blocking_gen_arg gen_arg;
|
105
|
+
RSA *rsa = RSA_new();
|
106
|
+
BIGNUM *e = BN_new();
|
107
|
+
|
108
|
+
if (!rsa || !e) {
|
109
|
+
if (e) BN_free(e);
|
110
|
+
if (rsa) RSA_free(rsa);
|
111
|
+
return 0;
|
112
|
+
}
|
113
|
+
for (i = 0; i < (int)sizeof(exp) * 8; ++i) {
|
114
|
+
if (exp & (1UL << i)) {
|
115
|
+
if (BN_set_bit(e, i) == 0) {
|
116
|
+
BN_free(e);
|
117
|
+
RSA_free(rsa);
|
118
|
+
return 0;
|
119
|
+
}
|
120
|
+
}
|
121
|
+
}
|
122
|
+
|
123
|
+
memset(&cb_arg, 0, sizeof(struct ossl_generate_cb_arg));
|
124
|
+
if (rb_block_given_p())
|
125
|
+
cb_arg.yield = 1;
|
126
|
+
BN_GENCB_set(&cb, ossl_generate_cb_2, &cb_arg);
|
127
|
+
gen_arg.rsa = rsa;
|
128
|
+
gen_arg.e = e;
|
129
|
+
gen_arg.size = size;
|
130
|
+
gen_arg.cb = &cb;
|
131
|
+
if (cb_arg.yield == 1) {
|
132
|
+
/* we cannot release GVL when callback proc is supplied */
|
133
|
+
rsa_blocking_gen(&gen_arg);
|
134
|
+
} else {
|
135
|
+
/* there's a chance to unblock */
|
136
|
+
rb_thread_call_without_gvl(rsa_blocking_gen, &gen_arg, ossl_generate_cb_stop, &cb_arg);
|
137
|
+
}
|
138
|
+
if (!gen_arg.result) {
|
139
|
+
BN_free(e);
|
140
|
+
RSA_free(rsa);
|
141
|
+
if (cb_arg.state) rb_jump_tag(cb_arg.state);
|
142
|
+
return 0;
|
143
|
+
}
|
144
|
+
|
145
|
+
BN_free(e);
|
146
|
+
return rsa;
|
147
|
+
#else
|
148
|
+
return RSA_generate_key(size, exp, rb_block_given_p() ? ossl_generate_cb : NULL, NULL);
|
149
|
+
#endif
|
85
150
|
}
|
86
151
|
|
87
152
|
/*
|
88
|
-
*
|
89
|
-
*
|
90
|
-
*
|
91
|
-
* === Parameters
|
92
|
-
* * +size+ is an integer representing the desired key size. Keys smaller than 1024 should be considered insecure.
|
93
|
-
* * +exponent+ is an odd number normally 3, 17, or 65537.
|
153
|
+
* call-seq:
|
154
|
+
* RSA.generate(size) => RSA instance
|
155
|
+
* RSA.generate(size, exponent) => RSA instance
|
94
156
|
*
|
157
|
+
* Generates an RSA keypair. +size+ is an integer representing the desired key
|
158
|
+
* size. Keys smaller than 1024 should be considered insecure. +exponent+ is
|
159
|
+
* an odd number normally 3, 17, or 65537.
|
95
160
|
*/
|
96
161
|
static VALUE
|
97
162
|
ossl_rsa_s_generate(int argc, VALUE *argv, VALUE klass)
|
@@ -103,7 +168,7 @@ ossl_rsa_s_generate(int argc, VALUE *argv, VALUE klass)
|
|
103
168
|
|
104
169
|
rb_scan_args(argc, argv, "11", &size, &exp);
|
105
170
|
|
106
|
-
rsa = rsa_generate(NUM2INT(size), NIL_P(exp) ? RSA_F4 :
|
171
|
+
rsa = rsa_generate(NUM2INT(size), NIL_P(exp) ? RSA_F4 : NUM2ULONG(exp)); /* err handled by rsa_instance */
|
107
172
|
obj = rsa_instance(klass, rsa);
|
108
173
|
|
109
174
|
if (obj == Qfalse) {
|
@@ -115,18 +180,24 @@ ossl_rsa_s_generate(int argc, VALUE *argv, VALUE klass)
|
|
115
180
|
}
|
116
181
|
|
117
182
|
/*
|
118
|
-
*
|
119
|
-
*
|
183
|
+
* call-seq:
|
184
|
+
* RSA.new(key_size) => RSA instance
|
185
|
+
* RSA.new(encoded_key) => RSA instance
|
186
|
+
* RSA.new(encoded_key, pass_phrase) => RSA instance
|
120
187
|
*
|
121
|
-
*
|
122
|
-
*
|
123
|
-
*
|
124
|
-
* * +pass+ is an optional string with the password to decrypt the encoded key.
|
188
|
+
* Generates or loads an RSA keypair. If an integer +key_size+ is given it
|
189
|
+
* represents the desired key size. Keys less than 1024 bits should be
|
190
|
+
* considered insecure.
|
125
191
|
*
|
126
|
-
*
|
127
|
-
*
|
128
|
-
*
|
129
|
-
*
|
192
|
+
* A key can instead be loaded from an +encoded_key+ which must be PEM or DER
|
193
|
+
* encoded. A +pass_phrase+ can be used to decrypt the key. If none is given
|
194
|
+
* OpenSSL will prompt for the pass phrase.
|
195
|
+
*
|
196
|
+
* = Examples
|
197
|
+
*
|
198
|
+
* OpenSSL::PKey::RSA.new 2048
|
199
|
+
* OpenSSL::PKey::RSA.new File.read 'rsa.pem'
|
200
|
+
* OpenSSL::PKey::RSA.new File.read('rsa.pem'), 'my pass phrase'
|
130
201
|
*/
|
131
202
|
static VALUE
|
132
203
|
ossl_rsa_initialize(int argc, VALUE *argv, VALUE self)
|
@@ -136,13 +207,13 @@ ossl_rsa_initialize(int argc, VALUE *argv, VALUE self)
|
|
136
207
|
BIO *in;
|
137
208
|
char *passwd = NULL;
|
138
209
|
VALUE arg, pass;
|
139
|
-
|
210
|
+
|
140
211
|
GetPKey(self, pkey);
|
141
212
|
if(rb_scan_args(argc, argv, "02", &arg, &pass) == 0) {
|
142
213
|
rsa = RSA_new();
|
143
214
|
}
|
144
215
|
else if (FIXNUM_P(arg)) {
|
145
|
-
rsa = rsa_generate(FIX2INT(arg), NIL_P(pass) ? RSA_F4 :
|
216
|
+
rsa = rsa_generate(FIX2INT(arg), NIL_P(pass) ? RSA_F4 : NUM2ULONG(pass));
|
146
217
|
if (!rsa) ossl_raise(eRSAError, NULL);
|
147
218
|
}
|
148
219
|
else {
|
@@ -151,27 +222,29 @@ ossl_rsa_initialize(int argc, VALUE *argv, VALUE self)
|
|
151
222
|
in = ossl_obj2bio(arg);
|
152
223
|
rsa = PEM_read_bio_RSAPrivateKey(in, NULL, ossl_pem_passwd_cb, passwd);
|
153
224
|
if (!rsa) {
|
154
|
-
|
155
|
-
rsa = PEM_read_bio_RSAPublicKey(in, NULL, NULL, NULL);
|
156
|
-
}
|
157
|
-
if (!rsa) {
|
158
|
-
BIO_reset(in);
|
225
|
+
OSSL_BIO_reset(in);
|
159
226
|
rsa = PEM_read_bio_RSA_PUBKEY(in, NULL, NULL, NULL);
|
160
227
|
}
|
161
228
|
if (!rsa) {
|
162
|
-
|
229
|
+
OSSL_BIO_reset(in);
|
163
230
|
rsa = d2i_RSAPrivateKey_bio(in, NULL);
|
164
231
|
}
|
165
232
|
if (!rsa) {
|
166
|
-
|
167
|
-
rsa =
|
233
|
+
OSSL_BIO_reset(in);
|
234
|
+
rsa = d2i_RSA_PUBKEY_bio(in, NULL);
|
168
235
|
}
|
169
236
|
if (!rsa) {
|
170
|
-
|
171
|
-
rsa =
|
237
|
+
OSSL_BIO_reset(in);
|
238
|
+
rsa = PEM_read_bio_RSAPublicKey(in, NULL, NULL, NULL);
|
239
|
+
}
|
240
|
+
if (!rsa) {
|
241
|
+
OSSL_BIO_reset(in);
|
242
|
+
rsa = d2i_RSAPublicKey_bio(in, NULL);
|
172
243
|
}
|
173
244
|
BIO_free(in);
|
174
|
-
if (!rsa)
|
245
|
+
if (!rsa) {
|
246
|
+
ossl_raise(eRSAError, "Neither PUB key nor PRIV key");
|
247
|
+
}
|
175
248
|
}
|
176
249
|
if (!EVP_PKEY_assign_RSA(pkey, rsa)) {
|
177
250
|
RSA_free(rsa);
|
@@ -182,11 +255,11 @@ ossl_rsa_initialize(int argc, VALUE *argv, VALUE self)
|
|
182
255
|
}
|
183
256
|
|
184
257
|
/*
|
185
|
-
*
|
186
|
-
*
|
187
|
-
*
|
188
|
-
* The return value is always true since every private key is also a public key.
|
258
|
+
* call-seq:
|
259
|
+
* rsa.public? => true
|
189
260
|
*
|
261
|
+
* The return value is always true since every private key is also a public
|
262
|
+
* key.
|
190
263
|
*/
|
191
264
|
static VALUE
|
192
265
|
ossl_rsa_is_public(VALUE self)
|
@@ -201,31 +274,29 @@ ossl_rsa_is_public(VALUE self)
|
|
201
274
|
}
|
202
275
|
|
203
276
|
/*
|
204
|
-
*
|
205
|
-
*
|
277
|
+
* call-seq:
|
278
|
+
* rsa.private? => true | false
|
206
279
|
*
|
280
|
+
* Does this keypair contain a private key?
|
207
281
|
*/
|
208
282
|
static VALUE
|
209
283
|
ossl_rsa_is_private(VALUE self)
|
210
284
|
{
|
211
285
|
EVP_PKEY *pkey;
|
212
|
-
|
286
|
+
|
213
287
|
GetPKeyRSA(self, pkey);
|
214
|
-
|
288
|
+
|
215
289
|
return (RSA_PRIVATE(self, pkey->pkey.rsa)) ? Qtrue : Qfalse;
|
216
290
|
}
|
217
291
|
|
218
292
|
/*
|
219
|
-
*
|
220
|
-
*
|
293
|
+
* call-seq:
|
294
|
+
* rsa.to_pem => PEM-format String
|
295
|
+
* rsa.to_pem(cipher, pass_phrase) => PEM-format String
|
221
296
|
*
|
222
|
-
*
|
223
|
-
*
|
224
|
-
*
|
225
|
-
*
|
226
|
-
* === Examples
|
227
|
-
* * rsa.to_pem -> aString
|
228
|
-
* * rsa.to_pem(cipher, pass) -> aString
|
297
|
+
* Outputs this keypair in PEM encoding. If +cipher+ and +pass_phrase+ are
|
298
|
+
* given they will be used to encrypt the key. +cipher+ must be an
|
299
|
+
* OpenSSL::Cipher::Cipher instance.
|
229
300
|
*/
|
230
301
|
static VALUE
|
231
302
|
ossl_rsa_export(int argc, VALUE *argv, VALUE self)
|
@@ -243,7 +314,10 @@ ossl_rsa_export(int argc, VALUE *argv, VALUE self)
|
|
243
314
|
if (!NIL_P(cipher)) {
|
244
315
|
ciph = GetCipherPtr(cipher);
|
245
316
|
if (!NIL_P(pass)) {
|
246
|
-
|
317
|
+
StringValue(pass);
|
318
|
+
if (RSTRING_LENINT(pass) < OSSL_MIN_PWD_LEN)
|
319
|
+
ossl_raise(eOSSLError, "OpenSSL requires passwords to be at least four characters long");
|
320
|
+
passwd = RSTRING_PTR(pass);
|
247
321
|
}
|
248
322
|
}
|
249
323
|
if (!(out = BIO_new(BIO_s_mem()))) {
|
@@ -256,20 +330,21 @@ ossl_rsa_export(int argc, VALUE *argv, VALUE self)
|
|
256
330
|
ossl_raise(eRSAError, NULL);
|
257
331
|
}
|
258
332
|
} else {
|
259
|
-
if (!
|
333
|
+
if (!PEM_write_bio_RSA_PUBKEY(out, pkey->pkey.rsa)) {
|
260
334
|
BIO_free(out);
|
261
335
|
ossl_raise(eRSAError, NULL);
|
262
336
|
}
|
263
337
|
}
|
264
338
|
str = ossl_membio2str(out);
|
265
|
-
|
339
|
+
|
266
340
|
return str;
|
267
341
|
}
|
268
342
|
|
269
343
|
/*
|
270
|
-
*
|
271
|
-
*
|
344
|
+
* call-seq:
|
345
|
+
* rsa.to_der => DER-format String
|
272
346
|
*
|
347
|
+
* Outputs this keypair in DER encoding.
|
273
348
|
*/
|
274
349
|
static VALUE
|
275
350
|
ossl_rsa_to_der(VALUE self)
|
@@ -284,11 +359,11 @@ ossl_rsa_to_der(VALUE self)
|
|
284
359
|
if(RSA_HAS_PRIVATE(pkey->pkey.rsa))
|
285
360
|
i2d_func = i2d_RSAPrivateKey;
|
286
361
|
else
|
287
|
-
i2d_func =
|
362
|
+
i2d_func = (int (*)(const RSA*, unsigned char**))i2d_RSA_PUBKEY;
|
288
363
|
if((len = i2d_func(pkey->pkey.rsa, NULL)) <= 0)
|
289
364
|
ossl_raise(eRSAError, NULL);
|
290
365
|
str = rb_str_new(0, len);
|
291
|
-
p = RSTRING_PTR(str);
|
366
|
+
p = (unsigned char *)RSTRING_PTR(str);
|
292
367
|
if(i2d_func(pkey->pkey.rsa, &p) < 0)
|
293
368
|
ossl_raise(eRSAError, NULL);
|
294
369
|
ossl_str_adjust(str, p);
|
@@ -299,9 +374,12 @@ ossl_rsa_to_der(VALUE self)
|
|
299
374
|
#define ossl_rsa_buf_size(pkey) (RSA_size((pkey)->pkey.rsa)+16)
|
300
375
|
|
301
376
|
/*
|
302
|
-
*
|
303
|
-
*
|
377
|
+
* call-seq:
|
378
|
+
* rsa.public_encrypt(string) => String
|
379
|
+
* rsa.public_encrypt(string, padding) => String
|
304
380
|
*
|
381
|
+
* Encrypt +string+ with the public key. +padding+ defaults to PKCS1_PADDING.
|
382
|
+
* The encrypted string output can be decrypted using #private_decrypt.
|
305
383
|
*/
|
306
384
|
static VALUE
|
307
385
|
ossl_rsa_public_encrypt(int argc, VALUE *argv, VALUE self)
|
@@ -315,8 +393,8 @@ ossl_rsa_public_encrypt(int argc, VALUE *argv, VALUE self)
|
|
315
393
|
pad = (argc == 1) ? RSA_PKCS1_PADDING : NUM2INT(padding);
|
316
394
|
StringValue(buffer);
|
317
395
|
str = rb_str_new(0, ossl_rsa_buf_size(pkey));
|
318
|
-
buf_len = RSA_public_encrypt(
|
319
|
-
RSTRING_PTR(str), pkey->pkey.rsa,
|
396
|
+
buf_len = RSA_public_encrypt(RSTRING_LENINT(buffer), (unsigned char *)RSTRING_PTR(buffer),
|
397
|
+
(unsigned char *)RSTRING_PTR(str), pkey->pkey.rsa,
|
320
398
|
pad);
|
321
399
|
if (buf_len < 0) ossl_raise(eRSAError, NULL);
|
322
400
|
rb_str_set_len(str, buf_len);
|
@@ -325,9 +403,12 @@ ossl_rsa_public_encrypt(int argc, VALUE *argv, VALUE self)
|
|
325
403
|
}
|
326
404
|
|
327
405
|
/*
|
328
|
-
*
|
329
|
-
*
|
406
|
+
* call-seq:
|
407
|
+
* rsa.public_decrypt(string) => String
|
408
|
+
* rsa.public_decrypt(string, padding) => String
|
330
409
|
*
|
410
|
+
* Decrypt +string+, which has been encrypted with the private key, with the
|
411
|
+
* public key. +padding+ defaults to PKCS1_PADDING.
|
331
412
|
*/
|
332
413
|
static VALUE
|
333
414
|
ossl_rsa_public_decrypt(int argc, VALUE *argv, VALUE self)
|
@@ -341,19 +422,22 @@ ossl_rsa_public_decrypt(int argc, VALUE *argv, VALUE self)
|
|
341
422
|
pad = (argc == 1) ? RSA_PKCS1_PADDING : NUM2INT(padding);
|
342
423
|
StringValue(buffer);
|
343
424
|
str = rb_str_new(0, ossl_rsa_buf_size(pkey));
|
344
|
-
buf_len = RSA_public_decrypt(
|
345
|
-
RSTRING_PTR(str), pkey->pkey.rsa,
|
425
|
+
buf_len = RSA_public_decrypt(RSTRING_LENINT(buffer), (unsigned char *)RSTRING_PTR(buffer),
|
426
|
+
(unsigned char *)RSTRING_PTR(str), pkey->pkey.rsa,
|
346
427
|
pad);
|
347
428
|
if (buf_len < 0) ossl_raise(eRSAError, NULL);
|
348
429
|
rb_str_set_len(str, buf_len);
|
349
|
-
|
430
|
+
|
350
431
|
return str;
|
351
432
|
}
|
352
433
|
|
353
434
|
/*
|
354
|
-
*
|
355
|
-
*
|
435
|
+
* call-seq:
|
436
|
+
* rsa.private_encrypt(string) => String
|
437
|
+
* rsa.private_encrypt(string, padding) => String
|
356
438
|
*
|
439
|
+
* Encrypt +string+ with the private key. +padding+ defaults to PKCS1_PADDING.
|
440
|
+
* The encrypted string output can be decrypted using #public_decrypt.
|
357
441
|
*/
|
358
442
|
static VALUE
|
359
443
|
ossl_rsa_private_encrypt(int argc, VALUE *argv, VALUE self)
|
@@ -365,25 +449,27 @@ ossl_rsa_private_encrypt(int argc, VALUE *argv, VALUE self)
|
|
365
449
|
GetPKeyRSA(self, pkey);
|
366
450
|
if (!RSA_PRIVATE(self, pkey->pkey.rsa)) {
|
367
451
|
ossl_raise(eRSAError, "private key needed.");
|
368
|
-
}
|
452
|
+
}
|
369
453
|
rb_scan_args(argc, argv, "11", &buffer, &padding);
|
370
454
|
pad = (argc == 1) ? RSA_PKCS1_PADDING : NUM2INT(padding);
|
371
455
|
StringValue(buffer);
|
372
456
|
str = rb_str_new(0, ossl_rsa_buf_size(pkey));
|
373
|
-
buf_len = RSA_private_encrypt(
|
374
|
-
RSTRING_PTR(str), pkey->pkey.rsa,
|
457
|
+
buf_len = RSA_private_encrypt(RSTRING_LENINT(buffer), (unsigned char *)RSTRING_PTR(buffer),
|
458
|
+
(unsigned char *)RSTRING_PTR(str), pkey->pkey.rsa,
|
375
459
|
pad);
|
376
460
|
if (buf_len < 0) ossl_raise(eRSAError, NULL);
|
377
461
|
rb_str_set_len(str, buf_len);
|
378
|
-
|
462
|
+
|
379
463
|
return str;
|
380
464
|
}
|
381
465
|
|
382
|
-
|
383
466
|
/*
|
384
|
-
*
|
385
|
-
*
|
467
|
+
* call-seq:
|
468
|
+
* rsa.private_decrypt(string) => String
|
469
|
+
* rsa.private_decrypt(string, padding) => String
|
386
470
|
*
|
471
|
+
* Decrypt +string+, which has been encrypted with the public key, with the
|
472
|
+
* private key. +padding+ defaults to PKCS1_PADDING.
|
387
473
|
*/
|
388
474
|
static VALUE
|
389
475
|
ossl_rsa_private_decrypt(int argc, VALUE *argv, VALUE self)
|
@@ -400,8 +486,8 @@ ossl_rsa_private_decrypt(int argc, VALUE *argv, VALUE self)
|
|
400
486
|
pad = (argc == 1) ? RSA_PKCS1_PADDING : NUM2INT(padding);
|
401
487
|
StringValue(buffer);
|
402
488
|
str = rb_str_new(0, ossl_rsa_buf_size(pkey));
|
403
|
-
buf_len = RSA_private_decrypt(
|
404
|
-
RSTRING_PTR(str), pkey->pkey.rsa,
|
489
|
+
buf_len = RSA_private_decrypt(RSTRING_LENINT(buffer), (unsigned char *)RSTRING_PTR(buffer),
|
490
|
+
(unsigned char *)RSTRING_PTR(str), pkey->pkey.rsa,
|
405
491
|
pad);
|
406
492
|
if (buf_len < 0) ossl_raise(eRSAError, NULL);
|
407
493
|
rb_str_set_len(str, buf_len);
|
@@ -410,12 +496,15 @@ ossl_rsa_private_decrypt(int argc, VALUE *argv, VALUE self)
|
|
410
496
|
}
|
411
497
|
|
412
498
|
/*
|
413
|
-
*
|
414
|
-
*
|
499
|
+
* call-seq:
|
500
|
+
* rsa.params => hash
|
501
|
+
*
|
502
|
+
* THIS METHOD IS INSECURE, PRIVATE INFORMATION CAN LEAK OUT!!!
|
415
503
|
*
|
416
|
-
* Stores all parameters of key to the hash
|
417
|
-
*
|
418
|
-
*
|
504
|
+
* Stores all parameters of key to the hash. The hash has keys 'n', 'e', 'd',
|
505
|
+
* 'p', 'q', 'dmp1', 'dmq1', 'iqmp'.
|
506
|
+
*
|
507
|
+
* Don't use :-)) (It's up to you)
|
419
508
|
*/
|
420
509
|
static VALUE
|
421
510
|
ossl_rsa_get_params(VALUE self)
|
@@ -435,16 +524,18 @@ ossl_rsa_get_params(VALUE self)
|
|
435
524
|
rb_hash_aset(hash, rb_str_new2("dmp1"), ossl_bn_new(pkey->pkey.rsa->dmp1));
|
436
525
|
rb_hash_aset(hash, rb_str_new2("dmq1"), ossl_bn_new(pkey->pkey.rsa->dmq1));
|
437
526
|
rb_hash_aset(hash, rb_str_new2("iqmp"), ossl_bn_new(pkey->pkey.rsa->iqmp));
|
438
|
-
|
527
|
+
|
439
528
|
return hash;
|
440
529
|
}
|
441
530
|
|
442
531
|
/*
|
443
|
-
*
|
444
|
-
*
|
532
|
+
* call-seq:
|
533
|
+
* rsa.to_text => String
|
534
|
+
*
|
535
|
+
* THIS METHOD IS INSECURE, PRIVATE INFORMATION CAN LEAK OUT!!!
|
536
|
+
*
|
537
|
+
* Dumps all parameters of a keypair to a String
|
445
538
|
*
|
446
|
-
* Prints all parameters of key to buffer
|
447
|
-
* INSECURE: PRIVATE INFORMATIONS CAN LEAK OUT!!!
|
448
539
|
* Don't use :-)) (It's up to you)
|
449
540
|
*/
|
450
541
|
static VALUE
|
@@ -468,10 +559,10 @@ ossl_rsa_to_text(VALUE self)
|
|
468
559
|
}
|
469
560
|
|
470
561
|
/*
|
471
|
-
*
|
472
|
-
*
|
562
|
+
* call-seq:
|
563
|
+
* rsa.public_key -> RSA
|
473
564
|
*
|
474
|
-
* Makes new instance
|
565
|
+
* Makes new RSA instance containing the public key from the private key.
|
475
566
|
*/
|
476
567
|
static VALUE
|
477
568
|
ossl_rsa_to_public_key(VALUE self)
|
@@ -479,7 +570,7 @@ ossl_rsa_to_public_key(VALUE self)
|
|
479
570
|
EVP_PKEY *pkey;
|
480
571
|
RSA *rsa;
|
481
572
|
VALUE obj;
|
482
|
-
|
573
|
+
|
483
574
|
GetPKeyRSA(self, pkey);
|
484
575
|
/* err check performed by rsa_instance */
|
485
576
|
rsa = RSAPublicKey_dup(pkey->pkey.rsa);
|
@@ -498,7 +589,7 @@ static VALUE
|
|
498
589
|
ossl_rsa_blinding_on(VALUE self)
|
499
590
|
{
|
500
591
|
EVP_PKEY *pkey;
|
501
|
-
|
592
|
+
|
502
593
|
GetPKeyRSA(self, pkey);
|
503
594
|
|
504
595
|
if (RSA_blinding_on(pkey->pkey.rsa, ossl_bn_ctx) != 1) {
|
@@ -511,7 +602,7 @@ static VALUE
|
|
511
602
|
ossl_rsa_blinding_off(VALUE self)
|
512
603
|
{
|
513
604
|
EVP_PKEY *pkey;
|
514
|
-
|
605
|
+
|
515
606
|
GetPKeyRSA(self, pkey);
|
516
607
|
RSA_blinding_off(pkey->pkey.rsa);
|
517
608
|
|
@@ -536,18 +627,34 @@ OSSL_PKEY_BN(rsa, iqmp)
|
|
536
627
|
void
|
537
628
|
Init_ossl_rsa()
|
538
629
|
{
|
539
|
-
#if 0
|
540
|
-
mOSSL = rb_define_module("OpenSSL");
|
630
|
+
#if 0
|
631
|
+
mOSSL = rb_define_module("OpenSSL"); /* let rdoc know about mOSSL and mPKey */
|
541
632
|
mPKey = rb_define_module_under(mOSSL, "PKey");
|
542
633
|
#endif
|
543
634
|
|
635
|
+
/* Document-class: OpenSSL::PKey::RSAError
|
636
|
+
*
|
637
|
+
* Generic exception that is raised if an operation on an RSA PKey
|
638
|
+
* fails unexpectedly or in case an instantiation of an instance of RSA
|
639
|
+
* fails due to non-conformant input data.
|
640
|
+
*/
|
544
641
|
eRSAError = rb_define_class_under(mPKey, "RSAError", ePKeyError);
|
545
642
|
|
643
|
+
/* Document-class: OpenSSL::PKey::RSA
|
644
|
+
*
|
645
|
+
* RSA is an asymmetric public key algorithm that has been formalized in
|
646
|
+
* RFC 3447. It is in widespread use in public key infrastuctures (PKI)
|
647
|
+
* where certificates (cf. OpenSSL::X509::Certificate) often are issued
|
648
|
+
* on the basis of a public/private RSA key pair. RSA is used in a wide
|
649
|
+
* field of applications such as secure (symmetric) key exchange, e.g.
|
650
|
+
* when establishing a secure TLS/SSL connection. It is also used in
|
651
|
+
* various digital signature schemes.
|
652
|
+
*/
|
546
653
|
cRSA = rb_define_class_under(mPKey, "RSA", cPKey);
|
547
654
|
|
548
655
|
rb_define_singleton_method(cRSA, "generate", ossl_rsa_s_generate, -1);
|
549
656
|
rb_define_method(cRSA, "initialize", ossl_rsa_initialize, -1);
|
550
|
-
|
657
|
+
|
551
658
|
rb_define_method(cRSA, "public?", ossl_rsa_is_public, 0);
|
552
659
|
rb_define_method(cRSA, "private?", ossl_rsa_is_private, 0);
|
553
660
|
rb_define_method(cRSA, "to_text", ossl_rsa_to_text, 0);
|