diff options
-rw-r--r-- | ext/openssl/ossl_bn.c | 16 | ||||
-rw-r--r-- | test/test_bn.rb | 6 |
2 files changed, 22 insertions, 0 deletions
diff --git a/ext/openssl/ossl_bn.c b/ext/openssl/ossl_bn.c index 1afebf44..dfe1b268 100644 --- a/ext/openssl/ossl_bn.c +++ b/ext/openssl/ossl_bn.c @@ -377,6 +377,21 @@ BIGNUM_BOOL1(is_one) */ BIGNUM_BOOL1(is_odd) +/* + * call-seq: + * bn.negative? => true | false + */ +static VALUE +ossl_bn_is_negative(VALUE self) +{ + BIGNUM *bn; + + GetBN(self, bn); + if (BN_is_zero(bn)) + return Qfalse; + return BN_is_negative(bn) ? Qtrue : Qfalse; +} + #define BIGNUM_1c(func) \ static VALUE \ ossl_bn_##func(VALUE self) \ @@ -1135,6 +1150,7 @@ Init_ossl_bn(void) rb_define_method(cBN, "one?", ossl_bn_is_one, 0); /* is_word */ rb_define_method(cBN, "odd?", ossl_bn_is_odd, 0); + rb_define_method(cBN, "negative?", ossl_bn_is_negative, 0); /* zero * one diff --git a/test/test_bn.rb b/test/test_bn.rb index ac4334fd..149c976d 100644 --- a/test/test_bn.rb +++ b/test/test_bn.rb @@ -99,6 +99,12 @@ class OpenSSL::TestBN < OpenSSL::TestCase assert_equal(false, 2.to_bn.odd?) end + def test_negative_p + assert_equal(false, 0.to_bn.negative?) + assert_equal(false, @e1.negative?) + assert_equal(true, @e2.negative?) + end + def test_sqr assert_equal(1, 1.to_bn.sqr) assert_equal(100, 10.to_bn.sqr) |