diff options
author | rhe <rhe@ruby-lang.org> | 2016-06-09 12:42:08 +0000 |
---|---|---|
committer | Kazuki Yamaguchi <k@rhe.jp> | 2016-06-19 23:25:32 +0900 |
commit | 97a11542d849101a0f8a7298dfcedb0a3a9189c3 (patch) | |
tree | 635ec7bd06c7b4ed86a5b383313a9319642ffc1e | |
parent | 20ee8b61ad9d8f3920623d3ce0d1bccce7ddaa92 (diff) | |
download | ruby-openssl-97a11542d849101a0f8a7298dfcedb0a3a9189c3.tar.gz |
openssl: use ASN1_ENUMERATED_to_BN() if needed
* ext/openssl/ossl_asn1.c (asn1integer_to_num): Use
ASN1_ENUMERATED_to_BN() to convert an ASN1_ENUMERATED to a BN.
Starting from OpenSSL 1.1.0, ASN1_INTEGER_to_BN() rejects
non-ASN1_INTEGER objects. The format of INTEGER and ENUMERATED are
almost identical so they behaved in the same way in OpenSSL <= 1.0.2.
[ruby-core:75225] [Feature #12324]
* test/openssl/test_asn1.rb (test_decode_enumerated): Test that it
works.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55344 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ext/openssl/ossl_asn1.c | 8 | ||||
-rw-r--r-- | test/test_asn1.rb | 6 |
2 files changed, 12 insertions, 2 deletions
diff --git a/ext/openssl/ossl_asn1.c b/ext/openssl/ossl_asn1.c index 03822b5c..cbedd59e 100644 --- a/ext/openssl/ossl_asn1.c +++ b/ext/openssl/ossl_asn1.c @@ -125,9 +125,13 @@ asn1integer_to_num(ASN1_INTEGER *ai) if (!ai) { ossl_raise(rb_eTypeError, "ASN1_INTEGER is NULL!"); } - if (!(bn = ASN1_INTEGER_to_BN(ai, NULL))) { + if (ai->type == V_ASN1_ENUMERATED) + bn = ASN1_ENUMERATED_to_BN(ai, NULL); + else + bn = ASN1_INTEGER_to_BN(ai, NULL); + + if (!bn) ossl_raise(eOSSLError, NULL); - } #if DO_IT_VIA_RUBY if (!(txt = BN_bn2dec(bn))) { BN_free(bn); diff --git a/test/test_asn1.rb b/test/test_asn1.rb index 96c0859c..f226da5c 100644 --- a/test/test_asn1.rb +++ b/test/test_asn1.rb @@ -280,6 +280,12 @@ rEzBQ0F9dUyqQ9gyRg8KHhDfv9HzT1d/rnUZMkoombwYBRIUChGCYV0GnJcan2Zm assert_equal 2 ** 31, OpenSSL::ASN1.decode(encoded).value.to_i end + def test_decode_enumerated + encoded = OpenSSL::ASN1.Enumerated(0).to_der + assert_equal "\x0a\x01\x00".b, encoded + assert_equal encoded, OpenSSL::ASN1.decode(encoded).to_der + end + def test_create_inf_length_primitive expected = %w{ 24 80 04 01 61 00 00 } raw = [expected.join('')].pack('H*') |