rubysl-openssl 1.0.2 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|
@@ -17,12 +17,10 @@
|
|
17
17
|
VALUE cConfig;
|
18
18
|
VALUE eConfigError;
|
19
19
|
|
20
|
-
/*
|
21
|
-
* Public
|
20
|
+
/*
|
21
|
+
* Public
|
22
22
|
*/
|
23
23
|
|
24
|
-
static CONF *parse_config(VALUE, CONF*);
|
25
|
-
|
26
24
|
/*
|
27
25
|
* GetConfigPtr is a public C-level function for getting OpenSSL CONF struct
|
28
26
|
* from an OpenSSL::Config(eConfig) instance. We decided to implement
|
@@ -57,6 +55,7 @@ GetConfigPtr(VALUE obj)
|
|
57
55
|
return conf;
|
58
56
|
}
|
59
57
|
|
58
|
+
|
60
59
|
/*
|
61
60
|
* INIT
|
62
61
|
*/
|
@@ -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.
|
@@ -11,14 +11,14 @@
|
|
11
11
|
#include "ossl.h"
|
12
12
|
|
13
13
|
#define GetDigest(obj, ctx) do { \
|
14
|
-
Data_Get_Struct(obj, EVP_MD_CTX, ctx); \
|
15
|
-
if (!ctx) { \
|
14
|
+
Data_Get_Struct((obj), EVP_MD_CTX, (ctx)); \
|
15
|
+
if (!(ctx)) { \
|
16
16
|
ossl_raise(rb_eRuntimeError, "Digest CTX wasn't initialized!"); \
|
17
17
|
} \
|
18
18
|
} while (0)
|
19
19
|
#define SafeGetDigest(obj, ctx) do { \
|
20
|
-
OSSL_Check_Kind(obj, cDigest); \
|
21
|
-
GetDigest(obj, ctx); \
|
20
|
+
OSSL_Check_Kind((obj), cDigest); \
|
21
|
+
GetDigest((obj), (ctx)); \
|
22
22
|
} while (0)
|
23
23
|
|
24
24
|
/*
|
@@ -36,12 +36,18 @@ const EVP_MD *
|
|
36
36
|
GetDigestPtr(VALUE obj)
|
37
37
|
{
|
38
38
|
const EVP_MD *md;
|
39
|
+
ASN1_OBJECT *oid = NULL;
|
39
40
|
|
40
41
|
if (TYPE(obj) == T_STRING) {
|
41
|
-
const char *name =
|
42
|
-
|
43
|
-
|
44
|
-
|
42
|
+
const char *name = StringValueCStr(obj);
|
43
|
+
|
44
|
+
md = EVP_get_digestbyname(name);
|
45
|
+
if (!md) {
|
46
|
+
oid = OBJ_txt2obj(name, 0);
|
47
|
+
md = EVP_get_digestbyobj(oid);
|
48
|
+
ASN1_OBJECT_free(oid);
|
49
|
+
}
|
50
|
+
if(!md)
|
45
51
|
ossl_raise(rb_eRuntimeError, "Unsupported digest algorithm (%s).", name);
|
46
52
|
} else {
|
47
53
|
EVP_MD_CTX *ctx;
|
@@ -56,14 +62,16 @@ GetDigestPtr(VALUE obj)
|
|
56
62
|
|
57
63
|
VALUE
|
58
64
|
ossl_digest_new(const EVP_MD *md)
|
59
|
-
{
|
65
|
+
{
|
60
66
|
VALUE ret;
|
61
67
|
EVP_MD_CTX *ctx;
|
62
68
|
|
63
69
|
ret = ossl_digest_alloc(cDigest);
|
64
70
|
GetDigest(ret, ctx);
|
65
|
-
EVP_DigestInit_ex(ctx, md, NULL)
|
66
|
-
|
71
|
+
if (EVP_DigestInit_ex(ctx, md, NULL) != 1) {
|
72
|
+
ossl_raise(eDigestError, "Digest initialization failed.");
|
73
|
+
}
|
74
|
+
|
67
75
|
return ret;
|
68
76
|
}
|
69
77
|
|
@@ -88,7 +96,20 @@ VALUE ossl_digest_update(VALUE, VALUE);
|
|
88
96
|
|
89
97
|
/*
|
90
98
|
* call-seq:
|
91
|
-
* Digest.new(string) ->
|
99
|
+
* Digest.new(string [, data]) -> Digest
|
100
|
+
*
|
101
|
+
* Creates a Digest instance based on +string+, which is either the ln
|
102
|
+
* (long name) or sn (short name) of a supported digest algorithm.
|
103
|
+
* If +data+ (a +String+) is given, it is used as the initial input to the
|
104
|
+
* Digest instance, i.e.
|
105
|
+
* digest = OpenSSL::Digest.new('sha256', 'digestdata')
|
106
|
+
* is equal to
|
107
|
+
* digest = OpenSSL::Digest.new('sha256')
|
108
|
+
* digest.update('digestdata')
|
109
|
+
*
|
110
|
+
* === Example
|
111
|
+
* digest = OpenSSL::Digest.new('sha1')
|
112
|
+
*
|
92
113
|
*
|
93
114
|
*/
|
94
115
|
static VALUE
|
@@ -96,7 +117,6 @@ ossl_digest_initialize(int argc, VALUE *argv, VALUE self)
|
|
96
117
|
{
|
97
118
|
EVP_MD_CTX *ctx;
|
98
119
|
const EVP_MD *md;
|
99
|
-
char *name;
|
100
120
|
VALUE type, data;
|
101
121
|
|
102
122
|
rb_scan_args(argc, argv, "11", &type, &data);
|
@@ -104,8 +124,10 @@ ossl_digest_initialize(int argc, VALUE *argv, VALUE self)
|
|
104
124
|
if (!NIL_P(data)) StringValue(data);
|
105
125
|
|
106
126
|
GetDigest(self, ctx);
|
107
|
-
EVP_DigestInit_ex(ctx, md, NULL)
|
108
|
-
|
127
|
+
if (EVP_DigestInit_ex(ctx, md, NULL) != 1) {
|
128
|
+
ossl_raise(eDigestError, "Digest initialization failed.");
|
129
|
+
}
|
130
|
+
|
109
131
|
if (!NIL_P(data)) return ossl_digest_update(self, data);
|
110
132
|
return self;
|
111
133
|
}
|
@@ -114,7 +136,7 @@ static VALUE
|
|
114
136
|
ossl_digest_copy(VALUE self, VALUE other)
|
115
137
|
{
|
116
138
|
EVP_MD_CTX *ctx1, *ctx2;
|
117
|
-
|
139
|
+
|
118
140
|
rb_check_frozen(self);
|
119
141
|
if (self == other) return self;
|
120
142
|
|
@@ -131,6 +153,9 @@ ossl_digest_copy(VALUE self, VALUE other)
|
|
131
153
|
* call-seq:
|
132
154
|
* digest.reset -> self
|
133
155
|
*
|
156
|
+
* Resets the Digest in the sense that any Digest#update that has been
|
157
|
+
* performed is abandoned and the Digest is set to its initial state again.
|
158
|
+
*
|
134
159
|
*/
|
135
160
|
static VALUE
|
136
161
|
ossl_digest_reset(VALUE self)
|
@@ -138,7 +163,9 @@ ossl_digest_reset(VALUE self)
|
|
138
163
|
EVP_MD_CTX *ctx;
|
139
164
|
|
140
165
|
GetDigest(self, ctx);
|
141
|
-
EVP_DigestInit_ex(ctx, EVP_MD_CTX_md(ctx), NULL)
|
166
|
+
if (EVP_DigestInit_ex(ctx, EVP_MD_CTX_md(ctx), NULL) != 1) {
|
167
|
+
ossl_raise(eDigestError, "Digest initialization failed.");
|
168
|
+
}
|
142
169
|
|
143
170
|
return self;
|
144
171
|
}
|
@@ -147,6 +174,16 @@ ossl_digest_reset(VALUE self)
|
|
147
174
|
* call-seq:
|
148
175
|
* digest.update(string) -> aString
|
149
176
|
*
|
177
|
+
* Not every message digest can be computed in one single pass. If a message
|
178
|
+
* digest is to be computed from several subsequent sources, then each may
|
179
|
+
* be passed individually to the Digest instance.
|
180
|
+
*
|
181
|
+
* === Example
|
182
|
+
* digest = OpenSSL::Digest::SHA256.new
|
183
|
+
* digest.update('First input')
|
184
|
+
* digest << 'Second input' # equivalent to digest.update('Second input')
|
185
|
+
* result = digest.digest
|
186
|
+
*
|
150
187
|
*/
|
151
188
|
VALUE
|
152
189
|
ossl_digest_update(VALUE self, VALUE data)
|
@@ -182,7 +219,7 @@ ossl_digest_finish(int argc, VALUE *argv, VALUE self)
|
|
182
219
|
rb_str_resize(str, EVP_MD_CTX_size(ctx));
|
183
220
|
}
|
184
221
|
|
185
|
-
EVP_DigestFinal_ex(ctx, RSTRING_PTR(str), NULL);
|
222
|
+
EVP_DigestFinal_ex(ctx, (unsigned char *)RSTRING_PTR(str), NULL);
|
186
223
|
|
187
224
|
return str;
|
188
225
|
}
|
@@ -191,6 +228,12 @@ ossl_digest_finish(int argc, VALUE *argv, VALUE self)
|
|
191
228
|
* call-seq:
|
192
229
|
* digest.name -> string
|
193
230
|
*
|
231
|
+
* Returns the sn of this Digest instance.
|
232
|
+
*
|
233
|
+
* === Example
|
234
|
+
* digest = OpenSSL::Digest::SHA512.new
|
235
|
+
* puts digest.name # => SHA512
|
236
|
+
*
|
194
237
|
*/
|
195
238
|
static VALUE
|
196
239
|
ossl_digest_name(VALUE self)
|
@@ -204,9 +247,15 @@ ossl_digest_name(VALUE self)
|
|
204
247
|
|
205
248
|
/*
|
206
249
|
* call-seq:
|
207
|
-
* digest.
|
250
|
+
* digest.digest_length -> integer
|
251
|
+
*
|
252
|
+
* Returns the output size of the digest, i.e. the length in bytes of the
|
253
|
+
* final message digest result.
|
254
|
+
*
|
255
|
+
* === Example
|
256
|
+
* digest = OpenSSL::Digest::SHA1.new
|
257
|
+
* puts digest.digest_length # => 20
|
208
258
|
*
|
209
|
-
* Returns the output size of the digest.
|
210
259
|
*/
|
211
260
|
static VALUE
|
212
261
|
ossl_digest_size(VALUE self)
|
@@ -218,6 +267,19 @@ ossl_digest_size(VALUE self)
|
|
218
267
|
return INT2NUM(EVP_MD_CTX_size(ctx));
|
219
268
|
}
|
220
269
|
|
270
|
+
/*
|
271
|
+
* call-seq:
|
272
|
+
* digest.block_length -> integer
|
273
|
+
*
|
274
|
+
* Returns the block length of the digest algorithm, i.e. the length in bytes
|
275
|
+
* of an individual block. Most modern algorithms partition a message to be
|
276
|
+
* digested into a sequence of fix-sized blocks that are processed
|
277
|
+
* consecutively.
|
278
|
+
*
|
279
|
+
* === Example
|
280
|
+
* digest = OpenSSL::Digest::SHA1.new
|
281
|
+
* puts digest.block_length # => 64
|
282
|
+
*/
|
221
283
|
static VALUE
|
222
284
|
ossl_digest_block_length(VALUE self)
|
223
285
|
{
|
@@ -234,13 +296,133 @@ ossl_digest_block_length(VALUE self)
|
|
234
296
|
void
|
235
297
|
Init_ossl_digest()
|
236
298
|
{
|
237
|
-
|
238
|
-
|
299
|
+
rb_require("digest");
|
300
|
+
|
301
|
+
#if 0
|
302
|
+
mOSSL = rb_define_module("OpenSSL"); /* let rdoc know about mOSSL */
|
239
303
|
#endif
|
240
304
|
|
305
|
+
/* Document-class: OpenSSL::Digest
|
306
|
+
*
|
307
|
+
* OpenSSL::Digest allows you to compute message digests (sometimes
|
308
|
+
* interchangeably called "hashes") of arbitrary data that are
|
309
|
+
* cryptographically secure, i.e. a Digest implements a secure one-way
|
310
|
+
* function.
|
311
|
+
*
|
312
|
+
* One-way functions offer some useful properties. E.g. given two
|
313
|
+
* distinct inputs the probability that both yield the same output
|
314
|
+
* is highly unlikely. Combined with the fact that every message digest
|
315
|
+
* algorithm has a fixed-length output of just a few bytes, digests are
|
316
|
+
* often used to create unique identifiers for arbitrary data. A common
|
317
|
+
* example is the creation of a unique id for binary documents that are
|
318
|
+
* stored in a database.
|
319
|
+
*
|
320
|
+
* Another useful characteristic of one-way functions (and thus the name)
|
321
|
+
* is that given a digest there is no indication about the original
|
322
|
+
* data that produced it, i.e. the only way to identify the original input
|
323
|
+
* is to "brute-force" through every possible combination of inputs.
|
324
|
+
*
|
325
|
+
* These characteristics make one-way functions also ideal companions
|
326
|
+
* for public key signature algorithms: instead of signing an entire
|
327
|
+
* document, first a hash of the document is produced with a considerably
|
328
|
+
* faster message digest algorithm and only the few bytes of its output
|
329
|
+
* need to be signed using the slower public key algorithm. To validate
|
330
|
+
* the integrity of a signed document, it suffices to re-compute the hash
|
331
|
+
* and verify that it is equal to that in the signature.
|
332
|
+
*
|
333
|
+
* Among the supported message digest algorithms are:
|
334
|
+
* * SHA, SHA1, SHA224, SHA256, SHA384 and SHA512
|
335
|
+
* * MD2, MD4, MDC2 and MD5
|
336
|
+
* * RIPEMD160
|
337
|
+
* * DSS, DSS1 (Pseudo algorithms to be used for DSA signatures. DSS is
|
338
|
+
* equal to SHA and DSS1 is equal to SHA1)
|
339
|
+
*
|
340
|
+
* For each of these algorithms, there is a sub-class of Digest that
|
341
|
+
* can be instantiated as simply as e.g.
|
342
|
+
*
|
343
|
+
* digest = OpenSSL::Digest::SHA1.new
|
344
|
+
*
|
345
|
+
* === Mapping between Digest class and sn/ln
|
346
|
+
*
|
347
|
+
* The sn (short names) and ln (long names) are defined in
|
348
|
+
* <openssl/object.h> and <openssl/obj_mac.h>. They are textual
|
349
|
+
* representations of ASN.1 OBJECT IDENTIFIERs. Each supported digest
|
350
|
+
* algorithm has an OBJECT IDENTIFIER associated to it and those again
|
351
|
+
* have short/long names assigned to them.
|
352
|
+
* E.g. the OBJECT IDENTIFIER for SHA-1 is 1.3.14.3.2.26 and its
|
353
|
+
* sn is "SHA1" and its ln is "sha1".
|
354
|
+
* ==== MD2
|
355
|
+
* * sn: MD2
|
356
|
+
* * ln: md2
|
357
|
+
* ==== MD4
|
358
|
+
* * sn: MD4
|
359
|
+
* * ln: md4
|
360
|
+
* ==== MD5
|
361
|
+
* * sn: MD5
|
362
|
+
* * ln: md5
|
363
|
+
* ==== SHA
|
364
|
+
* * sn: SHA
|
365
|
+
* * ln: SHA
|
366
|
+
* ==== SHA-1
|
367
|
+
* * sn: SHA1
|
368
|
+
* * ln: sha1
|
369
|
+
* ==== SHA-224
|
370
|
+
* * sn: SHA224
|
371
|
+
* * ln: sha224
|
372
|
+
* ==== SHA-256
|
373
|
+
* * sn: SHA256
|
374
|
+
* * ln: sha256
|
375
|
+
* ==== SHA-384
|
376
|
+
* * sn: SHA384
|
377
|
+
* * ln: sha384
|
378
|
+
* ==== SHA-512
|
379
|
+
* * sn: SHA512
|
380
|
+
* * ln: sha512
|
381
|
+
*
|
382
|
+
* "Breaking" a message digest algorithm means defying its one-way
|
383
|
+
* function characteristics, i.e. producing a collision or finding a way
|
384
|
+
* to get to the original data by means that are more efficient than
|
385
|
+
* brute-forcing etc. Most of the supported digest algorithms can be
|
386
|
+
* considered broken in this sense, even the very popular MD5 and SHA1
|
387
|
+
* algorithms. Should security be your highest concern, then you should
|
388
|
+
* probably rely on SHA224, SHA256, SHA384 or SHA512.
|
389
|
+
*
|
390
|
+
* === Hashing a file
|
391
|
+
*
|
392
|
+
* data = File.read('document')
|
393
|
+
* sha256 = OpenSSL::Digest::SHA256.new
|
394
|
+
* digest = sha256.digest(data)
|
395
|
+
*
|
396
|
+
* === Hashing several pieces of data at once
|
397
|
+
*
|
398
|
+
* data1 = File.read('file1')
|
399
|
+
* data2 = File.read('file2')
|
400
|
+
* data3 = File.read('file3')
|
401
|
+
* sha256 = OpenSSL::Digest::SHA256.new
|
402
|
+
* sha256 << data1
|
403
|
+
* sha256 << data2
|
404
|
+
* sha256 << data3
|
405
|
+
* digest = sha256.digest
|
406
|
+
*
|
407
|
+
* === Reuse a Digest instance
|
408
|
+
*
|
409
|
+
* data1 = File.read('file1')
|
410
|
+
* sha256 = OpenSSL::Digest::SHA256.new
|
411
|
+
* digest1 = sha256.digest(data1)
|
412
|
+
*
|
413
|
+
* data2 = File.read('file2')
|
414
|
+
* sha256.reset
|
415
|
+
* digest2 = sha256.digest(data2)
|
416
|
+
*
|
417
|
+
*/
|
241
418
|
cDigest = rb_define_class_under(mOSSL, "Digest", rb_path2class("Digest::Class"));
|
419
|
+
/* Document-class: OpenSSL::Digest::DigestError
|
420
|
+
*
|
421
|
+
* Generic Exception class that is raised if an error occurs during a
|
422
|
+
* Digest operation.
|
423
|
+
*/
|
242
424
|
eDigestError = rb_define_class_under(cDigest, "DigestError", eOSSLError);
|
243
|
-
|
425
|
+
|
244
426
|
rb_define_alloc_func(cDigest, ossl_digest_alloc);
|
245
427
|
|
246
428
|
rb_define_method(cDigest, "initialize", ossl_digest_initialize, -1);
|
@@ -13,23 +13,23 @@
|
|
13
13
|
#if defined(OSSL_ENGINE_ENABLED)
|
14
14
|
|
15
15
|
#define WrapEngine(klass, obj, engine) do { \
|
16
|
-
if (!engine) { \
|
16
|
+
if (!(engine)) { \
|
17
17
|
ossl_raise(rb_eRuntimeError, "ENGINE wasn't initialized."); \
|
18
18
|
} \
|
19
|
-
obj = Data_Wrap_Struct(klass, 0, ENGINE_free, engine); \
|
19
|
+
(obj) = Data_Wrap_Struct((klass), 0, ENGINE_free, (engine)); \
|
20
20
|
} while(0)
|
21
21
|
#define GetEngine(obj, engine) do { \
|
22
|
-
Data_Get_Struct(obj, ENGINE, engine); \
|
23
|
-
if (!engine) { \
|
22
|
+
Data_Get_Struct((obj), ENGINE, (engine)); \
|
23
|
+
if (!(engine)) { \
|
24
24
|
ossl_raise(rb_eRuntimeError, "ENGINE wasn't initialized."); \
|
25
25
|
} \
|
26
26
|
} while (0)
|
27
27
|
#define SafeGetEngine(obj, engine) do { \
|
28
|
-
OSSL_Check_Kind(obj, cEngine); \
|
29
|
-
GetPKCS7(obj, engine); \
|
28
|
+
OSSL_Check_Kind((obj), cEngine); \
|
29
|
+
GetPKCS7((obj), (engine)); \
|
30
30
|
} while (0)
|
31
31
|
|
32
|
-
/*
|
32
|
+
/*
|
33
33
|
* Classes
|
34
34
|
*/
|
35
35
|
VALUE cEngine;
|
@@ -64,29 +64,47 @@ ossl_engine_s_load(int argc, VALUE *argv, VALUE klass)
|
|
64
64
|
#if HAVE_ENGINE_LOAD_DYNAMIC
|
65
65
|
OSSL_ENGINE_LOAD_IF_MATCH(dynamic);
|
66
66
|
#endif
|
67
|
-
#if
|
68
|
-
OSSL_ENGINE_LOAD_IF_MATCH(
|
67
|
+
#if HAVE_ENGINE_LOAD_4758CCA
|
68
|
+
OSSL_ENGINE_LOAD_IF_MATCH(4758cca);
|
69
69
|
#endif
|
70
|
-
#if
|
71
|
-
OSSL_ENGINE_LOAD_IF_MATCH(
|
70
|
+
#if HAVE_ENGINE_LOAD_AEP
|
71
|
+
OSSL_ENGINE_LOAD_IF_MATCH(aep);
|
72
72
|
#endif
|
73
73
|
#if HAVE_ENGINE_LOAD_ATALLA
|
74
74
|
OSSL_ENGINE_LOAD_IF_MATCH(atalla);
|
75
75
|
#endif
|
76
|
+
#if HAVE_ENGINE_LOAD_CHIL
|
77
|
+
OSSL_ENGINE_LOAD_IF_MATCH(chil);
|
78
|
+
#endif
|
79
|
+
#if HAVE_ENGINE_LOAD_CSWIFT
|
80
|
+
OSSL_ENGINE_LOAD_IF_MATCH(cswift);
|
81
|
+
#endif
|
76
82
|
#if HAVE_ENGINE_LOAD_NURON
|
77
83
|
OSSL_ENGINE_LOAD_IF_MATCH(nuron);
|
78
84
|
#endif
|
85
|
+
#if HAVE_ENGINE_LOAD_SUREWARE
|
86
|
+
OSSL_ENGINE_LOAD_IF_MATCH(sureware);
|
87
|
+
#endif
|
79
88
|
#if HAVE_ENGINE_LOAD_UBSEC
|
80
89
|
OSSL_ENGINE_LOAD_IF_MATCH(ubsec);
|
81
90
|
#endif
|
82
|
-
#if
|
83
|
-
OSSL_ENGINE_LOAD_IF_MATCH(
|
91
|
+
#if HAVE_ENGINE_LOAD_PADLOCK
|
92
|
+
OSSL_ENGINE_LOAD_IF_MATCH(padlock);
|
84
93
|
#endif
|
85
|
-
#if
|
86
|
-
OSSL_ENGINE_LOAD_IF_MATCH(
|
94
|
+
#if HAVE_ENGINE_LOAD_CAPI
|
95
|
+
OSSL_ENGINE_LOAD_IF_MATCH(capi);
|
87
96
|
#endif
|
88
|
-
#if
|
89
|
-
OSSL_ENGINE_LOAD_IF_MATCH(
|
97
|
+
#if HAVE_ENGINE_LOAD_GMP
|
98
|
+
OSSL_ENGINE_LOAD_IF_MATCH(gmp);
|
99
|
+
#endif
|
100
|
+
#if HAVE_ENGINE_LOAD_GOST
|
101
|
+
OSSL_ENGINE_LOAD_IF_MATCH(gost);
|
102
|
+
#endif
|
103
|
+
#if HAVE_ENGINE_LOAD_CRYPTODEV
|
104
|
+
OSSL_ENGINE_LOAD_IF_MATCH(cryptodev);
|
105
|
+
#endif
|
106
|
+
#if HAVE_ENGINE_LOAD_AESNI
|
107
|
+
OSSL_ENGINE_LOAD_IF_MATCH(aesni);
|
90
108
|
#endif
|
91
109
|
#endif
|
92
110
|
#ifdef HAVE_ENGINE_LOAD_OPENBSD_DEV_CRYPTO
|
@@ -115,7 +133,11 @@ ossl_engine_s_engines(VALUE klass)
|
|
115
133
|
|
116
134
|
ary = rb_ary_new();
|
117
135
|
for(e = ENGINE_get_first(); e; e = ENGINE_get_next(e)){
|
118
|
-
|
136
|
+
/* Need a ref count of two here because of ENGINE_free being
|
137
|
+
* called internally by OpenSSL when moving to the next ENGINE
|
138
|
+
* and by us when releasing the ENGINE reference */
|
139
|
+
ENGINE_up_ref(e);
|
140
|
+
WrapEngine(klass, obj, e);
|
119
141
|
rb_ary_push(ary, obj);
|
120
142
|
}
|
121
143
|
|
@@ -137,7 +159,7 @@ ossl_engine_s_by_id(VALUE klass, VALUE id)
|
|
137
159
|
if(!ENGINE_init(e))
|
138
160
|
ossl_raise(eEngineError, NULL);
|
139
161
|
ENGINE_ctrl(e, ENGINE_CTRL_SET_PASSWORD_CALLBACK,
|
140
|
-
|
162
|
+
0, NULL, (void(*)(void))ossl_pem_passwd_cb);
|
141
163
|
ERR_clear_error();
|
142
164
|
|
143
165
|
return obj;
|
@@ -184,10 +206,10 @@ ossl_engine_finish(VALUE self)
|
|
184
206
|
return Qnil;
|
185
207
|
}
|
186
208
|
|
209
|
+
#if defined(HAVE_ENGINE_GET_CIPHER)
|
187
210
|
static VALUE
|
188
211
|
ossl_engine_get_cipher(VALUE self, VALUE name)
|
189
212
|
{
|
190
|
-
#if defined(HAVE_ENGINE_GET_CIPHER)
|
191
213
|
ENGINE *e;
|
192
214
|
const EVP_CIPHER *ciph, *tmp;
|
193
215
|
char *s;
|
@@ -202,15 +224,15 @@ ossl_engine_get_cipher(VALUE self, VALUE name)
|
|
202
224
|
if(!ciph) ossl_raise(eEngineError, NULL);
|
203
225
|
|
204
226
|
return ossl_cipher_new(ciph);
|
227
|
+
}
|
205
228
|
#else
|
206
|
-
|
229
|
+
#define ossl_engine_get_cipher rb_f_notimplement
|
207
230
|
#endif
|
208
|
-
}
|
209
231
|
|
232
|
+
#if defined(HAVE_ENGINE_GET_DIGEST)
|
210
233
|
static VALUE
|
211
234
|
ossl_engine_get_digest(VALUE self, VALUE name)
|
212
235
|
{
|
213
|
-
#if defined(HAVE_ENGINE_GET_DIGEST)
|
214
236
|
ENGINE *e;
|
215
237
|
const EVP_MD *md, *tmp;
|
216
238
|
char *s;
|
@@ -225,10 +247,10 @@ ossl_engine_get_digest(VALUE self, VALUE name)
|
|
225
247
|
if(!md) ossl_raise(eEngineError, NULL);
|
226
248
|
|
227
249
|
return ossl_digest_new(md);
|
250
|
+
}
|
228
251
|
#else
|
229
|
-
|
252
|
+
#define ossl_engine_get_digest rb_f_notimplement
|
230
253
|
#endif
|
231
|
-
}
|
232
254
|
|
233
255
|
static VALUE
|
234
256
|
ossl_engine_load_privkey(int argc, VALUE *argv, VALUE self)
|
@@ -345,7 +367,7 @@ ossl_engine_inspect(VALUE self)
|
|
345
367
|
{
|
346
368
|
VALUE str;
|
347
369
|
const char *cname = rb_class2name(rb_obj_class(self));
|
348
|
-
|
370
|
+
|
349
371
|
str = rb_str_new2("#<");
|
350
372
|
rb_str_cat2(str, cname);
|
351
373
|
rb_str_cat2(str, " id=\"");
|