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.
|
@@ -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=\"");
|