Branch data Line data Source code
1 : : /*
2 : : * Copyright (C) 2011-2012 Free Software Foundation, Inc.
3 : : *
4 : : * This file is part of LIBTASN1.
5 : : *
6 : : * This program 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 : : * This program 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 : : * Written by Simon Josefsson
20 : : *
21 : : */
22 : :
23 : : #include <stdio.h>
24 : : #include <string.h>
25 : : #include <stdlib.h>
26 : :
27 : : #include "libtasn1.h"
28 : :
29 : : struct tv
30 : : {
31 : : int bitlen;
32 : : const char *bitstr;
33 : : int derlen;
34 : : const char *der;
35 : : };
36 : :
37 : : static const struct tv tv[] = {
38 : : {0, "", 2, "\x01\x00"},
39 : : {1, "\x00", 3, "\x02\x07\x00"},
40 : : {2, "\x00", 3, "\x02\x06\x00"},
41 : : {3, "\x00", 3, "\x02\x05\x00"},
42 : : {4, "\x00", 3, "\x02\x04\x00"},
43 : : {5, "\x00", 3, "\x02\x03\x00"},
44 : : {6, "\x00", 3, "\x02\x02\x00"},
45 : : {7, "\x00", 3, "\x02\x01\x00"},
46 : : {8, "\x00\x00", 3, "\x02\x00\x00"},
47 : : {9, "\x00\x00", 4, "\x03\x07\x00\x00"},
48 : : {10, "\x00\x00", 4, "\x03\x06\x00\x00"},
49 : : {11, "\x00\x00", 4, "\x03\x05\x00\x00"},
50 : : {12, "\x00\x00", 4, "\x03\x04\x00\x00"},
51 : : {13, "\x00\x00", 4, "\x03\x03\x00\x00"},
52 : : {14, "\x00\x00", 4, "\x03\x02\x00\x00"},
53 : : {15, "\x00\x00", 4, "\x03\x01\x00\x00"},
54 : : {16, "\x00\x00", 4, "\x03\x00\x00\x00"},
55 : : {17, "\x00\x00\x00", 5, "\x04\x07\x00\x00\x00"},
56 : : {18, "\x00\x00\x00", 5, "\x04\x06\x00\x00\x00"},
57 : : {19, "\x00\x00\x00", 5, "\x04\x05\x00\x00\x00"},
58 : : {1, "\xFF", 3, "\x02\x07\x80"},
59 : : {2, "\xFF", 3, "\x02\x06\xc0"},
60 : : {3, "\xFF", 3, "\x02\x05\xe0"},
61 : : {4, "\xFF", 3, "\x02\x04\xf0"},
62 : : {5, "\xFF", 3, "\x02\x03\xf8"},
63 : : {6, "\xFF", 3, "\x02\x02\xfc"},
64 : : {7, "\xFF", 3, "\x02\x01\xfe"},
65 : : {8, "\xFF\xFF", 3, "\x02\x00\xff"},
66 : : {9, "\xFF\xFF", 4, "\x03\x07\xff\x80"},
67 : : {10, "\xFF\xFF", 4, "\x03\x06\xff\xc0"},
68 : : {11, "\xFF\xFF", 4, "\x03\x05\xff\xe0"},
69 : : {12, "\xFF\xFF", 4, "\x03\x04\xff\xf0"},
70 : : {13, "\xFF\xFF", 4, "\x03\x03\xff\xf8"},
71 : : {14, "\xFF\xFF", 4, "\x03\x02\xff\xfc"},
72 : : {15, "\xFF\xFF", 4, "\x03\x01\xff\xfe"},
73 : : {16, "\xFF\xFF", 4, "\x03\x00\xff\xff"},
74 : : {17, "\xFF\xFF\xFF", 5, "\x04\x07\xff\xff\x80"},
75 : : {18, "\xFF\xFF\xFF", 5, "\x04\x06\xff\xff\xc0"},
76 : : {19, "\xFF\xFF\xFF", 5, "\x04\x05\xff\xff\xe0"},
77 : : };
78 : :
79 : : int
80 : 1 : main (int argc, char *argv[])
81 : : {
82 : : asn1_retCode result;
83 : : unsigned char der[100];
84 : : unsigned char str[100];
85 : 1 : int der_len = sizeof (der);
86 : 1 : int str_size = sizeof (str);
87 : : int ret_len, bit_len;
88 : : size_t i;
89 : :
90 : : /* Dummy test */
91 : :
92 : 1 : asn1_bit_der (NULL, 0, der, &der_len);
93 : 1 : result = asn1_get_bit_der (der, 0, &ret_len, str, str_size, &bit_len);
94 [ - + ]: 1 : if (result != ASN1_GENERIC_ERROR)
95 : : {
96 : 0 : fprintf (stderr, "asn1_get_bit_der zero\n");
97 : 0 : return 1;
98 : : }
99 : :
100 : : /* Encode short strings with increasing bit lengths */
101 : :
102 [ + + ]: 40 : for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++)
103 : : {
104 : : /* Encode */
105 : :
106 : 39 : asn1_bit_der ((const unsigned char *) tv[i].bitstr, tv[i].bitlen,
107 : : der, &der_len);
108 : :
109 : : #if 0
110 : : {
111 : : size_t j;
112 : : for (j = 0; j < der_len; j++)
113 : : printf ("\\x%02x", der[j]);
114 : : printf ("\n");
115 : : }
116 : : #endif
117 : :
118 [ + - ][ - + ]: 39 : if (der_len != tv[i].derlen || memcmp (der, tv[i].der, der_len) != 0)
119 : : {
120 : 0 : fprintf (stderr, "asn1_bit_der iter %lu\n", (unsigned long) i);
121 : 0 : return 1;
122 : : }
123 : :
124 : : /* Decode it */
125 : :
126 : 39 : result = asn1_get_bit_der (der, der_len, &ret_len, str,
127 : : str_size, &bit_len);
128 [ + - ][ + - ]: 39 : if (result != ASN1_SUCCESS || ret_len != tv[i].derlen
129 [ - + ]: 39 : || bit_len != tv[i].bitlen)
130 : : {
131 : 0 : fprintf (stderr, "asn1_get_bit_der iter %lu\n", (unsigned long) i);
132 : 0 : return 1;
133 : : }
134 : : }
135 : :
136 : :
137 : : /* Decode sample from "A Layman's Guide to a Subset of ASN.1, BER,
138 : : and DER" section 5.4 "BIT STRING": "The BER encoding of the BIT
139 : : STRING value "011011100101110111" can be any of the following,
140 : : among others, depending on the choice of padding bits, the form
141 : : of length octets [...]".
142 : : */
143 : :
144 : : /* 03 04 06 6e 5d c0 DER encoding */
145 : :
146 : 1 : memcpy (der, "\x04\x06\x6e\x5d\xc0", 5);
147 : 1 : der_len = 5;
148 : :
149 : 1 : result = asn1_get_bit_der (der, der_len, &ret_len, str, str_size, &bit_len);
150 [ + - ][ + - ]: 1 : if (result != ASN1_SUCCESS || ret_len != 5
151 [ + - ][ - + ]: 1 : || bit_len != 18 || memcmp (str, "\x6e\x5d\xc0", 3) != 0)
152 : : {
153 : 0 : fprintf (stderr, "asn1_get_bit_der example\n");
154 : 0 : return 1;
155 : : }
156 : :
157 : 1 : der_len = sizeof (der);
158 : 1 : asn1_bit_der (str, bit_len, der, &der_len);
159 [ + - ][ - + ]: 1 : if (der_len != 5 || memcmp (der, "\x04\x06\x6e\x5d\xc0", 5) != 0)
160 : : {
161 : 0 : fprintf (stderr, "asn1_bit_der example roundtrip\n");
162 : 0 : return 1;
163 : : }
164 : :
165 : : /* 03 04 06 6e 5d e0 padded with "100000" */
166 : :
167 : 1 : memcpy (der, "\x04\x06\x6e\x5d\xe0", 5);
168 : 1 : der_len = 5;
169 : :
170 : 1 : result = asn1_get_bit_der (der, der_len, &ret_len, str, str_size, &bit_len);
171 [ + - ][ + - ]: 1 : if (result != ASN1_SUCCESS || ret_len != 5
172 [ + - ][ - + ]: 1 : || bit_len != 18 || memcmp (str, "\x6e\x5d\xe0", 3) != 0)
173 : : {
174 : 0 : fprintf (stderr, "asn1_get_bit_der example padded\n");
175 : 0 : return 1;
176 : : }
177 : :
178 : 1 : der_len = sizeof (der);
179 : 1 : asn1_bit_der (str, bit_len, der, &der_len);
180 [ + - ][ - + ]: 1 : if (der_len != 5 || memcmp (der, "\x04\x06\x6e\x5d\xc0", 5) != 0)
181 : : {
182 : 0 : fprintf (stderr, "asn1_bit_der example roundtrip\n");
183 : 0 : return 1;
184 : : }
185 : :
186 : : /* 03 81 04 06 6e 5d c0 long form of length octets */
187 : :
188 : 1 : memcpy (der, "\x81\x04\x06\x6e\x5d\xc0", 6);
189 : 1 : der_len = 6;
190 : :
191 : 1 : result = asn1_get_bit_der (der, der_len, &ret_len, str, str_size, &bit_len);
192 : :
193 [ + - ][ + - ]: 1 : if (result != ASN1_SUCCESS || ret_len != 6
194 [ + - ][ - + ]: 1 : || bit_len != 18 || memcmp (str, "\x6e\x5d\xc0", 3) != 0)
195 : : {
196 : 0 : fprintf (stderr, "asn1_get_bit_der example long form\n");
197 : 0 : return 1;
198 : : }
199 : :
200 : 1 : der_len = sizeof (der);
201 : 1 : asn1_bit_der (str, bit_len, der, &der_len);
202 [ + - ][ - + ]: 1 : if (der_len != 5 || memcmp (der, "\x04\x06\x6e\x5d\xc0", 5) != 0)
203 : : {
204 : 0 : fprintf (stderr, "asn1_bit_der example roundtrip\n");
205 : 0 : return 1;
206 : : }
207 : :
208 : 1 : return 0;
209 : : }
|