1 /* t-der-builder.c - Tests for the DER builder functions
2 * Copyright (C) 2020 g10 Code GmbH
4 * This file is part of KSBA.
6 * KSBA is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
11 * KSBA is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
28 #include "../src/ksba.h"
30 #define PGM "t-der-builder"
40 test_der_encoding (void)
47 d = ksba_der_builder_new (0);
49 fail ("error creating new DER builder");
51 ksba_der_add_ptr (d, KSBA_CLASS_UNIVERSAL, KSBA_TYPE_NULL, NULL, 0);
52 err = ksba_der_builder_get (d, &der, &derlen);
54 if (derlen != 2 || memcmp (der, "\x05\x00", 2))
55 fail ("bad encoding");
58 ksba_der_builder_reset (d);
59 ksba_der_add_ptr (d, KSBA_CLASS_UNIVERSAL, KSBA_TYPE_OCTET_STRING, "123", 3);
60 err = ksba_der_builder_get (d, &der, &derlen);
62 if (derlen != 5 || memcmp (der, "\x04\x03""123", 5))
63 fail ("bad encoding");
66 ksba_der_builder_reset (d);
67 ksba_der_add_ptr (d, KSBA_CLASS_UNIVERSAL, 65537, "a", 1);
68 err = ksba_der_builder_get (d, &der, &derlen);
70 if (derlen != 6 || memcmp (der, "\x1f\x84\x80\x01\x01\x61", 6))
71 fail ("bad encoding");
74 ksba_der_builder_reset (d);
75 ksba_der_add_tag (d, KSBA_CLASS_APPLICATION, 257);
76 err = ksba_der_builder_get (d, &der, &derlen);
78 if (derlen != 4 || memcmp (der, "\x7f\x82\x01\x80", 4))
79 fail ("bad encoding");
87 test_der_builder (void)
94 d = ksba_der_builder_new (0);
96 fail ("error creating new DER builder");
98 ksba_der_add_tag (d, KSBA_CLASS_UNIVERSAL, KSBA_TYPE_SEQUENCE);
99 ksba_der_add_oid (d, "1.2.3.4");
100 ksba_der_add_tag (d, KSBA_CLASS_UNIVERSAL, KSBA_TYPE_SET);
101 ksba_der_add_tag (d, KSBA_CLASS_CONTEXT, 0);
102 ksba_der_add_int (d, "\x01", 1, 0);
103 ksba_der_add_end (d);
104 ksba_der_add_tag (d, KSBA_CLASS_CONTEXT, 42);
105 ksba_der_add_int (d, "\x7f", 1, 0); /* 127 */
106 ksba_der_add_int (d, "\x7f", 1, 1); /* Also 127 */
107 ksba_der_add_int (d, "\x82", 1, 0); /* Note: this is a negative number. */
108 ksba_der_add_int (d, "\x83", 1, 1); /* Forces positive encoding. */
109 ksba_der_add_end (d);
110 ksba_der_add_end (d);
112 err = ksba_der_builder_get (d, &der, &derlen);
114 /* gpgrt_log_printhex (der, derlen, "DER:"); */
116 || memcmp (der, ("\x30\x1c\x06\x03\x2a\x03\x04\x31\x15\xa0\x03\x02"
117 "\x01\x01\xbf\x2a\x0d\x02\x01\x7f\x02\x01\x7f\x02"
118 "\x01\x82\x02\x02\x00\x83"), 30))
119 fail ("bad encoding");
123 /* Now test our encapsulate feature. */
124 ksba_der_builder_reset (d);
126 ksba_der_add_tag (d, KSBA_CLASS_UNIVERSAL, KSBA_TYPE_SEQUENCE);
127 ksba_der_add_oid (d, "1.2.3.4");
128 ksba_der_add_tag (d, KSBA_CLASS_ENCAPSULATE, KSBA_TYPE_OCTET_STRING);
129 ksba_der_add_tag (d, KSBA_CLASS_UNIVERSAL, KSBA_TYPE_SEQUENCE);
130 ksba_der_add_int (d, "\x01\xc3", 2, 0); /* Integer 451 */
131 ksba_der_add_tag (d, KSBA_CLASS_CONTEXT, 0); /* [0] */
132 ksba_der_add_int (d, "\x2a", 1, 0); /* Integer 42 */
133 ksba_der_add_end (d); /* End [0] */
134 ksba_der_add_end (d); /* End sequence */
135 ksba_der_add_end (d); /* End octet string */
136 ksba_der_add_end (d); /* End sequence */
138 err = ksba_der_builder_get (d, &der, &derlen);
141 || memcmp (der, ("\x30\x12\x06\x03\x2a\x03\x04\x04\x0b\x30"
142 "\x09\x02\x02\x01\xc3\xa0\x03\x02\x01\x2a"), 20))
143 fail ("bad encoding");
146 /* Encapsulate in a bit string. */
147 ksba_der_builder_reset (d);
149 ksba_der_add_tag (d, KSBA_CLASS_UNIVERSAL, KSBA_TYPE_SEQUENCE);
150 ksba_der_add_oid (d, "1.2.3.4");
151 ksba_der_add_tag (d, KSBA_CLASS_ENCAPSULATE, KSBA_TYPE_BIT_STRING);
152 ksba_der_add_tag (d, KSBA_CLASS_UNIVERSAL, KSBA_TYPE_SEQUENCE);
153 ksba_der_add_int (d, "\x01\xc3", 2, 0); /* Integer 451 */
154 ksba_der_add_tag (d, KSBA_CLASS_CONTEXT, 0); /* [0] */
155 ksba_der_add_int (d, "\x2a", 1, 0); /* Integer 42 */
156 ksba_der_add_end (d); /* End [0] */
157 ksba_der_add_end (d); /* End sequence */
158 ksba_der_add_end (d); /* End octet string */
159 ksba_der_add_end (d); /* End sequence */
161 err = ksba_der_builder_get (d, &der, &derlen);
163 /* gpgrt_log_printhex (der, derlen, "der:"); */
165 || memcmp (der, ("\x30\x13\x06\x03\x2a\x03\x04\x03\x0c\x00\x30"
166 "\x09\x02\x02\x01\xc3\xa0\x03\x02\x01\x2a"), 21))
167 fail ("bad encoding");
171 ksba_der_release (d);
176 main (int argc, char **argv)
183 if (argc && !strcmp (*argv, "--verbose"))
192 test_der_encoding ();
197 fputs ("usage: "PGM"\n", stderr);