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.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +35 -45
  3. data/History.md +302 -1
  4. data/README.md +2 -2
  5. data/ext/openssl/extconf.rb +77 -62
  6. data/ext/openssl/openssl_missing.c +0 -66
  7. data/ext/openssl/openssl_missing.h +59 -43
  8. data/ext/openssl/ossl.c +110 -64
  9. data/ext/openssl/ossl.h +33 -10
  10. data/ext/openssl/ossl_asn1.c +51 -13
  11. data/ext/openssl/ossl_bn.c +275 -146
  12. data/ext/openssl/ossl_bn.h +2 -1
  13. data/ext/openssl/ossl_cipher.c +39 -31
  14. data/ext/openssl/ossl_config.c +412 -41
  15. data/ext/openssl/ossl_config.h +4 -7
  16. data/ext/openssl/ossl_digest.c +25 -60
  17. data/ext/openssl/ossl_engine.c +18 -27
  18. data/ext/openssl/ossl_hmac.c +60 -145
  19. data/ext/openssl/ossl_kdf.c +14 -22
  20. data/ext/openssl/ossl_ns_spki.c +1 -1
  21. data/ext/openssl/ossl_ocsp.c +11 -64
  22. data/ext/openssl/ossl_ocsp.h +3 -3
  23. data/ext/openssl/ossl_pkcs12.c +21 -3
  24. data/ext/openssl/ossl_pkcs7.c +45 -78
  25. data/ext/openssl/ossl_pkcs7.h +16 -0
  26. data/ext/openssl/ossl_pkey.c +1295 -178
  27. data/ext/openssl/ossl_pkey.h +36 -73
  28. data/ext/openssl/ossl_pkey_dh.c +130 -340
  29. data/ext/openssl/ossl_pkey_dsa.c +100 -405
  30. data/ext/openssl/ossl_pkey_ec.c +192 -335
  31. data/ext/openssl/ossl_pkey_rsa.c +110 -489
  32. data/ext/openssl/ossl_rand.c +2 -32
  33. data/ext/openssl/ossl_ssl.c +556 -442
  34. data/ext/openssl/ossl_ssl_session.c +28 -29
  35. data/ext/openssl/ossl_ts.c +1539 -0
  36. data/ext/openssl/ossl_ts.h +16 -0
  37. data/ext/openssl/ossl_x509.c +0 -6
  38. data/ext/openssl/ossl_x509cert.c +169 -13
  39. data/ext/openssl/ossl_x509crl.c +13 -10
  40. data/ext/openssl/ossl_x509ext.c +15 -2
  41. data/ext/openssl/ossl_x509name.c +15 -4
  42. data/ext/openssl/ossl_x509req.c +13 -10
  43. data/ext/openssl/ossl_x509revoked.c +3 -3
  44. data/ext/openssl/ossl_x509store.c +154 -70
  45. data/lib/openssl/bn.rb +1 -1
  46. data/lib/openssl/buffering.rb +37 -5
  47. data/lib/openssl/cipher.rb +1 -1
  48. data/lib/openssl/digest.rb +10 -12
  49. data/lib/openssl/hmac.rb +78 -0
  50. data/lib/openssl/marshal.rb +30 -0
  51. data/lib/openssl/pkcs5.rb +1 -1
  52. data/lib/openssl/pkey.rb +447 -1
  53. data/lib/openssl/ssl.rb +52 -9
  54. data/lib/openssl/version.rb +5 -0
  55. data/lib/openssl/x509.rb +177 -1
  56. data/lib/openssl.rb +24 -9
  57. metadata +10 -79
  58. data/ext/openssl/deprecation.rb +0 -27
  59. data/ext/openssl/ossl_version.h +0 -15
  60. data/ext/openssl/ruby_missing.h +0 -24
  61. data/lib/openssl/config.rb +0 -492
@@ -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,13 +223,29 @@ ossl_bn_alloc(VALUE klass)
173
223
 
174
224
  /*
175
225
  * call-seq:
176
- * OpenSSL::BN.new => aBN
177
- * OpenSSL::BN.new(bn) => aBN
178
- * OpenSSL::BN.new(integer) => aBN
179
- * OpenSSL::BN.new(string) => aBN
180
- * 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.
181
231
  *
182
- * 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.
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 => string
247
- * bn.to_s(base) => string
316
+ * bn.to_s(base = 10) -> string
248
317
  *
249
- * === Parameters
250
- * * _base_ - Integer
251
- * Valid values:
252
- * * 0 - MPI
253
- * * 2 - binary
254
- * * 10 - the default
255
- * * 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.
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
- static VALUE
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
- * BN.rand_range(range) -> aBN
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
- BIGNUM_RAND_RANGE(rand)
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
- * BN.pseudo_rand_range(range) -> aBN
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
- BIGNUM_RAND_RANGE(pseudo_rand)
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
- return self;
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 with _checks_
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
- * === Parameters
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
- VALUE vchecks;
1030
- int checks = BN_prime_checks;
1126
+ int ret;
1031
1127
 
1032
- if (rb_scan_args(argc, argv, "01", &vchecks) == 1) {
1033
- checks = NUM2INT(vchecks);
1034
- }
1128
+ rb_check_arity(argc, 0, 1);
1035
1129
  GetBN(self, bn);
1036
- switch (BN_is_prime_ex(bn, checks, ossl_bn_ctx, NULL)) {
1037
- case 1:
1038
- return Qtrue;
1039
- case 0:
1040
- return Qfalse;
1041
- default:
1042
- ossl_raise(eBNError, NULL);
1043
- }
1044
- /* not reachable */
1045
- return Qnil;
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. This is same as #prime? except this
1055
- * first attempts trial divisions with some small primes.
1149
+ * Performs a Miller-Rabin probabilistic primality test for +bn+.
1056
1150
  *
1057
- * === Parameters
1058
- * * _checks_ - integer
1059
- * * _trial_div_ - boolean
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
- VALUE vchecks, vtrivdiv;
1066
- int checks = BN_prime_checks, do_trial_division = 1;
1176
+ GetBN(self, bn);
1067
1177
 
1068
- rb_scan_args(argc, argv, "02", &vchecks, &vtrivdiv);
1178
+ return INT2NUM(BN_get_flags(bn, NUM2INT(arg)));
1179
+ }
1069
1180
 
1070
- if (!NIL_P(vchecks)) {
1071
- checks = NUM2INT(vchecks);
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
- /* handle true/false */
1075
- if (vtrivdiv == Qfalse) {
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
- if (!(ossl_bn_ctx = BN_CTX_new())) {
1103
- ossl_raise(rb_eRuntimeError, "Cannot init BN_CTX");
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
- rb_define_singleton_method(cBN, "pseudo_rand_range", ossl_bn_s_pseudo_rand_range, 1);
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
@@ -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