blob: 7553086ef13d7d8134d94cc504d7e360aa56df6d [file] [log] [blame]
vlm53cd87b2004-08-19 13:27:57 +00001#include <stdio.h>
vlm46ffdf62007-07-23 06:48:26 +00002#include <string.h>
vlm53cd87b2004-08-19 13:27:57 +00003#include <assert.h>
4
vlm46ffdf62007-07-23 06:48:26 +00005#include <asn_internal.h>
6#include <ber_tlv_tag.h>
vlm53cd87b2004-08-19 13:27:57 +00007
8struct tag_control_s {
9 int taglen;
10 uint8_t tagbuf[8];
11
12 int correctly_decodable;
13
14 int tclass; /* Tag class */
15 ber_tlv_tag_t tvalue; /* Tag value */
16 int constr; /* Is it constructed? */
17} control[] = {
18 { 1, { 0x2 << 6 }, 1, ASN_TAG_CLASS_CONTEXT, 0, 0 },
19 { 1, { 0x2 << 6 | 32 | 1 }, 1, ASN_TAG_CLASS_CONTEXT, 1, 1 },
20 { 1, { 0x3 << 6 | 30 }, 1, ASN_TAG_CLASS_PRIVATE, 30, 0 },
21 { 1, { 29 }, 1, ASN_TAG_CLASS_UNIVERSAL, 29, 0 },
22 { 1, { 0xbf, 31 }, 0, ASN_TAG_CLASS_CONTEXT, 31, 1 },
23 { 2, { 0xbf, 31 }, 1, ASN_TAG_CLASS_CONTEXT, 31, 1 },
vlm6a644392004-08-19 14:47:37 +000024 { 2, { 0xbf, 83 }, 1, ASN_TAG_CLASS_CONTEXT, 83, 1 },
vlm53cd87b2004-08-19 13:27:57 +000025 { 2, { 0xbf, 127 }, 1, ASN_TAG_CLASS_CONTEXT, 127, 1 },
26 { 2, { 0xbf, 129 }, 0, ASN_TAG_CLASS_CONTEXT, 127, 1 },
27 { 3, { 0xbf, 129, 0 }, 1, ASN_TAG_CLASS_CONTEXT, 128, 1 },
28 { 3, { 0xbf, 129, 1 }, 1, ASN_TAG_CLASS_CONTEXT, 129, 1 },
29 { 3, { 0xbf, 130, 0 }, 1, ASN_TAG_CLASS_CONTEXT, 256, 1 },
30 { 3, { 0xbf, 130, 1 }, 1, ASN_TAG_CLASS_CONTEXT, 257, 1 },
31 { 3, { 0xbf, 130, 0x81 }, 0, 0, 0, 0 },
32 { 4, { 0xbf, 130, 0x81, 2 }, 1, ASN_TAG_CLASS_CONTEXT, 32898, 1 },
33 { 4, { 0xbf, 130, 0x81, 0x82 }, 0, ASN_TAG_CLASS_CONTEXT, 32898, 1 },
34 { 5, { 0x1f, 130, 0x81, 0x82, 1 }, 1, 0, 4210945, 0 },
35 { 5, { 0x1f, 130, 0x81, 0x82, 2 }, 1, 0, 4210946, 0 },
36 { 5, { 0x1f, 0xff, 0x81, 0x82, 2 }, 1, 0, 266354946, 0 },
37 { 6, { 0x1f, 0xff, 0xff, 0x82, 0x80, 1 }, -1, 0, 266354946, 0 },
38 { 7, { 0x1f, 0x8E, 0x87, 0xAA, 0x95, 0x99, 3}, -1, 0, 4000000000UL, 0 },
39};
40
41
42static void check_decode(struct tag_control_s *ctrl);
43static void check_encode(struct tag_control_s *ctrl);
44
45int
46main() {
47 size_t i;
48
49 for(i = 0; i < sizeof(control) / sizeof(control[0]); i++) {
50 check_decode(&control[i]);
51 check_encode(&control[i]);
52 }
53
54 return 0;
55}
56
57static void
58check_decode(struct tag_control_s *ctrl) {
59 ber_tlv_tag_t tag = 123;
60 ber_tlv_tag_t tag1 = 124;
61 ber_tlv_tag_t tag2 = 125;
62 ssize_t size;
63
64 if(ctrl->correctly_decodable < 1) {
65 size = ber_fetch_tag(ctrl->tagbuf, ctrl->taglen, &tag1);
66 assert(size == ctrl->correctly_decodable);
67 return;
68 }
69
70 printf("Expecting ");
71 tag = (ctrl->tvalue << 2) | ctrl->tclass;
72 ber_tlv_tag_fwrite(tag, stdout);
73 printf(", got ");
74
75 size = ber_fetch_tag(ctrl->tagbuf, 0, &tag1);
76 assert(size == 0);
77
78 size = ber_fetch_tag(ctrl->tagbuf, ctrl->taglen, &tag1);
79 assert(size == ctrl->taglen);
80
81 size = ber_fetch_tag(ctrl->tagbuf, ctrl->taglen + 10, &tag2);
82 assert(size == ctrl->taglen);
83
84 ber_tlv_tag_fwrite(tag1, stdout);
85 printf("\n");
86
87 assert(tag1 == tag2);
88 assert(tag == tag1);
89
90 assert(ctrl->constr == BER_TLV_CONSTRUCTED(ctrl->tagbuf));
91}
92
93
94
95static void
96check_encode(struct tag_control_s *ctrl) {
97 uint8_t buf[16];
98 ber_tlv_tag_t tag;
99 int Filler = 0xDA;
100 ssize_t size;
101 ssize_t i;
102
103 tag = ctrl->tvalue << 2 | ctrl->tclass;
104
105 /*
106 * Testing buffer overruns.
107 */
108 for(i = 0; i < (int)sizeof(buf); i++) {
109 int j;
110
111 memset(buf, Filler, sizeof(buf));
112
113 size = ber_tlv_tag_serialize(tag, buf, i);
114 assert(size < (int)sizeof(buf));
115
116 if(size <= i) {
117 for(j = 0; j < size; j++) assert(buf[j] != Filler);
118 } else {
119 j = i;
120 }
121 for(; j < (int)sizeof(buf); j++) assert(buf[j] == Filler);
122 }
123
124 memset(buf, Filler, sizeof(buf));
125
126 size = ber_tlv_tag_serialize(tag, buf, sizeof(buf));
127 assert(size < (int)sizeof(buf));
128
129 for(i = 0; i < size; i++) assert(buf[i] != Filler);
130 for(; i < (int)sizeof(buf); i++) assert(buf[i] == Filler);
131
132 if(ctrl->correctly_decodable == 1) {
133 assert(size == ctrl->taglen);
134 }
135 if(ctrl->constr) *buf |= 0x20;
136
137 ber_tlv_tag_fwrite(tag, stdout);
138
139 printf(":");
140
141 for(i = 0; i < size; i++) {
142 printf(" %02x", buf[i]);
143 if(ctrl->correctly_decodable == 1) {
144 assert(ctrl->tagbuf[i] == buf[i]);
145 }
146 }
147 printf("\n");
148}
149