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:
113:
114:
115:
116:
117: #include <limits.h>
118: #include <string.h>
119: #include <stdio.h>
120: #include "ssl_locl.h"
121: #include <openssl/buffer.h>
122: #include <openssl/rand.h>
123: #include <openssl/objects.h>
124: #include <openssl/evp.h>
125: #include <openssl/x509.h>
126:
127:
128: int ssl3_do_write(SSL *s, int type)
129: {
130: int ret;
131:
132: ret=ssl3_write_bytes(s,type,&s->init_buf->data[s->init_off],
133: s->init_num);
134: if (ret < 0) return(-1);
135: if (type == SSL3_RT_HANDSHAKE)
136:
137:
138: ssl3_finish_mac(s,(unsigned char *)&s->init_buf->data[s->init_off],ret);
139:
140: if (ret == s->init_num)
141: {
142: if (s->msg_callback)
143: s->msg_callback(1, s->version, type, s->init_buf->data, (size_t)(s->init_off + s->init_num), s, s->msg_callback_arg);
144: return(1);
145: }
146: s->init_off+=ret;
147: s->init_num-=ret;
148: return(0);
149: }
150:
151: int ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen)
152: {
153: unsigned char *p,*d;
154: int i;
155: unsigned long l;
156:
157: if (s->state == a)
158: {
159: d=(unsigned char *)s->init_buf->data;
160: p= &(d[4]);
161:
162: i=s->method->ssl3_enc->final_finish_mac(s,
163: &(s->s3->finish_dgst1),
164: &(s->s3->finish_dgst2),
165: sender,slen,s->s3->tmp.finish_md);
166: s->s3->tmp.finish_md_len = i;
167: memcpy(p, s->s3->tmp.finish_md, i);
168: p+=i;
169: l=i;
170:
171: #ifdef OPENSSL_SYS_WIN16
172:
173:
174:
175: l&=0xffff;
176: #endif
177:
178: *(d++)=SSL3_MT_FINISHED;
179: l2n3(l,d);
180: s->init_num=(int)l+4;
181: s->init_off=0;
182:
183: s->state=b;
184: }
185:
186:
187: return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
188: }
189:
190: int ssl3_get_finished(SSL *s, int a, int b)
191: {
192: int al,i,ok;
193: long n;
194: unsigned char *p;
195:
196:
197:
198:
199:
200: n=s->method->ssl_get_message(s,
201: a,
202: b,
203: SSL3_MT_FINISHED,
204: 64,
205: &ok);
206:
207: if (!ok) return((int)n);
208:
209:
210: if (!s->s3->change_cipher_spec)
211: {
212: al=SSL_AD_UNEXPECTED_MESSAGE;
213: SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_GOT_A_FIN_BEFORE_A_CCS);
214: goto f_err;
215: }
216: s->s3->change_cipher_spec=0;
217:
218: p = (unsigned char *)s->init_msg;
219: i = s->s3->tmp.peer_finish_md_len;
220:
221: if (i != n)
222: {
223: al=SSL_AD_DECODE_ERROR;
224: SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_BAD_DIGEST_LENGTH);
225: goto f_err;
226: }
227:
228: if (memcmp(p, s->s3->tmp.peer_finish_md, i) != 0)
229: {
230: al=SSL_AD_DECRYPT_ERROR;
231: SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_DIGEST_CHECK_FAILED);
232: goto f_err;
233: }
234:
235: return(1);
236: f_err:
237: ssl3_send_alert(s,SSL3_AL_FATAL,al);
238: return(0);
239: }
240:
241:
242:
243:
244:
245:
246:
247:
248:
249: int ssl3_send_change_cipher_spec(SSL *s, int a, int b)
250: {
251: unsigned char *p;
252:
253: if (s->state == a)
254: {
255: p=(unsigned char *)s->init_buf->data;
256: *p=SSL3_MT_CCS;
257: s->init_num=1;
258: s->init_off=0;
259:
260: s->state=b;
261: }
262:
263:
264: return(ssl3_do_write(s,SSL3_RT_CHANGE_CIPHER_SPEC));
265: }
266:
267: unsigned long ssl3_output_cert_chain(SSL *s, X509 *x)
268: {
269: unsigned char *p;
270: int n,i;
271: unsigned long l=7;
272: BUF_MEM *buf;
273: X509_STORE_CTX xs_ctx;
274: X509_OBJECT obj;
275:
276: int no_chain;
277:
278: if ((s->mode & SSL_MODE_NO_AUTO_CHAIN) || s->ctx->extra_certs)
279: no_chain = 1;
280: else
281: no_chain = 0;
282:
283:
284: buf=s->init_buf;
285: if (!BUF_MEM_grow_clean(buf,10))
286: {
287: SSLerr(SSL_F_SSL3_OUTPUT_CERT_CHAIN,ERR_R_BUF_LIB);
288: return(0);
289: }
290: if (x != NULL)
291: {
292: if(!no_chain && !X509_STORE_CTX_init(&xs_ctx,s->ctx->cert_store,NULL,NULL))
293: {
294: SSLerr(SSL_F_SSL3_OUTPUT_CERT_CHAIN,ERR_R_X509_LIB);
295: return(0);
296: }
297:
298: for (;;)
299: {
300: n=i2d_X509(x,NULL);
301: if (!BUF_MEM_grow_clean(buf,(int)(n+l+3)))
302: {
303: SSLerr(SSL_F_SSL3_OUTPUT_CERT_CHAIN,ERR_R_BUF_LIB);
304: return(0);
305: }
306: p=(unsigned char *)&(buf->data[l]);
307: l2n3(n,p);
308: i2d_X509(x,&p);
309: l+=n+3;
310:
311: if (no_chain)
312: break;
313:
314: if (X509_NAME_cmp(X509_get_subject_name(x),
315: X509_get_issuer_name(x)) == 0) break;
316:
317: i=X509_STORE_get_by_subject(&xs_ctx,X509_LU_X509,
318: X509_get_issuer_name(x),&obj);
319: if (i <= 0) break;
320: x=obj.data.x509;
321:
322:
323: X509_free(x);
324: }
325: if (!no_chain)
326: X509_STORE_CTX_cleanup(&xs_ctx);
327: }
328:
329:
330: if (s->ctx->extra_certs != NULL)
331: for (i=0; i<sk_X509_num(s->ctx->extra_certs); i++)
332: {
333: x=sk_X509_value(s->ctx->extra_certs,i);
334: n=i2d_X509(x,NULL);
335: if (!BUF_MEM_grow_clean(buf,(int)(n+l+3)))
336: {
337: SSLerr(SSL_F_SSL3_OUTPUT_CERT_CHAIN,ERR_R_BUF_LIB);
338: return(0);
339: }
340: p=(unsigned char *)&(buf->data[l]);
341: l2n3(n,p);
342: i2d_X509(x,&p);
343: l+=n+3;
344: }
345:
346: l-=7;
347: p=(unsigned char *)&(buf->data[4]);
348: l2n3(l,p);
349: l+=3;
350: p=(unsigned char *)&(buf->data[0]);
351: *(p++)=SSL3_MT_CERTIFICATE;
352: l2n3(l,p);
353: l+=4;
354: return(l);
355: }
356:
357:
358:
359:
360:
361:
362: long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok)
363: {
364: unsigned char *p;
365: unsigned long l;
366: long n;
367: int i,al;
368:
369: if (s->s3->tmp.reuse_message)
370: {
371: s->s3->tmp.reuse_message=0;
372: if ((mt >= 0) && (s->s3->tmp.message_type != mt))
373: {
374: al=SSL_AD_UNEXPECTED_MESSAGE;
375: SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_UNEXPECTED_MESSAGE);
376: goto f_err;
377: }
378: *ok=1;
379: s->init_msg = s->init_buf->data + 4;
380: s->init_num = (int)s->s3->tmp.message_size;
381: return s->init_num;
382: }
383:
384: p=(unsigned char *)s->init_buf->data;
385:
386: if (s->state == st1)
387: {
388: int skip_message;
389:
390: do
391: {
392: while (s->init_num < 4)
393: {
394: i=s->method->ssl_read_bytes(s,SSL3_RT_HANDSHAKE,
395: &p[s->init_num],4 - s->init_num, 0);
396: if (i <= 0)
397: {
398: s->rwstate=SSL_READING;
399: *ok = 0;
400: return i;
401: }
402: s->init_num+=i;
403: }
404:
405: skip_message = 0;
406: if (!s->server)
407: if (p[0] == SSL3_MT_HELLO_REQUEST)
408:
409:
410:
411:
412: if (p[1] == 0 && p[2] == 0 &&p[3] == 0)
413: {
414: s->init_num = 0;
415: skip_message = 1;
416:
417: if (s->msg_callback)
418: s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, p, 4, s, s->msg_callback_arg);
419: }
420: }
421: while (skip_message);
422:
423:
424:
425: if ((mt >= 0) && (*p != mt))
426: {
427: al=SSL_AD_UNEXPECTED_MESSAGE;
428: SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_UNEXPECTED_MESSAGE);
429: goto f_err;
430: }
431: if ((mt < 0) && (*p == SSL3_MT_CLIENT_HELLO) &&
432: (st1 == SSL3_ST_SR_CERT_A) &&
433: (stn == SSL3_ST_SR_CERT_B))
434: {
435:
436:
437:
438:
439:
440: ssl3_init_finished_mac(s);
441: }
442:
443: s->s3->tmp.message_type= *(p++);
444:
445: n2l3(p,l);
446: if (l > (unsigned long)max)
447: {
448: al=SSL_AD_ILLEGAL_PARAMETER;
449: SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_EXCESSIVE_MESSAGE_SIZE);
450: goto f_err;
451: }
452: if (l > (INT_MAX-4))
453: {
454: al=SSL_AD_ILLEGAL_PARAMETER;
455: SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_EXCESSIVE_MESSAGE_SIZE);
456: goto f_err;
457: }
458: if (l && !BUF_MEM_grow_clean(s->init_buf,(int)l+4))
459: {
460: SSLerr(SSL_F_SSL3_GET_MESSAGE,ERR_R_BUF_LIB);
461: goto err;
462: }
463: s->s3->tmp.message_size=l;
464: s->state=stn;
465:
466: s->init_msg = s->init_buf->data + 4;
467: s->init_num = 0;
468: }
469:
470:
471: p = s->init_msg;
472: n = s->s3->tmp.message_size - s->init_num;
473: while (n > 0)
474: {
475: i=s->method->ssl_read_bytes(s,SSL3_RT_HANDSHAKE,&p[s->init_num],n,0);
476: if (i <= 0)
477: {
478: s->rwstate=SSL_READING;
479: *ok = 0;
480: return i;
481: }
482: s->init_num += i;
483: n -= i;
484: }
485: ssl3_finish_mac(s, (unsigned char *)s->init_buf->data, s->init_num + 4);
486: if (s->msg_callback)
487: s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, s->init_buf->data, (size_t)s->init_num + 4, s, s->msg_callback_arg);
488: *ok=1;
489: return s->init_num;
490: f_err:
491: ssl3_send_alert(s,SSL3_AL_FATAL,al);
492: err:
493: *ok=0;
494: return(-1);
495: }
496:
497: int ssl_cert_type(X509 *x, EVP_PKEY *pkey)
498: {
499: EVP_PKEY *pk;
500: int ret= -1,i;
501:
502: if (pkey == NULL)
503: pk=X509_get_pubkey(x);
504: else
505: pk=pkey;
506: if (pk == NULL) goto err;
507:
508: i=pk->type;
509: if (i == EVP_PKEY_RSA)
510: {
511: ret=SSL_PKEY_RSA_ENC;
512: }
513: else if (i == EVP_PKEY_DSA)
514: {
515: ret=SSL_PKEY_DSA_SIGN;
516: }
517: #ifndef OPENSSL_NO_EC
518: else if (i == EVP_PKEY_EC)
519: {
520: ret = SSL_PKEY_ECC;
521: }
522: #endif
523:
524: err:
525: if(!pkey) EVP_PKEY_free(pk);
526: return(ret);
527: }
528:
529: int ssl_verify_alarm_type(long type)
530: {
531: int al;
532:
533: switch(type)
534: {
535: case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
536: case X509_V_ERR_UNABLE_TO_GET_CRL:
537: case X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER:
538: al=SSL_AD_UNKNOWN_CA;
539: break;
540: case X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE:
541: case X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE:
542: case X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY:
543: case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
544: case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
545: case X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD:
546: case X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD:
547: case X509_V_ERR_CERT_NOT_YET_VALID:
548: case X509_V_ERR_CRL_NOT_YET_VALID:
549: case X509_V_ERR_CERT_UNTRUSTED:
550: case X509_V_ERR_CERT_REJECTED:
551: al=SSL_AD_BAD_CERTIFICATE;
552: break;
553: case X509_V_ERR_CERT_SIGNATURE_FAILURE:
554: case X509_V_ERR_CRL_SIGNATURE_FAILURE:
555: al=SSL_AD_DECRYPT_ERROR;
556: break;
557: case X509_V_ERR_CERT_HAS_EXPIRED:
558: case X509_V_ERR_CRL_HAS_EXPIRED:
559: al=SSL_AD_CERTIFICATE_EXPIRED;
560: break;
561: case X509_V_ERR_CERT_REVOKED:
562: al=SSL_AD_CERTIFICATE_REVOKED;
563: break;
564: case X509_V_ERR_OUT_OF_M