7728284befd9c10846a0b5bc6ef7e0f2ba509f0c
[openssl.git] / ssl / s3_pkt.c
1 /* ssl/s3_pkt.c */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3  * All rights reserved.
4  *
5  * This package is an SSL implementation written
6  * by Eric Young (eay@cryptsoft.com).
7  * The implementation was written so as to conform with Netscapes SSL.
8  * 
9  * This library is free for commercial and non-commercial use as long as
10  * the following conditions are aheared to.  The following conditions
11  * apply to all code found in this distribution, be it the RC4, RSA,
12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13  * included with this distribution is covered by the same copyright terms
14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15  * 
16  * Copyright remains Eric Young's, and as such any Copyright notices in
17  * the code are not to be removed.
18  * If this package is used in a product, Eric Young should be given attribution
19  * as the author of the parts of the library used.
20  * This can be in the form of a textual message at program startup or
21  * in documentation (online or textual) provided with the package.
22  * 
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  * 1. Redistributions of source code must retain the copyright
27  *    notice, this list of conditions and the following disclaimer.
28  * 2. Redistributions in binary form must reproduce the above copyright
29  *    notice, this list of conditions and the following disclaimer in the
30  *    documentation and/or other materials provided with the distribution.
31  * 3. All advertising materials mentioning features or use of this software
32  *    must display the following acknowledgement:
33  *    "This product includes cryptographic software written by
34  *     Eric Young (eay@cryptsoft.com)"
35  *    The word 'cryptographic' can be left out if the rouines from the library
36  *    being used are not cryptographic related :-).
37  * 4. If you include any Windows specific code (or a derivative thereof) from 
38  *    the apps directory (application code) you must include an acknowledgement:
39  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40  * 
41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  * 
53  * The licence and distribution terms for any publically available version or
54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
55  * copied and put under another distribution licence
56  * [including the GNU Public Licence.]
57  */
58 /* ====================================================================
59  * Copyright (c) 1998-1999 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  */
111
112 #include <stdio.h>
113 #include <errno.h>
114 #define USE_SOCKETS
115 #include <openssl/evp.h>
116 #include <openssl/buffer.h>
117 #include "ssl_locl.h"
118
119 static int do_ssl3_write(SSL *s, int type, const unsigned char *buf,
120                          unsigned int len);
121 static int ssl3_write_pending(SSL *s, int type, const unsigned char *buf,
122                               unsigned int len);
123 static int ssl3_get_record(SSL *s);
124 static int do_compress(SSL *ssl);
125 static int do_uncompress(SSL *ssl);
126 static int do_change_cipher_spec(SSL *ssl);
127
128 static int ssl3_read_n(SSL *s, int n, int max, int extend)
129         {
130         /* If extend == 0, obtain new n-byte packet; if extend == 1, increase
131          * packet by another n bytes.
132          * The packet will be in the sub-array of s->s3->rbuf.buf specified
133          * by s->packet and s->packet_length.
134          * (If s->read_ahead is set, 'max' bytes may be stored in rbuf
135          * [plus s->packet_length bytes if extend == 1].)
136          */
137         int i,off,newb;
138
139         if (!extend)
140                 {
141                 /* start with empty packet ... */
142                 if (s->s3->rbuf.left == 0)
143                         s->s3->rbuf.offset = 0;
144                 s->packet = s->s3->rbuf.buf + s->s3->rbuf.offset;
145                 s->packet_length = 0;
146                 /* ... now we can act as if 'extend' was set */
147                 }
148
149         /* if there is enough in the buffer from a previous read, take some */
150         if (s->s3->rbuf.left >= (int)n)
151                 {
152                 s->packet_length+=n;
153                 s->s3->rbuf.left-=n;
154                 s->s3->rbuf.offset+=n;
155                 return(n);
156                 }
157
158         /* else we need to read more data */
159         if (!s->read_ahead)
160                 max=n;
161
162         {
163                 /* avoid buffer overflow */
164                 int max_max = SSL3_RT_MAX_PACKET_SIZE - s->packet_length;
165                 if (s->options & SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER)
166                         max_max += SSL3_RT_MAX_EXTRA;
167                 if (max > max_max)
168                         max = max_max;
169         }
170
171         off = s->packet_length;
172         newb = s->s3->rbuf.left;
173         /* Move any available bytes to front of buffer:
174          * 'off' bytes already pointed to by 'packet',
175          * 'newb' extra ones at the end */
176         if (s->packet != s->s3->rbuf.buf)
177                 {
178                 /*  off > 0 */
179                 memmove(s->s3->rbuf.buf, s->packet, off+newb);
180                 s->packet = s->s3->rbuf.buf;
181                 }
182         
183         while (newb < n)
184                 {
185                 /* Now we have off+newb bytes at the front of s->s3->rbuf.buf and need
186                  * to read in more until we have off+n (up to off+max if possible) */
187
188                 clear_sys_error();
189                 if (s->rbio != NULL)
190                         {
191                         s->rwstate=SSL_READING;
192                         i=BIO_read(s->rbio,     &(s->s3->rbuf.buf[off+newb]), max-newb);
193                         }
194                 else
195                         {
196                         SSLerr(SSL_F_SSL3_READ_N,SSL_R_READ_BIO_NOT_SET);
197                         i = -1;
198                         }
199
200                 if (i <= 0)
201                         {
202                         s->s3->rbuf.left = newb;
203                         return(i);
204                         }
205                 newb+=i;
206                 }
207
208         /* done reading, now the book-keeping */
209         s->s3->rbuf.offset = off + n;
210         s->s3->rbuf.left = newb - n;
211         s->packet_length += n;
212         return(n);
213         }
214
215 /* Call this to get a new input record.
216  * It will return <= 0 if more data is needed, normally due to an error
217  * or non-blocking IO.
218  * When it finishes, one packet has been decoded and can be found in
219  * ssl->s3->rrec.type    - is the type of record
220  * ssl->s3->rrec.data,   - data
221  * ssl->s3->rrec.length, - number of bytes
222  */
223 static int ssl3_get_record(SSL *s)
224         {
225         int ssl_major,ssl_minor,al;
226         int n,i,ret= -1;
227         SSL3_BUFFER *rb;
228         SSL3_RECORD *rr;
229         SSL_SESSION *sess;
230         unsigned char *p;
231         unsigned char md[EVP_MAX_MD_SIZE];
232         short version;
233         unsigned int mac_size;
234         int clear=0,extra;
235
236         rr= &(s->s3->rrec);
237         rb= &(s->s3->rbuf);
238         sess=s->session;
239
240         if (s->options & SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER)
241                 extra=SSL3_RT_MAX_EXTRA;
242         else
243                 extra=0;
244
245 again:
246         /* check if we have the header */
247         if (    (s->rstate != SSL_ST_READ_BODY) ||
248                 (s->packet_length < SSL3_RT_HEADER_LENGTH)) 
249                 {
250                 n=ssl3_read_n(s,SSL3_RT_HEADER_LENGTH,
251                         SSL3_RT_MAX_PACKET_SIZE,0);
252                 if (n <= 0) return(n); /* error or non-blocking */
253                 s->rstate=SSL_ST_READ_BODY;
254
255                 p=s->packet;
256
257                 /* Pull apart the header into the SSL3_RECORD */
258                 rr->type= *(p++);
259                 ssl_major= *(p++);
260                 ssl_minor= *(p++);
261                 version=(ssl_major<<8)|ssl_minor;
262                 n2s(p,rr->length);
263
264                 /* Lets check version */
265                 if (s->first_packet)
266                         {
267                         s->first_packet=0;
268                         }
269                 else
270                         {
271                         if (version != s->version)
272                                 {
273                                 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_WRONG_VERSION_NUMBER);
274                                 /* Send back error using their
275                                  * version number :-) */
276                                 s->version=version;
277                                 al=SSL_AD_PROTOCOL_VERSION;
278                                 goto f_err;
279                                 }
280                         }
281
282                 if ((version>>8) != SSL3_VERSION_MAJOR)
283                         {
284                         SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_WRONG_VERSION_NUMBER);
285                         goto err;
286                         }
287
288                 if (rr->length > 
289                         (unsigned int)SSL3_RT_MAX_ENCRYPTED_LENGTH+extra)
290                         {
291                         al=SSL_AD_RECORD_OVERFLOW;
292                         SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_PACKET_LENGTH_TOO_LONG);
293                         goto f_err;
294                         }
295
296                 /* now s->rstate == SSL_ST_READ_BODY; */
297                 }
298
299         /* get and decode the data */
300         if (s->rstate == SSL_ST_READ_BODY)
301                 {
302                 if (rr->length > (s->packet_length-SSL3_RT_HEADER_LENGTH))
303                         {
304                         i=rr->length;
305                         n=ssl3_read_n(s,i,i,1);
306                         if (n <= 0) return(n); /* error or non-blocking io */
307                         }
308                 s->rstate=SSL_ST_READ_HEADER;
309                 }
310
311         /* At this point, we have the data in s->packet and there should be
312          * s->packet_length bytes, we must not 'overrun' this buffer :-)
313          * One of the following functions will copy the data from the
314          * s->packet buffer */
315
316         rr->input= &(s->packet[SSL3_RT_HEADER_LENGTH]);
317
318         /* ok, we can now read from 's->packet' data into 'rr'
319          * rr->input points at rr->length bytes, which
320          * need to be copied into rr->data by either
321          * the decryption or by the decompression
322          * When the data is 'copied' into the rr->data buffer,
323          * rr->input will be pointed at the new buffer */ 
324
325         /* Set the state for the following operations */
326         s->rstate=SSL_ST_READ_HEADER;
327
328         /* We now have - encrypted [ MAC [ compressed [ plain ] ] ]
329          * rr->length bytes of encrypted compressed stuff. */
330
331         /* check is not needed I belive */
332         if (rr->length > (unsigned int)SSL3_RT_MAX_ENCRYPTED_LENGTH+extra)
333                 {
334                 al=SSL_AD_RECORD_OVERFLOW;
335                 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_ENCRYPTED_LENGTH_TOO_LONG);
336                 goto f_err;
337                 }
338
339         /* decrypt in place in 'rr->input' */
340         rr->data=rr->input;
341
342         if (!s->method->ssl3_enc->enc(s,0))
343                 {
344                 al=SSL_AD_DECRYPT_ERROR;
345                 goto f_err;
346                 }
347 #ifdef TLS_DEBUG
348 printf("dec %d\n",rr->length);
349 { unsigned int z; for (z=0; z<rr->length; z++) printf("%02X%c",rr->data[z],((z+1)%16)?' ':'\n'); }
350 printf("\n");
351 #endif
352         /* r->length is now the compressed data plus mac */
353         if (    (sess == NULL) ||
354                 (s->enc_read_ctx == NULL) ||
355                 (s->read_hash == NULL))
356                 clear=1;
357
358         if (!clear)
359                 {
360                 mac_size=EVP_MD_size(s->read_hash);
361
362                 if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH+extra+mac_size)
363                         {
364                         al=SSL_AD_RECORD_OVERFLOW;
365                         SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_PRE_MAC_LENGTH_TOO_LONG);
366                         goto f_err;
367                         }
368                 /* check MAC for rr->input' */
369                 if (rr->length < mac_size)
370                         {
371                         al=SSL_AD_DECODE_ERROR;
372                         SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_LENGTH_TOO_SHORT);
373                         goto f_err;
374                         }
375                 rr->length-=mac_size;
376                 i=s->method->ssl3_enc->mac(s,md,0);
377                 if (memcmp(md,&(rr->data[rr->length]),mac_size) != 0)
378                         {
379                         al=SSL_AD_BAD_RECORD_MAC;
380                         SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_BAD_MAC_DECODE);
381                         ret= -1;
382                         goto f_err;
383                         }
384                 }
385
386         /* r->length is now just compressed */
387         if (s->expand != NULL)
388                 {
389                 if (rr->length > 
390                         (unsigned int)SSL3_RT_MAX_COMPRESSED_LENGTH+extra)
391                         {
392                         al=SSL_AD_RECORD_OVERFLOW;
393                         SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_COMPRESSED_LENGTH_TOO_LONG);
394                         goto f_err;
395                         }
396                 if (!do_uncompress(s))
397                         {
398                         al=SSL_AD_DECOMPRESSION_FAILURE;
399                         SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_BAD_DECOMPRESSION);
400                         goto f_err;
401                         }
402                 }
403
404         if (rr->length > (unsigned int)SSL3_RT_MAX_PLAIN_LENGTH+extra)
405                 {
406                 al=SSL_AD_RECORD_OVERFLOW;
407                 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_DATA_LENGTH_TOO_LONG);
408                 goto f_err;
409                 }
410
411         rr->off=0;
412         /* So at this point the following is true
413          * ssl->s3->rrec.type   is the type of record
414          * ssl->s3->rrec.length == number of bytes in record
415          * ssl->s3->rrec.off    == offset to first valid byte
416          * ssl->s3->rrec.data   == where to take bytes from, increment
417          *                         after use :-).
418          */
419
420         /* we have pulled in a full packet so zero things */
421         s->packet_length=0;
422
423         /* just read a 0 length packet */
424         if (rr->length == 0) goto again;
425
426         return(1);
427 f_err:
428         ssl3_send_alert(s,SSL3_AL_FATAL,al);
429 err:
430         return(ret);
431         }
432
433 static int do_uncompress(SSL *ssl)
434         {
435         int i;
436         SSL3_RECORD *rr;
437
438         rr= &(ssl->s3->rrec);
439         i=COMP_expand_block(ssl->expand,rr->comp,
440                 SSL3_RT_MAX_PLAIN_LENGTH,rr->data,(int)rr->length);
441         if (i < 0)
442                 return(0);
443         else
444                 rr->length=i;
445         rr->data=rr->comp;
446
447         return(1);
448         }
449
450 static int do_compress(SSL *ssl)
451         {
452         int i;
453         SSL3_RECORD *wr;
454
455         wr= &(ssl->s3->wrec);
456         i=COMP_compress_block(ssl->compress,wr->data,
457                 SSL3_RT_MAX_COMPRESSED_LENGTH,
458                 wr->input,(int)wr->length);
459         if (i < 0)
460                 return(0);
461         else
462                 wr->length=i;
463
464         wr->input=wr->data;
465         return(1);
466         }
467
468 /* Call this to write data
469  * It will return <= 0 if not all data has been sent or non-blocking IO.
470  */
471 int ssl3_write_bytes(SSL *s, int type, const void *_buf, int len)
472         {
473         const unsigned char *buf=_buf;
474         unsigned int tot,n,nw;
475         int i;
476
477         s->rwstate=SSL_NOTHING;
478         tot=s->s3->wnum;
479         s->s3->wnum=0;
480
481         if (SSL_in_init(s) && !s->in_handshake)
482                 {
483                 i=s->handshake_func(s);
484                 if (i < 0) return(i);
485                 if (i == 0)
486                         {
487                         SSLerr(SSL_F_SSL3_WRITE_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE);
488                         return(-1);
489                         }
490                 }
491
492         n=(len-tot);
493         for (;;)
494                 {
495                 if (n > SSL3_RT_MAX_PLAIN_LENGTH)
496                         nw=SSL3_RT_MAX_PLAIN_LENGTH;
497                 else
498                         nw=n;
499                         
500                 i=do_ssl3_write(s,type,&(buf[tot]),nw);
501                 if (i <= 0)
502                         {
503                         s->s3->wnum=tot;
504                         return(i);
505                         }
506
507                 if (type == SSL3_RT_HANDSHAKE)
508                         ssl3_finish_mac(s,&(buf[tot]),i);
509
510                 if ((i == (int)n) ||
511                         (type == SSL3_RT_APPLICATION_DATA &&
512                          (s->mode & SSL_MODE_ENABLE_PARTIAL_WRITE)))
513                         {
514                         return(tot+i);
515                         }
516
517                 n-=i;
518                 tot+=i;
519                 }
520         }
521
522 static int do_ssl3_write(SSL *s, int type, const unsigned char *buf,
523                          unsigned int len)
524         {
525         unsigned char *p,*plen;
526         int i,mac_size,clear=0;
527         SSL3_RECORD *wr;
528         SSL3_BUFFER *wb;
529         SSL_SESSION *sess;
530
531         /* first check is there is a SSL3_RECORD still being written
532          * out.  This will happen with non blocking IO */
533         if (s->s3->wbuf.left != 0)
534                 return(ssl3_write_pending(s,type,buf,len));
535
536         /* If we have an alert to send, lets send it */
537         if (s->s3->alert_dispatch)
538                 {
539                 i=ssl3_dispatch_alert(s);
540                 if (i <= 0)
541                         return(i);
542                 /* if it went, fall through and send more stuff */
543                 }
544
545         if (len <= 0) return(len);
546         
547         wr= &(s->s3->wrec);
548         wb= &(s->s3->wbuf);
549         sess=s->session;
550
551         if (    (sess == NULL) ||
552                 (s->enc_write_ctx == NULL) ||
553                 (s->write_hash == NULL))
554                 clear=1;
555
556         if (clear)
557                 mac_size=0;
558         else
559                 mac_size=EVP_MD_size(s->write_hash);
560
561         p=wb->buf;
562
563         /* write the header */
564         *(p++)=type&0xff;
565         wr->type=type;
566
567         *(p++)=(s->version>>8);
568         *(p++)=s->version&0xff;
569         
570         /* record where we are to write out packet length */
571         plen=p; 
572         p+=2;
573         
574         /* lets setup the record stuff. */
575         wr->data=p;
576         wr->length=(int)len;
577         wr->input=(unsigned char *)buf;
578
579         /* we now 'read' from wr->input, wr->length bytes into
580          * wr->data */
581
582         /* first we compress */
583         if (s->compress != NULL)
584                 {
585                 if (!do_compress(s))
586                         {
587                         SSLerr(SSL_F_DO_SSL3_WRITE,SSL_R_COMPRESSION_FAILURE);
588                         goto err;
589                         }
590                 }
591         else
592                 {
593                 memcpy(wr->data,wr->input,wr->length);
594                 wr->input=wr->data;
595                 }
596
597         /* we should still have the output to wr->data and the input
598          * from wr->input.  Length should be wr->length.
599          * wr->data still points in the wb->buf */
600
601         if (mac_size != 0)
602                 {
603                 s->method->ssl3_enc->mac(s,&(p[wr->length]),1);
604                 wr->length+=mac_size;
605                 wr->input=p;
606                 wr->data=p;
607                 }
608
609         /* ssl3_enc can only have an error on read */
610         s->method->ssl3_enc->enc(s,1);
611
612         /* record length after mac and block padding */
613         s2n(wr->length,plen);
614
615         /* we should now have
616          * wr->data pointing to the encrypted data, which is
617          * wr->length long */
618         wr->type=type; /* not needed but helps for debugging */
619         wr->length+=SSL3_RT_HEADER_LENGTH;
620
621         /* Now lets setup wb */
622         wb->left=wr->length;
623         wb->offset=0;
624
625         s->s3->wpend_tot=len;
626         s->s3->wpend_buf=buf;
627         s->s3->wpend_type=type;
628         s->s3->wpend_ret=len;
629
630         /* we now just need to write the buffer */
631         return(ssl3_write_pending(s,type,buf,len));
632 err:
633         return(-1);
634         }
635
636 /* if s->s3->wbuf.left != 0, we need to call this */
637 static int ssl3_write_pending(SSL *s, int type, const unsigned char *buf,
638                               unsigned int len)
639         {
640         int i;
641
642 /* XXXX */
643         if ((s->s3->wpend_tot > (int)len)
644                 || ((s->s3->wpend_buf != buf) &&
645                         !(s->mode & SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER))
646                 || (s->s3->wpend_type != type))
647                 {
648                 SSLerr(SSL_F_SSL3_WRITE_PENDING,SSL_R_BAD_WRITE_RETRY);
649                 return(-1);
650                 }
651
652         for (;;)
653                 {
654                 clear_sys_error();
655                 if (s->wbio != NULL)
656                         {
657                         s->rwstate=SSL_WRITING;
658                         i=BIO_write(s->wbio,
659                                 (char *)&(s->s3->wbuf.buf[s->s3->wbuf.offset]),
660                                 (unsigned int)s->s3->wbuf.left);
661                         }
662                 else
663                         {
664                         SSLerr(SSL_F_SSL3_WRITE_PENDING,SSL_R_BIO_NOT_SET);
665                         i= -1;
666                         }
667                 if (i == s->s3->wbuf.left)
668                         {
669                         s->s3->wbuf.left=0;
670                         s->rwstate=SSL_NOTHING;
671                         return(s->s3->wpend_ret);
672                         }
673                 else if (i <= 0)
674                         return(i);
675                 s->s3->wbuf.offset+=i;
676                 s->s3->wbuf.left-=i;
677                 }
678         }
679
680 int ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len)
681         {
682         int al,i,j,n,ret;
683         SSL3_RECORD *rr;
684         void (*cb)()=NULL;
685         BIO *bio;
686
687         if (s->s3->rbuf.buf == NULL) /* Not initialized yet */
688                 if (!ssl3_setup_buffers(s))
689                         return(-1);
690
691         if (!s->in_handshake && SSL_in_init(s))
692                 {
693                 i=s->handshake_func(s);
694                 if (i < 0) return(i);
695                 if (i == 0)
696                         {
697                         SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE);
698                         return(-1);
699                         }
700                 }
701 start:
702         s->rwstate=SSL_NOTHING;
703
704         /* s->s3->rrec.type         - is the type of record
705          * s->s3->rrec.data,    - data
706          * s->s3->rrec.off,     - offset into 'data' for next read
707          * s->s3->rrec.length,  - number of bytes. */
708         rr= &(s->s3->rrec);
709
710         /* get new packet */
711         if ((rr->length == 0) || (s->rstate == SSL_ST_READ_BODY))
712                 {
713                 ret=ssl3_get_record(s);
714                 if (ret <= 0) return(ret);
715                 }
716
717         /* we now have a packet which can be read and processed */
718
719         if (s->s3->change_cipher_spec && (rr->type != SSL3_RT_HANDSHAKE))
720                 {
721                 al=SSL_AD_UNEXPECTED_MESSAGE;
722                 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_DATA_BETWEEN_CCS_AND_FINISHED);
723                 goto err;
724                 }
725
726         /* If the other end has shutdown, throw anything we read away */
727         if (s->shutdown & SSL_RECEIVED_SHUTDOWN)
728                 {
729                 rr->length=0;
730                 s->rwstate=SSL_NOTHING;
731                 return(0);
732                 }
733
734         /* Check for an incoming 'Hello Request' message from client */
735         if ((rr->type == SSL3_RT_HANDSHAKE) && (rr->length == 4) &&
736                 (rr->data[0] == SSL3_MT_HELLO_REQUEST) &&
737                 (s->session != NULL) && (s->session->cipher != NULL))
738                 {
739                 if ((rr->data[1] != 0) || (rr->data[2] != 0) ||
740                         (rr->data[3] != 0))
741                         {
742                         al=SSL_AD_DECODE_ERROR;
743                         SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_BAD_HELLO_REQUEST);
744                         goto err;
745                         }
746
747                 if (SSL_is_init_finished(s) &&
748                         !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) &&
749                         !s->s3->renegotiate)
750                         {
751                         ssl3_renegotiate(s);
752                         if (ssl3_renegotiate_check(s))
753                                 {
754                                 n=s->handshake_func(s);
755                                 if (n < 0) return(n);
756                                 if (n == 0)
757                                         {
758                                         SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE);
759                                         return(-1);
760                                         }
761                                 }
762                         }
763                 rr->length=0;
764 /* ZZZ */       goto start;
765                 }
766
767         /* if it is not the type we want, or we have shutdown and want
768          * the peer shutdown */
769         if ((rr->type != type) || (s->shutdown & SSL_SENT_SHUTDOWN))
770                 {
771                 if (rr->type == SSL3_RT_ALERT)
772                         {
773                         if ((rr->length != 2) || (rr->off != 0))
774                                 {
775                                 al=SSL_AD_DECODE_ERROR;
776                                 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_BAD_ALERT_RECORD);
777                                 goto f_err;
778                                 }
779
780                         i=rr->data[0];
781                         n=rr->data[1];
782
783                         /* clear from buffer */
784                         rr->length=0;
785
786                         if (s->info_callback != NULL)
787                                 cb=s->info_callback;
788                         else if (s->ctx->info_callback != NULL)
789                                 cb=s->ctx->info_callback;
790
791                         if (cb != NULL)
792                                 {
793                                 j=(i<<8)|n;
794                                 cb(s,SSL_CB_READ_ALERT,j);
795                                 }
796
797                         if (i == 1)
798                                 {
799                                 s->s3->warn_alert=n;
800                                 if (n == SSL_AD_CLOSE_NOTIFY)
801                                         {
802                                         s->shutdown|=SSL_RECEIVED_SHUTDOWN;
803                                         return(0);
804                                         }
805                                 }
806                         else if (i == 2)
807                                 {
808                                 char tmp[16];
809
810                                 s->rwstate=SSL_NOTHING;
811                                 s->s3->fatal_alert=n;
812                                 SSLerr(SSL_F_SSL3_READ_BYTES,
813                                         SSL_AD_REASON_OFFSET+n);
814                                 sprintf(tmp,"%d",n);
815                                 ERR_add_error_data(2,"SSL alert number ",tmp);
816                                 s->shutdown|=SSL_RECEIVED_SHUTDOWN;
817                                 SSL_CTX_remove_session(s->ctx,s->session);
818                                 return(0);
819                                 }
820                         else
821                                 {
822                                 al=SSL_AD_ILLEGAL_PARAMETER;
823                                 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_UNKNOWN_ALERT_TYPE);
824                                 goto f_err;
825                                 }
826
827                         rr->length=0;
828                         goto start;
829                         }
830
831                 if (s->shutdown & SSL_SENT_SHUTDOWN)
832                         {
833                         s->rwstate=SSL_NOTHING;
834                         rr->length=0;
835                         return(0);
836                         }
837
838                 if (rr->type == SSL3_RT_CHANGE_CIPHER_SPEC)
839                         {
840                         if (    (rr->length != 1) || (rr->off != 0) ||
841                                 (rr->data[0] != SSL3_MT_CCS))
842                                 {
843                                 i=SSL_AD_ILLEGAL_PARAMETER;
844                                 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_BAD_CHANGE_CIPHER_SPEC);
845                                 goto err;
846                                 }
847
848                         rr->length=0;
849                         s->s3->change_cipher_spec=1;
850                         if (!do_change_cipher_spec(s))
851                                 goto err;
852                         else
853                                 goto start;
854                         }
855
856                 /* else we have a handshake */
857                 if ((rr->type == SSL3_RT_HANDSHAKE) &&
858                         !s->in_handshake)
859                         {
860                         if (((s->state&SSL_ST_MASK) == SSL_ST_OK) &&
861                                 !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS))
862                                 {
863                                 s->state=SSL_ST_BEFORE|(s->server)
864                                                 ?SSL_ST_ACCEPT
865                                                 :SSL_ST_CONNECT;
866                                 s->new_session=1;
867                                 }
868                         n=s->handshake_func(s);
869                         if (n < 0) return(n);
870                         if (n == 0)
871                                 {
872                                 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE);
873                                 return(-1);
874                                 }
875
876                         /* In the case where we try to read application data
877                          * the first time, but we trigger an SSL handshake, we
878                          * return -1 with the retry option set.  I do this
879                          * otherwise renegotiation can cause nasty problems 
880                          * in the non-blocking world */
881
882                         s->rwstate=SSL_READING;
883                         bio=SSL_get_rbio(s);
884                         BIO_clear_retry_flags(bio);
885                         BIO_set_retry_read(bio);
886                         return(-1);
887                         }
888
889                 switch (rr->type)
890                         {
891                 default:
892 #ifndef NO_TLS
893                         /* TLS just ignores unknown message types */
894                         if (s->version == TLS1_VERSION)
895                                 {
896                                 goto start;
897                                 }
898 #endif
899                 case SSL3_RT_CHANGE_CIPHER_SPEC:
900                 case SSL3_RT_ALERT:
901                 case SSL3_RT_HANDSHAKE:
902                         al=SSL_AD_UNEXPECTED_MESSAGE;
903                         SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_UNEXPECTED_RECORD);
904                         goto f_err;
905                 case SSL3_RT_APPLICATION_DATA:
906                         /* At this point, we were expecting something else,
907                          * but have application data.  What we do is set the
908                          * error, and return -1.  On the way out, if the
909                          * library was running inside ssl3_read() and it makes
910                          * sense to read application data at this point, we
911                          * will indulge it.  This will mostly happen during
912                          * session renegotiation.
913                          */
914                         if (s->s3->in_read_app_data &&
915                                 (s->s3->total_renegotiations != 0) &&
916                                 ((
917                                   (s->state & SSL_ST_CONNECT) &&
918                                   (s->state >= SSL3_ST_CW_CLNT_HELLO_A) &&
919                                   (s->state <= SSL3_ST_CR_SRVR_HELLO_A)
920                                  ) || (
921                                   (s->state & SSL_ST_ACCEPT) &&
922                                   (s->state <= SSL3_ST_SW_HELLO_REQ_A) &&
923                                   (s->state >= SSL3_ST_SR_CLNT_HELLO_A)
924                                  )
925                                 ))
926                                 {
927                                 s->s3->in_read_app_data=0;
928                                 return(-1);
929                                 }
930                         else
931                                 {
932                                 al=SSL_AD_UNEXPECTED_MESSAGE;
933                                 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_UNEXPECTED_RECORD);
934                                 goto f_err;
935                                 }
936                         }
937                 }
938
939         /* make sure that we are not getting application data when we
940          * are doing a handshake for the first time */
941         if (SSL_in_init(s) && (type == SSL3_RT_APPLICATION_DATA) &&
942                 (s->enc_read_ctx == NULL))
943                 {
944                 al=SSL_AD_UNEXPECTED_MESSAGE;
945                 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_APP_DATA_IN_HANDSHAKE);
946                 goto f_err;
947                 }
948
949         if (len <= 0) return(len);
950
951         if ((unsigned int)len > rr->length)
952                 n=rr->length;
953         else
954                 n=len;
955
956         memcpy(buf,&(rr->data[rr->off]),(unsigned int)n);
957         rr->length-=n;
958         rr->off+=n;
959         if (rr->length <= 0)
960                 {
961                 s->rstate=SSL_ST_READ_HEADER;
962                 rr->off=0;
963                 }
964
965         if (type == SSL3_RT_HANDSHAKE)
966                 ssl3_finish_mac(s,buf,n);
967         return(n);
968 f_err:
969         ssl3_send_alert(s,SSL3_AL_FATAL,al);
970 err:
971         return(-1);
972         }
973
974 static int do_change_cipher_spec(SSL *s)
975         {
976         int i;
977         const char *sender;
978         int slen;
979
980         if (s->state & SSL_ST_ACCEPT)
981                 i=SSL3_CHANGE_CIPHER_SERVER_READ;
982         else
983                 i=SSL3_CHANGE_CIPHER_CLIENT_READ;
984
985         if (s->s3->tmp.key_block == NULL)
986                 {
987                 s->session->cipher=s->s3->tmp.new_cipher;
988                 if (!s->method->ssl3_enc->setup_key_block(s)) return(0);
989                 }
990
991         if (!s->method->ssl3_enc->change_cipher_state(s,i))
992                 return(0);
993
994         /* we have to record the message digest at
995          * this point so we can get it before we read
996          * the finished message */
997         if (s->state & SSL_ST_CONNECT)
998                 {
999                 sender=s->method->ssl3_enc->server_finished_label;
1000                 slen=s->method->ssl3_enc->server_finished_label_len;
1001                 }
1002         else
1003                 {
1004                 sender=s->method->ssl3_enc->client_finished_label;
1005                 slen=s->method->ssl3_enc->client_finished_label_len;
1006                 }
1007
1008         s->s3->tmp.peer_finish_md_len = s->method->ssl3_enc->final_finish_mac(s,
1009                 &(s->s3->finish_dgst1),
1010                 &(s->s3->finish_dgst2),
1011                 sender,slen,s->s3->tmp.peer_finish_md);
1012
1013         return(1);
1014         }
1015
1016 int ssl3_do_write(SSL *s, int type)
1017         {
1018         int ret;
1019
1020         ret=ssl3_write_bytes(s,type,&s->init_buf->data[s->init_off],
1021                              s->init_num);
1022         if (ret == s->init_num)
1023                 return(1);
1024         if (ret < 0) return(-1);
1025         s->init_off+=ret;
1026         s->init_num-=ret;
1027         return(0);
1028         }
1029
1030 void ssl3_send_alert(SSL *s, int level, int desc)
1031         {
1032         /* Map tls/ssl alert value to correct one */
1033         desc=s->method->ssl3_enc->alert_value(desc);
1034         if (desc < 0) return;
1035         /* If a fatal one, remove from cache */
1036         if ((level == 2) && (s->session != NULL))
1037                 SSL_CTX_remove_session(s->ctx,s->session);
1038
1039         s->s3->alert_dispatch=1;
1040         s->s3->send_alert[0]=level;
1041         s->s3->send_alert[1]=desc;
1042         if (s->s3->wbuf.left == 0) /* data still being written out */
1043                 ssl3_dispatch_alert(s);
1044         /* else data is still being written out, we will get written
1045          * some time in the future */
1046         }
1047
1048 int ssl3_dispatch_alert(SSL *s)
1049         {
1050         int i,j;
1051         void (*cb)()=NULL;
1052
1053         s->s3->alert_dispatch=0;
1054         i=do_ssl3_write(s,SSL3_RT_ALERT,&s->s3->send_alert[0],2);
1055         if (i <= 0)
1056                 {
1057                 s->s3->alert_dispatch=1;
1058                 }
1059         else
1060                 {
1061                 /* If it is important, send it now.  If the message
1062                  * does not get sent due to non-blocking IO, we will
1063                  * not worry too much. */
1064                 if (s->s3->send_alert[0] == SSL3_AL_FATAL)
1065                         (void)BIO_flush(s->wbio);
1066
1067                 if (s->info_callback != NULL)
1068                         cb=s->info_callback;
1069                 else if (s->ctx->info_callback != NULL)
1070                         cb=s->ctx->info_callback;
1071                 
1072                 if (cb != NULL)
1073                         {
1074                         j=(s->s3->send_alert[0]<<8)|s->s3->send_alert[1];
1075                         cb(s,SSL_CB_WRITE_ALERT,j);
1076                         }
1077                 }
1078         return(i);
1079         }