openssl 2.1.3 → 3.1.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/CONTRIBUTING.md +35 -45
- data/History.md +302 -1
- data/README.md +2 -2
- data/ext/openssl/extconf.rb +77 -62
- data/ext/openssl/openssl_missing.c +0 -66
- data/ext/openssl/openssl_missing.h +59 -43
- data/ext/openssl/ossl.c +110 -64
- data/ext/openssl/ossl.h +33 -10
- data/ext/openssl/ossl_asn1.c +51 -13
- data/ext/openssl/ossl_bn.c +275 -146
- data/ext/openssl/ossl_bn.h +2 -1
- data/ext/openssl/ossl_cipher.c +39 -31
- data/ext/openssl/ossl_config.c +412 -41
- data/ext/openssl/ossl_config.h +4 -7
- data/ext/openssl/ossl_digest.c +25 -60
- data/ext/openssl/ossl_engine.c +18 -27
- data/ext/openssl/ossl_hmac.c +60 -145
- data/ext/openssl/ossl_kdf.c +14 -22
- data/ext/openssl/ossl_ns_spki.c +1 -1
- data/ext/openssl/ossl_ocsp.c +11 -64
- data/ext/openssl/ossl_ocsp.h +3 -3
- data/ext/openssl/ossl_pkcs12.c +21 -3
- data/ext/openssl/ossl_pkcs7.c +45 -78
- data/ext/openssl/ossl_pkcs7.h +16 -0
- data/ext/openssl/ossl_pkey.c +1295 -178
- data/ext/openssl/ossl_pkey.h +36 -73
- data/ext/openssl/ossl_pkey_dh.c +130 -340
- data/ext/openssl/ossl_pkey_dsa.c +100 -405
- data/ext/openssl/ossl_pkey_ec.c +192 -335
- data/ext/openssl/ossl_pkey_rsa.c +110 -489
- data/ext/openssl/ossl_rand.c +2 -32
- data/ext/openssl/ossl_ssl.c +556 -442
- data/ext/openssl/ossl_ssl_session.c +28 -29
- data/ext/openssl/ossl_ts.c +1539 -0
- data/ext/openssl/ossl_ts.h +16 -0
- data/ext/openssl/ossl_x509.c +0 -6
- data/ext/openssl/ossl_x509cert.c +169 -13
- data/ext/openssl/ossl_x509crl.c +13 -10
- data/ext/openssl/ossl_x509ext.c +15 -2
- data/ext/openssl/ossl_x509name.c +15 -4
- data/ext/openssl/ossl_x509req.c +13 -10
- data/ext/openssl/ossl_x509revoked.c +3 -3
- data/ext/openssl/ossl_x509store.c +154 -70
- data/lib/openssl/bn.rb +1 -1
- data/lib/openssl/buffering.rb +37 -5
- data/lib/openssl/cipher.rb +1 -1
- data/lib/openssl/digest.rb +10 -12
- data/lib/openssl/hmac.rb +78 -0
- data/lib/openssl/marshal.rb +30 -0
- data/lib/openssl/pkcs5.rb +1 -1
- data/lib/openssl/pkey.rb +447 -1
- data/lib/openssl/ssl.rb +52 -9
- data/lib/openssl/version.rb +5 -0
- data/lib/openssl/x509.rb +177 -1
- data/lib/openssl.rb +24 -9
- metadata +10 -79
- data/ext/openssl/deprecation.rb +0 -27
- data/ext/openssl/ossl_version.h +0 -15
- data/ext/openssl/ruby_missing.h +0 -24
- data/lib/openssl/config.rb +0 -492
data/ext/openssl/ossl_bn.c
CHANGED
@@ -10,6 +10,10 @@
|
|
10
10
|
/* modified by Michal Rokos <m.rokos@sh.cvut.cz> */
|
11
11
|
#include "ossl.h"
|
12
12
|
|
13
|
+
#ifdef HAVE_RB_EXT_RACTOR_SAFE
|
14
|
+
#include <ruby/ractor.h>
|
15
|
+
#endif
|
16
|
+
|
13
17
|
#define NewBN(klass) \
|
14
18
|
TypedData_Wrap_Struct((klass), &ossl_bn_type, 0)
|
15
19
|
#define SetBN(obj, bn) do { \
|
@@ -150,12 +154,58 @@ ossl_bn_value_ptr(volatile VALUE *ptr)
|
|
150
154
|
/*
|
151
155
|
* Private
|
152
156
|
*/
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
*
|
157
|
-
|
158
|
-
BN_CTX *
|
157
|
+
|
158
|
+
#ifdef HAVE_RB_EXT_RACTOR_SAFE
|
159
|
+
void
|
160
|
+
ossl_bn_ctx_free(void *ptr)
|
161
|
+
{
|
162
|
+
BN_CTX *ctx = (BN_CTX *)ptr;
|
163
|
+
BN_CTX_free(ctx);
|
164
|
+
}
|
165
|
+
|
166
|
+
struct rb_ractor_local_storage_type ossl_bn_ctx_key_type = {
|
167
|
+
NULL, // mark
|
168
|
+
ossl_bn_ctx_free,
|
169
|
+
};
|
170
|
+
|
171
|
+
rb_ractor_local_key_t ossl_bn_ctx_key;
|
172
|
+
|
173
|
+
BN_CTX *
|
174
|
+
ossl_bn_ctx_get(void)
|
175
|
+
{
|
176
|
+
// stored in ractor local storage
|
177
|
+
|
178
|
+
BN_CTX *ctx = rb_ractor_local_storage_ptr(ossl_bn_ctx_key);
|
179
|
+
if (!ctx) {
|
180
|
+
if (!(ctx = BN_CTX_new())) {
|
181
|
+
ossl_raise(rb_eRuntimeError, "Cannot init BN_CTX");
|
182
|
+
}
|
183
|
+
rb_ractor_local_storage_ptr_set(ossl_bn_ctx_key, ctx);
|
184
|
+
}
|
185
|
+
return ctx;
|
186
|
+
}
|
187
|
+
#else
|
188
|
+
// for ruby 2.x
|
189
|
+
static BN_CTX *gv_ossl_bn_ctx;
|
190
|
+
|
191
|
+
BN_CTX *
|
192
|
+
ossl_bn_ctx_get(void)
|
193
|
+
{
|
194
|
+
if (gv_ossl_bn_ctx == NULL) {
|
195
|
+
if (!(gv_ossl_bn_ctx = BN_CTX_new())) {
|
196
|
+
ossl_raise(rb_eRuntimeError, "Cannot init BN_CTX");
|
197
|
+
}
|
198
|
+
}
|
199
|
+
return gv_ossl_bn_ctx;
|
200
|
+
}
|
201
|
+
|
202
|
+
void
|
203
|
+
ossl_bn_ctx_free(void)
|
204
|
+
{
|
205
|
+
BN_CTX_free(gv_ossl_bn_ctx);
|
206
|
+
gv_ossl_bn_ctx = NULL;
|
207
|
+
}
|
208
|
+
#endif
|
159
209
|
|
160
210
|
static VALUE
|
161
211
|
ossl_bn_alloc(VALUE klass)
|
@@ -173,13 +223,29 @@ ossl_bn_alloc(VALUE klass)
|
|
173
223
|
|
174
224
|
/*
|
175
225
|
* call-seq:
|
176
|
-
* OpenSSL::BN.new
|
177
|
-
* OpenSSL::BN.new(
|
178
|
-
* OpenSSL::BN.new(
|
179
|
-
*
|
180
|
-
*
|
226
|
+
* OpenSSL::BN.new(bn) -> aBN
|
227
|
+
* OpenSSL::BN.new(integer) -> aBN
|
228
|
+
* OpenSSL::BN.new(string, base = 10) -> aBN
|
229
|
+
*
|
230
|
+
* Construct a new \OpenSSL BIGNUM object.
|
181
231
|
*
|
182
|
-
*
|
232
|
+
* If +bn+ is an Integer or OpenSSL::BN, a new instance of OpenSSL::BN
|
233
|
+
* representing the same value is returned. See also Integer#to_bn for the
|
234
|
+
* short-hand.
|
235
|
+
*
|
236
|
+
* If a String is given, the content will be parsed according to +base+.
|
237
|
+
*
|
238
|
+
* +string+::
|
239
|
+
* The string to be parsed.
|
240
|
+
* +base+::
|
241
|
+
* The format. Must be one of the following:
|
242
|
+
* - +0+ - MPI format. See the man page BN_mpi2bn(3) for details.
|
243
|
+
* - +2+ - Variable-length and big-endian binary encoding of a positive
|
244
|
+
* number.
|
245
|
+
* - +10+ - Decimal number representation, with a leading '-' for a negative
|
246
|
+
* number.
|
247
|
+
* - +16+ - Hexadeciaml number representation, with a leading '-' for a
|
248
|
+
* negative number.
|
183
249
|
*/
|
184
250
|
static VALUE
|
185
251
|
ossl_bn_initialize(int argc, VALUE *argv, VALUE self)
|
@@ -193,6 +259,10 @@ ossl_bn_initialize(int argc, VALUE *argv, VALUE self)
|
|
193
259
|
base = NUM2INT(bs);
|
194
260
|
}
|
195
261
|
|
262
|
+
if (NIL_P(str)) {
|
263
|
+
ossl_raise(rb_eArgError, "invalid argument");
|
264
|
+
}
|
265
|
+
|
196
266
|
if (RB_INTEGER_TYPE_P(str)) {
|
197
267
|
GetBN(self, bn);
|
198
268
|
integer_to_bnptr(str, bn);
|
@@ -243,16 +313,21 @@ ossl_bn_initialize(int argc, VALUE *argv, VALUE self)
|
|
243
313
|
|
244
314
|
/*
|
245
315
|
* call-seq:
|
246
|
-
* bn.to_s
|
247
|
-
* bn.to_s(base) => string
|
316
|
+
* bn.to_s(base = 10) -> string
|
248
317
|
*
|
249
|
-
*
|
250
|
-
*
|
251
|
-
*
|
252
|
-
*
|
253
|
-
*
|
254
|
-
*
|
255
|
-
*
|
318
|
+
* Returns the string representation of the bignum.
|
319
|
+
*
|
320
|
+
* BN.new can parse the encoded string to convert back into an OpenSSL::BN.
|
321
|
+
*
|
322
|
+
* +base+::
|
323
|
+
* The format. Must be one of the following:
|
324
|
+
* - +0+ - MPI format. See the man page BN_bn2mpi(3) for details.
|
325
|
+
* - +2+ - Variable-length and big-endian binary encoding. The sign of
|
326
|
+
* the bignum is ignored.
|
327
|
+
* - +10+ - Decimal number representation, with a leading '-' for a negative
|
328
|
+
* bignum.
|
329
|
+
* - +16+ - Hexadeciaml number representation, with a leading '-' for a
|
330
|
+
* negative bignum.
|
256
331
|
*/
|
257
332
|
static VALUE
|
258
333
|
ossl_bn_to_s(int argc, VALUE *argv, VALUE self)
|
@@ -502,22 +577,33 @@ BIGNUM_2c(gcd)
|
|
502
577
|
*/
|
503
578
|
BIGNUM_2c(mod_sqr)
|
504
579
|
|
580
|
+
#define BIGNUM_2cr(func) \
|
581
|
+
static VALUE \
|
582
|
+
ossl_bn_##func(VALUE self, VALUE other) \
|
583
|
+
{ \
|
584
|
+
BIGNUM *bn1, *bn2 = GetBNPtr(other), *result; \
|
585
|
+
VALUE obj; \
|
586
|
+
GetBN(self, bn1); \
|
587
|
+
obj = NewBN(rb_obj_class(self)); \
|
588
|
+
if (!(result = BN_##func(NULL, bn1, bn2, ossl_bn_ctx))) \
|
589
|
+
ossl_raise(eBNError, NULL); \
|
590
|
+
SetBN(obj, result); \
|
591
|
+
return obj; \
|
592
|
+
}
|
593
|
+
|
505
594
|
/*
|
595
|
+
* Document-method: OpenSSL::BN#mod_sqrt
|
596
|
+
* call-seq:
|
597
|
+
* bn.mod_sqrt(bn2) => aBN
|
598
|
+
*/
|
599
|
+
BIGNUM_2cr(mod_sqrt)
|
600
|
+
|
601
|
+
/*
|
602
|
+
* Document-method: OpenSSL::BN#mod_inverse
|
506
603
|
* call-seq:
|
507
604
|
* bn.mod_inverse(bn2) => aBN
|
508
605
|
*/
|
509
|
-
|
510
|
-
ossl_bn_mod_inverse(VALUE self, VALUE other)
|
511
|
-
{
|
512
|
-
BIGNUM *bn1, *bn2 = GetBNPtr(other), *result;
|
513
|
-
VALUE obj;
|
514
|
-
GetBN(self, bn1);
|
515
|
-
obj = NewBN(rb_obj_class(self));
|
516
|
-
if (!(result = BN_mod_inverse(NULL, bn1, bn2, ossl_bn_ctx)))
|
517
|
-
ossl_raise(eBNError, "BN_mod_inverse");
|
518
|
-
SetBN(obj, result);
|
519
|
-
return obj;
|
520
|
-
}
|
606
|
+
BIGNUM_2cr(mod_inverse)
|
521
607
|
|
522
608
|
/*
|
523
609
|
* call-seq:
|
@@ -717,78 +803,64 @@ BIGNUM_SELF_SHIFT(lshift)
|
|
717
803
|
*/
|
718
804
|
BIGNUM_SELF_SHIFT(rshift)
|
719
805
|
|
720
|
-
#define BIGNUM_RAND(func) \
|
721
|
-
static VALUE \
|
722
|
-
ossl_bn_s_##func(int argc, VALUE *argv, VALUE klass) \
|
723
|
-
{ \
|
724
|
-
BIGNUM *result; \
|
725
|
-
int bottom = 0, top = 0, b; \
|
726
|
-
VALUE bits, fill, odd, obj; \
|
727
|
-
\
|
728
|
-
switch (rb_scan_args(argc, argv, "12", &bits, &fill, &odd)) { \
|
729
|
-
case 3: \
|
730
|
-
bottom = (odd == Qtrue) ? 1 : 0; \
|
731
|
-
/* FALLTHROUGH */ \
|
732
|
-
case 2: \
|
733
|
-
top = NUM2INT(fill); \
|
734
|
-
} \
|
735
|
-
b = NUM2INT(bits); \
|
736
|
-
obj = NewBN(klass); \
|
737
|
-
if (!(result = BN_new())) { \
|
738
|
-
ossl_raise(eBNError, NULL); \
|
739
|
-
} \
|
740
|
-
if (BN_##func(result, b, top, bottom) <= 0) { \
|
741
|
-
BN_free(result); \
|
742
|
-
ossl_raise(eBNError, NULL); \
|
743
|
-
} \
|
744
|
-
SetBN(obj, result); \
|
745
|
-
return obj; \
|
746
|
-
}
|
747
|
-
|
748
|
-
/*
|
749
|
-
* Document-method: OpenSSL::BN.rand
|
750
|
-
* BN.rand(bits [, fill [, odd]]) -> aBN
|
751
|
-
*/
|
752
|
-
BIGNUM_RAND(rand)
|
753
|
-
|
754
|
-
/*
|
755
|
-
* Document-method: OpenSSL::BN.pseudo_rand
|
756
|
-
* BN.pseudo_rand(bits [, fill [, odd]]) -> aBN
|
757
|
-
*/
|
758
|
-
BIGNUM_RAND(pseudo_rand)
|
759
|
-
|
760
|
-
#define BIGNUM_RAND_RANGE(func) \
|
761
|
-
static VALUE \
|
762
|
-
ossl_bn_s_##func##_range(VALUE klass, VALUE range) \
|
763
|
-
{ \
|
764
|
-
BIGNUM *bn = GetBNPtr(range), *result; \
|
765
|
-
VALUE obj = NewBN(klass); \
|
766
|
-
if (!(result = BN_new())) { \
|
767
|
-
ossl_raise(eBNError, NULL); \
|
768
|
-
} \
|
769
|
-
if (BN_##func##_range(result, bn) <= 0) { \
|
770
|
-
BN_free(result); \
|
771
|
-
ossl_raise(eBNError, NULL); \
|
772
|
-
} \
|
773
|
-
SetBN(obj, result); \
|
774
|
-
return obj; \
|
775
|
-
}
|
776
|
-
|
777
806
|
/*
|
778
|
-
* Document-method: OpenSSL::BN.rand_range
|
779
807
|
* call-seq:
|
780
|
-
*
|
808
|
+
* BN.rand(bits [, fill [, odd]]) -> aBN
|
781
809
|
*
|
810
|
+
* Generates a cryptographically strong pseudo-random number of +bits+.
|
811
|
+
*
|
812
|
+
* See also the man page BN_rand(3).
|
782
813
|
*/
|
783
|
-
|
814
|
+
static VALUE
|
815
|
+
ossl_bn_s_rand(int argc, VALUE *argv, VALUE klass)
|
816
|
+
{
|
817
|
+
BIGNUM *result;
|
818
|
+
int bottom = 0, top = 0, b;
|
819
|
+
VALUE bits, fill, odd, obj;
|
820
|
+
|
821
|
+
switch (rb_scan_args(argc, argv, "12", &bits, &fill, &odd)) {
|
822
|
+
case 3:
|
823
|
+
bottom = (odd == Qtrue) ? 1 : 0;
|
824
|
+
/* FALLTHROUGH */
|
825
|
+
case 2:
|
826
|
+
top = NUM2INT(fill);
|
827
|
+
}
|
828
|
+
b = NUM2INT(bits);
|
829
|
+
obj = NewBN(klass);
|
830
|
+
if (!(result = BN_new())) {
|
831
|
+
ossl_raise(eBNError, "BN_new");
|
832
|
+
}
|
833
|
+
if (BN_rand(result, b, top, bottom) <= 0) {
|
834
|
+
BN_free(result);
|
835
|
+
ossl_raise(eBNError, "BN_rand");
|
836
|
+
}
|
837
|
+
SetBN(obj, result);
|
838
|
+
return obj;
|
839
|
+
}
|
784
840
|
|
785
841
|
/*
|
786
|
-
* Document-method: OpenSSL::BN.pseudo_rand_range
|
787
842
|
* call-seq:
|
788
|
-
*
|
843
|
+
* BN.rand_range(range) -> aBN
|
789
844
|
*
|
845
|
+
* Generates a cryptographically strong pseudo-random number in the range
|
846
|
+
* 0...+range+.
|
847
|
+
*
|
848
|
+
* See also the man page BN_rand_range(3).
|
790
849
|
*/
|
791
|
-
|
850
|
+
static VALUE
|
851
|
+
ossl_bn_s_rand_range(VALUE klass, VALUE range)
|
852
|
+
{
|
853
|
+
BIGNUM *bn = GetBNPtr(range), *result;
|
854
|
+
VALUE obj = NewBN(klass);
|
855
|
+
if (!(result = BN_new()))
|
856
|
+
ossl_raise(eBNError, "BN_new");
|
857
|
+
if (BN_rand_range(result, bn) <= 0) {
|
858
|
+
BN_free(result);
|
859
|
+
ossl_raise(eBNError, "BN_rand_range");
|
860
|
+
}
|
861
|
+
SetBN(obj, result);
|
862
|
+
return obj;
|
863
|
+
}
|
792
864
|
|
793
865
|
/*
|
794
866
|
* call-seq:
|
@@ -883,7 +955,17 @@ ossl_bn_copy(VALUE self, VALUE other)
|
|
883
955
|
static VALUE
|
884
956
|
ossl_bn_uplus(VALUE self)
|
885
957
|
{
|
886
|
-
|
958
|
+
VALUE obj;
|
959
|
+
BIGNUM *bn1, *bn2;
|
960
|
+
|
961
|
+
GetBN(self, bn1);
|
962
|
+
obj = NewBN(cBN);
|
963
|
+
bn2 = BN_dup(bn1);
|
964
|
+
if (!bn2)
|
965
|
+
ossl_raise(eBNError, "BN_dup");
|
966
|
+
SetBN(obj, bn2);
|
967
|
+
|
968
|
+
return obj;
|
887
969
|
}
|
888
970
|
|
889
971
|
/*
|
@@ -907,6 +989,24 @@ ossl_bn_uminus(VALUE self)
|
|
907
989
|
return obj;
|
908
990
|
}
|
909
991
|
|
992
|
+
/*
|
993
|
+
* call-seq:
|
994
|
+
* bn.abs -> aBN
|
995
|
+
*/
|
996
|
+
static VALUE
|
997
|
+
ossl_bn_abs(VALUE self)
|
998
|
+
{
|
999
|
+
BIGNUM *bn1;
|
1000
|
+
|
1001
|
+
GetBN(self, bn1);
|
1002
|
+
if (BN_is_negative(bn1)) {
|
1003
|
+
return ossl_bn_uminus(self);
|
1004
|
+
}
|
1005
|
+
else {
|
1006
|
+
return ossl_bn_uplus(self);
|
1007
|
+
}
|
1008
|
+
}
|
1009
|
+
|
910
1010
|
#define BIGNUM_CMP(func) \
|
911
1011
|
static VALUE \
|
912
1012
|
ossl_bn_##func(VALUE self, VALUE other) \
|
@@ -1015,34 +1115,29 @@ ossl_bn_hash(VALUE self)
|
|
1015
1115
|
* bn.prime? => true | false
|
1016
1116
|
* bn.prime?(checks) => true | false
|
1017
1117
|
*
|
1018
|
-
* Performs a Miller-Rabin probabilistic primality test
|
1019
|
-
* iterations. If _checks_ is not specified, a number of iterations is used
|
1020
|
-
* that yields a false positive rate of at most 2^-80 for random input.
|
1118
|
+
* Performs a Miller-Rabin probabilistic primality test for +bn+.
|
1021
1119
|
*
|
1022
|
-
*
|
1023
|
-
* * _checks_ - integer
|
1120
|
+
* <b>+checks+ parameter is deprecated in version 3.0.</b> It has no effect.
|
1024
1121
|
*/
|
1025
1122
|
static VALUE
|
1026
1123
|
ossl_bn_is_prime(int argc, VALUE *argv, VALUE self)
|
1027
1124
|
{
|
1028
1125
|
BIGNUM *bn;
|
1029
|
-
|
1030
|
-
int checks = BN_prime_checks;
|
1126
|
+
int ret;
|
1031
1127
|
|
1032
|
-
|
1033
|
-
checks = NUM2INT(vchecks);
|
1034
|
-
}
|
1128
|
+
rb_check_arity(argc, 0, 1);
|
1035
1129
|
GetBN(self, bn);
|
1036
|
-
|
1037
|
-
|
1038
|
-
|
1039
|
-
|
1040
|
-
|
1041
|
-
|
1042
|
-
|
1043
|
-
|
1044
|
-
|
1045
|
-
|
1130
|
+
|
1131
|
+
#ifdef HAVE_BN_CHECK_PRIME
|
1132
|
+
ret = BN_check_prime(bn, ossl_bn_ctx, NULL);
|
1133
|
+
if (ret < 0)
|
1134
|
+
ossl_raise(eBNError, "BN_check_prime");
|
1135
|
+
#else
|
1136
|
+
ret = BN_is_prime_fasttest_ex(bn, BN_prime_checks, ossl_bn_ctx, 1, NULL);
|
1137
|
+
if (ret < 0)
|
1138
|
+
ossl_raise(eBNError, "BN_is_prime_fasttest_ex");
|
1139
|
+
#endif
|
1140
|
+
return ret ? Qtrue : Qfalse;
|
1046
1141
|
}
|
1047
1142
|
|
1048
1143
|
/*
|
@@ -1051,39 +1146,52 @@ ossl_bn_is_prime(int argc, VALUE *argv, VALUE self)
|
|
1051
1146
|
* bn.prime_fasttest?(checks) => true | false
|
1052
1147
|
* bn.prime_fasttest?(checks, trial_div) => true | false
|
1053
1148
|
*
|
1054
|
-
* Performs a Miller-Rabin primality test
|
1055
|
-
* first attempts trial divisions with some small primes.
|
1149
|
+
* Performs a Miller-Rabin probabilistic primality test for +bn+.
|
1056
1150
|
*
|
1057
|
-
*
|
1058
|
-
*
|
1059
|
-
*
|
1151
|
+
* <b>Deprecated in version 3.0.</b> Use #prime? instead.
|
1152
|
+
*
|
1153
|
+
* +checks+ and +trial_div+ parameters no longer have any effect.
|
1060
1154
|
*/
|
1061
1155
|
static VALUE
|
1062
1156
|
ossl_bn_is_prime_fasttest(int argc, VALUE *argv, VALUE self)
|
1157
|
+
{
|
1158
|
+
rb_check_arity(argc, 0, 2);
|
1159
|
+
return ossl_bn_is_prime(0, argv, self);
|
1160
|
+
}
|
1161
|
+
|
1162
|
+
/*
|
1163
|
+
* call-seq:
|
1164
|
+
* bn.get_flags(flags) => flags
|
1165
|
+
*
|
1166
|
+
* Returns the flags on the BN object.
|
1167
|
+
* The argument is used as a bit mask.
|
1168
|
+
*
|
1169
|
+
* === Parameters
|
1170
|
+
* * _flags_ - integer
|
1171
|
+
*/
|
1172
|
+
static VALUE
|
1173
|
+
ossl_bn_get_flags(VALUE self, VALUE arg)
|
1063
1174
|
{
|
1064
1175
|
BIGNUM *bn;
|
1065
|
-
|
1066
|
-
int checks = BN_prime_checks, do_trial_division = 1;
|
1176
|
+
GetBN(self, bn);
|
1067
1177
|
|
1068
|
-
|
1178
|
+
return INT2NUM(BN_get_flags(bn, NUM2INT(arg)));
|
1179
|
+
}
|
1069
1180
|
|
1070
|
-
|
1071
|
-
|
1072
|
-
|
1181
|
+
/*
|
1182
|
+
* call-seq:
|
1183
|
+
* bn.set_flags(flags) => nil
|
1184
|
+
*
|
1185
|
+
* Enables the flags on the BN object.
|
1186
|
+
* Currently, the flags argument can contain zero of OpenSSL::BN::CONSTTIME.
|
1187
|
+
*/
|
1188
|
+
static VALUE
|
1189
|
+
ossl_bn_set_flags(VALUE self, VALUE arg)
|
1190
|
+
{
|
1191
|
+
BIGNUM *bn;
|
1073
1192
|
GetBN(self, bn);
|
1074
|
-
|
1075
|
-
|
1076
|
-
do_trial_division = 0;
|
1077
|
-
}
|
1078
|
-
switch (BN_is_prime_fasttest_ex(bn, checks, ossl_bn_ctx, do_trial_division, NULL)) {
|
1079
|
-
case 1:
|
1080
|
-
return Qtrue;
|
1081
|
-
case 0:
|
1082
|
-
return Qfalse;
|
1083
|
-
default:
|
1084
|
-
ossl_raise(eBNError, NULL);
|
1085
|
-
}
|
1086
|
-
/* not reachable */
|
1193
|
+
|
1194
|
+
BN_set_flags(bn, NUM2INT(arg));
|
1087
1195
|
return Qnil;
|
1088
1196
|
}
|
1089
1197
|
|
@@ -1099,9 +1207,11 @@ Init_ossl_bn(void)
|
|
1099
1207
|
eOSSLError = rb_define_class_under(mOSSL, "OpenSSLError", rb_eStandardError);
|
1100
1208
|
#endif
|
1101
1209
|
|
1102
|
-
|
1103
|
-
|
1104
|
-
|
1210
|
+
#ifdef HAVE_RB_EXT_RACTOR_SAFE
|
1211
|
+
ossl_bn_ctx_key = rb_ractor_local_storage_ptr_newkey(&ossl_bn_ctx_key_type);
|
1212
|
+
#else
|
1213
|
+
ossl_bn_ctx_get();
|
1214
|
+
#endif
|
1105
1215
|
|
1106
1216
|
eBNError = rb_define_class_under(mOSSL, "BNError", eOSSLError);
|
1107
1217
|
|
@@ -1121,6 +1231,7 @@ Init_ossl_bn(void)
|
|
1121
1231
|
|
1122
1232
|
rb_define_method(cBN, "+@", ossl_bn_uplus, 0);
|
1123
1233
|
rb_define_method(cBN, "-@", ossl_bn_uminus, 0);
|
1234
|
+
rb_define_method(cBN, "abs", ossl_bn_abs, 0);
|
1124
1235
|
|
1125
1236
|
rb_define_method(cBN, "+", ossl_bn_add, 1);
|
1126
1237
|
rb_define_method(cBN, "-", ossl_bn_sub, 1);
|
@@ -1134,6 +1245,7 @@ Init_ossl_bn(void)
|
|
1134
1245
|
rb_define_method(cBN, "mod_sub", ossl_bn_mod_sub, 2);
|
1135
1246
|
rb_define_method(cBN, "mod_mul", ossl_bn_mod_mul, 2);
|
1136
1247
|
rb_define_method(cBN, "mod_sqr", ossl_bn_mod_sqr, 1);
|
1248
|
+
rb_define_method(cBN, "mod_sqrt", ossl_bn_mod_sqrt, 1);
|
1137
1249
|
rb_define_method(cBN, "**", ossl_bn_exp, 1);
|
1138
1250
|
rb_define_method(cBN, "mod_exp", ossl_bn_mod_exp, 2);
|
1139
1251
|
rb_define_method(cBN, "gcd", ossl_bn_gcd, 1);
|
@@ -1164,9 +1276,9 @@ Init_ossl_bn(void)
|
|
1164
1276
|
* get_word */
|
1165
1277
|
|
1166
1278
|
rb_define_singleton_method(cBN, "rand", ossl_bn_s_rand, -1);
|
1167
|
-
rb_define_singleton_method(cBN, "pseudo_rand", ossl_bn_s_pseudo_rand, -1);
|
1168
1279
|
rb_define_singleton_method(cBN, "rand_range", ossl_bn_s_rand_range, 1);
|
1169
|
-
|
1280
|
+
rb_define_alias(rb_singleton_class(cBN), "pseudo_rand", "rand");
|
1281
|
+
rb_define_alias(rb_singleton_class(cBN), "pseudo_rand_range", "rand_range");
|
1170
1282
|
|
1171
1283
|
rb_define_singleton_method(cBN, "generate_prime", ossl_bn_s_generate_prime, -1);
|
1172
1284
|
rb_define_method(cBN, "prime?", ossl_bn_is_prime, -1);
|
@@ -1183,6 +1295,23 @@ Init_ossl_bn(void)
|
|
1183
1295
|
/* lshift1 - DON'T IMPL. */
|
1184
1296
|
/* rshift1 - DON'T IMPL. */
|
1185
1297
|
|
1298
|
+
rb_define_method(cBN, "get_flags", ossl_bn_get_flags, 1);
|
1299
|
+
rb_define_method(cBN, "set_flags", ossl_bn_set_flags, 1);
|
1300
|
+
|
1301
|
+
#ifdef BN_FLG_CONSTTIME
|
1302
|
+
rb_define_const(cBN, "CONSTTIME", INT2NUM(BN_FLG_CONSTTIME));
|
1303
|
+
#endif
|
1304
|
+
/* BN_FLG_MALLOCED and BN_FLG_STATIC_DATA seems for C programming.
|
1305
|
+
* Allowing them leads to memory leak.
|
1306
|
+
* So, for now, they are not exported
|
1307
|
+
#ifdef BN_FLG_MALLOCED
|
1308
|
+
rb_define_const(cBN, "MALLOCED", INT2NUM(BN_FLG_MALLOCED));
|
1309
|
+
#endif
|
1310
|
+
#ifdef BN_FLG_STATIC_DATA
|
1311
|
+
rb_define_const(cBN, "STATIC_DATA", INT2NUM(BN_FLG_STATIC_DATA));
|
1312
|
+
#endif
|
1313
|
+
*/
|
1314
|
+
|
1186
1315
|
/*
|
1187
1316
|
* bn2bin
|
1188
1317
|
* bin2bn
|