diff options
author | Michal Rokos <m.rokos@sh.cvut.cz> | 2002-01-06 16:09:45 +0000 |
---|---|---|
committer | Michal Rokos <m.rokos@sh.cvut.cz> | 2002-01-06 16:09:45 +0000 |
commit | 2253db99c8dc924ecf5dd103740a033d54426330 (patch) | |
tree | 7fad037117681f344c0b31bd167d7aa840e881a2 /ossl_bn.c | |
parent | 9951f389c1a4df41cbd1a68f5fb04378948f369a (diff) | |
download | ruby-openssl-history-2253db99c8dc924ecf5dd103740a033d54426330.tar.gz |
* BN is (somewhat) full imp. now
* Config reworked (get_value, get_section)
Diffstat (limited to 'ossl_bn.c')
-rw-r--r-- | ossl_bn.c | 101 |
1 files changed, 101 insertions, 0 deletions
@@ -499,6 +499,41 @@ ossl_bn_s_rand_range(VALUE klass, VALUE range) return ossl_bn_new_nodup(result); } +static VALUE +ossl_bn_s_generate_prime(int argc, VALUE *argv, VALUE klass) +{ + ossl_bn *bn1p, *bn2p; + BIGNUM *result = NULL, *add = NULL, *rem = NULL; + int safe = 1; + VALUE vnum, vsafe, vadd, vrem; + + rb_scan_args(argc, argv, "13", &vnum, &vsafe, &vadd, &vrem); + + if (vsafe == Qfalse) + safe = 0; + + if (!NIL_P(vadd)) { + if (NIL_P(vrem)) + rb_raise(rb_eArgError, "if add specified, rem must be also given"); + + OSSL_Check_Type(vadd, cBN); + OSSL_Check_Type(vrem, cBN); + + GetBN(vadd, bn1p); + add = bn1p->bignum; + GetBN(vrem, bn2p); + rem = bn2p->bignum; + } + + if (!(result = BN_new())) + OSSL_Raise(eBNError, ""); + + if (!BN_generate_prime(result, NUM2INT(vnum), safe, add, rem, NULL, NULL)) + OSSL_Raise(eBNError, ""); + + return ossl_bn_new_nodup(result); +} + #define BIGNUM_RETURN_INT(func) \ static VALUE \ ossl_bn_##func(VALUE self) \ @@ -547,6 +582,68 @@ ossl_bn_eql(VALUE self, VALUE other) return Qfalse; } +static VALUE +ossl_bn_is_prime(int argc, VALUE *argv, VALUE self) +{ + ossl_bn *bnp = NULL; + BN_CTX ctx; + VALUE vchecks; + int checks = BN_prime_checks; + + rb_scan_args(argc, argv, "01", &vchecks); + + GetBN(self, bnp); + + if (!NIL_P(vchecks)) + checks = NUM2INT(vchecks); + + BN_CTX_init(&ctx); + switch (BN_is_prime(bnp->bignum, checks, NULL, &ctx, NULL)) { + case 1: + return Qtrue; + case 0: + return Qfalse; + default: + OSSL_Raise(eBNError, ""); + } + + /* not reachable */ + return Qnil; +} + +static VALUE +ossl_bn_is_prime_fasttest(int argc, VALUE *argv, VALUE self) +{ + ossl_bn *bnp = NULL; + BN_CTX ctx; + VALUE vchecks, vtrivdiv; + int checks = BN_prime_checks, do_trial_division = 1; + + rb_scan_args(argc, argv, "02", &vchecks, &vtrivdiv); + + GetBN(self, bnp); + + if (!NIL_P(vchecks)) + checks = NUM2INT(vchecks); + + /* handle true/false */ + if (vtrivdiv == Qfalse) + do_trial_division = 0; + + BN_CTX_init(&ctx); + switch (BN_is_prime_fasttest(bnp->bignum, checks, NULL, &ctx, NULL, do_trial_division)) { + case 1: + return Qtrue; + case 0: + return Qfalse; + default: + OSSL_Raise(eBNError, ""); + } + + /* not reachable */ + return Qnil; +} + /* * INIT */ @@ -599,6 +696,7 @@ Init_bn(VALUE module) rb_define_singleton_method(cBN, "rand", ossl_bn_s_rand, 3); rb_define_singleton_method(cBN, "pseudo_rand", ossl_bn_s_pseudo_rand, 3); rb_define_singleton_method(cBN, "rand_range", ossl_bn_s_rand_range, 1); + rb_define_singleton_method(cBN, "generate_prime", ossl_bn_s_generate_prime, -1); rb_define_method(cBN, "num_bytes", ossl_bn_num_bytes, 0); rb_define_method(cBN, "num_bits", ossl_bn_num_bits, 0); @@ -612,5 +710,8 @@ Init_bn(VALUE module) rb_define_method(cBN, "eql?", ossl_bn_eql, 1); rb_define_alias(cBN, "==", "eql?"); rb_define_alias(cBN, "===", "eql?"); + + rb_define_method(cBN, "prime?", ossl_bn_is_prime, -1); + rb_define_method(cBN, "prime_fasttest?", ossl_bn_is_prime_fasttest, -1); } |