diff options
Diffstat (limited to 'crypto/asn1/asn1_test.cc')
-rw-r--r-- | crypto/asn1/asn1_test.cc | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/crypto/asn1/asn1_test.cc b/crypto/asn1/asn1_test.cc index 1044f7b2..8b024427 100644 --- a/crypto/asn1/asn1_test.cc +++ b/crypto/asn1/asn1_test.cc @@ -21,6 +21,11 @@ #include "../test/scoped_types.h" +// kTag128 is an ASN.1 structure with a universal tag with number 128. +static const uint8_t kTag128[] = { + 0x1f, 0x81, 0x00, 0x01, 0x00, +}; + // kTag258 is an ASN.1 structure with a universal tag with number 258. static const uint8_t kTag258[] = { 0x1f, 0x82, 0x02, 0x01, 0x00, @@ -29,13 +34,38 @@ static const uint8_t kTag258[] = { static_assert(V_ASN1_NEG_INTEGER == 258, "V_ASN1_NEG_INTEGER changed. Update kTag258 to collide with it."); -bool TestLargeTags() { +// kTagOverflow is an ASN.1 structure with a universal tag with number 2^35-1, +// which will not fit in an int. +static const uint8_t kTagOverflow[] = { + 0x1f, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x01, 0x00, +}; + +static bool TestLargeTags() { const uint8_t *p = kTag258; ScopedASN1_TYPE obj(d2i_ASN1_TYPE(NULL, &p, sizeof(kTag258))); if (obj) { fprintf(stderr, "Parsed value with illegal tag (type = %d).\n", obj->type); return false; } + ERR_clear_error(); + + p = kTagOverflow; + obj.reset(d2i_ASN1_TYPE(NULL, &p, sizeof(kTagOverflow))); + if (obj) { + fprintf(stderr, "Parsed value with tag overflow (type = %d).\n", obj->type); + return false; + } + ERR_clear_error(); + + p = kTag128; + obj.reset(d2i_ASN1_TYPE(NULL, &p, sizeof(kTag128))); + if (!obj || obj->type != 128 || obj->value.asn1_string->length != 1 || + obj->value.asn1_string->data[0] != 0) { + fprintf(stderr, "Failed to parse value with tag 128.\n"); + ERR_print_errors_fp(stderr); + return false; + } + return true; } |