Class: OpenSSL::BN

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/openssl/bn.rb,
ext/rubysl/openssl/ossl_bn.c

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ Object

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) => aBN

Construct a new OpenSSL BigNum object.



151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
# File 'ext/rubysl/openssl/ossl_bn.c', line 151

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

Class Method Details

.generate_primeObject

.pseudo_randObject

BN.pseudo_rand(bits [, fill [, odd]]) -> aBN

.pseudo_rand_rangeObject

BN.pseudo_rand_range(range) -> aBN

.randObject

BN.rand(bits [, fill [, odd]]) -> aBN

.rand_rangeObject

BN.rand_range(range) -> aBN

Instance Method Details

#%Object

bn % bn2 => aBN

#*Object

bn * bn2 => aBN

#**Object

bn ** bn2 => aBN

#+Object

bn + bn2 => aBN

#-Object

bn - bn2 => aBN

#/Object

bn1 / bn2 => [result, remainder]

Division of OpenSSL::BN instances

#<<(bits) ⇒ Object

#==Object Also known as: ===

#>>(bits) ⇒ Object

#bit_set?Boolean

Returns boolean of whether bit is set. Bitwise operations for openssl BIGNUMs.

bn.bit_set?(bit) => true | false

Returns:

  • (Boolean)

#clear_bit!Object

bn.clear_bit!(bit) -> self

#cmpObject Also known as: <=>

bn.cmp(bn2) => integer

#coerce(other) ⇒ Object



322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
# File 'ext/rubysl/openssl/ossl_bn.c', line 322

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

#copyObject

#eql?(obj) ⇒ Boolean

Returns true only if obj is a OpenSSL::BN with the same value as big. Contrast this with OpenSSL::BN#==, which performs type conversions.

Returns:

  • (Boolean)


878
879
880
881
882
883
884
885
886
887
888
889
# File 'ext/rubysl/openssl/ossl_bn.c', line 878

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

#gcdObject

bn.gcd(bn2) => aBN

#hashInteger

Returns a hash code for this object.

See also Object#hash.

Returns:



899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
# File 'ext/rubysl/openssl/ossl_bn.c', line 899

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 = INT2FIX(rb_memhash(buf, len));
    xfree(buf);

    return hash;
}

#lshift!Object

bn.lshift!(bits) -> self

#mask_bits!Object

#mod_addObject

bn.mod_add(bn1, bn2) -> aBN

#mod_expObject

bn.mod_exp(bn1, bn2) -> aBN

#mod_inverseObject

bn.mod_inverse(bn2) => aBN

#mod_mulObject

bn.mod_mul(bn1, bn2) -> aBN

#mod_sqrObject

bn.mod_sqr(bn2) => aBN

#mod_subObject

bn.mod_sub(bn1, bn2) -> aBN

#num_bitsObject

bn.num_bits => integer

#num_bytesObject

bn.num_bytes => integer

#odd?Boolean

bn.odd? => true | false

Returns:

  • (Boolean)

#one?Boolean

bn.one? => true | false

Returns:

  • (Boolean)

#pretty_print(q) ⇒ Object



20
21
22
23
24
25
# File 'lib/openssl/bn.rb', line 20

def pretty_print(q)
  q.object_group(self) {
    q.text ' '
    q.text to_i.to_s
  }
end

#prime?Boolean #prime?(checks) ⇒ Boolean

Parameters

  • checks - integer

Returns:

  • (Boolean)


929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
# File 'ext/rubysl/openssl/ossl_bn.c', line 929

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

#prime_fasttest?Boolean #prime_fasttest?(checks) ⇒ Boolean #prime_fasttest?(checks, trial_div) ⇒ Boolean

Parameters

  • checks - integer

  • trial_div - boolean

Returns:

  • (Boolean)


962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
# File 'ext/rubysl/openssl/ossl_bn.c', line 962

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

#rshift!Object

bn.rshift!(bits) -> self

#set_bit!Object

bn.set_bit!(bit) -> self

#sqrObject

bn.sqr => aBN

#to_bnObject



316
317
318
319
320
# File 'ext/rubysl/openssl/ossl_bn.c', line 316

static VALUE
ossl_bn_to_bn(VALUE self)
{
    return self;
}

#to_iInteger Also known as: to_int

Returns:



298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
# File 'ext/rubysl/openssl/ossl_bn.c', line 298

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

#to_sString #to_s(base) ⇒ String

Parameters

  • base - integer

    • Valid values:

      • 0 - MPI

      • 2 - binary

      • 10 - the default

      • 16 - hex

Overloads:

  • #to_sString

    Returns:

    • (String)
  • #to_s(base) ⇒ String

    Returns:

    • (String)


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
# File 'ext/rubysl/openssl/ossl_bn.c', line 254

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

#ucmpObject

bn.ucmp(bn2) => integer

#zero?Boolean

bn.zero? => true | false

Returns:

  • (Boolean)