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