openssl 2.2.0 → 3.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/CONTRIBUTING.md +32 -44
- data/History.md +155 -0
- data/ext/openssl/extconf.rb +43 -38
- data/ext/openssl/openssl_missing.c +0 -66
- data/ext/openssl/openssl_missing.h +26 -45
- data/ext/openssl/ossl.c +67 -47
- data/ext/openssl/ossl.h +20 -6
- data/ext/openssl/ossl_asn1.c +16 -4
- data/ext/openssl/ossl_bn.c +267 -143
- data/ext/openssl/ossl_bn.h +2 -1
- data/ext/openssl/ossl_cipher.c +11 -11
- data/ext/openssl/ossl_config.c +412 -41
- data/ext/openssl/ossl_config.h +4 -7
- data/ext/openssl/ossl_digest.c +15 -11
- data/ext/openssl/ossl_engine.c +16 -15
- data/ext/openssl/ossl_hmac.c +48 -135
- data/ext/openssl/ossl_kdf.c +8 -0
- data/ext/openssl/ossl_ocsp.c +3 -51
- data/ext/openssl/ossl_pkcs12.c +21 -3
- data/ext/openssl/ossl_pkcs7.c +42 -59
- data/ext/openssl/ossl_pkey.c +1102 -191
- data/ext/openssl/ossl_pkey.h +35 -72
- data/ext/openssl/ossl_pkey_dh.c +124 -334
- data/ext/openssl/ossl_pkey_dsa.c +93 -398
- data/ext/openssl/ossl_pkey_ec.c +126 -318
- data/ext/openssl/ossl_pkey_rsa.c +100 -487
- data/ext/openssl/ossl_ssl.c +322 -375
- data/ext/openssl/ossl_ssl_session.c +24 -29
- data/ext/openssl/ossl_ts.c +64 -39
- data/ext/openssl/ossl_x509.c +0 -6
- data/ext/openssl/ossl_x509cert.c +164 -8
- data/ext/openssl/ossl_x509crl.c +10 -7
- data/ext/openssl/ossl_x509ext.c +1 -2
- data/ext/openssl/ossl_x509name.c +9 -2
- data/ext/openssl/ossl_x509req.c +10 -7
- data/ext/openssl/ossl_x509store.c +193 -90
- data/lib/openssl/buffering.rb +10 -1
- data/lib/openssl/hmac.rb +65 -0
- data/lib/openssl/pkey.rb +417 -0
- data/lib/openssl/ssl.rb +8 -8
- data/lib/openssl/version.rb +1 -1
- data/lib/openssl/x509.rb +22 -0
- data/lib/openssl.rb +0 -1
- metadata +8 -66
- data/ext/openssl/ruby_missing.h +0 -24
- data/lib/openssl/config.rb +0 -501
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,12 +223,29 @@ ossl_bn_alloc(VALUE klass)
|
|
173
223
|
|
174
224
|
/*
|
175
225
|
* call-seq:
|
176
|
-
* OpenSSL::BN.new(bn)
|
177
|
-
* OpenSSL::BN.new(integer)
|
178
|
-
* OpenSSL::BN.new(string)
|
179
|
-
*
|
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.
|
180
231
|
*
|
181
|
-
*
|
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.
|
182
249
|
*/
|
183
250
|
static VALUE
|
184
251
|
ossl_bn_initialize(int argc, VALUE *argv, VALUE self)
|
@@ -246,16 +313,21 @@ ossl_bn_initialize(int argc, VALUE *argv, VALUE self)
|
|
246
313
|
|
247
314
|
/*
|
248
315
|
* call-seq:
|
249
|
-
* bn.to_s
|
250
|
-
* bn.to_s(base) => string
|
316
|
+
* bn.to_s(base = 10) -> string
|
251
317
|
*
|
252
|
-
*
|
253
|
-
*
|
254
|
-
*
|
255
|
-
*
|
256
|
-
*
|
257
|
-
*
|
258
|
-
*
|
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.
|
259
331
|
*/
|
260
332
|
static VALUE
|
261
333
|
ossl_bn_to_s(int argc, VALUE *argv, VALUE self)
|
@@ -403,7 +475,7 @@ ossl_bn_is_negative(VALUE self)
|
|
403
475
|
if (!(result = BN_new())) { \
|
404
476
|
ossl_raise(eBNError, NULL); \
|
405
477
|
} \
|
406
|
-
if (
|
478
|
+
if (BN_##func(result, bn, ossl_bn_ctx) <= 0) { \
|
407
479
|
BN_free(result); \
|
408
480
|
ossl_raise(eBNError, NULL); \
|
409
481
|
} \
|
@@ -429,7 +501,7 @@ BIGNUM_1c(sqr)
|
|
429
501
|
if (!(result = BN_new())) { \
|
430
502
|
ossl_raise(eBNError, NULL); \
|
431
503
|
} \
|
432
|
-
if (
|
504
|
+
if (BN_##func(result, bn1, bn2) <= 0) { \
|
433
505
|
BN_free(result); \
|
434
506
|
ossl_raise(eBNError, NULL); \
|
435
507
|
} \
|
@@ -462,7 +534,7 @@ BIGNUM_2(sub)
|
|
462
534
|
if (!(result = BN_new())) { \
|
463
535
|
ossl_raise(eBNError, NULL); \
|
464
536
|
} \
|
465
|
-
if (
|
537
|
+
if (BN_##func(result, bn1, bn2, ossl_bn_ctx) <= 0) { \
|
466
538
|
BN_free(result); \
|
467
539
|
ossl_raise(eBNError, NULL); \
|
468
540
|
} \
|
@@ -506,11 +578,21 @@ BIGNUM_2c(gcd)
|
|
506
578
|
BIGNUM_2c(mod_sqr)
|
507
579
|
|
508
580
|
/*
|
509
|
-
* Document-method: OpenSSL::BN#mod_inverse
|
510
581
|
* call-seq:
|
511
|
-
*
|
582
|
+
* bn.mod_inverse(bn2) => aBN
|
512
583
|
*/
|
513
|
-
|
584
|
+
static VALUE
|
585
|
+
ossl_bn_mod_inverse(VALUE self, VALUE other)
|
586
|
+
{
|
587
|
+
BIGNUM *bn1, *bn2 = GetBNPtr(other), *result;
|
588
|
+
VALUE obj;
|
589
|
+
GetBN(self, bn1);
|
590
|
+
obj = NewBN(rb_obj_class(self));
|
591
|
+
if (!(result = BN_mod_inverse(NULL, bn1, bn2, ossl_bn_ctx)))
|
592
|
+
ossl_raise(eBNError, "BN_mod_inverse");
|
593
|
+
SetBN(obj, result);
|
594
|
+
return obj;
|
595
|
+
}
|
514
596
|
|
515
597
|
/*
|
516
598
|
* call-seq:
|
@@ -559,7 +641,7 @@ ossl_bn_div(VALUE self, VALUE other)
|
|
559
641
|
if (!(result = BN_new())) { \
|
560
642
|
ossl_raise(eBNError, NULL); \
|
561
643
|
} \
|
562
|
-
if (
|
644
|
+
if (BN_##func(result, bn1, bn2, bn3, ossl_bn_ctx) <= 0) { \
|
563
645
|
BN_free(result); \
|
564
646
|
ossl_raise(eBNError, NULL); \
|
565
647
|
} \
|
@@ -601,7 +683,7 @@ BIGNUM_3c(mod_exp)
|
|
601
683
|
{ \
|
602
684
|
BIGNUM *bn; \
|
603
685
|
GetBN(self, bn); \
|
604
|
-
if (
|
686
|
+
if (BN_##func(bn, NUM2INT(bit)) <= 0) { \
|
605
687
|
ossl_raise(eBNError, NULL); \
|
606
688
|
} \
|
607
689
|
return self; \
|
@@ -661,7 +743,7 @@ ossl_bn_is_bit_set(VALUE self, VALUE bit)
|
|
661
743
|
if (!(result = BN_new())) { \
|
662
744
|
ossl_raise(eBNError, NULL); \
|
663
745
|
} \
|
664
|
-
if (
|
746
|
+
if (BN_##func(result, bn, b) <= 0) { \
|
665
747
|
BN_free(result); \
|
666
748
|
ossl_raise(eBNError, NULL); \
|
667
749
|
} \
|
@@ -691,7 +773,7 @@ BIGNUM_SHIFT(rshift)
|
|
691
773
|
int b; \
|
692
774
|
b = NUM2INT(bits); \
|
693
775
|
GetBN(self, bn); \
|
694
|
-
if (
|
776
|
+
if (BN_##func(bn, bn, b) <= 0) \
|
695
777
|
ossl_raise(eBNError, NULL); \
|
696
778
|
return self; \
|
697
779
|
}
|
@@ -710,78 +792,64 @@ BIGNUM_SELF_SHIFT(lshift)
|
|
710
792
|
*/
|
711
793
|
BIGNUM_SELF_SHIFT(rshift)
|
712
794
|
|
713
|
-
#define BIGNUM_RAND(func) \
|
714
|
-
static VALUE \
|
715
|
-
ossl_bn_s_##func(int argc, VALUE *argv, VALUE klass) \
|
716
|
-
{ \
|
717
|
-
BIGNUM *result; \
|
718
|
-
int bottom = 0, top = 0, b; \
|
719
|
-
VALUE bits, fill, odd, obj; \
|
720
|
-
\
|
721
|
-
switch (rb_scan_args(argc, argv, "12", &bits, &fill, &odd)) { \
|
722
|
-
case 3: \
|
723
|
-
bottom = (odd == Qtrue) ? 1 : 0; \
|
724
|
-
/* FALLTHROUGH */ \
|
725
|
-
case 2: \
|
726
|
-
top = NUM2INT(fill); \
|
727
|
-
} \
|
728
|
-
b = NUM2INT(bits); \
|
729
|
-
obj = NewBN(klass); \
|
730
|
-
if (!(result = BN_new())) { \
|
731
|
-
ossl_raise(eBNError, NULL); \
|
732
|
-
} \
|
733
|
-
if (!BN_##func(result, b, top, bottom)) { \
|
734
|
-
BN_free(result); \
|
735
|
-
ossl_raise(eBNError, NULL); \
|
736
|
-
} \
|
737
|
-
SetBN(obj, result); \
|
738
|
-
return obj; \
|
739
|
-
}
|
740
|
-
|
741
795
|
/*
|
742
|
-
* Document-method: OpenSSL::BN.rand
|
743
|
-
* BN.rand(bits [, fill [, odd]]) -> aBN
|
744
|
-
*/
|
745
|
-
BIGNUM_RAND(rand)
|
746
|
-
|
747
|
-
/*
|
748
|
-
* Document-method: OpenSSL::BN.pseudo_rand
|
749
|
-
* BN.pseudo_rand(bits [, fill [, odd]]) -> aBN
|
750
|
-
*/
|
751
|
-
BIGNUM_RAND(pseudo_rand)
|
752
|
-
|
753
|
-
#define BIGNUM_RAND_RANGE(func) \
|
754
|
-
static VALUE \
|
755
|
-
ossl_bn_s_##func##_range(VALUE klass, VALUE range) \
|
756
|
-
{ \
|
757
|
-
BIGNUM *bn = GetBNPtr(range), *result; \
|
758
|
-
VALUE obj = NewBN(klass); \
|
759
|
-
if (!(result = BN_new())) { \
|
760
|
-
ossl_raise(eBNError, NULL); \
|
761
|
-
} \
|
762
|
-
if (!BN_##func##_range(result, bn)) { \
|
763
|
-
BN_free(result); \
|
764
|
-
ossl_raise(eBNError, NULL); \
|
765
|
-
} \
|
766
|
-
SetBN(obj, result); \
|
767
|
-
return obj; \
|
768
|
-
}
|
769
|
-
|
770
|
-
/*
|
771
|
-
* Document-method: OpenSSL::BN.rand_range
|
772
796
|
* call-seq:
|
773
|
-
*
|
797
|
+
* BN.rand(bits [, fill [, odd]]) -> aBN
|
774
798
|
*
|
799
|
+
* Generates a cryptographically strong pseudo-random number of +bits+.
|
800
|
+
*
|
801
|
+
* See also the man page BN_rand(3).
|
775
802
|
*/
|
776
|
-
|
803
|
+
static VALUE
|
804
|
+
ossl_bn_s_rand(int argc, VALUE *argv, VALUE klass)
|
805
|
+
{
|
806
|
+
BIGNUM *result;
|
807
|
+
int bottom = 0, top = 0, b;
|
808
|
+
VALUE bits, fill, odd, obj;
|
809
|
+
|
810
|
+
switch (rb_scan_args(argc, argv, "12", &bits, &fill, &odd)) {
|
811
|
+
case 3:
|
812
|
+
bottom = (odd == Qtrue) ? 1 : 0;
|
813
|
+
/* FALLTHROUGH */
|
814
|
+
case 2:
|
815
|
+
top = NUM2INT(fill);
|
816
|
+
}
|
817
|
+
b = NUM2INT(bits);
|
818
|
+
obj = NewBN(klass);
|
819
|
+
if (!(result = BN_new())) {
|
820
|
+
ossl_raise(eBNError, "BN_new");
|
821
|
+
}
|
822
|
+
if (BN_rand(result, b, top, bottom) <= 0) {
|
823
|
+
BN_free(result);
|
824
|
+
ossl_raise(eBNError, "BN_rand");
|
825
|
+
}
|
826
|
+
SetBN(obj, result);
|
827
|
+
return obj;
|
828
|
+
}
|
777
829
|
|
778
830
|
/*
|
779
|
-
* Document-method: OpenSSL::BN.pseudo_rand_range
|
780
831
|
* call-seq:
|
781
|
-
*
|
832
|
+
* BN.rand_range(range) -> aBN
|
782
833
|
*
|
834
|
+
* Generates a cryptographically strong pseudo-random number in the range
|
835
|
+
* 0...+range+.
|
836
|
+
*
|
837
|
+
* See also the man page BN_rand_range(3).
|
783
838
|
*/
|
784
|
-
|
839
|
+
static VALUE
|
840
|
+
ossl_bn_s_rand_range(VALUE klass, VALUE range)
|
841
|
+
{
|
842
|
+
BIGNUM *bn = GetBNPtr(range), *result;
|
843
|
+
VALUE obj = NewBN(klass);
|
844
|
+
if (!(result = BN_new()))
|
845
|
+
ossl_raise(eBNError, "BN_new");
|
846
|
+
if (BN_rand_range(result, bn) <= 0) {
|
847
|
+
BN_free(result);
|
848
|
+
ossl_raise(eBNError, "BN_rand_range");
|
849
|
+
}
|
850
|
+
SetBN(obj, result);
|
851
|
+
return obj;
|
852
|
+
}
|
785
853
|
|
786
854
|
/*
|
787
855
|
* call-seq:
|
@@ -876,7 +944,17 @@ ossl_bn_copy(VALUE self, VALUE other)
|
|
876
944
|
static VALUE
|
877
945
|
ossl_bn_uplus(VALUE self)
|
878
946
|
{
|
879
|
-
|
947
|
+
VALUE obj;
|
948
|
+
BIGNUM *bn1, *bn2;
|
949
|
+
|
950
|
+
GetBN(self, bn1);
|
951
|
+
obj = NewBN(cBN);
|
952
|
+
bn2 = BN_dup(bn1);
|
953
|
+
if (!bn2)
|
954
|
+
ossl_raise(eBNError, "BN_dup");
|
955
|
+
SetBN(obj, bn2);
|
956
|
+
|
957
|
+
return obj;
|
880
958
|
}
|
881
959
|
|
882
960
|
/*
|
@@ -900,6 +978,24 @@ ossl_bn_uminus(VALUE self)
|
|
900
978
|
return obj;
|
901
979
|
}
|
902
980
|
|
981
|
+
/*
|
982
|
+
* call-seq:
|
983
|
+
* bn.abs -> aBN
|
984
|
+
*/
|
985
|
+
static VALUE
|
986
|
+
ossl_bn_abs(VALUE self)
|
987
|
+
{
|
988
|
+
BIGNUM *bn1;
|
989
|
+
|
990
|
+
GetBN(self, bn1);
|
991
|
+
if (BN_is_negative(bn1)) {
|
992
|
+
return ossl_bn_uminus(self);
|
993
|
+
}
|
994
|
+
else {
|
995
|
+
return ossl_bn_uplus(self);
|
996
|
+
}
|
997
|
+
}
|
998
|
+
|
903
999
|
#define BIGNUM_CMP(func) \
|
904
1000
|
static VALUE \
|
905
1001
|
ossl_bn_##func(VALUE self, VALUE other) \
|
@@ -1008,34 +1104,29 @@ ossl_bn_hash(VALUE self)
|
|
1008
1104
|
* bn.prime? => true | false
|
1009
1105
|
* bn.prime?(checks) => true | false
|
1010
1106
|
*
|
1011
|
-
* Performs a Miller-Rabin probabilistic primality test
|
1012
|
-
* iterations. If _checks_ is not specified, a number of iterations is used
|
1013
|
-
* that yields a false positive rate of at most 2^-80 for random input.
|
1107
|
+
* Performs a Miller-Rabin probabilistic primality test for +bn+.
|
1014
1108
|
*
|
1015
|
-
*
|
1016
|
-
* * _checks_ - integer
|
1109
|
+
* <b>+checks+ parameter is deprecated in version 3.0.</b> It has no effect.
|
1017
1110
|
*/
|
1018
1111
|
static VALUE
|
1019
1112
|
ossl_bn_is_prime(int argc, VALUE *argv, VALUE self)
|
1020
1113
|
{
|
1021
1114
|
BIGNUM *bn;
|
1022
|
-
|
1023
|
-
int checks = BN_prime_checks;
|
1115
|
+
int ret;
|
1024
1116
|
|
1025
|
-
|
1026
|
-
checks = NUM2INT(vchecks);
|
1027
|
-
}
|
1117
|
+
rb_check_arity(argc, 0, 1);
|
1028
1118
|
GetBN(self, bn);
|
1029
|
-
|
1030
|
-
|
1031
|
-
|
1032
|
-
|
1033
|
-
|
1034
|
-
|
1035
|
-
|
1036
|
-
|
1037
|
-
|
1038
|
-
|
1119
|
+
|
1120
|
+
#ifdef HAVE_BN_CHECK_PRIME
|
1121
|
+
ret = BN_check_prime(bn, ossl_bn_ctx, NULL);
|
1122
|
+
if (ret < 0)
|
1123
|
+
ossl_raise(eBNError, "BN_check_prime");
|
1124
|
+
#else
|
1125
|
+
ret = BN_is_prime_fasttest_ex(bn, BN_prime_checks, ossl_bn_ctx, 1, NULL);
|
1126
|
+
if (ret < 0)
|
1127
|
+
ossl_raise(eBNError, "BN_is_prime_fasttest_ex");
|
1128
|
+
#endif
|
1129
|
+
return ret ? Qtrue : Qfalse;
|
1039
1130
|
}
|
1040
1131
|
|
1041
1132
|
/*
|
@@ -1044,39 +1135,52 @@ ossl_bn_is_prime(int argc, VALUE *argv, VALUE self)
|
|
1044
1135
|
* bn.prime_fasttest?(checks) => true | false
|
1045
1136
|
* bn.prime_fasttest?(checks, trial_div) => true | false
|
1046
1137
|
*
|
1047
|
-
* Performs a Miller-Rabin primality test
|
1048
|
-
* first attempts trial divisions with some small primes.
|
1138
|
+
* Performs a Miller-Rabin probabilistic primality test for +bn+.
|
1049
1139
|
*
|
1050
|
-
*
|
1051
|
-
*
|
1052
|
-
*
|
1140
|
+
* <b>Deprecated in version 3.0.</b> Use #prime? instead.
|
1141
|
+
*
|
1142
|
+
* +checks+ and +trial_div+ parameters no longer have any effect.
|
1053
1143
|
*/
|
1054
1144
|
static VALUE
|
1055
1145
|
ossl_bn_is_prime_fasttest(int argc, VALUE *argv, VALUE self)
|
1146
|
+
{
|
1147
|
+
rb_check_arity(argc, 0, 2);
|
1148
|
+
return ossl_bn_is_prime(0, argv, self);
|
1149
|
+
}
|
1150
|
+
|
1151
|
+
/*
|
1152
|
+
* call-seq:
|
1153
|
+
* bn.get_flags(flags) => flags
|
1154
|
+
*
|
1155
|
+
* Returns the flags on the BN object.
|
1156
|
+
* The argument is used as a bit mask.
|
1157
|
+
*
|
1158
|
+
* === Parameters
|
1159
|
+
* * _flags_ - integer
|
1160
|
+
*/
|
1161
|
+
static VALUE
|
1162
|
+
ossl_bn_get_flags(VALUE self, VALUE arg)
|
1056
1163
|
{
|
1057
1164
|
BIGNUM *bn;
|
1058
|
-
|
1059
|
-
int checks = BN_prime_checks, do_trial_division = 1;
|
1165
|
+
GetBN(self, bn);
|
1060
1166
|
|
1061
|
-
|
1167
|
+
return INT2NUM(BN_get_flags(bn, NUM2INT(arg)));
|
1168
|
+
}
|
1062
1169
|
|
1063
|
-
|
1064
|
-
|
1065
|
-
|
1170
|
+
/*
|
1171
|
+
* call-seq:
|
1172
|
+
* bn.set_flags(flags) => nil
|
1173
|
+
*
|
1174
|
+
* Enables the flags on the BN object.
|
1175
|
+
* Currently, the flags argument can contain zero of OpenSSL::BN::CONSTTIME.
|
1176
|
+
*/
|
1177
|
+
static VALUE
|
1178
|
+
ossl_bn_set_flags(VALUE self, VALUE arg)
|
1179
|
+
{
|
1180
|
+
BIGNUM *bn;
|
1066
1181
|
GetBN(self, bn);
|
1067
|
-
|
1068
|
-
|
1069
|
-
do_trial_division = 0;
|
1070
|
-
}
|
1071
|
-
switch (BN_is_prime_fasttest_ex(bn, checks, ossl_bn_ctx, do_trial_division, NULL)) {
|
1072
|
-
case 1:
|
1073
|
-
return Qtrue;
|
1074
|
-
case 0:
|
1075
|
-
return Qfalse;
|
1076
|
-
default:
|
1077
|
-
ossl_raise(eBNError, NULL);
|
1078
|
-
}
|
1079
|
-
/* not reachable */
|
1182
|
+
|
1183
|
+
BN_set_flags(bn, NUM2INT(arg));
|
1080
1184
|
return Qnil;
|
1081
1185
|
}
|
1082
1186
|
|
@@ -1092,9 +1196,11 @@ Init_ossl_bn(void)
|
|
1092
1196
|
eOSSLError = rb_define_class_under(mOSSL, "OpenSSLError", rb_eStandardError);
|
1093
1197
|
#endif
|
1094
1198
|
|
1095
|
-
|
1096
|
-
|
1097
|
-
|
1199
|
+
#ifdef HAVE_RB_EXT_RACTOR_SAFE
|
1200
|
+
ossl_bn_ctx_key = rb_ractor_local_storage_ptr_newkey(&ossl_bn_ctx_key_type);
|
1201
|
+
#else
|
1202
|
+
ossl_bn_ctx_get();
|
1203
|
+
#endif
|
1098
1204
|
|
1099
1205
|
eBNError = rb_define_class_under(mOSSL, "BNError", eOSSLError);
|
1100
1206
|
|
@@ -1114,6 +1220,7 @@ Init_ossl_bn(void)
|
|
1114
1220
|
|
1115
1221
|
rb_define_method(cBN, "+@", ossl_bn_uplus, 0);
|
1116
1222
|
rb_define_method(cBN, "-@", ossl_bn_uminus, 0);
|
1223
|
+
rb_define_method(cBN, "abs", ossl_bn_abs, 0);
|
1117
1224
|
|
1118
1225
|
rb_define_method(cBN, "+", ossl_bn_add, 1);
|
1119
1226
|
rb_define_method(cBN, "-", ossl_bn_sub, 1);
|
@@ -1157,9 +1264,9 @@ Init_ossl_bn(void)
|
|
1157
1264
|
* get_word */
|
1158
1265
|
|
1159
1266
|
rb_define_singleton_method(cBN, "rand", ossl_bn_s_rand, -1);
|
1160
|
-
rb_define_singleton_method(cBN, "pseudo_rand", ossl_bn_s_pseudo_rand, -1);
|
1161
1267
|
rb_define_singleton_method(cBN, "rand_range", ossl_bn_s_rand_range, 1);
|
1162
|
-
|
1268
|
+
rb_define_alias(rb_singleton_class(cBN), "pseudo_rand", "rand");
|
1269
|
+
rb_define_alias(rb_singleton_class(cBN), "pseudo_rand_range", "rand_range");
|
1163
1270
|
|
1164
1271
|
rb_define_singleton_method(cBN, "generate_prime", ossl_bn_s_generate_prime, -1);
|
1165
1272
|
rb_define_method(cBN, "prime?", ossl_bn_is_prime, -1);
|
@@ -1176,6 +1283,23 @@ Init_ossl_bn(void)
|
|
1176
1283
|
/* lshift1 - DON'T IMPL. */
|
1177
1284
|
/* rshift1 - DON'T IMPL. */
|
1178
1285
|
|
1286
|
+
rb_define_method(cBN, "get_flags", ossl_bn_get_flags, 1);
|
1287
|
+
rb_define_method(cBN, "set_flags", ossl_bn_set_flags, 1);
|
1288
|
+
|
1289
|
+
#ifdef BN_FLG_CONSTTIME
|
1290
|
+
rb_define_const(cBN, "CONSTTIME", INT2NUM(BN_FLG_CONSTTIME));
|
1291
|
+
#endif
|
1292
|
+
/* BN_FLG_MALLOCED and BN_FLG_STATIC_DATA seems for C programming.
|
1293
|
+
* Allowing them leads to memory leak.
|
1294
|
+
* So, for now, they are not exported
|
1295
|
+
#ifdef BN_FLG_MALLOCED
|
1296
|
+
rb_define_const(cBN, "MALLOCED", INT2NUM(BN_FLG_MALLOCED));
|
1297
|
+
#endif
|
1298
|
+
#ifdef BN_FLG_STATIC_DATA
|
1299
|
+
rb_define_const(cBN, "STATIC_DATA", INT2NUM(BN_FLG_STATIC_DATA));
|
1300
|
+
#endif
|
1301
|
+
*/
|
1302
|
+
|
1179
1303
|
/*
|
1180
1304
|
* bn2bin
|
1181
1305
|
* bin2bn
|
data/ext/openssl/ossl_bn.h
CHANGED
data/ext/openssl/ossl_cipher.c
CHANGED
@@ -104,7 +104,7 @@ ossl_cipher_alloc(VALUE klass)
|
|
104
104
|
* call-seq:
|
105
105
|
* Cipher.new(string) -> cipher
|
106
106
|
*
|
107
|
-
* The string must contain a valid cipher name like "
|
107
|
+
* The string must contain a valid cipher name like "aes-256-cbc".
|
108
108
|
*
|
109
109
|
* A list of cipher names is available by calling OpenSSL::Cipher.ciphers.
|
110
110
|
*/
|
@@ -149,11 +149,11 @@ ossl_cipher_copy(VALUE self, VALUE other)
|
|
149
149
|
return self;
|
150
150
|
}
|
151
151
|
|
152
|
-
static void
|
153
|
-
add_cipher_name_to_ary(const OBJ_NAME *name,
|
152
|
+
static void
|
153
|
+
add_cipher_name_to_ary(const OBJ_NAME *name, void *arg)
|
154
154
|
{
|
155
|
+
VALUE ary = (VALUE)arg;
|
155
156
|
rb_ary_push(ary, rb_str_new2(name->name));
|
156
|
-
return NULL;
|
157
157
|
}
|
158
158
|
|
159
159
|
/*
|
@@ -169,7 +169,7 @@ ossl_s_ciphers(VALUE self)
|
|
169
169
|
|
170
170
|
ary = rb_ary_new();
|
171
171
|
OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_CIPHER_METH,
|
172
|
-
|
172
|
+
add_cipher_name_to_ary,
|
173
173
|
(void*)ary);
|
174
174
|
|
175
175
|
return ary;
|
@@ -874,7 +874,7 @@ Init_ossl_cipher(void)
|
|
874
874
|
* individual components name, key length and mode. Either all uppercase
|
875
875
|
* or all lowercase strings may be used, for example:
|
876
876
|
*
|
877
|
-
* cipher = OpenSSL::Cipher.new('
|
877
|
+
* cipher = OpenSSL::Cipher.new('aes-128-cbc')
|
878
878
|
*
|
879
879
|
* === Choosing either encryption or decryption mode
|
880
880
|
*
|
@@ -904,7 +904,7 @@ Init_ossl_cipher(void)
|
|
904
904
|
* without processing the password further. A simple and secure way to
|
905
905
|
* create a key for a particular Cipher is
|
906
906
|
*
|
907
|
-
* cipher = OpenSSL::Cipher.new('
|
907
|
+
* cipher = OpenSSL::Cipher.new('aes-256-cfb')
|
908
908
|
* cipher.encrypt
|
909
909
|
* key = cipher.random_key # also sets the generated key on the Cipher
|
910
910
|
*
|
@@ -972,14 +972,14 @@ Init_ossl_cipher(void)
|
|
972
972
|
*
|
973
973
|
* data = "Very, very confidential data"
|
974
974
|
*
|
975
|
-
* cipher = OpenSSL::Cipher.new('
|
975
|
+
* cipher = OpenSSL::Cipher.new('aes-128-cbc')
|
976
976
|
* cipher.encrypt
|
977
977
|
* key = cipher.random_key
|
978
978
|
* iv = cipher.random_iv
|
979
979
|
*
|
980
980
|
* encrypted = cipher.update(data) + cipher.final
|
981
981
|
* ...
|
982
|
-
* decipher = OpenSSL::Cipher.new('
|
982
|
+
* decipher = OpenSSL::Cipher.new('aes-128-cbc')
|
983
983
|
* decipher.decrypt
|
984
984
|
* decipher.key = key
|
985
985
|
* decipher.iv = iv
|
@@ -1015,7 +1015,7 @@ Init_ossl_cipher(void)
|
|
1015
1015
|
* not to reuse the _key_ and _nonce_ pair. Reusing an nonce ruins the
|
1016
1016
|
* security guarantees of GCM mode.
|
1017
1017
|
*
|
1018
|
-
* cipher = OpenSSL::Cipher.new('
|
1018
|
+
* cipher = OpenSSL::Cipher.new('aes-128-gcm').encrypt
|
1019
1019
|
* cipher.key = key
|
1020
1020
|
* cipher.iv = nonce
|
1021
1021
|
* cipher.auth_data = auth_data
|
@@ -1031,7 +1031,7 @@ Init_ossl_cipher(void)
|
|
1031
1031
|
* ciphertext with a probability of 1/256.
|
1032
1032
|
*
|
1033
1033
|
* raise "tag is truncated!" unless tag.bytesize == 16
|
1034
|
-
* decipher = OpenSSL::Cipher.new('
|
1034
|
+
* decipher = OpenSSL::Cipher.new('aes-128-gcm').decrypt
|
1035
1035
|
* decipher.key = key
|
1036
1036
|
* decipher.iv = nonce
|
1037
1037
|
* decipher.auth_tag = tag
|