On this page
class OpenSSL::BN
Public Class Methods
static VALUE
ossl_bn_s_generate_prime(int argc, VALUE *argv, VALUE klass)
{
    BIGNUM *add = NULL, *rem = NULL, *result;
    int safe = 1, num;
    VALUE vnum, vsafe, vadd, vrem, obj;
    rb_scan_args(argc, argv, "13", &vnum, &vsafe, &vadd, &vrem);
    num = NUM2INT(vnum);
    if (vsafe == Qfalse) {
        safe = 0;
    }
    if (!NIL_P(vadd)) {
        add = GetBNPtr(vadd);
        rem = NIL_P(vrem) ? NULL : GetBNPtr(vrem);
    }
    obj = NewBN(klass);
    if (!(result = BN_new())) {
        ossl_raise(eBNError, NULL);
    }
    if (!BN_generate_prime(result, num, safe, add, rem, NULL, NULL)) {
        BN_free(result);
        ossl_raise(eBNError, NULL);
    }
    SetBN(obj, result);
    return obj;
}Parameters
static VALUE
ossl_bn_initialize(int argc, VALUE *argv, VALUE self)
{
    BIGNUM *bn;
    VALUE str, bs;
    int base = 10;
    if (rb_scan_args(argc, argv, "11", &str, &bs) == 2) {
        base = NUM2INT(bs);
    }
    if (RB_TYPE_P(str, T_FIXNUM)) {
        long i;
        unsigned char bin[sizeof(long)];
        long n = FIX2LONG(str);
        unsigned long un = labs(n);
        for (i = sizeof(long) - 1; 0 <= i; i--) {
            bin[i] = un&0xff;
            un >>= 8;
        }
        GetBN(self, bn);
        if (!BN_bin2bn(bin, sizeof(bin), bn)) {
            ossl_raise(eBNError, NULL);
        }
        if (n < 0) BN_set_negative(bn, 1);
        return self;
    }
    else if (RB_TYPE_P(str, T_BIGNUM)) {
        size_t len = rb_absint_size(str, NULL);
        unsigned char *bin;
        VALUE buf;
        int sign;
        if (INT_MAX < len) {
            rb_raise(eBNError, "bignum too long");
        }
        bin = (unsigned char*)ALLOCV_N(unsigned char, buf, len);
        sign = rb_integer_pack(str, bin, len, 1, 0, INTEGER_PACK_BIG_ENDIAN);
        GetBN(self, bn);
        if (!BN_bin2bn(bin, (int)len, bn)) {
            ALLOCV_END(buf);
            ossl_raise(eBNError, NULL);
        }
        ALLOCV_END(buf);
        if (sign < 0) BN_set_negative(bn, 1);
        return self;
    }
    if (RTEST(rb_obj_is_kind_of(str, cBN))) {
        BIGNUM *other;
        GetBN(self, bn);
        GetBN(str, other); /* Safe - we checked kind_of? above */
        if (!BN_copy(bn, other)) {
            ossl_raise(eBNError, NULL);
        }
        return self;
    }
    StringValue(str);
    GetBN(self, bn);
    switch (base) {
    case 0:
        if (!BN_mpi2bn((unsigned char *)RSTRING_PTR(str), RSTRING_LENINT(str), bn)) {
            ossl_raise(eBNError, NULL);
        }
        break;
    case 2:
        if (!BN_bin2bn((unsigned char *)RSTRING_PTR(str), RSTRING_LENINT(str), bn)) {
            ossl_raise(eBNError, NULL);
        }
        break;
    case 10:
        if (!BN_dec2bn(&bn, RSTRING_PTR(str))) {
            ossl_raise(eBNError, NULL);
        }
        break;
    case 16:
        if (!BN_hex2bn(&bn, RSTRING_PTR(str))) {
            ossl_raise(eBNError, NULL);
        }
        break;
    default:
        ossl_raise(rb_eArgError, "invalid radix %d", base);
    }
    return self;
}OpenSSL::BN.new => aBN
OpenSSL::BN.new(bn) => aBN
OpenSSL::BN.new(integer) => aBN
OpenSSL::BN.new(string) => aBN
OpenSSL::BN.new(string, 0 | 2 | 10 | 16) => aBNConstruct a new OpenSSL BigNum object.
Public Instance Methods
bn % bn2 => aBN
bn * bn2 => aBN
bn ** bn2 => aBN
bn + bn2 => aBN
bn - bn2 => aBN
static VALUE
ossl_bn_div(VALUE self, VALUE other)
{
    BIGNUM *bn1, *bn2 = GetBNPtr(other), *r1, *r2;
    VALUE obj1, obj2;
    GetBN(self, bn1);
    obj1 = NewBN(CLASS_OF(self));
    obj2 = NewBN(CLASS_OF(self));
    if (!(r1 = BN_new())) {
        ossl_raise(eBNError, NULL);
    }
    if (!(r2 = BN_new())) {
        BN_free(r1);
        ossl_raise(eBNError, NULL);
    }
    if (!BN_div(r1, r2, bn1, bn2, ossl_bn_ctx)) {
        BN_free(r1);
        BN_free(r2);
        ossl_raise(eBNError, NULL);
    }
    SetBN(obj1, r1);
    SetBN(obj2, r2);
    return rb_ary_new3(2, obj1, obj2);
}bn1 / bn2 => [result, remainder]Division of OpenSSL::BN instances
static VALUE
ossl_bn_eq(VALUE self, VALUE other)
{
    BIGNUM *bn1, *bn2;
    GetBN(self, bn1);
    /* BNPtr may raise, so we can't use here */
    bn2 = try_convert_to_bnptr(other);
    if (bn2 && !BN_cmp(bn1, bn2)) {
        return Qtrue;
    }
    return Qfalse;
}Returns true only if obj has the same value as bn. Contrast this with #eql?, which requires obj to be OpenSSL::BN.
static VALUE
ossl_bn_is_bit_set(VALUE self, VALUE bit)
{
    int b;
    BIGNUM *bn;
    b = NUM2INT(bit);
    GetBN(self, bn);
    if (BN_is_bit_set(bn, b)) {
        return Qtrue;
    }
    return Qfalse;
}Returns boolean of whether bit is set. Bitwise operations for openssl BIGNUMs.
bn.bit_set?(bit) => true | falsebn.clear_bit!(bit) -> self
static VALUE
ossl_bn_coerce(VALUE self, VALUE other)
{
    switch(TYPE(other)) {
    case T_STRING:
        self = ossl_bn_to_s(0, NULL, self);
        break;
    case T_FIXNUM:
    case T_BIGNUM:
        self = ossl_bn_to_i(self);
        break;
    default:
        if (!RTEST(rb_obj_is_kind_of(other, cBN))) {
            ossl_raise(rb_eTypeError, "Don't know how to coerce");
        }
    }
    return rb_assoc_new(other, self);
}static VALUE
ossl_bn_copy(VALUE self, VALUE other)
{
    BIGNUM *bn1, *bn2;
    rb_check_frozen(self);
    if (self == other) return self;
    GetBN(self, bn1);
    bn2 = GetBNPtr(other);
    if (!BN_copy(bn1, bn2)) {
        ossl_raise(eBNError, NULL);
    }
    return self;
}static VALUE
ossl_bn_eql(VALUE self, VALUE other)
{
    BIGNUM *bn1, *bn2;
    if (!rb_obj_is_kind_of(other, cBN))
        return Qfalse;
    GetBN(self, bn1);
    GetBN(other, bn2);
    return BN_cmp(bn1, bn2) ? Qfalse : Qtrue;
}Returns true only if obj is a OpenSSL::BN with the same value as big. Contrast this with OpenSSL::BN#==, which performs type conversions.
bn.gcd(bn2) => aBN
static VALUE
ossl_bn_hash(VALUE self)
{
    BIGNUM *bn;
    VALUE hash;
    unsigned char *buf;
    int len;
    GetBN(self, bn);
    len = BN_num_bytes(bn);
    buf = xmalloc(len);
    if (BN_bn2bin(bn, buf) != len) {
        xfree(buf);
        ossl_raise(eBNError, NULL);
    }
    hash = LONG2FIX((long)rb_memhash(buf, len));
    xfree(buf);
    return hash;
}Returns a hash code for this object.
See also Object#hash.
bn.lshift!(bits) -> self
bn.mod_add(bn1, bn2) -> aBN
bn.mod_exp(bn1, bn2) -> aBN
bn.mod_inverse(bn2) => aBN
bn.mod_mul(bn1, bn2) -> aBN
bn.mod_sqr(bn2) => aBN
bn.mod_sub(bn1, bn2) -> aBN
bn.num_bits => integer
bn.num_bytes => integer
bn.odd? => true | false
bn.one? => true | false
# File ext/openssl/lib/openssl/bn.rb, line 20
def pretty_print(q)
  q.object_group(self) {
    q.text ' '
    q.text to_i.to_s
  }
