Import of old SSLeay release: SSLeay 0.8.1b
[openssl.git] / ssl / s3_pkt.c
1 /* ssl/s3_pkt.c */
2 /* Copyright (C) 1995-1997 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 #include <stdio.h>
60 #include <errno.h>
61 #define USE_SOCKETS
62 #include "evp.h"
63 #include "buffer.h"
64 #include "ssl_locl.h"
65
66 /* SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_SSLV3_ALERT_PEER_ERROR_NO_CIPHER);
67  * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_SSLV3_ALERT_PEER_ERROR_NO_CERTIFICATE);
68  * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_SSLV3_ALERT_PEER_ERROR_CERTIFICATE);
69  * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_SSLV3_ALERT_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE);
70  * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_SSLV3_ALERT_UNKNOWN_REMOTE_ERROR_TYPE);
71  * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE);
72  * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_SSLV3_ALERT_BAD_RECORD_MAC);
73  * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE);
74  * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE);
75  * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_SSLV3_ALERT_NO_CERTIFICATE);
76  * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_SSLV3_ALERT_BAD_CERTIFICATE);
77  * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE);
78  * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED);
79  * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED);
80  * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN);
81  * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER);
82  */
83
84 #ifndef NOPROTO
85 static int do_ssl3_write(SSL *s, int type, char *buf, unsigned int len);
86 static int ssl3_write_pending(SSL *s, int type, char *buf, unsigned int len);
87 static int ssl3_get_record(SSL *s);
88 static int do_compress(SSL *ssl);
89 static int do_uncompress(SSL *ssl);
90 #else
91 static int do_ssl3_write();
92 static int ssl3_write_pending();
93 static int ssl3_get_record();
94 static int do_compress();
95 static int do_uncompress();
96 #endif
97
98 static int ssl3_read_n(s,n,max,extend)
99 SSL *s;
100 int n;
101 int max;
102 int extend;
103         {
104         int i,off,newb;
105
106         /* if there is stuff still in the buffer from a previous read,
107          * and there is more than we want, take some. */
108         if (s->s3->rbuf.left >= (int)n)
109                 {
110                 if (extend)
111                         s->packet_length+=n;
112                 else
113                         {
114                         s->packet= &(s->s3->rbuf.buf[s->s3->rbuf.offset]);
115                         s->packet_length=n;
116                         }
117                 s->s3->rbuf.left-=n;
118                 s->s3->rbuf.offset+=n;
119                 return(n);
120                 }
121
122         /* else we need to read more data */
123         if (!s->read_ahead) max=n;
124         if (max > SSL3_RT_MAX_PACKET_SIZE)
125                 max=SSL3_RT_MAX_PACKET_SIZE;
126
127         /* First check if there is some left or we want to extend */
128         off=0;
129         if (    (s->s3->rbuf.left != 0) ||
130                 ((s->packet_length != 0) && extend))
131                 {
132                 newb=s->s3->rbuf.left;
133                 if (extend)
134                         {
135                         /* Copy bytes back to the front of the buffer 
136                          * Take the bytes already pointed to by 'packet'
137                          * and take the extra ones on the end. */
138                         off=s->packet_length;
139                         if (s->packet != s->s3->rbuf.buf)
140                                 memcpy(s->s3->rbuf.buf,s->packet,newb+off);
141                         }
142                 else if (s->s3->rbuf.offset != 0)
143                         { /* so the data is not at the start of the buffer */
144                         memcpy(s->s3->rbuf.buf,
145                                 &(s->s3->rbuf.buf[s->s3->rbuf.offset]),newb);
146                         s->s3->rbuf.offset=0;
147                         }
148
149                 s->s3->rbuf.left=0;
150                 }
151         else
152                 newb=0;
153
154         /* So we now have 'newb' bytes at the front of 
155          * s->s3->rbuf.buf and need to read some more in on the end
156          * We start reading into the buffer at 's->s3->rbuf.offset'
157          */
158         s->packet=s->s3->rbuf.buf;
159
160         while (newb < n)
161                 {
162                 errno=0;
163                 if (s->rbio != NULL)
164                         {
165                         s->rwstate=SSL_READING;
166                         i=BIO_read(s->rbio,
167                                 (char *)&(s->s3->rbuf.buf[off+newb]),
168                                 max-newb);
169                         }
170                 else
171                         {
172                         SSLerr(SSL_F_SSL3_READ_N,SSL_R_READ_BIO_NOT_SET);
173                         i= -1;
174                         }
175
176                 if (i <= 0)
177                         {
178                         s->s3->rbuf.left+=newb;
179                         return(i);
180                         }
181                 newb+=i;
182                 }
183
184         /* record used data read */
185         if (newb > n)
186                 {
187                 s->s3->rbuf.offset=n+off;
188                 s->s3->rbuf.left=newb-n;
189                 }
190         else
191                 {
192                 s->s3->rbuf.offset=0;
193                 s->s3->rbuf.left=0;
194                 }
195
196         if (extend)
197                 s->packet_length+=n;
198         else
199                 s->packet_length+=n;
200         return(n);
201         }
202
203 /* Call this to get a new input record.
204  * It will return <= 0 if more data is needed, normally due to an error
205  * or non-blocking IO.
206  * When it finishes, one packet has been decoded and can be found in
207  * ssl->s3->rrec.type   - is the type of record
208  * ssl->s3->rrec.data,  - data
209  * ssl->s3->rrec.length, - number of bytes
210  */
211 static int ssl3_get_record(s)
212 SSL *s;
213         {
214         int ssl_major,ssl_minor,al;
215         int n,i,ret= -1;
216         SSL3_BUFFER *rb;
217         SSL3_RECORD *rr;
218         SSL_SESSION *sess;
219         unsigned char *p;
220         unsigned char md[EVP_MAX_MD_SIZE];
221         short version;
222         unsigned int mac_size;
223         int clear=0,extra;
224
225         rr= &(s->s3->rrec);
226         rb= &(s->s3->rbuf);
227         sess=s->session;
228
229         if (s->ctx->options & SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER)
230                 extra=SSL3_RT_MAX_EXTRA;
231         else
232                 extra=0;
233
234 again:
235         /* check if we have the header */
236         if (    (s->rstate != SSL_ST_READ_BODY) ||
237                 (s->packet_length < SSL3_RT_HEADER_LENGTH)) 
238                 {
239                 n=ssl3_read_n(s,SSL3_RT_HEADER_LENGTH,
240                         SSL3_RT_MAX_PACKET_SIZE,0);
241                 if (n <= 0) return(n); /* error or non-blocking */
242                 s->rstate=SSL_ST_READ_BODY;
243
244                 p=s->packet;
245
246                 /* Pull apart the header into the SSL3_RECORD */
247                 rr->type= *(p++);
248                 ssl_major= *(p++);
249                 ssl_minor= *(p++);
250                 version=(ssl_major<<8)|ssl_minor;
251                 n2s(p,rr->length);
252
253                 /* Lets check version */
254                 if (s->first_packet)
255                         {
256                         s->first_packet=0;
257                         }
258                 else
259                         {
260                 if (    (ssl_major != SSL3_VERSION_MAJOR) ||
261                         (ssl_minor != SSL3_VERSION_MINOR))
262                         {
263                         al=SSL3_AD_ILLEGAL_PARAMETER;
264                         SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_WRONG_VERSION_NUMBER);
265                         goto f_err;
266                         }
267                         }
268
269                 if (s->version != SSL3_VERSION_MAJOR)
270                         {
271                         SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_INTERNAL_ERROR);
272                         goto err;
273                         }
274
275                 if (rr->length > 
276                         (unsigned int)SSL3_RT_MAX_ENCRYPTED_LENGTH+extra)
277                         {
278                         al=SSL3_AD_ILLEGAL_PARAMETER;
279                         SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_PACKET_LENGTH_TOO_LONG);
280                         goto f_err;
281                         }
282
283                 s->rstate=SSL_ST_READ_BODY;
284                 }
285
286         /* get and decode the data */
287         if (s->rstate == SSL_ST_READ_BODY)
288                 {
289                 if (rr->length > (s->packet_length-SSL3_RT_HEADER_LENGTH))
290                         {
291                         i=rr->length;
292                         /*-(s->packet_length-SSL3_RT_HEADER_LENGTH); */
293                         n=ssl3_read_n(s,i,i,1);
294                         if (n <= 0) return(n); /* error or non-blocking io */
295                         }
296                 s->rstate=SSL_ST_READ_HEADER;
297                 }
298
299         /* At this point, we have the data in s->packet and there should be
300          * s->packet_length bytes, we must not 'overrun' this buffer :-)
301          * One of the following functions will copy the data from the
302          * s->packet buffer */
303
304         rr->input= &(s->packet[SSL3_RT_HEADER_LENGTH]);
305
306         /* ok, we can now read from 's->packet' data into 'rr'
307          * rr->input points at rr->length bytes, which
308          * need to be copied into rr->data by either
309          * the decryption or by the decompression
310          * When the data is 'copied' into the rr->data buffer,
311          * rr->input will be pointed at the new buffer */ 
312
313         /* Set the state for the following operations */
314         s->rstate=SSL_ST_READ_HEADER;
315
316         /* We now have - encrypted [ MAC [ compressed [ plain ] ] ]
317          * rr->length bytes of encrypted compressed stuff. */
318
319         /* check is not needed I belive */
320         if (rr->length > (unsigned int)SSL3_RT_MAX_ENCRYPTED_LENGTH+extra)
321                 {
322                 al=SSL3_AD_ILLEGAL_PARAMETER;
323                 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_ENCRYPTED_LENGTH_TOO_LONG);
324                 goto f_err;
325                 }
326
327         /* decrypt in place in 'rr->input' */
328         rr->data=rr->input;
329
330         if (!ssl3_enc(s,0))
331                 {
332                 al=SSL3_AD_ILLEGAL_PARAMETER;
333                 goto f_err;
334                 }
335
336         /* r->length is now the compressed data plus mac */
337         if (    (sess == NULL) ||
338                 (s->enc_read_ctx == NULL) ||
339                 (s->read_hash == NULL))
340                 clear=1;
341
342         if (!clear)
343                 {
344                 mac_size=EVP_MD_size(s->read_hash);
345
346                 if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH+extra+mac_size)
347                         {
348                         al=SSL3_AD_ILLEGAL_PARAMETER;
349                         SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_PRE_MAC_LENGTH_TOO_LONG);
350                         goto f_err;
351                         }
352                 /* check MAC for rr->input' */
353                 if (rr->length < mac_size)
354                         {
355                         al=SSL3_AD_ILLEGAL_PARAMETER;
356                         SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_LENGTH_TOO_SHORT);
357                         goto f_err;
358                         }
359                 rr->length-=mac_size;
360                 i=ssl3_mac(s,md,0);
361                 if (memcmp(md,&(rr->data[rr->length]),mac_size) != 0)
362                         {
363                         al=SSL3_AD_BAD_RECORD_MAC;
364                         SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_BAD_MAC_DECODE);
365                         ret=SSL_RWERR_BAD_MAC_DECODE;
366                         goto f_err;
367                         }
368                 }
369
370         /* r->length is now just compressed */
371         if ((sess != NULL) && (sess->read_compression != NULL))
372                 {
373                 if (rr->length > 
374                         (unsigned int)SSL3_RT_MAX_COMPRESSED_LENGTH+extra)
375                         {
376                         al=SSL3_AD_ILLEGAL_PARAMETER;
377                         SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_COMPRESSED_LENGTH_TOO_LONG);
378                         goto f_err;
379                         }
380                 if (!do_uncompress(s))
381                         {
382                         al=SSL3_AD_DECOMPRESSION_FAILURE;
383                         SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_BAD_DECOMPRESSION);
384                         goto f_err;
385                         }
386                 }
387
388         if (rr->length > (unsigned int)SSL3_RT_MAX_PLAIN_LENGTH+extra)
389                 {
390                 al=SSL3_AD_DECOMPRESSION_FAILURE;
391                 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_DATA_LENGTH_TOO_LONG);
392                 goto f_err;
393                 }
394
395         rr->off=0;
396         /* So at this point the following is true
397          * ssl->s3->rrec.type   is the type of record
398          * ssl->s3->rrec.length == number of bytes in record
399          * ssl->s3->rrec.off    == offset to first valid byte
400          * ssl->s3->rrec.data   == where to take bytes from, increment
401          *                         after use :-).
402          */
403
404         /* we have pulled in a full packet so zero things */
405         s->packet_length=0;
406
407         /* just read a 0 length packet */
408         if (rr->length == 0) goto again;
409
410         return(1);
411 f_err:
412         ssl3_send_alert(s,SSL3_AL_FATAL,al);
413 err:
414         return(ret);
415         }
416
417 static int do_uncompress(ssl)
418 SSL *ssl;
419         {
420         return(1);
421         }
422
423 static int do_compress(ssl)
424 SSL *ssl;
425         {
426         return(1);
427         }
428
429 /* Call this write a data
430  * It will return <= 0 if not all data has been sent or non-blocking IO.
431  */
432 int ssl3_write_bytes(s,type,buf,len)
433 SSL *s;
434 int type;
435 char *buf;
436 int len;
437         {
438         unsigned int tot,n,nw;
439         int i;
440
441         s->rwstate=SSL_NOTHING;
442         tot=s->s3->wnum;
443         s->s3->wnum=0;
444
445         if (SSL_in_init(s) && !s->in_handshake)
446                 {
447                 i=s->handshake_func(s);
448                 if (i < 0) return(i);
449                 if (i == 0)
450                         {
451                         SSLerr(SSL_F_SSL3_WRITE_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE);
452                         return(-1);
453                         }
454                 }
455
456         n=(len-tot);
457         for (;;)
458                 {
459                 if (n > SSL3_RT_MAX_PLAIN_LENGTH)
460                         nw=SSL3_RT_MAX_PLAIN_LENGTH;
461                 else
462                         nw=n;
463
464                 i=do_ssl3_write(s,type,&(buf[tot]),nw);
465                 if (i <= 0)
466                         {
467                         s->s3->wnum=tot;
468                         return(i);
469                         }
470
471                 if (type == SSL3_RT_HANDSHAKE)
472                         ssl3_finish_mac(s,(unsigned char *)&(buf[tot]),i);
473
474                 if (i == (int)n) return(tot+i);
475
476                 n-=i;
477                 tot+=i;
478                 }
479         }
480
481 static int do_ssl3_write(s,type,buf,len)
482 SSL *s;
483 int type;
484 char *buf;
485 unsigned int len;
486         {
487         unsigned char *p,*plen;
488         int i,mac_size,clear=0;
489         SSL3_RECORD *wr;
490         SSL3_BUFFER *wb;
491         SSL_SESSION *sess;
492
493         /* first check is there is a SSL3_RECORD still being written
494          * out.  This will happen with non blocking IO */
495         if (s->s3->wbuf.left != 0)
496                 return(ssl3_write_pending(s,type,buf,len));
497
498         /* If we have an alert to send, lets send it */
499         if (s->s3->alert_dispatch)
500                 {
501                 i=ssl3_dispatch_alert(s);
502                 if (i <= 0)
503                         return(i);
504                 /* if it went, fall through and send more stuff */
505                 }
506
507         if (len <= 0) return(len);
508         
509         wr= &(s->s3->wrec);
510         wb= &(s->s3->wbuf);
511         sess=s->session;
512
513         if (    (sess == NULL) ||
514                 (s->enc_write_ctx == NULL) ||
515                 (s->write_hash == NULL))
516                 clear=1;
517
518         if (clear)
519                 mac_size=0;
520         else
521                 mac_size=EVP_MD_size(s->write_hash);
522
523         p=wb->buf;
524
525         /* write the header */
526         *(p++)=type&0xff;
527         wr->type=type;
528
529         *(p++)=SSL3_VERSION_MAJOR;
530         *(p++)=SSL3_VERSION_MINOR;
531         
532         /* record where we are to write out packet length */
533         plen=p; 
534         p+=2;
535         
536         /* lets setup the record stuff. */
537         wr->data=p;
538         wr->length=(int)len;
539         wr->input=(unsigned char *)buf;
540
541         /* we now 'read' from wr->input, wr->length bytes into
542          * wr->data */
543
544         /* first we compress */
545         if ((sess != NULL) && (sess->write_compression != NULL))
546                 {
547                 if (!do_compress(s))
548                         {
549                         SSLerr(SSL_F_DO_SSL3_WRITE,SSL_R_COMPRESSION_FAILURE);
550                         goto err;
551                         }
552                 }
553         else
554                 {
555                 memcpy(wr->data,wr->input,wr->length);
556                 wr->input=wr->data;
557                 }
558
559         /* we should still have the output to wr->data and the input
560          * from wr->input.  Length should be wr->length.
561          * wr->data still points in the wb->buf */
562
563         if (mac_size != 0)
564                 {
565                 ssl3_mac(s,&(p[wr->length]),1);
566                 wr->length+=mac_size;
567                 wr->input=p;
568                 wr->data=p;
569                 }
570
571         /* ssl3_enc can only have an error on read */
572         ssl3_enc(s,1);
573
574         /* record length after mac and block padding */
575         s2n(wr->length,plen);
576
577         /* we should now have
578          * wr->data pointing to the encrypted data, which is
579          * wr->length long */
580         wr->type=type; /* not needed but helps for debugging */
581         wr->length+=SSL3_RT_HEADER_LENGTH;
582
583         /* Now lets setup wb */
584         wb->left=wr->length;
585         wb->offset=0;
586
587         s->s3->wpend_tot=len;
588         s->s3->wpend_buf=buf;
589         s->s3->wpend_type=type;
590         s->s3->wpend_ret=len;
591
592         /* we now just need to write the buffer */
593         return(ssl3_write_pending(s,type,buf,len));
594 err:
595         return(-1);
596         }
597
598 /* if s->s3->wbuf.left != 0, we need to call this */
599 static int ssl3_write_pending(s,type,buf,len)
600 SSL *s;
601 int type;
602 char *buf;
603 unsigned int len;
604         {
605         int i;
606
607         if ((s->s3->wpend_tot != (int)len) || (s->s3->wpend_buf != buf)
608                 || (s->s3->wpend_type != type))
609                 {
610                 SSLerr(SSL_F_SSL3_WRITE_PENDING,SSL_R_BAD_WRITE_RETRY);
611                 return(SSL_RWERR_BAD_WRITE_RETRY);
612                 }
613
614         for (;;)
615                 {
616                 errno=0;
617                 if (s->wbio != NULL)
618                         {
619                         s->rwstate=SSL_WRITING;
620                         i=BIO_write(s->wbio,
621                                 (char *)&(s->s3->wbuf.buf[s->s3->wbuf.offset]),
622                                 (unsigned int)s->s3->wbuf.left);
623                         }
624                 else
625                         {
626                         SSLerr(SSL_F_SSL3_WRITE_PENDING,SSL_R_BIO_NOT_SET);
627                         i= -1;
628                         }
629                 if (i == s->s3->wbuf.left)
630                         {
631                         s->s3->wbuf.left=0;
632                         s->rwstate=SSL_NOTHING;
633                         return(s->s3->wpend_ret);
634                         }
635                 else if (i <= 0)
636                         return(i);
637                 s->s3->wbuf.offset+=i;
638                 s->s3->wbuf.left-=i;
639                 }
640         }
641
642 int ssl3_read_bytes(s,type,buf,len)
643 SSL *s;
644 int type;
645 char *buf;
646 int len;
647         {
648         int al,i,j,n,ret;
649         SSL3_RECORD *rr;
650         unsigned char *sender;
651         void (*cb)()=NULL;
652
653         if (s->s3->rbuf.buf == NULL) /* Not initalised yet */
654                 if (!ssl3_setup_buffers(s))
655                         return(-1);
656
657         if (!s->in_handshake && SSL_in_before(s))
658                 {
659                 i=s->handshake_func(s);
660                 if (i < 0) return(i);
661                 if (i == 0)
662                         {
663                         SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE);
664                         return(-1);
665                         }
666                 }
667 start:
668         s->rwstate=SSL_NOTHING;
669
670         /* s->s3->rrec.type     - is the type of record
671          * s->s3->rrec.data,    - data
672          * s->s3->rrec.off,     - ofset into 'data' for next read
673          * s->s3->rrec.length,  - number of bytes. */
674         rr= &(s->s3->rrec);
675
676         /* get new packet */
677         if ((rr->length == 0) || (s->rstate == SSL_ST_READ_BODY))
678                 {
679                 ret=ssl3_get_record(s);
680                 if (ret <= 0) return(ret);
681                 }
682
683         /* we now have a packet which can be read and processed */
684
685         if (s->s3->change_cipher_spec && (rr->type != SSL3_RT_HANDSHAKE))
686                 {
687                 al=SSL3_AD_UNEXPECTED_MESSAGE;
688                 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_DATA_BETWEEN_CCS_AND_FINISHED);
689                 goto err;
690                 }
691
692         /* If the other end has shutdown, throw anything we read away */
693         if (s->shutdown & SSL_RECEIVED_SHUTDOWN)
694                 {
695                 rr->length=0;
696                 s->rwstate=SSL_NOTHING;
697                 return(0);
698                 }
699
700         /* Check for an incoming 'Client Request' message */
701         if ((rr->type == SSL3_RT_HANDSHAKE) && (rr->length == 4) &&
702                 (rr->data[0] == SSL3_MT_CLIENT_REQUEST) &&
703                 (s->session != NULL) && (s->session->cipher != NULL))
704                 {
705                 if ((rr->data[1] != 0) || (rr->data[2] != 0) ||
706                         (rr->data[3] != 0))
707                         {
708                         al=SSL3_AD_ILLEGAL_PARAMETER;
709                         SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_BAD_CLIENT_REQUEST);
710                         goto err;
711                         }
712
713                 if (SSL_is_init_finished(s) &&
714                         !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS))
715                         {
716                         ssl3_renegotiate(s);
717                         n=s->handshake_func(s);
718                         if (n < 0) return(n);
719                         if (n == 0)
720                                 {
721                                 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE);
722                                 return(-1);
723                                 }
724                         }
725                 rr->length=0;
726 /* ZZZ */       goto start;
727                 }
728
729         /* if it is not the type we want, or we have shutdown and want
730          * the peer shutdown */
731         if ((rr->type != type) || (s->shutdown & SSL_SENT_SHUTDOWN))
732                 {
733                 if (rr->type == SSL3_RT_ALERT)
734                         {
735                         if ((rr->length != 2) || (rr->off != 0))
736                                 {
737                                 al=SSL3_AD_ILLEGAL_PARAMETER;
738                                 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_BAD_ALERT_RECORD);
739                                 goto f_err;
740                                 }
741
742                         i=rr->data[0];
743                         n=rr->data[1];
744
745                         /* clear from buffer */
746                         rr->length=0;
747
748                         if (s->info_callback != NULL)
749                                 cb=s->info_callback;
750                         else if (s->ctx->info_callback != NULL)
751                                 cb=s->ctx->info_callback;
752
753                         if (cb != NULL)
754                                 {
755                                 j=(i<<8)|n;
756                                 cb(s,SSL_CB_READ_ALERT,j);
757                                 }
758
759                         if (i == 1)
760                                 {
761                                 s->s3->warn_alert=n;
762                                 if (n == SSL3_AD_CLOSE_NOTIFY)
763                                         {
764                                         s->shutdown|=SSL_RECEIVED_SHUTDOWN;
765                                         return(0);
766                                         }
767                                 }
768                         else if (i == 2)
769                                 {
770                                 s->rwstate=SSL_NOTHING;
771                                 s->s3->fatal_alert=n;
772                                 SSLerr(SSL_F_SSL3_READ_BYTES,1000+n);
773                                 s->shutdown|=SSL_RECEIVED_SHUTDOWN;
774                                 SSL_CTX_remove_session(s->ctx,s->session);
775                                 return(0);
776                                 }
777                         else
778                                 {
779                                 al=SSL3_AD_ILLEGAL_PARAMETER;
780                                 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_UNKNOWN_ALERT_TYPE);
781                                 goto f_err;
782                                 }
783
784                         rr->length=0;
785                         goto start;
786                         }
787
788                 if (s->shutdown & SSL_SENT_SHUTDOWN)
789                         {
790                         s->rwstate=SSL_NOTHING;
791                         rr->length=0;
792                         return(0);
793                         }
794
795                 if (rr->type == SSL3_RT_CHANGE_CIPHER_SPEC)
796                         {
797                         if (    (rr->length != 1) || (rr->off != 0) ||
798                                 (rr->data[0] != SSL3_MT_CCS))
799                                 {
800                                 i=SSL3_AD_ILLEGAL_PARAMETER;
801                                 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_BAD_CHANGE_CIPHER_SPEC);
802                                 goto err;
803                                 }
804
805                         rr->length=0;
806
807                         s->s3->change_cipher_spec=1;
808
809                         if (s->state & SSL_ST_ACCEPT)
810                                 i=SSL3_CHANGE_CIPHER_SERVER_READ;
811                         else
812                                 i=SSL3_CHANGE_CIPHER_CLIENT_READ;
813
814                         if (s->s3->tmp.key_block == NULL)
815                                 {
816                                 s->session->cipher=s->s3->tmp.new_cipher;
817                                 if (!ssl3_setup_key_block(s))
818                                         goto err;
819                                 }
820
821                         if (!ssl3_change_cipher_state(s,i))
822                                 goto err;
823
824                         /* we have to record the message digest at
825                          * this point so we can get it before we read
826                          * the finished message */
827                         sender=(s->state & SSL_ST_CONNECT)
828                                 ?&(ssl3_server_finished_const[0])
829                                 :&(ssl3_client_finished_const[0]);
830
831                         ssl3_final_finish_mac(s,&(s->s3->finish_dgst1),
832                                 sender,&(s->s3->tmp.finish_md1[0]));
833                         ssl3_final_finish_mac(s,&(s->s3->finish_dgst2),
834                                 sender,&(s->s3->tmp.finish_md2[0]));
835
836                         goto start;
837                         }
838
839                 /* else we have a handshake */
840                 if ((rr->type == SSL3_RT_HANDSHAKE) &&
841                         !s->in_handshake)
842                         {
843                         if (((s->state&SSL_ST_MASK) == SSL_ST_OK) &&
844                                 !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS))
845                                 {
846                                 s->state=SSL_ST_BEFORE;
847                                 s->new_session=1;
848                                 }
849                         n=s->handshake_func(s);
850                         if (n < 0) return(n);
851                         if (n == 0)
852                                 {
853                                 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE);
854                                 return(-1);
855                                 }
856                         goto start;
857                         }
858
859                 al=SSL3_AD_UNEXPECTED_MESSAGE;
860                 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_UNEXPECTED_RECORD);
861                 goto f_err;
862                 }
863
864         /* make sure that we are not getting application data when we
865          * are doing a handshake for the first time */
866         if (SSL_in_init(s) && (type == SSL3_RT_APPLICATION_DATA) &&
867                 (s->enc_read_ctx == NULL))
868                 {
869                 al=SSL3_AD_UNEXPECTED_MESSAGE;
870                 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_APP_DATA_IN_HANDSHAKE);
871                 goto f_err;
872                 }
873
874         if (len <= 0) return(len);
875
876         if ((unsigned int)len > rr->length)
877                 n=rr->length;
878         else
879                 n=len;
880
881         memcpy(buf,&(rr->data[rr->off]),(unsigned int)n);
882         rr->length-=n;
883         rr->off+=n;
884         if (rr->length <= 0)
885                 s->rstate=SSL_ST_READ_HEADER;
886
887         if (type == SSL3_RT_HANDSHAKE)
888                 ssl3_finish_mac(s,(unsigned char *)buf,n);
889         return(n);
890 f_err:
891         ssl3_send_alert(s,SSL3_AL_FATAL,al);
892 err:
893         return(-1);
894         }
895
896 int ssl3_do_write(s,type)
897 SSL *s;
898 int type;
899         {
900         int ret;
901
902         ret=ssl3_write_bytes(s,type,(char *)
903                 &(s->init_buf->data[s->init_off]),s->init_num);
904         if (ret == s->init_num)
905                 return(1);
906         if (ret < 0) return(-1);
907         s->init_off+=ret;
908         s->init_num-=ret;
909         return(0);
910         }
911
912 void ssl3_send_alert(s,level,desc)
913 SSL *s;
914 int level;
915 int desc;
916         {
917         /* If a fatal one, remove from cache */
918         if ((level == 2) && (s->session != NULL))
919                 SSL_CTX_remove_session(s->ctx,s->session);
920
921         s->s3->alert_dispatch=1;
922         s->s3->send_alert[0]=level;
923         s->s3->send_alert[1]=desc;
924         if (s->s3->wbuf.left == 0) /* data still being written out */
925                 ssl3_dispatch_alert(s);
926         /* else data is still being written out, we will get written
927          * some time in the future */
928         }
929
930 int ssl3_dispatch_alert(s)
931 SSL *s;
932         {
933         int i,j;
934         void (*cb)()=NULL;
935
936         s->s3->alert_dispatch=0;
937         i=do_ssl3_write(s,SSL3_RT_ALERT,&(s->s3->send_alert[0]),2);
938         if (i <= 0)
939                 {
940                 s->s3->alert_dispatch=1;
941                 }
942         else
943                 {
944                 /* If it is important, send it now.  If the message
945                  * does not get sent due to non-blocking IO, we will
946                  * not worry too much. */
947                 if (s->s3->send_alert[0] == SSL3_AL_FATAL)
948                         BIO_flush(s->wbio);
949
950                 if (s->info_callback != NULL)
951                         cb=s->info_callback;
952                 else if (s->ctx->info_callback != NULL)
953                         cb=s->ctx->info_callback;
954                 
955                 if (cb != NULL)
956                         {
957                         j=(s->s3->send_alert[0]<<8)|s->s3->send_alert[1];
958                         cb(s,SSL_CB_WRITE_ALERT,j);
959                         }
960                 }
961         return(i);
962         }
963