zig_example 0.3.2 → 0.3.3.1

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 (57) hide show
  1. checksums.yaml +4 -4
  2. data/ext/mkmf.rb +6 -1
  3. data/lib/zig_example/version.rb +1 -1
  4. metadata +2 -55
  5. data/ext/openssl/openssl_missing.c +0 -40
  6. data/ext/openssl/openssl_missing.h +0 -238
  7. data/ext/openssl/ossl.c +0 -1295
  8. data/ext/openssl/ossl.h +0 -201
  9. data/ext/openssl/ossl_asn1.c +0 -1891
  10. data/ext/openssl/ossl_asn1.h +0 -62
  11. data/ext/openssl/ossl_bio.c +0 -42
  12. data/ext/openssl/ossl_bio.h +0 -16
  13. data/ext/openssl/ossl_bn.c +0 -1344
  14. data/ext/openssl/ossl_bn.h +0 -26
  15. data/ext/openssl/ossl_cipher.c +0 -1074
  16. data/ext/openssl/ossl_cipher.h +0 -20
  17. data/ext/openssl/ossl_config.c +0 -460
  18. data/ext/openssl/ossl_config.h +0 -16
  19. data/ext/openssl/ossl_digest.c +0 -425
  20. data/ext/openssl/ossl_digest.h +0 -20
  21. data/ext/openssl/ossl_engine.c +0 -568
  22. data/ext/openssl/ossl_engine.h +0 -19
  23. data/ext/openssl/ossl_hmac.c +0 -310
  24. data/ext/openssl/ossl_hmac.h +0 -18
  25. data/ext/openssl/ossl_kdf.c +0 -311
  26. data/ext/openssl/ossl_kdf.h +0 -6
  27. data/ext/openssl/ossl_ns_spki.c +0 -405
  28. data/ext/openssl/ossl_ns_spki.h +0 -19
  29. data/ext/openssl/ossl_ocsp.c +0 -1965
  30. data/ext/openssl/ossl_ocsp.h +0 -23
  31. data/ext/openssl/ossl_pkcs12.c +0 -275
  32. data/ext/openssl/ossl_pkcs12.h +0 -13
  33. data/ext/openssl/ossl_pkcs7.c +0 -1081
  34. data/ext/openssl/ossl_pkcs7.h +0 -36
  35. data/ext/openssl/ossl_pkey.c +0 -1624
  36. data/ext/openssl/ossl_pkey.h +0 -204
  37. data/ext/openssl/ossl_pkey_dh.c +0 -440
  38. data/ext/openssl/ossl_pkey_dsa.c +0 -359
  39. data/ext/openssl/ossl_pkey_ec.c +0 -1655
  40. data/ext/openssl/ossl_pkey_rsa.c +0 -579
  41. data/ext/openssl/ossl_rand.c +0 -200
  42. data/ext/openssl/ossl_rand.h +0 -18
  43. data/ext/openssl/ossl_ssl.c +0 -3142
  44. data/ext/openssl/ossl_ssl.h +0 -36
  45. data/ext/openssl/ossl_ssl_session.c +0 -331
  46. data/ext/openssl/ossl_ts.c +0 -1539
  47. data/ext/openssl/ossl_ts.h +0 -16
  48. data/ext/openssl/ossl_x509.c +0 -256
  49. data/ext/openssl/ossl_x509.h +0 -115
  50. data/ext/openssl/ossl_x509attr.c +0 -324
  51. data/ext/openssl/ossl_x509cert.c +0 -1002
  52. data/ext/openssl/ossl_x509crl.c +0 -545
  53. data/ext/openssl/ossl_x509ext.c +0 -490
  54. data/ext/openssl/ossl_x509name.c +0 -597
  55. data/ext/openssl/ossl_x509req.c +0 -444
  56. data/ext/openssl/ossl_x509revoked.c +0 -300
  57. data/ext/openssl/ossl_x509store.c +0 -986
