diff options
Diffstat (limited to 'src/lib/libcrypto/ct/ct_oct.c')
-rw-r--r-- | src/lib/libcrypto/ct/ct_oct.c | 74 |
1 files changed, 43 insertions, 31 deletions
diff --git a/src/lib/libcrypto/ct/ct_oct.c b/src/lib/libcrypto/ct/ct_oct.c index 7a45bdb5bf..bd15ab0e92 100644 --- a/src/lib/libcrypto/ct/ct_oct.c +++ b/src/lib/libcrypto/ct/ct_oct.c | |||
@@ -29,7 +29,7 @@ o2i_SCT_signature(SCT *sct, const unsigned char **in, size_t len) | |||
29 | const unsigned char *p; | 29 | const unsigned char *p; |
30 | 30 | ||
31 | if (sct->version != SCT_VERSION_V1) { | 31 | if (sct->version != SCT_VERSION_V1) { |
32 | CTerr(CT_F_O2I_SCT_SIGNATURE, CT_R_UNSUPPORTED_VERSION); | 32 | CTerror(CT_R_UNSUPPORTED_VERSION); |
33 | return -1; | 33 | return -1; |
34 | } | 34 | } |
35 | /* | 35 | /* |
@@ -40,7 +40,7 @@ o2i_SCT_signature(SCT *sct, const unsigned char **in, size_t len) | |||
40 | * all supported algorithms. | 40 | * all supported algorithms. |
41 | */ | 41 | */ |
42 | if (len <= 4) { | 42 | if (len <= 4) { |
43 | CTerr(CT_F_O2I_SCT_SIGNATURE, CT_R_SCT_INVALID_SIGNATURE); | 43 | CTerror(CT_R_SCT_INVALID_SIGNATURE); |
44 | return -1; | 44 | return -1; |
45 | } | 45 | } |
46 | 46 | ||
@@ -49,14 +49,17 @@ o2i_SCT_signature(SCT *sct, const unsigned char **in, size_t len) | |||
49 | sct->hash_alg = *p++; | 49 | sct->hash_alg = *p++; |
50 | sct->sig_alg = *p++; | 50 | sct->sig_alg = *p++; |
51 | if (SCT_get_signature_nid(sct) == NID_undef) { | 51 | if (SCT_get_signature_nid(sct) == NID_undef) { |
52 | CTerr(CT_F_O2I_SCT_SIGNATURE, CT_R_SCT_INVALID_SIGNATURE); | 52 | CTerror(CT_R_SCT_INVALID_SIGNATURE); |
53 | return -1; | 53 | return -1; |
54 | } | 54 | } |
55 | /* Retrieve signature and check it is consistent with the buffer length */ | 55 | /* |
56 | * Retrieve signature and check it is consistent with the buffer | ||
57 | * length | ||
58 | */ | ||
56 | n2s(p, siglen); | 59 | n2s(p, siglen); |
57 | len_remaining -= (p - *in); | 60 | len_remaining -= (p - *in); |
58 | if (siglen > len_remaining) { | 61 | if (siglen > len_remaining) { |
59 | CTerr(CT_F_O2I_SCT_SIGNATURE, CT_R_SCT_INVALID_SIGNATURE); | 62 | CTerror(CT_R_SCT_INVALID_SIGNATURE); |
60 | return -1; | 63 | return -1; |
61 | } | 64 | } |
62 | 65 | ||
@@ -68,13 +71,19 @@ o2i_SCT_signature(SCT *sct, const unsigned char **in, size_t len) | |||
68 | return len - len_remaining; | 71 | return len - len_remaining; |
69 | } | 72 | } |
70 | 73 | ||
71 | SCT *o2i_SCT(SCT **psct, const unsigned char **in, size_t len) | 74 | SCT * |
75 | o2i_SCT(SCT **psct, const unsigned char **in, size_t len) | ||
72 | { | 76 | { |
73 | SCT *sct = NULL; | 77 | SCT *sct = NULL; |
74 | const unsigned char *p; | 78 | const unsigned char *p; |
75 | 79 | ||
80 | /* | ||
81 | * XXX paging Dr Sing. please report to this function for an emergency | ||
82 | * CBS/CBB implantation surgery. Stat. | ||
83 | */ | ||
84 | |||
76 | if (len == 0 || len > MAX_SCT_SIZE) { | 85 | if (len == 0 || len > MAX_SCT_SIZE) { |
77 | CTerr(CT_F_O2I_SCT, CT_R_SCT_INVALID); | 86 | CTerror(CT_R_SCT_INVALID); |
78 | goto err; | 87 | goto err; |
79 | } | 88 | } |
80 | 89 | ||
@@ -97,14 +106,15 @@ SCT *o2i_SCT(SCT **psct, const unsigned char **in, size_t len) | |||
97 | * } | 106 | * } |
98 | */ | 107 | */ |
99 | if (len < 43) { | 108 | if (len < 43) { |
100 | CTerr(CT_F_O2I_SCT, CT_R_SCT_INVALID); | 109 | CTerror(CT_R_SCT_INVALID); |
101 | goto err; | 110 | goto err; |
102 | } | 111 | } |
103 | len -= 43; | 112 | len -= 43; |
104 | p++; | 113 | p++; |
105 | sct->log_id = BUF_memdup(p, CT_V1_HASHLEN); | 114 | sct->log_id = malloc(CT_V1_HASHLEN); |
106 | if (sct->log_id == NULL) | 115 | if (sct->log_id == NULL) |
107 | goto err; | 116 | goto err; |
117 | memcpy(sct->log_id, p, CT_V1_HASHLEN); | ||
108 | sct->log_id_len = CT_V1_HASHLEN; | 118 | sct->log_id_len = CT_V1_HASHLEN; |
109 | p += CT_V1_HASHLEN; | 119 | p += CT_V1_HASHLEN; |
110 | 120 | ||
@@ -112,13 +122,14 @@ SCT *o2i_SCT(SCT **psct, const unsigned char **in, size_t len) | |||
112 | 122 | ||
113 | n2s(p, len2); | 123 | n2s(p, len2); |
114 | if (len < len2) { | 124 | if (len < len2) { |
115 | CTerr(CT_F_O2I_SCT, CT_R_SCT_INVALID); | 125 | CTerror(CT_R_SCT_INVALID); |
116 | goto err; | 126 | goto err; |
117 | } | 127 | } |
118 | if (len2 > 0) { | 128 | if (len2 > 0) { |
119 | sct->ext = BUF_memdup(p, len2); | 129 | sct->ext = malloc(len2); |
120 | if (sct->ext == NULL) | 130 | if (sct->ext == NULL) |
121 | goto err; | 131 | goto err; |
132 | memcpy(sct->ext, p, len2); | ||
122 | } | 133 | } |
123 | sct->ext_len = len2; | 134 | sct->ext_len = len2; |
124 | p += len2; | 135 | p += len2; |
@@ -126,16 +137,17 @@ SCT *o2i_SCT(SCT **psct, const unsigned char **in, size_t len) | |||
126 | 137 | ||
127 | sig_len = o2i_SCT_signature(sct, &p, len); | 138 | sig_len = o2i_SCT_signature(sct, &p, len); |
128 | if (sig_len <= 0) { | 139 | if (sig_len <= 0) { |
129 | CTerr(CT_F_O2I_SCT, CT_R_SCT_INVALID); | 140 | CTerror(CT_R_SCT_INVALID); |
130 | goto err; | 141 | goto err; |
131 | } | 142 | } |
132 | len -= sig_len; | 143 | len -= sig_len; |
133 | *in = p + len; | 144 | *in = p + len; |
134 | } else { | 145 | } else { |
135 | /* If not V1 just cache encoding */ | 146 | /* If not V1 just cache encoding */ |
136 | sct->sct = BUF_memdup(p, len); | 147 | sct->sct = malloc(len); |
137 | if (sct->sct == NULL) | 148 | if (sct->sct == NULL) |
138 | goto err; | 149 | goto err; |
150 | memcpy(sct->sct, p, len); | ||
139 | sct->sct_len = len; | 151 | sct->sct_len = len; |
140 | *in = p + len; | 152 | *in = p + len; |
141 | } | 153 | } |
@@ -158,12 +170,12 @@ i2o_SCT_signature(const SCT *sct, unsigned char **out) | |||
158 | unsigned char *p = NULL, *pstart = NULL; | 170 | unsigned char *p = NULL, *pstart = NULL; |
159 | 171 | ||
160 | if (!SCT_signature_is_complete(sct)) { | 172 | if (!SCT_signature_is_complete(sct)) { |
161 | CTerr(CT_F_I2O_SCT_SIGNATURE, CT_R_SCT_INVALID_SIGNATURE); | 173 | CTerror(CT_R_SCT_INVALID_SIGNATURE); |
162 | goto err; | 174 | goto err; |
163 | } | 175 | } |
164 | 176 | ||
165 | if (sct->version != SCT_VERSION_V1) { | 177 | if (sct->version != SCT_VERSION_V1) { |
166 | CTerr(CT_F_I2O_SCT_SIGNATURE, CT_R_UNSUPPORTED_VERSION); | 178 | CTerror(CT_R_UNSUPPORTED_VERSION); |
167 | goto err; | 179 | goto err; |
168 | } | 180 | } |
169 | 181 | ||
@@ -179,9 +191,9 @@ i2o_SCT_signature(const SCT *sct, unsigned char **out) | |||
179 | p = *out; | 191 | p = *out; |
180 | *out += len; | 192 | *out += len; |
181 | } else { | 193 | } else { |
182 | pstart = p = OPENSSL_malloc(len); | 194 | pstart = p = malloc(len); |
183 | if (p == NULL) { | 195 | if (p == NULL) { |
184 | CTerr(CT_F_I2O_SCT_SIGNATURE, ERR_R_MALLOC_FAILURE); | 196 | CTerror(ERR_R_MALLOC_FAILURE); |
185 | goto err; | 197 | goto err; |
186 | } | 198 | } |
187 | *out = p; | 199 | *out = p; |
@@ -195,7 +207,7 @@ i2o_SCT_signature(const SCT *sct, unsigned char **out) | |||
195 | 207 | ||
196 | return len; | 208 | return len; |
197 | err: | 209 | err: |
198 | OPENSSL_free(pstart); | 210 | free(pstart); |
199 | return -1; | 211 | return -1; |
200 | } | 212 | } |
201 | 213 | ||
@@ -206,7 +218,7 @@ i2o_SCT(const SCT *sct, unsigned char **out) | |||
206 | unsigned char *p = NULL, *pstart = NULL; | 218 | unsigned char *p = NULL, *pstart = NULL; |
207 | 219 | ||
208 | if (!SCT_is_complete(sct)) { | 220 | if (!SCT_is_complete(sct)) { |
209 | CTerr(CT_F_I2O_SCT, CT_R_SCT_NOT_SET); | 221 | CTerror(CT_R_SCT_NOT_SET); |
210 | goto err; | 222 | goto err; |
211 | } | 223 | } |
212 | /* | 224 | /* |
@@ -227,9 +239,9 @@ i2o_SCT(const SCT *sct, unsigned char **out) | |||
227 | p = *out; | 239 | p = *out; |
228 | *out += len; | 240 | *out += len; |
229 | } else { | 241 | } else { |
230 | pstart = p = OPENSSL_malloc(len); | 242 | pstart = p = malloc(len); |
231 | if (p == NULL) { | 243 | if (p == NULL) { |
232 | CTerr(CT_F_I2O_SCT, ERR_R_MALLOC_FAILURE); | 244 | CTerror(ERR_R_MALLOC_FAILURE); |
233 | goto err; | 245 | goto err; |
234 | } | 246 | } |
235 | *out = p; | 247 | *out = p; |
@@ -253,7 +265,7 @@ i2o_SCT(const SCT *sct, unsigned char **out) | |||
253 | 265 | ||
254 | return len; | 266 | return len; |
255 | err: | 267 | err: |
256 | OPENSSL_free(pstart); | 268 | free(pstart); |
257 | return -1; | 269 | return -1; |
258 | } | 270 | } |
259 | 271 | ||
@@ -264,13 +276,13 @@ o2i_SCT_LIST(STACK_OF(SCT) **a, const unsigned char **pp, size_t len) | |||
264 | size_t list_len, sct_len; | 276 | size_t list_len, sct_len; |
265 | 277 | ||
266 | if (len < 2 || len > MAX_SCT_LIST_SIZE) { | 278 | if (len < 2 || len > MAX_SCT_LIST_SIZE) { |
267 | CTerr(CT_F_O2I_SCT_LIST, CT_R_SCT_LIST_INVALID); | 279 | CTerror(CT_R_SCT_LIST_INVALID); |
268 | return NULL; | 280 | return NULL; |
269 | } | 281 | } |
270 | 282 | ||
271 | n2s(*pp, list_len); | 283 | n2s(*pp, list_len); |
272 | if (list_len != len - 2) { | 284 | if (list_len != len - 2) { |
273 | CTerr(CT_F_O2I_SCT_LIST, CT_R_SCT_LIST_INVALID); | 285 | CTerror(CT_R_SCT_LIST_INVALID); |
274 | return NULL; | 286 | return NULL; |
275 | } | 287 | } |
276 | 288 | ||
@@ -291,14 +303,14 @@ o2i_SCT_LIST(STACK_OF(SCT) **a, const unsigned char **pp, size_t len) | |||
291 | SCT *sct; | 303 | SCT *sct; |
292 | 304 | ||
293 | if (list_len < 2) { | 305 | if (list_len < 2) { |
294 | CTerr(CT_F_O2I_SCT_LIST, CT_R_SCT_LIST_INVALID); | 306 | CTerror(CT_R_SCT_LIST_INVALID); |
295 | goto err; | 307 | goto err; |
296 | } | 308 | } |
297 | n2s(*pp, sct_len); | 309 | n2s(*pp, sct_len); |
298 | list_len -= 2; | 310 | list_len -= 2; |
299 | 311 | ||
300 | if (sct_len == 0 || sct_len > list_len) { | 312 | if (sct_len == 0 || sct_len > list_len) { |
301 | CTerr(CT_F_O2I_SCT_LIST, CT_R_SCT_LIST_INVALID); | 313 | CTerror(CT_R_SCT_LIST_INVALID); |
302 | goto err; | 314 | goto err; |
303 | } | 315 | } |
304 | list_len -= sct_len; | 316 | list_len -= sct_len; |
@@ -331,11 +343,11 @@ i2o_SCT_LIST(const STACK_OF(SCT) *a, unsigned char **pp) | |||
331 | if (pp != NULL) { | 343 | if (pp != NULL) { |
332 | if (*pp == NULL) { | 344 | if (*pp == NULL) { |
333 | if ((len = i2o_SCT_LIST(a, NULL)) == -1) { | 345 | if ((len = i2o_SCT_LIST(a, NULL)) == -1) { |
334 | CTerr(CT_F_I2O_SCT_LIST, CT_R_SCT_LIST_INVALID); | 346 | CTerror(CT_R_SCT_LIST_INVALID); |
335 | return -1; | 347 | return -1; |
336 | } | 348 | } |
337 | if ((*pp = OPENSSL_malloc(len)) == NULL) { | 349 | if ((*pp = malloc(len)) == NULL) { |
338 | CTerr(CT_F_I2O_SCT_LIST, ERR_R_MALLOC_FAILURE); | 350 | CTerror(ERR_R_MALLOC_FAILURE); |
339 | return -1; | 351 | return -1; |
340 | } | 352 | } |
341 | is_pp_new = 1; | 353 | is_pp_new = 1; |
@@ -371,7 +383,7 @@ i2o_SCT_LIST(const STACK_OF(SCT) *a, unsigned char **pp) | |||
371 | 383 | ||
372 | err: | 384 | err: |
373 | if (is_pp_new) { | 385 | if (is_pp_new) { |
374 | OPENSSL_free(*pp); | 386 | free(*pp); |
375 | *pp = NULL; | 387 | *pp = NULL; |
376 | } | 388 | } |
377 | return -1; | 389 | return -1; |
@@ -407,6 +419,6 @@ i2d_SCT_LIST(const STACK_OF(SCT) *a, unsigned char **out) | |||
407 | return -1; | 419 | return -1; |
408 | 420 | ||
409 | len = i2d_ASN1_OCTET_STRING(&oct, out); | 421 | len = i2d_ASN1_OCTET_STRING(&oct, out); |
410 | OPENSSL_free(oct.data); | 422 | free(oct.data); |
411 | return len; | 423 | return len; |
412 | } | 424 | } |