xref: /openbsd-src/regress/lib/libcrypto/asn1/asn1basic.c (revision 725e2e31524c46af042e95f47b6eb978aa2666da)
1 /* $OpenBSD: asn1basic.c,v 1.1 2021/12/09 16:30:05 jsing Exp $ */
2 /*
3  * Copyright (c) 2017, 2021 Joel Sing <jsing@openbsd.org>
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 #include <openssl/asn1.h>
19 
20 #include <err.h>
21 #include <stdio.h>
22 #include <string.h>
23 
24 static void
25 hexdump(const unsigned char *buf, size_t len)
26 {
27 	size_t i;
28 
29 	for (i = 1; i <= len; i++)
30 		fprintf(stderr, " 0x%02hhx,%s", buf[i - 1], i % 8 ? "" : "\n");
31 
32 	fprintf(stderr, "\n");
33 }
34 
35 static int
36 asn1_compare_bytes(const char *label, const unsigned char *d1, int len1,
37     const unsigned char *d2, int len2)
38 {
39 	if (len1 != len2) {
40 		fprintf(stderr, "FAIL: %s - byte lengths differ "
41 		    "(%i != %i)\n", label, len1, len2);
42 		return 0;
43 	}
44 	if (memcmp(d1, d2, len1) != 0) {
45 		fprintf(stderr, "FAIL: %s - bytes differ\n", label);
46 		fprintf(stderr, "Got:\n");
47 		hexdump(d1, len1);
48 		fprintf(stderr, "Want:\n");
49 		hexdump(d2, len2);
50 		return 0;
51 	}
52 	return 1;
53 }
54 
55 const uint8_t asn1_boolean_false[] = {
56 	0x01, 0x01, 0x00,
57 };
58 const uint8_t asn1_boolean_true[] = {
59 	0x01, 0x01, 0x01,
60 };
61 
62 static int
63 asn1_boolean_test(void)
64 {
65 	uint8_t *p = NULL, *pp;
66 	const uint8_t *q;
67 	int len;
68 	int failed = 1;
69 
70 	if ((len = i2d_ASN1_BOOLEAN(0, NULL)) < 0) {
71 		fprintf(stderr, "FAIL: i2d_ASN1_BOOLEAN false with NULL\n");
72 		goto failed;
73 	}
74 	if ((p = calloc(1, len)) == NULL)
75 		errx(1, "calloc");
76 	pp = p;
77 	if ((i2d_ASN1_BOOLEAN(0, &pp)) != len) {
78 		fprintf(stderr, "FAIL: i2d_ASN1_BOOLEAN false\n");
79 		goto failed;
80 	}
81 
82 	if (!asn1_compare_bytes("BOOLEAN false", p, len, asn1_boolean_false,
83 	    sizeof(asn1_boolean_false)))
84 		goto failed;
85 
86 	q = p;
87 	if (d2i_ASN1_BOOLEAN(NULL, &q, len) != 0) {
88 		fprintf(stderr, "FAIL: BOOLEAN false did not decode to 0\n");
89 		goto failed;
90 	}
91 
92 	free(p);
93 	p = NULL;
94 
95 	if ((len = i2d_ASN1_BOOLEAN(1, NULL)) < 0) {
96 		fprintf(stderr, "FAIL: i2d_ASN1_BOOLEAN true with NULL\n");
97 		goto failed;
98 	}
99 	if ((p = calloc(1, len)) == NULL)
100 		errx(1, "calloc");
101 	pp = p;
102 	if ((i2d_ASN1_BOOLEAN(1, &pp)) != len) {
103 		fprintf(stderr, "FAIL: i2d_ASN1_BOOLEAN true\n");
104 		goto failed;
105 	}
106 
107 	if (!asn1_compare_bytes("BOOLEAN true", p, len, asn1_boolean_true,
108 	    sizeof(asn1_boolean_true)))
109 		goto failed;
110 
111 	q = p;
112 	if (d2i_ASN1_BOOLEAN(NULL, &q, len) != 1) {
113 		fprintf(stderr, "FAIL: BOOLEAN true did not decode to 0\n");
114 		goto failed;
115 	}
116 
117 	failed = 0;
118 
119  failed:
120 	free(p);
121 
122 	return failed;
123 }
124 
125 int
126 main(int argc, char **argv)
127 {
128 	int failed = 0;
129 
130 	failed |= asn1_boolean_test();
131 
132 	return (failed);
133 }
134