summaryrefslogtreecommitdiff
path: root/src/lib/libssl/s3_both.c
diff options
context:
space:
mode:
authorryker <>1998-10-05 20:13:14 +0000
committerryker <>1998-10-05 20:13:14 +0000
commitaeeae06a79815dc190061534d47236cec09f9e32 (patch)
tree851692b9c2f9c04f077666855641900f19fdb217 /src/lib/libssl/s3_both.c
parenta4f79641824cbf9f60ca9d1168d1fcc46717a82a (diff)
downloadopenbsd-aeeae06a79815dc190061534d47236cec09f9e32.tar.gz
openbsd-aeeae06a79815dc190061534d47236cec09f9e32.tar.bz2
openbsd-aeeae06a79815dc190061534d47236cec09f9e32.zip
Import of SSLeay-0.9.0b with RSA and IDEA stubbed + OpenBSD build
functionality for shared libs. Note that routines such as sslv2_init and friends that use RSA will not work due to lack of RSA in this library. Needs documentation and help from ports for easy upgrade to full functionality where legally possible.
Diffstat (limited to 'src/lib/libssl/s3_both.c')
-rw-r--r--src/lib/libssl/s3_both.c469
1 files changed, 469 insertions, 0 deletions
diff --git a/src/lib/libssl/s3_both.c b/src/lib/libssl/s3_both.c
new file mode 100644
index 0000000000..6de62e1591
--- /dev/null
+++ b/src/lib/libssl/s3_both.c
@@ -0,0 +1,469 @@
1/* ssl/s3_both.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#include <stdio.h>
60#include "buffer.h"
61#include "rand.h"
62#include "objects.h"
63#include "evp.h"
64#include "x509.h"
65#include "ssl_locl.h"
66
67#define BREAK break
68
69/* SSL3err(SSL_F_SSL3_GET_FINISHED,SSL_R_EXCESSIVE_MESSAGE_SIZE);
70 */
71
72int ssl3_send_finished(s,a,b,sender,slen)
73SSL *s;
74int a;
75int b;
76unsigned char *sender;
77int slen;
78 {
79 unsigned char *p,*d;
80 int i;
81 unsigned long l;
82
83 if (s->state == a)
84 {
85 d=(unsigned char *)s->init_buf->data;
86 p= &(d[4]);
87
88 i=s->method->ssl3_enc->final_finish_mac(s,
89 &(s->s3->finish_dgst1),
90 &(s->s3->finish_dgst2),
91 sender,slen,p);
92 p+=i;
93 l=i;
94
95 *(d++)=SSL3_MT_FINISHED;
96 l2n3(l,d);
97 s->init_num=(int)l+4;
98 s->init_off=0;
99
100 s->state=b;
101 }
102
103 /* SSL3_ST_SEND_xxxxxx_HELLO_B */
104 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
105 }
106
107int ssl3_get_finished(s,a,b)
108SSL *s;
109int a;
110int b;
111 {
112 int al,i,ok;
113 long n;
114 unsigned char *p;
115
116 /* the mac has already been generated when we received the
117 * change cipher spec message and is in s->s3->tmp.in_dgst[12]
118 */
119
120 n=ssl3_get_message(s,
121 a,
122 b,
123 SSL3_MT_FINISHED,
124 64, /* should actually be 36+4 :-) */
125 &ok);
126
127 if (!ok) return((int)n);
128
129 /* If this occurs if we has missed a message */
130 if (!s->s3->change_cipher_spec)
131 {
132 al=SSL_AD_UNEXPECTED_MESSAGE;
133 SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_GOT_A_FIN_BEFORE_A_CCS);
134 goto f_err;
135 }
136 s->s3->change_cipher_spec=0;
137
138 p=(unsigned char *)s->init_buf->data;
139
140 i=s->method->ssl3_enc->finish_mac_length;
141
142 if (i != n)
143 {
144 al=SSL_AD_DECODE_ERROR;
145 SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_BAD_DIGEST_LENGTH);
146 goto f_err;
147 }
148
149 if (memcmp( p, (char *)&(s->s3->tmp.finish_md[0]),i) != 0)
150 {
151 al=SSL_AD_DECRYPT_ERROR;
152 SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_DIGEST_CHECK_FAILED);
153 goto f_err;
154 }
155
156 return(1);
157f_err:
158 ssl3_send_alert(s,SSL3_AL_FATAL,al);
159 return(0);
160 }
161
162/* for these 2 messages, we need to
163 * ssl->enc_read_ctx re-init
164 * ssl->s3->read_sequence zero
165 * ssl->s3->read_mac_secret re-init
166 * ssl->session->read_sym_enc assign
167 * ssl->session->read_compression assign
168 * ssl->session->read_hash assign
169 */
170int ssl3_send_change_cipher_spec(s,a,b)
171SSL *s;
172int a,b;
173 {
174 unsigned char *p;
175
176 if (s->state == a)
177 {
178 p=(unsigned char *)s->init_buf->data;
179 *p=SSL3_MT_CCS;
180 s->init_num=1;
181 s->init_off=0;
182
183 s->state=b;
184 }
185
186 /* SSL3_ST_CW_CHANGE_B */
187 return(ssl3_do_write(s,SSL3_RT_CHANGE_CIPHER_SPEC));
188 }
189
190unsigned long ssl3_output_cert_chain(s,x)
191SSL *s;
192X509 *x;
193 {
194 unsigned char *p;
195 int n,i;
196 unsigned long l=7;
197 BUF_MEM *buf;
198 X509_STORE_CTX xs_ctx;
199 X509_OBJECT obj;
200
201 /* TLSv1 sends a chain with nothing in it, instead of an alert */
202 buf=s->init_buf;
203 if (!BUF_MEM_grow(buf,(int)(10)))
204 {
205 SSLerr(SSL_F_SSL3_OUTPUT_CERT_CHAIN,ERR_R_BUF_LIB);
206 return(0);
207 }
208 if (x != NULL)
209 {
210 X509_STORE_CTX_init(&xs_ctx,s->ctx->cert_store,NULL,NULL);
211
212 for (;;)
213 {
214 n=i2d_X509(x,NULL);
215 if (!BUF_MEM_grow(buf,(int)(n+l+3)))
216 {
217 SSLerr(SSL_F_SSL3_OUTPUT_CERT_CHAIN,ERR_R_BUF_LIB);
218 return(0);
219 }
220 p=(unsigned char *)&(buf->data[l]);
221 l2n3(n,p);
222 i2d_X509(x,&p);
223 l+=n+3;
224 if (X509_NAME_cmp(X509_get_subject_name(x),
225 X509_get_issuer_name(x)) == 0) break;
226
227 i=X509_STORE_get_by_subject(&xs_ctx,X509_LU_X509,
228 X509_get_issuer_name(x),&obj);
229 if (i <= 0) break;
230 x=obj.data.x509;
231 /* Count is one too high since the X509_STORE_get uped the
232 * ref count */
233 X509_free(x);
234 }
235
236 X509_STORE_CTX_cleanup(&xs_ctx);
237 }
238
239 l-=7;
240 p=(unsigned char *)&(buf->data[4]);
241 l2n3(l,p);
242 l+=3;
243 p=(unsigned char *)&(buf->data[0]);
244 *(p++)=SSL3_MT_CERTIFICATE;
245 l2n3(l,p);
246 l+=4;
247 return(l);
248 }
249
250long ssl3_get_message(s,st1,stn,mt,max,ok)
251SSL *s;
252int st1,stn,mt;
253long max;
254int *ok;
255 {
256 unsigned char *p;
257 unsigned long l;
258 long n;
259 int i,al;
260
261 if (s->s3->tmp.reuse_message)
262 {
263 s->s3->tmp.reuse_message=0;
264 if ((mt >= 0) && (s->s3->tmp.message_type != mt))
265 {
266 al=SSL_AD_UNEXPECTED_MESSAGE;
267 SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_UNEXPECTED_MESSAGE);
268 goto f_err;
269 }
270 *ok=1;
271 return((int)s->s3->tmp.message_size);
272 }
273
274 p=(unsigned char *)s->init_buf->data;
275
276 if (s->state == st1)
277 {
278 i=ssl3_read_bytes(s,SSL3_RT_HANDSHAKE,
279 (char *)&(p[s->init_num]),
280 4-s->init_num);
281 if (i < (4-s->init_num))
282 {
283 *ok=0;
284 return(ssl3_part_read(s,i));
285 }
286
287 if ((mt >= 0) && (*p != mt))
288 {
289 al=SSL_AD_UNEXPECTED_MESSAGE;
290 SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_UNEXPECTED_MESSAGE);
291 goto f_err;
292 }
293 s->s3->tmp.message_type= *(p++);
294
295 n2l3(p,l);
296 if (l > (unsigned long)max)
297 {
298 al=SSL_AD_ILLEGAL_PARAMETER;
299 SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_EXCESSIVE_MESSAGE_SIZE);
300 goto f_err;
301 }
302 if (l && !BUF_MEM_grow(s->init_buf,(int)l))
303 {
304 SSLerr(SSL_F_SSL3_GET_MESSAGE,ERR_R_BUF_LIB);
305 goto err;
306 }
307 s->s3->tmp.message_size=l;
308 s->state=stn;
309
310 s->init_num=0;
311 }
312
313 /* next state (stn) */
314 p=(unsigned char *)s->init_buf->data;
315 n=s->s3->tmp.message_size;
316 if (n > 0)
317 {
318 i=ssl3_read_bytes(s,SSL3_RT_HANDSHAKE,
319 (char *)&(p[s->init_num]),(int)n);
320 if (i != (int)n)
321 {
322 *ok=0;
323 return(ssl3_part_read(s,i));
324 }
325 }
326 *ok=1;
327 return(n);
328f_err:
329 ssl3_send_alert(s,SSL3_AL_FATAL,al);
330err:
331 *ok=0;
332 return(-1);
333 }
334
335int ssl_cert_type(x,pkey)
336X509 *x;
337EVP_PKEY *pkey;
338 {
339 EVP_PKEY *pk;
340 int ret= -1,i,j;
341
342 if (pkey == NULL)
343 pk=X509_get_pubkey(x);
344 else
345 pk=pkey;
346 if (pk == NULL) goto err;
347
348 i=pk->type;
349 if (i == EVP_PKEY_RSA)
350 {
351 ret=SSL_PKEY_RSA_ENC;
352 if (x != NULL)
353 {
354 j=X509_get_ext_count(x);
355 /* check to see if this is a signing only certificate */
356 /* EAY EAY EAY EAY */
357 }
358 }
359 else if (i == EVP_PKEY_DSA)
360 {
361 ret=SSL_PKEY_DSA_SIGN;
362 }
363 else if (i == EVP_PKEY_DH)
364 {
365 /* if we just have a key, we needs to be guess */
366
367 if (x == NULL)
368 ret=SSL_PKEY_DH_DSA;
369 else
370 {
371 j=X509_get_signature_type(x);
372 if (j == EVP_PKEY_RSA)
373 ret=SSL_PKEY_DH_RSA;
374 else if (j== EVP_PKEY_DSA)
375 ret=SSL_PKEY_DH_DSA;
376 else ret= -1;
377 }
378 }
379 else
380 ret= -1;
381
382err:
383 return(ret);
384 }
385
386int ssl_verify_alarm_type(type)
387long type;
388 {
389 int al;
390
391 switch(type)
392 {
393 case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
394 case X509_V_ERR_UNABLE_TO_GET_CRL:
395 al=SSL_AD_UNKNOWN_CA;
396 break;
397 case X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE:
398 case X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE:
399 case X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY:
400 case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
401 case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
402 case X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD:
403 case X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD:
404 case X509_V_ERR_CERT_NOT_YET_VALID:
405 case X509_V_ERR_CRL_NOT_YET_VALID:
406 al=SSL_AD_BAD_CERTIFICATE;
407 break;
408 case X509_V_ERR_CERT_SIGNATURE_FAILURE:
409 case X509_V_ERR_CRL_SIGNATURE_FAILURE:
410 al=SSL_AD_DECRYPT_ERROR;
411 break;
412 case X509_V_ERR_CERT_HAS_EXPIRED:
413 case X509_V_ERR_CRL_HAS_EXPIRED:
414 al=SSL_AD_CERTIFICATE_EXPIRED;
415 break;
416 case X509_V_ERR_CERT_REVOKED:
417 al=SSL_AD_CERTIFICATE_REVOKED;
418 break;
419 case X509_V_ERR_OUT_OF_MEM:
420 al=SSL_AD_INTERNAL_ERROR;
421 break;
422 case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
423 case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:
424 case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
425 case X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE:
426 case X509_V_ERR_CERT_CHAIN_TOO_LONG:
427 al=SSL_AD_UNKNOWN_CA;
428 break;
429 case X509_V_ERR_APPLICATION_VERIFICATION:
430 al=SSL_AD_HANDSHAKE_FAILURE;
431 break;
432 default:
433 al=SSL_AD_CERTIFICATE_UNKNOWN;
434 break;
435 }
436 return(al);
437 }
438
439int ssl3_setup_buffers(s)
440SSL *s;
441 {
442 unsigned char *p;
443 unsigned int extra;
444
445 if (s->s3->rbuf.buf == NULL)
446 {
447 if (s->options & SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER)
448 extra=SSL3_RT_MAX_EXTRA;
449 else
450 extra=0;
451 if ((p=(unsigned char *)Malloc(SSL3_RT_MAX_PACKET_SIZE+extra))
452 == NULL)
453 goto err;
454 s->s3->rbuf.buf=p;
455 }
456
457 if (s->s3->wbuf.buf == NULL)
458 {
459 if ((p=(unsigned char *)Malloc(SSL3_RT_MAX_PACKET_SIZE))
460 == NULL)
461 goto err;
462 s->s3->wbuf.buf=p;
463 }
464 s->packet= &(s->s3->rbuf.buf[0]);
465 return(1);
466err:
467 SSLerr(SSL_F_SSL3_SETUP_BUFFERS,ERR_R_MALLOC_FAILURE);
468 return(0);
469 }