openssl 3.1.1 → 3.2.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/History.md +36 -27
- data/README.md +36 -19
- data/ext/openssl/extconf.rb +35 -8
- data/ext/openssl/ossl.c +73 -195
- data/ext/openssl/ossl.h +5 -6
- data/ext/openssl/ossl_asn1.c +24 -19
- data/ext/openssl/ossl_bn.c +1 -1
- data/ext/openssl/ossl_cipher.c +5 -20
- data/ext/openssl/ossl_config.c +1 -1
- data/ext/openssl/ossl_digest.c +1 -2
- data/ext/openssl/ossl_engine.c +1 -1
- data/ext/openssl/ossl_hmac.c +1 -1
- data/ext/openssl/ossl_kdf.c +1 -1
- data/ext/openssl/ossl_ns_spki.c +1 -1
- data/ext/openssl/ossl_ocsp.c +6 -6
- data/ext/openssl/ossl_pkcs12.c +1 -1
- data/ext/openssl/ossl_pkcs7.c +4 -14
- data/ext/openssl/ossl_pkey.c +217 -44
- data/ext/openssl/ossl_pkey_dh.c +22 -7
- data/ext/openssl/ossl_pkey_dsa.c +57 -8
- data/ext/openssl/ossl_pkey_ec.c +65 -9
- data/ext/openssl/ossl_pkey_rsa.c +68 -13
- data/ext/openssl/ossl_provider.c +211 -0
- data/ext/openssl/ossl_provider.h +5 -0
- data/ext/openssl/ossl_ssl.c +83 -65
- data/ext/openssl/ossl_ssl_session.c +1 -1
- data/ext/openssl/ossl_ts.c +3 -3
- data/ext/openssl/ossl_x509attr.c +1 -1
- data/ext/openssl/ossl_x509cert.c +1 -1
- data/ext/openssl/ossl_x509crl.c +1 -1
- data/ext/openssl/ossl_x509ext.c +13 -7
- data/ext/openssl/ossl_x509name.c +1 -1
- data/ext/openssl/ossl_x509req.c +1 -1
- data/ext/openssl/ossl_x509revoked.c +1 -1
- data/ext/openssl/ossl_x509store.c +12 -5
- data/lib/openssl/buffering.rb +8 -16
- data/lib/openssl/digest.rb +1 -5
- data/lib/openssl/ssl.rb +10 -10
- data/lib/openssl/version.rb +1 -1
- data/lib/openssl/x509.rb +5 -5
- metadata +12 -7
data/ext/openssl/ossl_pkey_dsa.c
CHANGED
@@ -211,16 +211,58 @@ ossl_dsa_is_private(VALUE self)
|
|
211
211
|
* dsa.to_pem([cipher, password]) -> aString
|
212
212
|
* dsa.to_s([cipher, password]) -> aString
|
213
213
|
*
|
214
|
-
*
|
214
|
+
* Serializes a private or public key to a PEM-encoding.
|
215
215
|
*
|
216
|
-
*
|
217
|
-
* * _cipher_ is an OpenSSL::Cipher.
|
218
|
-
* * _password_ is a string containing your password.
|
216
|
+
* [When the key contains public components only]
|
219
217
|
*
|
220
|
-
*
|
221
|
-
*
|
222
|
-
* DSA.to_pem(cipher, 'mypassword') -> aString
|
218
|
+
* Serializes it into an X.509 SubjectPublicKeyInfo.
|
219
|
+
* The parameters _cipher_ and _password_ are ignored.
|
223
220
|
*
|
221
|
+
* A PEM-encoded key will look like:
|
222
|
+
*
|
223
|
+
* -----BEGIN PUBLIC KEY-----
|
224
|
+
* [...]
|
225
|
+
* -----END PUBLIC KEY-----
|
226
|
+
*
|
227
|
+
* Consider using #public_to_pem instead. This serializes the key into an
|
228
|
+
* X.509 SubjectPublicKeyInfo regardless of whether it is a public key
|
229
|
+
* or a private key.
|
230
|
+
*
|
231
|
+
* [When the key contains private components, and no parameters are given]
|
232
|
+
*
|
233
|
+
* Serializes it into a traditional \OpenSSL DSAPrivateKey.
|
234
|
+
*
|
235
|
+
* A PEM-encoded key will look like:
|
236
|
+
*
|
237
|
+
* -----BEGIN DSA PRIVATE KEY-----
|
238
|
+
* [...]
|
239
|
+
* -----END DSA PRIVATE KEY-----
|
240
|
+
*
|
241
|
+
* [When the key contains private components, and _cipher_ and _password_ are given]
|
242
|
+
*
|
243
|
+
* Serializes it into a traditional \OpenSSL DSAPrivateKey and encrypts it in
|
244
|
+
* OpenSSL's traditional PEM encryption format.
|
245
|
+
* _cipher_ must be a cipher name understood by OpenSSL::Cipher.new or an
|
246
|
+
* instance of OpenSSL::Cipher.
|
247
|
+
*
|
248
|
+
* An encrypted PEM-encoded key will look like:
|
249
|
+
*
|
250
|
+
* -----BEGIN DSA PRIVATE KEY-----
|
251
|
+
* Proc-Type: 4,ENCRYPTED
|
252
|
+
* DEK-Info: AES-128-CBC,733F5302505B34701FC41F5C0746E4C0
|
253
|
+
*
|
254
|
+
* [...]
|
255
|
+
* -----END DSA PRIVATE KEY-----
|
256
|
+
*
|
257
|
+
* Note that this format uses MD5 to derive the encryption key, and hence
|
258
|
+
* will not be available on FIPS-compliant systems.
|
259
|
+
*
|
260
|
+
* <b>This method is kept for compatibility.</b>
|
261
|
+
* This should only be used when the traditional, non-standard \OpenSSL format
|
262
|
+
* is required.
|
263
|
+
*
|
264
|
+
* Consider using #public_to_pem (X.509 SubjectPublicKeyInfo) or #private_to_pem
|
265
|
+
* (PKCS #8 PrivateKeyInfo or EncryptedPrivateKeyInfo) instead.
|
224
266
|
*/
|
225
267
|
static VALUE
|
226
268
|
ossl_dsa_export(int argc, VALUE *argv, VALUE self)
|
@@ -238,8 +280,15 @@ ossl_dsa_export(int argc, VALUE *argv, VALUE self)
|
|
238
280
|
* call-seq:
|
239
281
|
* dsa.to_der -> aString
|
240
282
|
*
|
241
|
-
*
|
283
|
+
* Serializes a private or public key to a DER-encoding.
|
284
|
+
*
|
285
|
+
* See #to_pem for details.
|
286
|
+
*
|
287
|
+
* <b>This method is kept for compatibility.</b>
|
288
|
+
* This should only be used when the traditional, non-standard \OpenSSL format
|
289
|
+
* is required.
|
242
290
|
*
|
291
|
+
* Consider using #public_to_der or #private_to_der instead.
|
243
292
|
*/
|
244
293
|
static VALUE
|
245
294
|
ossl_dsa_to_der(VALUE self)
|
data/ext/openssl/ossl_pkey_ec.c
CHANGED
@@ -400,13 +400,61 @@ static VALUE ossl_ec_key_is_private(VALUE self)
|
|
400
400
|
|
401
401
|
/*
|
402
402
|
* call-seq:
|
403
|
-
* key.export([cipher,
|
404
|
-
* key.to_pem([cipher,
|
403
|
+
* key.export([cipher, password]) => String
|
404
|
+
* key.to_pem([cipher, password]) => String
|
405
405
|
*
|
406
|
-
*
|
407
|
-
*
|
408
|
-
*
|
409
|
-
*
|
406
|
+
* Serializes a private or public key to a PEM-encoding.
|
407
|
+
*
|
408
|
+
* [When the key contains public components only]
|
409
|
+
*
|
410
|
+
* Serializes it into an X.509 SubjectPublicKeyInfo.
|
411
|
+
* The parameters _cipher_ and _password_ are ignored.
|
412
|
+
*
|
413
|
+
* A PEM-encoded key will look like:
|
414
|
+
*
|
415
|
+
* -----BEGIN PUBLIC KEY-----
|
416
|
+
* [...]
|
417
|
+
* -----END PUBLIC KEY-----
|
418
|
+
*
|
419
|
+
* Consider using #public_to_pem instead. This serializes the key into an
|
420
|
+
* X.509 SubjectPublicKeyInfo regardless of whether it is a public key
|
421
|
+
* or a private key.
|
422
|
+
*
|
423
|
+
* [When the key contains private components, and no parameters are given]
|
424
|
+
*
|
425
|
+
* Serializes it into a SEC 1/RFC 5915 ECPrivateKey.
|
426
|
+
*
|
427
|
+
* A PEM-encoded key will look like:
|
428
|
+
*
|
429
|
+
* -----BEGIN EC PRIVATE KEY-----
|
430
|
+
* [...]
|
431
|
+
* -----END EC PRIVATE KEY-----
|
432
|
+
*
|
433
|
+
* [When the key contains private components, and _cipher_ and _password_ are given]
|
434
|
+
*
|
435
|
+
* Serializes it into a SEC 1/RFC 5915 ECPrivateKey
|
436
|
+
* and encrypts it in OpenSSL's traditional PEM encryption format.
|
437
|
+
* _cipher_ must be a cipher name understood by OpenSSL::Cipher.new or an
|
438
|
+
* instance of OpenSSL::Cipher.
|
439
|
+
*
|
440
|
+
* An encrypted PEM-encoded key will look like:
|
441
|
+
*
|
442
|
+
* -----BEGIN EC PRIVATE KEY-----
|
443
|
+
* Proc-Type: 4,ENCRYPTED
|
444
|
+
* DEK-Info: AES-128-CBC,733F5302505B34701FC41F5C0746E4C0
|
445
|
+
*
|
446
|
+
* [...]
|
447
|
+
* -----END EC PRIVATE KEY-----
|
448
|
+
*
|
449
|
+
* Note that this format uses MD5 to derive the encryption key, and hence
|
450
|
+
* will not be available on FIPS-compliant systems.
|
451
|
+
*
|
452
|
+
* <b>This method is kept for compatibility.</b>
|
453
|
+
* This should only be used when the SEC 1/RFC 5915 ECPrivateKey format is
|
454
|
+
* required.
|
455
|
+
*
|
456
|
+
* Consider using #public_to_pem (X.509 SubjectPublicKeyInfo) or #private_to_pem
|
457
|
+
* (PKCS #8 PrivateKeyInfo or EncryptedPrivateKeyInfo) instead.
|
410
458
|
*/
|
411
459
|
static VALUE
|
412
460
|
ossl_ec_key_export(int argc, VALUE *argv, VALUE self)
|
@@ -426,7 +474,15 @@ ossl_ec_key_export(int argc, VALUE *argv, VALUE self)
|
|
426
474
|
* call-seq:
|
427
475
|
* key.to_der => String
|
428
476
|
*
|
429
|
-
*
|
477
|
+
* Serializes a private or public key to a DER-encoding.
|
478
|
+
*
|
479
|
+
* See #to_pem for details.
|
480
|
+
*
|
481
|
+
* <b>This method is kept for compatibility.</b>
|
482
|
+
* This should only be used when the SEC 1/RFC 5915 ECPrivateKey format is
|
483
|
+
* required.
|
484
|
+
*
|
485
|
+
* Consider using #public_to_der or #private_to_der instead.
|
430
486
|
*/
|
431
487
|
static VALUE
|
432
488
|
ossl_ec_key_to_der(VALUE self)
|
@@ -530,7 +586,7 @@ static const rb_data_type_t ossl_ec_group_type = {
|
|
530
586
|
{
|
531
587
|
0, ossl_ec_group_free,
|
532
588
|
},
|
533
|
-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
589
|
+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
|
534
590
|
};
|
535
591
|
|
536
592
|
static VALUE
|
@@ -1115,7 +1171,7 @@ static const rb_data_type_t ossl_ec_point_type = {
|
|
1115
1171
|
{
|
1116
1172
|
0, ossl_ec_point_free,
|
1117
1173
|
},
|
1118
|
-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
1174
|
+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
|
1119
1175
|
};
|
1120
1176
|
|
1121
1177
|
static VALUE
|
data/ext/openssl/ossl_pkey_rsa.c
CHANGED
@@ -50,8 +50,8 @@ VALUE eRSAError;
|
|
50
50
|
/*
|
51
51
|
* call-seq:
|
52
52
|
* RSA.new -> rsa
|
53
|
-
* RSA.new(encoded_key [,
|
54
|
-
* RSA.new(encoded_key) {
|
53
|
+
* RSA.new(encoded_key [, password ]) -> rsa
|
54
|
+
* RSA.new(encoded_key) { password } -> rsa
|
55
55
|
* RSA.new(size [, exponent]) -> rsa
|
56
56
|
*
|
57
57
|
* Generates or loads an \RSA keypair.
|
@@ -61,9 +61,9 @@ VALUE eRSAError;
|
|
61
61
|
* #set_crt_params.
|
62
62
|
*
|
63
63
|
* If called with a String, tries to parse as DER or PEM encoding of an \RSA key.
|
64
|
-
* Note that
|
65
|
-
*
|
66
|
-
* See also OpenSSL::PKey.read which can parse keys of any
|
64
|
+
* Note that if _password_ is not specified, but the key is encrypted with a
|
65
|
+
* password, \OpenSSL will prompt for it.
|
66
|
+
* See also OpenSSL::PKey.read which can parse keys of any kind.
|
67
67
|
*
|
68
68
|
* If called with a number, generates a new key pair. This form works as an
|
69
69
|
* alias of RSA.generate.
|
@@ -71,7 +71,7 @@ VALUE eRSAError;
|
|
71
71
|
* Examples:
|
72
72
|
* OpenSSL::PKey::RSA.new 2048
|
73
73
|
* OpenSSL::PKey::RSA.new File.read 'rsa.pem'
|
74
|
-
* OpenSSL::PKey::RSA.new File.read('rsa.pem'), 'my
|
74
|
+
* OpenSSL::PKey::RSA.new File.read('rsa.pem'), 'my password'
|
75
75
|
*/
|
76
76
|
static VALUE
|
77
77
|
ossl_rsa_initialize(int argc, VALUE *argv, VALUE self)
|
@@ -217,13 +217,61 @@ can_export_rsaprivatekey(VALUE self)
|
|
217
217
|
|
218
218
|
/*
|
219
219
|
* call-seq:
|
220
|
-
* rsa.export([cipher,
|
221
|
-
* rsa.to_pem([cipher,
|
222
|
-
* rsa.to_s([cipher,
|
220
|
+
* rsa.export([cipher, password]) => PEM-format String
|
221
|
+
* rsa.to_pem([cipher, password]) => PEM-format String
|
222
|
+
* rsa.to_s([cipher, password]) => PEM-format String
|
223
223
|
*
|
224
|
-
*
|
225
|
-
*
|
226
|
-
*
|
224
|
+
* Serializes a private or public key to a PEM-encoding.
|
225
|
+
*
|
226
|
+
* [When the key contains public components only]
|
227
|
+
*
|
228
|
+
* Serializes it into an X.509 SubjectPublicKeyInfo.
|
229
|
+
* The parameters _cipher_ and _password_ are ignored.
|
230
|
+
*
|
231
|
+
* A PEM-encoded key will look like:
|
232
|
+
*
|
233
|
+
* -----BEGIN PUBLIC KEY-----
|
234
|
+
* [...]
|
235
|
+
* -----END PUBLIC KEY-----
|
236
|
+
*
|
237
|
+
* Consider using #public_to_pem instead. This serializes the key into an
|
238
|
+
* X.509 SubjectPublicKeyInfo regardless of whether the key is a public key
|
239
|
+
* or a private key.
|
240
|
+
*
|
241
|
+
* [When the key contains private components, and no parameters are given]
|
242
|
+
*
|
243
|
+
* Serializes it into a PKCS #1 RSAPrivateKey.
|
244
|
+
*
|
245
|
+
* A PEM-encoded key will look like:
|
246
|
+
*
|
247
|
+
* -----BEGIN RSA PRIVATE KEY-----
|
248
|
+
* [...]
|
249
|
+
* -----END RSA PRIVATE KEY-----
|
250
|
+
*
|
251
|
+
* [When the key contains private components, and _cipher_ and _password_ are given]
|
252
|
+
*
|
253
|
+
* Serializes it into a PKCS #1 RSAPrivateKey
|
254
|
+
* and encrypts it in OpenSSL's traditional PEM encryption format.
|
255
|
+
* _cipher_ must be a cipher name understood by OpenSSL::Cipher.new or an
|
256
|
+
* instance of OpenSSL::Cipher.
|
257
|
+
*
|
258
|
+
* An encrypted PEM-encoded key will look like:
|
259
|
+
*
|
260
|
+
* -----BEGIN RSA PRIVATE KEY-----
|
261
|
+
* Proc-Type: 4,ENCRYPTED
|
262
|
+
* DEK-Info: AES-128-CBC,733F5302505B34701FC41F5C0746E4C0
|
263
|
+
*
|
264
|
+
* [...]
|
265
|
+
* -----END RSA PRIVATE KEY-----
|
266
|
+
*
|
267
|
+
* Note that this format uses MD5 to derive the encryption key, and hence
|
268
|
+
* will not be available on FIPS-compliant systems.
|
269
|
+
*
|
270
|
+
* <b>This method is kept for compatibility.</b>
|
271
|
+
* This should only be used when the PKCS #1 RSAPrivateKey format is required.
|
272
|
+
*
|
273
|
+
* Consider using #public_to_pem (X.509 SubjectPublicKeyInfo) or #private_to_pem
|
274
|
+
* (PKCS #8 PrivateKeyInfo or EncryptedPrivateKeyInfo) instead.
|
227
275
|
*/
|
228
276
|
static VALUE
|
229
277
|
ossl_rsa_export(int argc, VALUE *argv, VALUE self)
|
@@ -238,7 +286,14 @@ ossl_rsa_export(int argc, VALUE *argv, VALUE self)
|
|
238
286
|
* call-seq:
|
239
287
|
* rsa.to_der => DER-format String
|
240
288
|
*
|
241
|
-
*
|
289
|
+
* Serializes a private or public key to a DER-encoding.
|
290
|
+
*
|
291
|
+
* See #to_pem for details.
|
292
|
+
*
|
293
|
+
* <b>This method is kept for compatibility.</b>
|
294
|
+
* This should only be used when the PKCS #1 RSAPrivateKey format is required.
|
295
|
+
*
|
296
|
+
* Consider using #public_to_der or #private_to_der instead.
|
242
297
|
*/
|
243
298
|
static VALUE
|
244
299
|
ossl_rsa_to_der(VALUE self)
|
@@ -0,0 +1,211 @@
|
|
1
|
+
/*
|
2
|
+
* This program is licensed under the same licence as Ruby.
|
3
|
+
* (See the file 'LICENCE'.)
|
4
|
+
*/
|
5
|
+
#include "ossl.h"
|
6
|
+
|
7
|
+
#ifdef OSSL_USE_PROVIDER
|
8
|
+
# include <openssl/provider.h>
|
9
|
+
|
10
|
+
#define NewProvider(klass) \
|
11
|
+
TypedData_Wrap_Struct((klass), &ossl_provider_type, 0)
|
12
|
+
#define SetProvider(obj, provider) do { \
|
13
|
+
if (!(provider)) { \
|
14
|
+
ossl_raise(rb_eRuntimeError, "Provider wasn't initialized."); \
|
15
|
+
} \
|
16
|
+
RTYPEDDATA_DATA(obj) = (provider); \
|
17
|
+
} while(0)
|
18
|
+
#define GetProvider(obj, provider) do { \
|
19
|
+
TypedData_Get_Struct((obj), OSSL_PROVIDER, &ossl_provider_type, (provider)); \
|
20
|
+
if (!(provider)) { \
|
21
|
+
ossl_raise(rb_eRuntimeError, "PROVIDER wasn't initialized."); \
|
22
|
+
} \
|
23
|
+
} while (0)
|
24
|
+
|
25
|
+
static const rb_data_type_t ossl_provider_type = {
|
26
|
+
"OpenSSL/Provider",
|
27
|
+
{
|
28
|
+
0,
|
29
|
+
},
|
30
|
+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
|
31
|
+
};
|
32
|
+
|
33
|
+
/*
|
34
|
+
* Classes
|
35
|
+
*/
|
36
|
+
/* Document-class: OpenSSL::Provider
|
37
|
+
*
|
38
|
+
* This class is the access to openssl's Provider
|
39
|
+
* See also, https://www.openssl.org/docs/manmaster/man7/provider.html
|
40
|
+
*/
|
41
|
+
static VALUE cProvider;
|
42
|
+
/* Document-class: OpenSSL::Provider::ProviderError
|
43
|
+
*
|
44
|
+
* This is the generic exception for OpenSSL::Provider related errors
|
45
|
+
*/
|
46
|
+
static VALUE eProviderError;
|
47
|
+
|
48
|
+
/*
|
49
|
+
* call-seq:
|
50
|
+
* OpenSSL::Provider.load(name) -> provider
|
51
|
+
*
|
52
|
+
* This method loads and initializes a provider
|
53
|
+
*/
|
54
|
+
static VALUE
|
55
|
+
ossl_provider_s_load(VALUE klass, VALUE name)
|
56
|
+
{
|
57
|
+
OSSL_PROVIDER *provider = NULL;
|
58
|
+
VALUE obj;
|
59
|
+
|
60
|
+
const char *provider_name_ptr = StringValueCStr(name);
|
61
|
+
|
62
|
+
provider = OSSL_PROVIDER_load(NULL, provider_name_ptr);
|
63
|
+
if (provider == NULL) {
|
64
|
+
ossl_raise(eProviderError, "Failed to load %s provider", provider_name_ptr);
|
65
|
+
}
|
66
|
+
obj = NewProvider(klass);
|
67
|
+
SetProvider(obj, provider);
|
68
|
+
|
69
|
+
return obj;
|
70
|
+
}
|
71
|
+
|
72
|
+
struct ary_with_state { VALUE ary; int state; };
|
73
|
+
struct rb_push_provider_name_args { OSSL_PROVIDER *prov; VALUE ary; };
|
74
|
+
|
75
|
+
static VALUE
|
76
|
+
rb_push_provider_name(VALUE rb_push_provider_name_args)
|
77
|
+
{
|
78
|
+
struct rb_push_provider_name_args *args = (struct rb_push_provider_name_args *)rb_push_provider_name_args;
|
79
|
+
|
80
|
+
VALUE name = rb_str_new2(OSSL_PROVIDER_get0_name(args->prov));
|
81
|
+
return rb_ary_push(args->ary, name);
|
82
|
+
}
|
83
|
+
|
84
|
+
static int
|
85
|
+
push_provider(OSSL_PROVIDER *prov, void *cbdata)
|
86
|
+
{
|
87
|
+
struct ary_with_state *ary_with_state = (struct ary_with_state *)cbdata;
|
88
|
+
struct rb_push_provider_name_args args = { prov, ary_with_state->ary };
|
89
|
+
|
90
|
+
rb_protect(rb_push_provider_name, (VALUE)&args, &ary_with_state->state);
|
91
|
+
if (ary_with_state->state) {
|
92
|
+
return 0;
|
93
|
+
} else {
|
94
|
+
return 1;
|
95
|
+
}
|
96
|
+
}
|
97
|
+
|
98
|
+
/*
|
99
|
+
* call-seq:
|
100
|
+
* OpenSSL::Provider.provider_names -> [provider_name, ...]
|
101
|
+
*
|
102
|
+
* Returns an array of currently loaded provider names.
|
103
|
+
*/
|
104
|
+
static VALUE
|
105
|
+
ossl_provider_s_provider_names(VALUE klass)
|
106
|
+
{
|
107
|
+
VALUE ary = rb_ary_new();
|
108
|
+
struct ary_with_state cbdata = { ary, 0 };
|
109
|
+
|
110
|
+
int result = OSSL_PROVIDER_do_all(NULL, &push_provider, (void*)&cbdata);
|
111
|
+
if (result != 1 ) {
|
112
|
+
if (cbdata.state) {
|
113
|
+
rb_jump_tag(cbdata.state);
|
114
|
+
} else {
|
115
|
+
ossl_raise(eProviderError, "Failed to load provider names");
|
116
|
+
}
|
117
|
+
}
|
118
|
+
|
119
|
+
return ary;
|
120
|
+
}
|
121
|
+
|
122
|
+
/*
|
123
|
+
* call-seq:
|
124
|
+
* provider.unload -> true
|
125
|
+
*
|
126
|
+
* This method unloads this provider.
|
127
|
+
*
|
128
|
+
* if provider unload fails or already unloaded, it raises OpenSSL::Provider::ProviderError
|
129
|
+
*/
|
130
|
+
static VALUE
|
131
|
+
ossl_provider_unload(VALUE self)
|
132
|
+
{
|
133
|
+
OSSL_PROVIDER *prov;
|
134
|
+
if (RTYPEDDATA_DATA(self) == NULL) {
|
135
|
+
ossl_raise(eProviderError, "Provider already unloaded.");
|
136
|
+
}
|
137
|
+
GetProvider(self, prov);
|
138
|
+
|
139
|
+
int result = OSSL_PROVIDER_unload(prov);
|
140
|
+
|
141
|
+
if (result != 1) {
|
142
|
+
ossl_raise(eProviderError, "Failed to unload provider");
|
143
|
+
}
|
144
|
+
RTYPEDDATA_DATA(self) = NULL;
|
145
|
+
return Qtrue;
|
146
|
+
}
|
147
|
+
|
148
|
+
/*
|
149
|
+
* call-seq:
|
150
|
+
* provider.name -> string
|
151
|
+
*
|
152
|
+
* Get the name of this provider.
|
153
|
+
*
|
154
|
+
* if this provider is already unloaded, it raises OpenSSL::Provider::ProviderError
|
155
|
+
*/
|
156
|
+
static VALUE
|
157
|
+
ossl_provider_get_name(VALUE self)
|
158
|
+
{
|
159
|
+
OSSL_PROVIDER *prov;
|
160
|
+
if (RTYPEDDATA_DATA(self) == NULL) {
|
161
|
+
ossl_raise(eProviderError, "Provider already unloaded.");
|
162
|
+
}
|
163
|
+
GetProvider(self, prov);
|
164
|
+
|
165
|
+
return rb_str_new2(OSSL_PROVIDER_get0_name(prov));
|
166
|
+
}
|
167
|
+
|
168
|
+
/*
|
169
|
+
* call-seq:
|
170
|
+
* provider.inspect -> string
|
171
|
+
*
|
172
|
+
* Pretty prints this provider.
|
173
|
+
*/
|
174
|
+
static VALUE
|
175
|
+
ossl_provider_inspect(VALUE self)
|
176
|
+
{
|
177
|
+
OSSL_PROVIDER *prov;
|
178
|
+
if (RTYPEDDATA_DATA(self) == NULL ) {
|
179
|
+
return rb_sprintf("#<%"PRIsVALUE" unloaded provider>", rb_obj_class(self));
|
180
|
+
}
|
181
|
+
GetProvider(self, prov);
|
182
|
+
|
183
|
+
return rb_sprintf("#<%"PRIsVALUE" name=\"%s\">",
|
184
|
+
rb_obj_class(self), OSSL_PROVIDER_get0_name(prov));
|
185
|
+
}
|
186
|
+
|
187
|
+
void
|
188
|
+
Init_ossl_provider(void)
|
189
|
+
{
|
190
|
+
#if 0
|
191
|
+
mOSSL = rb_define_module("OpenSSL");
|
192
|
+
eOSSLError = rb_define_class_under(mOSSL, "OpenSSLError", rb_eStandardError);
|
193
|
+
#endif
|
194
|
+
|
195
|
+
cProvider = rb_define_class_under(mOSSL, "Provider", rb_cObject);
|
196
|
+
eProviderError = rb_define_class_under(cProvider, "ProviderError", eOSSLError);
|
197
|
+
|
198
|
+
rb_undef_alloc_func(cProvider);
|
199
|
+
rb_define_singleton_method(cProvider, "load", ossl_provider_s_load, 1);
|
200
|
+
rb_define_singleton_method(cProvider, "provider_names", ossl_provider_s_provider_names, 0);
|
201
|
+
|
202
|
+
rb_define_method(cProvider, "unload", ossl_provider_unload, 0);
|
203
|
+
rb_define_method(cProvider, "name", ossl_provider_get_name, 0);
|
204
|
+
rb_define_method(cProvider, "inspect", ossl_provider_inspect, 0);
|
205
|
+
}
|
206
|
+
#else
|
207
|
+
void
|
208
|
+
Init_ossl_provider(void)
|
209
|
+
{
|
210
|
+
}
|
211
|
+
#endif
|