blob: c6ba07a488d528eb9d4d07e39c2d741596505e8c [file] [log] [blame]
Ryan Sleevia93d9972017-08-16 18:27:46 -04001#undef NDEBUG
2#include <stdio.h>
3#include <stdlib.h>
4#include <sys/types.h>
5#include <string.h>
6#include <assert.h>
7
8#include <DefaultSequence.h>
9#include <DefaultSet.h>
10
11uint8_t berSeq1[] = {
12 32 | 16, /* [UNIVERSAL 16], constructed */
13 6, /* L */
14 /* aBool BOOLEAN */
15 ((2 << 6) + 0), /* [0], primitive */
16 1, /* L */
17 0, /* FALSE */
18 /* anInteger INTEGER */
19 ((2 << 6) + 1), /* [1], primitive */
20 1, /* L */
21 1
22};
23
24uint8_t derSeq1[] = {
25 32 | 16, /* [UNIVERSAL 16], constructed */
26 3, /* L */
27 /* anInteger INTEGER */
28 ((2 << 6) + 1), /* [1], primitive */
29 1, /* L */
30 1
31};
32
33uint8_t berSeq2[] = {
34 32 | 16, /* [UNIVERSAL 16], constructed */
35 3, /* L */
36 /* aBool BOOLEAN */
37 ((2 << 6) + 0), /* [0], primitive */
38 1, /* L */
39 0 /* FALSE */
40};
41
42uint8_t derSeq2[] = {
43 32 | 16, /* [UNIVERSAL 16], constructed */
44 0 /* L */
45};
46
47uint8_t berSet1[] = {
48 32 | 17, /* [UNIVERSAL 17], constructed */
49 6, /* L */
50 /* aBool BOOLEAN */
51 ((2 << 6) + 0), /* [0], primitive */
52 1, /* L */
53 0, /* FALSE */
54 /* anInteger INTEGER */
55 ((2 << 6) + 1), /* [1], primitive */
56 1, /* L */
57 1
58};
59
60uint8_t derSet1[] = {
61 32 | 17, /* [UNIVERSAL 17], constructed */
62 3, /* L */
63 /* anInteger INTEGER */
64 ((2 << 6) + 1), /* [1], primitive */
65 1, /* L */
66 1
67};
68
69uint8_t berSet2[] = {
70 32 | 17, /* [UNIVERSAL 17], constructed */
71 3, /* L */
72 /* aBool BOOLEAN */
73 ((2 << 6) + 0), /* [0], primitive */
74 1, /* L */
75 0 /* FALSE */
76};
77
78uint8_t derSet2[] = {
79 32 | 17, /* [UNIVERSAL 17], constructed */
80 0 /* L */
81};
82
83uint8_t buf2[128];
84int buf2_pos;
85
86static int
87buf2_fill(const void *buffer, size_t size, void *app_key) {
88
89 (void)app_key;
90
91 if(buf2_pos + size > sizeof(buf2))
92 return -1;
93
94 memcpy(buf2 + buf2_pos, buffer, size);
95 buf2_pos += size;
96
97 return 0;
98}
99
100static void
101compare_encoding(asn_enc_rval_t *erval, uint8_t *expected, size_t expected_size,
102 uint8_t *actual) {
Ryan Sleevia93d9972017-08-16 18:27:46 -0400103
104 assert(erval->encoded != -1);
Lev Walkinbc09dd42017-10-19 02:16:35 -0700105 if((size_t)erval->encoded != expected_size) {
Ryan Sleevia93d9972017-08-16 18:27:46 -0400106 printf("%d != %d\n", (int)erval->encoded, (int)expected_size);
Lev Walkinbc09dd42017-10-19 02:16:35 -0700107 assert((size_t)erval->encoded == expected_size);
Ryan Sleevia93d9972017-08-16 18:27:46 -0400108 }
Lev Walkinbc09dd42017-10-19 02:16:35 -0700109 for(size_t i = 0; i < expected_size; i++) {
110 if(expected[i] != actual[i]) {
111 fprintf(stderr, "Recreated buffer content mismatch:\n");
112 fprintf(stderr, "Byte %zu, %x != %x (%d != %d)\n", i, expected[i],
113 actual[i], expected[i], actual[i]);
114 }
115 assert(expected[i] == actual[i]);
116 }
Ryan Sleevia93d9972017-08-16 18:27:46 -0400117}
118
119static void
120check_sequence(uint8_t *in, size_t in_size, uint8_t *expected,
121 size_t expected_size) {
122 DefaultSequence_t t, *tp;
123 void *tpp = &tp;
124 asn_dec_rval_t rval;
125 asn_enc_rval_t erval;
126
127 tp = memset(&t, 0, sizeof(t));
128
129 /* Try to decode the BER encoding. */
130 rval = ber_decode(0, &asn_DEF_DefaultSequence, (void**)tpp, in, in_size);
131 assert(rval.code == RC_OK);
132 assert(rval.consumed == in_size);
133
134 /* Try to re-create using DER encoding. */
135 buf2_pos = 0;
136 erval = der_encode(&asn_DEF_DefaultSequence, tp, buf2_fill, 0);
137 compare_encoding(&erval, expected, expected_size, buf2);
Vasil Velichkovcef21e02017-10-09 23:40:17 +0300138
139 ASN_STRUCT_RESET(asn_DEF_DefaultSequence, tp);
Ryan Sleevia93d9972017-08-16 18:27:46 -0400140}
141
142static void
143check_set(uint8_t *in, size_t in_size, uint8_t *expected,
144 size_t expected_size) {
145 DefaultSet_t t, *tp;
146 void *tpp = &tp;
147 asn_dec_rval_t rval;
148 asn_enc_rval_t erval;
149
150 tp = memset(&t, 0, sizeof(t));
151
152 /* Try to decode the BER encoding. */
153 rval = ber_decode(0, &asn_DEF_DefaultSet, (void**)tpp, in, in_size);
154 assert(rval.code == RC_OK);
155 assert(rval.consumed == in_size);
156
157 /* Try to re-create using DER encoding. */
158 buf2_pos = 0;
159 erval = der_encode(&asn_DEF_DefaultSet, tp, buf2_fill, 0);
160 compare_encoding(&erval, expected, expected_size, buf2);
Vasil Velichkovcef21e02017-10-09 23:40:17 +0300161 ASN_STRUCT_RESET(asn_DEF_DefaultSet, tp);
Ryan Sleevia93d9972017-08-16 18:27:46 -0400162}
163
164int
165main(int ac, char **av) {
166
167 (void)ac; /* Unused argument */
168 (void)av; /* Unused argument */
169
170 check_sequence(berSeq1, sizeof(berSeq1), derSeq1, sizeof(derSeq1));
171 check_sequence(berSeq2, sizeof(berSeq2), derSeq2, sizeof(derSeq2));
172 check_set(berSet1, sizeof(berSet1), derSet1, sizeof(derSet1));
173 check_set(berSet2, sizeof(berSet2), derSet2, sizeof(derSet2));
174}