1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
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:
125:
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)
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:
171:
172:
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);
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);
195: }
196:
197:
198: s->rstate=SSL_ST_READ_BODY;
199: p=s->packet;
200:
201:
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))
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:
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);
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:
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:
262:
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);
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293: goto ssl2_read_again;
294:
295:
296:
297:
298:
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:
323:
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:
344:
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:
368:
369:
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:
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:
472:
473:
474:
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:
522:
523:
524:
525:
526: if (s->s2->wpend_len != 0) return(write_pending(s,buf,len));
527:
528:
529: if (s->s2->clear_text)
530: mac_size=0;
531: else
532: mac_size=EVP_MD_size(s->write_hash);
533:
534:
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:
542: }
543: else
544: {
545: bs=EVP_CIPHER_CTX_block_size(s->enc_read_ctx);
546: j=len+mac_size;
547:
548:
549:
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:
556:
557: k=j-(j%bs);
558:
559: len=k-mac_size;