2 * Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
10 /* Regression tests for ASN.1 parsing bugs. */
17 #include <openssl/asn1.h>
18 #include <openssl/asn1t.h>
19 #include <openssl/bio.h>
20 #include <openssl/err.h>
21 #include <openssl/x509.h>
22 #include <openssl/x509v3.h>
23 #include "internal/nelem.h"
25 static const ASN1_ITEM
*item_type
;
26 static const char *test_file
;
39 expected_error_t code
;
42 static expected_error_t expected_error
= ASN1_UNKNOWN
;
44 static int test_bad_asn1(void)
47 ASN1_VALUE
*value
= NULL
;
49 unsigned char buf
[2048];
50 const unsigned char *buf_ptr
= buf
;
51 unsigned char *der
= NULL
;
55 bio
= BIO_new_file(test_file
, "r");
59 if (expected_error
== ASN1_BIO
) {
60 if (TEST_ptr_null(ASN1_item_d2i_bio(item_type
, bio
, NULL
)))
66 * Unless we are testing it we don't use ASN1_item_d2i_bio because it
67 * performs sanity checks on the input and can reject it before the
70 len
= BIO_read(bio
, buf
, sizeof(buf
));
71 if (!TEST_int_ge(len
, 0))
74 value
= ASN1_item_d2i(NULL
, &buf_ptr
, len
, item_type
);
76 if (TEST_int_eq(expected_error
, ASN1_DECODE
))
81 derlen
= ASN1_item_i2d(value
, &der
, item_type
);
83 if (der
== NULL
|| derlen
< 0) {
84 if (TEST_int_eq(expected_error
, ASN1_ENCODE
))
89 if (derlen
!= len
|| memcmp(der
, buf
, derlen
) != 0) {
90 if (TEST_int_eq(expected_error
, ASN1_COMPARE
))
95 if (TEST_int_eq(expected_error
, ASN1_OK
))
99 /* Don't indicate success for memory allocation errors */
101 && !TEST_false(ERR_GET_REASON(ERR_peek_error()) == ERR_R_MALLOC_FAILURE
))
105 ASN1_item_free(value
, item_type
);
109 OPT_TEST_DECLARE_USAGE("item_name expected_error test_file.der\n")
112 * Usage: d2i_test <name> <type> <file>, e.g.
113 * d2i_test generalname bad_generalname.der
115 int setup_tests(void)
117 const char *test_type_name
;
118 const char *expected_error_string
;
122 static error_enum expected_errors
[] = {
125 {"decode", ASN1_DECODE
},
126 {"encode", ASN1_ENCODE
},
127 {"compare", ASN1_COMPARE
}
130 if (!test_skip_common_options()) {
131 TEST_error("Error parsing test options\n");
135 if (!TEST_ptr(test_type_name
= test_get_argument(0))
136 || !TEST_ptr(expected_error_string
= test_get_argument(1))
137 || !TEST_ptr(test_file
= test_get_argument(2)))
140 item_type
= ASN1_ITEM_lookup(test_type_name
);
142 if (item_type
== NULL
) {
143 TEST_error("Unknown type %s", test_type_name
);
144 TEST_note("Supported types:");
146 const ASN1_ITEM
*it
= ASN1_ITEM_get(i
);
150 TEST_note("\t%s", it
->sname
);
155 for (i
= 0; i
< OSSL_NELEM(expected_errors
); i
++) {
156 if (strcmp(expected_errors
[i
].str
, expected_error_string
) == 0) {
157 expected_error
= expected_errors
[i
].code
;
162 if (expected_error
== ASN1_UNKNOWN
) {
163 TEST_error("Unknown expected error %s\n", expected_error_string
);
167 ADD_TEST(test_bad_asn1
);