Test that built-in ASN1_STRING_TABLEs are sorted. There's a test in the file under ifdef, but that is not wired up into the build. Change-Id: Iec09277c7ce948c33303d12c325207de2188d908 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/49766 Reviewed-by: Adam Langley <agl@google.com>
diff --git a/crypto/asn1/a_strnid.c b/crypto/asn1/a_strnid.c index f7ad084..299d03b 100644 --- a/crypto/asn1/a_strnid.c +++ b/crypto/asn1/a_strnid.c
@@ -64,6 +64,10 @@ #include <openssl/obj.h> #include <openssl/stack.h> +#include "../internal.h" +#include "internal.h" + + DEFINE_STACK_OF(ASN1_STRING_TABLE) static STACK_OF(ASN1_STRING_TABLE) *stable = NULL; @@ -244,33 +248,8 @@ OPENSSL_free(tbl); } -#ifdef STRING_TABLE_TEST - -int main(void) -{ - ASN1_STRING_TABLE *tmp; - int i, last_nid = -1; - - for (tmp = tbl_standard, i = 0; - i < sizeof(tbl_standard) / sizeof(ASN1_STRING_TABLE); i++, tmp++) { - if (tmp->nid < last_nid) { - last_nid = 0; - break; - } - last_nid = tmp->nid; - } - - if (last_nid != 0) { - printf("Table order OK\n"); - exit(0); - } - - for (tmp = tbl_standard, i = 0; - i < sizeof(tbl_standard) / sizeof(ASN1_STRING_TABLE); i++, tmp++) - printf("Index %d, NID %d, Name=%s\n", i, tmp->nid, - OBJ_nid2ln(tmp->nid)); - - return 0; +void asn1_get_string_table_for_testing(const ASN1_STRING_TABLE **out_ptr, + size_t *out_len) { + *out_ptr = tbl_standard; + *out_len = OPENSSL_ARRAY_SIZE(tbl_standard); } - -#endif
diff --git a/crypto/asn1/asn1_test.cc b/crypto/asn1/asn1_test.cc index 9119dea..49a0c27 100644 --- a/crypto/asn1/asn1_test.cc +++ b/crypto/asn1/asn1_test.cc
@@ -30,6 +30,7 @@ #include <openssl/x509v3.h> #include "../test/test_util.h" +#include "internal.h" // kTag128 is an ASN.1 structure with a universal tag with number 128. @@ -1119,6 +1120,15 @@ EXPECT_EQ(-1, i2d_DIRECTORYSTRING(obj.get(), nullptr)); } +TEST(ASN1Test, StringTableSorted) { + const ASN1_STRING_TABLE *table; + size_t table_len; + asn1_get_string_table_for_testing(&table, &table_len); + for (size_t i = 1; i < table_len; i++) { + EXPECT_LT(table[i-1].nid, table[i].nid); + } +} + // The ASN.1 macros do not work on Windows shared library builds, where usage of // |OPENSSL_EXPORT| is a bit stricter. #if !defined(OPENSSL_WINDOWS) || !defined(BORINGSSL_SHARED_LIBRARY)
diff --git a/crypto/asn1/internal.h b/crypto/asn1/internal.h index a4bd34e..cab0c77 100644 --- a/crypto/asn1/internal.h +++ b/crypto/asn1/internal.h
@@ -175,6 +175,11 @@ * ASN.1 PrintableString, and zero otherwise. */ int asn1_is_printable(uint32_t value); +/* asn1_get_string_table_for_testing sets |*out_ptr| and |*out_len| to the table + * of built-in |ASN1_STRING_TABLE| values. It is exported for testing. */ +OPENSSL_EXPORT void asn1_get_string_table_for_testing( + const ASN1_STRING_TABLE **out_ptr, size_t *out_len); + #if defined(__cplusplus) } /* extern C */