diff options
Diffstat (limited to 'src/lib/libssl/s3_both.c')
-rw-r--r-- | src/lib/libssl/s3_both.c | 668 |
1 files changed, 314 insertions, 354 deletions
diff --git a/src/lib/libssl/s3_both.c b/src/lib/libssl/s3_both.c index 77f825af31..b2fd5c6f80 100644 --- a/src/lib/libssl/s3_both.c +++ b/src/lib/libssl/s3_both.c | |||
@@ -125,82 +125,81 @@ | |||
125 | #include <openssl/x509.h> | 125 | #include <openssl/x509.h> |
126 | 126 | ||
127 | /* send s->init_buf in records of type 'type' (SSL3_RT_HANDSHAKE or SSL3_RT_CHANGE_CIPHER_SPEC) */ | 127 | /* send s->init_buf in records of type 'type' (SSL3_RT_HANDSHAKE or SSL3_RT_CHANGE_CIPHER_SPEC) */ |
128 | int ssl3_do_write(SSL *s, int type) | 128 | int |
129 | { | 129 | ssl3_do_write(SSL *s, int type) |
130 | { | ||
130 | int ret; | 131 | int ret; |
131 | 132 | ||
132 | ret=ssl3_write_bytes(s,type,&s->init_buf->data[s->init_off], | 133 | ret = ssl3_write_bytes(s, type, &s->init_buf->data[s->init_off], |
133 | s->init_num); | 134 | s->init_num); |
134 | if (ret < 0) return(-1); | 135 | if (ret < 0) |
136 | return (-1); | ||
135 | if (type == SSL3_RT_HANDSHAKE) | 137 | if (type == SSL3_RT_HANDSHAKE) |
136 | /* should not be done for 'Hello Request's, but in that case | 138 | /* should not be done for 'Hello Request's, but in that case |
137 | * we'll ignore the result anyway */ | 139 | * we'll ignore the result anyway */ |
138 | ssl3_finish_mac(s,(unsigned char *)&s->init_buf->data[s->init_off],ret); | 140 | ssl3_finish_mac(s,(unsigned char *)&s->init_buf->data[s->init_off], ret); |
139 | 141 | ||
140 | if (ret == s->init_num) | 142 | if (ret == s->init_num) { |
141 | { | ||
142 | if (s->msg_callback) | 143 | if (s->msg_callback) |
143 | s->msg_callback(1, s->version, type, s->init_buf->data, (size_t)(s->init_off + s->init_num), s, s->msg_callback_arg); | 144 | s->msg_callback(1, s->version, type, s->init_buf->data, (size_t)(s->init_off + s->init_num), s, s->msg_callback_arg); |
144 | return(1); | 145 | return (1); |
145 | } | ||
146 | s->init_off+=ret; | ||
147 | s->init_num-=ret; | ||
148 | return(0); | ||
149 | } | 146 | } |
147 | s->init_off += ret; | ||
148 | s->init_num -= ret; | ||
149 | return (0); | ||
150 | } | ||
150 | 151 | ||
151 | int ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen) | 152 | int |
152 | { | 153 | ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen) |
153 | unsigned char *p,*d; | 154 | { |
155 | unsigned char *p, *d; | ||
154 | int i; | 156 | int i; |
155 | unsigned long l; | 157 | unsigned long l; |
156 | 158 | ||
157 | if (s->state == a) | 159 | if (s->state == a) { |
158 | { | 160 | d = (unsigned char *)s->init_buf->data; |
159 | d=(unsigned char *)s->init_buf->data; | 161 | p = &(d[4]); |
160 | p= &(d[4]); | ||
161 | 162 | ||
162 | i=s->method->ssl3_enc->final_finish_mac(s, | 163 | i = s->method->ssl3_enc->final_finish_mac(s, |
163 | sender,slen,s->s3->tmp.finish_md); | 164 | sender, slen, s->s3->tmp.finish_md); |
164 | if (i == 0) | 165 | if (i == 0) |
165 | return 0; | 166 | return 0; |
166 | s->s3->tmp.finish_md_len = i; | 167 | s->s3->tmp.finish_md_len = i; |
167 | memcpy(p, s->s3->tmp.finish_md, i); | 168 | memcpy(p, s->s3->tmp.finish_md, i); |
168 | p+=i; | 169 | p += i; |
169 | l=i; | 170 | l = i; |
170 | 171 | ||
171 | /* Copy the finished so we can use it for | 172 | /* Copy the finished so we can use it for |
172 | renegotiation checks */ | 173 | renegotiation checks */ |
173 | if(s->type == SSL_ST_CONNECT) | 174 | if (s->type == SSL_ST_CONNECT) { |
174 | { | 175 | OPENSSL_assert(i <= EVP_MAX_MD_SIZE); |
175 | OPENSSL_assert(i <= EVP_MAX_MD_SIZE); | 176 | memcpy(s->s3->previous_client_finished, |
176 | memcpy(s->s3->previous_client_finished, | 177 | s->s3->tmp.finish_md, i); |
177 | s->s3->tmp.finish_md, i); | 178 | s->s3->previous_client_finished_len = i; |
178 | s->s3->previous_client_finished_len=i; | 179 | } else { |
179 | } | 180 | OPENSSL_assert(i <= EVP_MAX_MD_SIZE); |
180 | else | 181 | memcpy(s->s3->previous_server_finished, |
181 | { | 182 | s->s3->tmp.finish_md, i); |
182 | OPENSSL_assert(i <= EVP_MAX_MD_SIZE); | 183 | s->s3->previous_server_finished_len = i; |
183 | memcpy(s->s3->previous_server_finished, | ||
184 | s->s3->tmp.finish_md, i); | ||
185 | s->s3->previous_server_finished_len=i; | ||
186 | } | ||
187 | |||
188 | *(d++)=SSL3_MT_FINISHED; | ||
189 | l2n3(l,d); | ||
190 | s->init_num=(int)l+4; | ||
191 | s->init_off=0; | ||
192 | |||
193 | s->state=b; | ||
194 | } | 184 | } |
195 | 185 | ||
196 | /* SSL3_ST_SEND_xxxxxx_HELLO_B */ | 186 | *(d++) = SSL3_MT_FINISHED; |
197 | return(ssl3_do_write(s,SSL3_RT_HANDSHAKE)); | 187 | l2n3(l, d); |
188 | s->init_num = (int)l + 4; | ||
189 | s->init_off = 0; | ||
190 | |||
191 | s->state = b; | ||
198 | } | 192 | } |
199 | 193 | ||
194 | /* SSL3_ST_SEND_xxxxxx_HELLO_B */ | ||
195 | return (ssl3_do_write(s, SSL3_RT_HANDSHAKE)); | ||
196 | } | ||
197 | |||
200 | #ifndef OPENSSL_NO_NEXTPROTONEG | 198 | #ifndef OPENSSL_NO_NEXTPROTONEG |
201 | /* ssl3_take_mac calculates the Finished MAC for the handshakes messages seen to far. */ | 199 | /* ssl3_take_mac calculates the Finished MAC for the handshakes messages seen to far. */ |
202 | static void ssl3_take_mac(SSL *s) | 200 | static void |
203 | { | 201 | ssl3_take_mac(SSL *s) |
202 | { | ||
204 | const char *sender; | 203 | const char *sender; |
205 | int slen; | 204 | int slen; |
206 | /* If no new cipher setup return immediately: other functions will | 205 | /* If no new cipher setup return immediately: other functions will |
@@ -208,25 +207,23 @@ static void ssl3_take_mac(SSL *s) | |||
208 | */ | 207 | */ |
209 | if (s->s3->tmp.new_cipher == NULL) | 208 | if (s->s3->tmp.new_cipher == NULL) |
210 | return; | 209 | return; |
211 | if (s->state & SSL_ST_CONNECT) | 210 | if (s->state & SSL_ST_CONNECT) { |
212 | { | 211 | sender = s->method->ssl3_enc->server_finished_label; |
213 | sender=s->method->ssl3_enc->server_finished_label; | 212 | slen = s->method->ssl3_enc->server_finished_label_len; |
214 | slen=s->method->ssl3_enc->server_finished_label_len; | 213 | } else { |
215 | } | 214 | sender = s->method->ssl3_enc->client_finished_label; |
216 | else | 215 | slen = s->method->ssl3_enc->client_finished_label_len; |
217 | { | 216 | } |
218 | sender=s->method->ssl3_enc->client_finished_label; | ||
219 | slen=s->method->ssl3_enc->client_finished_label_len; | ||
220 | } | ||
221 | 217 | ||
222 | s->s3->tmp.peer_finish_md_len = s->method->ssl3_enc->final_finish_mac(s, | 218 | s->s3->tmp.peer_finish_md_len = s->method->ssl3_enc->final_finish_mac(s, |
223 | sender,slen,s->s3->tmp.peer_finish_md); | 219 | sender, slen, s->s3->tmp.peer_finish_md); |
224 | } | 220 | } |
225 | #endif | 221 | #endif |
226 | 222 | ||
227 | int ssl3_get_finished(SSL *s, int a, int b) | 223 | int |
228 | { | 224 | ssl3_get_finished(SSL *s, int a, int b) |
229 | int al,i,ok; | 225 | { |
226 | int al, i, ok; | ||
230 | long n; | 227 | long n; |
231 | unsigned char *p; | 228 | unsigned char *p; |
232 | 229 | ||
@@ -236,64 +233,55 @@ int ssl3_get_finished(SSL *s, int a, int b) | |||
236 | */ | 233 | */ |
237 | #endif | 234 | #endif |
238 | 235 | ||
239 | n=s->method->ssl_get_message(s, | 236 | n = s->method->ssl_get_message(s, a, b, SSL3_MT_FINISHED, |
240 | a, | 237 | 64, /* should actually be 36+4 :-) */ &ok); |
241 | b, | ||
242 | SSL3_MT_FINISHED, | ||
243 | 64, /* should actually be 36+4 :-) */ | ||
244 | &ok); | ||
245 | 238 | ||
246 | if (!ok) return((int)n); | 239 | if (!ok) |
240 | return ((int)n); | ||
247 | 241 | ||
248 | /* If this occurs, we have missed a message */ | 242 | /* If this occurs, we have missed a message */ |
249 | if (!s->s3->change_cipher_spec) | 243 | if (!s->s3->change_cipher_spec) { |
250 | { | 244 | al = SSL_AD_UNEXPECTED_MESSAGE; |
251 | al=SSL_AD_UNEXPECTED_MESSAGE; | 245 | SSLerr(SSL_F_SSL3_GET_FINISHED, SSL_R_GOT_A_FIN_BEFORE_A_CCS); |
252 | SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_GOT_A_FIN_BEFORE_A_CCS); | ||
253 | goto f_err; | 246 | goto f_err; |
254 | } | 247 | } |
255 | s->s3->change_cipher_spec=0; | 248 | s->s3->change_cipher_spec = 0; |
256 | 249 | ||
257 | p = (unsigned char *)s->init_msg; | 250 | p = (unsigned char *)s->init_msg; |
258 | i = s->s3->tmp.peer_finish_md_len; | 251 | i = s->s3->tmp.peer_finish_md_len; |
259 | 252 | ||
260 | if (i != n) | 253 | if (i != n) { |
261 | { | 254 | al = SSL_AD_DECODE_ERROR; |
262 | al=SSL_AD_DECODE_ERROR; | 255 | SSLerr(SSL_F_SSL3_GET_FINISHED, SSL_R_BAD_DIGEST_LENGTH); |
263 | SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_BAD_DIGEST_LENGTH); | ||
264 | goto f_err; | 256 | goto f_err; |
265 | } | 257 | } |
266 | 258 | ||
267 | if (CRYPTO_memcmp(p, s->s3->tmp.peer_finish_md, i) != 0) | 259 | if (CRYPTO_memcmp(p, s->s3->tmp.peer_finish_md, i) != 0) { |
268 | { | 260 | al = SSL_AD_DECRYPT_ERROR; |
269 | al=SSL_AD_DECRYPT_ERROR; | 261 | SSLerr(SSL_F_SSL3_GET_FINISHED, SSL_R_DIGEST_CHECK_FAILED); |
270 | SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_DIGEST_CHECK_FAILED); | ||
271 | goto f_err; | 262 | goto f_err; |
272 | } | 263 | } |
273 | 264 | ||
274 | /* Copy the finished so we can use it for | 265 | /* Copy the finished so we can use it for |
275 | renegotiation checks */ | 266 | renegotiation checks */ |
276 | if(s->type == SSL_ST_ACCEPT) | 267 | if (s->type == SSL_ST_ACCEPT) { |
277 | { | 268 | OPENSSL_assert(i <= EVP_MAX_MD_SIZE); |
278 | OPENSSL_assert(i <= EVP_MAX_MD_SIZE); | 269 | memcpy(s->s3->previous_client_finished, |
279 | memcpy(s->s3->previous_client_finished, | 270 | s->s3->tmp.peer_finish_md, i); |
280 | s->s3->tmp.peer_finish_md, i); | 271 | s->s3->previous_client_finished_len = i; |
281 | s->s3->previous_client_finished_len=i; | 272 | } else { |
282 | } | 273 | OPENSSL_assert(i <= EVP_MAX_MD_SIZE); |
283 | else | 274 | memcpy(s->s3->previous_server_finished, |
284 | { | 275 | s->s3->tmp.peer_finish_md, i); |
285 | OPENSSL_assert(i <= EVP_MAX_MD_SIZE); | 276 | s->s3->previous_server_finished_len = i; |
286 | memcpy(s->s3->previous_server_finished, | ||
287 | s->s3->tmp.peer_finish_md, i); | ||
288 | s->s3->previous_server_finished_len=i; | ||
289 | } | ||
290 | |||
291 | return(1); | ||
292 | f_err: | ||
293 | ssl3_send_alert(s,SSL3_AL_FATAL,al); | ||
294 | return(0); | ||
295 | } | 277 | } |
296 | 278 | ||
279 | return (1); | ||
280 | f_err: | ||
281 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | ||
282 | return (0); | ||
283 | } | ||
284 | |||
297 | /* for these 2 messages, we need to | 285 | /* for these 2 messages, we need to |
298 | * ssl->enc_read_ctx re-init | 286 | * ssl->enc_read_ctx re-init |
299 | * ssl->s3->read_sequence zero | 287 | * ssl->s3->read_sequence zero |
@@ -302,48 +290,49 @@ f_err: | |||
302 | * ssl->session->read_compression assign | 290 | * ssl->session->read_compression assign |
303 | * ssl->session->read_hash assign | 291 | * ssl->session->read_hash assign |
304 | */ | 292 | */ |
305 | int ssl3_send_change_cipher_spec(SSL *s, int a, int b) | 293 | int |
306 | { | 294 | ssl3_send_change_cipher_spec(SSL *s, int a, int b) |
295 | { | ||
307 | unsigned char *p; | 296 | unsigned char *p; |
308 | 297 | ||
309 | if (s->state == a) | 298 | if (s->state == a) { |
310 | { | 299 | p = (unsigned char *)s->init_buf->data; |
311 | p=(unsigned char *)s->init_buf->data; | 300 | *p = SSL3_MT_CCS; |
312 | *p=SSL3_MT_CCS; | 301 | s->init_num = 1; |
313 | s->init_num=1; | 302 | s->init_off = 0; |
314 | s->init_off=0; | ||
315 | 303 | ||
316 | s->state=b; | 304 | s->state = b; |
317 | } | 305 | } |
318 | 306 | ||
319 | /* SSL3_ST_CW_CHANGE_B */ | 307 | /* SSL3_ST_CW_CHANGE_B */ |
320 | return(ssl3_do_write(s,SSL3_RT_CHANGE_CIPHER_SPEC)); | 308 | return (ssl3_do_write(s, SSL3_RT_CHANGE_CIPHER_SPEC)); |
321 | } | 309 | } |
322 | 310 | ||
323 | static int ssl3_add_cert_to_buf(BUF_MEM *buf, unsigned long *l, X509 *x) | 311 | static int |
324 | { | 312 | ssl3_add_cert_to_buf(BUF_MEM *buf, unsigned long *l, X509 *x) |
313 | { | ||
325 | int n; | 314 | int n; |
326 | unsigned char *p; | 315 | unsigned char *p; |
327 | 316 | ||
328 | n=i2d_X509(x,NULL); | 317 | n = i2d_X509(x, NULL); |
329 | if (!BUF_MEM_grow_clean(buf,(int)(n+(*l)+3))) | 318 | if (!BUF_MEM_grow_clean(buf,(int)(n + (*l) + 3))) { |
330 | { | 319 | SSLerr(SSL_F_SSL3_ADD_CERT_TO_BUF, ERR_R_BUF_LIB); |
331 | SSLerr(SSL_F_SSL3_ADD_CERT_TO_BUF,ERR_R_BUF_LIB); | 320 | return (-1); |
332 | return(-1); | ||
333 | } | ||
334 | p=(unsigned char *)&(buf->data[*l]); | ||
335 | l2n3(n,p); | ||
336 | i2d_X509(x,&p); | ||
337 | *l+=n+3; | ||
338 | |||
339 | return(0); | ||
340 | } | 321 | } |
322 | p = (unsigned char *)&(buf->data[*l]); | ||
323 | l2n3(n, p); | ||
324 | i2d_X509(x, &p); | ||
325 | *l += n + 3; | ||
341 | 326 | ||
342 | unsigned long ssl3_output_cert_chain(SSL *s, X509 *x) | 327 | return (0); |
343 | { | 328 | } |
329 | |||
330 | unsigned long | ||
331 | ssl3_output_cert_chain(SSL *s, X509 *x) | ||
332 | { | ||
344 | unsigned char *p; | 333 | unsigned char *p; |
345 | int i; | 334 | int i; |
346 | unsigned long l=7; | 335 | unsigned long l = 7; |
347 | BUF_MEM *buf; | 336 | BUF_MEM *buf; |
348 | int no_chain; | 337 | int no_chain; |
349 | 338 | ||
@@ -353,111 +342,99 @@ unsigned long ssl3_output_cert_chain(SSL *s, X509 *x) | |||
353 | no_chain = 0; | 342 | no_chain = 0; |
354 | 343 | ||
355 | /* TLSv1 sends a chain with nothing in it, instead of an alert */ | 344 | /* TLSv1 sends a chain with nothing in it, instead of an alert */ |
356 | buf=s->init_buf; | 345 | buf = s->init_buf; |
357 | if (!BUF_MEM_grow_clean(buf,10)) | 346 | if (!BUF_MEM_grow_clean(buf, 10)) { |
358 | { | 347 | SSLerr(SSL_F_SSL3_OUTPUT_CERT_CHAIN, ERR_R_BUF_LIB); |
359 | SSLerr(SSL_F_SSL3_OUTPUT_CERT_CHAIN,ERR_R_BUF_LIB); | 348 | return (0); |
360 | return(0); | 349 | } |
361 | } | 350 | if (x != NULL) { |
362 | if (x != NULL) | 351 | if (no_chain) { |
363 | { | ||
364 | if (no_chain) | ||
365 | { | ||
366 | if (ssl3_add_cert_to_buf(buf, &l, x)) | 352 | if (ssl3_add_cert_to_buf(buf, &l, x)) |
367 | return(0); | 353 | return (0); |
368 | } | 354 | } else { |
369 | else | ||
370 | { | ||
371 | X509_STORE_CTX xs_ctx; | 355 | X509_STORE_CTX xs_ctx; |
372 | 356 | ||
373 | if (!X509_STORE_CTX_init(&xs_ctx,s->ctx->cert_store,x,NULL)) | 357 | if (!X509_STORE_CTX_init(&xs_ctx, s->ctx->cert_store, x, NULL)) { |
374 | { | 358 | SSLerr(SSL_F_SSL3_OUTPUT_CERT_CHAIN, ERR_R_X509_LIB); |
375 | SSLerr(SSL_F_SSL3_OUTPUT_CERT_CHAIN,ERR_R_X509_LIB); | 359 | return (0); |
376 | return(0); | 360 | } |
377 | } | ||
378 | X509_verify_cert(&xs_ctx); | 361 | X509_verify_cert(&xs_ctx); |
379 | /* Don't leave errors in the queue */ | 362 | /* Don't leave errors in the queue */ |
380 | ERR_clear_error(); | 363 | ERR_clear_error(); |
381 | for (i=0; i < sk_X509_num(xs_ctx.chain); i++) | 364 | for (i = 0; i < sk_X509_num(xs_ctx.chain); i++) { |
382 | { | ||
383 | x = sk_X509_value(xs_ctx.chain, i); | 365 | x = sk_X509_value(xs_ctx.chain, i); |
384 | 366 | ||
385 | if (ssl3_add_cert_to_buf(buf, &l, x)) | 367 | if (ssl3_add_cert_to_buf(buf, &l, x)) { |
386 | { | ||
387 | X509_STORE_CTX_cleanup(&xs_ctx); | 368 | X509_STORE_CTX_cleanup(&xs_ctx); |
388 | return 0; | 369 | return 0; |
389 | } | ||
390 | } | 370 | } |
391 | X509_STORE_CTX_cleanup(&xs_ctx); | ||
392 | } | 371 | } |
372 | X509_STORE_CTX_cleanup(&xs_ctx); | ||
393 | } | 373 | } |
374 | } | ||
394 | /* Thawte special :-) */ | 375 | /* Thawte special :-) */ |
395 | for (i=0; i<sk_X509_num(s->ctx->extra_certs); i++) | 376 | for (i = 0; i < sk_X509_num(s->ctx->extra_certs); i++) { |
396 | { | 377 | x = sk_X509_value(s->ctx->extra_certs, i); |
397 | x=sk_X509_value(s->ctx->extra_certs,i); | ||
398 | if (ssl3_add_cert_to_buf(buf, &l, x)) | 378 | if (ssl3_add_cert_to_buf(buf, &l, x)) |
399 | return(0); | 379 | return (0); |
400 | } | ||
401 | |||
402 | l-=7; | ||
403 | p=(unsigned char *)&(buf->data[4]); | ||
404 | l2n3(l,p); | ||
405 | l+=3; | ||
406 | p=(unsigned char *)&(buf->data[0]); | ||
407 | *(p++)=SSL3_MT_CERTIFICATE; | ||
408 | l2n3(l,p); | ||
409 | l+=4; | ||
410 | return(l); | ||
411 | } | 380 | } |
412 | 381 | ||
382 | l -= 7; | ||
383 | p = (unsigned char *)&(buf->data[4]); | ||
384 | l2n3(l, p); | ||
385 | l += 3; | ||
386 | p = (unsigned char *)&(buf->data[0]); | ||
387 | *(p++) = SSL3_MT_CERTIFICATE; | ||
388 | l2n3(l, p); | ||
389 | l += 4; | ||
390 | return (l); | ||
391 | } | ||
392 | |||
413 | /* Obtain handshake message of message type 'mt' (any if mt == -1), | 393 | /* Obtain handshake message of message type 'mt' (any if mt == -1), |
414 | * maximum acceptable body length 'max'. | 394 | * maximum acceptable body length 'max'. |
415 | * The first four bytes (msg_type and length) are read in state 'st1', | 395 | * The first four bytes (msg_type and length) are read in state 'st1', |
416 | * the body is read in state 'stn'. | 396 | * the body is read in state 'stn'. |
417 | */ | 397 | */ |
418 | long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok) | 398 | long |
419 | { | 399 | ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok) |
400 | { | ||
420 | unsigned char *p; | 401 | unsigned char *p; |
421 | unsigned long l; | 402 | unsigned long l; |
422 | long n; | 403 | long n; |
423 | int i,al; | 404 | int i, al; |
424 | 405 | ||
425 | if (s->s3->tmp.reuse_message) | 406 | if (s->s3->tmp.reuse_message) { |
426 | { | 407 | s->s3->tmp.reuse_message = 0; |
427 | s->s3->tmp.reuse_message=0; | 408 | if ((mt >= 0) && (s->s3->tmp.message_type != mt)) { |
428 | if ((mt >= 0) && (s->s3->tmp.message_type != mt)) | 409 | al = SSL_AD_UNEXPECTED_MESSAGE; |
429 | { | 410 | SSLerr(SSL_F_SSL3_GET_MESSAGE, SSL_R_UNEXPECTED_MESSAGE); |
430 | al=SSL_AD_UNEXPECTED_MESSAGE; | ||
431 | SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_UNEXPECTED_MESSAGE); | ||
432 | goto f_err; | 411 | goto f_err; |
433 | } | 412 | } |
434 | *ok=1; | 413 | *ok = 1; |
435 | s->init_msg = s->init_buf->data + 4; | 414 | s->init_msg = s->init_buf->data + 4; |
436 | s->init_num = (int)s->s3->tmp.message_size; | 415 | s->init_num = (int)s->s3->tmp.message_size; |
437 | return s->init_num; | 416 | return s->init_num; |
438 | } | 417 | } |
439 | 418 | ||
440 | p=(unsigned char *)s->init_buf->data; | 419 | p = (unsigned char *)s->init_buf->data; |
441 | 420 | ||
442 | if (s->state == st1) /* s->init_num < 4 */ | 421 | if (s->state == st1) /* s->init_num < 4 */ |
443 | { | 422 | { |
444 | int skip_message; | 423 | int skip_message; |
445 | 424 | ||
446 | do | 425 | do { |
447 | { | 426 | while (s->init_num < 4) { |
448 | while (s->init_num < 4) | 427 | i = s->method->ssl_read_bytes(s, |
449 | { | 428 | SSL3_RT_HANDSHAKE, &p[s->init_num], |
450 | i=s->method->ssl_read_bytes(s,SSL3_RT_HANDSHAKE, | 429 | 4 - s->init_num, 0); |
451 | &p[s->init_num],4 - s->init_num, 0); | 430 | if (i <= 0) { |
452 | if (i <= 0) | 431 | s->rwstate = SSL_READING; |
453 | { | ||
454 | s->rwstate=SSL_READING; | ||
455 | *ok = 0; | 432 | *ok = 0; |
456 | return i; | 433 | return i; |
457 | } | ||
458 | s->init_num+=i; | ||
459 | } | 434 | } |
460 | 435 | s->init_num += i; | |
436 | } | ||
437 | |||
461 | skip_message = 0; | 438 | skip_message = 0; |
462 | if (!s->server) | 439 | if (!s->server) |
463 | if (p[0] == SSL3_MT_HELLO_REQUEST) | 440 | if (p[0] == SSL3_MT_HELLO_REQUEST) |
@@ -465,79 +442,72 @@ long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok) | |||
465 | * we are doing a handshake anyway now, so ignore them | 442 | * we are doing a handshake anyway now, so ignore them |
466 | * if their format is correct. Does not count for | 443 | * if their format is correct. Does not count for |
467 | * 'Finished' MAC. */ | 444 | * 'Finished' MAC. */ |
468 | if (p[1] == 0 && p[2] == 0 &&p[3] == 0) | 445 | if (p[1] == 0 && p[2] == 0 &&p[3] == 0) { |
469 | { | 446 | s->init_num = 0; |
470 | s->init_num = 0; | 447 | skip_message = 1; |
471 | skip_message = 1; | 448 | |
472 | 449 | if (s->msg_callback) | |
473 | if (s->msg_callback) | 450 | s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, p, 4, s, s->msg_callback_arg); |
474 | s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, p, 4, s, s->msg_callback_arg); | ||
475 | } | ||
476 | } | 451 | } |
452 | } | ||
477 | while (skip_message); | 453 | while (skip_message); |
478 | 454 | ||
479 | /* s->init_num == 4 */ | 455 | /* s->init_num == 4 */ |
480 | 456 | ||
481 | if ((mt >= 0) && (*p != mt)) | 457 | if ((mt >= 0) && (*p != mt)) { |
482 | { | 458 | al = SSL_AD_UNEXPECTED_MESSAGE; |
483 | al=SSL_AD_UNEXPECTED_MESSAGE; | 459 | SSLerr(SSL_F_SSL3_GET_MESSAGE, SSL_R_UNEXPECTED_MESSAGE); |
484 | SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_UNEXPECTED_MESSAGE); | ||
485 | goto f_err; | 460 | goto f_err; |
486 | } | 461 | } |
487 | if ((mt < 0) && (*p == SSL3_MT_CLIENT_HELLO) && | 462 | if ((mt < 0) && (*p == SSL3_MT_CLIENT_HELLO) && |
488 | (st1 == SSL3_ST_SR_CERT_A) && | 463 | (st1 == SSL3_ST_SR_CERT_A) && (stn == SSL3_ST_SR_CERT_B)) { |
489 | (stn == SSL3_ST_SR_CERT_B)) | ||
490 | { | ||
491 | /* At this point we have got an MS SGC second client | 464 | /* At this point we have got an MS SGC second client |
492 | * hello (maybe we should always allow the client to | 465 | * hello (maybe we should always allow the client to |
493 | * start a new handshake?). We need to restart the mac. | 466 | * start a new handshake?). We need to restart the mac. |
494 | * Don't increment {num,total}_renegotiations because | 467 | * Don't increment {num,total}_renegotiations because |
495 | * we have not completed the handshake. */ | 468 | * we have not completed the handshake. */ |
496 | ssl3_init_finished_mac(s); | 469 | ssl3_init_finished_mac(s); |
497 | } | 470 | } |
498 | 471 | ||
499 | s->s3->tmp.message_type= *(p++); | 472 | s->s3->tmp.message_type= *(p++); |
500 | 473 | ||
501 | n2l3(p,l); | 474 | n2l3(p, l); |
502 | if (l > (unsigned long)max) | 475 | if (l > (unsigned long)max) { |
503 | { | 476 | al = SSL_AD_ILLEGAL_PARAMETER; |
504 | al=SSL_AD_ILLEGAL_PARAMETER; | 477 | SSLerr(SSL_F_SSL3_GET_MESSAGE, SSL_R_EXCESSIVE_MESSAGE_SIZE); |
505 | SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_EXCESSIVE_MESSAGE_SIZE); | ||
506 | goto f_err; | 478 | goto f_err; |
507 | } | 479 | } |
508 | if (l > (INT_MAX-4)) /* BUF_MEM_grow takes an 'int' parameter */ | 480 | if (l > (INT_MAX-4)) /* BUF_MEM_grow takes an 'int' parameter */ |
509 | { | 481 | { |
510 | al=SSL_AD_ILLEGAL_PARAMETER; | 482 | al = SSL_AD_ILLEGAL_PARAMETER; |
511 | SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_EXCESSIVE_MESSAGE_SIZE); | 483 | SSLerr(SSL_F_SSL3_GET_MESSAGE, SSL_R_EXCESSIVE_MESSAGE_SIZE); |
512 | goto f_err; | 484 | goto f_err; |
513 | } | 485 | } |
514 | if (l && !BUF_MEM_grow_clean(s->init_buf,(int)l+4)) | 486 | if (l && !BUF_MEM_grow_clean(s->init_buf,(int)l + 4)) { |
515 | { | 487 | SSLerr(SSL_F_SSL3_GET_MESSAGE, ERR_R_BUF_LIB); |
516 | SSLerr(SSL_F_SSL3_GET_MESSAGE,ERR_R_BUF_LIB); | ||
517 | goto err; | 488 | goto err; |
518 | } | 489 | } |
519 | s->s3->tmp.message_size=l; | 490 | s->s3->tmp.message_size = l; |
520 | s->state=stn; | 491 | s->state = stn; |
521 | 492 | ||
522 | s->init_msg = s->init_buf->data + 4; | 493 | s->init_msg = s->init_buf->data + 4; |
523 | s->init_num = 0; | 494 | s->init_num = 0; |
524 | } | 495 | } |
525 | 496 | ||
526 | /* next state (stn) */ | 497 | /* next state (stn) */ |
527 | p = s->init_msg; | 498 | p = s->init_msg; |
528 | n = s->s3->tmp.message_size - s->init_num; | 499 | n = s->s3->tmp.message_size - s->init_num; |
529 | while (n > 0) | 500 | while (n > 0) { |
530 | { | 501 | i = s->method->ssl_read_bytes(s, SSL3_RT_HANDSHAKE, |
531 | i=s->method->ssl_read_bytes(s,SSL3_RT_HANDSHAKE,&p[s->init_num],n,0); | 502 | &p[s->init_num], n, 0); |
532 | if (i <= 0) | 503 | if (i <= 0) { |
533 | { | 504 | s->rwstate = SSL_READING; |
534 | s->rwstate=SSL_READING; | ||
535 | *ok = 0; | 505 | *ok = 0; |
536 | return i; | 506 | return i; |
537 | } | 507 | } |
538 | s->init_num += i; | 508 | s->init_num += i; |
539 | n -= i; | 509 | n -= i; |
540 | } | 510 | } |
541 | 511 | ||
542 | #ifndef OPENSSL_NO_NEXTPROTONEG | 512 | #ifndef OPENSSL_NO_NEXTPROTONEG |
543 | /* If receiving Finished, record MAC of prior handshake messages for | 513 | /* If receiving Finished, record MAC of prior handshake messages for |
@@ -550,64 +520,60 @@ long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok) | |||
550 | ssl3_finish_mac(s, (unsigned char *)s->init_buf->data, s->init_num + 4); | 520 | ssl3_finish_mac(s, (unsigned char *)s->init_buf->data, s->init_num + 4); |
551 | if (s->msg_callback) | 521 | if (s->msg_callback) |
552 | s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, s->init_buf->data, (size_t)s->init_num + 4, s, s->msg_callback_arg); | 522 | s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, s->init_buf->data, (size_t)s->init_num + 4, s, s->msg_callback_arg); |
553 | *ok=1; | 523 | *ok = 1; |
554 | return s->init_num; | 524 | return s->init_num; |
555 | f_err: | 525 | f_err: |
556 | ssl3_send_alert(s,SSL3_AL_FATAL,al); | 526 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
557 | err: | 527 | err: |
558 | *ok=0; | 528 | *ok = 0; |
559 | return(-1); | 529 | return (-1); |
560 | } | 530 | } |
561 | 531 | ||
562 | int ssl_cert_type(X509 *x, EVP_PKEY *pkey) | 532 | int |
563 | { | 533 | ssl_cert_type(X509 *x, EVP_PKEY *pkey) |
534 | { | ||
564 | EVP_PKEY *pk; | 535 | EVP_PKEY *pk; |
565 | int ret= -1,i; | 536 | int ret = -1, i; |
566 | 537 | ||
567 | if (pkey == NULL) | 538 | if (pkey == NULL) |
568 | pk=X509_get_pubkey(x); | 539 | pk = X509_get_pubkey(x); |
569 | else | 540 | else |
570 | pk=pkey; | 541 | pk = pkey; |
571 | if (pk == NULL) goto err; | 542 | if (pk == NULL) |
572 | 543 | goto err; | |
573 | i=pk->type; | 544 | |
574 | if (i == EVP_PKEY_RSA) | 545 | i = pk->type; |
575 | { | 546 | if (i == EVP_PKEY_RSA) { |
576 | ret=SSL_PKEY_RSA_ENC; | 547 | ret = SSL_PKEY_RSA_ENC; |
577 | } | 548 | } else if (i == EVP_PKEY_DSA) { |
578 | else if (i == EVP_PKEY_DSA) | 549 | ret = SSL_PKEY_DSA_SIGN; |
579 | { | 550 | } |
580 | ret=SSL_PKEY_DSA_SIGN; | ||
581 | } | ||
582 | #ifndef OPENSSL_NO_EC | 551 | #ifndef OPENSSL_NO_EC |
583 | else if (i == EVP_PKEY_EC) | 552 | else if (i == EVP_PKEY_EC) { |
584 | { | ||
585 | ret = SSL_PKEY_ECC; | 553 | ret = SSL_PKEY_ECC; |
586 | } | 554 | } |
587 | #endif | 555 | #endif |
588 | else if (i == NID_id_GostR3410_94 || i == NID_id_GostR3410_94_cc) | 556 | else if (i == NID_id_GostR3410_94 || i == NID_id_GostR3410_94_cc) { |
589 | { | ||
590 | ret = SSL_PKEY_GOST94; | 557 | ret = SSL_PKEY_GOST94; |
591 | } | 558 | } else if (i == NID_id_GostR3410_2001 || i == NID_id_GostR3410_2001_cc) { |
592 | else if (i == NID_id_GostR3410_2001 || i == NID_id_GostR3410_2001_cc) | ||
593 | { | ||
594 | ret = SSL_PKEY_GOST01; | 559 | ret = SSL_PKEY_GOST01; |
595 | } | ||
596 | err: | ||
597 | if(!pkey) EVP_PKEY_free(pk); | ||
598 | return(ret); | ||
599 | } | 560 | } |
561 | err: | ||
562 | if (!pkey) | ||
563 | EVP_PKEY_free(pk); | ||
564 | return (ret); | ||
565 | } | ||
600 | 566 | ||
601 | int ssl_verify_alarm_type(long type) | 567 | int |
602 | { | 568 | ssl_verify_alarm_type(long type) |
569 | { | ||
603 | int al; | 570 | int al; |
604 | 571 | ||
605 | switch(type) | 572 | switch (type) { |
606 | { | ||
607 | case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT: | 573 | case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT: |
608 | case X509_V_ERR_UNABLE_TO_GET_CRL: | 574 | case X509_V_ERR_UNABLE_TO_GET_CRL: |
609 | case X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER: | 575 | case X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER: |
610 | al=SSL_AD_UNKNOWN_CA; | 576 | al = SSL_AD_UNKNOWN_CA; |
611 | break; | 577 | break; |
612 | case X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE: | 578 | case X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE: |
613 | case X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE: | 579 | case X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE: |
@@ -620,21 +586,21 @@ int ssl_verify_alarm_type(long type) | |||
620 | case X509_V_ERR_CRL_NOT_YET_VALID: | 586 | case X509_V_ERR_CRL_NOT_YET_VALID: |
621 | case X509_V_ERR_CERT_UNTRUSTED: | 587 | case X509_V_ERR_CERT_UNTRUSTED: |
622 | case X509_V_ERR_CERT_REJECTED: | 588 | case X509_V_ERR_CERT_REJECTED: |
623 | al=SSL_AD_BAD_CERTIFICATE; | 589 | al = SSL_AD_BAD_CERTIFICATE; |
624 | break; | 590 | break; |
625 | case X509_V_ERR_CERT_SIGNATURE_FAILURE: | 591 | case X509_V_ERR_CERT_SIGNATURE_FAILURE: |
626 | case X509_V_ERR_CRL_SIGNATURE_FAILURE: | 592 | case X509_V_ERR_CRL_SIGNATURE_FAILURE: |
627 | al=SSL_AD_DECRYPT_ERROR; | 593 | al = SSL_AD_DECRYPT_ERROR; |
628 | break; | 594 | break; |
629 | case X509_V_ERR_CERT_HAS_EXPIRED: | 595 | case X509_V_ERR_CERT_HAS_EXPIRED: |
630 | case X509_V_ERR_CRL_HAS_EXPIRED: | 596 | case X509_V_ERR_CRL_HAS_EXPIRED: |
631 | al=SSL_AD_CERTIFICATE_EXPIRED; | 597 | al = SSL_AD_CERTIFICATE_EXPIRED; |
632 | break; | 598 | break; |
633 | case X509_V_ERR_CERT_REVOKED: | 599 | case X509_V_ERR_CERT_REVOKED: |
634 | al=SSL_AD_CERTIFICATE_REVOKED; | 600 | al = SSL_AD_CERTIFICATE_REVOKED; |
635 | break; | 601 | break; |
636 | case X509_V_ERR_OUT_OF_MEM: | 602 | case X509_V_ERR_OUT_OF_MEM: |
637 | al=SSL_AD_INTERNAL_ERROR; | 603 | al = SSL_AD_INTERNAL_ERROR; |
638 | break; | 604 | break; |
639 | case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: | 605 | case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: |
640 | case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: | 606 | case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: |
@@ -643,20 +609,20 @@ int ssl_verify_alarm_type(long type) | |||
643 | case X509_V_ERR_CERT_CHAIN_TOO_LONG: | 609 | case X509_V_ERR_CERT_CHAIN_TOO_LONG: |
644 | case X509_V_ERR_PATH_LENGTH_EXCEEDED: | 610 | case X509_V_ERR_PATH_LENGTH_EXCEEDED: |
645 | case X509_V_ERR_INVALID_CA: | 611 | case X509_V_ERR_INVALID_CA: |
646 | al=SSL_AD_UNKNOWN_CA; | 612 | al = SSL_AD_UNKNOWN_CA; |
647 | break; | 613 | break; |
648 | case X509_V_ERR_APPLICATION_VERIFICATION: | 614 | case X509_V_ERR_APPLICATION_VERIFICATION: |
649 | al=SSL_AD_HANDSHAKE_FAILURE; | 615 | al = SSL_AD_HANDSHAKE_FAILURE; |
650 | break; | 616 | break; |
651 | case X509_V_ERR_INVALID_PURPOSE: | 617 | case X509_V_ERR_INVALID_PURPOSE: |
652 | al=SSL_AD_UNSUPPORTED_CERTIFICATE; | 618 | al = SSL_AD_UNSUPPORTED_CERTIFICATE; |
653 | break; | 619 | break; |
654 | default: | 620 | default: |
655 | al=SSL_AD_CERTIFICATE_UNKNOWN; | 621 | al = SSL_AD_CERTIFICATE_UNKNOWN; |
656 | break; | 622 | break; |
657 | } | ||
658 | return(al); | ||
659 | } | 623 | } |
624 | return (al); | ||
625 | } | ||
660 | 626 | ||
661 | #ifndef OPENSSL_NO_BUF_FREELISTS | 627 | #ifndef OPENSSL_NO_BUF_FREELISTS |
662 | /* On some platforms, malloc() performance is bad enough that you can't just | 628 | /* On some platforms, malloc() performance is bad enough that you can't just |
@@ -680,7 +646,7 @@ int ssl_verify_alarm_type(long type) | |||
680 | */ | 646 | */ |
681 | static void * | 647 | static void * |
682 | freelist_extract(SSL_CTX *ctx, int for_read, int sz) | 648 | freelist_extract(SSL_CTX *ctx, int for_read, int sz) |
683 | { | 649 | { |
684 | SSL3_BUF_FREELIST *list; | 650 | SSL3_BUF_FREELIST *list; |
685 | SSL3_BUF_FREELIST_ENTRY *ent = NULL; | 651 | SSL3_BUF_FREELIST_ENTRY *ent = NULL; |
686 | void *result = NULL; | 652 | void *result = NULL; |
@@ -689,13 +655,12 @@ freelist_extract(SSL_CTX *ctx, int for_read, int sz) | |||
689 | list = for_read ? ctx->rbuf_freelist : ctx->wbuf_freelist; | 655 | list = for_read ? ctx->rbuf_freelist : ctx->wbuf_freelist; |
690 | if (list != NULL && sz == (int)list->chunklen) | 656 | if (list != NULL && sz == (int)list->chunklen) |
691 | ent = list->head; | 657 | ent = list->head; |
692 | if (ent != NULL) | 658 | if (ent != NULL) { |
693 | { | ||
694 | list->head = ent->next; | 659 | list->head = ent->next; |
695 | result = ent; | 660 | result = ent; |
696 | if (--list->len == 0) | 661 | if (--list->len == 0) |
697 | list->chunklen = 0; | 662 | list->chunklen = 0; |
698 | } | 663 | } |
699 | CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX); | 664 | CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX); |
700 | if (!result) | 665 | if (!result) |
701 | result = OPENSSL_malloc(sz); | 666 | result = OPENSSL_malloc(sz); |
@@ -704,80 +669,76 @@ freelist_extract(SSL_CTX *ctx, int for_read, int sz) | |||
704 | 669 | ||
705 | static void | 670 | static void |
706 | freelist_insert(SSL_CTX *ctx, int for_read, size_t sz, void *mem) | 671 | freelist_insert(SSL_CTX *ctx, int for_read, size_t sz, void *mem) |
707 | { | 672 | { |
708 | SSL3_BUF_FREELIST *list; | 673 | SSL3_BUF_FREELIST *list; |
709 | SSL3_BUF_FREELIST_ENTRY *ent; | 674 | SSL3_BUF_FREELIST_ENTRY *ent; |
710 | 675 | ||
711 | CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX); | 676 | CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX); |
712 | list = for_read ? ctx->rbuf_freelist : ctx->wbuf_freelist; | 677 | list = for_read ? ctx->rbuf_freelist : ctx->wbuf_freelist; |
713 | if (list != NULL && | 678 | if (list != NULL && (sz == list->chunklen || list->chunklen == 0) && |
714 | (sz == list->chunklen || list->chunklen == 0) && | 679 | list->len < ctx->freelist_max_len && sz >= sizeof(*ent)) { |
715 | list->len < ctx->freelist_max_len && | ||
716 | sz >= sizeof(*ent)) | ||
717 | { | ||
718 | list->chunklen = sz; | 680 | list->chunklen = sz; |
719 | ent = mem; | 681 | ent = mem; |
720 | ent->next = list->head; | 682 | ent->next = list->head; |
721 | list->head = ent; | 683 | list->head = ent; |
722 | ++list->len; | 684 | ++list->len; |
723 | mem = NULL; | 685 | mem = NULL; |
724 | } | 686 | } |
725 | 687 | ||
726 | CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX); | 688 | CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX); |
727 | if (mem) | 689 | if (mem) |
728 | OPENSSL_free(mem); | 690 | OPENSSL_free(mem); |
729 | } | 691 | } |
730 | #else | 692 | #else |
731 | #define freelist_extract(c,fr,sz) OPENSSL_malloc(sz) | 693 | #define freelist_extract(c,fr,sz) OPENSSL_malloc(sz) |
732 | #define freelist_insert(c,fr,sz,m) OPENSSL_free(m) | 694 | #define freelist_insert(c,fr,sz,m) OPENSSL_free(m) |
733 | #endif | 695 | #endif |
734 | 696 | ||
735 | int ssl3_setup_read_buffer(SSL *s) | 697 | int |
736 | { | 698 | ssl3_setup_read_buffer(SSL *s) |
699 | { | ||
737 | unsigned char *p; | 700 | unsigned char *p; |
738 | size_t len,align=0,headerlen; | 701 | size_t len, align = 0, headerlen; |
739 | 702 | ||
740 | if (SSL_version(s) == DTLS1_VERSION || SSL_version(s) == DTLS1_BAD_VER) | 703 | if (SSL_version(s) == DTLS1_VERSION || SSL_version(s) == DTLS1_BAD_VER) |
741 | headerlen = DTLS1_RT_HEADER_LENGTH; | 704 | headerlen = DTLS1_RT_HEADER_LENGTH; |
742 | else | 705 | else |
743 | headerlen = SSL3_RT_HEADER_LENGTH; | 706 | headerlen = SSL3_RT_HEADER_LENGTH; |
744 | 707 | ||
745 | #if defined(SSL3_ALIGN_PAYLOAD) && SSL3_ALIGN_PAYLOAD!=0 | 708 | #if defined(SSL3_ALIGN_PAYLOAD) && SSL3_ALIGN_PAYLOAD!=0 |
746 | align = (-SSL3_RT_HEADER_LENGTH)&(SSL3_ALIGN_PAYLOAD-1); | 709 | align = (-SSL3_RT_HEADER_LENGTH)&(SSL3_ALIGN_PAYLOAD - 1); |
747 | #endif | 710 | #endif |
748 | 711 | ||
749 | if (s->s3->rbuf.buf == NULL) | 712 | if (s->s3->rbuf.buf == NULL) { |
750 | { | 713 | len = SSL3_RT_MAX_PLAIN_LENGTH + |
751 | len = SSL3_RT_MAX_PLAIN_LENGTH | 714 | SSL3_RT_MAX_ENCRYPTED_OVERHEAD + headerlen + align; |
752 | + SSL3_RT_MAX_ENCRYPTED_OVERHEAD | 715 | if (s->options & SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER) { |
753 | + headerlen + align; | ||
754 | if (s->options & SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER) | ||
755 | { | ||
756 | s->s3->init_extra = 1; | 716 | s->s3->init_extra = 1; |
757 | len += SSL3_RT_MAX_EXTRA; | 717 | len += SSL3_RT_MAX_EXTRA; |
758 | } | 718 | } |
759 | #ifndef OPENSSL_NO_COMP | 719 | #ifndef OPENSSL_NO_COMP |
760 | if (!(s->options & SSL_OP_NO_COMPRESSION)) | 720 | if (!(s->options & SSL_OP_NO_COMPRESSION)) |
761 | len += SSL3_RT_MAX_COMPRESSED_OVERHEAD; | 721 | len += SSL3_RT_MAX_COMPRESSED_OVERHEAD; |
762 | #endif | 722 | #endif |
763 | if ((p=freelist_extract(s->ctx, 1, len)) == NULL) | 723 | if ((p = freelist_extract(s->ctx, 1, len)) == NULL) |
764 | goto err; | 724 | goto err; |
765 | s->s3->rbuf.buf = p; | 725 | s->s3->rbuf.buf = p; |
766 | s->s3->rbuf.len = len; | 726 | s->s3->rbuf.len = len; |
767 | } | 727 | } |
768 | 728 | ||
769 | s->packet= &(s->s3->rbuf.buf[0]); | 729 | s->packet = &(s->s3->rbuf.buf[0]); |
770 | return 1; | 730 | return 1; |
771 | 731 | ||
772 | err: | 732 | err: |
773 | SSLerr(SSL_F_SSL3_SETUP_READ_BUFFER,ERR_R_MALLOC_FAILURE); | 733 | SSLerr(SSL_F_SSL3_SETUP_READ_BUFFER, ERR_R_MALLOC_FAILURE); |
774 | return 0; | 734 | return 0; |
775 | } | 735 | } |
776 | 736 | ||
777 | int ssl3_setup_write_buffer(SSL *s) | 737 | int |
778 | { | 738 | ssl3_setup_write_buffer(SSL *s) |
739 | { | ||
779 | unsigned char *p; | 740 | unsigned char *p; |
780 | size_t len,align=0,headerlen; | 741 | size_t len, align = 0, headerlen; |
781 | 742 | ||
782 | if (SSL_version(s) == DTLS1_VERSION || SSL_version(s) == DTLS1_BAD_VER) | 743 | if (SSL_version(s) == DTLS1_VERSION || SSL_version(s) == DTLS1_BAD_VER) |
783 | headerlen = DTLS1_RT_HEADER_LENGTH + 1; | 744 | headerlen = DTLS1_RT_HEADER_LENGTH + 1; |
@@ -785,62 +746,61 @@ int ssl3_setup_write_buffer(SSL *s) | |||
785 | headerlen = SSL3_RT_HEADER_LENGTH; | 746 | headerlen = SSL3_RT_HEADER_LENGTH; |
786 | 747 | ||
787 | #if defined(SSL3_ALIGN_PAYLOAD) && SSL3_ALIGN_PAYLOAD!=0 | 748 | #if defined(SSL3_ALIGN_PAYLOAD) && SSL3_ALIGN_PAYLOAD!=0 |
788 | align = (-SSL3_RT_HEADER_LENGTH)&(SSL3_ALIGN_PAYLOAD-1); | 749 | align = (-SSL3_RT_HEADER_LENGTH)&(SSL3_ALIGN_PAYLOAD - 1); |
789 | #endif | 750 | #endif |
790 | 751 | ||
791 | if (s->s3->wbuf.buf == NULL) | 752 | if (s->s3->wbuf.buf == NULL) { |
792 | { | 753 | len = s->max_send_fragment + |
793 | len = s->max_send_fragment | 754 | SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD + headerlen + align; |
794 | + SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD | ||
795 | + headerlen + align; | ||
796 | #ifndef OPENSSL_NO_COMP | 755 | #ifndef OPENSSL_NO_COMP |
797 | if (!(s->options & SSL_OP_NO_COMPRESSION)) | 756 | if (!(s->options & SSL_OP_NO_COMPRESSION)) |
798 | len += SSL3_RT_MAX_COMPRESSED_OVERHEAD; | 757 | len += SSL3_RT_MAX_COMPRESSED_OVERHEAD; |
799 | #endif | 758 | #endif |
800 | if (!(s->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS)) | 759 | if (!(s->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS)) |
801 | len += headerlen + align | 760 | len += headerlen + align + |
802 | + SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD; | 761 | SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD; |
803 | 762 | ||
804 | if ((p=freelist_extract(s->ctx, 0, len)) == NULL) | 763 | if ((p = freelist_extract(s->ctx, 0, len)) == NULL) |
805 | goto err; | 764 | goto err; |
806 | s->s3->wbuf.buf = p; | 765 | s->s3->wbuf.buf = p; |
807 | s->s3->wbuf.len = len; | 766 | s->s3->wbuf.len = len; |
808 | } | 767 | } |
809 | 768 | ||
810 | return 1; | 769 | return 1; |
811 | 770 | ||
812 | err: | 771 | err: |
813 | SSLerr(SSL_F_SSL3_SETUP_WRITE_BUFFER,ERR_R_MALLOC_FAILURE); | 772 | SSLerr(SSL_F_SSL3_SETUP_WRITE_BUFFER, ERR_R_MALLOC_FAILURE); |
814 | return 0; | 773 | return 0; |
815 | } | 774 | } |
816 | 775 | ||
817 | 776 | ||
818 | int ssl3_setup_buffers(SSL *s) | 777 | int |
819 | { | 778 | ssl3_setup_buffers(SSL *s) |
779 | { | ||
820 | if (!ssl3_setup_read_buffer(s)) | 780 | if (!ssl3_setup_read_buffer(s)) |
821 | return 0; | 781 | return 0; |
822 | if (!ssl3_setup_write_buffer(s)) | 782 | if (!ssl3_setup_write_buffer(s)) |
823 | return 0; | 783 | return 0; |
824 | return 1; | 784 | return 1; |
825 | } | 785 | } |
826 | 786 | ||
827 | int ssl3_release_write_buffer(SSL *s) | 787 | int |
828 | { | 788 | ssl3_release_write_buffer(SSL *s) |
829 | if (s->s3->wbuf.buf != NULL) | 789 | { |
830 | { | 790 | if (s->s3->wbuf.buf != NULL) { |
831 | freelist_insert(s->ctx, 0, s->s3->wbuf.len, s->s3->wbuf.buf); | 791 | freelist_insert(s->ctx, 0, s->s3->wbuf.len, s->s3->wbuf.buf); |
832 | s->s3->wbuf.buf = NULL; | 792 | s->s3->wbuf.buf = NULL; |
833 | } | ||
834 | return 1; | ||
835 | } | 793 | } |
794 | return 1; | ||
795 | } | ||
836 | 796 | ||
837 | int ssl3_release_read_buffer(SSL *s) | 797 | int |
838 | { | 798 | ssl3_release_read_buffer(SSL *s) |
839 | if (s->s3->rbuf.buf != NULL) | 799 | { |
840 | { | 800 | if (s->s3->rbuf.buf != NULL) { |
841 | freelist_insert(s->ctx, 1, s->s3->rbuf.len, s->s3->rbuf.buf); | 801 | freelist_insert(s->ctx, 1, s->s3->rbuf.len, s->s3->rbuf.buf); |
842 | s->s3->rbuf.buf = NULL; | 802 | s->s3->rbuf.buf = NULL; |
843 | } | ||
844 | return 1; | ||
845 | } | 803 | } |
804 | return 1; | ||
805 | } | ||
846 | 806 | ||