ssl/libssl/src/s2_pkt.c
changeset 0 e4d67989cc36
equal deleted inserted replaced
-1:000000000000 0:e4d67989cc36
       
     1 /* ssl/s2_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-2001 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 "ssl_locl.h"
       
   113 #ifndef OPENSSL_NO_SSL2
       
   114 #include <stdio.h>
       
   115 #include <errno.h>
       
   116 #define USE_SOCKETS
       
   117 
       
   118 static int read_n(SSL *s,unsigned int n,unsigned int max,unsigned int extend);
       
   119 static int do_ssl_write(SSL *s, const unsigned char *buf, unsigned int len);
       
   120 static int write_pending(SSL *s, const unsigned char *buf, unsigned int len);
       
   121 static int ssl_mt_error(int n);
       
   122 
       
   123 
       
   124 /* SSL 2.0 imlementation for SSL_read/SSL_peek -
       
   125  * This routine will return 0 to len bytes, decrypted etc if required.
       
   126  */
       
   127 static int ssl2_read_internal(SSL *s, void *buf, int len, int peek)
       
   128 	{
       
   129 	int n;
       
   130 	unsigned char mac[MAX_MAC_SIZE];
       
   131 	unsigned char *p;
       
   132 	int i;
       
   133 	unsigned int mac_size;
       
   134 
       
   135  ssl2_read_again:
       
   136 	if (SSL_in_init(s) && !s->in_handshake)
       
   137 		{
       
   138 		n=s->handshake_func(s);
       
   139 		if (n < 0) return(n);
       
   140 		if (n == 0)
       
   141 			{
       
   142 			SSLerr(SSL_F_SSL2_READ_INTERNAL,SSL_R_SSL_HANDSHAKE_FAILURE);
       
   143 			return(-1);
       
   144 			}
       
   145 		}
       
   146 
       
   147 	clear_sys_error();
       
   148 	s->rwstate=SSL_NOTHING;
       
   149 	if (len <= 0) return(len);
       
   150 
       
   151 	if (s->s2->ract_data_length != 0) /* read from buffer */
       
   152 		{
       
   153 		if (len > s->s2->ract_data_length)
       
   154 			n=s->s2->ract_data_length;
       
   155 		else
       
   156 			n=len;
       
   157 
       
   158 		memcpy(buf,s->s2->ract_data,(unsigned int)n);
       
   159 		if (!peek)
       
   160 			{
       
   161 			s->s2->ract_data_length-=n;
       
   162 			s->s2->ract_data+=n;
       
   163 			if (s->s2->ract_data_length == 0)
       
   164 				s->rstate=SSL_ST_READ_HEADER;
       
   165 			}
       
   166 
       
   167 		return(n);
       
   168 		}
       
   169 
       
   170 	/* s->s2->ract_data_length == 0
       
   171 	 * 
       
   172 	 * Fill the buffer, then goto ssl2_read_again.
       
   173 	 */
       
   174 
       
   175 	if (s->rstate == SSL_ST_READ_HEADER)
       
   176 		{
       
   177 		if (s->first_packet)
       
   178 			{
       
   179 			n=read_n(s,5,SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER+2,0);
       
   180 			if (n <= 0) return(n); /* error or non-blocking */
       
   181 			s->first_packet=0;
       
   182 			p=s->packet;
       
   183 			if (!((p[0] & 0x80) && (
       
   184 				(p[2] == SSL2_MT_CLIENT_HELLO) ||
       
   185 				(p[2] == SSL2_MT_SERVER_HELLO))))
       
   186 				{
       
   187 				SSLerr(SSL_F_SSL2_READ_INTERNAL,SSL_R_NON_SSLV2_INITIAL_PACKET);
       
   188 				return(-1);
       
   189 				}
       
   190 			}
       
   191 		else
       
   192 			{
       
   193 			n=read_n(s,2,SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER+2,0);
       
   194 			if (n <= 0) return(n); /* error or non-blocking */
       
   195 			}
       
   196 		/* part read stuff */
       
   197 
       
   198 		s->rstate=SSL_ST_READ_BODY;
       
   199 		p=s->packet;
       
   200 		/* Do header */
       
   201 		/*s->s2->padding=0;*/
       
   202 		s->s2->escape=0;
       
   203 		s->s2->rlength=(((unsigned int)p[0])<<8)|((unsigned int)p[1]);
       
   204 		if ((p[0] & TWO_BYTE_BIT))		/* Two byte header? */
       
   205 			{
       
   206 			s->s2->three_byte_header=0;
       
   207 			s->s2->rlength&=TWO_BYTE_MASK;	
       
   208 			}
       
   209 		else
       
   210 			{
       
   211 			s->s2->three_byte_header=1;
       
   212 			s->s2->rlength&=THREE_BYTE_MASK;
       
   213 
       
   214 			/* security >s2->escape */
       
   215 			s->s2->escape=((p[0] & SEC_ESC_BIT))?1:0;
       
   216 			}
       
   217 		}
       
   218 
       
   219 	if (s->rstate == SSL_ST_READ_BODY)
       
   220 		{
       
   221 		n=s->s2->rlength+2+s->s2->three_byte_header;
       
   222 		if (n > (int)s->packet_length)
       
   223 			{
       
   224 			n-=s->packet_length;
       
   225 			i=read_n(s,(unsigned int)n,(unsigned int)n,1);
       
   226 			if (i <= 0) return(i); /* ERROR */
       
   227 			}
       
   228 
       
   229 		p= &(s->packet[2]);
       
   230 		s->rstate=SSL_ST_READ_HEADER;
       
   231 		if (s->s2->three_byte_header)
       
   232 			s->s2->padding= *(p++);
       
   233 		else	s->s2->padding=0;
       
   234 
       
   235 		/* Data portion */
       
   236 		if (s->s2->clear_text)
       
   237 			{
       
   238 			mac_size = 0;
       
   239 			s->s2->mac_data=p;
       
   240 			s->s2->ract_data=p;
       
   241 			if (s->s2->padding)
       
   242 				{
       
   243 				SSLerr(SSL_F_SSL2_READ_INTERNAL,SSL_R_ILLEGAL_PADDING);
       
   244 				return(-1);
       
   245 				}
       
   246 			}
       
   247 		else
       
   248 			{
       
   249 			mac_size=EVP_MD_size(s->read_hash);
       
   250 			OPENSSL_assert(mac_size <= MAX_MAC_SIZE);
       
   251 			s->s2->mac_data=p;
       
   252 			s->s2->ract_data= &p[mac_size];
       
   253 			if (s->s2->padding + mac_size > s->s2->rlength)
       
   254 				{
       
   255 				SSLerr(SSL_F_SSL2_READ_INTERNAL,SSL_R_ILLEGAL_PADDING);
       
   256 				return(-1);
       
   257 				}
       
   258 			}
       
   259 
       
   260 		s->s2->ract_data_length=s->s2->rlength;
       
   261 		/* added a check for length > max_size in case
       
   262 		 * encryption was not turned on yet due to an error */
       
   263 		if ((!s->s2->clear_text) &&
       
   264 			(s->s2->rlength >= mac_size))
       
   265 			{
       
   266 			ssl2_enc(s,0);
       
   267 			s->s2->ract_data_length-=mac_size;
       
   268 			ssl2_mac(s,mac,0);
       
   269 			s->s2->ract_data_length-=s->s2->padding;
       
   270 			if (	(memcmp(mac,s->s2->mac_data,
       
   271 				(unsigned int)mac_size) != 0) ||
       
   272 				(s->s2->rlength%EVP_CIPHER_CTX_block_size(s->enc_read_ctx) != 0))
       
   273 				{
       
   274 				SSLerr(SSL_F_SSL2_READ_INTERNAL,SSL_R_BAD_MAC_DECODE);
       
   275 				return(-1);
       
   276 				}
       
   277 			}
       
   278 		INC32(s->s2->read_sequence); /* expect next number */
       
   279 		/* s->s2->ract_data is now available for processing */
       
   280 
       
   281 		/* Possibly the packet that we just read had 0 actual data bytes.
       
   282 		 * (SSLeay/OpenSSL itself never sends such packets; see ssl2_write.)
       
   283 		 * In this case, returning 0 would be interpreted by the caller
       
   284 		 * as indicating EOF, so it's not a good idea.  Instead, we just
       
   285 		 * continue reading; thus ssl2_read_internal may have to process
       
   286 		 * multiple packets before it can return.
       
   287 		 *
       
   288 		 * [Note that using select() for blocking sockets *never* guarantees
       
   289 		 * that the next SSL_read will not block -- the available
       
   290 		 * data may contain incomplete packets, and except for SSL 2,
       
   291 		 * renegotiation can confuse things even more.] */
       
   292 
       
   293 		goto ssl2_read_again; /* This should really be
       
   294 		                       * "return ssl2_read(s,buf,len)",
       
   295 		                       * but that would allow for
       
   296 		                       * denial-of-service attacks if a
       
   297 		                       * C compiler is used that does not
       
   298 		                       * recognize end-recursion. */
       
   299 		}
       
   300 	else
       
   301 		{
       
   302 		SSLerr(SSL_F_SSL2_READ_INTERNAL,SSL_R_BAD_STATE);
       
   303 			return(-1);
       
   304 		}
       
   305 	}
       
   306 
       
   307 int ssl2_read(SSL *s, void *buf, int len)
       
   308 	{
       
   309 	return ssl2_read_internal(s, buf, len, 0);
       
   310 	}
       
   311 
       
   312 int ssl2_peek(SSL *s, void *buf, int len)
       
   313 	{
       
   314 	return ssl2_read_internal(s, buf, len, 1);
       
   315 	}
       
   316 
       
   317 static int read_n(SSL *s, unsigned int n, unsigned int max,
       
   318 	     unsigned int extend)
       
   319 	{
       
   320 	int i,off,newb;
       
   321 
       
   322 	/* if there is stuff still in the buffer from a previous read,
       
   323 	 * and there is more than we want, take some. */
       
   324 	if (s->s2->rbuf_left >= (int)n)
       
   325 		{
       
   326 		if (extend)
       
   327 			s->packet_length+=n;
       
   328 		else
       
   329 			{
       
   330 			s->packet= &(s->s2->rbuf[s->s2->rbuf_offs]);
       
   331 			s->packet_length=n;
       
   332 			}
       
   333 		s->s2->rbuf_left-=n;
       
   334 		s->s2->rbuf_offs+=n;
       
   335 		return(n);
       
   336 		}
       
   337 
       
   338 	if (!s->read_ahead) max=n;
       
   339 	if (max > (unsigned int)(SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER+2))
       
   340 		max=SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER+2;
       
   341 	
       
   342 
       
   343 	/* Else we want more than we have.
       
   344 	 * First, if there is some left or we want to extend */
       
   345 	off=0;
       
   346 	if ((s->s2->rbuf_left != 0) || ((s->packet_length != 0) && extend))
       
   347 		{
       
   348 		newb=s->s2->rbuf_left;
       
   349 		if (extend)
       
   350 			{
       
   351 			off=s->packet_length;
       
   352 			if (s->packet != s->s2->rbuf)
       
   353 				memcpy(s->s2->rbuf,s->packet,
       
   354 					(unsigned int)newb+off);
       
   355 			}
       
   356 		else if (s->s2->rbuf_offs != 0)
       
   357 			{
       
   358 			memcpy(s->s2->rbuf,&(s->s2->rbuf[s->s2->rbuf_offs]),
       
   359 				(unsigned int)newb);
       
   360 			s->s2->rbuf_offs=0;
       
   361 			}
       
   362 		s->s2->rbuf_left=0;
       
   363 		}
       
   364 	else
       
   365 		newb=0;
       
   366 
       
   367 	/* off is the offset to start writing too.
       
   368 	 * r->s2->rbuf_offs is the 'unread data', now 0. 
       
   369 	 * newb is the number of new bytes so far
       
   370 	 */
       
   371 	s->packet=s->s2->rbuf;
       
   372 	while (newb < (int)n)
       
   373 		{
       
   374 		clear_sys_error();
       
   375 		if (s->rbio != NULL)
       
   376 			{
       
   377 			s->rwstate=SSL_READING;
       
   378 			i=BIO_read(s->rbio,(char *)&(s->s2->rbuf[off+newb]),
       
   379 				max-newb);
       
   380 			}
       
   381 		else
       
   382 			{
       
   383 			SSLerr(SSL_F_READ_N,SSL_R_READ_BIO_NOT_SET);
       
   384 			i= -1;
       
   385 			}
       
   386 #ifdef PKT_DEBUG
       
   387 		if (s->debug & 0x01) sleep(1);
       
   388 #endif
       
   389 		if (i <= 0)
       
   390 			{
       
   391 			s->s2->rbuf_left+=newb;
       
   392 			return(i);
       
   393 			}
       
   394 		newb+=i;
       
   395 		}
       
   396 
       
   397 	/* record unread data */
       
   398 	if (newb > (int)n)
       
   399 		{
       
   400 		s->s2->rbuf_offs=n+off;
       
   401 		s->s2->rbuf_left=newb-n;
       
   402 		}
       
   403 	else
       
   404 		{
       
   405 		s->s2->rbuf_offs=0;
       
   406 		s->s2->rbuf_left=0;
       
   407 		}
       
   408 	if (extend)
       
   409 		s->packet_length+=n;
       
   410 	else
       
   411 		s->packet_length=n;
       
   412 	s->rwstate=SSL_NOTHING;
       
   413 	return(n);
       
   414 	}
       
   415 
       
   416 int ssl2_write(SSL *s, const void *_buf, int len)
       
   417 	{
       
   418 	const unsigned char *buf=_buf;
       
   419 	unsigned int n,tot;
       
   420 	int i;
       
   421 
       
   422 	if (SSL_in_init(s) && !s->in_handshake)
       
   423 		{
       
   424 		i=s->handshake_func(s);
       
   425 		if (i < 0) return(i);
       
   426 		if (i == 0)
       
   427 			{
       
   428 			SSLerr(SSL_F_SSL2_WRITE,SSL_R_SSL_HANDSHAKE_FAILURE);
       
   429 			return(-1);
       
   430 			}
       
   431 		}
       
   432 
       
   433 	if (s->error)
       
   434 		{
       
   435 		ssl2_write_error(s);
       
   436 		if (s->error)
       
   437 			return(-1);
       
   438 		}
       
   439 
       
   440 	clear_sys_error();
       
   441 	s->rwstate=SSL_NOTHING;
       
   442 	if (len <= 0) return(len);
       
   443 
       
   444 	tot=s->s2->wnum;
       
   445 	s->s2->wnum=0;
       
   446 
       
   447 	n=(len-tot);
       
   448 	for (;;)
       
   449 		{
       
   450 		i=do_ssl_write(s,&(buf[tot]),n);
       
   451 		if (i <= 0)
       
   452 			{
       
   453 			s->s2->wnum=tot;
       
   454 			return(i);
       
   455 			}
       
   456 		if ((i == (int)n) ||
       
   457 			(s->mode & SSL_MODE_ENABLE_PARTIAL_WRITE))
       
   458 			{
       
   459 			return(tot+i);
       
   460 			}
       
   461 		
       
   462 		n-=i;
       
   463 		tot+=i;
       
   464 		}
       
   465 	}
       
   466 
       
   467 static int write_pending(SSL *s, const unsigned char *buf, unsigned int len)
       
   468 	{
       
   469 	int i;
       
   470 
       
   471 	/* s->s2->wpend_len != 0 MUST be true. */
       
   472 
       
   473 	/* check that they have given us the same buffer to
       
   474 	 * write */
       
   475 	if ((s->s2->wpend_tot > (int)len) ||
       
   476 		((s->s2->wpend_buf != buf) &&
       
   477 		 !(s->mode & SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER)))
       
   478 		{
       
   479 		SSLerr(SSL_F_WRITE_PENDING,SSL_R_BAD_WRITE_RETRY);
       
   480 		return(-1);
       
   481 		}
       
   482 
       
   483 	for (;;)
       
   484 		{
       
   485 		clear_sys_error();
       
   486 		if (s->wbio != NULL)
       
   487 			{
       
   488 			s->rwstate=SSL_WRITING;
       
   489 			i=BIO_write(s->wbio,
       
   490 				(char *)&(s->s2->write_ptr[s->s2->wpend_off]),
       
   491 				(unsigned int)s->s2->wpend_len);
       
   492 			}
       
   493 		else
       
   494 			{
       
   495 			SSLerr(SSL_F_WRITE_PENDING,SSL_R_WRITE_BIO_NOT_SET);
       
   496 			i= -1;
       
   497 			}
       
   498 #ifdef PKT_DEBUG
       
   499 		if (s->debug & 0x01) sleep(1);
       
   500 #endif
       
   501 		if (i == s->s2->wpend_len)
       
   502 			{
       
   503 			s->s2->wpend_len=0;
       
   504 			s->rwstate=SSL_NOTHING;
       
   505 			return(s->s2->wpend_ret);
       
   506 			}
       
   507 		else if (i <= 0)
       
   508 			return(i);
       
   509 		s->s2->wpend_off+=i;
       
   510 		s->s2->wpend_len-=i;
       
   511 		}
       
   512 	}
       
   513 
       
   514 static int do_ssl_write(SSL *s, const unsigned char *buf, unsigned int len)
       
   515 	{
       
   516 	unsigned int j,k,olen,p,mac_size,bs;
       
   517 	register unsigned char *pp;
       
   518 
       
   519 	olen=len;
       
   520 
       
   521 	/* first check if there is data from an encryption waiting to
       
   522 	 * be sent - it must be sent because the other end is waiting.
       
   523 	 * This will happen with non-blocking IO.  We print it and then
       
   524 	 * return.
       
   525 	 */
       
   526 	if (s->s2->wpend_len != 0) return(write_pending(s,buf,len));
       
   527 
       
   528 	/* set mac_size to mac size */
       
   529 	if (s->s2->clear_text)
       
   530 		mac_size=0;
       
   531 	else
       
   532 		mac_size=EVP_MD_size(s->write_hash);
       
   533 
       
   534 	/* lets set the pad p */
       
   535 	if (s->s2->clear_text)
       
   536 		{
       
   537 		if (len > SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER)
       
   538 			len=SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER;
       
   539 		p=0;
       
   540 		s->s2->three_byte_header=0;
       
   541 		/* len=len; */
       
   542 		}
       
   543 	else
       
   544 		{
       
   545 		bs=EVP_CIPHER_CTX_block_size(s->enc_read_ctx);
       
   546 		j=len+mac_size;
       
   547 		/* Two-byte headers allow for a larger record length than
       
   548 		 * three-byte headers, but we can't use them if we need
       
   549 		 * padding or if we have to set the escape bit. */
       
   550 		if ((j > SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER) &&
       
   551 			(!s->s2->escape))
       
   552 			{
       
   553 			if (j > SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER)
       
   554 				j=SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER;
       
   555 			/* set k to the max number of bytes with 2
       
   556 			 * byte header */
       
   557 			k=j-(j%bs);
       
   558 			/* how many data bytes? */
       
   559 			len=k-mac_size; 
       
   560 			s->s2->three_byte_header=0;
       
   561 			p=0;
       
   562 			}
       
   563 		else if ((bs <= 1) && (!s->s2->escape))
       
   564 			{
       
   565 			/* j <= SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER, thus
       
   566 			 * j < SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER */
       
   567 			s->s2->three_byte_header=0;
       
   568 			p=0;
       
   569 			}
       
   570 		else /* we may have to use a 3 byte header */
       
   571 			{
       
   572 			/* If s->s2->escape is not set, then
       
   573 			 * j <= SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER, and thus
       
   574 			 * j < SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER. */
       
   575 			p=(j%bs);
       
   576 			p=(p == 0)?0:(bs-p);
       
   577 			if (s->s2->escape)
       
   578 				{
       
   579 				s->s2->three_byte_header=1;
       
   580 				if (j > SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)
       
   581 					j=SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER;
       
   582 				}
       
   583 			else
       
   584 				s->s2->three_byte_header=(p == 0)?0:1;
       
   585 			}
       
   586 		}
       
   587 
       
   588 	/* Now
       
   589 	 *      j <= SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER
       
   590 	 * holds, and if s->s2->three_byte_header is set, then even
       
   591 	 *      j <= SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER.
       
   592 	 */
       
   593 
       
   594 	/* mac_size is the number of MAC bytes
       
   595 	 * len is the number of data bytes we are going to send
       
   596 	 * p is the number of padding bytes
       
   597 	 * (if it is a two-byte header, then p == 0) */
       
   598 
       
   599 	s->s2->wlength=len;
       
   600 	s->s2->padding=p;
       
   601 	s->s2->mac_data= &(s->s2->wbuf[3]);
       
   602 	s->s2->wact_data= &(s->s2->wbuf[3+mac_size]);
       
   603 	/* we copy the data into s->s2->wbuf */
       
   604 	memcpy(s->s2->wact_data,buf,len);
       
   605 	if (p)
       
   606 		memset(&(s->s2->wact_data[len]),0,p); /* arbitrary padding */
       
   607 
       
   608 	if (!s->s2->clear_text)
       
   609 		{
       
   610 		s->s2->wact_data_length=len+p;
       
   611 		ssl2_mac(s,s->s2->mac_data,1);
       
   612 		s->s2->wlength+=p+mac_size;
       
   613 		ssl2_enc(s,1);
       
   614 		}
       
   615 
       
   616 	/* package up the header */
       
   617 	s->s2->wpend_len=s->s2->wlength;
       
   618 	if (s->s2->three_byte_header) /* 3 byte header */
       
   619 		{
       
   620 		pp=s->s2->mac_data;
       
   621 		pp-=3;
       
   622 		pp[0]=(s->s2->wlength>>8)&(THREE_BYTE_MASK>>8);
       
   623 		if (s->s2->escape) pp[0]|=SEC_ESC_BIT;
       
   624 		pp[1]=s->s2->wlength&0xff;
       
   625 		pp[2]=s->s2->padding;
       
   626 		s->s2->wpend_len+=3;
       
   627 		}
       
   628 	else
       
   629 		{
       
   630 		pp=s->s2->mac_data;
       
   631 		pp-=2;
       
   632 		pp[0]=((s->s2->wlength>>8)&(TWO_BYTE_MASK>>8))|TWO_BYTE_BIT;
       
   633 		pp[1]=s->s2->wlength&0xff;
       
   634 		s->s2->wpend_len+=2;
       
   635 		}
       
   636 	s->s2->write_ptr=pp;
       
   637 	
       
   638 	INC32(s->s2->write_sequence); /* expect next number */
       
   639 
       
   640 	/* lets try to actually write the data */
       
   641 	s->s2->wpend_tot=olen;
       
   642 	s->s2->wpend_buf=buf;
       
   643 
       
   644 	s->s2->wpend_ret=len;
       
   645 
       
   646 	s->s2->wpend_off=0;
       
   647 	return(write_pending(s,buf,olen));
       
   648 	}
       
   649 
       
   650 int ssl2_part_read(SSL *s, unsigned long f, int i)
       
   651 	{
       
   652 	unsigned char *p;
       
   653 	int j;
       
   654 
       
   655 	if (i < 0)
       
   656 		{
       
   657 		/* ssl2_return_error(s); */
       
   658 		/* for non-blocking io,
       
   659 		 * this is not necessarily fatal */
       
   660 		return(i);
       
   661 		}
       
   662 	else
       
   663 		{
       
   664 		s->init_num+=i;
       
   665 
       
   666 		/* Check for error.  While there are recoverable errors,
       
   667 		 * this function is not called when those must be expected;
       
   668 		 * any error detected here is fatal. */
       
   669 		if (s->init_num >= 3)
       
   670 			{
       
   671 			p=(unsigned char *)s->init_buf->data;
       
   672 			if (p[0] == SSL2_MT_ERROR)
       
   673 				{
       
   674 				j=(p[1]<<8)|p[2];
       
   675 				SSLerr((int)f,ssl_mt_error(j));
       
   676 				s->init_num -= 3;
       
   677 				if (s->init_num > 0)
       
   678 					memmove(p, p+3, s->init_num);
       
   679 				}
       
   680 			}
       
   681 
       
   682 		/* If it's not an error message, we have some error anyway --
       
   683 		 * the message was shorter than expected.  This too is treated
       
   684 		 * as fatal (at least if SSL_get_error is asked for its opinion). */
       
   685 		return(0);
       
   686 		}
       
   687 	}
       
   688 
       
   689 int ssl2_do_write(SSL *s)
       
   690 	{
       
   691 	int ret;
       
   692 
       
   693 	ret=ssl2_write(s,&s->init_buf->data[s->init_off],s->init_num);
       
   694 	if (ret == s->init_num)
       
   695 		{
       
   696 		if (s->msg_callback)
       
   697 			s->msg_callback(1, s->version, 0, s->init_buf->data, (size_t)(s->init_off + s->init_num), s, s->msg_callback_arg);
       
   698 		return(1);
       
   699 		}
       
   700 	if (ret < 0)
       
   701 		return(-1);
       
   702 	s->init_off+=ret;
       
   703 	s->init_num-=ret;
       
   704 	return(0);
       
   705 	}
       
   706 
       
   707 static int ssl_mt_error(int n)
       
   708 	{
       
   709 	int ret;
       
   710 
       
   711 	switch (n)
       
   712 		{
       
   713 	case SSL2_PE_NO_CIPHER:
       
   714 		ret=SSL_R_PEER_ERROR_NO_CIPHER;
       
   715 		break;
       
   716 	case SSL2_PE_NO_CERTIFICATE:
       
   717 		ret=SSL_R_PEER_ERROR_NO_CERTIFICATE;
       
   718 		break;
       
   719 	case SSL2_PE_BAD_CERTIFICATE:
       
   720 		ret=SSL_R_PEER_ERROR_CERTIFICATE;
       
   721 		break;
       
   722 	case SSL2_PE_UNSUPPORTED_CERTIFICATE_TYPE:
       
   723 		ret=SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE;
       
   724 		break;
       
   725 	default:
       
   726 		ret=SSL_R_UNKNOWN_REMOTE_ERROR_TYPE;
       
   727 		break;
       
   728 		}
       
   729 	return(ret);
       
   730 	}
       
   731 #else /* !OPENSSL_NO_SSL2 */
       
   732 
       
   733 # if PEDANTIC
       
   734 static void *dummy=&dummy;
       
   735 # endif
       
   736 
       
   737 #endif