Add tests for X509_NAME_hash and X509_NAME_hash_old. These values figure into X509_LOOKUP_hash_dir's on-disk format, so they must remain stable. Record a couple of values to ensure this remains the case. Change-Id: I63afa970f8564e0836d78d00375eb5cd6d383bea Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56485 Reviewed-by: Bob Beck <bbe@google.com> Auto-Submit: David Benjamin <davidben@google.com> Commit-Queue: Bob Beck <bbe@google.com>
diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc index 93dccda..ebd8262 100644 --- a/crypto/x509/x509_test.cc +++ b/crypto/x509/x509_test.cc
@@ -2547,6 +2547,67 @@ EXPECT_EQ(X509_NAME_ENTRY_set(X509_NAME_get_entry(name.get(), 2)), 2); } +// Tests that |X509_NAME_hash| and |X509_NAME_hash_old|'s values never change. +// These functions figure into |X509_LOOKUP_hash_dir|'s on-disk format, so they +// must remain stable. In particular, if we ever remove name canonicalization, +// we'll need to preserve it for |X509_NAME_hash|. +TEST(X509Test, NameHash) { + struct { + std::vector<uint8_t> name_der; + unsigned long hash; + unsigned long hash_old; + } kTests[] = { + // SEQUENCE { + // SET { + // SEQUENCE { + // # commonName + // OBJECT_IDENTIFIER { 2.5.4.3 } + // UTF8String { "Test Name" } + // } + // } + // } + {{0x30, 0x14, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0c, 0x09, 0x54, 0x65, 0x73, 0x74, 0x20, 0x4e, 0x61, 0x6d, 0x65}, + 0xc90fba01, + 0x8c0d4fea}, + + // This name canonicalizes to the same value, with OpenSSL's algorithm, as + // the above input, so |hash| matches. |hash_old| doesn't use + // canonicalization and does not match. + // + // SEQUENCE { + // SET { + // SEQUENCE { + // # commonName + // OBJECT_IDENTIFIER { 2.5.4.3 } + // BMPString { + // u"\x09\n\x0b\x0c\x0d tEST\x09\n\x0b\x0c\x0d " + // u"\x09\n\x0b\x0c\x0d nAME\x09\n\x0b\x0c\x0d " + // } + // } + // } + // } + {{0x30, 0x4b, 0x31, 0x49, 0x30, 0x47, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x1e, 0x40, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, + 0x0d, 0x00, 0x20, 0x00, 0x74, 0x00, 0x45, 0x00, 0x53, 0x00, 0x54, + 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, + 0x20, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, + 0x00, 0x20, 0x00, 0x6e, 0x00, 0x41, 0x00, 0x4d, 0x00, 0x45, 0x00, + 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x20}, + 0xc90fba01, + 0xbe2dd8c8}, + }; + for (const auto &t : kTests) { + SCOPED_TRACE(Bytes(t.name_der)); + const uint8_t *der = t.name_der.data(); + bssl::UniquePtr<X509_NAME> name( + d2i_X509_NAME(nullptr, &der, t.name_der.size())); + ASSERT_TRUE(name); + EXPECT_EQ(t.hash, X509_NAME_hash(name.get())); + EXPECT_EQ(t.hash_old, X509_NAME_hash_old(name.get())); + } +} + TEST(X509Test, NoBasicConstraintsCertSign) { bssl::UniquePtr<X509> root(CertFromPEM(kSANTypesRoot)); bssl::UniquePtr<X509> intermediate(