summaryrefslogtreecommitdiff
path: root/src/regress/lib
diff options
context:
space:
mode:
authorjsing <>2022-04-28 18:36:38 +0000
committerjsing <>2022-04-28 18:36:38 +0000
commit8454151f52393c2bd1ba1e0ed66d995ba778c249 (patch)
tree99f2febe2b3073014226877549caa9f62ed60651 /src/regress/lib
parent308c1defb0063d1aa0ab378d1a88c5ce12e650d9 (diff)
downloadopenbsd-8454151f52393c2bd1ba1e0ed66d995ba778c249.tar.gz
openbsd-8454151f52393c2bd1ba1e0ed66d995ba778c249.tar.bz2
openbsd-8454151f52393c2bd1ba1e0ed66d995ba778c249.zip
Add tests that decode sequences into ASN.1 strings.
Test decoding of sequences with length and indefinite length into an ASN.1 string - in this case the ASN.1 is not decoded, rather the octets are stored directly as the content of the string. This exercises a specific path through the ASN.1 decoder. (you know asn1complex is living up to its name when you have to import openssl/asn1t.h directly...)
Diffstat (limited to 'src/regress/lib')
-rw-r--r--src/regress/lib/libcrypto/asn1/asn1complex.c98
1 files changed, 97 insertions, 1 deletions
diff --git a/src/regress/lib/libcrypto/asn1/asn1complex.c b/src/regress/lib/libcrypto/asn1/asn1complex.c
index dfad345c6d..e75ebc753e 100644
--- a/src/regress/lib/libcrypto/asn1/asn1complex.c
+++ b/src/regress/lib/libcrypto/asn1/asn1complex.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: asn1complex.c,v 1.2 2022/04/27 17:43:41 jsing Exp $ */ 1/* $OpenBSD: asn1complex.c,v 1.3 2022/04/28 18:36:38 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2017, 2021 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2017, 2021 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -16,6 +16,7 @@
16 */ 16 */
17 17
18#include <openssl/asn1.h> 18#include <openssl/asn1.h>
19#include <openssl/asn1t.h>
19#include <openssl/err.h> 20#include <openssl/err.h>
20 21
21#include <err.h> 22#include <err.h>
@@ -217,12 +218,107 @@ do_asn1_constructed_tests(void)
217 return failed; 218 return failed;
218} 219}
219 220
221/* Sequence with length. */
222const uint8_t asn1_sequence_ber[] = {
223 0x30, 0x16,
224 0x04, 0x01, 0x01,
225 0x04, 0x02, 0x01, 0x02,
226 0x04, 0x03, 0x01, 0x02, 0x03,
227 0x30, 0x80, 0x04, 0x01, 0x01, 0x00, 0x00,
228 0x04, 0x01, 0x01,
229
230 0x04, 0x01, 0x01, /* Trailing data. */
231};
232
233const uint8_t asn1_sequence_content[] = {
234 0x30, 0x16, 0x04, 0x01, 0x01, 0x04, 0x02, 0x01,
235 0x02, 0x04, 0x03, 0x01, 0x02, 0x03, 0x30, 0x80,
236 0x04, 0x01, 0x01, 0x00, 0x00, 0x04, 0x01, 0x01,
237};
238
239/* Sequence with indefinite length. */
240const uint8_t asn1_sequence_indefinite_ber[] = {
241 0x30, 0x80,
242 0x04, 0x01, 0x01,
243 0x04, 0x02, 0x01, 0x02,
244 0x04, 0x03, 0x01, 0x02, 0x03,
245 0x30, 0x80, 0x04, 0x01, 0x01, 0x00, 0x00,
246 0x04, 0x01, 0x01,
247 0x00, 0x00,
248
249 0x04, 0x01, 0x01, /* Trailing data. */
250};
251
252const uint8_t asn1_sequence_indefinite_content[] = {
253 0x30, 0x80, 0x04, 0x01, 0x01, 0x04, 0x02, 0x01,
254 0x02, 0x04, 0x03, 0x01, 0x02, 0x03, 0x30, 0x80,
255 0x04, 0x01, 0x01, 0x00, 0x00, 0x04, 0x01, 0x01,
256 0x00, 0x00,
257};
258
259static int
260do_asn1_sequence_string_tests(void)
261{
262 ASN1_STRING *astr = NULL;
263 const uint8_t *p;
264 long len;
265 int failed = 1;
266
267 ERR_clear_error();
268
269 /*
270 * Test decoding of sequence with length and indefinite length into
271 * a string - in this case the ASN.1 is not decoded and is stored
272 * directly as the content for the string.
273 */
274 if ((astr = ASN1_STRING_new()) == NULL) {
275 fprintf(stderr, "FAIL: ASN1_STRING_new() returned NULL\n");
276 goto failed;
277 }
278
279 p = asn1_sequence_ber;
280 len = sizeof(asn1_sequence_ber);
281 if (ASN1_item_d2i((ASN1_VALUE **)&astr, &p, len,
282 &ASN1_SEQUENCE_it) == NULL) {
283 fprintf(stderr, "FAIL: failed to decode ASN1_SEQUENCE\n");
284 ERR_print_errors_fp(stderr);
285 goto failed;
286 }
287
288 if (!asn1_compare_bytes("sequence", ASN1_STRING_data(astr),
289 ASN1_STRING_length(astr), asn1_sequence_content,
290 sizeof(asn1_sequence_content)))
291 goto failed;
292
293 p = asn1_sequence_indefinite_ber;
294 len = sizeof(asn1_sequence_indefinite_ber);
295 if (ASN1_item_d2i((ASN1_VALUE **)&astr, &p, len,
296 &ASN1_SEQUENCE_it) == NULL) {
297 fprintf(stderr, "FAIL: failed to decode ASN1_SEQUENCE\n");
298 ERR_print_errors_fp(stderr);
299 goto failed;
300 }
301
302 if (!asn1_compare_bytes("sequence indefinite", ASN1_STRING_data(astr),
303 ASN1_STRING_length(astr), asn1_sequence_indefinite_content,
304 sizeof(asn1_sequence_indefinite_content)))
305 goto failed;
306
307 failed = 0;
308
309 failed:
310 ASN1_STRING_free(astr);
311
312 return failed;
313}
314
220int 315int
221main(int argc, char **argv) 316main(int argc, char **argv)
222{ 317{
223 int failed = 0; 318 int failed = 0;
224 319
225 failed |= do_asn1_constructed_tests(); 320 failed |= do_asn1_constructed_tests();
321 failed |= do_asn1_sequence_string_tests();
226 322
227 return (failed); 323 return (failed);
228} 324}