Method: OpenSSL::BN#initialize

Defined in:
ossl_bn.c

#OpenSSL::BN.new(bn) ⇒ Object #OpenSSL::BN.new(integer) ⇒ Object #OpenSSL::BN.new(string, base = 10) ⇒ Object

Construct a new OpenSSL BIGNUM object.

If bn is an Integer or OpenSSL::BN, a new instance of OpenSSL::BN representing the same value is returned. See also Integer#to_bn for the short-hand.

If a String is given, the content will be parsed according to base.

string

The string to be parsed.

base

The format. Must be one of the following:

  • 0 - MPI format. See the man page BN_mpi2bn(3) for details.

  • 2 - Variable-length and big-endian binary encoding of a positive number.

  • 10 - Decimal number representation, with a leading ‘-’ for a negative number.

  • 16 - Hexadeciaml number representation, with a leading ‘-’ for a negative number.



250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
# File 'ossl_bn.c', line 250

static VALUE
ossl_bn_initialize(int argc, VALUE *argv, VALUE self)
{
    BIGNUM *bn;
    VALUE str, bs;
    int base = 10;
    char *ptr;

    if (rb_scan_args(argc, argv, "11", &str, &bs) == 2) {
  base = NUM2INT(bs);
    }

    if (NIL_P(str)) {
        ossl_raise(rb_eArgError, "invalid argument");
    }

    if (RB_INTEGER_TYPE_P(str)) {
  GetBN(self, bn);
  integer_to_bnptr(str, bn);

  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;
    }

    GetBN(self, bn);
    switch (base) {
    case 0:
        ptr = StringValuePtr(str);
        if (!BN_mpi2bn((unsigned char *)ptr, RSTRING_LENINT(str), bn)) {
      ossl_raise(eBNError, NULL);
  }
  break;
    case 2:
        ptr = StringValuePtr(str);
        if (!BN_bin2bn((unsigned char *)ptr, RSTRING_LENINT(str), bn)) {
      ossl_raise(eBNError, NULL);
  }
  break;
    case 10:
  if (!BN_dec2bn(&bn, StringValueCStr(str))) {
      ossl_raise(eBNError, NULL);
  }
  break;
    case 16:
  if (!BN_hex2bn(&bn, StringValueCStr(str))) {
      ossl_raise(eBNError, NULL);
  }
  break;
    default:
  ossl_raise(rb_eArgError, "invalid radix %d", base);
    }
    return self;
}