summaryrefslogtreecommitdiff
path: root/src/lib/libssl/s3_both.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libssl/s3_both.c')
-rw-r--r--src/lib/libssl/s3_both.c164
1 files changed, 142 insertions, 22 deletions
diff --git a/src/lib/libssl/s3_both.c b/src/lib/libssl/s3_both.c
index f3f27715d5..03e0c38770 100644
--- a/src/lib/libssl/s3_both.c
+++ b/src/lib/libssl/s3_both.c
@@ -55,7 +55,61 @@
55 * copied and put under another distribution licence 55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.] 56 * [including the GNU Public Licence.]
57 */ 57 */
58/* ====================================================================
59 * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved.
60 *
61 * Redistribution and use in source and binary forms, with or without
62 * modification, are permitted provided that the following conditions
63 * are met:
64 *
65 * 1. Redistributions of source code must retain the above copyright
66 * notice, this list of conditions and the following disclaimer.
67 *
68 * 2. Redistributions in binary form must reproduce the above copyright
69 * notice, this list of conditions and the following disclaimer in
70 * the documentation and/or other materials provided with the
71 * distribution.
72 *
73 * 3. All advertising materials mentioning features or use of this
74 * software must display the following acknowledgment:
75 * "This product includes software developed by the OpenSSL Project
76 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77 *
78 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79 * endorse or promote products derived from this software without
80 * prior written permission. For written permission, please contact
81 * openssl-core@openssl.org.
82 *
83 * 5. Products derived from this software may not be called "OpenSSL"
84 * nor may "OpenSSL" appear in their names without prior written
85 * permission of the OpenSSL Project.
86 *
87 * 6. Redistributions of any form whatsoever must retain the following
88 * acknowledgment:
89 * "This product includes software developed by the OpenSSL Project
90 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91 *
92 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
96 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103 * OF THE POSSIBILITY OF SUCH DAMAGE.
104 * ====================================================================
105 *
106 * This product includes cryptographic software written by Eric Young
107 * (eay@cryptsoft.com). This product includes software written by Tim
108 * Hudson (tjh@cryptsoft.com).
109 *
110 */
58 111
112#include <string.h>
59#include <stdio.h> 113#include <stdio.h>
60#include <openssl/buffer.h> 114#include <openssl/buffer.h>
61#include <openssl/rand.h> 115#include <openssl/rand.h>
@@ -64,8 +118,27 @@
64#include <openssl/x509.h> 118#include <openssl/x509.h>
65#include "ssl_locl.h" 119#include "ssl_locl.h"
66 120
67int ssl3_send_finished(SSL *s, int a, int b, unsigned char *sender, 121/* send s->init_buf in records of type 'type' */
68 int slen) 122int ssl3_do_write(SSL *s, int type)
123 {
124 int ret;
125
126 ret=ssl3_write_bytes(s,type,&s->init_buf->data[s->init_off],
127 s->init_num);
128 if (ret < 0) return(-1);
129 if (type == SSL3_RT_HANDSHAKE)
130 /* should not be done for 'Hello Request's, but in that case
131 * we'll ignore the result anyway */
132 ssl3_finish_mac(s,(unsigned char *)&s->init_buf->data[s->init_off],ret);
133
134 if (ret == s->init_num)
135 return(1);
136 s->init_off+=ret;
137 s->init_num-=ret;
138 return(0);
139 }
140
141int ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen)
69 { 142 {
70 unsigned char *p,*d; 143 unsigned char *p,*d;
71 int i; 144 int i;
@@ -79,7 +152,9 @@ int ssl3_send_finished(SSL *s, int a, int b, unsigned char *sender,
79 i=s->method->ssl3_enc->final_finish_mac(s, 152 i=s->method->ssl3_enc->final_finish_mac(s,
80 &(s->s3->finish_dgst1), 153 &(s->s3->finish_dgst1),
81 &(s->s3->finish_dgst2), 154 &(s->s3->finish_dgst2),
82 sender,slen,p); 155 sender,slen,s->s3->tmp.finish_md);
156 s->s3->tmp.finish_md_len = i;
157 memcpy(p, s->s3->tmp.finish_md, i);
83 p+=i; 158 p+=i;
84 l=i; 159 l=i;
85 160
@@ -109,7 +184,7 @@ int ssl3_get_finished(SSL *s, int a, int b)
109 unsigned char *p; 184 unsigned char *p;
110 185
111 /* the mac has already been generated when we received the 186 /* the mac has already been generated when we received the
112 * change cipher spec message and is in s->s3->tmp.in_dgst[12] 187 * change cipher spec message and is in s->s3->tmp.peer_finish_md
113 */ 188 */
114 189
115 n=ssl3_get_message(s, 190 n=ssl3_get_message(s,
@@ -121,7 +196,7 @@ int ssl3_get_finished(SSL *s, int a, int b)
121 196
122 if (!ok) return((int)n); 197 if (!ok) return((int)n);
123 198
124 /* If this occurs if we has missed a message */ 199 /* If this occurs, we have missed a message */
125 if (!s->s3->change_cipher_spec) 200 if (!s->s3->change_cipher_spec)
126 { 201 {
127 al=SSL_AD_UNEXPECTED_MESSAGE; 202 al=SSL_AD_UNEXPECTED_MESSAGE;
@@ -130,9 +205,8 @@ int ssl3_get_finished(SSL *s, int a, int b)
130 } 205 }
131 s->s3->change_cipher_spec=0; 206 s->s3->change_cipher_spec=0;
132 207
133 p=(unsigned char *)s->init_buf->data; 208 p = (unsigned char *)s->init_buf->data;
134 209 i = s->s3->tmp.peer_finish_md_len;
135 i=s->method->ssl3_enc->finish_mac_length;
136 210
137 if (i != n) 211 if (i != n)
138 { 212 {
@@ -141,7 +215,7 @@ int ssl3_get_finished(SSL *s, int a, int b)
141 goto f_err; 215 goto f_err;
142 } 216 }
143 217
144 if (memcmp( p, (char *)&(s->s3->tmp.finish_md[0]),i) != 0) 218 if (memcmp(p, s->s3->tmp.peer_finish_md, i) != 0)
145 { 219 {
146 al=SSL_AD_DECRYPT_ERROR; 220 al=SSL_AD_DECRYPT_ERROR;
147 SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_DIGEST_CHECK_FAILED); 221 SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_DIGEST_CHECK_FAILED);
@@ -255,6 +329,11 @@ unsigned long ssl3_output_cert_chain(SSL *s, X509 *x)
255 return(l); 329 return(l);
256 } 330 }
257 331
332/* Obtain handshake message of message type 'mt' (any if mt == -1),
333 * maximum acceptable body length 'max'.
334 * The first four bytes (msg_type and length) are read in state 'st1',
335 * the body is read in state 'stn'.
336 */
258long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok) 337long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok)
259 { 338 {
260 unsigned char *p; 339 unsigned char *p;
@@ -277,15 +356,38 @@ long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok)
277 356
278 p=(unsigned char *)s->init_buf->data; 357 p=(unsigned char *)s->init_buf->data;
279 358
280 if (s->state == st1) 359 if (s->state == st1) /* s->init_num < 4 */
281 { 360 {
282 i=ssl3_read_bytes(s,SSL3_RT_HANDSHAKE,&p[s->init_num], 361 int skip_message;
283 4-s->init_num); 362
284 if (i < (4-s->init_num)) 363 do
285 { 364 {
286 *ok=0; 365 while (s->init_num < 4)
287 return(ssl3_part_read(s,i)); 366 {
367 i=ssl3_read_bytes(s,SSL3_RT_HANDSHAKE,&p[s->init_num],
368 4 - s->init_num);
369 if (i <= 0)
370 {
371 s->rwstate=SSL_READING;
372 *ok = 0;
373 return i;
374 }
375 s->init_num+=i;
376 }
377
378 skip_message = 0;
379 if (!s->server)
380 if (p[0] == SSL3_MT_HELLO_REQUEST)
381 /* The server may always send 'Hello Request' messages --
382 * we are doing a handshake anyway now, so ignore them
383 * if their format is correct. Does not count for
384 * 'Finished' MAC. */
385 if (p[1] == 0 && p[2] == 0 &&p[3] == 0)
386 skip_message = 1;
288 } 387 }
388 while (skip_message);
389
390 /* s->init_num == 4 */
289 391
290 if ((mt >= 0) && (*p != mt)) 392 if ((mt >= 0) && (*p != mt))
291 { 393 {
@@ -293,6 +395,20 @@ long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok)
293 SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_UNEXPECTED_MESSAGE); 395 SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_UNEXPECTED_MESSAGE);
294 goto f_err; 396 goto f_err;
295 } 397 }
398 if ((mt < 0) && (*p == SSL3_MT_CLIENT_HELLO) &&
399 (st1 == SSL3_ST_SR_CERT_A) &&
400 (stn == SSL3_ST_SR_CERT_B))
401 {
402 /* At this point we have got an MS SGC second client
403 * hello (maybe we should always allow the client to
404 * start a new handshake?). We need to restart the mac.
405 * Don't increment {num,total}_renegotiations because
406 * we have not completed the handshake. */
407 ssl3_init_finished_mac(s);
408 }
409
410 ssl3_finish_mac(s, (unsigned char *)s->init_buf->data, 4);
411
296 s->s3->tmp.message_type= *(p++); 412 s->s3->tmp.message_type= *(p++);
297 413
298 n2l3(p,l); 414 n2l3(p,l);
@@ -316,17 +432,21 @@ long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok)
316 /* next state (stn) */ 432 /* next state (stn) */
317 p=(unsigned char *)s->init_buf->data; 433 p=(unsigned char *)s->init_buf->data;
318 n=s->s3->tmp.message_size; 434 n=s->s3->tmp.message_size;
319 if (n > 0) 435 while (n > 0)
320 { 436 {
321 i=ssl3_read_bytes(s,SSL3_RT_HANDSHAKE,&p[s->init_num],n); 437 i=ssl3_read_bytes(s,SSL3_RT_HANDSHAKE,&p[s->init_num],n);
322 if (i != (int)n) 438 if (i <= 0)
323 { 439 {
324 *ok=0; 440 s->rwstate=SSL_READING;
325 return(ssl3_part_read(s,i)); 441 *ok = 0;
442 return i;
326 } 443 }
444 s->init_num += i;
445 n -= i;
327 } 446 }
447 ssl3_finish_mac(s, (unsigned char *)s->init_buf->data, s->init_num);
328 *ok=1; 448 *ok=1;
329 return(n); 449 return s->init_num;
330f_err: 450f_err:
331 ssl3_send_alert(s,SSL3_AL_FATAL,al); 451 ssl3_send_alert(s,SSL3_AL_FATAL,al);
332err: 452err:
@@ -447,7 +567,7 @@ int ssl3_setup_buffers(SSL *s)
447 extra=SSL3_RT_MAX_EXTRA; 567 extra=SSL3_RT_MAX_EXTRA;
448 else 568 else
449 extra=0; 569 extra=0;
450 if ((p=(unsigned char *)Malloc(SSL3_RT_MAX_PACKET_SIZE+extra)) 570 if ((p=Malloc(SSL3_RT_MAX_PACKET_SIZE+extra))
451 == NULL) 571 == NULL)
452 goto err; 572 goto err;
453 s->s3->rbuf.buf=p; 573 s->s3->rbuf.buf=p;
@@ -455,7 +575,7 @@ int ssl3_setup_buffers(SSL *s)
455 575
456 if (s->s3->wbuf.buf == NULL) 576 if (s->s3->wbuf.buf == NULL)
457 { 577 {
458 if ((p=(unsigned char *)Malloc(SSL3_RT_MAX_PACKET_SIZE)) 578 if ((p=Malloc(SSL3_RT_MAX_PACKET_SIZE))
459 == NULL) 579 == NULL)
460 goto err; 580 goto err;
461 s->s3->wbuf.buf=p; 581 s->s3->wbuf.buf=p;