diff --git a/ext/openssl/ossl_asn1.c b/ext/openssl/ossl_asn1.c index af8ae2a68..534796f52 100644 --- a/ext/openssl/ossl_asn1.c +++ b/ext/openssl/ossl_asn1.c @@ -47,9 +47,15 @@ asn1time_to_time(const ASN1_TIME *time) } break; case V_ASN1_GENERALIZEDTIME: - if (sscanf((const char *)time->data, "%4d%2d%2d%2d%2d%2dZ", &tm.tm_year, &tm.tm_mon, - &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec) != 6) { - ossl_raise(rb_eTypeError, "bad GENERALIZEDTIME format" ); + count = sscanf((const char *)time->data, "%4d%2d%2d%2d%2d%2dZ", + &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, + &tm.tm_sec); + if (count == 5) { + tm.tm_sec = 0; + } + else if (count != 6) { + ossl_raise(rb_eTypeError, "bad GENERALIZEDTIME format: \"%s\"", + time->data); } break; default: diff --git a/test/test_asn1.rb b/test/test_asn1.rb index 3a4354144..a0ac1ddbf 100644 --- a/test/test_asn1.rb +++ b/test/test_asn1.rb @@ -275,6 +275,14 @@ def test_encode_utctime_2k38 assert_equal 2 ** 31, OpenSSL::ASN1.decode(encoded).value.to_i end + def test_decode_generalisedtime + expected = Time.at 1481225640 + assert_equal expected, OpenSSL::ASN1.decode("\x18\x0D201612081934Z").value + + expected += 29 + assert_equal expected, OpenSSL::ASN1.decode("\x18\x0F20161208193429Z").value + end + def test_decode_enumerated encoded = OpenSSL::ASN1.Enumerated(0).to_der assert_equal "\x0a\x01\x00".b, encoded