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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +32 -44
  3. data/History.md +155 -0
  4. data/ext/openssl/extconf.rb +43 -38
  5. data/ext/openssl/openssl_missing.c +0 -66
  6. data/ext/openssl/openssl_missing.h +26 -45
  7. data/ext/openssl/ossl.c +67 -47
  8. data/ext/openssl/ossl.h +20 -6
  9. data/ext/openssl/ossl_asn1.c +16 -4
  10. data/ext/openssl/ossl_bn.c +267 -143
  11. data/ext/openssl/ossl_bn.h +2 -1
  12. data/ext/openssl/ossl_cipher.c +11 -11
  13. data/ext/openssl/ossl_config.c +412 -41
  14. data/ext/openssl/ossl_config.h +4 -7
  15. data/ext/openssl/ossl_digest.c +15 -11
  16. data/ext/openssl/ossl_engine.c +16 -15
  17. data/ext/openssl/ossl_hmac.c +48 -135
  18. data/ext/openssl/ossl_kdf.c +8 -0
  19. data/ext/openssl/ossl_ocsp.c +3 -51
  20. data/ext/openssl/ossl_pkcs12.c +21 -3
  21. data/ext/openssl/ossl_pkcs7.c +42 -59
  22. data/ext/openssl/ossl_pkey.c +1102 -191
  23. data/ext/openssl/ossl_pkey.h +35 -72
  24. data/ext/openssl/ossl_pkey_dh.c +124 -334
  25. data/ext/openssl/ossl_pkey_dsa.c +93 -398
  26. data/ext/openssl/ossl_pkey_ec.c +126 -318
  27. data/ext/openssl/ossl_pkey_rsa.c +100 -487
  28. data/ext/openssl/ossl_ssl.c +322 -375
  29. data/ext/openssl/ossl_ssl_session.c +24 -29
  30. data/ext/openssl/ossl_ts.c +64 -39
  31. data/ext/openssl/ossl_x509.c +0 -6
  32. data/ext/openssl/ossl_x509cert.c +164 -8
  33. data/ext/openssl/ossl_x509crl.c +10 -7
  34. data/ext/openssl/ossl_x509ext.c +1 -2
  35. data/ext/openssl/ossl_x509name.c +9 -2
  36. data/ext/openssl/ossl_x509req.c +10 -7
  37. data/ext/openssl/ossl_x509store.c +193 -90
  38. data/lib/openssl/buffering.rb +10 -1
  39. data/lib/openssl/hmac.rb +65 -0
  40. data/lib/openssl/pkey.rb +417 -0
  41. data/lib/openssl/ssl.rb +8 -8
  42. data/lib/openssl/version.rb +1 -1
  43. data/lib/openssl/x509.rb +22 -0
  44. data/lib/openssl.rb +0 -1
  45. metadata +8 -66
  46. data/ext/openssl/ruby_missing.h +0 -24
  47. data/lib/openssl/config.rb +0 -501
@@ -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
- * BN_CTX - is used in more difficult math. ops
155
- * (Why just 1? Because Ruby itself isn't thread safe,
156
- * we don't need to care about threads)
157
- */
158
- BN_CTX *ossl_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) => aBN
177
- * OpenSSL::BN.new(integer) => aBN
178
- * OpenSSL::BN.new(string) => aBN
179
- * OpenSSL::BN.new(string, 0 | 2 | 10 | 16) => aBN
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
- * Construct a new OpenSSL BIGNUM object.
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 => string
250
- * bn.to_s(base) => string
316
+ * bn.to_s(base = 10) -> string
251
317
  *
252
- * === Parameters
253
- * * _base_ - Integer
254
- * Valid values:
255
- * * 0 - MPI
256
- * * 2 - binary
257
- * * 10 - the default
258
- * * 16 - hex
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 (!BN_##func(result, bn, ossl_bn_ctx)) { \
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 (!BN_##func(result, bn1, bn2)) { \
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 (!BN_##func(result, bn1, bn2, ossl_bn_ctx)) { \
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
- * bn.mod_inverse(bn2) => aBN
582
+ * bn.mod_inverse(bn2) => aBN
512
583
  */
513
- BIGNUM_2c(mod_inverse)
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 (!BN_##func(result, bn1, bn2, bn3, ossl_bn_ctx)) { \
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 (!BN_##func(bn, NUM2INT(bit))) { \
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 (!BN_##func(result, bn, b)) { \
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 (!BN_##func(bn, bn, b)) \
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
- * BN.rand_range(range) -> aBN
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
- BIGNUM_RAND_RANGE(rand)
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
- * BN.pseudo_rand_range(range) -> aBN
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
- BIGNUM_RAND_RANGE(pseudo_rand)
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
- return self;
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 with _checks_
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
- * === Parameters
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
- VALUE vchecks;
1023
- int checks = BN_prime_checks;
1115
+ int ret;
1024
1116
 
1025
- if (rb_scan_args(argc, argv, "01", &vchecks) == 1) {
1026
- checks = NUM2INT(vchecks);
1027
- }
1117
+ rb_check_arity(argc, 0, 1);
1028
1118
  GetBN(self, bn);
1029
- switch (BN_is_prime_ex(bn, checks, ossl_bn_ctx, NULL)) {
1030
- case 1:
1031
- return Qtrue;
1032
- case 0:
1033
- return Qfalse;
1034
- default:
1035
- ossl_raise(eBNError, NULL);
1036
- }
1037
- /* not reachable */
1038
- return Qnil;
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. This is same as #prime? except this
1048
- * first attempts trial divisions with some small primes.
1138
+ * Performs a Miller-Rabin probabilistic primality test for +bn+.
1049
1139
  *
1050
- * === Parameters
1051
- * * _checks_ - integer
1052
- * * _trial_div_ - boolean
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
- VALUE vchecks, vtrivdiv;
1059
- int checks = BN_prime_checks, do_trial_division = 1;
1165
+ GetBN(self, bn);
1060
1166
 
1061
- rb_scan_args(argc, argv, "02", &vchecks, &vtrivdiv);
1167
+ return INT2NUM(BN_get_flags(bn, NUM2INT(arg)));
1168
+ }
1062
1169
 
1063
- if (!NIL_P(vchecks)) {
1064
- checks = NUM2INT(vchecks);
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
- /* handle true/false */
1068
- if (vtrivdiv == Qfalse) {
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
- if (!(ossl_bn_ctx = BN_CTX_new())) {
1096
- ossl_raise(rb_eRuntimeError, "Cannot init BN_CTX");
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
- rb_define_singleton_method(cBN, "pseudo_rand_range", ossl_bn_s_pseudo_rand_range, 1);
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
@@ -13,7 +13,8 @@
13
13
  extern VALUE cBN;
14
14
  extern VALUE eBNError;
15
15
 
16
- extern BN_CTX *ossl_bn_ctx;
16
+ BN_CTX *ossl_bn_ctx_get(void);
17
+ #define ossl_bn_ctx ossl_bn_ctx_get()
17
18
 
18
19
  #define GetBNPtr(obj) ossl_bn_value_ptr(&(obj))
19
20
 
@@ -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 "AES-256-CBC".
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, VALUE ary)
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
- (void(*)(const OBJ_NAME*,void*))add_cipher_name_to_ary,
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('AES-128-CBC')
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('AES-256-CFB')
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('AES-128-CBC')
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('AES-128-CBC')
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('AES-128-GCM').encrypt
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('AES-128-GCM').decrypt
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