1 #include <stdlib.h>
2 #include <string.h>
3 #include "gen_labelset.h"
4 #include "gen_constants.h"
5
6 const unsigned char B_bytes[] = {
7 0x58, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
8 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
9 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
10 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
11 };
12
buffer_add(unsigned char * bufptr,const unsigned char * bufend,const unsigned char * in,const unsigned long in_len)13 unsigned char* buffer_add(unsigned char* bufptr, const unsigned char* bufend,
14 const unsigned char* in, const unsigned long in_len)
15 {
16 unsigned long count = 0;
17
18 if (bufptr == NULL || bufend == NULL || bufptr > bufend)
19 return NULL;
20 if (in == NULL && in_len != 0)
21 return NULL;
22 if (bufend - bufptr < in_len)
23 return NULL;
24
25 for (count=0; count < in_len; count++) {
26 if (bufptr >= bufend)
27 return NULL;
28 *bufptr++ = *in++;
29 }
30 return bufptr;
31 }
32
buffer_pad(const unsigned char * buf,unsigned char * bufptr,const unsigned char * bufend)33 unsigned char* buffer_pad(const unsigned char* buf, unsigned char* bufptr, const unsigned char* bufend)
34 {
35 unsigned long count = 0;
36 unsigned long pad_len = 0;
37
38 if (buf == NULL || bufptr == NULL || bufend == NULL || bufptr >= bufend || bufptr < buf)
39 return NULL;
40
41 pad_len = (BLOCKLEN - ((bufptr-buf) % BLOCKLEN)) % BLOCKLEN;
42 if (bufend - bufptr < pad_len)
43 return NULL;
44
45 for (count=0; count < pad_len; count++) {
46 if (bufptr >= bufend)
47 return NULL;
48 *bufptr++ = 0;
49 }
50 return bufptr;
51 }
52
labelset_new(unsigned char * labelset,unsigned long * labelset_len,const unsigned long labelset_maxlen,const unsigned char * protocol_name,const unsigned char protocol_name_len,const unsigned char * customization_label,const unsigned char customization_label_len)53 int labelset_new(unsigned char* labelset, unsigned long* labelset_len, const unsigned long labelset_maxlen,
54 const unsigned char* protocol_name, const unsigned char protocol_name_len,
55 const unsigned char* customization_label, const unsigned char customization_label_len)
56 {
57 unsigned char* bufptr;
58
59 *labelset_len = 0;
60 if (labelset == NULL)
61 return -1;
62 if (labelset_len == NULL)
63 return -1;
64 if (labelset_maxlen > LABELSETMAXLEN)
65 return -1;
66 if (labelset_maxlen < 3 + protocol_name_len + customization_label_len)
67 return -1;
68 if (protocol_name == NULL && protocol_name_len != 0)
69 return -1;
70 if (customization_label == NULL && customization_label_len != 0)
71 return -1;
72 if (protocol_name_len > LABELMAXLEN)
73 return -1;
74 if (customization_label_len > LABELMAXLEN)
75 return -1;
76
77 bufptr = labelset;
78 *bufptr++ = 2;
79 *bufptr++ = protocol_name_len;
80 bufptr = buffer_add(bufptr, labelset + labelset_maxlen, protocol_name, protocol_name_len);
81 if (bufptr != NULL && bufptr < labelset + labelset_maxlen)
82 *bufptr++ = customization_label_len;
83 bufptr = buffer_add(bufptr, labelset + labelset_maxlen,
84 customization_label, customization_label_len);
85
86 if (bufptr != NULL && bufptr - labelset == 3 + protocol_name_len + customization_label_len) {
87 *labelset_len = bufptr - labelset;
88 return 0;
89 }
90 return -1;
91 }
92
93
labelset_add(unsigned char * labelset,unsigned long * labelset_len,const unsigned long labelset_maxlen,const unsigned char * label,const unsigned char label_len)94 int labelset_add(unsigned char* labelset, unsigned long* labelset_len, const unsigned long labelset_maxlen,
95 const unsigned char* label, const unsigned char label_len)
96 {
97 unsigned char* bufptr;
98 if (labelset_len == NULL)
99 return -1;
100 if (*labelset_len > LABELSETMAXLEN || labelset_maxlen > LABELSETMAXLEN)
101 return -1;
102 if (*labelset_len >= labelset_maxlen || *labelset_len + label_len + 1 > labelset_maxlen)
103 return -1;
104 if (*labelset_len < 3 || labelset_maxlen < 4)
105 return -1;
106 if (label_len > LABELMAXLEN)
107 return -1;
108
109 labelset[0]++;
110 labelset[*labelset_len] = label_len;
111 bufptr = labelset + *labelset_len + 1;
112 bufptr = buffer_add(bufptr, labelset + labelset_maxlen, label, label_len);
113 if (bufptr == NULL)
114 return -1;
115 if (bufptr - labelset >= labelset_maxlen)
116 return -1;
117 if (bufptr - labelset != *labelset_len + 1 + label_len)
118 return -1;
119
120 *labelset_len += (1 + label_len);
121 return 0;
122 }
123
labelset_validate(const unsigned char * labelset,const unsigned long labelset_len)124 int labelset_validate(const unsigned char* labelset, const unsigned long labelset_len)
125 {
126 unsigned char num_labels = 0;
127 unsigned char count = 0;
128 unsigned long offset = 0;
129 unsigned char label_len = 0;
130
131 if (labelset == NULL)
132 return -1;
133 if (labelset_len < 3 || labelset_len > LABELSETMAXLEN)
134 return -1;
135
136 num_labels = labelset[0];
137 offset = 1;
138 for (count = 0; count < num_labels; count++) {
139 label_len = labelset[offset];
140 if (label_len > LABELMAXLEN)
141 return -1;
142 offset += 1 + label_len;
143 if (offset > labelset_len)
144 return -1;
145 }
146 if (offset != labelset_len)
147 return -1;
148 return 0;
149 }
150
labelset_is_empty(const unsigned char * labelset,const unsigned long labelset_len)151 int labelset_is_empty(const unsigned char* labelset, const unsigned long labelset_len)
152 {
153 if (labelset_len != 3)
154 return 0;
155 return 1;
156 }
157
158