endstatic VALUE
ossl_bn_is_prime(int argc, VALUE *argv, VALUE self)
{
    BIGNUM *bn;
    VALUE vchecks;
    int checks = BN_prime_checks;
    if (rb_scan_args(argc, argv, "01", &vchecks) == 1) {
        checks = NUM2INT(vchecks);
    }
    GetBN(self, bn);
    switch (BN_is_prime(bn, checks, NULL, ossl_bn_ctx, NULL)) {
    case 1:
        return Qtrue;
    case 0:
        return Qfalse;
    default:
        ossl_raise(eBNError, NULL);
    }
    /* not reachable */
    return Qnil;
}Parameters
- checks- integer
static VALUE
ossl_bn_is_prime_fasttest(int argc, VALUE *argv, VALUE self)
{
    BIGNUM *bn;
    VALUE vchecks, vtrivdiv;
    int checks = BN_prime_checks, do_trial_division = 1;
    rb_scan_args(argc, argv, "02", &vchecks, &vtrivdiv);
    if (!NIL_P(vchecks)) {
        checks = NUM2INT(vchecks);
    }
    GetBN(self, bn);
    /* handle true/false */
    if (vtrivdiv == Qfalse) {
        do_trial_division = 0;
    }
    switch (BN_is_prime_fasttest(bn, checks, NULL, ossl_bn_ctx, NULL, do_trial_division)) {
    case 1:
        return Qtrue;
    case 0:
        return Qfalse;
    default:
        ossl_raise(eBNError, NULL);
    }
    /* not reachable */
    return Qnil;
}Parameters
- checks- integer
- trial_div- boolean
bn.rshift!(bits) -> self
bn.set_bit!(bit) -> self
bn.sqr => aBN
static VALUE
ossl_bn_to_bn(VALUE self)
{
    return self;
}static VALUE
ossl_bn_to_i(VALUE self)
{
    BIGNUM *bn;
    char *txt;
    VALUE num;
    GetBN(self, bn);
    if (!(txt = BN_bn2hex(bn))) {
        ossl_raise(eBNError, NULL);
    }
    num = rb_cstr_to_inum(txt, 16, Qtrue);
    OPENSSL_free(txt);
    return num;
}static VALUE
ossl_bn_to_s(int argc, VALUE *argv, VALUE self)
{
    BIGNUM *bn;
    VALUE str, bs;
    int base = 10, len;
    char *buf;
    if (rb_scan_args(argc, argv, "01", &bs) == 1) {
        base = NUM2INT(bs);
    }
    GetBN(self, bn);
    switch (base) {
    case 0:
        len = BN_bn2mpi(bn, NULL);
        str = rb_str_new(0, len);
        if (BN_bn2mpi(bn, (unsigned char *)RSTRING_PTR(str)) != len)
            ossl_raise(eBNError, NULL);
        break;
    case 2:
        len = BN_num_bytes(bn);
        str = rb_str_new(0, len);
        if (BN_bn2bin(bn, (unsigned char *)RSTRING_PTR(str)) != len)
            ossl_raise(eBNError, NULL);
        break;
    case 10:
        if (!(buf = BN_bn2dec(bn))) ossl_raise(eBNError, NULL);
        str = ossl_buf2str(buf, rb_long2int(strlen(buf)));
        break;
    case 16:
        if (!(buf = BN_bn2hex(bn))) ossl_raise(eBNError, NULL);
        str = ossl_buf2str(buf, rb_long2int(strlen(buf)));
        break;
    default:
        ossl_raise(rb_eArgError, "invalid radix %d", base);
    }
    return str;
}Parameters
- base- integer
- 
        - Valid values: 
 
- 
        - 
          - 0 - MPI 
 
 
- 
          
- 
        - 
          - 2 - binary 
 
 
- 
          
- 
        - 
          - 10 - the default 
 
 
- 
          
- 
        - 
          - 16 - hex 
 
 
- 
          
bn.ucmp(bn2) => integer
bn.zero? => true | false
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.