@@ -1,1344 +0,0 @@
1
- /*
2
- * 'OpenSSL for Ruby' project
3
- * Copyright (C) 2001-2002 Technorama team <oss-ruby@technorama.net>
4
- * All rights reserved.
5
- */
6
- /*
7
- * This program is licensed under the same licence as Ruby.
8
- * (See the file 'LICENCE'.)
9
- */
10
- /* modified by Michal Rokos <m.rokos@sh.cvut.cz> */
11
- #include "ossl.h"
12
-
13
- #ifdef HAVE_RB_EXT_RACTOR_SAFE
14
- #include <ruby/ractor.h>
15
- #endif
16
-
17
- #define NewBN(klass) \
18
- TypedData_Wrap_Struct((klass), &ossl_bn_type, 0)
19
- #define SetBN(obj, bn) do { \
20
- if (!(bn)) { \
21
- ossl_raise(rb_eRuntimeError, "BN wasn't initialized!"); \
22
- } \
23
- RTYPEDDATA_DATA(obj) = (bn); \
24
- } while (0)
25
-
26
- #define GetBN(obj, bn) do { \
27
- TypedData_Get_Struct((obj), BIGNUM, &ossl_bn_type, (bn)); \
28
- if (!(bn)) { \
29
- ossl_raise(rb_eRuntimeError, "BN wasn't initialized!"); \
30
- } \
31
- } while (0)
32
-
33
- static void
34
- ossl_bn_free(void *ptr)
35
- {
36
- BN_clear_free(ptr);
37
- }
38
-
39
- static const rb_data_type_t ossl_bn_type = {
40
- "OpenSSL/BN",
41
- {
42
- 0, ossl_bn_free,
43
- },
44
- 0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
45
- };
46
-
47
- /*
48
- * Classes
49
- */
50
- VALUE cBN;
51
-
52
- /* Document-class: OpenSSL::BNError
53
- *
54
- * Generic Error for all of OpenSSL::BN (big num)
55
- */
56
- VALUE eBNError;
57
-
58
- /*
59
- * Public
60
- */
61
- VALUE
62
- ossl_bn_new(const BIGNUM *bn)
63
- {
64
- BIGNUM *newbn;
65
- VALUE obj;
66
-
67
- obj = NewBN(cBN);
68
- newbn = bn ? BN_dup(bn) : BN_new();
69
- if (!newbn) {
70
- ossl_raise(eBNError, NULL);
71
- }
72
- SetBN(obj, newbn);
73
-
74
- return obj;
75
- }
76
-
77
- static BIGNUM *
78
- integer_to_bnptr(VALUE obj, BIGNUM *orig)
79
- {
80
- BIGNUM *bn;
81
-
82
- if (FIXNUM_P(obj)) {
83
- long i;
84
- unsigned char bin[sizeof(long)];
85
- long n = FIX2LONG(obj);
86
- unsigned long un = labs(n);
87
-
88
- for (i = sizeof(long) - 1; 0 <= i; i--) {
89
- bin[i] = un & 0xff;
90
- un >>= 8;
91
- }
92
-
93
- bn = BN_bin2bn(bin, sizeof(bin), orig);
94
- if (!bn)
95
- ossl_raise(eBNError, "BN_bin2bn");
96
- if (n < 0)
97
- BN_set_negative(bn, 1);
98
- }
99
- else { /* assuming Bignum */
100
- size_t len = rb_absint_size(obj, NULL);
101
- unsigned char *bin;
102
- VALUE buf;
103
- int sign;
104
-
105
- if (INT_MAX < len) {
106
- rb_raise(eBNError, "bignum too long");
107
- }
108
- bin = (unsigned char*)ALLOCV_N(unsigned char, buf, len);
109
- sign = rb_integer_pack(obj, bin, len, 1, 0, INTEGER_PACK_BIG_ENDIAN);
110
-
111
- bn = BN_bin2bn(bin, (int)len, orig);
112
- ALLOCV_END(buf);
113
- if (!bn)
114
- ossl_raise(eBNError, "BN_bin2bn");
115
- if (sign < 0)
116
- BN_set_negative(bn, 1);
117
- }
118
-
119
- return bn;
120
- }
121
-
122
- static VALUE
123
- try_convert_to_bn(VALUE obj)
124
- {
125
- BIGNUM *bn;
126
- VALUE newobj = Qnil;
127
-
128
- if (rb_obj_is_kind_of(obj, cBN))
129
- return obj;
130
- if (RB_INTEGER_TYPE_P(obj)) {
131
- newobj = NewBN(cBN); /* Handle potential mem leaks */
132
- bn = integer_to_bnptr(obj, NULL);
133
- SetBN(newobj, bn);
134
- }
135
-
136
- return newobj;
137
- }
138
-
139
- BIGNUM *
140
- ossl_bn_value_ptr(volatile VALUE *ptr)
141
- {
142
- VALUE tmp;
143
- BIGNUM *bn;
144
-
145
- tmp = try_convert_to_bn(*ptr);
146
- if (NIL_P(tmp))
147
- ossl_raise(rb_eTypeError, "Cannot convert into OpenSSL::BN");
148
- GetBN(tmp, bn);
149
- *ptr = tmp;
150
-
151
- return bn;
152
- }
153
-
154
- /*
155
- * Private
156
- */
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
209
-
210
- static VALUE
211
- ossl_bn_alloc(VALUE klass)
212
- {
213
- BIGNUM *bn;
214
- VALUE obj = NewBN(klass);
215
-
216
- if (!(bn = BN_new())) {
217
- ossl_raise(eBNError, NULL);
218
- }
219
- SetBN(obj, bn);
220
-
221
- return obj;
222
- }
223
-
224
- /*
225
- * call-seq:
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.
231
- *
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.
249
- */
250
- static VALUE
251
- ossl_bn_initialize(int argc, VALUE *argv, VALUE self)
252
- {
253
- BIGNUM *bn;
254
- VALUE str, bs;
255
- int base = 10;
256
- char *ptr;
257
-
258
- if (rb_scan_args(argc, argv, "11", &str, &bs) == 2) {
259
- base = NUM2INT(bs);
260
- }
261
-
262
- if (NIL_P(str)) {
263
- ossl_raise(rb_eArgError, "invalid argument");
264
- }
265
-
266
- if (RB_INTEGER_TYPE_P(str)) {
267
- GetBN(self, bn);
268
- integer_to_bnptr(str, bn);
269
-
270
- return self;
271
- }
272
-
273
- if (RTEST(rb_obj_is_kind_of(str, cBN))) {
274
- BIGNUM *other;
275
-
276
- GetBN(self, bn);
277
- GetBN(str, other); /* Safe - we checked kind_of? above */
278
- if (!BN_copy(bn, other)) {
279
- ossl_raise(eBNError, NULL);
280
- }
281
- return self;
282
- }
283
-
284
- GetBN(self, bn);
285
- switch (base) {
286
- case 0:
287
- ptr = StringValuePtr(str);
288
- if (!BN_mpi2bn((unsigned char *)ptr, RSTRING_LENINT(str), bn)) {
289
- ossl_raise(eBNError, NULL);
290
- }
291
- break;
292
- case 2:
293
- ptr = StringValuePtr(str);
294
- if (!BN_bin2bn((unsigned char *)ptr, RSTRING_LENINT(str), bn)) {
295
- ossl_raise(eBNError, NULL);
296
- }
297
- break;
298
- case 10:
299
- if (!BN_dec2bn(&bn, StringValueCStr(str))) {
300
- ossl_raise(eBNError, NULL);
301
- }
302
- break;
303
- case 16:
304
- if (!BN_hex2bn(&bn, StringValueCStr(str))) {
305
- ossl_raise(eBNError, NULL);
306
- }
307
- break;
308
- default:
309
- ossl_raise(rb_eArgError, "invalid radix %d", base);
310
- }
311
- return self;
312
- }
313
-
314
- /*
315
- * call-seq:
316
- * bn.to_s(base = 10) -> string
317
- *
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.
331
- */
332
- static VALUE
333
- ossl_bn_to_s(int argc, VALUE *argv, VALUE self)
334
- {
335
- BIGNUM *bn;
336
- VALUE str, bs;
337
- int base = 10, len;
338
- char *buf;
339
-
340
- if (rb_scan_args(argc, argv, "01", &bs) == 1) {
341
- base = NUM2INT(bs);
342
- }
343
- GetBN(self, bn);
344
- switch (base) {
345
- case 0:
346
- len = BN_bn2mpi(bn, NULL);
347
- str = rb_str_new(0, len);
348
- if (BN_bn2mpi(bn, (unsigned char *)RSTRING_PTR(str)) != len)
349
- ossl_raise(eBNError, NULL);
350
- break;
351
- case 2:
352
- len = BN_num_bytes(bn);
353
- str = rb_str_new(0, len);
354
- if (BN_bn2bin(bn, (unsigned char *)RSTRING_PTR(str)) != len)
355
- ossl_raise(eBNError, NULL);
356
- break;
357
- case 10:
358
- if (!(buf = BN_bn2dec(bn))) ossl_raise(eBNError, NULL);
359
- str = ossl_buf2str(buf, rb_long2int(strlen(buf)));
360
- break;
361
- case 16:
362
- if (!(buf = BN_bn2hex(bn))) ossl_raise(eBNError, NULL);
363
- str = ossl_buf2str(buf, rb_long2int(strlen(buf)));
364
- break;
365
- default:
366
- ossl_raise(rb_eArgError, "invalid radix %d", base);
367
- }
368
-
369
- return str;
370
- }
371
-
372
- /*
373
- * call-seq:
374
- * bn.to_i => integer
375
- */
376
- static VALUE
377
- ossl_bn_to_i(VALUE self)
378
- {
379
- BIGNUM *bn;
380
- char *txt;
381
- VALUE num;
382
-
383
- GetBN(self, bn);
384
-
385
- if (!(txt = BN_bn2hex(bn))) {
386
- ossl_raise(eBNError, NULL);
387
- }
388
- num = rb_cstr_to_inum(txt, 16, Qtrue);
389
- OPENSSL_free(txt);
390
-
391
- return num;
392
- }
393
-
394
- static VALUE
395
- ossl_bn_to_bn(VALUE self)
396
- {
397
- return self;
398
- }
399
-
400
- static VALUE
401
- ossl_bn_coerce(VALUE self, VALUE other)
402
- {
403
- switch(TYPE(other)) {
404
- case T_STRING:
405
- self = ossl_bn_to_s(0, NULL, self);
406
- break;
407
- case T_FIXNUM:
408
- case T_BIGNUM:
409
- self = ossl_bn_to_i(self);
410
- break;
411
- default:
412
- if (!RTEST(rb_obj_is_kind_of(other, cBN))) {
413
- ossl_raise(rb_eTypeError, "Don't know how to coerce");
414
- }
415
- }
416
- return rb_assoc_new(other, self);
417
- }
418
-
419
- #define BIGNUM_BOOL1(func) \
420
- static VALUE \
421
- ossl_bn_##func(VALUE self) \
422
- { \
423
- BIGNUM *bn; \
424
- GetBN(self, bn); \
425
- if (BN_##func(bn)) { \
426
- return Qtrue; \
427
- } \
428
- return Qfalse; \
429
- }
430
-
431
- /*
432
- * Document-method: OpenSSL::BN#zero?
433
- * call-seq:
434
- * bn.zero? => true | false
435
- */
436
- BIGNUM_BOOL1(is_zero)
437
-
438
- /*
439
- * Document-method: OpenSSL::BN#one?
440
- * call-seq:
441
- * bn.one? => true | false
442
- */
443
- BIGNUM_BOOL1(is_one)
444
-
445
- /*
446
- * Document-method: OpenSSL::BN#odd?
447
- * call-seq:
448
- * bn.odd? => true | false
449
- */
450
- BIGNUM_BOOL1(is_odd)
451
-
452
- /*
453
- * call-seq:
454
- * bn.negative? => true | false
455
- */
456
- static VALUE
457
- ossl_bn_is_negative(VALUE self)
458
- {
459
- BIGNUM *bn;
460
-
461
- GetBN(self, bn);
462
- if (BN_is_zero(bn))
463
- return Qfalse;
464
- return BN_is_negative(bn) ? Qtrue : Qfalse;
465
- }
466
-
467
- #define BIGNUM_1c(func) \
468
- static VALUE \
469
- ossl_bn_##func(VALUE self) \
470
- { \
471
- BIGNUM *bn, *result; \
472
- VALUE obj; \
473
- GetBN(self, bn); \
474
- obj = NewBN(rb_obj_class(self)); \
475
- if (!(result = BN_new())) { \
476
- ossl_raise(eBNError, NULL); \
477
- } \
478
- if (BN_##func(result, bn, ossl_bn_ctx) <= 0) { \
479
- BN_free(result); \
480
- ossl_raise(eBNError, NULL); \
481
- } \
482
- SetBN(obj, result); \
483
- return obj; \
484
- }
485
-
486
- /*
487
- * Document-method: OpenSSL::BN#sqr
488
- * call-seq:
489
- * bn.sqr => aBN
490
- */
491
- BIGNUM_1c(sqr)
492
-
493
- #define BIGNUM_2(func) \
494
- static VALUE \
495
- ossl_bn_##func(VALUE self, VALUE other) \
496
- { \
497
- BIGNUM *bn1, *bn2 = GetBNPtr(other), *result; \
498
- VALUE obj; \
499
- GetBN(self, bn1); \
500
- obj = NewBN(rb_obj_class(self)); \
501
- if (!(result = BN_new())) { \
502
- ossl_raise(eBNError, NULL); \
503
- } \
504
- if (BN_##func(result, bn1, bn2) <= 0) { \
505
- BN_free(result); \
506
- ossl_raise(eBNError, NULL); \
507
- } \
508
- SetBN(obj, result); \
509
- return obj; \
510
- }
511
-
512
- /*
513
- * Document-method: OpenSSL::BN#+
514
- * call-seq:
515
- * bn + bn2 => aBN
516
- */
517
- BIGNUM_2(add)
518
-
519
- /*
520
- * Document-method: OpenSSL::BN#-
521
- * call-seq:
522
- * bn - bn2 => aBN
523
- */
524
- BIGNUM_2(sub)
525
-
526
- #define BIGNUM_2c(func) \
527
- static VALUE \
528
- ossl_bn_##func(VALUE self, VALUE other) \
529
- { \
530
- BIGNUM *bn1, *bn2 = GetBNPtr(other), *result; \
531
- VALUE obj; \
532
- GetBN(self, bn1); \
533
- obj = NewBN(rb_obj_class(self)); \
534
- if (!(result = BN_new())) { \
535
- ossl_raise(eBNError, NULL); \
536
- } \
537
- if (BN_##func(result, bn1, bn2, ossl_bn_ctx) <= 0) { \
538
- BN_free(result); \
539
- ossl_raise(eBNError, NULL); \
540
- } \
541
- SetBN(obj, result); \
542
- return obj; \
543
- }
544
-
545
- /*
546
- * Document-method: OpenSSL::BN#*
547
- * call-seq:
548
- * bn * bn2 => aBN
549
- */
550
- BIGNUM_2c(mul)
551
-
552
- /*
553
- * Document-method: OpenSSL::BN#%
554
- * call-seq:
555
- * bn % bn2 => aBN
556
- */
557
- BIGNUM_2c(mod)
558
-
559
- /*
560
- * Document-method: OpenSSL::BN#**
561
- * call-seq:
562
- * bn ** bn2 => aBN
563
- */
564
- BIGNUM_2c(exp)
565
-
566
- /*
567
- * Document-method: OpenSSL::BN#gcd
568
- * call-seq:
569
- * bn.gcd(bn2) => aBN
570
- */
571
- BIGNUM_2c(gcd)
572
-
573
- /*
574
- * Document-method: OpenSSL::BN#mod_sqr
575
- * call-seq:
576
- * bn.mod_sqr(bn2) => aBN
577
- */
578
- BIGNUM_2c(mod_sqr)
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
-
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
603
- * call-seq:
604
- * bn.mod_inverse(bn2) => aBN
605
- */
606
- BIGNUM_2cr(mod_inverse)
607
-
608
- /*
609
- * call-seq:
610
- * bn1 / bn2 => [result, remainder]
611
- *
612
- * Division of OpenSSL::BN instances
613
- */
614
- static VALUE
615
- ossl_bn_div(VALUE self, VALUE other)
616
- {
617
- BIGNUM *bn1, *bn2 = GetBNPtr(other), *r1, *r2;
618
- VALUE klass, obj1, obj2;
619
-
620
- GetBN(self, bn1);
621
-
622
- klass = rb_obj_class(self);
623
- obj1 = NewBN(klass);
624
- obj2 = NewBN(klass);
625
- if (!(r1 = BN_new())) {
626
- ossl_raise(eBNError, NULL);
627
- }
628
- if (!(r2 = BN_new())) {
629
- BN_free(r1);
630
- ossl_raise(eBNError, NULL);
631
- }
632
- if (!BN_div(r1, r2, bn1, bn2, ossl_bn_ctx)) {
633
- BN_free(r1);
634
- BN_free(r2);
635
- ossl_raise(eBNError, NULL);
636
- }
637
- SetBN(obj1, r1);
638
- SetBN(obj2, r2);
639
-
640
- return rb_ary_new3(2, obj1, obj2);
641
- }
642
-
643
- #define BIGNUM_3c(func) \
644
- static VALUE \
645
- ossl_bn_##func(VALUE self, VALUE other1, VALUE other2) \
646
- { \
647
- BIGNUM *bn1, *bn2 = GetBNPtr(other1); \
648
- BIGNUM *bn3 = GetBNPtr(other2), *result; \
649
- VALUE obj; \
650
- GetBN(self, bn1); \
651
- obj = NewBN(rb_obj_class(self)); \
652
- if (!(result = BN_new())) { \
653
- ossl_raise(eBNError, NULL); \
654
- } \
655
- if (BN_##func(result, bn1, bn2, bn3, ossl_bn_ctx) <= 0) { \
656
- BN_free(result); \
657
- ossl_raise(eBNError, NULL); \
658
- } \
659
- SetBN(obj, result); \
660
- return obj; \
661
- }
662
-
663
- /*
664
- * Document-method: OpenSSL::BN#mod_add
665
- * call-seq:
666
- * bn.mod_add(bn1, bn2) -> aBN
667
- */
668
- BIGNUM_3c(mod_add)
669
-
670
- /*
671
- * Document-method: OpenSSL::BN#mod_sub
672
- * call-seq:
673
- * bn.mod_sub(bn1, bn2) -> aBN
674
- */
675
- BIGNUM_3c(mod_sub)
676
-
677
- /*
678
- * Document-method: OpenSSL::BN#mod_mul
679
- * call-seq:
680
- * bn.mod_mul(bn1, bn2) -> aBN
681
- */
682
- BIGNUM_3c(mod_mul)
683
-
684
- /*
685
- * Document-method: OpenSSL::BN#mod_exp
686
- * call-seq:
687
- * bn.mod_exp(bn1, bn2) -> aBN
688
- */
689
- BIGNUM_3c(mod_exp)
690
-
691
- #define BIGNUM_BIT(func) \
692
- static VALUE \
693
- ossl_bn_##func(VALUE self, VALUE bit) \
694
- { \
695
- BIGNUM *bn; \
696
- GetBN(self, bn); \
697
- if (BN_##func(bn, NUM2INT(bit)) <= 0) { \
698
- ossl_raise(eBNError, NULL); \
699
- } \
700
- return self; \
701
- }
702
-
703
- /*
704
- * Document-method: OpenSSL::BN#set_bit!
705
- * call-seq:
706
- * bn.set_bit!(bit) -> self
707
- */
708
- BIGNUM_BIT(set_bit)
709
-
710
- /*
711
- * Document-method: OpenSSL::BN#clear_bit!
712
- * call-seq:
713
- * bn.clear_bit!(bit) -> self
714
- */
715
- BIGNUM_BIT(clear_bit)
716
-
717
- /*
718
- * Document-method: OpenSSL::BN#mask_bit!
719
- * call-seq:
720
- * bn.mask_bit!(bit) -> self
721
- */
722
- BIGNUM_BIT(mask_bits)
723
-
724
- /*
725
- * call-seq:
726
- * bn.bit_set?(bit) => true | false
727
- *
728
- * Tests bit _bit_ in _bn_ and returns +true+ if set, +false+ if not set.
729
- */
730
- static VALUE
731
- ossl_bn_is_bit_set(VALUE self, VALUE bit)
732
- {
733
- int b;
734
- BIGNUM *bn;
735
-
736
- b = NUM2INT(bit);
737
- GetBN(self, bn);
738
- if (BN_is_bit_set(bn, b)) {
739
- return Qtrue;
740
- }
741
- return Qfalse;
742
- }
743
-
744
- #define BIGNUM_SHIFT(func) \
745
- static VALUE \
746
- ossl_bn_##func(VALUE self, VALUE bits) \
747
- { \
748
- BIGNUM *bn, *result; \
749
- int b; \
750
- VALUE obj; \
751
- b = NUM2INT(bits); \
752
- GetBN(self, bn); \
753
- obj = NewBN(rb_obj_class(self)); \
754
- if (!(result = BN_new())) { \
755
- ossl_raise(eBNError, NULL); \
756
- } \
757
- if (BN_##func(result, bn, b) <= 0) { \
758
- BN_free(result); \
759
- ossl_raise(eBNError, NULL); \
760
- } \
761
- SetBN(obj, result); \
762
- return obj; \
763
- }
764
-
765
- /*
766
- * Document-method: OpenSSL::BN#<<
767
- * call-seq:
768
- * bn << bits -> aBN
769
- */
770
- BIGNUM_SHIFT(lshift)
771
-
772
- /*
773
- * Document-method: OpenSSL::BN#>>
774
- * call-seq:
775
- * bn >> bits -> aBN
776
- */
777
- BIGNUM_SHIFT(rshift)
778
-
779
- #define BIGNUM_SELF_SHIFT(func) \
780
- static VALUE \
781
- ossl_bn_self_##func(VALUE self, VALUE bits) \
782
- { \
783
- BIGNUM *bn; \
784
- int b; \
785
- b = NUM2INT(bits); \
786
- GetBN(self, bn); \
787
- if (BN_##func(bn, bn, b) <= 0) \
788
- ossl_raise(eBNError, NULL); \
789
- return self; \
790
- }
791
-
792
- /*
793
- * Document-method: OpenSSL::BN#lshift!
794
- * call-seq:
795
- * bn.lshift!(bits) -> self
796
- */
797
- BIGNUM_SELF_SHIFT(lshift)
798
-
799
- /*
800
- * Document-method: OpenSSL::BN#rshift!
801
- * call-seq:
802
- * bn.rshift!(bits) -> self
803
- */
804
- BIGNUM_SELF_SHIFT(rshift)
805
-
806
- /*
807
- * call-seq:
808
- * BN.rand(bits [, fill [, odd]]) -> aBN
809
- *
810
- * Generates a cryptographically strong pseudo-random number of +bits+.
811
- *
812
- * See also the man page BN_rand(3).
813
- */
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
- }
840
-
841
- /*
842
- * call-seq:
843
- * BN.rand_range(range) -> aBN
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).
849
- */
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
- }
864
-
865
- /*
866
- * call-seq:
867
- * BN.generate_prime(bits, [, safe [, add [, rem]]]) => bn
868
- *
869
- * Generates a random prime number of bit length _bits_. If _safe_ is set to
870
- * +true+, generates a safe prime. If _add_ is specified, generates a prime that
871
- * fulfills condition <tt>p % add = rem</tt>.
872
- *
873
- * === Parameters
874
- * * _bits_ - integer
875
- * * _safe_ - boolean
876
- * * _add_ - BN
877
- * * _rem_ - BN
878
- */
879
- static VALUE
880
- ossl_bn_s_generate_prime(int argc, VALUE *argv, VALUE klass)
881
- {
882
- BIGNUM *add = NULL, *rem = NULL, *result;
883
- int safe = 1, num;
884
- VALUE vnum, vsafe, vadd, vrem, obj;
885
-
886
- rb_scan_args(argc, argv, "13", &vnum, &vsafe, &vadd, &vrem);
887
-
888
- num = NUM2INT(vnum);
889
-
890
- if (vsafe == Qfalse) {
891
- safe = 0;
892
- }
893
- if (!NIL_P(vadd)) {
894
- add = GetBNPtr(vadd);
895
- rem = NIL_P(vrem) ? NULL : GetBNPtr(vrem);
896
- }
897
- obj = NewBN(klass);
898
- if (!(result = BN_new())) {
899
- ossl_raise(eBNError, NULL);
900
- }
901
- if (!BN_generate_prime_ex(result, num, safe, add, rem, NULL)) {
902
- BN_free(result);
903
- ossl_raise(eBNError, NULL);
904
- }
905
- SetBN(obj, result);
906
-
907
- return obj;
908
- }
909
-
910
- #define BIGNUM_NUM(func) \
911
- static VALUE \
912
- ossl_bn_##func(VALUE self) \
913
- { \
914
- BIGNUM *bn; \
915
- GetBN(self, bn); \
916
- return INT2NUM(BN_##func(bn)); \
917
- }
918
-
919
- /*
920
- * Document-method: OpenSSL::BN#num_bytes
921
- * call-seq:
922
- * bn.num_bytes => integer
923
- */
924
- BIGNUM_NUM(num_bytes)
925
-
926
- /*
927
- * Document-method: OpenSSL::BN#num_bits
928
- * call-seq:
929
- * bn.num_bits => integer
930
- */
931
- BIGNUM_NUM(num_bits)
932
-
933
- static VALUE
934
- ossl_bn_copy(VALUE self, VALUE other)
935
- {
936
- BIGNUM *bn1, *bn2;
937
-
938
- rb_check_frozen(self);
939
-
940
- if (self == other) return self;
941
-
942
- GetBN(self, bn1);
943
- bn2 = GetBNPtr(other);
944
-
945
- if (!BN_copy(bn1, bn2)) {
946
- ossl_raise(eBNError, NULL);
947
- }
948
- return self;
949
- }
950
-
951
- /*
952
- * call-seq:
953
- * +bn -> aBN
954
- */
955
- static VALUE
956
- ossl_bn_uplus(VALUE self)
957
- {
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;
969
- }
970
-
971
- /*
972
- * call-seq:
973
- * -bn -> aBN
974
- */
975
- static VALUE
976
- ossl_bn_uminus(VALUE self)
977
- {
978
- VALUE obj;
979
- BIGNUM *bn1, *bn2;
980
-
981
- GetBN(self, bn1);
982
- obj = NewBN(cBN);
983
- bn2 = BN_dup(bn1);
984
- if (!bn2)
985
- ossl_raise(eBNError, "BN_dup");
986
- SetBN(obj, bn2);
987
- BN_set_negative(bn2, !BN_is_negative(bn2));
988
-
989
- return obj;
990
- }
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
-
1010
- #define BIGNUM_CMP(func) \
1011
- static VALUE \
1012
- ossl_bn_##func(VALUE self, VALUE other) \
1013
- { \
1014
- BIGNUM *bn1, *bn2 = GetBNPtr(other); \
1015
- GetBN(self, bn1); \
1016
- return INT2NUM(BN_##func(bn1, bn2)); \
1017
- }
1018
-
1019
- /*
1020
- * Document-method: OpenSSL::BN#cmp
1021
- * call-seq:
1022
- * bn.cmp(bn2) => integer
1023
- */
1024
- /*
1025
- * Document-method: OpenSSL::BN#<=>
1026
- * call-seq:
1027
- * bn <=> bn2 => integer
1028
- */
1029
- BIGNUM_CMP(cmp)
1030
-
1031
- /*
1032
- * Document-method: OpenSSL::BN#ucmp
1033
- * call-seq:
1034
- * bn.ucmp(bn2) => integer
1035
- */
1036
- BIGNUM_CMP(ucmp)
1037
-
1038
- /*
1039
- * call-seq:
1040
- * bn == obj => true or false
1041
- *
1042
- * Returns +true+ only if _obj_ has the same value as _bn_. Contrast this
1043
- * with OpenSSL::BN#eql?, which requires obj to be OpenSSL::BN.
1044
- */
1045
- static VALUE
1046
- ossl_bn_eq(VALUE self, VALUE other)
1047
- {
1048
- BIGNUM *bn1, *bn2;
1049
-
1050
- GetBN(self, bn1);
1051
- other = try_convert_to_bn(other);
1052
- if (NIL_P(other))
1053
- return Qfalse;
1054
- GetBN(other, bn2);
1055
-
1056
- if (!BN_cmp(bn1, bn2)) {
1057
- return Qtrue;
1058
- }
1059
- return Qfalse;
1060
- }
1061
-
1062
- /*
1063
- * call-seq:
1064
- * bn.eql?(obj) => true or false
1065
- *
1066
- * Returns <code>true</code> only if <i>obj</i> is a
1067
- * <code>OpenSSL::BN</code> with the same value as <i>bn</i>. Contrast this
1068
- * with OpenSSL::BN#==, which performs type conversions.
1069
- */
1070
- static VALUE
1071
- ossl_bn_eql(VALUE self, VALUE other)
1072
- {
1073
- BIGNUM *bn1, *bn2;
1074
-
1075
- if (!rb_obj_is_kind_of(other, cBN))
1076
- return Qfalse;
1077
- GetBN(self, bn1);
1078
- GetBN(other, bn2);
1079
-
1080
- return BN_cmp(bn1, bn2) ? Qfalse : Qtrue;
1081
- }
1082
-
1083
- /*
1084
- * call-seq:
1085
- * bn.hash => Integer
1086
- *
1087
- * Returns a hash code for this object.
1088
- *
1089
- * See also Object#hash.
1090
- */
1091
- static VALUE
1092
- ossl_bn_hash(VALUE self)
1093
- {
1094
- BIGNUM *bn;
1095
- VALUE tmp, hash;
1096
- unsigned char *buf;
1097
- int len;
1098
-
1099
- GetBN(self, bn);
1100
- len = BN_num_bytes(bn);
1101
- buf = ALLOCV(tmp, len);
1102
- if (BN_bn2bin(bn, buf) != len) {
1103
- ALLOCV_END(tmp);
1104
- ossl_raise(eBNError, "BN_bn2bin");
1105
- }
1106
-
1107
- hash = ST2FIX(rb_memhash(buf, len));
1108
- ALLOCV_END(tmp);
1109
-
1110
- return hash;
1111
- }
1112
-
1113
- /*
1114
- * call-seq:
1115
- * bn.prime? => true | false
1116
- * bn.prime?(checks) => true | false
1117
- *
1118
- * Performs a Miller-Rabin probabilistic primality test for +bn+.
1119
- *
1120
- * <b>+checks+ parameter is deprecated in version 3.0.</b> It has no effect.
1121
- */
1122
- static VALUE
1123
- ossl_bn_is_prime(int argc, VALUE *argv, VALUE self)
1124
- {
1125
- BIGNUM *bn;
1126
- int ret;
1127
-
1128
- rb_check_arity(argc, 0, 1);
1129
- GetBN(self, bn);
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;
1141
- }
1142
-
1143
- /*
1144
- * call-seq:
1145
- * bn.prime_fasttest? => true | false
1146
- * bn.prime_fasttest?(checks) => true | false
1147
- * bn.prime_fasttest?(checks, trial_div) => true | false
1148
- *
1149
- * Performs a Miller-Rabin probabilistic primality test for +bn+.
1150
- *
1151
- * <b>Deprecated in version 3.0.</b> Use #prime? instead.
1152
- *
1153
- * +checks+ and +trial_div+ parameters no longer have any effect.
1154
- */
1155
- static VALUE
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)
1174
- {
1175
- BIGNUM *bn;
1176
- GetBN(self, bn);
1177
-
1178
- return INT2NUM(BN_get_flags(bn, NUM2INT(arg)));
1179
- }
1180
-
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;
1192
- GetBN(self, bn);
1193
-
1194
- BN_set_flags(bn, NUM2INT(arg));
1195
- return Qnil;
1196
- }
1197
-
1198
- /*
1199
- * INIT
1200
- * (NOTE: ordering of methods is the same as in 'man bn')
1201
- */
1202
- void
1203
- Init_ossl_bn(void)
1204
- {
1205
- #if 0
1206
- mOSSL = rb_define_module("OpenSSL");
1207
- eOSSLError = rb_define_class_under(mOSSL, "OpenSSLError", rb_eStandardError);
1208
- #endif
1209
-
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
1215
-
1216
- eBNError = rb_define_class_under(mOSSL, "BNError", eOSSLError);
1217
-
1218
- cBN = rb_define_class_under(mOSSL, "BN", rb_cObject);
1219
-
1220
- rb_define_alloc_func(cBN, ossl_bn_alloc);
1221
- rb_define_method(cBN, "initialize", ossl_bn_initialize, -1);
1222
-
1223
- rb_define_method(cBN, "initialize_copy", ossl_bn_copy, 1);
1224
- rb_define_method(cBN, "copy", ossl_bn_copy, 1);
1225
-
1226
- /* swap (=coerce?) */
1227
-
1228
- rb_define_method(cBN, "num_bytes", ossl_bn_num_bytes, 0);
1229
- rb_define_method(cBN, "num_bits", ossl_bn_num_bits, 0);
1230
- /* num_bits_word */
1231
-
1232
- rb_define_method(cBN, "+@", ossl_bn_uplus, 0);
1233
- rb_define_method(cBN, "-@", ossl_bn_uminus, 0);
1234
- rb_define_method(cBN, "abs", ossl_bn_abs, 0);
1235
-
1236
- rb_define_method(cBN, "+", ossl_bn_add, 1);
1237
- rb_define_method(cBN, "-", ossl_bn_sub, 1);
1238
- rb_define_method(cBN, "*", ossl_bn_mul, 1);
1239
- rb_define_method(cBN, "sqr", ossl_bn_sqr, 0);
1240
- rb_define_method(cBN, "/", ossl_bn_div, 1);
1241
- rb_define_method(cBN, "%", ossl_bn_mod, 1);
1242
- /* nnmod */
1243
-
1244
- rb_define_method(cBN, "mod_add", ossl_bn_mod_add, 2);
1245
- rb_define_method(cBN, "mod_sub", ossl_bn_mod_sub, 2);
1246
- rb_define_method(cBN, "mod_mul", ossl_bn_mod_mul, 2);
1247
- rb_define_method(cBN, "mod_sqr", ossl_bn_mod_sqr, 1);
1248
- rb_define_method(cBN, "mod_sqrt", ossl_bn_mod_sqrt, 1);
1249
- rb_define_method(cBN, "**", ossl_bn_exp, 1);
1250
- rb_define_method(cBN, "mod_exp", ossl_bn_mod_exp, 2);
1251
- rb_define_method(cBN, "gcd", ossl_bn_gcd, 1);
1252
-
1253
- /* add_word
1254
- * sub_word
1255
- * mul_word
1256
- * div_word
1257
- * mod_word */
1258
-
1259
- rb_define_method(cBN, "cmp", ossl_bn_cmp, 1);
1260
- rb_define_alias(cBN, "<=>", "cmp");
1261
- rb_define_method(cBN, "ucmp", ossl_bn_ucmp, 1);
1262
- rb_define_method(cBN, "eql?", ossl_bn_eql, 1);
1263
- rb_define_method(cBN, "hash", ossl_bn_hash, 0);
1264
- rb_define_method(cBN, "==", ossl_bn_eq, 1);
1265
- rb_define_alias(cBN, "===", "==");
1266
- rb_define_method(cBN, "zero?", ossl_bn_is_zero, 0);
1267
- rb_define_method(cBN, "one?", ossl_bn_is_one, 0);
1268
- /* is_word */
1269
- rb_define_method(cBN, "odd?", ossl_bn_is_odd, 0);
1270
- rb_define_method(cBN, "negative?", ossl_bn_is_negative, 0);
1271
-
1272
- /* zero
1273
- * one
1274
- * value_one - DON'T IMPL.
1275
- * set_word
1276
- * get_word */
1277
-
1278
- rb_define_singleton_method(cBN, "rand", ossl_bn_s_rand, -1);
1279
- rb_define_singleton_method(cBN, "rand_range", ossl_bn_s_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");
1282
-
1283
- rb_define_singleton_method(cBN, "generate_prime", ossl_bn_s_generate_prime, -1);
1284
- rb_define_method(cBN, "prime?", ossl_bn_is_prime, -1);
1285
- rb_define_method(cBN, "prime_fasttest?", ossl_bn_is_prime_fasttest, -1);
1286
-
1287
- rb_define_method(cBN, "set_bit!", ossl_bn_set_bit, 1);
1288
- rb_define_method(cBN, "clear_bit!", ossl_bn_clear_bit, 1);
1289
- rb_define_method(cBN, "bit_set?", ossl_bn_is_bit_set, 1);
1290
- rb_define_method(cBN, "mask_bits!", ossl_bn_mask_bits, 1);
1291
- rb_define_method(cBN, "<<", ossl_bn_lshift, 1);
1292
- rb_define_method(cBN, ">>", ossl_bn_rshift, 1);
1293
- rb_define_method(cBN, "lshift!", ossl_bn_self_lshift, 1);
1294
- rb_define_method(cBN, "rshift!", ossl_bn_self_rshift, 1);
1295
- /* lshift1 - DON'T IMPL. */
1296
- /* rshift1 - DON'T IMPL. */
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
-
1315
- /*
1316
- * bn2bin
1317
- * bin2bn
1318
- * bn2hex
1319
- * bn2dec
1320
- * hex2bn
1321
- * dec2bn - all these are implemented in ossl_bn_initialize, and ossl_bn_to_s
1322
- * print - NOT IMPL.
1323
- * print_fp - NOT IMPL.
1324
- * bn2mpi
1325
- * mpi2bn
1326
- */
1327
- rb_define_method(cBN, "to_s", ossl_bn_to_s, -1);
1328
- rb_define_method(cBN, "to_i", ossl_bn_to_i, 0);
1329
- rb_define_alias(cBN, "to_int", "to_i");
1330
- rb_define_method(cBN, "to_bn", ossl_bn_to_bn, 0);
1331
- rb_define_method(cBN, "coerce", ossl_bn_coerce, 1);
1332
-
1333
- /*
1334
- * TODO:
1335
- * But how to: from_bin, from_mpi? PACK?
1336
- * to_bin
1337
- * to_mpi
1338
- */
1339
-
1340
- rb_define_method(cBN, "mod_inverse", ossl_bn_mod_inverse, 1);
1341
-
1342
- /* RECiProcal
1343
- * MONTgomery */
1344
- }