Imported Upstream version 1.6.5
[platform/upstream/libksba.git] / tests / t-der-builder.c
1 /* t-der-builder.c - Tests for the DER builder functions
2  * Copyright (C) 2020 g10 Code GmbH
3  *
4  * This file is part of KSBA.
5  *
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.
10  *
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.
15  *
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/>.
18  */
19
20
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <assert.h>
25 #include <time.h>
26 #include <errno.h>
27
28 #include "../src/ksba.h"
29
30 #define PGM "t-der-builder"
31
32 #include "t-common.h"
33
34
35 static int verbose;
36
37
38
39 static void
40 test_der_encoding (void)
41 {
42   gpg_error_t err;
43   ksba_der_t d;
44   unsigned char *der;
45   size_t derlen;
46
47   d = ksba_der_builder_new (0);
48   if (!d)
49     fail ("error creating new DER builder");
50
51   ksba_der_add_ptr (d, KSBA_CLASS_UNIVERSAL, KSBA_TYPE_NULL, NULL, 0);
52   err = ksba_der_builder_get (d, &der, &derlen);
53   fail_if_err (err);
54   if (derlen != 2 || memcmp (der, "\x05\x00", 2))
55     fail ("bad encoding");
56   xfree (der);
57
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);
61   fail_if_err (err);
62   if (derlen != 5 || memcmp (der, "\x04\x03""123", 5))
63     fail ("bad encoding");
64   xfree (der);
65
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);
69   fail_if_err (err);
70   if (derlen != 6 || memcmp (der, "\x1f\x84\x80\x01\x01\x61", 6))
71     fail ("bad encoding");
72   xfree (der);
73
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);
77   fail_if_err (err);
78   if (derlen != 4 || memcmp (der, "\x7f\x82\x01\x80", 4))
79     fail ("bad encoding");
80   xfree (der);
81
82   ksba_der_release (d);
83 }
84
85
86 static void
87 test_der_builder (void)
88 {
89   gpg_error_t err;
90   ksba_der_t d;
91   unsigned char *der;
92   size_t derlen;
93
94   d = ksba_der_builder_new (0);
95   if (!d)
96     fail ("error creating new DER builder");
97
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);
111
112   err = ksba_der_builder_get (d, &der, &derlen);
113   fail_if_err (err);
114   /* gpgrt_log_printhex (der, derlen, "DER:"); */
115   if (derlen != 30
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");
120   xfree (der);
121
122
123   /* Now test our encapsulate feature.  */
124   ksba_der_builder_reset (d);
125
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     */
137
138   err = ksba_der_builder_get (d, &der, &derlen);
139   fail_if_err (err);
140   if (derlen != 20
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");
144   xfree (der);
145
146   /* Encapsulate in a bit string.  */
147   ksba_der_builder_reset (d);
148
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     */
160
161   err = ksba_der_builder_get (d, &der, &derlen);
162   fail_if_err (err);
163   /* gpgrt_log_printhex (der, derlen, "der:"); */
164   if (derlen != 21
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");
168   xfree (der);
169
170
171   ksba_der_release (d);
172 }
173
174
175 int
176 main (int argc, char **argv)
177 {
178   if (argc)
179     {
180       argc--;  argv++;
181     }
182
183   if (argc && !strcmp (*argv, "--verbose"))
184     {
185       verbose = 1;
186       argc--; argv++;
187     }
188
189
190   if (!argc)
191     {
192       test_der_encoding ();
193       test_der_builder ();
194     }
195   else
196     {
197       fputs ("usage: "PGM"\n", stderr);
198       return 1;
199     }
200
201   return 0;
202 }