summaryrefslogtreecommitdiff
path: root/src/lib/libssl
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libssl')
-rw-r--r--src/lib/libssl/LICENSE2
-rw-r--r--src/lib/libssl/bio_ssl.c115
-rw-r--r--src/lib/libssl/doc/openssl.cnf51
-rw-r--r--src/lib/libssl/doc/openssl.txt179
-rw-r--r--src/lib/libssl/doc/standards.txt19
-rw-r--r--src/lib/libssl/s23_clnt.c86
-rw-r--r--src/lib/libssl/s23_lib.c101
-rw-r--r--src/lib/libssl/s23_pkt.c15
-rw-r--r--src/lib/libssl/s23_srvr.c338
-rw-r--r--src/lib/libssl/s3_both.c295
-rw-r--r--src/lib/libssl/s3_clnt.c760
-rw-r--r--src/lib/libssl/s3_lib.c1139
-rw-r--r--src/lib/libssl/s3_pkt.c1064
-rw-r--r--src/lib/libssl/s3_srvr.c890
-rw-r--r--src/lib/libssl/ssl.h1625
-rw-r--r--src/lib/libssl/ssl2.h25
-rw-r--r--src/lib/libssl/ssl3.h205
-rw-r--r--src/lib/libssl/ssl_algs.c49
-rw-r--r--src/lib/libssl/ssl_asn1.c126
-rw-r--r--src/lib/libssl/ssl_cert.c665
-rw-r--r--src/lib/libssl/ssl_ciph.c1034
-rw-r--r--src/lib/libssl/ssl_err.c202
-rw-r--r--src/lib/libssl/ssl_err2.c8
-rw-r--r--src/lib/libssl/ssl_lib.c1484
-rw-r--r--src/lib/libssl/ssl_locl.h535
-rw-r--r--src/lib/libssl/ssl_rsa.c364
-rw-r--r--src/lib/libssl/ssl_sess.c431
-rw-r--r--src/lib/libssl/ssl_stat.c126
-rw-r--r--src/lib/libssl/ssl_txt.c112
-rw-r--r--src/lib/libssl/t1_clnt.c16
-rw-r--r--src/lib/libssl/t1_enc.c418
-rw-r--r--src/lib/libssl/t1_lib.c36
-rw-r--r--src/lib/libssl/t1_meth.c10
-rw-r--r--src/lib/libssl/t1_srvr.c18
-rw-r--r--src/lib/libssl/test/methtest.c6
-rw-r--r--src/lib/libssl/test/tcrl2
-rw-r--r--src/lib/libssl/test/testca2
-rw-r--r--src/lib/libssl/test/testenc12
-rw-r--r--src/lib/libssl/test/testgen16
-rw-r--r--src/lib/libssl/test/testp7.pem86
-rw-r--r--src/lib/libssl/test/testsid.pem4
-rw-r--r--src/lib/libssl/test/testss26
-rw-r--r--src/lib/libssl/test/testssl127
-rw-r--r--src/lib/libssl/test/tpkcs72
-rw-r--r--src/lib/libssl/test/tpkcs7d4
-rw-r--r--src/lib/libssl/test/treq7
-rw-r--r--src/lib/libssl/test/trsa7
-rw-r--r--src/lib/libssl/test/tsid2
-rw-r--r--src/lib/libssl/test/tx5092
-rw-r--r--src/lib/libssl/tls1.h85
50 files changed, 8774 insertions, 4159 deletions
diff --git a/src/lib/libssl/LICENSE b/src/lib/libssl/LICENSE
index b9e18d5e7b..7b93e0dbce 100644
--- a/src/lib/libssl/LICENSE
+++ b/src/lib/libssl/LICENSE
@@ -12,7 +12,7 @@
12 --------------- 12 ---------------
13 13
14/* ==================================================================== 14/* ====================================================================
15 * Copyright (c) 1998-1999 The OpenSSL Project. All rights reserved. 15 * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved.
16 * 16 *
17 * Redistribution and use in source and binary forms, with or without 17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions 18 * modification, are permitted provided that the following conditions
diff --git a/src/lib/libssl/bio_ssl.c b/src/lib/libssl/bio_ssl.c
index 58a6d69b9b..467e149947 100644
--- a/src/lib/libssl/bio_ssl.c
+++ b/src/lib/libssl/bio_ssl.c
@@ -60,27 +60,18 @@
60#include <stdlib.h> 60#include <stdlib.h>
61#include <string.h> 61#include <string.h>
62#include <errno.h> 62#include <errno.h>
63#include "crypto.h" 63#include <openssl/crypto.h>
64#include "bio.h" 64#include <openssl/bio.h>
65#include "err.h" 65#include <openssl/err.h>
66#include "ssl.h" 66#include <openssl/ssl.h>
67 67
68#ifndef NOPROTO 68static int ssl_write(BIO *h, const char *buf, int num);
69static int ssl_write(BIO *h,char *buf,int num); 69static int ssl_read(BIO *h, char *buf, int size);
70static int ssl_read(BIO *h,char *buf,int size); 70static int ssl_puts(BIO *h, const char *str);
71static int ssl_puts(BIO *h,char *str); 71static long ssl_ctrl(BIO *h, int cmd, long arg1, void *arg2);
72static long ssl_ctrl(BIO *h,int cmd,long arg1,char *arg2);
73static int ssl_new(BIO *h); 72static int ssl_new(BIO *h);
74static int ssl_free(BIO *data); 73static int ssl_free(BIO *data);
75#else 74static long ssl_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp);
76static int ssl_write();
77static int ssl_read();
78static int ssl_puts();
79static long ssl_ctrl();
80static int ssl_new();
81static int ssl_free();
82#endif
83
84typedef struct bio_ssl_st 75typedef struct bio_ssl_st
85 { 76 {
86 SSL *ssl; /* The ssl handle :-) */ 77 SSL *ssl; /* The ssl handle :-) */
@@ -102,19 +93,19 @@ static BIO_METHOD methods_sslp=
102 ssl_ctrl, 93 ssl_ctrl,
103 ssl_new, 94 ssl_new,
104 ssl_free, 95 ssl_free,
96 ssl_callback_ctrl,
105 }; 97 };
106 98
107BIO_METHOD *BIO_f_ssl() 99BIO_METHOD *BIO_f_ssl(void)
108 { 100 {
109 return(&methods_sslp); 101 return(&methods_sslp);
110 } 102 }
111 103
112static int ssl_new(bi) 104static int ssl_new(BIO *bi)
113BIO *bi;
114 { 105 {
115 BIO_SSL *bs; 106 BIO_SSL *bs;
116 107
117 bs=(BIO_SSL *)Malloc(sizeof(BIO_SSL)); 108 bs=(BIO_SSL *)OPENSSL_malloc(sizeof(BIO_SSL));
118 if (bs == NULL) 109 if (bs == NULL)
119 { 110 {
120 BIOerr(BIO_F_SSL_NEW,ERR_R_MALLOC_FAILURE); 111 BIOerr(BIO_F_SSL_NEW,ERR_R_MALLOC_FAILURE);
@@ -127,8 +118,7 @@ BIO *bi;
127 return(1); 118 return(1);
128 } 119 }
129 120
130static int ssl_free(a) 121static int ssl_free(BIO *a)
131BIO *a;
132 { 122 {
133 BIO_SSL *bs; 123 BIO_SSL *bs;
134 124
@@ -143,14 +133,11 @@ BIO *a;
143 a->flags=0; 133 a->flags=0;
144 } 134 }
145 if (a->ptr != NULL) 135 if (a->ptr != NULL)
146 Free(a->ptr); 136 OPENSSL_free(a->ptr);
147 return(1); 137 return(1);
148 } 138 }
149 139
150static int ssl_read(b,out,outl) 140static int ssl_read(BIO *b, char *out, int outl)
151BIO *b;
152char *out;
153int outl;
154 { 141 {
155 int ret=1; 142 int ret=1;
156 BIO_SSL *sb; 143 BIO_SSL *sb;
@@ -219,6 +206,10 @@ int outl;
219 BIO_set_retry_special(b); 206 BIO_set_retry_special(b);
220 retry_reason=BIO_RR_SSL_X509_LOOKUP; 207 retry_reason=BIO_RR_SSL_X509_LOOKUP;
221 break; 208 break;
209 case SSL_ERROR_WANT_ACCEPT:
210 BIO_set_retry_special(b);
211 retry_reason=BIO_RR_ACCEPT;
212 break;
222 case SSL_ERROR_WANT_CONNECT: 213 case SSL_ERROR_WANT_CONNECT:
223 BIO_set_retry_special(b); 214 BIO_set_retry_special(b);
224 retry_reason=BIO_RR_CONNECT; 215 retry_reason=BIO_RR_CONNECT;
@@ -234,10 +225,7 @@ int outl;
234 return(ret); 225 return(ret);
235 } 226 }
236 227
237static int ssl_write(b,out,outl) 228static int ssl_write(BIO *b, const char *out, int outl)
238BIO *b;
239char *out;
240int outl;
241 { 229 {
242 int ret,r=0; 230 int ret,r=0;
243 int retry_reason=0; 231 int retry_reason=0;
@@ -305,11 +293,7 @@ int outl;
305 return(ret); 293 return(ret);
306 } 294 }
307 295
308static long ssl_ctrl(b,cmd,num,ptr) 296static long ssl_ctrl(BIO *b, int cmd, long num, void *ptr)
309BIO *b;
310int cmd;
311long num;
312char *ptr;
313 { 297 {
314 SSL **sslp,*ssl; 298 SSL **sslp,*ssl;
315 BIO_SSL *bs; 299 BIO_SSL *bs;
@@ -466,7 +450,14 @@ char *ptr;
466 ret=BIO_ctrl(ssl->rbio,cmd,num,ptr); 450 ret=BIO_ctrl(ssl->rbio,cmd,num,ptr);
467 break; 451 break;
468 case BIO_CTRL_SET_CALLBACK: 452 case BIO_CTRL_SET_CALLBACK:
469 SSL_set_info_callback(ssl,(void (*)())ptr); 453 {
454#if 0 /* FIXME: Should this be used? -- Richard Levitte */
455 BIOerr(SSL_F_SSL_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
456 ret = -1;
457#else
458 ret=0;
459#endif
460 }
470 break; 461 break;
471 case BIO_CTRL_GET_CALLBACK: 462 case BIO_CTRL_GET_CALLBACK:
472 { 463 {
@@ -483,9 +474,31 @@ char *ptr;
483 return(ret); 474 return(ret);
484 } 475 }
485 476
486static int ssl_puts(bp,str) 477static long ssl_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp)
487BIO *bp; 478 {
488char *str; 479 SSL *ssl;
480 BIO_SSL *bs;
481 long ret=1;
482
483 bs=(BIO_SSL *)b->ptr;
484 ssl=bs->ssl;
485 switch (cmd)
486 {
487 case BIO_CTRL_SET_CALLBACK:
488 {
489 /* FIXME: setting this via a completely different prototype
490 seems like a crap idea */
491 SSL_set_info_callback(ssl,(void (*)(const SSL *,int,int))fp);
492 }
493 break;
494 default:
495 ret=BIO_callback_ctrl(ssl->rbio,cmd,fp);
496 break;
497 }
498 return(ret);
499 }
500
501static int ssl_puts(BIO *bp, const char *str)
489 { 502 {
490 int n,ret; 503 int n,ret;
491 504
@@ -494,8 +507,7 @@ char *str;
494 return(ret); 507 return(ret);
495 } 508 }
496 509
497BIO *BIO_new_buffer_ssl_connect(ctx) 510BIO *BIO_new_buffer_ssl_connect(SSL_CTX *ctx)
498SSL_CTX *ctx;
499 { 511 {
500 BIO *ret=NULL,*buf=NULL,*ssl=NULL; 512 BIO *ret=NULL,*buf=NULL,*ssl=NULL;
501 513
@@ -512,8 +524,7 @@ err:
512 return(NULL); 524 return(NULL);
513 } 525 }
514 526
515BIO *BIO_new_ssl_connect(ctx) 527BIO *BIO_new_ssl_connect(SSL_CTX *ctx)
516SSL_CTX *ctx;
517 { 528 {
518 BIO *ret=NULL,*con=NULL,*ssl=NULL; 529 BIO *ret=NULL,*con=NULL,*ssl=NULL;
519 530
@@ -530,9 +541,7 @@ err:
530 return(NULL); 541 return(NULL);
531 } 542 }
532 543
533BIO *BIO_new_ssl(ctx,client) 544BIO *BIO_new_ssl(SSL_CTX *ctx, int client)
534SSL_CTX *ctx;
535int client;
536 { 545 {
537 BIO *ret; 546 BIO *ret;
538 SSL *ssl; 547 SSL *ssl;
@@ -553,8 +562,7 @@ int client;
553 return(ret); 562 return(ret);
554 } 563 }
555 564
556int BIO_ssl_copy_session_id(t,f) 565int BIO_ssl_copy_session_id(BIO *t, BIO *f)
557BIO *t,*f;
558 { 566 {
559 t=BIO_find_type(t,BIO_TYPE_SSL); 567 t=BIO_find_type(t,BIO_TYPE_SSL);
560 f=BIO_find_type(f,BIO_TYPE_SSL); 568 f=BIO_find_type(f,BIO_TYPE_SSL);
@@ -567,8 +575,7 @@ BIO *t,*f;
567 return(1); 575 return(1);
568 } 576 }
569 577
570void BIO_ssl_shutdown(b) 578void BIO_ssl_shutdown(BIO *b)
571BIO *b;
572 { 579 {
573 SSL *s; 580 SSL *s;
574 581
diff --git a/src/lib/libssl/doc/openssl.cnf b/src/lib/libssl/doc/openssl.cnf
index d70dd25622..eca51c3322 100644
--- a/src/lib/libssl/doc/openssl.cnf
+++ b/src/lib/libssl/doc/openssl.cnf
@@ -3,8 +3,13 @@
3# This is mostly being used for generation of certificate requests. 3# This is mostly being used for generation of certificate requests.
4# 4#
5 5
6# This definition stops the following lines choking if HOME isn't
7# defined.
8HOME = .
6RANDFILE = $ENV::HOME/.rnd 9RANDFILE = $ENV::HOME/.rnd
7oid_file = $ENV::HOME/.oid 10
11# Extra OBJECT IDENTIFIER info:
12#oid_file = $ENV::HOME/.oid
8oid_section = new_oids 13oid_section = new_oids
9 14
10# To use this configuration file with the "-extfile" option of the 15# To use this configuration file with the "-extfile" option of the
@@ -43,6 +48,14 @@ RANDFILE = $dir/private/.rand # private random number file
43 48
44x509_extensions = usr_cert # The extentions to add to the cert 49x509_extensions = usr_cert # The extentions to add to the cert
45 50
51# Comment out the following two lines for the "traditional"
52# (and highly broken) format.
53name_opt = ca_default # Subject Name options
54cert_opt = ca_default # Certificate field options
55
56# Extension copying option: use with caution.
57# copy_extensions = copy
58
46# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs 59# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
47# so this is commented out by default to leave a V1 CRL. 60# so this is commented out by default to leave a V1 CRL.
48# crl_extensions = crl_ext 61# crl_extensions = crl_ext
@@ -86,6 +99,22 @@ distinguished_name = req_distinguished_name
86attributes = req_attributes 99attributes = req_attributes
87x509_extensions = v3_ca # The extentions to add to the self signed cert 100x509_extensions = v3_ca # The extentions to add to the self signed cert
88 101
102# Passwords for private keys if not present they will be prompted for
103# input_password = secret
104# output_password = secret
105
106# This sets a mask for permitted string types. There are several options.
107# default: PrintableString, T61String, BMPString.
108# pkix : PrintableString, BMPString.
109# utf8only: only UTF8Strings.
110# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings).
111# MASK:XXXX a literal mask value.
112# WARNING: current versions of Netscape crash on BMPStrings or UTF8Strings
113# so use this option with caution!
114string_mask = nombstr
115
116# req_extensions = v3_req # The extensions to add to a certificate request
117
89[ req_distinguished_name ] 118[ req_distinguished_name ]
90countryName = Country Name (2 letter code) 119countryName = Country Name (2 letter code)
91countryName_default = AU 120countryName_default = AU
@@ -111,7 +140,7 @@ commonName = Common Name (eg, YOUR name)
111commonName_max = 64 140commonName_max = 64
112 141
113emailAddress = Email Address 142emailAddress = Email Address
114emailAddress_max = 40 143emailAddress_max = 64
115 144
116# SET-ex3 = SET extension number 3 145# SET-ex3 = SET extension number 3
117 146
@@ -159,6 +188,9 @@ authorityKeyIdentifier=keyid,issuer:always
159# This stuff is for subjectAltName and issuerAltname. 188# This stuff is for subjectAltName and issuerAltname.
160# Import the email address. 189# Import the email address.
161# subjectAltName=email:copy 190# subjectAltName=email:copy
191# An alternative to produce certificates that aren't
192# deprecated according to PKIX.
193# subjectAltName=email:move
162 194
163# Copy subject details 195# Copy subject details
164# issuerAltName=issuer:copy 196# issuerAltName=issuer:copy
@@ -170,8 +202,16 @@ authorityKeyIdentifier=keyid,issuer:always
170#nsCaPolicyUrl 202#nsCaPolicyUrl
171#nsSslServerName 203#nsSslServerName
172 204
205[ v3_req ]
206
207# Extensions to add to a certificate request
208
209basicConstraints = CA:FALSE
210keyUsage = nonRepudiation, digitalSignature, keyEncipherment
211
173[ v3_ca ] 212[ v3_ca ]
174 213
214
175# Extensions for a typical CA 215# Extensions for a typical CA
176 216
177 217
@@ -200,10 +240,11 @@ basicConstraints = CA:true
200# Copy issuer details 240# Copy issuer details
201# issuerAltName=issuer:copy 241# issuerAltName=issuer:copy
202 242
203# RAW DER hex encoding of an extension: beware experts only! 243# DER hex encoding of an extension: beware experts only!
204# 1.2.3.5=RAW:02:03 244# obj=DER:02:03
245# Where 'obj' is a standard or added object
205# You can even override a supported extension: 246# You can even override a supported extension:
206# basicConstraints= critical, RAW:30:03:01:01:FF 247# basicConstraints= critical, DER:30:03:01:01:FF
207 248
208[ crl_ext ] 249[ crl_ext ]
209 250
diff --git a/src/lib/libssl/doc/openssl.txt b/src/lib/libssl/doc/openssl.txt
index 91b85e5f14..5da519e7e4 100644
--- a/src/lib/libssl/doc/openssl.txt
+++ b/src/lib/libssl/doc/openssl.txt
@@ -1,53 +1,12 @@
1 1
2This is some preliminary documentation for OpenSSL. 2This is some preliminary documentation for OpenSSL.
3 3
4============================================================================== 4Contents:
5 BUFFER Library
6==============================================================================
7
8The buffer library handles simple character arrays. Buffers are used for
9various purposes in the library, most notably memory BIOs.
10
11The library uses the BUF_MEM structure defined in buffer.h:
12
13typedef struct buf_mem_st
14{
15 int length; /* current number of bytes */
16 char *data;
17 int max; /* size of buffer */
18} BUF_MEM;
19
20'length' is the current size of the buffer in bytes, 'max' is the amount of
21memory allocated to the buffer. There are three functions which handle these
22and one "miscellaneous" function.
23
24BUF_MEM *BUF_MEM_new()
25
26This allocates a new buffer of zero size. Returns the buffer or NULL on error.
27
28void BUF_MEM_free(BUF_MEM *a)
29
30This frees up an already existing buffer. The data is zeroed before freeing
31up in case the buffer contains sensitive data.
32
33int BUF_MEM_grow(BUF_MEM *str, int len)
34 5
35This changes the size of an already existing buffer. It returns zero on error 6 OpenSSL X509V3 extension configuration
36or the new size (i.e. 'len'). Any data already in the buffer is preserved if 7 X509V3 Extension code: programmers guide
37it increases in size. 8 PKCS#12 Library
38 9
39char * BUF_strdup(char *str)
40
41This is the previously mentioned strdup function: like the standard library
42strdup() it copies a null terminated string into a block of allocated memory
43and returns a pointer to the allocated block.
44
45Unlike the standard C library strdup() this function uses Malloc() and so
46should be used in preference to the standard library strdup() because it can
47be used for memory leak checking or replacing the malloc() function.
48
49The memory allocated from BUF_strdup() should be freed up using the Free()
50function.
51 10
52============================================================================== 11==============================================================================
53 OpenSSL X509V3 extension configuration 12 OpenSSL X509V3 extension configuration
@@ -188,7 +147,7 @@ email.1=steve@here
188email.2=steve@there 147email.2=steve@there
189 148
190This is because the configuration file code cannot handle the same name 149This is because the configuration file code cannot handle the same name
191occurring twice in the same extension. 150occurring twice in the same section.
192 151
193The syntax of raw extensions is governed by the extension code: it can 152The syntax of raw extensions is governed by the extension code: it can
194for example contain data in multiple sections. The correct syntax to 153for example contain data in multiple sections. The correct syntax to
@@ -315,6 +274,41 @@ TRUE. An end user certificate MUST NOT have the CA value set to true.
315According to PKIX recommendations it should exclude the extension entirely, 274According to PKIX recommendations it should exclude the extension entirely,
316however some software may require CA set to FALSE for end entity certificates. 275however some software may require CA set to FALSE for end entity certificates.
317 276
277Extended Key Usage.
278
279This extensions consists of a list of usages.
280
281These can either be object short names of the dotted numerical form of OIDs.
282While any OID can be used only certain values make sense. In particular the
283following PKIX, NS and MS values are meaningful:
284
285Value Meaning
286----- -------
287serverAuth SSL/TLS Web Server Authentication.
288clientAuth SSL/TLS Web Client Authentication.
289codeSigning Code signing.
290emailProtection E-mail Protection (S/MIME).
291timeStamping Trusted Timestamping
292msCodeInd Microsoft Individual Code Signing (authenticode)
293msCodeCom Microsoft Commercial Code Signing (authenticode)
294msCTLSign Microsoft Trust List Signing
295msSGC Microsoft Server Gated Crypto
296msEFS Microsoft Encrypted File System
297nsSGC Netscape Server Gated Crypto
298
299For example, under IE5 a CA can be used for any purpose: by including a list
300of the above usages the CA can be restricted to only authorised uses.
301
302Note: software packages may place additional interpretations on certificate
303use, in particular some usages may only work for selected CAs. Don't for example
304expect just including msSGC or nsSGC will automatically mean that a certificate
305can be used for SGC ("step up" encryption) otherwise anyone could use it.
306
307Examples:
308
309extendedKeyUsage=critical,codeSigning,1.2.3.4
310extendedKeyUsage=nsSGC,msSGC
311
318Subject Key Identifier. 312Subject Key Identifier.
319 313
320This is really a string extension and can take two possible values. Either 314This is really a string extension and can take two possible values. Either
@@ -361,6 +355,24 @@ that would not make sense. It does support an additional issuer:copy option
361that will copy all the subject alternative name values from the issuer 355that will copy all the subject alternative name values from the issuer
362certificate (if possible). 356certificate (if possible).
363 357
358Example:
359
360issuserAltName = issuer:copy
361
362Authority Info Access.
363
364The authority information access extension gives details about how to access
365certain information relating to the CA. Its syntax is accessOID;location
366where 'location' has the same syntax as subject alternative name (except
367that email:copy is not supported). accessOID can be any valid OID but only
368certain values are meaningful for example OCSP and caIssuers. OCSP gives the
369location of an OCSP responder: this is used by Netscape PSM and other software.
370
371Example:
372
373authorityInfoAccess = OCSP;URI:http://ocsp.my.host/
374authorityInfoAccess = caIssuers;URI:http://my.ca/ca.html
375
364CRL distribution points. 376CRL distribution points.
365 377
366This is a multi-valued extension that supports all the literal options of 378This is a multi-valued extension that supports all the literal options of
@@ -459,16 +471,16 @@ extension in a human or machine readable form.
459 471
4601. Initialisation and cleanup. 4721. Initialisation and cleanup.
461 473
462X509V3_add_standard_extensions(); 474No special initialisation is needed before calling the extension functions.
463 475You used to have to call X509V3_add_standard_extensions(); but this is no longer
464This function should be called before any other extension code. It adds support 476required and this function no longer does anything.
465for some common PKIX and Netscape extensions. Additional custom extensions can
466be added as well (see later).
467 477
468void X509V3_EXT_cleanup(void); 478void X509V3_EXT_cleanup(void);
469 479
470This function should be called last to cleanup the extension code. After this 480This function should be called to cleanup the extension code if any custom
471call no other extension calls should be made. 481extensions have been added. If no custom extensions have been added then this
482call does nothing. After this call all custom extension code is freed up but
483you can still use the standard extensions.
472 484
4732. Printing and parsing extensions. 4852. Printing and parsing extensions.
474 486
@@ -495,6 +507,47 @@ details about the structures returned. The returned structure should be freed
495after use using the relevant free function, BASIC_CONSTRAINTS_free() for 507after use using the relevant free function, BASIC_CONSTRAINTS_free() for
496example. 508example.
497 509
510void * X509_get_ext_d2i(X509 *x, int nid, int *crit, int *idx);
511void * X509_CRL_get_ext_d2i(X509_CRL *x, int nid, int *crit, int *idx);
512void * X509_REVOKED_get_ext_d2i(X509_REVOKED *x, int nid, int *crit, int *idx);
513void * X509V3_get_d2i(STACK_OF(X509_EXTENSION) *x, int nid, int *crit, int *idx);
514
515These functions combine the operations of searching for extensions and
516parsing them. They search a certificate, a CRL a CRL entry or a stack
517of extensions respectively for extension whose NID is 'nid' and return
518the parsed result of NULL if an error occurred. For example:
519
520BASIC_CONSTRAINTS *bs;
521bs = X509_get_ext_d2i(cert, NID_basic_constraints, NULL, NULL);
522
523This will search for the basicConstraints extension and either return
524it value or NULL. NULL can mean either the extension was not found, it
525occurred more than once or it could not be parsed.
526
527If 'idx' is NULL then an extension is only parsed if it occurs precisely
528once. This is standard behaviour because extensions normally cannot occur
529more than once. If however more than one extension of the same type can
530occur it can be used to parse successive extensions for example:
531
532int i;
533void *ext;
534
535i = -1;
536for(;;) {
537 ext = X509_get_ext_d2i(x, nid, crit, &idx);
538 if(ext == NULL) break;
539 /* Do something with ext */
540}
541
542If 'crit' is not NULL and the extension was found then the int it points to
543is set to 1 for critical extensions and 0 for non critical. Therefore if the
544function returns NULL but 'crit' is set to 0 or 1 then the extension was
545found but it could not be parsed.
546
547The int pointed to by crit will be set to -1 if the extension was not found
548and -2 if the extension occurred more than once (this will only happen if
549idx is NULL). In both cases the function will return NULL.
550
4983. Generating extensions. 5513. Generating extensions.
499 552
500An extension will typically be generated from a configuration file, or some 553An extension will typically be generated from a configuration file, or some
@@ -512,7 +565,7 @@ or CRL is due to be signed. Both return 0 on error on non zero for success.
512In each case 'conf' is the LHASH pointer of the configuration file to use 565In each case 'conf' is the LHASH pointer of the configuration file to use
513and 'section' is the section containing the extension details. 566and 'section' is the section containing the extension details.
514 567
515See the 'context functions' section for a description of the ctx paramater. 568See the 'context functions' section for a description of the ctx parameter.
516 569
517 570
518X509_EXTENSION *X509V3_EXT_conf(LHASH *conf, X509V3_CTX *ctx, char *name, 571X509_EXTENSION *X509V3_EXT_conf(LHASH *conf, X509V3_CTX *ctx, char *name,
@@ -531,7 +584,7 @@ takes the NID of the extension rather than its name.
531For example to produce basicConstraints with the CA flag and a path length of 584For example to produce basicConstraints with the CA flag and a path length of
53210: 58510:
533 586
534x = X509V3_EXT_conf_nid(NULL, NULL, NID_basicConstraints, "CA:TRUE,pathlen:10"); 587x = X509V3_EXT_conf_nid(NULL, NULL, NID_basic_constraints,"CA:TRUE,pathlen:10");
535 588
536 589
537X509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, void *ext_struc); 590X509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, void *ext_struc);
@@ -659,7 +712,7 @@ The same as above but for an unsigned character value.
659int X509V3_add_value_bool(const char *name, int asn1_bool, 712int X509V3_add_value_bool(const char *name, int asn1_bool,
660 STACK_OF(CONF_VALUE) **extlist); 713 STACK_OF(CONF_VALUE) **extlist);
661 714
662This adds either "TRUE" or "FALSE" depending on the value of 'ans1_bool' 715This adds either "TRUE" or "FALSE" depending on the value of 'asn1_bool'
663 716
664int X509V3_add_value_bool_nf(char *name, int asn1_bool, 717int X509V3_add_value_bool_nf(char *name, int asn1_bool,
665 STACK_OF(CONF_VALUE) **extlist); 718 STACK_OF(CONF_VALUE) **extlist);
@@ -686,7 +739,7 @@ Multi value extensions are passed a STACK_OF(CONF_VALUE) name and value pairs
686or return a STACK_OF(CONF_VALUE). 739or return a STACK_OF(CONF_VALUE).
687 740
688Raw extensions are just passed a BIO or a value and it is the extensions 741Raw extensions are just passed a BIO or a value and it is the extensions
689responsiblity to handle all the necessary printing. 742responsibility to handle all the necessary printing.
690 743
691There are two ways to add an extension. One is simply as an alias to an already 744There are two ways to add an extension. One is simply as an alias to an already
692existing extension. An alias is an extension that is identical in ASN1 structure 745existing extension. An alias is an extension that is identical in ASN1 structure
@@ -811,7 +864,7 @@ int i2r(struct v3_ext_method *method, void *ext, BIO *out, int indent);
811 864
812This function is passed the internal extension structure in the ext parameter 865This function is passed the internal extension structure in the ext parameter
813and sends out a human readable version of the extension to out. The 'indent' 866and sends out a human readable version of the extension to out. The 'indent'
814paremeter should be noted to determine the necessary amount of indentation 867parameter should be noted to determine the necessary amount of indentation
815needed on the output. 868needed on the output.
816 869
817void * r2i(struct v3_ext_method *method, struct v3_ext_ctx *ctx, char *str); 870void * r2i(struct v3_ext_method *method, struct v3_ext_ctx *ctx, char *str);
@@ -882,7 +935,7 @@ d2i_PKCS12_fp(fp, p12)
882 935
883This is the same but for a FILE pointer. 936This is the same but for a FILE pointer.
884 937
8853. Parsing and creation functions. 9383. High level functions.
886 939
8873.1 Parsing with PKCS12_parse(). 9403.1 Parsing with PKCS12_parse().
888 941
@@ -920,6 +973,14 @@ p12 = PKCS12_create(pass, "My Certificate", pkey, cert, NULL, 0,0,0,0,0);
920i2d_PKCS12_fp(fp, p12); 973i2d_PKCS12_fp(fp, p12);
921PKCS12_free(p12); 974PKCS12_free(p12);
922 975
9763.3 Changing a PKCS#12 structure password.
977
978int PKCS12_newpass(PKCS12 *p12, char *oldpass, char *newpass);
979
980This changes the password of an already existing PKCS#12 structure. oldpass
981is the old password and newpass is the new one. An error occurs if the old
982password is incorrect.
983
923LOW LEVEL FUNCTIONS. 984LOW LEVEL FUNCTIONS.
924 985
925In some cases the high level functions do not provide the necessary 986In some cases the high level functions do not provide the necessary
diff --git a/src/lib/libssl/doc/standards.txt b/src/lib/libssl/doc/standards.txt
index 61ccc5d7e0..596d9001e6 100644
--- a/src/lib/libssl/doc/standards.txt
+++ b/src/lib/libssl/doc/standards.txt
@@ -24,7 +24,8 @@ http://www.rsasecurity.com/rsalabs/pkcs/.
24Implemented: 24Implemented:
25------------ 25------------
26 26
27These are documents that describe things that are implemented in OpenSSL. 27These are documents that describe things that are implemented (in
28whole or at least great parts) in OpenSSL.
28 29
291319 The MD2 Message-Digest Algorithm. B. Kaliski. April 1992. 301319 The MD2 Message-Digest Algorithm. B. Kaliski. April 1992.
30 (Format: TXT=25661 bytes) (Status: INFORMATIONAL) 31 (Format: TXT=25661 bytes) (Status: INFORMATIONAL)
@@ -59,6 +60,11 @@ PKCS#8: Private-Key Information Syntax Standard
59 60
60PKCS#12: Personal Information Exchange Syntax Standard, version 1.0. 61PKCS#12: Personal Information Exchange Syntax Standard, version 1.0.
61 62
632560 X.509 Internet Public Key Infrastructure Online Certificate
64 Status Protocol - OCSP. M. Myers, R. Ankney, A. Malpani, S. Galperin,
65 C. Adams. June 1999. (Format: TXT=43243 bytes) (Status: PROPOSED
66 STANDARD)
67
62 68
63Related: 69Related:
64-------- 70--------
@@ -84,6 +90,10 @@ STARTTLS documents.
84 Certification and Related Services. B. Kaliski. February 1993. 90 Certification and Related Services. B. Kaliski. February 1993.
85 (Format: TXT=17537 bytes) (Status: PROPOSED STANDARD) 91 (Format: TXT=17537 bytes) (Status: PROPOSED STANDARD)
86 92
932256 A Summary of the X.500(96) User Schema for use with LDAPv3. M.
94 Wahl. December 1997. (Format: TXT=32377 bytes) (Status: PROPOSED
95 STANDARD)
96
872487 SMTP Service Extension for Secure SMTP over TLS. P. Hoffman. 972487 SMTP Service Extension for Secure SMTP over TLS. P. Hoffman.
88 January 1999. (Format: TXT=15120 bytes) (Status: PROPOSED STANDARD) 98 January 1999. (Format: TXT=15120 bytes) (Status: PROPOSED STANDARD)
89 99
@@ -114,8 +124,7 @@ To be implemented:
114These are documents that describe things that are planed to be 124These are documents that describe things that are planed to be
115implemented in the hopefully short future. 125implemented in the hopefully short future.
116 126
1172560 X.509 Internet Public Key Infrastructure Online Certificate 1272712 Addition of Kerberos Cipher Suites to Transport Layer Security
118 Status Protocol - OCSP. M. Myers, R. Ankney, A. Malpani, S. Galperin, 128 (TLS). A. Medvinsky, M. Hur. October 1999. (Format: TXT=13763 bytes)
119 C. Adams. June 1999. (Format: TXT=43243 bytes) (Status: PROPOSED 129 (Status: PROPOSED STANDARD)
120 STANDARD)
121 130
diff --git a/src/lib/libssl/s23_clnt.c b/src/lib/libssl/s23_clnt.c
index a4661ebb68..b2be8340fb 100644
--- a/src/lib/libssl/s23_clnt.c
+++ b/src/lib/libssl/s23_clnt.c
@@ -57,28 +57,22 @@
57 */ 57 */
58 58
59#include <stdio.h> 59#include <stdio.h>
60#include "buffer.h" 60#include <openssl/buffer.h>
61#include "rand.h" 61#include <openssl/rand.h>
62#include "objects.h" 62#include <openssl/objects.h>
63#include "evp.h" 63#include <openssl/evp.h>
64#include "ssl_locl.h" 64#include "ssl_locl.h"
65 65
66#define BREAK break 66static SSL_METHOD *ssl23_get_client_method(int ver);
67
68#ifndef NOPROTO
69static int ssl23_client_hello(SSL *s); 67static int ssl23_client_hello(SSL *s);
70static int ssl23_get_server_hello(SSL *s); 68static int ssl23_get_server_hello(SSL *s);
71#else 69static SSL_METHOD *ssl23_get_client_method(int ver)
72static int ssl23_client_hello();
73static int ssl23_get_server_hello();
74#endif
75
76static SSL_METHOD *ssl23_get_client_method(ver)
77int ver;
78 { 70 {
71#ifndef OPENSSL_NO_SSL2
79 if (ver == SSL2_VERSION) 72 if (ver == SSL2_VERSION)
80 return(SSLv2_client_method()); 73 return(SSLv2_client_method());
81 else if (ver == SSL3_VERSION) 74#endif
75 if (ver == SSL3_VERSION)
82 return(SSLv3_client_method()); 76 return(SSLv3_client_method());
83 else if (ver == TLS1_VERSION) 77 else if (ver == TLS1_VERSION)
84 return(TLSv1_client_method()); 78 return(TLSv1_client_method());
@@ -86,32 +80,31 @@ int ver;
86 return(NULL); 80 return(NULL);
87 } 81 }
88 82
89SSL_METHOD *SSLv23_client_method() 83SSL_METHOD *SSLv23_client_method(void)
90 { 84 {
91 static int init=1; 85 static int init=1;
92 static SSL_METHOD SSLv23_client_data; 86 static SSL_METHOD SSLv23_client_data;
93 87
94 if (init) 88 if (init)
95 { 89 {
96 init=0;
97 memcpy((char *)&SSLv23_client_data, 90 memcpy((char *)&SSLv23_client_data,
98 (char *)sslv23_base_method(),sizeof(SSL_METHOD)); 91 (char *)sslv23_base_method(),sizeof(SSL_METHOD));
99 SSLv23_client_data.ssl_connect=ssl23_connect; 92 SSLv23_client_data.ssl_connect=ssl23_connect;
100 SSLv23_client_data.get_ssl_method=ssl23_get_client_method; 93 SSLv23_client_data.get_ssl_method=ssl23_get_client_method;
94 init=0;
101 } 95 }
102 return(&SSLv23_client_data); 96 return(&SSLv23_client_data);
103 } 97 }
104 98
105int ssl23_connect(s) 99int ssl23_connect(SSL *s)
106SSL *s;
107 { 100 {
108 BUF_MEM *buf; 101 BUF_MEM *buf;
109 unsigned long Time=time(NULL); 102 unsigned long Time=time(NULL);
110 void (*cb)()=NULL; 103 void (*cb)(const SSL *ssl,int type,int val)=NULL;
111 int ret= -1; 104 int ret= -1;
112 int new_state,state; 105 int new_state,state;
113 106
114 RAND_seed((unsigned char *)&Time,sizeof(Time)); 107 RAND_add(&Time,sizeof(Time),0);
115 ERR_clear_error(); 108 ERR_clear_error();
116 clear_sys_error(); 109 clear_sys_error();
117 110
@@ -120,8 +113,8 @@ SSL *s;
120 else if (s->ctx->info_callback != NULL) 113 else if (s->ctx->info_callback != NULL)
121 cb=s->ctx->info_callback; 114 cb=s->ctx->info_callback;
122 115
123 if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
124 s->in_handshake++; 116 s->in_handshake++;
117 if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
125 118
126 for (;;) 119 for (;;)
127 { 120 {
@@ -134,6 +127,13 @@ SSL *s;
134 case SSL_ST_BEFORE|SSL_ST_CONNECT: 127 case SSL_ST_BEFORE|SSL_ST_CONNECT:
135 case SSL_ST_OK|SSL_ST_CONNECT: 128 case SSL_ST_OK|SSL_ST_CONNECT:
136 129
130 if (s->session != NULL)
131 {
132 SSLerr(SSL_F_SSL23_CONNECT,SSL_R_SSL23_DOING_SESSION_ID_REUSE);
133 ret= -1;
134 goto end;
135 }
136 s->server=0;
137 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1); 137 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
138 138
139 /* s->version=TLS1_VERSION; */ 139 /* s->version=TLS1_VERSION; */
@@ -159,7 +159,7 @@ SSL *s;
159 ssl3_init_finished_mac(s); 159 ssl3_init_finished_mac(s);
160 160
161 s->state=SSL23_ST_CW_CLNT_HELLO_A; 161 s->state=SSL23_ST_CW_CLNT_HELLO_A;
162 s->ctx->sess_connect++; 162 s->ctx->stats.sess_connect++;
163 s->init_num=0; 163 s->init_num=0;
164 break; 164 break;
165 165
@@ -179,7 +179,7 @@ SSL *s;
179 ret=ssl23_get_server_hello(s); 179 ret=ssl23_get_server_hello(s);
180 if (ret >= 0) cb=NULL; 180 if (ret >= 0) cb=NULL;
181 goto end; 181 goto end;
182 break; 182 /* break; */
183 183
184 default: 184 default:
185 SSLerr(SSL_F_SSL23_CONNECT,SSL_R_UNKNOWN_STATE); 185 SSLerr(SSL_F_SSL23_CONNECT,SSL_R_UNKNOWN_STATE);
@@ -188,7 +188,7 @@ SSL *s;
188 /* break; */ 188 /* break; */
189 } 189 }
190 190
191 if (s->debug) BIO_flush(s->wbio); 191 if (s->debug) { (void)BIO_flush(s->wbio); }
192 192
193 if ((cb != NULL) && (s->state != state)) 193 if ((cb != NULL) && (s->state != state))
194 { 194 {
@@ -206,12 +206,12 @@ end:
206 } 206 }
207 207
208 208
209static int ssl23_client_hello(s) 209static int ssl23_client_hello(SSL *s)
210SSL *s;
211 { 210 {
212 unsigned char *buf; 211 unsigned char *buf;
213 unsigned char *p,*d; 212 unsigned char *p,*d;
214 int i,ch_len; 213 int i,ch_len;
214 int ret;
215 215
216 buf=(unsigned char *)s->init_buf->data; 216 buf=(unsigned char *)s->init_buf->data;
217 if (s->state == SSL23_ST_CW_CLNT_HELLO_A) 217 if (s->state == SSL23_ST_CW_CLNT_HELLO_A)
@@ -225,7 +225,7 @@ SSL *s;
225#endif 225#endif
226 226
227 p=s->s3->client_random; 227 p=s->s3->client_random;
228 RAND_bytes(p,SSL3_RANDOM_SIZE); 228 RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE);
229 229
230 /* Do the message type and length last */ 230 /* Do the message type and length last */
231 d= &(buf[2]); 231 d= &(buf[2]);
@@ -236,16 +236,19 @@ SSL *s;
236 { 236 {
237 *(d++)=TLS1_VERSION_MAJOR; 237 *(d++)=TLS1_VERSION_MAJOR;
238 *(d++)=TLS1_VERSION_MINOR; 238 *(d++)=TLS1_VERSION_MINOR;
239 s->client_version=TLS1_VERSION;
239 } 240 }
240 else if (!(s->options & SSL_OP_NO_SSLv3)) 241 else if (!(s->options & SSL_OP_NO_SSLv3))
241 { 242 {
242 *(d++)=SSL3_VERSION_MAJOR; 243 *(d++)=SSL3_VERSION_MAJOR;
243 *(d++)=SSL3_VERSION_MINOR; 244 *(d++)=SSL3_VERSION_MINOR;
245 s->client_version=SSL3_VERSION;
244 } 246 }
245 else if (!(s->options & SSL_OP_NO_SSLv2)) 247 else if (!(s->options & SSL_OP_NO_SSLv2))
246 { 248 {
247 *(d++)=SSL2_VERSION_MAJOR; 249 *(d++)=SSL2_VERSION_MAJOR;
248 *(d++)=SSL2_VERSION_MINOR; 250 *(d++)=SSL2_VERSION_MINOR;
251 s->client_version=SSL2_VERSION;
249 } 252 }
250 else 253 else
251 { 254 {
@@ -283,7 +286,7 @@ SSL *s;
283 i=ch_len; 286 i=ch_len;
284 s2n(i,d); 287 s2n(i,d);
285 memset(&(s->s3->client_random[0]),0,SSL3_RANDOM_SIZE); 288 memset(&(s->s3->client_random[0]),0,SSL3_RANDOM_SIZE);
286 RAND_bytes(&(s->s3->client_random[SSL3_RANDOM_SIZE-i]),i); 289 RAND_pseudo_bytes(&(s->s3->client_random[SSL3_RANDOM_SIZE-i]),i);
287 memcpy(p,&(s->s3->client_random[SSL3_RANDOM_SIZE-i]),i); 290 memcpy(p,&(s->s3->client_random[SSL3_RANDOM_SIZE-i]),i);
288 p+=i; 291 p+=i;
289 292
@@ -300,15 +303,18 @@ SSL *s;
300 } 303 }
301 304
302 /* SSL3_ST_CW_CLNT_HELLO_B */ 305 /* SSL3_ST_CW_CLNT_HELLO_B */
303 return(ssl23_write_bytes(s)); 306 ret = ssl23_write_bytes(s);
307 if (ret >= 2)
308 if (s->msg_callback)
309 s->msg_callback(1, SSL2_VERSION, 0, s->init_buf->data+2, ret-2, s, s->msg_callback_arg); /* CLIENT-HELLO */
310 return ret;
304 } 311 }
305 312
306static int ssl23_get_server_hello(s) 313static int ssl23_get_server_hello(SSL *s)
307SSL *s;
308 { 314 {
309 char buf[8]; 315 char buf[8];
310 unsigned char *p; 316 unsigned char *p;
311 int i,ch_len; 317 int i;
312 int n; 318 int n;
313 319
314 n=ssl23_read_bytes(s,7); 320 n=ssl23_read_bytes(s,7);
@@ -321,9 +327,14 @@ SSL *s;
321 if ((p[0] & 0x80) && (p[2] == SSL2_MT_SERVER_HELLO) && 327 if ((p[0] & 0x80) && (p[2] == SSL2_MT_SERVER_HELLO) &&
322 (p[5] == 0x00) && (p[6] == 0x02)) 328 (p[5] == 0x00) && (p[6] == 0x02))
323 { 329 {
330#ifdef OPENSSL_NO_SSL2
331 SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_PROTOCOL);
332 goto err;
333#else
324 /* we are talking sslv2 */ 334 /* we are talking sslv2 */
325 /* we need to clean up the SSLv3 setup and put in the 335 /* we need to clean up the SSLv3 setup and put in the
326 * sslv2 stuff. */ 336 * sslv2 stuff. */
337 int ch_len;
327 338
328 if (s->options & SSL_OP_NO_SSLv2) 339 if (s->options & SSL_OP_NO_SSLv2)
329 { 340 {
@@ -360,7 +371,9 @@ SSL *s;
360 } 371 }
361 372
362 s->state=SSL2_ST_GET_SERVER_HELLO_A; 373 s->state=SSL2_ST_GET_SERVER_HELLO_A;
363 s->s2->ssl2_rollback=1; 374 if (!(s->client_version == SSL2_VERSION))
375 /* use special padding (SSL 3.0 draft/RFC 2246, App. E.2) */
376 s->s2->ssl2_rollback=1;
364 377
365 /* setup the 5 bytes we have read so we get them from 378 /* setup the 5 bytes we have read so we get them from
366 * the sslv2 buffer */ 379 * the sslv2 buffer */
@@ -376,6 +389,7 @@ SSL *s;
376 389
377 s->method=SSLv2_client_method(); 390 s->method=SSLv2_client_method();
378 s->handshake_func=s->method->ssl_connect; 391 s->handshake_func=s->method->ssl_connect;
392#endif
379 } 393 }
380 else if ((p[0] == SSL3_RT_HANDSHAKE) && 394 else if ((p[0] == SSL3_RT_HANDSHAKE) &&
381 (p[1] == SSL3_VERSION_MAJOR) && 395 (p[1] == SSL3_VERSION_MAJOR) &&
@@ -426,7 +440,7 @@ SSL *s;
426 (p[3] == 0) && 440 (p[3] == 0) &&
427 (p[4] == 2)) 441 (p[4] == 2))
428 { 442 {
429 void (*cb)()=NULL; 443 void (*cb)(const SSL *ssl,int type,int val)=NULL;
430 int j; 444 int j;
431 445
432 /* An alert */ 446 /* An alert */
@@ -443,7 +457,7 @@ SSL *s;
443 } 457 }
444 458
445 s->rwstate=SSL_NOTHING; 459 s->rwstate=SSL_NOTHING;
446 SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,1000+p[6]); 460 SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_AD_REASON_OFFSET+p[6]);
447 goto err; 461 goto err;
448 } 462 }
449 else 463 else
diff --git a/src/lib/libssl/s23_lib.c b/src/lib/libssl/s23_lib.c
index e16f641101..b70002a647 100644
--- a/src/lib/libssl/s23_lib.c
+++ b/src/lib/libssl/s23_lib.c
@@ -57,28 +57,18 @@
57 */ 57 */
58 58
59#include <stdio.h> 59#include <stdio.h>
60#include "objects.h" 60#include <openssl/objects.h>
61#include "ssl_locl.h" 61#include "ssl_locl.h"
62 62
63#ifndef NOPROTO
64static int ssl23_num_ciphers(void ); 63static int ssl23_num_ciphers(void );
65static SSL_CIPHER *ssl23_get_cipher(unsigned int u); 64static SSL_CIPHER *ssl23_get_cipher(unsigned int u);
66static int ssl23_read(SSL *s, char *buf, int len); 65static int ssl23_read(SSL *s, void *buf, int len);
67static int ssl23_write(SSL *s, char *buf, int len); 66static int ssl23_peek(SSL *s, void *buf, int len);
67static int ssl23_write(SSL *s, const void *buf, int len);
68static long ssl23_default_timeout(void ); 68static long ssl23_default_timeout(void );
69static int ssl23_put_cipher_by_char(SSL_CIPHER *c, unsigned char *p); 69static int ssl23_put_cipher_by_char(const SSL_CIPHER *c, unsigned char *p);
70static SSL_CIPHER *ssl23_get_cipher_by_char(unsigned char *p); 70static SSL_CIPHER *ssl23_get_cipher_by_char(const unsigned char *p);
71#else 71const char *SSL23_version_str="SSLv2/3 compatibility" OPENSSL_VERSION_PTEXT;
72static int ssl23_num_ciphers();
73static SSL_CIPHER *ssl23_get_cipher();
74static int ssl23_read();
75static int ssl23_write();
76static long ssl23_default_timeout();
77static int ssl23_put_cipher_by_char();
78static SSL_CIPHER *ssl23_get_cipher_by_char();
79#endif
80
81char *SSL23_version_str="SSLv2/3 compatablity part of SSLeay 0.7.0 30-Jan-1997";
82 72
83static SSL_METHOD SSLv23_data= { 73static SSL_METHOD SSLv23_data= {
84 TLS1_VERSION, 74 TLS1_VERSION,
@@ -88,10 +78,11 @@ static SSL_METHOD SSLv23_data= {
88 ssl_undefined_function, 78 ssl_undefined_function,
89 ssl_undefined_function, 79 ssl_undefined_function,
90 ssl23_read, 80 ssl23_read,
91 ssl_undefined_function, 81 ssl23_peek,
92 ssl23_write, 82 ssl23_write,
93 ssl_undefined_function, 83 ssl_undefined_function,
94 ssl_undefined_function, 84 ssl_undefined_function,
85 ssl_ok,
95 ssl3_ctrl, 86 ssl3_ctrl,
96 ssl3_ctx_ctrl, 87 ssl3_ctx_ctrl,
97 ssl23_get_cipher_by_char, 88 ssl23_get_cipher_by_char,
@@ -102,38 +93,47 @@ static SSL_METHOD SSLv23_data= {
102 ssl_bad_method, 93 ssl_bad_method,
103 ssl23_default_timeout, 94 ssl23_default_timeout,
104 &ssl3_undef_enc_method, 95 &ssl3_undef_enc_method,
96 ssl_undefined_function,
97 ssl3_callback_ctrl,
98 ssl3_ctx_callback_ctrl,
105 }; 99 };
106 100
107static long ssl23_default_timeout() 101static long ssl23_default_timeout(void)
108 { 102 {
109 return(300); 103 return(300);
110 } 104 }
111 105
112SSL_METHOD *sslv23_base_method() 106SSL_METHOD *sslv23_base_method(void)
113 { 107 {
114 return(&SSLv23_data); 108 return(&SSLv23_data);
115 } 109 }
116 110
117static int ssl23_num_ciphers() 111static int ssl23_num_ciphers(void)
118 { 112 {
119 return(ssl3_num_ciphers()+ssl2_num_ciphers()); 113 return(ssl3_num_ciphers()
114#ifndef OPENSSL_NO_SSL2
115 + ssl2_num_ciphers()
116#endif
117 );
120 } 118 }
121 119
122static SSL_CIPHER *ssl23_get_cipher(u) 120static SSL_CIPHER *ssl23_get_cipher(unsigned int u)
123unsigned int u;
124 { 121 {
125 unsigned int uu=ssl3_num_ciphers(); 122 unsigned int uu=ssl3_num_ciphers();
126 123
127 if (u < uu) 124 if (u < uu)
128 return(ssl3_get_cipher(u)); 125 return(ssl3_get_cipher(u));
129 else 126 else
127#ifndef OPENSSL_NO_SSL2
130 return(ssl2_get_cipher(u-uu)); 128 return(ssl2_get_cipher(u-uu));
129#else
130 return(NULL);
131#endif
131 } 132 }
132 133
133/* This function needs to check if the ciphers required are actually 134/* This function needs to check if the ciphers required are actually
134 * available */ 135 * available */
135static SSL_CIPHER *ssl23_get_cipher_by_char(p) 136static SSL_CIPHER *ssl23_get_cipher_by_char(const unsigned char *p)
136unsigned char *p;
137 { 137 {
138 SSL_CIPHER c,*cp; 138 SSL_CIPHER c,*cp;
139 unsigned long id; 139 unsigned long id;
@@ -144,14 +144,14 @@ unsigned char *p;
144 ((unsigned long)p[1]<<8L)|(unsigned long)p[2]; 144 ((unsigned long)p[1]<<8L)|(unsigned long)p[2];
145 c.id=id; 145 c.id=id;
146 cp=ssl3_get_cipher_by_char(p); 146 cp=ssl3_get_cipher_by_char(p);
147#ifndef OPENSSL_NO_SSL2
147 if (cp == NULL) 148 if (cp == NULL)
148 cp=ssl2_get_cipher_by_char(p); 149 cp=ssl2_get_cipher_by_char(p);
150#endif
149 return(cp); 151 return(cp);
150 } 152 }
151 153
152static int ssl23_put_cipher_by_char(c,p) 154static int ssl23_put_cipher_by_char(const SSL_CIPHER *c, unsigned char *p)
153SSL_CIPHER *c;
154unsigned char *p;
155 { 155 {
156 long l; 156 long l;
157 157
@@ -166,20 +166,10 @@ unsigned char *p;
166 return(3); 166 return(3);
167 } 167 }
168 168
169static int ssl23_read(s,buf,len) 169static int ssl23_read(SSL *s, void *buf, int len)
170SSL *s;
171char *buf;
172int len;
173 { 170 {
174 int n; 171 int n;
175 172
176#if 0
177 if (s->shutdown & SSL_RECEIVED_SHUTDOWN)
178 {
179 s->rwstate=SSL_NOTHING;
180 return(0);
181 }
182#endif
183 clear_sys_error(); 173 clear_sys_error();
184 if (SSL_in_init(s) && (!s->in_handshake)) 174 if (SSL_in_init(s) && (!s->in_handshake))
185 { 175 {
@@ -199,20 +189,33 @@ int len;
199 } 189 }
200 } 190 }
201 191
202static int ssl23_write(s,buf,len) 192static int ssl23_peek(SSL *s, void *buf, int len)
203SSL *s;
204char *buf;
205int len;
206 { 193 {
207 int n; 194 int n;
208 195
209#if 0 196 clear_sys_error();
210 if (s->shutdown & SSL_SENT_SHUTDOWN) 197 if (SSL_in_init(s) && (!s->in_handshake))
211 { 198 {
212 s->rwstate=SSL_NOTHING; 199 n=s->handshake_func(s);
213 return(0); 200 if (n < 0) return(n);
201 if (n == 0)
202 {
203 SSLerr(SSL_F_SSL23_PEEK,SSL_R_SSL_HANDSHAKE_FAILURE);
204 return(-1);
205 }
206 return(SSL_peek(s,buf,len));
214 } 207 }
215#endif 208 else
209 {
210 ssl_undefined_function(s);
211 return(-1);
212 }
213 }
214
215static int ssl23_write(SSL *s, const void *buf, int len)
216 {
217 int n;
218
216 clear_sys_error(); 219 clear_sys_error();
217 if (SSL_in_init(s) && (!s->in_handshake)) 220 if (SSL_in_init(s) && (!s->in_handshake))
218 { 221 {
diff --git a/src/lib/libssl/s23_pkt.c b/src/lib/libssl/s23_pkt.c
index c25c312772..f45e1ce3d8 100644
--- a/src/lib/libssl/s23_pkt.c
+++ b/src/lib/libssl/s23_pkt.c
@@ -59,12 +59,11 @@
59#include <stdio.h> 59#include <stdio.h>
60#include <errno.h> 60#include <errno.h>
61#define USE_SOCKETS 61#define USE_SOCKETS
62#include "evp.h" 62#include <openssl/evp.h>
63#include "buffer.h" 63#include <openssl/buffer.h>
64#include "ssl_locl.h" 64#include "ssl_locl.h"
65 65
66int ssl23_write_bytes(s) 66int ssl23_write_bytes(SSL *s)
67SSL *s;
68 { 67 {
69 int i,num,tot; 68 int i,num,tot;
70 char *buf; 69 char *buf;
@@ -76,7 +75,7 @@ SSL *s;
76 { 75 {
77 s->rwstate=SSL_WRITING; 76 s->rwstate=SSL_WRITING;
78 i=BIO_write(s->wbio,&(buf[tot]),num); 77 i=BIO_write(s->wbio,&(buf[tot]),num);
79 if (i < 0) 78 if (i <= 0)
80 { 79 {
81 s->init_off=tot; 80 s->init_off=tot;
82 s->init_num=num; 81 s->init_num=num;
@@ -90,10 +89,8 @@ SSL *s;
90 } 89 }
91 } 90 }
92 91
93/* only return when we have read 'n' bytes */ 92/* return regularly only when we have read (at least) 'n' bytes */
94int ssl23_read_bytes(s,n) 93int ssl23_read_bytes(SSL *s, int n)
95SSL *s;
96int n;
97 { 94 {
98 unsigned char *p; 95 unsigned char *p;
99 int j; 96 int j;
diff --git a/src/lib/libssl/s23_srvr.c b/src/lib/libssl/s23_srvr.c
index c7b9ecbcf2..9e89cc7f9a 100644
--- a/src/lib/libssl/s23_srvr.c
+++ b/src/lib/libssl/s23_srvr.c
@@ -55,28 +55,76 @@
55 * copied and put under another distribution licence 55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.] 56 * [including the GNU Public Licence.]
57 */ 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 */
58 111
59#include <stdio.h> 112#include <stdio.h>
60#include "buffer.h" 113#include <openssl/buffer.h>
61#include "rand.h" 114#include <openssl/rand.h>
62#include "objects.h" 115#include <openssl/objects.h>
63#include "evp.h" 116#include <openssl/evp.h>
64#include "ssl_locl.h" 117#include "ssl_locl.h"
65 118
66#define BREAK break 119static SSL_METHOD *ssl23_get_server_method(int ver);
67
68#ifndef NOPROTO
69int ssl23_get_client_hello(SSL *s); 120int ssl23_get_client_hello(SSL *s);
70#else 121static SSL_METHOD *ssl23_get_server_method(int ver)
71int ssl23_get_client_hello();
72#endif
73
74static SSL_METHOD *ssl23_get_server_method(ver)
75int ver;
76 { 122 {
123#ifndef OPENSSL_NO_SSL2
77 if (ver == SSL2_VERSION) 124 if (ver == SSL2_VERSION)
78 return(SSLv2_server_method()); 125 return(SSLv2_server_method());
79 else if (ver == SSL3_VERSION) 126#endif
127 if (ver == SSL3_VERSION)
80 return(SSLv3_server_method()); 128 return(SSLv3_server_method());
81 else if (ver == TLS1_VERSION) 129 else if (ver == TLS1_VERSION)
82 return(TLSv1_server_method()); 130 return(TLSv1_server_method());
@@ -84,32 +132,31 @@ int ver;
84 return(NULL); 132 return(NULL);
85 } 133 }
86 134
87SSL_METHOD *SSLv23_server_method() 135SSL_METHOD *SSLv23_server_method(void)
88 { 136 {
89 static int init=1; 137 static int init=1;
90 static SSL_METHOD SSLv23_server_data; 138 static SSL_METHOD SSLv23_server_data;
91 139
92 if (init) 140 if (init)
93 { 141 {
94 init=0;
95 memcpy((char *)&SSLv23_server_data, 142 memcpy((char *)&SSLv23_server_data,
96 (char *)sslv23_base_method(),sizeof(SSL_METHOD)); 143 (char *)sslv23_base_method(),sizeof(SSL_METHOD));
97 SSLv23_server_data.ssl_accept=ssl23_accept; 144 SSLv23_server_data.ssl_accept=ssl23_accept;
98 SSLv23_server_data.get_ssl_method=ssl23_get_server_method; 145 SSLv23_server_data.get_ssl_method=ssl23_get_server_method;
146 init=0;
99 } 147 }
100 return(&SSLv23_server_data); 148 return(&SSLv23_server_data);
101 } 149 }
102 150
103int ssl23_accept(s) 151int ssl23_accept(SSL *s)
104SSL *s;
105 { 152 {
106 BUF_MEM *buf; 153 BUF_MEM *buf;
107 unsigned long Time=time(NULL); 154 unsigned long Time=time(NULL);
108 void (*cb)()=NULL; 155 void (*cb)(const SSL *ssl,int type,int val)=NULL;
109 int ret= -1; 156 int ret= -1;
110 int new_state,state; 157 int new_state,state;
111 158
112 RAND_seed((unsigned char *)&Time,sizeof(Time)); 159 RAND_add(&Time,sizeof(Time),0);
113 ERR_clear_error(); 160 ERR_clear_error();
114 clear_sys_error(); 161 clear_sys_error();
115 162
@@ -118,8 +165,8 @@ SSL *s;
118 else if (s->ctx->info_callback != NULL) 165 else if (s->ctx->info_callback != NULL)
119 cb=s->ctx->info_callback; 166 cb=s->ctx->info_callback;
120 167
121 if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
122 s->in_handshake++; 168 s->in_handshake++;
169 if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
123 170
124 for (;;) 171 for (;;)
125 { 172 {
@@ -132,6 +179,7 @@ SSL *s;
132 case SSL_ST_BEFORE|SSL_ST_ACCEPT: 179 case SSL_ST_BEFORE|SSL_ST_ACCEPT:
133 case SSL_ST_OK|SSL_ST_ACCEPT: 180 case SSL_ST_OK|SSL_ST_ACCEPT:
134 181
182 s->server=1;
135 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1); 183 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
136 184
137 /* s->version=SSL3_VERSION; */ 185 /* s->version=SSL3_VERSION; */
@@ -155,7 +203,7 @@ SSL *s;
155 ssl3_init_finished_mac(s); 203 ssl3_init_finished_mac(s);
156 204
157 s->state=SSL23_ST_SR_CLNT_HELLO_A; 205 s->state=SSL23_ST_SR_CLNT_HELLO_A;
158 s->ctx->sess_accept++; 206 s->ctx->stats.sess_accept++;
159 s->init_num=0; 207 s->init_num=0;
160 break; 208 break;
161 209
@@ -166,7 +214,7 @@ SSL *s;
166 ret=ssl23_get_client_hello(s); 214 ret=ssl23_get_client_hello(s);
167 if (ret >= 0) cb=NULL; 215 if (ret >= 0) cb=NULL;
168 goto end; 216 goto end;
169 break; 217 /* break; */
170 218
171 default: 219 default:
172 SSLerr(SSL_F_SSL23_ACCEPT,SSL_R_UNKNOWN_STATE); 220 SSLerr(SSL_F_SSL23_ACCEPT,SSL_R_UNKNOWN_STATE);
@@ -184,31 +232,48 @@ SSL *s;
184 } 232 }
185 } 233 }
186end: 234end:
235 s->in_handshake--;
187 if (cb != NULL) 236 if (cb != NULL)
188 cb(s,SSL_CB_ACCEPT_EXIT,ret); 237 cb(s,SSL_CB_ACCEPT_EXIT,ret);
189 s->in_handshake--;
190 return(ret); 238 return(ret);
191 } 239 }
192 240
193 241
194int ssl23_get_client_hello(s) 242int ssl23_get_client_hello(SSL *s)
195SSL *s;
196 { 243 {
197 char buf_space[8]; 244 char buf_space[11]; /* Request this many bytes in initial read.
245 * We can detect SSL 3.0/TLS 1.0 Client Hellos
246 * ('type == 3') correctly only when the following
247 * is in a single record, which is not guaranteed by
248 * the protocol specification:
249 * Byte Content
250 * 0 type \
251 * 1/2 version > record header
252 * 3/4 length /
253 * 5 msg_type \
254 * 6-8 length > Client Hello message
255 * 9/10 client_version /
256 */
198 char *buf= &(buf_space[0]); 257 char *buf= &(buf_space[0]);
199 unsigned char *p,*d,*dd; 258 unsigned char *p,*d,*d_len,*dd;
200 unsigned int i; 259 unsigned int i;
201 unsigned int csl,sil,cl; 260 unsigned int csl,sil,cl;
202 int n=0,j,tls1=0; 261 int n=0,j;
203 int type=0,use_sslv2_strong=0; 262 int type=0;
263 int v[2];
264#ifndef OPENSSL_NO_RSA
265 int use_sslv2_strong=0;
266#endif
204 267
205 /* read the initial header */
206 if (s->state == SSL23_ST_SR_CLNT_HELLO_A) 268 if (s->state == SSL23_ST_SR_CLNT_HELLO_A)
207 { 269 {
270 /* read the initial header */
271 v[0]=v[1]=0;
272
208 if (!ssl3_setup_buffers(s)) goto err; 273 if (!ssl3_setup_buffers(s)) goto err;
209 274
210 n=ssl23_read_bytes(s,7); 275 n=ssl23_read_bytes(s, sizeof buf_space);
211 if (n != 7) return(n); 276 if (n != sizeof buf_space) return(n); /* n == -1 || n == 0 */
212 277
213 p=s->packet; 278 p=s->packet;
214 279
@@ -216,124 +281,135 @@ SSL *s;
216 281
217 if ((p[0] & 0x80) && (p[2] == SSL2_MT_CLIENT_HELLO)) 282 if ((p[0] & 0x80) && (p[2] == SSL2_MT_CLIENT_HELLO))
218 { 283 {
219 /* SSLv2 header */ 284 /*
285 * SSLv2 header
286 */
220 if ((p[3] == 0x00) && (p[4] == 0x02)) 287 if ((p[3] == 0x00) && (p[4] == 0x02))
221 { 288 {
289 v[0]=p[3]; v[1]=p[4];
222 /* SSLv2 */ 290 /* SSLv2 */
223 if (!(s->options & SSL_OP_NO_SSLv2)) 291 if (!(s->options & SSL_OP_NO_SSLv2))
224 type=1; 292 type=1;
225 } 293 }
226 else if (p[3] == SSL3_VERSION_MAJOR) 294 else if (p[3] == SSL3_VERSION_MAJOR)
227 { 295 {
296 v[0]=p[3]; v[1]=p[4];
228 /* SSLv3/TLSv1 */ 297 /* SSLv3/TLSv1 */
229 if (p[4] >= TLS1_VERSION_MINOR) 298 if (p[4] >= TLS1_VERSION_MINOR)
230 { 299 {
231 if (!(s->options & SSL_OP_NO_TLSv1)) 300 if (!(s->options & SSL_OP_NO_TLSv1))
232 { 301 {
233 tls1=1; 302 s->version=TLS1_VERSION;
303 /* type=2; */ /* done later to survive restarts */
234 s->state=SSL23_ST_SR_CLNT_HELLO_B; 304 s->state=SSL23_ST_SR_CLNT_HELLO_B;
235 } 305 }
236 else if (!(s->options & SSL_OP_NO_SSLv3)) 306 else if (!(s->options & SSL_OP_NO_SSLv3))
237 { 307 {
308 s->version=SSL3_VERSION;
309 /* type=2; */
238 s->state=SSL23_ST_SR_CLNT_HELLO_B; 310 s->state=SSL23_ST_SR_CLNT_HELLO_B;
239 } 311 }
312 else if (!(s->options & SSL_OP_NO_SSLv2))
313 {
314 type=1;
315 }
240 } 316 }
241 else if (!(s->options & SSL_OP_NO_SSLv3)) 317 else if (!(s->options & SSL_OP_NO_SSLv3))
242 s->state=SSL23_ST_SR_CLNT_HELLO_B;
243
244 if (s->options & SSL_OP_NON_EXPORT_FIRST)
245 { 318 {
246 STACK *sk; 319 s->version=SSL3_VERSION;
247 SSL_CIPHER *c; 320 /* type=2; */
248 int ne2,ne3; 321 s->state=SSL23_ST_SR_CLNT_HELLO_B;
249
250 j=((p[0]&0x7f)<<8)|p[1];
251 if (j > (1024*4))
252 {
253 SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_RECORD_TOO_LARGE);
254 goto err;
255 }
256
257 n=ssl23_read_bytes(s,j+2);
258 if (n <= 0) return(n);
259 p=s->packet;
260
261 if ((buf=Malloc(n)) == NULL)
262 {
263 SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,ERR_R_MALLOC_FAILURE);
264 goto err;
265 }
266 memcpy(buf,p,n);
267
268 p+=5;
269 n2s(p,csl);
270 p+=4;
271
272 sk=ssl_bytes_to_cipher_list(
273 s,p,csl,NULL);
274 if (sk != NULL)
275 {
276 ne2=ne3=0;
277 for (j=0; j<sk_num(sk); j++)
278 {
279 c=(SSL_CIPHER *)sk_value(sk,j);
280 if (!(c->algorithms & SSL_EXP))
281 {
282 if ((c->id>>24L) == 2L)
283 ne2=1;
284 else
285 ne3=1;
286 }
287 }
288 if (ne2 && !ne3)
289 {
290 type=1;
291 use_sslv2_strong=1;
292 goto next_bit;
293 }
294 }
295 } 322 }
323 else if (!(s->options & SSL_OP_NO_SSLv2))
324 type=1;
325
296 } 326 }
297 } 327 }
298 else if ((p[0] == SSL3_RT_HANDSHAKE) && 328 else if ((p[0] == SSL3_RT_HANDSHAKE) &&
299 (p[1] == SSL3_VERSION_MAJOR) && 329 (p[1] == SSL3_VERSION_MAJOR) &&
300 (p[5] == SSL3_MT_CLIENT_HELLO)) 330 (p[5] == SSL3_MT_CLIENT_HELLO) &&
331 ((p[3] == 0 && p[4] < 5 /* silly record length? */)
332 || (p[9] == p[1])))
301 { 333 {
302 /* true SSLv3 or tls1 */ 334 /*
303 if (p[2] >= TLS1_VERSION_MINOR) 335 * SSLv3 or tls1 header
336 */
337
338 v[0]=p[1]; /* major version (= SSL3_VERSION_MAJOR) */
339 /* We must look at client_version inside the Client Hello message
340 * to get the correct minor version.
341 * However if we have only a pathologically small fragment of the
342 * Client Hello message, this would be difficult, and we'd have
343 * to read more records to find out.
344 * No known SSL 3.0 client fragments ClientHello like this,
345 * so we simply assume TLS 1.0 to avoid protocol version downgrade
346 * attacks. */
347 if (p[3] == 0 && p[4] < 6)
348 {
349#if 0
350 SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_RECORD_TOO_SMALL);
351 goto err;
352#else
353 v[1] = TLS1_VERSION_MINOR;
354#endif
355 }
356 else
357 v[1]=p[10]; /* minor version according to client_version */
358 if (v[1] >= TLS1_VERSION_MINOR)
304 { 359 {
305 if (!(s->options & SSL_OP_NO_TLSv1)) 360 if (!(s->options & SSL_OP_NO_TLSv1))
306 { 361 {
362 s->version=TLS1_VERSION;
307 type=3; 363 type=3;
308 tls1=1;
309 } 364 }
310 else if (!(s->options & SSL_OP_NO_SSLv3)) 365 else if (!(s->options & SSL_OP_NO_SSLv3))
366 {
367 s->version=SSL3_VERSION;
368 type=3;
369 }
370 }
371 else
372 {
373 /* client requests SSL 3.0 */
374 if (!(s->options & SSL_OP_NO_SSLv3))
375 {
376 s->version=SSL3_VERSION;
311 type=3; 377 type=3;
378 }
379 else if (!(s->options & SSL_OP_NO_TLSv1))
380 {
381 /* we won't be able to use TLS of course,
382 * but this will send an appropriate alert */
383 s->version=TLS1_VERSION;
384 type=3;
385 }
312 } 386 }
313 else if (!(s->options & SSL_OP_NO_SSLv3))
314 type=3;
315 } 387 }
316 else if ((strncmp("GET ", p,4) == 0) || 388 else if ((strncmp("GET ", (char *)p,4) == 0) ||
317 (strncmp("POST ",p,5) == 0) || 389 (strncmp("POST ",(char *)p,5) == 0) ||
318 (strncmp("HEAD ",p,5) == 0) || 390 (strncmp("HEAD ",(char *)p,5) == 0) ||
319 (strncmp("PUT ", p,4) == 0)) 391 (strncmp("PUT ", (char *)p,4) == 0))
320 { 392 {
321 SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_HTTP_REQUEST); 393 SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_HTTP_REQUEST);
322 goto err; 394 goto err;
323 } 395 }
324 else if (strncmp("CONNECT",p,7) == 0) 396 else if (strncmp("CONNECT",(char *)p,7) == 0)
325 { 397 {
326 SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_HTTPS_PROXY_REQUEST); 398 SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_HTTPS_PROXY_REQUEST);
327 goto err; 399 goto err;
328 } 400 }
329 } 401 }
330 402
331next_bit:
332 if (s->state == SSL23_ST_SR_CLNT_HELLO_B) 403 if (s->state == SSL23_ST_SR_CLNT_HELLO_B)
333 { 404 {
334 /* we have a SSLv3/TLSv1 in a SSLv2 header */ 405 /* we have SSLv3/TLSv1 in an SSLv2 header
406 * (other cases skip this state) */
407
335 type=2; 408 type=2;
336 p=s->packet; 409 p=s->packet;
410 v[0] = p[3]; /* == SSL3_VERSION_MAJOR */
411 v[1] = p[4];
412
337 n=((p[0]&0x7f)<<8)|p[1]; 413 n=((p[0]&0x7f)<<8)|p[1];
338 if (n > (1024*4)) 414 if (n > (1024*4))
339 { 415 {
@@ -344,7 +420,9 @@ next_bit:
344 j=ssl23_read_bytes(s,n+2); 420 j=ssl23_read_bytes(s,n+2);
345 if (j <= 0) return(j); 421 if (j <= 0) return(j);
346 422
347 ssl3_finish_mac(s,&(s->packet[2]),s->packet_length-2); 423 ssl3_finish_mac(s, s->packet+2, s->packet_length-2);
424 if (s->msg_callback)
425 s->msg_callback(0, SSL2_VERSION, 0, s->packet+2, s->packet_length-2, s, s->msg_callback_arg); /* CLIENT-HELLO */
348 426
349 p=s->packet; 427 p=s->packet;
350 p+=5; 428 p+=5;
@@ -358,14 +436,18 @@ next_bit:
358 goto err; 436 goto err;
359 } 437 }
360 438
361 *(d++)=SSL3_VERSION_MAJOR; 439 /* record header: msg_type ... */
362 if (tls1) 440 *(d++) = SSL3_MT_CLIENT_HELLO;
363 *(d++)=TLS1_VERSION_MINOR; 441 /* ... and length (actual value will be written later) */
364 else 442 d_len = d;
365 *(d++)=SSL3_VERSION_MINOR; 443 d += 3;
444
445 /* client_version */
446 *(d++) = SSL3_VERSION_MAJOR; /* == v[0] */
447 *(d++) = v[1];
366 448
367 /* lets populate the random area */ 449 /* lets populate the random area */
368 /* get the chalenge_length */ 450 /* get the challenge_length */
369 i=(cl > SSL3_RANDOM_SIZE)?SSL3_RANDOM_SIZE:cl; 451 i=(cl > SSL3_RANDOM_SIZE)?SSL3_RANDOM_SIZE:cl;
370 memset(d,0,SSL3_RANDOM_SIZE); 452 memset(d,0,SSL3_RANDOM_SIZE);
371 memcpy(&(d[SSL3_RANDOM_SIZE-i]),&(p[csl+sil]),i); 453 memcpy(&(d[SSL3_RANDOM_SIZE-i]),&(p[csl+sil]),i);
@@ -387,11 +469,12 @@ next_bit:
387 } 469 }
388 s2n(j,dd); 470 s2n(j,dd);
389 471
390 /* compression */ 472 /* COMPRESSION */
391 *(d++)=1; 473 *(d++)=1;
392 *(d++)=0; 474 *(d++)=0;
393 475
394 i=(d-(unsigned char *)s->init_buf->data); 476 i = (d-(unsigned char *)s->init_buf->data) - 4;
477 l2n3((long)i, d_len);
395 478
396 /* get the data reused from the init_buf */ 479 /* get the data reused from the init_buf */
397 s->s3->tmp.reuse_message=1; 480 s->s3->tmp.reuse_message=1;
@@ -399,8 +482,15 @@ next_bit:
399 s->s3->tmp.message_size=i; 482 s->s3->tmp.message_size=i;
400 } 483 }
401 484
485 /* imaginary new state (for program structure): */
486 /* s->state = SSL23_SR_CLNT_HELLO_C */
487
402 if (type == 1) 488 if (type == 1)
403 { 489 {
490#ifdef OPENSSL_NO_SSL2
491 SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_UNSUPPORTED_PROTOCOL);
492 goto err;
493#else
404 /* we are talking sslv2 */ 494 /* we are talking sslv2 */
405 /* we need to clean up the SSLv3/TLSv1 setup and put in the 495 /* we need to clean up the SSLv3/TLSv1 setup and put in the
406 * sslv2 stuff. */ 496 * sslv2 stuff. */
@@ -423,12 +513,15 @@ next_bit:
423 513
424 s->state=SSL2_ST_GET_CLIENT_HELLO_A; 514 s->state=SSL2_ST_GET_CLIENT_HELLO_A;
425 if ((s->options & SSL_OP_MSIE_SSLV2_RSA_PADDING) || 515 if ((s->options & SSL_OP_MSIE_SSLV2_RSA_PADDING) ||
426 use_sslv2_strong) 516 use_sslv2_strong ||
517 (s->options & SSL_OP_NO_TLSv1 && s->options & SSL_OP_NO_SSLv3))
427 s->s2->ssl2_rollback=0; 518 s->s2->ssl2_rollback=0;
428 else 519 else
520 /* reject SSL 2.0 session if client supports SSL 3.0 or TLS 1.0
521 * (SSL 3.0 draft/RFC 2246, App. E.2) */
429 s->s2->ssl2_rollback=1; 522 s->s2->ssl2_rollback=1;
430 523
431 /* setup the 5 bytes we have read so we get them from 524 /* setup the n bytes we have read so we get them from
432 * the sslv2 buffer */ 525 * the sslv2 buffer */
433 s->rstate=SSL_ST_READ_HEADER; 526 s->rstate=SSL_ST_READ_HEADER;
434 s->packet_length=n; 527 s->packet_length=n;
@@ -439,11 +532,12 @@ next_bit:
439 532
440 s->method=SSLv2_server_method(); 533 s->method=SSLv2_server_method();
441 s->handshake_func=s->method->ssl_accept; 534 s->handshake_func=s->method->ssl_accept;
535#endif
442 } 536 }
443 537
444 if ((type == 2) || (type == 3)) 538 if ((type == 2) || (type == 3))
445 { 539 {
446 /* we have SSLv3/TLSv1 */ 540 /* we have SSLv3/TLSv1 (type 2: SSL2 style, type 3: SSL3/TLS style) */
447 541
448 if (!ssl_init_wbio_buffer(s,1)) goto err; 542 if (!ssl_init_wbio_buffer(s,1)) goto err;
449 543
@@ -468,16 +562,13 @@ next_bit:
468 s->s3->rbuf.offset=0; 562 s->s3->rbuf.offset=0;
469 } 563 }
470 564
471 if (tls1) 565 if (s->version == TLS1_VERSION)
472 { 566 s->method = TLSv1_server_method();
473 s->version=TLS1_VERSION;
474 s->method=TLSv1_server_method();
475 }
476 else 567 else
477 { 568 s->method = SSLv3_server_method();
478 s->version=SSL3_VERSION; 569#if 0 /* ssl3_get_client_hello does this */
479 s->method=SSLv3_server_method(); 570 s->client_version=(v[0]<<8)|v[1];
480 } 571#endif
481 s->handshake_func=s->method->ssl_accept; 572 s->handshake_func=s->method->ssl_accept;
482 } 573 }
483 574
@@ -489,11 +580,10 @@ next_bit:
489 } 580 }
490 s->init_num=0; 581 s->init_num=0;
491 582
492 if (buf != buf_space) Free(buf); 583 if (buf != buf_space) OPENSSL_free(buf);
493 s->first_packet=1; 584 s->first_packet=1;
494 return(SSL_accept(s)); 585 return(SSL_accept(s));
495err: 586err:
496 if (buf != buf_space) Free(buf); 587 if (buf != buf_space) OPENSSL_free(buf);
497 return(-1); 588 return(-1);
498 } 589 }
499
diff --git a/src/lib/libssl/s3_both.c b/src/lib/libssl/s3_both.c
index 6de62e1591..58a24cd883 100644
--- a/src/lib/libssl/s3_both.c
+++ b/src/lib/libssl/s3_both.c
@@ -55,26 +55,95 @@
55 * copied and put under another distribution licence 55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.] 56 * [including the GNU Public Licence.]
57 */ 57 */
58/* ====================================================================
59 * Copyright (c) 1998-2002 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 */
58 111
112#include <limits.h>
113#include <string.h>
59#include <stdio.h> 114#include <stdio.h>
60#include "buffer.h" 115#include <openssl/buffer.h>
61#include "rand.h" 116#include <openssl/rand.h>
62#include "objects.h" 117#include <openssl/objects.h>
63#include "evp.h" 118#include <openssl/evp.h>
64#include "x509.h" 119#include <openssl/x509.h>
65#include "ssl_locl.h" 120#include "ssl_locl.h"
66 121
67#define BREAK break 122/* send s->init_buf in records of type 'type' (SSL3_RT_HANDSHAKE or SSL3_RT_CHANGE_CIPHER_SPEC) */
68 123int ssl3_do_write(SSL *s, int type)
69/* SSL3err(SSL_F_SSL3_GET_FINISHED,SSL_R_EXCESSIVE_MESSAGE_SIZE); 124 {
70 */ 125 int ret;
126
127 ret=ssl3_write_bytes(s,type,&s->init_buf->data[s->init_off],
128 s->init_num);
129 if (ret < 0) return(-1);
130 if (type == SSL3_RT_HANDSHAKE)
131 /* should not be done for 'Hello Request's, but in that case
132 * we'll ignore the result anyway */
133 ssl3_finish_mac(s,(unsigned char *)&s->init_buf->data[s->init_off],ret);
134
135 if (ret == s->init_num)
136 {
137 if (s->msg_callback)
138 s->msg_callback(1, s->version, type, s->init_buf->data, (size_t)(s->init_off + s->init_num), s, s->msg_callback_arg);
139 return(1);
140 }
141 s->init_off+=ret;
142 s->init_num-=ret;
143 return(0);
144 }
71 145
72int ssl3_send_finished(s,a,b,sender,slen) 146int ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen)
73SSL *s;
74int a;
75int b;
76unsigned char *sender;
77int slen;
78 { 147 {
79 unsigned char *p,*d; 148 unsigned char *p,*d;
80 int i; 149 int i;
@@ -88,10 +157,19 @@ int slen;
88 i=s->method->ssl3_enc->final_finish_mac(s, 157 i=s->method->ssl3_enc->final_finish_mac(s,
89 &(s->s3->finish_dgst1), 158 &(s->s3->finish_dgst1),
90 &(s->s3->finish_dgst2), 159 &(s->s3->finish_dgst2),
91 sender,slen,p); 160 sender,slen,s->s3->tmp.finish_md);
161 s->s3->tmp.finish_md_len = i;
162 memcpy(p, s->s3->tmp.finish_md, i);
92 p+=i; 163 p+=i;
93 l=i; 164 l=i;
94 165
166#ifdef OPENSSL_SYS_WIN16
167 /* MSVC 1.5 does not clear the top bytes of the word unless
168 * I do this.
169 */
170 l&=0xffff;
171#endif
172
95 *(d++)=SSL3_MT_FINISHED; 173 *(d++)=SSL3_MT_FINISHED;
96 l2n3(l,d); 174 l2n3(l,d);
97 s->init_num=(int)l+4; 175 s->init_num=(int)l+4;
@@ -104,17 +182,14 @@ int slen;
104 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE)); 182 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
105 } 183 }
106 184
107int ssl3_get_finished(s,a,b) 185int ssl3_get_finished(SSL *s, int a, int b)
108SSL *s;
109int a;
110int b;
111 { 186 {
112 int al,i,ok; 187 int al,i,ok;
113 long n; 188 long n;
114 unsigned char *p; 189 unsigned char *p;
115 190
116 /* the mac has already been generated when we received the 191 /* the mac has already been generated when we received the
117 * change cipher spec message and is in s->s3->tmp.in_dgst[12] 192 * change cipher spec message and is in s->s3->tmp.peer_finish_md
118 */ 193 */
119 194
120 n=ssl3_get_message(s, 195 n=ssl3_get_message(s,
@@ -126,7 +201,7 @@ int b;
126 201
127 if (!ok) return((int)n); 202 if (!ok) return((int)n);
128 203
129 /* If this occurs if we has missed a message */ 204 /* If this occurs, we have missed a message */
130 if (!s->s3->change_cipher_spec) 205 if (!s->s3->change_cipher_spec)
131 { 206 {
132 al=SSL_AD_UNEXPECTED_MESSAGE; 207 al=SSL_AD_UNEXPECTED_MESSAGE;
@@ -135,9 +210,8 @@ int b;
135 } 210 }
136 s->s3->change_cipher_spec=0; 211 s->s3->change_cipher_spec=0;
137 212
138 p=(unsigned char *)s->init_buf->data; 213 p = (unsigned char *)s->init_msg;
139 214 i = s->s3->tmp.peer_finish_md_len;
140 i=s->method->ssl3_enc->finish_mac_length;
141 215
142 if (i != n) 216 if (i != n)
143 { 217 {
@@ -146,7 +220,7 @@ int b;
146 goto f_err; 220 goto f_err;
147 } 221 }
148 222
149 if (memcmp( p, (char *)&(s->s3->tmp.finish_md[0]),i) != 0) 223 if (memcmp(p, s->s3->tmp.peer_finish_md, i) != 0)
150 { 224 {
151 al=SSL_AD_DECRYPT_ERROR; 225 al=SSL_AD_DECRYPT_ERROR;
152 SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_DIGEST_CHECK_FAILED); 226 SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_DIGEST_CHECK_FAILED);
@@ -167,9 +241,7 @@ f_err:
167 * ssl->session->read_compression assign 241 * ssl->session->read_compression assign
168 * ssl->session->read_hash assign 242 * ssl->session->read_hash assign
169 */ 243 */
170int ssl3_send_change_cipher_spec(s,a,b) 244int ssl3_send_change_cipher_spec(SSL *s, int a, int b)
171SSL *s;
172int a,b;
173 { 245 {
174 unsigned char *p; 246 unsigned char *p;
175 247
@@ -187,9 +259,7 @@ int a,b;
187 return(ssl3_do_write(s,SSL3_RT_CHANGE_CIPHER_SPEC)); 259 return(ssl3_do_write(s,SSL3_RT_CHANGE_CIPHER_SPEC));
188 } 260 }
189 261
190unsigned long ssl3_output_cert_chain(s,x) 262unsigned long ssl3_output_cert_chain(SSL *s, X509 *x)
191SSL *s;
192X509 *x;
193 { 263 {
194 unsigned char *p; 264 unsigned char *p;
195 int n,i; 265 int n,i;
@@ -207,7 +277,11 @@ X509 *x;
207 } 277 }
208 if (x != NULL) 278 if (x != NULL)
209 { 279 {
210 X509_STORE_CTX_init(&xs_ctx,s->ctx->cert_store,NULL,NULL); 280 if(!X509_STORE_CTX_init(&xs_ctx,s->ctx->cert_store,NULL,NULL))
281 {
282 SSLerr(SSL_F_SSL3_OUTPUT_CERT_CHAIN,ERR_R_X509_LIB);
283 return(0);
284 }
211 285
212 for (;;) 286 for (;;)
213 { 287 {
@@ -236,6 +310,23 @@ X509 *x;
236 X509_STORE_CTX_cleanup(&xs_ctx); 310 X509_STORE_CTX_cleanup(&xs_ctx);
237 } 311 }
238 312
313 /* Thawte special :-) */
314 if (s->ctx->extra_certs != NULL)
315 for (i=0; i<sk_X509_num(s->ctx->extra_certs); i++)
316 {
317 x=sk_X509_value(s->ctx->extra_certs,i);
318 n=i2d_X509(x,NULL);
319 if (!BUF_MEM_grow(buf,(int)(n+l+3)))
320 {
321 SSLerr(SSL_F_SSL3_OUTPUT_CERT_CHAIN,ERR_R_BUF_LIB);
322 return(0);
323 }
324 p=(unsigned char *)&(buf->data[l]);
325 l2n3(n,p);
326 i2d_X509(x,&p);
327 l+=n+3;
328 }
329
239 l-=7; 330 l-=7;
240 p=(unsigned char *)&(buf->data[4]); 331 p=(unsigned char *)&(buf->data[4]);
241 l2n3(l,p); 332 l2n3(l,p);
@@ -247,11 +338,12 @@ X509 *x;
247 return(l); 338 return(l);
248 } 339 }
249 340
250long ssl3_get_message(s,st1,stn,mt,max,ok) 341/* Obtain handshake message of message type 'mt' (any if mt == -1),
251SSL *s; 342 * maximum acceptable body length 'max'.
252int st1,stn,mt; 343 * The first four bytes (msg_type and length) are read in state 'st1',
253long max; 344 * the body is read in state 'stn'.
254int *ok; 345 */
346long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok)
255 { 347 {
256 unsigned char *p; 348 unsigned char *p;
257 unsigned long l; 349 unsigned long l;
@@ -268,21 +360,51 @@ int *ok;
268 goto f_err; 360 goto f_err;
269 } 361 }
270 *ok=1; 362 *ok=1;
271 return((int)s->s3->tmp.message_size); 363 s->init_msg = s->init_buf->data + 4;
364 s->init_num = (int)s->s3->tmp.message_size;
365 return s->init_num;
272 } 366 }
273 367
274 p=(unsigned char *)s->init_buf->data; 368 p=(unsigned char *)s->init_buf->data;
275 369
276 if (s->state == st1) 370 if (s->state == st1) /* s->init_num < 4 */
277 { 371 {
278 i=ssl3_read_bytes(s,SSL3_RT_HANDSHAKE, 372 int skip_message;
279 (char *)&(p[s->init_num]), 373
280 4-s->init_num); 374 do
281 if (i < (4-s->init_num))
282 { 375 {
283 *ok=0; 376 while (s->init_num < 4)
284 return(ssl3_part_read(s,i)); 377 {
378 i=ssl3_read_bytes(s,SSL3_RT_HANDSHAKE,&p[s->init_num],
379 4 - s->init_num, 0);
380 if (i <= 0)
381 {
382 s->rwstate=SSL_READING;
383 *ok = 0;
384 return i;
385 }
386 s->init_num+=i;
387 }
388
389 skip_message = 0;
390 if (!s->server)
391 if (p[0] == SSL3_MT_HELLO_REQUEST)
392 /* The server may always send 'Hello Request' messages --
393 * we are doing a handshake anyway now, so ignore them
394 * if their format is correct. Does not count for
395 * 'Finished' MAC. */
396 if (p[1] == 0 && p[2] == 0 &&p[3] == 0)
397 {
398 s->init_num = 0;
399 skip_message = 1;
400
401 if (s->msg_callback)
402 s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, p, 4, s, s->msg_callback_arg);
403 }
285 } 404 }
405 while (skip_message);
406
407 /* s->init_num == 4 */
286 408
287 if ((mt >= 0) && (*p != mt)) 409 if ((mt >= 0) && (*p != mt))
288 { 410 {
@@ -290,6 +412,18 @@ int *ok;
290 SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_UNEXPECTED_MESSAGE); 412 SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_UNEXPECTED_MESSAGE);
291 goto f_err; 413 goto f_err;
292 } 414 }
415 if ((mt < 0) && (*p == SSL3_MT_CLIENT_HELLO) &&
416 (st1 == SSL3_ST_SR_CERT_A) &&
417 (stn == SSL3_ST_SR_CERT_B))
418 {
419 /* At this point we have got an MS SGC second client
420 * hello (maybe we should always allow the client to
421 * start a new handshake?). We need to restart the mac.
422 * Don't increment {num,total}_renegotiations because
423 * we have not completed the handshake. */
424 ssl3_init_finished_mac(s);
425 }
426
293 s->s3->tmp.message_type= *(p++); 427 s->s3->tmp.message_type= *(p++);
294 428
295 n2l3(p,l); 429 n2l3(p,l);
@@ -299,7 +433,13 @@ int *ok;
299 SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_EXCESSIVE_MESSAGE_SIZE); 433 SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_EXCESSIVE_MESSAGE_SIZE);
300 goto f_err; 434 goto f_err;
301 } 435 }
302 if (l && !BUF_MEM_grow(s->init_buf,(int)l)) 436 if (l > (INT_MAX-4)) /* BUF_MEM_grow takes an 'int' parameter */
437 {
438 al=SSL_AD_ILLEGAL_PARAMETER;
439 SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_EXCESSIVE_MESSAGE_SIZE);
440 goto f_err;
441 }
442 if (l && !BUF_MEM_grow(s->init_buf,(int)l+4))
303 { 443 {
304 SSLerr(SSL_F_SSL3_GET_MESSAGE,ERR_R_BUF_LIB); 444 SSLerr(SSL_F_SSL3_GET_MESSAGE,ERR_R_BUF_LIB);
305 goto err; 445 goto err;
@@ -307,24 +447,30 @@ int *ok;
307 s->s3->tmp.message_size=l; 447 s->s3->tmp.message_size=l;
308 s->state=stn; 448 s->state=stn;
309 449
310 s->init_num=0; 450 s->init_msg = s->init_buf->data + 4;
451 s->init_num = 0;
311 } 452 }
312 453
313 /* next state (stn) */ 454 /* next state (stn) */
314 p=(unsigned char *)s->init_buf->data; 455 p = s->init_msg;
315 n=s->s3->tmp.message_size; 456 n = s->s3->tmp.message_size - s->init_num;
316 if (n > 0) 457 while (n > 0)
317 { 458 {
318 i=ssl3_read_bytes(s,SSL3_RT_HANDSHAKE, 459 i=ssl3_read_bytes(s,SSL3_RT_HANDSHAKE,&p[s->init_num],n,0);
319 (char *)&(p[s->init_num]),(int)n); 460 if (i <= 0)
320 if (i != (int)n)
321 { 461 {
322 *ok=0; 462 s->rwstate=SSL_READING;
323 return(ssl3_part_read(s,i)); 463 *ok = 0;
464 return i;
324 } 465 }
466 s->init_num += i;
467 n -= i;
325 } 468 }
469 ssl3_finish_mac(s, (unsigned char *)s->init_buf->data, s->init_num + 4);
470 if (s->msg_callback)
471 s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, s->init_buf->data, (size_t)s->init_num + 4, s, s->msg_callback_arg);
326 *ok=1; 472 *ok=1;
327 return(n); 473 return s->init_num;
328f_err: 474f_err:
329 ssl3_send_alert(s,SSL3_AL_FATAL,al); 475 ssl3_send_alert(s,SSL3_AL_FATAL,al);
330err: 476err:
@@ -332,9 +478,7 @@ err:
332 return(-1); 478 return(-1);
333 } 479 }
334 480
335int ssl_cert_type(x,pkey) 481int ssl_cert_type(X509 *x, EVP_PKEY *pkey)
336X509 *x;
337EVP_PKEY *pkey;
338 { 482 {
339 EVP_PKEY *pk; 483 EVP_PKEY *pk;
340 int ret= -1,i,j; 484 int ret= -1,i,j;
@@ -380,11 +524,11 @@ EVP_PKEY *pkey;
380 ret= -1; 524 ret= -1;
381 525
382err: 526err:
527 if(!pkey) EVP_PKEY_free(pk);
383 return(ret); 528 return(ret);
384 } 529 }
385 530
386int ssl_verify_alarm_type(type) 531int ssl_verify_alarm_type(long type)
387long type;
388 { 532 {
389 int al; 533 int al;
390 534
@@ -392,6 +536,7 @@ long type;
392 { 536 {
393 case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT: 537 case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
394 case X509_V_ERR_UNABLE_TO_GET_CRL: 538 case X509_V_ERR_UNABLE_TO_GET_CRL:
539 case X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER:
395 al=SSL_AD_UNKNOWN_CA; 540 al=SSL_AD_UNKNOWN_CA;
396 break; 541 break;
397 case X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE: 542 case X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE:
@@ -403,6 +548,8 @@ long type;
403 case X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD: 548 case X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD:
404 case X509_V_ERR_CERT_NOT_YET_VALID: 549 case X509_V_ERR_CERT_NOT_YET_VALID:
405 case X509_V_ERR_CRL_NOT_YET_VALID: 550 case X509_V_ERR_CRL_NOT_YET_VALID:
551 case X509_V_ERR_CERT_UNTRUSTED:
552 case X509_V_ERR_CERT_REJECTED:
406 al=SSL_AD_BAD_CERTIFICATE; 553 al=SSL_AD_BAD_CERTIFICATE;
407 break; 554 break;
408 case X509_V_ERR_CERT_SIGNATURE_FAILURE: 555 case X509_V_ERR_CERT_SIGNATURE_FAILURE:
@@ -424,11 +571,16 @@ long type;
424 case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY: 571 case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
425 case X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE: 572 case X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE:
426 case X509_V_ERR_CERT_CHAIN_TOO_LONG: 573 case X509_V_ERR_CERT_CHAIN_TOO_LONG:
574 case X509_V_ERR_PATH_LENGTH_EXCEEDED:
575 case X509_V_ERR_INVALID_CA:
427 al=SSL_AD_UNKNOWN_CA; 576 al=SSL_AD_UNKNOWN_CA;
428 break; 577 break;
429 case X509_V_ERR_APPLICATION_VERIFICATION: 578 case X509_V_ERR_APPLICATION_VERIFICATION:
430 al=SSL_AD_HANDSHAKE_FAILURE; 579 al=SSL_AD_HANDSHAKE_FAILURE;
431 break; 580 break;
581 case X509_V_ERR_INVALID_PURPOSE:
582 al=SSL_AD_UNSUPPORTED_CERTIFICATE;
583 break;
432 default: 584 default:
433 al=SSL_AD_CERTIFICATE_UNKNOWN; 585 al=SSL_AD_CERTIFICATE_UNKNOWN;
434 break; 586 break;
@@ -436,11 +588,11 @@ long type;
436 return(al); 588 return(al);
437 } 589 }
438 590
439int ssl3_setup_buffers(s) 591int ssl3_setup_buffers(SSL *s)
440SSL *s;
441 { 592 {
442 unsigned char *p; 593 unsigned char *p;
443 unsigned int extra; 594 unsigned int extra;
595 size_t len;
444 596
445 if (s->s3->rbuf.buf == NULL) 597 if (s->s3->rbuf.buf == NULL)
446 { 598 {
@@ -448,18 +600,21 @@ SSL *s;
448 extra=SSL3_RT_MAX_EXTRA; 600 extra=SSL3_RT_MAX_EXTRA;
449 else 601 else
450 extra=0; 602 extra=0;
451 if ((p=(unsigned char *)Malloc(SSL3_RT_MAX_PACKET_SIZE+extra)) 603 len = SSL3_RT_MAX_PACKET_SIZE + extra;
452 == NULL) 604 if ((p=OPENSSL_malloc(len)) == NULL)
453 goto err; 605 goto err;
454 s->s3->rbuf.buf=p; 606 s->s3->rbuf.buf = p;
607 s->s3->rbuf.len = len;
455 } 608 }
456 609
457 if (s->s3->wbuf.buf == NULL) 610 if (s->s3->wbuf.buf == NULL)
458 { 611 {
459 if ((p=(unsigned char *)Malloc(SSL3_RT_MAX_PACKET_SIZE)) 612 len = SSL3_RT_MAX_PACKET_SIZE;
460 == NULL) 613 len += SSL3_RT_HEADER_LENGTH + 256; /* extra space for empty fragment */
614 if ((p=OPENSSL_malloc(len)) == NULL)
461 goto err; 615 goto err;
462 s->s3->wbuf.buf=p; 616 s->s3->wbuf.buf = p;
617 s->s3->wbuf.len = len;
463 } 618 }
464 s->packet= &(s->s3->rbuf.buf[0]); 619 s->packet= &(s->s3->rbuf.buf[0]);
465 return(1); 620 return(1);
diff --git a/src/lib/libssl/s3_clnt.c b/src/lib/libssl/s3_clnt.c
index 940c6a458f..e5853ede95 100644
--- a/src/lib/libssl/s3_clnt.c
+++ b/src/lib/libssl/s3_clnt.c
@@ -55,29 +55,74 @@
55 * copied and put under another distribution licence 55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.] 56 * [including the GNU Public Licence.]
57 */ 57 */
58/* ====================================================================
59 * Copyright (c) 1998-2002 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 */
58 111
59#include <stdio.h> 112#include <stdio.h>
60#include "buffer.h" 113#include <openssl/buffer.h>
61#include "rand.h" 114#include <openssl/rand.h>
62#include "objects.h" 115#include <openssl/objects.h>
63#include "evp.h" 116#include <openssl/evp.h>
64#include "ssl_locl.h" 117#include "ssl_locl.h"
118#include "kssl_lcl.h"
119#include <openssl/md5.h>
65 120
66#define BREAK break 121static SSL_METHOD *ssl3_get_client_method(int ver);
67/* SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,ERR_R_MALLOC_FAILURE);
68 * SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,ERR_R_MALLOC_FAILURE);
69 * SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,ERR_R_MALLOC_FAILURE);
70 * SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
71 * SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,ERR_R_MALLOC_FAILURE);
72 * SSLerr(SSL_F_SSL3_GET_SERVER_DONE,ERR_R_MALLOC_FAILURE);
73SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_SSL3_SESSION_ID_TOO_SHORT);
74 */
75
76#ifndef NOPROTO
77static int ssl3_client_hello(SSL *s); 122static int ssl3_client_hello(SSL *s);
78static int ssl3_get_server_hello(SSL *s); 123static int ssl3_get_server_hello(SSL *s);
79static int ssl3_get_certificate_request(SSL *s); 124static int ssl3_get_certificate_request(SSL *s);
80static int ca_dn_cmp(X509_NAME **a,X509_NAME **b); 125static int ca_dn_cmp(const X509_NAME * const *a,const X509_NAME * const *b);
81static int ssl3_get_server_done(SSL *s); 126static int ssl3_get_server_done(SSL *s);
82static int ssl3_send_client_verify(SSL *s); 127static int ssl3_send_client_verify(SSL *s);
83static int ssl3_send_client_certificate(SSL *s); 128static int ssl3_send_client_certificate(SSL *s);
@@ -85,22 +130,7 @@ static int ssl3_send_client_key_exchange(SSL *s);
85static int ssl3_get_key_exchange(SSL *s); 130static int ssl3_get_key_exchange(SSL *s);
86static int ssl3_get_server_certificate(SSL *s); 131static int ssl3_get_server_certificate(SSL *s);
87static int ssl3_check_cert_and_algorithm(SSL *s); 132static int ssl3_check_cert_and_algorithm(SSL *s);
88#else 133static SSL_METHOD *ssl3_get_client_method(int ver)
89static int ssl3_client_hello();
90static int ssl3_get_server_hello();
91static int ssl3_get_certificate_request();
92static int ca_dn_cmp();
93static int ssl3_get_server_done();
94static int ssl3_send_client_verify();
95static int ssl3_send_client_certificate();
96static int ssl3_send_client_key_exchange();
97static int ssl3_get_key_exchange();
98static int ssl3_get_server_certificate();
99static int ssl3_check_cert_and_algorithm();
100#endif
101
102static SSL_METHOD *ssl3_get_client_method(ver)
103int ver;
104 { 134 {
105 if (ver == SSL3_VERSION) 135 if (ver == SSL3_VERSION)
106 return(SSLv3_client_method()); 136 return(SSLv3_client_method());
@@ -108,7 +138,7 @@ int ver;
108 return(NULL); 138 return(NULL);
109 } 139 }
110 140
111SSL_METHOD *SSLv3_client_method() 141SSL_METHOD *SSLv3_client_method(void)
112 { 142 {
113 static int init=1; 143 static int init=1;
114 static SSL_METHOD SSLv3_client_data; 144 static SSL_METHOD SSLv3_client_data;
@@ -124,18 +154,16 @@ SSL_METHOD *SSLv3_client_method()
124 return(&SSLv3_client_data); 154 return(&SSLv3_client_data);
125 } 155 }
126 156
127int ssl3_connect(s) 157int ssl3_connect(SSL *s)
128SSL *s;
129 { 158 {
130 BUF_MEM *buf; 159 BUF_MEM *buf;
131 unsigned long Time=time(NULL),l; 160 unsigned long Time=time(NULL),l;
132 long num1; 161 long num1;
133 void (*cb)()=NULL; 162 void (*cb)(const SSL *ssl,int type,int val)=NULL;
134 int ret= -1; 163 int ret= -1;
135 BIO *under;
136 int new_state,state,skip=0;; 164 int new_state,state,skip=0;;
137 165
138 RAND_seed((unsigned char *)&Time,sizeof(Time)); 166 RAND_add(&Time,sizeof(Time),0);
139 ERR_clear_error(); 167 ERR_clear_error();
140 clear_sys_error(); 168 clear_sys_error();
141 169
@@ -144,8 +172,8 @@ SSL *s;
144 else if (s->ctx->info_callback != NULL) 172 else if (s->ctx->info_callback != NULL)
145 cb=s->ctx->info_callback; 173 cb=s->ctx->info_callback;
146 174
147 if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
148 s->in_handshake++; 175 s->in_handshake++;
176 if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
149 177
150 for (;;) 178 for (;;)
151 { 179 {
@@ -156,17 +184,23 @@ SSL *s;
156 case SSL_ST_RENEGOTIATE: 184 case SSL_ST_RENEGOTIATE:
157 s->new_session=1; 185 s->new_session=1;
158 s->state=SSL_ST_CONNECT; 186 s->state=SSL_ST_CONNECT;
159 s->ctx->sess_connect_renegotiate++; 187 s->ctx->stats.sess_connect_renegotiate++;
160 /* break */ 188 /* break */
161 case SSL_ST_BEFORE: 189 case SSL_ST_BEFORE:
162 case SSL_ST_CONNECT: 190 case SSL_ST_CONNECT:
163 case SSL_ST_BEFORE|SSL_ST_CONNECT: 191 case SSL_ST_BEFORE|SSL_ST_CONNECT:
164 case SSL_ST_OK|SSL_ST_CONNECT: 192 case SSL_ST_OK|SSL_ST_CONNECT:
165 193
194 s->server=0;
166 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1); 195 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
167 196
168 if ((s->version & 0xff00 ) != 0x0300) 197 if ((s->version & 0xff00 ) != 0x0300)
169 abort(); 198 {
199 SSLerr(SSL_F_SSL3_CONNECT, ERR_R_INTERNAL_ERROR);
200 ret = -1;
201 goto end;
202 }
203
170 /* s->version=SSL3_VERSION; */ 204 /* s->version=SSL3_VERSION; */
171 s->type=SSL_ST_CONNECT; 205 s->type=SSL_ST_CONNECT;
172 206
@@ -195,7 +229,7 @@ SSL *s;
195 ssl3_init_finished_mac(s); 229 ssl3_init_finished_mac(s);
196 230
197 s->state=SSL3_ST_CW_CLNT_HELLO_A; 231 s->state=SSL3_ST_CW_CLNT_HELLO_A;
198 s->ctx->sess_connect++; 232 s->ctx->stats.sess_connect++;
199 s->init_num=0; 233 s->init_num=0;
200 break; 234 break;
201 235
@@ -278,6 +312,7 @@ SSL *s;
278 case SSL3_ST_CW_CERT_A: 312 case SSL3_ST_CW_CERT_A:
279 case SSL3_ST_CW_CERT_B: 313 case SSL3_ST_CW_CERT_B:
280 case SSL3_ST_CW_CERT_C: 314 case SSL3_ST_CW_CERT_C:
315 case SSL3_ST_CW_CERT_D:
281 ret=ssl3_send_client_certificate(s); 316 ret=ssl3_send_client_certificate(s);
282 if (ret <= 0) goto end; 317 if (ret <= 0) goto end;
283 s->state=SSL3_ST_CW_KEY_EXCH_A; 318 s->state=SSL3_ST_CW_KEY_EXCH_A;
@@ -324,6 +359,11 @@ SSL *s;
324 s->init_num=0; 359 s->init_num=0;
325 360
326 s->session->cipher=s->s3->tmp.new_cipher; 361 s->session->cipher=s->s3->tmp.new_cipher;
362 if (s->s3->tmp.new_compression == NULL)
363 s->session->compress_meth=0;
364 else
365 s->session->compress_meth=
366 s->s3->tmp.new_compression->id;
327 if (!s->method->ssl3_enc->setup_key_block(s)) 367 if (!s->method->ssl3_enc->setup_key_block(s))
328 { 368 {
329 ret= -1; 369 ret= -1;
@@ -343,8 +383,8 @@ SSL *s;
343 case SSL3_ST_CW_FINISHED_B: 383 case SSL3_ST_CW_FINISHED_B:
344 ret=ssl3_send_finished(s, 384 ret=ssl3_send_finished(s,
345 SSL3_ST_CW_FINISHED_A,SSL3_ST_CW_FINISHED_B, 385 SSL3_ST_CW_FINISHED_A,SSL3_ST_CW_FINISHED_B,
346 s->method->ssl3_enc->client_finished, 386 s->method->ssl3_enc->client_finished_label,
347 s->method->ssl3_enc->client_finished_len); 387 s->method->ssl3_enc->client_finished_label_len);
348 if (ret <= 0) goto end; 388 if (ret <= 0) goto end;
349 s->state=SSL3_ST_CW_FLUSH; 389 s->state=SSL3_ST_CW_FLUSH;
350 390
@@ -399,38 +439,33 @@ SSL *s;
399 /* clean a few things up */ 439 /* clean a few things up */
400 ssl3_cleanup_key_block(s); 440 ssl3_cleanup_key_block(s);
401 441
402 BUF_MEM_free(s->init_buf); 442 if (s->init_buf != NULL)
403 s->init_buf=NULL;
404
405 if (!(s->s3->flags & SSL3_FLAGS_POP_BUFFER))
406 { 443 {
407 /* remove buffering */ 444 BUF_MEM_free(s->init_buf);
408 under=BIO_pop(s->wbio); 445 s->init_buf=NULL;
409 if (under != NULL)
410 s->wbio=under;
411 else
412 abort(); /* ok */
413
414 BIO_free(s->bbio);
415 s->bbio=NULL;
416 } 446 }
417 /* else do it later */ 447
448 /* If we are not 'joining' the last two packets,
449 * remove the buffering now */
450 if (!(s->s3->flags & SSL3_FLAGS_POP_BUFFER))
451 ssl_free_wbio_buffer(s);
452 /* else do it later in ssl3_write */
418 453
419 s->init_num=0; 454 s->init_num=0;
420 s->new_session=0; 455 s->new_session=0;
421 456
422 ssl_update_cache(s,SSL_SESS_CACHE_CLIENT); 457 ssl_update_cache(s,SSL_SESS_CACHE_CLIENT);
423 if (s->hit) s->ctx->sess_hit++; 458 if (s->hit) s->ctx->stats.sess_hit++;
424 459
425 ret=1; 460 ret=1;
426 /* s->server=0; */ 461 /* s->server=0; */
427 s->handshake_func=ssl3_connect; 462 s->handshake_func=ssl3_connect;
428 s->ctx->sess_connect_good++; 463 s->ctx->stats.sess_connect_good++;
429 464
430 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1); 465 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
431 466
432 goto end; 467 goto end;
433 break; 468 /* break; */
434 469
435 default: 470 default:
436 SSLerr(SSL_F_SSL3_CONNECT,SSL_R_UNKNOWN_STATE); 471 SSLerr(SSL_F_SSL3_CONNECT,SSL_R_UNKNOWN_STATE);
@@ -459,26 +494,27 @@ SSL *s;
459 skip=0; 494 skip=0;
460 } 495 }
461end: 496end:
497 s->in_handshake--;
462 if (cb != NULL) 498 if (cb != NULL)
463 cb(s,SSL_CB_CONNECT_EXIT,ret); 499 cb(s,SSL_CB_CONNECT_EXIT,ret);
464 s->in_handshake--;
465 return(ret); 500 return(ret);
466 } 501 }
467 502
468 503
469static int ssl3_client_hello(s) 504static int ssl3_client_hello(SSL *s)
470SSL *s;
471 { 505 {
472 unsigned char *buf; 506 unsigned char *buf;
473 unsigned char *p,*d; 507 unsigned char *p,*d;
474 int i; 508 int i,j;
475 unsigned long Time,l; 509 unsigned long Time,l;
510 SSL_COMP *comp;
476 511
477 buf=(unsigned char *)s->init_buf->data; 512 buf=(unsigned char *)s->init_buf->data;
478 if (s->state == SSL3_ST_CW_CLNT_HELLO_A) 513 if (s->state == SSL3_ST_CW_CLNT_HELLO_A)
479 { 514 {
480 if ((s->session == NULL) || 515 if ((s->session == NULL) ||
481 (s->session->ssl_version != s->version)) 516 (s->session->ssl_version != s->version) ||
517 (s->session->not_resumable))
482 { 518 {
483 if (!ssl_get_new_session(s,0)) 519 if (!ssl_get_new_session(s,0))
484 goto err; 520 goto err;
@@ -488,13 +524,14 @@ SSL *s;
488 p=s->s3->client_random; 524 p=s->s3->client_random;
489 Time=time(NULL); /* Time */ 525 Time=time(NULL); /* Time */
490 l2n(Time,p); 526 l2n(Time,p);
491 RAND_bytes(&(p[4]),SSL3_RANDOM_SIZE-sizeof(Time)); 527 RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE-sizeof(Time));
492 528
493 /* Do the message type and length last */ 529 /* Do the message type and length last */
494 d=p= &(buf[4]); 530 d=p= &(buf[4]);
495 531
496 *(p++)=s->version>>8; 532 *(p++)=s->version>>8;
497 *(p++)=s->version&0xff; 533 *(p++)=s->version&0xff;
534 s->client_version=s->version;
498 535
499 /* Random stuff */ 536 /* Random stuff */
500 memcpy(p,s->s3->client_random,SSL3_RANDOM_SIZE); 537 memcpy(p,s->s3->client_random,SSL3_RANDOM_SIZE);
@@ -522,9 +559,18 @@ SSL *s;
522 s2n(i,p); 559 s2n(i,p);
523 p+=i; 560 p+=i;
524 561
525 /* hardwire in the NULL compression algorithm. */ 562 /* COMPRESSION */
526 *(p++)=1; 563 if (s->ctx->comp_methods == NULL)
527 *(p++)=0; 564 j=0;
565 else
566 j=sk_SSL_COMP_num(s->ctx->comp_methods);
567 *(p++)=1+j;
568 for (i=0; i<j; i++)
569 {
570 comp=sk_SSL_COMP_value(s->ctx->comp_methods,i);
571 *(p++)=comp->id;
572 }
573 *(p++)=0; /* Add the NULL method */
528 574
529 l=(p-d); 575 l=(p-d);
530 d=buf; 576 d=buf;
@@ -543,15 +589,15 @@ err:
543 return(-1); 589 return(-1);
544 } 590 }
545 591
546static int ssl3_get_server_hello(s) 592static int ssl3_get_server_hello(SSL *s)
547SSL *s;
548 { 593 {
549 STACK *sk; 594 STACK_OF(SSL_CIPHER) *sk;
550 SSL_CIPHER *c; 595 SSL_CIPHER *c;
551 unsigned char *p,*d; 596 unsigned char *p,*d;
552 int i,al,ok; 597 int i,al,ok;
553 unsigned int j; 598 unsigned int j;
554 long n; 599 long n;
600 SSL_COMP *comp;
555 601
556 n=ssl3_get_message(s, 602 n=ssl3_get_message(s,
557 SSL3_ST_CR_SRVR_HELLO_A, 603 SSL3_ST_CR_SRVR_HELLO_A,
@@ -561,7 +607,7 @@ SSL *s;
561 &ok); 607 &ok);
562 608
563 if (!ok) return((int)n); 609 if (!ok) return((int)n);
564 d=p=(unsigned char *)s->init_buf->data; 610 d=p=(unsigned char *)s->init_msg;
565 611
566 if ((p[0] != (s->version>>8)) || (p[1] != (s->version&0xff))) 612 if ((p[0] != (s->version>>8)) || (p[1] != (s->version&0xff)))
567 { 613 {
@@ -590,9 +636,18 @@ SSL *s;
590 goto f_err; 636 goto f_err;
591 } 637 }
592 } 638 }
593 if ((j != 0) && (j == s->session->session_id_length) && 639 if (j != 0 && j == s->session->session_id_length
594 (memcmp(p,s->session->session_id,j) == 0)) 640 && memcmp(p,s->session->session_id,j) == 0)
595 s->hit=1; 641 {
642 if(s->sid_ctx_length != s->session->sid_ctx_length
643 || memcmp(s->session->sid_ctx,s->sid_ctx,s->sid_ctx_length))
644 {
645 al=SSL_AD_ILLEGAL_PARAMETER;
646 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT);
647 goto f_err;
648 }
649 s->hit=1;
650 }
596 else /* a miss or crap from the other end */ 651 else /* a miss or crap from the other end */
597 { 652 {
598 /* If we were trying for session-id reuse, make a new 653 /* If we were trying for session-id reuse, make a new
@@ -621,7 +676,7 @@ SSL *s;
621 p+=ssl_put_cipher_by_char(s,NULL,NULL); 676 p+=ssl_put_cipher_by_char(s,NULL,NULL);
622 677
623 sk=ssl_get_ciphers_by_id(s); 678 sk=ssl_get_ciphers_by_id(s);
624 i=sk_find(sk,(char *)c); 679 i=sk_SSL_CIPHER_find(sk,c);
625 if (i < 0) 680 if (i < 0)
626 { 681 {
627 /* we did not say we would use this cipher */ 682 /* we did not say we would use this cipher */
@@ -643,13 +698,23 @@ SSL *s;
643 s->s3->tmp.new_cipher=c; 698 s->s3->tmp.new_cipher=c;
644 699
645 /* lets get the compression algorithm */ 700 /* lets get the compression algorithm */
701 /* COMPRESSION */
646 j= *(p++); 702 j= *(p++);
647 if (j != 0) 703 if (j == 0)
704 comp=NULL;
705 else
706 comp=ssl3_comp_find(s->ctx->comp_methods,j);
707
708 if ((j != 0) && (comp == NULL))
648 { 709 {
649 al=SSL_AD_ILLEGAL_PARAMETER; 710 al=SSL_AD_ILLEGAL_PARAMETER;
650 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM); 711 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM);
651 goto f_err; 712 goto f_err;
652 } 713 }
714 else
715 {
716 s->s3->tmp.new_compression=comp;
717 }
653 718
654 if (p != (d+n)) 719 if (p != (d+n))
655 { 720 {
@@ -666,26 +731,22 @@ err:
666 return(-1); 731 return(-1);
667 } 732 }
668 733
669static int ssl3_get_server_certificate(s) 734static int ssl3_get_server_certificate(SSL *s)
670SSL *s;
671 { 735 {
672 int al,i,ok,ret= -1; 736 int al,i,ok,ret= -1;
673 unsigned long n,nc,llen,l; 737 unsigned long n,nc,llen,l;
674 X509 *x=NULL; 738 X509 *x=NULL;
675 unsigned char *p,*d,*q; 739 unsigned char *p,*d,*q;
676 STACK *sk=NULL; 740 STACK_OF(X509) *sk=NULL;
677 CERT *c; 741 SESS_CERT *sc;
678 EVP_PKEY *pkey=NULL; 742 EVP_PKEY *pkey=NULL;
743 int need_cert = 1; /* VRS: 0=> will allow null cert if auth == KRB5 */
679 744
680 n=ssl3_get_message(s, 745 n=ssl3_get_message(s,
681 SSL3_ST_CR_CERT_A, 746 SSL3_ST_CR_CERT_A,
682 SSL3_ST_CR_CERT_B, 747 SSL3_ST_CR_CERT_B,
683 -1, 748 -1,
684#if defined(MSDOS) && !defined(WIN32) 749 s->max_cert_list,
685 1024*30, /* 30k max cert list :-) */
686#else
687 1024*100, /* 100k max cert list :-) */
688#endif
689 &ok); 750 &ok);
690 751
691 if (!ok) return((int)n); 752 if (!ok) return((int)n);
@@ -702,9 +763,9 @@ SSL *s;
702 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_BAD_MESSAGE_TYPE); 763 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_BAD_MESSAGE_TYPE);
703 goto f_err; 764 goto f_err;
704 } 765 }
705 d=p=(unsigned char *)s->init_buf->data; 766 d=p=(unsigned char *)s->init_msg;
706 767
707 if ((sk=sk_new_null()) == NULL) 768 if ((sk=sk_X509_new_null()) == NULL)
708 { 769 {
709 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,ERR_R_MALLOC_FAILURE); 770 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,ERR_R_MALLOC_FAILURE);
710 goto err; 771 goto err;
@@ -741,7 +802,7 @@ SSL *s;
741 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH); 802 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);
742 goto f_err; 803 goto f_err;
743 } 804 }
744 if (!sk_push(sk,(char *)x)) 805 if (!sk_X509_push(sk,x))
745 { 806 {
746 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,ERR_R_MALLOC_FAILURE); 807 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,ERR_R_MALLOC_FAILURE);
747 goto err; 808 goto err;
@@ -752,53 +813,91 @@ SSL *s;
752 } 813 }
753 814
754 i=ssl_verify_cert_chain(s,sk); 815 i=ssl_verify_cert_chain(s,sk);
755 if ((s->verify_mode != SSL_VERIFY_NONE) && (!i)) 816 if ((s->verify_mode != SSL_VERIFY_NONE) && (!i)
817#ifndef OPENSSL_NO_KRB5
818 && (s->s3->tmp.new_cipher->algorithms & (SSL_MKEY_MASK|SSL_AUTH_MASK))
819 != (SSL_aKRB5|SSL_kKRB5)
820#endif /* OPENSSL_NO_KRB5 */
821 )
756 { 822 {
757 al=ssl_verify_alarm_type(s->verify_result); 823 al=ssl_verify_alarm_type(s->verify_result);
758 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_CERTIFICATE_VERIFY_FAILED); 824 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_CERTIFICATE_VERIFY_FAILED);
759 goto f_err; 825 goto f_err;
760 } 826 }
827 ERR_clear_error(); /* but we keep s->verify_result */
761 828
762 c=ssl_cert_new(); 829 sc=ssl_sess_cert_new();
763 if (c == NULL) goto err; 830 if (sc == NULL) goto err;
764 831
765 if (s->session->cert) ssl_cert_free(s->session->cert); 832 if (s->session->sess_cert) ssl_sess_cert_free(s->session->sess_cert);
766 s->session->cert=c; 833 s->session->sess_cert=sc;
767 834
768 c->cert_chain=sk; 835 sc->cert_chain=sk;
769 x=(X509 *)sk_value(sk,0); 836 /* Inconsistency alert: cert_chain does include the peer's
837 * certificate, which we don't include in s3_srvr.c */
838 x=sk_X509_value(sk,0);
770 sk=NULL; 839 sk=NULL;
840 /* VRS 19990621: possible memory leak; sk=null ==> !sk_pop_free() @end*/
771 841
772 pkey=X509_get_pubkey(x); 842 pkey=X509_get_pubkey(x);
773 843
774 if (EVP_PKEY_missing_parameters(pkey)) 844 /* VRS: allow null cert if auth == KRB5 */
845 need_cert = ((s->s3->tmp.new_cipher->algorithms
846 & (SSL_MKEY_MASK|SSL_AUTH_MASK))
847 == (SSL_aKRB5|SSL_kKRB5))? 0: 1;
848
849#ifdef KSSL_DEBUG
850 printf("pkey,x = %p, %p\n", pkey,x);
851 printf("ssl_cert_type(x,pkey) = %d\n", ssl_cert_type(x,pkey));
852 printf("cipher, alg, nc = %s, %lx, %d\n", s->s3->tmp.new_cipher->name,
853 s->s3->tmp.new_cipher->algorithms, need_cert);
854#endif /* KSSL_DEBUG */
855
856 if (need_cert && ((pkey == NULL) || EVP_PKEY_missing_parameters(pkey)))
775 { 857 {
776 x=NULL; 858 x=NULL;
777 al=SSL3_AL_FATAL; 859 al=SSL3_AL_FATAL;
778 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS); 860 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,
861 SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS);
779 goto f_err; 862 goto f_err;
780 } 863 }
781 864
782 i=ssl_cert_type(x,pkey); 865 i=ssl_cert_type(x,pkey);
783 if (i < 0) 866 if (need_cert && i < 0)
784 { 867 {
785 x=NULL; 868 x=NULL;
786 al=SSL3_AL_FATAL; 869 al=SSL3_AL_FATAL;
787 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_UNKNOWN_CERTIFICATE_TYPE); 870 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,
871 SSL_R_UNKNOWN_CERTIFICATE_TYPE);
788 goto f_err; 872 goto f_err;
789 } 873 }
790 874
791 c->cert_type=i; 875 if (need_cert)
792 CRYPTO_add(&x->references,1,CRYPTO_LOCK_X509); 876 {
793 if (c->pkeys[i].x509 != NULL) 877 sc->peer_cert_type=i;
794 X509_free(c->pkeys[i].x509); 878 CRYPTO_add(&x->references,1,CRYPTO_LOCK_X509);
795 c->pkeys[i].x509=x; 879 /* Why would the following ever happen?
796 c->key= &(c->pkeys[i]); 880 * We just created sc a couple of lines ago. */
797 881 if (sc->peer_pkeys[i].x509 != NULL)
798 if ((s->session != NULL) && (s->session->peer != NULL)) 882 X509_free(sc->peer_pkeys[i].x509);
799 X509_free(s->session->peer); 883 sc->peer_pkeys[i].x509=x;
800 CRYPTO_add(&x->references,1,CRYPTO_LOCK_X509); 884 sc->peer_key= &(sc->peer_pkeys[i]);
801 s->session->peer=x; 885
886 if (s->session->peer != NULL)
887 X509_free(s->session->peer);
888 CRYPTO_add(&x->references,1,CRYPTO_LOCK_X509);
889 s->session->peer=x;
890 }
891 else
892 {
893 sc->peer_cert_type=i;
894 sc->peer_key= NULL;
895
896 if (s->session->peer != NULL)
897 X509_free(s->session->peer);
898 s->session->peer=NULL;
899 }
900 s->session->verify_result = s->verify_result;
802 901
803 x=NULL; 902 x=NULL;
804 ret=1; 903 ret=1;
@@ -809,15 +908,15 @@ f_err:
809 ssl3_send_alert(s,SSL3_AL_FATAL,al); 908 ssl3_send_alert(s,SSL3_AL_FATAL,al);
810 } 909 }
811err: 910err:
812 if (x != NULL) X509_free(x); 911 EVP_PKEY_free(pkey);
813 if (sk != NULL) sk_pop_free(sk,X509_free); 912 X509_free(x);
913 sk_X509_pop_free(sk,X509_free);
814 return(ret); 914 return(ret);
815 } 915 }
816 916
817static int ssl3_get_key_exchange(s) 917static int ssl3_get_key_exchange(SSL *s)
818SSL *s;
819 { 918 {
820#ifndef NO_RSA 919#ifndef OPENSSL_NO_RSA
821 unsigned char *q,md_buf[EVP_MAX_MD_SIZE*2]; 920 unsigned char *q,md_buf[EVP_MAX_MD_SIZE*2];
822#endif 921#endif
823 EVP_MD_CTX md_ctx; 922 EVP_MD_CTX md_ctx;
@@ -825,16 +924,20 @@ SSL *s;
825 int al,i,j,param_len,ok; 924 int al,i,j,param_len,ok;
826 long n,alg; 925 long n,alg;
827 EVP_PKEY *pkey=NULL; 926 EVP_PKEY *pkey=NULL;
927#ifndef OPENSSL_NO_RSA
828 RSA *rsa=NULL; 928 RSA *rsa=NULL;
829#ifndef NO_DH 929#endif
930#ifndef OPENSSL_NO_DH
830 DH *dh=NULL; 931 DH *dh=NULL;
831#endif 932#endif
832 933
934 /* use same message size as in ssl3_get_certificate_request()
935 * as ServerKeyExchange message may be skipped */
833 n=ssl3_get_message(s, 936 n=ssl3_get_message(s,
834 SSL3_ST_CR_KEY_EXCH_A, 937 SSL3_ST_CR_KEY_EXCH_A,
835 SSL3_ST_CR_KEY_EXCH_B, 938 SSL3_ST_CR_KEY_EXCH_B,
836 -1, 939 -1,
837 1024*8, /* ?? */ 940 s->max_cert_list,
838 &ok); 941 &ok);
839 942
840 if (!ok) return((int)n); 943 if (!ok) return((int)n);
@@ -845,34 +948,35 @@ SSL *s;
845 return(1); 948 return(1);
846 } 949 }
847 950
848 param=p=(unsigned char *)s->init_buf->data; 951 param=p=(unsigned char *)s->init_msg;
849 952
850 if (s->session->cert != NULL) 953 if (s->session->sess_cert != NULL)
851 { 954 {
852#ifndef NO_RSA 955#ifndef OPENSSL_NO_RSA
853 if (s->session->cert->rsa_tmp != NULL) 956 if (s->session->sess_cert->peer_rsa_tmp != NULL)
854 { 957 {
855 RSA_free(s->session->cert->rsa_tmp); 958 RSA_free(s->session->sess_cert->peer_rsa_tmp);
856 s->session->cert->rsa_tmp=NULL; 959 s->session->sess_cert->peer_rsa_tmp=NULL;
857 } 960 }
858#endif 961#endif
859#ifndef NO_DH 962#ifndef OPENSSL_NO_DH
860 if (s->session->cert->dh_tmp) 963 if (s->session->sess_cert->peer_dh_tmp)
861 { 964 {
862 DH_free(s->session->cert->dh_tmp); 965 DH_free(s->session->sess_cert->peer_dh_tmp);
863 s->session->cert->dh_tmp=NULL; 966 s->session->sess_cert->peer_dh_tmp=NULL;
864 } 967 }
865#endif 968#endif
866 } 969 }
867 else 970 else
868 { 971 {
869 s->session->cert=ssl_cert_new(); 972 s->session->sess_cert=ssl_sess_cert_new();
870 } 973 }
871 974
872 param_len=0; 975 param_len=0;
873 alg=s->s3->tmp.new_cipher->algorithms; 976 alg=s->s3->tmp.new_cipher->algorithms;
977 EVP_MD_CTX_init(&md_ctx);
874 978
875#ifndef NO_RSA 979#ifndef OPENSSL_NO_RSA
876 if (alg & SSL_kRSA) 980 if (alg & SSL_kRSA)
877 { 981 {
878 if ((rsa=RSA_new()) == NULL) 982 if ((rsa=RSA_new()) == NULL)
@@ -911,21 +1015,23 @@ SSL *s;
911 p+=i; 1015 p+=i;
912 n-=param_len; 1016 n-=param_len;
913 1017
914/* s->session->cert->rsa_tmp=rsa;*/
915 /* this should be because we are using an export cipher */ 1018 /* this should be because we are using an export cipher */
916 if (alg & SSL_aRSA) 1019 if (alg & SSL_aRSA)
917 pkey=X509_get_pubkey(s->session->cert->pkeys[SSL_PKEY_RSA_ENC].x509); 1020 pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
918 else 1021 else
919 { 1022 {
920 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_INTERNAL_ERROR); 1023 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
921 goto err; 1024 goto err;
922 } 1025 }
923 s->session->cert->rsa_tmp=rsa; 1026 s->session->sess_cert->peer_rsa_tmp=rsa;
1027 rsa=NULL;
924 } 1028 }
925 else 1029#else /* OPENSSL_NO_RSA */
1030 if (0)
1031 ;
926#endif 1032#endif
927#ifndef NO_DH 1033#ifndef OPENSSL_NO_DH
928 if (alg & SSL_kEDH) 1034 else if (alg & SSL_kEDH)
929 { 1035 {
930 if ((dh=DH_new()) == NULL) 1036 if ((dh=DH_new()) == NULL)
931 { 1037 {
@@ -978,18 +1084,21 @@ SSL *s;
978 p+=i; 1084 p+=i;
979 n-=param_len; 1085 n-=param_len;
980 1086
981#ifndef NO_RSA 1087#ifndef OPENSSL_NO_RSA
982 if (alg & SSL_aRSA) 1088 if (alg & SSL_aRSA)
983 pkey=X509_get_pubkey(s->session->cert->pkeys[SSL_PKEY_RSA_ENC].x509); 1089 pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
984 else 1090#else
1091 if (0)
1092 ;
985#endif 1093#endif
986#ifndef NO_DSA 1094#ifndef OPENSSL_NO_DSA
987 if (alg & SSL_aDSS) 1095 else if (alg & SSL_aDSS)
988 pkey=X509_get_pubkey(s->session->cert->pkeys[SSL_PKEY_DSA_SIGN].x509); 1096 pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_DSA_SIGN].x509);
989#endif 1097#endif
990 /* else anonymous DH, so no certificate or pkey. */ 1098 /* else anonymous DH, so no certificate or pkey. */
991 1099
992 s->session->cert->dh_tmp=dh; 1100 s->session->sess_cert->peer_dh_tmp=dh;
1101 dh=NULL;
993 } 1102 }
994 else if ((alg & SSL_kDHr) || (alg & SSL_kDHd)) 1103 else if ((alg & SSL_kDHr) || (alg & SSL_kDHd))
995 { 1104 {
@@ -997,7 +1106,14 @@ SSL *s;
997 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER); 1106 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER);
998 goto f_err; 1107 goto f_err;
999 } 1108 }
1000#endif 1109#endif /* !OPENSSL_NO_DH */
1110 if (alg & SSL_aFZA)
1111 {
1112 al=SSL_AD_HANDSHAKE_FAILURE;
1113 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER);
1114 goto f_err;
1115 }
1116
1001 1117
1002 /* p points to the next byte, there are 'n' bytes left */ 1118 /* p points to the next byte, there are 'n' bytes left */
1003 1119
@@ -1014,10 +1130,10 @@ SSL *s;
1014 /* wrong packet length */ 1130 /* wrong packet length */
1015 al=SSL_AD_DECODE_ERROR; 1131 al=SSL_AD_DECODE_ERROR;
1016 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_WRONG_SIGNATURE_LENGTH); 1132 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_WRONG_SIGNATURE_LENGTH);
1017 goto err; 1133 goto f_err;
1018 } 1134 }
1019 1135
1020#ifndef NO_RSA 1136#ifndef OPENSSL_NO_RSA
1021 if (pkey->type == EVP_PKEY_RSA) 1137 if (pkey->type == EVP_PKEY_RSA)
1022 { 1138 {
1023 int num; 1139 int num;
@@ -1026,24 +1142,24 @@ SSL *s;
1026 q=md_buf; 1142 q=md_buf;
1027 for (num=2; num > 0; num--) 1143 for (num=2; num > 0; num--)
1028 { 1144 {
1029 EVP_DigestInit(&md_ctx,(num == 2) 1145 EVP_DigestInit_ex(&md_ctx,(num == 2)
1030 ?s->ctx->md5:s->ctx->sha1); 1146 ?s->ctx->md5:s->ctx->sha1, NULL);
1031 EVP_DigestUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE); 1147 EVP_DigestUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1032 EVP_DigestUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE); 1148 EVP_DigestUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1033 EVP_DigestUpdate(&md_ctx,param,param_len); 1149 EVP_DigestUpdate(&md_ctx,param,param_len);
1034 EVP_DigestFinal(&md_ctx,q,(unsigned int *)&i); 1150 EVP_DigestFinal_ex(&md_ctx,q,(unsigned int *)&i);
1035 q+=i; 1151 q+=i;
1036 j+=i; 1152 j+=i;
1037 } 1153 }
1038 i=RSA_public_decrypt((int)n,p,p,pkey->pkey.rsa, 1154 i=RSA_verify(NID_md5_sha1, md_buf, j, p, n,
1039 RSA_PKCS1_PADDING); 1155 pkey->pkey.rsa);
1040 if (i <= 0) 1156 if (i < 0)
1041 { 1157 {
1042 al=SSL_AD_DECRYPT_ERROR; 1158 al=SSL_AD_DECRYPT_ERROR;
1043 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_RSA_DECRYPT); 1159 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_RSA_DECRYPT);
1044 goto f_err; 1160 goto f_err;
1045 } 1161 }
1046 if ((j != i) || (memcmp(p,md_buf,i) != 0)) 1162 if (i == 0)
1047 { 1163 {
1048 /* bad signature */ 1164 /* bad signature */
1049 al=SSL_AD_DECRYPT_ERROR; 1165 al=SSL_AD_DECRYPT_ERROR;
@@ -1053,11 +1169,11 @@ SSL *s;
1053 } 1169 }
1054 else 1170 else
1055#endif 1171#endif
1056#ifndef NO_DSA 1172#ifndef OPENSSL_NO_DSA
1057 if (pkey->type == EVP_PKEY_DSA) 1173 if (pkey->type == EVP_PKEY_DSA)
1058 { 1174 {
1059 /* lets do DSS */ 1175 /* lets do DSS */
1060 EVP_VerifyInit(&md_ctx,EVP_dss1()); 1176 EVP_VerifyInit_ex(&md_ctx,EVP_dss1(), NULL);
1061 EVP_VerifyUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE); 1177 EVP_VerifyUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1062 EVP_VerifyUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE); 1178 EVP_VerifyUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1063 EVP_VerifyUpdate(&md_ctx,param,param_len); 1179 EVP_VerifyUpdate(&md_ctx,param,param_len);
@@ -1072,7 +1188,7 @@ SSL *s;
1072 else 1188 else
1073#endif 1189#endif
1074 { 1190 {
1075 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_INTERNAL_ERROR); 1191 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
1076 goto err; 1192 goto err;
1077 } 1193 }
1078 } 1194 }
@@ -1081,7 +1197,7 @@ SSL *s;
1081 /* still data left over */ 1197 /* still data left over */
1082 if (!(alg & SSL_aNULL)) 1198 if (!(alg & SSL_aNULL))
1083 { 1199 {
1084 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_INTERNAL_ERROR); 1200 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
1085 goto err; 1201 goto err;
1086 } 1202 }
1087 if (n != 0) 1203 if (n != 0)
@@ -1091,33 +1207,39 @@ SSL *s;
1091 goto f_err; 1207 goto f_err;
1092 } 1208 }
1093 } 1209 }
1094 1210 EVP_PKEY_free(pkey);
1211 EVP_MD_CTX_cleanup(&md_ctx);
1095 return(1); 1212 return(1);
1096f_err: 1213f_err:
1097 ssl3_send_alert(s,SSL3_AL_FATAL,al); 1214 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1098err: 1215err:
1216 EVP_PKEY_free(pkey);
1217#ifndef OPENSSL_NO_RSA
1218 if (rsa != NULL)
1219 RSA_free(rsa);
1220#endif
1221#ifndef OPENSSL_NO_DH
1222 if (dh != NULL)
1223 DH_free(dh);
1224#endif
1225 EVP_MD_CTX_cleanup(&md_ctx);
1099 return(-1); 1226 return(-1);
1100 } 1227 }
1101 1228
1102static int ssl3_get_certificate_request(s) 1229static int ssl3_get_certificate_request(SSL *s)
1103SSL *s;
1104 { 1230 {
1105 int ok,ret=0; 1231 int ok,ret=0;
1106 unsigned long n,nc,l; 1232 unsigned long n,nc,l;
1107 unsigned int llen,ctype_num,i; 1233 unsigned int llen,ctype_num,i;
1108 X509_NAME *xn=NULL; 1234 X509_NAME *xn=NULL;
1109 unsigned char *p,*d,*q; 1235 unsigned char *p,*d,*q;
1110 STACK *ca_sk=NULL; 1236 STACK_OF(X509_NAME) *ca_sk=NULL;
1111 1237
1112 n=ssl3_get_message(s, 1238 n=ssl3_get_message(s,
1113 SSL3_ST_CR_CERT_REQ_A, 1239 SSL3_ST_CR_CERT_REQ_A,
1114 SSL3_ST_CR_CERT_REQ_B, 1240 SSL3_ST_CR_CERT_REQ_B,
1115 -1, 1241 -1,
1116#if defined(MSDOS) && !defined(WIN32) 1242 s->max_cert_list,
1117 1024*30, /* 30k max cert list :-) */
1118#else
1119 1024*100, /* 100k max cert list :-) */
1120#endif
1121 &ok); 1243 &ok);
1122 1244
1123 if (!ok) return((int)n); 1245 if (!ok) return((int)n);
@@ -1149,9 +1271,9 @@ SSL *s;
1149 } 1271 }
1150 } 1272 }
1151 1273
1152 d=p=(unsigned char *)s->init_buf->data; 1274 d=p=(unsigned char *)s->init_msg;
1153 1275
1154 if ((ca_sk=sk_new(ca_dn_cmp)) == NULL) 1276 if ((ca_sk=sk_X509_NAME_new(ca_dn_cmp)) == NULL)
1155 { 1277 {
1156 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,ERR_R_MALLOC_FAILURE); 1278 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,ERR_R_MALLOC_FAILURE);
1157 goto err; 1279 goto err;
@@ -1167,6 +1289,15 @@ SSL *s;
1167 1289
1168 /* get the CA RDNs */ 1290 /* get the CA RDNs */
1169 n2s(p,llen); 1291 n2s(p,llen);
1292#if 0
1293{
1294FILE *out;
1295out=fopen("/tmp/vsign.der","w");
1296fwrite(p,1,llen,out);
1297fclose(out);
1298}
1299#endif
1300
1170 if ((llen+ctype_num+2+1) != n) 1301 if ((llen+ctype_num+2+1) != n)
1171 { 1302 {
1172 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR); 1303 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
@@ -1190,7 +1321,7 @@ SSL *s;
1190 1321
1191 if ((xn=d2i_X509_NAME(NULL,&q,l)) == NULL) 1322 if ((xn=d2i_X509_NAME(NULL,&q,l)) == NULL)
1192 { 1323 {
1193 /* If netscape tollerance is on, ignore errors */ 1324 /* If netscape tolerance is on, ignore errors */
1194 if (s->options & SSL_OP_NETSCAPE_CA_DN_BUG) 1325 if (s->options & SSL_OP_NETSCAPE_CA_DN_BUG)
1195 goto cont; 1326 goto cont;
1196 else 1327 else
@@ -1207,7 +1338,7 @@ SSL *s;
1207 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_CA_DN_LENGTH_MISMATCH); 1338 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_CA_DN_LENGTH_MISMATCH);
1208 goto err; 1339 goto err;
1209 } 1340 }
1210 if (!sk_push(ca_sk,(char *)xn)) 1341 if (!sk_X509_NAME_push(ca_sk,xn))
1211 { 1342 {
1212 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,ERR_R_MALLOC_FAILURE); 1343 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,ERR_R_MALLOC_FAILURE);
1213 goto err; 1344 goto err;
@@ -1223,28 +1354,26 @@ cont:
1223 ERR_clear_error(); 1354 ERR_clear_error();
1224 } 1355 }
1225 1356
1226 /* we should setup a certficate to return.... */ 1357 /* we should setup a certificate to return.... */
1227 s->s3->tmp.cert_req=1; 1358 s->s3->tmp.cert_req=1;
1228 s->s3->tmp.ctype_num=ctype_num; 1359 s->s3->tmp.ctype_num=ctype_num;
1229 if (s->s3->tmp.ca_names != NULL) 1360 if (s->s3->tmp.ca_names != NULL)
1230 sk_pop_free(s->s3->tmp.ca_names,X509_NAME_free); 1361 sk_X509_NAME_pop_free(s->s3->tmp.ca_names,X509_NAME_free);
1231 s->s3->tmp.ca_names=ca_sk; 1362 s->s3->tmp.ca_names=ca_sk;
1232 ca_sk=NULL; 1363 ca_sk=NULL;
1233 1364
1234 ret=1; 1365 ret=1;
1235err: 1366err:
1236 if (ca_sk != NULL) sk_pop_free(ca_sk,X509_NAME_free); 1367 if (ca_sk != NULL) sk_X509_NAME_pop_free(ca_sk,X509_NAME_free);
1237 return(ret); 1368 return(ret);
1238 } 1369 }
1239 1370
1240static int ca_dn_cmp(a,b) 1371static int ca_dn_cmp(const X509_NAME * const *a, const X509_NAME * const *b)
1241X509_NAME **a,**b;
1242 { 1372 {
1243 return(X509_NAME_cmp(*a,*b)); 1373 return(X509_NAME_cmp(*a,*b));
1244 } 1374 }
1245 1375
1246static int ssl3_get_server_done(s) 1376static int ssl3_get_server_done(SSL *s)
1247SSL *s;
1248 { 1377 {
1249 int ok,ret=0; 1378 int ok,ret=0;
1250 long n; 1379 long n;
@@ -1262,18 +1391,24 @@ SSL *s;
1262 /* should contain no data */ 1391 /* should contain no data */
1263 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR); 1392 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
1264 SSLerr(SSL_F_SSL3_GET_SERVER_DONE,SSL_R_LENGTH_MISMATCH); 1393 SSLerr(SSL_F_SSL3_GET_SERVER_DONE,SSL_R_LENGTH_MISMATCH);
1394 return -1;
1265 } 1395 }
1266 ret=1; 1396 ret=1;
1267 return(ret); 1397 return(ret);
1268 } 1398 }
1269 1399
1270static int ssl3_send_client_key_exchange(s) 1400static int ssl3_send_client_key_exchange(SSL *s)
1271SSL *s;
1272 { 1401 {
1273 unsigned char *p,*q,*d; 1402 unsigned char *p,*d;
1274 int n; 1403 int n;
1275 unsigned long l; 1404 unsigned long l;
1405#ifndef OPENSSL_NO_RSA
1406 unsigned char *q;
1276 EVP_PKEY *pkey=NULL; 1407 EVP_PKEY *pkey=NULL;
1408#endif
1409#ifndef OPENSSL_NO_KRB5
1410 KSSL_ERR kssl_err;
1411#endif /* OPENSSL_NO_KRB5 */
1277 1412
1278 if (s->state == SSL3_ST_CW_KEY_EXCH_A) 1413 if (s->state == SSL3_ST_CW_KEY_EXCH_A)
1279 { 1414 {
@@ -1282,30 +1417,34 @@ SSL *s;
1282 1417
1283 l=s->s3->tmp.new_cipher->algorithms; 1418 l=s->s3->tmp.new_cipher->algorithms;
1284 1419
1285#ifndef NO_RSA 1420 /* Fool emacs indentation */
1286 if (l & SSL_kRSA) 1421 if (0) {}
1422#ifndef OPENSSL_NO_RSA
1423 else if (l & SSL_kRSA)
1287 { 1424 {
1288 RSA *rsa; 1425 RSA *rsa;
1289 unsigned char tmp_buf[48]; 1426 unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH];
1290 1427
1291 if (s->session->cert->rsa_tmp != NULL) 1428 if (s->session->sess_cert->peer_rsa_tmp != NULL)
1292 rsa=s->session->cert->rsa_tmp; 1429 rsa=s->session->sess_cert->peer_rsa_tmp;
1293 else 1430 else
1294 { 1431 {
1295 pkey=X509_get_pubkey(s->session->cert->pkeys[SSL_PKEY_RSA_ENC].x509); 1432 pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
1296 if ((pkey == NULL) || 1433 if ((pkey == NULL) ||
1297 (pkey->type != EVP_PKEY_RSA) || 1434 (pkey->type != EVP_PKEY_RSA) ||
1298 (pkey->pkey.rsa == NULL)) 1435 (pkey->pkey.rsa == NULL))
1299 { 1436 {
1300 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,SSL_R_INTERNAL_ERROR); 1437 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
1301 goto err; 1438 goto err;
1302 } 1439 }
1303 rsa=pkey->pkey.rsa; 1440 rsa=pkey->pkey.rsa;
1441 EVP_PKEY_free(pkey);
1304 } 1442 }
1305 1443
1306 tmp_buf[0]=s->version>>8; 1444 tmp_buf[0]=s->client_version>>8;
1307 tmp_buf[1]=s->version&0xff; 1445 tmp_buf[1]=s->client_version&0xff;
1308 RAND_bytes(&(tmp_buf[2]),SSL_MAX_MASTER_KEY_LENGTH-2); 1446 if (RAND_bytes(&(tmp_buf[2]),SSL_MAX_MASTER_KEY_LENGTH-2) <= 0)
1447 goto err;
1309 1448
1310 s->session->master_key_length=SSL_MAX_MASTER_KEY_LENGTH; 1449 s->session->master_key_length=SSL_MAX_MASTER_KEY_LENGTH;
1311 1450
@@ -1315,6 +1454,10 @@ SSL *s;
1315 p+=2; 1454 p+=2;
1316 n=RSA_public_encrypt(SSL_MAX_MASTER_KEY_LENGTH, 1455 n=RSA_public_encrypt(SSL_MAX_MASTER_KEY_LENGTH,
1317 tmp_buf,p,rsa,RSA_PKCS1_PADDING); 1456 tmp_buf,p,rsa,RSA_PKCS1_PADDING);
1457#ifdef PKCS1_CHECK
1458 if (s->options & SSL_OP_PKCS1_CHECK_1) p[1]++;
1459 if (s->options & SSL_OP_PKCS1_CHECK_2) tmp_buf[0]=0x70;
1460#endif
1318 if (n <= 0) 1461 if (n <= 0)
1319 { 1462 {
1320 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_ENCRYPT); 1463 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_ENCRYPT);
@@ -1331,18 +1474,144 @@ SSL *s;
1331 s->session->master_key_length= 1474 s->session->master_key_length=
1332 s->method->ssl3_enc->generate_master_secret(s, 1475 s->method->ssl3_enc->generate_master_secret(s,
1333 s->session->master_key, 1476 s->session->master_key,
1334 tmp_buf,48); 1477 tmp_buf,SSL_MAX_MASTER_KEY_LENGTH);
1335 memset(tmp_buf,0,48); 1478 memset(tmp_buf,0,SSL_MAX_MASTER_KEY_LENGTH);
1336 } 1479 }
1337 else
1338#endif 1480#endif
1339#ifndef NO_DH 1481#ifndef OPENSSL_NO_KRB5
1340 if (l & (SSL_kEDH|SSL_kDHr|SSL_kDHd)) 1482 else if (l & SSL_kKRB5)
1483 {
1484 krb5_error_code krb5rc;
1485 KSSL_CTX *kssl_ctx = s->kssl_ctx;
1486 /* krb5_data krb5_ap_req; */
1487 krb5_data *enc_ticket;
1488 krb5_data authenticator, *authp = NULL;
1489 EVP_CIPHER_CTX ciph_ctx;
1490 EVP_CIPHER *enc = NULL;
1491 unsigned char iv[EVP_MAX_IV_LENGTH];
1492 unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH];
1493 unsigned char epms[SSL_MAX_MASTER_KEY_LENGTH
1494 + EVP_MAX_IV_LENGTH];
1495 int padl, outl = sizeof(epms);
1496
1497 EVP_CIPHER_CTX_init(&ciph_ctx);
1498
1499#ifdef KSSL_DEBUG
1500 printf("ssl3_send_client_key_exchange(%lx & %lx)\n",
1501 l, SSL_kKRB5);
1502#endif /* KSSL_DEBUG */
1503
1504 authp = NULL;
1505#ifdef KRB5SENDAUTH
1506 if (KRB5SENDAUTH) authp = &authenticator;
1507#endif /* KRB5SENDAUTH */
1508
1509 krb5rc = kssl_cget_tkt(kssl_ctx, &enc_ticket, authp,
1510 &kssl_err);
1511 enc = kssl_map_enc(kssl_ctx->enctype);
1512 if (enc == NULL)
1513 goto err;
1514#ifdef KSSL_DEBUG
1515 {
1516 printf("kssl_cget_tkt rtn %d\n", krb5rc);
1517 if (krb5rc && kssl_err.text)
1518 printf("kssl_cget_tkt kssl_err=%s\n", kssl_err.text);
1519 }
1520#endif /* KSSL_DEBUG */
1521
1522 if (krb5rc)
1523 {
1524 ssl3_send_alert(s,SSL3_AL_FATAL,
1525 SSL_AD_HANDSHAKE_FAILURE);
1526 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
1527 kssl_err.reason);
1528 goto err;
1529 }
1530
1531 /* 20010406 VRS - Earlier versions used KRB5 AP_REQ
1532 ** in place of RFC 2712 KerberosWrapper, as in:
1533 **
1534 ** Send ticket (copy to *p, set n = length)
1535 ** n = krb5_ap_req.length;
1536 ** memcpy(p, krb5_ap_req.data, krb5_ap_req.length);
1537 ** if (krb5_ap_req.data)
1538 ** kssl_krb5_free_data_contents(NULL,&krb5_ap_req);
1539 **
1540 ** Now using real RFC 2712 KerberosWrapper
1541 ** (Thanks to Simon Wilkinson <sxw@sxw.org.uk>)
1542 ** Note: 2712 "opaque" types are here replaced
1543 ** with a 2-byte length followed by the value.
1544 ** Example:
1545 ** KerberosWrapper= xx xx asn1ticket 0 0 xx xx encpms
1546 ** Where "xx xx" = length bytes. Shown here with
1547 ** optional authenticator omitted.
1548 */
1549
1550 /* KerberosWrapper.Ticket */
1551 s2n(enc_ticket->length,p);
1552 memcpy(p, enc_ticket->data, enc_ticket->length);
1553 p+= enc_ticket->length;
1554 n = enc_ticket->length + 2;
1555
1556 /* KerberosWrapper.Authenticator */
1557 if (authp && authp->length)
1558 {
1559 s2n(authp->length,p);
1560 memcpy(p, authp->data, authp->length);
1561 p+= authp->length;
1562 n+= authp->length + 2;
1563
1564 free(authp->data);
1565 authp->data = NULL;
1566 authp->length = 0;
1567 }
1568 else
1569 {
1570 s2n(0,p);/* null authenticator length */
1571 n+=2;
1572 }
1573
1574 if (RAND_bytes(tmp_buf,SSL_MAX_MASTER_KEY_LENGTH) <= 0)
1575 goto err;
1576
1577 /* 20010420 VRS. Tried it this way; failed.
1578 ** EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,NULL);
1579 ** EVP_CIPHER_CTX_set_key_length(&ciph_ctx,
1580 ** kssl_ctx->length);
1581 ** EVP_EncryptInit_ex(&ciph_ctx,NULL, key,iv);
1582 */
1583
1584 memset(iv, 0, EVP_MAX_IV_LENGTH); /* per RFC 1510 */
1585 EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,
1586 kssl_ctx->key,iv);
1587 EVP_EncryptUpdate(&ciph_ctx,epms,&outl,tmp_buf,
1588 SSL_MAX_MASTER_KEY_LENGTH);
1589 EVP_EncryptFinal_ex(&ciph_ctx,&(epms[outl]),&padl);
1590 outl += padl;
1591 EVP_CIPHER_CTX_cleanup(&ciph_ctx);
1592
1593 /* KerberosWrapper.EncryptedPreMasterSecret */
1594 s2n(outl,p);
1595 memcpy(p, epms, outl);
1596 p+=outl;
1597 n+=outl + 2;
1598
1599 s->session->master_key_length=
1600 s->method->ssl3_enc->generate_master_secret(s,
1601 s->session->master_key,
1602 tmp_buf, SSL_MAX_MASTER_KEY_LENGTH);
1603
1604 memset(tmp_buf, 0, SSL_MAX_MASTER_KEY_LENGTH);
1605 memset(epms, 0, outl);
1606 }
1607#endif
1608#ifndef OPENSSL_NO_DH
1609 else if (l & (SSL_kEDH|SSL_kDHr|SSL_kDHd))
1341 { 1610 {
1342 DH *dh_srvr,*dh_clnt; 1611 DH *dh_srvr,*dh_clnt;
1343 1612
1344 if (s->session->cert->dh_tmp != NULL) 1613 if (s->session->sess_cert->peer_dh_tmp != NULL)
1345 dh_srvr=s->session->cert->dh_tmp; 1614 dh_srvr=s->session->sess_cert->peer_dh_tmp;
1346 else 1615 else
1347 { 1616 {
1348 /* we get them from the cert */ 1617 /* we get them from the cert */
@@ -1391,11 +1660,11 @@ SSL *s;
1391 1660
1392 /* perhaps clean things up a bit EAY EAY EAY EAY*/ 1661 /* perhaps clean things up a bit EAY EAY EAY EAY*/
1393 } 1662 }
1394 else
1395#endif 1663#endif
1664 else
1396 { 1665 {
1397 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE); 1666 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
1398 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,SSL_R_INTERNAL_ERROR); 1667 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
1399 goto err; 1668 goto err;
1400 } 1669 }
1401 1670
@@ -1414,15 +1683,16 @@ err:
1414 return(-1); 1683 return(-1);
1415 } 1684 }
1416 1685
1417static int ssl3_send_client_verify(s) 1686static int ssl3_send_client_verify(SSL *s)
1418SSL *s;
1419 { 1687 {
1420 unsigned char *p,*d; 1688 unsigned char *p,*d;
1421 unsigned char data[MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH]; 1689 unsigned char data[MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH];
1422 EVP_PKEY *pkey; 1690 EVP_PKEY *pkey;
1423 int i=0; 1691#ifndef OPENSSL_NO_RSA
1692 unsigned u=0;
1693#endif
1424 unsigned long n; 1694 unsigned long n;
1425#ifndef NO_DSA 1695#ifndef OPENSSL_NO_DSA
1426 int j; 1696 int j;
1427#endif 1697#endif
1428 1698
@@ -1435,26 +1705,24 @@ SSL *s;
1435 s->method->ssl3_enc->cert_verify_mac(s,&(s->s3->finish_dgst2), 1705 s->method->ssl3_enc->cert_verify_mac(s,&(s->s3->finish_dgst2),
1436 &(data[MD5_DIGEST_LENGTH])); 1706 &(data[MD5_DIGEST_LENGTH]));
1437 1707
1438#ifndef NO_RSA 1708#ifndef OPENSSL_NO_RSA
1439 if (pkey->type == EVP_PKEY_RSA) 1709 if (pkey->type == EVP_PKEY_RSA)
1440 { 1710 {
1441 s->method->ssl3_enc->cert_verify_mac(s, 1711 s->method->ssl3_enc->cert_verify_mac(s,
1442 &(s->s3->finish_dgst1),&(data[0])); 1712 &(s->s3->finish_dgst1),&(data[0]));
1443 i=RSA_private_encrypt( 1713 if (RSA_sign(NID_md5_sha1, data,
1444 MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH, 1714 MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH,
1445 data,&(p[2]),pkey->pkey.rsa, 1715 &(p[2]), &u, pkey->pkey.rsa) <= 0 )
1446 RSA_PKCS1_PADDING);
1447 if (i <= 0)
1448 { 1716 {
1449 SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,ERR_R_RSA_LIB); 1717 SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,ERR_R_RSA_LIB);
1450 goto err; 1718 goto err;
1451 } 1719 }
1452 s2n(i,p); 1720 s2n(u,p);
1453 n=i+2; 1721 n=u+2;
1454 } 1722 }
1455 else 1723 else
1456#endif 1724#endif
1457#ifndef NO_DSA 1725#ifndef OPENSSL_NO_DSA
1458 if (pkey->type == EVP_PKEY_DSA) 1726 if (pkey->type == EVP_PKEY_DSA)
1459 { 1727 {
1460 if (!DSA_sign(pkey->save_type, 1728 if (!DSA_sign(pkey->save_type,
@@ -1471,7 +1739,7 @@ SSL *s;
1471 else 1739 else
1472#endif 1740#endif
1473 { 1741 {
1474 SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,SSL_R_INTERNAL_ERROR); 1742 SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,ERR_R_INTERNAL_ERROR);
1475 goto err; 1743 goto err;
1476 } 1744 }
1477 *(d++)=SSL3_MT_CERTIFICATE_VERIFY; 1745 *(d++)=SSL3_MT_CERTIFICATE_VERIFY;
@@ -1485,8 +1753,7 @@ err:
1485 return(-1); 1753 return(-1);
1486 } 1754 }
1487 1755
1488static int ssl3_send_client_certificate(s) 1756static int ssl3_send_client_certificate(SSL *s)
1489SSL *s;
1490 { 1757 {
1491 X509 *x509=NULL; 1758 X509 *x509=NULL;
1492 EVP_PKEY *pkey=NULL; 1759 EVP_PKEY *pkey=NULL;
@@ -1565,38 +1832,46 @@ SSL *s;
1565 1832
1566#define has_bits(i,m) (((i)&(m)) == (m)) 1833#define has_bits(i,m) (((i)&(m)) == (m))
1567 1834
1568static int ssl3_check_cert_and_algorithm(s) 1835static int ssl3_check_cert_and_algorithm(SSL *s)
1569SSL *s;
1570 { 1836 {
1571 int i,idx; 1837 int i,idx;
1572 long algs; 1838 long algs;
1573 EVP_PKEY *pkey=NULL; 1839 EVP_PKEY *pkey=NULL;
1574 CERT *c; 1840 SESS_CERT *sc;
1841#ifndef OPENSSL_NO_RSA
1575 RSA *rsa; 1842 RSA *rsa;
1843#endif
1844#ifndef OPENSSL_NO_DH
1576 DH *dh; 1845 DH *dh;
1846#endif
1577 1847
1578 c=s->session->cert; 1848 sc=s->session->sess_cert;
1579 1849
1580 if (c == NULL) 1850 if (sc == NULL)
1581 { 1851 {
1582 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_INTERNAL_ERROR); 1852 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,ERR_R_INTERNAL_ERROR);
1583 goto err; 1853 goto err;
1584 } 1854 }
1585 1855
1586 algs=s->s3->tmp.new_cipher->algorithms; 1856 algs=s->s3->tmp.new_cipher->algorithms;
1587 1857
1588 /* we don't have a certificate */ 1858 /* we don't have a certificate */
1589 if (algs & (SSL_aDH|SSL_aNULL)) 1859 if (algs & (SSL_aDH|SSL_aNULL|SSL_aKRB5))
1590 return(1); 1860 return(1);
1591 1861
1592 rsa=s->session->cert->rsa_tmp; 1862#ifndef OPENSSL_NO_RSA
1593 dh=s->session->cert->dh_tmp; 1863 rsa=s->session->sess_cert->peer_rsa_tmp;
1864#endif
1865#ifndef OPENSSL_NO_DH
1866 dh=s->session->sess_cert->peer_dh_tmp;
1867#endif
1594 1868
1595 /* This is the passed certificate */ 1869 /* This is the passed certificate */
1596 1870
1597 idx=c->cert_type; 1871 idx=sc->peer_cert_type;
1598 pkey=X509_get_pubkey(c->pkeys[idx].x509); 1872 pkey=X509_get_pubkey(sc->peer_pkeys[idx].x509);
1599 i=X509_certificate_type(c->pkeys[idx].x509,pkey); 1873 i=X509_certificate_type(sc->peer_pkeys[idx].x509,pkey);
1874 EVP_PKEY_free(pkey);
1600 1875
1601 1876
1602 /* Check that we have a certificate if we require one */ 1877 /* Check that we have a certificate if we require one */
@@ -1605,22 +1880,23 @@ SSL *s;
1605 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_RSA_SIGNING_CERT); 1880 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_RSA_SIGNING_CERT);
1606 goto f_err; 1881 goto f_err;
1607 } 1882 }
1608#ifndef NO_DSA 1883#ifndef OPENSSL_NO_DSA
1609 else if ((algs & SSL_aDSS) && !has_bits(i,EVP_PK_DSA|EVP_PKT_SIGN)) 1884 else if ((algs & SSL_aDSS) && !has_bits(i,EVP_PK_DSA|EVP_PKT_SIGN))
1610 { 1885 {
1611 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DSA_SIGNING_CERT); 1886 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DSA_SIGNING_CERT);
1612 goto f_err; 1887 goto f_err;
1613 } 1888 }
1614#endif 1889#endif
1615 1890#ifndef OPENSSL_NO_RSA
1616 if ((algs & SSL_kRSA) && 1891 if ((algs & SSL_kRSA) &&
1617 !(has_bits(i,EVP_PK_RSA|EVP_PKT_ENC) || (rsa != NULL))) 1892 !(has_bits(i,EVP_PK_RSA|EVP_PKT_ENC) || (rsa != NULL)))
1618 { 1893 {
1619 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_RSA_ENCRYPTING_CERT); 1894 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_RSA_ENCRYPTING_CERT);
1620 goto f_err; 1895 goto f_err;
1621 } 1896 }
1622#ifndef NO_DH 1897#endif
1623 else if ((algs & SSL_kEDH) && 1898#ifndef OPENSSL_NO_DH
1899 if ((algs & SSL_kEDH) &&
1624 !(has_bits(i,EVP_PK_DH|EVP_PKT_EXCH) || (dh != NULL))) 1900 !(has_bits(i,EVP_PK_DH|EVP_PKT_EXCH) || (dh != NULL)))
1625 { 1901 {
1626 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DH_KEY); 1902 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DH_KEY);
@@ -1631,7 +1907,7 @@ SSL *s;
1631 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DH_RSA_CERT); 1907 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DH_RSA_CERT);
1632 goto f_err; 1908 goto f_err;
1633 } 1909 }
1634#ifndef NO_DSA 1910#ifndef OPENSSL_NO_DSA
1635 else if ((algs & SSL_kDHd) && !has_bits(i,EVP_PK_DH|EVP_PKS_DSA)) 1911 else if ((algs & SSL_kDHd) && !has_bits(i,EVP_PK_DH|EVP_PKS_DSA))
1636 { 1912 {
1637 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DH_DSA_CERT); 1913 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DH_DSA_CERT);
@@ -1640,12 +1916,13 @@ SSL *s;
1640#endif 1916#endif
1641#endif 1917#endif
1642 1918
1643 if ((algs & SSL_EXP) && !has_bits(i,EVP_PKT_EXP)) 1919 if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) && !has_bits(i,EVP_PKT_EXP))
1644 { 1920 {
1645#ifndef NO_RSA 1921#ifndef OPENSSL_NO_RSA
1646 if (algs & SSL_kRSA) 1922 if (algs & SSL_kRSA)
1647 { 1923 {
1648 if ((rsa == NULL) || (RSA_size(rsa) > 512)) 1924 if (rsa == NULL
1925 || RSA_size(rsa) > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher))
1649 { 1926 {
1650 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_EXPORT_TMP_RSA_KEY); 1927 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_EXPORT_TMP_RSA_KEY);
1651 goto f_err; 1928 goto f_err;
@@ -1653,10 +1930,11 @@ SSL *s;
1653 } 1930 }
1654 else 1931 else
1655#endif 1932#endif
1656#ifndef NO_DH 1933#ifndef OPENSSL_NO_DH
1657 if (algs & (SSL_kEDH|SSL_kDHr|SSL_kDHd)) 1934 if (algs & (SSL_kEDH|SSL_kDHr|SSL_kDHd))
1658 { 1935 {
1659 if ((dh == NULL) || (DH_size(dh) > 512)) 1936 if (dh == NULL
1937 || DH_size(dh) > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher))
1660 { 1938 {
1661 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_EXPORT_TMP_DH_KEY); 1939 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_EXPORT_TMP_DH_KEY);
1662 goto f_err; 1940 goto f_err;
diff --git a/src/lib/libssl/s3_lib.c b/src/lib/libssl/s3_lib.c
index 0fd945025d..686992406c 100644
--- a/src/lib/libssl/s3_lib.c
+++ b/src/lib/libssl/s3_lib.c
@@ -55,40 +55,99 @@
55 * copied and put under another distribution licence 55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.] 56 * [including the GNU Public Licence.]
57 */ 57 */
58/* ====================================================================
59 * Copyright (c) 1998-2002 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 */
58 111
59#include <stdio.h> 112#include <stdio.h>
60#include "objects.h" 113#include <openssl/objects.h>
61#include "ssl_locl.h" 114#include "ssl_locl.h"
115#include "kssl_lcl.h"
116#include <openssl/md5.h>
62 117
63char *ssl3_version_str="SSLv3 part of SSLeay 0.9.0b 29-Jun-1998"; 118const char *ssl3_version_str="SSLv3" OPENSSL_VERSION_PTEXT;
64 119
65#define SSL3_NUM_CIPHERS (sizeof(ssl3_ciphers)/sizeof(SSL_CIPHER)) 120#define SSL3_NUM_CIPHERS (sizeof(ssl3_ciphers)/sizeof(SSL_CIPHER))
66 121
67#ifndef NOPROTO
68static long ssl3_default_timeout(void ); 122static long ssl3_default_timeout(void );
69#else
70static long ssl3_default_timeout();
71#endif
72 123
73SSL_CIPHER ssl3_ciphers[]={ 124OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={
74/* The RSA ciphers */ 125/* The RSA ciphers */
75/* Cipher 01 */ 126/* Cipher 01 */
76 { 127 {
77 1, 128 1,
78 SSL3_TXT_RSA_NULL_MD5, 129 SSL3_TXT_RSA_NULL_MD5,
79 SSL3_CK_RSA_NULL_MD5, 130 SSL3_CK_RSA_NULL_MD5,
80 SSL_kRSA|SSL_aRSA|SSL_eNULL |SSL_MD5|SSL_NOT_EXP|SSL_SSLV3, 131 SSL_kRSA|SSL_aRSA|SSL_eNULL |SSL_MD5|SSL_SSLV3,
132 SSL_NOT_EXP,
133 0,
134 0,
81 0, 135 0,
82 SSL_ALL_CIPHERS, 136 SSL_ALL_CIPHERS,
137 SSL_ALL_STRENGTHS,
83 }, 138 },
84/* Cipher 02 */ 139/* Cipher 02 */
85 { 140 {
86 1, 141 1,
87 SSL3_TXT_RSA_NULL_SHA, 142 SSL3_TXT_RSA_NULL_SHA,
88 SSL3_CK_RSA_NULL_SHA, 143 SSL3_CK_RSA_NULL_SHA,
89 SSL_kRSA|SSL_aRSA|SSL_eNULL |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3, 144 SSL_kRSA|SSL_aRSA|SSL_eNULL |SSL_SHA1|SSL_SSLV3,
145 SSL_NOT_EXP,
146 0,
147 0,
90 0, 148 0,
91 SSL_ALL_CIPHERS, 149 SSL_ALL_CIPHERS,
150 SSL_ALL_STRENGTHS,
92 }, 151 },
93 152
94/* anon DH */ 153/* anon DH */
@@ -97,45 +156,65 @@ SSL_CIPHER ssl3_ciphers[]={
97 1, 156 1,
98 SSL3_TXT_ADH_RC4_40_MD5, 157 SSL3_TXT_ADH_RC4_40_MD5,
99 SSL3_CK_ADH_RC4_40_MD5, 158 SSL3_CK_ADH_RC4_40_MD5,
100 SSL_kEDH |SSL_aNULL|SSL_RC4 |SSL_MD5 |SSL_EXP|SSL_SSLV3, 159 SSL_kEDH |SSL_aNULL|SSL_RC4 |SSL_MD5 |SSL_SSLV3,
160 SSL_EXPORT|SSL_EXP40,
101 0, 161 0,
162 40,
163 128,
102 SSL_ALL_CIPHERS, 164 SSL_ALL_CIPHERS,
165 SSL_ALL_STRENGTHS,
103 }, 166 },
104/* Cipher 18 */ 167/* Cipher 18 */
105 { 168 {
106 1, 169 1,
107 SSL3_TXT_ADH_RC4_128_MD5, 170 SSL3_TXT_ADH_RC4_128_MD5,
108 SSL3_CK_ADH_RC4_128_MD5, 171 SSL3_CK_ADH_RC4_128_MD5,
109 SSL_kEDH |SSL_aNULL|SSL_RC4 |SSL_MD5|SSL_NOT_EXP|SSL_SSLV3, 172 SSL_kEDH |SSL_aNULL|SSL_RC4 |SSL_MD5 |SSL_SSLV3,
173 SSL_NOT_EXP|SSL_MEDIUM,
110 0, 174 0,
175 128,
176 128,
111 SSL_ALL_CIPHERS, 177 SSL_ALL_CIPHERS,
178 SSL_ALL_STRENGTHS,
112 }, 179 },
113/* Cipher 19 */ 180/* Cipher 19 */
114 { 181 {
115 1, 182 1,
116 SSL3_TXT_ADH_DES_40_CBC_SHA, 183 SSL3_TXT_ADH_DES_40_CBC_SHA,
117 SSL3_CK_ADH_DES_40_CBC_SHA, 184 SSL3_CK_ADH_DES_40_CBC_SHA,
118 SSL_kEDH |SSL_aNULL|SSL_DES|SSL_SHA1|SSL_EXP|SSL_SSLV3, 185 SSL_kEDH |SSL_aNULL|SSL_DES|SSL_SHA1|SSL_SSLV3,
186 SSL_EXPORT|SSL_EXP40,
119 0, 187 0,
188 40,
189 128,
120 SSL_ALL_CIPHERS, 190 SSL_ALL_CIPHERS,
191 SSL_ALL_STRENGTHS,
121 }, 192 },
122/* Cipher 1A */ 193/* Cipher 1A */
123 { 194 {
124 1, 195 1,
125 SSL3_TXT_ADH_DES_64_CBC_SHA, 196 SSL3_TXT_ADH_DES_64_CBC_SHA,
126 SSL3_CK_ADH_DES_64_CBC_SHA, 197 SSL3_CK_ADH_DES_64_CBC_SHA,
127 SSL_kEDH |SSL_aNULL|SSL_DES |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3, 198 SSL_kEDH |SSL_aNULL|SSL_DES |SSL_SHA1|SSL_SSLV3,
199 SSL_NOT_EXP|SSL_LOW,
128 0, 200 0,
201 56,
202 56,
129 SSL_ALL_CIPHERS, 203 SSL_ALL_CIPHERS,
204 SSL_ALL_STRENGTHS,
130 }, 205 },
131/* Cipher 1B */ 206/* Cipher 1B */
132 { 207 {
133 1, 208 1,
134 SSL3_TXT_ADH_DES_192_CBC_SHA, 209 SSL3_TXT_ADH_DES_192_CBC_SHA,
135 SSL3_CK_ADH_DES_192_CBC_SHA, 210 SSL3_CK_ADH_DES_192_CBC_SHA,
136 SSL_kEDH |SSL_aNULL|SSL_3DES |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3, 211 SSL_kEDH |SSL_aNULL|SSL_3DES |SSL_SHA1|SSL_SSLV3,
212 SSL_NOT_EXP|SSL_HIGH,
137 0, 213 0,
214 168,
215 168,
138 SSL_ALL_CIPHERS, 216 SSL_ALL_CIPHERS,
217 SSL_ALL_STRENGTHS,
139 }, 218 },
140 219
141/* RSA again */ 220/* RSA again */
@@ -144,72 +223,104 @@ SSL_CIPHER ssl3_ciphers[]={
144 1, 223 1,
145 SSL3_TXT_RSA_RC4_40_MD5, 224 SSL3_TXT_RSA_RC4_40_MD5,
146 SSL3_CK_RSA_RC4_40_MD5, 225 SSL3_CK_RSA_RC4_40_MD5,
147 SSL_kRSA|SSL_aRSA|SSL_RC4 |SSL_MD5 |SSL_EXP|SSL_SSLV3, 226 SSL_kRSA|SSL_aRSA|SSL_RC4 |SSL_MD5 |SSL_SSLV3,
227 SSL_EXPORT|SSL_EXP40,
148 0, 228 0,
229 40,
230 128,
149 SSL_ALL_CIPHERS, 231 SSL_ALL_CIPHERS,
232 SSL_ALL_STRENGTHS,
150 }, 233 },
151/* Cipher 04 */ 234/* Cipher 04 */
152 { 235 {
153 1, 236 1,
154 SSL3_TXT_RSA_RC4_128_MD5, 237 SSL3_TXT_RSA_RC4_128_MD5,
155 SSL3_CK_RSA_RC4_128_MD5, 238 SSL3_CK_RSA_RC4_128_MD5,
156 SSL_kRSA|SSL_aRSA|SSL_RC4 |SSL_MD5|SSL_NOT_EXP|SSL_SSLV3|SSL_MEDIUM, 239 SSL_kRSA|SSL_aRSA|SSL_RC4 |SSL_MD5|SSL_SSLV3,
240 SSL_NOT_EXP|SSL_MEDIUM,
157 0, 241 0,
242 128,
243 128,
158 SSL_ALL_CIPHERS, 244 SSL_ALL_CIPHERS,
245 SSL_ALL_STRENGTHS,
159 }, 246 },
160/* Cipher 05 */ 247/* Cipher 05 */
161 { 248 {
162 1, 249 1,
163 SSL3_TXT_RSA_RC4_128_SHA, 250 SSL3_TXT_RSA_RC4_128_SHA,
164 SSL3_CK_RSA_RC4_128_SHA, 251 SSL3_CK_RSA_RC4_128_SHA,
165 SSL_kRSA|SSL_aRSA|SSL_RC4 |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3|SSL_MEDIUM, 252 SSL_kRSA|SSL_aRSA|SSL_RC4 |SSL_SHA1|SSL_SSLV3,
253 SSL_NOT_EXP|SSL_MEDIUM,
166 0, 254 0,
255 128,
256 128,
167 SSL_ALL_CIPHERS, 257 SSL_ALL_CIPHERS,
258 SSL_ALL_STRENGTHS,
168 }, 259 },
169/* Cipher 06 */ 260/* Cipher 06 */
170 { 261 {
171 1, 262 1,
172 SSL3_TXT_RSA_RC2_40_MD5, 263 SSL3_TXT_RSA_RC2_40_MD5,
173 SSL3_CK_RSA_RC2_40_MD5, 264 SSL3_CK_RSA_RC2_40_MD5,
174 SSL_kRSA|SSL_aRSA|SSL_RC2 |SSL_MD5 |SSL_EXP|SSL_SSLV3, 265 SSL_kRSA|SSL_aRSA|SSL_RC2 |SSL_MD5 |SSL_SSLV3,
266 SSL_EXPORT|SSL_EXP40,
175 0, 267 0,
268 40,
269 128,
176 SSL_ALL_CIPHERS, 270 SSL_ALL_CIPHERS,
271 SSL_ALL_STRENGTHS,
177 }, 272 },
178/* Cipher 07 */ 273/* Cipher 07 */
179 { 274 {
180 1, 275 1,
181 SSL3_TXT_RSA_IDEA_128_SHA, 276 SSL3_TXT_RSA_IDEA_128_SHA,
182 SSL3_CK_RSA_IDEA_128_SHA, 277 SSL3_CK_RSA_IDEA_128_SHA,
183 SSL_kRSA|SSL_aRSA|SSL_IDEA |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3|SSL_MEDIUM, 278 SSL_kRSA|SSL_aRSA|SSL_IDEA |SSL_SHA1|SSL_SSLV3,
279 SSL_NOT_EXP|SSL_MEDIUM,
184 0, 280 0,
281 128,
282 128,
185 SSL_ALL_CIPHERS, 283 SSL_ALL_CIPHERS,
284 SSL_ALL_STRENGTHS,
186 }, 285 },
187/* Cipher 08 */ 286/* Cipher 08 */
188 { 287 {
189 1, 288 1,
190 SSL3_TXT_RSA_DES_40_CBC_SHA, 289 SSL3_TXT_RSA_DES_40_CBC_SHA,
191 SSL3_CK_RSA_DES_40_CBC_SHA, 290 SSL3_CK_RSA_DES_40_CBC_SHA,
192 SSL_kRSA|SSL_aRSA|SSL_DES|SSL_SHA1|SSL_EXP|SSL_SSLV3, 291 SSL_kRSA|SSL_aRSA|SSL_DES|SSL_SHA1|SSL_SSLV3,
292 SSL_EXPORT|SSL_EXP40,
193 0, 293 0,
294 40,
295 56,
194 SSL_ALL_CIPHERS, 296 SSL_ALL_CIPHERS,
297 SSL_ALL_STRENGTHS,
195 }, 298 },
196/* Cipher 09 */ 299/* Cipher 09 */
197 { 300 {
198 1, 301 1,
199 SSL3_TXT_RSA_DES_64_CBC_SHA, 302 SSL3_TXT_RSA_DES_64_CBC_SHA,
200 SSL3_CK_RSA_DES_64_CBC_SHA, 303 SSL3_CK_RSA_DES_64_CBC_SHA,
201 SSL_kRSA|SSL_aRSA|SSL_DES |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3|SSL_LOW, 304 SSL_kRSA|SSL_aRSA|SSL_DES |SSL_SHA1|SSL_SSLV3,
305 SSL_NOT_EXP|SSL_LOW,
202 0, 306 0,
307 56,
308 56,
203 SSL_ALL_CIPHERS, 309 SSL_ALL_CIPHERS,
310 SSL_ALL_STRENGTHS,
204 }, 311 },
205/* Cipher 0A */ 312/* Cipher 0A */
206 { 313 {
207 1, 314 1,
208 SSL3_TXT_RSA_DES_192_CBC3_SHA, 315 SSL3_TXT_RSA_DES_192_CBC3_SHA,
209 SSL3_CK_RSA_DES_192_CBC3_SHA, 316 SSL3_CK_RSA_DES_192_CBC3_SHA,
210 SSL_kRSA|SSL_aRSA|SSL_3DES |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3|SSL_HIGH, 317 SSL_kRSA|SSL_aRSA|SSL_3DES |SSL_SHA1|SSL_SSLV3,
318 SSL_NOT_EXP|SSL_HIGH,
211 0, 319 0,
320 168,
321 168,
212 SSL_ALL_CIPHERS, 322 SSL_ALL_CIPHERS,
323 SSL_ALL_STRENGTHS,
213 }, 324 },
214 325
215/* The DH ciphers */ 326/* The DH ciphers */
@@ -218,54 +329,78 @@ SSL_CIPHER ssl3_ciphers[]={
218 0, 329 0,
219 SSL3_TXT_DH_DSS_DES_40_CBC_SHA, 330 SSL3_TXT_DH_DSS_DES_40_CBC_SHA,
220 SSL3_CK_DH_DSS_DES_40_CBC_SHA, 331 SSL3_CK_DH_DSS_DES_40_CBC_SHA,
221 SSL_kDHd |SSL_aDH|SSL_DES|SSL_SHA1|SSL_EXP|SSL_SSLV3, 332 SSL_kDHd |SSL_aDH|SSL_DES|SSL_SHA1|SSL_SSLV3,
333 SSL_EXPORT|SSL_EXP40,
222 0, 334 0,
335 40,
336 56,
223 SSL_ALL_CIPHERS, 337 SSL_ALL_CIPHERS,
338 SSL_ALL_STRENGTHS,
224 }, 339 },
225/* Cipher 0C */ 340/* Cipher 0C */
226 { 341 {
227 0, 342 0,
228 SSL3_TXT_DH_DSS_DES_64_CBC_SHA, 343 SSL3_TXT_DH_DSS_DES_64_CBC_SHA,
229 SSL3_CK_DH_DSS_DES_64_CBC_SHA, 344 SSL3_CK_DH_DSS_DES_64_CBC_SHA,
230 SSL_kDHd |SSL_aDH|SSL_DES |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3|SSL_LOW, 345 SSL_kDHd |SSL_aDH|SSL_DES |SSL_SHA1|SSL_SSLV3,
346 SSL_NOT_EXP|SSL_LOW,
231 0, 347 0,
348 56,
349 56,
232 SSL_ALL_CIPHERS, 350 SSL_ALL_CIPHERS,
351 SSL_ALL_STRENGTHS,
233 }, 352 },
234/* Cipher 0D */ 353/* Cipher 0D */
235 { 354 {
236 0, 355 0,
237 SSL3_TXT_DH_DSS_DES_192_CBC3_SHA, 356 SSL3_TXT_DH_DSS_DES_192_CBC3_SHA,
238 SSL3_CK_DH_DSS_DES_192_CBC3_SHA, 357 SSL3_CK_DH_DSS_DES_192_CBC3_SHA,
239 SSL_kDHd |SSL_aDH|SSL_3DES |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3|SSL_HIGH, 358 SSL_kDHd |SSL_aDH|SSL_3DES |SSL_SHA1|SSL_SSLV3,
359 SSL_NOT_EXP|SSL_HIGH,
240 0, 360 0,
361 168,
362 168,
241 SSL_ALL_CIPHERS, 363 SSL_ALL_CIPHERS,
364 SSL_ALL_STRENGTHS,
242 }, 365 },
243/* Cipher 0E */ 366/* Cipher 0E */
244 { 367 {
245 0, 368 0,
246 SSL3_TXT_DH_RSA_DES_40_CBC_SHA, 369 SSL3_TXT_DH_RSA_DES_40_CBC_SHA,
247 SSL3_CK_DH_RSA_DES_40_CBC_SHA, 370 SSL3_CK_DH_RSA_DES_40_CBC_SHA,
248 SSL_kDHr |SSL_aDH|SSL_DES|SSL_SHA1|SSL_EXP|SSL_SSLV3, 371 SSL_kDHr |SSL_aDH|SSL_DES|SSL_SHA1|SSL_SSLV3,
372 SSL_EXPORT|SSL_EXP40,
249 0, 373 0,
374 40,
375 56,
250 SSL_ALL_CIPHERS, 376 SSL_ALL_CIPHERS,
377 SSL_ALL_STRENGTHS,
251 }, 378 },
252/* Cipher 0F */ 379/* Cipher 0F */
253 { 380 {
254 0, 381 0,
255 SSL3_TXT_DH_RSA_DES_64_CBC_SHA, 382 SSL3_TXT_DH_RSA_DES_64_CBC_SHA,
256 SSL3_CK_DH_RSA_DES_64_CBC_SHA, 383 SSL3_CK_DH_RSA_DES_64_CBC_SHA,
257 SSL_kDHr |SSL_aDH|SSL_DES |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3|SSL_LOW, 384 SSL_kDHr |SSL_aDH|SSL_DES |SSL_SHA1|SSL_SSLV3,
385 SSL_NOT_EXP|SSL_LOW,
258 0, 386 0,
387 56,
388 56,
259 SSL_ALL_CIPHERS, 389 SSL_ALL_CIPHERS,
390 SSL_ALL_STRENGTHS,
260 }, 391 },
261/* Cipher 10 */ 392/* Cipher 10 */
262 { 393 {
263 0, 394 0,
264 SSL3_TXT_DH_RSA_DES_192_CBC3_SHA, 395 SSL3_TXT_DH_RSA_DES_192_CBC3_SHA,
265 SSL3_CK_DH_RSA_DES_192_CBC3_SHA, 396 SSL3_CK_DH_RSA_DES_192_CBC3_SHA,
266 SSL_kDHr |SSL_aDH|SSL_3DES |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3|SSL_HIGH, 397 SSL_kDHr |SSL_aDH|SSL_3DES |SSL_SHA1|SSL_SSLV3,
398 SSL_NOT_EXP|SSL_HIGH,
267 0, 399 0,
400 168,
401 168,
268 SSL_ALL_CIPHERS, 402 SSL_ALL_CIPHERS,
403 SSL_ALL_STRENGTHS,
269 }, 404 },
270 405
271/* The Ephemeral DH ciphers */ 406/* The Ephemeral DH ciphers */
@@ -274,54 +409,78 @@ SSL_CIPHER ssl3_ciphers[]={
274 1, 409 1,
275 SSL3_TXT_EDH_DSS_DES_40_CBC_SHA, 410 SSL3_TXT_EDH_DSS_DES_40_CBC_SHA,
276 SSL3_CK_EDH_DSS_DES_40_CBC_SHA, 411 SSL3_CK_EDH_DSS_DES_40_CBC_SHA,
277 SSL_kEDH|SSL_aDSS|SSL_DES|SSL_SHA1|SSL_EXP|SSL_SSLV3, 412 SSL_kEDH|SSL_aDSS|SSL_DES|SSL_SHA1|SSL_SSLV3,
413 SSL_EXPORT|SSL_EXP40,
278 0, 414 0,
415 40,
416 56,
279 SSL_ALL_CIPHERS, 417 SSL_ALL_CIPHERS,
418 SSL_ALL_STRENGTHS,
280 }, 419 },
281/* Cipher 12 */ 420/* Cipher 12 */
282 { 421 {
283 1, 422 1,
284 SSL3_TXT_EDH_DSS_DES_64_CBC_SHA, 423 SSL3_TXT_EDH_DSS_DES_64_CBC_SHA,
285 SSL3_CK_EDH_DSS_DES_64_CBC_SHA, 424 SSL3_CK_EDH_DSS_DES_64_CBC_SHA,
286 SSL_kEDH|SSL_aDSS|SSL_DES |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3|SSL_LOW, 425 SSL_kEDH|SSL_aDSS|SSL_DES |SSL_SHA1|SSL_SSLV3,
426 SSL_NOT_EXP|SSL_LOW,
287 0, 427 0,
428 56,
429 56,
288 SSL_ALL_CIPHERS, 430 SSL_ALL_CIPHERS,
431 SSL_ALL_STRENGTHS,
289 }, 432 },
290/* Cipher 13 */ 433/* Cipher 13 */
291 { 434 {
292 1, 435 1,
293 SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA, 436 SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA,
294 SSL3_CK_EDH_DSS_DES_192_CBC3_SHA, 437 SSL3_CK_EDH_DSS_DES_192_CBC3_SHA,
295 SSL_kEDH|SSL_aDSS|SSL_3DES |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3|SSL_HIGH, 438 SSL_kEDH|SSL_aDSS|SSL_3DES |SSL_SHA1|SSL_SSLV3,
439 SSL_NOT_EXP|SSL_HIGH,
296 0, 440 0,
441 168,
442 168,
297 SSL_ALL_CIPHERS, 443 SSL_ALL_CIPHERS,
444 SSL_ALL_STRENGTHS,
298 }, 445 },
299/* Cipher 14 */ 446/* Cipher 14 */
300 { 447 {
301 1, 448 1,
302 SSL3_TXT_EDH_RSA_DES_40_CBC_SHA, 449 SSL3_TXT_EDH_RSA_DES_40_CBC_SHA,
303 SSL3_CK_EDH_RSA_DES_40_CBC_SHA, 450 SSL3_CK_EDH_RSA_DES_40_CBC_SHA,
304 SSL_kEDH|SSL_aRSA|SSL_DES|SSL_SHA1|SSL_EXP|SSL_SSLV3, 451 SSL_kEDH|SSL_aRSA|SSL_DES|SSL_SHA1|SSL_SSLV3,
452 SSL_EXPORT|SSL_EXP40,
305 0, 453 0,
454 40,
455 56,
306 SSL_ALL_CIPHERS, 456 SSL_ALL_CIPHERS,
457 SSL_ALL_STRENGTHS,
307 }, 458 },
308/* Cipher 15 */ 459/* Cipher 15 */
309 { 460 {
310 1, 461 1,
311 SSL3_TXT_EDH_RSA_DES_64_CBC_SHA, 462 SSL3_TXT_EDH_RSA_DES_64_CBC_SHA,
312 SSL3_CK_EDH_RSA_DES_64_CBC_SHA, 463 SSL3_CK_EDH_RSA_DES_64_CBC_SHA,
313 SSL_kEDH|SSL_aRSA|SSL_DES |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3|SSL_LOW, 464 SSL_kEDH|SSL_aRSA|SSL_DES |SSL_SHA1|SSL_SSLV3,
465 SSL_NOT_EXP|SSL_LOW,
314 0, 466 0,
467 56,
468 56,
315 SSL_ALL_CIPHERS, 469 SSL_ALL_CIPHERS,
470 SSL_ALL_STRENGTHS,
316 }, 471 },
317/* Cipher 16 */ 472/* Cipher 16 */
318 { 473 {
319 1, 474 1,
320 SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA, 475 SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA,
321 SSL3_CK_EDH_RSA_DES_192_CBC3_SHA, 476 SSL3_CK_EDH_RSA_DES_192_CBC3_SHA,
322 SSL_kEDH|SSL_aRSA|SSL_3DES |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3|SSL_HIGH, 477 SSL_kEDH|SSL_aRSA|SSL_3DES |SSL_SHA1|SSL_SSLV3,
478 SSL_NOT_EXP|SSL_HIGH,
323 0, 479 0,
480 168,
481 168,
324 SSL_ALL_CIPHERS, 482 SSL_ALL_CIPHERS,
483 SSL_ALL_STRENGTHS,
325 }, 484 },
326 485
327/* Fortezza */ 486/* Fortezza */
@@ -330,9 +489,13 @@ SSL_CIPHER ssl3_ciphers[]={
330 0, 489 0,
331 SSL3_TXT_FZA_DMS_NULL_SHA, 490 SSL3_TXT_FZA_DMS_NULL_SHA,
332 SSL3_CK_FZA_DMS_NULL_SHA, 491 SSL3_CK_FZA_DMS_NULL_SHA,
333 SSL_kFZA|SSL_aFZA |SSL_eNULL |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3, 492 SSL_kFZA|SSL_aFZA |SSL_eNULL |SSL_SHA1|SSL_SSLV3,
493 SSL_NOT_EXP,
494 0,
495 0,
334 0, 496 0,
335 SSL_ALL_CIPHERS, 497 SSL_ALL_CIPHERS,
498 SSL_ALL_STRENGTHS,
336 }, 499 },
337 500
338/* Cipher 1D */ 501/* Cipher 1D */
@@ -340,9 +503,13 @@ SSL_CIPHER ssl3_ciphers[]={
340 0, 503 0,
341 SSL3_TXT_FZA_DMS_FZA_SHA, 504 SSL3_TXT_FZA_DMS_FZA_SHA,
342 SSL3_CK_FZA_DMS_FZA_SHA, 505 SSL3_CK_FZA_DMS_FZA_SHA,
343 SSL_kFZA|SSL_aFZA |SSL_eFZA |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3, 506 SSL_kFZA|SSL_aFZA |SSL_eFZA |SSL_SHA1|SSL_SSLV3,
507 SSL_NOT_EXP,
508 0,
509 0,
344 0, 510 0,
345 SSL_ALL_CIPHERS, 511 SSL_ALL_CIPHERS,
512 SSL_ALL_STRENGTHS,
346 }, 513 },
347 514
348/* Cipher 1E */ 515/* Cipher 1E */
@@ -350,10 +517,359 @@ SSL_CIPHER ssl3_ciphers[]={
350 0, 517 0,
351 SSL3_TXT_FZA_DMS_RC4_SHA, 518 SSL3_TXT_FZA_DMS_RC4_SHA,
352 SSL3_CK_FZA_DMS_RC4_SHA, 519 SSL3_CK_FZA_DMS_RC4_SHA,
353 SSL_kFZA|SSL_aFZA |SSL_RC4 |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3, 520 SSL_kFZA|SSL_aFZA |SSL_RC4 |SSL_SHA1|SSL_SSLV3,
521 SSL_NOT_EXP|SSL_MEDIUM,
522 0,
523 128,
524 128,
525 SSL_ALL_CIPHERS,
526 SSL_ALL_STRENGTHS,
527 },
528
529#ifndef OPENSSL_NO_KRB5
530/* The Kerberos ciphers
531** 20000107 VRS: And the first shall be last,
532** in hopes of avoiding the lynx ssl renegotiation problem.
533*/
534/* Cipher 21 VRS */
535 {
536 1,
537 SSL3_TXT_KRB5_DES_40_CBC_SHA,
538 SSL3_CK_KRB5_DES_40_CBC_SHA,
539 SSL_kKRB5|SSL_aKRB5| SSL_DES|SSL_SHA1 |SSL_SSLV3,
540 SSL_EXPORT|SSL_EXP40,
541 0,
542 40,
543 56,
544 SSL_ALL_CIPHERS,
545 SSL_ALL_STRENGTHS,
546 },
547
548/* Cipher 22 VRS */
549 {
550 1,
551 SSL3_TXT_KRB5_DES_40_CBC_MD5,
552 SSL3_CK_KRB5_DES_40_CBC_MD5,
553 SSL_kKRB5|SSL_aKRB5| SSL_DES|SSL_MD5 |SSL_SSLV3,
554 SSL_EXPORT|SSL_EXP40,
555 0,
556 40,
557 56,
558 SSL_ALL_CIPHERS,
559 SSL_ALL_STRENGTHS,
560 },
561
562/* Cipher 23 VRS */
563 {
564 1,
565 SSL3_TXT_KRB5_DES_64_CBC_SHA,
566 SSL3_CK_KRB5_DES_64_CBC_SHA,
567 SSL_kKRB5|SSL_aKRB5| SSL_DES|SSL_SHA1 |SSL_SSLV3,
568 SSL_NOT_EXP|SSL_LOW,
569 0,
570 56,
571 56,
572 SSL_ALL_CIPHERS,
573 SSL_ALL_STRENGTHS,
574 },
575
576/* Cipher 24 VRS */
577 {
578 1,
579 SSL3_TXT_KRB5_DES_64_CBC_MD5,
580 SSL3_CK_KRB5_DES_64_CBC_MD5,
581 SSL_kKRB5|SSL_aKRB5| SSL_DES|SSL_MD5 |SSL_SSLV3,
582 SSL_NOT_EXP|SSL_LOW,
583 0,
584 56,
585 56,
586 SSL_ALL_CIPHERS,
587 SSL_ALL_STRENGTHS,
588 },
589
590/* Cipher 25 VRS */
591 {
592 1,
593 SSL3_TXT_KRB5_DES_192_CBC3_SHA,
594 SSL3_CK_KRB5_DES_192_CBC3_SHA,
595 SSL_kKRB5|SSL_aKRB5| SSL_3DES|SSL_SHA1 |SSL_SSLV3,
596 SSL_NOT_EXP|SSL_HIGH,
597 0,
598 112,
599 168,
600 SSL_ALL_CIPHERS,
601 SSL_ALL_STRENGTHS,
602 },
603
604/* Cipher 26 VRS */
605 {
606 1,
607 SSL3_TXT_KRB5_DES_192_CBC3_MD5,
608 SSL3_CK_KRB5_DES_192_CBC3_MD5,
609 SSL_kKRB5|SSL_aKRB5| SSL_3DES|SSL_MD5 |SSL_SSLV3,
610 SSL_NOT_EXP|SSL_HIGH,
354 0, 611 0,
612 112,
613 168,
355 SSL_ALL_CIPHERS, 614 SSL_ALL_CIPHERS,
615 SSL_ALL_STRENGTHS,
356 }, 616 },
617#endif /* OPENSSL_NO_KRB5 */
618
619
620#if TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES
621 /* New TLS Export CipherSuites */
622 /* Cipher 60 */
623 {
624 1,
625 TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_MD5,
626 TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_MD5,
627 SSL_kRSA|SSL_aRSA|SSL_RC4|SSL_MD5|SSL_TLSV1,
628 SSL_EXPORT|SSL_EXP56,
629 0,
630 56,
631 128,
632 SSL_ALL_CIPHERS,
633 SSL_ALL_STRENGTHS,
634 },
635 /* Cipher 61 */
636 {
637 1,
638 TLS1_TXT_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5,
639 TLS1_CK_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5,
640 SSL_kRSA|SSL_aRSA|SSL_RC2|SSL_MD5|SSL_TLSV1,
641 SSL_EXPORT|SSL_EXP56,
642 0,
643 56,
644 128,
645 SSL_ALL_CIPHERS,
646 SSL_ALL_STRENGTHS,
647 },
648 /* Cipher 62 */
649 {
650 1,
651 TLS1_TXT_RSA_EXPORT1024_WITH_DES_CBC_SHA,
652 TLS1_CK_RSA_EXPORT1024_WITH_DES_CBC_SHA,
653 SSL_kRSA|SSL_aRSA|SSL_DES|SSL_SHA|SSL_TLSV1,
654 SSL_EXPORT|SSL_EXP56,
655 0,
656 56,
657 56,
658 SSL_ALL_CIPHERS,
659 SSL_ALL_STRENGTHS,
660 },
661 /* Cipher 63 */
662 {
663 1,
664 TLS1_TXT_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA,
665 TLS1_CK_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA,
666 SSL_kEDH|SSL_aDSS|SSL_DES|SSL_SHA|SSL_TLSV1,
667 SSL_EXPORT|SSL_EXP56,
668 0,
669 56,
670 56,
671 SSL_ALL_CIPHERS,
672 SSL_ALL_STRENGTHS,
673 },
674 /* Cipher 64 */
675 {
676 1,
677 TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_SHA,
678 TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_SHA,
679 SSL_kRSA|SSL_aRSA|SSL_RC4|SSL_SHA|SSL_TLSV1,
680 SSL_EXPORT|SSL_EXP56,
681 0,
682 56,
683 128,
684 SSL_ALL_CIPHERS,
685 SSL_ALL_STRENGTHS,
686 },
687 /* Cipher 65 */
688 {
689 1,
690 TLS1_TXT_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA,
691 TLS1_CK_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA,
692 SSL_kEDH|SSL_aDSS|SSL_RC4|SSL_SHA|SSL_TLSV1,
693 SSL_EXPORT|SSL_EXP56,
694 0,
695 56,
696 128,
697 SSL_ALL_CIPHERS,
698 SSL_ALL_STRENGTHS,
699 },
700 /* Cipher 66 */
701 {
702 1,
703 TLS1_TXT_DHE_DSS_WITH_RC4_128_SHA,
704 TLS1_CK_DHE_DSS_WITH_RC4_128_SHA,
705 SSL_kEDH|SSL_aDSS|SSL_RC4|SSL_SHA|SSL_TLSV1,
706 SSL_NOT_EXP|SSL_MEDIUM,
707 0,
708 128,
709 128,
710 SSL_ALL_CIPHERS,
711 SSL_ALL_STRENGTHS
712 },
713#endif
714 /* New AES ciphersuites */
715
716 /* Cipher 2F */
717 {
718 1,
719 TLS1_TXT_RSA_WITH_AES_128_SHA,
720 TLS1_CK_RSA_WITH_AES_128_SHA,
721 SSL_kRSA|SSL_aRSA|SSL_AES|SSL_SHA |SSL_TLSV1,
722 SSL_NOT_EXP|SSL_MEDIUM,
723 0,
724 128,
725 128,
726 SSL_ALL_CIPHERS,
727 SSL_ALL_STRENGTHS,
728 },
729 /* Cipher 30 */
730 {
731 0,
732 TLS1_TXT_DH_DSS_WITH_AES_128_SHA,
733 TLS1_CK_DH_DSS_WITH_AES_128_SHA,
734 SSL_kDHd|SSL_aDH|SSL_AES|SSL_SHA|SSL_TLSV1,
735 SSL_NOT_EXP|SSL_MEDIUM,
736 0,
737 128,
738 128,
739 SSL_ALL_CIPHERS,
740 SSL_ALL_STRENGTHS,
741 },
742 /* Cipher 31 */
743 {
744 0,
745 TLS1_TXT_DH_RSA_WITH_AES_128_SHA,
746 TLS1_CK_DH_RSA_WITH_AES_128_SHA,
747 SSL_kDHr|SSL_aDH|SSL_AES|SSL_SHA|SSL_TLSV1,
748 SSL_NOT_EXP|SSL_MEDIUM,
749 0,
750 128,
751 128,
752 SSL_ALL_CIPHERS,
753 SSL_ALL_STRENGTHS,
754 },
755 /* Cipher 32 */
756 {
757 1,
758 TLS1_TXT_DHE_DSS_WITH_AES_128_SHA,
759 TLS1_CK_DHE_DSS_WITH_AES_128_SHA,
760 SSL_kEDH|SSL_aDSS|SSL_AES|SSL_SHA|SSL_TLSV1,
761 SSL_NOT_EXP|SSL_MEDIUM,
762 0,
763 128,
764 128,
765 SSL_ALL_CIPHERS,
766 SSL_ALL_STRENGTHS,
767 },
768 /* Cipher 33 */
769 {
770 1,
771 TLS1_TXT_DHE_RSA_WITH_AES_128_SHA,
772 TLS1_CK_DHE_RSA_WITH_AES_128_SHA,
773 SSL_kEDH|SSL_aRSA|SSL_AES|SSL_SHA|SSL_TLSV1,
774 SSL_NOT_EXP|SSL_MEDIUM,
775 0,
776 128,
777 128,
778 SSL_ALL_CIPHERS,
779 SSL_ALL_STRENGTHS,
780 },
781 /* Cipher 34 */
782 {
783 1,
784 TLS1_TXT_ADH_WITH_AES_128_SHA,
785 TLS1_CK_ADH_WITH_AES_128_SHA,
786 SSL_kEDH|SSL_aNULL|SSL_AES|SSL_SHA|SSL_TLSV1,
787 SSL_NOT_EXP|SSL_MEDIUM,
788 0,
789 128,
790 128,
791 SSL_ALL_CIPHERS,
792 SSL_ALL_STRENGTHS,
793 },
794
795 /* Cipher 35 */
796 {
797 1,
798 TLS1_TXT_RSA_WITH_AES_256_SHA,
799 TLS1_CK_RSA_WITH_AES_256_SHA,
800 SSL_kRSA|SSL_aRSA|SSL_AES|SSL_SHA |SSL_TLSV1,
801 SSL_NOT_EXP|SSL_HIGH,
802 0,
803 256,
804 256,
805 SSL_ALL_CIPHERS,
806 SSL_ALL_STRENGTHS,
807 },
808 /* Cipher 36 */
809 {
810 0,
811 TLS1_TXT_DH_DSS_WITH_AES_256_SHA,
812 TLS1_CK_DH_DSS_WITH_AES_256_SHA,
813 SSL_kDHd|SSL_aDH|SSL_AES|SSL_SHA|SSL_TLSV1,
814 SSL_NOT_EXP|SSL_HIGH,
815 0,
816 256,
817 256,
818 SSL_ALL_CIPHERS,
819 SSL_ALL_STRENGTHS,
820 },
821 /* Cipher 37 */
822 {
823 0,
824 TLS1_TXT_DH_RSA_WITH_AES_256_SHA,
825 TLS1_CK_DH_RSA_WITH_AES_256_SHA,
826 SSL_kDHr|SSL_aDH|SSL_AES|SSL_SHA|SSL_TLSV1,
827 SSL_NOT_EXP|SSL_HIGH,
828 0,
829 256,
830 256,
831 SSL_ALL_CIPHERS,
832 SSL_ALL_STRENGTHS,
833 },
834 /* Cipher 38 */
835 {
836 1,
837 TLS1_TXT_DHE_DSS_WITH_AES_256_SHA,
838 TLS1_CK_DHE_DSS_WITH_AES_256_SHA,
839 SSL_kEDH|SSL_aDSS|SSL_AES|SSL_SHA|SSL_TLSV1,
840 SSL_NOT_EXP|SSL_HIGH,
841 0,
842 256,
843 256,
844 SSL_ALL_CIPHERS,
845 SSL_ALL_STRENGTHS,
846 },
847 /* Cipher 39 */
848 {
849 1,
850 TLS1_TXT_DHE_RSA_WITH_AES_256_SHA,
851 TLS1_CK_DHE_RSA_WITH_AES_256_SHA,
852 SSL_kEDH|SSL_aRSA|SSL_AES|SSL_SHA|SSL_TLSV1,
853 SSL_NOT_EXP|SSL_HIGH,
854 0,
855 256,
856 256,
857 SSL_ALL_CIPHERS,
858 SSL_ALL_STRENGTHS,
859 },
860 /* Cipher 3A */
861 {
862 1,
863 TLS1_TXT_ADH_WITH_AES_256_SHA,
864 TLS1_CK_ADH_WITH_AES_256_SHA,
865 SSL_kEDH|SSL_aNULL|SSL_AES|SSL_SHA|SSL_TLSV1,
866 SSL_NOT_EXP|SSL_HIGH,
867 0,
868 256,
869 256,
870 SSL_ALL_CIPHERS,
871 SSL_ALL_STRENGTHS,
872 },
357 873
358/* end of list */ 874/* end of list */
359 }; 875 };
@@ -384,6 +900,7 @@ static SSL_METHOD SSLv3_data= {
384 ssl3_write, 900 ssl3_write,
385 ssl3_shutdown, 901 ssl3_shutdown,
386 ssl3_renegotiate, 902 ssl3_renegotiate,
903 ssl3_renegotiate_check,
387 ssl3_ctrl, 904 ssl3_ctrl,
388 ssl3_ctx_ctrl, 905 ssl3_ctx_ctrl,
389 ssl3_get_cipher_by_char, 906 ssl3_get_cipher_by_char,
@@ -394,27 +911,29 @@ static SSL_METHOD SSLv3_data= {
394 ssl_bad_method, 911 ssl_bad_method,
395 ssl3_default_timeout, 912 ssl3_default_timeout,
396 &SSLv3_enc_data, 913 &SSLv3_enc_data,
914 ssl_undefined_function,
915 ssl3_callback_ctrl,
916 ssl3_ctx_callback_ctrl,
397 }; 917 };
398 918
399static long ssl3_default_timeout() 919static long ssl3_default_timeout(void)
400 { 920 {
401 /* 2 hours, the 24 hours mentioned in the SSLv3 spec 921 /* 2 hours, the 24 hours mentioned in the SSLv3 spec
402 * is way too long for http, the cache would over fill */ 922 * is way too long for http, the cache would over fill */
403 return(60*60*2); 923 return(60*60*2);
404 } 924 }
405 925
406SSL_METHOD *sslv3_base_method() 926SSL_METHOD *sslv3_base_method(void)
407 { 927 {
408 return(&SSLv3_data); 928 return(&SSLv3_data);
409 } 929 }
410 930
411int ssl3_num_ciphers() 931int ssl3_num_ciphers(void)
412 { 932 {
413 return(SSL3_NUM_CIPHERS); 933 return(SSL3_NUM_CIPHERS);
414 } 934 }
415 935
416SSL_CIPHER *ssl3_get_cipher(u) 936SSL_CIPHER *ssl3_get_cipher(unsigned int u)
417unsigned int u;
418 { 937 {
419 if (u < SSL3_NUM_CIPHERS) 938 if (u < SSL3_NUM_CIPHERS)
420 return(&(ssl3_ciphers[SSL3_NUM_CIPHERS-1-u])); 939 return(&(ssl3_ciphers[SSL3_NUM_CIPHERS-1-u]));
@@ -422,29 +941,24 @@ unsigned int u;
422 return(NULL); 941 return(NULL);
423 } 942 }
424 943
425/* The problem is that it may not be the correct record type */ 944int ssl3_pending(SSL *s)
426int ssl3_pending(s)
427SSL *s;
428 { 945 {
429 return(s->s3->rrec.length); 946 if (s->rstate == SSL_ST_READ_BODY)
947 return 0;
948
949 return (s->s3->rrec.type == SSL3_RT_APPLICATION_DATA) ? s->s3->rrec.length : 0;
430 } 950 }
431 951
432int ssl3_new(s) 952int ssl3_new(SSL *s)
433SSL *s;
434 { 953 {
435 SSL3_CTX *s3; 954 SSL3_STATE *s3;
436 955
437 if ((s3=(SSL3_CTX *)Malloc(sizeof(SSL3_CTX))) == NULL) goto err; 956 if ((s3=OPENSSL_malloc(sizeof *s3)) == NULL) goto err;
438 memset(s3,0,sizeof(SSL3_CTX)); 957 memset(s3,0,sizeof *s3);
958 EVP_MD_CTX_init(&s3->finish_dgst1);
959 EVP_MD_CTX_init(&s3->finish_dgst2);
439 960
440 s->s3=s3; 961 s->s3=s3;
441 /*
442 s->s3->tmp.ca_names=NULL;
443 s->s3->tmp.key_block=NULL;
444 s->s3->tmp.key_block_length=0;
445 s->s3->rbuf.buf=NULL;
446 s->s3->wbuf.buf=NULL;
447 */
448 962
449 s->method->ssl_clear(s); 963 s->method->ssl_clear(s);
450 return(1); 964 return(1);
@@ -452,40 +966,66 @@ err:
452 return(0); 966 return(0);
453 } 967 }
454 968
455void ssl3_free(s) 969void ssl3_free(SSL *s)
456SSL *s;
457 { 970 {
971 if(s == NULL)
972 return;
973
458 ssl3_cleanup_key_block(s); 974 ssl3_cleanup_key_block(s);
459 if (s->s3->rbuf.buf != NULL) 975 if (s->s3->rbuf.buf != NULL)
460 Free(s->s3->rbuf.buf); 976 OPENSSL_free(s->s3->rbuf.buf);
461 if (s->s3->wbuf.buf != NULL) 977 if (s->s3->wbuf.buf != NULL)
462 Free(s->s3->wbuf.buf); 978 OPENSSL_free(s->s3->wbuf.buf);
463#ifndef NO_DH 979 if (s->s3->rrec.comp != NULL)
980 OPENSSL_free(s->s3->rrec.comp);
981#ifndef OPENSSL_NO_DH
464 if (s->s3->tmp.dh != NULL) 982 if (s->s3->tmp.dh != NULL)
465 DH_free(s->s3->tmp.dh); 983 DH_free(s->s3->tmp.dh);
466#endif 984#endif
467 if (s->s3->tmp.ca_names != NULL) 985 if (s->s3->tmp.ca_names != NULL)
468 sk_pop_free(s->s3->tmp.ca_names,X509_NAME_free); 986 sk_X509_NAME_pop_free(s->s3->tmp.ca_names,X509_NAME_free);
469 memset(s->s3,0,sizeof(SSL3_CTX)); 987 EVP_MD_CTX_cleanup(&s->s3->finish_dgst1);
470 Free(s->s3); 988 EVP_MD_CTX_cleanup(&s->s3->finish_dgst2);
989 memset(s->s3,0,sizeof *s->s3);
990 OPENSSL_free(s->s3);
471 s->s3=NULL; 991 s->s3=NULL;
472 } 992 }
473 993
474void ssl3_clear(s) 994void ssl3_clear(SSL *s)
475SSL *s;
476 { 995 {
477 unsigned char *rp,*wp; 996 unsigned char *rp,*wp;
997 size_t rlen, wlen;
478 998
479 ssl3_cleanup_key_block(s); 999 ssl3_cleanup_key_block(s);
480 if (s->s3->tmp.ca_names != NULL) 1000 if (s->s3->tmp.ca_names != NULL)
481 sk_pop_free(s->s3->tmp.ca_names,X509_NAME_free); 1001 sk_X509_NAME_pop_free(s->s3->tmp.ca_names,X509_NAME_free);
482 1002
483 rp=s->s3->rbuf.buf; 1003 if (s->s3->rrec.comp != NULL)
484 wp=s->s3->wbuf.buf; 1004 {
1005 OPENSSL_free(s->s3->rrec.comp);
1006 s->s3->rrec.comp=NULL;
1007 }
1008#ifndef OPENSSL_NO_DH
1009 if (s->s3->tmp.dh != NULL)
1010 DH_free(s->s3->tmp.dh);
1011#endif
1012
1013 rp = s->s3->rbuf.buf;
1014 wp = s->s3->wbuf.buf;
1015 rlen = s->s3->rbuf.len;
1016 wlen = s->s3->wbuf.len;
1017
1018 EVP_MD_CTX_cleanup(&s->s3->finish_dgst1);
1019 EVP_MD_CTX_cleanup(&s->s3->finish_dgst2);
1020
1021 memset(s->s3,0,sizeof *s->s3);
1022 s->s3->rbuf.buf = rp;
1023 s->s3->wbuf.buf = wp;
1024 s->s3->rbuf.len = rlen;
1025 s->s3->wbuf.len = wlen;
1026
1027 ssl_free_wbio_buffer(s);
485 1028
486 memset(s->s3,0,sizeof(SSL3_CTX));
487 if (rp != NULL) s->s3->rbuf.buf=rp;
488 if (wp != NULL) s->s3->wbuf.buf=wp;
489 s->packet_length=0; 1029 s->packet_length=0;
490 s->s3->renegotiate=0; 1030 s->s3->renegotiate=0;
491 s->s3->total_renegotiations=0; 1031 s->s3->total_renegotiations=0;
@@ -494,14 +1034,30 @@ SSL *s;
494 s->version=SSL3_VERSION; 1034 s->version=SSL3_VERSION;
495 } 1035 }
496 1036
497long ssl3_ctrl(s,cmd,larg,parg) 1037long ssl3_ctrl(SSL *s, int cmd, long larg, void *parg)
498SSL *s;
499int cmd;
500long larg;
501char *parg;
502 { 1038 {
503 int ret=0; 1039 int ret=0;
504 1040
1041#if !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_RSA)
1042 if (
1043#ifndef OPENSSL_NO_RSA
1044 cmd == SSL_CTRL_SET_TMP_RSA ||
1045 cmd == SSL_CTRL_SET_TMP_RSA_CB ||
1046#endif
1047#ifndef OPENSSL_NO_DSA
1048 cmd == SSL_CTRL_SET_TMP_DH ||
1049 cmd == SSL_CTRL_SET_TMP_DH_CB ||
1050#endif
1051 0)
1052 {
1053 if (!ssl_cert_inst(&s->cert))
1054 {
1055 SSLerr(SSL_F_SSL3_CTRL, ERR_R_MALLOC_FAILURE);
1056 return(0);
1057 }
1058 }
1059#endif
1060
505 switch (cmd) 1061 switch (cmd)
506 { 1062 {
507 case SSL_CTRL_GET_SESSION_REUSED: 1063 case SSL_CTRL_GET_SESSION_REUSED:
@@ -519,25 +1075,137 @@ char *parg;
519 case SSL_CTRL_GET_TOTAL_RENEGOTIATIONS: 1075 case SSL_CTRL_GET_TOTAL_RENEGOTIATIONS:
520 ret=s->s3->total_renegotiations; 1076 ret=s->s3->total_renegotiations;
521 break; 1077 break;
1078 case SSL_CTRL_GET_FLAGS:
1079 ret=(int)(s->s3->flags);
1080 break;
1081#ifndef OPENSSL_NO_RSA
1082 case SSL_CTRL_NEED_TMP_RSA:
1083 if ((s->cert != NULL) && (s->cert->rsa_tmp == NULL) &&
1084 ((s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL) ||
1085 (EVP_PKEY_size(s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey) > (512/8))))
1086 ret = 1;
1087 break;
1088 case SSL_CTRL_SET_TMP_RSA:
1089 {
1090 RSA *rsa = (RSA *)parg;
1091 if (rsa == NULL)
1092 {
1093 SSLerr(SSL_F_SSL3_CTRL, ERR_R_PASSED_NULL_PARAMETER);
1094 return(ret);
1095 }
1096 if ((rsa = RSAPrivateKey_dup(rsa)) == NULL)
1097 {
1098 SSLerr(SSL_F_SSL3_CTRL, ERR_R_RSA_LIB);
1099 return(ret);
1100 }
1101 if (s->cert->rsa_tmp != NULL)
1102 RSA_free(s->cert->rsa_tmp);
1103 s->cert->rsa_tmp = rsa;
1104 ret = 1;
1105 }
1106 break;
1107 case SSL_CTRL_SET_TMP_RSA_CB:
1108 {
1109 SSLerr(SSL_F_SSL3_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
1110 return(ret);
1111 }
1112 break;
1113#endif
1114#ifndef OPENSSL_NO_DH
1115 case SSL_CTRL_SET_TMP_DH:
1116 {
1117 DH *dh = (DH *)parg;
1118 if (dh == NULL)
1119 {
1120 SSLerr(SSL_F_SSL3_CTRL, ERR_R_PASSED_NULL_PARAMETER);
1121 return(ret);
1122 }
1123 if ((dh = DHparams_dup(dh)) == NULL)
1124 {
1125 SSLerr(SSL_F_SSL3_CTRL, ERR_R_DH_LIB);
1126 return(ret);
1127 }
1128 if (!(s->options & SSL_OP_SINGLE_DH_USE))
1129 {
1130 if (!DH_generate_key(dh))
1131 {
1132 DH_free(dh);
1133 SSLerr(SSL_F_SSL3_CTRL, ERR_R_DH_LIB);
1134 return(ret);
1135 }
1136 }
1137 if (s->cert->dh_tmp != NULL)
1138 DH_free(s->cert->dh_tmp);
1139 s->cert->dh_tmp = dh;
1140 ret = 1;
1141 }
1142 break;
1143 case SSL_CTRL_SET_TMP_DH_CB:
1144 {
1145 SSLerr(SSL_F_SSL3_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
1146 return(ret);
1147 }
1148 break;
1149#endif
522 default: 1150 default:
523 break; 1151 break;
524 } 1152 }
525 return(ret); 1153 return(ret);
526 } 1154 }
527 1155
528long ssl3_ctx_ctrl(ctx,cmd,larg,parg) 1156long ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)())
529SSL_CTX *ctx; 1157 {
530int cmd; 1158 int ret=0;
531long larg; 1159
532char *parg; 1160#if !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_RSA)
1161 if (
1162#ifndef OPENSSL_NO_RSA
1163 cmd == SSL_CTRL_SET_TMP_RSA_CB ||
1164#endif
1165#ifndef OPENSSL_NO_DSA
1166 cmd == SSL_CTRL_SET_TMP_DH_CB ||
1167#endif
1168 0)
1169 {
1170 if (!ssl_cert_inst(&s->cert))
1171 {
1172 SSLerr(SSL_F_SSL3_CALLBACK_CTRL, ERR_R_MALLOC_FAILURE);
1173 return(0);
1174 }
1175 }
1176#endif
1177
1178 switch (cmd)
1179 {
1180#ifndef OPENSSL_NO_RSA
1181 case SSL_CTRL_SET_TMP_RSA_CB:
1182 {
1183 s->cert->rsa_tmp_cb = (RSA *(*)(SSL *, int, int))fp;
1184 }
1185 break;
1186#endif
1187#ifndef OPENSSL_NO_DH
1188 case SSL_CTRL_SET_TMP_DH_CB:
1189 {
1190 s->cert->dh_tmp_cb = (DH *(*)(SSL *, int, int))fp;
1191 }
1192 break;
1193#endif
1194 default:
1195 break;
1196 }
1197 return(ret);
1198 }
1199
1200long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg)
533 { 1201 {
534 CERT *cert; 1202 CERT *cert;
535 1203
536 cert=ctx->default_cert; 1204 cert=ctx->cert;
537 1205
538 switch (cmd) 1206 switch (cmd)
539 { 1207 {
540#ifndef NO_RSA 1208#ifndef OPENSSL_NO_RSA
541 case SSL_CTRL_NEED_TMP_RSA: 1209 case SSL_CTRL_NEED_TMP_RSA:
542 if ( (cert->rsa_tmp == NULL) && 1210 if ( (cert->rsa_tmp == NULL) &&
543 ((cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL) || 1211 ((cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL) ||
@@ -546,7 +1214,7 @@ char *parg;
546 return(1); 1214 return(1);
547 else 1215 else
548 return(0); 1216 return(0);
549 break; 1217 /* break; */
550 case SSL_CTRL_SET_TMP_RSA: 1218 case SSL_CTRL_SET_TMP_RSA:
551 { 1219 {
552 RSA *rsa; 1220 RSA *rsa;
@@ -574,35 +1242,83 @@ char *parg;
574 return(1); 1242 return(1);
575 } 1243 }
576 } 1244 }
577 break; 1245 /* break; */
578 case SSL_CTRL_SET_TMP_RSA_CB: 1246 case SSL_CTRL_SET_TMP_RSA_CB:
579 cert->rsa_tmp_cb=(RSA *(*)())parg; 1247 {
1248 SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
1249 return(0);
1250 }
580 break; 1251 break;
581#endif 1252#endif
582#ifndef NO_DH 1253#ifndef OPENSSL_NO_DH
583 case SSL_CTRL_SET_TMP_DH: 1254 case SSL_CTRL_SET_TMP_DH:
584 { 1255 {
585 DH *new=NULL,*dh; 1256 DH *new=NULL,*dh;
586 1257
587 dh=(DH *)parg; 1258 dh=(DH *)parg;
588 if ( ((new=DHparams_dup(dh)) == NULL) || 1259 if ((new=DHparams_dup(dh)) == NULL)
589 (!DH_generate_key(new)))
590 { 1260 {
591 SSLerr(SSL_F_SSL3_CTX_CTRL,ERR_R_DH_LIB); 1261 SSLerr(SSL_F_SSL3_CTX_CTRL,ERR_R_DH_LIB);
592 if (new != NULL) DH_free(new); 1262 return 0;
593 return(0);
594 } 1263 }
595 else 1264 if (!(ctx->options & SSL_OP_SINGLE_DH_USE))
596 { 1265 {
597 if (cert->dh_tmp != NULL) 1266 if (!DH_generate_key(new))
598 DH_free(cert->dh_tmp); 1267 {
599 cert->dh_tmp=new; 1268 SSLerr(SSL_F_SSL3_CTX_CTRL,ERR_R_DH_LIB);
600 return(1); 1269 DH_free(new);
1270 return 0;
1271 }
601 } 1272 }
1273 if (cert->dh_tmp != NULL)
1274 DH_free(cert->dh_tmp);
1275 cert->dh_tmp=new;
1276 return 1;
1277 }
1278 /*break; */
1279 case SSL_CTRL_SET_TMP_DH_CB:
1280 {
1281 SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
1282 return(0);
602 } 1283 }
603 break; 1284 break;
1285#endif
1286 /* A Thawte special :-) */
1287 case SSL_CTRL_EXTRA_CHAIN_CERT:
1288 if (ctx->extra_certs == NULL)
1289 {
1290 if ((ctx->extra_certs=sk_X509_new_null()) == NULL)
1291 return(0);
1292 }
1293 sk_X509_push(ctx->extra_certs,(X509 *)parg);
1294 break;
1295
1296 default:
1297 return(0);
1298 }
1299 return(1);
1300 }
1301
1302long ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)())
1303 {
1304 CERT *cert;
1305
1306 cert=ctx->cert;
1307
1308 switch (cmd)
1309 {
1310#ifndef OPENSSL_NO_RSA
1311 case SSL_CTRL_SET_TMP_RSA_CB:
1312 {
1313 cert->rsa_tmp_cb = (RSA *(*)(SSL *, int, int))fp;
1314 }
1315 break;
1316#endif
1317#ifndef OPENSSL_NO_DH
604 case SSL_CTRL_SET_TMP_DH_CB: 1318 case SSL_CTRL_SET_TMP_DH_CB:
605 cert->dh_tmp_cb=(DH *(*)())parg; 1319 {
1320 cert->dh_tmp_cb = (DH *(*)(SSL *, int, int))fp;
1321 }
606 break; 1322 break;
607#endif 1323#endif
608 default: 1324 default:
@@ -613,8 +1329,7 @@ char *parg;
613 1329
614/* This function needs to check if the ciphers required are actually 1330/* This function needs to check if the ciphers required are actually
615 * available */ 1331 * available */
616SSL_CIPHER *ssl3_get_cipher_by_char(p) 1332SSL_CIPHER *ssl3_get_cipher_by_char(const unsigned char *p)
617unsigned char *p;
618 { 1333 {
619 static int init=1; 1334 static int init=1;
620 static SSL_CIPHER *sorted[SSL3_NUM_CIPHERS]; 1335 static SSL_CIPHER *sorted[SSL3_NUM_CIPHERS];
@@ -624,7 +1339,7 @@ unsigned char *p;
624 1339
625 if (init) 1340 if (init)
626 { 1341 {
627 init=0; 1342 CRYPTO_w_lock(CRYPTO_LOCK_SSL);
628 1343
629 for (i=0; i<SSL3_NUM_CIPHERS; i++) 1344 for (i=0; i<SSL3_NUM_CIPHERS; i++)
630 sorted[i]= &(ssl3_ciphers[i]); 1345 sorted[i]= &(ssl3_ciphers[i]);
@@ -632,6 +1347,10 @@ unsigned char *p;
632 qsort( (char *)sorted, 1347 qsort( (char *)sorted,
633 SSL3_NUM_CIPHERS,sizeof(SSL_CIPHER *), 1348 SSL3_NUM_CIPHERS,sizeof(SSL_CIPHER *),
634 FP_ICC ssl_cipher_ptr_id_cmp); 1349 FP_ICC ssl_cipher_ptr_id_cmp);
1350
1351 CRYPTO_w_unlock(CRYPTO_LOCK_SSL);
1352
1353 init=0;
635 } 1354 }
636 1355
637 id=0x03000000L|((unsigned long)p[0]<<8L)|(unsigned long)p[1]; 1356 id=0x03000000L|((unsigned long)p[0]<<8L)|(unsigned long)p[1];
@@ -639,16 +1358,14 @@ unsigned char *p;
639 cpp=(SSL_CIPHER **)OBJ_bsearch((char *)&cp, 1358 cpp=(SSL_CIPHER **)OBJ_bsearch((char *)&cp,
640 (char *)sorted, 1359 (char *)sorted,
641 SSL3_NUM_CIPHERS,sizeof(SSL_CIPHER *), 1360 SSL3_NUM_CIPHERS,sizeof(SSL_CIPHER *),
642 (int (*)())ssl_cipher_ptr_id_cmp); 1361 FP_ICC ssl_cipher_ptr_id_cmp);
643 if ((cpp == NULL) || !(*cpp)->valid) 1362 if ((cpp == NULL) || !(*cpp)->valid)
644 return(NULL); 1363 return(NULL);
645 else 1364 else
646 return(*cpp); 1365 return(*cpp);
647 } 1366 }
648 1367
649int ssl3_put_cipher_by_char(c,p) 1368int ssl3_put_cipher_by_char(const SSL_CIPHER *c, unsigned char *p)
650SSL_CIPHER *c;
651unsigned char *p;
652 { 1369 {
653 long l; 1370 long l;
654 1371
@@ -662,114 +1379,141 @@ unsigned char *p;
662 return(2); 1379 return(2);
663 } 1380 }
664 1381
665int ssl3_part_read(s,i) 1382SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt,
666SSL *s; 1383 STACK_OF(SSL_CIPHER) *srvr)
667int i;
668 {
669 s->rwstate=SSL_READING;
670
671 if (i < 0)
672 {
673 return(i);
674 }
675 else
676 {
677 s->init_num+=i;
678 return(0);
679 }
680 }
681
682SSL_CIPHER *ssl3_choose_cipher(s,have,pref)
683SSL *s;
684STACK *have,*pref;
685 { 1384 {
686 SSL_CIPHER *c,*ret=NULL; 1385 SSL_CIPHER *c,*ret=NULL;
1386 STACK_OF(SSL_CIPHER) *prio, *allow;
687 int i,j,ok; 1387 int i,j,ok;
688 CERT *cert; 1388 CERT *cert;
689 unsigned long alg,mask,emask; 1389 unsigned long alg,mask,emask;
690 1390
691 /* Lets see which ciphers we can supported */ 1391 /* Let's see which ciphers we can support */
692 if (s->cert != NULL) 1392 cert=s->cert;
693 cert=s->cert; 1393
1394#if 0
1395 /* Do not set the compare functions, because this may lead to a
1396 * reordering by "id". We want to keep the original ordering.
1397 * We may pay a price in performance during sk_SSL_CIPHER_find(),
1398 * but would have to pay with the price of sk_SSL_CIPHER_dup().
1399 */
1400 sk_SSL_CIPHER_set_cmp_func(srvr, ssl_cipher_ptr_id_cmp);
1401 sk_SSL_CIPHER_set_cmp_func(clnt, ssl_cipher_ptr_id_cmp);
1402#endif
1403
1404#ifdef CIPHER_DEBUG
1405 printf("Server has %d from %p:\n", sk_SSL_CIPHER_num(srvr), srvr);
1406 for(i=0 ; i < sk_SSL_CIPHER_num(srvr) ; ++i)
1407 {
1408 c=sk_SSL_CIPHER_value(srvr,i);
1409 printf("%p:%s\n",c,c->name);
1410 }
1411 printf("Client sent %d from %p:\n", sk_SSL_CIPHER_num(clnt), clnt);
1412 for(i=0 ; i < sk_SSL_CIPHER_num(clnt) ; ++i)
1413 {
1414 c=sk_SSL_CIPHER_value(clnt,i);
1415 printf("%p:%s\n",c,c->name);
1416 }
1417#endif
1418
1419 if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE)
1420 {
1421 prio = srvr;
1422 allow = clnt;
1423 }
694 else 1424 else
695 cert=s->ctx->default_cert; 1425 {
1426 prio = clnt;
1427 allow = srvr;
1428 }
1429
1430 for (i=0; i<sk_SSL_CIPHER_num(prio); i++)
1431 {
1432 c=sk_SSL_CIPHER_value(prio,i);
696 1433
697 ssl_set_cert_masks(cert); 1434 ssl_set_cert_masks(cert,c);
698 mask=cert->mask; 1435 mask=cert->mask;
699 emask=cert->export_mask; 1436 emask=cert->export_mask;
700 1437
701 sk_set_cmp_func(pref,ssl_cipher_ptr_id_cmp); 1438#ifdef KSSL_DEBUG
1439 printf("ssl3_choose_cipher %d alg= %lx\n", i,c->algorithms);
1440#endif /* KSSL_DEBUG */
702 1441
703 for (i=0; i<sk_num(have); i++)
704 {
705 c=(SSL_CIPHER *)sk_value(have,i);
706 alg=c->algorithms&(SSL_MKEY_MASK|SSL_AUTH_MASK); 1442 alg=c->algorithms&(SSL_MKEY_MASK|SSL_AUTH_MASK);
707 if (alg & SSL_EXPORT) 1443#ifndef OPENSSL_NO_KRB5
1444 if (alg & SSL_KRB5)
1445 {
1446 if ( !kssl_keytab_is_available(s->kssl_ctx) )
1447 continue;
1448 }
1449#endif /* OPENSSL_NO_KRB5 */
1450 if (SSL_C_IS_EXPORT(c))
708 { 1451 {
709 ok=((alg & emask) == alg)?1:0; 1452 ok=((alg & emask) == alg)?1:0;
710#ifdef CIPHER_DEBUG 1453#ifdef CIPHER_DEBUG
711 printf("%d:[%08lX:%08lX]%s\n",ok,alg,mask,c->name); 1454 printf("%d:[%08lX:%08lX]%p:%s (export)\n",ok,alg,emask,
1455 c,c->name);
712#endif 1456#endif
713 } 1457 }
714 else 1458 else
715 { 1459 {
716 ok=((alg & mask) == alg)?1:0; 1460 ok=((alg & mask) == alg)?1:0;
717#ifdef CIPHER_DEBUG 1461#ifdef CIPHER_DEBUG
718 printf("%d:[%08lX:%08lX]%s\n",ok,alg,mask,c->name); 1462 printf("%d:[%08lX:%08lX]%p:%s\n",ok,alg,mask,c,
1463 c->name);
719#endif 1464#endif
720 } 1465 }
721 1466
722 if (!ok) continue; 1467 if (!ok) continue;
723 1468
724 j=sk_find(pref,(char *)c); 1469 j=sk_SSL_CIPHER_find(allow,c);
725 if (j >= 0) 1470 if (j >= 0)
726 { 1471 {
727 ret=(SSL_CIPHER *)sk_value(pref,j); 1472 ret=sk_SSL_CIPHER_value(allow,j);
728 break; 1473 break;
729 } 1474 }
730 } 1475 }
731 return(ret); 1476 return(ret);
732 } 1477 }
733 1478
734int ssl3_get_req_cert_type(s,p) 1479int ssl3_get_req_cert_type(SSL *s, unsigned char *p)
735SSL *s;
736unsigned char *p;
737 { 1480 {
738 int ret=0; 1481 int ret=0;
739 unsigned long alg; 1482 unsigned long alg;
740 1483
741 alg=s->s3->tmp.new_cipher->algorithms; 1484 alg=s->s3->tmp.new_cipher->algorithms;
742 1485
743#ifndef NO_DH 1486#ifndef OPENSSL_NO_DH
744 if (alg & (SSL_kDHr|SSL_kEDH)) 1487 if (alg & (SSL_kDHr|SSL_kEDH))
745 { 1488 {
746#ifndef NO_RSA 1489# ifndef OPENSSL_NO_RSA
747 p[ret++]=SSL3_CT_RSA_FIXED_DH; 1490 p[ret++]=SSL3_CT_RSA_FIXED_DH;
748#endif 1491# endif
749#ifndef NO_DSA 1492# ifndef OPENSSL_NO_DSA
750 p[ret++]=SSL3_CT_DSS_FIXED_DH; 1493 p[ret++]=SSL3_CT_DSS_FIXED_DH;
751#endif 1494# endif
752 } 1495 }
753 if ((s->version == SSL3_VERSION) && 1496 if ((s->version == SSL3_VERSION) &&
754 (alg & (SSL_kEDH|SSL_kDHd|SSL_kDHr))) 1497 (alg & (SSL_kEDH|SSL_kDHd|SSL_kDHr)))
755 { 1498 {
756#ifndef NO_RSA 1499# ifndef OPENSSL_NO_RSA
757 p[ret++]=SSL3_CT_RSA_EPHEMERAL_DH; 1500 p[ret++]=SSL3_CT_RSA_EPHEMERAL_DH;
758#endif 1501# endif
759#ifndef NO_DSA 1502# ifndef OPENSSL_NO_DSA
760 p[ret++]=SSL3_CT_DSS_EPHEMERAL_DH; 1503 p[ret++]=SSL3_CT_DSS_EPHEMERAL_DH;
761#endif 1504# endif
762 } 1505 }
763#endif /* !NO_DH */ 1506#endif /* !OPENSSL_NO_DH */
764#ifndef NO_RSA 1507#ifndef OPENSSL_NO_RSA
765 p[ret++]=SSL3_CT_RSA_SIGN; 1508 p[ret++]=SSL3_CT_RSA_SIGN;
766#endif 1509#endif
1510#ifndef OPENSSL_NO_DSA
767 p[ret++]=SSL3_CT_DSS_SIGN; 1511 p[ret++]=SSL3_CT_DSS_SIGN;
1512#endif
768 return(ret); 1513 return(ret);
769 } 1514 }
770 1515
771int ssl3_shutdown(s) 1516int ssl3_shutdown(SSL *s)
772SSL *s;
773 { 1517 {
774 1518
775 /* Don't do anything much if we have not done the handshake or 1519 /* Don't do anything much if we have not done the handshake or
@@ -799,7 +1543,7 @@ SSL *s;
799 else if (!(s->shutdown & SSL_RECEIVED_SHUTDOWN)) 1543 else if (!(s->shutdown & SSL_RECEIVED_SHUTDOWN))
800 { 1544 {
801 /* If we are waiting for a close from our peer, we are closed */ 1545 /* If we are waiting for a close from our peer, we are closed */
802 ssl3_read_bytes(s,0,NULL,0); 1546 ssl3_read_bytes(s,0,NULL,0,0);
803 } 1547 }
804 1548
805 if ((s->shutdown == (SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN)) && 1549 if ((s->shutdown == (SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN)) &&
@@ -809,13 +1553,9 @@ SSL *s;
809 return(0); 1553 return(0);
810 } 1554 }
811 1555
812int ssl3_write(s,buf,len) 1556int ssl3_write(SSL *s, const void *buf, int len)
813SSL *s;
814char *buf;
815int len;
816 { 1557 {
817 int ret,n; 1558 int ret,n;
818 BIO *under;
819 1559
820#if 0 1560#if 0
821 if (s->shutdown & SSL_SEND_SHUTDOWN) 1561 if (s->shutdown & SSL_SEND_SHUTDOWN)
@@ -838,7 +1578,7 @@ int len;
838 if (s->s3->delay_buf_pop_ret == 0) 1578 if (s->s3->delay_buf_pop_ret == 0)
839 { 1579 {
840 ret=ssl3_write_bytes(s,SSL3_RT_APPLICATION_DATA, 1580 ret=ssl3_write_bytes(s,SSL3_RT_APPLICATION_DATA,
841 (char *)buf,len); 1581 buf,len);
842 if (ret <= 0) return(ret); 1582 if (ret <= 0) return(ret);
843 1583
844 s->s3->delay_buf_pop_ret=ret; 1584 s->s3->delay_buf_pop_ret=ret;
@@ -849,43 +1589,40 @@ int len;
849 if (n <= 0) return(n); 1589 if (n <= 0) return(n);
850 s->rwstate=SSL_NOTHING; 1590 s->rwstate=SSL_NOTHING;
851 1591
852 /* We have flushed the buffer */ 1592 /* We have flushed the buffer, so remove it */
853 under=BIO_pop(s->wbio); 1593 ssl_free_wbio_buffer(s);
854 s->wbio=under; 1594 s->s3->flags&= ~SSL3_FLAGS_POP_BUFFER;
855 BIO_free(s->bbio); 1595
856 s->bbio=NULL;
857 ret=s->s3->delay_buf_pop_ret; 1596 ret=s->s3->delay_buf_pop_ret;
858 s->s3->delay_buf_pop_ret=0; 1597 s->s3->delay_buf_pop_ret=0;
859
860 s->s3->flags&= ~SSL3_FLAGS_POP_BUFFER;
861 } 1598 }
862 else 1599 else
863 { 1600 {
864 ret=ssl3_write_bytes(s,SSL3_RT_APPLICATION_DATA, 1601 ret=ssl3_write_bytes(s,SSL3_RT_APPLICATION_DATA,
865 (char *)buf,len); 1602 buf,len);
866 if (ret <= 0) return(ret); 1603 if (ret <= 0) return(ret);
867 } 1604 }
868 1605
869 return(ret); 1606 return(ret);
870 } 1607 }
871 1608
872int ssl3_read(s,buf,len) 1609static int ssl3_read_internal(SSL *s, void *buf, int len, int peek)
873SSL *s;
874char *buf;
875int len;
876 { 1610 {
877 int ret; 1611 int ret;
878 1612
879 clear_sys_error(); 1613 clear_sys_error();
880 if (s->s3->renegotiate) ssl3_renegotiate_check(s); 1614 if (s->s3->renegotiate) ssl3_renegotiate_check(s);
881 s->s3->in_read_app_data=1; 1615 s->s3->in_read_app_data=1;
882 ret=ssl3_read_bytes(s,SSL3_RT_APPLICATION_DATA,buf,len); 1616 ret=ssl3_read_bytes(s,SSL3_RT_APPLICATION_DATA,buf,len,peek);
883 if ((ret == -1) && (s->s3->in_read_app_data == 0)) 1617 if ((ret == -1) && (s->s3->in_read_app_data == 2))
884 { 1618 {
885 ERR_get_error(); /* clear the error */ 1619 /* ssl3_read_bytes decided to call s->handshake_func, which
886 s->s3->in_read_app_data=0; 1620 * called ssl3_read_bytes to read handshake data.
1621 * However, ssl3_read_bytes actually found application data
1622 * and thinks that application data makes sense here; so disable
1623 * handshake processing and try to read application data again. */
887 s->in_handshake++; 1624 s->in_handshake++;
888 ret=ssl3_read_bytes(s,SSL3_RT_APPLICATION_DATA,buf,len); 1625 ret=ssl3_read_bytes(s,SSL3_RT_APPLICATION_DATA,buf,len,peek);
889 s->in_handshake--; 1626 s->in_handshake--;
890 } 1627 }
891 else 1628 else
@@ -894,33 +1631,17 @@ int len;
894 return(ret); 1631 return(ret);
895 } 1632 }
896 1633
897int ssl3_peek(s,buf,len) 1634int ssl3_read(SSL *s, void *buf, int len)
898SSL *s;
899char *buf;
900int len;
901 { 1635 {
902 SSL3_RECORD *rr; 1636 return ssl3_read_internal(s, buf, len, 0);
903 int n; 1637 }
904
905 rr= &(s->s3->rrec);
906 if ((rr->length == 0) || (rr->type != SSL3_RT_APPLICATION_DATA))
907 {
908 n=ssl3_read(s,buf,1);
909 if (n <= 0) return(n);
910 rr->length++;
911 rr->off--;
912 }
913 1638
914 if ((unsigned int)len > rr->length) 1639int ssl3_peek(SSL *s, void *buf, int len)
915 n=rr->length; 1640 {
916 else 1641 return ssl3_read_internal(s, buf, len, 1);
917 n=len;
918 memcpy(buf,&(rr->data[rr->off]),(unsigned int)n);
919 return(n);
920 } 1642 }
921 1643
922int ssl3_renegotiate(s) 1644int ssl3_renegotiate(SSL *s)
923SSL *s;
924 { 1645 {
925 if (s->handshake_func == NULL) 1646 if (s->handshake_func == NULL)
926 return(1); 1647 return(1);
@@ -932,8 +1653,7 @@ SSL *s;
932 return(1); 1653 return(1);
933 } 1654 }
934 1655
935int ssl3_renegotiate_check(s) 1656int ssl3_renegotiate_check(SSL *s)
936SSL *s;
937 { 1657 {
938 int ret=0; 1658 int ret=0;
939 1659
@@ -945,7 +1665,7 @@ SSL *s;
945 { 1665 {
946/* 1666/*
947if we are the server, and we have sent a 'RENEGOTIATE' message, we 1667if we are the server, and we have sent a 'RENEGOTIATE' message, we
948need to go to SSL_ST_ACCEPT. 1668need to go to SSL_ST_ACCEPT.
949*/ 1669*/
950 /* SSL_ST_ACCEPT */ 1670 /* SSL_ST_ACCEPT */
951 s->state=SSL_ST_RENEGOTIATE; 1671 s->state=SSL_ST_RENEGOTIATE;
@@ -958,4 +1678,3 @@ need to go to SSL_ST_ACCEPT.
958 return(ret); 1678 return(ret);
959 } 1679 }
960 1680
961
diff --git a/src/lib/libssl/s3_pkt.c b/src/lib/libssl/s3_pkt.c
index 2385080347..43e8502b66 100644
--- a/src/lib/libssl/s3_pkt.c
+++ b/src/lib/libssl/s3_pkt.c
@@ -55,150 +55,165 @@
55 * copied and put under another distribution licence 55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.] 56 * [including the GNU Public Licence.]
57 */ 57 */
58/* ====================================================================
59 * Copyright (c) 1998-2002 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 */
58 111
59#include <stdio.h> 112#include <stdio.h>
60#include <errno.h> 113#include <errno.h>
61#define USE_SOCKETS 114#define USE_SOCKETS
62#include "evp.h" 115#include <openssl/evp.h>
63#include "buffer.h" 116#include <openssl/buffer.h>
64#include "ssl_locl.h" 117#include "ssl_locl.h"
65 118
66/* SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_SSLV3_ALERT_PEER_ERROR_NO_CIPHER); 119static int do_ssl3_write(SSL *s, int type, const unsigned char *buf,
67 * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_SSLV3_ALERT_PEER_ERROR_NO_CERTIFICATE); 120 unsigned int len, int create_empty_fragment);
68 * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_SSLV3_ALERT_PEER_ERROR_CERTIFICATE); 121static int ssl3_write_pending(SSL *s, int type, const unsigned char *buf,
69 * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_SSLV3_ALERT_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE); 122 unsigned int len);
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
85static int do_ssl3_write(SSL *s, int type, char *buf, unsigned int len);
86static int ssl3_write_pending(SSL *s, int type, char *buf, unsigned int len);
87static int ssl3_get_record(SSL *s); 123static int ssl3_get_record(SSL *s);
88static int do_compress(SSL *ssl); 124static int do_compress(SSL *ssl);
89static int do_uncompress(SSL *ssl); 125static int do_uncompress(SSL *ssl);
90static int do_change_cipher_spec(SSL *ssl); 126static int do_change_cipher_spec(SSL *ssl);
91#else
92static int do_ssl3_write();
93static int ssl3_write_pending();
94static int ssl3_get_record();
95static int do_compress();
96static int do_uncompress();
97static int do_change_cipher_spec();
98#endif
99 127
100static int ssl3_read_n(s,n,max,extend) 128/* used only by ssl3_get_record */
101SSL *s; 129static int ssl3_read_n(SSL *s, int n, int max, int extend)
102int n;
103int max;
104int extend;
105 { 130 {
131 /* If extend == 0, obtain new n-byte packet; if extend == 1, increase
132 * packet by another n bytes.
133 * The packet will be in the sub-array of s->s3->rbuf.buf specified
134 * by s->packet and s->packet_length.
135 * (If s->read_ahead is set, 'max' bytes may be stored in rbuf
136 * [plus s->packet_length bytes if extend == 1].)
137 */
106 int i,off,newb; 138 int i,off,newb;
107 139
108 /* if there is stuff still in the buffer from a previous read, 140 if (!extend)
109 * and there is more than we want, take some. */ 141 {
142 /* start with empty packet ... */
143 if (s->s3->rbuf.left == 0)
144 s->s3->rbuf.offset = 0;
145 s->packet = s->s3->rbuf.buf + s->s3->rbuf.offset;
146 s->packet_length = 0;
147 /* ... now we can act as if 'extend' was set */
148 }
149
150 /* if there is enough in the buffer from a previous read, take some */
110 if (s->s3->rbuf.left >= (int)n) 151 if (s->s3->rbuf.left >= (int)n)
111 { 152 {
112 if (extend) 153 s->packet_length+=n;
113 s->packet_length+=n;
114 else
115 {
116 s->packet= &(s->s3->rbuf.buf[s->s3->rbuf.offset]);
117 s->packet_length=n;
118 }
119 s->s3->rbuf.left-=n; 154 s->s3->rbuf.left-=n;
120 s->s3->rbuf.offset+=n; 155 s->s3->rbuf.offset+=n;
121 return(n); 156 return(n);
122 } 157 }
123 158
124 /* else we need to read more data */ 159 /* else we need to read more data */
125 if (!s->read_ahead) max=n; 160 if (!s->read_ahead)
126 if (max > SSL3_RT_MAX_PACKET_SIZE) 161 max=n;
127 max=SSL3_RT_MAX_PACKET_SIZE;
128
129 /* First check if there is some left or we want to extend */
130 off=0;
131 if ( (s->s3->rbuf.left != 0) ||
132 ((s->packet_length != 0) && extend))
133 {
134 newb=s->s3->rbuf.left;
135 if (extend)
136 {
137 /* Copy bytes back to the front of the buffer
138 * Take the bytes already pointed to by 'packet'
139 * and take the extra ones on the end. */
140 off=s->packet_length;
141 if (s->packet != s->s3->rbuf.buf)
142 memcpy(s->s3->rbuf.buf,s->packet,newb+off);
143 }
144 else if (s->s3->rbuf.offset != 0)
145 { /* so the data is not at the start of the buffer */
146 memcpy(s->s3->rbuf.buf,
147 &(s->s3->rbuf.buf[s->s3->rbuf.offset]),newb);
148 s->s3->rbuf.offset=0;
149 }
150 162
151 s->s3->rbuf.left=0; 163 {
164 /* avoid buffer overflow */
165 int max_max = s->s3->rbuf.len - s->packet_length;
166 if (max > max_max)
167 max = max_max;
168 }
169 if (n > max) /* does not happen */
170 {
171 SSLerr(SSL_F_SSL3_READ_N,ERR_R_INTERNAL_ERROR);
172 return -1;
152 } 173 }
153 else
154 newb=0;
155 174
156 /* So we now have 'newb' bytes at the front of 175 off = s->packet_length;
157 * s->s3->rbuf.buf and need to read some more in on the end 176 newb = s->s3->rbuf.left;
158 * We start reading into the buffer at 's->s3->rbuf.offset' 177 /* Move any available bytes to front of buffer:
159 */ 178 * 'off' bytes already pointed to by 'packet',
160 s->packet=s->s3->rbuf.buf; 179 * 'newb' extra ones at the end */
180 if (s->packet != s->s3->rbuf.buf)
181 {
182 /* off > 0 */
183 memmove(s->s3->rbuf.buf, s->packet, off+newb);
184 s->packet = s->s3->rbuf.buf;
185 }
161 186
162 while (newb < n) 187 while (newb < n)
163 { 188 {
189 /* Now we have off+newb bytes at the front of s->s3->rbuf.buf and need
190 * to read in more until we have off+n (up to off+max if possible) */
191
164 clear_sys_error(); 192 clear_sys_error();
165 if (s->rbio != NULL) 193 if (s->rbio != NULL)
166 { 194 {
167 s->rwstate=SSL_READING; 195 s->rwstate=SSL_READING;
168 i=BIO_read(s->rbio, 196 i=BIO_read(s->rbio, &(s->s3->rbuf.buf[off+newb]), max-newb);
169 (char *)&(s->s3->rbuf.buf[off+newb]),
170 max-newb);
171 } 197 }
172 else 198 else
173 { 199 {
174 SSLerr(SSL_F_SSL3_READ_N,SSL_R_READ_BIO_NOT_SET); 200 SSLerr(SSL_F_SSL3_READ_N,SSL_R_READ_BIO_NOT_SET);
175 i= -1; 201 i = -1;
176 } 202 }
177 203
178 if (i <= 0) 204 if (i <= 0)
179 { 205 {
180 s->s3->rbuf.left+=newb; 206 s->s3->rbuf.left = newb;
181 return(i); 207 return(i);
182 } 208 }
183 newb+=i; 209 newb+=i;
184 } 210 }
185 211
186 /* record used data read */ 212 /* done reading, now the book-keeping */
187 if (newb > n) 213 s->s3->rbuf.offset = off + n;
188 { 214 s->s3->rbuf.left = newb - n;
189 s->s3->rbuf.offset=n+off; 215 s->packet_length += n;
190 s->s3->rbuf.left=newb-n; 216 s->rwstate=SSL_NOTHING;
191 }
192 else
193 {
194 s->s3->rbuf.offset=0;
195 s->s3->rbuf.left=0;
196 }
197
198 if (extend)
199 s->packet_length+=n;
200 else
201 s->packet_length+=n;
202 return(n); 217 return(n);
203 } 218 }
204 219
@@ -206,41 +221,45 @@ int extend;
206 * It will return <= 0 if more data is needed, normally due to an error 221 * It will return <= 0 if more data is needed, normally due to an error
207 * or non-blocking IO. 222 * or non-blocking IO.
208 * When it finishes, one packet has been decoded and can be found in 223 * When it finishes, one packet has been decoded and can be found in
209 * ssl->s3->rrec.type - is the type of record 224 * ssl->s3->rrec.type - is the type of record
210 * ssl->s3->rrec.data, - data 225 * ssl->s3->rrec.data, - data
211 * ssl->s3->rrec.length, - number of bytes 226 * ssl->s3->rrec.length, - number of bytes
212 */ 227 */
213static int ssl3_get_record(s) 228/* used only by ssl3_read_bytes */
214SSL *s; 229static int ssl3_get_record(SSL *s)
215 { 230 {
216 char tmp_buf[512];
217 int ssl_major,ssl_minor,al; 231 int ssl_major,ssl_minor,al;
218 int n,i,ret= -1; 232 int enc_err,n,i,ret= -1;
219 SSL3_BUFFER *rb;
220 SSL3_RECORD *rr; 233 SSL3_RECORD *rr;
221 SSL_SESSION *sess; 234 SSL_SESSION *sess;
222 unsigned char *p; 235 unsigned char *p;
223 unsigned char md[EVP_MAX_MD_SIZE]; 236 unsigned char md[EVP_MAX_MD_SIZE];
224 short version; 237 short version;
225 unsigned int mac_size; 238 unsigned int mac_size;
226 int clear=0,extra; 239 int clear=0;
240 size_t extra;
227 241
228 rr= &(s->s3->rrec); 242 rr= &(s->s3->rrec);
229 rb= &(s->s3->rbuf);
230 sess=s->session; 243 sess=s->session;
231 244
232 if (s->options & SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER) 245 if (s->options & SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER)
233 extra=SSL3_RT_MAX_EXTRA; 246 extra=SSL3_RT_MAX_EXTRA;
234 else 247 else
235 extra=0; 248 extra=0;
249 if (extra != s->s3->rbuf.len - SSL3_RT_MAX_PACKET_SIZE)
250 {
251 /* actually likely an application error: SLS_OP_MICROSOFT_BIG_SSLV3_BUFFER
252 * set after ssl3_setup_buffers() was done */
253 SSLerr(SSL_F_SSL3_GET_RECORD, ERR_R_INTERNAL_ERROR);
254 return -1;
255 }
236 256
237again: 257again:
238 /* check if we have the header */ 258 /* check if we have the header */
239 if ( (s->rstate != SSL_ST_READ_BODY) || 259 if ( (s->rstate != SSL_ST_READ_BODY) ||
240 (s->packet_length < SSL3_RT_HEADER_LENGTH)) 260 (s->packet_length < SSL3_RT_HEADER_LENGTH))
241 { 261 {
242 n=ssl3_read_n(s,SSL3_RT_HEADER_LENGTH, 262 n=ssl3_read_n(s, SSL3_RT_HEADER_LENGTH, s->s3->rbuf.len, 0);
243 SSL3_RT_MAX_PACKET_SIZE,0);
244 if (n <= 0) return(n); /* error or non-blocking */ 263 if (n <= 0) return(n); /* error or non-blocking */
245 s->rstate=SSL_ST_READ_BODY; 264 s->rstate=SSL_ST_READ_BODY;
246 265
@@ -277,35 +296,33 @@ again:
277 goto err; 296 goto err;
278 } 297 }
279 298
280 if (rr->length > 299 if (rr->length > SSL3_RT_MAX_ENCRYPTED_LENGTH+extra)
281 (unsigned int)SSL3_RT_MAX_ENCRYPTED_LENGTH+extra)
282 { 300 {
283 al=SSL_AD_RECORD_OVERFLOW; 301 al=SSL_AD_RECORD_OVERFLOW;
284 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_PACKET_LENGTH_TOO_LONG); 302 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_PACKET_LENGTH_TOO_LONG);
285 goto f_err; 303 goto f_err;
286 } 304 }
287 305
288 s->rstate=SSL_ST_READ_BODY; 306 /* now s->rstate == SSL_ST_READ_BODY */
289 } 307 }
290 308
291 /* get and decode the data */ 309 /* s->rstate == SSL_ST_READ_BODY, get and decode the data */
292 if (s->rstate == SSL_ST_READ_BODY) 310
311 if (rr->length > s->packet_length-SSL3_RT_HEADER_LENGTH)
293 { 312 {
294 if (rr->length > (s->packet_length-SSL3_RT_HEADER_LENGTH)) 313 /* now s->packet_length == SSL3_RT_HEADER_LENGTH */
295 { 314 i=rr->length;
296 i=rr->length; 315 n=ssl3_read_n(s,i,i,1);
297 /*-(s->packet_length-SSL3_RT_HEADER_LENGTH); */ 316 if (n <= 0) return(n); /* error or non-blocking io */
298 n=ssl3_read_n(s,i,i,1); 317 /* now n == rr->length,
299 if (n <= 0) return(n); /* error or non-blocking io */ 318 * and s->packet_length == SSL3_RT_HEADER_LENGTH + rr->length */
300 }
301 s->rstate=SSL_ST_READ_HEADER;
302 } 319 }
303 320
304 /* At this point, we have the data in s->packet and there should be 321 s->rstate=SSL_ST_READ_HEADER; /* set state for later operations */
305 * s->packet_length bytes, we must not 'overrun' this buffer :-)
306 * One of the following functions will copy the data from the
307 * s->packet buffer */
308 322
323 /* At this point, s->packet_length == SSL3_RT_HEADER_LNGTH + rr->length,
324 * and we have that many bytes in s->packet
325 */
309 rr->input= &(s->packet[SSL3_RT_HEADER_LENGTH]); 326 rr->input= &(s->packet[SSL3_RT_HEADER_LENGTH]);
310 327
311 /* ok, we can now read from 's->packet' data into 'rr' 328 /* ok, we can now read from 's->packet' data into 'rr'
@@ -315,14 +332,11 @@ again:
315 * When the data is 'copied' into the rr->data buffer, 332 * When the data is 'copied' into the rr->data buffer,
316 * rr->input will be pointed at the new buffer */ 333 * rr->input will be pointed at the new buffer */
317 334
318 /* Set the state for the following operations */
319 s->rstate=SSL_ST_READ_HEADER;
320
321 /* We now have - encrypted [ MAC [ compressed [ plain ] ] ] 335 /* We now have - encrypted [ MAC [ compressed [ plain ] ] ]
322 * rr->length bytes of encrypted compressed stuff. */ 336 * rr->length bytes of encrypted compressed stuff. */
323 337
324 /* check is not needed I belive */ 338 /* check is not needed I believe */
325 if (rr->length > (unsigned int)SSL3_RT_MAX_ENCRYPTED_LENGTH+extra) 339 if (rr->length > SSL3_RT_MAX_ENCRYPTED_LENGTH+extra)
326 { 340 {
327 al=SSL_AD_RECORD_OVERFLOW; 341 al=SSL_AD_RECORD_OVERFLOW;
328 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_ENCRYPTED_LENGTH_TOO_LONG); 342 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_ENCRYPTED_LENGTH_TOO_LONG);
@@ -331,18 +345,24 @@ again:
331 345
332 /* decrypt in place in 'rr->input' */ 346 /* decrypt in place in 'rr->input' */
333 rr->data=rr->input; 347 rr->data=rr->input;
334 memcpy(tmp_buf,rr->input,(rr->length > 512)?512:rr->length);
335 348
336 if (!s->method->ssl3_enc->enc(s,0)) 349 enc_err = s->method->ssl3_enc->enc(s,0);
350 if (enc_err <= 0)
337 { 351 {
338 al=SSL_AD_DECRYPT_ERROR; 352 if (enc_err == 0)
339 goto f_err; 353 /* SSLerr() and ssl3_send_alert() have been called */
354 goto err;
355
356 /* otherwise enc_err == -1 */
357 goto decryption_failed_or_bad_record_mac;
340 } 358 }
359
341#ifdef TLS_DEBUG 360#ifdef TLS_DEBUG
342printf("dec %d\n",rr->length); 361printf("dec %d\n",rr->length);
343{ int z; for (z=0; z<rr->length; z++) printf("%02X%c",rr->data[z],((z+1)%16)?' ':'\n'); } 362{ unsigned int z; for (z=0; z<rr->length; z++) printf("%02X%c",rr->data[z],((z+1)%16)?' ':'\n'); }
344printf("\n"); 363printf("\n");
345#endif 364#endif
365
346 /* r->length is now the compressed data plus mac */ 366 /* r->length is now the compressed data plus mac */
347 if ( (sess == NULL) || 367 if ( (sess == NULL) ||
348 (s->enc_read_ctx == NULL) || 368 (s->enc_read_ctx == NULL) ||
@@ -355,33 +375,37 @@ printf("\n");
355 375
356 if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH+extra+mac_size) 376 if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH+extra+mac_size)
357 { 377 {
378#if 0 /* OK only for stream ciphers (then rr->length is visible from ciphertext anyway) */
358 al=SSL_AD_RECORD_OVERFLOW; 379 al=SSL_AD_RECORD_OVERFLOW;
359 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_PRE_MAC_LENGTH_TOO_LONG); 380 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_PRE_MAC_LENGTH_TOO_LONG);
360 goto f_err; 381 goto f_err;
382#else
383 goto decryption_failed_or_bad_record_mac;
384#endif
361 } 385 }
362 /* check MAC for rr->input' */ 386 /* check the MAC for rr->input (it's in mac_size bytes at the tail) */
363 if (rr->length < mac_size) 387 if (rr->length < mac_size)
364 { 388 {
389#if 0 /* OK only for stream ciphers */
365 al=SSL_AD_DECODE_ERROR; 390 al=SSL_AD_DECODE_ERROR;
366 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_LENGTH_TOO_SHORT); 391 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_LENGTH_TOO_SHORT);
367 goto f_err; 392 goto f_err;
393#else
394 goto decryption_failed_or_bad_record_mac;
395#endif
368 } 396 }
369 rr->length-=mac_size; 397 rr->length-=mac_size;
370 i=s->method->ssl3_enc->mac(s,md,0); 398 i=s->method->ssl3_enc->mac(s,md,0);
371 if (memcmp(md,&(rr->data[rr->length]),mac_size) != 0) 399 if (memcmp(md,&(rr->data[rr->length]),mac_size) != 0)
372 { 400 {
373 al=SSL_AD_BAD_RECORD_MAC; 401 goto decryption_failed_or_bad_record_mac;
374 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_BAD_MAC_DECODE);
375 ret= -1;
376 goto f_err;
377 } 402 }
378 } 403 }
379 404
380 /* r->length is now just compressed */ 405 /* r->length is now just compressed */
381 if ((sess != NULL) && (sess->read_compression != NULL)) 406 if (s->expand != NULL)
382 { 407 {
383 if (rr->length > 408 if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH+extra)
384 (unsigned int)SSL3_RT_MAX_COMPRESSED_LENGTH+extra)
385 { 409 {
386 al=SSL_AD_RECORD_OVERFLOW; 410 al=SSL_AD_RECORD_OVERFLOW;
387 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_COMPRESSED_LENGTH_TOO_LONG); 411 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_COMPRESSED_LENGTH_TOO_LONG);
@@ -395,7 +419,7 @@ printf("\n");
395 } 419 }
396 } 420 }
397 421
398 if (rr->length > (unsigned int)SSL3_RT_MAX_PLAIN_LENGTH+extra) 422 if (rr->length > SSL3_RT_MAX_PLAIN_LENGTH+extra)
399 { 423 {
400 al=SSL_AD_RECORD_OVERFLOW; 424 al=SSL_AD_RECORD_OVERFLOW;
401 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_DATA_LENGTH_TOO_LONG); 425 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_DATA_LENGTH_TOO_LONG);
@@ -418,33 +442,62 @@ printf("\n");
418 if (rr->length == 0) goto again; 442 if (rr->length == 0) goto again;
419 443
420 return(1); 444 return(1);
445
446decryption_failed_or_bad_record_mac:
447 /* Separate 'decryption_failed' alert was introduced with TLS 1.0,
448 * SSL 3.0 only has 'bad_record_mac'. But unless a decryption
449 * failure is directly visible from the ciphertext anyway,
450 * we should not reveal which kind of error occured -- this
451 * might become visible to an attacker (e.g. via logfile) */
452 al=SSL_AD_BAD_RECORD_MAC;
453 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC);
421f_err: 454f_err:
422 ssl3_send_alert(s,SSL3_AL_FATAL,al); 455 ssl3_send_alert(s,SSL3_AL_FATAL,al);
423err: 456err:
424 return(ret); 457 return(ret);
425 } 458 }
426 459
427static int do_uncompress(ssl) 460static int do_uncompress(SSL *ssl)
428SSL *ssl;
429 { 461 {
462 int i;
463 SSL3_RECORD *rr;
464
465 rr= &(ssl->s3->rrec);
466 i=COMP_expand_block(ssl->expand,rr->comp,
467 SSL3_RT_MAX_PLAIN_LENGTH,rr->data,(int)rr->length);
468 if (i < 0)
469 return(0);
470 else
471 rr->length=i;
472 rr->data=rr->comp;
473
430 return(1); 474 return(1);
431 } 475 }
432 476
433static int do_compress(ssl) 477static int do_compress(SSL *ssl)
434SSL *ssl;
435 { 478 {
479 int i;
480 SSL3_RECORD *wr;
481
482 wr= &(ssl->s3->wrec);
483 i=COMP_compress_block(ssl->compress,wr->data,
484 SSL3_RT_MAX_COMPRESSED_LENGTH,
485 wr->input,(int)wr->length);
486 if (i < 0)
487 return(0);
488 else
489 wr->length=i;
490
491 wr->input=wr->data;
436 return(1); 492 return(1);
437 } 493 }
438 494
439/* Call this to write data 495/* Call this to write data in records of type 'type'
440 * It will return <= 0 if not all data has been sent or non-blocking IO. 496 * It will return <= 0 if not all data has been sent or non-blocking IO.
441 */ 497 */
442int ssl3_write_bytes(s,type,buf,len) 498int ssl3_write_bytes(SSL *s, int type, const void *buf_, int len)
443SSL *s;
444int type;
445char *buf;
446int len;
447 { 499 {
500 const unsigned char *buf=buf_;
448 unsigned int tot,n,nw; 501 unsigned int tot,n,nw;
449 int i; 502 int i;
450 503
@@ -459,7 +512,7 @@ int len;
459 if (i == 0) 512 if (i == 0)
460 { 513 {
461 SSLerr(SSL_F_SSL3_WRITE_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE); 514 SSLerr(SSL_F_SSL3_WRITE_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE);
462 return(-1); 515 return -1;
463 } 516 }
464 } 517 }
465 518
@@ -470,37 +523,41 @@ int len;
470 nw=SSL3_RT_MAX_PLAIN_LENGTH; 523 nw=SSL3_RT_MAX_PLAIN_LENGTH;
471 else 524 else
472 nw=n; 525 nw=n;
473 526
474 i=do_ssl3_write(s,type,&(buf[tot]),nw); 527 i=do_ssl3_write(s, type, &(buf[tot]), nw, 0);
475 if (i <= 0) 528 if (i <= 0)
476 { 529 {
477 s->s3->wnum=tot; 530 s->s3->wnum=tot;
478 return(i); 531 return i;
479 } 532 }
480 533
481 if (type == SSL3_RT_HANDSHAKE) 534 if ((i == (int)n) ||
482 ssl3_finish_mac(s,(unsigned char *)&(buf[tot]),i); 535 (type == SSL3_RT_APPLICATION_DATA &&
483 536 (s->mode & SSL_MODE_ENABLE_PARTIAL_WRITE)))
484 if (i == (int)n) return(tot+i); 537 {
538 /* next chunk of data should get another prepended empty fragment
539 * in ciphersuites with known-IV weakness: */
540 s->s3->empty_fragment_done = 0;
541
542 return tot+i;
543 }
485 544
486 n-=i; 545 n-=i;
487 tot+=i; 546 tot+=i;
488 } 547 }
489 } 548 }
490 549
491static int do_ssl3_write(s,type,buf,len) 550static int do_ssl3_write(SSL *s, int type, const unsigned char *buf,
492SSL *s; 551 unsigned int len, int create_empty_fragment)
493int type;
494char *buf;
495unsigned int len;
496 { 552 {
497 unsigned char *p,*plen; 553 unsigned char *p,*plen;
498 int i,mac_size,clear=0; 554 int i,mac_size,clear=0;
555 int prefix_len = 0;
499 SSL3_RECORD *wr; 556 SSL3_RECORD *wr;
500 SSL3_BUFFER *wb; 557 SSL3_BUFFER *wb;
501 SSL_SESSION *sess; 558 SSL_SESSION *sess;
502 559
503 /* first check is there is a SSL3_RECORD still being written 560 /* first check if there is a SSL3_BUFFER still being written
504 * out. This will happen with non blocking IO */ 561 * out. This will happen with non blocking IO */
505 if (s->s3->wbuf.left != 0) 562 if (s->s3->wbuf.left != 0)
506 return(ssl3_write_pending(s,type,buf,len)); 563 return(ssl3_write_pending(s,type,buf,len));
@@ -514,8 +571,9 @@ unsigned int len;
514 /* if it went, fall through and send more stuff */ 571 /* if it went, fall through and send more stuff */
515 } 572 }
516 573
517 if (len <= 0) return(len); 574 if (len == 0 && !create_empty_fragment)
518 575 return 0;
576
519 wr= &(s->s3->wrec); 577 wr= &(s->s3->wrec);
520 wb= &(s->s3->wbuf); 578 wb= &(s->s3->wbuf);
521 sess=s->session; 579 sess=s->session;
@@ -530,19 +588,47 @@ unsigned int len;
530 else 588 else
531 mac_size=EVP_MD_size(s->write_hash); 589 mac_size=EVP_MD_size(s->write_hash);
532 590
533 p=wb->buf; 591 /* 'create_empty_fragment' is true only when this function calls itself */
592 if (!clear && !create_empty_fragment && !s->s3->empty_fragment_done)
593 {
594 /* countermeasure against known-IV weakness in CBC ciphersuites
595 * (see http://www.openssl.org/~bodo/tls-cbc.txt) */
596
597 if (s->s3->need_empty_fragments && type == SSL3_RT_APPLICATION_DATA)
598 {
599 /* recursive function call with 'create_empty_fragment' set;
600 * this prepares and buffers the data for an empty fragment
601 * (these 'prefix_len' bytes are sent out later
602 * together with the actual payload) */
603 prefix_len = do_ssl3_write(s, type, buf, 0, 1);
604 if (prefix_len <= 0)
605 goto err;
606
607 if (s->s3->wbuf.len < (size_t)prefix_len + SSL3_RT_MAX_PACKET_SIZE)
608 {
609 /* insufficient space */
610 SSLerr(SSL_F_DO_SSL3_WRITE, ERR_R_INTERNAL_ERROR);
611 goto err;
612 }
613 }
614
615 s->s3->empty_fragment_done = 1;
616 }
617
618 p = wb->buf + prefix_len;
534 619
535 /* write the header */ 620 /* write the header */
621
536 *(p++)=type&0xff; 622 *(p++)=type&0xff;
537 wr->type=type; 623 wr->type=type;
538 624
539 *(p++)=(s->version>>8); 625 *(p++)=(s->version>>8);
540 *(p++)=s->version&0xff; 626 *(p++)=s->version&0xff;
541 627
542 /* record where we are to write out packet length */ 628 /* field where we are to write out packet length */
543 plen=p; 629 plen=p;
544 p+=2; 630 p+=2;
545 631
546 /* lets setup the record stuff. */ 632 /* lets setup the record stuff. */
547 wr->data=p; 633 wr->data=p;
548 wr->length=(int)len; 634 wr->length=(int)len;
@@ -552,7 +638,7 @@ unsigned int len;
552 * wr->data */ 638 * wr->data */
553 639
554 /* first we compress */ 640 /* first we compress */
555 if ((sess != NULL) && (sess->write_compression != NULL)) 641 if (s->compress != NULL)
556 { 642 {
557 if (!do_compress(s)) 643 if (!do_compress(s))
558 { 644 {
@@ -590,32 +676,40 @@ unsigned int len;
590 wr->type=type; /* not needed but helps for debugging */ 676 wr->type=type; /* not needed but helps for debugging */
591 wr->length+=SSL3_RT_HEADER_LENGTH; 677 wr->length+=SSL3_RT_HEADER_LENGTH;
592 678
593 /* Now lets setup wb */ 679 if (create_empty_fragment)
594 wb->left=wr->length; 680 {
595 wb->offset=0; 681 /* we are in a recursive call;
682 * just return the length, don't write out anything here
683 */
684 return wr->length;
685 }
686
687 /* now let's set up wb */
688 wb->left = prefix_len + wr->length;
689 wb->offset = 0;
596 690
691 /* memorize arguments so that ssl3_write_pending can detect bad write retries later */
597 s->s3->wpend_tot=len; 692 s->s3->wpend_tot=len;
598 s->s3->wpend_buf=buf; 693 s->s3->wpend_buf=buf;
599 s->s3->wpend_type=type; 694 s->s3->wpend_type=type;
600 s->s3->wpend_ret=len; 695 s->s3->wpend_ret=len;
601 696
602 /* we now just need to write the buffer */ 697 /* we now just need to write the buffer */
603 return(ssl3_write_pending(s,type,buf,len)); 698 return ssl3_write_pending(s,type,buf,len);
604err: 699err:
605 return(-1); 700 return -1;
606 } 701 }
607 702
608/* if s->s3->wbuf.left != 0, we need to call this */ 703/* if s->s3->wbuf.left != 0, we need to call this */
609static int ssl3_write_pending(s,type,buf,len) 704static int ssl3_write_pending(SSL *s, int type, const unsigned char *buf,
610SSL *s; 705 unsigned int len)
611int type;
612char *buf;
613unsigned int len;
614 { 706 {
615 int i; 707 int i;
616 708
617/* XXXX */ 709/* XXXX */
618 if ((s->s3->wpend_tot > (int)len) || (s->s3->wpend_buf != buf) 710 if ((s->s3->wpend_tot > (int)len)
711 || ((s->s3->wpend_buf != buf) &&
712 !(s->mode & SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER))
619 || (s->s3->wpend_type != type)) 713 || (s->s3->wpend_type != type))
620 { 714 {
621 SSLerr(SSL_F_SSL3_WRITE_PENDING,SSL_R_BAD_WRITE_RETRY); 715 SSLerr(SSL_F_SSL3_WRITE_PENDING,SSL_R_BAD_WRITE_RETRY);
@@ -650,23 +744,77 @@ unsigned int len;
650 } 744 }
651 } 745 }
652 746
653int ssl3_read_bytes(s,type,buf,len) 747/* Return up to 'len' payload bytes received in 'type' records.
654SSL *s; 748 * 'type' is one of the following:
655int type; 749 *
656char *buf; 750 * - SSL3_RT_HANDSHAKE (when ssl3_get_message calls us)
657int len; 751 * - SSL3_RT_APPLICATION_DATA (when ssl3_read calls us)
752 * - 0 (during a shutdown, no data has to be returned)
753 *
754 * If we don't have stored data to work from, read a SSL/TLS record first
755 * (possibly multiple records if we still don't have anything to return).
756 *
757 * This function must handle any surprises the peer may have for us, such as
758 * Alert records (e.g. close_notify), ChangeCipherSpec records (not really
759 * a surprise, but handled as if it were), or renegotiation requests.
760 * Also if record payloads contain fragments too small to process, we store
761 * them until there is enough for the respective protocol (the record protocol
762 * may use arbitrary fragmentation and even interleaving):
763 * Change cipher spec protocol
764 * just 1 byte needed, no need for keeping anything stored
765 * Alert protocol
766 * 2 bytes needed (AlertLevel, AlertDescription)
767 * Handshake protocol
768 * 4 bytes needed (HandshakeType, uint24 length) -- we just have
769 * to detect unexpected Client Hello and Hello Request messages
770 * here, anything else is handled by higher layers
771 * Application data protocol
772 * none of our business
773 */
774int ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
658 { 775 {
659 int al,i,j,n,ret; 776 int al,i,j,ret;
777 unsigned int n;
660 SSL3_RECORD *rr; 778 SSL3_RECORD *rr;
661 void (*cb)()=NULL; 779 void (*cb)(const SSL *ssl,int type2,int val)=NULL;
662 BIO *bio;
663 780
664 if (s->s3->rbuf.buf == NULL) /* Not initalised yet */ 781 if (s->s3->rbuf.buf == NULL) /* Not initialized yet */
665 if (!ssl3_setup_buffers(s)) 782 if (!ssl3_setup_buffers(s))
666 return(-1); 783 return(-1);
667 784
785 if ((type && (type != SSL3_RT_APPLICATION_DATA) && (type != SSL3_RT_HANDSHAKE) && type) ||
786 (peek && (type != SSL3_RT_APPLICATION_DATA)))
787 {
788 SSLerr(SSL_F_SSL3_READ_BYTES, ERR_R_INTERNAL_ERROR);
789 return -1;
790 }
791
792 if ((type == SSL3_RT_HANDSHAKE) && (s->s3->handshake_fragment_len > 0))
793 /* (partially) satisfy request from storage */
794 {
795 unsigned char *src = s->s3->handshake_fragment;
796 unsigned char *dst = buf;
797 unsigned int k;
798
799 /* peek == 0 */
800 n = 0;
801 while ((len > 0) && (s->s3->handshake_fragment_len > 0))
802 {
803 *dst++ = *src++;
804 len--; s->s3->handshake_fragment_len--;
805 n++;
806 }
807 /* move any remaining fragment bytes: */
808 for (k = 0; k < s->s3->handshake_fragment_len; k++)
809 s->s3->handshake_fragment[k] = *src++;
810 return n;
811 }
812
813 /* Now s->s3->handshake_fragment_len == 0 if type == SSL3_RT_HANDSHAKE. */
814
668 if (!s->in_handshake && SSL_in_init(s)) 815 if (!s->in_handshake && SSL_in_init(s))
669 { 816 {
817 /* type == SSL3_RT_APPLICATION_DATA */
670 i=s->handshake_func(s); 818 i=s->handshake_func(s);
671 if (i < 0) return(i); 819 if (i < 0) return(i);
672 if (i == 0) 820 if (i == 0)
@@ -678,13 +826,13 @@ int len;
678start: 826start:
679 s->rwstate=SSL_NOTHING; 827 s->rwstate=SSL_NOTHING;
680 828
681 /* s->s3->rrec.type - is the type of record 829 /* s->s3->rrec.type - is the type of record
682 * s->s3->rrec.data, - data 830 * s->s3->rrec.data, - data
683 * s->s3->rrec.off, - ofset into 'data' for next read 831 * s->s3->rrec.off, - offset into 'data' for next read
684 * s->s3->rrec.length, - number of bytes. */ 832 * s->s3->rrec.length, - number of bytes. */
685 rr= &(s->s3->rrec); 833 rr = &(s->s3->rrec);
686 834
687 /* get new packet */ 835 /* get new packet if necessary */
688 if ((rr->length == 0) || (s->rstate == SSL_ST_READ_BODY)) 836 if ((rr->length == 0) || (s->rstate == SSL_ST_READ_BODY))
689 { 837 {
690 ret=ssl3_get_record(s); 838 ret=ssl3_get_record(s);
@@ -693,14 +841,17 @@ start:
693 841
694 /* we now have a packet which can be read and processed */ 842 /* we now have a packet which can be read and processed */
695 843
696 if (s->s3->change_cipher_spec && (rr->type != SSL3_RT_HANDSHAKE)) 844 if (s->s3->change_cipher_spec /* set when we receive ChangeCipherSpec,
845 * reset by ssl3_get_finished */
846 && (rr->type != SSL3_RT_HANDSHAKE))
697 { 847 {
698 al=SSL_AD_UNEXPECTED_MESSAGE; 848 al=SSL_AD_UNEXPECTED_MESSAGE;
699 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_DATA_BETWEEN_CCS_AND_FINISHED); 849 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_DATA_BETWEEN_CCS_AND_FINISHED);
700 goto err; 850 goto err;
701 } 851 }
702 852
703 /* If the other end has shutdown, throw anything we read away */ 853 /* If the other end has shut down, throw anything we read away
854 * (even in 'peek' mode) */
704 if (s->shutdown & SSL_RECEIVED_SHUTDOWN) 855 if (s->shutdown & SSL_RECEIVED_SHUTDOWN)
705 { 856 {
706 rr->length=0; 857 rr->length=0;
@@ -708,19 +859,107 @@ start:
708 return(0); 859 return(0);
709 } 860 }
710 861
711 /* Check for an incoming 'Client Request' message */ 862
712 if ((rr->type == SSL3_RT_HANDSHAKE) && (rr->length == 4) && 863 if (type == rr->type) /* SSL3_RT_APPLICATION_DATA or SSL3_RT_HANDSHAKE */
713 (rr->data[0] == SSL3_MT_CLIENT_REQUEST) && 864 {
865 /* make sure that we are not getting application data when we
866 * are doing a handshake for the first time */
867 if (SSL_in_init(s) && (type == SSL3_RT_APPLICATION_DATA) &&
868 (s->enc_read_ctx == NULL))
869 {
870 al=SSL_AD_UNEXPECTED_MESSAGE;
871 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_APP_DATA_IN_HANDSHAKE);
872 goto f_err;
873 }
874
875 if (len <= 0) return(len);
876
877 if ((unsigned int)len > rr->length)
878 n = rr->length;
879 else
880 n = (unsigned int)len;
881
882 memcpy(buf,&(rr->data[rr->off]),n);
883 if (!peek)
884 {
885 rr->length-=n;
886 rr->off+=n;
887 if (rr->length == 0)
888 {
889 s->rstate=SSL_ST_READ_HEADER;
890 rr->off=0;
891 }
892 }
893 return(n);
894 }
895
896
897 /* If we get here, then type != rr->type; if we have a handshake
898 * message, then it was unexpected (Hello Request or Client Hello). */
899
900 /* In case of record types for which we have 'fragment' storage,
901 * fill that so that we can process the data at a fixed place.
902 */
903 {
904 unsigned int dest_maxlen = 0;
905 unsigned char *dest = NULL;
906 unsigned int *dest_len = NULL;
907
908 if (rr->type == SSL3_RT_HANDSHAKE)
909 {
910 dest_maxlen = sizeof s->s3->handshake_fragment;
911 dest = s->s3->handshake_fragment;
912 dest_len = &s->s3->handshake_fragment_len;
913 }
914 else if (rr->type == SSL3_RT_ALERT)
915 {
916 dest_maxlen = sizeof s->s3->alert_fragment;
917 dest = s->s3->alert_fragment;
918 dest_len = &s->s3->alert_fragment_len;
919 }
920
921 if (dest_maxlen > 0)
922 {
923 n = dest_maxlen - *dest_len; /* available space in 'dest' */
924 if (rr->length < n)
925 n = rr->length; /* available bytes */
926
927 /* now move 'n' bytes: */
928 while (n-- > 0)
929 {
930 dest[(*dest_len)++] = rr->data[rr->off++];
931 rr->length--;
932 }
933
934 if (*dest_len < dest_maxlen)
935 goto start; /* fragment was too small */
936 }
937 }
938
939 /* s->s3->handshake_fragment_len == 4 iff rr->type == SSL3_RT_HANDSHAKE;
940 * s->s3->alert_fragment_len == 2 iff rr->type == SSL3_RT_ALERT.
941 * (Possibly rr is 'empty' now, i.e. rr->length may be 0.) */
942
943 /* If we are a client, check for an incoming 'Hello Request': */
944 if ((!s->server) &&
945 (s->s3->handshake_fragment_len >= 4) &&
946 (s->s3->handshake_fragment[0] == SSL3_MT_HELLO_REQUEST) &&
714 (s->session != NULL) && (s->session->cipher != NULL)) 947 (s->session != NULL) && (s->session->cipher != NULL))
715 { 948 {
716 if ((rr->data[1] != 0) || (rr->data[2] != 0) || 949 s->s3->handshake_fragment_len = 0;
717 (rr->data[3] != 0)) 950
951 if ((s->s3->handshake_fragment[1] != 0) ||
952 (s->s3->handshake_fragment[2] != 0) ||
953 (s->s3->handshake_fragment[3] != 0))
718 { 954 {
719 al=SSL_AD_DECODE_ERROR; 955 al=SSL_AD_DECODE_ERROR;
720 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_BAD_CLIENT_REQUEST); 956 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_BAD_HELLO_REQUEST);
721 goto err; 957 goto err;
722 } 958 }
723 959
960 if (s->msg_callback)
961 s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, s->s3->handshake_fragment, 4, s, s->msg_callback_arg);
962
724 if (SSL_is_init_finished(s) && 963 if (SSL_is_init_finished(s) &&
725 !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) && 964 !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) &&
726 !s->s3->renegotiate) 965 !s->s3->renegotiate)
@@ -728,228 +967,231 @@ start:
728 ssl3_renegotiate(s); 967 ssl3_renegotiate(s);
729 if (ssl3_renegotiate_check(s)) 968 if (ssl3_renegotiate_check(s))
730 { 969 {
731 n=s->handshake_func(s); 970 i=s->handshake_func(s);
732 if (n < 0) return(n); 971 if (i < 0) return(i);
733 if (n == 0) 972 if (i == 0)
734 { 973 {
735 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE); 974 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE);
736 return(-1); 975 return(-1);
737 } 976 }
977
978 if (!(s->mode & SSL_MODE_AUTO_RETRY))
979 {
980 if (s->s3->rbuf.left == 0) /* no read-ahead left? */
981 {
982 BIO *bio;
983 /* In the case where we try to read application data,
984 * but we trigger an SSL handshake, we return -1 with
985 * the retry option set. Otherwise renegotiation may
986 * cause nasty problems in the blocking world */
987 s->rwstate=SSL_READING;
988 bio=SSL_get_rbio(s);
989 BIO_clear_retry_flags(bio);
990 BIO_set_retry_read(bio);
991 return(-1);
992 }
993 }
738 } 994 }
739 } 995 }
740 rr->length=0; 996 /* we either finished a handshake or ignored the request,
741/* ZZZ */ goto start; 997 * now try again to obtain the (application) data we were asked for */
998 goto start;
742 } 999 }
743 1000
744 /* if it is not the type we want, or we have shutdown and want 1001 if (s->s3->alert_fragment_len >= 2)
745 * the peer shutdown */
746 if ((rr->type != type) || (s->shutdown & SSL_SENT_SHUTDOWN))
747 { 1002 {
748 if (rr->type == SSL3_RT_ALERT) 1003 int alert_level = s->s3->alert_fragment[0];
749 { 1004 int alert_descr = s->s3->alert_fragment[1];
750 if ((rr->length != 2) || (rr->off != 0))
751 {
752 al=SSL_AD_DECODE_ERROR;
753 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_BAD_ALERT_RECORD);
754 goto f_err;
755 }
756 1005
757 i=rr->data[0]; 1006 s->s3->alert_fragment_len = 0;
758 n=rr->data[1];
759 1007
760 /* clear from buffer */ 1008 if (s->msg_callback)
761 rr->length=0; 1009 s->msg_callback(0, s->version, SSL3_RT_ALERT, s->s3->alert_fragment, 2, s, s->msg_callback_arg);
762 1010
763 if (s->info_callback != NULL) 1011 if (s->info_callback != NULL)
764 cb=s->info_callback; 1012 cb=s->info_callback;
765 else if (s->ctx->info_callback != NULL) 1013 else if (s->ctx->info_callback != NULL)
766 cb=s->ctx->info_callback; 1014 cb=s->ctx->info_callback;
767 1015
768 if (cb != NULL) 1016 if (cb != NULL)
769 { 1017 {
770 j=(i<<8)|n; 1018 j = (alert_level << 8) | alert_descr;
771 cb(s,SSL_CB_READ_ALERT,j); 1019 cb(s, SSL_CB_READ_ALERT, j);
772 } 1020 }
773 1021
774 if (i == 1) 1022 if (alert_level == 1) /* warning */
775 { 1023 {
776 s->s3->warn_alert=n; 1024 s->s3->warn_alert = alert_descr;
777 if (n == SSL_AD_CLOSE_NOTIFY) 1025 if (alert_descr == SSL_AD_CLOSE_NOTIFY)
778 {
779 s->shutdown|=SSL_RECEIVED_SHUTDOWN;
780 return(0);
781 }
782 }
783 else if (i == 2)
784 { 1026 {
785 char tmp[16]; 1027 s->shutdown |= SSL_RECEIVED_SHUTDOWN;
786
787 s->rwstate=SSL_NOTHING;
788 s->s3->fatal_alert=n;
789 SSLerr(SSL_F_SSL3_READ_BYTES,1000+n);
790 sprintf(tmp,"%d",n);
791 ERR_add_error_data(2,"SSL alert number ",tmp);
792 s->shutdown|=SSL_RECEIVED_SHUTDOWN;
793 SSL_CTX_remove_session(s->ctx,s->session);
794 return(0); 1028 return(0);
795 } 1029 }
796 else
797 {
798 al=SSL_AD_ILLEGAL_PARAMETER;
799 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_UNKNOWN_ALERT_TYPE);
800 goto f_err;
801 }
802
803 rr->length=0;
804 goto start;
805 } 1030 }
806 1031 else if (alert_level == 2) /* fatal */
807 if (s->shutdown & SSL_SENT_SHUTDOWN)
808 { 1032 {
1033 char tmp[16];
1034
809 s->rwstate=SSL_NOTHING; 1035 s->rwstate=SSL_NOTHING;
810 rr->length=0; 1036 s->s3->fatal_alert = alert_descr;
1037 SSLerr(SSL_F_SSL3_READ_BYTES, SSL_AD_REASON_OFFSET + alert_descr);
1038 BIO_snprintf(tmp,sizeof tmp,"%d",alert_descr);
1039 ERR_add_error_data(2,"SSL alert number ",tmp);
1040 s->shutdown|=SSL_RECEIVED_SHUTDOWN;
1041 SSL_CTX_remove_session(s->ctx,s->session);
811 return(0); 1042 return(0);
812 } 1043 }
813 1044 else
814 if (rr->type == SSL3_RT_CHANGE_CIPHER_SPEC)
815 { 1045 {
816 if ( (rr->length != 1) || (rr->off != 0) || 1046 al=SSL_AD_ILLEGAL_PARAMETER;
817 (rr->data[0] != SSL3_MT_CCS)) 1047 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_UNKNOWN_ALERT_TYPE);
818 { 1048 goto f_err;
819 i=SSL_AD_ILLEGAL_PARAMETER;
820 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_BAD_CHANGE_CIPHER_SPEC);
821 goto err;
822 }
823
824 rr->length=0;
825 s->s3->change_cipher_spec=1;
826 if (!do_change_cipher_spec(s))
827 goto err;
828 else
829 goto start;
830 } 1049 }
831 1050
832 /* else we have a handshake */ 1051 goto start;
833 if ((rr->type == SSL3_RT_HANDSHAKE) && 1052 }
834 !s->in_handshake) 1053
1054 if (s->shutdown & SSL_SENT_SHUTDOWN) /* but we have not received a shutdown */
1055 {
1056 s->rwstate=SSL_NOTHING;
1057 rr->length=0;
1058 return(0);
1059 }
1060
1061 if (rr->type == SSL3_RT_CHANGE_CIPHER_SPEC)
1062 {
1063 /* 'Change Cipher Spec' is just a single byte, so we know
1064 * exactly what the record payload has to look like */
1065 if ( (rr->length != 1) || (rr->off != 0) ||
1066 (rr->data[0] != SSL3_MT_CCS))
835 { 1067 {
836 if (((s->state&SSL_ST_MASK) == SSL_ST_OK) && 1068 i=SSL_AD_ILLEGAL_PARAMETER;
837 !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS)) 1069 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_BAD_CHANGE_CIPHER_SPEC);
838 { 1070 goto err;
839 s->state=SSL_ST_BEFORE; 1071 }
840 s->new_session=1; 1072
841 } 1073 rr->length=0;
842 n=s->handshake_func(s);
843 if (n < 0) return(n);
844 if (n == 0)
845 {
846 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE);
847 return(-1);
848 }
849 1074
850 /* In the case where we try to read application data 1075 if (s->msg_callback)
851 * the first time, but we trigger an SSL handshake, we 1076 s->msg_callback(0, s->version, SSL3_RT_CHANGE_CIPHER_SPEC, rr->data, 1, s, s->msg_callback_arg);
852 * return -1 with the retry option set. I do this
853 * otherwise renegotiation can cause nasty problems
854 * in the non-blocking world */
855 1077
856 s->rwstate=SSL_READING; 1078 s->s3->change_cipher_spec=1;
857 bio=SSL_get_rbio(s); 1079 if (!do_change_cipher_spec(s))
858 BIO_clear_retry_flags(bio); 1080 goto err;
859 BIO_set_retry_read(bio); 1081 else
1082 goto start;
1083 }
1084
1085 /* Unexpected handshake message (Client Hello, or protocol violation) */
1086 if ((s->s3->handshake_fragment_len >= 4) && !s->in_handshake)
1087 {
1088 if (((s->state&SSL_ST_MASK) == SSL_ST_OK) &&
1089 !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS))
1090 {
1091#if 0 /* worked only because C operator preferences are not as expected (and
1092 * because this is not really needed for clients except for detecting
1093 * protocol violations): */
1094 s->state=SSL_ST_BEFORE|(s->server)
1095 ?SSL_ST_ACCEPT
1096 :SSL_ST_CONNECT;
1097#else
1098 s->state = s->server ? SSL_ST_ACCEPT : SSL_ST_CONNECT;
1099#endif
1100 s->new_session=1;
1101 }
1102 i=s->handshake_func(s);
1103 if (i < 0) return(i);
1104 if (i == 0)
1105 {
1106 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE);
860 return(-1); 1107 return(-1);
861 } 1108 }
862 1109
863 switch (rr->type) 1110 if (!(s->mode & SSL_MODE_AUTO_RETRY))
864 { 1111 {
865 default: 1112 if (s->s3->rbuf.left == 0) /* no read-ahead left? */
866#ifndef NO_TLS
867 /* TLS just ignores unknown message types */
868 if (s->version == TLS1_VERSION)
869 {
870 goto start;
871 }
872#endif
873 case SSL3_RT_CHANGE_CIPHER_SPEC:
874 case SSL3_RT_ALERT:
875 case SSL3_RT_HANDSHAKE:
876 al=SSL_AD_UNEXPECTED_MESSAGE;
877 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_UNEXPECTED_RECORD);
878 goto f_err;
879 case SSL3_RT_APPLICATION_DATA:
880 /* At this point, we were expecting something else,
881 * but have application data. What we do is set the
882 * error, and return -1. On the way out, if the
883 * library was running inside ssl3_read() and it makes
884 * sense to read application data at this point, we
885 * will indulge it. This will mostly happen during
886 * session renegotiation.
887 */
888 if (s->s3->in_read_app_data &&
889 (s->s3->total_renegotiations != 0) &&
890 ((
891 (s->state & SSL_ST_CONNECT) &&
892 (s->state >= SSL3_ST_CW_CLNT_HELLO_A) &&
893 (s->state <= SSL3_ST_CR_SRVR_HELLO_A)
894 ) || (
895 (s->state & SSL_ST_ACCEPT) &&
896 (s->state <= SSL3_ST_SW_HELLO_REQ_A) &&
897 (s->state >= SSL3_ST_SR_CLNT_HELLO_A)
898 )
899 ))
900 { 1113 {
901 s->s3->in_read_app_data=0; 1114 BIO *bio;
1115 /* In the case where we try to read application data,
1116 * but we trigger an SSL handshake, we return -1 with
1117 * the retry option set. Otherwise renegotiation may
1118 * cause nasty problems in the blocking world */
1119 s->rwstate=SSL_READING;
1120 bio=SSL_get_rbio(s);
1121 BIO_clear_retry_flags(bio);
1122 BIO_set_retry_read(bio);
902 return(-1); 1123 return(-1);
903 } 1124 }
904 else
905 {
906 al=SSL_AD_UNEXPECTED_MESSAGE;
907 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_UNEXPECTED_RECORD);
908 goto f_err;
909 }
910 } 1125 }
1126 goto start;
911 } 1127 }
912 1128
913 /* make sure that we are not getting application data when we 1129 switch (rr->type)
914 * are doing a handshake for the first time */
915 if (SSL_in_init(s) && (type == SSL3_RT_APPLICATION_DATA) &&
916 (s->enc_read_ctx == NULL))
917 { 1130 {
1131 default:
1132#ifndef OPENSSL_NO_TLS
1133 /* TLS just ignores unknown message types */
1134 if (s->version == TLS1_VERSION)
1135 {
1136 rr->length = 0;
1137 goto start;
1138 }
1139#endif
918 al=SSL_AD_UNEXPECTED_MESSAGE; 1140 al=SSL_AD_UNEXPECTED_MESSAGE;
919 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_APP_DATA_IN_HANDSHAKE); 1141 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_UNEXPECTED_RECORD);
920 goto f_err; 1142 goto f_err;
1143 case SSL3_RT_CHANGE_CIPHER_SPEC:
1144 case SSL3_RT_ALERT:
1145 case SSL3_RT_HANDSHAKE:
1146 /* we already handled all of these, with the possible exception
1147 * of SSL3_RT_HANDSHAKE when s->in_handshake is set, but that
1148 * should not happen when type != rr->type */
1149 al=SSL_AD_UNEXPECTED_MESSAGE;
1150 SSLerr(SSL_F_SSL3_READ_BYTES,ERR_R_INTERNAL_ERROR);
1151 goto f_err;
1152 case SSL3_RT_APPLICATION_DATA:
1153 /* At this point, we were expecting handshake data,
1154 * but have application data. If the library was
1155 * running inside ssl3_read() (i.e. in_read_app_data
1156 * is set) and it makes sense to read application data
1157 * at this point (session renegotiation not yet started),
1158 * we will indulge it.
1159 */
1160 if (s->s3->in_read_app_data &&
1161 (s->s3->total_renegotiations != 0) &&
1162 ((
1163 (s->state & SSL_ST_CONNECT) &&
1164 (s->state >= SSL3_ST_CW_CLNT_HELLO_A) &&
1165 (s->state <= SSL3_ST_CR_SRVR_HELLO_A)
1166 ) || (
1167 (s->state & SSL_ST_ACCEPT) &&
1168 (s->state <= SSL3_ST_SW_HELLO_REQ_A) &&
1169 (s->state >= SSL3_ST_SR_CLNT_HELLO_A)
1170 )
1171 ))
1172 {
1173 s->s3->in_read_app_data=2;
1174 return(-1);
1175 }
1176 else
1177 {
1178 al=SSL_AD_UNEXPECTED_MESSAGE;
1179 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_UNEXPECTED_RECORD);
1180 goto f_err;
1181 }
921 } 1182 }
1183 /* not reached */
922 1184
923 if (len <= 0) return(len);
924
925 if ((unsigned int)len > rr->length)
926 n=rr->length;
927 else
928 n=len;
929
930 memcpy(buf,&(rr->data[rr->off]),(unsigned int)n);
931 rr->length-=n;
932 rr->off+=n;
933 if (rr->length <= 0)
934 {
935 s->rstate=SSL_ST_READ_HEADER;
936 rr->off=0;
937 }
938
939 if (type == SSL3_RT_HANDSHAKE)
940 ssl3_finish_mac(s,(unsigned char *)buf,n);
941 return(n);
942f_err: 1185f_err:
943 ssl3_send_alert(s,SSL3_AL_FATAL,al); 1186 ssl3_send_alert(s,SSL3_AL_FATAL,al);
944err: 1187err:
945 return(-1); 1188 return(-1);
946 } 1189 }
947 1190
948static int do_change_cipher_spec(s) 1191static int do_change_cipher_spec(SSL *s)
949SSL *s;
950 { 1192 {
951 int i; 1193 int i;
952 unsigned char *sender; 1194 const char *sender;
953 int slen; 1195 int slen;
954 1196
955 if (s->state & SSL_ST_ACCEPT) 1197 if (s->state & SSL_ST_ACCEPT)
@@ -971,46 +1213,29 @@ SSL *s;
971 * the finished message */ 1213 * the finished message */
972 if (s->state & SSL_ST_CONNECT) 1214 if (s->state & SSL_ST_CONNECT)
973 { 1215 {
974 sender=s->method->ssl3_enc->server_finished; 1216 sender=s->method->ssl3_enc->server_finished_label;
975 slen=s->method->ssl3_enc->server_finished_len; 1217 slen=s->method->ssl3_enc->server_finished_label_len;
976 } 1218 }
977 else 1219 else
978 { 1220 {
979 sender=s->method->ssl3_enc->client_finished; 1221 sender=s->method->ssl3_enc->client_finished_label;
980 slen=s->method->ssl3_enc->client_finished_len; 1222 slen=s->method->ssl3_enc->client_finished_label_len;
981 } 1223 }
982 1224
983 s->method->ssl3_enc->final_finish_mac(s, 1225 s->s3->tmp.peer_finish_md_len = s->method->ssl3_enc->final_finish_mac(s,
984 &(s->s3->finish_dgst1), 1226 &(s->s3->finish_dgst1),
985 &(s->s3->finish_dgst2), 1227 &(s->s3->finish_dgst2),
986 sender,slen,&(s->s3->tmp.finish_md[0])); 1228 sender,slen,s->s3->tmp.peer_finish_md);
987 1229
988 return(1); 1230 return(1);
989 } 1231 }
990 1232
991int ssl3_do_write(s,type) 1233void ssl3_send_alert(SSL *s, int level, int desc)
992SSL *s;
993int type;
994 {
995 int ret;
996
997 ret=ssl3_write_bytes(s,type,(char *)
998 &(s->init_buf->data[s->init_off]),s->init_num);
999 if (ret == s->init_num)
1000 return(1);
1001 if (ret < 0) return(-1);
1002 s->init_off+=ret;
1003 s->init_num-=ret;
1004 return(0);
1005 }
1006
1007void ssl3_send_alert(s,level,desc)
1008SSL *s;
1009int level;
1010int desc;
1011 { 1234 {
1012 /* Map tls/ssl alert value to correct one */ 1235 /* Map tls/ssl alert value to correct one */
1013 desc=s->method->ssl3_enc->alert_value(desc); 1236 desc=s->method->ssl3_enc->alert_value(desc);
1237 if (s->version == SSL3_VERSION && desc == SSL_AD_PROTOCOL_VERSION)
1238 desc = SSL_AD_HANDSHAKE_FAILURE; /* SSL 3.0 does not have protocol_version alerts */
1014 if (desc < 0) return; 1239 if (desc < 0) return;
1015 /* If a fatal one, remove from cache */ 1240 /* If a fatal one, remove from cache */
1016 if ((level == 2) && (s->session != NULL)) 1241 if ((level == 2) && (s->session != NULL))
@@ -1019,37 +1244,39 @@ int desc;
1019 s->s3->alert_dispatch=1; 1244 s->s3->alert_dispatch=1;
1020 s->s3->send_alert[0]=level; 1245 s->s3->send_alert[0]=level;
1021 s->s3->send_alert[1]=desc; 1246 s->s3->send_alert[1]=desc;
1022 if (s->s3->wbuf.left == 0) /* data still being written out */ 1247 if (s->s3->wbuf.left == 0) /* data still being written out? */
1023 ssl3_dispatch_alert(s); 1248 ssl3_dispatch_alert(s);
1024 /* else data is still being written out, we will get written 1249 /* else data is still being written out, we will get written
1025 * some time in the future */ 1250 * some time in the future */
1026 } 1251 }
1027 1252
1028int ssl3_dispatch_alert(s) 1253int ssl3_dispatch_alert(SSL *s)
1029SSL *s;
1030 { 1254 {
1031 int i,j; 1255 int i,j;
1032 void (*cb)()=NULL; 1256 void (*cb)(const SSL *ssl,int type,int val)=NULL;
1033 1257
1034 s->s3->alert_dispatch=0; 1258 s->s3->alert_dispatch=0;
1035 i=do_ssl3_write(s,SSL3_RT_ALERT,&(s->s3->send_alert[0]),2); 1259 i = do_ssl3_write(s, SSL3_RT_ALERT, &s->s3->send_alert[0], 2, 0);
1036 if (i <= 0) 1260 if (i <= 0)
1037 { 1261 {
1038 s->s3->alert_dispatch=1; 1262 s->s3->alert_dispatch=1;
1039 } 1263 }
1040 else 1264 else
1041 { 1265 {
1042 /* If it is important, send it now. If the message 1266 /* Alert sent to BIO. If it is important, flush it now.
1043 * does not get sent due to non-blocking IO, we will 1267 * If the message does not get sent due to non-blocking IO,
1044 * not worry too much. */ 1268 * we will not worry too much. */
1045 if (s->s3->send_alert[0] == SSL3_AL_FATAL) 1269 if (s->s3->send_alert[0] == SSL3_AL_FATAL)
1046 BIO_flush(s->wbio); 1270 (void)BIO_flush(s->wbio);
1271
1272 if (s->msg_callback)
1273 s->msg_callback(1, s->version, SSL3_RT_ALERT, s->s3->send_alert, 2, s, s->msg_callback_arg);
1047 1274
1048 if (s->info_callback != NULL) 1275 if (s->info_callback != NULL)
1049 cb=s->info_callback; 1276 cb=s->info_callback;
1050 else if (s->ctx->info_callback != NULL) 1277 else if (s->ctx->info_callback != NULL)
1051 cb=s->ctx->info_callback; 1278 cb=s->ctx->info_callback;
1052 1279
1053 if (cb != NULL) 1280 if (cb != NULL)
1054 { 1281 {
1055 j=(s->s3->send_alert[0]<<8)|s->s3->send_alert[1]; 1282 j=(s->s3->send_alert[0]<<8)|s->s3->send_alert[1];
@@ -1058,4 +1285,3 @@ SSL *s;
1058 } 1285 }
1059 return(i); 1286 return(i);
1060 } 1287 }
1061
diff --git a/src/lib/libssl/s3_srvr.c b/src/lib/libssl/s3_srvr.c
index 64903af151..99b6a86983 100644
--- a/src/lib/libssl/s3_srvr.c
+++ b/src/lib/libssl/s3_srvr.c
@@ -55,52 +55,88 @@
55 * copied and put under another distribution licence 55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.] 56 * [including the GNU Public Licence.]
57 */ 57 */
58/* ====================================================================
59 * Copyright (c) 1998-2002 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 */
58 111
59#define REUSE_CIPHER_BUG 112#define REUSE_CIPHER_BUG
113#define NETSCAPE_HANG_BUG
114
60 115
61#include <stdio.h> 116#include <stdio.h>
62#include "buffer.h" 117#include <openssl/buffer.h>
63#include "rand.h" 118#include <openssl/rand.h>
64#include "objects.h" 119#include <openssl/objects.h>
65#include "evp.h" 120#include <openssl/evp.h>
66#include "x509.h" 121#include <openssl/x509.h>
122#include <openssl/krb5_asn.h>
67#include "ssl_locl.h" 123#include "ssl_locl.h"
124#include "kssl_lcl.h"
125#include <openssl/md5.h>
68 126
69#define BREAK break 127static SSL_METHOD *ssl3_get_server_method(int ver);
70/* SSLerr(SSL_F_SSL3_ACCEPT,ERR_R_MALLOC_FAILURE);
71 * SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,ERR_R_MALLOC_FAILURE);
72 * SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
73 * SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,ERR_R_MALLOC_FAILURE);
74 * SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,ERR_R_MALLOC_FAILURE);
75 */
76
77#ifndef NOPROTO
78static int ssl3_get_client_hello(SSL *s); 128static int ssl3_get_client_hello(SSL *s);
129static int ssl3_check_client_hello(SSL *s);
79static int ssl3_send_server_hello(SSL *s); 130static int ssl3_send_server_hello(SSL *s);
80static int ssl3_send_server_key_exchange(SSL *s); 131static int ssl3_send_server_key_exchange(SSL *s);
81static int ssl3_send_certificate_request(SSL *s); 132static int ssl3_send_certificate_request(SSL *s);
82static int ssl3_send_server_done(SSL *s); 133static int ssl3_send_server_done(SSL *s);
83static int ssl3_get_cert_verify(SSL *s);
84static int ssl3_get_client_key_exchange(SSL *s); 134static int ssl3_get_client_key_exchange(SSL *s);
85static int ssl3_get_client_certificate(SSL *s); 135static int ssl3_get_client_certificate(SSL *s);
136static int ssl3_get_cert_verify(SSL *s);
86static int ssl3_send_hello_request(SSL *s); 137static int ssl3_send_hello_request(SSL *s);
87 138
88#else 139static SSL_METHOD *ssl3_get_server_method(int ver)
89
90static int ssl3_get_client_hello();
91static int ssl3_send_server_hello();
92static int ssl3_send_server_key_exchange();
93static int ssl3_send_certificate_request();
94static int ssl3_send_server_done();
95static int ssl3_get_cert_verify();
96static int ssl3_get_client_key_exchange();
97static int ssl3_get_client_certificate();
98static int ssl3_send_hello_request();
99
100#endif
101
102static SSL_METHOD *ssl3_get_server_method(ver)
103int ver;
104 { 140 {
105 if (ver == SSL3_VERSION) 141 if (ver == SSL3_VERSION)
106 return(SSLv3_server_method()); 142 return(SSLv3_server_method());
@@ -108,35 +144,32 @@ int ver;
108 return(NULL); 144 return(NULL);
109 } 145 }
110 146
111SSL_METHOD *SSLv3_server_method() 147SSL_METHOD *SSLv3_server_method(void)
112 { 148 {
113 static int init=1; 149 static int init=1;
114 static SSL_METHOD SSLv3_server_data; 150 static SSL_METHOD SSLv3_server_data;
115 151
116 if (init) 152 if (init)
117 { 153 {
118 init=0;
119 memcpy((char *)&SSLv3_server_data,(char *)sslv3_base_method(), 154 memcpy((char *)&SSLv3_server_data,(char *)sslv3_base_method(),
120 sizeof(SSL_METHOD)); 155 sizeof(SSL_METHOD));
121 SSLv3_server_data.ssl_accept=ssl3_accept; 156 SSLv3_server_data.ssl_accept=ssl3_accept;
122 SSLv3_server_data.get_ssl_method=ssl3_get_server_method; 157 SSLv3_server_data.get_ssl_method=ssl3_get_server_method;
158 init=0;
123 } 159 }
124 return(&SSLv3_server_data); 160 return(&SSLv3_server_data);
125 } 161 }
126 162
127int ssl3_accept(s) 163int ssl3_accept(SSL *s)
128SSL *s;
129 { 164 {
130 BUF_MEM *buf; 165 BUF_MEM *buf;
131 unsigned long l,Time=time(NULL); 166 unsigned long l,Time=time(NULL);
132 void (*cb)()=NULL; 167 void (*cb)(const SSL *ssl,int type,int val)=NULL;
133 long num1; 168 long num1;
134 int ret= -1; 169 int ret= -1;
135 CERT *ct;
136 BIO *under;
137 int new_state,state,skip=0; 170 int new_state,state,skip=0;
138 171
139 RAND_seed((unsigned char *)&Time,sizeof(Time)); 172 RAND_add(&Time,sizeof(Time),0);
140 ERR_clear_error(); 173 ERR_clear_error();
141 clear_sys_error(); 174 clear_sys_error();
142 175
@@ -146,20 +179,14 @@ SSL *s;
146 cb=s->ctx->info_callback; 179 cb=s->ctx->info_callback;
147 180
148 /* init things to blank */ 181 /* init things to blank */
149 if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
150 s->in_handshake++; 182 s->in_handshake++;
183 if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
151 184
152#ifdef undef 185 if (s->cert == NULL)
153 /* FIX THIS EAY EAY EAY */
154 /* we don't actually need a cert, we just need a cert or a DH_tmp */
155 if (((s->session == NULL) || (s->session->cert == NULL)) &&
156 (s->cert == NULL))
157 { 186 {
158 SSLerr(SSL_F_SSL3_ACCEPT,SSL_R_NO_CERTIFICATE_SET); 187 SSLerr(SSL_F_SSL3_ACCEPT,SSL_R_NO_CERTIFICATE_SET);
159 ret= -1; 188 return(-1);
160 goto end;
161 } 189 }
162#endif
163 190
164 for (;;) 191 for (;;)
165 { 192 {
@@ -176,11 +203,14 @@ SSL *s;
176 case SSL_ST_BEFORE|SSL_ST_ACCEPT: 203 case SSL_ST_BEFORE|SSL_ST_ACCEPT:
177 case SSL_ST_OK|SSL_ST_ACCEPT: 204 case SSL_ST_OK|SSL_ST_ACCEPT:
178 205
206 s->server=1;
179 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1); 207 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
180 208
181 if ((s->version>>8) != 3) 209 if ((s->version>>8) != 3)
182 abort(); 210 {
183 /* s->version=SSL3_VERSION; */ 211 SSLerr(SSL_F_SSL3_ACCEPT, ERR_R_INTERNAL_ERROR);
212 return -1;
213 }
184 s->type=SSL_ST_ACCEPT; 214 s->type=SSL_ST_ACCEPT;
185 215
186 if (s->init_buf == NULL) 216 if (s->init_buf == NULL)
@@ -204,22 +234,24 @@ SSL *s;
204 goto end; 234 goto end;
205 } 235 }
206 236
207 /* Ok, we now need to push on a buffering BIO so that
208 * the output is sent in a way that TCP likes :-)
209 */
210 if (!ssl_init_wbio_buffer(s,1)) { ret= -1; goto end; }
211
212 s->init_num=0; 237 s->init_num=0;
213 238
214 if (s->state != SSL_ST_RENEGOTIATE) 239 if (s->state != SSL_ST_RENEGOTIATE)
215 { 240 {
216 s->state=SSL3_ST_SR_CLNT_HELLO_A; 241 /* Ok, we now need to push on a buffering BIO so that
242 * the output is sent in a way that TCP likes :-)
243 */
244 if (!ssl_init_wbio_buffer(s,1)) { ret= -1; goto end; }
245
217 ssl3_init_finished_mac(s); 246 ssl3_init_finished_mac(s);
218 s->ctx->sess_accept++; 247 s->state=SSL3_ST_SR_CLNT_HELLO_A;
248 s->ctx->stats.sess_accept++;
219 } 249 }
220 else 250 else
221 { 251 {
222 s->ctx->sess_accept_renegotiate++; 252 /* s->state == SSL_ST_RENEGOTIATE,
253 * we will just send a HelloRequest */
254 s->ctx->stats.sess_accept_renegotiate++;
223 s->state=SSL3_ST_SW_HELLO_REQ_A; 255 s->state=SSL3_ST_SW_HELLO_REQ_A;
224 } 256 }
225 break; 257 break;
@@ -238,19 +270,8 @@ SSL *s;
238 break; 270 break;
239 271
240 case SSL3_ST_SW_HELLO_REQ_C: 272 case SSL3_ST_SW_HELLO_REQ_C:
241 /* remove buffering on output */
242 under=BIO_pop(s->wbio);
243 if (under != NULL)
244 s->wbio=under;
245 else
246 abort(); /* ok */
247 BIO_free(s->bbio);
248 s->bbio=NULL;
249
250 s->state=SSL_ST_OK; 273 s->state=SSL_ST_OK;
251 ret=1; 274 break;
252 goto end;
253 /* break; */
254 275
255 case SSL3_ST_SR_CLNT_HELLO_A: 276 case SSL3_ST_SR_CLNT_HELLO_A:
256 case SSL3_ST_SR_CLNT_HELLO_B: 277 case SSL3_ST_SR_CLNT_HELLO_B:
@@ -259,6 +280,7 @@ SSL *s;
259 s->shutdown=0; 280 s->shutdown=0;
260 ret=ssl3_get_client_hello(s); 281 ret=ssl3_get_client_hello(s);
261 if (ret <= 0) goto end; 282 if (ret <= 0) goto end;
283 s->new_session = 2;
262 s->state=SSL3_ST_SW_SRVR_HELLO_A; 284 s->state=SSL3_ST_SW_SRVR_HELLO_A;
263 s->init_num=0; 285 s->init_num=0;
264 break; 286 break;
@@ -292,40 +314,34 @@ SSL *s;
292 case SSL3_ST_SW_KEY_EXCH_A: 314 case SSL3_ST_SW_KEY_EXCH_A:
293 case SSL3_ST_SW_KEY_EXCH_B: 315 case SSL3_ST_SW_KEY_EXCH_B:
294 l=s->s3->tmp.new_cipher->algorithms; 316 l=s->s3->tmp.new_cipher->algorithms;
295 if (s->session->cert == NULL)
296 {
297 if (s->cert != NULL)
298 {
299 CRYPTO_add(&s->cert->references,1,CRYPTO_LOCK_SSL_CERT);
300 s->session->cert=s->cert;
301 }
302 else
303 {
304 CRYPTO_add(&s->ctx->default_cert->references,1,CRYPTO_LOCK_SSL_CERT);
305 s->session->cert=s->ctx->default_cert;
306 }
307 }
308 ct=s->session->cert;
309 317
310 /* clear this, it may get reset by 318 /* clear this, it may get reset by
311 * send_server_key_exchange */ 319 * send_server_key_exchange */
312 if (s->options & SSL_OP_EPHEMERAL_RSA) 320 if ((s->options & SSL_OP_EPHEMERAL_RSA)
321#ifndef OPENSSL_NO_KRB5
322 && !(l & SSL_KRB5)
323#endif /* OPENSSL_NO_KRB5 */
324 )
325 /* option SSL_OP_EPHEMERAL_RSA sends temporary RSA key
326 * even when forbidden by protocol specs
327 * (handshake may fail as clients are not required to
328 * be able to handle this) */
313 s->s3->tmp.use_rsa_tmp=1; 329 s->s3->tmp.use_rsa_tmp=1;
314 else 330 else
315 s->s3->tmp.use_rsa_tmp=0; 331 s->s3->tmp.use_rsa_tmp=0;
316 332
317 /* only send if a DH key exchange, fortezza or 333 /* only send if a DH key exchange, fortezza or
318 * RSA but we have a sign only certificate */ 334 * RSA but we have a sign only certificate */
319 if ( s->s3->tmp.use_rsa_tmp || 335 if (s->s3->tmp.use_rsa_tmp
320 (l & (SSL_DH|SSL_kFZA)) || 336 || (l & (SSL_DH|SSL_kFZA))
321 ((l & SSL_kRSA) && 337 || ((l & SSL_kRSA)
322 ((ct->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL)|| 338 && (s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL
323 ((l & SSL_EXPORT) && 339 || (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher)
324 (EVP_PKEY_size(ct->pkeys[SSL_PKEY_RSA_ENC].privatekey)*8 > 512) 340 && EVP_PKEY_size(s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey)*8 > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher)
325 ) 341 )
326 ) 342 )
343 )
327 ) 344 )
328 )
329 { 345 {
330 ret=ssl3_send_server_key_exchange(s); 346 ret=ssl3_send_server_key_exchange(s);
331 if (ret <= 0) goto end; 347 if (ret <= 0) goto end;
@@ -339,9 +355,21 @@ SSL *s;
339 355
340 case SSL3_ST_SW_CERT_REQ_A: 356 case SSL3_ST_SW_CERT_REQ_A:
341 case SSL3_ST_SW_CERT_REQ_B: 357 case SSL3_ST_SW_CERT_REQ_B:
342 if (!(s->verify_mode & SSL_VERIFY_PEER) || 358 if (/* don't request cert unless asked for it: */
359 !(s->verify_mode & SSL_VERIFY_PEER) ||
360 /* if SSL_VERIFY_CLIENT_ONCE is set,
361 * don't request cert during re-negotiation: */
343 ((s->session->peer != NULL) && 362 ((s->session->peer != NULL) &&
344 (s->verify_mode & SSL_VERIFY_CLIENT_ONCE))) 363 (s->verify_mode & SSL_VERIFY_CLIENT_ONCE)) ||
364 /* never request cert in anonymous ciphersuites
365 * (see section "Certificate request" in SSL 3 drafts
366 * and in RFC 2246): */
367 ((s->s3->tmp.new_cipher->algorithms & SSL_aNULL) &&
368 /* ... except when the application insists on verification
369 * (against the specs, but s3_clnt.c accepts this for SSL 3) */
370 !(s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT)) ||
371 /* never request cert in Kerberos ciphersuites */
372 (s->s3->tmp.new_cipher->algorithms & SSL_aKRB5))
345 { 373 {
346 /* no cert request */ 374 /* no cert request */
347 skip=1; 375 skip=1;
@@ -353,7 +381,12 @@ SSL *s;
353 s->s3->tmp.cert_request=1; 381 s->s3->tmp.cert_request=1;
354 ret=ssl3_send_certificate_request(s); 382 ret=ssl3_send_certificate_request(s);
355 if (ret <= 0) goto end; 383 if (ret <= 0) goto end;
384#ifndef NETSCAPE_HANG_BUG
356 s->state=SSL3_ST_SW_SRVR_DONE_A; 385 s->state=SSL3_ST_SW_SRVR_DONE_A;
386#else
387 s->state=SSL3_ST_SW_FLUSH;
388 s->s3->tmp.next_state=SSL3_ST_SR_CERT_A;
389#endif
357 s->init_num=0; 390 s->init_num=0;
358 } 391 }
359 break; 392 break;
@@ -383,12 +416,20 @@ SSL *s;
383 416
384 case SSL3_ST_SR_CERT_A: 417 case SSL3_ST_SR_CERT_A:
385 case SSL3_ST_SR_CERT_B: 418 case SSL3_ST_SR_CERT_B:
386 /* could be sent for a DH cert, even if we 419 /* Check for second client hello (MS SGC) */
387 * have not asked for it :-) */ 420 ret = ssl3_check_client_hello(s);
388 ret=ssl3_get_client_certificate(s); 421 if (ret <= 0)
389 if (ret <= 0) goto end; 422 goto end;
390 s->init_num=0; 423 if (ret == 2)
391 s->state=SSL3_ST_SR_KEY_EXCH_A; 424 s->state = SSL3_ST_SR_CLNT_HELLO_C;
425 else {
426 /* could be sent for a DH cert, even if we
427 * have not asked for it :-) */
428 ret=ssl3_get_client_certificate(s);
429 if (ret <= 0) goto end;
430 s->init_num=0;
431 s->state=SSL3_ST_SR_KEY_EXCH_A;
432 }
392 break; 433 break;
393 434
394 case SSL3_ST_SR_KEY_EXCH_A: 435 case SSL3_ST_SR_KEY_EXCH_A:
@@ -402,10 +443,10 @@ SSL *s;
402 * a client cert, it can be verified */ 443 * a client cert, it can be verified */
403 s->method->ssl3_enc->cert_verify_mac(s, 444 s->method->ssl3_enc->cert_verify_mac(s,
404 &(s->s3->finish_dgst1), 445 &(s->s3->finish_dgst1),
405 &(s->s3->tmp.finish_md[0])); 446 &(s->s3->tmp.cert_verify_md[0]));
406 s->method->ssl3_enc->cert_verify_mac(s, 447 s->method->ssl3_enc->cert_verify_mac(s,
407 &(s->s3->finish_dgst2), 448 &(s->s3->finish_dgst2),
408 &(s->s3->tmp.finish_md[MD5_DIGEST_LENGTH])); 449 &(s->s3->tmp.cert_verify_md[MD5_DIGEST_LENGTH]));
409 450
410 break; 451 break;
411 452
@@ -459,8 +500,8 @@ SSL *s;
459 case SSL3_ST_SW_FINISHED_B: 500 case SSL3_ST_SW_FINISHED_B:
460 ret=ssl3_send_finished(s, 501 ret=ssl3_send_finished(s,
461 SSL3_ST_SW_FINISHED_A,SSL3_ST_SW_FINISHED_B, 502 SSL3_ST_SW_FINISHED_A,SSL3_ST_SW_FINISHED_B,
462 s->method->ssl3_enc->server_finished, 503 s->method->ssl3_enc->server_finished_label,
463 s->method->ssl3_enc->server_finished_len); 504 s->method->ssl3_enc->server_finished_label_len);
464 if (ret <= 0) goto end; 505 if (ret <= 0) goto end;
465 s->state=SSL3_ST_SW_FLUSH; 506 s->state=SSL3_ST_SW_FLUSH;
466 if (s->hit) 507 if (s->hit)
@@ -478,26 +519,27 @@ SSL *s;
478 s->init_buf=NULL; 519 s->init_buf=NULL;
479 520
480 /* remove buffering on output */ 521 /* remove buffering on output */
481 under=BIO_pop(s->wbio); 522 ssl_free_wbio_buffer(s);
482 if (under != NULL)
483 s->wbio=under;
484 else
485 abort(); /* ok */
486 BIO_free(s->bbio);
487 s->bbio=NULL;
488 523
489 s->new_session=0;
490 s->init_num=0; 524 s->init_num=0;
491 525
492 ssl_update_cache(s,SSL_SESS_CACHE_SERVER); 526 if (s->new_session == 2) /* skipped if we just sent a HelloRequest */
493 527 {
494 s->ctx->sess_accept_good++; 528 /* actually not necessarily a 'new' session unless
495 /* s->server=1; */ 529 * SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION is set */
496 s->handshake_func=ssl3_accept; 530
497 ret=1; 531 s->new_session=0;
498 532
499 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1); 533 ssl_update_cache(s,SSL_SESS_CACHE_SERVER);
500 534
535 s->ctx->stats.sess_accept_good++;
536 /* s->server=1; */
537 s->handshake_func=ssl3_accept;
538
539 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
540 }
541
542 ret = 1;
501 goto end; 543 goto end;
502 /* break; */ 544 /* break; */
503 545
@@ -530,21 +572,20 @@ SSL *s;
530end: 572end:
531 /* BIO_flush(s->wbio); */ 573 /* BIO_flush(s->wbio); */
532 574
575 s->in_handshake--;
533 if (cb != NULL) 576 if (cb != NULL)
534 cb(s,SSL_CB_ACCEPT_EXIT,ret); 577 cb(s,SSL_CB_ACCEPT_EXIT,ret);
535 s->in_handshake--;
536 return(ret); 578 return(ret);
537 } 579 }
538 580
539static int ssl3_send_hello_request(s) 581static int ssl3_send_hello_request(SSL *s)
540SSL *s;
541 { 582 {
542 unsigned char *p; 583 unsigned char *p;
543 584
544 if (s->state == SSL3_ST_SW_HELLO_REQ_A) 585 if (s->state == SSL3_ST_SW_HELLO_REQ_A)
545 { 586 {
546 p=(unsigned char *)s->init_buf->data; 587 p=(unsigned char *)s->init_buf->data;
547 *(p++)=SSL3_MT_CLIENT_REQUEST; 588 *(p++)=SSL3_MT_HELLO_REQUEST;
548 *(p++)=0; 589 *(p++)=0;
549 *(p++)=0; 590 *(p++)=0;
550 *(p++)=0; 591 *(p++)=0;
@@ -559,15 +600,48 @@ SSL *s;
559 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE)); 600 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
560 } 601 }
561 602
562static int ssl3_get_client_hello(s) 603static int ssl3_check_client_hello(SSL *s)
563SSL *s; 604 {
605 int ok;
606 long n;
607
608 /* this function is called when we really expect a Certificate message,
609 * so permit appropriate message length */
610 n=ssl3_get_message(s,
611 SSL3_ST_SR_CERT_A,
612 SSL3_ST_SR_CERT_B,
613 -1,
614 s->max_cert_list,
615 &ok);
616 if (!ok) return((int)n);
617 s->s3->tmp.reuse_message = 1;
618 if (s->s3->tmp.message_type == SSL3_MT_CLIENT_HELLO)
619 {
620 /* Throw away what we have done so far in the current handshake,
621 * which will now be aborted. (A full SSL_clear would be too much.)
622 * I hope that tmp.dh is the only thing that may need to be cleared
623 * when a handshake is not completed ... */
624#ifndef OPENSSL_NO_DH
625 if (s->s3->tmp.dh != NULL)
626 {
627 DH_free(s->s3->tmp.dh);
628 s->s3->tmp.dh = NULL;
629 }
630#endif
631 return 2;
632 }
633 return 1;
634}
635
636static int ssl3_get_client_hello(SSL *s)
564 { 637 {
565 int i,j,ok,al,ret= -1; 638 int i,j,ok,al,ret= -1;
566 long n; 639 long n;
567 unsigned long id; 640 unsigned long id;
568 unsigned char *p,*d; 641 unsigned char *p,*d,*q;
569 SSL_CIPHER *c; 642 SSL_CIPHER *c;
570 STACK *ciphers=NULL; 643 SSL_COMP *comp=NULL;
644 STACK_OF(SSL_CIPHER) *ciphers=NULL;
571 645
572 /* We do this so that we will respond with our native type. 646 /* We do this so that we will respond with our native type.
573 * If we are TLSv1 and we get SSLv3, we will respond with TLSv1, 647 * If we are TLSv1 and we get SSLv3, we will respond with TLSv1,
@@ -588,13 +662,25 @@ SSL *s;
588 &ok); 662 &ok);
589 663
590 if (!ok) return((int)n); 664 if (!ok) return((int)n);
591 d=p=(unsigned char *)s->init_buf->data; 665 d=p=(unsigned char *)s->init_msg;
592 666
593 /* The version number has already been checked in ssl3_get_message. 667 /* use version from inside client hello, not from record header
594 * I a native TLSv1/SSLv3 method, the match must be correct except 668 * (may differ: see RFC 2246, Appendix E, second paragraph) */
595 * perhaps for the first message */ 669 s->client_version=(((int)p[0])<<8)|(int)p[1];
596 p+=2; 670 p+=2;
597 671
672 if (s->client_version < s->version)
673 {
674 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_WRONG_VERSION_NUMBER);
675 if ((s->client_version>>8) == SSL3_VERSION_MAJOR)
676 {
677 /* similar to ssl3_get_record, send alert using remote version number */
678 s->version = s->client_version;
679 }
680 al = SSL_AD_PROTOCOL_VERSION;
681 goto f_err;
682 }
683
598 /* load the client random */ 684 /* load the client random */
599 memcpy(s->s3->client_random,p,SSL3_RANDOM_SIZE); 685 memcpy(s->s3->client_random,p,SSL3_RANDOM_SIZE);
600 p+=SSL3_RANDOM_SIZE; 686 p+=SSL3_RANDOM_SIZE;
@@ -603,7 +689,15 @@ SSL *s;
603 j= *(p++); 689 j= *(p++);
604 690
605 s->hit=0; 691 s->hit=0;
606 if (j == 0) 692 /* Versions before 0.9.7 always allow session reuse during renegotiation
693 * (i.e. when s->new_session is true), option
694 * SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION is new with 0.9.7.
695 * Maybe this optional behaviour should always have been the default,
696 * but we cannot safely change the default behaviour (or new applications
697 * might be written that become totally unsecure when compiled with
698 * an earlier library version)
699 */
700 if (j == 0 || (s->new_session && (s->options & SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION)))
607 { 701 {
608 if (!ssl_get_new_session(s,1)) 702 if (!ssl_get_new_session(s,1))
609 goto err; 703 goto err;
@@ -615,7 +709,9 @@ SSL *s;
615 { /* previous session */ 709 { /* previous session */
616 s->hit=1; 710 s->hit=1;
617 } 711 }
618 else 712 else if (i == -1)
713 goto err;
714 else /* i == 0 */
619 { 715 {
620 if (!ssl_get_new_session(s,1)) 716 if (!ssl_get_new_session(s,1))
621 goto err; 717 goto err;
@@ -631,7 +727,7 @@ SSL *s;
631 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_NO_CIPHERS_SPECIFIED); 727 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_NO_CIPHERS_SPECIFIED);
632 goto f_err; 728 goto f_err;
633 } 729 }
634 if ((i+p) > (d+n)) 730 if ((p+i) >= (d+n))
635 { 731 {
636 /* not enough data */ 732 /* not enough data */
637 al=SSL_AD_DECODE_ERROR; 733 al=SSL_AD_DECODE_ERROR;
@@ -651,9 +747,16 @@ SSL *s;
651 j=0; 747 j=0;
652 id=s->session->cipher->id; 748 id=s->session->cipher->id;
653 749
654 for (i=0; i<sk_num(ciphers); i++) 750#ifdef CIPHER_DEBUG
751 printf("client sent %d ciphers\n",sk_num(ciphers));
752#endif
753 for (i=0; i<sk_SSL_CIPHER_num(ciphers); i++)
655 { 754 {
656 c=(SSL_CIPHER *)sk_value(ciphers,i); 755 c=sk_SSL_CIPHER_value(ciphers,i);
756#ifdef CIPHER_DEBUG
757 printf("client [%2d of %2d]:%s\n",
758 i,sk_num(ciphers),SSL_CIPHER_get_name(c));
759#endif
657 if (c->id == id) 760 if (c->id == id)
658 { 761 {
659 j=1; 762 j=1;
@@ -662,11 +765,11 @@ SSL *s;
662 } 765 }
663 if (j == 0) 766 if (j == 0)
664 { 767 {
665 if ((s->options & SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG) && (sk_num(ciphers) == 1)) 768 if ((s->options & SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG) && (sk_SSL_CIPHER_num(ciphers) == 1))
666 { 769 {
667 /* Very bad for multi-threading.... */ 770 /* Very bad for multi-threading.... */
668 s->session->cipher= 771 s->session->cipher=sk_SSL_CIPHER_value(ciphers,
669 (SSL_CIPHER *)sk_value(ciphers,0); 772 0);
670 } 773 }
671 else 774 else
672 { 775 {
@@ -681,8 +784,18 @@ SSL *s;
681 784
682 /* compression */ 785 /* compression */
683 i= *(p++); 786 i= *(p++);
787 if ((p+i) > (d+n))
788 {
789 /* not enough data */
790 al=SSL_AD_DECODE_ERROR;
791 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_LENGTH_MISMATCH);
792 goto f_err;
793 }
794 q=p;
684 for (j=0; j<i; j++) 795 for (j=0; j<i; j++)
796 {
685 if (p[j] == 0) break; 797 if (p[j] == 0) break;
798 }
686 799
687 p+=i; 800 p+=i;
688 if (j >= i) 801 if (j >= i)
@@ -693,10 +806,39 @@ SSL *s;
693 goto f_err; 806 goto f_err;
694 } 807 }
695 808
809 /* Worst case, we will use the NULL compression, but if we have other
810 * options, we will now look for them. We have i-1 compression
811 * algorithms from the client, starting at q. */
812 s->s3->tmp.new_compression=NULL;
813 if (s->ctx->comp_methods != NULL)
814 { /* See if we have a match */
815 int m,nn,o,v,done=0;
816
817 nn=sk_SSL_COMP_num(s->ctx->comp_methods);
818 for (m=0; m<nn; m++)
819 {
820 comp=sk_SSL_COMP_value(s->ctx->comp_methods,m);
821 v=comp->id;
822 for (o=0; o<i; o++)
823 {
824 if (v == q[o])
825 {
826 done=1;
827 break;
828 }
829 }
830 if (done) break;
831 }
832 if (done)
833 s->s3->tmp.new_compression=comp;
834 else
835 comp=NULL;
836 }
837
696 /* TLS does not mind if there is extra stuff */ 838 /* TLS does not mind if there is extra stuff */
697 if (s->version == SSL3_VERSION) 839 if (s->version == SSL3_VERSION)
698 { 840 {
699 if (p > (d+n)) 841 if (p < (d+n))
700 { 842 {
701 /* wrong number of bytes, 843 /* wrong number of bytes,
702 * there could be more to follow */ 844 * there could be more to follow */
@@ -706,15 +848,14 @@ SSL *s;
706 } 848 }
707 } 849 }
708 850
709 /* do nothing with compression */ 851 /* Given s->session->ciphers and SSL_get_ciphers, we must
710
711 /* Given s->session->ciphers and ssl_get_ciphers_by_id(s), we must
712 * pick a cipher */ 852 * pick a cipher */
713 853
714 if (!s->hit) 854 if (!s->hit)
715 { 855 {
856 s->session->compress_meth=(comp == NULL)?0:comp->id;
716 if (s->session->ciphers != NULL) 857 if (s->session->ciphers != NULL)
717 sk_free(s->session->ciphers); 858 sk_SSL_CIPHER_free(s->session->ciphers);
718 s->session->ciphers=ciphers; 859 s->session->ciphers=ciphers;
719 if (ciphers == NULL) 860 if (ciphers == NULL)
720 { 861 {
@@ -724,7 +865,7 @@ SSL *s;
724 } 865 }
725 ciphers=NULL; 866 ciphers=NULL;
726 c=ssl3_choose_cipher(s,s->session->ciphers, 867 c=ssl3_choose_cipher(s,s->session->ciphers,
727 ssl_get_ciphers_by_id(s)); 868 SSL_get_ciphers(s));
728 869
729 if (c == NULL) 870 if (c == NULL)
730 { 871 {
@@ -738,19 +879,19 @@ SSL *s;
738 { 879 {
739 /* Session-id reuse */ 880 /* Session-id reuse */
740#ifdef REUSE_CIPHER_BUG 881#ifdef REUSE_CIPHER_BUG
741 STACK *sk; 882 STACK_OF(SSL_CIPHER) *sk;
742 SSL_CIPHER *nc=NULL; 883 SSL_CIPHER *nc=NULL;
743 SSL_CIPHER *ec=NULL; 884 SSL_CIPHER *ec=NULL;
744 885
745 if (s->options & SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG) 886 if (s->options & SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG)
746 { 887 {
747 sk=s->session->ciphers; 888 sk=s->session->ciphers;
748 for (i=0; i<sk_num(sk); i++) 889 for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
749 { 890 {
750 c=(SSL_CIPHER *)sk_value(sk,i); 891 c=sk_SSL_CIPHER_value(sk,i);
751 if (c->algorithms & SSL_eNULL) 892 if (c->algorithms & SSL_eNULL)
752 nc=c; 893 nc=c;
753 if (c->algorithms & SSL_EXP) 894 if (SSL_C_IS_EXPORT(c))
754 ec=c; 895 ec=c;
755 } 896 }
756 if (nc != NULL) 897 if (nc != NULL)
@@ -772,7 +913,7 @@ SSL *s;
772 * compression - basically ignored right now 913 * compression - basically ignored right now
773 * ssl version is set - sslv3 914 * ssl version is set - sslv3
774 * s->session - The ssl session has been setup. 915 * s->session - The ssl session has been setup.
775 * s->hit - sesson reuse flag 916 * s->hit - session reuse flag
776 * s->tmp.new_cipher - the new cipher to use. 917 * s->tmp.new_cipher - the new cipher to use.
777 */ 918 */
778 919
@@ -783,12 +924,11 @@ f_err:
783 ssl3_send_alert(s,SSL3_AL_FATAL,al); 924 ssl3_send_alert(s,SSL3_AL_FATAL,al);
784 } 925 }
785err: 926err:
786 if (ciphers != NULL) sk_free(ciphers); 927 if (ciphers != NULL) sk_SSL_CIPHER_free(ciphers);
787 return(ret); 928 return(ret);
788 } 929 }
789 930
790static int ssl3_send_server_hello(s) 931static int ssl3_send_server_hello(SSL *s)
791SSL *s;
792 { 932 {
793 unsigned char *buf; 933 unsigned char *buf;
794 unsigned char *p,*d; 934 unsigned char *p,*d;
@@ -801,7 +941,7 @@ SSL *s;
801 p=s->s3->server_random; 941 p=s->s3->server_random;
802 Time=time(NULL); /* Time */ 942 Time=time(NULL); /* Time */
803 l2n(Time,p); 943 l2n(Time,p);
804 RAND_bytes(p,SSL3_RANDOM_SIZE-sizeof(Time)); 944 RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE-sizeof(Time));
805 /* Do the message type and length last */ 945 /* Do the message type and length last */
806 d=p= &(buf[4]); 946 d=p= &(buf[4]);
807 947
@@ -833,7 +973,10 @@ SSL *s;
833 p+=i; 973 p+=i;
834 974
835 /* put the compression method */ 975 /* put the compression method */
836 *(p++)=0; 976 if (s->s3->tmp.new_compression == NULL)
977 *(p++)=0;
978 else
979 *(p++)=s->s3->tmp.new_compression->id;
837 980
838 /* do the header */ 981 /* do the header */
839 l=(p-d); 982 l=(p-d);
@@ -851,8 +994,7 @@ SSL *s;
851 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE)); 994 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
852 } 995 }
853 996
854static int ssl3_send_server_done(s) 997static int ssl3_send_server_done(SSL *s)
855SSL *s;
856 { 998 {
857 unsigned char *p; 999 unsigned char *p;
858 1000
@@ -876,17 +1018,17 @@ SSL *s;
876 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE)); 1018 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
877 } 1019 }
878 1020
879static int ssl3_send_server_key_exchange(s) 1021static int ssl3_send_server_key_exchange(SSL *s)
880SSL *s;
881 { 1022 {
882#ifndef NO_RSA 1023#ifndef OPENSSL_NO_RSA
883 unsigned char *q; 1024 unsigned char *q;
884 int j,num; 1025 int j,num;
885 RSA *rsa; 1026 RSA *rsa;
886 unsigned char md_buf[MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH]; 1027 unsigned char md_buf[MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH];
1028 unsigned int u;
887#endif 1029#endif
888#ifndef NO_DH 1030#ifndef OPENSSL_NO_DH
889 DH *dh,*dhp; 1031 DH *dh=NULL,*dhp;
890#endif 1032#endif
891 EVP_PKEY *pkey; 1033 EVP_PKEY *pkey;
892 unsigned char *p,*d; 1034 unsigned char *p,*d;
@@ -899,25 +1041,32 @@ SSL *s;
899 BUF_MEM *buf; 1041 BUF_MEM *buf;
900 EVP_MD_CTX md_ctx; 1042 EVP_MD_CTX md_ctx;
901 1043
1044 EVP_MD_CTX_init(&md_ctx);
902 if (s->state == SSL3_ST_SW_KEY_EXCH_A) 1045 if (s->state == SSL3_ST_SW_KEY_EXCH_A)
903 { 1046 {
904 type=s->s3->tmp.new_cipher->algorithms & SSL_MKEY_MASK; 1047 type=s->s3->tmp.new_cipher->algorithms & SSL_MKEY_MASK;
905 cert=s->session->cert; 1048 cert=s->cert;
906 1049
907 buf=s->init_buf; 1050 buf=s->init_buf;
908 1051
909 r[0]=r[1]=r[2]=r[3]=NULL; 1052 r[0]=r[1]=r[2]=r[3]=NULL;
910 n=0; 1053 n=0;
911#ifndef NO_RSA 1054#ifndef OPENSSL_NO_RSA
912 if (type & SSL_kRSA) 1055 if (type & SSL_kRSA)
913 { 1056 {
914 rsa=cert->rsa_tmp; 1057 rsa=cert->rsa_tmp;
915 if ((rsa == NULL) && (s->ctx->default_cert->rsa_tmp_cb != NULL)) 1058 if ((rsa == NULL) && (s->cert->rsa_tmp_cb != NULL))
1059 {
1060 rsa=s->cert->rsa_tmp_cb(s,
1061 SSL_C_IS_EXPORT(s->s3->tmp.new_cipher),
1062 SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher));
1063 if(rsa == NULL)
916 { 1064 {
917 rsa=s->ctx->default_cert->rsa_tmp_cb(s, 1065 al=SSL_AD_HANDSHAKE_FAILURE;
918 (s->s3->tmp.new_cipher->algorithms| 1066 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_ERROR_GENERATING_TMP_RSA_KEY);
919 SSL_NOT_EXP)?0:1); 1067 goto f_err;
920 CRYPTO_add(&rsa->references,1,CRYPTO_LOCK_RSA); 1068 }
1069 RSA_up_ref(rsa);
921 cert->rsa_tmp=rsa; 1070 cert->rsa_tmp=rsa;
922 } 1071 }
923 if (rsa == NULL) 1072 if (rsa == NULL)
@@ -932,20 +1081,28 @@ SSL *s;
932 } 1081 }
933 else 1082 else
934#endif 1083#endif
935#ifndef NO_DH 1084#ifndef OPENSSL_NO_DH
936 if (type & SSL_kEDH) 1085 if (type & SSL_kEDH)
937 { 1086 {
938 dhp=cert->dh_tmp; 1087 dhp=cert->dh_tmp;
939 if ((dhp == NULL) && (cert->dh_tmp_cb != NULL)) 1088 if ((dhp == NULL) && (s->cert->dh_tmp_cb != NULL))
940 dhp=cert->dh_tmp_cb(s, 1089 dhp=s->cert->dh_tmp_cb(s,
941 (s->s3->tmp.new_cipher->algorithms| 1090 SSL_C_IS_EXPORT(s->s3->tmp.new_cipher),
942 SSL_NOT_EXP)?0:1); 1091 SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher));
943 if (dhp == NULL) 1092 if (dhp == NULL)
944 { 1093 {
945 al=SSL_AD_HANDSHAKE_FAILURE; 1094 al=SSL_AD_HANDSHAKE_FAILURE;
946 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_MISSING_TMP_DH_KEY); 1095 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_MISSING_TMP_DH_KEY);
947 goto f_err; 1096 goto f_err;
948 } 1097 }
1098
1099 if (s->s3->tmp.dh != NULL)
1100 {
1101 DH_free(dh);
1102 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
1103 goto err;
1104 }
1105
949 if ((dh=DHparams_dup(dhp)) == NULL) 1106 if ((dh=DHparams_dup(dhp)) == NULL)
950 { 1107 {
951 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_R_DH_LIB); 1108 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_R_DH_LIB);
@@ -953,13 +1110,16 @@ SSL *s;
953 } 1110 }
954 1111
955 s->s3->tmp.dh=dh; 1112 s->s3->tmp.dh=dh;
956 if (((dhp->pub_key == NULL) || 1113 if ((dhp->pub_key == NULL ||
957 (dhp->priv_key == NULL) || 1114 dhp->priv_key == NULL ||
958 (s->options & SSL_OP_SINGLE_DH_USE)) && 1115 (s->options & SSL_OP_SINGLE_DH_USE)))
959 (!DH_generate_key(dh)))
960 { 1116 {
961 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_R_DH_LIB); 1117 if(!DH_generate_key(dh))
962 goto err; 1118 {
1119 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,
1120 ERR_R_DH_LIB);
1121 goto err;
1122 }
963 } 1123 }
964 else 1124 else
965 { 1125 {
@@ -1025,40 +1185,39 @@ SSL *s;
1025 { 1185 {
1026 /* n is the length of the params, they start at &(d[4]) 1186 /* n is the length of the params, they start at &(d[4])
1027 * and p points to the space at the end. */ 1187 * and p points to the space at the end. */
1028#ifndef NO_RSA 1188#ifndef OPENSSL_NO_RSA
1029 if (pkey->type == EVP_PKEY_RSA) 1189 if (pkey->type == EVP_PKEY_RSA)
1030 { 1190 {
1031 q=md_buf; 1191 q=md_buf;
1032 j=0; 1192 j=0;
1033 for (num=2; num > 0; num--) 1193 for (num=2; num > 0; num--)
1034 { 1194 {
1035 EVP_DigestInit(&md_ctx,(num == 2) 1195 EVP_DigestInit_ex(&md_ctx,(num == 2)
1036 ?s->ctx->md5:s->ctx->sha1); 1196 ?s->ctx->md5:s->ctx->sha1, NULL);
1037 EVP_DigestUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE); 1197 EVP_DigestUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1038 EVP_DigestUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE); 1198 EVP_DigestUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1039 EVP_DigestUpdate(&md_ctx,&(d[4]),n); 1199 EVP_DigestUpdate(&md_ctx,&(d[4]),n);
1040 EVP_DigestFinal(&md_ctx,q, 1200 EVP_DigestFinal_ex(&md_ctx,q,
1041 (unsigned int *)&i); 1201 (unsigned int *)&i);
1042 q+=i; 1202 q+=i;
1043 j+=i; 1203 j+=i;
1044 } 1204 }
1045 i=RSA_private_encrypt(j,md_buf,&(p[2]), 1205 if (RSA_sign(NID_md5_sha1, md_buf, j,
1046 pkey->pkey.rsa,RSA_PKCS1_PADDING); 1206 &(p[2]), &u, pkey->pkey.rsa) <= 0)
1047 if (i <= 0)
1048 { 1207 {
1049 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_RSA); 1208 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_RSA);
1050 goto err; 1209 goto err;
1051 } 1210 }
1052 s2n(i,p); 1211 s2n(u,p);
1053 n+=i+2; 1212 n+=u+2;
1054 } 1213 }
1055 else 1214 else
1056#endif 1215#endif
1057#if !defined(NO_DSA) 1216#if !defined(OPENSSL_NO_DSA)
1058 if (pkey->type == EVP_PKEY_DSA) 1217 if (pkey->type == EVP_PKEY_DSA)
1059 { 1218 {
1060 /* lets do DSS */ 1219 /* lets do DSS */
1061 EVP_SignInit(&md_ctx,EVP_dss1()); 1220 EVP_SignInit_ex(&md_ctx,EVP_dss1(), NULL);
1062 EVP_SignUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE); 1221 EVP_SignUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1063 EVP_SignUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE); 1222 EVP_SignUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1064 EVP_SignUpdate(&md_ctx,&(d[4]),n); 1223 EVP_SignUpdate(&md_ctx,&(d[4]),n);
@@ -1090,20 +1249,21 @@ SSL *s;
1090 s->init_off=0; 1249 s->init_off=0;
1091 } 1250 }
1092 1251
1093 /* SSL3_ST_SW_KEY_EXCH_B */ 1252 s->state = SSL3_ST_SW_KEY_EXCH_B;
1253 EVP_MD_CTX_cleanup(&md_ctx);
1094 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE)); 1254 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
1095f_err: 1255f_err:
1096 ssl3_send_alert(s,SSL3_AL_FATAL,al); 1256 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1097err: 1257err:
1258 EVP_MD_CTX_cleanup(&md_ctx);
1098 return(-1); 1259 return(-1);
1099 } 1260 }
1100 1261
1101static int ssl3_send_certificate_request(s) 1262static int ssl3_send_certificate_request(SSL *s)
1102SSL *s;
1103 { 1263 {
1104 unsigned char *p,*d; 1264 unsigned char *p,*d;
1105 int i,j,nl,off,n; 1265 int i,j,nl,off,n;
1106 STACK *sk=NULL; 1266 STACK_OF(X509_NAME) *sk=NULL;
1107 X509_NAME *name; 1267 X509_NAME *name;
1108 BUF_MEM *buf; 1268 BUF_MEM *buf;
1109 1269
@@ -1128,9 +1288,9 @@ SSL *s;
1128 nl=0; 1288 nl=0;
1129 if (sk != NULL) 1289 if (sk != NULL)
1130 { 1290 {
1131 for (i=0; i<sk_num(sk); i++) 1291 for (i=0; i<sk_X509_NAME_num(sk); i++)
1132 { 1292 {
1133 name=(X509_NAME *)sk_value(sk,i); 1293 name=sk_X509_NAME_value(sk,i);
1134 j=i2d_X509_NAME(name,NULL); 1294 j=i2d_X509_NAME(name,NULL);
1135 if (!BUF_MEM_grow(buf,4+n+j+2)) 1295 if (!BUF_MEM_grow(buf,4+n+j+2))
1136 { 1296 {
@@ -1168,6 +1328,17 @@ SSL *s;
1168 1328
1169 s->init_num=n+4; 1329 s->init_num=n+4;
1170 s->init_off=0; 1330 s->init_off=0;
1331#ifdef NETSCAPE_HANG_BUG
1332 p=(unsigned char *)s->init_buf->data + s->init_num;
1333
1334 /* do the header */
1335 *(p++)=SSL3_MT_SERVER_DONE;
1336 *(p++)=0;
1337 *(p++)=0;
1338 *(p++)=0;
1339 s->init_num += 4;
1340#endif
1341
1171 } 1342 }
1172 1343
1173 /* SSL3_ST_SW_CERT_REQ_B */ 1344 /* SSL3_ST_SW_CERT_REQ_B */
@@ -1176,44 +1347,44 @@ err:
1176 return(-1); 1347 return(-1);
1177 } 1348 }
1178 1349
1179static int ssl3_get_client_key_exchange(s) 1350static int ssl3_get_client_key_exchange(SSL *s)
1180SSL *s;
1181 { 1351 {
1182 int i,al,ok; 1352 int i,al,ok;
1183 long n; 1353 long n;
1184 unsigned long l; 1354 unsigned long l;
1185 unsigned char *p; 1355 unsigned char *p;
1356#ifndef OPENSSL_NO_RSA
1186 RSA *rsa=NULL; 1357 RSA *rsa=NULL;
1187 EVP_PKEY *pkey=NULL; 1358 EVP_PKEY *pkey=NULL;
1188#ifndef NO_DH 1359#endif
1360#ifndef OPENSSL_NO_DH
1189 BIGNUM *pub=NULL; 1361 BIGNUM *pub=NULL;
1190 DH *dh_srvr; 1362 DH *dh_srvr;
1191#endif 1363#endif
1364#ifndef OPENSSL_NO_KRB5
1365 KSSL_ERR kssl_err;
1366#endif /* OPENSSL_NO_KRB5 */
1192 1367
1193 n=ssl3_get_message(s, 1368 n=ssl3_get_message(s,
1194 SSL3_ST_SR_KEY_EXCH_A, 1369 SSL3_ST_SR_KEY_EXCH_A,
1195 SSL3_ST_SR_KEY_EXCH_B, 1370 SSL3_ST_SR_KEY_EXCH_B,
1196 SSL3_MT_CLIENT_KEY_EXCHANGE, 1371 SSL3_MT_CLIENT_KEY_EXCHANGE,
1197 400, /* ???? */ 1372 2048, /* ??? */
1198 &ok); 1373 &ok);
1199 1374
1200 if (!ok) return((int)n); 1375 if (!ok) return((int)n);
1201 p=(unsigned char *)s->init_buf->data; 1376 p=(unsigned char *)s->init_msg;
1202 1377
1203 l=s->s3->tmp.new_cipher->algorithms; 1378 l=s->s3->tmp.new_cipher->algorithms;
1204 1379
1205#ifndef NO_RSA 1380#ifndef OPENSSL_NO_RSA
1206 if (l & SSL_kRSA) 1381 if (l & SSL_kRSA)
1207 { 1382 {
1208 /* FIX THIS UP EAY EAY EAY EAY */ 1383 /* FIX THIS UP EAY EAY EAY EAY */
1209 if (s->s3->tmp.use_rsa_tmp) 1384 if (s->s3->tmp.use_rsa_tmp)
1210 { 1385 {
1211 if ((s->session->cert != NULL) && 1386 if ((s->cert != NULL) && (s->cert->rsa_tmp != NULL))
1212 (s->session->cert->rsa_tmp != NULL)) 1387 rsa=s->cert->rsa_tmp;
1213 rsa=s->session->cert->rsa_tmp;
1214 else if ((s->ctx->default_cert != NULL) &&
1215 (s->ctx->default_cert->rsa_tmp != NULL))
1216 rsa=s->ctx->default_cert->rsa_tmp;
1217 /* Don't do a callback because rsa_tmp should 1388 /* Don't do a callback because rsa_tmp should
1218 * be sent already */ 1389 * be sent already */
1219 if (rsa == NULL) 1390 if (rsa == NULL)
@@ -1258,33 +1429,53 @@ SSL *s;
1258 1429
1259 i=RSA_private_decrypt((int)n,p,p,rsa,RSA_PKCS1_PADDING); 1430 i=RSA_private_decrypt((int)n,p,p,rsa,RSA_PKCS1_PADDING);
1260 1431
1261#if 1 1432 al = -1;
1262 /* If a bad decrypt, use a dud master key */ 1433
1263 if ((i != SSL_MAX_MASTER_KEY_LENGTH) ||
1264 ((p[0] != (s->version>>8)) ||
1265 (p[1] != (s->version & 0xff))))
1266 {
1267 p[0]=(s->version>>8);
1268 p[1]=(s->version & 0xff);
1269 RAND_bytes(&(p[2]),SSL_MAX_MASTER_KEY_LENGTH-2);
1270 i=SSL_MAX_MASTER_KEY_LENGTH;
1271 }
1272#else
1273 if (i != SSL_MAX_MASTER_KEY_LENGTH) 1434 if (i != SSL_MAX_MASTER_KEY_LENGTH)
1274 { 1435 {
1275 al=SSL_AD_DECODE_ERROR; 1436 al=SSL_AD_DECODE_ERROR;
1276 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_DECRYPT); 1437 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_DECRYPT);
1277 goto f_err;
1278 } 1438 }
1279 1439
1280 if ((p[0] != (s->version>>8)) || (p[1] != (s->version & 0xff))) 1440 if ((al == -1) && !((p[0] == (s->client_version>>8)) && (p[1] == (s->client_version & 0xff))))
1281 { 1441 {
1282 al=SSL_AD_DECODE_ERROR; 1442 /* The premaster secret must contain the same version number as the
1283 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BAD_PROTOCOL_VERSION_NUMBER); 1443 * ClientHello to detect version rollback attacks (strangely, the
1284 goto f_err; 1444 * protocol does not offer such protection for DH ciphersuites).
1445 * However, buggy clients exist that send the negotiated protocol
1446 * version instead if the server does not support the requested
1447 * protocol version.
1448 * If SSL_OP_TLS_ROLLBACK_BUG is set, tolerate such clients. */
1449 if (!((s->options & SSL_OP_TLS_ROLLBACK_BUG) &&
1450 (p[0] == (s->version>>8)) && (p[1] == (s->version & 0xff))))
1451 {
1452 al=SSL_AD_DECODE_ERROR;
1453 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BAD_PROTOCOL_VERSION_NUMBER);
1454 goto f_err;
1455 }
1285 } 1456 }
1286#endif
1287 1457
1458 if (al != -1)
1459 {
1460#if 0
1461 goto f_err;
1462#else
1463 /* Some decryption failure -- use random value instead as countermeasure
1464 * against Bleichenbacher's attack on PKCS #1 v1.5 RSA padding
1465 * (see RFC 2246, section 7.4.7.1).
1466 * But note that due to length and protocol version checking, the
1467 * attack is impractical anyway (see section 5 in D. Bleichenbacher:
1468 * "Chosen Ciphertext Attacks Against Protocols Based on the RSA
1469 * Encryption Standard PKCS #1", CRYPTO '98, LNCS 1462, pp. 1-12).
1470 */
1471 ERR_clear_error();
1472 i = SSL_MAX_MASTER_KEY_LENGTH;
1473 p[0] = s->client_version >> 8;
1474 p[1] = s->client_version & 0xff;
1475 RAND_pseudo_bytes(p+2, i-2); /* should be RAND_bytes, but we cannot work around a failure */
1476#endif
1477 }
1478
1288 s->session->master_key_length= 1479 s->session->master_key_length=
1289 s->method->ssl3_enc->generate_master_secret(s, 1480 s->method->ssl3_enc->generate_master_secret(s,
1290 s->session->master_key, 1481 s->session->master_key,
@@ -1293,7 +1484,7 @@ SSL *s;
1293 } 1484 }
1294 else 1485 else
1295#endif 1486#endif
1296#ifndef NO_DH 1487#ifndef OPENSSL_NO_DH
1297 if (l & (SSL_kEDH|SSL_kDHr|SSL_kDHd)) 1488 if (l & (SSL_kEDH|SSL_kDHr|SSL_kDHd))
1298 { 1489 {
1299 n2s(p,i); 1490 n2s(p,i);
@@ -1352,26 +1543,175 @@ SSL *s;
1352 s->session->master_key_length= 1543 s->session->master_key_length=
1353 s->method->ssl3_enc->generate_master_secret(s, 1544 s->method->ssl3_enc->generate_master_secret(s,
1354 s->session->master_key,p,i); 1545 s->session->master_key,p,i);
1546 memset(p,0,i);
1355 } 1547 }
1356 else 1548 else
1357#endif 1549#endif
1550#ifndef OPENSSL_NO_KRB5
1551 if (l & SSL_kKRB5)
1552 {
1553 krb5_error_code krb5rc;
1554 krb5_data enc_ticket;
1555 krb5_data authenticator;
1556 krb5_data enc_pms;
1557 KSSL_CTX *kssl_ctx = s->kssl_ctx;
1558 EVP_CIPHER_CTX ciph_ctx;
1559 EVP_CIPHER *enc = NULL;
1560 unsigned char iv[EVP_MAX_IV_LENGTH];
1561 unsigned char pms[SSL_MAX_MASTER_KEY_LENGTH
1562 + EVP_MAX_IV_LENGTH + 1];
1563 int padl, outl = sizeof(pms);
1564 krb5_timestamp authtime = 0;
1565 krb5_ticket_times ttimes;
1566
1567 EVP_CIPHER_CTX_init(&ciph_ctx);
1568
1569 if (!kssl_ctx) kssl_ctx = kssl_ctx_new();
1570
1571 n2s(p,i);
1572 enc_ticket.length = i;
1573 enc_ticket.data = (char *)p;
1574 p+=enc_ticket.length;
1575
1576 n2s(p,i);
1577 authenticator.length = i;
1578 authenticator.data = (char *)p;
1579 p+=authenticator.length;
1580
1581 n2s(p,i);
1582 enc_pms.length = i;
1583 enc_pms.data = (char *)p;
1584 p+=enc_pms.length;
1585
1586 if (n != enc_ticket.length + authenticator.length +
1587 enc_pms.length + 6)
1588 {
1589 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1590 SSL_R_DATA_LENGTH_TOO_LONG);
1591 goto err;
1592 }
1593
1594 if ((krb5rc = kssl_sget_tkt(kssl_ctx, &enc_ticket, &ttimes,
1595 &kssl_err)) != 0)
1596 {
1597#ifdef KSSL_DEBUG
1598 printf("kssl_sget_tkt rtn %d [%d]\n",
1599 krb5rc, kssl_err.reason);
1600 if (kssl_err.text)
1601 printf("kssl_err text= %s\n", kssl_err.text);
1602#endif /* KSSL_DEBUG */
1603 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
1604 kssl_err.reason);
1605 goto err;
1606 }
1607
1608 /* Note: no authenticator is not considered an error,
1609 ** but will return authtime == 0.
1610 */
1611 if ((krb5rc = kssl_check_authent(kssl_ctx, &authenticator,
1612 &authtime, &kssl_err)) != 0)
1613 {
1614#ifdef KSSL_DEBUG
1615 printf("kssl_check_authent rtn %d [%d]\n",
1616 krb5rc, kssl_err.reason);
1617 if (kssl_err.text)
1618 printf("kssl_err text= %s\n", kssl_err.text);
1619#endif /* KSSL_DEBUG */
1620 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
1621 kssl_err.reason);
1622 goto err;
1623 }
1624
1625 if ((krb5rc = kssl_validate_times(authtime, &ttimes)) != 0)
1626 {
1627 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, krb5rc);
1628 goto err;
1629 }
1630
1631#ifdef KSSL_DEBUG
1632 kssl_ctx_show(kssl_ctx);
1633#endif /* KSSL_DEBUG */
1634
1635 enc = kssl_map_enc(kssl_ctx->enctype);
1636 if (enc == NULL)
1637 goto err;
1638
1639 memset(iv, 0, EVP_MAX_IV_LENGTH); /* per RFC 1510 */
1640
1641 if (!EVP_DecryptInit_ex(&ciph_ctx,enc,NULL,kssl_ctx->key,iv))
1642 {
1643 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1644 SSL_R_DECRYPTION_FAILED);
1645 goto err;
1646 }
1647 if (!EVP_DecryptUpdate(&ciph_ctx, pms,&outl,
1648 (unsigned char *)enc_pms.data, enc_pms.length))
1649 {
1650 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1651 SSL_R_DECRYPTION_FAILED);
1652 goto err;
1653 }
1654 if (outl > SSL_MAX_MASTER_KEY_LENGTH)
1655 {
1656 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1657 SSL_R_DATA_LENGTH_TOO_LONG);
1658 goto err;
1659 }
1660 if (!EVP_DecryptFinal_ex(&ciph_ctx,&(pms[outl]),&padl))
1661 {
1662 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1663 SSL_R_DECRYPTION_FAILED);
1664 goto err;
1665 }
1666 outl += padl;
1667 if (outl > SSL_MAX_MASTER_KEY_LENGTH)
1668 {
1669 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1670 SSL_R_DATA_LENGTH_TOO_LONG);
1671 goto err;
1672 }
1673 EVP_CIPHER_CTX_cleanup(&ciph_ctx);
1674
1675 s->session->master_key_length=
1676 s->method->ssl3_enc->generate_master_secret(s,
1677 s->session->master_key, pms, outl);
1678
1679 if (kssl_ctx->client_princ)
1680 {
1681 int len = strlen(kssl_ctx->client_princ);
1682 if ( len < SSL_MAX_KRB5_PRINCIPAL_LENGTH )
1683 {
1684 s->session->krb5_client_princ_len = len;
1685 memcpy(s->session->krb5_client_princ,kssl_ctx->client_princ,len);
1686 }
1687 }
1688
1689
1690 /* Was doing kssl_ctx_free() here,
1691 ** but it caused problems for apache.
1692 ** kssl_ctx = kssl_ctx_free(kssl_ctx);
1693 ** if (s->kssl_ctx) s->kssl_ctx = NULL;
1694 */
1695 }
1696 else
1697#endif /* OPENSSL_NO_KRB5 */
1358 { 1698 {
1359 al=SSL_AD_HANDSHAKE_FAILURE; 1699 al=SSL_AD_HANDSHAKE_FAILURE;
1360 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_UNKNOWN_CIPHER_TYPE); 1700 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1701 SSL_R_UNKNOWN_CIPHER_TYPE);
1361 goto f_err; 1702 goto f_err;
1362 } 1703 }
1363 1704
1364 return(1); 1705 return(1);
1365f_err: 1706f_err:
1366 ssl3_send_alert(s,SSL3_AL_FATAL,al); 1707 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1367#if !defined(NO_DH) || !defined(NO_RSA) 1708#if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_RSA)
1368err: 1709err:
1369#endif 1710#endif
1370 return(-1); 1711 return(-1);
1371 } 1712 }
1372 1713
1373static int ssl3_get_cert_verify(s) 1714static int ssl3_get_cert_verify(SSL *s)
1374SSL *s;
1375 { 1715 {
1376 EVP_PKEY *pkey=NULL; 1716 EVP_PKEY *pkey=NULL;
1377 unsigned char *p; 1717 unsigned char *p;
@@ -1436,7 +1776,7 @@ SSL *s;
1436 } 1776 }
1437 1777
1438 /* we now have a signature that we need to verify */ 1778 /* we now have a signature that we need to verify */
1439 p=(unsigned char *)s->init_buf->data; 1779 p=(unsigned char *)s->init_msg;
1440 n2s(p,i); 1780 n2s(p,i);
1441 n-=2; 1781 n-=2;
1442 if (i > n) 1782 if (i > n)
@@ -1454,19 +1794,19 @@ SSL *s;
1454 goto f_err; 1794 goto f_err;
1455 } 1795 }
1456 1796
1457#ifndef NO_RSA 1797#ifndef OPENSSL_NO_RSA
1458 if (pkey->type == EVP_PKEY_RSA) 1798 if (pkey->type == EVP_PKEY_RSA)
1459 { 1799 {
1460 i=RSA_public_decrypt(i,p,p,pkey->pkey.rsa,RSA_PKCS1_PADDING); 1800 i=RSA_verify(NID_md5_sha1, s->s3->tmp.cert_verify_md,
1801 MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH, p, i,
1802 pkey->pkey.rsa);
1461 if (i < 0) 1803 if (i < 0)
1462 { 1804 {
1463 al=SSL_AD_DECRYPT_ERROR; 1805 al=SSL_AD_DECRYPT_ERROR;
1464 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_BAD_RSA_DECRYPT); 1806 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_BAD_RSA_DECRYPT);
1465 goto f_err; 1807 goto f_err;
1466 } 1808 }
1467 if ((i != (MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH)) || 1809 if (i == 0)
1468 memcmp(&(s->s3->tmp.finish_md[0]),p,
1469 MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH))
1470 { 1810 {
1471 al=SSL_AD_DECRYPT_ERROR; 1811 al=SSL_AD_DECRYPT_ERROR;
1472 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_BAD_RSA_SIGNATURE); 1812 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_BAD_RSA_SIGNATURE);
@@ -1475,11 +1815,11 @@ SSL *s;
1475 } 1815 }
1476 else 1816 else
1477#endif 1817#endif
1478#ifndef NO_DSA 1818#ifndef OPENSSL_NO_DSA
1479 if (pkey->type == EVP_PKEY_DSA) 1819 if (pkey->type == EVP_PKEY_DSA)
1480 { 1820 {
1481 j=DSA_verify(pkey->save_type, 1821 j=DSA_verify(pkey->save_type,
1482 &(s->s3->tmp.finish_md[MD5_DIGEST_LENGTH]), 1822 &(s->s3->tmp.cert_verify_md[MD5_DIGEST_LENGTH]),
1483 SHA_DIGEST_LENGTH,p,i,pkey->pkey.dsa); 1823 SHA_DIGEST_LENGTH,p,i,pkey->pkey.dsa);
1484 if (j <= 0) 1824 if (j <= 0)
1485 { 1825 {
@@ -1492,7 +1832,7 @@ SSL *s;
1492 else 1832 else
1493#endif 1833#endif
1494 { 1834 {
1495 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_INTERNAL_ERROR); 1835 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,ERR_R_INTERNAL_ERROR);
1496 al=SSL_AD_UNSUPPORTED_CERTIFICATE; 1836 al=SSL_AD_UNSUPPORTED_CERTIFICATE;
1497 goto f_err; 1837 goto f_err;
1498 } 1838 }
@@ -1505,27 +1845,23 @@ f_err:
1505 ssl3_send_alert(s,SSL3_AL_FATAL,al); 1845 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1506 } 1846 }
1507end: 1847end:
1848 EVP_PKEY_free(pkey);
1508 return(ret); 1849 return(ret);
1509 } 1850 }
1510 1851
1511static int ssl3_get_client_certificate(s) 1852static int ssl3_get_client_certificate(SSL *s)
1512SSL *s;
1513 { 1853 {
1514 int i,ok,al,ret= -1; 1854 int i,ok,al,ret= -1;
1515 X509 *x=NULL; 1855 X509 *x=NULL;
1516 unsigned long l,nc,llen,n; 1856 unsigned long l,nc,llen,n;
1517 unsigned char *p,*d,*q; 1857 unsigned char *p,*d,*q;
1518 STACK *sk=NULL; 1858 STACK_OF(X509) *sk=NULL;
1519 1859
1520 n=ssl3_get_message(s, 1860 n=ssl3_get_message(s,
1521 SSL3_ST_SR_CERT_A, 1861 SSL3_ST_SR_CERT_A,
1522 SSL3_ST_SR_CERT_B, 1862 SSL3_ST_SR_CERT_B,
1523 -1, 1863 -1,
1524#if defined(MSDOS) && !defined(WIN32) 1864 s->max_cert_list,
1525 1024*30, /* 30k max cert list :-) */
1526#else
1527 1024*100, /* 100k max cert list :-) */
1528#endif
1529 &ok); 1865 &ok);
1530 1866
1531 if (!ok) return((int)n); 1867 if (!ok) return((int)n);
@@ -1539,7 +1875,7 @@ SSL *s;
1539 al=SSL_AD_HANDSHAKE_FAILURE; 1875 al=SSL_AD_HANDSHAKE_FAILURE;
1540 goto f_err; 1876 goto f_err;
1541 } 1877 }
1542 /* If tls asked for a client cert we must return a 0 list */ 1878 /* If tls asked for a client cert, the client must return a 0 list */
1543 if ((s->version > SSL3_VERSION) && s->s3->tmp.cert_request) 1879 if ((s->version > SSL3_VERSION) && s->s3->tmp.cert_request)
1544 { 1880 {
1545 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST); 1881 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST);
@@ -1556,9 +1892,9 @@ SSL *s;
1556 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_WRONG_MESSAGE_TYPE); 1892 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_WRONG_MESSAGE_TYPE);
1557 goto f_err; 1893 goto f_err;
1558 } 1894 }
1559 d=p=(unsigned char *)s->init_buf->data; 1895 d=p=(unsigned char *)s->init_msg;
1560 1896
1561 if ((sk=sk_new_null()) == NULL) 1897 if ((sk=sk_X509_new_null()) == NULL)
1562 { 1898 {
1563 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,ERR_R_MALLOC_FAILURE); 1899 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,ERR_R_MALLOC_FAILURE);
1564 goto err; 1900 goto err;
@@ -1594,7 +1930,7 @@ SSL *s;
1594 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH); 1930 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);
1595 goto f_err; 1931 goto f_err;
1596 } 1932 }
1597 if (!sk_push(sk,(char *)x)) 1933 if (!sk_X509_push(sk,x))
1598 { 1934 {
1599 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,ERR_R_MALLOC_FAILURE); 1935 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,ERR_R_MALLOC_FAILURE);
1600 goto err; 1936 goto err;
@@ -1603,7 +1939,7 @@ SSL *s;
1603 nc+=l+3; 1939 nc+=l+3;
1604 } 1940 }
1605 1941
1606 if (sk_num(sk) <= 0) 1942 if (sk_X509_num(sk) <= 0)
1607 { 1943 {
1608 /* TLS does not mind 0 certs returned */ 1944 /* TLS does not mind 0 certs returned */
1609 if (s->version == SSL3_VERSION) 1945 if (s->version == SSL3_VERSION)
@@ -1632,10 +1968,29 @@ SSL *s;
1632 } 1968 }
1633 } 1969 }
1634 1970
1635 /* This should not be needed */ 1971 if (s->session->peer != NULL) /* This should not be needed */
1636 if (s->session->peer != NULL)
1637 X509_free(s->session->peer); 1972 X509_free(s->session->peer);
1638 s->session->peer=(X509 *)sk_shift(sk); 1973 s->session->peer=sk_X509_shift(sk);
1974 s->session->verify_result = s->verify_result;
1975
1976 /* With the current implementation, sess_cert will always be NULL
1977 * when we arrive here. */
1978 if (s->session->sess_cert == NULL)
1979 {
1980 s->session->sess_cert = ssl_sess_cert_new();
1981 if (s->session->sess_cert == NULL)
1982 {
1983 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, ERR_R_MALLOC_FAILURE);
1984 goto err;
1985 }
1986 }
1987 if (s->session->sess_cert->cert_chain != NULL)
1988 sk_X509_pop_free(s->session->sess_cert->cert_chain, X509_free);
1989 s->session->sess_cert->cert_chain=sk;
1990 /* Inconsistency alert: cert_chain does *not* include the
1991 * peer's own certificate, while we do include it in s3_clnt.c */
1992
1993 sk=NULL;
1639 1994
1640 ret=1; 1995 ret=1;
1641 if (0) 1996 if (0)
@@ -1645,12 +2000,11 @@ f_err:
1645 } 2000 }
1646err: 2001err:
1647 if (x != NULL) X509_free(x); 2002 if (x != NULL) X509_free(x);
1648 if (sk != NULL) sk_pop_free(sk,X509_free); 2003 if (sk != NULL) sk_X509_pop_free(sk,X509_free);
1649 return(ret); 2004 return(ret);
1650 } 2005 }
1651 2006
1652int ssl3_send_server_certificate(s) 2007int ssl3_send_server_certificate(SSL *s)
1653SSL *s;
1654 { 2008 {
1655 unsigned long l; 2009 unsigned long l;
1656 X509 *x; 2010 X509 *x;
@@ -1658,9 +2012,13 @@ SSL *s;
1658 if (s->state == SSL3_ST_SW_CERT_A) 2012 if (s->state == SSL3_ST_SW_CERT_A)
1659 { 2013 {
1660 x=ssl_get_server_send_cert(s); 2014 x=ssl_get_server_send_cert(s);
1661 if (x == NULL) 2015 if (x == NULL &&
2016 /* VRS: allow null cert if auth == KRB5 */
2017 (s->s3->tmp.new_cipher->algorithms
2018 & (SSL_MKEY_MASK|SSL_AUTH_MASK))
2019 != (SSL_aKRB5|SSL_kKRB5))
1662 { 2020 {
1663 SSLerr(SSL_F_SSL3_SEND_SERVER_CERTIFICATE,SSL_R_INTERNAL_ERROR); 2021 SSLerr(SSL_F_SSL3_SEND_SERVER_CERTIFICATE,ERR_R_INTERNAL_ERROR);
1664 return(0); 2022 return(0);
1665 } 2023 }
1666 2024
diff --git a/src/lib/libssl/ssl.h b/src/lib/libssl/ssl.h
index cf8f9651b2..833f761690 100644
--- a/src/lib/libssl/ssl.h
+++ b/src/lib/libssl/ssl.h
@@ -55,10 +55,131 @@
55 * copied and put under another distribution licence 55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.] 56 * [including the GNU Public Licence.]
57 */ 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 * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved.
113 *
114 * Redistribution and use in source and binary forms, with or without
115 * modification, are permitted provided that the following conditions
116 * are met:
117 *
118 * 1. Redistributions of source code must retain the above copyright
119 * notice, this list of conditions and the following disclaimer.
120 *
121 * 2. Redistributions in binary form must reproduce the above copyright
122 * notice, this list of conditions and the following disclaimer in
123 * the documentation and/or other materials provided with the
124 * distribution.
125 *
126 * 3. All advertising materials mentioning features or use of this
127 * software must display the following acknowledgment:
128 * "This product includes software developed by the OpenSSL Project
129 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
130 *
131 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
132 * endorse or promote products derived from this software without
133 * prior written permission. For written permission, please contact
134 * openssl-core@openssl.org.
135 *
136 * 5. Products derived from this software may not be called "OpenSSL"
137 * nor may "OpenSSL" appear in their names without prior written
138 * permission of the OpenSSL Project.
139 *
140 * 6. Redistributions of any form whatsoever must retain the following
141 * acknowledgment:
142 * "This product includes software developed by the OpenSSL Project
143 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
144 *
145 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
146 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
147 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
148 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
149 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
150 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
151 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
152 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
153 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
154 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
155 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
156 * OF THE POSSIBILITY OF SUCH DAMAGE.
157 * ====================================================================
158 *
159 * This product includes cryptographic software written by Eric Young
160 * (eay@cryptsoft.com). This product includes software written by Tim
161 * Hudson (tjh@cryptsoft.com).
162 *
163 */
58 164
59#ifndef HEADER_SSL_H 165#ifndef HEADER_SSL_H
60#define HEADER_SSL_H 166#define HEADER_SSL_H
61 167
168#include <openssl/e_os2.h>
169
170#ifndef OPENSSL_NO_COMP
171#include <openssl/comp.h>
172#endif
173#ifndef OPENSSL_NO_BIO
174#include <openssl/bio.h>
175#endif
176#ifndef OPENSSL_NO_X509
177#include <openssl/x509.h>
178#endif
179#include <openssl/kssl.h>
180#include <openssl/safestack.h>
181#include <openssl/symhacks.h>
182
62#ifdef __cplusplus 183#ifdef __cplusplus
63extern "C" { 184extern "C" {
64#endif 185#endif
@@ -81,7 +202,18 @@ extern "C" {
81#define SSL_TXT_DES_192_EDE3_CBC_WITH_MD5 SSL2_TXT_DES_192_EDE3_CBC_WITH_MD5 202#define SSL_TXT_DES_192_EDE3_CBC_WITH_MD5 SSL2_TXT_DES_192_EDE3_CBC_WITH_MD5
82#define SSL_TXT_DES_192_EDE3_CBC_WITH_SHA SSL2_TXT_DES_192_EDE3_CBC_WITH_SHA 203#define SSL_TXT_DES_192_EDE3_CBC_WITH_SHA SSL2_TXT_DES_192_EDE3_CBC_WITH_SHA
83 204
205/* VRS Additional Kerberos5 entries
206 */
207#define SSL_TXT_KRB5_DES_40_CBC_SHA SSL3_TXT_KRB5_DES_40_CBC_SHA
208#define SSL_TXT_KRB5_DES_40_CBC_MD5 SSL3_TXT_KRB5_DES_40_CBC_MD5
209#define SSL_TXT_KRB5_DES_64_CBC_SHA SSL3_TXT_KRB5_DES_64_CBC_SHA
210#define SSL_TXT_KRB5_DES_64_CBC_MD5 SSL3_TXT_KRB5_DES_64_CBC_MD5
211#define SSL_TXT_KRB5_DES_192_CBC3_SHA SSL3_TXT_KRB5_DES_192_CBC3_SHA
212#define SSL_TXT_KRB5_DES_192_CBC3_MD5 SSL3_TXT_KRB5_DES_192_CBC3_MD5
213#define SSL_MAX_KRB5_PRINCIPAL_LENGTH 256
214
84#define SSL_MAX_SSL_SESSION_ID_LENGTH 32 215#define SSL_MAX_SSL_SESSION_ID_LENGTH 32
216#define SSL_MAX_SID_CTX_LENGTH 32
85 217
86#define SSL_MIN_RSA_MODULUS_LENGTH_IN_BYTES (512/8) 218#define SSL_MIN_RSA_MODULUS_LENGTH_IN_BYTES (512/8)
87#define SSL_MAX_KEY_ARG_LENGTH 8 219#define SSL_MAX_KEY_ARG_LENGTH 8
@@ -100,6 +232,10 @@ extern "C" {
100#define SSL_TXT_eNULL "eNULL" 232#define SSL_TXT_eNULL "eNULL"
101#define SSL_TXT_NULL "NULL" 233#define SSL_TXT_NULL "NULL"
102 234
235#define SSL_TXT_kKRB5 "kKRB5"
236#define SSL_TXT_aKRB5 "aKRB5"
237#define SSL_TXT_KRB5 "KRB5"
238
103#define SSL_TXT_kRSA "kRSA" 239#define SSL_TXT_kRSA "kRSA"
104#define SSL_TXT_kDHr "kDHr" 240#define SSL_TXT_kDHr "kDHr"
105#define SSL_TXT_kDHd "kDHd" 241#define SSL_TXT_kDHd "kDHd"
@@ -117,33 +253,46 @@ extern "C" {
117#define SSL_TXT_RC4 "RC4" 253#define SSL_TXT_RC4 "RC4"
118#define SSL_TXT_RC2 "RC2" 254#define SSL_TXT_RC2 "RC2"
119#define SSL_TXT_IDEA "IDEA" 255#define SSL_TXT_IDEA "IDEA"
256#define SSL_TXT_AES "AESdraft" /* AES ciphersuites are not yet official (thus excluded from 'ALL') */
120#define SSL_TXT_MD5 "MD5" 257#define SSL_TXT_MD5 "MD5"
121#define SSL_TXT_SHA1 "SHA1" 258#define SSL_TXT_SHA1 "SHA1"
122#define SSL_TXT_SHA "SHA" 259#define SSL_TXT_SHA "SHA"
123#define SSL_TXT_EXP "EXP" 260#define SSL_TXT_EXP "EXP"
124#define SSL_TXT_EXPORT "EXPORT" 261#define SSL_TXT_EXPORT "EXPORT"
262#define SSL_TXT_EXP40 "EXPORT40"
263#define SSL_TXT_EXP56 "EXPORT56"
125#define SSL_TXT_SSLV2 "SSLv2" 264#define SSL_TXT_SSLV2 "SSLv2"
126#define SSL_TXT_SSLV3 "SSLv3" 265#define SSL_TXT_SSLV3 "SSLv3"
266#define SSL_TXT_TLSV1 "TLSv1"
127#define SSL_TXT_ALL "ALL" 267#define SSL_TXT_ALL "ALL"
128 268
129/* 'DEFAULT' at the start of the cipher list insert the following string 269/* The following cipher list is used by default.
130 * in addition to this being the default cipher string */ 270 * It also is substituted when an application-defined cipher list string
131#ifndef NO_RSA 271 * starts with 'DEFAULT'. */
132#define SSL_DEFAULT_CIPHER_LIST "ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP" 272#define SSL_DEFAULT_CIPHER_LIST "ALL:!ADH:+RC4:@STRENGTH" /* low priority for RC4 */
133#else
134#define SSL_ALLOW_ADH
135#define SSL_DEFAULT_CIPHER_LIST "HIGH:MEDIUM:LOW:ADH+3DES:ADH+RC4:ADH+DES:+EXP"
136#endif
137 273
138/* Used in SSL_set_shutdown()/SSL_get_shutdown(); */ 274/* Used in SSL_set_shutdown()/SSL_get_shutdown(); */
139#define SSL_SENT_SHUTDOWN 1 275#define SSL_SENT_SHUTDOWN 1
140#define SSL_RECEIVED_SHUTDOWN 2 276#define SSL_RECEIVED_SHUTDOWN 2
141 277
142#include "crypto.h" 278#ifdef __cplusplus
143#include "lhash.h" 279}
144#include "buffer.h" 280#endif
145#include "bio.h" 281
146#include "x509.h" 282#include <openssl/crypto.h>
283#include <openssl/lhash.h>
284#include <openssl/buffer.h>
285#include <openssl/bio.h>
286#include <openssl/pem.h>
287#include <openssl/x509.h>
288
289#ifdef __cplusplus
290extern "C" {
291#endif
292
293#if (defined(OPENSSL_NO_RSA) || defined(OPENSSL_NO_MD5)) && !defined(OPENSSL_NO_SSL2)
294#define OPENSSL_NO_SSL2
295#endif
147 296
148#define SSL_FILETYPE_ASN1 X509_FILETYPE_ASN1 297#define SSL_FILETYPE_ASN1 X509_FILETYPE_ASN1
149#define SSL_FILETYPE_PEM X509_FILETYPE_PEM 298#define SSL_FILETYPE_PEM X509_FILETYPE_PEM
@@ -157,44 +306,52 @@ typedef struct ssl_st *ssl_crock_st;
157typedef struct ssl_cipher_st 306typedef struct ssl_cipher_st
158 { 307 {
159 int valid; 308 int valid;
160 char *name; /* text name */ 309 const char *name; /* text name */
161 unsigned long id; /* id, 4 bytes, first is version */ 310 unsigned long id; /* id, 4 bytes, first is version */
162 unsigned long algorithms; /* what ciphers are used */ 311 unsigned long algorithms; /* what ciphers are used */
312 unsigned long algo_strength; /* strength and export flags */
163 unsigned long algorithm2; /* Extra flags */ 313 unsigned long algorithm2; /* Extra flags */
314 int strength_bits; /* Number of bits really used */
315 int alg_bits; /* Number of bits for algorithm */
164 unsigned long mask; /* used for matching */ 316 unsigned long mask; /* used for matching */
317 unsigned long mask_strength; /* also used for matching */
165 } SSL_CIPHER; 318 } SSL_CIPHER;
166 319
320DECLARE_STACK_OF(SSL_CIPHER)
321
322typedef struct ssl_st SSL;
323typedef struct ssl_ctx_st SSL_CTX;
324
167/* Used to hold functions for SSLv2 or SSLv3/TLSv1 functions */ 325/* Used to hold functions for SSLv2 or SSLv3/TLSv1 functions */
168typedef struct ssl_method_st 326typedef struct ssl_method_st
169 { 327 {
170 int version; 328 int version;
171 int (*ssl_new)(); 329 int (*ssl_new)(SSL *s);
172 void (*ssl_clear)(); 330 void (*ssl_clear)(SSL *s);
173 void (*ssl_free)(); 331 void (*ssl_free)(SSL *s);
174 int (*ssl_accept)(); 332 int (*ssl_accept)(SSL *s);
175 int (*ssl_connect)(); 333 int (*ssl_connect)(SSL *s);
176 int (*ssl_read)(); 334 int (*ssl_read)(SSL *s,void *buf,int len);
177 int (*ssl_peek)(); 335 int (*ssl_peek)(SSL *s,void *buf,int len);
178 int (*ssl_write)(); 336 int (*ssl_write)(SSL *s,const void *buf,int len);
179 int (*ssl_shutdown)(); 337 int (*ssl_shutdown)(SSL *s);
180 int (*ssl_renegotiate)(); 338 int (*ssl_renegotiate)(SSL *s);
181 long (*ssl_ctrl)(); 339 int (*ssl_renegotiate_check)(SSL *s);
182 long (*ssl_ctx_ctrl)(); 340 long (*ssl_ctrl)(SSL *s,int cmd,long larg,void *parg);
183 SSL_CIPHER *(*get_cipher_by_char)(); 341 long (*ssl_ctx_ctrl)(SSL_CTX *ctx,int cmd,long larg,void *parg);
184 int (*put_cipher_by_char)(); 342 SSL_CIPHER *(*get_cipher_by_char)(const unsigned char *ptr);
185 int (*ssl_pending)(); 343 int (*put_cipher_by_char)(const SSL_CIPHER *cipher,unsigned char *ptr);
186 int (*num_ciphers)(); 344 int (*ssl_pending)(SSL *s);
187 SSL_CIPHER *(*get_cipher)(); 345 int (*num_ciphers)(void);
188 struct ssl_method_st *(*get_ssl_method)(); 346 SSL_CIPHER *(*get_cipher)(unsigned ncipher);
189 long (*get_timeout)(); 347 struct ssl_method_st *(*get_ssl_method)(int version);
348 long (*get_timeout)(void);
190 struct ssl3_enc_method *ssl3_enc; /* Extra SSLv3/TLS stuff */ 349 struct ssl3_enc_method *ssl3_enc; /* Extra SSLv3/TLS stuff */
350 int (*ssl_version)();
351 long (*ssl_callback_ctrl)(SSL *s, int cb_id, void (*fp)());
352 long (*ssl_ctx_callback_ctrl)(SSL_CTX *s, int cb_id, void (*fp)());
191 } SSL_METHOD; 353 } SSL_METHOD;
192 354
193typedef struct ssl_compression_st
194 {
195 char *stuff;
196 } SSL_COMPRESSION;
197
198/* Lets make this into an ASN.1 type structure as follows 355/* Lets make this into an ASN.1 type structure as follows
199 * SSL_SESSION_ID ::= SEQUENCE { 356 * SSL_SESSION_ID ::= SEQUENCE {
200 * version INTEGER, -- structure version number 357 * version INTEGER, -- structure version number
@@ -202,10 +359,14 @@ typedef struct ssl_compression_st
202 * Cipher OCTET_STRING, -- the 3 byte cipher ID 359 * Cipher OCTET_STRING, -- the 3 byte cipher ID
203 * Session_ID OCTET_STRING, -- the Session ID 360 * Session_ID OCTET_STRING, -- the Session ID
204 * Master_key OCTET_STRING, -- the master key 361 * Master_key OCTET_STRING, -- the master key
362 * KRB5_principal OCTET_STRING -- optional Kerberos principal
205 * Key_Arg [ 0 ] IMPLICIT OCTET_STRING, -- the optional Key argument 363 * Key_Arg [ 0 ] IMPLICIT OCTET_STRING, -- the optional Key argument
206 * Time [ 1 ] EXPLICIT INTEGER, -- optional Start Time 364 * Time [ 1 ] EXPLICIT INTEGER, -- optional Start Time
207 * Timeout [ 2 ] EXPLICIT INTEGER, -- optional Timeout ins seconds 365 * Timeout [ 2 ] EXPLICIT INTEGER, -- optional Timeout ins seconds
208 * Peer [ 3 ] EXPLICIT X509, -- optional Peer Certificate 366 * Peer [ 3 ] EXPLICIT X509, -- optional Peer Certificate
367 * Session_ID_context [ 4 ] EXPLICIT OCTET_STRING, -- the Session ID context
368 * Verify_result [ 5 ] EXPLICIT INTEGER -- X509_V_... code for `Peer'
369 * Compression [6] IMPLICIT ASN1_OBJECT -- compression OID XXXXX
209 * } 370 * }
210 * Look in ssl/ssl_asn1.c for more details 371 * Look in ssl/ssl_asn1.c for more details
211 * I'm using EXPLICIT tags so I can read the damn things using asn1parse :-). 372 * I'm using EXPLICIT tags so I can read the damn things using asn1parse :-).
@@ -223,29 +384,43 @@ typedef struct ssl_session_st
223 /* session_id - valid? */ 384 /* session_id - valid? */
224 unsigned int session_id_length; 385 unsigned int session_id_length;
225 unsigned char session_id[SSL_MAX_SSL_SESSION_ID_LENGTH]; 386 unsigned char session_id[SSL_MAX_SSL_SESSION_ID_LENGTH];
387 /* this is used to determine whether the session is being reused in
388 * the appropriate context. It is up to the application to set this,
389 * via SSL_new */
390 unsigned int sid_ctx_length;
391 unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH];
392
393#ifndef OPENSSL_NO_KRB5
394 unsigned int krb5_client_princ_len;
395 unsigned char krb5_client_princ[SSL_MAX_KRB5_PRINCIPAL_LENGTH];
396#endif /* OPENSSL_NO_KRB5 */
226 397
227 int not_resumable; 398 int not_resumable;
228 399
229 /* The cert is the certificate used to establish this connection */ 400 /* The cert is the certificate used to establish this connection */
230 struct cert_st /* CERT */ *cert; 401 struct sess_cert_st /* SESS_CERT */ *sess_cert;
231 402
232 /* This is the cert for the other end. On servers, it will be 403 /* This is the cert for the other end.
233 * the same as cert->x509 */ 404 * On clients, it will be the same as sess_cert->peer_key->x509
405 * (the latter is not enough as sess_cert is not retained
406 * in the external representation of sessions, see ssl_asn1.c). */
234 X509 *peer; 407 X509 *peer;
408 /* when app_verify_callback accepts a session where the peer's certificate
409 * is not ok, we must remember the error for session reuse: */
410 long verify_result; /* only for servers */
235 411
236 int references; 412 int references;
237 long timeout; 413 long timeout;
238 long time; 414 long time;
239 415
240 SSL_COMPRESSION *read_compression; 416 int compress_meth; /* Need to lookup the method */
241 SSL_COMPRESSION *write_compression;
242 417
243 SSL_CIPHER *cipher; 418 SSL_CIPHER *cipher;
244 unsigned long cipher_id; /* when ASN.1 loaded, this 419 unsigned long cipher_id; /* when ASN.1 loaded, this
245 * needs to be used to load 420 * needs to be used to load
246 * the 'cipher' structure */ 421 * the 'cipher' structure */
247 422
248 STACK /* SSL_CIPHER */ *ciphers; /* shared ciphers? */ 423 STACK_OF(SSL_CIPHER) *ciphers; /* shared ciphers? */
249 424
250 CRYPTO_EX_DATA ex_data; /* application specific data */ 425 CRYPTO_EX_DATA ex_data; /* application specific data */
251 426
@@ -262,47 +437,126 @@ typedef struct ssl_session_st
262#define SSL_OP_MSIE_SSLV2_RSA_PADDING 0x00000040L 437#define SSL_OP_MSIE_SSLV2_RSA_PADDING 0x00000040L
263#define SSL_OP_SSLEAY_080_CLIENT_DH_BUG 0x00000080L 438#define SSL_OP_SSLEAY_080_CLIENT_DH_BUG 0x00000080L
264#define SSL_OP_TLS_D5_BUG 0x00000100L 439#define SSL_OP_TLS_D5_BUG 0x00000100L
265#define SSL_OP_TLS_BLOCK_PADDING_BUG 0x00000200L 440#define SSL_OP_TLS_BLOCK_PADDING_BUG 0x00000200L
266 441
267/* If set, only use tmp_dh parameters once */ 442/* If set, always create a new key when using tmp_dh parameters */
268#define SSL_OP_SINGLE_DH_USE 0x00100000L 443#define SSL_OP_SINGLE_DH_USE 0x00100000L
269/* Set to also use the tmp_rsa key when doing RSA operations. */ 444/* Set to always use the tmp_rsa key when doing RSA operations,
445 * even when this violates protocol specs */
270#define SSL_OP_EPHEMERAL_RSA 0x00200000L 446#define SSL_OP_EPHEMERAL_RSA 0x00200000L
271 447/* Set on servers to choose the cipher according to the server's
448 * preferences */
449#define SSL_OP_CIPHER_SERVER_PREFERENCE 0x00400000L
450/* If set, a server will allow a client to issue a SSLv3.0 version number
451 * as latest version supported in the premaster secret, even when TLSv1.0
452 * (version 3.1) was announced in the client hello. Normally this is
453 * forbidden to prevent version rollback attacks. */
454#define SSL_OP_TLS_ROLLBACK_BUG 0x00800000L
455/* As server, disallow session resumption on renegotiation */
456#define SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION 0x01000000L
457
458/* The next flag deliberately changes the ciphertest, this is a check
459 * for the PKCS#1 attack */
460#define SSL_OP_PKCS1_CHECK_1 0x08000000L
461#define SSL_OP_PKCS1_CHECK_2 0x10000000L
272#define SSL_OP_NETSCAPE_CA_DN_BUG 0x20000000L 462#define SSL_OP_NETSCAPE_CA_DN_BUG 0x20000000L
273#define SSL_OP_NON_EXPORT_FIRST 0x40000000L 463#define SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG 0x40000000L
274#define SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG 0x80000000L
275#define SSL_OP_ALL 0x000FFFFFL 464#define SSL_OP_ALL 0x000FFFFFL
276 465
277#define SSL_CTX_set_options(ctx,op) ((ctx)->options|=(op))
278#define SSL_set_options(ssl,op) ((ssl)->options|=(op))
279
280#define SSL_OP_NO_SSLv2 0x01000000L 466#define SSL_OP_NO_SSLv2 0x01000000L
281#define SSL_OP_NO_SSLv3 0x02000000L 467#define SSL_OP_NO_SSLv3 0x02000000L
282#define SSL_OP_NO_TLSv1 0x04000000L 468#define SSL_OP_NO_TLSv1 0x04000000L
283 469
284/* Normally you will only use these if your application wants to use 470/* Allow SSL_write(..., n) to return r with 0 < r < n (i.e. report success
285 * the certificate store in other places, perhaps PKCS7 */ 471 * when just a single record has been written): */
286#define SSL_CTX_get_cert_store(ctx) ((ctx)->cert_store) 472#define SSL_MODE_ENABLE_PARTIAL_WRITE 0x00000001L
287#define SSL_CTX_set_cert_store(ctx,cs) \ 473/* Make it possible to retry SSL_write() with changed buffer location
288 (X509_STORE_free((ctx)->cert_store),(ctx)->cert_store=(cs)) 474 * (buffer contents must stay the same!); this is not the default to avoid
289 475 * the misconception that non-blocking SSL_write() behaves like
476 * non-blocking write(): */
477#define SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER 0x00000002L
478/* Never bother the application with retries if the transport
479 * is blocking: */
480#define SSL_MODE_AUTO_RETRY 0x00000004L
481
482/* Note: SSL[_CTX]_set_{options,mode} use |= op on the previous value,
483 * they cannot be used to clear bits. */
484
485#define SSL_CTX_set_options(ctx,op) \
486 SSL_CTX_ctrl((ctx),SSL_CTRL_OPTIONS,(op),NULL)
487#define SSL_CTX_get_options(ctx) \
488 SSL_CTX_ctrl((ctx),SSL_CTRL_OPTIONS,0,NULL)
489#define SSL_set_options(ssl,op) \
490 SSL_ctrl((ssl),SSL_CTRL_OPTIONS,(op),NULL)
491#define SSL_get_options(ssl) \
492 SSL_ctrl((ssl),SSL_CTRL_OPTIONS,0,NULL)
493
494#define SSL_CTX_set_mode(ctx,op) \
495 SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,(op),NULL)
496#define SSL_CTX_get_mode(ctx) \
497 SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,0,NULL)
498#define SSL_set_mode(ssl,op) \
499 SSL_ctrl((ssl),SSL_CTRL_MODE,(op),NULL)
500#define SSL_get_mode(ssl) \
501 SSL_ctrl((ssl),SSL_CTRL_MODE,0,NULL)
502
503
504void SSL_CTX_set_msg_callback(SSL_CTX *ctx, void (*cb)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg));
505void SSL_set_msg_callback(SSL *ssl, void (*cb)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg));
506#define SSL_CTX_set_msg_callback_arg(ctx, arg) SSL_CTX_ctrl((ctx), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg))
507#define SSL_set_msg_callback_arg(ssl, arg) SSL_ctrl((ssl), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg))
508
509
510
511#if defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN32)
512#define SSL_MAX_CERT_LIST_DEFAULT 1024*30 /* 30k max cert list :-) */
513#else
514#define SSL_MAX_CERT_LIST_DEFAULT 1024*100 /* 100k max cert list :-) */
515#endif
290 516
291#define SSL_SESSION_CACHE_MAX_SIZE_DEFAULT (1024*20) 517#define SSL_SESSION_CACHE_MAX_SIZE_DEFAULT (1024*20)
292 518
293typedef struct ssl_ctx_st 519/* This callback type is used inside SSL_CTX, SSL, and in the functions that set
520 * them. It is used to override the generation of SSL/TLS session IDs in a
521 * server. Return value should be zero on an error, non-zero to proceed. Also,
522 * callbacks should themselves check if the id they generate is unique otherwise
523 * the SSL handshake will fail with an error - callbacks can do this using the
524 * 'ssl' value they're passed by;
525 * SSL_has_matching_session_id(ssl, id, *id_len)
526 * The length value passed in is set at the maximum size the session ID can be.
527 * In SSLv2 this is 16 bytes, whereas SSLv3/TLSv1 it is 32 bytes. The callback
528 * can alter this length to be less if desired, but under SSLv2 session IDs are
529 * supposed to be fixed at 16 bytes so the id will be padded after the callback
530 * returns in this case. It is also an error for the callback to set the size to
531 * zero. */
532typedef int (*GEN_SESSION_CB)(const SSL *ssl, unsigned char *id,
533 unsigned int *id_len);
534
535typedef struct ssl_comp_st
536 {
537 int id;
538 char *name;
539#ifndef OPENSSL_NO_COMP
540 COMP_METHOD *method;
541#else
542 char *method;
543#endif
544 } SSL_COMP;
545
546DECLARE_STACK_OF(SSL_COMP)
547
548struct ssl_ctx_st
294 { 549 {
295 SSL_METHOD *method; 550 SSL_METHOD *method;
296 unsigned long options;
297 551
298 STACK /* SSL_CIPHER */ *cipher_list; 552 STACK_OF(SSL_CIPHER) *cipher_list;
299 /* same as above but sorted for lookup */ 553 /* same as above but sorted for lookup */
300 STACK /* SSL_CIPHER */ *cipher_list_by_id; 554 STACK_OF(SSL_CIPHER) *cipher_list_by_id;
301 555
302 struct x509_store_st /* X509_STORE */ *cert_store; 556 struct x509_store_st /* X509_STORE */ *cert_store;
303 struct lhash_st /* LHASH */ *sessions; /* a set of SSL_SESSION's */ 557 struct lhash_st /* LHASH */ *sessions; /* a set of SSL_SESSIONs */
304 /* Most session-ids that will be cached, default is 558 /* Most session-ids that will be cached, default is
305 * SSL_SESSION_CACHE_SIZE_DEFAULT. 0 is unlimited. */ 559 * SSL_SESSION_CACHE_MAX_SIZE_DEFAULT. 0 is unlimited. */
306 unsigned long session_cache_size; 560 unsigned long session_cache_size;
307 struct ssl_session_st *session_cache_head; 561 struct ssl_session_st *session_cache_head;
308 struct ssl_session_st *session_cache_tail; 562 struct ssl_session_st *session_cache_tail;
@@ -325,67 +579,95 @@ typedef struct ssl_ctx_st
325 * SSL_SESSION_free() when it has finished using it. Otherwise, 579 * SSL_SESSION_free() when it has finished using it. Otherwise,
326 * on 0, it means the callback has finished with it. 580 * on 0, it means the callback has finished with it.
327 * If remove_session_cb is not null, it will be called when 581 * If remove_session_cb is not null, it will be called when
328 * a session-id is removed from the cache. Again, a return 582 * a session-id is removed from the cache. After the call,
329 * of 0 mens that SSLeay should not SSL_SESSION_free() since 583 * OpenSSL will SSL_SESSION_free() it. */
330 * the application is doing something with it. */
331#ifndef NOPROTO
332 int (*new_session_cb)(struct ssl_st *ssl,SSL_SESSION *sess); 584 int (*new_session_cb)(struct ssl_st *ssl,SSL_SESSION *sess);
333 void (*remove_session_cb)(struct ssl_ctx_st *ctx,SSL_SESSION *sess); 585 void (*remove_session_cb)(struct ssl_ctx_st *ctx,SSL_SESSION *sess);
334 SSL_SESSION *(*get_session_cb)(struct ssl_st *ssl, 586 SSL_SESSION *(*get_session_cb)(struct ssl_st *ssl,
335 unsigned char *data,int len,int *copy); 587 unsigned char *data,int len,int *copy);
336#else
337 int (*new_session_cb)();
338 void (*remove_session_cb)();
339 SSL_SESSION *(*get_session_cb)();
340#endif
341 588
342 int sess_connect; /* SSL new connection - started */ 589 struct
343 int sess_connect_renegotiate;/* SSL renegotiatene - requested */ 590 {
344 int sess_connect_good; /* SSL new connection/renegotiate - finished */ 591 int sess_connect; /* SSL new conn - started */
345 int sess_accept; /* SSL new accept - started */ 592 int sess_connect_renegotiate;/* SSL reneg - requested */
346 int sess_accept_renegotiate;/* SSL renegotiatene - requested */ 593 int sess_connect_good; /* SSL new conne/reneg - finished */
347 int sess_accept_good; /* SSL accept/renegotiate - finished */ 594 int sess_accept; /* SSL new accept - started */
348 int sess_miss; /* session lookup misses */ 595 int sess_accept_renegotiate;/* SSL reneg - requested */
349 int sess_timeout; /* session reuse attempt on timeouted session */ 596 int sess_accept_good; /* SSL accept/reneg - finished */
350 int sess_cache_full; /* session removed due to full cache */ 597 int sess_miss; /* session lookup misses */
351 int sess_hit; /* session reuse actually done */ 598 int sess_timeout; /* reuse attempt on timeouted session */
352 int sess_cb_hit; /* session-id that was not in the cache was 599 int sess_cache_full; /* session removed due to full cache */
353 * passed back via the callback. This 600 int sess_hit; /* session reuse actually done */
354 * indicates that the application is supplying 601 int sess_cb_hit; /* session-id that was not
355 * session-id's from other processes - 602 * in the cache was
356 * spooky :-) */ 603 * passed back via the callback. This
604 * indicates that the application is
605 * supplying session-id's from other
606 * processes - spooky :-) */
607 } stats;
357 608
358 int references; 609 int references;
359 610
360 void (*info_callback)();
361
362 /* if defined, these override the X509_verify_cert() calls */ 611 /* if defined, these override the X509_verify_cert() calls */
363 int (*app_verify_callback)(); 612 int (*app_verify_callback)(X509_STORE_CTX *, void *);
364 char *app_verify_arg; 613 void *app_verify_arg;
365 614 /* before OpenSSL 0.9.7, 'app_verify_arg' was ignored
366 /* default values to use in SSL structures */ 615 * ('app_verify_callback' was called with just one argument) */
367 struct cert_st /* CERT */ *default_cert;
368 int default_read_ahead;
369 int default_verify_mode;
370 int (*default_verify_callback)();
371 616
372 /* Default password callback. */ 617 /* Default password callback. */
373 int (*default_passwd_callback)(); 618 pem_password_cb *default_passwd_callback;
619
620 /* Default password callback user data. */
621 void *default_passwd_callback_userdata;
374 622
375 /* get client cert callback */ 623 /* get client cert callback */
376 int (*client_cert_cb)(/* SSL *ssl, X509 **x509, EVP_PKEY **pkey */); 624 int (*client_cert_cb)(SSL *ssl, X509 **x509, EVP_PKEY **pkey);
377 625
378 /* what we put in client requests */ 626 CRYPTO_EX_DATA ex_data;
379 STACK *client_CA;
380 627
381 int quiet_shutdown; 628 const EVP_MD *rsa_md5;/* For SSLv2 - name is 'ssl2-md5' */
629 const EVP_MD *md5; /* For SSLv3/TLSv1 'ssl3-md5' */
630 const EVP_MD *sha1; /* For SSLv3/TLSv1 'ssl3->sha1' */
382 631
383 CRYPTO_EX_DATA ex_data; 632 STACK_OF(X509) *extra_certs;
633 STACK_OF(SSL_COMP) *comp_methods; /* stack of SSL_COMP, SSLv3/TLSv1 */
634
635
636 /* Default values used when no per-SSL value is defined follow */
637
638 void (*info_callback)(const SSL *ssl,int type,int val); /* used if SSL's info_callback is NULL */
639
640 /* what we put in client cert requests */
641 STACK_OF(X509_NAME) *client_CA;
384 642
385 EVP_MD *rsa_md5;/* For SSLv2 - name is 'ssl2-md5' */ 643
386 EVP_MD *md5; /* For SSLv3/TLSv1 'ssl3-md5' */ 644 /* Default values to use in SSL structures follow (these are copied by SSL_new) */
387 EVP_MD *sha1; /* For SSLv3/TLSv1 'ssl3->sha1' */ 645
388 } SSL_CTX; 646 unsigned long options;
647 unsigned long mode;
648 long max_cert_list;
649
650 struct cert_st /* CERT */ *cert;
651 int read_ahead;
652
653 /* callback that allows applications to peek at protocol messages */
654 void (*msg_callback)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg);
655 void *msg_callback_arg;
656
657 int verify_mode;
658 int verify_depth;
659 unsigned int sid_ctx_length;
660 unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH];
661 int (*default_verify_callback)(int ok,X509_STORE_CTX *ctx); /* called 'verify_callback' in the SSL */
662
663 /* Default generate session ID callback. */
664 GEN_SESSION_CB generate_session_id;
665
666 int purpose; /* Purpose setting */
667 int trust; /* Trust setting */
668
669 int quiet_shutdown;
670 };
389 671
390#define SSL_SESS_CACHE_OFF 0x0000 672#define SSL_SESS_CACHE_OFF 0x0000
391#define SSL_SESS_CACHE_CLIENT 0x0001 673#define SSL_SESS_CACHE_CLIENT 0x0001
@@ -397,23 +679,31 @@ typedef struct ssl_ctx_st
397 * defined, this will still get called. */ 679 * defined, this will still get called. */
398#define SSL_SESS_CACHE_NO_INTERNAL_LOOKUP 0x0100 680#define SSL_SESS_CACHE_NO_INTERNAL_LOOKUP 0x0100
399 681
400#define SSL_CTX_sessions(ctx) ((ctx)->sessions) 682 struct lhash_st *SSL_CTX_sessions(SSL_CTX *ctx);
401/* You will need to include lhash.h to access the following #define */ 683#define SSL_CTX_sess_number(ctx) \
402#define SSL_CTX_sess_number(ctx) ((ctx)->sessions->num_items) 684 SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_NUMBER,0,NULL)
403#define SSL_CTX_sess_connect(ctx) ((ctx)->sess_connect) 685#define SSL_CTX_sess_connect(ctx) \
404#define SSL_CTX_sess_connect_good(ctx) ((ctx)->sess_connect_good) 686 SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT,0,NULL)
405#define SSL_CTX_sess_accept(ctx) ((ctx)->sess_accept) 687#define SSL_CTX_sess_connect_good(ctx) \
406#define SSL_CTX_sess_accept_renegotiate(ctx) ((ctx)->sess_accept_renegotiate) 688 SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_GOOD,0,NULL)
407#define SSL_CTX_sess_connect_renegotiate(ctx) ((ctx)->sess_connect_renegotiate) 689#define SSL_CTX_sess_connect_renegotiate(ctx) \
408#define SSL_CTX_sess_accept_good(ctx) ((ctx)->sess_accept_good) 690 SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_RENEGOTIATE,0,NULL)
409#define SSL_CTX_sess_hits(ctx) ((ctx)->sess_hit) 691#define SSL_CTX_sess_accept(ctx) \
410#define SSL_CTX_sess_cb_hits(ctx) ((ctx)->sess_cb_hit) 692 SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT,0,NULL)
411#define SSL_CTX_sess_misses(ctx) ((ctx)->sess_miss) 693#define SSL_CTX_sess_accept_renegotiate(ctx) \
412#define SSL_CTX_sess_timeouts(ctx) ((ctx)->sess_timeout) 694 SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_RENEGOTIATE,0,NULL)
413#define SSL_CTX_sess_cache_full(ctx) ((ctx)->sess_cache_full) 695#define SSL_CTX_sess_accept_good(ctx) \
414 696 SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_GOOD,0,NULL)
415#define SSL_CTX_sess_set_cache_size(ctx,t) ((ctx)->session_cache_size=(t)) 697#define SSL_CTX_sess_hits(ctx) \
416#define SSL_CTX_sess_get_cache_size(ctx) ((ctx)->session_cache_size) 698 SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_HIT,0,NULL)
699#define SSL_CTX_sess_cb_hits(ctx) \
700 SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CB_HIT,0,NULL)
701#define SSL_CTX_sess_misses(ctx) \
702 SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_MISSES,0,NULL)
703#define SSL_CTX_sess_timeouts(ctx) \
704 SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_TIMEOUTS,0,NULL)
705#define SSL_CTX_sess_cache_full(ctx) \
706 SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CACHE_FULL,0,NULL)
417 707
418#define SSL_CTX_sess_set_new_cb(ctx,cb) ((ctx)->new_session_cb=(cb)) 708#define SSL_CTX_sess_set_new_cb(ctx,cb) ((ctx)->new_session_cb=(cb))
419#define SSL_CTX_sess_get_new_cb(ctx) ((ctx)->new_session_cb) 709#define SSL_CTX_sess_get_new_cb(ctx) ((ctx)->new_session_cb)
@@ -421,15 +711,8 @@ typedef struct ssl_ctx_st
421#define SSL_CTX_sess_get_remove_cb(ctx) ((ctx)->remove_session_cb) 711#define SSL_CTX_sess_get_remove_cb(ctx) ((ctx)->remove_session_cb)
422#define SSL_CTX_sess_set_get_cb(ctx,cb) ((ctx)->get_session_cb=(cb)) 712#define SSL_CTX_sess_set_get_cb(ctx,cb) ((ctx)->get_session_cb=(cb))
423#define SSL_CTX_sess_get_get_cb(ctx) ((ctx)->get_session_cb) 713#define SSL_CTX_sess_get_get_cb(ctx) ((ctx)->get_session_cb)
424#define SSL_CTX_set_session_cache_mode(ctx,m) ((ctx)->session_cache_mode=(m))
425#define SSL_CTX_get_session_cache_mode(ctx) ((ctx)->session_cache_mode)
426#define SSL_CTX_set_timeout(ctx,t) ((ctx)->session_timeout=(t))
427#define SSL_CTX_get_timeout(ctx) ((ctx)->session_timeout)
428
429#define SSL_CTX_set_info_callback(ctx,cb) ((ctx)->info_callback=(cb)) 714#define SSL_CTX_set_info_callback(ctx,cb) ((ctx)->info_callback=(cb))
430#define SSL_CTX_get_info_callback(ctx) ((ctx)->info_callback) 715#define SSL_CTX_get_info_callback(ctx) ((ctx)->info_callback)
431#define SSL_CTX_set_default_read_ahead(ctx,m) (((ctx)->default_read_ahead)=(m))
432
433#define SSL_CTX_set_client_cert_cb(ctx,cb) ((ctx)->client_cert_cb=(cb)) 716#define SSL_CTX_set_client_cert_cb(ctx,cb) ((ctx)->client_cert_cb=(cb))
434#define SSL_CTX_get_client_cert_cb(ctx) ((ctx)->client_cert_cb) 717#define SSL_CTX_get_client_cert_cb(ctx) ((ctx)->client_cert_cb)
435 718
@@ -439,18 +722,16 @@ typedef struct ssl_ctx_st
439#define SSL_X509_LOOKUP 4 722#define SSL_X509_LOOKUP 4
440 723
441/* These will only be used when doing non-blocking IO */ 724/* These will only be used when doing non-blocking IO */
442#define SSL_want(s) ((s)->rwstate) 725#define SSL_want_nothing(s) (SSL_want(s) == SSL_NOTHING)
443#define SSL_want_nothing(s) ((s)->rwstate == SSL_NOTHING) 726#define SSL_want_read(s) (SSL_want(s) == SSL_READING)
444#define SSL_want_read(s) ((s)->rwstate == SSL_READING) 727#define SSL_want_write(s) (SSL_want(s) == SSL_WRITING)
445#define SSL_want_write(s) ((s)->rwstate == SSL_WRITING) 728#define SSL_want_x509_lookup(s) (SSL_want(s) == SSL_X509_LOOKUP)
446#define SSL_want_x509_lookup(s) ((s)->rwstate == SSL_X509_LOOKUP)
447 729
448typedef struct ssl_st 730struct ssl_st
449 { 731 {
450 /* procol version 732 /* protocol version
451 * 2 for SSLv2 733 * (one of SSL2_VERSION, SSL3_VERSION, TLS1_VERSION)
452 * 3 for SSLv3 734 */
453 * -3 for SSLv3 but accept SSLv2 */
454 int version; 735 int version;
455 int type; /* SSL_ST_CONNECT or SSL_ST_ACCEPT */ 736 int type; /* SSL_ST_CONNECT or SSL_ST_ACCEPT */
456 737
@@ -460,10 +741,10 @@ typedef struct ssl_st
460 * same. This is so data can be read and written to different 741 * same. This is so data can be read and written to different
461 * handlers */ 742 * handlers */
462 743
463#ifdef HEADER_BIO_H 744#ifndef OPENSSL_NO_BIO
464 BIO *rbio; /* used by SSL_read */ 745 BIO *rbio; /* used by SSL_read */
465 BIO *wbio; /* used by SSL_write */ 746 BIO *wbio; /* used by SSL_write */
466 BIO *bbio; /* used during session-id reuse to concatinate 747 BIO *bbio; /* used during session-id reuse to concatenate
467 * messages */ 748 * messages */
468#else 749#else
469 char *rbio; /* used by SSL_read */ 750 char *rbio; /* used by SSL_read */
@@ -480,9 +761,22 @@ typedef struct ssl_st
480 int in_handshake; 761 int in_handshake;
481 int (*handshake_func)(); 762 int (*handshake_func)();
482 763
483/* int server;*/ /* are we the server side? */ 764 /* Imagine that here's a boolean member "init" that is
484 765 * switched as soon as SSL_set_{accept/connect}_state
485 int new_session;/* 1 if we are to use a new session */ 766 * is called for the first time, so that "state" and
767 * "handshake_func" are properly initialized. But as
768 * handshake_func is == 0 until then, we use this
769 * test instead of an "init" member.
770 */
771
772 int server; /* are we the server side? - mostly used by SSL_clear*/
773
774 int new_session;/* 1 if we are to use a new session.
775 * 2 if we are a server and are inside a handshake
776 * (i.e. not just sending a HelloRequest)
777 * NB: For servers, the 'new' session may actually be a previously
778 * cached session or even the previous session unless
779 * SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION is set */
486 int quiet_shutdown;/* don't send shutdown packets */ 780 int quiet_shutdown;/* don't send shutdown packets */
487 int shutdown; /* we have shut things down, 0x01 sent, 0x02 781 int shutdown; /* we have shut things down, 0x01 sent, 0x02
488 * for received */ 782 * for received */
@@ -490,6 +784,7 @@ typedef struct ssl_st
490 int rstate; /* where we are when reading */ 784 int rstate; /* where we are when reading */
491 785
492 BUF_MEM *init_buf; /* buffer used during init */ 786 BUF_MEM *init_buf; /* buffer used during init */
787 void *init_msg; /* pointer to handshake message body, set by ssl3_get_message() */
493 int init_num; /* amount read/written */ 788 int init_num; /* amount read/written */
494 int init_off; /* amount read/written */ 789 int init_off; /* amount read/written */
495 790
@@ -497,26 +792,43 @@ typedef struct ssl_st
497 unsigned char *packet; 792 unsigned char *packet;
498 unsigned int packet_length; 793 unsigned int packet_length;
499 794
500 struct ssl2_ctx_st *s2; /* SSLv2 variables */ 795 struct ssl2_state_st *s2; /* SSLv2 variables */
501 struct ssl3_ctx_st *s3; /* SSLv3 variables */ 796 struct ssl3_state_st *s3; /* SSLv3 variables */
797
798 int read_ahead; /* Read as many input bytes as possible
799 * (for non-blocking reads) */
800
801 /* callback that allows applications to peek at protocol messages */
802 void (*msg_callback)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg);
803 void *msg_callback_arg;
502 804
503 int read_ahead; /* Read as many input bytes as possible */
504 int hit; /* reusing a previous session */ 805 int hit; /* reusing a previous session */
505 806
807 int purpose; /* Purpose setting */
808 int trust; /* Trust setting */
809
506 /* crypto */ 810 /* crypto */
507 STACK /* SSL_CIPHER */ *cipher_list; 811 STACK_OF(SSL_CIPHER) *cipher_list;
508 STACK /* SSL_CIPHER */ *cipher_list_by_id; 812 STACK_OF(SSL_CIPHER) *cipher_list_by_id;
509 813
510 /* These are the ones being used, the ones is SSL_SESSION are 814 /* These are the ones being used, the ones in SSL_SESSION are
511 * the ones to be 'copied' into these ones */ 815 * the ones to be 'copied' into these ones */
512 816
513 EVP_CIPHER_CTX *enc_read_ctx; /* cryptographic state */ 817 EVP_CIPHER_CTX *enc_read_ctx; /* cryptographic state */
514 EVP_MD *read_hash; /* used for mac generation */ 818 const EVP_MD *read_hash; /* used for mac generation */
515 SSL_COMPRESSION *read_compression; /* compression */ 819#ifndef OPENSSL_NO_COMP
820 COMP_CTX *expand; /* uncompress */
821#else
822 char *expand;
823#endif
516 824
517 EVP_CIPHER_CTX *enc_write_ctx; /* cryptographic state */ 825 EVP_CIPHER_CTX *enc_write_ctx; /* cryptographic state */
518 EVP_MD *write_hash; /* used for mac generation */ 826 const EVP_MD *write_hash; /* used for mac generation */
519 SSL_COMPRESSION *write_compression; /* compression */ 827#ifndef OPENSSL_NO_COMP
828 COMP_CTX *compress; /* compression */
829#else
830 char *compress;
831#endif
520 832
521 /* session info */ 833 /* session info */
522 834
@@ -524,18 +836,32 @@ typedef struct ssl_st
524 /* This is used to hold the server certificate used */ 836 /* This is used to hold the server certificate used */
525 struct cert_st /* CERT */ *cert; 837 struct cert_st /* CERT */ *cert;
526 838
839 /* the session_id_context is used to ensure sessions are only reused
840 * in the appropriate context */
841 unsigned int sid_ctx_length;
842 unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH];
843
527 /* This can also be in the session once a session is established */ 844 /* This can also be in the session once a session is established */
528 SSL_SESSION *session; 845 SSL_SESSION *session;
529 846
847 /* Default generate session ID callback. */
848 GEN_SESSION_CB generate_session_id;
849
530 /* Used in SSL2 and SSL3 */ 850 /* Used in SSL2 and SSL3 */
531 int verify_mode; /* 0 don't care about verify failure. 851 int verify_mode; /* 0 don't care about verify failure.
532 * 1 fail if verify fails */ 852 * 1 fail if verify fails */
533 int (*verify_callback)(); /* fail if callback returns 0 */ 853 int verify_depth;
534 void (*info_callback)(); /* optional informational callback */ 854 int (*verify_callback)(int ok,X509_STORE_CTX *ctx); /* fail if callback returns 0 */
855
856 void (*info_callback)(const SSL *ssl,int type,int val); /* optional informational callback */
535 857
536 int error; /* error bytes to be written */ 858 int error; /* error bytes to be written */
537 int error_code; /* actual code */ 859 int error_code; /* actual code */
538 860
861#ifndef OPENSSL_NO_KRB5
862 KSSL_CTX *kssl_ctx; /* Kerberos 5 context */
863#endif /* OPENSSL_NO_KRB5 */
864
539 SSL_CTX *ctx; 865 SSL_CTX *ctx;
540 /* set this flag to 1 and a sleep(1) is put into all SSL_read() 866 /* set this flag to 1 and a sleep(1) is put into all SSL_read()
541 * and SSL_write() calls, good for nbio debuging :-) */ 867 * and SSL_write() calls, good for nbio debuging :-) */
@@ -546,19 +872,31 @@ typedef struct ssl_st
546 CRYPTO_EX_DATA ex_data; 872 CRYPTO_EX_DATA ex_data;
547 873
548 /* for server side, keep the list of CA_dn we can use */ 874 /* for server side, keep the list of CA_dn we can use */
549 STACK /* X509_NAME */ *client_CA; 875 STACK_OF(X509_NAME) *client_CA;
550 876
551 int references; 877 int references;
552 unsigned long options; 878 unsigned long options; /* protocol behaviour */
879 unsigned long mode; /* API behaviour */
880 long max_cert_list;
553 int first_packet; 881 int first_packet;
554 } SSL; 882 int client_version; /* what was passed, used for
883 * SSLv3/TLS rollback check */
884 };
555 885
556#include "ssl2.h" 886#ifdef __cplusplus
557#include "ssl3.h" 887}
558#include "tls1.h" /* This is mostly sslv3 with a few tweaks */ 888#endif
559#include "ssl23.h"
560 889
561/* compatablity */ 890#include <openssl/ssl2.h>
891#include <openssl/ssl3.h>
892#include <openssl/tls1.h> /* This is mostly sslv3 with a few tweaks */
893#include <openssl/ssl23.h>
894
895#ifdef __cplusplus
896extern "C" {
897#endif
898
899/* compatibility */
562#define SSL_set_app_data(s,arg) (SSL_set_ex_data(s,0,(char *)arg)) 900#define SSL_set_app_data(s,arg) (SSL_set_ex_data(s,0,(char *)arg))
563#define SSL_get_app_data(s) (SSL_get_ex_data(s,0)) 901#define SSL_get_app_data(s) (SSL_get_ex_data(s,0))
564#define SSL_SESSION_set_app_data(s,a) (SSL_SESSION_set_ex_data(s,0,(char *)a)) 902#define SSL_SESSION_set_app_data(s,a) (SSL_SESSION_set_ex_data(s,0,(char *)a))
@@ -567,7 +905,7 @@ typedef struct ssl_st
567#define SSL_CTX_set_app_data(ctx,arg) (SSL_CTX_set_ex_data(ctx,0,(char *)arg)) 905#define SSL_CTX_set_app_data(ctx,arg) (SSL_CTX_set_ex_data(ctx,0,(char *)arg))
568 906
569/* The following are the possible values for ssl->state are are 907/* The following are the possible values for ssl->state are are
570 * used to indicate where we are upto in the SSL connection establishment. 908 * used to indicate where we are up to in the SSL connection establishment.
571 * The macros that follow are about the only things you should need to use 909 * The macros that follow are about the only things you should need to use
572 * and even then, only when using non-blocking IO. 910 * and even then, only when using non-blocking IO.
573 * It can also be useful to work out where you were when the connection 911 * It can also be useful to work out where you were when the connection
@@ -609,6 +947,13 @@ typedef struct ssl_st
609#define SSL_ST_READ_BODY 0xF1 947#define SSL_ST_READ_BODY 0xF1
610#define SSL_ST_READ_DONE 0xF2 948#define SSL_ST_READ_DONE 0xF2
611 949
950/* Obtain latest Finished message
951 * -- that we sent (SSL_get_finished)
952 * -- that we expected from peer (SSL_get_peer_finished).
953 * Returns length (0 == no Finished so far), copies up to 'count' bytes. */
954size_t SSL_get_finished(SSL *s, void *buf, size_t count);
955size_t SSL_get_peer_finished(SSL *s, void *buf, size_t count);
956
612/* use either SSL_VERIFY_NONE or SSL_VERIFY_PEER, the last 2 options 957/* use either SSL_VERIFY_NONE or SSL_VERIFY_PEER, the last 2 options
613 * are 'ored' with SSL_VERIFY_PEER if they are desired */ 958 * are 'ored' with SSL_VERIFY_PEER if they are desired */
614#define SSL_VERIFY_NONE 0x00 959#define SSL_VERIFY_NONE 0x00
@@ -616,7 +961,10 @@ typedef struct ssl_st
616#define SSL_VERIFY_FAIL_IF_NO_PEER_CERT 0x02 961#define SSL_VERIFY_FAIL_IF_NO_PEER_CERT 0x02
617#define SSL_VERIFY_CLIENT_ONCE 0x04 962#define SSL_VERIFY_CLIENT_ONCE 0x04
618 963
619/* this is for backward compatablility */ 964#define OpenSSL_add_ssl_algorithms() SSL_library_init()
965#define SSLeay_add_ssl_algorithms() SSL_library_init()
966
967/* this is for backward compatibility */
620#if 0 /* NEW_SSLEAY */ 968#if 0 /* NEW_SSLEAY */
621#define SSL_CTX_set_default_verify(a,b,c) SSL_CTX_set_verify(a,b,c) 969#define SSL_CTX_set_default_verify(a,b,c) SSL_CTX_set_verify(a,b,c)
622#define SSL_set_pref_cipher(c,n) SSL_set_cipher_list(c,n) 970#define SSL_set_pref_cipher(c,n) SSL_set_cipher_list(c,n)
@@ -624,7 +972,7 @@ typedef struct ssl_st
624#define SSL_remove_session(a,b) SSL_CTX_remove_session((a),(b)) 972#define SSL_remove_session(a,b) SSL_CTX_remove_session((a),(b))
625#define SSL_flush_sessions(a,b) SSL_CTX_flush_sessions((a),(b)) 973#define SSL_flush_sessions(a,b) SSL_CTX_flush_sessions((a),(b))
626#endif 974#endif
627/* More backward compatablity */ 975/* More backward compatibility */
628#define SSL_get_cipher(s) \ 976#define SSL_get_cipher(s) \
629 SSL_CIPHER_get_name(SSL_get_current_cipher(s)) 977 SSL_CIPHER_get_name(SSL_get_current_cipher(s))
630#define SSL_get_cipher_bits(s,np) \ 978#define SSL_get_cipher_bits(s,np) \
@@ -638,28 +986,25 @@ typedef struct ssl_st
638#define SSL_get_timeout(a) SSL_SESSION_get_timeout(a) 986#define SSL_get_timeout(a) SSL_SESSION_get_timeout(a)
639#define SSL_set_timeout(a,b) SSL_SESSION_set_timeout((a),(b)) 987#define SSL_set_timeout(a,b) SSL_SESSION_set_timeout((a),(b))
640 988
641/* VMS linker has a 31 char name limit */
642#define SSL_CTX_set_cert_verify_callback(a,b,c) \
643 SSL_CTX_set_cert_verify_cb((a),(b),(c))
644
645#if 1 /*SSLEAY_MACROS*/ 989#if 1 /*SSLEAY_MACROS*/
646#define d2i_SSL_SESSION_bio(bp,s_id) (SSL_SESSION *)ASN1_d2i_bio( \ 990#define d2i_SSL_SESSION_bio(bp,s_id) (SSL_SESSION *)ASN1_d2i_bio( \
647 (char *(*)())SSL_SESSION_new,(char *(*)())d2i_SSL_SESSION, \ 991 (char *(*)())SSL_SESSION_new,(char *(*)())d2i_SSL_SESSION, \
648 (bp),(unsigned char **)(s_id)) 992 (bp),(unsigned char **)(s_id))
649#define i2d_SSL_SESSION_bio(bp,s_id) ASN1_i2d_bio(i2d_SSL_SESSION, \ 993#define i2d_SSL_SESSION_bio(bp,s_id) ASN1_i2d_bio(i2d_SSL_SESSION, \
650 bp,(unsigned char *)s_id) 994 bp,(unsigned char *)s_id)
651#define PEM_read_SSL_SESSION(fp,x,cb) (SSL_SESSION *)PEM_ASN1_read( \ 995#define PEM_read_SSL_SESSION(fp,x,cb,u) (SSL_SESSION *)PEM_ASN1_read( \
652 (char *(*)())d2i_SSL_SESSION,PEM_STRING_SSL_SESSION,fp,(char **)x,cb) 996 (char *(*)())d2i_SSL_SESSION,PEM_STRING_SSL_SESSION,fp,(char **)x,cb,u)
653#define PEM_read_bio_SSL_SESSION(bp,x,cb) (SSL_SESSION *)PEM_ASN1_read_bio( \ 997#define PEM_read_bio_SSL_SESSION(bp,x,cb,u) (SSL_SESSION *)PEM_ASN1_read_bio( \
654 (char *(*)())d2i_SSL_SESSION,PEM_STRING_SSL_SESSION,bp,(char **)x,cb) 998 (char *(*)())d2i_SSL_SESSION,PEM_STRING_SSL_SESSION,bp,(char **)x,cb,u)
655#define PEM_write_SSL_SESSION(fp,x) \ 999#define PEM_write_SSL_SESSION(fp,x) \
656 PEM_ASN1_write((int (*)())i2d_SSL_SESSION, \ 1000 PEM_ASN1_write((int (*)())i2d_SSL_SESSION, \
657 PEM_STRING_SSL_SESSION,fp, (char *)x, NULL,NULL,0,NULL) 1001 PEM_STRING_SSL_SESSION,fp, (char *)x, NULL,NULL,0,NULL,NULL)
658#define PEM_write_bio_SSL_SESSION(bp,x) \ 1002#define PEM_write_bio_SSL_SESSION(bp,x) \
659 PEM_ASN1_write_bio((int (*)())i2d_SSL_SESSION, \ 1003 PEM_ASN1_write_bio((int (*)())i2d_SSL_SESSION, \
660 PEM_STRING_SSL_SESSION,bp, (char *)x, NULL,NULL,0,NULL) 1004 PEM_STRING_SSL_SESSION,bp, (char *)x, NULL,NULL,0,NULL,NULL)
661#endif 1005#endif
662 1006
1007#define SSL_AD_REASON_OFFSET 1000
663/* These alert types are for SSLv3 and TLSv1 */ 1008/* These alert types are for SSLv3 and TLSv1 */
664#define SSL_AD_CLOSE_NOTIFY SSL3_AD_CLOSE_NOTIFY 1009#define SSL_AD_CLOSE_NOTIFY SSL3_AD_CLOSE_NOTIFY
665#define SSL_AD_UNEXPECTED_MESSAGE SSL3_AD_UNEXPECTED_MESSAGE /* fatal */ 1010#define SSL_AD_UNEXPECTED_MESSAGE SSL3_AD_UNEXPECTED_MESSAGE /* fatal */
@@ -679,11 +1024,11 @@ typedef struct ssl_st
679#define SSL_AD_ACCESS_DENIED TLS1_AD_ACCESS_DENIED /* fatal */ 1024#define SSL_AD_ACCESS_DENIED TLS1_AD_ACCESS_DENIED /* fatal */
680#define SSL_AD_DECODE_ERROR TLS1_AD_DECODE_ERROR /* fatal */ 1025#define SSL_AD_DECODE_ERROR TLS1_AD_DECODE_ERROR /* fatal */
681#define SSL_AD_DECRYPT_ERROR TLS1_AD_DECRYPT_ERROR 1026#define SSL_AD_DECRYPT_ERROR TLS1_AD_DECRYPT_ERROR
682#define SSL_AD_EXPORT_RESTRICION TLS1_AD_EXPORT_RESTRICION/* fatal */ 1027#define SSL_AD_EXPORT_RESTRICTION TLS1_AD_EXPORT_RESTRICTION/* fatal */
683#define SSL_AD_PROTOCOL_VERSION TLS1_AD_PROTOCOL_VERSION /* fatal */ 1028#define SSL_AD_PROTOCOL_VERSION TLS1_AD_PROTOCOL_VERSION /* fatal */
684#define SSL_AD_INSUFFICIENT_SECURITY TLS1_AD_INSUFFICIENT_SECURITY/* fatal */ 1029#define SSL_AD_INSUFFICIENT_SECURITY TLS1_AD_INSUFFICIENT_SECURITY/* fatal */
685#define SSL_AD_INTERNAL_ERROR TLS1_AD_INTERNAL_ERROR /* fatal */ 1030#define SSL_AD_INTERNAL_ERROR TLS1_AD_INTERNAL_ERROR /* fatal */
686#define SSL_AD_USER_CANCLED TLS1_AD_USER_CANCLED 1031#define SSL_AD_USER_CANCELLED TLS1_AD_USER_CANCELLED
687#define SSL_AD_NO_RENEGOTIATION TLS1_AD_NO_RENEGOTIATION 1032#define SSL_AD_NO_RENEGOTIATION TLS1_AD_NO_RENEGOTIATION
688 1033
689#define SSL_ERROR_NONE 0 1034#define SSL_ERROR_NONE 0
@@ -691,21 +1036,53 @@ typedef struct ssl_st
691#define SSL_ERROR_WANT_READ 2 1036#define SSL_ERROR_WANT_READ 2
692#define SSL_ERROR_WANT_WRITE 3 1037#define SSL_ERROR_WANT_WRITE 3
693#define SSL_ERROR_WANT_X509_LOOKUP 4 1038#define SSL_ERROR_WANT_X509_LOOKUP 4
694#define SSL_ERROR_SYSCALL 5 /* look at errno */ 1039#define SSL_ERROR_SYSCALL 5 /* look at error stack/return value/errno */
695#define SSL_ERROR_ZERO_RETURN 6 1040#define SSL_ERROR_ZERO_RETURN 6
696#define SSL_ERROR_WANT_CONNECT 7 1041#define SSL_ERROR_WANT_CONNECT 7
1042#define SSL_ERROR_WANT_ACCEPT 8
697 1043
698#define SSL_CTRL_NEED_TMP_RSA 1 1044#define SSL_CTRL_NEED_TMP_RSA 1
699#define SSL_CTRL_SET_TMP_RSA 2 1045#define SSL_CTRL_SET_TMP_RSA 2
700#define SSL_CTRL_SET_TMP_DH 3 1046#define SSL_CTRL_SET_TMP_DH 3
701#define SSL_CTRL_SET_TMP_RSA_CB 4 1047#define SSL_CTRL_SET_TMP_RSA_CB 4
702#define SSL_CTRL_SET_TMP_DH_CB 5 1048#define SSL_CTRL_SET_TMP_DH_CB 5
703/* Add these ones */ 1049
704#define SSL_CTRL_GET_SESSION_REUSED 6 1050#define SSL_CTRL_GET_SESSION_REUSED 6
705#define SSL_CTRL_GET_CLIENT_CERT_REQUEST 7 1051#define SSL_CTRL_GET_CLIENT_CERT_REQUEST 7
706#define SSL_CTRL_GET_NUM_RENEGOTIATIONS 8 1052#define SSL_CTRL_GET_NUM_RENEGOTIATIONS 8
707#define SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS 9 1053#define SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS 9
708#define SSL_CTRL_GET_TOTAL_RENEGOTIATIONS 10 1054#define SSL_CTRL_GET_TOTAL_RENEGOTIATIONS 10
1055#define SSL_CTRL_GET_FLAGS 11
1056#define SSL_CTRL_EXTRA_CHAIN_CERT 12
1057
1058#define SSL_CTRL_SET_MSG_CALLBACK 13
1059#define SSL_CTRL_SET_MSG_CALLBACK_ARG 14
1060
1061/* Stats */
1062#define SSL_CTRL_SESS_NUMBER 20
1063#define SSL_CTRL_SESS_CONNECT 21
1064#define SSL_CTRL_SESS_CONNECT_GOOD 22
1065#define SSL_CTRL_SESS_CONNECT_RENEGOTIATE 23
1066#define SSL_CTRL_SESS_ACCEPT 24
1067#define SSL_CTRL_SESS_ACCEPT_GOOD 25
1068#define SSL_CTRL_SESS_ACCEPT_RENEGOTIATE 26
1069#define SSL_CTRL_SESS_HIT 27
1070#define SSL_CTRL_SESS_CB_HIT 28
1071#define SSL_CTRL_SESS_MISSES 29
1072#define SSL_CTRL_SESS_TIMEOUTS 30
1073#define SSL_CTRL_SESS_CACHE_FULL 31
1074#define SSL_CTRL_OPTIONS 32
1075#define SSL_CTRL_MODE 33
1076
1077#define SSL_CTRL_GET_READ_AHEAD 40
1078#define SSL_CTRL_SET_READ_AHEAD 41
1079#define SSL_CTRL_SET_SESS_CACHE_SIZE 42
1080#define SSL_CTRL_GET_SESS_CACHE_SIZE 43
1081#define SSL_CTRL_SET_SESS_CACHE_MODE 44
1082#define SSL_CTRL_GET_SESS_CACHE_MODE 45
1083
1084#define SSL_CTRL_GET_MAX_CERT_LIST 50
1085#define SSL_CTRL_SET_MAX_CERT_LIST 51
709 1086
710#define SSL_session_reused(ssl) \ 1087#define SSL_session_reused(ssl) \
711 SSL_ctrl((ssl),SSL_CTRL_GET_SESSION_REUSED,0,NULL) 1088 SSL_ctrl((ssl),SSL_CTRL_GET_SESSION_REUSED,0,NULL)
@@ -723,18 +1100,17 @@ typedef struct ssl_st
723#define SSL_CTX_set_tmp_dh(ctx,dh) \ 1100#define SSL_CTX_set_tmp_dh(ctx,dh) \
724 SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH,0,(char *)dh) 1101 SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH,0,(char *)dh)
725 1102
726/* For the next 2, the callbacks are 1103#define SSL_need_tmp_RSA(ssl) \
727 * RSA *tmp_rsa_cb(int export) 1104 SSL_ctrl(ssl,SSL_CTRL_NEED_TMP_RSA,0,NULL)
728 * DH *tmp_dh_cb(int export) 1105#define SSL_set_tmp_rsa(ssl,rsa) \
729 */ 1106 SSL_ctrl(ssl,SSL_CTRL_SET_TMP_RSA,0,(char *)rsa)
730#define SSL_CTX_set_tmp_rsa_callback(ctx,cb) \ 1107#define SSL_set_tmp_dh(ssl,dh) \
731 SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_RSA_CB,0,(char *)cb) 1108 SSL_ctrl(ssl,SSL_CTRL_SET_TMP_DH,0,(char *)dh)
732#define SSL_CTX_set_tmp_dh_callback(ctx,dh) \
733 SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH_CB,0,(char *)dh)
734 1109
735#ifndef NOPROTO 1110#define SSL_CTX_add_extra_chain_cert(ctx,x509) \
1111 SSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,(char *)x509)
736 1112
737#ifdef HEADER_BIO_H 1113#ifndef OPENSSL_NO_BIO
738BIO_METHOD *BIO_f_ssl(void); 1114BIO_METHOD *BIO_f_ssl(void);
739BIO *BIO_new_ssl(SSL_CTX *ctx,int client); 1115BIO *BIO_new_ssl(SSL_CTX *ctx,int client);
740BIO *BIO_new_ssl_connect(SSL_CTX *ctx); 1116BIO *BIO_new_ssl_connect(SSL_CTX *ctx);
@@ -744,60 +1120,84 @@ void BIO_ssl_shutdown(BIO *ssl_bio);
744 1120
745#endif 1121#endif
746 1122
747int SSL_CTX_set_cipher_list(SSL_CTX *,char *str); 1123int SSL_CTX_set_cipher_list(SSL_CTX *,const char *str);
748SSL_CTX *SSL_CTX_new(SSL_METHOD *meth); 1124SSL_CTX *SSL_CTX_new(SSL_METHOD *meth);
749void SSL_CTX_free(SSL_CTX *); 1125void SSL_CTX_free(SSL_CTX *);
750void SSL_clear(SSL *s); 1126long SSL_CTX_set_timeout(SSL_CTX *ctx,long t);
1127long SSL_CTX_get_timeout(SSL_CTX *ctx);
1128X509_STORE *SSL_CTX_get_cert_store(SSL_CTX *);
1129void SSL_CTX_set_cert_store(SSL_CTX *,X509_STORE *);
1130int SSL_want(SSL *s);
1131int SSL_clear(SSL *s);
1132
751void SSL_CTX_flush_sessions(SSL_CTX *ctx,long tm); 1133void SSL_CTX_flush_sessions(SSL_CTX *ctx,long tm);
752 1134
753SSL_CIPHER *SSL_get_current_cipher(SSL *s); 1135SSL_CIPHER *SSL_get_current_cipher(SSL *s);
754int SSL_CIPHER_get_bits(SSL_CIPHER *c,int *alg_bits); 1136int SSL_CIPHER_get_bits(SSL_CIPHER *c,int *alg_bits);
755char * SSL_CIPHER_get_version(SSL_CIPHER *c); 1137char * SSL_CIPHER_get_version(SSL_CIPHER *c);
756char * SSL_CIPHER_get_name(SSL_CIPHER *c); 1138const char * SSL_CIPHER_get_name(SSL_CIPHER *c);
757 1139
758int SSL_get_fd(SSL *s); 1140int SSL_get_fd(SSL *s);
759char * SSL_get_cipher_list(SSL *s,int n); 1141int SSL_get_rfd(SSL *s);
1142int SSL_get_wfd(SSL *s);
1143const char * SSL_get_cipher_list(SSL *s,int n);
760char * SSL_get_shared_ciphers(SSL *s, char *buf, int len); 1144char * SSL_get_shared_ciphers(SSL *s, char *buf, int len);
761int SSL_get_read_ahead(SSL * s); 1145int SSL_get_read_ahead(SSL * s);
762int SSL_pending(SSL *s); 1146int SSL_pending(SSL *s);
763#ifndef NO_SOCK 1147#ifndef OPENSSL_NO_SOCK
764int SSL_set_fd(SSL *s, int fd); 1148int SSL_set_fd(SSL *s, int fd);
765int SSL_set_rfd(SSL *s, int fd); 1149int SSL_set_rfd(SSL *s, int fd);
766int SSL_set_wfd(SSL *s, int fd); 1150int SSL_set_wfd(SSL *s, int fd);
767#endif 1151#endif
768#ifdef HEADER_BIO_H 1152#ifndef OPENSSL_NO_BIO
769void SSL_set_bio(SSL *s, BIO *rbio,BIO *wbio); 1153void SSL_set_bio(SSL *s, BIO *rbio,BIO *wbio);
770BIO * SSL_get_rbio(SSL *s); 1154BIO * SSL_get_rbio(SSL *s);
771BIO * SSL_get_wbio(SSL *s); 1155BIO * SSL_get_wbio(SSL *s);
772#endif 1156#endif
773int SSL_set_cipher_list(SSL *s, char *str); 1157int SSL_set_cipher_list(SSL *s, const char *str);
774void SSL_set_read_ahead(SSL *s, int yes); 1158void SSL_set_read_ahead(SSL *s, int yes);
775int SSL_get_verify_mode(SSL *s); 1159int SSL_get_verify_mode(SSL *s);
776int (*SSL_get_verify_callback(SSL *s))(); 1160int SSL_get_verify_depth(SSL *s);
777void SSL_set_verify(SSL *s, int mode, int (*callback) ()); 1161int (*SSL_get_verify_callback(SSL *s))(int,X509_STORE_CTX *);
1162void SSL_set_verify(SSL *s, int mode,
1163 int (*callback)(int ok,X509_STORE_CTX *ctx));
1164void SSL_set_verify_depth(SSL *s, int depth);
1165#ifndef OPENSSL_NO_RSA
778int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa); 1166int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa);
1167#endif
779int SSL_use_RSAPrivateKey_ASN1(SSL *ssl, unsigned char *d, long len); 1168int SSL_use_RSAPrivateKey_ASN1(SSL *ssl, unsigned char *d, long len);
780int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey); 1169int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey);
781int SSL_use_PrivateKey_ASN1(int pk,SSL *ssl, unsigned char *d, long len); 1170int SSL_use_PrivateKey_ASN1(int pk,SSL *ssl, unsigned char *d, long len);
782int SSL_use_certificate(SSL *ssl, X509 *x); 1171int SSL_use_certificate(SSL *ssl, X509 *x);
783int SSL_use_certificate_ASN1(SSL *ssl, int len, unsigned char *d); 1172int SSL_use_certificate_ASN1(SSL *ssl, unsigned char *d, int len);
784 1173
785#ifndef NO_STDIO 1174#ifndef OPENSSL_NO_STDIO
786int SSL_use_RSAPrivateKey_file(SSL *ssl, char *file, int type); 1175int SSL_use_RSAPrivateKey_file(SSL *ssl, const char *file, int type);
787int SSL_use_PrivateKey_file(SSL *ssl, char *file, int type); 1176int SSL_use_PrivateKey_file(SSL *ssl, const char *file, int type);
788int SSL_use_certificate_file(SSL *ssl, char *file, int type); 1177int SSL_use_certificate_file(SSL *ssl, const char *file, int type);
789int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, char *file, int type); 1178int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, const char *file, int type);
790int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, char *file, int type); 1179int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type);
791int SSL_CTX_use_certificate_file(SSL_CTX *ctx, char *file, int type); 1180int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type);
792STACK * SSL_load_client_CA_file(char *file); 1181int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file); /* PEM type */
1182STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file);
1183int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs,
1184 const char *file);
1185#ifndef OPENSSL_SYS_WIN32
1186#ifndef OPENSSL_SYS_VMS
1187#ifndef OPENSSL_SYS_MACINTOSH_CLASSIC /* XXXXX: Better scheme needed! [was: #ifndef MAC_OS_pre_X] */
1188int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs,
1189 const char *dir);
1190#endif
1191#endif
1192#endif
1193
793#endif 1194#endif
794 1195
795void ERR_load_SSL_strings(void );
796void SSL_load_error_strings(void ); 1196void SSL_load_error_strings(void );
797char * SSL_state_string(SSL *s); 1197const char *SSL_state_string(const SSL *s);
798char * SSL_rstate_string(SSL *s); 1198const char *SSL_rstate_string(const SSL *s);
799char * SSL_state_string_long(SSL *s); 1199const char *SSL_state_string_long(const SSL *s);
800char * SSL_rstate_string_long(SSL *s); 1200const char *SSL_rstate_string_long(const SSL *s);
801long SSL_SESSION_get_time(SSL_SESSION *s); 1201long SSL_SESSION_get_time(SSL_SESSION *s);
802long SSL_SESSION_set_time(SSL_SESSION *s, long t); 1202long SSL_SESSION_set_time(SSL_SESSION *s, long t);
803long SSL_SESSION_get_timeout(SSL_SESSION *s); 1203long SSL_SESSION_get_timeout(SSL_SESSION *s);
@@ -807,10 +1207,10 @@ void SSL_copy_session_id(SSL *to,SSL *from);
807SSL_SESSION *SSL_SESSION_new(void); 1207SSL_SESSION *SSL_SESSION_new(void);
808unsigned long SSL_SESSION_hash(SSL_SESSION *a); 1208unsigned long SSL_SESSION_hash(SSL_SESSION *a);
809int SSL_SESSION_cmp(SSL_SESSION *a,SSL_SESSION *b); 1209int SSL_SESSION_cmp(SSL_SESSION *a,SSL_SESSION *b);
810#ifndef NO_FP_API 1210#ifndef OPENSSL_NO_FP_API
811int SSL_SESSION_print_fp(FILE *fp,SSL_SESSION *ses); 1211int SSL_SESSION_print_fp(FILE *fp,SSL_SESSION *ses);
812#endif 1212#endif
813#ifdef HEADER_BIO_H 1213#ifndef OPENSSL_NO_BIO
814int SSL_SESSION_print(BIO *fp,SSL_SESSION *ses); 1214int SSL_SESSION_print(BIO *fp,SSL_SESSION *ses);
815#endif 1215#endif
816void SSL_SESSION_free(SSL_SESSION *ses); 1216void SSL_SESSION_free(SSL_SESSION *ses);
@@ -818,19 +1218,28 @@ int i2d_SSL_SESSION(SSL_SESSION *in,unsigned char **pp);
818int SSL_set_session(SSL *to, SSL_SESSION *session); 1218int SSL_set_session(SSL *to, SSL_SESSION *session);
819int SSL_CTX_add_session(SSL_CTX *s, SSL_SESSION *c); 1219int SSL_CTX_add_session(SSL_CTX *s, SSL_SESSION *c);
820int SSL_CTX_remove_session(SSL_CTX *,SSL_SESSION *c); 1220int SSL_CTX_remove_session(SSL_CTX *,SSL_SESSION *c);
1221int SSL_CTX_set_generate_session_id(SSL_CTX *, GEN_SESSION_CB);
1222int SSL_set_generate_session_id(SSL *, GEN_SESSION_CB);
1223int SSL_has_matching_session_id(const SSL *ssl, const unsigned char *id,
1224 unsigned int id_len);
821SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a,unsigned char **pp,long length); 1225SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a,unsigned char **pp,long length);
822 1226
823#ifdef HEADER_X509_H 1227#ifdef HEADER_X509_H
824X509 * SSL_get_peer_certificate(SSL *s); 1228X509 * SSL_get_peer_certificate(SSL *s);
825#endif 1229#endif
826 1230
827STACK * SSL_get_peer_cert_chain(SSL *s); 1231STACK_OF(X509) *SSL_get_peer_cert_chain(SSL *s);
828 1232
829int SSL_CTX_get_verify_mode(SSL_CTX *ctx); 1233int SSL_CTX_get_verify_mode(SSL_CTX *ctx);
830int (*SSL_CTX_get_verify_callback(SSL_CTX *ctx))(); 1234int SSL_CTX_get_verify_depth(SSL_CTX *ctx);
831void SSL_CTX_set_verify(SSL_CTX *ctx,int mode,int (*callback)()); 1235int (*SSL_CTX_get_verify_callback(SSL_CTX *ctx))(int,X509_STORE_CTX *);
832void SSL_CTX_set_cert_verify_cb(SSL_CTX *ctx, int (*cb)(),char *arg); 1236void SSL_CTX_set_verify(SSL_CTX *ctx,int mode,
1237 int (*callback)(int, X509_STORE_CTX *));
1238void SSL_CTX_set_verify_depth(SSL_CTX *ctx,int depth);
1239void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, int (*cb)(X509_STORE_CTX *,void *), void *arg);
1240#ifndef OPENSSL_NO_RSA
833int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa); 1241int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa);
1242#endif
834int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, unsigned char *d, long len); 1243int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, unsigned char *d, long len);
835int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey); 1244int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey);
836int SSL_CTX_use_PrivateKey_ASN1(int pk,SSL_CTX *ctx, 1245int SSL_CTX_use_PrivateKey_ASN1(int pk,SSL_CTX *ctx,
@@ -838,24 +1247,37 @@ int SSL_CTX_use_PrivateKey_ASN1(int pk,SSL_CTX *ctx,
838int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x); 1247int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x);
839int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len, unsigned char *d); 1248int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len, unsigned char *d);
840 1249
841void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx,int (*cb)()); 1250void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb);
1251void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u);
842 1252
843int SSL_CTX_check_private_key(SSL_CTX *ctx); 1253int SSL_CTX_check_private_key(SSL_CTX *ctx);
844int SSL_check_private_key(SSL *ctx); 1254int SSL_check_private_key(SSL *ctx);
845 1255
1256int SSL_CTX_set_session_id_context(SSL_CTX *ctx,const unsigned char *sid_ctx,
1257 unsigned int sid_ctx_len);
1258
846SSL * SSL_new(SSL_CTX *ctx); 1259SSL * SSL_new(SSL_CTX *ctx);
847void SSL_clear(SSL *s); 1260int SSL_set_session_id_context(SSL *ssl,const unsigned char *sid_ctx,
1261 unsigned int sid_ctx_len);
1262
1263int SSL_CTX_set_purpose(SSL_CTX *s, int purpose);
1264int SSL_set_purpose(SSL *s, int purpose);
1265int SSL_CTX_set_trust(SSL_CTX *s, int trust);
1266int SSL_set_trust(SSL *s, int trust);
1267
848void SSL_free(SSL *ssl); 1268void SSL_free(SSL *ssl);
849int SSL_accept(SSL *ssl); 1269int SSL_accept(SSL *ssl);
850int SSL_connect(SSL *ssl); 1270int SSL_connect(SSL *ssl);
851int SSL_read(SSL *ssl,char *buf,int num); 1271int SSL_read(SSL *ssl,void *buf,int num);
852int SSL_peek(SSL *ssl,char *buf,int num); 1272int SSL_peek(SSL *ssl,void *buf,int num);
853int SSL_write(SSL *ssl,char *buf,int num); 1273int SSL_write(SSL *ssl,const void *buf,int num);
854long SSL_ctrl(SSL *ssl,int cmd, long larg, char *parg); 1274long SSL_ctrl(SSL *ssl,int cmd, long larg, void *parg);
855long SSL_CTX_ctrl(SSL_CTX *ctx,int cmd, long larg, char *parg); 1275long SSL_callback_ctrl(SSL *, int, void (*)());
1276long SSL_CTX_ctrl(SSL_CTX *ctx,int cmd, long larg, void *parg);
1277long SSL_CTX_callback_ctrl(SSL_CTX *, int, void (*)());
856 1278
857int SSL_get_error(SSL *s,int ret_code); 1279int SSL_get_error(SSL *s,int ret_code);
858char * SSL_get_version(SSL *s); 1280const char *SSL_get_version(SSL *s);
859 1281
860/* This sets the 'default' SSL version that SSL_new() will create */ 1282/* This sets the 'default' SSL version that SSL_new() will create */
861int SSL_CTX_set_ssl_version(SSL_CTX *ctx,SSL_METHOD *meth); 1283int SSL_CTX_set_ssl_version(SSL_CTX *ctx,SSL_METHOD *meth);
@@ -876,23 +1298,24 @@ SSL_METHOD *TLSv1_method(void); /* TLSv1.0 */
876SSL_METHOD *TLSv1_server_method(void); /* TLSv1.0 */ 1298SSL_METHOD *TLSv1_server_method(void); /* TLSv1.0 */
877SSL_METHOD *TLSv1_client_method(void); /* TLSv1.0 */ 1299SSL_METHOD *TLSv1_client_method(void); /* TLSv1.0 */
878 1300
879STACK *SSL_get_ciphers(SSL *s); 1301STACK_OF(SSL_CIPHER) *SSL_get_ciphers(SSL *s);
880 1302
881int SSL_do_handshake(SSL *s); 1303int SSL_do_handshake(SSL *s);
882int SSL_renegotiate(SSL *s); 1304int SSL_renegotiate(SSL *s);
1305int SSL_renegotiate_pending(SSL *s);
883int SSL_shutdown(SSL *s); 1306int SSL_shutdown(SSL *s);
884 1307
885SSL_METHOD *SSL_get_ssl_method(SSL *s); 1308SSL_METHOD *SSL_get_ssl_method(SSL *s);
886int SSL_set_ssl_method(SSL *s,SSL_METHOD *method); 1309int SSL_set_ssl_method(SSL *s,SSL_METHOD *method);
887char *SSL_alert_type_string_long(int value); 1310const char *SSL_alert_type_string_long(int value);
888char *SSL_alert_type_string(int value); 1311const char *SSL_alert_type_string(int value);
889char *SSL_alert_desc_string_long(int value); 1312const char *SSL_alert_desc_string_long(int value);
890char *SSL_alert_desc_string(int value); 1313const char *SSL_alert_desc_string(int value);
891 1314
892void SSL_set_client_CA_list(SSL *s, STACK *list); 1315void SSL_set_client_CA_list(SSL *s, STACK_OF(X509_NAME) *list);
893void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK *list); 1316void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *list);
894STACK *SSL_get_client_CA_list(SSL *s); 1317STACK_OF(X509_NAME) *SSL_get_client_CA_list(SSL *s);
895STACK *SSL_CTX_get_client_CA_list(SSL_CTX *s); 1318STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(SSL_CTX *s);
896int SSL_add_client_CA(SSL *ssl,X509 *x); 1319int SSL_add_client_CA(SSL *ssl,X509 *x);
897int SSL_CTX_add_client_CA(SSL_CTX *ctx,X509 *x); 1320int SSL_CTX_add_client_CA(SSL_CTX *ctx,X509 *x);
898 1321
@@ -901,10 +1324,10 @@ void SSL_set_accept_state(SSL *s);
901 1324
902long SSL_get_default_timeout(SSL *s); 1325long SSL_get_default_timeout(SSL *s);
903 1326
904void SSLeay_add_ssl_algorithms(void ); 1327int SSL_library_init(void );
905 1328
906char *SSL_CIPHER_description(SSL_CIPHER *,char *buf,int size); 1329char *SSL_CIPHER_description(SSL_CIPHER *,char *buf,int size);
907STACK *SSL_dup_CA_list(STACK *sk); 1330STACK_OF(X509_NAME) *SSL_dup_CA_list(STACK_OF(X509_NAME) *sk);
908 1331
909SSL *SSL_dup(SSL *ssl); 1332SSL *SSL_dup(SSL *ssl);
910 1333
@@ -919,242 +1342,92 @@ void SSL_set_shutdown(SSL *ssl,int mode);
919int SSL_get_shutdown(SSL *ssl); 1342int SSL_get_shutdown(SSL *ssl);
920int SSL_version(SSL *ssl); 1343int SSL_version(SSL *ssl);
921int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx); 1344int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx);
922int SSL_CTX_load_verify_locations(SSL_CTX *ctx,char *CAfile,char *CApath); 1345int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile,
1346 const char *CApath);
1347#define SSL_get0_session SSL_get_session /* just peek at pointer */
923SSL_SESSION *SSL_get_session(SSL *ssl); 1348SSL_SESSION *SSL_get_session(SSL *ssl);
1349SSL_SESSION *SSL_get1_session(SSL *ssl); /* obtain a reference count */
924SSL_CTX *SSL_get_SSL_CTX(SSL *ssl); 1350SSL_CTX *SSL_get_SSL_CTX(SSL *ssl);
925void SSL_set_info_callback(SSL *ssl,void (*cb)()); 1351void SSL_set_info_callback(SSL *ssl,
926void (*SSL_get_info_callback(SSL *ssl))(); 1352 void (*cb)(const SSL *ssl,int type,int val));
1353void (*SSL_get_info_callback(SSL *ssl))(const SSL *ssl,int type,int val);
927int SSL_state(SSL *ssl); 1354int SSL_state(SSL *ssl);
928 1355
929void SSL_set_verify_result(SSL *ssl,long v); 1356void SSL_set_verify_result(SSL *ssl,long v);
930long SSL_get_verify_result(SSL *ssl); 1357long SSL_get_verify_result(SSL *ssl);
931 1358
932int SSL_set_ex_data(SSL *ssl,int idx,char *data); 1359int SSL_set_ex_data(SSL *ssl,int idx,void *data);
933char *SSL_get_ex_data(SSL *ssl,int idx); 1360void *SSL_get_ex_data(SSL *ssl,int idx);
934int SSL_get_ex_new_index(long argl, char *argp, int (*new_func)(), 1361int SSL_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
935 int (*dup_func)(), void (*free_func)()); 1362 CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
936 1363
937int SSL_SESSION_set_ex_data(SSL_SESSION *ss,int idx,char *data); 1364int SSL_SESSION_set_ex_data(SSL_SESSION *ss,int idx,void *data);
938char *SSL_SESSION_get_ex_data(SSL_SESSION *ss,int idx); 1365void *SSL_SESSION_get_ex_data(SSL_SESSION *ss,int idx);
939int SSL_SESSION_get_ex_new_index(long argl, char *argp, int (*new_func)(), 1366int SSL_SESSION_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
940 int (*dup_func)(), void (*free_func)()); 1367 CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
941 1368
942int SSL_CTX_set_ex_data(SSL_CTX *ssl,int idx,char *data); 1369int SSL_CTX_set_ex_data(SSL_CTX *ssl,int idx,void *data);
943char *SSL_CTX_get_ex_data(SSL_CTX *ssl,int idx); 1370void *SSL_CTX_get_ex_data(SSL_CTX *ssl,int idx);
944int SSL_CTX_get_ex_new_index(long argl, char *argp, int (*new_func)(), 1371int SSL_CTX_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
945 int (*dup_func)(), void (*free_func)()); 1372 CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
946 1373
947#else 1374int SSL_get_ex_data_X509_STORE_CTX_idx(void );
948 1375
949BIO_METHOD *BIO_f_ssl(); 1376#define SSL_CTX_sess_set_cache_size(ctx,t) \
950BIO *BIO_new_ssl(); 1377 SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_SIZE,t,NULL)
951BIO *BIO_new_ssl_connect(); 1378#define SSL_CTX_sess_get_cache_size(ctx) \
952BIO *BIO_new_buffer_ssl_connect(); 1379 SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_SIZE,0,NULL)
953int BIO_ssl_copy_session_id(); 1380#define SSL_CTX_set_session_cache_mode(ctx,m) \
954void BIO_ssl_shutdown(); 1381 SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_MODE,m,NULL)
955 1382#define SSL_CTX_get_session_cache_mode(ctx) \
956int SSL_CTX_set_cipher_list(); 1383 SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_MODE,0,NULL)
957SSL_CTX *SSL_CTX_new(); 1384
958void SSL_CTX_free(); 1385#define SSL_CTX_get_default_read_ahead(ctx) SSL_CTX_get_read_ahead(ctx)
959void SSL_clear(); 1386#define SSL_CTX_set_default_read_ahead(ctx,m) SSL_CTX_set_read_ahead(ctx,m)
960void SSL_CTX_flush_sessions(); 1387#define SSL_CTX_get_read_ahead(ctx) \
961 1388 SSL_CTX_ctrl(ctx,SSL_CTRL_GET_READ_AHEAD,0,NULL)
962SSL_CIPHER *SSL_get_current_cipher(); 1389#define SSL_CTX_set_read_ahead(ctx,m) \
963int SSL_CIPHER_get_bits(); 1390 SSL_CTX_ctrl(ctx,SSL_CTRL_SET_READ_AHEAD,m,NULL)
964char * SSL_CIPHER_get_version(); 1391#define SSL_CTX_get_max_cert_list(ctx) \
965char * SSL_CIPHER_get_name(); 1392 SSL_CTX_ctrl(ctx,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL)
966 1393#define SSL_CTX_set_max_cert_list(ctx,m) \
967int SSL_get_fd(); 1394 SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL)
968char * SSL_get_cipher_list(); 1395#define SSL_get_max_cert_list(ssl) \
969char * SSL_get_shared_ciphers(); 1396 SSL_ctrl(ssl,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL)
970int SSL_get_read_ahead(); 1397#define SSL_set_max_cert_list(ssl,m) \
971int SSL_pending(); 1398 SSL_ctrl(ssl,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL)
972#ifndef NO_SOCK 1399
973int SSL_set_fd(); 1400 /* NB: the keylength is only applicable when is_export is true */
974int SSL_set_rfd(); 1401#ifndef OPENSSL_NO_RSA
975int SSL_set_wfd(); 1402void SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx,
976#endif 1403 RSA *(*cb)(SSL *ssl,int is_export,
977#ifdef HEADER_BIO_H 1404 int keylength));
978void SSL_set_bio(); 1405
979BIO * SSL_get_rbio(); 1406void SSL_set_tmp_rsa_callback(SSL *ssl,
980BIO * SSL_get_wbio(); 1407 RSA *(*cb)(SSL *ssl,int is_export,
981#endif 1408 int keylength));
982int SSL_set_cipher_list();
983void SSL_set_read_ahead();
984int SSL_get_verify_mode();
985
986void SSL_set_verify();
987int SSL_use_RSAPrivateKey();
988int SSL_use_RSAPrivateKey_ASN1();
989int SSL_use_PrivateKey();
990int SSL_use_PrivateKey_ASN1();
991int SSL_use_certificate();
992int SSL_use_certificate_ASN1();
993
994#ifndef NO_STDIO
995int SSL_use_RSAPrivateKey_file();
996int SSL_use_PrivateKey_file();
997int SSL_use_certificate_file();
998int SSL_CTX_use_RSAPrivateKey_file();
999int SSL_CTX_use_PrivateKey_file();
1000int SSL_CTX_use_certificate_file();
1001STACK * SSL_load_client_CA_file();
1002#endif
1003
1004void ERR_load_SSL_strings();
1005void SSL_load_error_strings();
1006char * SSL_state_string();
1007char * SSL_rstate_string();
1008char * SSL_state_string_long();
1009char * SSL_rstate_string_long();
1010long SSL_SESSION_get_time();
1011long SSL_SESSION_set_time();
1012long SSL_SESSION_get_timeout();
1013long SSL_SESSION_set_timeout();
1014void SSL_copy_session_id();
1015
1016SSL_SESSION *SSL_SESSION_new();
1017unsigned long SSL_SESSION_hash();
1018int SSL_SESSION_cmp();
1019#ifndef NO_FP_API
1020int SSL_SESSION_print_fp();
1021#endif
1022#ifdef HEADER_BIO_H
1023int SSL_SESSION_print();
1024#endif
1025void SSL_SESSION_free();
1026int i2d_SSL_SESSION();
1027int SSL_set_session();
1028int SSL_CTX_add_session();
1029int SSL_CTX_remove_session();
1030SSL_SESSION *d2i_SSL_SESSION();
1031
1032#ifdef HEADER_X509_H
1033X509 * SSL_get_peer_certificate();
1034#endif 1409#endif
1035 1410#ifndef OPENSSL_NO_DH
1036STACK * SSL_get_peer_cert_chain(); 1411void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,
1037 1412 DH *(*dh)(SSL *ssl,int is_export,
1038int SSL_CTX_get_verify_mode(); 1413 int keylength));
1039int (*SSL_CTX_get_verify_callback())(); 1414void SSL_set_tmp_dh_callback(SSL *ssl,
1040void SSL_CTX_set_verify(); 1415 DH *(*dh)(SSL *ssl,int is_export,
1041void SSL_CTX_set_cert_verify_cb(); 1416 int keylength));
1042int SSL_CTX_use_RSAPrivateKey();
1043int SSL_CTX_use_RSAPrivateKey_ASN1();
1044int SSL_CTX_use_PrivateKey();
1045int SSL_CTX_use_PrivateKey_ASN1();
1046int SSL_CTX_use_certificate();
1047int SSL_CTX_use_certificate_ASN1();
1048
1049void SSL_CTX_set_default_passwd_cb();
1050
1051int SSL_CTX_check_private_key();
1052int SSL_check_private_key();
1053
1054SSL * SSL_new();
1055void SSL_clear();
1056void SSL_free();
1057int SSL_accept();
1058int SSL_connect();
1059int SSL_read();
1060int SSL_peek();
1061int SSL_write();
1062long SSL_ctrl();
1063long SSL_CTX_ctrl();
1064
1065int SSL_get_error();
1066char * SSL_get_version();
1067
1068int SSL_CTX_set_ssl_version();
1069
1070SSL_METHOD *SSLv2_method();
1071SSL_METHOD *SSLv2_server_method();
1072SSL_METHOD *SSLv2_client_method();
1073
1074SSL_METHOD *SSLv3_method();
1075SSL_METHOD *SSLv3_server_method();
1076SSL_METHOD *SSLv3_client_method();
1077
1078SSL_METHOD *SSLv23_method();
1079SSL_METHOD *SSLv23_server_method();
1080SSL_METHOD *SSLv23_client_method();
1081
1082SSL_METHOD *TLSv1_method();
1083SSL_METHOD *TLSv1_server_method();
1084SSL_METHOD *TLSv1_client_method();
1085
1086STACK *SSL_get_ciphers();
1087
1088int SSL_do_handshake();
1089int SSL_renegotiate();
1090int SSL_shutdown();
1091
1092SSL_METHOD *SSL_get_ssl_method();
1093int SSL_set_ssl_method();
1094char *SSL_alert_type_string_long();
1095char *SSL_alert_type_string();
1096char *SSL_alert_desc_string_long();
1097char *SSL_alert_desc_string();
1098
1099void SSL_set_client_CA_list();
1100void SSL_CTX_set_client_CA_list();
1101STACK *SSL_get_client_CA_list();
1102STACK *SSL_CTX_get_client_CA_list();
1103int SSL_add_client_CA();
1104int SSL_CTX_add_client_CA();
1105
1106void SSL_set_connect_state();
1107void SSL_set_accept_state();
1108
1109long SSL_get_default_timeout();
1110
1111void SSLeay_add_ssl_algorithms();
1112
1113char *SSL_CIPHER_description();
1114STACK *SSL_dup_CA_list();
1115
1116SSL *SSL_dup();
1117
1118X509 *SSL_get_certificate();
1119/* EVP * */ struct evp_pkey_st *SSL_get_privatekey();
1120
1121#ifdef this_is_for_mk1mf_pl
1122EVP *SSL_get_privatekey();
1123
1124void SSL_CTX_set_quiet_shutdown();
1125int SSL_CTX_get_quiet_shutdown();
1126void SSL_set_quiet_shutdown();
1127int SSL_get_quiet_shutdown();
1128void SSL_set_shutdown();
1129int SSL_get_shutdown();
1130int SSL_version();
1131int SSL_CTX_set_default_verify_paths();
1132int SSL_CTX_load_verify_locations();
1133SSL_SESSION *SSL_get_session();
1134SSL_CTX *SSL_get_SSL_CTX();
1135void SSL_set_info_callback();
1136int (*SSL_get_info_callback())();
1137int SSL_state();
1138void SSL_set_verify_result();
1139long SSL_get_verify_result();
1140
1141int SSL_set_ex_data();
1142char *SSL_get_ex_data();
1143int SSL_get_ex_new_index();
1144
1145int SSL_SESSION_set_ex_data();
1146char *SSL_SESSION_get_ex_data();
1147int SSL_SESSION_get_ex_new_index();
1148
1149int SSL_CTX_set_ex_data();
1150char *SSL_CTX_get_ex_data();
1151int SSL_CTX_get_ex_new_index();
1152
1153#endif 1417#endif
1154 1418
1419#ifndef OPENSSL_NO_COMP
1420int SSL_COMP_add_compression_method(int id,COMP_METHOD *cm);
1421#else
1422int SSL_COMP_add_compression_method(int id,char *cm);
1155#endif 1423#endif
1156 1424
1157/* BEGIN ERROR CODES */ 1425/* BEGIN ERROR CODES */
1426/* The following lines are auto generated by the script mkerr.pl. Any changes
1427 * made after this point may be overwritten when the script is next run.
1428 */
1429void ERR_load_SSL_strings(void);
1430
1158/* Error codes for the SSL functions. */ 1431/* Error codes for the SSL functions. */
1159 1432
1160/* Function codes. */ 1433/* Function codes. */
@@ -1178,21 +1451,27 @@ int SSL_CTX_get_ex_new_index();
1178#define SSL_F_SSL23_CONNECT 117 1451#define SSL_F_SSL23_CONNECT 117
1179#define SSL_F_SSL23_GET_CLIENT_HELLO 118 1452#define SSL_F_SSL23_GET_CLIENT_HELLO 118
1180#define SSL_F_SSL23_GET_SERVER_HELLO 119 1453#define SSL_F_SSL23_GET_SERVER_HELLO 119
1454#define SSL_F_SSL23_PEEK 237
1181#define SSL_F_SSL23_READ 120 1455#define SSL_F_SSL23_READ 120
1182#define SSL_F_SSL23_WRITE 121 1456#define SSL_F_SSL23_WRITE 121
1183#define SSL_F_SSL2_ACCEPT 122 1457#define SSL_F_SSL2_ACCEPT 122
1184#define SSL_F_SSL2_CONNECT 123 1458#define SSL_F_SSL2_CONNECT 123
1185#define SSL_F_SSL2_ENC_INIT 124 1459#define SSL_F_SSL2_ENC_INIT 124
1460#define SSL_F_SSL2_PEEK 234
1186#define SSL_F_SSL2_READ 125 1461#define SSL_F_SSL2_READ 125
1462#define SSL_F_SSL2_READ_INTERNAL 236
1187#define SSL_F_SSL2_SET_CERTIFICATE 126 1463#define SSL_F_SSL2_SET_CERTIFICATE 126
1188#define SSL_F_SSL2_WRITE 127 1464#define SSL_F_SSL2_WRITE 127
1189#define SSL_F_SSL3_ACCEPT 128 1465#define SSL_F_SSL3_ACCEPT 128
1466#define SSL_F_SSL3_CALLBACK_CTRL 233
1190#define SSL_F_SSL3_CHANGE_CIPHER_STATE 129 1467#define SSL_F_SSL3_CHANGE_CIPHER_STATE 129
1191#define SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM 130 1468#define SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM 130
1192#define SSL_F_SSL3_CLIENT_HELLO 131 1469#define SSL_F_SSL3_CLIENT_HELLO 131
1193#define SSL_F_SSL3_CONNECT 132 1470#define SSL_F_SSL3_CONNECT 132
1471#define SSL_F_SSL3_CTRL 213
1194#define SSL_F_SSL3_CTX_CTRL 133 1472#define SSL_F_SSL3_CTX_CTRL 133
1195#define SSL_F_SSL3_ENC 134 1473#define SSL_F_SSL3_ENC 134
1474#define SSL_F_SSL3_GENERATE_KEY_BLOCK 238
1196#define SSL_F_SSL3_GET_CERTIFICATE_REQUEST 135 1475#define SSL_F_SSL3_GET_CERTIFICATE_REQUEST 135
1197#define SSL_F_SSL3_GET_CERT_VERIFY 136 1476#define SSL_F_SSL3_GET_CERT_VERIFY 136
1198#define SSL_F_SSL3_GET_CLIENT_CERTIFICATE 137 1477#define SSL_F_SSL3_GET_CLIENT_CERTIFICATE 137
@@ -1206,6 +1485,7 @@ int SSL_CTX_get_ex_new_index();
1206#define SSL_F_SSL3_GET_SERVER_DONE 145 1485#define SSL_F_SSL3_GET_SERVER_DONE 145
1207#define SSL_F_SSL3_GET_SERVER_HELLO 146 1486#define SSL_F_SSL3_GET_SERVER_HELLO 146
1208#define SSL_F_SSL3_OUTPUT_CERT_CHAIN 147 1487#define SSL_F_SSL3_OUTPUT_CERT_CHAIN 147
1488#define SSL_F_SSL3_PEEK 235
1209#define SSL_F_SSL3_READ_BYTES 148 1489#define SSL_F_SSL3_READ_BYTES 148
1210#define SSL_F_SSL3_READ_N 149 1490#define SSL_F_SSL3_READ_N 149
1211#define SSL_F_SSL3_SEND_CERTIFICATE_REQUEST 150 1491#define SSL_F_SSL3_SEND_CERTIFICATE_REQUEST 150
@@ -1218,63 +1498,85 @@ int SSL_CTX_get_ex_new_index();
1218#define SSL_F_SSL3_SETUP_KEY_BLOCK 157 1498#define SSL_F_SSL3_SETUP_KEY_BLOCK 157
1219#define SSL_F_SSL3_WRITE_BYTES 158 1499#define SSL_F_SSL3_WRITE_BYTES 158
1220#define SSL_F_SSL3_WRITE_PENDING 159 1500#define SSL_F_SSL3_WRITE_PENDING 159
1501#define SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK 215
1502#define SSL_F_SSL_ADD_FILE_CERT_SUBJECTS_TO_STACK 216
1221#define SSL_F_SSL_BAD_METHOD 160 1503#define SSL_F_SSL_BAD_METHOD 160
1222#define SSL_F_SSL_BYTES_TO_CIPHER_LIST 161 1504#define SSL_F_SSL_BYTES_TO_CIPHER_LIST 161
1505#define SSL_F_SSL_CERT_DUP 221
1506#define SSL_F_SSL_CERT_INST 222
1507#define SSL_F_SSL_CERT_INSTANTIATE 214
1223#define SSL_F_SSL_CERT_NEW 162 1508#define SSL_F_SSL_CERT_NEW 162
1224#define SSL_F_SSL_CHECK_PRIVATE_KEY 163 1509#define SSL_F_SSL_CHECK_PRIVATE_KEY 163
1225#define SSL_F_SSL_CREATE_CIPHER_LIST 164 1510#define SSL_F_SSL_CIPHER_PROCESS_RULESTR 230
1226#define SSL_F_SSL_CTX_CHECK_PRIVATE_KEY 165 1511#define SSL_F_SSL_CIPHER_STRENGTH_SORT 231
1227#define SSL_F_SSL_CTX_NEW 166 1512#define SSL_F_SSL_CLEAR 164
1228#define SSL_F_SSL_CTX_SET_SSL_VERSION 167 1513#define SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD 165
1229#define SSL_F_SSL_CTX_USE_CERTIFICATE 168 1514#define SSL_F_SSL_CREATE_CIPHER_LIST 166
1230#define SSL_F_SSL_CTX_USE_CERTIFICATE_ASN1 169 1515#define SSL_F_SSL_CTRL 232
1231#define SSL_F_SSL_CTX_USE_CERTIFICATE_FILE 170 1516#define SSL_F_SSL_CTX_CHECK_PRIVATE_KEY 168
1232#define SSL_F_SSL_CTX_USE_PRIVATEKEY 171 1517#define SSL_F_SSL_CTX_NEW 169
1233#define SSL_F_SSL_CTX_USE_PRIVATEKEY_ASN1 172 1518#define SSL_F_SSL_CTX_SET_PURPOSE 226
1234#define SSL_F_SSL_CTX_USE_PRIVATEKEY_FILE 173 1519#define SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT 219
1235#define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY 174 1520#define SSL_F_SSL_CTX_SET_SSL_VERSION 170
1236#define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_ASN1 175 1521#define SSL_F_SSL_CTX_SET_TRUST 229
1237#define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_FILE 176 1522#define SSL_F_SSL_CTX_USE_CERTIFICATE 171
1238#define SSL_F_SSL_DO_HANDSHAKE 177 1523#define SSL_F_SSL_CTX_USE_CERTIFICATE_ASN1 172
1239#define SSL_F_SSL_GET_NEW_SESSION 178 1524#define SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE 220
1240#define SSL_F_SSL_GET_SERVER_SEND_CERT 179 1525#define SSL_F_SSL_CTX_USE_CERTIFICATE_FILE 173
1241#define SSL_F_SSL_GET_SIGN_PKEY 180 1526#define SSL_F_SSL_CTX_USE_PRIVATEKEY 174
1242#define SSL_F_SSL_INIT_WBIO_BUFFER 181 1527#define SSL_F_SSL_CTX_USE_PRIVATEKEY_ASN1 175
1243#define SSL_F_SSL_LOAD_CLIENT_CA_FILE 182 1528#define SSL_F_SSL_CTX_USE_PRIVATEKEY_FILE 176
1244#define SSL_F_SSL_NEW 183 1529#define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY 177
1245#define SSL_F_SSL_RSA_PRIVATE_DECRYPT 184 1530#define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_ASN1 178
1246#define SSL_F_SSL_RSA_PUBLIC_ENCRYPT 185 1531#define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_FILE 179
1247#define SSL_F_SSL_SESSION_NEW 186 1532#define SSL_F_SSL_DO_HANDSHAKE 180
1248#define SSL_F_SSL_SESSION_PRINT_FP 187 1533#define SSL_F_SSL_GET_NEW_SESSION 181
1249#define SSL_F_SSL_SET_CERT 188 1534#define SSL_F_SSL_GET_PREV_SESSION 217
1250#define SSL_F_SSL_SET_FD 189 1535#define SSL_F_SSL_GET_SERVER_SEND_CERT 182
1251#define SSL_F_SSL_SET_PKEY 190 1536#define SSL_F_SSL_GET_SIGN_PKEY 183
1252#define SSL_F_SSL_SET_RFD 191 1537#define SSL_F_SSL_INIT_WBIO_BUFFER 184
1253#define SSL_F_SSL_SET_SESSION 192 1538#define SSL_F_SSL_LOAD_CLIENT_CA_FILE 185
1254#define SSL_F_SSL_SET_WFD 193 1539#define SSL_F_SSL_NEW 186
1255#define SSL_F_SSL_UNDEFINED_FUNCTION 194 1540#define SSL_F_SSL_READ 223
1256#define SSL_F_SSL_USE_CERTIFICATE 195 1541#define SSL_F_SSL_RSA_PRIVATE_DECRYPT 187
1257#define SSL_F_SSL_USE_CERTIFICATE_ASN1 196 1542#define SSL_F_SSL_RSA_PUBLIC_ENCRYPT 188
1258#define SSL_F_SSL_USE_CERTIFICATE_FILE 197 1543#define SSL_F_SSL_SESSION_NEW 189
1259#define SSL_F_SSL_USE_PRIVATEKEY 198 1544#define SSL_F_SSL_SESSION_PRINT_FP 190
1260#define SSL_F_SSL_USE_PRIVATEKEY_ASN1 199 1545#define SSL_F_SSL_SESS_CERT_NEW 225
1261#define SSL_F_SSL_USE_PRIVATEKEY_FILE 200 1546#define SSL_F_SSL_SET_CERT 191
1262#define SSL_F_SSL_USE_RSAPRIVATEKEY 201 1547#define SSL_F_SSL_SET_FD 192
1263#define SSL_F_SSL_USE_RSAPRIVATEKEY_ASN1 202 1548#define SSL_F_SSL_SET_PKEY 193
1264#define SSL_F_SSL_USE_RSAPRIVATEKEY_FILE 203 1549#define SSL_F_SSL_SET_PURPOSE 227
1265#define SSL_F_SSL_WRITE 204 1550#define SSL_F_SSL_SET_RFD 194
1266#define SSL_F_TLS1_CHANGE_CIPHER_STATE 205 1551#define SSL_F_SSL_SET_SESSION 195
1267#define SSL_F_TLS1_ENC 206 1552#define SSL_F_SSL_SET_SESSION_ID_CONTEXT 218
1268#define SSL_F_TLS1_SETUP_KEY_BLOCK 207 1553#define SSL_F_SSL_SET_TRUST 228
1269#define SSL_F_WRITE_PENDING 208 1554#define SSL_F_SSL_SET_WFD 196
1555#define SSL_F_SSL_SHUTDOWN 224
1556#define SSL_F_SSL_UNDEFINED_FUNCTION 197
1557#define SSL_F_SSL_USE_CERTIFICATE 198
1558#define SSL_F_SSL_USE_CERTIFICATE_ASN1 199
1559#define SSL_F_SSL_USE_CERTIFICATE_FILE 200
1560#define SSL_F_SSL_USE_PRIVATEKEY 201
1561#define SSL_F_SSL_USE_PRIVATEKEY_ASN1 202
1562#define SSL_F_SSL_USE_PRIVATEKEY_FILE 203
1563#define SSL_F_SSL_USE_RSAPRIVATEKEY 204
1564#define SSL_F_SSL_USE_RSAPRIVATEKEY_ASN1 205
1565#define SSL_F_SSL_USE_RSAPRIVATEKEY_FILE 206
1566#define SSL_F_SSL_VERIFY_CERT_CHAIN 207
1567#define SSL_F_SSL_WRITE 208
1568#define SSL_F_TLS1_CHANGE_CIPHER_STATE 209
1569#define SSL_F_TLS1_ENC 210
1570#define SSL_F_TLS1_SETUP_KEY_BLOCK 211
1571#define SSL_F_WRITE_PENDING 212
1270 1572
1271/* Reason codes. */ 1573/* Reason codes. */
1272#define SSL_R_APP_DATA_IN_HANDSHAKE 100 1574#define SSL_R_APP_DATA_IN_HANDSHAKE 100
1575#define SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT 272
1273#define SSL_R_BAD_ALERT_RECORD 101 1576#define SSL_R_BAD_ALERT_RECORD 101
1274#define SSL_R_BAD_AUTHENTICATION_TYPE 102 1577#define SSL_R_BAD_AUTHENTICATION_TYPE 102
1275#define SSL_R_BAD_CHANGE_CIPHER_SPEC 103 1578#define SSL_R_BAD_CHANGE_CIPHER_SPEC 103
1276#define SSL_R_BAD_CHECKSUM 104 1579#define SSL_R_BAD_CHECKSUM 104
1277#define SSL_R_BAD_CLIENT_REQUEST 105
1278#define SSL_R_BAD_DATA_RETURNED_BY_CALLBACK 106 1580#define SSL_R_BAD_DATA_RETURNED_BY_CALLBACK 106
1279#define SSL_R_BAD_DECOMPRESSION 107 1581#define SSL_R_BAD_DECOMPRESSION 107
1280#define SSL_R_BAD_DH_G_LENGTH 108 1582#define SSL_R_BAD_DH_G_LENGTH 108
@@ -1282,6 +1584,8 @@ int SSL_CTX_get_ex_new_index();
1282#define SSL_R_BAD_DH_P_LENGTH 110 1584#define SSL_R_BAD_DH_P_LENGTH 110
1283#define SSL_R_BAD_DIGEST_LENGTH 111 1585#define SSL_R_BAD_DIGEST_LENGTH 111
1284#define SSL_R_BAD_DSA_SIGNATURE 112 1586#define SSL_R_BAD_DSA_SIGNATURE 112
1587#define SSL_R_BAD_HELLO_REQUEST 105
1588#define SSL_R_BAD_LENGTH 271
1285#define SSL_R_BAD_MAC_DECODE 113 1589#define SSL_R_BAD_MAC_DECODE 113
1286#define SSL_R_BAD_MESSAGE_TYPE 114 1590#define SSL_R_BAD_MESSAGE_TYPE 114
1287#define SSL_R_BAD_PACKET_LENGTH 115 1591#define SSL_R_BAD_PACKET_LENGTH 115
@@ -1311,83 +1615,108 @@ int SSL_CTX_get_ex_new_index();
1311#define SSL_R_CIPHER_TABLE_SRC_ERROR 139 1615#define SSL_R_CIPHER_TABLE_SRC_ERROR 139
1312#define SSL_R_COMPRESSED_LENGTH_TOO_LONG 140 1616#define SSL_R_COMPRESSED_LENGTH_TOO_LONG 140
1313#define SSL_R_COMPRESSION_FAILURE 141 1617#define SSL_R_COMPRESSION_FAILURE 141
1314#define SSL_R_CONNECTION_ID_IS_DIFFERENT 142 1618#define SSL_R_COMPRESSION_LIBRARY_ERROR 142
1315#define SSL_R_CONNECTION_TYPE_NOT_SET 143 1619#define SSL_R_CONNECTION_ID_IS_DIFFERENT 143
1316#define SSL_R_DATA_BETWEEN_CCS_AND_FINISHED 144 1620#define SSL_R_CONNECTION_TYPE_NOT_SET 144
1317#define SSL_R_DATA_LENGTH_TOO_LONG 145 1621#define SSL_R_DATA_BETWEEN_CCS_AND_FINISHED 145
1318#define SSL_R_DECRYPTION_FAILED 146 1622#define SSL_R_DATA_LENGTH_TOO_LONG 146
1319#define SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG 147 1623#define SSL_R_DECRYPTION_FAILED 147
1320#define SSL_R_DIGEST_CHECK_FAILED 148 1624#define SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC 1109
1321#define SSL_R_ENCRYPTED_LENGTH_TOO_LONG 149 1625#define SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG 148
1322#define SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST 150 1626#define SSL_R_DIGEST_CHECK_FAILED 149
1323#define SSL_R_EXCESSIVE_MESSAGE_SIZE 151 1627#define SSL_R_ENCRYPTED_LENGTH_TOO_LONG 150
1324#define SSL_R_EXTRA_DATA_IN_MESSAGE 152 1628#define SSL_R_ERROR_GENERATING_TMP_RSA_KEY 1092
1325#define SSL_R_GOT_A_FIN_BEFORE_A_CCS 153 1629#define SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST 151
1326#define SSL_R_HTTPS_PROXY_REQUEST 154 1630#define SSL_R_EXCESSIVE_MESSAGE_SIZE 152
1327#define SSL_R_HTTP_REQUEST 155 1631#define SSL_R_EXTRA_DATA_IN_MESSAGE 153
1328#define SSL_R_INTERNAL_ERROR 156 1632#define SSL_R_GOT_A_FIN_BEFORE_A_CCS 154
1329#define SSL_R_INVALID_CHALLENGE_LENGTH 157 1633#define SSL_R_HTTPS_PROXY_REQUEST 155
1330#define SSL_R_LENGTH_MISMATCH 158 1634#define SSL_R_HTTP_REQUEST 156
1331#define SSL_R_LENGTH_TOO_SHORT 159 1635#define SSL_R_ILLEGAL_PADDING 1110
1332#define SSL_R_LIBRARY_HAS_NO_CIPHERS 160 1636#define SSL_R_INVALID_CHALLENGE_LENGTH 158
1333#define SSL_R_MISSING_DH_DSA_CERT 161 1637#define SSL_R_INVALID_COMMAND 280
1334#define SSL_R_MISSING_DH_KEY 162 1638#define SSL_R_INVALID_PURPOSE 278
1335#define SSL_R_MISSING_DH_RSA_CERT 163 1639#define SSL_R_INVALID_TRUST 279
1336#define SSL_R_MISSING_DSA_SIGNING_CERT 164 1640#define SSL_R_KRB5 1104
1337#define SSL_R_MISSING_EXPORT_TMP_DH_KEY 165 1641#define SSL_R_KRB5_C_CC_PRINC 1094
1338#define SSL_R_MISSING_EXPORT_TMP_RSA_KEY 166 1642#define SSL_R_KRB5_C_GET_CRED 1095
1339#define SSL_R_MISSING_RSA_CERTIFICATE 167 1643#define SSL_R_KRB5_C_INIT 1096
1340#define SSL_R_MISSING_RSA_ENCRYPTING_CERT 168 1644#define SSL_R_KRB5_C_MK_REQ 1097
1341#define SSL_R_MISSING_RSA_SIGNING_CERT 169 1645#define SSL_R_KRB5_S_BAD_TICKET 1098
1342#define SSL_R_MISSING_TMP_DH_KEY 170 1646#define SSL_R_KRB5_S_INIT 1099
1343#define SSL_R_MISSING_TMP_RSA_KEY 171 1647#define SSL_R_KRB5_S_RD_REQ 1108
1344#define SSL_R_MISSING_TMP_RSA_PKEY 172 1648#define SSL_R_KRB5_S_TKT_EXPIRED 1105
1345#define SSL_R_MISSING_VERIFY_MESSAGE 173 1649#define SSL_R_KRB5_S_TKT_NYV 1106
1346#define SSL_R_NON_SSLV2_INITIAL_PACKET 174 1650#define SSL_R_KRB5_S_TKT_SKEW 1107
1347#define SSL_R_NO_CERTIFICATES_RETURNED 175 1651#define SSL_R_LENGTH_MISMATCH 159
1348#define SSL_R_NO_CERTIFICATE_ASSIGNED 176 1652#define SSL_R_LENGTH_TOO_SHORT 160
1349#define SSL_R_NO_CERTIFICATE_RETURNED 177 1653#define SSL_R_LIBRARY_BUG 274
1350#define SSL_R_NO_CERTIFICATE_SET 178 1654#define SSL_R_LIBRARY_HAS_NO_CIPHERS 161
1351#define SSL_R_NO_CERTIFICATE_SPECIFIED 179 1655#define SSL_R_MESSAGE_TOO_LONG 1111
1352#define SSL_R_NO_CIPHERS_AVAILABLE 180 1656#define SSL_R_MISSING_DH_DSA_CERT 162
1353#define SSL_R_NO_CIPHERS_PASSED 181 1657#define SSL_R_MISSING_DH_KEY 163
1354#define SSL_R_NO_CIPHERS_SPECIFIED 182 1658#define SSL_R_MISSING_DH_RSA_CERT 164
1355#define SSL_R_NO_CIPHER_LIST 183 1659#define SSL_R_MISSING_DSA_SIGNING_CERT 165
1356#define SSL_R_NO_CIPHER_MATCH 184 1660#define SSL_R_MISSING_EXPORT_TMP_DH_KEY 166
1357#define SSL_R_NO_CLIENT_CERT_RECEIVED 185 1661#define SSL_R_MISSING_EXPORT_TMP_RSA_KEY 167
1358#define SSL_R_NO_COMPRESSION_SPECIFIED 186 1662#define SSL_R_MISSING_RSA_CERTIFICATE 168
1359#define SSL_R_NO_PRIVATEKEY 187 1663#define SSL_R_MISSING_RSA_ENCRYPTING_CERT 169
1360#define SSL_R_NO_PRIVATE_KEY_ASSIGNED 188 1664#define SSL_R_MISSING_RSA_SIGNING_CERT 170
1361#define SSL_R_NO_PROTOCOLS_AVAILABLE 189 1665#define SSL_R_MISSING_TMP_DH_KEY 171
1362#define SSL_R_NO_PUBLICKEY 190 1666#define SSL_R_MISSING_TMP_RSA_KEY 172
1363#define SSL_R_NO_SHARED_CIPHER 191 1667#define SSL_R_MISSING_TMP_RSA_PKEY 173
1364#define SSL_R_NULL_SSL_CTX 192 1668#define SSL_R_MISSING_VERIFY_MESSAGE 174
1365#define SSL_R_NULL_SSL_METHOD_PASSED 193 1669#define SSL_R_NON_SSLV2_INITIAL_PACKET 175
1366#define SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED 194 1670#define SSL_R_NO_CERTIFICATES_RETURNED 176
1367#define SSL_R_PACKET_LENGTH_TOO_LONG 195 1671#define SSL_R_NO_CERTIFICATE_ASSIGNED 177
1368#define SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE 196 1672#define SSL_R_NO_CERTIFICATE_RETURNED 178
1369#define SSL_R_PEER_ERROR 197 1673#define SSL_R_NO_CERTIFICATE_SET 179
1370#define SSL_R_PEER_ERROR_CERTIFICATE 198 1674#define SSL_R_NO_CERTIFICATE_SPECIFIED 180
1371#define SSL_R_PEER_ERROR_NO_CERTIFICATE 199 1675#define SSL_R_NO_CIPHERS_AVAILABLE 181
1372#define SSL_R_PEER_ERROR_NO_CIPHER 200 1676#define SSL_R_NO_CIPHERS_PASSED 182
1373#define SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE 201 1677#define SSL_R_NO_CIPHERS_SPECIFIED 183
1374#define SSL_R_PRE_MAC_LENGTH_TOO_LONG 202 1678#define SSL_R_NO_CIPHER_LIST 184
1375#define SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS 203 1679#define SSL_R_NO_CIPHER_MATCH 185
1376#define SSL_R_PROTOCOL_IS_SHUTDOWN 204 1680#define SSL_R_NO_CLIENT_CERT_RECEIVED 186
1377#define SSL_R_PUBLIC_KEY_ENCRYPT_ERROR 205 1681#define SSL_R_NO_COMPRESSION_SPECIFIED 187
1378#define SSL_R_PUBLIC_KEY_IS_NOT_RSA 206 1682#define SSL_R_NO_METHOD_SPECIFIED 188
1379#define SSL_R_PUBLIC_KEY_NOT_RSA 207 1683#define SSL_R_NO_PRIVATEKEY 189
1380#define SSL_R_READ_BIO_NOT_SET 208 1684#define SSL_R_NO_PRIVATE_KEY_ASSIGNED 190
1381#define SSL_R_READ_WRONG_PACKET_TYPE 209 1685#define SSL_R_NO_PROTOCOLS_AVAILABLE 191
1382#define SSL_R_RECORD_LENGTH_MISMATCH 210 1686#define SSL_R_NO_PUBLICKEY 192
1383#define SSL_R_RECORD_TOO_LARGE 211 1687#define SSL_R_NO_SHARED_CIPHER 193
1384#define SSL_R_REQUIRED_CIPHER_MISSING 212 1688#define SSL_R_NO_VERIFY_CALLBACK 194
1385#define SSL_R_REUSE_CERT_LENGTH_NOT_ZERO 213 1689#define SSL_R_NULL_SSL_CTX 195
1386#define SSL_R_REUSE_CERT_TYPE_NOT_ZERO 214 1690#define SSL_R_NULL_SSL_METHOD_PASSED 196
1387#define SSL_R_REUSE_CIPHER_LIST_NOT_ZERO 215 1691#define SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED 197
1388#define SSL_R_SHORT_READ 216 1692#define SSL_R_PACKET_LENGTH_TOO_LONG 198
1389#define SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE 217 1693#define SSL_R_PATH_TOO_LONG 270
1390#define SSL_R_SSL3_SESSION_ID_TOO_SHORT 218 1694#define SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE 199
1695#define SSL_R_PEER_ERROR 200
1696#define SSL_R_PEER_ERROR_CERTIFICATE 201
1697#define SSL_R_PEER_ERROR_NO_CERTIFICATE 202
1698#define SSL_R_PEER_ERROR_NO_CIPHER 203
1699#define SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE 204
1700#define SSL_R_PRE_MAC_LENGTH_TOO_LONG 205
1701#define SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS 206
1702#define SSL_R_PROTOCOL_IS_SHUTDOWN 207
1703#define SSL_R_PUBLIC_KEY_ENCRYPT_ERROR 208
1704#define SSL_R_PUBLIC_KEY_IS_NOT_RSA 209
1705#define SSL_R_PUBLIC_KEY_NOT_RSA 210
1706#define SSL_R_READ_BIO_NOT_SET 211
1707#define SSL_R_READ_WRONG_PACKET_TYPE 212
1708#define SSL_R_RECORD_LENGTH_MISMATCH 213
1709#define SSL_R_RECORD_TOO_LARGE 214
1710#define SSL_R_RECORD_TOO_SMALL 1093
1711#define SSL_R_REQUIRED_CIPHER_MISSING 215
1712#define SSL_R_REUSE_CERT_LENGTH_NOT_ZERO 216
1713#define SSL_R_REUSE_CERT_TYPE_NOT_ZERO 217
1714#define SSL_R_REUSE_CIPHER_LIST_NOT_ZERO 218
1715#define SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED 277
1716#define SSL_R_SHORT_READ 219
1717#define SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE 220
1718#define SSL_R_SSL23_DOING_SESSION_ID_REUSE 221
1719#define SSL_R_SSL3_SESSION_ID_TOO_SHORT 222
1391#define SSL_R_SSLV3_ALERT_BAD_CERTIFICATE 1042 1720#define SSL_R_SSLV3_ALERT_BAD_CERTIFICATE 1042
1392#define SSL_R_SSLV3_ALERT_BAD_RECORD_MAC 1020 1721#define SSL_R_SSLV3_ALERT_BAD_RECORD_MAC 1020
1393#define SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED 1045 1722#define SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED 1045
@@ -1397,57 +1726,75 @@ int SSL_CTX_get_ex_new_index();
1397#define SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE 1040 1726#define SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE 1040
1398#define SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER 1047 1727#define SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER 1047
1399#define SSL_R_SSLV3_ALERT_NO_CERTIFICATE 1041 1728#define SSL_R_SSLV3_ALERT_NO_CERTIFICATE 1041
1400#define SSL_R_SSLV3_ALERT_PEER_ERROR_CERTIFICATE 219 1729#define SSL_R_SSLV3_ALERT_PEER_ERROR_CERTIFICATE 223
1401#define SSL_R_SSLV3_ALERT_PEER_ERROR_NO_CERTIFICATE 220 1730#define SSL_R_SSLV3_ALERT_PEER_ERROR_NO_CERTIFICATE 224
1402#define SSL_R_SSLV3_ALERT_PEER_ERROR_NO_CIPHER 221 1731#define SSL_R_SSLV3_ALERT_PEER_ERROR_NO_CIPHER 225
1403#define SSL_R_SSLV3_ALERT_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE 222 1732#define SSL_R_SSLV3_ALERT_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE 226
1404#define SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE 1010 1733#define SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE 1010
1405#define SSL_R_SSLV3_ALERT_UNKNOWN_REMOTE_ERROR_TYPE 223 1734#define SSL_R_SSLV3_ALERT_UNKNOWN_REMOTE_ERROR_TYPE 227
1406#define SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE 1043 1735#define SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE 1043
1407#define SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION 224 1736#define SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION 228
1408#define SSL_R_SSL_HANDSHAKE_FAILURE 225 1737#define SSL_R_SSL_HANDSHAKE_FAILURE 229
1409#define SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS 226 1738#define SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS 230
1410#define SSL_R_SSL_SESSION_ID_IS_DIFFERENT 227 1739#define SSL_R_SSL_SESSION_ID_CALLBACK_FAILED 1102
1411#define SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER 228 1740#define SSL_R_SSL_SESSION_ID_CONFLICT 1103
1412#define SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST 229 1741#define SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG 273
1413#define SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG 230 1742#define SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH 1101
1414#define SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER 231 1743#define SSL_R_SSL_SESSION_ID_IS_DIFFERENT 231
1415#define SSL_R_UNABLE_TO_DECODE_DH_CERTS 232 1744#define SSL_R_TLSV1_ALERT_ACCESS_DENIED 1049
1416#define SSL_R_UNABLE_TO_EXTRACT_PUBLIC_KEY 233 1745#define SSL_R_TLSV1_ALERT_DECODE_ERROR 1050
1417#define SSL_R_UNABLE_TO_FIND_DH_PARAMETERS 234 1746#define SSL_R_TLSV1_ALERT_DECRYPTION_FAILED 1021
1418#define SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS 235 1747#define SSL_R_TLSV1_ALERT_DECRYPT_ERROR 1051
1419#define SSL_R_UNABLE_TO_FIND_SSL_METHOD 236 1748#define SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION 1060
1420#define SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES 237 1749#define SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY 1071
1421#define SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES 238 1750#define SSL_R_TLSV1_ALERT_INTERNAL_ERROR 1080
1422#define SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES 239 1751#define SSL_R_TLSV1_ALERT_NO_RENEGOTIATION 1100
1423#define SSL_R_UNEXPECTED_MESSAGE 240 1752#define SSL_R_TLSV1_ALERT_PROTOCOL_VERSION 1070
1424#define SSL_R_UNEXPECTED_RECORD 241 1753#define SSL_R_TLSV1_ALERT_RECORD_OVERFLOW 1022
1425#define SSL_R_UNKNOWN_ALERT_TYPE 242 1754#define SSL_R_TLSV1_ALERT_UNKNOWN_CA 1048
1426#define SSL_R_UNKNOWN_CERTIFICATE_TYPE 243 1755#define SSL_R_TLSV1_ALERT_USER_CANCELLED 1090
1427#define SSL_R_UNKNOWN_CIPHER_RETURNED 244 1756#define SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER 232
1428#define SSL_R_UNKNOWN_CIPHER_TYPE 245 1757#define SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST 233
1429#define SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE 246 1758#define SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG 234
1430#define SSL_R_UNKNOWN_PKEY_TYPE 247 1759#define SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER 235
1431#define SSL_R_UNKNOWN_PROTOCOL 248 1760#define SSL_R_UNABLE_TO_DECODE_DH_CERTS 236
1432#define SSL_R_UNKNOWN_REMOTE_ERROR_TYPE 249 1761#define SSL_R_UNABLE_TO_EXTRACT_PUBLIC_KEY 237
1433#define SSL_R_UNKNOWN_SSL_VERSION 250 1762#define SSL_R_UNABLE_TO_FIND_DH_PARAMETERS 238
1434#define SSL_R_UNKNOWN_STATE 251 1763#define SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS 239
1435#define SSL_R_UNSUPPORTED_CIPHER 252 1764#define SSL_R_UNABLE_TO_FIND_SSL_METHOD 240
1436#define SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM 253 1765#define SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES 241
1437#define SSL_R_UNSUPPORTED_PROTOCOL 254 1766#define SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES 242
1438#define SSL_R_UNSUPPORTED_SSL_VERSION 255 1767#define SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES 243
1439#define SSL_R_WRITE_BIO_NOT_SET 256 1768#define SSL_R_UNEXPECTED_MESSAGE 244
1440#define SSL_R_WRONG_CIPHER_RETURNED 257 1769#define SSL_R_UNEXPECTED_RECORD 245
1441#define SSL_R_WRONG_MESSAGE_TYPE 258 1770#define SSL_R_UNINITIALIZED 276
1442#define SSL_R_WRONG_NUMBER_OF_KEY_BITS 259 1771#define SSL_R_UNKNOWN_ALERT_TYPE 246
1443#define SSL_R_WRONG_SIGNATURE_LENGTH 260 1772#define SSL_R_UNKNOWN_CERTIFICATE_TYPE 247
1444#define SSL_R_WRONG_SIGNATURE_SIZE 261 1773#define SSL_R_UNKNOWN_CIPHER_RETURNED 248
1445#define SSL_R_WRONG_SSL_VERSION 262 1774#define SSL_R_UNKNOWN_CIPHER_TYPE 249
1446#define SSL_R_WRONG_VERSION_NUMBER 263 1775#define SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE 250
1447#define SSL_R_X509_LIB 264 1776#define SSL_R_UNKNOWN_PKEY_TYPE 251
1448 1777#define SSL_R_UNKNOWN_PROTOCOL 252
1778#define SSL_R_UNKNOWN_REMOTE_ERROR_TYPE 253
1779#define SSL_R_UNKNOWN_SSL_VERSION 254
1780#define SSL_R_UNKNOWN_STATE 255
1781#define SSL_R_UNSUPPORTED_CIPHER 256
1782#define SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM 257
1783#define SSL_R_UNSUPPORTED_OPTION 1091
1784#define SSL_R_UNSUPPORTED_PROTOCOL 258
1785#define SSL_R_UNSUPPORTED_SSL_VERSION 259
1786#define SSL_R_WRITE_BIO_NOT_SET 260
1787#define SSL_R_WRONG_CIPHER_RETURNED 261
1788#define SSL_R_WRONG_MESSAGE_TYPE 262
1789#define SSL_R_WRONG_NUMBER_OF_KEY_BITS 263
1790#define SSL_R_WRONG_SIGNATURE_LENGTH 264
1791#define SSL_R_WRONG_SIGNATURE_SIZE 265
1792#define SSL_R_WRONG_SSL_VERSION 266
1793#define SSL_R_WRONG_VERSION_NUMBER 267
1794#define SSL_R_X509_LIB 268
1795#define SSL_R_X509_VERIFICATION_SETUP_PROBLEMS 269
1796
1449#ifdef __cplusplus 1797#ifdef __cplusplus
1450} 1798}
1451#endif 1799#endif
1452#endif 1800#endif
1453
diff --git a/src/lib/libssl/ssl2.h b/src/lib/libssl/ssl2.h
index 3dc94e520b..99a52ea0dd 100644
--- a/src/lib/libssl/ssl2.h
+++ b/src/lib/libssl/ssl2.h
@@ -67,8 +67,8 @@ extern "C" {
67#define SSL2_VERSION 0x0002 67#define SSL2_VERSION 0x0002
68#define SSL2_VERSION_MAJOR 0x00 68#define SSL2_VERSION_MAJOR 0x00
69#define SSL2_VERSION_MINOR 0x02 69#define SSL2_VERSION_MINOR 0x02
70#define SSL2_CLIENT_VERSION 0x0002 70/* #define SSL2_CLIENT_VERSION 0x0002 */
71#define SSL2_SERVER_VERSION 0x0002 71/* #define SSL2_SERVER_VERSION 0x0002 */
72 72
73/* Protocol Message Codes */ 73/* Protocol Message Codes */
74#define SSL2_MT_ERROR 0 74#define SSL2_MT_ERROR 0
@@ -133,8 +133,12 @@ extern "C" {
133 133
134/* Upper/Lower Bounds */ 134/* Upper/Lower Bounds */
135#define SSL2_MAX_MASTER_KEY_LENGTH_IN_BITS 256 135#define SSL2_MAX_MASTER_KEY_LENGTH_IN_BITS 256
136#define SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER (unsigned int)32767 136#ifdef OPENSSL_SYS_MPE
137#define SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER 16383 /**/ 137#define SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER 29998u
138#else
139#define SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER 32767u /* 2^15-1 */
140#endif
141#define SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER 16383 /* 2^14-1 */
138 142
139#define SSL2_CHALLENGE_LENGTH 16 143#define SSL2_CHALLENGE_LENGTH 16
140/*#define SSL2_CHALLENGE_LENGTH 32 */ 144/*#define SSL2_CHALLENGE_LENGTH 32 */
@@ -151,7 +155,7 @@ extern "C" {
151#define CERT char 155#define CERT char
152#endif 156#endif
153 157
154typedef struct ssl2_ctx_st 158typedef struct ssl2_state_st
155 { 159 {
156 int three_byte_header; 160 int three_byte_header;
157 int clear_text; /* clear text */ 161 int clear_text; /* clear text */
@@ -162,7 +166,7 @@ typedef struct ssl2_ctx_st
162 * args were passwd */ 166 * args were passwd */
163 unsigned int wnum; /* number of bytes sent so far */ 167 unsigned int wnum; /* number of bytes sent so far */
164 int wpend_tot; 168 int wpend_tot;
165 char *wpend_buf; 169 const unsigned char *wpend_buf;
166 170
167 int wpend_off; /* offset to data to write */ 171 int wpend_off; /* offset to data to write */
168 int wpend_len; /* number of bytes passwd to write */ 172 int wpend_len; /* number of bytes passwd to write */
@@ -185,7 +189,6 @@ typedef struct ssl2_ctx_st
185 unsigned char *ract_data; 189 unsigned char *ract_data;
186 unsigned char *wact_data; 190 unsigned char *wact_data;
187 unsigned char *mac_data; 191 unsigned char *mac_data;
188 unsigned char *pad_data;
189 192
190 unsigned char *read_key; 193 unsigned char *read_key;
191 unsigned char *write_key; 194 unsigned char *write_key;
@@ -205,16 +208,16 @@ typedef struct ssl2_ctx_st
205 unsigned int conn_id_length; 208 unsigned int conn_id_length;
206 unsigned int cert_type; 209 unsigned int cert_type;
207 unsigned int cert_length; 210 unsigned int cert_length;
208 int csl; 211 unsigned int csl;
209 int clear; 212 unsigned int clear;
210 unsigned int enc; 213 unsigned int enc;
211 unsigned char ccl[SSL2_MAX_CERT_CHALLENGE_LENGTH]; 214 unsigned char ccl[SSL2_MAX_CERT_CHALLENGE_LENGTH];
212 int cipher_spec_length; 215 unsigned int cipher_spec_length;
213 unsigned int session_id_length; 216 unsigned int session_id_length;
214 unsigned int clen; 217 unsigned int clen;
215 unsigned int rlen; 218 unsigned int rlen;
216 } tmp; 219 } tmp;
217 } SSL2_CTX; 220 } SSL2_STATE;
218 221
219/* SSLv2 */ 222/* SSLv2 */
220/* client */ 223/* client */
diff --git a/src/lib/libssl/ssl3.h b/src/lib/libssl/ssl3.h
index 95772eef60..8fd6951d77 100644
--- a/src/lib/libssl/ssl3.h
+++ b/src/lib/libssl/ssl3.h
@@ -55,11 +55,69 @@
55 * copied and put under another distribution licence 55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.] 56 * [including the GNU Public Licence.]
57 */ 57 */
58/* ====================================================================
59 * Copyright (c) 1998-2002 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 */
58 111
59#ifndef HEADER_SSL3_H 112#ifndef HEADER_SSL3_H
60#define HEADER_SSL3_H 113#define HEADER_SSL3_H
61 114
62#include "buffer.h" 115#ifndef OPENSSL_NO_COMP
116#include <openssl/comp.h>
117#endif
118#include <openssl/buffer.h>
119#include <openssl/evp.h>
120#include <openssl/ssl.h>
63 121
64#ifdef __cplusplus 122#ifdef __cplusplus
65extern "C" { 123extern "C" {
@@ -100,6 +158,22 @@ extern "C" {
100#define SSL3_CK_FZA_DMS_FZA_SHA 0x0300001D 158#define SSL3_CK_FZA_DMS_FZA_SHA 0x0300001D
101#define SSL3_CK_FZA_DMS_RC4_SHA 0x0300001E 159#define SSL3_CK_FZA_DMS_RC4_SHA 0x0300001E
102 160
161/* VRS Additional Kerberos5 entries
162 */
163#define SSL3_CK_KRB5_DES_40_CBC_SHA 0x03000021
164#define SSL3_CK_KRB5_DES_40_CBC_MD5 0x03000022
165#define SSL3_CK_KRB5_DES_64_CBC_SHA 0x03000023
166#define SSL3_CK_KRB5_DES_64_CBC_MD5 0x03000024
167#define SSL3_CK_KRB5_DES_192_CBC3_SHA 0x03000025
168#define SSL3_CK_KRB5_DES_192_CBC3_MD5 0x03000026
169
170#define SSL3_TXT_KRB5_DES_40_CBC_SHA "EXP-KRB5-DES-CBC-SHA"
171#define SSL3_TXT_KRB5_DES_40_CBC_MD5 "EXP-KRB5-DES-CBC-MD5"
172#define SSL3_TXT_KRB5_DES_64_CBC_SHA "KRB5-DES-CBC-SHA"
173#define SSL3_TXT_KRB5_DES_64_CBC_MD5 "KRB5-DES-CBC-MD5"
174#define SSL3_TXT_KRB5_DES_192_CBC3_SHA "KRB5-DES-CBC3-SHA"
175#define SSL3_TXT_KRB5_DES_192_CBC3_MD5 "KRB5-DES-CBC3-MD5"
176
103#define SSL3_TXT_RSA_NULL_MD5 "NULL-MD5" 177#define SSL3_TXT_RSA_NULL_MD5 "NULL-MD5"
104#define SSL3_TXT_RSA_NULL_SHA "NULL-SHA" 178#define SSL3_TXT_RSA_NULL_SHA "NULL-SHA"
105#define SSL3_TXT_RSA_RC4_40_MD5 "EXP-RC4-MD5" 179#define SSL3_TXT_RSA_RC4_40_MD5 "EXP-RC4-MD5"
@@ -144,7 +218,8 @@ extern "C" {
144#define SSL3_RT_HEADER_LENGTH 5 218#define SSL3_RT_HEADER_LENGTH 5
145 219
146/* Due to MS stuffing up, this can change.... */ 220/* Due to MS stuffing up, this can change.... */
147#if defined(WIN16) || (defined(MSDOS) && !defined(WIN32)) 221#if defined(OPENSSL_SYS_WIN16) || \
222 (defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN32))
148#define SSL3_RT_MAX_EXTRA (14000) 223#define SSL3_RT_MAX_EXTRA (14000)
149#else 224#else
150#define SSL3_RT_MAX_EXTRA (16384) 225#define SSL3_RT_MAX_EXTRA (16384)
@@ -156,24 +231,8 @@ extern "C" {
156#define SSL3_RT_MAX_PACKET_SIZE (SSL3_RT_MAX_ENCRYPTED_LENGTH+SSL3_RT_HEADER_LENGTH) 231#define SSL3_RT_MAX_PACKET_SIZE (SSL3_RT_MAX_ENCRYPTED_LENGTH+SSL3_RT_HEADER_LENGTH)
157#define SSL3_RT_MAX_DATA_SIZE (1024*1024) 232#define SSL3_RT_MAX_DATA_SIZE (1024*1024)
158 233
159/* the states that a SSL3_RECORD can be in 234#define SSL3_MD_CLIENT_FINISHED_CONST "\x43\x4C\x4E\x54"
160 * For SSL_read it goes 235#define SSL3_MD_SERVER_FINISHED_CONST "\x53\x52\x56\x52"
161 * rbuf->ENCODED -> read
162 * ENCODED -> we need to decode everything - call decode_record
163 */
164
165#define SSL3_RS_BLANK 1
166#define SSL3_RS_DATA
167
168#define SSL3_RS_ENCODED 2
169#define SSL3_RS_READ_MORE 3
170#define SSL3_RS_WRITE_MORE
171#define SSL3_RS_PLAIN 3
172#define SSL3_RS_PART_READ 4
173#define SSL3_RS_PART_WRITE 5
174
175#define SSL3_MD_CLIENT_FINISHED_CONST {0x43,0x4C,0x4E,0x54}
176#define SSL3_MD_SERVER_FINISHED_CONST {0x53,0x52,0x56,0x52}
177 236
178#define SSL3_VERSION 0x0300 237#define SSL3_VERSION 0x0300
179#define SSL3_VERSION_MAJOR 0x03 238#define SSL3_VERSION_MAJOR 0x03
@@ -202,28 +261,23 @@ extern "C" {
202 261
203typedef struct ssl3_record_st 262typedef struct ssl3_record_st
204 { 263 {
205/*r */ int type; /* type of record */ 264/*r */ int type; /* type of record */
206/* */ /*int state;*/ /* any data in it? */ 265/*rw*/ unsigned int length; /* How many bytes available */
207/*rw*/ unsigned int length; /* How many bytes available */ 266/*r */ unsigned int off; /* read/write offset into 'buf' */
208/*r */ unsigned int off; /* read/write offset into 'buf' */ 267/*rw*/ unsigned char *data; /* pointer to the record data */
209/*rw*/ unsigned char *data; /* pointer to the record data */ 268/*rw*/ unsigned char *input; /* where the decode bytes are */
210/*rw*/ unsigned char *input; /* where the decode bytes are */ 269/*r */ unsigned char *comp; /* only used with decompression - malloc()ed */
211/*rw*/ unsigned char *comp; /* only used with decompression */
212 } SSL3_RECORD; 270 } SSL3_RECORD;
213 271
214typedef struct ssl3_buffer_st 272typedef struct ssl3_buffer_st
215 { 273 {
216/*r */ int total; /* used in non-blocking writes */ 274 unsigned char *buf; /* at least SSL3_RT_MAX_PACKET_SIZE bytes,
217/*r */ int wanted; /* how many more bytes we need */ 275 * see ssl3_setup_buffers() */
218/*rw*/ int left; /* how many bytes left */ 276 size_t len; /* buffer size */
219/*rw*/ int offset; /* where to 'copy from' */ 277 int offset; /* where to 'copy from' */
220/*rw*/ unsigned char *buf; /* SSL3_RT_MAX_PACKET_SIZE bytes */ 278 int left; /* how many bytes left */
221 } SSL3_BUFFER; 279 } SSL3_BUFFER;
222 280
223typedef struct ssl3_compression_st {
224 int nothing;
225 } SSL3_COMPRESSION;
226
227#define SSL3_CT_RSA_SIGN 1 281#define SSL3_CT_RSA_SIGN 1
228#define SSL3_CT_DSS_SIGN 2 282#define SSL3_CT_DSS_SIGN 2
229#define SSL3_CT_RSA_FIXED_DH 3 283#define SSL3_CT_RSA_FIXED_DH 3
@@ -236,36 +290,9 @@ typedef struct ssl3_compression_st {
236#define SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS 0x0001 290#define SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS 0x0001
237#define SSL3_FLAGS_DELAY_CLIENT_FINISHED 0x0002 291#define SSL3_FLAGS_DELAY_CLIENT_FINISHED 0x0002
238#define SSL3_FLAGS_POP_BUFFER 0x0004 292#define SSL3_FLAGS_POP_BUFFER 0x0004
239#define TLS1_FLAGS_TLS_PADDING_BUG 0x0008 293#define TLS1_FLAGS_TLS_PADDING_BUG 0x0008
240
241#if 0
242#define AD_CLOSE_NOTIFY 0
243#define AD_UNEXPECTED_MESSAGE 1
244#define AD_BAD_RECORD_MAC 2
245#define AD_DECRYPTION_FAILED 3
246#define AD_RECORD_OVERFLOW 4
247#define AD_DECOMPRESSION_FAILURE 5 /* fatal */
248#define AD_HANDSHAKE_FAILURE 6 /* fatal */
249#define AD_NO_CERTIFICATE 7 /* Not under TLS */
250#define AD_BAD_CERTIFICATE 8
251#define AD_UNSUPPORTED_CERTIFICATE 9
252#define AD_CERTIFICATE_REVOKED 10
253#define AD_CERTIFICATE_EXPIRED 11
254#define AD_CERTIFICATE_UNKNOWN 12
255#define AD_ILLEGAL_PARAMETER 13 /* fatal */
256#define AD_UNKNOWN_CA 14 /* fatal */
257#define AD_ACCESS_DENIED 15 /* fatal */
258#define AD_DECODE_ERROR 16 /* fatal */
259#define AD_DECRYPT_ERROR 17
260#define AD_EXPORT_RESTRICION 18 /* fatal */
261#define AD_PROTOCOL_VERSION 19 /* fatal */
262#define AD_INSUFFICIENT_SECURITY 20 /* fatal */
263#define AD_INTERNAL_ERROR 21 /* fatal */
264#define AD_USER_CANCLED 22
265#define AD_NO_RENEGOTIATION 23
266#endif
267 294
268typedef struct ssl3_ctx_st 295typedef struct ssl3_state_st
269 { 296 {
270 long flags; 297 long flags;
271 int delay_buf_pop_ret; 298 int delay_buf_pop_ret;
@@ -278,19 +305,29 @@ typedef struct ssl3_ctx_st
278 unsigned char server_random[SSL3_RANDOM_SIZE]; 305 unsigned char server_random[SSL3_RANDOM_SIZE];
279 unsigned char client_random[SSL3_RANDOM_SIZE]; 306 unsigned char client_random[SSL3_RANDOM_SIZE];
280 307
308 /* flags for countermeasure against known-IV weakness */
309 int need_empty_fragments;
310 int empty_fragment_done;
311
281 SSL3_BUFFER rbuf; /* read IO goes into here */ 312 SSL3_BUFFER rbuf; /* read IO goes into here */
282 SSL3_BUFFER wbuf; /* write IO goes into here */ 313 SSL3_BUFFER wbuf; /* write IO goes into here */
314
283 SSL3_RECORD rrec; /* each decoded record goes in here */ 315 SSL3_RECORD rrec; /* each decoded record goes in here */
284 SSL3_RECORD wrec; /* goes out from here */ 316 SSL3_RECORD wrec; /* goes out from here */
285 /* Used by ssl3_read_n to point 317
286 * to input data packet */ 318 /* storage for Alert/Handshake protocol data received but not
319 * yet processed by ssl3_read_bytes: */
320 unsigned char alert_fragment[2];
321 unsigned int alert_fragment_len;
322 unsigned char handshake_fragment[4];
323 unsigned int handshake_fragment_len;
287 324
288 /* partial write - check the numbers match */ 325 /* partial write - check the numbers match */
289 unsigned int wnum; /* number of bytes sent so far */ 326 unsigned int wnum; /* number of bytes sent so far */
290 int wpend_tot; /* number bytes written */ 327 int wpend_tot; /* number bytes written */
291 int wpend_type; 328 int wpend_type;
292 int wpend_ret; /* number of bytes submitted */ 329 int wpend_ret; /* number of bytes submitted */
293 char *wpend_buf; 330 const unsigned char *wpend_buf;
294 331
295 /* used during startup, digest all incoming/outgoing packets */ 332 /* used during startup, digest all incoming/outgoing packets */
296 EVP_MD_CTX finish_dgst1; 333 EVP_MD_CTX finish_dgst1;
@@ -302,10 +339,10 @@ typedef struct ssl3_ctx_st
302 339
303 int warn_alert; 340 int warn_alert;
304 int fatal_alert; 341 int fatal_alert;
305 /* we alow one fatal and one warning alert to be outstanding, 342 /* we allow one fatal and one warning alert to be outstanding,
306 * send close alert via the warning alert */ 343 * send close alert via the warning alert */
307 int alert_dispatch; 344 int alert_dispatch;
308 char send_alert[2]; 345 unsigned char send_alert[2];
309 346
310 /* This flag is set when we should renegotiate ASAP, basically when 347 /* This flag is set when we should renegotiate ASAP, basically when
311 * there is no more data in the read or write buffers */ 348 * there is no more data in the read or write buffers */
@@ -316,16 +353,23 @@ typedef struct ssl3_ctx_st
316 int in_read_app_data; 353 int in_read_app_data;
317 354
318 struct { 355 struct {
319 /* Actually only needs to be 16+20 for SSLv3 and 12 for TLS */ 356 /* actually only needs to be 16+20 */
357 unsigned char cert_verify_md[EVP_MAX_MD_SIZE*2];
358
359 /* actually only need to be 16+20 for SSLv3 and 12 for TLS */
320 unsigned char finish_md[EVP_MAX_MD_SIZE*2]; 360 unsigned char finish_md[EVP_MAX_MD_SIZE*2];
361 int finish_md_len;
362 unsigned char peer_finish_md[EVP_MAX_MD_SIZE*2];
363 int peer_finish_md_len;
321 364
322 unsigned long message_size; 365 unsigned long message_size;
323 int message_type; 366 int message_type;
324 367
325 /* used to hold the new cipher we are going to use */ 368 /* used to hold the new cipher we are going to use */
326 SSL_CIPHER *new_cipher; 369 SSL_CIPHER *new_cipher;
370#ifndef OPENSSL_NO_DH
327 DH *dh; 371 DH *dh;
328 372#endif
329 /* used when SSL_ST_FLUSH_DATA is entered */ 373 /* used when SSL_ST_FLUSH_DATA is entered */
330 int next_state; 374 int next_state;
331 375
@@ -335,19 +379,24 @@ typedef struct ssl3_ctx_st
335 int cert_req; 379 int cert_req;
336 int ctype_num; 380 int ctype_num;
337 char ctype[SSL3_CT_NUMBER]; 381 char ctype[SSL3_CT_NUMBER];
338 STACK *ca_names; 382 STACK_OF(X509_NAME) *ca_names;
339 383
340 int use_rsa_tmp; 384 int use_rsa_tmp;
341 385
342 int key_block_length; 386 int key_block_length;
343 unsigned char *key_block; 387 unsigned char *key_block;
344 388
345 EVP_CIPHER *new_sym_enc; 389 const EVP_CIPHER *new_sym_enc;
346 EVP_MD *new_hash; 390 const EVP_MD *new_hash;
347 SSL_COMPRESSION *new_compression; 391#ifndef OPENSSL_NO_COMP
392 const SSL_COMP *new_compression;
393#else
394 char *new_compression;
395#endif
348 int cert_request; 396 int cert_request;
349 } tmp; 397 } tmp;
350 } SSL3_CTX; 398
399 } SSL3_STATE;
351 400
352/* SSLv3 */ 401/* SSLv3 */
353/*client */ 402/*client */
@@ -425,7 +474,7 @@ typedef struct ssl3_ctx_st
425#define SSL3_ST_SW_FINISHED_A (0x1E0|SSL_ST_ACCEPT) 474#define SSL3_ST_SW_FINISHED_A (0x1E0|SSL_ST_ACCEPT)
426#define SSL3_ST_SW_FINISHED_B (0x1E1|SSL_ST_ACCEPT) 475#define SSL3_ST_SW_FINISHED_B (0x1E1|SSL_ST_ACCEPT)
427 476
428#define SSL3_MT_CLIENT_REQUEST 0 477#define SSL3_MT_HELLO_REQUEST 0
429#define SSL3_MT_CLIENT_HELLO 1 478#define SSL3_MT_CLIENT_HELLO 1
430#define SSL3_MT_SERVER_HELLO 2 479#define SSL3_MT_SERVER_HELLO 2
431#define SSL3_MT_CERTIFICATE 11 480#define SSL3_MT_CERTIFICATE 11
diff --git a/src/lib/libssl/ssl_algs.c b/src/lib/libssl/ssl_algs.c
index 65f3a59386..3d1299ee7b 100644
--- a/src/lib/libssl/ssl_algs.c
+++ b/src/lib/libssl/ssl_algs.c
@@ -57,46 +57,55 @@
57 */ 57 */
58 58
59#include <stdio.h> 59#include <stdio.h>
60#include "objects.h" 60#include <openssl/objects.h>
61#include "lhash.h" 61#include <openssl/lhash.h>
62#include "ssl_locl.h" 62#include "ssl_locl.h"
63 63
64void SSLeay_add_ssl_algorithms() 64int SSL_library_init(void)
65 { 65 {
66#ifndef NO_DES 66
67#ifndef OPENSSL_NO_DES
67 EVP_add_cipher(EVP_des_cbc()); 68 EVP_add_cipher(EVP_des_cbc());
68 EVP_add_cipher(EVP_des_ede3_cbc()); 69 EVP_add_cipher(EVP_des_ede3_cbc());
69#endif 70#endif
70#ifndef NO_IDEA 71#ifndef OPENSSL_NO_IDEA
71 EVP_add_cipher(EVP_idea_cbc()); 72 EVP_add_cipher(EVP_idea_cbc());
72#endif 73#endif
73#ifndef NO_RC4 74#ifndef OPENSSL_NO_RC4
74 EVP_add_cipher(EVP_rc4()); 75 EVP_add_cipher(EVP_rc4());
75#endif
76#ifndef NO_RC2
77 EVP_add_cipher(EVP_rc2_cbc());
78#endif 76#endif
79 77#ifndef OPENSSL_NO_RC2
80#ifndef NO_MD2 78 EVP_add_cipher(EVP_rc2_cbc());
81 EVP_add_digest(EVP_md2());
82#endif 79#endif
83#ifndef NO_MD5 80#ifndef OPENSSL_NO_AES
81 EVP_add_cipher(EVP_aes_128_cbc());
82 EVP_add_cipher(EVP_aes_192_cbc());
83 EVP_add_cipher(EVP_aes_256_cbc());
84#endif
85#ifndef OPENSSL_NO_MD2
86 EVP_add_digest(EVP_md2());
87#endif
88#ifndef OPENSSL_NO_MD5
84 EVP_add_digest(EVP_md5()); 89 EVP_add_digest(EVP_md5());
85 EVP_add_alias(SN_md5,"ssl2-md5"); 90 EVP_add_digest_alias(SN_md5,"ssl2-md5");
86 EVP_add_alias(SN_md5,"ssl3-md5"); 91 EVP_add_digest_alias(SN_md5,"ssl3-md5");
87#endif 92#endif
88#ifndef NO_SHA1 93#ifndef OPENSSL_NO_SHA
89 EVP_add_digest(EVP_sha1()); /* RSA with sha1 */ 94 EVP_add_digest(EVP_sha1()); /* RSA with sha1 */
90 EVP_add_alias(SN_sha1,"ssl3-sha1"); 95 EVP_add_digest_alias(SN_sha1,"ssl3-sha1");
96 EVP_add_digest_alias(SN_sha1WithRSAEncryption,SN_sha1WithRSA);
91#endif 97#endif
92#if !defined(NO_SHA1) && !defined(NO_DSA) 98#if !defined(OPENSSL_NO_SHA) && !defined(OPENSSL_NO_DSA)
93 EVP_add_digest(EVP_dss1()); /* DSA with sha1 */ 99 EVP_add_digest(EVP_dss1()); /* DSA with sha1 */
100 EVP_add_digest_alias(SN_dsaWithSHA1,SN_dsaWithSHA1_2);
101 EVP_add_digest_alias(SN_dsaWithSHA1,"DSS1");
102 EVP_add_digest_alias(SN_dsaWithSHA1,"dss1");
94#endif 103#endif
95
96 /* If you want support for phased out ciphers, add the following */ 104 /* If you want support for phased out ciphers, add the following */
97#if 0 105#if 0
98 EVP_add_digest(EVP_sha()); 106 EVP_add_digest(EVP_sha());
99 EVP_add_digest(EVP_dss()); 107 EVP_add_digest(EVP_dss());
100#endif 108#endif
109 return(1);
101 } 110 }
102 111
diff --git a/src/lib/libssl/ssl_asn1.c b/src/lib/libssl/ssl_asn1.c
index 116a83de64..c5eeeb6bc5 100644
--- a/src/lib/libssl/ssl_asn1.c
+++ b/src/lib/libssl/ssl_asn1.c
@@ -58,8 +58,9 @@
58 58
59#include <stdio.h> 59#include <stdio.h>
60#include <stdlib.h> 60#include <stdlib.h>
61#include "asn1_mac.h" 61#include <openssl/asn1_mac.h>
62#include "objects.h" 62#include <openssl/objects.h>
63#include <openssl/x509.h>
63#include "ssl_locl.h" 64#include "ssl_locl.h"
64 65
65typedef struct ssl_session_asn1_st 66typedef struct ssl_session_asn1_st
@@ -69,24 +70,22 @@ typedef struct ssl_session_asn1_st
69 ASN1_OCTET_STRING cipher; 70 ASN1_OCTET_STRING cipher;
70 ASN1_OCTET_STRING master_key; 71 ASN1_OCTET_STRING master_key;
71 ASN1_OCTET_STRING session_id; 72 ASN1_OCTET_STRING session_id;
73 ASN1_OCTET_STRING session_id_context;
72 ASN1_OCTET_STRING key_arg; 74 ASN1_OCTET_STRING key_arg;
75#ifndef OPENSSL_NO_KRB5
76 ASN1_OCTET_STRING krb5_princ;
77#endif /* OPENSSL_NO_KRB5 */
73 ASN1_INTEGER time; 78 ASN1_INTEGER time;
74 ASN1_INTEGER timeout; 79 ASN1_INTEGER timeout;
80 ASN1_INTEGER verify_result;
75 } SSL_SESSION_ASN1; 81 } SSL_SESSION_ASN1;
76 82
77/* 83int i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp)
78 * SSLerr(SSL_F_I2D_SSL_SESSION,SSL_R_CIPHER_CODE_WRONG_LENGTH);
79 * SSLerr(SSL_F_D2I_SSL_SESSION,SSL_R_UNSUPPORTED_CIPHER);
80 */
81
82int i2d_SSL_SESSION(in,pp)
83SSL_SESSION *in;
84unsigned char **pp;
85 { 84 {
86#define LSIZE2 (sizeof(long)*2) 85#define LSIZE2 (sizeof(long)*2)
87 int v1=0,v2=0,v3=0; 86 int v1=0,v2=0,v3=0,v4=0,v5=0;
88 unsigned char buf[4],ibuf1[LSIZE2],ibuf2[LSIZE2]; 87 unsigned char buf[4],ibuf1[LSIZE2],ibuf2[LSIZE2];
89 unsigned char ibuf3[LSIZE2],ibuf4[LSIZE2]; 88 unsigned char ibuf3[LSIZE2],ibuf4[LSIZE2],ibuf5[LSIZE2];
90 long l; 89 long l;
91 SSL_SESSION_ASN1 a; 90 SSL_SESSION_ASN1 a;
92 M_ASN1_I2D_vars(in); 91 M_ASN1_I2D_vars(in);
@@ -95,8 +94,8 @@ unsigned char **pp;
95 return(0); 94 return(0);
96 95
97 /* Note that I cheat in the following 2 assignments. I know 96 /* Note that I cheat in the following 2 assignments. I know
98 * that if the ASN1_INTERGER passed to ASN1_INTEGER_set 97 * that if the ASN1_INTEGER passed to ASN1_INTEGER_set
99 * is > sizeof(long)+1, the buffer will not be re-Malloc()ed. 98 * is > sizeof(long)+1, the buffer will not be re-OPENSSL_malloc()ed.
100 * This is a bit evil but makes things simple, no dynamic allocation 99 * This is a bit evil but makes things simple, no dynamic allocation
101 * to clean up :-) */ 100 * to clean up :-) */
102 a.version.length=LSIZE2; 101 a.version.length=LSIZE2;
@@ -138,10 +137,23 @@ unsigned char **pp;
138 a.session_id.type=V_ASN1_OCTET_STRING; 137 a.session_id.type=V_ASN1_OCTET_STRING;
139 a.session_id.data=in->session_id; 138 a.session_id.data=in->session_id;
140 139
140 a.session_id_context.length=in->sid_ctx_length;
141 a.session_id_context.type=V_ASN1_OCTET_STRING;
142 a.session_id_context.data=in->sid_ctx;
143
141 a.key_arg.length=in->key_arg_length; 144 a.key_arg.length=in->key_arg_length;
142 a.key_arg.type=V_ASN1_OCTET_STRING; 145 a.key_arg.type=V_ASN1_OCTET_STRING;
143 a.key_arg.data=in->key_arg; 146 a.key_arg.data=in->key_arg;
144 147
148#ifndef OPENSSL_NO_KRB5
149 if (in->krb5_client_princ_len)
150 {
151 a.krb5_princ.length=in->krb5_client_princ_len;
152 a.krb5_princ.type=V_ASN1_OCTET_STRING;
153 a.krb5_princ.data=in->krb5_client_princ;
154 }
155#endif /* OPENSSL_NO_KRB5 */
156
145 if (in->time != 0L) 157 if (in->time != 0L)
146 { 158 {
147 a.time.length=LSIZE2; 159 a.time.length=LSIZE2;
@@ -158,11 +170,24 @@ unsigned char **pp;
158 ASN1_INTEGER_set(&(a.timeout),in->timeout); 170 ASN1_INTEGER_set(&(a.timeout),in->timeout);
159 } 171 }
160 172
173 if (in->verify_result != X509_V_OK)
174 {
175 a.verify_result.length=LSIZE2;
176 a.verify_result.type=V_ASN1_INTEGER;
177 a.verify_result.data=ibuf5;
178 ASN1_INTEGER_set(&a.verify_result,in->verify_result);
179 }
180
181
161 M_ASN1_I2D_len(&(a.version), i2d_ASN1_INTEGER); 182 M_ASN1_I2D_len(&(a.version), i2d_ASN1_INTEGER);
162 M_ASN1_I2D_len(&(a.ssl_version), i2d_ASN1_INTEGER); 183 M_ASN1_I2D_len(&(a.ssl_version), i2d_ASN1_INTEGER);
163 M_ASN1_I2D_len(&(a.cipher), i2d_ASN1_OCTET_STRING); 184 M_ASN1_I2D_len(&(a.cipher), i2d_ASN1_OCTET_STRING);
164 M_ASN1_I2D_len(&(a.session_id), i2d_ASN1_OCTET_STRING); 185 M_ASN1_I2D_len(&(a.session_id), i2d_ASN1_OCTET_STRING);
165 M_ASN1_I2D_len(&(a.master_key), i2d_ASN1_OCTET_STRING); 186 M_ASN1_I2D_len(&(a.master_key), i2d_ASN1_OCTET_STRING);
187#ifndef OPENSSL_NO_KRB5
188 if (in->krb5_client_princ_len)
189 M_ASN1_I2D_len(&(a.krb5_princ), i2d_ASN1_OCTET_STRING);
190#endif /* OPENSSL_NO_KRB5 */
166 if (in->key_arg_length > 0) 191 if (in->key_arg_length > 0)
167 M_ASN1_I2D_len_IMP_opt(&(a.key_arg),i2d_ASN1_OCTET_STRING); 192 M_ASN1_I2D_len_IMP_opt(&(a.key_arg),i2d_ASN1_OCTET_STRING);
168 if (in->time != 0L) 193 if (in->time != 0L)
@@ -171,6 +196,9 @@ unsigned char **pp;
171 M_ASN1_I2D_len_EXP_opt(&(a.timeout),i2d_ASN1_INTEGER,2,v2); 196 M_ASN1_I2D_len_EXP_opt(&(a.timeout),i2d_ASN1_INTEGER,2,v2);
172 if (in->peer != NULL) 197 if (in->peer != NULL)
173 M_ASN1_I2D_len_EXP_opt(in->peer,i2d_X509,3,v3); 198 M_ASN1_I2D_len_EXP_opt(in->peer,i2d_X509,3,v3);
199 M_ASN1_I2D_len_EXP_opt(&a.session_id_context,i2d_ASN1_OCTET_STRING,4,v4);
200 if (in->verify_result != X509_V_OK)
201 M_ASN1_I2D_len_EXP_opt(&(a.verify_result),i2d_ASN1_INTEGER,5,v5);
174 202
175 M_ASN1_I2D_seq_total(); 203 M_ASN1_I2D_seq_total();
176 204
@@ -179,6 +207,10 @@ unsigned char **pp;
179 M_ASN1_I2D_put(&(a.cipher), i2d_ASN1_OCTET_STRING); 207 M_ASN1_I2D_put(&(a.cipher), i2d_ASN1_OCTET_STRING);
180 M_ASN1_I2D_put(&(a.session_id), i2d_ASN1_OCTET_STRING); 208 M_ASN1_I2D_put(&(a.session_id), i2d_ASN1_OCTET_STRING);
181 M_ASN1_I2D_put(&(a.master_key), i2d_ASN1_OCTET_STRING); 209 M_ASN1_I2D_put(&(a.master_key), i2d_ASN1_OCTET_STRING);
210#ifndef OPENSSL_NO_KRB5
211 if (in->krb5_client_princ_len)
212 M_ASN1_I2D_put(&(a.krb5_princ), i2d_ASN1_OCTET_STRING);
213#endif /* OPENSSL_NO_KRB5 */
182 if (in->key_arg_length > 0) 214 if (in->key_arg_length > 0)
183 M_ASN1_I2D_put_IMP_opt(&(a.key_arg),i2d_ASN1_OCTET_STRING,0); 215 M_ASN1_I2D_put_IMP_opt(&(a.key_arg),i2d_ASN1_OCTET_STRING,0);
184 if (in->time != 0L) 216 if (in->time != 0L)
@@ -187,14 +219,15 @@ unsigned char **pp;
187 M_ASN1_I2D_put_EXP_opt(&(a.timeout),i2d_ASN1_INTEGER,2,v2); 219 M_ASN1_I2D_put_EXP_opt(&(a.timeout),i2d_ASN1_INTEGER,2,v2);
188 if (in->peer != NULL) 220 if (in->peer != NULL)
189 M_ASN1_I2D_put_EXP_opt(in->peer,i2d_X509,3,v3); 221 M_ASN1_I2D_put_EXP_opt(in->peer,i2d_X509,3,v3);
190 222 M_ASN1_I2D_put_EXP_opt(&a.session_id_context,i2d_ASN1_OCTET_STRING,4,
223 v4);
224 if (in->verify_result != X509_V_OK)
225 M_ASN1_I2D_put_EXP_opt(&a.verify_result,i2d_ASN1_INTEGER,5,v5);
191 M_ASN1_I2D_finish(); 226 M_ASN1_I2D_finish();
192 } 227 }
193 228
194SSL_SESSION *d2i_SSL_SESSION(a,pp,length) 229SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, unsigned char **pp,
195SSL_SESSION **a; 230 long length)
196unsigned char **pp;
197long length;
198 { 231 {
199 int version,ssl_version=0,i; 232 int version,ssl_version=0,i;
200 long id; 233 long id;
@@ -211,13 +244,13 @@ long length;
211 ai.data=NULL; ai.length=0; 244 ai.data=NULL; ai.length=0;
212 M_ASN1_D2I_get(aip,d2i_ASN1_INTEGER); 245 M_ASN1_D2I_get(aip,d2i_ASN1_INTEGER);
213 version=(int)ASN1_INTEGER_get(aip); 246 version=(int)ASN1_INTEGER_get(aip);
214 if (ai.data != NULL) { Free(ai.data); ai.data=NULL; ai.length=0; } 247 if (ai.data != NULL) { OPENSSL_free(ai.data); ai.data=NULL; ai.length=0; }
215 248
216 /* we don't care about the version right now :-) */ 249 /* we don't care about the version right now :-) */
217 M_ASN1_D2I_get(aip,d2i_ASN1_INTEGER); 250 M_ASN1_D2I_get(aip,d2i_ASN1_INTEGER);
218 ssl_version=(int)ASN1_INTEGER_get(aip); 251 ssl_version=(int)ASN1_INTEGER_get(aip);
219 ret->ssl_version=ssl_version; 252 ret->ssl_version=ssl_version;
220 if (ai.data != NULL) { Free(ai.data); ai.data=NULL; ai.length=0; } 253 if (ai.data != NULL) { OPENSSL_free(ai.data); ai.data=NULL; ai.length=0; }
221 254
222 os.data=NULL; os.length=0; 255 os.data=NULL; os.length=0;
223 M_ASN1_D2I_get(osp,d2i_ASN1_OCTET_STRING); 256 M_ASN1_D2I_get(osp,d2i_ASN1_OCTET_STRING);
@@ -273,20 +306,39 @@ long length;
273 memcpy(ret->master_key,os.data,ret->master_key_length); 306 memcpy(ret->master_key,os.data,ret->master_key_length);
274 307
275 os.length=0; 308 os.length=0;
309
310#ifndef OPENSSL_NO_KRB5
311 os.length=0;
312 M_ASN1_D2I_get_opt(osp,d2i_ASN1_OCTET_STRING,V_ASN1_OCTET_STRING);
313 if (os.data)
314 {
315 if (os.length > SSL_MAX_KRB5_PRINCIPAL_LENGTH)
316 ret->krb5_client_princ_len=0;
317 else
318 ret->krb5_client_princ_len=os.length;
319 memcpy(ret->krb5_client_princ,os.data,ret->krb5_client_princ_len);
320 OPENSSL_free(os.data);
321 os.data = NULL;
322 os.length = 0;
323 }
324 else
325 ret->krb5_client_princ_len=0;
326#endif /* OPENSSL_NO_KRB5 */
327
276 M_ASN1_D2I_get_IMP_opt(osp,d2i_ASN1_OCTET_STRING,0,V_ASN1_OCTET_STRING); 328 M_ASN1_D2I_get_IMP_opt(osp,d2i_ASN1_OCTET_STRING,0,V_ASN1_OCTET_STRING);
277 if (os.length > SSL_MAX_KEY_ARG_LENGTH) 329 if (os.length > SSL_MAX_KEY_ARG_LENGTH)
278 ret->key_arg_length=SSL_MAX_KEY_ARG_LENGTH; 330 ret->key_arg_length=SSL_MAX_KEY_ARG_LENGTH;
279 else 331 else
280 ret->key_arg_length=os.length; 332 ret->key_arg_length=os.length;
281 memcpy(ret->key_arg,os.data,ret->key_arg_length); 333 memcpy(ret->key_arg,os.data,ret->key_arg_length);
282 if (os.data != NULL) Free(os.data); 334 if (os.data != NULL) OPENSSL_free(os.data);
283 335
284 ai.length=0; 336 ai.length=0;
285 M_ASN1_D2I_get_EXP_opt(aip,d2i_ASN1_INTEGER,1); 337 M_ASN1_D2I_get_EXP_opt(aip,d2i_ASN1_INTEGER,1);
286 if (ai.data != NULL) 338 if (ai.data != NULL)
287 { 339 {
288 ret->time=ASN1_INTEGER_get(aip); 340 ret->time=ASN1_INTEGER_get(aip);
289 Free(ai.data); ai.data=NULL; ai.length=0; 341 OPENSSL_free(ai.data); ai.data=NULL; ai.length=0;
290 } 342 }
291 else 343 else
292 ret->time=time(NULL); 344 ret->time=time(NULL);
@@ -296,7 +348,7 @@ long length;
296 if (ai.data != NULL) 348 if (ai.data != NULL)
297 { 349 {
298 ret->timeout=ASN1_INTEGER_get(aip); 350 ret->timeout=ASN1_INTEGER_get(aip);
299 Free(ai.data); ai.data=NULL; ai.length=0; 351 OPENSSL_free(ai.data); ai.data=NULL; ai.length=0;
300 } 352 }
301 else 353 else
302 ret->timeout=3; 354 ret->timeout=3;
@@ -308,6 +360,30 @@ long length;
308 } 360 }
309 M_ASN1_D2I_get_EXP_opt(ret->peer,d2i_X509,3); 361 M_ASN1_D2I_get_EXP_opt(ret->peer,d2i_X509,3);
310 362
363 os.length=0;
364 os.data=NULL;
365 M_ASN1_D2I_get_EXP_opt(osp,d2i_ASN1_OCTET_STRING,4);
366
367 if(os.data != NULL)
368 {
369 if (os.length > SSL_MAX_SID_CTX_LENGTH)
370 SSLerr(SSL_F_D2I_SSL_SESSION,SSL_R_BAD_LENGTH);
371 ret->sid_ctx_length=os.length;
372 memcpy(ret->sid_ctx,os.data,os.length);
373 OPENSSL_free(os.data); os.data=NULL; os.length=0;
374 }
375 else
376 ret->sid_ctx_length=0;
377
378 ai.length=0;
379 M_ASN1_D2I_get_EXP_opt(aip,d2i_ASN1_INTEGER,5);
380 if (ai.data != NULL)
381 {
382 ret->verify_result=ASN1_INTEGER_get(aip);
383 OPENSSL_free(ai.data); ai.data=NULL; ai.length=0;
384 }
385 else
386 ret->verify_result=X509_V_OK;
387
311 M_ASN1_D2I_Finish(a,SSL_SESSION_free,SSL_F_D2I_SSL_SESSION); 388 M_ASN1_D2I_Finish(a,SSL_SESSION_free,SSL_F_D2I_SSL_SESSION);
312 } 389 }
313
diff --git a/src/lib/libssl/ssl_cert.c b/src/lib/libssl/ssl_cert.c
index c1cb86e1b7..3d31bbf05f 100644
--- a/src/lib/libssl/ssl_cert.c
+++ b/src/lib/libssl/ssl_cert.c
@@ -1,4 +1,4 @@
1/* ssl/ssl_cert.c */ 1/*! \file ssl/ssl_cert.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -55,32 +55,113 @@
55 * copied and put under another distribution licence 55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.] 56 * [including the GNU Public Licence.]
57 */ 57 */
58/* ====================================================================
59 * Copyright (c) 1999 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 */
58 106
59#include <stdio.h> 107#include <stdio.h>
60#include "objects.h" 108
61#include "bio.h" 109#include "e_os.h"
62#include "pem.h" 110#ifndef NO_SYS_TYPES_H
111# include <sys/types.h>
112#endif
113
114#if !defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_SYS_VMS) && !defined(NeXT) && !defined(MAC_OS_pre_X)
115#include <dirent.h>
116#endif
117
118#if defined(WIN32)
119#include <windows.h>
120#endif
121
122#ifdef NeXT
123#include <sys/dir.h>
124#define dirent direct
125#endif
126
127#include <openssl/objects.h>
128#include <openssl/bio.h>
129#include <openssl/pem.h>
130#include <openssl/x509v3.h>
63#include "ssl_locl.h" 131#include "ssl_locl.h"
64 132
65CERT *ssl_cert_new() 133int SSL_get_ex_data_X509_STORE_CTX_idx(void)
134 {
135 static volatile int ssl_x509_store_ctx_idx= -1;
136
137 if (ssl_x509_store_ctx_idx < 0)
138 {
139 /* any write lock will do; usually this branch
140 * will only be taken once anyway */
141 CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
142
143 if (ssl_x509_store_ctx_idx < 0)
144 {
145 ssl_x509_store_ctx_idx=X509_STORE_CTX_get_ex_new_index(
146 0,"SSL for verify callback",NULL,NULL,NULL);
147 }
148
149 CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
150 }
151 return ssl_x509_store_ctx_idx;
152 }
153
154CERT *ssl_cert_new(void)
66 { 155 {
67 CERT *ret; 156 CERT *ret;
68 157
69 ret=(CERT *)Malloc(sizeof(CERT)); 158 ret=(CERT *)OPENSSL_malloc(sizeof(CERT));
70 if (ret == NULL) 159 if (ret == NULL)
71 { 160 {
72 SSLerr(SSL_F_SSL_CERT_NEW,ERR_R_MALLOC_FAILURE); 161 SSLerr(SSL_F_SSL_CERT_NEW,ERR_R_MALLOC_FAILURE);
73 return(NULL); 162 return(NULL);
74 } 163 }
75 memset(ret,0,sizeof(CERT)); 164 memset(ret,0,sizeof(CERT));
76/*
77 ret->valid=0;
78 ret->mask=0;
79 ret->export_mask=0;
80 ret->cert_type=0;
81 ret->key->x509=NULL;
82 ret->key->publickey=NULL;
83 ret->key->privatekey=NULL; */
84 165
85 ret->key= &(ret->pkeys[SSL_PKEY_RSA_ENC]); 166 ret->key= &(ret->pkeys[SSL_PKEY_RSA_ENC]);
86 ret->references=1; 167 ret->references=1;
@@ -88,11 +169,151 @@ CERT *ssl_cert_new()
88 return(ret); 169 return(ret);
89 } 170 }
90 171
91void ssl_cert_free(c) 172CERT *ssl_cert_dup(CERT *cert)
92CERT *c;
93 { 173 {
174 CERT *ret;
94 int i; 175 int i;
95 176
177 ret = (CERT *)OPENSSL_malloc(sizeof(CERT));
178 if (ret == NULL)
179 {
180 SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_MALLOC_FAILURE);
181 return(NULL);
182 }
183
184 memset(ret, 0, sizeof(CERT));
185
186 ret->key = &ret->pkeys[cert->key - &cert->pkeys[0]];
187 /* or ret->key = ret->pkeys + (cert->key - cert->pkeys),
188 * if you find that more readable */
189
190 ret->valid = cert->valid;
191 ret->mask = cert->mask;
192 ret->export_mask = cert->export_mask;
193
194#ifndef OPENSSL_NO_RSA
195 if (cert->rsa_tmp != NULL)
196 {
197 RSA_up_ref(cert->rsa_tmp);
198 ret->rsa_tmp = cert->rsa_tmp;
199 }
200 ret->rsa_tmp_cb = cert->rsa_tmp_cb;
201#endif
202
203#ifndef OPENSSL_NO_DH
204 if (cert->dh_tmp != NULL)
205 {
206 /* DH parameters don't have a reference count */
207 ret->dh_tmp = DHparams_dup(cert->dh_tmp);
208 if (ret->dh_tmp == NULL)
209 {
210 SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_DH_LIB);
211 goto err;
212 }
213 if (cert->dh_tmp->priv_key)
214 {
215 BIGNUM *b = BN_dup(cert->dh_tmp->priv_key);
216 if (!b)
217 {
218 SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_BN_LIB);
219 goto err;
220 }
221 ret->dh_tmp->priv_key = b;
222 }
223 if (cert->dh_tmp->pub_key)
224 {
225 BIGNUM *b = BN_dup(cert->dh_tmp->pub_key);
226 if (!b)
227 {
228 SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_BN_LIB);
229 goto err;
230 }
231 ret->dh_tmp->pub_key = b;
232 }
233 }
234 ret->dh_tmp_cb = cert->dh_tmp_cb;
235#endif
236
237 for (i = 0; i < SSL_PKEY_NUM; i++)
238 {
239 if (cert->pkeys[i].x509 != NULL)
240 {
241 ret->pkeys[i].x509 = cert->pkeys[i].x509;
242 CRYPTO_add(&ret->pkeys[i].x509->references, 1,
243 CRYPTO_LOCK_X509);
244 }
245
246 if (cert->pkeys[i].privatekey != NULL)
247 {
248 ret->pkeys[i].privatekey = cert->pkeys[i].privatekey;
249 CRYPTO_add(&ret->pkeys[i].privatekey->references, 1,
250 CRYPTO_LOCK_EVP_PKEY);
251
252 switch(i)
253 {
254 /* If there was anything special to do for
255 * certain types of keys, we'd do it here.
256 * (Nothing at the moment, I think.) */
257
258 case SSL_PKEY_RSA_ENC:
259 case SSL_PKEY_RSA_SIGN:
260 /* We have an RSA key. */
261 break;
262
263 case SSL_PKEY_DSA_SIGN:
264 /* We have a DSA key. */
265 break;
266
267 case SSL_PKEY_DH_RSA:
268 case SSL_PKEY_DH_DSA:
269 /* We have a DH key. */
270 break;
271
272 default:
273 /* Can't happen. */
274 SSLerr(SSL_F_SSL_CERT_DUP, SSL_R_LIBRARY_BUG);
275 }
276 }
277 }
278
279 /* ret->extra_certs *should* exist, but currently the own certificate
280 * chain is held inside SSL_CTX */
281
282 ret->references=1;
283
284 return(ret);
285
286#ifndef OPENSSL_NO_DH /* avoid 'unreferenced label' warning if OPENSSL_NO_DH is defined */
287err:
288#endif
289#ifndef OPENSSL_NO_RSA
290 if (ret->rsa_tmp != NULL)
291 RSA_free(ret->rsa_tmp);
292#endif
293#ifndef OPENSSL_NO_DH
294 if (ret->dh_tmp != NULL)
295 DH_free(ret->dh_tmp);
296#endif
297
298 for (i = 0; i < SSL_PKEY_NUM; i++)
299 {
300 if (ret->pkeys[i].x509 != NULL)
301 X509_free(ret->pkeys[i].x509);
302 if (ret->pkeys[i].privatekey != NULL)
303 EVP_PKEY_free(ret->pkeys[i].privatekey);
304 }
305
306 return NULL;
307 }
308
309
310void ssl_cert_free(CERT *c)
311 {
312 int i;
313
314 if(c == NULL)
315 return;
316
96 i=CRYPTO_add(&c->references,-1,CRYPTO_LOCK_SSL_CERT); 317 i=CRYPTO_add(&c->references,-1,CRYPTO_LOCK_SSL_CERT);
97#ifdef REF_PRINT 318#ifdef REF_PRINT
98 REF_PRINT("CERT",c); 319 REF_PRINT("CERT",c);
@@ -106,10 +327,10 @@ CERT *c;
106 } 327 }
107#endif 328#endif
108 329
109#ifndef NO_RSA 330#ifndef OPENSSL_NO_RSA
110 if (c->rsa_tmp) RSA_free(c->rsa_tmp); 331 if (c->rsa_tmp) RSA_free(c->rsa_tmp);
111#endif 332#endif
112#ifndef NO_DH 333#ifndef OPENSSL_NO_DH
113 if (c->dh_tmp) DH_free(c->dh_tmp); 334 if (c->dh_tmp) DH_free(c->dh_tmp);
114#endif 335#endif
115 336
@@ -124,97 +345,209 @@ CERT *c;
124 EVP_PKEY_free(c->pkeys[i].publickey); 345 EVP_PKEY_free(c->pkeys[i].publickey);
125#endif 346#endif
126 } 347 }
127 if (c->cert_chain != NULL) 348 OPENSSL_free(c);
128 sk_pop_free(c->cert_chain,X509_free);
129 Free(c);
130 } 349 }
131 350
132int ssl_set_cert_type(c, type) 351int ssl_cert_inst(CERT **o)
133CERT *c;
134int type;
135 { 352 {
136 c->cert_type=type; 353 /* Create a CERT if there isn't already one
354 * (which cannot really happen, as it is initially created in
355 * SSL_CTX_new; but the earlier code usually allows for that one
356 * being non-existant, so we follow that behaviour, as it might
357 * turn out that there actually is a reason for it -- but I'm
358 * not sure that *all* of the existing code could cope with
359 * s->cert being NULL, otherwise we could do without the
360 * initialization in SSL_CTX_new).
361 */
362
363 if (o == NULL)
364 {
365 SSLerr(SSL_F_SSL_CERT_INST, ERR_R_PASSED_NULL_PARAMETER);
366 return(0);
367 }
368 if (*o == NULL)
369 {
370 if ((*o = ssl_cert_new()) == NULL)
371 {
372 SSLerr(SSL_F_SSL_CERT_INST, ERR_R_MALLOC_FAILURE);
373 return(0);
374 }
375 }
137 return(1); 376 return(1);
138 } 377 }
139 378
140int ssl_verify_cert_chain(s,sk) 379
141SSL *s; 380SESS_CERT *ssl_sess_cert_new(void)
142STACK *sk; 381 {
382 SESS_CERT *ret;
383
384 ret = OPENSSL_malloc(sizeof *ret);
385 if (ret == NULL)
386 {
387 SSLerr(SSL_F_SSL_SESS_CERT_NEW, ERR_R_MALLOC_FAILURE);
388 return NULL;
389 }
390
391 memset(ret, 0 ,sizeof *ret);
392 ret->peer_key = &(ret->peer_pkeys[SSL_PKEY_RSA_ENC]);
393 ret->references = 1;
394
395 return ret;
396 }
397
398void ssl_sess_cert_free(SESS_CERT *sc)
399 {
400 int i;
401
402 if (sc == NULL)
403 return;
404
405 i = CRYPTO_add(&sc->references, -1, CRYPTO_LOCK_SSL_SESS_CERT);
406#ifdef REF_PRINT
407 REF_PRINT("SESS_CERT", sc);
408#endif
409 if (i > 0)
410 return;
411#ifdef REF_CHECK
412 if (i < 0)
413 {
414 fprintf(stderr,"ssl_sess_cert_free, bad reference count\n");
415 abort(); /* ok */
416 }
417#endif
418
419 /* i == 0 */
420 if (sc->cert_chain != NULL)
421 sk_X509_pop_free(sc->cert_chain, X509_free);
422 for (i = 0; i < SSL_PKEY_NUM; i++)
423 {
424 if (sc->peer_pkeys[i].x509 != NULL)
425 X509_free(sc->peer_pkeys[i].x509);
426#if 0 /* We don't have the peer's private key. These lines are just
427 * here as a reminder that we're still using a not-quite-appropriate
428 * data structure. */
429 if (sc->peer_pkeys[i].privatekey != NULL)
430 EVP_PKEY_free(sc->peer_pkeys[i].privatekey);
431#endif
432 }
433
434#ifndef OPENSSL_NO_RSA
435 if (sc->peer_rsa_tmp != NULL)
436 RSA_free(sc->peer_rsa_tmp);
437#endif
438#ifndef OPENSSL_NO_DH
439 if (sc->peer_dh_tmp != NULL)
440 DH_free(sc->peer_dh_tmp);
441#endif
442
443 OPENSSL_free(sc);
444 }
445
446int ssl_set_peer_cert_type(SESS_CERT *sc,int type)
447 {
448 sc->peer_cert_type = type;
449 return(1);
450 }
451
452int ssl_verify_cert_chain(SSL *s,STACK_OF(X509) *sk)
143 { 453 {
144 X509 *x; 454 X509 *x;
145 int i; 455 int i;
146 X509_STORE_CTX ctx; 456 X509_STORE_CTX ctx;
147 457
148 if ((sk == NULL) || (sk_num(sk) == 0)) 458 if ((sk == NULL) || (sk_X509_num(sk) == 0))
149 return(0); 459 return(0);
150 460
151 x=(X509 *)sk_value(sk,0); 461 x=sk_X509_value(sk,0);
152 X509_STORE_CTX_init(&ctx,s->ctx->cert_store,x,sk); 462 if(!X509_STORE_CTX_init(&ctx,s->ctx->cert_store,x,sk))
153 X509_STORE_CTX_set_app_data(&ctx,(char *)s); 463 {
464 SSLerr(SSL_F_SSL_VERIFY_CERT_CHAIN,ERR_R_X509_LIB);
465 return(0);
466 }
467 if (SSL_get_verify_depth(s) >= 0)
468 X509_STORE_CTX_set_depth(&ctx, SSL_get_verify_depth(s));
469 X509_STORE_CTX_set_ex_data(&ctx,SSL_get_ex_data_X509_STORE_CTX_idx(),s);
470
471 /* We need to set the verify purpose. The purpose can be determined by
472 * the context: if its a server it will verify SSL client certificates
473 * or vice versa.
474 */
475 if (s->server)
476 i = X509_PURPOSE_SSL_CLIENT;
477 else
478 i = X509_PURPOSE_SSL_SERVER;
479
480 X509_STORE_CTX_purpose_inherit(&ctx, i, s->purpose, s->trust);
481
482 if (s->verify_callback)
483 X509_STORE_CTX_set_verify_cb(&ctx, s->verify_callback);
154 484
155 if (s->ctx->app_verify_callback != NULL) 485 if (s->ctx->app_verify_callback != NULL)
156 i=s->ctx->app_verify_callback(&ctx); 486#if 1 /* new with OpenSSL 0.9.7 */
487 i=s->ctx->app_verify_callback(&ctx, s->ctx->app_verify_arg);
488#else
489 i=s->ctx->app_verify_callback(&ctx); /* should pass app_verify_arg */
490#endif
157 else 491 else
492 {
493#ifndef OPENSSL_NO_X509_VERIFY
158 i=X509_verify_cert(&ctx); 494 i=X509_verify_cert(&ctx);
495#else
496 i=0;
497 ctx.error=X509_V_ERR_APPLICATION_VERIFICATION;
498 SSLerr(SSL_F_SSL_VERIFY_CERT_CHAIN,SSL_R_NO_VERIFY_CALLBACK);
499#endif
500 }
159 501
160 X509_STORE_CTX_cleanup(&ctx);
161 s->verify_result=ctx.error; 502 s->verify_result=ctx.error;
503 X509_STORE_CTX_cleanup(&ctx);
162 504
163 return(i); 505 return(i);
164 } 506 }
165 507
166static void set_client_CA_list(ca_list,list) 508static void set_client_CA_list(STACK_OF(X509_NAME) **ca_list,STACK_OF(X509_NAME) *list)
167STACK **ca_list;
168STACK *list;
169 { 509 {
170 if (*ca_list != NULL) 510 if (*ca_list != NULL)
171 sk_pop_free(*ca_list,X509_NAME_free); 511 sk_X509_NAME_pop_free(*ca_list,X509_NAME_free);
172 512
173 *ca_list=list; 513 *ca_list=list;
174 } 514 }
175 515
176STACK *SSL_dup_CA_list(sk) 516STACK_OF(X509_NAME) *SSL_dup_CA_list(STACK_OF(X509_NAME) *sk)
177STACK *sk;
178 { 517 {
179 int i; 518 int i;
180 STACK *ret; 519 STACK_OF(X509_NAME) *ret;
181 X509_NAME *name; 520 X509_NAME *name;
182 521
183 ret=sk_new_null(); 522 ret=sk_X509_NAME_new_null();
184 for (i=0; i<sk_num(sk); i++) 523 for (i=0; i<sk_X509_NAME_num(sk); i++)
185 { 524 {
186 name=X509_NAME_dup((X509_NAME *)sk_value(sk,i)); 525 name=X509_NAME_dup(sk_X509_NAME_value(sk,i));
187 if ((name == NULL) || !sk_push(ret,(char *)name)) 526 if ((name == NULL) || !sk_X509_NAME_push(ret,name))
188 { 527 {
189 sk_pop_free(ret,X509_NAME_free); 528 sk_X509_NAME_pop_free(ret,X509_NAME_free);
190 return(NULL); 529 return(NULL);
191 } 530 }
192 } 531 }
193 return(ret); 532 return(ret);
194 } 533 }
195 534
196void SSL_set_client_CA_list(s,list) 535void SSL_set_client_CA_list(SSL *s,STACK_OF(X509_NAME) *list)
197SSL *s;
198STACK *list;
199 { 536 {
200 set_client_CA_list(&(s->client_CA),list); 537 set_client_CA_list(&(s->client_CA),list);
201 } 538 }
202 539
203void SSL_CTX_set_client_CA_list(ctx,list) 540void SSL_CTX_set_client_CA_list(SSL_CTX *ctx,STACK_OF(X509_NAME) *list)
204SSL_CTX *ctx;
205STACK *list;
206 { 541 {
207 set_client_CA_list(&(ctx->client_CA),list); 542 set_client_CA_list(&(ctx->client_CA),list);
208 } 543 }
209 544
210STACK *SSL_CTX_get_client_CA_list(ctx) 545STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(SSL_CTX *ctx)
211SSL_CTX *ctx;
212 { 546 {
213 return(ctx->client_CA); 547 return(ctx->client_CA);
214 } 548 }
215 549
216STACK *SSL_get_client_CA_list(s) 550STACK_OF(X509_NAME) *SSL_get_client_CA_list(SSL *s)
217SSL *s;
218 { 551 {
219 if (s->type == SSL_ST_CONNECT) 552 if (s->type == SSL_ST_CONNECT)
220 { /* we are in the client */ 553 { /* we are in the client */
@@ -233,20 +566,18 @@ SSL *s;
233 } 566 }
234 } 567 }
235 568
236static int add_client_CA(sk,x) 569static int add_client_CA(STACK_OF(X509_NAME) **sk,X509 *x)
237STACK **sk;
238X509 *x;
239 { 570 {
240 X509_NAME *name; 571 X509_NAME *name;
241 572
242 if (x == NULL) return(0); 573 if (x == NULL) return(0);
243 if ((*sk == NULL) && ((*sk=sk_new_null()) == NULL)) 574 if ((*sk == NULL) && ((*sk=sk_X509_NAME_new_null()) == NULL))
244 return(0); 575 return(0);
245 576
246 if ((name=X509_NAME_dup(X509_get_subject_name(x))) == NULL) 577 if ((name=X509_NAME_dup(X509_get_subject_name(x))) == NULL)
247 return(0); 578 return(0);
248 579
249 if (!sk_push(*sk,(char *)name)) 580 if (!sk_X509_NAME_push(*sk,name))
250 { 581 {
251 X509_NAME_free(name); 582 X509_NAME_free(name);
252 return(0); 583 return(0);
@@ -254,37 +585,39 @@ X509 *x;
254 return(1); 585 return(1);
255 } 586 }
256 587
257int SSL_add_client_CA(ssl,x) 588int SSL_add_client_CA(SSL *ssl,X509 *x)
258SSL *ssl;
259X509 *x;
260 { 589 {
261 return(add_client_CA(&(ssl->client_CA),x)); 590 return(add_client_CA(&(ssl->client_CA),x));
262 } 591 }
263 592
264int SSL_CTX_add_client_CA(ctx,x) 593int SSL_CTX_add_client_CA(SSL_CTX *ctx,X509 *x)
265SSL_CTX *ctx;
266X509 *x;
267 { 594 {
268 return(add_client_CA(&(ctx->client_CA),x)); 595 return(add_client_CA(&(ctx->client_CA),x));
269 } 596 }
270 597
271static int name_cmp(a,b) 598static int xname_cmp(const X509_NAME * const *a, const X509_NAME * const *b)
272X509_NAME **a,**b;
273 { 599 {
274 return(X509_NAME_cmp(*a,*b)); 600 return(X509_NAME_cmp(*a,*b));
275 } 601 }
276 602
277#ifndef NO_STDIO 603#ifndef OPENSSL_NO_STDIO
278STACK *SSL_load_client_CA_file(file) 604/*!
279char *file; 605 * Load CA certs from a file into a ::STACK. Note that it is somewhat misnamed;
606 * it doesn't really have anything to do with clients (except that a common use
607 * for a stack of CAs is to send it to the client). Actually, it doesn't have
608 * much to do with CAs, either, since it will load any old cert.
609 * \param file the file containing one or more certs.
610 * \return a ::STACK containing the certs.
611 */
612STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file)
280 { 613 {
281 BIO *in; 614 BIO *in;
282 X509 *x=NULL; 615 X509 *x=NULL;
283 X509_NAME *xn=NULL; 616 X509_NAME *xn=NULL;
284 STACK *ret,*sk; 617 STACK_OF(X509_NAME) *ret,*sk;
285 618
286 ret=sk_new(NULL); 619 ret=sk_X509_NAME_new_null();
287 sk=sk_new(name_cmp); 620 sk=sk_X509_NAME_new(xname_cmp);
288 621
289 in=BIO_new(BIO_s_file_internal()); 622 in=BIO_new(BIO_s_file_internal());
290 623
@@ -299,31 +632,201 @@ char *file;
299 632
300 for (;;) 633 for (;;)
301 { 634 {
302 if (PEM_read_bio_X509(in,&x,NULL) == NULL) 635 if (PEM_read_bio_X509(in,&x,NULL,NULL) == NULL)
303 break; 636 break;
304 if ((xn=X509_get_subject_name(x)) == NULL) goto err; 637 if ((xn=X509_get_subject_name(x)) == NULL) goto err;
305 /* check for duplicates */ 638 /* check for duplicates */
306 xn=X509_NAME_dup(xn); 639 xn=X509_NAME_dup(xn);
307 if (xn == NULL) goto err; 640 if (xn == NULL) goto err;
308 if (sk_find(sk,(char *)xn) >= 0) 641 if (sk_X509_NAME_find(sk,xn) >= 0)
309 X509_NAME_free(xn); 642 X509_NAME_free(xn);
310 else 643 else
311 { 644 {
312 sk_push(sk,(char *)xn); 645 sk_X509_NAME_push(sk,xn);
313 sk_push(ret,(char *)xn); 646 sk_X509_NAME_push(ret,xn);
314 } 647 }
315 } 648 }
316 649
317 if (0) 650 if (0)
318 { 651 {
319err: 652err:
320 if (ret != NULL) sk_pop_free(ret,X509_NAME_free); 653 if (ret != NULL) sk_X509_NAME_pop_free(ret,X509_NAME_free);
321 ret=NULL; 654 ret=NULL;
322 } 655 }
323 if (sk != NULL) sk_free(sk); 656 if (sk != NULL) sk_X509_NAME_free(sk);
324 if (in != NULL) BIO_free(in); 657 if (in != NULL) BIO_free(in);
325 if (x != NULL) X509_free(x); 658 if (x != NULL) X509_free(x);
326 return(ret); 659 return(ret);
327 } 660 }
328#endif 661#endif
329 662
663/*!
664 * Add a file of certs to a stack.
665 * \param stack the stack to add to.
666 * \param file the file to add from. All certs in this file that are not
667 * already in the stack will be added.
668 * \return 1 for success, 0 for failure. Note that in the case of failure some
669 * certs may have been added to \c stack.
670 */
671
672int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
673 const char *file)
674 {
675 BIO *in;
676 X509 *x=NULL;
677 X509_NAME *xn=NULL;
678 int ret=1;
679 int (*oldcmp)(const X509_NAME * const *a, const X509_NAME * const *b);
680
681 oldcmp=sk_X509_NAME_set_cmp_func(stack,xname_cmp);
682
683 in=BIO_new(BIO_s_file_internal());
684
685 if (in == NULL)
686 {
687 SSLerr(SSL_F_SSL_ADD_FILE_CERT_SUBJECTS_TO_STACK,ERR_R_MALLOC_FAILURE);
688 goto err;
689 }
690
691 if (!BIO_read_filename(in,file))
692 goto err;
693
694 for (;;)
695 {
696 if (PEM_read_bio_X509(in,&x,NULL,NULL) == NULL)
697 break;
698 if ((xn=X509_get_subject_name(x)) == NULL) goto err;
699 xn=X509_NAME_dup(xn);
700 if (xn == NULL) goto err;
701 if (sk_X509_NAME_find(stack,xn) >= 0)
702 X509_NAME_free(xn);
703 else
704 sk_X509_NAME_push(stack,xn);
705 }
706
707 if (0)
708 {
709err:
710 ret=0;
711 }
712 if(in != NULL)
713 BIO_free(in);
714 if(x != NULL)
715 X509_free(x);
716
717 sk_X509_NAME_set_cmp_func(stack,oldcmp);
718
719 return ret;
720 }
721
722/*!
723 * Add a directory of certs to a stack.
724 * \param stack the stack to append to.
725 * \param dir the directory to append from. All files in this directory will be
726 * examined as potential certs. Any that are acceptable to
727 * SSL_add_dir_cert_subjects_to_stack() that are not already in the stack will be
728 * included.
729 * \return 1 for success, 0 for failure. Note that in the case of failure some
730 * certs may have been added to \c stack.
731 */
732
733#ifndef OPENSSL_SYS_WIN32
734#ifndef OPENSSL_SYS_VMS /* XXXX This may be fixed in the future */
735#ifndef OPENSSL_SYS_MACINTOSH_CLASSIC /* XXXXX: Better scheme needed! */
736
737int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
738 const char *dir)
739 {
740 DIR *d;
741 struct dirent *dstruct;
742 int ret = 0;
743
744 CRYPTO_w_lock(CRYPTO_LOCK_READDIR);
745 d = opendir(dir);
746
747 /* Note that a side effect is that the CAs will be sorted by name */
748 if(!d)
749 {
750 SYSerr(SYS_F_OPENDIR, get_last_sys_error());
751 ERR_add_error_data(3, "opendir('", dir, "')");
752 SSLerr(SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK, ERR_R_SYS_LIB);
753 goto err;
754 }
755
756 while((dstruct=readdir(d)))
757 {
758 char buf[1024];
759 int r;
760
761 if(strlen(dir)+strlen(dstruct->d_name)+2 > sizeof buf)
762 {
763 SSLerr(SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK,SSL_R_PATH_TOO_LONG);
764 goto err;
765 }
766
767 r = BIO_snprintf(buf,sizeof buf,"%s/%s",dir,dstruct->d_name);
768 if (r <= 0 || r >= sizeof buf)
769 goto err;
770 if(!SSL_add_file_cert_subjects_to_stack(stack,buf))
771 goto err;
772 }
773 ret = 1;
774
775err:
776 if (d) closedir(d);
777 CRYPTO_w_unlock(CRYPTO_LOCK_READDIR);
778 return ret;
779 }
780
781#endif
782#endif
783
784#else
785
786int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
787 const char *dir)
788 {
789 WIN32_FIND_DATA FindFileData;
790 HANDLE hFind;
791 int ret = 0;
792
793 CRYPTO_w_lock(CRYPTO_LOCK_READDIR);
794
795 hFind = FindFirstFile(dir, &FindFileData);
796 /* Note that a side effect is that the CAs will be sorted by name */
797 if(hFind == INVALID_HANDLE_VALUE)
798 {
799 SYSerr(SYS_F_OPENDIR, get_last_sys_error());
800 ERR_add_error_data(3, "opendir('", dir, "')");
801 SSLerr(SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK, ERR_R_SYS_LIB);
802 goto err_noclose;
803 }
804
805 do
806 {
807 char buf[1024];
808 int r;
809
810 if(strlen(dir)+strlen(FindFileData.cFileName)+2 > sizeof buf)
811 {
812 SSLerr(SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK,SSL_R_PATH_TOO_LONG);
813 goto err;
814 }
815
816 r = BIO_snprintf(buf,sizeof buf,"%s/%s",dir,FindFileData.cFileName);
817 if (r <= 0 || r >= sizeof buf)
818 goto err;
819 if(!SSL_add_file_cert_subjects_to_stack(stack,buf))
820 goto err;
821 }
822 while (FindNextFile(hFind, &FindFileData) != FALSE);
823 ret = 1;
824
825err:
826 FindClose(hFind);
827err_noclose:
828 CRYPTO_w_unlock(CRYPTO_LOCK_READDIR);
829 return ret;
830 }
831
832#endif
diff --git a/src/lib/libssl/ssl_ciph.c b/src/lib/libssl/ssl_ciph.c
index 820994408b..cdd8dde128 100644
--- a/src/lib/libssl/ssl_ciph.c
+++ b/src/lib/libssl/ssl_ciph.c
@@ -57,7 +57,8 @@
57 */ 57 */
58 58
59#include <stdio.h> 59#include <stdio.h>
60#include "objects.h" 60#include <openssl/objects.h>
61#include <openssl/comp.h>
61#include "ssl_locl.h" 62#include "ssl_locl.h"
62 63
63#define SSL_ENC_DES_IDX 0 64#define SSL_ENC_DES_IDX 0
@@ -67,37 +68,28 @@
67#define SSL_ENC_IDEA_IDX 4 68#define SSL_ENC_IDEA_IDX 4
68#define SSL_ENC_eFZA_IDX 5 69#define SSL_ENC_eFZA_IDX 5
69#define SSL_ENC_NULL_IDX 6 70#define SSL_ENC_NULL_IDX 6
70#define SSL_ENC_NUM_IDX 7 71#define SSL_ENC_AES128_IDX 7
72#define SSL_ENC_AES256_IDX 8
73#define SSL_ENC_NUM_IDX 9
71 74
72static EVP_CIPHER *ssl_cipher_methods[SSL_ENC_NUM_IDX]={ 75static const EVP_CIPHER *ssl_cipher_methods[SSL_ENC_NUM_IDX]={
73 NULL,NULL,NULL,NULL,NULL,NULL, 76 NULL,NULL,NULL,NULL,NULL,NULL,
74 }; 77 };
75 78
79static STACK_OF(SSL_COMP) *ssl_comp_methods=NULL;
80
76#define SSL_MD_MD5_IDX 0 81#define SSL_MD_MD5_IDX 0
77#define SSL_MD_SHA1_IDX 1 82#define SSL_MD_SHA1_IDX 1
78#define SSL_MD_NUM_IDX 2 83#define SSL_MD_NUM_IDX 2
79static EVP_MD *ssl_digest_methods[SSL_MD_NUM_IDX]={ 84static const EVP_MD *ssl_digest_methods[SSL_MD_NUM_IDX]={
80 NULL,NULL, 85 NULL,NULL,
81 }; 86 };
82 87
83typedef struct cipher_sort_st
84 {
85 SSL_CIPHER *cipher;
86 int pref;
87 } CIPHER_SORT;
88
89#define CIPHER_ADD 1 88#define CIPHER_ADD 1
90#define CIPHER_KILL 2 89#define CIPHER_KILL 2
91#define CIPHER_DEL 3 90#define CIPHER_DEL 3
92#define CIPHER_ORD 4 91#define CIPHER_ORD 4
93 92#define CIPHER_SPECIAL 5
94typedef struct cipher_choice_st
95 {
96 int type;
97 unsigned long algorithms;
98 unsigned long mask;
99 long top;
100 } CIPHER_CHOICE;
101 93
102typedef struct cipher_order_st 94typedef struct cipher_order_st
103 { 95 {
@@ -107,59 +99,62 @@ typedef struct cipher_order_st
107 struct cipher_order_st *next,*prev; 99 struct cipher_order_st *next,*prev;
108 } CIPHER_ORDER; 100 } CIPHER_ORDER;
109 101
110static SSL_CIPHER cipher_aliases[]={ 102static const SSL_CIPHER cipher_aliases[]={
111 {0,SSL_TXT_ALL, 0,SSL_ALL, 0,SSL_ALL}, /* must be first */ 103 /* Don't include eNULL unless specifically enabled.
112 {0,SSL_TXT_kRSA,0,SSL_kRSA, 0,SSL_MKEY_MASK}, 104 * Similarly, don't include AES in ALL because these ciphers are not yet official. */
113 {0,SSL_TXT_kDHr,0,SSL_kDHr, 0,SSL_MKEY_MASK}, 105 {0,SSL_TXT_ALL, 0,SSL_ALL & ~SSL_eNULL & ~SSL_AES, SSL_ALL ,0,0,0,SSL_ALL,SSL_ALL}, /* must be first */
114 {0,SSL_TXT_kDHd,0,SSL_kDHd, 0,SSL_MKEY_MASK}, 106 {0,SSL_TXT_kKRB5,0,SSL_kKRB5,0,0,0,0,SSL_MKEY_MASK,0}, /* VRS Kerberos5 */
115 {0,SSL_TXT_kEDH,0,SSL_kEDH, 0,SSL_MKEY_MASK}, 107 {0,SSL_TXT_kRSA,0,SSL_kRSA, 0,0,0,0,SSL_MKEY_MASK,0},
116 {0,SSL_TXT_kFZA,0,SSL_kFZA, 0,SSL_MKEY_MASK}, 108 {0,SSL_TXT_kDHr,0,SSL_kDHr, 0,0,0,0,SSL_MKEY_MASK,0},
117 {0,SSL_TXT_DH, 0,SSL_DH, 0,SSL_MKEY_MASK}, 109 {0,SSL_TXT_kDHd,0,SSL_kDHd, 0,0,0,0,SSL_MKEY_MASK,0},
118 {0,SSL_TXT_EDH, 0,SSL_EDH, 0,SSL_MKEY_MASK|SSL_AUTH_MASK}, 110 {0,SSL_TXT_kEDH,0,SSL_kEDH, 0,0,0,0,SSL_MKEY_MASK,0},
119 111 {0,SSL_TXT_kFZA,0,SSL_kFZA, 0,0,0,0,SSL_MKEY_MASK,0},
120 {0,SSL_TXT_aRSA,0,SSL_aRSA, 0,SSL_AUTH_MASK}, 112 {0,SSL_TXT_DH, 0,SSL_DH, 0,0,0,0,SSL_MKEY_MASK,0},
121 {0,SSL_TXT_aDSS,0,SSL_aDSS, 0,SSL_AUTH_MASK}, 113 {0,SSL_TXT_EDH, 0,SSL_EDH, 0,0,0,0,SSL_MKEY_MASK|SSL_AUTH_MASK,0},
122 {0,SSL_TXT_aFZA,0,SSL_aFZA, 0,SSL_AUTH_MASK}, 114
123 {0,SSL_TXT_aNULL,0,SSL_aNULL,0,SSL_AUTH_MASK}, 115 {0,SSL_TXT_aKRB5,0,SSL_aKRB5,0,0,0,0,SSL_AUTH_MASK,0}, /* VRS Kerberos5 */
124 {0,SSL_TXT_aDH, 0,SSL_aDH, 0,SSL_AUTH_MASK}, 116 {0,SSL_TXT_aRSA,0,SSL_aRSA, 0,0,0,0,SSL_AUTH_MASK,0},
125 {0,SSL_TXT_DSS, 0,SSL_DSS, 0,SSL_AUTH_MASK}, 117 {0,SSL_TXT_aDSS,0,SSL_aDSS, 0,0,0,0,SSL_AUTH_MASK,0},
126 118 {0,SSL_TXT_aFZA,0,SSL_aFZA, 0,0,0,0,SSL_AUTH_MASK,0},
127 {0,SSL_TXT_DES, 0,SSL_DES, 0,SSL_ENC_MASK}, 119 {0,SSL_TXT_aNULL,0,SSL_aNULL,0,0,0,0,SSL_AUTH_MASK,0},
128 {0,SSL_TXT_3DES,0,SSL_3DES, 0,SSL_ENC_MASK}, 120 {0,SSL_TXT_aDH, 0,SSL_aDH, 0,0,0,0,SSL_AUTH_MASK,0},
129 {0,SSL_TXT_RC4, 0,SSL_RC4, 0,SSL_ENC_MASK}, 121 {0,SSL_TXT_DSS, 0,SSL_DSS, 0,0,0,0,SSL_AUTH_MASK,0},
130 {0,SSL_TXT_RC2, 0,SSL_RC2, 0,SSL_ENC_MASK}, 122
131 {0,SSL_TXT_IDEA,0,SSL_IDEA, 0,SSL_ENC_MASK}, 123 {0,SSL_TXT_DES, 0,SSL_DES, 0,0,0,0,SSL_ENC_MASK,0},
132 {0,SSL_TXT_eNULL,0,SSL_eNULL,0,SSL_ENC_MASK}, 124 {0,SSL_TXT_3DES,0,SSL_3DES, 0,0,0,0,SSL_ENC_MASK,0},
133 {0,SSL_TXT_eFZA,0,SSL_eFZA, 0,SSL_ENC_MASK}, 125 {0,SSL_TXT_RC4, 0,SSL_RC4, 0,0,0,0,SSL_ENC_MASK,0},
134 126 {0,SSL_TXT_RC2, 0,SSL_RC2, 0,0,0,0,SSL_ENC_MASK,0},
135 {0,SSL_TXT_MD5, 0,SSL_MD5, 0,SSL_MAC_MASK}, 127 {0,SSL_TXT_IDEA,0,SSL_IDEA, 0,0,0,0,SSL_ENC_MASK,0},
136 {0,SSL_TXT_SHA1,0,SSL_SHA1, 0,SSL_MAC_MASK}, 128 {0,SSL_TXT_eNULL,0,SSL_eNULL,0,0,0,0,SSL_ENC_MASK,0},
137 {0,SSL_TXT_SHA, 0,SSL_SHA, 0,SSL_MAC_MASK}, 129 {0,SSL_TXT_eFZA,0,SSL_eFZA, 0,0,0,0,SSL_ENC_MASK,0},
138 130 {0,SSL_TXT_AES, 0,SSL_AES, 0,0,0,0,SSL_ENC_MASK,0},
139 {0,SSL_TXT_NULL,0,SSL_NULL, 0,SSL_ENC_MASK}, 131
140 {0,SSL_TXT_RSA, 0,SSL_RSA, 0,SSL_AUTH_MASK|SSL_MKEY_MASK}, 132 {0,SSL_TXT_MD5, 0,SSL_MD5, 0,0,0,0,SSL_MAC_MASK,0},
141 {0,SSL_TXT_ADH, 0,SSL_ADH, 0,SSL_AUTH_MASK|SSL_MKEY_MASK}, 133 {0,SSL_TXT_SHA1,0,SSL_SHA1, 0,0,0,0,SSL_MAC_MASK,0},
142 {0,SSL_TXT_FZA, 0,SSL_FZA, 0,SSL_AUTH_MASK|SSL_MKEY_MASK|SSL_ENC_MASK}, 134 {0,SSL_TXT_SHA, 0,SSL_SHA, 0,0,0,0,SSL_MAC_MASK,0},
143 135
144 {0,SSL_TXT_EXP, 0,SSL_EXP, 0,SSL_EXP_MASK}, 136 {0,SSL_TXT_NULL,0,SSL_NULL, 0,0,0,0,SSL_ENC_MASK,0},
145 {0,SSL_TXT_EXPORT,0,SSL_EXPORT,0,SSL_EXP_MASK}, 137 {0,SSL_TXT_KRB5,0,SSL_KRB5, 0,0,0,0,SSL_AUTH_MASK|SSL_MKEY_MASK,0},
146 {0,SSL_TXT_SSLV2,0,SSL_SSLV2,0,SSL_SSL_MASK}, 138 {0,SSL_TXT_RSA, 0,SSL_RSA, 0,0,0,0,SSL_AUTH_MASK|SSL_MKEY_MASK,0},
147 {0,SSL_TXT_SSLV3,0,SSL_SSLV3,0,SSL_SSL_MASK}, 139 {0,SSL_TXT_ADH, 0,SSL_ADH, 0,0,0,0,SSL_AUTH_MASK|SSL_MKEY_MASK,0},
148 {0,SSL_TXT_LOW, 0,SSL_LOW,0,SSL_STRONG_MASK}, 140 {0,SSL_TXT_FZA, 0,SSL_FZA, 0,0,0,0,SSL_AUTH_MASK|SSL_MKEY_MASK|SSL_ENC_MASK,0},
149 {0,SSL_TXT_MEDIUM,0,SSL_MEDIUM,0,SSL_STRONG_MASK}, 141
150 {0,SSL_TXT_HIGH, 0,SSL_HIGH,0,SSL_STRONG_MASK}, 142 {0,SSL_TXT_SSLV2, 0,SSL_SSLV2, 0,0,0,0,SSL_SSL_MASK,0},
143 {0,SSL_TXT_SSLV3, 0,SSL_SSLV3, 0,0,0,0,SSL_SSL_MASK,0},
144 {0,SSL_TXT_TLSV1, 0,SSL_TLSV1, 0,0,0,0,SSL_SSL_MASK,0},
145
146 {0,SSL_TXT_EXP ,0, 0,SSL_EXPORT, 0,0,0,0,SSL_EXP_MASK},
147 {0,SSL_TXT_EXPORT,0, 0,SSL_EXPORT, 0,0,0,0,SSL_EXP_MASK},
148 {0,SSL_TXT_EXP40, 0, 0, SSL_EXP40, 0,0,0,0,SSL_STRONG_MASK},
149 {0,SSL_TXT_EXP56, 0, 0, SSL_EXP56, 0,0,0,0,SSL_STRONG_MASK},
150 {0,SSL_TXT_LOW, 0, 0, SSL_LOW, 0,0,0,0,SSL_STRONG_MASK},
151 {0,SSL_TXT_MEDIUM,0, 0,SSL_MEDIUM, 0,0,0,0,SSL_STRONG_MASK},
152 {0,SSL_TXT_HIGH, 0, 0, SSL_HIGH, 0,0,0,0,SSL_STRONG_MASK},
151 }; 153 };
152 154
153static int init_ciphers=1; 155static int init_ciphers=1;
154static void load_ciphers();
155
156static int cmp_by_name(a,b)
157SSL_CIPHER **a,**b;
158 {
159 return(strcmp((*a)->name,(*b)->name));
160 }
161 156
162static void load_ciphers() 157static void load_ciphers(void)
163 { 158 {
164 init_ciphers=0; 159 init_ciphers=0;
165 ssl_cipher_methods[SSL_ENC_DES_IDX]= 160 ssl_cipher_methods[SSL_ENC_DES_IDX]=
@@ -172,6 +167,10 @@ static void load_ciphers()
172 EVP_get_cipherbyname(SN_rc2_cbc); 167 EVP_get_cipherbyname(SN_rc2_cbc);
173 ssl_cipher_methods[SSL_ENC_IDEA_IDX]= 168 ssl_cipher_methods[SSL_ENC_IDEA_IDX]=
174 EVP_get_cipherbyname(SN_idea_cbc); 169 EVP_get_cipherbyname(SN_idea_cbc);
170 ssl_cipher_methods[SSL_ENC_AES128_IDX]=
171 EVP_get_cipherbyname(SN_aes_128_cbc);
172 ssl_cipher_methods[SSL_ENC_AES256_IDX]=
173 EVP_get_cipherbyname(SN_aes_256_cbc);
175 174
176 ssl_digest_methods[SSL_MD_MD5_IDX]= 175 ssl_digest_methods[SSL_MD_MD5_IDX]=
177 EVP_get_digestbyname(SN_md5); 176 EVP_get_digestbyname(SN_md5);
@@ -179,14 +178,38 @@ static void load_ciphers()
179 EVP_get_digestbyname(SN_sha1); 178 EVP_get_digestbyname(SN_sha1);
180 } 179 }
181 180
182int ssl_cipher_get_evp(c,enc,md) 181int ssl_cipher_get_evp(SSL_SESSION *s, const EVP_CIPHER **enc,
183SSL_CIPHER *c; 182 const EVP_MD **md, SSL_COMP **comp)
184EVP_CIPHER **enc;
185EVP_MD **md;
186 { 183 {
187 int i; 184 int i;
185 SSL_CIPHER *c;
188 186
187 c=s->cipher;
189 if (c == NULL) return(0); 188 if (c == NULL) return(0);
189 if (comp != NULL)
190 {
191 SSL_COMP ctmp;
192
193 if (s->compress_meth == 0)
194 *comp=NULL;
195 else if (ssl_comp_methods == NULL)
196 {
197 /* bad */
198 *comp=NULL;
199 }
200 else
201 {
202
203 ctmp.id=s->compress_meth;
204 i=sk_SSL_COMP_find(ssl_comp_methods,&ctmp);
205 if (i >= 0)
206 *comp=sk_SSL_COMP_value(ssl_comp_methods,i);
207 else
208 *comp=NULL;
209 }
210 }
211
212 if ((enc == NULL) || (md == NULL)) return(0);
190 213
191 switch (c->algorithms & SSL_ENC_MASK) 214 switch (c->algorithms & SSL_ENC_MASK)
192 { 215 {
@@ -208,6 +231,13 @@ EVP_MD **md;
208 case SSL_eNULL: 231 case SSL_eNULL:
209 i=SSL_ENC_NULL_IDX; 232 i=SSL_ENC_NULL_IDX;
210 break; 233 break;
234 case SSL_AES:
235 switch(c->alg_bits)
236 {
237 case 128: i=SSL_ENC_AES128_IDX; break;
238 case 256: i=SSL_ENC_AES256_IDX; break;
239 default: i=-1; break;
240 }
211 break; 241 break;
212 default: 242 default:
213 i= -1; 243 i= -1;
@@ -250,8 +280,8 @@ EVP_MD **md;
250#define ITEM_SEP(a) \ 280#define ITEM_SEP(a) \
251 (((a) == ':') || ((a) == ' ') || ((a) == ';') || ((a) == ',')) 281 (((a) == ':') || ((a) == ' ') || ((a) == ';') || ((a) == ','))
252 282
253static void ll_append_tail(head,curr,tail) 283static void ll_append_tail(CIPHER_ORDER **head, CIPHER_ORDER *curr,
254CIPHER_ORDER **head,*curr,**tail; 284 CIPHER_ORDER **tail)
255 { 285 {
256 if (curr == *tail) return; 286 if (curr == *tail) return;
257 if (curr == *head) 287 if (curr == *head)
@@ -266,181 +296,359 @@ CIPHER_ORDER **head,*curr,**tail;
266 *tail=curr; 296 *tail=curr;
267 } 297 }
268 298
269STACK *ssl_create_cipher_list(ssl_method,cipher_list,cipher_list_by_id,str) 299static unsigned long ssl_cipher_get_disabled(void)
270SSL_METHOD *ssl_method;
271STACK **cipher_list,**cipher_list_by_id;
272char *str;
273 { 300 {
274 SSL_CIPHER *c; 301 unsigned long mask;
275 char *l;
276 STACK *ret=NULL,*ok=NULL;
277#define CL_BUF 40
278 char buf[CL_BUF];
279 char *tmp_str=NULL;
280 unsigned long mask,algorithms,ma;
281 char *start;
282 int i,j,k,num=0,ch,multi;
283 unsigned long al;
284 STACK *ca_list=NULL;
285 int current_x,num_x;
286 CIPHER_CHOICE *ops=NULL;
287 CIPHER_ORDER *list=NULL,*head=NULL,*tail=NULL,*curr,*tail2,*curr2;
288 int list_num;
289 int type;
290 SSL_CIPHER c_tmp,*cp;
291
292 if (str == NULL) return(NULL);
293
294 if (strncmp(str,"DEFAULT",7) == 0)
295 {
296 i=strlen(str)+2+strlen(SSL_DEFAULT_CIPHER_LIST);
297 if ((tmp_str=Malloc(i)) == NULL)
298 {
299 SSLerr(SSL_F_SSL_CREATE_CIPHER_LIST,ERR_R_MALLOC_FAILURE);
300 goto err;
301 }
302 strcpy(tmp_str,SSL_DEFAULT_CIPHER_LIST);
303 strcat(tmp_str,":");
304 strcat(tmp_str,&(str[7]));
305 str=tmp_str;
306 }
307 if (init_ciphers) load_ciphers();
308
309 num=ssl_method->num_ciphers();
310
311 if ((ret=(STACK *)sk_new(NULL)) == NULL) goto err;
312 if ((ca_list=(STACK *)sk_new(cmp_by_name)) == NULL) goto err;
313 302
314 mask =SSL_kFZA; 303 mask = SSL_kFZA;
315#ifdef NO_RSA 304#ifdef OPENSSL_NO_RSA
316 mask|=SSL_aRSA|SSL_kRSA; 305 mask |= SSL_aRSA|SSL_kRSA;
317#endif 306#endif
318#ifdef NO_DSA 307#ifdef OPENSSL_NO_DSA
319 mask|=SSL_aDSS; 308 mask |= SSL_aDSS;
320#endif 309#endif
321#ifdef NO_DH 310#ifdef OPENSSL_NO_DH
322 mask|=SSL_kDHr|SSL_kDHd|SSL_kEDH|SSL_aDH; 311 mask |= SSL_kDHr|SSL_kDHd|SSL_kEDH|SSL_aDH;
312#endif
313#ifdef OPENSSL_NO_KRB5
314 mask |= SSL_kKRB5|SSL_aKRB5;
323#endif 315#endif
324 316
325#ifndef SSL_ALLOW_ENULL 317#ifdef SSL_FORBID_ENULL
326 mask|=SSL_eNULL; 318 mask |= SSL_eNULL;
327#endif 319#endif
328 320
329 mask|=(ssl_cipher_methods[SSL_ENC_DES_IDX ] == NULL)?SSL_DES :0; 321 mask |= (ssl_cipher_methods[SSL_ENC_DES_IDX ] == NULL) ? SSL_DES :0;
330 mask|=(ssl_cipher_methods[SSL_ENC_3DES_IDX] == NULL)?SSL_3DES:0; 322 mask |= (ssl_cipher_methods[SSL_ENC_3DES_IDX] == NULL) ? SSL_3DES:0;
331 mask|=(ssl_cipher_methods[SSL_ENC_RC4_IDX ] == NULL)?SSL_RC4 :0; 323 mask |= (ssl_cipher_methods[SSL_ENC_RC4_IDX ] == NULL) ? SSL_RC4 :0;
332 mask|=(ssl_cipher_methods[SSL_ENC_RC2_IDX ] == NULL)?SSL_RC2 :0; 324 mask |= (ssl_cipher_methods[SSL_ENC_RC2_IDX ] == NULL) ? SSL_RC2 :0;
333 mask|=(ssl_cipher_methods[SSL_ENC_IDEA_IDX] == NULL)?SSL_IDEA:0; 325 mask |= (ssl_cipher_methods[SSL_ENC_IDEA_IDX] == NULL) ? SSL_IDEA:0;
334 mask|=(ssl_cipher_methods[SSL_ENC_eFZA_IDX] == NULL)?SSL_eFZA:0; 326 mask |= (ssl_cipher_methods[SSL_ENC_eFZA_IDX] == NULL) ? SSL_eFZA:0;
327 mask |= (ssl_cipher_methods[SSL_ENC_AES128_IDX] == NULL) ? SSL_AES:0;
335 328
336 mask|=(ssl_digest_methods[SSL_MD_MD5_IDX ] == NULL)?SSL_MD5 :0; 329 mask |= (ssl_digest_methods[SSL_MD_MD5_IDX ] == NULL) ? SSL_MD5 :0;
337 mask|=(ssl_digest_methods[SSL_MD_SHA1_IDX] == NULL)?SSL_SHA1:0; 330 mask |= (ssl_digest_methods[SSL_MD_SHA1_IDX] == NULL) ? SSL_SHA1:0;
338 331
339 if ((list=(CIPHER_ORDER *)Malloc(sizeof(CIPHER_ORDER)*num)) == NULL) 332 return(mask);
340 goto err; 333 }
334
335static void ssl_cipher_collect_ciphers(const SSL_METHOD *ssl_method,
336 int num_of_ciphers, unsigned long mask, CIPHER_ORDER *list,
337 CIPHER_ORDER **head_p, CIPHER_ORDER **tail_p)
338 {
339 int i, list_num;
340 SSL_CIPHER *c;
341
342 /*
343 * We have num_of_ciphers descriptions compiled in, depending on the
344 * method selected (SSLv2 and/or SSLv3, TLSv1 etc).
345 * These will later be sorted in a linked list with at most num
346 * entries.
347 */
341 348
342 /* Get the initial list of ciphers */ 349 /* Get the initial list of ciphers */
343 list_num=0; 350 list_num = 0; /* actual count of ciphers */
344 for (i=0; i<num; i++) 351 for (i = 0; i < num_of_ciphers; i++)
345 { 352 {
346 c=ssl_method->get_cipher((unsigned int)i); 353 c = ssl_method->get_cipher(i);
347 /* drop those that use any of that is not available */ 354 /* drop those that use any of that is not available */
348 if ((c != NULL) && c->valid && !(c->algorithms & mask)) 355 if ((c != NULL) && c->valid && !(c->algorithms & mask))
349 { 356 {
350 list[list_num].cipher=c; 357 list[list_num].cipher = c;
351 list[list_num].next=NULL; 358 list[list_num].next = NULL;
352 list[list_num].prev=NULL; 359 list[list_num].prev = NULL;
353 list[list_num].active=0; 360 list[list_num].active = 0;
354 list_num++; 361 list_num++;
362#ifdef KSSL_DEBUG
363 printf("\t%d: %s %lx %lx\n",i,c->name,c->id,c->algorithms);
364#endif /* KSSL_DEBUG */
365 /*
355 if (!sk_push(ca_list,(char *)c)) goto err; 366 if (!sk_push(ca_list,(char *)c)) goto err;
367 */
356 } 368 }
357 } 369 }
358 370
359 for (i=1; i<list_num-1; i++) 371 /*
372 * Prepare linked list from list entries
373 */
374 for (i = 1; i < list_num - 1; i++)
360 { 375 {
361 list[i].prev= &(list[i-1]); 376 list[i].prev = &(list[i-1]);
362 list[i].next= &(list[i+1]); 377 list[i].next = &(list[i+1]);
363 } 378 }
364 if (list_num > 0) 379 if (list_num > 0)
365 { 380 {
366 head= &(list[0]); 381 (*head_p) = &(list[0]);
367 head->prev=NULL; 382 (*head_p)->prev = NULL;
368 head->next= &(list[1]); 383 (*head_p)->next = &(list[1]);
369 tail= &(list[list_num-1]); 384 (*tail_p) = &(list[list_num - 1]);
370 tail->prev= &(list[list_num-2]); 385 (*tail_p)->prev = &(list[list_num - 2]);
371 tail->next=NULL; 386 (*tail_p)->next = NULL;
372 } 387 }
388 }
373 389
374 /* special case */ 390static void ssl_cipher_collect_aliases(SSL_CIPHER **ca_list,
375 cipher_aliases[0].algorithms= ~mask; 391 int num_of_group_aliases, unsigned long mask,
392 CIPHER_ORDER *head)
393 {
394 CIPHER_ORDER *ciph_curr;
395 SSL_CIPHER **ca_curr;
396 int i;
376 397
377 /* get the aliases */ 398 /*
378 k=sizeof(cipher_aliases)/sizeof(SSL_CIPHER); 399 * First, add the real ciphers as already collected
379 for (j=0; j<k; j++) 400 */
401 ciph_curr = head;
402 ca_curr = ca_list;
403 while (ciph_curr != NULL)
380 { 404 {
381 al=cipher_aliases[j].algorithms; 405 *ca_curr = ciph_curr->cipher;
382 /* Drop those that are not relevent */ 406 ca_curr++;
383 if ((al & mask) == al) continue; 407 ciph_curr = ciph_curr->next;
384 if (!sk_push(ca_list,(char *)&(cipher_aliases[j]))) goto err;
385 } 408 }
386 409
387 /* ca_list now holds a 'stack' of SSL_CIPHERS, some real, some 410 /*
388 * 'aliases' */ 411 * Now we add the available ones from the cipher_aliases[] table.
412 * They represent either an algorithm, that must be fully
413 * supported (not match any bit in mask) or represent a cipher
414 * strength value (will be added in any case because algorithms=0).
415 */
416 for (i = 0; i < num_of_group_aliases; i++)
417 {
418 if ((i == 0) || /* always fetch "ALL" */
419 !(cipher_aliases[i].algorithms & mask))
420 {
421 *ca_curr = (SSL_CIPHER *)(cipher_aliases + i);
422 ca_curr++;
423 }
424 }
389 425
390 /* how many parameters are there? */ 426 *ca_curr = NULL; /* end of list */
391 num=1; 427 }
392 for (l=str; *l; l++) 428
393 if (ITEM_SEP(*l)) 429static void ssl_cipher_apply_rule(unsigned long algorithms, unsigned long mask,
394 num++; 430 unsigned long algo_strength, unsigned long mask_strength,
395 ops=(CIPHER_CHOICE *)Malloc(sizeof(CIPHER_CHOICE)*num); 431 int rule, int strength_bits, CIPHER_ORDER *list,
396 if (ops == NULL) goto err; 432 CIPHER_ORDER **head_p, CIPHER_ORDER **tail_p)
397 memset(ops,0,sizeof(CIPHER_CHOICE)*num); 433 {
434 CIPHER_ORDER *head, *tail, *curr, *curr2, *tail2;
435 SSL_CIPHER *cp;
436 unsigned long ma, ma_s;
398 437
399 /* we now parse the input string and create our operations */ 438#ifdef CIPHER_DEBUG
400 l=str; 439 printf("Applying rule %d with %08lx %08lx %08lx %08lx (%d)\n",
401 i=0; 440 rule, algorithms, mask, algo_strength, mask_strength,
402 current_x=0; 441 strength_bits);
442#endif
403 443
444 curr = head = *head_p;
445 curr2 = head;
446 tail2 = tail = *tail_p;
404 for (;;) 447 for (;;)
405 { 448 {
406 ch= *l; 449 if ((curr == NULL) || (curr == tail2)) break;
450 curr = curr2;
451 curr2 = curr->next;
452
453 cp = curr->cipher;
454
455 /*
456 * Selection criteria is either the number of strength_bits
457 * or the algorithm used.
458 */
459 if (strength_bits == -1)
460 {
461 ma = mask & cp->algorithms;
462 ma_s = mask_strength & cp->algo_strength;
463
464#ifdef CIPHER_DEBUG
465 printf("\nName: %s:\nAlgo = %08lx Algo_strength = %08lx\nMask = %08lx Mask_strength %08lx\n", cp->name, cp->algorithms, cp->algo_strength, mask, mask_strength);
466 printf("ma = %08lx ma_s %08lx, ma&algo=%08lx, ma_s&algos=%08lx\n", ma, ma_s, ma&algorithms, ma_s&algo_strength);
467#endif
468 /*
469 * Select: if none of the mask bit was met from the
470 * cipher or not all of the bits were met, the
471 * selection does not apply.
472 */
473 if (((ma == 0) && (ma_s == 0)) ||
474 ((ma & algorithms) != ma) ||
475 ((ma_s & algo_strength) != ma_s))
476 continue; /* does not apply */
477 }
478 else if (strength_bits != cp->strength_bits)
479 continue; /* does not apply */
480
481#ifdef CIPHER_DEBUG
482 printf("Action = %d\n", rule);
483#endif
484
485 /* add the cipher if it has not been added yet. */
486 if (rule == CIPHER_ADD)
487 {
488 if (!curr->active)
489 {
490 ll_append_tail(&head, curr, &tail);
491 curr->active = 1;
492 }
493 }
494 /* Move the added cipher to this location */
495 else if (rule == CIPHER_ORD)
496 {
497 if (curr->active)
498 {
499 ll_append_tail(&head, curr, &tail);
500 }
501 }
502 else if (rule == CIPHER_DEL)
503 curr->active = 0;
504 else if (rule == CIPHER_KILL)
505 {
506 if (head == curr)
507 head = curr->next;
508 else
509 curr->prev->next = curr->next;
510 if (tail == curr)
511 tail = curr->prev;
512 curr->active = 0;
513 if (curr->next != NULL)
514 curr->next->prev = curr->prev;
515 if (curr->prev != NULL)
516 curr->prev->next = curr->next;
517 curr->next = NULL;
518 curr->prev = NULL;
519 }
520 }
521
522 *head_p = head;
523 *tail_p = tail;
524 }
525
526static int ssl_cipher_strength_sort(CIPHER_ORDER *list, CIPHER_ORDER **head_p,
527 CIPHER_ORDER **tail_p)
528 {
529 int max_strength_bits, i, *number_uses;
530 CIPHER_ORDER *curr;
531
532 /*
533 * This routine sorts the ciphers with descending strength. The sorting
534 * must keep the pre-sorted sequence, so we apply the normal sorting
535 * routine as '+' movement to the end of the list.
536 */
537 max_strength_bits = 0;
538 curr = *head_p;
539 while (curr != NULL)
540 {
541 if (curr->active &&
542 (curr->cipher->strength_bits > max_strength_bits))
543 max_strength_bits = curr->cipher->strength_bits;
544 curr = curr->next;
545 }
407 546
408 if (ch == '\0') break; 547 number_uses = OPENSSL_malloc((max_strength_bits + 1) * sizeof(int));
548 if (!number_uses)
549 {
550 SSLerr(SSL_F_SSL_CIPHER_STRENGTH_SORT,ERR_R_MALLOC_FAILURE);
551 return(0);
552 }
553 memset(number_uses, 0, (max_strength_bits + 1) * sizeof(int));
554
555 /*
556 * Now find the strength_bits values actually used
557 */
558 curr = *head_p;
559 while (curr != NULL)
560 {
561 if (curr->active)
562 number_uses[curr->cipher->strength_bits]++;
563 curr = curr->next;
564 }
565 /*
566 * Go through the list of used strength_bits values in descending
567 * order.
568 */
569 for (i = max_strength_bits; i >= 0; i--)
570 if (number_uses[i] > 0)
571 ssl_cipher_apply_rule(0, 0, 0, 0, CIPHER_ORD, i,
572 list, head_p, tail_p);
573
574 OPENSSL_free(number_uses);
575 return(1);
576 }
577
578static int ssl_cipher_process_rulestr(const char *rule_str,
579 CIPHER_ORDER *list, CIPHER_ORDER **head_p,
580 CIPHER_ORDER **tail_p, SSL_CIPHER **ca_list)
581 {
582 unsigned long algorithms, mask, algo_strength, mask_strength;
583 const char *l, *start, *buf;
584 int j, multi, found, rule, retval, ok, buflen;
585 char ch;
586
587 retval = 1;
588 l = rule_str;
589 for (;;)
590 {
591 ch = *l;
409 592
593 if (ch == '\0')
594 break; /* done */
410 if (ch == '-') 595 if (ch == '-')
411 { j=CIPHER_DEL; l++; } 596 { rule = CIPHER_DEL; l++; }
412 else if (ch == '+') 597 else if (ch == '+')
413 { j=CIPHER_ORD; l++; } 598 { rule = CIPHER_ORD; l++; }
414 else if (ch == '!') 599 else if (ch == '!')
415 { j=CIPHER_KILL; l++; } 600 { rule = CIPHER_KILL; l++; }
416 else 601 else if (ch == '@')
417 { j=CIPHER_ADD; } 602 { rule = CIPHER_SPECIAL; l++; }
603 else
604 { rule = CIPHER_ADD; }
418 605
419 if (ITEM_SEP(ch)) 606 if (ITEM_SEP(ch))
420 { 607 {
421 l++; 608 l++;
422 continue; 609 continue;
423 } 610 }
424 ops[current_x].type=j; 611
425 ops[current_x].algorithms=0; 612 algorithms = mask = algo_strength = mask_strength = 0;
426 ops[current_x].mask=0;
427 613
428 start=l; 614 start=l;
429 for (;;) 615 for (;;)
430 { 616 {
431 ch= *l; 617 ch = *l;
432 i=0; 618 buf = l;
619 buflen = 0;
620#ifndef CHARSET_EBCDIC
433 while ( ((ch >= 'A') && (ch <= 'Z')) || 621 while ( ((ch >= 'A') && (ch <= 'Z')) ||
434 ((ch >= '0') && (ch <= '9')) || 622 ((ch >= '0') && (ch <= '9')) ||
435 ((ch >= 'a') && (ch <= 'z')) || 623 ((ch >= 'a') && (ch <= 'z')) ||
436 (ch == '-')) 624 (ch == '-'))
625#else
626 while ( isalnum(ch) || (ch == '-'))
627#endif
437 { 628 {
438 buf[i]=ch; 629 ch = *(++l);
439 ch= *(++l); 630 buflen++;
440 i++;
441 if (i >= (CL_BUF-2)) break;
442 } 631 }
443 buf[i]='\0'; 632
633 if (buflen == 0)
634 {
635 /*
636 * We hit something we cannot deal with,
637 * it is no command or separator nor
638 * alphanumeric, so we call this an error.
639 */
640 SSLerr(SSL_F_SSL_CIPHER_PROCESS_RULESTR,
641 SSL_R_INVALID_COMMAND);
642 retval = found = 0;
643 l++;
644 break;
645 }
646
647 if (rule == CIPHER_SPECIAL)
648 {
649 found = 0; /* unused -- avoid compiler warning */
650 break; /* special treatment */
651 }
444 652
445 /* check for multi-part specification */ 653 /* check for multi-part specification */
446 if (ch == '+') 654 if (ch == '+')
@@ -451,151 +659,262 @@ char *str;
451 else 659 else
452 multi=0; 660 multi=0;
453 661
454 c_tmp.name=buf; 662 /*
455 j=sk_find(ca_list,(char *)&c_tmp); 663 * Now search for the cipher alias in the ca_list. Be careful
456 if (j < 0) 664 * with the strncmp, because the "buflen" limitation
457 goto end_loop; 665 * will make the rule "ADH:SOME" and the cipher
666 * "ADH-MY-CIPHER" look like a match for buflen=3.
667 * So additionally check whether the cipher name found
668 * has the correct length. We can save a strlen() call:
669 * just checking for the '\0' at the right place is
670 * sufficient, we have to strncmp() anyway.
671 */
672 j = found = 0;
673 while (ca_list[j])
674 {
675 if ((ca_list[j]->name[buflen] == '\0') &&
676 !strncmp(buf, ca_list[j]->name, buflen))
677 {
678 found = 1;
679 break;
680 }
681 else
682 j++;
683 }
684 if (!found)
685 break; /* ignore this entry */
686
687 algorithms |= ca_list[j]->algorithms;
688 mask |= ca_list[j]->mask;
689 algo_strength |= ca_list[j]->algo_strength;
690 mask_strength |= ca_list[j]->mask_strength;
458 691
459 cp=(SSL_CIPHER *)sk_value(ca_list,j);
460 ops[current_x].algorithms|=cp->algorithms;
461 /* We add the SSL_SSL_MASK so we can match the
462 * SSLv2 and SSLv3 versions of RC4-MD5 */
463 ops[current_x].mask|=cp->mask;
464 if (!multi) break; 692 if (!multi) break;
465 } 693 }
466 current_x++; 694
467 if (ch == '\0') break; 695 /*
468end_loop: 696 * Ok, we have the rule, now apply it
469 /* Make sure we scan until the next valid start point */ 697 */
470 while ((*l != '\0') && ITEM_SEP(*l)) 698 if (rule == CIPHER_SPECIAL)
471 l++; 699 { /* special command */
700 ok = 0;
701 if ((buflen == 8) &&
702 !strncmp(buf, "STRENGTH", 8))
703 ok = ssl_cipher_strength_sort(list,
704 head_p, tail_p);
705 else
706 SSLerr(SSL_F_SSL_CIPHER_PROCESS_RULESTR,
707 SSL_R_INVALID_COMMAND);
708 if (ok == 0)
709 retval = 0;
710 /*
711 * We do not support any "multi" options
712 * together with "@", so throw away the
713 * rest of the command, if any left, until
714 * end or ':' is found.
715 */
716 while ((*l != '\0') && ITEM_SEP(*l))
717 l++;
718 }
719 else if (found)
720 {
721 ssl_cipher_apply_rule(algorithms, mask,
722 algo_strength, mask_strength, rule, -1,
723 list, head_p, tail_p);
724 }
725 else
726 {
727 while ((*l != '\0') && ITEM_SEP(*l))
728 l++;
729 }
730 if (*l == '\0') break; /* done */
472 } 731 }
473 732
474 num_x=current_x; 733 return(retval);
475 current_x=0; 734 }
735
736STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(const SSL_METHOD *ssl_method,
737 STACK_OF(SSL_CIPHER) **cipher_list,
738 STACK_OF(SSL_CIPHER) **cipher_list_by_id,
739 const char *rule_str)
740 {
741 int ok, num_of_ciphers, num_of_alias_max, num_of_group_aliases;
742 unsigned long disabled_mask;
743 STACK_OF(SSL_CIPHER) *cipherstack;
744 const char *rule_p;
745 CIPHER_ORDER *list = NULL, *head = NULL, *tail = NULL, *curr;
746 SSL_CIPHER **ca_list = NULL;
747
748 /*
749 * Return with error if nothing to do.
750 */
751 if (rule_str == NULL) return(NULL);
752
753 if (init_ciphers) load_ciphers();
476 754
477 /* We will now process the list of ciphers, once for each category, to 755 /*
478 * decide what we should do with it. */ 756 * To reduce the work to do we only want to process the compiled
479 for (j=0; j<num_x; j++) 757 * in algorithms, so we first get the mask of disabled ciphers.
758 */
759 disabled_mask = ssl_cipher_get_disabled();
760
761 /*
762 * Now we have to collect the available ciphers from the compiled
763 * in ciphers. We cannot get more than the number compiled in, so
764 * it is used for allocation.
765 */
766 num_of_ciphers = ssl_method->num_ciphers();
767#ifdef KSSL_DEBUG
768 printf("ssl_create_cipher_list() for %d ciphers\n", num_of_ciphers);
769#endif /* KSSL_DEBUG */
770 list = (CIPHER_ORDER *)OPENSSL_malloc(sizeof(CIPHER_ORDER) * num_of_ciphers);
771 if (list == NULL)
480 { 772 {
481 algorithms=ops[j].algorithms; 773 SSLerr(SSL_F_SSL_CREATE_CIPHER_LIST,ERR_R_MALLOC_FAILURE);
482 type=ops[j].type; 774 return(NULL); /* Failure */
483 mask=ops[j].mask; 775 }
484 776
485 curr=head; 777 ssl_cipher_collect_ciphers(ssl_method, num_of_ciphers, disabled_mask,
486 curr2=head; 778 list, &head, &tail);
487 tail2=tail; 779
488 for (;;) 780 /*
489 { 781 * We also need cipher aliases for selecting based on the rule_str.
490 if ((curr == NULL) || (curr == tail2)) break; 782 * There might be two types of entries in the rule_str: 1) names
491 curr=curr2; 783 * of ciphers themselves 2) aliases for groups of ciphers.
492 curr2=curr->next; 784 * For 1) we need the available ciphers and for 2) the cipher
785 * groups of cipher_aliases added together in one list (otherwise
786 * we would be happy with just the cipher_aliases table).
787 */
788 num_of_group_aliases = sizeof(cipher_aliases) / sizeof(SSL_CIPHER);
789 num_of_alias_max = num_of_ciphers + num_of_group_aliases + 1;
790 ca_list =
791 (SSL_CIPHER **)OPENSSL_malloc(sizeof(SSL_CIPHER *) * num_of_alias_max);
792 if (ca_list == NULL)
793 {
794 OPENSSL_free(list);
795 SSLerr(SSL_F_SSL_CREATE_CIPHER_LIST,ERR_R_MALLOC_FAILURE);
796 return(NULL); /* Failure */
797 }
798 ssl_cipher_collect_aliases(ca_list, num_of_group_aliases, disabled_mask,
799 head);
800
801 /*
802 * If the rule_string begins with DEFAULT, apply the default rule
803 * before using the (possibly available) additional rules.
804 */
805 ok = 1;
806 rule_p = rule_str;
807 if (strncmp(rule_str,"DEFAULT",7) == 0)
808 {
809 ok = ssl_cipher_process_rulestr(SSL_DEFAULT_CIPHER_LIST,
810 list, &head, &tail, ca_list);
811 rule_p += 7;
812 if (*rule_p == ':')
813 rule_p++;
814 }
493 815
494 cp=curr->cipher; 816 if (ok && (strlen(rule_p) > 0))
495 ma=mask & cp->algorithms; 817 ok = ssl_cipher_process_rulestr(rule_p, list, &head, &tail,
496 if ((ma == 0) || ((ma & algorithms) != ma)) 818 ca_list);
497 {
498 /* does not apply */
499 continue;
500 }
501 819
502 /* add the cipher if it has not been added yet. */ 820 OPENSSL_free(ca_list); /* Not needed anymore */
503 if (type == CIPHER_ADD) 821
504 { 822 if (!ok)
505 if (!curr->active) 823 { /* Rule processing failure */
506 { 824 OPENSSL_free(list);
507 ll_append_tail(&head,curr,&tail); 825 return(NULL);
508 curr->active=1; 826 }
509 } 827 /*
510 } 828 * Allocate new "cipherstack" for the result, return with error
511 /* Move the added cipher to this location */ 829 * if we cannot get one.
512 else if (type == CIPHER_ORD) 830 */
513 { 831 if ((cipherstack = sk_SSL_CIPHER_new_null()) == NULL)
514 if (curr->active) 832 {
515 { 833 OPENSSL_free(list);
516 ll_append_tail(&head,curr,&tail); 834 return(NULL);
517 }
518 }
519 else if (type == CIPHER_DEL)
520 curr->active=0;
521 if (type == CIPHER_KILL)
522 {
523 if (head == curr)
524 head=curr->next;
525 else
526 curr->prev->next=curr->next;
527 if (tail == curr)
528 tail=curr->prev;
529 curr->active=0;
530 if (curr->next != NULL)
531 curr->next->prev=curr->prev;
532 if (curr->prev != NULL)
533 curr->prev->next=curr->next;
534 curr->next=NULL;
535 curr->prev=NULL;
536 }
537 }
538 } 835 }
539 836
540 for (curr=head; curr != NULL; curr=curr->next) 837 /*
838 * The cipher selection for the list is done. The ciphers are added
839 * to the resulting precedence to the STACK_OF(SSL_CIPHER).
840 */
841 for (curr = head; curr != NULL; curr = curr->next)
541 { 842 {
542 if (curr->active) 843 if (curr->active)
543 { 844 {
544 sk_push(ret,(char *)curr->cipher); 845 sk_SSL_CIPHER_push(cipherstack, curr->cipher);
545#ifdef CIPHER_DEBUG 846#ifdef CIPHER_DEBUG
546 printf("<%s>\n",curr->cipher->name); 847 printf("<%s>\n",curr->cipher->name);
547#endif 848#endif
548 } 849 }
549 } 850 }
550 851 OPENSSL_free(list); /* Not needed any longer */
852
853 /*
854 * The following passage is a little bit odd. If pointer variables
855 * were supplied to hold STACK_OF(SSL_CIPHER) return information,
856 * the old memory pointed to is free()ed. Then, however, the
857 * cipher_list entry will be assigned just a copy of the returned
858 * cipher stack. For cipher_list_by_id a copy of the cipher stack
859 * will be created. See next comment...
860 */
551 if (cipher_list != NULL) 861 if (cipher_list != NULL)
552 { 862 {
553 if (*cipher_list != NULL) 863 if (*cipher_list != NULL)
554 sk_free(*cipher_list); 864 sk_SSL_CIPHER_free(*cipher_list);
555 *cipher_list=ret; 865 *cipher_list = cipherstack;
556 } 866 }
557 867
558 if (cipher_list_by_id != NULL) 868 if (cipher_list_by_id != NULL)
559 { 869 {
560 if (*cipher_list_by_id != NULL) 870 if (*cipher_list_by_id != NULL)
561 sk_free(*cipher_list_by_id); 871 sk_SSL_CIPHER_free(*cipher_list_by_id);
562 *cipher_list_by_id=sk_dup(ret); 872 *cipher_list_by_id = sk_SSL_CIPHER_dup(cipherstack);
563 } 873 }
564 874
875 /*
876 * Now it is getting really strange. If something failed during
877 * the previous pointer assignment or if one of the pointers was
878 * not requested, the error condition is met. That might be
879 * discussable. The strange thing is however that in this case
880 * the memory "ret" pointed to is "free()ed" and hence the pointer
881 * cipher_list becomes wild. The memory reserved for
882 * cipher_list_by_id however is not "free()ed" and stays intact.
883 */
565 if ( (cipher_list_by_id == NULL) || 884 if ( (cipher_list_by_id == NULL) ||
566 (*cipher_list_by_id == NULL) || 885 (*cipher_list_by_id == NULL) ||
567 (cipher_list == NULL) || 886 (cipher_list == NULL) ||
568 (*cipher_list == NULL)) 887 (*cipher_list == NULL))
569 goto err; 888 {
570 sk_set_cmp_func(*cipher_list_by_id,ssl_cipher_ptr_id_cmp); 889 sk_SSL_CIPHER_free(cipherstack);
571 890 return(NULL);
572 ok=ret; 891 }
573 ret=NULL; 892
574err: 893 sk_SSL_CIPHER_set_cmp_func(*cipher_list_by_id,ssl_cipher_ptr_id_cmp);
575 if (tmp_str) Free(tmp_str); 894
576 if (ops != NULL) Free(ops); 895 return(cipherstack);
577 if (ret != NULL) sk_free(ret);
578 if (ca_list != NULL) sk_free(ca_list);
579 if (list != NULL) Free(list);
580 return(ok);
581 } 896 }
582 897
583char *SSL_CIPHER_description(cipher,buf,len) 898char *SSL_CIPHER_description(SSL_CIPHER *cipher, char *buf, int len)
584SSL_CIPHER *cipher;
585char *buf;
586int len;
587 { 899 {
588 int export; 900 int is_export,pkl,kl;
589 char *ver,*exp; 901 char *ver,*exp;
590 char *kx,*au,*enc,*mac; 902 char *kx,*au,*enc,*mac;
591 unsigned long alg,alg2; 903 unsigned long alg,alg2,alg_s;
904#ifdef KSSL_DEBUG
905 static char *format="%-23s %s Kx=%-8s Au=%-4s Enc=%-9s Mac=%-4s%s AL=%lx\n";
906#else
592 static char *format="%-23s %s Kx=%-8s Au=%-4s Enc=%-9s Mac=%-4s%s\n"; 907 static char *format="%-23s %s Kx=%-8s Au=%-4s Enc=%-9s Mac=%-4s%s\n";
593 908#endif /* KSSL_DEBUG */
909
594 alg=cipher->algorithms; 910 alg=cipher->algorithms;
911 alg_s=cipher->algo_strength;
595 alg2=cipher->algorithm2; 912 alg2=cipher->algorithm2;
596 913
597 export=(alg&SSL_EXP)?1:0; 914 is_export=SSL_C_IS_EXPORT(cipher);
598 exp=(export)?" export":""; 915 pkl=SSL_C_EXPORT_PKEYLENGTH(cipher);
916 kl=SSL_C_EXPORT_KEYLENGTH(cipher);
917 exp=is_export?" export":"";
599 918
600 if (alg & SSL_SSLV2) 919 if (alg & SSL_SSLV2)
601 ver="SSLv2"; 920 ver="SSLv2";
@@ -607,7 +926,7 @@ int len;
607 switch (alg&SSL_MKEY_MASK) 926 switch (alg&SSL_MKEY_MASK)
608 { 927 {
609 case SSL_kRSA: 928 case SSL_kRSA:
610 kx=(export)?"RSA(512)":"RSA"; 929 kx=is_export?(pkl == 512 ? "RSA(512)" : "RSA(1024)"):"RSA";
611 break; 930 break;
612 case SSL_kDHr: 931 case SSL_kDHr:
613 kx="DH/RSA"; 932 kx="DH/RSA";
@@ -615,11 +934,15 @@ int len;
615 case SSL_kDHd: 934 case SSL_kDHd:
616 kx="DH/DSS"; 935 kx="DH/DSS";
617 break; 936 break;
937 case SSL_kKRB5: /* VRS */
938 case SSL_KRB5: /* VRS */
939 kx="KRB5";
940 break;
618 case SSL_kFZA: 941 case SSL_kFZA:
619 kx="Fortezza"; 942 kx="Fortezza";
620 break; 943 break;
621 case SSL_kEDH: 944 case SSL_kEDH:
622 kx=(export)?"DH(512)":"DH"; 945 kx=is_export?(pkl == 512 ? "DH(512)" : "DH(1024)"):"DH";
623 break; 946 break;
624 default: 947 default:
625 kx="unknown"; 948 kx="unknown";
@@ -636,6 +959,10 @@ int len;
636 case SSL_aDH: 959 case SSL_aDH:
637 au="DH"; 960 au="DH";
638 break; 961 break;
962 case SSL_aKRB5: /* VRS */
963 case SSL_KRB5: /* VRS */
964 au="KRB5";
965 break;
639 case SSL_aFZA: 966 case SSL_aFZA:
640 case SSL_aNULL: 967 case SSL_aNULL:
641 au="None"; 968 au="None";
@@ -648,16 +975,17 @@ int len;
648 switch (alg&SSL_ENC_MASK) 975 switch (alg&SSL_ENC_MASK)
649 { 976 {
650 case SSL_DES: 977 case SSL_DES:
651 enc=export?"DES(40)":"DES(56)"; 978 enc=(is_export && kl == 5)?"DES(40)":"DES(56)";
652 break; 979 break;
653 case SSL_3DES: 980 case SSL_3DES:
654 enc="3DES(168)"; 981 enc="3DES(168)";
655 break; 982 break;
656 case SSL_RC4: 983 case SSL_RC4:
657 enc=export?"RC4(40)":((alg2&SSL2_CF_8_BYTE_ENC)?"RC4(64)":"RC4(128)"); 984 enc=is_export?(kl == 5 ? "RC4(40)" : "RC4(56)")
985 :((alg2&SSL2_CF_8_BYTE_ENC)?"RC4(64)":"RC4(128)");
658 break; 986 break;
659 case SSL_RC2: 987 case SSL_RC2:
660 enc=export?"RC2(40)":"RC2(128)"; 988 enc=is_export?(kl == 5 ? "RC2(40)" : "RC2(56)"):"RC2(128)";
661 break; 989 break;
662 case SSL_IDEA: 990 case SSL_IDEA:
663 enc="IDEA(128)"; 991 enc="IDEA(128)";
@@ -668,6 +996,15 @@ int len;
668 case SSL_eNULL: 996 case SSL_eNULL:
669 enc="None"; 997 enc="None";
670 break; 998 break;
999 case SSL_AES:
1000 switch(cipher->strength_bits)
1001 {
1002 case 128: enc="AESdraft(128)"; break;
1003 case 192: enc="AESdraft(192)"; break;
1004 case 256: enc="AESdraft(256)"; break;
1005 default: enc="AESdraft(?""?""?)"; break;
1006 }
1007 break;
671 default: 1008 default:
672 enc="unknown"; 1009 enc="unknown";
673 break; 1010 break;
@@ -688,18 +1025,22 @@ int len;
688 1025
689 if (buf == NULL) 1026 if (buf == NULL)
690 { 1027 {
691 buf=Malloc(128); 1028 len=128;
692 if (buf == NULL) return("Malloc Error"); 1029 buf=OPENSSL_malloc(len);
1030 if (buf == NULL) return("OPENSSL_malloc Error");
693 } 1031 }
694 else if (len < 128) 1032 else if (len < 128)
695 return("Buffer too small"); 1033 return("Buffer too small");
696 1034
697 sprintf(buf,format,cipher->name,ver,kx,au,enc,mac,exp); 1035#ifdef KSSL_DEBUG
1036 BIO_snprintf(buf,len,format,cipher->name,ver,kx,au,enc,mac,exp,alg);
1037#else
1038 BIO_snprintf(buf,len,format,cipher->name,ver,kx,au,enc,mac,exp);
1039#endif /* KSSL_DEBUG */
698 return(buf); 1040 return(buf);
699 } 1041 }
700 1042
701char *SSL_CIPHER_get_version(c) 1043char *SSL_CIPHER_get_version(SSL_CIPHER *c)
702SSL_CIPHER *c;
703 { 1044 {
704 int i; 1045 int i;
705 1046
@@ -714,45 +1055,78 @@ SSL_CIPHER *c;
714 } 1055 }
715 1056
716/* return the actual cipher being used */ 1057/* return the actual cipher being used */
717char *SSL_CIPHER_get_name(c) 1058const char *SSL_CIPHER_get_name(SSL_CIPHER *c)
718SSL_CIPHER *c;
719 { 1059 {
720 if (c != NULL) 1060 if (c != NULL)
721 return(c->name); 1061 return(c->name);
722 return("(NONE)"); 1062 return("(NONE)");
723 } 1063 }
724 1064
725/* number of bits for symetric cipher */ 1065/* number of bits for symmetric cipher */
726int SSL_CIPHER_get_bits(c,alg_bits) 1066int SSL_CIPHER_get_bits(SSL_CIPHER *c, int *alg_bits)
727SSL_CIPHER *c;
728int *alg_bits;
729 { 1067 {
730 int ret=0,a=0; 1068 int ret=0;
731 EVP_CIPHER *enc;
732 EVP_MD *md;
733 1069
734 if (c != NULL) 1070 if (c != NULL)
735 { 1071 {
736 if (!ssl_cipher_get_evp(c,&enc,&md)) 1072 if (alg_bits != NULL) *alg_bits = c->alg_bits;
737 return(0); 1073 ret = c->strength_bits;
1074 }
1075 return(ret);
1076 }
738 1077
739 a=EVP_CIPHER_key_length(enc)*8; 1078SSL_COMP *ssl3_comp_find(STACK_OF(SSL_COMP) *sk, int n)
1079 {
1080 SSL_COMP *ctmp;
1081 int i,nn;
740 1082
741 if (c->algorithms & SSL_EXP) 1083 if ((n == 0) || (sk == NULL)) return(NULL);
742 { 1084 nn=sk_SSL_COMP_num(sk);
743 ret=40; 1085 for (i=0; i<nn; i++)
744 } 1086 {
745 else 1087 ctmp=sk_SSL_COMP_value(sk,i);
746 { 1088 if (ctmp->id == n)
747 if (c->algorithm2 & SSL2_CF_8_BYTE_ENC) 1089 return(ctmp);
748 ret=64;
749 else
750 ret=a;
751 }
752 } 1090 }
1091 return(NULL);
1092 }
753 1093
754 if (alg_bits != NULL) *alg_bits=a; 1094static int sk_comp_cmp(const SSL_COMP * const *a,
755 1095 const SSL_COMP * const *b)
756 return(ret); 1096 {
1097 return((*a)->id-(*b)->id);
757 } 1098 }
758 1099
1100STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void)
1101 {
1102 return(ssl_comp_methods);
1103 }
1104
1105int SSL_COMP_add_compression_method(int id, COMP_METHOD *cm)
1106 {
1107 SSL_COMP *comp;
1108 STACK_OF(SSL_COMP) *sk;
1109
1110 if (cm == NULL || cm->type == NID_undef)
1111 return 1;
1112
1113 MemCheck_off();
1114 comp=(SSL_COMP *)OPENSSL_malloc(sizeof(SSL_COMP));
1115 comp->id=id;
1116 comp->method=cm;
1117 if (ssl_comp_methods == NULL)
1118 sk=ssl_comp_methods=sk_SSL_COMP_new(sk_comp_cmp);
1119 else
1120 sk=ssl_comp_methods;
1121 if ((sk == NULL) || !sk_SSL_COMP_push(sk,comp))
1122 {
1123 MemCheck_on();
1124 SSLerr(SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD,ERR_R_MALLOC_FAILURE);
1125 return(0);
1126 }
1127 else
1128 {
1129 MemCheck_on();
1130 return(1);
1131 }
1132 }
diff --git a/src/lib/libssl/ssl_err.c b/src/lib/libssl/ssl_err.c
index bcbb98591f..c32c4ef6e9 100644
--- a/src/lib/libssl/ssl_err.c
+++ b/src/lib/libssl/ssl_err.c
@@ -1,66 +1,69 @@
1/* lib/ssl/ssl_err.c */ 1/* ssl/ssl_err.c */
2/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) 2/* ====================================================================
3 * All rights reserved. 3 * Copyright (c) 1999 The OpenSSL Project. All rights reserved.
4 * 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 5 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
25 * are met: 7 * are met:
26 * 1. Redistributions of source code must retain the copyright 8 *
27 * notice, this list of conditions and the following disclaimer. 9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *
28 * 2. Redistributions in binary form must reproduce the above copyright 12 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the 13 * notice, this list of conditions and the following disclaimer in
30 * documentation and/or other materials provided with the distribution. 14 * the documentation and/or other materials provided with the
31 * 3. All advertising materials mentioning features or use of this software 15 * distribution.
32 * must display the following acknowledgement: 16 *
33 * "This product includes cryptographic software written by 17 * 3. All advertising materials mentioning features or use of this
34 * Eric Young (eay@cryptsoft.com)" 18 * software must display the following acknowledgment:
35 * The word 'cryptographic' can be left out if the rouines from the library 19 * "This product includes software developed by the OpenSSL Project
36 * being used are not cryptographic related :-). 20 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
37 * 4. If you include any Windows specific code (or a derivative thereof) from 21 *
38 * the apps directory (application code) you must include an acknowledgement: 22 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 23 * endorse or promote products derived from this software without
40 * 24 * prior written permission. For written permission, please contact
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 25 * openssl-core@OpenSSL.org.
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 *
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * 5. Products derived from this software may not be called "OpenSSL"
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 28 * nor may "OpenSSL" appear in their names without prior written
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * permission of the OpenSSL Project.
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 *
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * 6. Redistributions of any form whatsoever must retain the following
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * acknowledgment:
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * "This product includes software developed by the OpenSSL Project
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
51 * SUCH DAMAGE. 35 *
52 * 36 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
53 * The licence and distribution terms for any publically available version or 37 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
54 * derivative of this code cannot be changed. i.e. this code cannot simply be 38 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
55 * copied and put under another distribution licence 39 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
56 * [including the GNU Public Licence.] 40 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
42 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
44 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
45 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
47 * OF THE POSSIBILITY OF SUCH DAMAGE.
48 * ====================================================================
49 *
50 * This product includes cryptographic software written by Eric Young
51 * (eay@cryptsoft.com). This product includes software written by Tim
52 * Hudson (tjh@cryptsoft.com).
53 *
57 */ 54 */
55
56/* NOTE: this file was auto generated by the mkerr.pl script: any changes
57 * made to it will be overwritten when the script next updates this file,
58 * only reason strings will be preserved.
59 */
60
58#include <stdio.h> 61#include <stdio.h>
59#include "err.h" 62#include <openssl/err.h>
60#include "ssl.h" 63#include <openssl/ssl.h>
61 64
62/* BEGIN ERROR CODES */ 65/* BEGIN ERROR CODES */
63#ifndef NO_ERR 66#ifndef OPENSSL_NO_ERR
64static ERR_STRING_DATA SSL_str_functs[]= 67static ERR_STRING_DATA SSL_str_functs[]=
65 { 68 {
66{ERR_PACK(0,SSL_F_CLIENT_CERTIFICATE,0), "CLIENT_CERTIFICATE"}, 69{ERR_PACK(0,SSL_F_CLIENT_CERTIFICATE,0), "CLIENT_CERTIFICATE"},
@@ -83,21 +86,27 @@ static ERR_STRING_DATA SSL_str_functs[]=
83{ERR_PACK(0,SSL_F_SSL23_CONNECT,0), "SSL23_CONNECT"}, 86{ERR_PACK(0,SSL_F_SSL23_CONNECT,0), "SSL23_CONNECT"},
84{ERR_PACK(0,SSL_F_SSL23_GET_CLIENT_HELLO,0), "SSL23_GET_CLIENT_HELLO"}, 87{ERR_PACK(0,SSL_F_SSL23_GET_CLIENT_HELLO,0), "SSL23_GET_CLIENT_HELLO"},
85{ERR_PACK(0,SSL_F_SSL23_GET_SERVER_HELLO,0), "SSL23_GET_SERVER_HELLO"}, 88{ERR_PACK(0,SSL_F_SSL23_GET_SERVER_HELLO,0), "SSL23_GET_SERVER_HELLO"},
89{ERR_PACK(0,SSL_F_SSL23_PEEK,0), "SSL23_PEEK"},
86{ERR_PACK(0,SSL_F_SSL23_READ,0), "SSL23_READ"}, 90{ERR_PACK(0,SSL_F_SSL23_READ,0), "SSL23_READ"},
87{ERR_PACK(0,SSL_F_SSL23_WRITE,0), "SSL23_WRITE"}, 91{ERR_PACK(0,SSL_F_SSL23_WRITE,0), "SSL23_WRITE"},
88{ERR_PACK(0,SSL_F_SSL2_ACCEPT,0), "SSL2_ACCEPT"}, 92{ERR_PACK(0,SSL_F_SSL2_ACCEPT,0), "SSL2_ACCEPT"},
89{ERR_PACK(0,SSL_F_SSL2_CONNECT,0), "SSL2_CONNECT"}, 93{ERR_PACK(0,SSL_F_SSL2_CONNECT,0), "SSL2_CONNECT"},
90{ERR_PACK(0,SSL_F_SSL2_ENC_INIT,0), "SSL2_ENC_INIT"}, 94{ERR_PACK(0,SSL_F_SSL2_ENC_INIT,0), "SSL2_ENC_INIT"},
95{ERR_PACK(0,SSL_F_SSL2_PEEK,0), "SSL2_PEEK"},
91{ERR_PACK(0,SSL_F_SSL2_READ,0), "SSL2_READ"}, 96{ERR_PACK(0,SSL_F_SSL2_READ,0), "SSL2_READ"},
97{ERR_PACK(0,SSL_F_SSL2_READ_INTERNAL,0), "SSL2_READ_INTERNAL"},
92{ERR_PACK(0,SSL_F_SSL2_SET_CERTIFICATE,0), "SSL2_SET_CERTIFICATE"}, 98{ERR_PACK(0,SSL_F_SSL2_SET_CERTIFICATE,0), "SSL2_SET_CERTIFICATE"},
93{ERR_PACK(0,SSL_F_SSL2_WRITE,0), "SSL2_WRITE"}, 99{ERR_PACK(0,SSL_F_SSL2_WRITE,0), "SSL2_WRITE"},
94{ERR_PACK(0,SSL_F_SSL3_ACCEPT,0), "SSL3_ACCEPT"}, 100{ERR_PACK(0,SSL_F_SSL3_ACCEPT,0), "SSL3_ACCEPT"},
101{ERR_PACK(0,SSL_F_SSL3_CALLBACK_CTRL,0), "SSL3_CALLBACK_CTRL"},
95{ERR_PACK(0,SSL_F_SSL3_CHANGE_CIPHER_STATE,0), "SSL3_CHANGE_CIPHER_STATE"}, 102{ERR_PACK(0,SSL_F_SSL3_CHANGE_CIPHER_STATE,0), "SSL3_CHANGE_CIPHER_STATE"},
96{ERR_PACK(0,SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,0), "SSL3_CHECK_CERT_AND_ALGORITHM"}, 103{ERR_PACK(0,SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,0), "SSL3_CHECK_CERT_AND_ALGORITHM"},
97{ERR_PACK(0,SSL_F_SSL3_CLIENT_HELLO,0), "SSL3_CLIENT_HELLO"}, 104{ERR_PACK(0,SSL_F_SSL3_CLIENT_HELLO,0), "SSL3_CLIENT_HELLO"},
98{ERR_PACK(0,SSL_F_SSL3_CONNECT,0), "SSL3_CONNECT"}, 105{ERR_PACK(0,SSL_F_SSL3_CONNECT,0), "SSL3_CONNECT"},
106{ERR_PACK(0,SSL_F_SSL3_CTRL,0), "SSL3_CTRL"},
99{ERR_PACK(0,SSL_F_SSL3_CTX_CTRL,0), "SSL3_CTX_CTRL"}, 107{ERR_PACK(0,SSL_F_SSL3_CTX_CTRL,0), "SSL3_CTX_CTRL"},
100{ERR_PACK(0,SSL_F_SSL3_ENC,0), "SSL3_ENC"}, 108{ERR_PACK(0,SSL_F_SSL3_ENC,0), "SSL3_ENC"},
109{ERR_PACK(0,SSL_F_SSL3_GENERATE_KEY_BLOCK,0), "SSL3_GENERATE_KEY_BLOCK"},
101{ERR_PACK(0,SSL_F_SSL3_GET_CERTIFICATE_REQUEST,0), "SSL3_GET_CERTIFICATE_REQUEST"}, 110{ERR_PACK(0,SSL_F_SSL3_GET_CERTIFICATE_REQUEST,0), "SSL3_GET_CERTIFICATE_REQUEST"},
102{ERR_PACK(0,SSL_F_SSL3_GET_CERT_VERIFY,0), "SSL3_GET_CERT_VERIFY"}, 111{ERR_PACK(0,SSL_F_SSL3_GET_CERT_VERIFY,0), "SSL3_GET_CERT_VERIFY"},
103{ERR_PACK(0,SSL_F_SSL3_GET_CLIENT_CERTIFICATE,0), "SSL3_GET_CLIENT_CERTIFICATE"}, 112{ERR_PACK(0,SSL_F_SSL3_GET_CLIENT_CERTIFICATE,0), "SSL3_GET_CLIENT_CERTIFICATE"},
@@ -111,6 +120,7 @@ static ERR_STRING_DATA SSL_str_functs[]=
111{ERR_PACK(0,SSL_F_SSL3_GET_SERVER_DONE,0), "SSL3_GET_SERVER_DONE"}, 120{ERR_PACK(0,SSL_F_SSL3_GET_SERVER_DONE,0), "SSL3_GET_SERVER_DONE"},
112{ERR_PACK(0,SSL_F_SSL3_GET_SERVER_HELLO,0), "SSL3_GET_SERVER_HELLO"}, 121{ERR_PACK(0,SSL_F_SSL3_GET_SERVER_HELLO,0), "SSL3_GET_SERVER_HELLO"},
113{ERR_PACK(0,SSL_F_SSL3_OUTPUT_CERT_CHAIN,0), "SSL3_OUTPUT_CERT_CHAIN"}, 122{ERR_PACK(0,SSL_F_SSL3_OUTPUT_CERT_CHAIN,0), "SSL3_OUTPUT_CERT_CHAIN"},
123{ERR_PACK(0,SSL_F_SSL3_PEEK,0), "SSL3_PEEK"},
114{ERR_PACK(0,SSL_F_SSL3_READ_BYTES,0), "SSL3_READ_BYTES"}, 124{ERR_PACK(0,SSL_F_SSL3_READ_BYTES,0), "SSL3_READ_BYTES"},
115{ERR_PACK(0,SSL_F_SSL3_READ_N,0), "SSL3_READ_N"}, 125{ERR_PACK(0,SSL_F_SSL3_READ_N,0), "SSL3_READ_N"},
116{ERR_PACK(0,SSL_F_SSL3_SEND_CERTIFICATE_REQUEST,0), "SSL3_SEND_CERTIFICATE_REQUEST"}, 126{ERR_PACK(0,SSL_F_SSL3_SEND_CERTIFICATE_REQUEST,0), "SSL3_SEND_CERTIFICATE_REQUEST"},
@@ -123,16 +133,30 @@ static ERR_STRING_DATA SSL_str_functs[]=
123{ERR_PACK(0,SSL_F_SSL3_SETUP_KEY_BLOCK,0), "SSL3_SETUP_KEY_BLOCK"}, 133{ERR_PACK(0,SSL_F_SSL3_SETUP_KEY_BLOCK,0), "SSL3_SETUP_KEY_BLOCK"},
124{ERR_PACK(0,SSL_F_SSL3_WRITE_BYTES,0), "SSL3_WRITE_BYTES"}, 134{ERR_PACK(0,SSL_F_SSL3_WRITE_BYTES,0), "SSL3_WRITE_BYTES"},
125{ERR_PACK(0,SSL_F_SSL3_WRITE_PENDING,0), "SSL3_WRITE_PENDING"}, 135{ERR_PACK(0,SSL_F_SSL3_WRITE_PENDING,0), "SSL3_WRITE_PENDING"},
136{ERR_PACK(0,SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK,0), "SSL_add_dir_cert_subjects_to_stack"},
137{ERR_PACK(0,SSL_F_SSL_ADD_FILE_CERT_SUBJECTS_TO_STACK,0), "SSL_add_file_cert_subjects_to_stack"},
126{ERR_PACK(0,SSL_F_SSL_BAD_METHOD,0), "SSL_BAD_METHOD"}, 138{ERR_PACK(0,SSL_F_SSL_BAD_METHOD,0), "SSL_BAD_METHOD"},
127{ERR_PACK(0,SSL_F_SSL_BYTES_TO_CIPHER_LIST,0), "SSL_BYTES_TO_CIPHER_LIST"}, 139{ERR_PACK(0,SSL_F_SSL_BYTES_TO_CIPHER_LIST,0), "SSL_BYTES_TO_CIPHER_LIST"},
140{ERR_PACK(0,SSL_F_SSL_CERT_DUP,0), "SSL_CERT_DUP"},
141{ERR_PACK(0,SSL_F_SSL_CERT_INST,0), "SSL_CERT_INST"},
142{ERR_PACK(0,SSL_F_SSL_CERT_INSTANTIATE,0), "SSL_CERT_INSTANTIATE"},
128{ERR_PACK(0,SSL_F_SSL_CERT_NEW,0), "SSL_CERT_NEW"}, 143{ERR_PACK(0,SSL_F_SSL_CERT_NEW,0), "SSL_CERT_NEW"},
129{ERR_PACK(0,SSL_F_SSL_CHECK_PRIVATE_KEY,0), "SSL_check_private_key"}, 144{ERR_PACK(0,SSL_F_SSL_CHECK_PRIVATE_KEY,0), "SSL_check_private_key"},
145{ERR_PACK(0,SSL_F_SSL_CIPHER_PROCESS_RULESTR,0), "SSL_CIPHER_PROCESS_RULESTR"},
146{ERR_PACK(0,SSL_F_SSL_CIPHER_STRENGTH_SORT,0), "SSL_CIPHER_STRENGTH_SORT"},
147{ERR_PACK(0,SSL_F_SSL_CLEAR,0), "SSL_clear"},
148{ERR_PACK(0,SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD,0), "SSL_COMP_add_compression_method"},
130{ERR_PACK(0,SSL_F_SSL_CREATE_CIPHER_LIST,0), "SSL_CREATE_CIPHER_LIST"}, 149{ERR_PACK(0,SSL_F_SSL_CREATE_CIPHER_LIST,0), "SSL_CREATE_CIPHER_LIST"},
150{ERR_PACK(0,SSL_F_SSL_CTRL,0), "SSL_ctrl"},
131{ERR_PACK(0,SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,0), "SSL_CTX_check_private_key"}, 151{ERR_PACK(0,SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,0), "SSL_CTX_check_private_key"},
132{ERR_PACK(0,SSL_F_SSL_CTX_NEW,0), "SSL_CTX_new"}, 152{ERR_PACK(0,SSL_F_SSL_CTX_NEW,0), "SSL_CTX_new"},
153{ERR_PACK(0,SSL_F_SSL_CTX_SET_PURPOSE,0), "SSL_CTX_set_purpose"},
154{ERR_PACK(0,SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT,0), "SSL_CTX_set_session_id_context"},
133{ERR_PACK(0,SSL_F_SSL_CTX_SET_SSL_VERSION,0), "SSL_CTX_set_ssl_version"}, 155{ERR_PACK(0,SSL_F_SSL_CTX_SET_SSL_VERSION,0), "SSL_CTX_set_ssl_version"},
156{ERR_PACK(0,SSL_F_SSL_CTX_SET_TRUST,0), "SSL_CTX_set_trust"},
134{ERR_PACK(0,SSL_F_SSL_CTX_USE_CERTIFICATE,0), "SSL_CTX_use_certificate"}, 157{ERR_PACK(0,SSL_F_SSL_CTX_USE_CERTIFICATE,0), "SSL_CTX_use_certificate"},
135{ERR_PACK(0,SSL_F_SSL_CTX_USE_CERTIFICATE_ASN1,0), "SSL_CTX_use_certificate_ASN1"}, 158{ERR_PACK(0,SSL_F_SSL_CTX_USE_CERTIFICATE_ASN1,0), "SSL_CTX_use_certificate_ASN1"},
159{ERR_PACK(0,SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE,0), "SSL_CTX_use_certificate_chain_file"},
136{ERR_PACK(0,SSL_F_SSL_CTX_USE_CERTIFICATE_FILE,0), "SSL_CTX_use_certificate_file"}, 160{ERR_PACK(0,SSL_F_SSL_CTX_USE_CERTIFICATE_FILE,0), "SSL_CTX_use_certificate_file"},
137{ERR_PACK(0,SSL_F_SSL_CTX_USE_PRIVATEKEY,0), "SSL_CTX_use_PrivateKey"}, 161{ERR_PACK(0,SSL_F_SSL_CTX_USE_PRIVATEKEY,0), "SSL_CTX_use_PrivateKey"},
138{ERR_PACK(0,SSL_F_SSL_CTX_USE_PRIVATEKEY_ASN1,0), "SSL_CTX_use_PrivateKey_ASN1"}, 162{ERR_PACK(0,SSL_F_SSL_CTX_USE_PRIVATEKEY_ASN1,0), "SSL_CTX_use_PrivateKey_ASN1"},
@@ -142,21 +166,28 @@ static ERR_STRING_DATA SSL_str_functs[]=
142{ERR_PACK(0,SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_FILE,0), "SSL_CTX_use_RSAPrivateKey_file"}, 166{ERR_PACK(0,SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_FILE,0), "SSL_CTX_use_RSAPrivateKey_file"},
143{ERR_PACK(0,SSL_F_SSL_DO_HANDSHAKE,0), "SSL_do_handshake"}, 167{ERR_PACK(0,SSL_F_SSL_DO_HANDSHAKE,0), "SSL_do_handshake"},
144{ERR_PACK(0,SSL_F_SSL_GET_NEW_SESSION,0), "SSL_GET_NEW_SESSION"}, 168{ERR_PACK(0,SSL_F_SSL_GET_NEW_SESSION,0), "SSL_GET_NEW_SESSION"},
169{ERR_PACK(0,SSL_F_SSL_GET_PREV_SESSION,0), "SSL_GET_PREV_SESSION"},
145{ERR_PACK(0,SSL_F_SSL_GET_SERVER_SEND_CERT,0), "SSL_GET_SERVER_SEND_CERT"}, 170{ERR_PACK(0,SSL_F_SSL_GET_SERVER_SEND_CERT,0), "SSL_GET_SERVER_SEND_CERT"},
146{ERR_PACK(0,SSL_F_SSL_GET_SIGN_PKEY,0), "SSL_GET_SIGN_PKEY"}, 171{ERR_PACK(0,SSL_F_SSL_GET_SIGN_PKEY,0), "SSL_GET_SIGN_PKEY"},
147{ERR_PACK(0,SSL_F_SSL_INIT_WBIO_BUFFER,0), "SSL_INIT_WBIO_BUFFER"}, 172{ERR_PACK(0,SSL_F_SSL_INIT_WBIO_BUFFER,0), "SSL_INIT_WBIO_BUFFER"},
148{ERR_PACK(0,SSL_F_SSL_LOAD_CLIENT_CA_FILE,0), "SSL_load_client_CA_file"}, 173{ERR_PACK(0,SSL_F_SSL_LOAD_CLIENT_CA_FILE,0), "SSL_load_client_CA_file"},
149{ERR_PACK(0,SSL_F_SSL_NEW,0), "SSL_new"}, 174{ERR_PACK(0,SSL_F_SSL_NEW,0), "SSL_new"},
175{ERR_PACK(0,SSL_F_SSL_READ,0), "SSL_read"},
150{ERR_PACK(0,SSL_F_SSL_RSA_PRIVATE_DECRYPT,0), "SSL_RSA_PRIVATE_DECRYPT"}, 176{ERR_PACK(0,SSL_F_SSL_RSA_PRIVATE_DECRYPT,0), "SSL_RSA_PRIVATE_DECRYPT"},
151{ERR_PACK(0,SSL_F_SSL_RSA_PUBLIC_ENCRYPT,0), "SSL_RSA_PUBLIC_ENCRYPT"}, 177{ERR_PACK(0,SSL_F_SSL_RSA_PUBLIC_ENCRYPT,0), "SSL_RSA_PUBLIC_ENCRYPT"},
152{ERR_PACK(0,SSL_F_SSL_SESSION_NEW,0), "SSL_SESSION_new"}, 178{ERR_PACK(0,SSL_F_SSL_SESSION_NEW,0), "SSL_SESSION_new"},
153{ERR_PACK(0,SSL_F_SSL_SESSION_PRINT_FP,0), "SSL_SESSION_print_fp"}, 179{ERR_PACK(0,SSL_F_SSL_SESSION_PRINT_FP,0), "SSL_SESSION_print_fp"},
180{ERR_PACK(0,SSL_F_SSL_SESS_CERT_NEW,0), "SSL_SESS_CERT_NEW"},
154{ERR_PACK(0,SSL_F_SSL_SET_CERT,0), "SSL_SET_CERT"}, 181{ERR_PACK(0,SSL_F_SSL_SET_CERT,0), "SSL_SET_CERT"},
155{ERR_PACK(0,SSL_F_SSL_SET_FD,0), "SSL_set_fd"}, 182{ERR_PACK(0,SSL_F_SSL_SET_FD,0), "SSL_set_fd"},
156{ERR_PACK(0,SSL_F_SSL_SET_PKEY,0), "SSL_SET_PKEY"}, 183{ERR_PACK(0,SSL_F_SSL_SET_PKEY,0), "SSL_SET_PKEY"},
184{ERR_PACK(0,SSL_F_SSL_SET_PURPOSE,0), "SSL_set_purpose"},
157{ERR_PACK(0,SSL_F_SSL_SET_RFD,0), "SSL_set_rfd"}, 185{ERR_PACK(0,SSL_F_SSL_SET_RFD,0), "SSL_set_rfd"},
158{ERR_PACK(0,SSL_F_SSL_SET_SESSION,0), "SSL_set_session"}, 186{ERR_PACK(0,SSL_F_SSL_SET_SESSION,0), "SSL_set_session"},
187{ERR_PACK(0,SSL_F_SSL_SET_SESSION_ID_CONTEXT,0), "SSL_set_session_id_context"},
188{ERR_PACK(0,SSL_F_SSL_SET_TRUST,0), "SSL_set_trust"},
159{ERR_PACK(0,SSL_F_SSL_SET_WFD,0), "SSL_set_wfd"}, 189{ERR_PACK(0,SSL_F_SSL_SET_WFD,0), "SSL_set_wfd"},
190{ERR_PACK(0,SSL_F_SSL_SHUTDOWN,0), "SSL_shutdown"},
160{ERR_PACK(0,SSL_F_SSL_UNDEFINED_FUNCTION,0), "SSL_UNDEFINED_FUNCTION"}, 191{ERR_PACK(0,SSL_F_SSL_UNDEFINED_FUNCTION,0), "SSL_UNDEFINED_FUNCTION"},
161{ERR_PACK(0,SSL_F_SSL_USE_CERTIFICATE,0), "SSL_use_certificate"}, 192{ERR_PACK(0,SSL_F_SSL_USE_CERTIFICATE,0), "SSL_use_certificate"},
162{ERR_PACK(0,SSL_F_SSL_USE_CERTIFICATE_ASN1,0), "SSL_use_certificate_ASN1"}, 193{ERR_PACK(0,SSL_F_SSL_USE_CERTIFICATE_ASN1,0), "SSL_use_certificate_ASN1"},
@@ -167,22 +198,23 @@ static ERR_STRING_DATA SSL_str_functs[]=
167{ERR_PACK(0,SSL_F_SSL_USE_RSAPRIVATEKEY,0), "SSL_use_RSAPrivateKey"}, 198{ERR_PACK(0,SSL_F_SSL_USE_RSAPRIVATEKEY,0), "SSL_use_RSAPrivateKey"},
168{ERR_PACK(0,SSL_F_SSL_USE_RSAPRIVATEKEY_ASN1,0), "SSL_use_RSAPrivateKey_ASN1"}, 199{ERR_PACK(0,SSL_F_SSL_USE_RSAPRIVATEKEY_ASN1,0), "SSL_use_RSAPrivateKey_ASN1"},
169{ERR_PACK(0,SSL_F_SSL_USE_RSAPRIVATEKEY_FILE,0), "SSL_use_RSAPrivateKey_file"}, 200{ERR_PACK(0,SSL_F_SSL_USE_RSAPRIVATEKEY_FILE,0), "SSL_use_RSAPrivateKey_file"},
201{ERR_PACK(0,SSL_F_SSL_VERIFY_CERT_CHAIN,0), "SSL_VERIFY_CERT_CHAIN"},
170{ERR_PACK(0,SSL_F_SSL_WRITE,0), "SSL_write"}, 202{ERR_PACK(0,SSL_F_SSL_WRITE,0), "SSL_write"},
171{ERR_PACK(0,SSL_F_TLS1_CHANGE_CIPHER_STATE,0), "TLS1_CHANGE_CIPHER_STATE"}, 203{ERR_PACK(0,SSL_F_TLS1_CHANGE_CIPHER_STATE,0), "TLS1_CHANGE_CIPHER_STATE"},
172{ERR_PACK(0,SSL_F_TLS1_ENC,0), "TLS1_ENC"}, 204{ERR_PACK(0,SSL_F_TLS1_ENC,0), "TLS1_ENC"},
173{ERR_PACK(0,SSL_F_TLS1_SETUP_KEY_BLOCK,0), "TLS1_SETUP_KEY_BLOCK"}, 205{ERR_PACK(0,SSL_F_TLS1_SETUP_KEY_BLOCK,0), "TLS1_SETUP_KEY_BLOCK"},
174{ERR_PACK(0,SSL_F_WRITE_PENDING,0), "WRITE_PENDING"}, 206{ERR_PACK(0,SSL_F_WRITE_PENDING,0), "WRITE_PENDING"},
175{0,NULL}, 207{0,NULL}
176 }; 208 };
177 209
178static ERR_STRING_DATA SSL_str_reasons[]= 210static ERR_STRING_DATA SSL_str_reasons[]=
179 { 211 {
180{SSL_R_APP_DATA_IN_HANDSHAKE ,"app data in handshake"}, 212{SSL_R_APP_DATA_IN_HANDSHAKE ,"app data in handshake"},
213{SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT,"attempt to reuse session in different context"},
181{SSL_R_BAD_ALERT_RECORD ,"bad alert record"}, 214{SSL_R_BAD_ALERT_RECORD ,"bad alert record"},
182{SSL_R_BAD_AUTHENTICATION_TYPE ,"bad authentication type"}, 215{SSL_R_BAD_AUTHENTICATION_TYPE ,"bad authentication type"},
183{SSL_R_BAD_CHANGE_CIPHER_SPEC ,"bad change cipher spec"}, 216{SSL_R_BAD_CHANGE_CIPHER_SPEC ,"bad change cipher spec"},
184{SSL_R_BAD_CHECKSUM ,"bad checksum"}, 217{SSL_R_BAD_CHECKSUM ,"bad checksum"},
185{SSL_R_BAD_CLIENT_REQUEST ,"bad client request"},
186{SSL_R_BAD_DATA_RETURNED_BY_CALLBACK ,"bad data returned by callback"}, 218{SSL_R_BAD_DATA_RETURNED_BY_CALLBACK ,"bad data returned by callback"},
187{SSL_R_BAD_DECOMPRESSION ,"bad decompression"}, 219{SSL_R_BAD_DECOMPRESSION ,"bad decompression"},
188{SSL_R_BAD_DH_G_LENGTH ,"bad dh g length"}, 220{SSL_R_BAD_DH_G_LENGTH ,"bad dh g length"},
@@ -190,6 +222,8 @@ static ERR_STRING_DATA SSL_str_reasons[]=
190{SSL_R_BAD_DH_P_LENGTH ,"bad dh p length"}, 222{SSL_R_BAD_DH_P_LENGTH ,"bad dh p length"},
191{SSL_R_BAD_DIGEST_LENGTH ,"bad digest length"}, 223{SSL_R_BAD_DIGEST_LENGTH ,"bad digest length"},
192{SSL_R_BAD_DSA_SIGNATURE ,"bad dsa signature"}, 224{SSL_R_BAD_DSA_SIGNATURE ,"bad dsa signature"},
225{SSL_R_BAD_HELLO_REQUEST ,"bad hello request"},
226{SSL_R_BAD_LENGTH ,"bad length"},
193{SSL_R_BAD_MAC_DECODE ,"bad mac decode"}, 227{SSL_R_BAD_MAC_DECODE ,"bad mac decode"},
194{SSL_R_BAD_MESSAGE_TYPE ,"bad message type"}, 228{SSL_R_BAD_MESSAGE_TYPE ,"bad message type"},
195{SSL_R_BAD_PACKET_LENGTH ,"bad packet length"}, 229{SSL_R_BAD_PACKET_LENGTH ,"bad packet length"},
@@ -219,25 +253,44 @@ static ERR_STRING_DATA SSL_str_reasons[]=
219{SSL_R_CIPHER_TABLE_SRC_ERROR ,"cipher table src error"}, 253{SSL_R_CIPHER_TABLE_SRC_ERROR ,"cipher table src error"},
220{SSL_R_COMPRESSED_LENGTH_TOO_LONG ,"compressed length too long"}, 254{SSL_R_COMPRESSED_LENGTH_TOO_LONG ,"compressed length too long"},
221{SSL_R_COMPRESSION_FAILURE ,"compression failure"}, 255{SSL_R_COMPRESSION_FAILURE ,"compression failure"},
256{SSL_R_COMPRESSION_LIBRARY_ERROR ,"compression library error"},
222{SSL_R_CONNECTION_ID_IS_DIFFERENT ,"connection id is different"}, 257{SSL_R_CONNECTION_ID_IS_DIFFERENT ,"connection id is different"},
223{SSL_R_CONNECTION_TYPE_NOT_SET ,"connection type not set"}, 258{SSL_R_CONNECTION_TYPE_NOT_SET ,"connection type not set"},
224{SSL_R_DATA_BETWEEN_CCS_AND_FINISHED ,"data between ccs and finished"}, 259{SSL_R_DATA_BETWEEN_CCS_AND_FINISHED ,"data between ccs and finished"},
225{SSL_R_DATA_LENGTH_TOO_LONG ,"data length too long"}, 260{SSL_R_DATA_LENGTH_TOO_LONG ,"data length too long"},
226{SSL_R_DECRYPTION_FAILED ,"decryption failed"}, 261{SSL_R_DECRYPTION_FAILED ,"decryption failed"},
262{SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC,"decryption failed or bad record mac"},
227{SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG ,"dh public value length is wrong"}, 263{SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG ,"dh public value length is wrong"},
228{SSL_R_DIGEST_CHECK_FAILED ,"digest check failed"}, 264{SSL_R_DIGEST_CHECK_FAILED ,"digest check failed"},
229{SSL_R_ENCRYPTED_LENGTH_TOO_LONG ,"encrypted length too long"}, 265{SSL_R_ENCRYPTED_LENGTH_TOO_LONG ,"encrypted length too long"},
266{SSL_R_ERROR_GENERATING_TMP_RSA_KEY ,"error generating tmp rsa key"},
230{SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST ,"error in received cipher list"}, 267{SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST ,"error in received cipher list"},
231{SSL_R_EXCESSIVE_MESSAGE_SIZE ,"excessive message size"}, 268{SSL_R_EXCESSIVE_MESSAGE_SIZE ,"excessive message size"},
232{SSL_R_EXTRA_DATA_IN_MESSAGE ,"extra data in message"}, 269{SSL_R_EXTRA_DATA_IN_MESSAGE ,"extra data in message"},
233{SSL_R_GOT_A_FIN_BEFORE_A_CCS ,"got a fin before a ccs"}, 270{SSL_R_GOT_A_FIN_BEFORE_A_CCS ,"got a fin before a ccs"},
234{SSL_R_HTTPS_PROXY_REQUEST ,"https proxy request"}, 271{SSL_R_HTTPS_PROXY_REQUEST ,"https proxy request"},
235{SSL_R_HTTP_REQUEST ,"http request"}, 272{SSL_R_HTTP_REQUEST ,"http request"},
236{SSL_R_INTERNAL_ERROR ,"internal error"}, 273{SSL_R_ILLEGAL_PADDING ,"illegal padding"},
237{SSL_R_INVALID_CHALLENGE_LENGTH ,"invalid challenge length"}, 274{SSL_R_INVALID_CHALLENGE_LENGTH ,"invalid challenge length"},
275{SSL_R_INVALID_COMMAND ,"invalid command"},
276{SSL_R_INVALID_PURPOSE ,"invalid purpose"},
277{SSL_R_INVALID_TRUST ,"invalid trust"},
278{SSL_R_KRB5 ,"krb5"},
279{SSL_R_KRB5_C_CC_PRINC ,"krb5 client cc principal (no tkt?)"},
280{SSL_R_KRB5_C_GET_CRED ,"krb5 client get cred"},
281{SSL_R_KRB5_C_INIT ,"krb5 client init"},
282{SSL_R_KRB5_C_MK_REQ ,"krb5 client mk_req (expired tkt?)"},
283{SSL_R_KRB5_S_BAD_TICKET ,"krb5 server bad ticket"},
284{SSL_R_KRB5_S_INIT ,"krb5 server init"},
285{SSL_R_KRB5_S_RD_REQ ,"krb5 server rd_req (keytab perms?)"},
286{SSL_R_KRB5_S_TKT_EXPIRED ,"krb5 server tkt expired"},
287{SSL_R_KRB5_S_TKT_NYV ,"krb5 server tkt not yet valid"},
288{SSL_R_KRB5_S_TKT_SKEW ,"krb5 server tkt skew"},
238{SSL_R_LENGTH_MISMATCH ,"length mismatch"}, 289{SSL_R_LENGTH_MISMATCH ,"length mismatch"},
239{SSL_R_LENGTH_TOO_SHORT ,"length too short"}, 290{SSL_R_LENGTH_TOO_SHORT ,"length too short"},
291{SSL_R_LIBRARY_BUG ,"library bug"},
240{SSL_R_LIBRARY_HAS_NO_CIPHERS ,"library has no ciphers"}, 292{SSL_R_LIBRARY_HAS_NO_CIPHERS ,"library has no ciphers"},
293{SSL_R_MESSAGE_TOO_LONG ,"message too long"},
241{SSL_R_MISSING_DH_DSA_CERT ,"missing dh dsa cert"}, 294{SSL_R_MISSING_DH_DSA_CERT ,"missing dh dsa cert"},
242{SSL_R_MISSING_DH_KEY ,"missing dh key"}, 295{SSL_R_MISSING_DH_KEY ,"missing dh key"},
243{SSL_R_MISSING_DH_RSA_CERT ,"missing dh rsa cert"}, 296{SSL_R_MISSING_DH_RSA_CERT ,"missing dh rsa cert"},
@@ -264,15 +317,18 @@ static ERR_STRING_DATA SSL_str_reasons[]=
264{SSL_R_NO_CIPHER_MATCH ,"no cipher match"}, 317{SSL_R_NO_CIPHER_MATCH ,"no cipher match"},
265{SSL_R_NO_CLIENT_CERT_RECEIVED ,"no client cert received"}, 318{SSL_R_NO_CLIENT_CERT_RECEIVED ,"no client cert received"},
266{SSL_R_NO_COMPRESSION_SPECIFIED ,"no compression specified"}, 319{SSL_R_NO_COMPRESSION_SPECIFIED ,"no compression specified"},
320{SSL_R_NO_METHOD_SPECIFIED ,"no method specified"},
267{SSL_R_NO_PRIVATEKEY ,"no privatekey"}, 321{SSL_R_NO_PRIVATEKEY ,"no privatekey"},
268{SSL_R_NO_PRIVATE_KEY_ASSIGNED ,"no private key assigned"}, 322{SSL_R_NO_PRIVATE_KEY_ASSIGNED ,"no private key assigned"},
269{SSL_R_NO_PROTOCOLS_AVAILABLE ,"no protocols available"}, 323{SSL_R_NO_PROTOCOLS_AVAILABLE ,"no protocols available"},
270{SSL_R_NO_PUBLICKEY ,"no publickey"}, 324{SSL_R_NO_PUBLICKEY ,"no publickey"},
271{SSL_R_NO_SHARED_CIPHER ,"no shared cipher"}, 325{SSL_R_NO_SHARED_CIPHER ,"no shared cipher"},
326{SSL_R_NO_VERIFY_CALLBACK ,"no verify callback"},
272{SSL_R_NULL_SSL_CTX ,"null ssl ctx"}, 327{SSL_R_NULL_SSL_CTX ,"null ssl ctx"},
273{SSL_R_NULL_SSL_METHOD_PASSED ,"null ssl method passed"}, 328{SSL_R_NULL_SSL_METHOD_PASSED ,"null ssl method passed"},
274{SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED ,"old session cipher not returned"}, 329{SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED ,"old session cipher not returned"},
275{SSL_R_PACKET_LENGTH_TOO_LONG ,"packet length too long"}, 330{SSL_R_PACKET_LENGTH_TOO_LONG ,"packet length too long"},
331{SSL_R_PATH_TOO_LONG ,"path too long"},
276{SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE ,"peer did not return a certificate"}, 332{SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE ,"peer did not return a certificate"},
277{SSL_R_PEER_ERROR ,"peer error"}, 333{SSL_R_PEER_ERROR ,"peer error"},
278{SSL_R_PEER_ERROR_CERTIFICATE ,"peer error certificate"}, 334{SSL_R_PEER_ERROR_CERTIFICATE ,"peer error certificate"},
@@ -289,12 +345,15 @@ static ERR_STRING_DATA SSL_str_reasons[]=
289{SSL_R_READ_WRONG_PACKET_TYPE ,"read wrong packet type"}, 345{SSL_R_READ_WRONG_PACKET_TYPE ,"read wrong packet type"},
290{SSL_R_RECORD_LENGTH_MISMATCH ,"record length mismatch"}, 346{SSL_R_RECORD_LENGTH_MISMATCH ,"record length mismatch"},
291{SSL_R_RECORD_TOO_LARGE ,"record too large"}, 347{SSL_R_RECORD_TOO_LARGE ,"record too large"},
348{SSL_R_RECORD_TOO_SMALL ,"record too small"},
292{SSL_R_REQUIRED_CIPHER_MISSING ,"required cipher missing"}, 349{SSL_R_REQUIRED_CIPHER_MISSING ,"required cipher missing"},
293{SSL_R_REUSE_CERT_LENGTH_NOT_ZERO ,"reuse cert length not zero"}, 350{SSL_R_REUSE_CERT_LENGTH_NOT_ZERO ,"reuse cert length not zero"},
294{SSL_R_REUSE_CERT_TYPE_NOT_ZERO ,"reuse cert type not zero"}, 351{SSL_R_REUSE_CERT_TYPE_NOT_ZERO ,"reuse cert type not zero"},
295{SSL_R_REUSE_CIPHER_LIST_NOT_ZERO ,"reuse cipher list not zero"}, 352{SSL_R_REUSE_CIPHER_LIST_NOT_ZERO ,"reuse cipher list not zero"},
353{SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED ,"session id context uninitialized"},
296{SSL_R_SHORT_READ ,"short read"}, 354{SSL_R_SHORT_READ ,"short read"},
297{SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE,"signature for non signing certificate"}, 355{SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE,"signature for non signing certificate"},
356{SSL_R_SSL23_DOING_SESSION_ID_REUSE ,"ssl23 doing session id reuse"},
298{SSL_R_SSL3_SESSION_ID_TOO_SHORT ,"ssl3 session id too short"}, 357{SSL_R_SSL3_SESSION_ID_TOO_SHORT ,"ssl3 session id too short"},
299{SSL_R_SSLV3_ALERT_BAD_CERTIFICATE ,"sslv3 alert bad certificate"}, 358{SSL_R_SSLV3_ALERT_BAD_CERTIFICATE ,"sslv3 alert bad certificate"},
300{SSL_R_SSLV3_ALERT_BAD_RECORD_MAC ,"sslv3 alert bad record mac"}, 359{SSL_R_SSLV3_ALERT_BAD_RECORD_MAC ,"sslv3 alert bad record mac"},
@@ -315,7 +374,23 @@ static ERR_STRING_DATA SSL_str_reasons[]=
315{SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION,"ssl ctx has no default ssl version"}, 374{SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION,"ssl ctx has no default ssl version"},
316{SSL_R_SSL_HANDSHAKE_FAILURE ,"ssl handshake failure"}, 375{SSL_R_SSL_HANDSHAKE_FAILURE ,"ssl handshake failure"},
317{SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS ,"ssl library has no ciphers"}, 376{SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS ,"ssl library has no ciphers"},
377{SSL_R_SSL_SESSION_ID_CALLBACK_FAILED ,"ssl session id callback failed"},
378{SSL_R_SSL_SESSION_ID_CONFLICT ,"ssl session id conflict"},
379{SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG ,"ssl session id context too long"},
380{SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH ,"ssl session id has bad length"},
318{SSL_R_SSL_SESSION_ID_IS_DIFFERENT ,"ssl session id is different"}, 381{SSL_R_SSL_SESSION_ID_IS_DIFFERENT ,"ssl session id is different"},
382{SSL_R_TLSV1_ALERT_ACCESS_DENIED ,"tlsv1 alert access denied"},
383{SSL_R_TLSV1_ALERT_DECODE_ERROR ,"tlsv1 alert decode error"},
384{SSL_R_TLSV1_ALERT_DECRYPTION_FAILED ,"tlsv1 alert decryption failed"},
385{SSL_R_TLSV1_ALERT_DECRYPT_ERROR ,"tlsv1 alert decrypt error"},
386{SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION ,"tlsv1 alert export restriction"},
387{SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY ,"tlsv1 alert insufficient security"},
388{SSL_R_TLSV1_ALERT_INTERNAL_ERROR ,"tlsv1 alert internal error"},
389{SSL_R_TLSV1_ALERT_NO_RENEGOTIATION ,"tlsv1 alert no renegotiation"},
390{SSL_R_TLSV1_ALERT_PROTOCOL_VERSION ,"tlsv1 alert protocol version"},
391{SSL_R_TLSV1_ALERT_RECORD_OVERFLOW ,"tlsv1 alert record overflow"},
392{SSL_R_TLSV1_ALERT_UNKNOWN_CA ,"tlsv1 alert unknown ca"},
393{SSL_R_TLSV1_ALERT_USER_CANCELLED ,"tlsv1 alert user cancelled"},
319{SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER,"tls client cert req with anon cipher"}, 394{SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER,"tls client cert req with anon cipher"},
320{SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST,"tls peer did not respond with certificate list"}, 395{SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST,"tls peer did not respond with certificate list"},
321{SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG,"tls rsa encrypted value length is wrong"}, 396{SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG,"tls rsa encrypted value length is wrong"},
@@ -330,6 +405,7 @@ static ERR_STRING_DATA SSL_str_reasons[]=
330{SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES ,"unable to load ssl3 sha1 routines"}, 405{SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES ,"unable to load ssl3 sha1 routines"},
331{SSL_R_UNEXPECTED_MESSAGE ,"unexpected message"}, 406{SSL_R_UNEXPECTED_MESSAGE ,"unexpected message"},
332{SSL_R_UNEXPECTED_RECORD ,"unexpected record"}, 407{SSL_R_UNEXPECTED_RECORD ,"unexpected record"},
408{SSL_R_UNINITIALIZED ,"uninitialized"},
333{SSL_R_UNKNOWN_ALERT_TYPE ,"unknown alert type"}, 409{SSL_R_UNKNOWN_ALERT_TYPE ,"unknown alert type"},
334{SSL_R_UNKNOWN_CERTIFICATE_TYPE ,"unknown certificate type"}, 410{SSL_R_UNKNOWN_CERTIFICATE_TYPE ,"unknown certificate type"},
335{SSL_R_UNKNOWN_CIPHER_RETURNED ,"unknown cipher returned"}, 411{SSL_R_UNKNOWN_CIPHER_RETURNED ,"unknown cipher returned"},
@@ -342,6 +418,7 @@ static ERR_STRING_DATA SSL_str_reasons[]=
342{SSL_R_UNKNOWN_STATE ,"unknown state"}, 418{SSL_R_UNKNOWN_STATE ,"unknown state"},
343{SSL_R_UNSUPPORTED_CIPHER ,"unsupported cipher"}, 419{SSL_R_UNSUPPORTED_CIPHER ,"unsupported cipher"},
344{SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM ,"unsupported compression algorithm"}, 420{SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM ,"unsupported compression algorithm"},
421{SSL_R_UNSUPPORTED_OPTION ,"unsupported option"},
345{SSL_R_UNSUPPORTED_PROTOCOL ,"unsupported protocol"}, 422{SSL_R_UNSUPPORTED_PROTOCOL ,"unsupported protocol"},
346{SSL_R_UNSUPPORTED_SSL_VERSION ,"unsupported ssl version"}, 423{SSL_R_UNSUPPORTED_SSL_VERSION ,"unsupported ssl version"},
347{SSL_R_WRITE_BIO_NOT_SET ,"write bio not set"}, 424{SSL_R_WRITE_BIO_NOT_SET ,"write bio not set"},
@@ -353,19 +430,20 @@ static ERR_STRING_DATA SSL_str_reasons[]=
353{SSL_R_WRONG_SSL_VERSION ,"wrong ssl version"}, 430{SSL_R_WRONG_SSL_VERSION ,"wrong ssl version"},
354{SSL_R_WRONG_VERSION_NUMBER ,"wrong version number"}, 431{SSL_R_WRONG_VERSION_NUMBER ,"wrong version number"},
355{SSL_R_X509_LIB ,"x509 lib"}, 432{SSL_R_X509_LIB ,"x509 lib"},
356{0,NULL}, 433{SSL_R_X509_VERIFICATION_SETUP_PROBLEMS ,"x509 verification setup problems"},
434{0,NULL}
357 }; 435 };
358 436
359#endif 437#endif
360 438
361void ERR_load_SSL_strings() 439void ERR_load_SSL_strings(void)
362 { 440 {
363 static int init=1; 441 static int init=1;
364 442
365 if (init); 443 if (init)
366 {; 444 {
367 init=0; 445 init=0;
368#ifndef NO_ERR 446#ifndef OPENSSL_NO_ERR
369 ERR_load_strings(ERR_LIB_SSL,SSL_str_functs); 447 ERR_load_strings(ERR_LIB_SSL,SSL_str_functs);
370 ERR_load_strings(ERR_LIB_SSL,SSL_str_reasons); 448 ERR_load_strings(ERR_LIB_SSL,SSL_str_reasons);
371#endif 449#endif
diff --git a/src/lib/libssl/ssl_err2.c b/src/lib/libssl/ssl_err2.c
index 0b91f7b8d2..ea95a5f983 100644
--- a/src/lib/libssl/ssl_err2.c
+++ b/src/lib/libssl/ssl_err2.c
@@ -57,12 +57,12 @@
57 */ 57 */
58 58
59#include <stdio.h> 59#include <stdio.h>
60#include "err.h" 60#include <openssl/err.h>
61#include "ssl.h" 61#include <openssl/ssl.h>
62 62
63void SSL_load_error_strings() 63void SSL_load_error_strings(void)
64 { 64 {
65#ifndef NO_ERR 65#ifndef OPENSSL_NO_ERR
66 ERR_load_crypto_strings(); 66 ERR_load_crypto_strings();
67 ERR_load_SSL_strings(); 67 ERR_load_SSL_strings();
68#endif 68#endif
diff --git a/src/lib/libssl/ssl_lib.c b/src/lib/libssl/ssl_lib.c
index f562ec6b14..df307a80c5 100644
--- a/src/lib/libssl/ssl_lib.c
+++ b/src/lib/libssl/ssl_lib.c
@@ -1,4 +1,6 @@
1/* ssl/ssl_lib.c */ 1/*! \file ssl/ssl_lib.c
2 * \brief Version independent SSL functions.
3 */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 4/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 5 * All rights reserved.
4 * 6 *
@@ -55,52 +57,126 @@
55 * copied and put under another distribution licence 57 * copied and put under another distribution licence
56 * [including the GNU Public Licence.] 58 * [including the GNU Public Licence.]
57 */ 59 */
60/* ====================================================================
61 * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved.
62 *
63 * Redistribution and use in source and binary forms, with or without
64 * modification, are permitted provided that the following conditions
65 * are met:
66 *
67 * 1. Redistributions of source code must retain the above copyright
68 * notice, this list of conditions and the following disclaimer.
69 *
70 * 2. Redistributions in binary form must reproduce the above copyright
71 * notice, this list of conditions and the following disclaimer in
72 * the documentation and/or other materials provided with the
73 * distribution.
74 *
75 * 3. All advertising materials mentioning features or use of this
76 * software must display the following acknowledgment:
77 * "This product includes software developed by the OpenSSL Project
78 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
79 *
80 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
81 * endorse or promote products derived from this software without
82 * prior written permission. For written permission, please contact
83 * openssl-core@openssl.org.
84 *
85 * 5. Products derived from this software may not be called "OpenSSL"
86 * nor may "OpenSSL" appear in their names without prior written
87 * permission of the OpenSSL Project.
88 *
89 * 6. Redistributions of any form whatsoever must retain the following
90 * acknowledgment:
91 * "This product includes software developed by the OpenSSL Project
92 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
93 *
94 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
95 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
96 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
97 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
98 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
99 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
100 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
101 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
102 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
103 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
104 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
105 * OF THE POSSIBILITY OF SUCH DAMAGE.
106 * ====================================================================
107 *
108 * This product includes cryptographic software written by Eric Young
109 * (eay@cryptsoft.com). This product includes software written by Tim
110 * Hudson (tjh@cryptsoft.com).
111 *
112 */
58 113
114
115#ifdef REF_CHECK
116# include <assert.h>
117#endif
59#include <stdio.h> 118#include <stdio.h>
60#include "objects.h" 119#include <openssl/objects.h>
61#include "lhash.h" 120#include <openssl/lhash.h>
121#include <openssl/x509v3.h>
62#include "ssl_locl.h" 122#include "ssl_locl.h"
123#include "kssl_lcl.h"
63 124
64char *SSL_version_str="SSLeay 0.9.0b 29-Jun-1998"; 125const char *SSL_version_str=OPENSSL_VERSION_TEXT;
65
66static STACK *ssl_meth=NULL;
67static STACK *ssl_ctx_meth=NULL;
68static int ssl_meth_num=0;
69static int ssl_ctx_meth_num=0;
70 126
71SSL3_ENC_METHOD ssl3_undef_enc_method={ 127OPENSSL_GLOBAL SSL3_ENC_METHOD ssl3_undef_enc_method={
72 ssl_undefined_function, 128 /* evil casts, but these functions are only called if there's a library bug */
73 ssl_undefined_function, 129 (int (*)(SSL *,int))ssl_undefined_function,
74 ssl_undefined_function, 130 (int (*)(SSL *, unsigned char *, int))ssl_undefined_function,
75 ssl_undefined_function,
76 ssl_undefined_function,
77 ssl_undefined_function, 131 ssl_undefined_function,
132 (int (*)(SSL *, unsigned char *, unsigned char *, int))ssl_undefined_function,
133 (int (*)(SSL*, int))ssl_undefined_function,
134 (int (*)(SSL *, EVP_MD_CTX *, EVP_MD_CTX *, const char*, int, unsigned char *))ssl_undefined_function
78 }; 135 };
79 136
80void SSL_clear(s) 137int SSL_clear(SSL *s)
81SSL *s;
82 { 138 {
83 int state;
84 139
85 if (s->method == NULL) return; 140 if (s->method == NULL)
141 {
142 SSLerr(SSL_F_SSL_CLEAR,SSL_R_NO_METHOD_SPECIFIED);
143 return(0);
144 }
145
146 if (ssl_clear_bad_session(s))
147 {
148 SSL_SESSION_free(s->session);
149 s->session=NULL;
150 }
86 151
87 s->error=0; 152 s->error=0;
88 s->hit=0; 153 s->hit=0;
154 s->shutdown=0;
89 155
156#if 0 /* Disabled since version 1.10 of this file (early return not
157 * needed because SSL_clear is not called when doing renegotiation) */
90 /* This is set if we are doing dynamic renegotiation so keep 158 /* This is set if we are doing dynamic renegotiation so keep
91 * the old cipher. It is sort of a SSL_clear_lite :-) */ 159 * the old cipher. It is sort of a SSL_clear_lite :-) */
92 if (s->new_session) return; 160 if (s->new_session) return(1);
161#else
162 if (s->new_session)
163 {
164 SSLerr(SSL_F_SSL_CLEAR,ERR_R_INTERNAL_ERROR);
165 return 0;
166 }
167#endif
93 168
94 state=s->state; /* Keep to check if we throw away the session-id */
95 s->type=0; 169 s->type=0;
96 170
171 s->state=SSL_ST_BEFORE|((s->server)?SSL_ST_ACCEPT:SSL_ST_CONNECT);
172
97 s->version=s->method->version; 173 s->version=s->method->version;
174 s->client_version=s->version;
98 s->rwstate=SSL_NOTHING; 175 s->rwstate=SSL_NOTHING;
99 s->state=SSL_ST_BEFORE;
100 s->rstate=SSL_ST_READ_HEADER; 176 s->rstate=SSL_ST_READ_HEADER;
101 s->read_ahead=s->ctx->default_read_ahead; 177#if 0
102 178 s->read_ahead=s->ctx->read_ahead;
103/* s->shutdown=(SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN); */ 179#endif
104 180
105 if (s->init_buf != NULL) 181 if (s->init_buf != NULL)
106 { 182 {
@@ -110,30 +186,34 @@ SSL *s;
110 186
111 ssl_clear_cipher_ctx(s); 187 ssl_clear_cipher_ctx(s);
112 188
113 if (ssl_clear_bad_session(s))
114 {
115 SSL_SESSION_free(s->session);
116 s->session=NULL;
117 }
118
119 s->shutdown=(SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);
120 s->first_packet=0; 189 s->first_packet=0;
121 190
122 s->method->ssl_clear(s); 191#if 1
192 /* Check to see if we were changed into a different method, if
193 * so, revert back if we are not doing session-id reuse. */
194 if (!s->in_handshake && (s->session == NULL) && (s->method != s->ctx->method))
195 {
196 s->method->ssl_free(s);
197 s->method=s->ctx->method;
198 if (!s->method->ssl_new(s))
199 return(0);
200 }
201 else
202#endif
203 s->method->ssl_clear(s);
204 return(1);
123 } 205 }
124 206
125/* Used to change an SSL_CTXs default SSL method type */ 207/** Used to change an SSL_CTXs default SSL method type */
126int SSL_CTX_set_ssl_version(ctx,meth) 208int SSL_CTX_set_ssl_version(SSL_CTX *ctx,SSL_METHOD *meth)
127SSL_CTX *ctx;
128SSL_METHOD *meth;
129 { 209 {
130 STACK *sk; 210 STACK_OF(SSL_CIPHER) *sk;
131 211
132 ctx->method=meth; 212 ctx->method=meth;
133 213
134 sk=ssl_create_cipher_list(ctx->method,&(ctx->cipher_list), 214 sk=ssl_create_cipher_list(ctx->method,&(ctx->cipher_list),
135 &(ctx->cipher_list_by_id),SSL_DEFAULT_CIPHER_LIST); 215 &(ctx->cipher_list_by_id),SSL_DEFAULT_CIPHER_LIST);
136 if ((sk == NULL) || (sk_num(sk) <= 0)) 216 if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= 0))
137 { 217 {
138 SSLerr(SSL_F_SSL_CTX_SET_SSL_VERSION,SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS); 218 SSLerr(SSL_F_SSL_CTX_SET_SSL_VERSION,SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS);
139 return(0); 219 return(0);
@@ -141,8 +221,7 @@ SSL_METHOD *meth;
141 return(1); 221 return(1);
142 } 222 }
143 223
144SSL *SSL_new(ctx) 224SSL *SSL_new(SSL_CTX *ctx)
145SSL_CTX *ctx;
146 { 225 {
147 SSL *s; 226 SSL *s;
148 227
@@ -157,20 +236,50 @@ SSL_CTX *ctx;
157 return(NULL); 236 return(NULL);
158 } 237 }
159 238
160 s=(SSL *)Malloc(sizeof(SSL)); 239 s=(SSL *)OPENSSL_malloc(sizeof(SSL));
161 if (s == NULL) goto err; 240 if (s == NULL) goto err;
162 memset(s,0,sizeof(SSL)); 241 memset(s,0,sizeof(SSL));
163 242
164 if (ctx->default_cert != NULL) 243#ifndef OPENSSL_NO_KRB5
165 { 244 s->kssl_ctx = kssl_ctx_new();
166 CRYPTO_add(&ctx->default_cert->references,1, 245#endif /* OPENSSL_NO_KRB5 */
167 CRYPTO_LOCK_SSL_CERT); 246
168 s->cert=ctx->default_cert; 247 s->options=ctx->options;
248 s->mode=ctx->mode;
249 s->max_cert_list=ctx->max_cert_list;
250
251 if (ctx->cert != NULL)
252 {
253 /* Earlier library versions used to copy the pointer to
254 * the CERT, not its contents; only when setting new
255 * parameters for the per-SSL copy, ssl_cert_new would be
256 * called (and the direct reference to the per-SSL_CTX
257 * settings would be lost, but those still were indirectly
258 * accessed for various purposes, and for that reason they
259 * used to be known as s->ctx->default_cert).
260 * Now we don't look at the SSL_CTX's CERT after having
261 * duplicated it once. */
262
263 s->cert = ssl_cert_dup(ctx->cert);
264 if (s->cert == NULL)
265 goto err;
169 } 266 }
170 else 267 else
171 s->cert=NULL; 268 s->cert=NULL; /* Cannot really happen (see SSL_CTX_new) */
172 s->verify_mode=ctx->default_verify_mode; 269
270 s->read_ahead=ctx->read_ahead;
271 s->msg_callback=ctx->msg_callback;
272 s->msg_callback_arg=ctx->msg_callback_arg;
273 s->verify_mode=ctx->verify_mode;
274 s->verify_depth=ctx->verify_depth;
275 s->sid_ctx_length=ctx->sid_ctx_length;
276 memcpy(&s->sid_ctx,&ctx->sid_ctx,sizeof(s->sid_ctx));
173 s->verify_callback=ctx->default_verify_callback; 277 s->verify_callback=ctx->default_verify_callback;
278 s->generate_session_id=ctx->generate_session_id;
279 s->purpose = ctx->purpose;
280 s->trust = ctx->trust;
281 s->quiet_shutdown=ctx->quiet_shutdown;
282
174 CRYPTO_add(&ctx->references,1,CRYPTO_LOCK_SSL_CTX); 283 CRYPTO_add(&ctx->references,1,CRYPTO_LOCK_SSL_CTX);
175 s->ctx=ctx; 284 s->ctx=ctx;
176 285
@@ -179,30 +288,130 @@ SSL_CTX *ctx;
179 s->method=ctx->method; 288 s->method=ctx->method;
180 289
181 if (!s->method->ssl_new(s)) 290 if (!s->method->ssl_new(s))
182 {
183 SSL_CTX_free(ctx);
184 Free(s);
185 goto err; 291 goto err;
186 }
187 292
188 s->quiet_shutdown=ctx->quiet_shutdown;
189 s->references=1; 293 s->references=1;
190 s->options=ctx->options; 294 s->server=(ctx->method->ssl_accept == ssl_undefined_function)?0:1;
295
191 SSL_clear(s); 296 SSL_clear(s);
192 297
193 CRYPTO_new_ex_data(ssl_meth,(char *)s,&s->ex_data); 298 CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL, s, &s->ex_data);
194 299
195 return(s); 300 return(s);
196err: 301err:
302 if (s != NULL)
303 {
304 if (s->cert != NULL)
305 ssl_cert_free(s->cert);
306 if (s->ctx != NULL)
307 SSL_CTX_free(s->ctx); /* decrement reference count */
308 OPENSSL_free(s);
309 }
197 SSLerr(SSL_F_SSL_NEW,ERR_R_MALLOC_FAILURE); 310 SSLerr(SSL_F_SSL_NEW,ERR_R_MALLOC_FAILURE);
198 return(NULL); 311 return(NULL);
199 } 312 }
200 313
201void SSL_free(s) 314int SSL_CTX_set_session_id_context(SSL_CTX *ctx,const unsigned char *sid_ctx,
202SSL *s; 315 unsigned int sid_ctx_len)
316 {
317 if(sid_ctx_len > SSL_MAX_SID_CTX_LENGTH)
318 {
319 SSLerr(SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT,SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG);
320 return 0;
321 }
322 ctx->sid_ctx_length=sid_ctx_len;
323 memcpy(ctx->sid_ctx,sid_ctx,sid_ctx_len);
324
325 return 1;
326 }
327
328int SSL_set_session_id_context(SSL *ssl,const unsigned char *sid_ctx,
329 unsigned int sid_ctx_len)
330 {
331 if(sid_ctx_len > SSL_MAX_SID_CTX_LENGTH)
332 {
333 SSLerr(SSL_F_SSL_SET_SESSION_ID_CONTEXT,SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG);
334 return 0;
335 }
336 ssl->sid_ctx_length=sid_ctx_len;
337 memcpy(ssl->sid_ctx,sid_ctx,sid_ctx_len);
338
339 return 1;
340 }
341
342int SSL_CTX_set_generate_session_id(SSL_CTX *ctx, GEN_SESSION_CB cb)
343 {
344 CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
345 ctx->generate_session_id = cb;
346 CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
347 return 1;
348 }
349
350int SSL_set_generate_session_id(SSL *ssl, GEN_SESSION_CB cb)
351 {
352 CRYPTO_w_lock(CRYPTO_LOCK_SSL);
353 ssl->generate_session_id = cb;
354 CRYPTO_w_unlock(CRYPTO_LOCK_SSL);
355 return 1;
356 }
357
358int SSL_has_matching_session_id(const SSL *ssl, const unsigned char *id,
359 unsigned int id_len)
360 {
361 /* A quick examination of SSL_SESSION_hash and SSL_SESSION_cmp shows how
362 * we can "construct" a session to give us the desired check - ie. to
363 * find if there's a session in the hash table that would conflict with
364 * any new session built out of this id/id_len and the ssl_version in
365 * use by this SSL. */
366 SSL_SESSION r, *p;
367 r.ssl_version = ssl->version;
368 r.session_id_length = id_len;
369 memcpy(r.session_id, id, id_len);
370 /* NB: SSLv2 always uses a fixed 16-byte session ID, so even if a
371 * callback is calling us to check the uniqueness of a shorter ID, it
372 * must be compared as a padded-out ID because that is what it will be
373 * converted to when the callback has finished choosing it. */
374 if((r.ssl_version == SSL2_VERSION) &&
375 (id_len < SSL2_SSL_SESSION_ID_LENGTH))
376 {
377 memset(r.session_id + id_len, 0,
378 SSL2_SSL_SESSION_ID_LENGTH - id_len);
379 r.session_id_length = SSL2_SSL_SESSION_ID_LENGTH;
380 }
381
382 CRYPTO_r_lock(CRYPTO_LOCK_SSL_CTX);
383 p = (SSL_SESSION *)lh_retrieve(ssl->ctx->sessions, &r);
384 CRYPTO_r_unlock(CRYPTO_LOCK_SSL_CTX);
385 return (p != NULL);
386 }
387
388int SSL_CTX_set_purpose(SSL_CTX *s, int purpose)
389 {
390 return X509_PURPOSE_set(&s->purpose, purpose);
391 }
392
393int SSL_set_purpose(SSL *s, int purpose)
394 {
395 return X509_PURPOSE_set(&s->purpose, purpose);
396 }
397
398int SSL_CTX_set_trust(SSL_CTX *s, int trust)
399 {
400 return X509_TRUST_set(&s->trust, trust);
401 }
402
403int SSL_set_trust(SSL *s, int trust)
404 {
405 return X509_TRUST_set(&s->trust, trust);
406 }
407
408void SSL_free(SSL *s)
203 { 409 {
204 int i; 410 int i;
205 411
412 if(s == NULL)
413 return;
414
206 i=CRYPTO_add(&s->references,-1,CRYPTO_LOCK_SSL); 415 i=CRYPTO_add(&s->references,-1,CRYPTO_LOCK_SSL);
207#ifdef REF_PRINT 416#ifdef REF_PRINT
208 REF_PRINT("SSL",s); 417 REF_PRINT("SSL",s);
@@ -216,7 +425,7 @@ SSL *s;
216 } 425 }
217#endif 426#endif
218 427
219 CRYPTO_free_ex_data(ssl_meth,(char *)s,&s->ex_data); 428 CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL, s, &s->ex_data);
220 429
221 if (s->bbio != NULL) 430 if (s->bbio != NULL)
222 { 431 {
@@ -236,8 +445,8 @@ SSL *s;
236 if (s->init_buf != NULL) BUF_MEM_free(s->init_buf); 445 if (s->init_buf != NULL) BUF_MEM_free(s->init_buf);
237 446
238 /* add extra stuff */ 447 /* add extra stuff */
239 if (s->cipher_list != NULL) sk_free(s->cipher_list); 448 if (s->cipher_list != NULL) sk_SSL_CIPHER_free(s->cipher_list);
240 if (s->cipher_list_by_id != NULL) sk_free(s->cipher_list_by_id); 449 if (s->cipher_list_by_id != NULL) sk_SSL_CIPHER_free(s->cipher_list_by_id);
241 450
242 /* Make the next call work :-) */ 451 /* Make the next call work :-) */
243 if (s->session != NULL) 452 if (s->session != NULL)
@@ -254,17 +463,14 @@ SSL *s;
254 if (s->ctx) SSL_CTX_free(s->ctx); 463 if (s->ctx) SSL_CTX_free(s->ctx);
255 464
256 if (s->client_CA != NULL) 465 if (s->client_CA != NULL)
257 sk_pop_free(s->client_CA,X509_NAME_free); 466 sk_X509_NAME_pop_free(s->client_CA,X509_NAME_free);
258 467
259 if (s->method != NULL) s->method->ssl_free(s); 468 if (s->method != NULL) s->method->ssl_free(s);
260 469
261 Free((char *)s); 470 OPENSSL_free(s);
262 } 471 }
263 472
264void SSL_set_bio(s, rbio,wbio) 473void SSL_set_bio(SSL *s,BIO *rbio,BIO *wbio)
265SSL *s;
266BIO *rbio;
267BIO *wbio;
268 { 474 {
269 /* If the output buffering BIO is still in place, remove it 475 /* If the output buffering BIO is still in place, remove it
270 */ 476 */
@@ -284,16 +490,18 @@ BIO *wbio;
284 s->wbio=wbio; 490 s->wbio=wbio;
285 } 491 }
286 492
287BIO *SSL_get_rbio(s) 493BIO *SSL_get_rbio(SSL *s)
288SSL *s;
289 { return(s->rbio); } 494 { return(s->rbio); }
290 495
291BIO *SSL_get_wbio(s) 496BIO *SSL_get_wbio(SSL *s)
292SSL *s;
293 { return(s->wbio); } 497 { return(s->wbio); }
294 498
295int SSL_get_fd(s) 499int SSL_get_fd(SSL *s)
296SSL *s; 500 {
501 return(SSL_get_rfd(s));
502 }
503
504int SSL_get_rfd(SSL *s)
297 { 505 {
298 int ret= -1; 506 int ret= -1;
299 BIO *b,*r; 507 BIO *b,*r;
@@ -305,10 +513,20 @@ SSL *s;
305 return(ret); 513 return(ret);
306 } 514 }
307 515
308#ifndef NO_SOCK 516int SSL_get_wfd(SSL *s)
309int SSL_set_fd(s, fd) 517 {
310SSL *s; 518 int ret= -1;
311int fd; 519 BIO *b,*r;
520
521 b=SSL_get_wbio(s);
522 r=BIO_find_type(b,BIO_TYPE_DESCRIPTOR);
523 if (r != NULL)
524 BIO_get_fd(r,&ret);
525 return(ret);
526 }
527
528#ifndef OPENSSL_NO_SOCK
529int SSL_set_fd(SSL *s,int fd)
312 { 530 {
313 int ret=0; 531 int ret=0;
314 BIO *bio=NULL; 532 BIO *bio=NULL;
@@ -327,9 +545,7 @@ err:
327 return(ret); 545 return(ret);
328 } 546 }
329 547
330int SSL_set_wfd(s, fd) 548int SSL_set_wfd(SSL *s,int fd)
331SSL *s;
332int fd;
333 { 549 {
334 int ret=0; 550 int ret=0;
335 BIO *bio=NULL; 551 BIO *bio=NULL;
@@ -351,9 +567,7 @@ err:
351 return(ret); 567 return(ret);
352 } 568 }
353 569
354int SSL_set_rfd(s, fd) 570int SSL_set_rfd(SSL *s,int fd)
355SSL *s;
356int fd;
357 { 571 {
358 int ret=0; 572 int ret=0;
359 BIO *bio=NULL; 573 BIO *bio=NULL;
@@ -379,61 +593,104 @@ err:
379 } 593 }
380#endif 594#endif
381 595
382int SSL_get_verify_mode(s) 596
383SSL *s; 597/* return length of latest Finished message we sent, copy to 'buf' */
598size_t SSL_get_finished(SSL *s, void *buf, size_t count)
599 {
600 size_t ret = 0;
601
602 if (s->s3 != NULL)
603 {
604 ret = s->s3->tmp.finish_md_len;
605 if (count > ret)
606 count = ret;
607 memcpy(buf, s->s3->tmp.finish_md, count);
608 }
609 return ret;
610 }
611
612/* return length of latest Finished message we expected, copy to 'buf' */
613size_t SSL_get_peer_finished(SSL *s, void *buf, size_t count)
614 {
615 size_t ret = 0;
616
617 if (s->s3 != NULL)
618 {
619 ret = s->s3->tmp.peer_finish_md_len;
620 if (count > ret)
621 count = ret;
622 memcpy(buf, s->s3->tmp.peer_finish_md, count);
623 }
624 return ret;
625 }
626
627
628int SSL_get_verify_mode(SSL *s)
384 { 629 {
385 return(s->verify_mode); 630 return(s->verify_mode);
386 } 631 }
387 632
388int (*SSL_get_verify_callback(s))() 633int SSL_get_verify_depth(SSL *s)
389SSL *s; 634 {
635 return(s->verify_depth);
636 }
637
638int (*SSL_get_verify_callback(SSL *s))(int,X509_STORE_CTX *)
390 { 639 {
391 return(s->verify_callback); 640 return(s->verify_callback);
392 } 641 }
393 642
394int SSL_CTX_get_verify_mode(ctx) 643int SSL_CTX_get_verify_mode(SSL_CTX *ctx)
395SSL_CTX *ctx;
396 { 644 {
397 return(ctx->default_verify_mode); 645 return(ctx->verify_mode);
398 } 646 }
399 647
400int (*SSL_CTX_get_verify_callback(ctx))() 648int SSL_CTX_get_verify_depth(SSL_CTX *ctx)
401SSL_CTX *ctx; 649 {
650 return(ctx->verify_depth);
651 }
652
653int (*SSL_CTX_get_verify_callback(SSL_CTX *ctx))(int,X509_STORE_CTX *)
402 { 654 {
403 return(ctx->default_verify_callback); 655 return(ctx->default_verify_callback);
404 } 656 }
405 657
406void SSL_set_verify(s, mode, callback) 658void SSL_set_verify(SSL *s,int mode,
407SSL *s; 659 int (*callback)(int ok,X509_STORE_CTX *ctx))
408int mode;
409int (*callback)();
410 { 660 {
411 s->verify_mode=mode; 661 s->verify_mode=mode;
412 if (callback != NULL) 662 if (callback != NULL)
413 s->verify_callback=callback; 663 s->verify_callback=callback;
414 } 664 }
415 665
416void SSL_set_read_ahead(s, yes) 666void SSL_set_verify_depth(SSL *s,int depth)
417SSL *s; 667 {
418int yes; 668 s->verify_depth=depth;
669 }
670
671void SSL_set_read_ahead(SSL *s,int yes)
419 { 672 {
420 s->read_ahead=yes; 673 s->read_ahead=yes;
421 } 674 }
422 675
423int SSL_get_read_ahead(s) 676int SSL_get_read_ahead(SSL *s)
424SSL *s;
425 { 677 {
426 return(s->read_ahead); 678 return(s->read_ahead);
427 } 679 }
428 680
429int SSL_pending(s) 681int SSL_pending(SSL *s)
430SSL *s;
431 { 682 {
683 /* SSL_pending cannot work properly if read-ahead is enabled
684 * (SSL_[CTX_]ctrl(..., SSL_CTRL_SET_READ_AHEAD, 1, NULL)),
685 * and it is impossible to fix since SSL_pending cannot report
686 * errors that may be observed while scanning the new data.
687 * (Note that SSL_pending() is often used as a boolean value,
688 * so we'd better not return -1.)
689 */
432 return(s->method->ssl_pending(s)); 690 return(s->method->ssl_pending(s));
433 } 691 }
434 692
435X509 *SSL_get_peer_certificate(s) 693X509 *SSL_get_peer_certificate(SSL *s)
436SSL *s;
437 { 694 {
438 X509 *r; 695 X509 *r;
439 696
@@ -449,23 +706,24 @@ SSL *s;
449 return(r); 706 return(r);
450 } 707 }
451 708
452STACK *SSL_get_peer_cert_chain(s) 709STACK_OF(X509) *SSL_get_peer_cert_chain(SSL *s)
453SSL *s;
454 { 710 {
455 STACK *r; 711 STACK_OF(X509) *r;
456 712
457 if ((s == NULL) || (s->session == NULL) || (s->session->cert == NULL)) 713 if ((s == NULL) || (s->session == NULL) || (s->session->sess_cert == NULL))
458 r=NULL; 714 r=NULL;
459 else 715 else
460 r=s->session->cert->cert_chain; 716 r=s->session->sess_cert->cert_chain;
461 717
718 /* If we are a client, cert_chain includes the peer's own
719 * certificate; if we are a server, it does not. */
720
462 return(r); 721 return(r);
463 } 722 }
464 723
465/* Now in theory, since the calling process own 't' it should be safe to 724/* Now in theory, since the calling process own 't' it should be safe to
466 * modify. We need to be able to read f without being hassled */ 725 * modify. We need to be able to read f without being hassled */
467void SSL_copy_session_id(t,f) 726void SSL_copy_session_id(SSL *t,SSL *f)
468SSL *t,*f;
469 { 727 {
470 CERT *tmp; 728 CERT *tmp;
471 729
@@ -490,30 +748,29 @@ SSL *t,*f;
490 else 748 else
491 t->cert=NULL; 749 t->cert=NULL;
492 if (tmp != NULL) ssl_cert_free(tmp); 750 if (tmp != NULL) ssl_cert_free(tmp);
751 SSL_set_session_id_context(t,f->sid_ctx,f->sid_ctx_length);
493 } 752 }
494 753
495/* Fix this so it checks all the valid key/cert options */ 754/* Fix this so it checks all the valid key/cert options */
496int SSL_CTX_check_private_key(ctx) 755int SSL_CTX_check_private_key(SSL_CTX *ctx)
497SSL_CTX *ctx;
498 { 756 {
499 if ( (ctx == NULL) || 757 if ( (ctx == NULL) ||
500 (ctx->default_cert == NULL) || 758 (ctx->cert == NULL) ||
501 (ctx->default_cert->key->x509 == NULL)) 759 (ctx->cert->key->x509 == NULL))
502 { 760 {
503 SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED); 761 SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);
504 return(0); 762 return(0);
505 } 763 }
506 if (ctx->default_cert->key->privatekey == NULL) 764 if (ctx->cert->key->privatekey == NULL)
507 { 765 {
508 SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,SSL_R_NO_PRIVATE_KEY_ASSIGNED); 766 SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,SSL_R_NO_PRIVATE_KEY_ASSIGNED);
509 return(0); 767 return(0);
510 } 768 }
511 return(X509_check_private_key(ctx->default_cert->key->x509, ctx->default_cert->key->privatekey)); 769 return(X509_check_private_key(ctx->cert->key->x509, ctx->cert->key->privatekey));
512 } 770 }
513 771
514/* Fix this function so that it takes an optional type parameter */ 772/* Fix this function so that it takes an optional type parameter */
515int SSL_check_private_key(ssl) 773int SSL_check_private_key(SSL *ssl)
516SSL *ssl;
517 { 774 {
518 if (ssl == NULL) 775 if (ssl == NULL)
519 { 776 {
@@ -521,7 +778,10 @@ SSL *ssl;
521 return(0); 778 return(0);
522 } 779 }
523 if (ssl->cert == NULL) 780 if (ssl->cert == NULL)
524 return(SSL_CTX_check_private_key(ssl->ctx)); 781 {
782 SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);
783 return 0;
784 }
525 if (ssl->cert->key->x509 == NULL) 785 if (ssl->cert->key->x509 == NULL)
526 { 786 {
527 SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED); 787 SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);
@@ -536,29 +796,37 @@ SSL *ssl;
536 ssl->cert->key->privatekey)); 796 ssl->cert->key->privatekey));
537 } 797 }
538 798
539int SSL_accept(s) 799int SSL_accept(SSL *s)
540SSL *s;
541 { 800 {
801 if (s->handshake_func == 0)
802 /* Not properly initialized yet */
803 SSL_set_accept_state(s);
804
542 return(s->method->ssl_accept(s)); 805 return(s->method->ssl_accept(s));
543 } 806 }
544 807
545int SSL_connect(s) 808int SSL_connect(SSL *s)
546SSL *s;
547 { 809 {
810 if (s->handshake_func == 0)
811 /* Not properly initialized yet */
812 SSL_set_connect_state(s);
813
548 return(s->method->ssl_connect(s)); 814 return(s->method->ssl_connect(s));
549 } 815 }
550 816
551long SSL_get_default_timeout(s) 817long SSL_get_default_timeout(SSL *s)
552SSL *s;
553 { 818 {
554 return(s->method->get_timeout()); 819 return(s->method->get_timeout());
555 } 820 }
556 821
557int SSL_read(s,buf,num) 822int SSL_read(SSL *s,void *buf,int num)
558SSL *s;
559char *buf;
560int num;
561 { 823 {
824 if (s->handshake_func == 0)
825 {
826 SSLerr(SSL_F_SSL_READ, SSL_R_UNINITIALIZED);
827 return -1;
828 }
829
562 if (s->shutdown & SSL_RECEIVED_SHUTDOWN) 830 if (s->shutdown & SSL_RECEIVED_SHUTDOWN)
563 { 831 {
564 s->rwstate=SSL_NOTHING; 832 s->rwstate=SSL_NOTHING;
@@ -567,11 +835,14 @@ int num;
567 return(s->method->ssl_read(s,buf,num)); 835 return(s->method->ssl_read(s,buf,num));
568 } 836 }
569 837
570int SSL_peek(s,buf,num) 838int SSL_peek(SSL *s,void *buf,int num)
571SSL *s;
572char *buf;
573int num;
574 { 839 {
840 if (s->handshake_func == 0)
841 {
842 SSLerr(SSL_F_SSL_READ, SSL_R_UNINITIALIZED);
843 return -1;
844 }
845
575 if (s->shutdown & SSL_RECEIVED_SHUTDOWN) 846 if (s->shutdown & SSL_RECEIVED_SHUTDOWN)
576 { 847 {
577 return(0); 848 return(0);
@@ -579,11 +850,14 @@ int num;
579 return(s->method->ssl_peek(s,buf,num)); 850 return(s->method->ssl_peek(s,buf,num));
580 } 851 }
581 852
582int SSL_write(s,buf,num) 853int SSL_write(SSL *s,const void *buf,int num)
583SSL *s;
584char *buf;
585int num;
586 { 854 {
855 if (s->handshake_func == 0)
856 {
857 SSLerr(SSL_F_SSL_WRITE, SSL_R_UNINITIALIZED);
858 return -1;
859 }
860
587 if (s->shutdown & SSL_SENT_SHUTDOWN) 861 if (s->shutdown & SSL_SENT_SHUTDOWN)
588 { 862 {
589 s->rwstate=SSL_NOTHING; 863 s->rwstate=SSL_NOTHING;
@@ -593,42 +867,176 @@ int num;
593 return(s->method->ssl_write(s,buf,num)); 867 return(s->method->ssl_write(s,buf,num));
594 } 868 }
595 869
596int SSL_shutdown(s) 870int SSL_shutdown(SSL *s)
597SSL *s;
598 { 871 {
872 /* Note that this function behaves differently from what one might
873 * expect. Return values are 0 for no success (yet),
874 * 1 for success; but calling it once is usually not enough,
875 * even if blocking I/O is used (see ssl3_shutdown).
876 */
877
878 if (s->handshake_func == 0)
879 {
880 SSLerr(SSL_F_SSL_SHUTDOWN, SSL_R_UNINITIALIZED);
881 return -1;
882 }
883
599 if ((s != NULL) && !SSL_in_init(s)) 884 if ((s != NULL) && !SSL_in_init(s))
600 return(s->method->ssl_shutdown(s)); 885 return(s->method->ssl_shutdown(s));
601 else 886 else
602 return(1); 887 return(1);
603 } 888 }
604 889
605int SSL_renegotiate(s) 890int SSL_renegotiate(SSL *s)
606SSL *s;
607 { 891 {
608 s->new_session=1; 892 if (s->new_session == 0)
893 {
894 s->new_session=1;
895 }
609 return(s->method->ssl_renegotiate(s)); 896 return(s->method->ssl_renegotiate(s));
610 } 897 }
611 898
612long SSL_ctrl(s,cmd,larg,parg) 899int SSL_renegotiate_pending(SSL *s)
613SSL *s; 900 {
614int cmd; 901 /* becomes true when negotiation is requested;
615long larg; 902 * false again once a handshake has finished */
616char *parg; 903 return (s->new_session != 0);
904 }
905
906long SSL_ctrl(SSL *s,int cmd,long larg,void *parg)
617 { 907 {
618 return(s->method->ssl_ctrl(s,cmd,larg,parg)); 908 long l;
909
910 switch (cmd)
911 {
912 case SSL_CTRL_GET_READ_AHEAD:
913 return(s->read_ahead);
914 case SSL_CTRL_SET_READ_AHEAD:
915 l=s->read_ahead;
916 s->read_ahead=larg;
917 return(l);
918
919 case SSL_CTRL_SET_MSG_CALLBACK_ARG:
920 s->msg_callback_arg = parg;
921 return 1;
922
923 case SSL_CTRL_OPTIONS:
924 return(s->options|=larg);
925 case SSL_CTRL_MODE:
926 return(s->mode|=larg);
927 case SSL_CTRL_GET_MAX_CERT_LIST:
928 return(s->max_cert_list);
929 case SSL_CTRL_SET_MAX_CERT_LIST:
930 l=s->max_cert_list;
931 s->max_cert_list=larg;
932 return(l);
933 default:
934 return(s->method->ssl_ctrl(s,cmd,larg,parg));
935 }
936 }
937
938long SSL_callback_ctrl(SSL *s, int cmd, void (*fp)())
939 {
940 switch(cmd)
941 {
942 case SSL_CTRL_SET_MSG_CALLBACK:
943 s->msg_callback = (void (*)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg))(fp);
944 return 1;
945
946 default:
947 return(s->method->ssl_callback_ctrl(s,cmd,fp));
948 }
619 } 949 }
620 950
621long SSL_CTX_ctrl(ctx,cmd,larg,parg) 951struct lhash_st *SSL_CTX_sessions(SSL_CTX *ctx)
622SSL_CTX *ctx;
623int cmd;
624long larg;
625char *parg;
626 { 952 {
627 return(ctx->method->ssl_ctx_ctrl(ctx,cmd,larg,parg)); 953 return ctx->sessions;
628 } 954 }
629 955
630int ssl_cipher_id_cmp(a,b) 956long SSL_CTX_ctrl(SSL_CTX *ctx,int cmd,long larg,void *parg)
631SSL_CIPHER *a,*b; 957 {
958 long l;
959
960 switch (cmd)
961 {
962 case SSL_CTRL_GET_READ_AHEAD:
963 return(ctx->read_ahead);
964 case SSL_CTRL_SET_READ_AHEAD:
965 l=ctx->read_ahead;
966 ctx->read_ahead=larg;
967 return(l);
968
969 case SSL_CTRL_SET_MSG_CALLBACK_ARG:
970 ctx->msg_callback_arg = parg;
971 return 1;
972
973 case SSL_CTRL_GET_MAX_CERT_LIST:
974 return(ctx->max_cert_list);
975 case SSL_CTRL_SET_MAX_CERT_LIST:
976 l=ctx->max_cert_list;
977 ctx->max_cert_list=larg;
978 return(l);
979
980 case SSL_CTRL_SET_SESS_CACHE_SIZE:
981 l=ctx->session_cache_size;
982 ctx->session_cache_size=larg;
983 return(l);
984 case SSL_CTRL_GET_SESS_CACHE_SIZE:
985 return(ctx->session_cache_size);
986 case SSL_CTRL_SET_SESS_CACHE_MODE:
987 l=ctx->session_cache_mode;
988 ctx->session_cache_mode=larg;
989 return(l);
990 case SSL_CTRL_GET_SESS_CACHE_MODE:
991 return(ctx->session_cache_mode);
992
993 case SSL_CTRL_SESS_NUMBER:
994 return(ctx->sessions->num_items);
995 case SSL_CTRL_SESS_CONNECT:
996 return(ctx->stats.sess_connect);
997 case SSL_CTRL_SESS_CONNECT_GOOD:
998 return(ctx->stats.sess_connect_good);
999 case SSL_CTRL_SESS_CONNECT_RENEGOTIATE:
1000 return(ctx->stats.sess_connect_renegotiate);
1001 case SSL_CTRL_SESS_ACCEPT:
1002 return(ctx->stats.sess_accept);
1003 case SSL_CTRL_SESS_ACCEPT_GOOD:
1004 return(ctx->stats.sess_accept_good);
1005 case SSL_CTRL_SESS_ACCEPT_RENEGOTIATE:
1006 return(ctx->stats.sess_accept_renegotiate);
1007 case SSL_CTRL_SESS_HIT:
1008 return(ctx->stats.sess_hit);
1009 case SSL_CTRL_SESS_CB_HIT:
1010 return(ctx->stats.sess_cb_hit);
1011 case SSL_CTRL_SESS_MISSES:
1012 return(ctx->stats.sess_miss);
1013 case SSL_CTRL_SESS_TIMEOUTS:
1014 return(ctx->stats.sess_timeout);
1015 case SSL_CTRL_SESS_CACHE_FULL:
1016 return(ctx->stats.sess_cache_full);
1017 case SSL_CTRL_OPTIONS:
1018 return(ctx->options|=larg);
1019 case SSL_CTRL_MODE:
1020 return(ctx->mode|=larg);
1021 default:
1022 return(ctx->method->ssl_ctx_ctrl(ctx,cmd,larg,parg));
1023 }
1024 }
1025
1026long SSL_CTX_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)())
1027 {
1028 switch(cmd)
1029 {
1030 case SSL_CTRL_SET_MSG_CALLBACK:
1031 ctx->msg_callback = (void (*)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg))(fp);
1032 return 1;
1033
1034 default:
1035 return(ctx->method->ssl_ctx_callback_ctrl(ctx,cmd,fp));
1036 }
1037 }
1038
1039int ssl_cipher_id_cmp(const SSL_CIPHER *a, const SSL_CIPHER *b)
632 { 1040 {
633 long l; 1041 long l;
634 1042
@@ -639,8 +1047,8 @@ SSL_CIPHER *a,*b;
639 return((l > 0)?1:-1); 1047 return((l > 0)?1:-1);
640 } 1048 }
641 1049
642int ssl_cipher_ptr_id_cmp(ap,bp) 1050int ssl_cipher_ptr_id_cmp(const SSL_CIPHER * const *ap,
643SSL_CIPHER **ap,**bp; 1051 const SSL_CIPHER * const *bp)
644 { 1052 {
645 long l; 1053 long l;
646 1054
@@ -651,10 +1059,9 @@ SSL_CIPHER **ap,**bp;
651 return((l > 0)?1:-1); 1059 return((l > 0)?1:-1);
652 } 1060 }
653 1061
654/* return a STACK of the ciphers available for the SSL and in order of 1062/** return a STACK of the ciphers available for the SSL and in order of
655 * preference */ 1063 * preference */
656STACK *SSL_get_ciphers(s) 1064STACK_OF(SSL_CIPHER) *SSL_get_ciphers(SSL *s)
657SSL *s;
658 { 1065 {
659 if ((s != NULL) && (s->cipher_list != NULL)) 1066 if ((s != NULL) && (s->cipher_list != NULL))
660 { 1067 {
@@ -668,10 +1075,9 @@ SSL *s;
668 return(NULL); 1075 return(NULL);
669 } 1076 }
670 1077
671/* return a STACK of the ciphers available for the SSL and in order of 1078/** return a STACK of the ciphers available for the SSL and in order of
672 * algorithm id */ 1079 * algorithm id */
673STACK *ssl_get_ciphers_by_id(s) 1080STACK_OF(SSL_CIPHER) *ssl_get_ciphers_by_id(SSL *s)
674SSL *s;
675 { 1081 {
676 if ((s != NULL) && (s->cipher_list_by_id != NULL)) 1082 if ((s != NULL) && (s->cipher_list_by_id != NULL))
677 { 1083 {
@@ -685,29 +1091,25 @@ SSL *s;
685 return(NULL); 1091 return(NULL);
686 } 1092 }
687 1093
688/* The old interface to get the same thing as SSL_get_ciphers() */ 1094/** The old interface to get the same thing as SSL_get_ciphers() */
689char *SSL_get_cipher_list(s,n) 1095const char *SSL_get_cipher_list(SSL *s,int n)
690SSL *s;
691int n;
692 { 1096 {
693 SSL_CIPHER *c; 1097 SSL_CIPHER *c;
694 STACK *sk; 1098 STACK_OF(SSL_CIPHER) *sk;
695 1099
696 if (s == NULL) return(NULL); 1100 if (s == NULL) return(NULL);
697 sk=SSL_get_ciphers(s); 1101 sk=SSL_get_ciphers(s);
698 if ((sk == NULL) || (sk_num(sk) <= n)) 1102 if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= n))
699 return(NULL); 1103 return(NULL);
700 c=(SSL_CIPHER *)sk_value(sk,n); 1104 c=sk_SSL_CIPHER_value(sk,n);
701 if (c == NULL) return(NULL); 1105 if (c == NULL) return(NULL);
702 return(c->name); 1106 return(c->name);
703 } 1107 }
704 1108
705/* specify the ciphers to be used by defaut by the SSL_CTX */ 1109/** specify the ciphers to be used by default by the SSL_CTX */
706int SSL_CTX_set_cipher_list(ctx,str) 1110int SSL_CTX_set_cipher_list(SSL_CTX *ctx, const char *str)
707SSL_CTX *ctx;
708char *str;
709 { 1111 {
710 STACK *sk; 1112 STACK_OF(SSL_CIPHER) *sk;
711 1113
712 sk=ssl_create_cipher_list(ctx->method,&ctx->cipher_list, 1114 sk=ssl_create_cipher_list(ctx->method,&ctx->cipher_list,
713 &ctx->cipher_list_by_id,str); 1115 &ctx->cipher_list_by_id,str);
@@ -715,12 +1117,10 @@ char *str;
715 return((sk == NULL)?0:1); 1117 return((sk == NULL)?0:1);
716 } 1118 }
717 1119
718/* specify the ciphers to be used by the SSL */ 1120/** specify the ciphers to be used by the SSL */
719int SSL_set_cipher_list(s, str) 1121int SSL_set_cipher_list(SSL *s,const char *str)
720SSL *s;
721char *str;
722 { 1122 {
723 STACK *sk; 1123 STACK_OF(SSL_CIPHER) *sk;
724 1124
725 sk=ssl_create_cipher_list(s->ctx->method,&s->cipher_list, 1125 sk=ssl_create_cipher_list(s->ctx->method,&s->cipher_list,
726 &s->cipher_list_by_id,str); 1126 &s->cipher_list_by_id,str);
@@ -729,13 +1129,11 @@ char *str;
729 } 1129 }
730 1130
731/* works well for SSLv2, not so good for SSLv3 */ 1131/* works well for SSLv2, not so good for SSLv3 */
732char *SSL_get_shared_ciphers(s,buf,len) 1132char *SSL_get_shared_ciphers(SSL *s,char *buf,int len)
733SSL *s;
734char *buf;
735int len;
736 { 1133 {
737 char *p,*cp; 1134 char *p;
738 STACK *sk; 1135 const char *cp;
1136 STACK_OF(SSL_CIPHER) *sk;
739 SSL_CIPHER *c; 1137 SSL_CIPHER *c;
740 int i; 1138 int i;
741 1139
@@ -745,11 +1143,11 @@ int len;
745 1143
746 p=buf; 1144 p=buf;
747 sk=s->session->ciphers; 1145 sk=s->session->ciphers;
748 for (i=0; i<sk_num(sk); i++) 1146 for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
749 { 1147 {
750 /* Decrement for either the ':' or a '\0' */ 1148 /* Decrement for either the ':' or a '\0' */
751 len--; 1149 len--;
752 c=(SSL_CIPHER *)sk_value(sk,i); 1150 c=sk_SSL_CIPHER_value(sk,i);
753 for (cp=c->name; *cp; ) 1151 for (cp=c->name; *cp; )
754 { 1152 {
755 if (len-- == 0) 1153 if (len-- == 0)
@@ -766,35 +1164,36 @@ int len;
766 return(buf); 1164 return(buf);
767 } 1165 }
768 1166
769int ssl_cipher_list_to_bytes(s,sk,p) 1167int ssl_cipher_list_to_bytes(SSL *s,STACK_OF(SSL_CIPHER) *sk,unsigned char *p)
770SSL *s;
771STACK *sk;
772unsigned char *p;
773 { 1168 {
774 int i,j=0; 1169 int i,j=0;
775 SSL_CIPHER *c; 1170 SSL_CIPHER *c;
776 unsigned char *q; 1171 unsigned char *q;
1172#ifndef OPENSSL_NO_KRB5
1173 int nokrb5 = !kssl_tgt_is_available(s->kssl_ctx);
1174#endif /* OPENSSL_NO_KRB5 */
777 1175
778 if (sk == NULL) return(0); 1176 if (sk == NULL) return(0);
779 q=p; 1177 q=p;
780 1178
781 for (i=0; i<sk_num(sk); i++) 1179 for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
782 { 1180 {
783 c=(SSL_CIPHER *)sk_value(sk,i); 1181 c=sk_SSL_CIPHER_value(sk,i);
1182#ifndef OPENSSL_NO_KRB5
1183 if ((c->algorithms & SSL_KRB5) && nokrb5)
1184 continue;
1185#endif /* OPENSSL_NO_KRB5 */
784 j=ssl_put_cipher_by_char(s,c,p); 1186 j=ssl_put_cipher_by_char(s,c,p);
785 p+=j; 1187 p+=j;
786 } 1188 }
787 return(p-q); 1189 return(p-q);
788 } 1190 }
789 1191
790STACK *ssl_bytes_to_cipher_list(s,p,num,skp) 1192STACK_OF(SSL_CIPHER) *ssl_bytes_to_cipher_list(SSL *s,unsigned char *p,int num,
791SSL *s; 1193 STACK_OF(SSL_CIPHER) **skp)
792unsigned char *p;
793int num;
794STACK **skp;
795 { 1194 {
796 SSL_CIPHER *c; 1195 SSL_CIPHER *c;
797 STACK *sk; 1196 STACK_OF(SSL_CIPHER) *sk;
798 int i,n; 1197 int i,n;
799 1198
800 n=ssl_put_cipher_by_char(s,NULL,NULL); 1199 n=ssl_put_cipher_by_char(s,NULL,NULL);
@@ -804,11 +1203,11 @@ STACK **skp;
804 return(NULL); 1203 return(NULL);
805 } 1204 }
806 if ((skp == NULL) || (*skp == NULL)) 1205 if ((skp == NULL) || (*skp == NULL))
807 sk=sk_new(NULL); /* change perhaps later */ 1206 sk=sk_SSL_CIPHER_new_null(); /* change perhaps later */
808 else 1207 else
809 { 1208 {
810 sk= *skp; 1209 sk= *skp;
811 sk_zero(sk); 1210 sk_SSL_CIPHER_zero(sk);
812 } 1211 }
813 1212
814 for (i=0; i<num; i+=n) 1213 for (i=0; i<num; i+=n)
@@ -817,7 +1216,7 @@ STACK **skp;
817 p+=n; 1216 p+=n;
818 if (c != NULL) 1217 if (c != NULL)
819 { 1218 {
820 if (!sk_push(sk,(char *)c)) 1219 if (!sk_SSL_CIPHER_push(sk,c))
821 { 1220 {
822 SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST,ERR_R_MALLOC_FAILURE); 1221 SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST,ERR_R_MALLOC_FAILURE);
823 goto err; 1222 goto err;
@@ -830,23 +1229,28 @@ STACK **skp;
830 return(sk); 1229 return(sk);
831err: 1230err:
832 if ((skp == NULL) || (*skp == NULL)) 1231 if ((skp == NULL) || (*skp == NULL))
833 sk_free(sk); 1232 sk_SSL_CIPHER_free(sk);
834 return(NULL); 1233 return(NULL);
835 } 1234 }
836 1235
837unsigned long SSL_SESSION_hash(a) 1236unsigned long SSL_SESSION_hash(SSL_SESSION *a)
838SSL_SESSION *a;
839 { 1237 {
840 unsigned long l; 1238 unsigned long l;
841 1239
842 l= (a->session_id[0] )|(a->session_id[1]<< 8L)| 1240 l=(unsigned long)
843 (a->session_id[2]<<16L)|(a->session_id[3]<<24L); 1241 ((unsigned int) a->session_id[0] )|
1242 ((unsigned int) a->session_id[1]<< 8L)|
1243 ((unsigned long)a->session_id[2]<<16L)|
1244 ((unsigned long)a->session_id[3]<<24L);
844 return(l); 1245 return(l);
845 } 1246 }
846 1247
847int SSL_SESSION_cmp(a, b) 1248/* NB: If this function (or indeed the hash function which uses a sort of
848SSL_SESSION *a; 1249 * coarser function than this one) is changed, ensure
849SSL_SESSION *b; 1250 * SSL_CTX_has_matching_session_id() is checked accordingly. It relies on being
1251 * able to construct an SSL_SESSION that will collide with any existing session
1252 * with a matching session ID. */
1253int SSL_SESSION_cmp(SSL_SESSION *a,SSL_SESSION *b)
850 { 1254 {
851 if (a->ssl_version != b->ssl_version) 1255 if (a->ssl_version != b->ssl_version)
852 return(1); 1256 return(1);
@@ -855,17 +1259,29 @@ SSL_SESSION *b;
855 return(memcmp(a->session_id,b->session_id,a->session_id_length)); 1259 return(memcmp(a->session_id,b->session_id,a->session_id_length));
856 } 1260 }
857 1261
858SSL_CTX *SSL_CTX_new(meth) 1262/* These wrapper functions should remain rather than redeclaring
859SSL_METHOD *meth; 1263 * SSL_SESSION_hash and SSL_SESSION_cmp for void* types and casting each
1264 * variable. The reason is that the functions aren't static, they're exposed via
1265 * ssl.h. */
1266static IMPLEMENT_LHASH_HASH_FN(SSL_SESSION_hash, SSL_SESSION *)
1267static IMPLEMENT_LHASH_COMP_FN(SSL_SESSION_cmp, SSL_SESSION *)
1268
1269SSL_CTX *SSL_CTX_new(SSL_METHOD *meth)
860 { 1270 {
861 SSL_CTX *ret; 1271 SSL_CTX *ret=NULL;
862 1272
863 if (meth == NULL) 1273 if (meth == NULL)
864 { 1274 {
865 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_NULL_SSL_METHOD_PASSED); 1275 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_NULL_SSL_METHOD_PASSED);
866 return(NULL); 1276 return(NULL);
867 } 1277 }
868 ret=(SSL_CTX *)Malloc(sizeof(SSL_CTX)); 1278
1279 if (SSL_get_ex_data_X509_STORE_CTX_idx() < 0)
1280 {
1281 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_X509_VERIFICATION_SETUP_PROBLEMS);
1282 goto err;
1283 }
1284 ret=(SSL_CTX *)OPENSSL_malloc(sizeof(SSL_CTX));
869 if (ret == NULL) 1285 if (ret == NULL)
870 goto err; 1286 goto err;
871 1287
@@ -882,21 +1298,12 @@ SSL_METHOD *meth;
882 /* We take the system default */ 1298 /* We take the system default */
883 ret->session_timeout=meth->get_timeout(); 1299 ret->session_timeout=meth->get_timeout();
884 1300
885 ret->new_session_cb=NULL; 1301 ret->new_session_cb=0;
886 ret->remove_session_cb=NULL; 1302 ret->remove_session_cb=0;
887 ret->get_session_cb=NULL; 1303 ret->get_session_cb=0;
888 1304 ret->generate_session_id=0;
889 ret->sess_connect=0; 1305
890 ret->sess_connect_good=0; 1306 memset((char *)&ret->stats,0,sizeof(ret->stats));
891 ret->sess_accept=0;
892 ret->sess_accept_renegotiate=0;
893 ret->sess_connect_renegotiate=0;
894 ret->sess_accept_good=0;
895 ret->sess_miss=0;
896 ret->sess_timeout=0;
897 ret->sess_cache_full=0;
898 ret->sess_hit=0;
899 ret->sess_cb_hit=0;
900 1307
901 ret->references=1; 1308 ret->references=1;
902 ret->quiet_shutdown=0; 1309 ret->quiet_shutdown=0;
@@ -909,19 +1316,26 @@ SSL_METHOD *meth;
909 1316
910 ret->info_callback=NULL; 1317 ret->info_callback=NULL;
911 1318
912 ret->app_verify_callback=NULL; 1319 ret->app_verify_callback=0;
913 ret->app_verify_arg=NULL; 1320 ret->app_verify_arg=NULL;
914 1321
915 ret->default_read_ahead=0; 1322 ret->max_cert_list=SSL_MAX_CERT_LIST_DEFAULT;
916 ret->default_verify_mode=SSL_VERIFY_NONE; 1323 ret->read_ahead=0;
1324 ret->msg_callback=0;
1325 ret->msg_callback_arg=NULL;
1326 ret->verify_mode=SSL_VERIFY_NONE;
1327 ret->verify_depth=-1; /* Don't impose a limit (but x509_lu.c does) */
1328 ret->sid_ctx_length=0;
917 ret->default_verify_callback=NULL; 1329 ret->default_verify_callback=NULL;
918 if ((ret->default_cert=ssl_cert_new()) == NULL) 1330 if ((ret->cert=ssl_cert_new()) == NULL)
919 goto err; 1331 goto err;
920 1332
921 ret->default_passwd_callback=NULL; 1333 ret->default_passwd_callback=0;
922 ret->client_cert_cb=NULL; 1334 ret->default_passwd_callback_userdata=NULL;
1335 ret->client_cert_cb=0;
923 1336
924 ret->sessions=lh_new(SSL_SESSION_hash,SSL_SESSION_cmp); 1337 ret->sessions=lh_new(LHASH_HASH_FN(SSL_SESSION_hash),
1338 LHASH_COMP_FN(SSL_SESSION_cmp));
925 if (ret->sessions == NULL) goto err; 1339 if (ret->sessions == NULL) goto err;
926 ret->cert_store=X509_STORE_new(); 1340 ret->cert_store=X509_STORE_new();
927 if (ret->cert_store == NULL) goto err; 1341 if (ret->cert_store == NULL) goto err;
@@ -929,7 +1343,8 @@ SSL_METHOD *meth;
929 ssl_create_cipher_list(ret->method, 1343 ssl_create_cipher_list(ret->method,
930 &ret->cipher_list,&ret->cipher_list_by_id, 1344 &ret->cipher_list,&ret->cipher_list_by_id,
931 SSL_DEFAULT_CIPHER_LIST); 1345 SSL_DEFAULT_CIPHER_LIST);
932 if ((ret->cipher_list == NULL) || (sk_num(ret->cipher_list) <= 0)) 1346 if (ret->cipher_list == NULL
1347 || sk_SSL_CIPHER_num(ret->cipher_list) <= 0)
933 { 1348 {
934 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_LIBRARY_HAS_NO_CIPHERS); 1349 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_LIBRARY_HAS_NO_CIPHERS);
935 goto err2; 1350 goto err2;
@@ -951,10 +1366,13 @@ SSL_METHOD *meth;
951 goto err2; 1366 goto err2;
952 } 1367 }
953 1368
954 if ((ret->client_CA=sk_new_null()) == NULL) 1369 if ((ret->client_CA=sk_X509_NAME_new_null()) == NULL)
955 goto err; 1370 goto err;
956 1371
957 CRYPTO_new_ex_data(ssl_ctx_meth,(char *)ret,&ret->ex_data); 1372 CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_CTX, ret, &ret->ex_data);
1373
1374 ret->extra_certs=NULL;
1375 ret->comp_methods=SSL_COMP_get_compression_methods();
958 1376
959 return(ret); 1377 return(ret);
960err: 1378err:
@@ -964,8 +1382,12 @@ err2:
964 return(NULL); 1382 return(NULL);
965 } 1383 }
966 1384
967void SSL_CTX_free(a) 1385#if 0
968SSL_CTX *a; 1386static void SSL_COMP_free(SSL_COMP *comp)
1387 { OPENSSL_free(comp); }
1388#endif
1389
1390void SSL_CTX_free(SSL_CTX *a)
969 { 1391 {
970 int i; 1392 int i;
971 1393
@@ -983,7 +1405,7 @@ SSL_CTX *a;
983 abort(); /* ok */ 1405 abort(); /* ok */
984 } 1406 }
985#endif 1407#endif
986 CRYPTO_free_ex_data(ssl_ctx_meth,(char *)a,&a->ex_data); 1408 CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL_CTX, a, &a->ex_data);
987 1409
988 if (a->sessions != NULL) 1410 if (a->sessions != NULL)
989 { 1411 {
@@ -993,96 +1415,105 @@ SSL_CTX *a;
993 if (a->cert_store != NULL) 1415 if (a->cert_store != NULL)
994 X509_STORE_free(a->cert_store); 1416 X509_STORE_free(a->cert_store);
995 if (a->cipher_list != NULL) 1417 if (a->cipher_list != NULL)
996 sk_free(a->cipher_list); 1418 sk_SSL_CIPHER_free(a->cipher_list);
997 if (a->cipher_list_by_id != NULL) 1419 if (a->cipher_list_by_id != NULL)
998 sk_free(a->cipher_list_by_id); 1420 sk_SSL_CIPHER_free(a->cipher_list_by_id);
999 if (a->default_cert != NULL) 1421 if (a->cert != NULL)
1000 ssl_cert_free(a->default_cert); 1422 ssl_cert_free(a->cert);
1001 if (a->client_CA != NULL) 1423 if (a->client_CA != NULL)
1002 sk_pop_free(a->client_CA,X509_NAME_free); 1424 sk_X509_NAME_pop_free(a->client_CA,X509_NAME_free);
1003 Free((char *)a); 1425 if (a->extra_certs != NULL)
1426 sk_X509_pop_free(a->extra_certs,X509_free);
1427#if 0 /* This should never be done, since it removes a global database */
1428 if (a->comp_methods != NULL)
1429 sk_SSL_COMP_pop_free(a->comp_methods,SSL_COMP_free);
1430#else
1431 a->comp_methods = NULL;
1432#endif
1433 OPENSSL_free(a);
1004 } 1434 }
1005 1435
1006void SSL_CTX_set_default_passwd_cb(ctx,cb) 1436void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb)
1007SSL_CTX *ctx;
1008int (*cb)();
1009 { 1437 {
1010 ctx->default_passwd_callback=cb; 1438 ctx->default_passwd_callback=cb;
1011 } 1439 }
1012 1440
1013void SSL_CTX_set_cert_verify_cb(ctx,cb,arg) 1441void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx,void *u)
1014SSL_CTX *ctx; 1442 {
1015int (*cb)(); 1443 ctx->default_passwd_callback_userdata=u;
1016char *arg; 1444 }
1445
1446void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, int (*cb)(X509_STORE_CTX *,void *), void *arg)
1017 { 1447 {
1018 ctx->app_verify_callback=cb; 1448 ctx->app_verify_callback=cb;
1019 ctx->app_verify_arg=arg; 1449 ctx->app_verify_arg=arg;
1020 } 1450 }
1021 1451
1022void SSL_CTX_set_verify(ctx,mode,cb) 1452void SSL_CTX_set_verify(SSL_CTX *ctx,int mode,int (*cb)(int, X509_STORE_CTX *))
1023SSL_CTX *ctx;
1024int mode;
1025int (*cb)();
1026 { 1453 {
1027 ctx->default_verify_mode=mode; 1454 ctx->verify_mode=mode;
1028 ctx->default_verify_callback=cb; 1455 ctx->default_verify_callback=cb;
1029 /* This needs cleaning up EAY EAY EAY */
1030 X509_STORE_set_verify_cb_func(ctx->cert_store,cb);
1031 } 1456 }
1032 1457
1033void ssl_set_cert_masks(c) 1458void SSL_CTX_set_verify_depth(SSL_CTX *ctx,int depth)
1034CERT *c; 1459 {
1460 ctx->verify_depth=depth;
1461 }
1462
1463void ssl_set_cert_masks(CERT *c, SSL_CIPHER *cipher)
1035 { 1464 {
1036 CERT_PKEY *cpk; 1465 CERT_PKEY *cpk;
1037 int rsa_enc,rsa_tmp,rsa_sign,dh_tmp,dh_rsa,dh_dsa,dsa_sign; 1466 int rsa_enc,rsa_tmp,rsa_sign,dh_tmp,dh_rsa,dh_dsa,dsa_sign;
1038 int rsa_enc_export,dh_rsa_export,dh_dsa_export; 1467 int rsa_enc_export,dh_rsa_export,dh_dsa_export;
1039 int rsa_tmp_export,dh_tmp_export; 1468 int rsa_tmp_export,dh_tmp_export,kl;
1040 unsigned long mask,emask; 1469 unsigned long mask,emask;
1041 1470
1042 if ((c == NULL) || (c->valid)) return; 1471 if (c == NULL) return;
1043 1472
1044#ifndef NO_RSA 1473 kl=SSL_C_EXPORT_PKEYLENGTH(cipher);
1045 rsa_tmp=((c->rsa_tmp != NULL) || (c->rsa_tmp_cb != NULL))?1:0; 1474
1046 rsa_tmp_export=((c->rsa_tmp_cb != NULL) || 1475#ifndef OPENSSL_NO_RSA
1047 (rsa_tmp && (RSA_size(c->rsa_tmp)*8 <= 512)))?1:0; 1476 rsa_tmp=(c->rsa_tmp != NULL || c->rsa_tmp_cb != NULL);
1477 rsa_tmp_export=(c->rsa_tmp_cb != NULL ||
1478 (rsa_tmp && RSA_size(c->rsa_tmp)*8 <= kl));
1048#else 1479#else
1049 rsa_tmp=rsa_tmp_export=0; 1480 rsa_tmp=rsa_tmp_export=0;
1050#endif 1481#endif
1051#ifndef NO_DH 1482#ifndef OPENSSL_NO_DH
1052 dh_tmp=((c->dh_tmp != NULL) || (c->dh_tmp_cb != NULL))?1:0; 1483 dh_tmp=(c->dh_tmp != NULL || c->dh_tmp_cb != NULL);
1053 dh_tmp_export=((c->dh_tmp_cb != NULL) || 1484 dh_tmp_export=(c->dh_tmp_cb != NULL ||
1054 (dh_tmp && (DH_size(c->dh_tmp)*8 <= 512)))?1:0; 1485 (dh_tmp && DH_size(c->dh_tmp)*8 <= kl));
1055#else 1486#else
1056 dh_tmp=dh_tmp_export=0; 1487 dh_tmp=dh_tmp_export=0;
1057#endif 1488#endif
1058 1489
1059 cpk= &(c->pkeys[SSL_PKEY_RSA_ENC]); 1490 cpk= &(c->pkeys[SSL_PKEY_RSA_ENC]);
1060 rsa_enc= ((cpk->x509 != NULL) && (cpk->privatekey != NULL))?1:0; 1491 rsa_enc= (cpk->x509 != NULL && cpk->privatekey != NULL);
1061 rsa_enc_export=(rsa_enc && (EVP_PKEY_size(cpk->privatekey)*8 <= 512))?1:0; 1492 rsa_enc_export=(rsa_enc && EVP_PKEY_size(cpk->privatekey)*8 <= kl);
1062 cpk= &(c->pkeys[SSL_PKEY_RSA_SIGN]); 1493 cpk= &(c->pkeys[SSL_PKEY_RSA_SIGN]);
1063 rsa_sign=((cpk->x509 != NULL) && (cpk->privatekey != NULL))?1:0; 1494 rsa_sign=(cpk->x509 != NULL && cpk->privatekey != NULL);
1064 cpk= &(c->pkeys[SSL_PKEY_DSA_SIGN]); 1495 cpk= &(c->pkeys[SSL_PKEY_DSA_SIGN]);
1065 dsa_sign=((cpk->x509 != NULL) && (cpk->privatekey != NULL))?1:0; 1496 dsa_sign=(cpk->x509 != NULL && cpk->privatekey != NULL);
1066 cpk= &(c->pkeys[SSL_PKEY_DH_RSA]); 1497 cpk= &(c->pkeys[SSL_PKEY_DH_RSA]);
1067 dh_rsa= ((cpk->x509 != NULL) && (cpk->privatekey != NULL))?1:0; 1498 dh_rsa= (cpk->x509 != NULL && cpk->privatekey != NULL);
1068 dh_rsa_export=(dh_rsa && (EVP_PKEY_size(cpk->privatekey)*8 <= 512))?1:0; 1499 dh_rsa_export=(dh_rsa && EVP_PKEY_size(cpk->privatekey)*8 <= kl);
1069 cpk= &(c->pkeys[SSL_PKEY_DH_DSA]); 1500 cpk= &(c->pkeys[SSL_PKEY_DH_DSA]);
1070/* FIX THIS EAY EAY EAY */ 1501/* FIX THIS EAY EAY EAY */
1071 dh_dsa= ((cpk->x509 != NULL) && (cpk->privatekey != NULL))?1:0; 1502 dh_dsa= (cpk->x509 != NULL && cpk->privatekey != NULL);
1072 dh_dsa_export=(dh_dsa && (EVP_PKEY_size(cpk->privatekey)*8 <= 512))?1:0; 1503 dh_dsa_export=(dh_dsa && EVP_PKEY_size(cpk->privatekey)*8 <= kl);
1073 1504
1074 mask=0; 1505 mask=0;
1075 emask=0; 1506 emask=0;
1076 1507
1077#ifdef CIPHER_DEBUG 1508#ifdef CIPHER_DEBUG
1078 printf("rt=%d dht=%d re=%d rs=%d ds=%d dhr=%d dhd=%d\n", 1509 printf("rt=%d rte=%d dht=%d re=%d ree=%d rs=%d ds=%d dhr=%d dhd=%d\n",
1079 rsa_tmp,dh_tmp, 1510 rsa_tmp,rsa_tmp_export,dh_tmp,
1080 rsa_enc,rsa_sign,dsa_sign,dh_rsa,dh_dsa); 1511 rsa_enc,rsa_enc_export,rsa_sign,dsa_sign,dh_rsa,dh_dsa);
1081#endif 1512#endif
1082 1513
1083 if (rsa_enc || (rsa_tmp && rsa_sign)) 1514 if (rsa_enc || (rsa_tmp && rsa_sign))
1084 mask|=SSL_kRSA; 1515 mask|=SSL_kRSA;
1085 if (rsa_enc_export || (rsa_tmp_export && rsa_sign)) 1516 if (rsa_enc_export || (rsa_tmp_export && (rsa_sign || rsa_enc)))
1086 emask|=SSL_kRSA; 1517 emask|=SSL_kRSA;
1087 1518
1088#if 0 1519#if 0
@@ -1119,9 +1550,12 @@ CERT *c;
1119 emask|=SSL_aDSS; 1550 emask|=SSL_aDSS;
1120 } 1551 }
1121 1552
1122#ifdef SSL_ALLOW_ADH
1123 mask|=SSL_aNULL; 1553 mask|=SSL_aNULL;
1124 emask|=SSL_aNULL; 1554 emask|=SSL_aNULL;
1555
1556#ifndef OPENSSL_NO_KRB5
1557 mask|=SSL_kKRB5|SSL_aKRB5;
1558 emask|=SSL_kKRB5|SSL_aKRB5;
1125#endif 1559#endif
1126 1560
1127 c->mask=mask; 1561 c->mask=mask;
@@ -1130,18 +1564,17 @@ CERT *c;
1130 } 1564 }
1131 1565
1132/* THIS NEEDS CLEANING UP */ 1566/* THIS NEEDS CLEANING UP */
1133X509 *ssl_get_server_send_cert(s) 1567X509 *ssl_get_server_send_cert(SSL *s)
1134SSL *s;
1135 { 1568 {
1136 unsigned long alg,mask,kalg; 1569 unsigned long alg,mask,kalg;
1137 CERT *c; 1570 CERT *c;
1138 int i,export; 1571 int i,is_export;
1139 1572
1140 c=s->cert; 1573 c=s->cert;
1141 ssl_set_cert_masks(c); 1574 ssl_set_cert_masks(c, s->s3->tmp.new_cipher);
1142 alg=s->s3->tmp.new_cipher->algorithms; 1575 alg=s->s3->tmp.new_cipher->algorithms;
1143 export=(alg & SSL_EXPORT)?1:0; 1576 is_export=SSL_C_IS_EXPORT(s->s3->tmp.new_cipher);
1144 mask=(export)?c->export_mask:c->mask; 1577 mask=is_export?c->export_mask:c->mask;
1145 kalg=alg&(SSL_MKEY_MASK|SSL_AUTH_MASK); 1578 kalg=alg&(SSL_MKEY_MASK|SSL_AUTH_MASK);
1146 1579
1147 if (kalg & SSL_kDHr) 1580 if (kalg & SSL_kDHr)
@@ -1157,18 +1590,21 @@ SSL *s;
1157 else 1590 else
1158 i=SSL_PKEY_RSA_ENC; 1591 i=SSL_PKEY_RSA_ENC;
1159 } 1592 }
1593 else if (kalg & SSL_aKRB5)
1594 {
1595 /* VRS something else here? */
1596 return(NULL);
1597 }
1160 else /* if (kalg & SSL_aNULL) */ 1598 else /* if (kalg & SSL_aNULL) */
1161 { 1599 {
1162 SSLerr(SSL_F_SSL_GET_SERVER_SEND_CERT,SSL_R_INTERNAL_ERROR); 1600 SSLerr(SSL_F_SSL_GET_SERVER_SEND_CERT,ERR_R_INTERNAL_ERROR);
1163 return(NULL); 1601 return(NULL);
1164 } 1602 }
1165 if (c->pkeys[i].x509 == NULL) return(NULL); 1603 if (c->pkeys[i].x509 == NULL) return(NULL);
1166 return(c->pkeys[i].x509); 1604 return(c->pkeys[i].x509);
1167 } 1605 }
1168 1606
1169EVP_PKEY *ssl_get_sign_pkey(s,cipher) 1607EVP_PKEY *ssl_get_sign_pkey(SSL *s,SSL_CIPHER *cipher)
1170SSL *s;
1171SSL_CIPHER *cipher;
1172 { 1608 {
1173 unsigned long alg; 1609 unsigned long alg;
1174 CERT *c; 1610 CERT *c;
@@ -1190,14 +1626,12 @@ SSL_CIPHER *cipher;
1190 } 1626 }
1191 else /* if (alg & SSL_aNULL) */ 1627 else /* if (alg & SSL_aNULL) */
1192 { 1628 {
1193 SSLerr(SSL_F_SSL_GET_SIGN_PKEY,SSL_R_INTERNAL_ERROR); 1629 SSLerr(SSL_F_SSL_GET_SIGN_PKEY,ERR_R_INTERNAL_ERROR);
1194 return(NULL); 1630 return(NULL);
1195 } 1631 }
1196 } 1632 }
1197 1633
1198void ssl_update_cache(s,mode) 1634void ssl_update_cache(SSL *s,int mode)
1199SSL *s;
1200int mode;
1201 { 1635 {
1202 int i; 1636 int i;
1203 1637
@@ -1205,9 +1639,10 @@ int mode;
1205 * and it would be rather hard to do anyway :-) */ 1639 * and it would be rather hard to do anyway :-) */
1206 if (s->session->session_id_length == 0) return; 1640 if (s->session->session_id_length == 0) return;
1207 1641
1208 if ((s->ctx->session_cache_mode & mode) 1642 i=s->ctx->session_cache_mode;
1209 && (!s->hit) 1643 if ((i & mode) && (!s->hit)
1210 && SSL_CTX_add_session(s->ctx,s->session) 1644 && ((i & SSL_SESS_CACHE_NO_INTERNAL_LOOKUP)
1645 || SSL_CTX_add_session(s->ctx,s->session))
1211 && (s->ctx->new_session_cb != NULL)) 1646 && (s->ctx->new_session_cb != NULL))
1212 { 1647 {
1213 CRYPTO_add(&s->session->references,1,CRYPTO_LOCK_SSL_SESSION); 1648 CRYPTO_add(&s->session->references,1,CRYPTO_LOCK_SSL_SESSION);
@@ -1216,28 +1651,24 @@ int mode;
1216 } 1651 }
1217 1652
1218 /* auto flush every 255 connections */ 1653 /* auto flush every 255 connections */
1219 i=s->ctx->session_cache_mode;
1220 if ((!(i & SSL_SESS_CACHE_NO_AUTO_CLEAR)) && 1654 if ((!(i & SSL_SESS_CACHE_NO_AUTO_CLEAR)) &&
1221 ((i & mode) == mode)) 1655 ((i & mode) == mode))
1222 { 1656 {
1223 if ( (((mode & SSL_SESS_CACHE_CLIENT) 1657 if ( (((mode & SSL_SESS_CACHE_CLIENT)
1224 ?s->ctx->sess_connect_good 1658 ?s->ctx->stats.sess_connect_good
1225 :s->ctx->sess_accept_good) & 0xff) == 0xff) 1659 :s->ctx->stats.sess_accept_good) & 0xff) == 0xff)
1226 { 1660 {
1227 SSL_CTX_flush_sessions(s->ctx,time(NULL)); 1661 SSL_CTX_flush_sessions(s->ctx,time(NULL));
1228 } 1662 }
1229 } 1663 }
1230 } 1664 }
1231 1665
1232SSL_METHOD *SSL_get_ssl_method(s) 1666SSL_METHOD *SSL_get_ssl_method(SSL *s)
1233SSL *s;
1234 { 1667 {
1235 return(s->method); 1668 return(s->method);
1236 } 1669 }
1237 1670
1238int SSL_set_ssl_method(s,meth) 1671int SSL_set_ssl_method(SSL *s,SSL_METHOD *meth)
1239SSL *s;
1240SSL_METHOD *meth;
1241 { 1672 {
1242 int conn= -1; 1673 int conn= -1;
1243 int ret=1; 1674 int ret=1;
@@ -1264,17 +1695,23 @@ SSL_METHOD *meth;
1264 return(ret); 1695 return(ret);
1265 } 1696 }
1266 1697
1267int SSL_get_error(s,i) 1698int SSL_get_error(SSL *s,int i)
1268SSL *s;
1269int i;
1270 { 1699 {
1271 int reason; 1700 int reason;
1701 unsigned long l;
1272 BIO *bio; 1702 BIO *bio;
1273 1703
1274 if (i > 0) return(SSL_ERROR_NONE); 1704 if (i > 0) return(SSL_ERROR_NONE);
1275 1705
1276 if (ERR_peek_error() != 0) 1706 /* Make things return SSL_ERROR_SYSCALL when doing SSL_do_handshake
1277 return(SSL_ERROR_SSL); 1707 * etc, where we do encode the error */
1708 if ((l=ERR_peek_error()) != 0)
1709 {
1710 if (ERR_GET_LIB(l) == ERR_LIB_SYS)
1711 return(SSL_ERROR_SYSCALL);
1712 else
1713 return(SSL_ERROR_SSL);
1714 }
1278 1715
1279 if ((i < 0) && SSL_want_read(s)) 1716 if ((i < 0) && SSL_want_read(s))
1280 { 1717 {
@@ -1282,12 +1719,23 @@ int i;
1282 if (BIO_should_read(bio)) 1719 if (BIO_should_read(bio))
1283 return(SSL_ERROR_WANT_READ); 1720 return(SSL_ERROR_WANT_READ);
1284 else if (BIO_should_write(bio)) 1721 else if (BIO_should_write(bio))
1722 /* This one doesn't make too much sense ... We never try
1723 * to write to the rbio, and an application program where
1724 * rbio and wbio are separate couldn't even know what it
1725 * should wait for.
1726 * However if we ever set s->rwstate incorrectly
1727 * (so that we have SSL_want_read(s) instead of
1728 * SSL_want_write(s)) and rbio and wbio *are* the same,
1729 * this test works around that bug; so it might be safer
1730 * to keep it. */
1285 return(SSL_ERROR_WANT_WRITE); 1731 return(SSL_ERROR_WANT_WRITE);
1286 else if (BIO_should_io_special(bio)) 1732 else if (BIO_should_io_special(bio))
1287 { 1733 {
1288 reason=BIO_get_retry_reason(bio); 1734 reason=BIO_get_retry_reason(bio);
1289 if (reason == BIO_RR_CONNECT) 1735 if (reason == BIO_RR_CONNECT)
1290 return(SSL_ERROR_WANT_CONNECT); 1736 return(SSL_ERROR_WANT_CONNECT);
1737 else if (reason == BIO_RR_ACCEPT)
1738 return(SSL_ERROR_WANT_ACCEPT);
1291 else 1739 else
1292 return(SSL_ERROR_SYSCALL); /* unknown */ 1740 return(SSL_ERROR_SYSCALL); /* unknown */
1293 } 1741 }
@@ -1299,12 +1747,15 @@ int i;
1299 if (BIO_should_write(bio)) 1747 if (BIO_should_write(bio))
1300 return(SSL_ERROR_WANT_WRITE); 1748 return(SSL_ERROR_WANT_WRITE);
1301 else if (BIO_should_read(bio)) 1749 else if (BIO_should_read(bio))
1750 /* See above (SSL_want_read(s) with BIO_should_write(bio)) */
1302 return(SSL_ERROR_WANT_READ); 1751 return(SSL_ERROR_WANT_READ);
1303 else if (BIO_should_io_special(bio)) 1752 else if (BIO_should_io_special(bio))
1304 { 1753 {
1305 reason=BIO_get_retry_reason(bio); 1754 reason=BIO_get_retry_reason(bio);
1306 if (reason == BIO_RR_CONNECT) 1755 if (reason == BIO_RR_CONNECT)
1307 return(SSL_ERROR_WANT_CONNECT); 1756 return(SSL_ERROR_WANT_CONNECT);
1757 else if (reason == BIO_RR_ACCEPT)
1758 return(SSL_ERROR_WANT_ACCEPT);
1308 else 1759 else
1309 return(SSL_ERROR_SYSCALL); 1760 return(SSL_ERROR_SYSCALL);
1310 } 1761 }
@@ -1331,8 +1782,7 @@ int i;
1331 return(SSL_ERROR_SYSCALL); 1782 return(SSL_ERROR_SYSCALL);
1332 } 1783 }
1333 1784
1334int SSL_do_handshake(s) 1785int SSL_do_handshake(SSL *s)
1335SSL *s;
1336 { 1786 {
1337 int ret=1; 1787 int ret=1;
1338 1788
@@ -1341,7 +1791,9 @@ SSL *s;
1341 SSLerr(SSL_F_SSL_DO_HANDSHAKE,SSL_R_CONNECTION_TYPE_NOT_SET); 1791 SSLerr(SSL_F_SSL_DO_HANDSHAKE,SSL_R_CONNECTION_TYPE_NOT_SET);
1342 return(-1); 1792 return(-1);
1343 } 1793 }
1344 if (s->s3->renegotiate) ssl3_renegotiate_check(s); 1794
1795 s->method->ssl_renegotiate_check(s);
1796
1345 if (SSL_in_init(s) || SSL_in_before(s)) 1797 if (SSL_in_init(s) || SSL_in_before(s))
1346 { 1798 {
1347 ret=s->handshake_func(s); 1799 ret=s->handshake_func(s);
@@ -1351,9 +1803,9 @@ SSL *s;
1351 1803
1352/* For the next 2 functions, SSL_clear() sets shutdown and so 1804/* For the next 2 functions, SSL_clear() sets shutdown and so
1353 * one of these calls will reset it */ 1805 * one of these calls will reset it */
1354void SSL_set_accept_state(s) 1806void SSL_set_accept_state(SSL *s)
1355SSL *s;
1356 { 1807 {
1808 s->server=1;
1357 s->shutdown=0; 1809 s->shutdown=0;
1358 s->state=SSL_ST_ACCEPT|SSL_ST_BEFORE; 1810 s->state=SSL_ST_ACCEPT|SSL_ST_BEFORE;
1359 s->handshake_func=s->method->ssl_accept; 1811 s->handshake_func=s->method->ssl_accept;
@@ -1361,9 +1813,9 @@ SSL *s;
1361 ssl_clear_cipher_ctx(s); 1813 ssl_clear_cipher_ctx(s);
1362 } 1814 }
1363 1815
1364void SSL_set_connect_state(s) 1816void SSL_set_connect_state(SSL *s)
1365SSL *s;
1366 { 1817 {
1818 s->server=0;
1367 s->shutdown=0; 1819 s->shutdown=0;
1368 s->state=SSL_ST_CONNECT|SSL_ST_BEFORE; 1820 s->state=SSL_ST_CONNECT|SSL_ST_BEFORE;
1369 s->handshake_func=s->method->ssl_connect; 1821 s->handshake_func=s->method->ssl_connect;
@@ -1371,22 +1823,19 @@ SSL *s;
1371 ssl_clear_cipher_ctx(s); 1823 ssl_clear_cipher_ctx(s);
1372 } 1824 }
1373 1825
1374int ssl_undefined_function(s) 1826int ssl_undefined_function(SSL *s)
1375SSL *s;
1376 { 1827 {
1377 SSLerr(SSL_F_SSL_UNDEFINED_FUNCTION,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 1828 SSLerr(SSL_F_SSL_UNDEFINED_FUNCTION,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
1378 return(0); 1829 return(0);
1379 } 1830 }
1380 1831
1381SSL_METHOD *ssl_bad_method(ver) 1832SSL_METHOD *ssl_bad_method(int ver)
1382int ver;
1383 { 1833 {
1384 SSLerr(SSL_F_SSL_BAD_METHOD,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 1834 SSLerr(SSL_F_SSL_BAD_METHOD,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
1385 return(NULL); 1835 return(NULL);
1386 } 1836 }
1387 1837
1388char *SSL_get_version(s) 1838const char *SSL_get_version(SSL *s)
1389SSL *s;
1390 { 1839 {
1391 if (s->version == TLS1_VERSION) 1840 if (s->version == TLS1_VERSION)
1392 return("TLSv1"); 1841 return("TLSv1");
@@ -1398,30 +1847,67 @@ SSL *s;
1398 return("unknown"); 1847 return("unknown");
1399 } 1848 }
1400 1849
1401SSL *SSL_dup(s) 1850SSL *SSL_dup(SSL *s)
1402SSL *s; 1851 {
1403 { 1852 STACK_OF(X509_NAME) *sk;
1404 STACK *sk;
1405 X509_NAME *xn; 1853 X509_NAME *xn;
1406 SSL *ret; 1854 SSL *ret;
1407 int i; 1855 int i;
1408 1856
1409 if ((ret=SSL_new(SSL_get_SSL_CTX(s))) == NULL) return(NULL); 1857 if ((ret=SSL_new(SSL_get_SSL_CTX(s))) == NULL)
1410 1858 return(NULL);
1411 /* This copies version, session-id, SSL_METHOD and 'cert' */ 1859
1412 SSL_copy_session_id(ret,s); 1860 ret->version = s->version;
1861 ret->type = s->type;
1862 ret->method = s->method;
1863
1864 if (s->session != NULL)
1865 {
1866 /* This copies session-id, SSL_METHOD, sid_ctx, and 'cert' */
1867 SSL_copy_session_id(ret,s);
1868 }
1869 else
1870 {
1871 /* No session has been established yet, so we have to expect
1872 * that s->cert or ret->cert will be changed later --
1873 * they should not both point to the same object,
1874 * and thus we can't use SSL_copy_session_id. */
1413 1875
1876 ret->method = s->method;
1877 ret->method->ssl_new(ret);
1878
1879 if (s->cert != NULL)
1880 {
1881 if (ret->cert != NULL)
1882 {
1883 ssl_cert_free(ret->cert);
1884 }
1885 ret->cert = ssl_cert_dup(s->cert);
1886 if (ret->cert == NULL)
1887 goto err;
1888 }
1889
1890 SSL_set_session_id_context(ret,
1891 s->sid_ctx, s->sid_ctx_length);
1892 }
1893
1894 ret->options=s->options;
1895 ret->mode=s->mode;
1896 SSL_set_max_cert_list(ret,SSL_get_max_cert_list(s));
1414 SSL_set_read_ahead(ret,SSL_get_read_ahead(s)); 1897 SSL_set_read_ahead(ret,SSL_get_read_ahead(s));
1898 ret->msg_callback = s->msg_callback;
1899 ret->msg_callback_arg = s->msg_callback_arg;
1415 SSL_set_verify(ret,SSL_get_verify_mode(s), 1900 SSL_set_verify(ret,SSL_get_verify_mode(s),
1416 SSL_get_verify_callback(s)); 1901 SSL_get_verify_callback(s));
1902 SSL_set_verify_depth(ret,SSL_get_verify_depth(s));
1903 ret->generate_session_id = s->generate_session_id;
1417 1904
1418 SSL_set_info_callback(ret,SSL_get_info_callback(s)); 1905 SSL_set_info_callback(ret,SSL_get_info_callback(s));
1419 1906
1420 ret->debug=s->debug; 1907 ret->debug=s->debug;
1421 ret->options=s->options;
1422 1908
1423 /* copy app data, a little dangerous perhaps */ 1909 /* copy app data, a little dangerous perhaps */
1424 if (!CRYPTO_dup_ex_data(ssl_meth,&ret->ex_data,&s->ex_data)) 1910 if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_SSL, &ret->ex_data, &s->ex_data))
1425 goto err; 1911 goto err;
1426 1912
1427 /* setup rbio, and wbio */ 1913 /* setup rbio, and wbio */
@@ -1440,27 +1926,40 @@ SSL *s;
1440 else 1926 else
1441 ret->wbio=ret->rbio; 1927 ret->wbio=ret->rbio;
1442 } 1928 }
1929 ret->rwstate = s->rwstate;
1930 ret->in_handshake = s->in_handshake;
1931 ret->handshake_func = s->handshake_func;
1932 ret->server = s->server;
1933 ret->new_session = s->new_session;
1934 ret->quiet_shutdown = s->quiet_shutdown;
1935 ret->shutdown=s->shutdown;
1936 ret->state=s->state; /* SSL_dup does not really work at any state, though */
1937 ret->rstate=s->rstate;
1938 ret->init_num = 0; /* would have to copy ret->init_buf, ret->init_msg, ret->init_num, ret->init_off */
1939 ret->hit=s->hit;
1940 ret->purpose=s->purpose;
1941 ret->trust=s->trust;
1443 1942
1444 /* dup the cipher_list and cipher_list_by_id stacks */ 1943 /* dup the cipher_list and cipher_list_by_id stacks */
1445 if (s->cipher_list != NULL) 1944 if (s->cipher_list != NULL)
1446 { 1945 {
1447 if ((ret->cipher_list=sk_dup(s->cipher_list)) == NULL) 1946 if ((ret->cipher_list=sk_SSL_CIPHER_dup(s->cipher_list)) == NULL)
1448 goto err; 1947 goto err;
1449 } 1948 }
1450 if (s->cipher_list_by_id != NULL) 1949 if (s->cipher_list_by_id != NULL)
1451 if ((ret->cipher_list_by_id=sk_dup(s->cipher_list_by_id)) 1950 if ((ret->cipher_list_by_id=sk_SSL_CIPHER_dup(s->cipher_list_by_id))
1452 == NULL) 1951 == NULL)
1453 goto err; 1952 goto err;
1454 1953
1455 /* Dup the client_CA list */ 1954 /* Dup the client_CA list */
1456 if (s->client_CA != NULL) 1955 if (s->client_CA != NULL)
1457 { 1956 {
1458 if ((sk=sk_dup(s->client_CA)) == NULL) goto err; 1957 if ((sk=sk_X509_NAME_dup(s->client_CA)) == NULL) goto err;
1459 ret->client_CA=sk; 1958 ret->client_CA=sk;
1460 for (i=0; i<sk_num(sk); i++) 1959 for (i=0; i<sk_X509_NAME_num(sk); i++)
1461 { 1960 {
1462 xn=(X509_NAME *)sk_value(sk,i); 1961 xn=sk_X509_NAME_value(sk,i);
1463 if ((sk_value(sk,i)=(char *)X509_NAME_dup(xn)) == NULL) 1962 if (sk_X509_NAME_set(sk,i,X509_NAME_dup(xn)) == NULL)
1464 { 1963 {
1465 X509_NAME_free(xn); 1964 X509_NAME_free(xn);
1466 goto err; 1965 goto err;
@@ -1468,10 +1967,6 @@ SSL *s;
1468 } 1967 }
1469 } 1968 }
1470 1969
1471 ret->shutdown=s->shutdown;
1472 ret->state=s->state;
1473 ret->handshake_func=s->handshake_func;
1474
1475 if (0) 1970 if (0)
1476 { 1971 {
1477err: 1972err:
@@ -1481,26 +1976,34 @@ err:
1481 return(ret); 1976 return(ret);
1482 } 1977 }
1483 1978
1484void ssl_clear_cipher_ctx(s) 1979void ssl_clear_cipher_ctx(SSL *s)
1485SSL *s;
1486 { 1980 {
1487 if (s->enc_read_ctx != NULL) 1981 if (s->enc_read_ctx != NULL)
1488 { 1982 {
1489 EVP_CIPHER_CTX_cleanup(s->enc_read_ctx); 1983 EVP_CIPHER_CTX_cleanup(s->enc_read_ctx);
1490 Free(s->enc_read_ctx); 1984 OPENSSL_free(s->enc_read_ctx);
1491 s->enc_read_ctx=NULL; 1985 s->enc_read_ctx=NULL;
1492 } 1986 }
1493 if (s->enc_write_ctx != NULL) 1987 if (s->enc_write_ctx != NULL)
1494 { 1988 {
1495 EVP_CIPHER_CTX_cleanup(s->enc_write_ctx); 1989 EVP_CIPHER_CTX_cleanup(s->enc_write_ctx);
1496 Free(s->enc_write_ctx); 1990 OPENSSL_free(s->enc_write_ctx);
1497 s->enc_write_ctx=NULL; 1991 s->enc_write_ctx=NULL;
1498 } 1992 }
1993 if (s->expand != NULL)
1994 {
1995 COMP_CTX_free(s->expand);
1996 s->expand=NULL;
1997 }
1998 if (s->compress != NULL)
1999 {
2000 COMP_CTX_free(s->compress);
2001 s->compress=NULL;
2002 }
1499 } 2003 }
1500 2004
1501/* Fix this function so that it takes an optional type parameter */ 2005/* Fix this function so that it takes an optional type parameter */
1502X509 *SSL_get_certificate(s) 2006X509 *SSL_get_certificate(SSL *s)
1503SSL *s;
1504 { 2007 {
1505 if (s->cert != NULL) 2008 if (s->cert != NULL)
1506 return(s->cert->key->x509); 2009 return(s->cert->key->x509);
@@ -1509,8 +2012,7 @@ SSL *s;
1509 } 2012 }
1510 2013
1511/* Fix this function so that it takes an optional type parameter */ 2014/* Fix this function so that it takes an optional type parameter */
1512EVP_PKEY *SSL_get_privatekey(s) 2015EVP_PKEY *SSL_get_privatekey(SSL *s)
1513SSL *s;
1514 { 2016 {
1515 if (s->cert != NULL) 2017 if (s->cert != NULL)
1516 return(s->cert->key->privatekey); 2018 return(s->cert->key->privatekey);
@@ -1518,17 +2020,14 @@ SSL *s;
1518 return(NULL); 2020 return(NULL);
1519 } 2021 }
1520 2022
1521SSL_CIPHER *SSL_get_current_cipher(s) 2023SSL_CIPHER *SSL_get_current_cipher(SSL *s)
1522SSL *s;
1523 { 2024 {
1524 if ((s->session != NULL) && (s->session->cipher != NULL)) 2025 if ((s->session != NULL) && (s->session->cipher != NULL))
1525 return(s->session->cipher); 2026 return(s->session->cipher);
1526 return(NULL); 2027 return(NULL);
1527 } 2028 }
1528 2029
1529int ssl_init_wbio_buffer(s,push) 2030int ssl_init_wbio_buffer(SSL *s,int push)
1530SSL *s;
1531int push;
1532 { 2031 {
1533 BIO *bbio; 2032 BIO *bbio;
1534 2033
@@ -1544,7 +2043,7 @@ int push;
1544 if (s->bbio == s->wbio) 2043 if (s->bbio == s->wbio)
1545 s->wbio=BIO_pop(s->wbio); 2044 s->wbio=BIO_pop(s->wbio);
1546 } 2045 }
1547 BIO_reset(bbio); 2046 (void)BIO_reset(bbio);
1548/* if (!BIO_set_write_buffer_size(bbio,16*1024)) */ 2047/* if (!BIO_set_write_buffer_size(bbio,16*1024)) */
1549 if (!BIO_set_read_buffer_size(bbio,1)) 2048 if (!BIO_set_read_buffer_size(bbio,1))
1550 { 2049 {
@@ -1563,159 +2062,230 @@ int push;
1563 } 2062 }
1564 return(1); 2063 return(1);
1565 } 2064 }
2065
2066void ssl_free_wbio_buffer(SSL *s)
2067 {
2068 if (s->bbio == NULL) return;
2069
2070 if (s->bbio == s->wbio)
2071 {
2072 /* remove buffering */
2073 s->wbio=BIO_pop(s->wbio);
2074#ifdef REF_CHECK /* not the usual REF_CHECK, but this avoids adding one more preprocessor symbol */
2075 assert(s->wbio != NULL);
2076#endif
2077 }
2078 BIO_free(s->bbio);
2079 s->bbio=NULL;
2080 }
1566 2081
1567void SSL_CTX_set_quiet_shutdown(ctx,mode) 2082void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx,int mode)
1568SSL_CTX *ctx;
1569int mode;
1570 { 2083 {
1571 ctx->quiet_shutdown=mode; 2084 ctx->quiet_shutdown=mode;
1572 } 2085 }
1573 2086
1574int SSL_CTX_get_quiet_shutdown(ctx) 2087int SSL_CTX_get_quiet_shutdown(SSL_CTX *ctx)
1575SSL_CTX *ctx;
1576 { 2088 {
1577 return(ctx->quiet_shutdown); 2089 return(ctx->quiet_shutdown);
1578 } 2090 }
1579 2091
1580void SSL_set_quiet_shutdown(s,mode) 2092void SSL_set_quiet_shutdown(SSL *s,int mode)
1581SSL *s;
1582int mode;
1583 { 2093 {
1584 s->quiet_shutdown=mode; 2094 s->quiet_shutdown=mode;
1585 } 2095 }
1586 2096
1587int SSL_get_quiet_shutdown(s) 2097int SSL_get_quiet_shutdown(SSL *s)
1588SSL *s;
1589 { 2098 {
1590 return(s->quiet_shutdown); 2099 return(s->quiet_shutdown);
1591 } 2100 }
1592 2101
1593void SSL_set_shutdown(s,mode) 2102void SSL_set_shutdown(SSL *s,int mode)
1594SSL *s;
1595int mode;
1596 { 2103 {
1597 s->shutdown=mode; 2104 s->shutdown=mode;
1598 } 2105 }
1599 2106
1600int SSL_get_shutdown(s) 2107int SSL_get_shutdown(SSL *s)
1601SSL *s;
1602 { 2108 {
1603 return(s->shutdown); 2109 return(s->shutdown);
1604 } 2110 }
1605 2111
1606int SSL_version(s) 2112int SSL_version(SSL *s)
1607SSL *s;
1608 { 2113 {
1609 return(s->version); 2114 return(s->version);
1610 } 2115 }
1611 2116
1612SSL_CTX *SSL_get_SSL_CTX(ssl) 2117SSL_CTX *SSL_get_SSL_CTX(SSL *ssl)
1613SSL *ssl;
1614 { 2118 {
1615 return(ssl->ctx); 2119 return(ssl->ctx);
1616 } 2120 }
1617 2121
1618int SSL_CTX_set_default_verify_paths(ctx) 2122#ifndef OPENSSL_NO_STDIO
1619SSL_CTX *ctx; 2123int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx)
1620 { 2124 {
1621 return(X509_STORE_set_default_paths(ctx->cert_store)); 2125 return(X509_STORE_set_default_paths(ctx->cert_store));
1622 } 2126 }
1623 2127
1624int SSL_CTX_load_verify_locations(ctx,CAfile,CApath) 2128int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile,
1625SSL_CTX *ctx; 2129 const char *CApath)
1626char *CAfile;
1627char *CApath;
1628 { 2130 {
1629 return(X509_STORE_load_locations(ctx->cert_store,CAfile,CApath)); 2131 return(X509_STORE_load_locations(ctx->cert_store,CAfile,CApath));
1630 } 2132 }
2133#endif
1631 2134
1632void SSL_set_info_callback(ssl,cb) 2135void SSL_set_info_callback(SSL *ssl,
1633SSL *ssl; 2136 void (*cb)(const SSL *ssl,int type,int val))
1634void (*cb)();
1635 { 2137 {
1636 ssl->info_callback=cb; 2138 ssl->info_callback=cb;
1637 } 2139 }
1638 2140
1639void (*SSL_get_info_callback(ssl))() 2141void (*SSL_get_info_callback(SSL *ssl))(const SSL *ssl,int type,int val)
1640SSL *ssl;
1641 { 2142 {
1642 return(ssl->info_callback); 2143 return ssl->info_callback;
1643 } 2144 }
1644 2145
1645int SSL_state(ssl) 2146int SSL_state(SSL *ssl)
1646SSL *ssl;
1647 { 2147 {
1648 return(ssl->state); 2148 return(ssl->state);
1649 } 2149 }
1650 2150
1651void SSL_set_verify_result(ssl,arg) 2151void SSL_set_verify_result(SSL *ssl,long arg)
1652SSL *ssl;
1653long arg;
1654 { 2152 {
1655 ssl->verify_result=arg; 2153 ssl->verify_result=arg;
1656 } 2154 }
1657 2155
1658long SSL_get_verify_result(ssl) 2156long SSL_get_verify_result(SSL *ssl)
1659SSL *ssl;
1660 { 2157 {
1661 return(ssl->verify_result); 2158 return(ssl->verify_result);
1662 } 2159 }
1663 2160
1664int SSL_get_ex_new_index(argl,argp,new_func,dup_func,free_func) 2161int SSL_get_ex_new_index(long argl,void *argp,CRYPTO_EX_new *new_func,
1665long argl; 2162 CRYPTO_EX_dup *dup_func,CRYPTO_EX_free *free_func)
1666char *argp; 2163 {
1667int (*new_func)(); 2164 return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL, argl, argp,
1668int (*dup_func)(); 2165 new_func, dup_func, free_func);
1669void (*free_func)(); 2166 }
1670 {
1671 ssl_meth_num++;
1672 return(CRYPTO_get_ex_new_index(ssl_meth_num-1,
1673 &ssl_meth,argl,argp,new_func,dup_func,free_func));
1674 }
1675 2167
1676int SSL_set_ex_data(s,idx,arg) 2168int SSL_set_ex_data(SSL *s,int idx,void *arg)
1677SSL *s;
1678int idx;
1679char *arg;
1680 { 2169 {
1681 return(CRYPTO_set_ex_data(&s->ex_data,idx,arg)); 2170 return(CRYPTO_set_ex_data(&s->ex_data,idx,arg));
1682 } 2171 }
1683 2172
1684char *SSL_get_ex_data(s,idx) 2173void *SSL_get_ex_data(SSL *s,int idx)
1685SSL *s;
1686int idx;
1687 { 2174 {
1688 return(CRYPTO_get_ex_data(&s->ex_data,idx)); 2175 return(CRYPTO_get_ex_data(&s->ex_data,idx));
1689 } 2176 }
1690 2177
1691int SSL_CTX_get_ex_new_index(argl,argp,new_func,dup_func,free_func) 2178int SSL_CTX_get_ex_new_index(long argl,void *argp,CRYPTO_EX_new *new_func,
1692long argl; 2179 CRYPTO_EX_dup *dup_func,CRYPTO_EX_free *free_func)
1693char *argp; 2180 {
1694int (*new_func)(); 2181 return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_CTX, argl, argp,
1695int (*dup_func)(); 2182 new_func, dup_func, free_func);
1696void (*free_func)(); 2183 }
1697 {
1698 ssl_ctx_meth_num++;
1699 return(CRYPTO_get_ex_new_index(ssl_ctx_meth_num-1,
1700 &ssl_ctx_meth,argl,argp,new_func,dup_func,free_func));
1701 }
1702 2184
1703int SSL_CTX_set_ex_data(s,idx,arg) 2185int SSL_CTX_set_ex_data(SSL_CTX *s,int idx,void *arg)
1704SSL_CTX *s;
1705int idx;
1706char *arg;
1707 { 2186 {
1708 return(CRYPTO_set_ex_data(&s->ex_data,idx,arg)); 2187 return(CRYPTO_set_ex_data(&s->ex_data,idx,arg));
1709 } 2188 }
1710 2189
1711char *SSL_CTX_get_ex_data(s,idx) 2190void *SSL_CTX_get_ex_data(SSL_CTX *s,int idx)
1712SSL_CTX *s;
1713int idx;
1714 { 2191 {
1715 return(CRYPTO_get_ex_data(&s->ex_data,idx)); 2192 return(CRYPTO_get_ex_data(&s->ex_data,idx));
1716 } 2193 }
1717 2194
1718#if defined(_WINDLL) && defined(WIN16) 2195int ssl_ok(SSL *s)
2196 {
2197 return(1);
2198 }
2199
2200X509_STORE *SSL_CTX_get_cert_store(SSL_CTX *ctx)
2201 {
2202 return(ctx->cert_store);
2203 }
2204
2205void SSL_CTX_set_cert_store(SSL_CTX *ctx,X509_STORE *store)
2206 {
2207 if (ctx->cert_store != NULL)
2208 X509_STORE_free(ctx->cert_store);
2209 ctx->cert_store=store;
2210 }
2211
2212int SSL_want(SSL *s)
2213 {
2214 return(s->rwstate);
2215 }
2216
2217/*!
2218 * \brief Set the callback for generating temporary RSA keys.
2219 * \param ctx the SSL context.
2220 * \param cb the callback
2221 */
2222
2223#ifndef OPENSSL_NO_RSA
2224void SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx,RSA *(*cb)(SSL *ssl,
2225 int is_export,
2226 int keylength))
2227 {
2228 SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TMP_RSA_CB,(void (*)())cb);
2229 }
2230
2231void SSL_set_tmp_rsa_callback(SSL *ssl,RSA *(*cb)(SSL *ssl,
2232 int is_export,
2233 int keylength))
2234 {
2235 SSL_callback_ctrl(ssl,SSL_CTRL_SET_TMP_RSA_CB,(void (*)())cb);
2236 }
2237#endif
2238
2239#ifdef DOXYGEN
2240/*!
2241 * \brief The RSA temporary key callback function.
2242 * \param ssl the SSL session.
2243 * \param is_export \c TRUE if the temp RSA key is for an export ciphersuite.
2244 * \param keylength if \c is_export is \c TRUE, then \c keylength is the size
2245 * of the required key in bits.
2246 * \return the temporary RSA key.
2247 * \sa SSL_CTX_set_tmp_rsa_callback, SSL_set_tmp_rsa_callback
2248 */
2249
2250RSA *cb(SSL *ssl,int is_export,int keylength)
2251 {}
2252#endif
2253
2254/*!
2255 * \brief Set the callback for generating temporary DH keys.
2256 * \param ctx the SSL context.
2257 * \param dh the callback
2258 */
2259
2260#ifndef OPENSSL_NO_DH
2261void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,DH *(*dh)(SSL *ssl,int is_export,
2262 int keylength))
2263 {
2264 SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TMP_DH_CB,(void (*)())dh);
2265 }
2266
2267void SSL_set_tmp_dh_callback(SSL *ssl,DH *(*dh)(SSL *ssl,int is_export,
2268 int keylength))
2269 {
2270 SSL_callback_ctrl(ssl,SSL_CTRL_SET_TMP_DH_CB,(void (*)())dh);
2271 }
2272#endif
2273
2274
2275void SSL_CTX_set_msg_callback(SSL_CTX *ctx, void (*cb)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg))
2276 {
2277 SSL_CTX_callback_ctrl(ctx, SSL_CTRL_SET_MSG_CALLBACK, (void (*)())cb);
2278 }
2279void SSL_set_msg_callback(SSL *ssl, void (*cb)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg))
2280 {
2281 SSL_callback_ctrl(ssl, SSL_CTRL_SET_MSG_CALLBACK, (void (*)())cb);
2282 }
2283
2284
2285
2286#if defined(_WINDLL) && defined(OPENSSL_SYS_WIN16)
1719#include "../crypto/bio/bss_file.c" 2287#include "../crypto/bio/bss_file.c"
1720#endif 2288#endif
1721 2289
2290IMPLEMENT_STACK_OF(SSL_CIPHER)
2291IMPLEMENT_STACK_OF(SSL_COMP)
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h
index b29517081b..17e9bef832 100644
--- a/src/lib/libssl/ssl_locl.h
+++ b/src/lib/libssl/ssl_locl.h
@@ -55,6 +55,59 @@
55 * copied and put under another distribution licence 55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.] 56 * [including the GNU Public Licence.]
57 */ 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 */
58 111
59#ifndef HEADER_SSL_LOCL_H 112#ifndef HEADER_SSL_LOCL_H
60#define HEADER_SSL_LOCL_H 113#define HEADER_SSL_LOCL_H
@@ -65,15 +118,23 @@
65 118
66#include "e_os.h" 119#include "e_os.h"
67 120
68#include "buffer.h" 121#include <openssl/buffer.h>
69#include "bio.h" 122#include <openssl/comp.h>
70#include "crypto.h" 123#include <openssl/bio.h>
71#include "evp.h" 124#include <openssl/crypto.h>
72#include "stack.h" 125#include <openssl/evp.h>
73#include "x509.h" 126#include <openssl/stack.h>
74#include "err.h" 127#include <openssl/x509.h>
75#include "ssl.h" 128#include <openssl/err.h>
129#include <openssl/ssl.h>
130#include <openssl/symhacks.h>
131
132#ifdef OPENSSL_BUILD_SHLIBSSL
133# undef OPENSSL_EXTERN
134# define OPENSSL_EXTERN OPENSSL_EXPORT
135#endif
76 136
137#define PKCS1_CHECK
77 138
78#define c2l(c,l) (l = ((unsigned long)(*((c)++))) , \ 139#define c2l(c,l) (l = ((unsigned long)(*((c)++))) , \
79 l|=(((unsigned long)(*((c)++)))<< 8), \ 140 l|=(((unsigned long)(*((c)++)))<< 8), \
@@ -126,18 +187,18 @@
126 } \ 187 } \
127 } 188 }
128 189
129#define n2s(c,s) (s =((unsigned int)(*((c)++)))<< 8, \ 190#define n2s(c,s) ((s=(((unsigned int)(c[0]))<< 8)| \
130 s|=((unsigned int)(*((c)++)))) 191 (((unsigned int)(c[1])) )),c+=2)
131#define s2n(s,c) (*((c)++)=(unsigned char)(((s)>> 8)&0xff), \ 192#define s2n(s,c) ((c[0]=(unsigned char)(((s)>> 8)&0xff), \
132 *((c)++)=(unsigned char)(((s) )&0xff)) 193 c[1]=(unsigned char)(((s) )&0xff)),c+=2)
133 194
134#define n2l3(c,l) (l =((unsigned long)(*((c)++)))<<16, \ 195#define n2l3(c,l) ((l =(((unsigned long)(c[0]))<<16)| \
135 l|=((unsigned long)(*((c)++)))<< 8, \ 196 (((unsigned long)(c[1]))<< 8)| \
136 l|=((unsigned long)(*((c)++)))) 197 (((unsigned long)(c[2])) )),c+=3)
137 198
138#define l2n3(l,c) (*((c)++)=(unsigned char)(((l)>>16)&0xff), \ 199#define l2n3(l,c) ((c[0]=(unsigned char)(((l)>>16)&0xff), \
139 *((c)++)=(unsigned char)(((l)>> 8)&0xff), \ 200 c[1]=(unsigned char)(((l)>> 8)&0xff), \
140 *((c)++)=(unsigned char)(((l) )&0xff)) 201 c[2]=(unsigned char)(((l) )&0xff)),c+=3)
141 202
142/* LOCAL STUFF */ 203/* LOCAL STUFF */
143 204
@@ -153,60 +214,128 @@
153#define DEC32(a) ((a)=((a)-1)&0xffffffffL) 214#define DEC32(a) ((a)=((a)-1)&0xffffffffL)
154#define MAX_MAC_SIZE 20 /* up from 16 for SSLv3 */ 215#define MAX_MAC_SIZE 20 /* up from 16 for SSLv3 */
155 216
156#define SSL_MKEY_MASK 0x0000001FL 217/*
218 * Define the Bitmasks for SSL_CIPHER.algorithms.
219 * This bits are used packed as dense as possible. If new methods/ciphers
220 * etc will be added, the bits a likely to change, so this information
221 * is for internal library use only, even though SSL_CIPHER.algorithms
222 * can be publicly accessed.
223 * Use the according functions for cipher management instead.
224 *
225 * The bit mask handling in the selection and sorting scheme in
226 * ssl_create_cipher_list() has only limited capabilities, reflecting
227 * that the different entities within are mutually exclusive:
228 * ONLY ONE BIT PER MASK CAN BE SET AT A TIME.
229 */
230#define SSL_MKEY_MASK 0x0000003FL
157#define SSL_kRSA 0x00000001L /* RSA key exchange */ 231#define SSL_kRSA 0x00000001L /* RSA key exchange */
158#define SSL_kDHr 0x00000002L /* DH cert RSA CA cert */ 232#define SSL_kDHr 0x00000002L /* DH cert RSA CA cert */
159#define SSL_kDHd 0x00000004L /* DH cert DSA CA cert */ 233#define SSL_kDHd 0x00000004L /* DH cert DSA CA cert */
160#define SSL_kFZA 0x00000008L 234#define SSL_kFZA 0x00000008L
161#define SSL_kEDH 0x00000010L /* tmp DH key no DH cert */ 235#define SSL_kEDH 0x00000010L /* tmp DH key no DH cert */
236#define SSL_kKRB5 0x00000020L /* Kerberos5 key exchange */
162#define SSL_EDH (SSL_kEDH|(SSL_AUTH_MASK^SSL_aNULL)) 237#define SSL_EDH (SSL_kEDH|(SSL_AUTH_MASK^SSL_aNULL))
163 238
164#define SSL_AUTH_MASK 0x000003e0L 239#define SSL_AUTH_MASK 0x00000FC0L
165#define SSL_aRSA 0x00000020L /* Authenticate with RSA */ 240#define SSL_aRSA 0x00000040L /* Authenticate with RSA */
166#define SSL_aDSS 0x00000040L /* Authenticate with DSS */ 241#define SSL_aDSS 0x00000080L /* Authenticate with DSS */
167#define SSL_DSS SSL_aDSS 242#define SSL_DSS SSL_aDSS
168#define SSL_aFZA 0x00000080L 243#define SSL_aFZA 0x00000100L
169#define SSL_aNULL 0x00000100L /* no Authenticate, ADH */ 244#define SSL_aNULL 0x00000200L /* no Authenticate, ADH */
170#define SSL_aDH 0x00000200L /* no Authenticate, ADH */ 245#define SSL_aDH 0x00000400L /* no Authenticate, ADH */
246#define SSL_aKRB5 0x00000800L /* Authenticate with KRB5 */
171 247
172#define SSL_NULL (SSL_eNULL) 248#define SSL_NULL (SSL_eNULL)
173#define SSL_ADH (SSL_kEDH|SSL_aNULL) 249#define SSL_ADH (SSL_kEDH|SSL_aNULL)
174#define SSL_RSA (SSL_kRSA|SSL_aRSA) 250#define SSL_RSA (SSL_kRSA|SSL_aRSA)
175#define SSL_DH (SSL_kDHr|SSL_kDHd|SSL_kEDH) 251#define SSL_DH (SSL_kDHr|SSL_kDHd|SSL_kEDH)
176#define SSL_FZA (SSL_aFZA|SSL_kFZA|SSL_eFZA) 252#define SSL_FZA (SSL_aFZA|SSL_kFZA|SSL_eFZA)
177 253#define SSL_KRB5 (SSL_kKRB5|SSL_aKRB5)
178#define SSL_ENC_MASK 0x0001Fc00L 254
179#define SSL_DES 0x00000400L 255#define SSL_ENC_MASK 0x0087F000L
180#define SSL_3DES 0x00000800L 256#define SSL_DES 0x00001000L
181#define SSL_RC4 0x00001000L 257#define SSL_3DES 0x00002000L
182#define SSL_RC2 0x00002000L 258#define SSL_RC4 0x00004000L
183#define SSL_IDEA 0x00004000L 259#define SSL_RC2 0x00008000L
184#define SSL_eFZA 0x00008000L 260#define SSL_IDEA 0x00010000L
185#define SSL_eNULL 0x00010000L 261#define SSL_eFZA 0x00020000L
186 262#define SSL_eNULL 0x00040000L
187#define SSL_MAC_MASK 0x00060000L 263#define SSL_AES 0x00800000L
188#define SSL_MD5 0x00020000L 264
189#define SSL_SHA1 0x00040000L 265#define SSL_MAC_MASK 0x00180000L
266#define SSL_MD5 0x00080000L
267#define SSL_SHA1 0x00100000L
190#define SSL_SHA (SSL_SHA1) 268#define SSL_SHA (SSL_SHA1)
191 269
192#define SSL_EXP_MASK 0x00300000L 270#define SSL_SSL_MASK 0x00600000L
193#define SSL_EXP 0x00100000L 271#define SSL_SSLV2 0x00200000L
194#define SSL_NOT_EXP 0x00200000L 272#define SSL_SSLV3 0x00400000L
195#define SSL_EXPORT SSL_EXP 273#define SSL_TLSV1 SSL_SSLV3 /* for now */
196 274
197#define SSL_SSL_MASK 0x00c00000L 275/* we have used 007fffff - 9 bits left to go */
198#define SSL_SSLV2 0x00400000L 276
199#define SSL_SSLV3 0x00800000L 277/*
278 * Export and cipher strength information. For each cipher we have to decide
279 * whether it is exportable or not. This information is likely to change
280 * over time, since the export control rules are no static technical issue.
281 *
282 * Independent of the export flag the cipher strength is sorted into classes.
283 * SSL_EXP40 was denoting the 40bit US export limit of past times, which now
284 * is at 56bit (SSL_EXP56). If the exportable cipher class is going to change
285 * again (eg. to 64bit) the use of "SSL_EXP*" becomes blurred even more,
286 * since SSL_EXP64 could be similar to SSL_LOW.
287 * For this reason SSL_MICRO and SSL_MINI macros are included to widen the
288 * namespace of SSL_LOW-SSL_HIGH to lower values. As development of speed
289 * and ciphers goes, another extension to SSL_SUPER and/or SSL_ULTRA would
290 * be possible.
291 */
292#define SSL_EXP_MASK 0x00000003L
293#define SSL_NOT_EXP 0x00000001L
294#define SSL_EXPORT 0x00000002L
295
296#define SSL_STRONG_MASK 0x0000007cL
297#define SSL_EXP40 0x00000004L
298#define SSL_MICRO (SSL_EXP40)
299#define SSL_EXP56 0x00000008L
300#define SSL_MINI (SSL_EXP56)
301#define SSL_LOW 0x00000010L
302#define SSL_MEDIUM 0x00000020L
303#define SSL_HIGH 0x00000040L
304
305/* we have used 0000007f - 25 bits left to go */
306
307/*
308 * Macros to check the export status and cipher strength for export ciphers.
309 * Even though the macros for EXPORT and EXPORT40/56 have similar names,
310 * their meaning is different:
311 * *_EXPORT macros check the 'exportable' status.
312 * *_EXPORT40/56 macros are used to check whether a certain cipher strength
313 * is given.
314 * Since the SSL_IS_EXPORT* and SSL_EXPORT* macros depend on the correct
315 * algorithm structure element to be passed (algorithms, algo_strength) and no
316 * typechecking can be done as they are all of type unsigned long, their
317 * direct usage is discouraged.
318 * Use the SSL_C_* macros instead.
319 */
320#define SSL_IS_EXPORT(a) ((a)&SSL_EXPORT)
321#define SSL_IS_EXPORT56(a) ((a)&SSL_EXP56)
322#define SSL_IS_EXPORT40(a) ((a)&SSL_EXP40)
323#define SSL_C_IS_EXPORT(c) SSL_IS_EXPORT((c)->algo_strength)
324#define SSL_C_IS_EXPORT56(c) SSL_IS_EXPORT56((c)->algo_strength)
325#define SSL_C_IS_EXPORT40(c) SSL_IS_EXPORT40((c)->algo_strength)
326
327#define SSL_EXPORT_KEYLENGTH(a,s) (SSL_IS_EXPORT40(s) ? 5 : \
328 ((a)&SSL_ENC_MASK) == SSL_DES ? 8 : 7)
329#define SSL_EXPORT_PKEYLENGTH(a) (SSL_IS_EXPORT40(a) ? 512 : 1024)
330#define SSL_C_EXPORT_KEYLENGTH(c) SSL_EXPORT_KEYLENGTH((c)->algorithms, \
331 (c)->algo_strength)
332#define SSL_C_EXPORT_PKEYLENGTH(c) SSL_EXPORT_PKEYLENGTH((c)->algo_strength)
200 333
201#define SSL_STRONG_MASK 0x07000000L
202#define SSL_LOW 0x01000000L
203#define SSL_MEDIUM 0x02000000L
204#define SSL_HIGH 0x04000000L
205 334
206/* we have used 0fffffff - 4 bits left to go */
207#define SSL_ALL 0xffffffffL 335#define SSL_ALL 0xffffffffL
208#define SSL_ALL_CIPHERS (SSL_MKEY_MASK|SSL_AUTH_MASK|SSL_ENC_MASK|\ 336#define SSL_ALL_CIPHERS (SSL_MKEY_MASK|SSL_AUTH_MASK|SSL_ENC_MASK|\
209 SSL_MAC_MASK|SSL_EXP_MASK) 337 SSL_MAC_MASK)
338#define SSL_ALL_STRENGTHS (SSL_EXP_MASK|SSL_STRONG_MASK)
210 339
211/* Mostly for SSLv3 */ 340/* Mostly for SSLv3 */
212#define SSL_PKEY_RSA_ENC 0 341#define SSL_PKEY_RSA_ENC 0
@@ -233,44 +362,59 @@
233typedef struct cert_pkey_st 362typedef struct cert_pkey_st
234 { 363 {
235 X509 *x509; 364 X509 *x509;
236/* EVP_PKEY *publickey; *//* when extracted */
237 EVP_PKEY *privatekey; 365 EVP_PKEY *privatekey;
238 } CERT_PKEY; 366 } CERT_PKEY;
239 367
240typedef struct cert_st 368typedef struct cert_st
241 { 369 {
242 int cert_type;
243
244#ifdef undef
245 X509 *x509;
246 EVP_PKEY *publickey; /* when extracted */
247 EVP_PKEY *privatekey;
248
249 pkeys[SSL_PKEY_RSA_ENC].x509
250/* pkeys[SSL_PKEY_RSA_ENC].publickey */
251 pkeys[SSL_PKEY_RSA_ENC].privatekey
252#endif
253
254 /* Current active set */ 370 /* Current active set */
255 CERT_PKEY *key; 371 CERT_PKEY *key; /* ALWAYS points to an element of the pkeys array
256 372 * Probably it would make more sense to store
373 * an index, not a pointer. */
374
257 /* The following masks are for the key and auth 375 /* The following masks are for the key and auth
258 * algorithms that are supported by the certs below */ 376 * algorithms that are supported by the certs below */
259 int valid; 377 int valid;
260 unsigned long mask; 378 unsigned long mask;
261 unsigned long export_mask; 379 unsigned long export_mask;
262 380#ifndef OPENSSL_NO_RSA
263 RSA *rsa_tmp; 381 RSA *rsa_tmp;
382 RSA *(*rsa_tmp_cb)(SSL *ssl,int is_export,int keysize);
383#endif
384#ifndef OPENSSL_NO_DH
264 DH *dh_tmp; 385 DH *dh_tmp;
265 RSA *(*rsa_tmp_cb)(); 386 DH *(*dh_tmp_cb)(SSL *ssl,int is_export,int keysize);
266 DH *(*dh_tmp_cb)(); 387#endif
267 CERT_PKEY pkeys[SSL_PKEY_NUM];
268 388
269 STACK *cert_chain; 389 CERT_PKEY pkeys[SSL_PKEY_NUM];
270 390
271 int references; 391 int references; /* >1 only if SSL_copy_session_id is used */
272 } CERT; 392 } CERT;
273 393
394
395typedef struct sess_cert_st
396 {
397 STACK_OF(X509) *cert_chain; /* as received from peer (not for SSL2) */
398
399 /* The 'peer_...' members are used only by clients. */
400 int peer_cert_type;
401
402 CERT_PKEY *peer_key; /* points to an element of peer_pkeys (never NULL!) */
403 CERT_PKEY peer_pkeys[SSL_PKEY_NUM];
404 /* Obviously we don't have the private keys of these,
405 * so maybe we shouldn't even use the CERT_PKEY type here. */
406
407#ifndef OPENSSL_NO_RSA
408 RSA *peer_rsa_tmp; /* not used for SSL 2 */
409#endif
410#ifndef OPENSSL_NO_DH
411 DH *peer_dh_tmp; /* not used for SSL 2 */
412#endif
413
414 int references; /* actually always 1 at the moment */
415 } SESS_CERT;
416
417
274/*#define MAC_DEBUG */ 418/*#define MAC_DEBUG */
275 419
276/*#define ERR_DEBUG */ 420/*#define ERR_DEBUG */
@@ -282,12 +426,7 @@ typedef struct cert_st
282/*#define RSA_DEBUG */ 426/*#define RSA_DEBUG */
283/*#define IDEA_DEBUG */ 427/*#define IDEA_DEBUG */
284 428
285#ifndef NOPROTO
286#define FP_ICC (int (*)(const void *,const void *)) 429#define FP_ICC (int (*)(const void *,const void *))
287#else
288#define FP_ICC
289#endif
290
291#define ssl_put_cipher_by_char(ssl,ciph,ptr) \ 430#define ssl_put_cipher_by_char(ssl,ciph,ptr) \
292 ((ssl)->method->put_cipher_by_char((ciph),(ptr))) 431 ((ssl)->method->put_cipher_by_char((ciph),(ptr)))
293#define ssl_get_cipher_by_char(ssl,ptr) \ 432#define ssl_get_cipher_by_char(ssl,ptr) \
@@ -295,29 +434,41 @@ typedef struct cert_st
295 434
296/* This is for the SSLv3/TLSv1.0 differences in crypto/hash stuff 435/* This is for the SSLv3/TLSv1.0 differences in crypto/hash stuff
297 * It is a bit of a mess of functions, but hell, think of it as 436 * It is a bit of a mess of functions, but hell, think of it as
298 * an opaque strucute :-) */ 437 * an opaque structure :-) */
299typedef struct ssl3_enc_method 438typedef struct ssl3_enc_method
300 { 439 {
301 int (*enc)(); 440 int (*enc)(SSL *, int);
302 int (*mac)(); 441 int (*mac)(SSL *, unsigned char *, int);
303 int (*setup_key_block)(); 442 int (*setup_key_block)(SSL *);
304 int (*generate_master_secret)(); 443 int (*generate_master_secret)(SSL *, unsigned char *, unsigned char *, int);
305 int (*change_cipher_state)(); 444 int (*change_cipher_state)(SSL *, int);
306 int (*final_finish_mac)(); 445 int (*final_finish_mac)(SSL *, EVP_MD_CTX *, EVP_MD_CTX *, const char *, int, unsigned char *);
307 int finish_mac_length; 446 int finish_mac_length;
308 int (*cert_verify_mac)(); 447 int (*cert_verify_mac)(SSL *, EVP_MD_CTX *, unsigned char *);
309 unsigned char client_finished[20]; 448 const char *client_finished_label;
310 int client_finished_len; 449 int client_finished_label_len;
311 unsigned char server_finished[20]; 450 const char *server_finished_label;
312 int server_finished_len; 451 int server_finished_label_len;
313 int (*alert_value)(); 452 int (*alert_value)(int);
314 } SSL3_ENC_METHOD; 453 } SSL3_ENC_METHOD;
315 454
316extern SSL3_ENC_METHOD ssl3_undef_enc_method; 455/* Used for holding the relevant compression methods loaded into SSL_CTX */
317extern SSL_CIPHER ssl2_ciphers[]; 456typedef struct ssl3_comp_st
318extern SSL_CIPHER ssl3_ciphers[]; 457 {
458 int comp_id; /* The identifier byte for this compression type */
459 char *name; /* Text name used for the compression type */
460 COMP_METHOD *method; /* The method :-) */
461 } SSL3_COMP;
462
463OPENSSL_EXTERN SSL3_ENC_METHOD ssl3_undef_enc_method;
464OPENSSL_EXTERN SSL_CIPHER ssl2_ciphers[];
465OPENSSL_EXTERN SSL_CIPHER ssl3_ciphers[];
466
467#ifdef OPENSSL_SYS_VMS
468#undef SSL_COMP_get_compression_methods
469#define SSL_COMP_get_compression_methods SSL_COMP_get_compress_methods
470#endif
319 471
320#ifndef NOPROTO
321 472
322SSL_METHOD *ssl_bad_method(int ver); 473SSL_METHOD *ssl_bad_method(int ver);
323SSL_METHOD *sslv2_base_method(void); 474SSL_METHOD *sslv2_base_method(void);
@@ -327,33 +478,42 @@ SSL_METHOD *sslv3_base_method(void);
327void ssl_clear_cipher_ctx(SSL *s); 478void ssl_clear_cipher_ctx(SSL *s);
328int ssl_clear_bad_session(SSL *s); 479int ssl_clear_bad_session(SSL *s);
329CERT *ssl_cert_new(void); 480CERT *ssl_cert_new(void);
481CERT *ssl_cert_dup(CERT *cert);
482int ssl_cert_inst(CERT **o);
330void ssl_cert_free(CERT *c); 483void ssl_cert_free(CERT *c);
331int ssl_set_cert_type(CERT *c, int type); 484SESS_CERT *ssl_sess_cert_new(void);
485void ssl_sess_cert_free(SESS_CERT *sc);
486int ssl_set_peer_cert_type(SESS_CERT *c, int type);
332int ssl_get_new_session(SSL *s, int session); 487int ssl_get_new_session(SSL *s, int session);
333int ssl_get_prev_session(SSL *s, unsigned char *session,int len); 488int ssl_get_prev_session(SSL *s, unsigned char *session,int len);
334int ssl_cipher_id_cmp(SSL_CIPHER *a,SSL_CIPHER *b); 489int ssl_cipher_id_cmp(const SSL_CIPHER *a,const SSL_CIPHER *b);
335int ssl_cipher_ptr_id_cmp(SSL_CIPHER **ap,SSL_CIPHER **bp); 490int ssl_cipher_ptr_id_cmp(const SSL_CIPHER * const *ap,
336STACK *ssl_bytes_to_cipher_list(SSL *s,unsigned char *p,int num,STACK **skp); 491 const SSL_CIPHER * const *bp);
337int ssl_cipher_list_to_bytes(SSL *s,STACK *sk,unsigned char *p); 492STACK_OF(SSL_CIPHER) *ssl_bytes_to_cipher_list(SSL *s,unsigned char *p,int num,
338STACK *ssl_create_cipher_list(SSL_METHOD *meth,STACK **pref, 493 STACK_OF(SSL_CIPHER) **skp);
339 STACK **sorted,char *str); 494int ssl_cipher_list_to_bytes(SSL *s,STACK_OF(SSL_CIPHER) *sk,unsigned char *p);
495STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(const SSL_METHOD *meth,
496 STACK_OF(SSL_CIPHER) **pref,
497 STACK_OF(SSL_CIPHER) **sorted,
498 const char *rule_str);
340void ssl_update_cache(SSL *s, int mode); 499void ssl_update_cache(SSL *s, int mode);
341int ssl_cipher_get_evp(SSL_CIPHER *c, EVP_CIPHER **enc, EVP_MD **md); 500int ssl_cipher_get_evp(SSL_SESSION *s,const EVP_CIPHER **enc,const EVP_MD **md,
342int ssl_verify_cert_chain(SSL *s,STACK *sk); 501 SSL_COMP **comp);
502int ssl_verify_cert_chain(SSL *s,STACK_OF(X509) *sk);
343int ssl_undefined_function(SSL *s); 503int ssl_undefined_function(SSL *s);
344X509 *ssl_get_server_send_cert(SSL *); 504X509 *ssl_get_server_send_cert(SSL *);
345EVP_PKEY *ssl_get_sign_pkey(SSL *,SSL_CIPHER *); 505EVP_PKEY *ssl_get_sign_pkey(SSL *,SSL_CIPHER *);
346int ssl_cert_type(X509 *x,EVP_PKEY *pkey); 506int ssl_cert_type(X509 *x,EVP_PKEY *pkey);
347void ssl_set_cert_masks(CERT *c); 507void ssl_set_cert_masks(CERT *c, SSL_CIPHER *cipher);
348STACK *ssl_get_ciphers_by_id(SSL *s); 508STACK_OF(SSL_CIPHER) *ssl_get_ciphers_by_id(SSL *s);
349int ssl_verify_alarm_type(long type); 509int ssl_verify_alarm_type(long type);
350 510
351int ssl2_enc_init(SSL *s, int client); 511int ssl2_enc_init(SSL *s, int client);
352void ssl2_generate_key_material(SSL *s); 512void ssl2_generate_key_material(SSL *s);
353void ssl2_enc(SSL *s,int send_data); 513void ssl2_enc(SSL *s,int send_data);
354void ssl2_mac(SSL *s,unsigned char *mac,int send_data); 514void ssl2_mac(SSL *s,unsigned char *mac,int send_data);
355SSL_CIPHER *ssl2_get_cipher_by_char(unsigned char *p); 515SSL_CIPHER *ssl2_get_cipher_by_char(const unsigned char *p);
356int ssl2_put_cipher_by_char(SSL_CIPHER *c,unsigned char *p); 516int ssl2_put_cipher_by_char(const SSL_CIPHER *c,unsigned char *p);
357int ssl2_part_read(SSL *s, unsigned long f, int i); 517int ssl2_part_read(SSL *s, unsigned long f, int i);
358int ssl2_do_write(SSL *s); 518int ssl2_do_write(SSL *s);
359int ssl2_set_certificate(SSL *s, int type, int len, unsigned char *data); 519int ssl2_set_certificate(SSL *s, int type, int len, unsigned char *data);
@@ -365,17 +525,19 @@ int ssl2_new(SSL *s);
365void ssl2_free(SSL *s); 525void ssl2_free(SSL *s);
366int ssl2_accept(SSL *s); 526int ssl2_accept(SSL *s);
367int ssl2_connect(SSL *s); 527int ssl2_connect(SSL *s);
368int ssl2_read(SSL *s, char *buf, int len); 528int ssl2_read(SSL *s, void *buf, int len);
369int ssl2_peek(SSL *s, char *buf, int len); 529int ssl2_peek(SSL *s, void *buf, int len);
370int ssl2_write(SSL *s, char *buf, int len); 530int ssl2_write(SSL *s, const void *buf, int len);
371int ssl2_shutdown(SSL *s); 531int ssl2_shutdown(SSL *s);
372void ssl2_clear(SSL *s); 532void ssl2_clear(SSL *s);
373long ssl2_ctrl(SSL *s,int cmd, long larg, char *parg); 533long ssl2_ctrl(SSL *s,int cmd, long larg, void *parg);
374long ssl2_ctx_ctrl(SSL_CTX *s,int cmd, long larg, char *parg); 534long ssl2_ctx_ctrl(SSL_CTX *s,int cmd, long larg, void *parg);
535long ssl2_callback_ctrl(SSL *s,int cmd, void (*fp)());
536long ssl2_ctx_callback_ctrl(SSL_CTX *s,int cmd, void (*fp)());
375int ssl2_pending(SSL *s); 537int ssl2_pending(SSL *s);
376 538
377SSL_CIPHER *ssl3_get_cipher_by_char(unsigned char *p); 539SSL_CIPHER *ssl3_get_cipher_by_char(const unsigned char *p);
378int ssl3_put_cipher_by_char(SSL_CIPHER *c,unsigned char *p); 540int ssl3_put_cipher_by_char(const SSL_CIPHER *c,unsigned char *p);
379void ssl3_init_finished_mac(SSL *s); 541void ssl3_init_finished_mac(SSL *s);
380int ssl3_send_server_certificate(SSL *s); 542int ssl3_send_server_certificate(SSL *s);
381int ssl3_get_finished(SSL *s,int state_a,int state_b); 543int ssl3_get_finished(SSL *s,int state_a,int state_b);
@@ -389,35 +551,37 @@ int ssl3_generate_master_secret(SSL *s, unsigned char *out,
389 unsigned char *p, int len); 551 unsigned char *p, int len);
390int ssl3_get_req_cert_type(SSL *s,unsigned char *p); 552int ssl3_get_req_cert_type(SSL *s,unsigned char *p);
391long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok); 553long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok);
392int ssl3_send_finished(SSL *s, int a, int b, unsigned char *sender,int slen); 554int ssl3_send_finished(SSL *s, int a, int b, const char *sender,int slen);
393int ssl3_num_ciphers(void); 555int ssl3_num_ciphers(void);
394SSL_CIPHER *ssl3_get_cipher(unsigned int u); 556SSL_CIPHER *ssl3_get_cipher(unsigned int u);
395int ssl3_renegotiate(SSL *ssl); 557int ssl3_renegotiate(SSL *ssl);
396int ssl3_renegotiate_check(SSL *ssl); 558int ssl3_renegotiate_check(SSL *ssl);
397int ssl3_dispatch_alert(SSL *s); 559int ssl3_dispatch_alert(SSL *s);
398int ssl3_read_bytes(SSL *s, int type, char *buf, int len); 560int ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek);
399int ssl3_part_read(SSL *s, int i); 561int ssl3_write_bytes(SSL *s, int type, const void *buf, int len);
400int ssl3_write_bytes(SSL *s, int type, char *buf, int len); 562int ssl3_final_finish_mac(SSL *s, EVP_MD_CTX *ctx1, EVP_MD_CTX *ctx2,
401int ssl3_final_finish_mac(SSL *s, EVP_MD_CTX *ctx1,EVP_MD_CTX *ctx2, 563 const char *sender, int slen,unsigned char *p);
402 unsigned char *sender, int slen,unsigned char *p);
403int ssl3_cert_verify_mac(SSL *s, EVP_MD_CTX *in, unsigned char *p); 564int ssl3_cert_verify_mac(SSL *s, EVP_MD_CTX *in, unsigned char *p);
404void ssl3_finish_mac(SSL *s, unsigned char *buf, int len); 565void ssl3_finish_mac(SSL *s, const unsigned char *buf, int len);
405int ssl3_enc(SSL *s, int send_data); 566int ssl3_enc(SSL *s, int send_data);
406int ssl3_mac(SSL *ssl, unsigned char *md, int send_data); 567int ssl3_mac(SSL *ssl, unsigned char *md, int send_data);
407unsigned long ssl3_output_cert_chain(SSL *s, X509 *x); 568unsigned long ssl3_output_cert_chain(SSL *s, X509 *x);
408SSL_CIPHER *ssl3_choose_cipher(SSL *ssl,STACK *have,STACK *pref); 569SSL_CIPHER *ssl3_choose_cipher(SSL *ssl,STACK_OF(SSL_CIPHER) *clnt,
570 STACK_OF(SSL_CIPHER) *srvr);
409int ssl3_setup_buffers(SSL *s); 571int ssl3_setup_buffers(SSL *s);
410int ssl3_new(SSL *s); 572int ssl3_new(SSL *s);
411void ssl3_free(SSL *s); 573void ssl3_free(SSL *s);
412int ssl3_accept(SSL *s); 574int ssl3_accept(SSL *s);
413int ssl3_connect(SSL *s); 575int ssl3_connect(SSL *s);
414int ssl3_read(SSL *s, char *buf, int len); 576int ssl3_read(SSL *s, void *buf, int len);
415int ssl3_peek(SSL *s,char *buf, int len); 577int ssl3_peek(SSL *s, void *buf, int len);
416int ssl3_write(SSL *s, char *buf, int len); 578int ssl3_write(SSL *s, const void *buf, int len);
417int ssl3_shutdown(SSL *s); 579int ssl3_shutdown(SSL *s);
418void ssl3_clear(SSL *s); 580void ssl3_clear(SSL *s);
419long ssl3_ctrl(SSL *s,int cmd, long larg, char *parg); 581long ssl3_ctrl(SSL *s,int cmd, long larg, void *parg);
420long ssl3_ctx_ctrl(SSL_CTX *s,int cmd, long larg, char *parg); 582long ssl3_ctx_ctrl(SSL_CTX *s,int cmd, long larg, void *parg);
583long ssl3_callback_ctrl(SSL *s,int cmd, void (*fp)());
584long ssl3_ctx_callback_ctrl(SSL_CTX *s,int cmd, void (*fp)());
421int ssl3_pending(SSL *s); 585int ssl3_pending(SSL *s);
422 586
423int ssl23_accept(SSL *s); 587int ssl23_accept(SSL *s);
@@ -428,131 +592,28 @@ int ssl23_write_bytes(SSL *s);
428int tls1_new(SSL *s); 592int tls1_new(SSL *s);
429void tls1_free(SSL *s); 593void tls1_free(SSL *s);
430void tls1_clear(SSL *s); 594void tls1_clear(SSL *s);
431long tls1_ctrl(SSL *s,int cmd, long larg, char *parg); 595long tls1_ctrl(SSL *s,int cmd, long larg, void *parg);
596long tls1_callback_ctrl(SSL *s,int cmd, void (*fp)());
432SSL_METHOD *tlsv1_base_method(void ); 597SSL_METHOD *tlsv1_base_method(void );
433 598
434
435int ssl_init_wbio_buffer(SSL *s, int push); 599int ssl_init_wbio_buffer(SSL *s, int push);
600void ssl_free_wbio_buffer(SSL *s);
436 601
437int tls1_change_cipher_state(SSL *s, int which); 602int tls1_change_cipher_state(SSL *s, int which);
438int tls1_setup_key_block(SSL *s); 603int tls1_setup_key_block(SSL *s);
439int tls1_enc(SSL *s, int snd); 604int tls1_enc(SSL *s, int snd);
440int tls1_final_finish_mac(SSL *s, EVP_MD_CTX *in1_ctx, EVP_MD_CTX *in2_ctx, 605int tls1_final_finish_mac(SSL *s, EVP_MD_CTX *in1_ctx, EVP_MD_CTX *in2_ctx,
441 unsigned char *str, int slen, unsigned char *p); 606 const char *str, int slen, unsigned char *p);
442int tls1_cert_verify_mac(SSL *s, EVP_MD_CTX *in, unsigned char *p); 607int tls1_cert_verify_mac(SSL *s, EVP_MD_CTX *in, unsigned char *p);
443int tls1_mac(SSL *ssl, unsigned char *md, int snd); 608int tls1_mac(SSL *ssl, unsigned char *md, int snd);
444int tls1_generate_master_secret(SSL *s, unsigned char *out, 609int tls1_generate_master_secret(SSL *s, unsigned char *out,
445 unsigned char *p, int len); 610 unsigned char *p, int len);
446int tls1_alert_code(int code); 611int tls1_alert_code(int code);
447int ssl3_alert_code(int code); 612int ssl3_alert_code(int code);
613int ssl_ok(SSL *s);
448 614
615SSL_COMP *ssl3_comp_find(STACK_OF(SSL_COMP) *sk, int n);
616STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void);
449 617
450#else
451
452SSL_METHOD *ssl_bad_method();
453SSL_METHOD *sslv2_base_method();
454SSL_METHOD *sslv23_base_method();
455SSL_METHOD *sslv3_base_method();
456
457void ssl_clear_cipher_ctx();
458int ssl_clear_bad_session();
459CERT *ssl_cert_new();
460void ssl_cert_free();
461int ssl_set_cert_type();
462int ssl_get_new_session();
463int ssl_get_prev_session();
464int ssl_cipher_id_cmp();
465int ssl_cipher_ptr_id_cmp();
466STACK *ssl_bytes_to_cipher_list();
467int ssl_cipher_list_to_bytes();
468STACK *ssl_create_cipher_list();
469void ssl_update_cache();
470int ssl_session_get_ciphers();
471int ssl_verify_cert_chain();
472int ssl_undefined_function();
473X509 *ssl_get_server_send_cert();
474EVP_PKEY *ssl_get_sign_pkey();
475int ssl_cert_type();
476void ssl_set_cert_masks();
477STACK *ssl_get_ciphers_by_id();
478int ssl_verify_alarm_type();
479
480int ssl2_enc_init();
481void ssl2_generate_key_material();
482void ssl2_enc();
483void ssl2_mac();
484SSL_CIPHER *ssl2_get_cipher_by_char();
485int ssl2_put_cipher_by_char();
486int ssl2_part_read();
487int ssl2_do_write();
488int ssl2_set_certificate();
489void ssl2_return_error();
490void ssl2_write_error();
491int ssl2_num_ciphers();
492SSL_CIPHER *ssl2_get_cipher();
493int ssl2_new();
494void ssl2_free();
495int ssl2_accept();
496int ssl2_connect();
497int ssl2_read();
498int ssl2_peek();
499int ssl2_write();
500int ssl2_shutdown();
501void ssl2_clear();
502long ssl2_ctrl();
503long ssl2_ctx_ctrl();
504int ssl2_pending();
505
506SSL_CIPHER *ssl3_get_cipher_by_char();
507int ssl3_put_cipher_by_char();
508void ssl3_init_finished_mac();
509int ssl3_send_server_certificate();
510int ssl3_get_finished();
511int ssl3_setup_key_block();
512int ssl3_send_change_cipher_spec();
513int ssl3_change_cipher_state();
514void ssl3_cleanup_key_block();
515int ssl3_do_write();
516void ssl3_send_alert();
517int ssl3_generate_master_secret();
518int ssl3_get_req_cert_type();
519long ssl3_get_message();
520int ssl3_send_finished();
521int ssl3_num_ciphers();
522SSL_CIPHER *ssl3_get_cipher();
523int ssl3_renegotiate();
524int ssl3_renegotiate_check();
525int ssl3_dispatch_alert();
526int ssl3_read_bytes();
527int ssl3_part_read();
528int ssl3_write_bytes();
529int ssl3_final_finish_mac();
530void ssl3_finish_mac();
531int ssl3_enc();
532int ssl3_mac();
533unsigned long ssl3_output_cert_chain();
534SSL_CIPHER *ssl3_choose_cipher();
535int ssl3_setup_buffers();
536int ssl3_new();
537void ssl3_free();
538int ssl3_accept();
539int ssl3_connect();
540int ssl3_read();
541int ssl3_peek();
542int ssl3_write();
543int ssl3_shutdown();
544void ssl3_clear();
545long ssl3_ctrl();
546long ssl3_ctx_ctrl();
547int ssl3_pending();
548
549int ssl23_accept();
550int ssl23_connect();
551int ssl23_read_bytes();
552int ssl23_write_bytes();
553
554int ssl_init_wbio_buffer();
555
556#endif
557 618
558#endif 619#endif
diff --git a/src/lib/libssl/ssl_rsa.c b/src/lib/libssl/ssl_rsa.c
index 140475e5fb..1cf8e20934 100644
--- a/src/lib/libssl/ssl_rsa.c
+++ b/src/lib/libssl/ssl_rsa.c
@@ -57,53 +57,32 @@
57 */ 57 */
58 58
59#include <stdio.h> 59#include <stdio.h>
60#include "bio.h" 60#include <openssl/bio.h>
61#include "objects.h" 61#include <openssl/objects.h>
62#include "evp.h" 62#include <openssl/evp.h>
63#include "x509.h" 63#include <openssl/x509.h>
64#include "pem.h" 64#include <openssl/pem.h>
65#include "ssl_locl.h" 65#include "ssl_locl.h"
66 66
67#ifndef NOPROTO
68static int ssl_set_cert(CERT *c, X509 *x509); 67static int ssl_set_cert(CERT *c, X509 *x509);
69static int ssl_set_pkey(CERT *c, EVP_PKEY *pkey); 68static int ssl_set_pkey(CERT *c, EVP_PKEY *pkey);
70#else 69int SSL_use_certificate(SSL *ssl, X509 *x)
71static int ssl_set_cert();
72static int ssl_set_pkey();
73#endif
74
75int SSL_use_certificate(ssl, x)
76SSL *ssl;
77X509 *x;
78 { 70 {
79 CERT *c;
80
81 if (x == NULL) 71 if (x == NULL)
82 { 72 {
83 SSLerr(SSL_F_SSL_USE_CERTIFICATE,ERR_R_PASSED_NULL_PARAMETER); 73 SSLerr(SSL_F_SSL_USE_CERTIFICATE,ERR_R_PASSED_NULL_PARAMETER);
84 return(0); 74 return(0);
85 } 75 }
86 if ((ssl->cert == NULL) || (ssl->cert == ssl->ctx->default_cert)) 76 if (!ssl_cert_inst(&ssl->cert))
87 { 77 {
88 c=ssl_cert_new(); 78 SSLerr(SSL_F_SSL_USE_CERTIFICATE,ERR_R_MALLOC_FAILURE);
89 if (c == NULL) 79 return(0);
90 {
91 SSLerr(SSL_F_SSL_USE_CERTIFICATE,ERR_R_MALLOC_FAILURE);
92 return(0);
93 }
94 if (ssl->cert != NULL) ssl_cert_free(ssl->cert);
95 ssl->cert=c;
96 } 80 }
97 c=ssl->cert; 81 return(ssl_set_cert(ssl->cert,x));
98
99 return(ssl_set_cert(c,x));
100 } 82 }
101 83
102#ifndef NO_STDIO 84#ifndef OPENSSL_NO_STDIO
103int SSL_use_certificate_file(ssl, file, type) 85int SSL_use_certificate_file(SSL *ssl, const char *file, int type)
104SSL *ssl;
105char *file;
106int type;
107 { 86 {
108 int j; 87 int j;
109 BIO *in; 88 BIO *in;
@@ -130,7 +109,7 @@ int type;
130 else if (type == SSL_FILETYPE_PEM) 109 else if (type == SSL_FILETYPE_PEM)
131 { 110 {
132 j=ERR_R_PEM_LIB; 111 j=ERR_R_PEM_LIB;
133 x=PEM_read_bio_X509(in,NULL,ssl->ctx->default_passwd_callback); 112 x=PEM_read_bio_X509(in,NULL,ssl->ctx->default_passwd_callback,ssl->ctx->default_passwd_callback_userdata);
134 } 113 }
135 else 114 else
136 { 115 {
@@ -152,10 +131,7 @@ end:
152 } 131 }
153#endif 132#endif
154 133
155int SSL_use_certificate_ASN1(ssl, len, d) 134int SSL_use_certificate_ASN1(SSL *ssl, unsigned char *d, int len)
156SSL *ssl;
157int len;
158unsigned char *d;
159 { 135 {
160 X509 *x; 136 X509 *x;
161 int ret; 137 int ret;
@@ -172,12 +148,9 @@ unsigned char *d;
172 return(ret); 148 return(ret);
173 } 149 }
174 150
175#ifndef NO_RSA 151#ifndef OPENSSL_NO_RSA
176int SSL_use_RSAPrivateKey(ssl, rsa) 152int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa)
177SSL *ssl;
178RSA *rsa;
179 { 153 {
180 CERT *c;
181 EVP_PKEY *pkey; 154 EVP_PKEY *pkey;
182 int ret; 155 int ret;
183 156
@@ -186,37 +159,27 @@ RSA *rsa;
186 SSLerr(SSL_F_SSL_USE_RSAPRIVATEKEY,ERR_R_PASSED_NULL_PARAMETER); 159 SSLerr(SSL_F_SSL_USE_RSAPRIVATEKEY,ERR_R_PASSED_NULL_PARAMETER);
187 return(0); 160 return(0);
188 } 161 }
189 162 if (!ssl_cert_inst(&ssl->cert))
190 if ((ssl->cert == NULL) || (ssl->cert == ssl->ctx->default_cert)) 163 {
191 { 164 SSLerr(SSL_F_SSL_USE_RSAPRIVATEKEY,ERR_R_MALLOC_FAILURE);
192 c=ssl_cert_new(); 165 return(0);
193 if (c == NULL)
194 {
195 SSLerr(SSL_F_SSL_USE_RSAPRIVATEKEY,ERR_R_MALLOC_FAILURE);
196 return(0);
197 }
198 if (ssl->cert != NULL) ssl_cert_free(ssl->cert);
199 ssl->cert=c;
200 } 166 }
201 c=ssl->cert;
202 if ((pkey=EVP_PKEY_new()) == NULL) 167 if ((pkey=EVP_PKEY_new()) == NULL)
203 { 168 {
204 SSLerr(SSL_F_SSL_USE_RSAPRIVATEKEY,ERR_R_EVP_LIB); 169 SSLerr(SSL_F_SSL_USE_RSAPRIVATEKEY,ERR_R_EVP_LIB);
205 return(0); 170 return(0);
206 } 171 }
207 172
208 CRYPTO_add(&rsa->references,1,CRYPTO_LOCK_RSA); 173 RSA_up_ref(rsa);
209 EVP_PKEY_assign_RSA(pkey,rsa); 174 EVP_PKEY_assign_RSA(pkey,rsa);
210 175
211 ret=ssl_set_pkey(c,pkey); 176 ret=ssl_set_pkey(ssl->cert,pkey);
212 EVP_PKEY_free(pkey); 177 EVP_PKEY_free(pkey);
213 return(ret); 178 return(ret);
214 } 179 }
215#endif 180#endif
216 181
217static int ssl_set_pkey(c,pkey) 182static int ssl_set_pkey(CERT *c, EVP_PKEY *pkey)
218CERT *c;
219EVP_PKEY *pkey;
220 { 183 {
221 int i,ok=0,bad=0; 184 int i,ok=0,bad=0;
222 185
@@ -229,7 +192,13 @@ EVP_PKEY *pkey;
229 192
230 if (c->pkeys[i].x509 != NULL) 193 if (c->pkeys[i].x509 != NULL)
231 { 194 {
232#ifndef NO_RSA 195 EVP_PKEY *pktmp;
196 pktmp = X509_get_pubkey(c->pkeys[i].x509);
197 EVP_PKEY_copy_parameters(pktmp,pkey);
198 EVP_PKEY_free(pktmp);
199 ERR_clear_error();
200
201#ifndef OPENSSL_NO_RSA
233 /* Don't check the public/private key, this is mostly 202 /* Don't check the public/private key, this is mostly
234 * for smart cards. */ 203 * for smart cards. */
235 if ((pkey->type == EVP_PKEY_RSA) && 204 if ((pkey->type == EVP_PKEY_RSA) &&
@@ -282,12 +251,9 @@ EVP_PKEY *pkey;
282 return(1); 251 return(1);
283 } 252 }
284 253
285#ifndef NO_RSA 254#ifndef OPENSSL_NO_RSA
286#ifndef NO_STDIO 255#ifndef OPENSSL_NO_STDIO
287int SSL_use_RSAPrivateKey_file(ssl, file, type) 256int SSL_use_RSAPrivateKey_file(SSL *ssl, const char *file, int type)
288SSL *ssl;
289char *file;
290int type;
291 { 257 {
292 int j,ret=0; 258 int j,ret=0;
293 BIO *in; 259 BIO *in;
@@ -314,7 +280,7 @@ int type;
314 { 280 {
315 j=ERR_R_PEM_LIB; 281 j=ERR_R_PEM_LIB;
316 rsa=PEM_read_bio_RSAPrivateKey(in,NULL, 282 rsa=PEM_read_bio_RSAPrivateKey(in,NULL,
317 ssl->ctx->default_passwd_callback); 283 ssl->ctx->default_passwd_callback,ssl->ctx->default_passwd_callback_userdata);
318 } 284 }
319 else 285 else
320 { 286 {
@@ -334,13 +300,10 @@ end:
334 } 300 }
335#endif 301#endif
336 302
337int SSL_use_RSAPrivateKey_ASN1(ssl,d,len) 303int SSL_use_RSAPrivateKey_ASN1(SSL *ssl, unsigned char *d, long len)
338SSL *ssl;
339unsigned char *d;
340long len;
341 { 304 {
342 int ret; 305 int ret;
343 unsigned char *p; 306 const unsigned char *p;
344 RSA *rsa; 307 RSA *rsa;
345 308
346 p=d; 309 p=d;
@@ -354,13 +317,10 @@ long len;
354 RSA_free(rsa); 317 RSA_free(rsa);
355 return(ret); 318 return(ret);
356 } 319 }
357#endif /* !NO_RSA */ 320#endif /* !OPENSSL_NO_RSA */
358 321
359int SSL_use_PrivateKey(ssl, pkey) 322int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey)
360SSL *ssl;
361EVP_PKEY *pkey;
362 { 323 {
363 CERT *c;
364 int ret; 324 int ret;
365 325
366 if (pkey == NULL) 326 if (pkey == NULL)
@@ -368,29 +328,17 @@ EVP_PKEY *pkey;
368 SSLerr(SSL_F_SSL_USE_PRIVATEKEY,ERR_R_PASSED_NULL_PARAMETER); 328 SSLerr(SSL_F_SSL_USE_PRIVATEKEY,ERR_R_PASSED_NULL_PARAMETER);
369 return(0); 329 return(0);
370 } 330 }
371 331 if (!ssl_cert_inst(&ssl->cert))
372 if ((ssl->cert == NULL) || (ssl->cert == ssl->ctx->default_cert)) 332 {
373 { 333 SSLerr(SSL_F_SSL_USE_PRIVATEKEY,ERR_R_MALLOC_FAILURE);
374 c=ssl_cert_new(); 334 return(0);
375 if (c == NULL)
376 {
377 SSLerr(SSL_F_SSL_USE_PRIVATEKEY,ERR_R_MALLOC_FAILURE);
378 return(0);
379 }
380 if (ssl->cert != NULL) ssl_cert_free(ssl->cert);
381 ssl->cert=c;
382 } 335 }
383 c=ssl->cert; 336 ret=ssl_set_pkey(ssl->cert,pkey);
384
385 ret=ssl_set_pkey(c,pkey);
386 return(ret); 337 return(ret);
387 } 338 }
388 339
389#ifndef NO_STDIO 340#ifndef OPENSSL_NO_STDIO
390int SSL_use_PrivateKey_file(ssl, file, type) 341int SSL_use_PrivateKey_file(SSL *ssl, const char *file, int type)
391SSL *ssl;
392char *file;
393int type;
394 { 342 {
395 int j,ret=0; 343 int j,ret=0;
396 BIO *in; 344 BIO *in;
@@ -412,7 +360,7 @@ int type;
412 { 360 {
413 j=ERR_R_PEM_LIB; 361 j=ERR_R_PEM_LIB;
414 pkey=PEM_read_bio_PrivateKey(in,NULL, 362 pkey=PEM_read_bio_PrivateKey(in,NULL,
415 ssl->ctx->default_passwd_callback); 363 ssl->ctx->default_passwd_callback,ssl->ctx->default_passwd_callback_userdata);
416 } 364 }
417 else 365 else
418 { 366 {
@@ -432,11 +380,7 @@ end:
432 } 380 }
433#endif 381#endif
434 382
435int SSL_use_PrivateKey_ASN1(type,ssl,d,len) 383int SSL_use_PrivateKey_ASN1(int type, SSL *ssl, unsigned char *d, long len)
436int type;
437SSL *ssl;
438unsigned char *d;
439long len;
440 { 384 {
441 int ret; 385 int ret;
442 unsigned char *p; 386 unsigned char *p;
@@ -454,36 +398,22 @@ long len;
454 return(ret); 398 return(ret);
455 } 399 }
456 400
457int SSL_CTX_use_certificate(ctx, x) 401int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x)
458SSL_CTX *ctx;
459X509 *x;
460 { 402 {
461 CERT *c;
462
463 if (x == NULL) 403 if (x == NULL)
464 { 404 {
465 SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE,ERR_R_PASSED_NULL_PARAMETER); 405 SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE,ERR_R_PASSED_NULL_PARAMETER);
466 return(0); 406 return(0);
467 } 407 }
468 408 if (!ssl_cert_inst(&ctx->cert))
469 if (ctx->default_cert == NULL)
470 { 409 {
471 c=ssl_cert_new(); 410 SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE,ERR_R_MALLOC_FAILURE);
472 if (c == NULL) 411 return(0);
473 {
474 SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE,ERR_R_MALLOC_FAILURE);
475 return(0);
476 }
477 ctx->default_cert=c;
478 } 412 }
479 c=ctx->default_cert; 413 return(ssl_set_cert(ctx->cert, x));
480
481 return(ssl_set_cert(c,x));
482 } 414 }
483 415
484static int ssl_set_cert(c,x) 416static int ssl_set_cert(CERT *c, X509 *x)
485CERT *c;
486X509 *x;
487 { 417 {
488 EVP_PKEY *pkey; 418 EVP_PKEY *pkey;
489 int i,ok=0,bad=0; 419 int i,ok=0,bad=0;
@@ -499,11 +429,25 @@ X509 *x;
499 if (i < 0) 429 if (i < 0)
500 { 430 {
501 SSLerr(SSL_F_SSL_SET_CERT,SSL_R_UNKNOWN_CERTIFICATE_TYPE); 431 SSLerr(SSL_F_SSL_SET_CERT,SSL_R_UNKNOWN_CERTIFICATE_TYPE);
432 EVP_PKEY_free(pkey);
502 return(0); 433 return(0);
503 } 434 }
504 435
505 if (c->pkeys[i].privatekey != NULL) 436 if (c->pkeys[i].privatekey != NULL)
506 { 437 {
438 EVP_PKEY_copy_parameters(pkey,c->pkeys[i].privatekey);
439 ERR_clear_error();
440
441#ifndef OPENSSL_NO_RSA
442 /* Don't check the public/private key, this is mostly
443 * for smart cards. */
444 if ((c->pkeys[i].privatekey->type == EVP_PKEY_RSA) &&
445 (RSA_flags(c->pkeys[i].privatekey->pkey.rsa) &
446 RSA_METHOD_FLAG_NO_CHECK))
447 ok=1;
448 else
449#endif
450 {
507 if (!X509_check_private_key(x,c->pkeys[i].privatekey)) 451 if (!X509_check_private_key(x,c->pkeys[i].privatekey))
508 { 452 {
509 if ((i == SSL_PKEY_DH_RSA) || (i == SSL_PKEY_DH_DSA)) 453 if ((i == SSL_PKEY_DH_RSA) || (i == SSL_PKEY_DH_DSA))
@@ -527,10 +471,12 @@ X509 *x;
527 } 471 }
528 else 472 else
529 ok=1; 473 ok=1;
474 } /* OPENSSL_NO_RSA */
530 } 475 }
531 else 476 else
532 ok=1; 477 ok=1;
533 478
479 EVP_PKEY_free(pkey);
534 if (bad) 480 if (bad)
535 { 481 {
536 EVP_PKEY_free(c->pkeys[i].privatekey); 482 EVP_PKEY_free(c->pkeys[i].privatekey);
@@ -547,11 +493,8 @@ X509 *x;
547 return(1); 493 return(1);
548 } 494 }
549 495
550#ifndef NO_STDIO 496#ifndef OPENSSL_NO_STDIO
551int SSL_CTX_use_certificate_file(ctx, file, type) 497int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type)
552SSL_CTX *ctx;
553char *file;
554int type;
555 { 498 {
556 int j; 499 int j;
557 BIO *in; 500 BIO *in;
@@ -578,7 +521,7 @@ int type;
578 else if (type == SSL_FILETYPE_PEM) 521 else if (type == SSL_FILETYPE_PEM)
579 { 522 {
580 j=ERR_R_PEM_LIB; 523 j=ERR_R_PEM_LIB;
581 x=PEM_read_bio_X509(in,NULL,ctx->default_passwd_callback); 524 x=PEM_read_bio_X509(in,NULL,ctx->default_passwd_callback,ctx->default_passwd_callback_userdata);
582 } 525 }
583 else 526 else
584 { 527 {
@@ -600,10 +543,7 @@ end:
600 } 543 }
601#endif 544#endif
602 545
603int SSL_CTX_use_certificate_ASN1(ctx, len, d) 546int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len, unsigned char *d)
604SSL_CTX *ctx;
605int len;
606unsigned char *d;
607 { 547 {
608 X509 *x; 548 X509 *x;
609 int ret; 549 int ret;
@@ -620,13 +560,10 @@ unsigned char *d;
620 return(ret); 560 return(ret);
621 } 561 }
622 562
623#ifndef NO_RSA 563#ifndef OPENSSL_NO_RSA
624int SSL_CTX_use_RSAPrivateKey(ctx, rsa) 564int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa)
625SSL_CTX *ctx;
626RSA *rsa;
627 { 565 {
628 int ret; 566 int ret;
629 CERT *c;
630 EVP_PKEY *pkey; 567 EVP_PKEY *pkey;
631 568
632 if (rsa == NULL) 569 if (rsa == NULL)
@@ -634,37 +571,27 @@ RSA *rsa;
634 SSLerr(SSL_F_SSL_CTX_USE_RSAPRIVATEKEY,ERR_R_PASSED_NULL_PARAMETER); 571 SSLerr(SSL_F_SSL_CTX_USE_RSAPRIVATEKEY,ERR_R_PASSED_NULL_PARAMETER);
635 return(0); 572 return(0);
636 } 573 }
637 if (ctx->default_cert == NULL) 574 if (!ssl_cert_inst(&ctx->cert))
638 { 575 {
639 c=ssl_cert_new(); 576 SSLerr(SSL_F_SSL_CTX_USE_RSAPRIVATEKEY,ERR_R_MALLOC_FAILURE);
640 if (c == NULL) 577 return(0);
641 {
642 SSLerr(SSL_F_SSL_CTX_USE_RSAPRIVATEKEY,ERR_R_MALLOC_FAILURE);
643 return(0);
644 }
645 ctx->default_cert=c;
646 } 578 }
647 c=ctx->default_cert;
648
649 if ((pkey=EVP_PKEY_new()) == NULL) 579 if ((pkey=EVP_PKEY_new()) == NULL)
650 { 580 {
651 SSLerr(SSL_F_SSL_CTX_USE_RSAPRIVATEKEY,ERR_R_EVP_LIB); 581 SSLerr(SSL_F_SSL_CTX_USE_RSAPRIVATEKEY,ERR_R_EVP_LIB);
652 return(0); 582 return(0);
653 } 583 }
654 584
655 CRYPTO_add(&rsa->references,1,CRYPTO_LOCK_RSA); 585 RSA_up_ref(rsa);
656 EVP_PKEY_assign_RSA(pkey,rsa); 586 EVP_PKEY_assign_RSA(pkey,rsa);
657 587
658 ret=ssl_set_pkey(c,pkey); 588 ret=ssl_set_pkey(ctx->cert, pkey);
659 EVP_PKEY_free(pkey); 589 EVP_PKEY_free(pkey);
660 return(ret); 590 return(ret);
661 } 591 }
662 592
663#ifndef NO_STDIO 593#ifndef OPENSSL_NO_STDIO
664int SSL_CTX_use_RSAPrivateKey_file(ctx, file, type) 594int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, const char *file, int type)
665SSL_CTX *ctx;
666char *file;
667int type;
668 { 595 {
669 int j,ret=0; 596 int j,ret=0;
670 BIO *in; 597 BIO *in;
@@ -691,7 +618,7 @@ int type;
691 { 618 {
692 j=ERR_R_PEM_LIB; 619 j=ERR_R_PEM_LIB;
693 rsa=PEM_read_bio_RSAPrivateKey(in,NULL, 620 rsa=PEM_read_bio_RSAPrivateKey(in,NULL,
694 ctx->default_passwd_callback); 621 ctx->default_passwd_callback,ctx->default_passwd_callback_userdata);
695 } 622 }
696 else 623 else
697 { 624 {
@@ -711,13 +638,10 @@ end:
711 } 638 }
712#endif 639#endif
713 640
714int SSL_CTX_use_RSAPrivateKey_ASN1(ctx,d,len) 641int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, unsigned char *d, long len)
715SSL_CTX *ctx;
716unsigned char *d;
717long len;
718 { 642 {
719 int ret; 643 int ret;
720 unsigned char *p; 644 const unsigned char *p;
721 RSA *rsa; 645 RSA *rsa;
722 646
723 p=d; 647 p=d;
@@ -731,40 +655,25 @@ long len;
731 RSA_free(rsa); 655 RSA_free(rsa);
732 return(ret); 656 return(ret);
733 } 657 }
734#endif /* !NO_RSA */ 658#endif /* !OPENSSL_NO_RSA */
735 659
736int SSL_CTX_use_PrivateKey(ctx, pkey) 660int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey)
737SSL_CTX *ctx;
738EVP_PKEY *pkey;
739 { 661 {
740 CERT *c;
741
742 if (pkey == NULL) 662 if (pkey == NULL)
743 { 663 {
744 SSLerr(SSL_F_SSL_CTX_USE_PRIVATEKEY,ERR_R_PASSED_NULL_PARAMETER); 664 SSLerr(SSL_F_SSL_CTX_USE_PRIVATEKEY,ERR_R_PASSED_NULL_PARAMETER);
745 return(0); 665 return(0);
746 } 666 }
747 667 if (!ssl_cert_inst(&ctx->cert))
748 if (ctx->default_cert == NULL)
749 { 668 {
750 c=ssl_cert_new(); 669 SSLerr(SSL_F_SSL_CTX_USE_PRIVATEKEY,ERR_R_MALLOC_FAILURE);
751 if (c == NULL) 670 return(0);
752 {
753 SSLerr(SSL_F_SSL_CTX_USE_PRIVATEKEY,ERR_R_MALLOC_FAILURE);
754 return(0);
755 }
756 ctx->default_cert=c;
757 } 671 }
758 c=ctx->default_cert; 672 return(ssl_set_pkey(ctx->cert,pkey));
759
760 return(ssl_set_pkey(c,pkey));
761 } 673 }
762 674
763#ifndef NO_STDIO 675#ifndef OPENSSL_NO_STDIO
764int SSL_CTX_use_PrivateKey_file(ctx, file, type) 676int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type)
765SSL_CTX *ctx;
766char *file;
767int type;
768 { 677 {
769 int j,ret=0; 678 int j,ret=0;
770 BIO *in; 679 BIO *in;
@@ -786,7 +695,7 @@ int type;
786 { 695 {
787 j=ERR_R_PEM_LIB; 696 j=ERR_R_PEM_LIB;
788 pkey=PEM_read_bio_PrivateKey(in,NULL, 697 pkey=PEM_read_bio_PrivateKey(in,NULL,
789 ctx->default_passwd_callback); 698 ctx->default_passwd_callback,ctx->default_passwd_callback_userdata);
790 } 699 }
791 else 700 else
792 { 701 {
@@ -806,11 +715,8 @@ end:
806 } 715 }
807#endif 716#endif
808 717
809int SSL_CTX_use_PrivateKey_ASN1(type,ctx,d,len) 718int SSL_CTX_use_PrivateKey_ASN1(int type, SSL_CTX *ctx, unsigned char *d,
810int type; 719 long len)
811SSL_CTX *ctx;
812unsigned char *d;
813long len;
814 { 720 {
815 int ret; 721 int ret;
816 unsigned char *p; 722 unsigned char *p;
@@ -829,3 +735,81 @@ long len;
829 } 735 }
830 736
831 737
738#ifndef OPENSSL_NO_STDIO
739/* Read a file that contains our certificate in "PEM" format,
740 * possibly followed by a sequence of CA certificates that should be
741 * sent to the peer in the Certificate message.
742 */
743int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file)
744 {
745 BIO *in;
746 int ret=0;
747 X509 *x=NULL;
748
749 in=BIO_new(BIO_s_file_internal());
750 if (in == NULL)
751 {
752 SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE,ERR_R_BUF_LIB);
753 goto end;
754 }
755
756 if (BIO_read_filename(in,file) <= 0)
757 {
758 SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE,ERR_R_SYS_LIB);
759 goto end;
760 }
761
762 x=PEM_read_bio_X509(in,NULL,ctx->default_passwd_callback,ctx->default_passwd_callback_userdata);
763 if (x == NULL)
764 {
765 SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE,ERR_R_PEM_LIB);
766 goto end;
767 }
768
769 ret=SSL_CTX_use_certificate(ctx,x);
770 if (ERR_peek_error() != 0)
771 ret = 0; /* Key/certificate mismatch doesn't imply ret==0 ... */
772 if (ret)
773 {
774 /* If we could set up our certificate, now proceed to
775 * the CA certificates.
776 */
777 X509 *ca;
778 int r;
779 unsigned long err;
780
781 if (ctx->extra_certs != NULL)
782 {
783 sk_X509_pop_free(ctx->extra_certs, X509_free);
784 ctx->extra_certs = NULL;
785 }
786
787 while ((ca = PEM_read_bio_X509(in,NULL,ctx->default_passwd_callback,ctx->default_passwd_callback_userdata))
788 != NULL)
789 {
790 r = SSL_CTX_add_extra_chain_cert(ctx, ca);
791 if (!r)
792 {
793 X509_free(ca);
794 ret = 0;
795 goto end;
796 }
797 /* Note that we must not free r if it was successfully
798 * added to the chain (while we must free the main
799 * certificate, since its reference count is increased
800 * by SSL_CTX_use_certificate). */
801 }
802 /* When the while loop ends, it's usually just EOF. */
803 err = ERR_peek_last_error();
804 if (ERR_GET_LIB(err) == ERR_LIB_PEM && ERR_GET_REASON(err) == PEM_R_NO_START_LINE)
805 (void)ERR_get_error();
806 else
807 ret = 0; /* some real error */
808 }
809
810end:
811 if (x != NULL) X509_free(x);
812 if (in != NULL) BIO_free(in);
813 return(ret);
814 }
815#endif
diff --git a/src/lib/libssl/ssl_sess.c b/src/lib/libssl/ssl_sess.c
index 8212600e40..6424f775e2 100644
--- a/src/lib/libssl/ssl_sess.c
+++ b/src/lib/libssl/ssl_sess.c
@@ -57,60 +57,57 @@
57 */ 57 */
58 58
59#include <stdio.h> 59#include <stdio.h>
60#include "lhash.h" 60#include <openssl/lhash.h>
61#include "rand.h" 61#include <openssl/rand.h>
62#include "ssl_locl.h" 62#include "ssl_locl.h"
63 63
64#ifndef NOPROTO
65static void SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *s); 64static void SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *s);
66static void SSL_SESSION_list_add(SSL_CTX *ctx,SSL_SESSION *s); 65static void SSL_SESSION_list_add(SSL_CTX *ctx,SSL_SESSION *s);
67#else 66static int remove_session_lock(SSL_CTX *ctx, SSL_SESSION *c, int lck);
68static void SSL_SESSION_list_remove();
69static void SSL_SESSION_list_add();
70#endif
71
72static ssl_session_num=0;
73static STACK *ssl_session_meth=NULL;
74 67
75SSL_SESSION *SSL_get_session(ssl) 68SSL_SESSION *SSL_get_session(SSL *ssl)
76SSL *ssl; 69/* aka SSL_get0_session; gets 0 objects, just returns a copy of the pointer */
77 { 70 {
78 return(ssl->session); 71 return(ssl->session);
79 } 72 }
80 73
81int SSL_SESSION_get_ex_new_index(argl,argp,new_func,dup_func,free_func) 74SSL_SESSION *SSL_get1_session(SSL *ssl)
82long argl; 75/* variant of SSL_get_session: caller really gets something */
83char *argp; 76 {
84int (*new_func)(); 77 SSL_SESSION *sess;
85int (*dup_func)(); 78 /* Need to lock this all up rather than just use CRYPTO_add so that
86void (*free_func)(); 79 * somebody doesn't free ssl->session between when we check it's
87 { 80 * non-null and when we up the reference count. */
88 ssl_session_num++; 81 CRYPTO_r_lock(CRYPTO_LOCK_SSL_SESSION);
89 return(CRYPTO_get_ex_new_index(ssl_session_num-1, 82 sess = ssl->session;
90 &ssl_session_meth, 83 if(sess)
91 argl,argp,new_func,dup_func,free_func)); 84 sess->references++;
92 } 85 CRYPTO_r_unlock(CRYPTO_LOCK_SSL_SESSION);
93 86 return(sess);
94int SSL_SESSION_set_ex_data(s,idx,arg) 87 }
95SSL_SESSION *s; 88
96int idx; 89int SSL_SESSION_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
97char *arg; 90 CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func)
91 {
92 return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_SESSION, argl, argp,
93 new_func, dup_func, free_func);
94 }
95
96int SSL_SESSION_set_ex_data(SSL_SESSION *s, int idx, void *arg)
98 { 97 {
99 return(CRYPTO_set_ex_data(&s->ex_data,idx,arg)); 98 return(CRYPTO_set_ex_data(&s->ex_data,idx,arg));
100 } 99 }
101 100
102char *SSL_SESSION_get_ex_data(s,idx) 101void *SSL_SESSION_get_ex_data(SSL_SESSION *s, int idx)
103SSL_SESSION *s;
104int idx;
105 { 102 {
106 return(CRYPTO_get_ex_data(&s->ex_data,idx)); 103 return(CRYPTO_get_ex_data(&s->ex_data,idx));
107 } 104 }
108 105
109SSL_SESSION *SSL_SESSION_new() 106SSL_SESSION *SSL_SESSION_new(void)
110 { 107 {
111 SSL_SESSION *ss; 108 SSL_SESSION *ss;
112 109
113 ss=(SSL_SESSION *)Malloc(sizeof(SSL_SESSION)); 110 ss=(SSL_SESSION *)OPENSSL_malloc(sizeof(SSL_SESSION));
114 if (ss == NULL) 111 if (ss == NULL)
115 { 112 {
116 SSLerr(SSL_F_SSL_SESSION_NEW,ERR_R_MALLOC_FAILURE); 113 SSLerr(SSL_F_SSL_SESSION_NEW,ERR_R_MALLOC_FAILURE);
@@ -118,26 +115,64 @@ SSL_SESSION *SSL_SESSION_new()
118 } 115 }
119 memset(ss,0,sizeof(SSL_SESSION)); 116 memset(ss,0,sizeof(SSL_SESSION));
120 117
118 ss->verify_result = 1; /* avoid 0 (= X509_V_OK) just in case */
121 ss->references=1; 119 ss->references=1;
122 ss->timeout=60*5+4; /* 5 minute timeout by default */ 120 ss->timeout=60*5+4; /* 5 minute timeout by default */
123 ss->time=time(NULL); 121 ss->time=time(NULL);
124 ss->prev=NULL; 122 ss->prev=NULL;
125 ss->next=NULL; 123 ss->next=NULL;
126 CRYPTO_new_ex_data(ssl_session_meth,(char *)ss,&ss->ex_data); 124 ss->compress_meth=0;
125 CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, ss, &ss->ex_data);
127 return(ss); 126 return(ss);
128 } 127 }
129 128
130int ssl_get_new_session(s, session) 129/* Even with SSLv2, we have 16 bytes (128 bits) of session ID space. SSLv3/TLSv1
131SSL *s; 130 * has 32 bytes (256 bits). As such, filling the ID with random gunk repeatedly
132int session; 131 * until we have no conflict is going to complete in one iteration pretty much
132 * "most" of the time (btw: understatement). So, if it takes us 10 iterations
133 * and we still can't avoid a conflict - well that's a reasonable point to call
134 * it quits. Either the RAND code is broken or someone is trying to open roughly
135 * very close to 2^128 (or 2^256) SSL sessions to our server. How you might
136 * store that many sessions is perhaps a more interesting question ... */
137
138#define MAX_SESS_ID_ATTEMPTS 10
139static int def_generate_session_id(const SSL *ssl, unsigned char *id,
140 unsigned int *id_len)
141{
142 unsigned int retry = 0;
143 do
144 RAND_pseudo_bytes(id, *id_len);
145 while(SSL_has_matching_session_id(ssl, id, *id_len) &&
146 (++retry < MAX_SESS_ID_ATTEMPTS));
147 if(retry < MAX_SESS_ID_ATTEMPTS)
148 return 1;
149 /* else - woops a session_id match */
150 /* XXX We should also check the external cache --
151 * but the probability of a collision is negligible, and
152 * we could not prevent the concurrent creation of sessions
153 * with identical IDs since we currently don't have means
154 * to atomically check whether a session ID already exists
155 * and make a reservation for it if it does not
156 * (this problem applies to the internal cache as well).
157 */
158 return 0;
159}
160
161int ssl_get_new_session(SSL *s, int session)
133 { 162 {
163 /* This gets used by clients and servers. */
164
165 unsigned int tmp;
134 SSL_SESSION *ss=NULL; 166 SSL_SESSION *ss=NULL;
167 GEN_SESSION_CB cb = def_generate_session_id;
135 168
136 if ((ss=SSL_SESSION_new()) == NULL) return(0); 169 if ((ss=SSL_SESSION_new()) == NULL) return(0);
137 170
138 /* If the context has a default timeout, use it */ 171 /* If the context has a default timeout, use it */
139 if (s->ctx->session_timeout != 0) 172 if (s->ctx->session_timeout == 0)
140 ss->timeout=SSL_get_default_timeout(s); 173 ss->timeout=SSL_get_default_timeout(s);
174 else
175 ss->timeout=s->ctx->session_timeout;
141 176
142 if (s->session != NULL) 177 if (s->session != NULL)
143 { 178 {
@@ -147,7 +182,7 @@ int session;
147 182
148 if (session) 183 if (session)
149 { 184 {
150 if (s->version == SSL2_CLIENT_VERSION) 185 if (s->version == SSL2_VERSION)
151 { 186 {
152 ss->ssl_version=SSL2_VERSION; 187 ss->ssl_version=SSL2_VERSION;
153 ss->session_id_length=SSL2_SSL_SESSION_ID_LENGTH; 188 ss->session_id_length=SSL2_SSL_SESSION_ID_LENGTH;
@@ -168,18 +203,46 @@ int session;
168 SSL_SESSION_free(ss); 203 SSL_SESSION_free(ss);
169 return(0); 204 return(0);
170 } 205 }
171 206 /* Choose which callback will set the session ID */
172 for (;;) 207 CRYPTO_r_lock(CRYPTO_LOCK_SSL_CTX);
208 if(s->generate_session_id)
209 cb = s->generate_session_id;
210 else if(s->ctx->generate_session_id)
211 cb = s->ctx->generate_session_id;
212 CRYPTO_r_unlock(CRYPTO_LOCK_SSL_CTX);
213 /* Choose a session ID */
214 tmp = ss->session_id_length;
215 if(!cb(s, ss->session_id, &tmp))
216 {
217 /* The callback failed */
218 SSLerr(SSL_F_SSL_GET_NEW_SESSION,
219 SSL_R_SSL_SESSION_ID_CALLBACK_FAILED);
220 SSL_SESSION_free(ss);
221 return(0);
222 }
223 /* Don't allow the callback to set the session length to zero.
224 * nor set it higher than it was. */
225 if(!tmp || (tmp > ss->session_id_length))
226 {
227 /* The callback set an illegal length */
228 SSLerr(SSL_F_SSL_GET_NEW_SESSION,
229 SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH);
230 SSL_SESSION_free(ss);
231 return(0);
232 }
233 /* If the session length was shrunk and we're SSLv2, pad it */
234 if((tmp < ss->session_id_length) && (s->version == SSL2_VERSION))
235 memset(ss->session_id + tmp, 0, ss->session_id_length - tmp);
236 else
237 ss->session_id_length = tmp;
238 /* Finally, check for a conflict */
239 if(SSL_has_matching_session_id(s, ss->session_id,
240 ss->session_id_length))
173 { 241 {
174 SSL_SESSION *r; 242 SSLerr(SSL_F_SSL_GET_NEW_SESSION,
175 243 SSL_R_SSL_SESSION_ID_CONFLICT);
176 RAND_bytes(ss->session_id,ss->session_id_length); 244 SSL_SESSION_free(ss);
177 CRYPTO_r_lock(CRYPTO_LOCK_SSL_CTX); 245 return(0);
178 r=(SSL_SESSION *)lh_retrieve(s->ctx->sessions,
179 (char *)ss);
180 CRYPTO_r_unlock(CRYPTO_LOCK_SSL_CTX);
181 if (r == NULL) break;
182 /* else - woops a session_id match */
183 } 246 }
184 } 247 }
185 else 248 else
@@ -187,58 +250,100 @@ int session;
187 ss->session_id_length=0; 250 ss->session_id_length=0;
188 } 251 }
189 252
253 memcpy(ss->sid_ctx,s->sid_ctx,s->sid_ctx_length);
254 ss->sid_ctx_length=s->sid_ctx_length;
190 s->session=ss; 255 s->session=ss;
191 ss->ssl_version=s->version; 256 ss->ssl_version=s->version;
257 ss->verify_result = X509_V_OK;
192 258
193 return(1); 259 return(1);
194 } 260 }
195 261
196int ssl_get_prev_session(s,session_id,len) 262int ssl_get_prev_session(SSL *s, unsigned char *session_id, int len)
197SSL *s;
198unsigned char *session_id;
199int len;
200 { 263 {
264 /* This is used only by servers. */
265
201 SSL_SESSION *ret=NULL,data; 266 SSL_SESSION *ret=NULL,data;
267 int fatal = 0;
202 268
203 /* conn_init();*/
204 data.ssl_version=s->version; 269 data.ssl_version=s->version;
205 data.session_id_length=len; 270 data.session_id_length=len;
206 if (len > SSL_MAX_SSL_SESSION_ID_LENGTH) 271 if (len > SSL_MAX_SSL_SESSION_ID_LENGTH)
207 return(0); 272 goto err;
208 memcpy(data.session_id,session_id,len);; 273 memcpy(data.session_id,session_id,len);
209 274
210 if (!(s->ctx->session_cache_mode & SSL_SESS_CACHE_NO_INTERNAL_LOOKUP)) 275 if (!(s->ctx->session_cache_mode & SSL_SESS_CACHE_NO_INTERNAL_LOOKUP))
211 { 276 {
212 CRYPTO_r_lock(CRYPTO_LOCK_SSL_CTX); 277 CRYPTO_r_lock(CRYPTO_LOCK_SSL_CTX);
213 ret=(SSL_SESSION *)lh_retrieve(s->ctx->sessions,(char *)&data); 278 ret=(SSL_SESSION *)lh_retrieve(s->ctx->sessions,&data);
279 if (ret != NULL)
280 /* don't allow other threads to steal it: */
281 CRYPTO_add(&ret->references,1,CRYPTO_LOCK_SSL_SESSION);
214 CRYPTO_r_unlock(CRYPTO_LOCK_SSL_CTX); 282 CRYPTO_r_unlock(CRYPTO_LOCK_SSL_CTX);
215 } 283 }
216 284
217 if (ret == NULL) 285 if (ret == NULL)
218 { 286 {
219 int copy=1; 287 int copy=1;
220 288
221 s->ctx->sess_miss++; 289 s->ctx->stats.sess_miss++;
222 ret=NULL; 290 ret=NULL;
223 if ((s->ctx->get_session_cb != NULL) && 291 if (s->ctx->get_session_cb != NULL
224 ((ret=s->ctx->get_session_cb(s,session_id,len,&copy)) 292 && (ret=s->ctx->get_session_cb(s,session_id,len,&copy))
225 != NULL)) 293 != NULL)
226 { 294 {
227 s->ctx->sess_cb_hit++; 295 s->ctx->stats.sess_cb_hit++;
296
297 /* Increment reference count now if the session callback
298 * asks us to do so (note that if the session structures
299 * returned by the callback are shared between threads,
300 * it must handle the reference count itself [i.e. copy == 0],
301 * or things won't be thread-safe). */
302 if (copy)
303 CRYPTO_add(&ret->references,1,CRYPTO_LOCK_SSL_SESSION);
228 304
229 /* The following should not return 1, otherwise, 305 /* The following should not return 1, otherwise,
230 * things are very strange */ 306 * things are very strange */
231 SSL_CTX_add_session(s->ctx,ret); 307 SSL_CTX_add_session(s->ctx,ret);
232 /* auto free it */
233 if (!copy)
234 SSL_SESSION_free(ret);
235 } 308 }
236 if (ret == NULL) return(0); 309 if (ret == NULL)
310 goto err;
311 }
312
313 /* Now ret is non-NULL, and we own one of its reference counts. */
314
315 if((s->verify_mode&SSL_VERIFY_PEER)
316 && (!s->sid_ctx_length || ret->sid_ctx_length != s->sid_ctx_length
317 || memcmp(ret->sid_ctx,s->sid_ctx,ret->sid_ctx_length)))
318 {
319 /* We've found the session named by the client, but we don't
320 * want to use it in this context. */
321
322 if (s->sid_ctx_length == 0)
323 {
324 /* application should have used SSL[_CTX]_set_session_id_context
325 * -- we could tolerate this and just pretend we never heard
326 * of this session, but then applications could effectively
327 * disable the session cache by accident without anyone noticing */
328
329 SSLerr(SSL_F_SSL_GET_PREV_SESSION,SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED);
330 fatal = 1;
331 goto err;
332 }
333 else
334 {
335#if 0 /* The client cannot always know when a session is not appropriate,
336 * so we shouldn't generate an error message. */
337
338 SSLerr(SSL_F_SSL_GET_PREV_SESSION,SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT);
339#endif
340 goto err; /* treat like cache miss */
341 }
237 } 342 }
238 343
239 if (ret->cipher == NULL) 344 if (ret->cipher == NULL)
240 { 345 {
241 char buf[5],*p; 346 unsigned char buf[5],*p;
242 unsigned long l; 347 unsigned long l;
243 348
244 p=buf; 349 p=buf;
@@ -249,25 +354,28 @@ int len;
249 else 354 else
250 ret->cipher=ssl_get_cipher_by_char(s,&(buf[1])); 355 ret->cipher=ssl_get_cipher_by_char(s,&(buf[1]));
251 if (ret->cipher == NULL) 356 if (ret->cipher == NULL)
252 return(0); 357 goto err;
253 } 358 }
254 359
360
361#if 0 /* This is way too late. */
362
255 /* If a thread got the session, then 'swaped', and another got 363 /* If a thread got the session, then 'swaped', and another got
256 * it and then due to a time-out decided to 'Free' it we could 364 * it and then due to a time-out decided to 'OPENSSL_free' it we could
257 * be in trouble. So I'll increment it now, then double decrement 365 * be in trouble. So I'll increment it now, then double decrement
258 * later - am I speaking rubbish?. */ 366 * later - am I speaking rubbish?. */
259 CRYPTO_add(&ret->references,1,CRYPTO_LOCK_SSL_SESSION); 367 CRYPTO_add(&ret->references,1,CRYPTO_LOCK_SSL_SESSION);
368#endif
260 369
261 if ((long)(ret->time+ret->timeout) < (long)time(NULL)) /* timeout */ 370 if ((long)(ret->time+ret->timeout) < (long)time(NULL)) /* timeout */
262 { 371 {
263 s->ctx->sess_timeout++; 372 s->ctx->stats.sess_timeout++;
264 /* remove it from the cache */ 373 /* remove it from the cache */
265 SSL_CTX_remove_session(s->ctx,ret); 374 SSL_CTX_remove_session(s->ctx,ret);
266 SSL_SESSION_free(ret); /* again to actually Free it */ 375 goto err;
267 return(0);
268 } 376 }
269 377
270 s->ctx->sess_hit++; 378 s->ctx->stats.sess_hit++;
271 379
272 /* ret->time=time(NULL); */ /* rezero timeout? */ 380 /* ret->time=time(NULL); */ /* rezero timeout? */
273 /* again, just leave the session 381 /* again, just leave the session
@@ -276,37 +384,64 @@ int len;
276 if (s->session != NULL) 384 if (s->session != NULL)
277 SSL_SESSION_free(s->session); 385 SSL_SESSION_free(s->session);
278 s->session=ret; 386 s->session=ret;
387 s->verify_result = s->session->verify_result;
279 return(1); 388 return(1);
389
390 err:
391 if (ret != NULL)
392 SSL_SESSION_free(ret);
393 if (fatal)
394 return -1;
395 else
396 return 0;
280 } 397 }
281 398
282int SSL_CTX_add_session(ctx,c) 399int SSL_CTX_add_session(SSL_CTX *ctx, SSL_SESSION *c)
283SSL_CTX *ctx;
284SSL_SESSION *c;
285 { 400 {
286 int ret=0; 401 int ret=0;
287 SSL_SESSION *s; 402 SSL_SESSION *s;
288 403
289 /* conn_init(); */ 404 /* add just 1 reference count for the SSL_CTX's session cache
405 * even though it has two ways of access: each session is in a
406 * doubly linked list and an lhash */
290 CRYPTO_add(&c->references,1,CRYPTO_LOCK_SSL_SESSION); 407 CRYPTO_add(&c->references,1,CRYPTO_LOCK_SSL_SESSION);
408 /* if session c is in already in cache, we take back the increment later */
291 409
292 CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX); 410 CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
293 s=(SSL_SESSION *)lh_insert(ctx->sessions,(char *)c); 411 s=(SSL_SESSION *)lh_insert(ctx->sessions,c);
294 412
295 /* Put on the end of the queue unless it is already in the cache */ 413 /* s != NULL iff we already had a session with the given PID.
414 * In this case, s == c should hold (then we did not really modify
415 * ctx->sessions), or we're in trouble. */
416 if (s != NULL && s != c)
417 {
418 /* We *are* in trouble ... */
419 SSL_SESSION_list_remove(ctx,s);
420 SSL_SESSION_free(s);
421 /* ... so pretend the other session did not exist in cache
422 * (we cannot handle two SSL_SESSION structures with identical
423 * session ID in the same cache, which could happen e.g. when
424 * two threads concurrently obtain the same session from an external
425 * cache) */
426 s = NULL;
427 }
428
429 /* Put at the head of the queue unless it is already in the cache */
296 if (s == NULL) 430 if (s == NULL)
297 SSL_SESSION_list_add(ctx,c); 431 SSL_SESSION_list_add(ctx,c);
298 432
299 /* If the same session if is being 're-added', Free the old
300 * one when the last person stops using it.
301 * This will also work if it is alread in the cache.
302 * The references will go up and then down :-) */
303 if (s != NULL) 433 if (s != NULL)
304 { 434 {
305 SSL_SESSION_free(s); 435 /* existing cache entry -- decrement previously incremented reference
436 * count because it already takes into account the cache */
437
438 SSL_SESSION_free(s); /* s == c */
306 ret=0; 439 ret=0;
307 } 440 }
308 else 441 else
309 { 442 {
443 /* new cache entry -- remove old ones if cache has become too large */
444
310 ret=1; 445 ret=1;
311 446
312 if (SSL_CTX_sess_get_cache_size(ctx) > 0) 447 if (SSL_CTX_sess_get_cache_size(ctx) > 0)
@@ -314,11 +449,11 @@ SSL_SESSION *c;
314 while (SSL_CTX_sess_number(ctx) > 449 while (SSL_CTX_sess_number(ctx) >
315 SSL_CTX_sess_get_cache_size(ctx)) 450 SSL_CTX_sess_get_cache_size(ctx))
316 { 451 {
317 if (!SSL_CTX_remove_session(ctx, 452 if (!remove_session_lock(ctx,
318 ctx->session_cache_tail)) 453 ctx->session_cache_tail, 0))
319 break; 454 break;
320 else 455 else
321 ctx->sess_cache_full++; 456 ctx->stats.sess_cache_full++;
322 } 457 }
323 } 458 }
324 } 459 }
@@ -326,24 +461,27 @@ SSL_SESSION *c;
326 return(ret); 461 return(ret);
327 } 462 }
328 463
329int SSL_CTX_remove_session(ctx,c) 464int SSL_CTX_remove_session(SSL_CTX *ctx, SSL_SESSION *c)
330SSL_CTX *ctx; 465{
331SSL_SESSION *c; 466 return remove_session_lock(ctx, c, 1);
467}
468
469static int remove_session_lock(SSL_CTX *ctx, SSL_SESSION *c, int lck)
332 { 470 {
333 SSL_SESSION *r; 471 SSL_SESSION *r;
334 int ret=0; 472 int ret=0;
335 473
336 if ((c != NULL) && (c->session_id_length != 0)) 474 if ((c != NULL) && (c->session_id_length != 0))
337 { 475 {
338 CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX); 476 if(lck) CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
339 r=(SSL_SESSION *)lh_delete(ctx->sessions,(char *)c); 477 if ((r = (SSL_SESSION *)lh_retrieve(ctx->sessions,c)) == c)
340 if (r != NULL)
341 { 478 {
342 ret=1; 479 ret=1;
480 r=(SSL_SESSION *)lh_delete(ctx->sessions,c);
343 SSL_SESSION_list_remove(ctx,c); 481 SSL_SESSION_list_remove(ctx,c);
344 } 482 }
345 483
346 CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX); 484 if(lck) CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
347 485
348 if (ret) 486 if (ret)
349 { 487 {
@@ -358,11 +496,13 @@ SSL_SESSION *c;
358 return(ret); 496 return(ret);
359 } 497 }
360 498
361void SSL_SESSION_free(ss) 499void SSL_SESSION_free(SSL_SESSION *ss)
362SSL_SESSION *ss;
363 { 500 {
364 int i; 501 int i;
365 502
503 if(ss == NULL)
504 return;
505
366 i=CRYPTO_add(&ss->references,-1,CRYPTO_LOCK_SSL_SESSION); 506 i=CRYPTO_add(&ss->references,-1,CRYPTO_LOCK_SSL_SESSION);
367#ifdef REF_PRINT 507#ifdef REF_PRINT
368 REF_PRINT("SSL_SESSION",ss); 508 REF_PRINT("SSL_SESSION",ss);
@@ -376,21 +516,19 @@ SSL_SESSION *ss;
376 } 516 }
377#endif 517#endif
378 518
379 CRYPTO_free_ex_data(ssl_session_meth,(char *)ss,&ss->ex_data); 519 CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, ss, &ss->ex_data);
380 520
381 memset(ss->key_arg,0,SSL_MAX_KEY_ARG_LENGTH); 521 memset(ss->key_arg,0,SSL_MAX_KEY_ARG_LENGTH);
382 memset(ss->master_key,0,SSL_MAX_MASTER_KEY_LENGTH); 522 memset(ss->master_key,0,SSL_MAX_MASTER_KEY_LENGTH);
383 memset(ss->session_id,0,SSL_MAX_SSL_SESSION_ID_LENGTH); 523 memset(ss->session_id,0,SSL_MAX_SSL_SESSION_ID_LENGTH);
384 if (ss->cert != NULL) ssl_cert_free(ss->cert); 524 if (ss->sess_cert != NULL) ssl_sess_cert_free(ss->sess_cert);
385 if (ss->peer != NULL) X509_free(ss->peer); 525 if (ss->peer != NULL) X509_free(ss->peer);
386 if (ss->ciphers != NULL) sk_free(ss->ciphers); 526 if (ss->ciphers != NULL) sk_SSL_CIPHER_free(ss->ciphers);
387 memset(ss,0,sizeof(*ss)); 527 memset(ss,0,sizeof(*ss));
388 Free(ss); 528 OPENSSL_free(ss);
389 } 529 }
390 530
391int SSL_set_session(s, session) 531int SSL_set_session(SSL *s, SSL_SESSION *session)
392SSL *s;
393SSL_SESSION *session;
394 { 532 {
395 int ret=0; 533 int ret=0;
396 SSL_METHOD *meth; 534 SSL_METHOD *meth;
@@ -410,14 +548,29 @@ SSL_SESSION *session;
410 { 548 {
411 if (!SSL_set_ssl_method(s,meth)) 549 if (!SSL_set_ssl_method(s,meth))
412 return(0); 550 return(0);
413 session->timeout=SSL_get_default_timeout(s); 551 if (s->ctx->session_timeout == 0)
552 session->timeout=SSL_get_default_timeout(s);
553 else
554 session->timeout=s->ctx->session_timeout;
414 } 555 }
415 556
557#ifndef OPENSSL_NO_KRB5
558 if (s->kssl_ctx && !s->kssl_ctx->client_princ &&
559 session->krb5_client_princ_len > 0)
560 {
561 s->kssl_ctx->client_princ = (char *)malloc(session->krb5_client_princ_len + 1);
562 memcpy(s->kssl_ctx->client_princ,session->krb5_client_princ,
563 session->krb5_client_princ_len);
564 s->kssl_ctx->client_princ[session->krb5_client_princ_len] = '\0';
565 }
566#endif /* OPENSSL_NO_KRB5 */
567
416 /* CRYPTO_w_lock(CRYPTO_LOCK_SSL);*/ 568 /* CRYPTO_w_lock(CRYPTO_LOCK_SSL);*/
417 CRYPTO_add(&session->references,1,CRYPTO_LOCK_SSL_SESSION); 569 CRYPTO_add(&session->references,1,CRYPTO_LOCK_SSL_SESSION);
418 if (s->session != NULL) 570 if (s->session != NULL)
419 SSL_SESSION_free(s->session); 571 SSL_SESSION_free(s->session);
420 s->session=session; 572 s->session=session;
573 s->verify_result = s->session->verify_result;
421 /* CRYPTO_w_unlock(CRYPTO_LOCK_SSL);*/ 574 /* CRYPTO_w_unlock(CRYPTO_LOCK_SSL);*/
422 ret=1; 575 ret=1;
423 } 576 }
@@ -428,42 +581,59 @@ SSL_SESSION *session;
428 SSL_SESSION_free(s->session); 581 SSL_SESSION_free(s->session);
429 s->session=NULL; 582 s->session=NULL;
430 } 583 }
584
585 meth=s->ctx->method;
586 if (meth != s->method)
587 {
588 if (!SSL_set_ssl_method(s,meth))
589 return(0);
590 }
591 ret=1;
431 } 592 }
432 return(ret); 593 return(ret);
433 } 594 }
434 595
435long SSL_SESSION_set_timeout(s,t) 596long SSL_SESSION_set_timeout(SSL_SESSION *s, long t)
436SSL_SESSION *s;
437long t;
438 { 597 {
439 if (s == NULL) return(0); 598 if (s == NULL) return(0);
440 s->timeout=t; 599 s->timeout=t;
441 return(1); 600 return(1);
442 } 601 }
443 602
444long SSL_SESSION_get_timeout(s) 603long SSL_SESSION_get_timeout(SSL_SESSION *s)
445SSL_SESSION *s;
446 { 604 {
447 if (s == NULL) return(0); 605 if (s == NULL) return(0);
448 return(s->timeout); 606 return(s->timeout);
449 } 607 }
450 608
451long SSL_SESSION_get_time(s) 609long SSL_SESSION_get_time(SSL_SESSION *s)
452SSL_SESSION *s;
453 { 610 {
454 if (s == NULL) return(0); 611 if (s == NULL) return(0);
455 return(s->time); 612 return(s->time);
456 } 613 }
457 614
458long SSL_SESSION_set_time(s,t) 615long SSL_SESSION_set_time(SSL_SESSION *s, long t)
459SSL_SESSION *s;
460long t;
461 { 616 {
462 if (s == NULL) return(0); 617 if (s == NULL) return(0);
463 s->time=t; 618 s->time=t;
464 return(t); 619 return(t);
465 } 620 }
466 621
622long SSL_CTX_set_timeout(SSL_CTX *s, long t)
623 {
624 long l;
625 if (s == NULL) return(0);
626 l=s->session_timeout;
627 s->session_timeout=t;
628 return(l);
629 }
630
631long SSL_CTX_get_timeout(SSL_CTX *s)
632 {
633 if (s == NULL) return(0);
634 return(s->session_timeout);
635 }
636
467typedef struct timeout_param_st 637typedef struct timeout_param_st
468 { 638 {
469 SSL_CTX *ctx; 639 SSL_CTX *ctx;
@@ -471,15 +641,13 @@ typedef struct timeout_param_st
471 LHASH *cache; 641 LHASH *cache;
472 } TIMEOUT_PARAM; 642 } TIMEOUT_PARAM;
473 643
474static void timeout(s,p) 644static void timeout(SSL_SESSION *s, TIMEOUT_PARAM *p)
475SSL_SESSION *s;
476TIMEOUT_PARAM *p;
477 { 645 {
478 if ((p->time == 0) || (p->time > (s->time+s->timeout))) /* timeout */ 646 if ((p->time == 0) || (p->time > (s->time+s->timeout))) /* timeout */
479 { 647 {
480 /* The reason we don't call SSL_CTX_remove_session() is to 648 /* The reason we don't call SSL_CTX_remove_session() is to
481 * save on locking overhead */ 649 * save on locking overhead */
482 lh_delete(p->cache,(char *)s); 650 lh_delete(p->cache,s);
483 SSL_SESSION_list_remove(p->ctx,s); 651 SSL_SESSION_list_remove(p->ctx,s);
484 s->not_resumable=1; 652 s->not_resumable=1;
485 if (p->ctx->remove_session_cb != NULL) 653 if (p->ctx->remove_session_cb != NULL)
@@ -488,27 +656,26 @@ TIMEOUT_PARAM *p;
488 } 656 }
489 } 657 }
490 658
491void SSL_CTX_flush_sessions(s,t) 659static IMPLEMENT_LHASH_DOALL_ARG_FN(timeout, SSL_SESSION *, TIMEOUT_PARAM *)
492SSL_CTX *s; 660
493long t; 661void SSL_CTX_flush_sessions(SSL_CTX *s, long t)
494 { 662 {
495 unsigned long i; 663 unsigned long i;
496 TIMEOUT_PARAM tp; 664 TIMEOUT_PARAM tp;
497 665
498 tp.ctx=s; 666 tp.ctx=s;
499 tp.cache=SSL_CTX_sessions(s); 667 tp.cache=s->sessions;
500 if (tp.cache == NULL) return; 668 if (tp.cache == NULL) return;
501 tp.time=t; 669 tp.time=t;
502 CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX); 670 CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
503 i=tp.cache->down_load; 671 i=tp.cache->down_load;
504 tp.cache->down_load=0; 672 tp.cache->down_load=0;
505 lh_doall_arg(tp.cache,(void (*)())timeout,(char *)&tp); 673 lh_doall_arg(tp.cache, LHASH_DOALL_ARG_FN(timeout), &tp);
506 tp.cache->down_load=i; 674 tp.cache->down_load=i;
507 CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX); 675 CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
508 } 676 }
509 677
510int ssl_clear_bad_session(s) 678int ssl_clear_bad_session(SSL *s)
511SSL *s;
512 { 679 {
513 if ( (s->session != NULL) && 680 if ( (s->session != NULL) &&
514 !(s->shutdown & SSL_SENT_SHUTDOWN) && 681 !(s->shutdown & SSL_SENT_SHUTDOWN) &&
@@ -522,9 +689,7 @@ SSL *s;
522 } 689 }
523 690
524/* locked by SSL_CTX in the calling function */ 691/* locked by SSL_CTX in the calling function */
525static void SSL_SESSION_list_remove(ctx,s) 692static void SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *s)
526SSL_CTX *ctx;
527SSL_SESSION *s;
528 { 693 {
529 if ((s->next == NULL) || (s->prev == NULL)) return; 694 if ((s->next == NULL) || (s->prev == NULL)) return;
530 695
@@ -557,9 +722,7 @@ SSL_SESSION *s;
557 s->prev=s->next=NULL; 722 s->prev=s->next=NULL;
558 } 723 }
559 724
560static void SSL_SESSION_list_add(ctx,s) 725static void SSL_SESSION_list_add(SSL_CTX *ctx, SSL_SESSION *s)
561SSL_CTX *ctx;
562SSL_SESSION *s;
563 { 726 {
564 if ((s->next != NULL) && (s->prev != NULL)) 727 if ((s->next != NULL) && (s->prev != NULL))
565 SSL_SESSION_list_remove(ctx,s); 728 SSL_SESSION_list_remove(ctx,s);
diff --git a/src/lib/libssl/ssl_stat.c b/src/lib/libssl/ssl_stat.c
index a1daf25dd4..b16d253081 100644
--- a/src/lib/libssl/ssl_stat.c
+++ b/src/lib/libssl/ssl_stat.c
@@ -59,23 +59,22 @@
59#include <stdio.h> 59#include <stdio.h>
60#include "ssl_locl.h" 60#include "ssl_locl.h"
61 61
62char *SSL_state_string_long(s) 62const char *SSL_state_string_long(const SSL *s)
63SSL *s;
64 { 63 {
65 char *str; 64 const char *str;
66 65
67 switch (s->state) 66 switch (s->state)
68 { 67 {
69case SSL_ST_BEFORE: str="before SSL initalisation"; break; 68case SSL_ST_BEFORE: str="before SSL initialization"; break;
70case SSL_ST_ACCEPT: str="before accept initalisation"; break; 69case SSL_ST_ACCEPT: str="before accept initialization"; break;
71case SSL_ST_CONNECT: str="before connect initalisation"; break; 70case SSL_ST_CONNECT: str="before connect initialization"; break;
72case SSL_ST_OK: str="SSL negotiation finished successfully"; break; 71case SSL_ST_OK: str="SSL negotiation finished successfully"; break;
73case SSL_ST_RENEGOTIATE: str="SSL renegotiate ciphers"; break; 72case SSL_ST_RENEGOTIATE: str="SSL renegotiate ciphers"; break;
74case SSL_ST_BEFORE|SSL_ST_CONNECT: str="before/connect initalisation"; break; 73case SSL_ST_BEFORE|SSL_ST_CONNECT: str="before/connect initialization"; break;
75case SSL_ST_OK|SSL_ST_CONNECT: str="ok/connect SSL initalisation"; break; 74case SSL_ST_OK|SSL_ST_CONNECT: str="ok/connect SSL initialization"; break;
76case SSL_ST_BEFORE|SSL_ST_ACCEPT: str="before/accept initalisation"; break; 75case SSL_ST_BEFORE|SSL_ST_ACCEPT: str="before/accept initialization"; break;
77case SSL_ST_OK|SSL_ST_ACCEPT: str="ok/accept SSL initalisation"; break; 76case SSL_ST_OK|SSL_ST_ACCEPT: str="ok/accept SSL initialization"; break;
78#ifndef NO_SSL2 77#ifndef OPENSSL_NO_SSL2
79case SSL2_ST_CLIENT_START_ENCRYPTION: str="SSLv2 client start encryption"; break; 78case SSL2_ST_CLIENT_START_ENCRYPTION: str="SSLv2 client start encryption"; break;
80case SSL2_ST_SERVER_START_ENCRYPTION: str="SSLv2 server start encryption"; break; 79case SSL2_ST_SERVER_START_ENCRYPTION: str="SSLv2 server start encryption"; break;
81case SSL2_ST_SEND_CLIENT_HELLO_A: str="SSLv2 write client hello A"; break; 80case SSL2_ST_SEND_CLIENT_HELLO_A: str="SSLv2 write client hello A"; break;
@@ -116,7 +115,7 @@ case SSL2_ST_X509_GET_SERVER_CERTIFICATE: str="SSLv2 X509 read server certificat
116case SSL2_ST_X509_GET_CLIENT_CERTIFICATE: str="SSLv2 X509 read client certificate"; break; 115case SSL2_ST_X509_GET_CLIENT_CERTIFICATE: str="SSLv2 X509 read client certificate"; break;
117#endif 116#endif
118 117
119#ifndef NO_SSL3 118#ifndef OPENSSL_NO_SSL3
120/* SSLv3 additions */ 119/* SSLv3 additions */
121case SSL3_ST_CW_CLNT_HELLO_A: str="SSLv3 write client hello A"; break; 120case SSL3_ST_CW_CLNT_HELLO_A: str="SSLv3 write client hello A"; break;
122case SSL3_ST_CW_CLNT_HELLO_B: str="SSLv3 write client hello B"; break; 121case SSL3_ST_CW_CLNT_HELLO_B: str="SSLv3 write client hello B"; break;
@@ -132,10 +131,12 @@ case SSL3_ST_CR_SRVR_DONE_A: str="SSLv3 read server done A"; break;
132case SSL3_ST_CR_SRVR_DONE_B: str="SSLv3 read server done B"; break; 131case SSL3_ST_CR_SRVR_DONE_B: str="SSLv3 read server done B"; break;
133case SSL3_ST_CW_CERT_A: str="SSLv3 write client certificate A"; break; 132case SSL3_ST_CW_CERT_A: str="SSLv3 write client certificate A"; break;
134case SSL3_ST_CW_CERT_B: str="SSLv3 write client certificate B"; break; 133case SSL3_ST_CW_CERT_B: str="SSLv3 write client certificate B"; break;
134case SSL3_ST_CW_CERT_C: str="SSLv3 write client certificate C"; break;
135case SSL3_ST_CW_CERT_D: str="SSLv3 write client certificate D"; break;
135case SSL3_ST_CW_KEY_EXCH_A: str="SSLv3 write client key exchange A"; break; 136case SSL3_ST_CW_KEY_EXCH_A: str="SSLv3 write client key exchange A"; break;
136case SSL3_ST_CW_KEY_EXCH_B: str="SSLv3 write client key exchange B"; break; 137case SSL3_ST_CW_KEY_EXCH_B: str="SSLv3 write client key exchange B"; break;
137case SSL3_ST_CW_CERT_VRFY_A: str="SSLv3 write certificate verify A"; break; 138case SSL3_ST_CW_CERT_VRFY_A: str="SSLv3 write certificate verify A"; break;
138case SSL3_ST_CW_CERT_VRFY_B: str="SSLv3 write certificate verify A"; break; 139case SSL3_ST_CW_CERT_VRFY_B: str="SSLv3 write certificate verify B"; break;
139 140
140case SSL3_ST_CW_CHANGE_A: 141case SSL3_ST_CW_CHANGE_A:
141case SSL3_ST_SW_CHANGE_A: str="SSLv3 write change cipher spec A"; break; 142case SSL3_ST_SW_CHANGE_A: str="SSLv3 write change cipher spec A"; break;
@@ -144,7 +145,7 @@ case SSL3_ST_SW_CHANGE_B: str="SSLv3 write change cipher spec B"; break;
144case SSL3_ST_CW_FINISHED_A: 145case SSL3_ST_CW_FINISHED_A:
145case SSL3_ST_SW_FINISHED_A: str="SSLv3 write finished A"; break; 146case SSL3_ST_SW_FINISHED_A: str="SSLv3 write finished A"; break;
146case SSL3_ST_CW_FINISHED_B: 147case SSL3_ST_CW_FINISHED_B:
147case SSL3_ST_SW_FINISHED_B: str="SSLv3 write finished A"; break; 148case SSL3_ST_SW_FINISHED_B: str="SSLv3 write finished B"; break;
148case SSL3_ST_CR_CHANGE_A: 149case SSL3_ST_CR_CHANGE_A:
149case SSL3_ST_SR_CHANGE_A: str="SSLv3 read change cipher spec A"; break; 150case SSL3_ST_SR_CHANGE_A: str="SSLv3 read change cipher spec A"; break;
150case SSL3_ST_CR_CHANGE_B: 151case SSL3_ST_CR_CHANGE_B:
@@ -181,8 +182,8 @@ case SSL3_ST_SR_CERT_VRFY_A: str="SSLv3 read certificate verify A"; break;
181case SSL3_ST_SR_CERT_VRFY_B: str="SSLv3 read certificate verify B"; break; 182case SSL3_ST_SR_CERT_VRFY_B: str="SSLv3 read certificate verify B"; break;
182#endif 183#endif
183 184
184#if !defined(NO_SSL2) && !defined(NO_SSL3) 185#if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3)
185/* SSLv2/v3 compatablitity states */ 186/* SSLv2/v3 compatibility states */
186/* client */ 187/* client */
187case SSL23_ST_CW_CLNT_HELLO_A: str="SSLv2/v3 write client hello A"; break; 188case SSL23_ST_CW_CLNT_HELLO_A: str="SSLv2/v3 write client hello A"; break;
188case SSL23_ST_CW_CLNT_HELLO_B: str="SSLv2/v3 write client hello B"; break; 189case SSL23_ST_CW_CLNT_HELLO_B: str="SSLv2/v3 write client hello B"; break;
@@ -198,10 +199,9 @@ default: str="unknown state"; break;
198 return(str); 199 return(str);
199 } 200 }
200 201
201char *SSL_rstate_string_long(s) 202const char *SSL_rstate_string_long(const SSL *s)
202SSL *s;
203 { 203 {
204 char *str; 204 const char *str;
205 205
206 switch (s->rstate) 206 switch (s->rstate)
207 { 207 {
@@ -213,10 +213,9 @@ SSL *s;
213 return(str); 213 return(str);
214 } 214 }
215 215
216char *SSL_state_string(s) 216const char *SSL_state_string(const SSL *s)
217SSL *s;
218 { 217 {
219 char *str; 218 const char *str;
220 219
221 switch (s->state) 220 switch (s->state)
222 { 221 {
@@ -224,7 +223,7 @@ case SSL_ST_BEFORE: str="PINIT "; break;
224case SSL_ST_ACCEPT: str="AINIT "; break; 223case SSL_ST_ACCEPT: str="AINIT "; break;
225case SSL_ST_CONNECT: str="CINIT "; break; 224case SSL_ST_CONNECT: str="CINIT "; break;
226case SSL_ST_OK: str="SSLOK "; break; 225case SSL_ST_OK: str="SSLOK "; break;
227#ifndef NO_SSL2 226#ifndef OPENSSL_NO_SSL2
228case SSL2_ST_CLIENT_START_ENCRYPTION: str="2CSENC"; break; 227case SSL2_ST_CLIENT_START_ENCRYPTION: str="2CSENC"; break;
229case SSL2_ST_SERVER_START_ENCRYPTION: str="2SSENC"; break; 228case SSL2_ST_SERVER_START_ENCRYPTION: str="2SSENC"; break;
230case SSL2_ST_SEND_CLIENT_HELLO_A: str="2SCH_A"; break; 229case SSL2_ST_SEND_CLIENT_HELLO_A: str="2SCH_A"; break;
@@ -265,7 +264,7 @@ case SSL2_ST_X509_GET_SERVER_CERTIFICATE: str="2X9GSC"; break;
265case SSL2_ST_X509_GET_CLIENT_CERTIFICATE: str="2X9GCC"; break; 264case SSL2_ST_X509_GET_CLIENT_CERTIFICATE: str="2X9GCC"; break;
266#endif 265#endif
267 266
268#ifndef NO_SSL3 267#ifndef OPENSSL_NO_SSL3
269/* SSLv3 additions */ 268/* SSLv3 additions */
270case SSL3_ST_SW_FLUSH: 269case SSL3_ST_SW_FLUSH:
271case SSL3_ST_CW_FLUSH: str="3FLUSH"; break; 270case SSL3_ST_CW_FLUSH: str="3FLUSH"; break;
@@ -283,6 +282,8 @@ case SSL3_ST_CR_SRVR_DONE_A: str="3RSD_A"; break;
283case SSL3_ST_CR_SRVR_DONE_B: str="3RSD_B"; break; 282case SSL3_ST_CR_SRVR_DONE_B: str="3RSD_B"; break;
284case SSL3_ST_CW_CERT_A: str="3WCC_A"; break; 283case SSL3_ST_CW_CERT_A: str="3WCC_A"; break;
285case SSL3_ST_CW_CERT_B: str="3WCC_B"; break; 284case SSL3_ST_CW_CERT_B: str="3WCC_B"; break;
285case SSL3_ST_CW_CERT_C: str="3WCC_C"; break;
286case SSL3_ST_CW_CERT_D: str="3WCC_D"; break;
286case SSL3_ST_CW_KEY_EXCH_A: str="3WCKEA"; break; 287case SSL3_ST_CW_KEY_EXCH_A: str="3WCKEA"; break;
287case SSL3_ST_CW_KEY_EXCH_B: str="3WCKEB"; break; 288case SSL3_ST_CW_KEY_EXCH_B: str="3WCKEB"; break;
288case SSL3_ST_CW_CERT_VRFY_A: str="3WCV_A"; break; 289case SSL3_ST_CW_CERT_VRFY_A: str="3WCV_A"; break;
@@ -329,8 +330,8 @@ case SSL3_ST_SR_CERT_VRFY_A: str="3RCV_A"; break;
329case SSL3_ST_SR_CERT_VRFY_B: str="3RCV_B"; break; 330case SSL3_ST_SR_CERT_VRFY_B: str="3RCV_B"; break;
330#endif 331#endif
331 332
332#if !defined(NO_SSL2) && !defined(NO_SSL3) 333#if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3)
333/* SSLv2/v3 compatablitity states */ 334/* SSLv2/v3 compatibility states */
334/* client */ 335/* client */
335case SSL23_ST_CW_CLNT_HELLO_A: str="23WCHA"; break; 336case SSL23_ST_CW_CLNT_HELLO_A: str="23WCHA"; break;
336case SSL23_ST_CW_CLNT_HELLO_B: str="23WCHB"; break; 337case SSL23_ST_CW_CLNT_HELLO_B: str="23WCHB"; break;
@@ -346,8 +347,7 @@ default: str="UNKWN "; break;
346 return(str); 347 return(str);
347 } 348 }
348 349
349char *SSL_alert_type_string_long(value) 350const char *SSL_alert_type_string_long(int value)
350int value;
351 { 351 {
352 value>>=8; 352 value>>=8;
353 if (value == SSL3_AL_WARNING) 353 if (value == SSL3_AL_WARNING)
@@ -358,8 +358,7 @@ int value;
358 return("unknown"); 358 return("unknown");
359 } 359 }
360 360
361char *SSL_alert_type_string(value) 361const char *SSL_alert_type_string(int value)
362int value;
363 { 362 {
364 value>>=8; 363 value>>=8;
365 if (value == SSL3_AL_WARNING) 364 if (value == SSL3_AL_WARNING)
@@ -370,10 +369,9 @@ int value;
370 return("U"); 369 return("U");
371 } 370 }
372 371
373char *SSL_alert_desc_string(value) 372const char *SSL_alert_desc_string(int value)
374int value;
375 { 373 {
376 char *str; 374 const char *str;
377 375
378 switch (value & 0xff) 376 switch (value & 0xff)
379 { 377 {
@@ -389,15 +387,26 @@ int value;
389 case SSL3_AD_CERTIFICATE_EXPIRED: str="CE"; break; 387 case SSL3_AD_CERTIFICATE_EXPIRED: str="CE"; break;
390 case SSL3_AD_CERTIFICATE_UNKNOWN: str="CU"; break; 388 case SSL3_AD_CERTIFICATE_UNKNOWN: str="CU"; break;
391 case SSL3_AD_ILLEGAL_PARAMETER: str="IP"; break; 389 case SSL3_AD_ILLEGAL_PARAMETER: str="IP"; break;
390 case TLS1_AD_DECRYPTION_FAILED: str="DC"; break;
391 case TLS1_AD_RECORD_OVERFLOW: str="RO"; break;
392 case TLS1_AD_UNKNOWN_CA: str="CA"; break;
393 case TLS1_AD_ACCESS_DENIED: str="AD"; break;
394 case TLS1_AD_DECODE_ERROR: str="DE"; break;
395 case TLS1_AD_DECRYPT_ERROR: str="CY"; break;
396 case TLS1_AD_EXPORT_RESTRICTION: str="ER"; break;
397 case TLS1_AD_PROTOCOL_VERSION: str="PV"; break;
398 case TLS1_AD_INSUFFICIENT_SECURITY: str="IS"; break;
399 case TLS1_AD_INTERNAL_ERROR: str="IE"; break;
400 case TLS1_AD_USER_CANCELLED: str="US"; break;
401 case TLS1_AD_NO_RENEGOTIATION: str="NR"; break;
392 default: str="UK"; break; 402 default: str="UK"; break;
393 } 403 }
394 return(str); 404 return(str);
395 } 405 }
396 406
397char *SSL_alert_desc_string_long(value) 407const char *SSL_alert_desc_string_long(int value)
398int value;
399 { 408 {
400 char *str; 409 const char *str;
401 410
402 switch (value & 0xff) 411 switch (value & 0xff)
403 { 412 {
@@ -405,7 +414,7 @@ int value;
405 str="close notify"; 414 str="close notify";
406 break; 415 break;
407 case SSL3_AD_UNEXPECTED_MESSAGE: 416 case SSL3_AD_UNEXPECTED_MESSAGE:
408 str="unexected_message"; 417 str="unexpected_message";
409 break; 418 break;
410 case SSL3_AD_BAD_RECORD_MAC: 419 case SSL3_AD_BAD_RECORD_MAC:
411 str="bad record mac"; 420 str="bad record mac";
@@ -432,20 +441,55 @@ int value;
432 str="certificate expired"; 441 str="certificate expired";
433 break; 442 break;
434 case SSL3_AD_CERTIFICATE_UNKNOWN: 443 case SSL3_AD_CERTIFICATE_UNKNOWN:
435 str="certifcate unknown"; 444 str="certificate unknown";
436 break; 445 break;
437 case SSL3_AD_ILLEGAL_PARAMETER: 446 case SSL3_AD_ILLEGAL_PARAMETER:
438 str="illegal parameter"; 447 str="illegal parameter";
439 break; 448 break;
449 case TLS1_AD_DECRYPTION_FAILED:
450 str="decryption failed";
451 break;
452 case TLS1_AD_RECORD_OVERFLOW:
453 str="record overflow";
454 break;
455 case TLS1_AD_UNKNOWN_CA:
456 str="unknown CA";
457 break;
458 case TLS1_AD_ACCESS_DENIED:
459 str="access denied";
460 break;
461 case TLS1_AD_DECODE_ERROR:
462 str="decode error";
463 break;
464 case TLS1_AD_DECRYPT_ERROR:
465 str="decrypt error";
466 break;
467 case TLS1_AD_EXPORT_RESTRICTION:
468 str="export restriction";
469 break;
470 case TLS1_AD_PROTOCOL_VERSION:
471 str="protocol version";
472 break;
473 case TLS1_AD_INSUFFICIENT_SECURITY:
474 str="insufficient security";
475 break;
476 case TLS1_AD_INTERNAL_ERROR:
477 str="internal error";
478 break;
479 case TLS1_AD_USER_CANCELLED:
480 str="user canceled";
481 break;
482 case TLS1_AD_NO_RENEGOTIATION:
483 str="no renegotiation";
484 break;
440 default: str="unknown"; break; 485 default: str="unknown"; break;
441 } 486 }
442 return(str); 487 return(str);
443 } 488 }
444 489
445char *SSL_rstate_string(s) 490const char *SSL_rstate_string(const SSL *s)
446SSL *s;
447 { 491 {
448 char *str; 492 const char *str;
449 493
450 switch (s->rstate) 494 switch (s->rstate)
451 { 495 {
diff --git a/src/lib/libssl/ssl_txt.c b/src/lib/libssl/ssl_txt.c
index ce60e1a6dd..40b76b1b26 100644
--- a/src/lib/libssl/ssl_txt.c
+++ b/src/lib/libssl/ssl_txt.c
@@ -57,35 +57,31 @@
57 */ 57 */
58 58
59#include <stdio.h> 59#include <stdio.h>
60#include "buffer.h" 60#include <openssl/buffer.h>
61#include "ssl_locl.h" 61#include "ssl_locl.h"
62 62
63#ifndef NO_FP_API 63#ifndef OPENSSL_NO_FP_API
64int SSL_SESSION_print_fp(fp, x) 64int SSL_SESSION_print_fp(FILE *fp, SSL_SESSION *x)
65FILE *fp; 65 {
66SSL_SESSION *x; 66 BIO *b;
67 { 67 int ret;
68 BIO *b;
69 int ret;
70 68
71 if ((b=BIO_new(BIO_s_file_internal())) == NULL) 69 if ((b=BIO_new(BIO_s_file_internal())) == NULL)
72 { 70 {
73 SSLerr(SSL_F_SSL_SESSION_PRINT_FP,ERR_R_BUF_LIB); 71 SSLerr(SSL_F_SSL_SESSION_PRINT_FP,ERR_R_BUF_LIB);
74 return(0); 72 return(0);
75 } 73 }
76 BIO_set_fp(b,fp,BIO_NOCLOSE); 74 BIO_set_fp(b,fp,BIO_NOCLOSE);
77 ret=SSL_SESSION_print(b,x); 75 ret=SSL_SESSION_print(b,x);
78 BIO_free(b); 76 BIO_free(b);
79 return(ret); 77 return(ret);
80 } 78 }
81#endif 79#endif
82 80
83int SSL_SESSION_print(bp,x) 81int SSL_SESSION_print(BIO *bp, SSL_SESSION *x)
84BIO *bp;
85SSL_SESSION *x;
86 { 82 {
87 int i; 83 unsigned int i;
88 char str[128],*s; 84 char *s;
89 85
90 if (x == NULL) goto err; 86 if (x == NULL) goto err;
91 if (BIO_puts(bp,"SSL-Session:\n") <= 0) goto err; 87 if (BIO_puts(bp,"SSL-Session:\n") <= 0) goto err;
@@ -97,30 +93,41 @@ SSL_SESSION *x;
97 s="TLSv1"; 93 s="TLSv1";
98 else 94 else
99 s="unknown"; 95 s="unknown";
100 sprintf(str," Protocol : %s\n",s); 96 if (BIO_printf(bp," Protocol : %s\n",s) <= 0) goto err;
101 if (BIO_puts(bp,str) <= 0) goto err;
102 97
103 if (x->cipher == NULL) 98 if (x->cipher == NULL)
104 { 99 {
105 if (((x->cipher_id) & 0xff000000) == 0x02000000) 100 if (((x->cipher_id) & 0xff000000) == 0x02000000)
106 sprintf(str," Cipher : %06lX\n",x->cipher_id&0xffffff); 101 {
102 if (BIO_printf(bp," Cipher : %06lX\n",x->cipher_id&0xffffff) <= 0)
103 goto err;
104 }
107 else 105 else
108 sprintf(str," Cipher : %04lX\n",x->cipher_id&0xffff); 106 {
107 if (BIO_printf(bp," Cipher : %04lX\n",x->cipher_id&0xffff) <= 0)
108 goto err;
109 }
109 } 110 }
110 else 111 else
111 sprintf(str," Cipher : %s\n",(x->cipher == NULL)?"unknown":x->cipher->name); 112 {
112 if (BIO_puts(bp,str) <= 0) goto err; 113 if (BIO_printf(bp," Cipher : %s\n",((x->cipher == NULL)?"unknown":x->cipher->name)) <= 0)
114 goto err;
115 }
113 if (BIO_puts(bp," Session-ID: ") <= 0) goto err; 116 if (BIO_puts(bp," Session-ID: ") <= 0) goto err;
114 for (i=0; i<(int)x->session_id_length; i++) 117 for (i=0; i<x->session_id_length; i++)
118 {
119 if (BIO_printf(bp,"%02X",x->session_id[i]) <= 0) goto err;
120 }
121 if (BIO_puts(bp,"\n Session-ID-ctx: ") <= 0) goto err;
122 for (i=0; i<x->sid_ctx_length; i++)
115 { 123 {
116 sprintf(str,"%02X",x->session_id[i]); 124 if (BIO_printf(bp,"%02X",x->sid_ctx[i]) <= 0)
117 if (BIO_puts(bp,str) <= 0) goto err; 125 goto err;
118 } 126 }
119 if (BIO_puts(bp,"\n Master-Key: ") <= 0) goto err; 127 if (BIO_puts(bp,"\n Master-Key: ") <= 0) goto err;
120 for (i=0; i<(int)x->master_key_length; i++) 128 for (i=0; i<(unsigned int)x->master_key_length; i++)
121 { 129 {
122 sprintf(str,"%02X",x->master_key[i]); 130 if (BIO_printf(bp,"%02X",x->master_key[i]) <= 0) goto err;
123 if (BIO_puts(bp,str) <= 0) goto err;
124 } 131 }
125 if (BIO_puts(bp,"\n Key-Arg : ") <= 0) goto err; 132 if (BIO_puts(bp,"\n Key-Arg : ") <= 0) goto err;
126 if (x->key_arg_length == 0) 133 if (x->key_arg_length == 0)
@@ -128,22 +135,49 @@ SSL_SESSION *x;
128 if (BIO_puts(bp,"None") <= 0) goto err; 135 if (BIO_puts(bp,"None") <= 0) goto err;
129 } 136 }
130 else 137 else
131 for (i=0; i<(int)x->key_arg_length; i++) 138 for (i=0; i<x->key_arg_length; i++)
132 { 139 {
133 sprintf(str,"%02X",x->key_arg[i]); 140 if (BIO_printf(bp,"%02X",x->key_arg[i]) <= 0) goto err;
134 if (BIO_puts(bp,str) <= 0) goto err;
135 } 141 }
142#ifndef OPENSSL_NO_KRB5
143 if (BIO_puts(bp,"\n Krb5 Principal: ") <= 0) goto err;
144 if (x->krb5_client_princ_len == 0)
145 {
146 if (BIO_puts(bp,"None") <= 0) goto err;
147 }
148 else
149 for (i=0; i<x->krb5_client_princ_len; i++)
150 {
151 if (BIO_printf(bp,"%02X",x->krb5_client_princ[i]) <= 0) goto err;
152 }
153#endif /* OPENSSL_NO_KRB5 */
154 if (x->compress_meth != 0)
155 {
156 SSL_COMP *comp;
157
158 ssl_cipher_get_evp(x,NULL,NULL,&comp);
159 if (comp == NULL)
160 {
161 if (BIO_printf(bp,"\n Compression: %d",x->compress_meth) <= 0) goto err;
162 }
163 else
164 {
165 if (BIO_printf(bp,"\n Compression: %d (%s)", comp->id,comp->method->name) <= 0) goto err;
166 }
167 }
136 if (x->time != 0L) 168 if (x->time != 0L)
137 { 169 {
138 sprintf(str,"\n Start Time: %ld",x->time); 170 if (BIO_printf(bp, "\n Start Time: %ld",x->time) <= 0) goto err;
139 if (BIO_puts(bp,str) <= 0) goto err;
140 } 171 }
141 if (x->timeout != 0L) 172 if (x->timeout != 0L)
142 { 173 {
143 sprintf(str,"\n Timeout : %ld (sec)",x->timeout); 174 if (BIO_printf(bp, "\n Timeout : %ld (sec)",x->timeout) <= 0) goto err;
144 if (BIO_puts(bp,str) <= 0) goto err;
145 } 175 }
146 if (BIO_puts(bp,"\n") <= 0) goto err; 176 if (BIO_puts(bp,"\n") <= 0) goto err;
177
178 if (BIO_puts(bp, " Verify return code: ") <= 0) goto err;
179 if (BIO_printf(bp, "%ld (%s)\n", x->verify_result,
180 X509_verify_cert_error_string(x->verify_result)) <= 0) goto err;
147 181
148 return(1); 182 return(1);
149err: 183err:
diff --git a/src/lib/libssl/t1_clnt.c b/src/lib/libssl/t1_clnt.c
index 986d2436e2..9745630a00 100644
--- a/src/lib/libssl/t1_clnt.c
+++ b/src/lib/libssl/t1_clnt.c
@@ -57,14 +57,14 @@
57 */ 57 */
58 58
59#include <stdio.h> 59#include <stdio.h>
60#include "buffer.h" 60#include <openssl/buffer.h>
61#include "rand.h" 61#include <openssl/rand.h>
62#include "objects.h" 62#include <openssl/objects.h>
63#include "evp.h" 63#include <openssl/evp.h>
64#include "ssl_locl.h" 64#include "ssl_locl.h"
65 65
66static SSL_METHOD *tls1_get_client_method(ver) 66static SSL_METHOD *tls1_get_client_method(int ver);
67int ver; 67static SSL_METHOD *tls1_get_client_method(int ver)
68 { 68 {
69 if (ver == TLS1_VERSION) 69 if (ver == TLS1_VERSION)
70 return(TLSv1_client_method()); 70 return(TLSv1_client_method());
@@ -72,18 +72,18 @@ int ver;
72 return(NULL); 72 return(NULL);
73 } 73 }
74 74
75SSL_METHOD *TLSv1_client_method() 75SSL_METHOD *TLSv1_client_method(void)
76 { 76 {
77 static int init=1; 77 static int init=1;
78 static SSL_METHOD TLSv1_client_data; 78 static SSL_METHOD TLSv1_client_data;
79 79
80 if (init) 80 if (init)
81 { 81 {
82 init=0;
83 memcpy((char *)&TLSv1_client_data,(char *)tlsv1_base_method(), 82 memcpy((char *)&TLSv1_client_data,(char *)tlsv1_base_method(),
84 sizeof(SSL_METHOD)); 83 sizeof(SSL_METHOD));
85 TLSv1_client_data.ssl_connect=ssl3_connect; 84 TLSv1_client_data.ssl_connect=ssl3_connect;
86 TLSv1_client_data.get_ssl_method=tls1_get_client_method; 85 TLSv1_client_data.get_ssl_method=tls1_get_client_method;
86 init=0;
87 } 87 }
88 return(&TLSv1_client_data); 88 return(&TLSv1_client_data);
89 } 89 }
diff --git a/src/lib/libssl/t1_enc.c b/src/lib/libssl/t1_enc.c
index fbdd3bffb5..b80525f3ba 100644
--- a/src/lib/libssl/t1_enc.c
+++ b/src/lib/libssl/t1_enc.c
@@ -55,20 +55,70 @@
55 * copied and put under another distribution licence 55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.] 56 * [including the GNU Public Licence.]
57 */ 57 */
58/* ====================================================================
59 * Copyright (c) 1998-2002 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 */
58 111
59#include <stdio.h> 112#include <stdio.h>
60#include "evp.h" 113#include <openssl/comp.h>
61#include "hmac.h" 114#include <openssl/evp.h>
115#include <openssl/hmac.h>
62#include "ssl_locl.h" 116#include "ssl_locl.h"
117#include <openssl/md5.h>
63 118
64static void tls1_P_hash(md,sec,sec_len,seed,seed_len,out,olen) 119static void tls1_P_hash(const EVP_MD *md, const unsigned char *sec,
65EVP_MD *md; 120 int sec_len, unsigned char *seed, int seed_len,
66unsigned char *sec; 121 unsigned char *out, int olen)
67int sec_len;
68unsigned char *seed;
69int seed_len;
70unsigned char *out;
71int olen;
72 { 122 {
73 int chunk,n; 123 int chunk,n;
74 unsigned int j; 124 unsigned int j;
@@ -79,16 +129,20 @@ int olen;
79 129
80 chunk=EVP_MD_size(md); 130 chunk=EVP_MD_size(md);
81 131
82 HMAC_Init(&ctx,sec,sec_len,md); 132 HMAC_CTX_init(&ctx);
133 HMAC_CTX_init(&ctx_tmp);
134 HMAC_Init_ex(&ctx,sec,sec_len,md, NULL);
135 HMAC_Init_ex(&ctx_tmp,sec,sec_len,md, NULL);
83 HMAC_Update(&ctx,seed,seed_len); 136 HMAC_Update(&ctx,seed,seed_len);
84 HMAC_Final(&ctx,A1,&A1_len); 137 HMAC_Final(&ctx,A1,&A1_len);
85 138
86 n=0; 139 n=0;
87 for (;;) 140 for (;;)
88 { 141 {
89 HMAC_Init(&ctx,NULL,0,NULL); /* re-init */ 142 HMAC_Init_ex(&ctx,NULL,0,NULL,NULL); /* re-init */
143 HMAC_Init_ex(&ctx_tmp,NULL,0,NULL,NULL); /* re-init */
90 HMAC_Update(&ctx,A1,A1_len); 144 HMAC_Update(&ctx,A1,A1_len);
91 memcpy(&ctx_tmp,&ctx,sizeof(ctx)); /* Copy for A2 */ /* not needed for last one */ 145 HMAC_Update(&ctx_tmp,A1,A1_len);
92 HMAC_Update(&ctx,seed,seed_len); 146 HMAC_Update(&ctx,seed,seed_len);
93 147
94 if (olen > chunk) 148 if (olen > chunk)
@@ -105,24 +159,18 @@ int olen;
105 break; 159 break;
106 } 160 }
107 } 161 }
108 HMAC_cleanup(&ctx); 162 HMAC_CTX_cleanup(&ctx);
109 HMAC_cleanup(&ctx_tmp); 163 HMAC_CTX_cleanup(&ctx_tmp);
110 memset(A1,0,sizeof(A1)); 164 memset(A1,0,sizeof(A1));
111 } 165 }
112 166
113static void tls1_PRF(md5,sha1,label,label_len,sec,slen,out1,out2,olen) 167static void tls1_PRF(const EVP_MD *md5, const EVP_MD *sha1,
114EVP_MD *md5; 168 unsigned char *label, int label_len,
115EVP_MD *sha1; 169 const unsigned char *sec, int slen, unsigned char *out1,
116unsigned char *label; 170 unsigned char *out2, int olen)
117int label_len;
118unsigned char *sec;
119int slen;
120unsigned char *out1;
121unsigned char *out2;
122int olen;
123 { 171 {
124 int len,i; 172 int len,i;
125 unsigned char *S1,*S2; 173 const unsigned char *S1,*S2;
126 174
127 len=slen/2; 175 len=slen/2;
128 S1=sec; 176 S1=sec;
@@ -137,10 +185,8 @@ int olen;
137 out1[i]^=out2[i]; 185 out1[i]^=out2[i];
138 } 186 }
139 187
140static void tls1_generate_key_block(s,km,tmp,num) 188static void tls1_generate_key_block(SSL *s, unsigned char *km,
141SSL *s; 189 unsigned char *tmp, int num)
142unsigned char *km,*tmp;
143int num;
144 { 190 {
145 unsigned char *p; 191 unsigned char *p;
146 unsigned char buf[SSL3_RANDOM_SIZE*2+ 192 unsigned char buf[SSL3_RANDOM_SIZE*2+
@@ -155,15 +201,25 @@ int num;
155 memcpy(p,s->s3->client_random,SSL3_RANDOM_SIZE); 201 memcpy(p,s->s3->client_random,SSL3_RANDOM_SIZE);
156 p+=SSL3_RANDOM_SIZE; 202 p+=SSL3_RANDOM_SIZE;
157 203
158 tls1_PRF(s->ctx->md5,s->ctx->sha1,buf,p-buf, 204 tls1_PRF(s->ctx->md5,s->ctx->sha1,buf,(int)(p-buf),
159 s->session->master_key,s->session->master_key_length, 205 s->session->master_key,s->session->master_key_length,
160 km,tmp,num); 206 km,tmp,num);
207#ifdef KSSL_DEBUG
208 printf("tls1_generate_key_block() ==> %d byte master_key =\n\t",
209 s->session->master_key_length);
210 {
211 int i;
212 for (i=0; i < s->session->master_key_length; i++)
213 {
214 printf("%02X", s->session->master_key[i]);
215 }
216 printf("\n"); }
217#endif /* KSSL_DEBUG */
161 } 218 }
162 219
163int tls1_change_cipher_state(s,which) 220int tls1_change_cipher_state(SSL *s, int which)
164SSL *s;
165int which;
166 { 221 {
222 static const unsigned char empty[]="";
167 unsigned char *p,*key_block,*mac_secret; 223 unsigned char *p,*key_block,*mac_secret;
168 unsigned char *exp_label,buf[TLS_MD_MAX_CONST_SIZE+ 224 unsigned char *exp_label,buf[TLS_MD_MAX_CONST_SIZE+
169 SSL3_RANDOM_SIZE*2]; 225 SSL3_RANDOM_SIZE*2];
@@ -174,47 +230,103 @@ int which;
174 unsigned char *ms,*key,*iv,*er1,*er2; 230 unsigned char *ms,*key,*iv,*er1,*er2;
175 int client_write; 231 int client_write;
176 EVP_CIPHER_CTX *dd; 232 EVP_CIPHER_CTX *dd;
177 EVP_CIPHER *c; 233 const EVP_CIPHER *c;
178 SSL_COMPRESSION *comp; 234 const SSL_COMP *comp;
179 EVP_MD *m; 235 const EVP_MD *m;
180 int exp,n,i,j,k,exp_label_len; 236 int is_export,n,i,j,k,exp_label_len,cl;
237 int reuse_dd = 0;
181 238
182 exp=(s->s3->tmp.new_cipher->algorithms & SSL_EXPORT)?1:0; 239 is_export=SSL_C_IS_EXPORT(s->s3->tmp.new_cipher);
183 c=s->s3->tmp.new_sym_enc; 240 c=s->s3->tmp.new_sym_enc;
184 m=s->s3->tmp.new_hash; 241 m=s->s3->tmp.new_hash;
185 comp=s->s3->tmp.new_compression; 242 comp=s->s3->tmp.new_compression;
186 key_block=s->s3->tmp.key_block; 243 key_block=s->s3->tmp.key_block;
187 244
245#ifdef KSSL_DEBUG
246 printf("tls1_change_cipher_state(which= %d) w/\n", which);
247 printf("\talg= %ld, comp= %p\n", s->s3->tmp.new_cipher->algorithms,
248 comp);
249 printf("\tevp_cipher == %p ==? &d_cbc_ede_cipher3\n", c);
250 printf("\tevp_cipher: nid, blksz= %d, %d, keylen=%d, ivlen=%d\n",
251 c->nid,c->block_size,c->key_len,c->iv_len);
252 printf("\tkey_block: len= %d, data= ", s->s3->tmp.key_block_length);
253 {
254 int i;
255 for (i=0; i<s->s3->tmp.key_block_length; i++)
256 printf("%02x", key_block[i]); printf("\n");
257 }
258#endif /* KSSL_DEBUG */
259
188 if (which & SSL3_CC_READ) 260 if (which & SSL3_CC_READ)
189 { 261 {
190 if ((s->enc_read_ctx == NULL) && 262 if (s->enc_read_ctx != NULL)
191 ((s->enc_read_ctx=(EVP_CIPHER_CTX *) 263 reuse_dd = 1;
192 Malloc(sizeof(EVP_CIPHER_CTX))) == NULL)) 264 else if ((s->enc_read_ctx=OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL)
193 goto err; 265 goto err;
194 dd= s->enc_read_ctx; 266 dd= s->enc_read_ctx;
195 s->read_hash=m; 267 s->read_hash=m;
196 s->read_compression=comp; 268 if (s->expand != NULL)
269 {
270 COMP_CTX_free(s->expand);
271 s->expand=NULL;
272 }
273 if (comp != NULL)
274 {
275 s->expand=COMP_CTX_new(comp->method);
276 if (s->expand == NULL)
277 {
278 SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,SSL_R_COMPRESSION_LIBRARY_ERROR);
279 goto err2;
280 }
281 if (s->s3->rrec.comp == NULL)
282 s->s3->rrec.comp=(unsigned char *)
283 OPENSSL_malloc(SSL3_RT_MAX_ENCRYPTED_LENGTH);
284 if (s->s3->rrec.comp == NULL)
285 goto err;
286 }
197 memset(&(s->s3->read_sequence[0]),0,8); 287 memset(&(s->s3->read_sequence[0]),0,8);
198 mac_secret= &(s->s3->read_mac_secret[0]); 288 mac_secret= &(s->s3->read_mac_secret[0]);
199 } 289 }
200 else 290 else
201 { 291 {
292 if (s->enc_write_ctx != NULL)
293 reuse_dd = 1;
294 else if ((s->enc_write_ctx=OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL)
295 goto err;
202 if ((s->enc_write_ctx == NULL) && 296 if ((s->enc_write_ctx == NULL) &&
203 ((s->enc_write_ctx=(EVP_CIPHER_CTX *) 297 ((s->enc_write_ctx=(EVP_CIPHER_CTX *)
204 Malloc(sizeof(EVP_CIPHER_CTX))) == NULL)) 298 OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL))
205 goto err; 299 goto err;
206 dd= s->enc_write_ctx; 300 dd= s->enc_write_ctx;
207 s->write_hash=m; 301 s->write_hash=m;
208 s->write_compression=comp; 302 if (s->compress != NULL)
303 {
304 COMP_CTX_free(s->compress);
305 s->compress=NULL;
306 }
307 if (comp != NULL)
308 {
309 s->compress=COMP_CTX_new(comp->method);
310 if (s->compress == NULL)
311 {
312 SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,SSL_R_COMPRESSION_LIBRARY_ERROR);
313 goto err2;
314 }
315 }
209 memset(&(s->s3->write_sequence[0]),0,8); 316 memset(&(s->s3->write_sequence[0]),0,8);
210 mac_secret= &(s->s3->write_mac_secret[0]); 317 mac_secret= &(s->s3->write_mac_secret[0]);
211 } 318 }
212 319
320 if (reuse_dd)
321 EVP_CIPHER_CTX_cleanup(dd);
213 EVP_CIPHER_CTX_init(dd); 322 EVP_CIPHER_CTX_init(dd);
214 323
215 p=s->s3->tmp.key_block; 324 p=s->s3->tmp.key_block;
216 i=EVP_MD_size(m); 325 i=EVP_MD_size(m);
217 j=(exp)?5:EVP_CIPHER_key_length(c); 326 cl=EVP_CIPHER_key_length(c);
327 j=is_export ? (cl < SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher) ?
328 cl : SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher)) : cl;
329 /* Was j=(exp)?5:EVP_CIPHER_key_length(c); */
218 k=EVP_CIPHER_iv_length(c); 330 k=EVP_CIPHER_iv_length(c);
219 er1= &(s->s3->client_random[0]); 331 er1= &(s->s3->client_random[0]);
220 er2= &(s->s3->server_random[0]); 332 er2= &(s->s3->server_random[0]);
@@ -241,7 +353,7 @@ int which;
241 353
242 if (n > s->s3->tmp.key_block_length) 354 if (n > s->s3->tmp.key_block_length)
243 { 355 {
244 SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,SSL_R_INTERNAL_ERROR); 356 SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,ERR_R_INTERNAL_ERROR);
245 goto err2; 357 goto err2;
246 } 358 }
247 359
@@ -250,7 +362,7 @@ int which;
250printf("which = %04X\nmac key=",which); 362printf("which = %04X\nmac key=",which);
251{ int z; for (z=0; z<i; z++) printf("%02X%c",ms[z],((z+1)%16)?' ':'\n'); } 363{ int z; for (z=0; z<i; z++) printf("%02X%c",ms[z],((z+1)%16)?' ':'\n'); }
252#endif 364#endif
253 if (exp) 365 if (is_export)
254 { 366 {
255 /* In here I set both the read and write key/iv to the 367 /* In here I set both the read and write key/iv to the
256 * same value since only the correct one will be used :-). 368 * same value since only the correct one will be used :-).
@@ -262,8 +374,8 @@ printf("which = %04X\nmac key=",which);
262 p+=SSL3_RANDOM_SIZE; 374 p+=SSL3_RANDOM_SIZE;
263 memcpy(p,s->s3->server_random,SSL3_RANDOM_SIZE); 375 memcpy(p,s->s3->server_random,SSL3_RANDOM_SIZE);
264 p+=SSL3_RANDOM_SIZE; 376 p+=SSL3_RANDOM_SIZE;
265 tls1_PRF(s->ctx->md5,s->ctx->sha1,buf,p-buf,key,j, 377 tls1_PRF(s->ctx->md5,s->ctx->sha1,buf,(int)(p-buf),key,j,
266 tmp1,tmp2,EVP_CIPHER_key_length(c)); 378 tmp1,tmp2,EVP_CIPHER_key_length(c));
267 key=tmp1; 379 key=tmp1;
268 380
269 if (k > 0) 381 if (k > 0)
@@ -276,8 +388,8 @@ printf("which = %04X\nmac key=",which);
276 p+=SSL3_RANDOM_SIZE; 388 p+=SSL3_RANDOM_SIZE;
277 memcpy(p,s->s3->server_random,SSL3_RANDOM_SIZE); 389 memcpy(p,s->s3->server_random,SSL3_RANDOM_SIZE);
278 p+=SSL3_RANDOM_SIZE; 390 p+=SSL3_RANDOM_SIZE;
279 tls1_PRF(s->ctx->md5,s->ctx->sha1, 391 tls1_PRF(s->ctx->md5,s->ctx->sha1,buf,p-buf,empty,0,
280 buf,p-buf,"",0,iv1,iv2,k*2); 392 iv1,iv2,k*2);
281 if (client_write) 393 if (client_write)
282 iv=iv1; 394 iv=iv1;
283 else 395 else
@@ -286,8 +398,18 @@ printf("which = %04X\nmac key=",which);
286 } 398 }
287 399
288 s->session->key_arg_length=0; 400 s->session->key_arg_length=0;
401#ifdef KSSL_DEBUG
402 {
403 int i;
404 printf("EVP_CipherInit_ex(dd,c,key=,iv=,which)\n");
405 printf("\tkey= "); for (i=0; i<c->key_len; i++) printf("%02x", key[i]);
406 printf("\n");
407 printf("\t iv= "); for (i=0; i<c->iv_len; i++) printf("%02x", iv[i]);
408 printf("\n");
409 }
410#endif /* KSSL_DEBUG */
289 411
290 EVP_CipherInit(dd,c,key,iv,(which & SSL3_CC_WRITE)); 412 EVP_CipherInit_ex(dd,c,NULL,key,iv,(which & SSL3_CC_WRITE));
291#ifdef TLS_DEBUG 413#ifdef TLS_DEBUG
292printf("which = %04X\nkey=",which); 414printf("which = %04X\nkey=",which);
293{ int z; for (z=0; z<EVP_CIPHER_key_length(c); z++) printf("%02X%c",key[z],((z+1)%16)?' ':'\n'); } 415{ int z; for (z=0; z<EVP_CIPHER_key_length(c); z++) printf("%02X%c",key[z],((z+1)%16)?' ':'\n'); }
@@ -307,18 +429,22 @@ err2:
307 return(0); 429 return(0);
308 } 430 }
309 431
310int tls1_setup_key_block(s) 432int tls1_setup_key_block(SSL *s)
311SSL *s;
312 { 433 {
313 unsigned char *p1,*p2; 434 unsigned char *p1,*p2;
314 EVP_CIPHER *c; 435 const EVP_CIPHER *c;
315 EVP_MD *hash; 436 const EVP_MD *hash;
316 int num,exp; 437 int num;
438 SSL_COMP *comp;
439
440#ifdef KSSL_DEBUG
441 printf ("tls1_setup_key_block()\n");
442#endif /* KSSL_DEBUG */
317 443
318 if (s->s3->tmp.key_block_length != 0) 444 if (s->s3->tmp.key_block_length != 0)
319 return(1); 445 return(1);
320 446
321 if (!ssl_cipher_get_evp(s->session->cipher,&c,&hash)) 447 if (!ssl_cipher_get_evp(s->session,&c,&hash,&comp))
322 { 448 {
323 SSLerr(SSL_F_TLS1_SETUP_KEY_BLOCK,SSL_R_CIPHER_OR_HASH_UNAVAILABLE); 449 SSLerr(SSL_F_TLS1_SETUP_KEY_BLOCK,SSL_R_CIPHER_OR_HASH_UNAVAILABLE);
324 return(0); 450 return(0);
@@ -327,16 +453,14 @@ SSL *s;
327 s->s3->tmp.new_sym_enc=c; 453 s->s3->tmp.new_sym_enc=c;
328 s->s3->tmp.new_hash=hash; 454 s->s3->tmp.new_hash=hash;
329 455
330 exp=(s->session->cipher->algorithms & SSL_EXPORT)?1:0;
331
332 num=EVP_CIPHER_key_length(c)+EVP_MD_size(hash)+EVP_CIPHER_iv_length(c); 456 num=EVP_CIPHER_key_length(c)+EVP_MD_size(hash)+EVP_CIPHER_iv_length(c);
333 num*=2; 457 num*=2;
334 458
335 ssl3_cleanup_key_block(s); 459 ssl3_cleanup_key_block(s);
336 460
337 if ((p1=(unsigned char *)Malloc(num)) == NULL) 461 if ((p1=(unsigned char *)OPENSSL_malloc(num)) == NULL)
338 goto err; 462 goto err;
339 if ((p2=(unsigned char *)Malloc(num)) == NULL) 463 if ((p2=(unsigned char *)OPENSSL_malloc(num)) == NULL)
340 goto err; 464 goto err;
341 465
342 s->s3->tmp.key_block_length=num; 466 s->s3->tmp.key_block_length=num;
@@ -353,28 +477,33 @@ printf("pre-master\n");
353#endif 477#endif
354 tls1_generate_key_block(s,p1,p2,num); 478 tls1_generate_key_block(s,p1,p2,num);
355 memset(p2,0,num); 479 memset(p2,0,num);
356 Free(p2); 480 OPENSSL_free(p2);
357#ifdef TLS_DEBUG 481#ifdef TLS_DEBUG
358printf("\nkey block\n"); 482printf("\nkey block\n");
359{ int z; for (z=0; z<num; z++) printf("%02X%c",p1[z],((z+1)%16)?' ':'\n'); } 483{ int z; for (z=0; z<num; z++) printf("%02X%c",p1[z],((z+1)%16)?' ':'\n'); }
360#endif 484#endif
361 485
486 /* enable vulnerability countermeasure for CBC ciphers with
487 * known-IV problem (http://www.openssl.org/~bodo/tls-cbc.txt) */
488 s->s3->need_empty_fragments = 1;
489#ifndef NO_RC4
490 if ((s->session->cipher != NULL) && ((s->session->cipher->algorithms & SSL_ENC_MASK) == SSL_RC4))
491 s->s3->need_empty_fragments = 0;
492#endif
493
362 return(1); 494 return(1);
363err: 495err:
364 SSLerr(SSL_F_TLS1_SETUP_KEY_BLOCK,ERR_R_MALLOC_FAILURE); 496 SSLerr(SSL_F_TLS1_SETUP_KEY_BLOCK,ERR_R_MALLOC_FAILURE);
365 return(0); 497 return(0);
366 } 498 }
367 499
368int tls1_enc(s,send) 500int tls1_enc(SSL *s, int send)
369SSL *s;
370int send;
371 { 501 {
372 SSL3_RECORD *rec; 502 SSL3_RECORD *rec;
373 EVP_CIPHER_CTX *ds; 503 EVP_CIPHER_CTX *ds;
374 unsigned long l; 504 unsigned long l;
375 int bs,i,ii,j,k,n=0; 505 int bs,i,ii,j,k,n=0;
376 EVP_CIPHER *enc; 506 const EVP_CIPHER *enc;
377 SSL_COMPRESSION *comp;
378 507
379 if (send) 508 if (send)
380 { 509 {
@@ -383,12 +512,9 @@ int send;
383 ds=s->enc_write_ctx; 512 ds=s->enc_write_ctx;
384 rec= &(s->s3->wrec); 513 rec= &(s->s3->wrec);
385 if (s->enc_write_ctx == NULL) 514 if (s->enc_write_ctx == NULL)
386 { enc=NULL; comp=NULL; } 515 enc=NULL;
387 else 516 else
388 {
389 enc=EVP_CIPHER_CTX_cipher(s->enc_write_ctx); 517 enc=EVP_CIPHER_CTX_cipher(s->enc_write_ctx);
390 comp=s->write_compression;
391 }
392 } 518 }
393 else 519 else
394 { 520 {
@@ -397,18 +523,19 @@ int send;
397 ds=s->enc_read_ctx; 523 ds=s->enc_read_ctx;
398 rec= &(s->s3->rrec); 524 rec= &(s->s3->rrec);
399 if (s->enc_read_ctx == NULL) 525 if (s->enc_read_ctx == NULL)
400 { enc=NULL; comp=NULL; } 526 enc=NULL;
401 else 527 else
402 {
403 enc=EVP_CIPHER_CTX_cipher(s->enc_read_ctx); 528 enc=EVP_CIPHER_CTX_cipher(s->enc_read_ctx);
404 comp=s->read_compression;
405 }
406 } 529 }
407 530
531#ifdef KSSL_DEBUG
532 printf("tls1_enc(%d)\n", send);
533#endif /* KSSL_DEBUG */
534
408 if ((s->session == NULL) || (ds == NULL) || 535 if ((s->session == NULL) || (ds == NULL) ||
409 ((enc == NULL) && (comp == NULL))) 536 (enc == NULL))
410 { 537 {
411 memcpy(rec->data,rec->input,rec->length); 538 memmove(rec->data,rec->input,rec->length);
412 rec->input=rec->data; 539 rec->input=rec->data;
413 } 540 }
414 else 541 else
@@ -435,11 +562,48 @@ int send;
435 rec->length+=i; 562 rec->length+=i;
436 } 563 }
437 564
565#ifdef KSSL_DEBUG
566 {
567 unsigned long ui;
568 printf("EVP_Cipher(ds=%p,rec->data=%p,rec->input=%p,l=%ld) ==>\n",
569 ds,rec->data,rec->input,l);
570 printf("\tEVP_CIPHER_CTX: %d buf_len, %d key_len [%d %d], %d iv_len\n",
571 ds->buf_len, ds->cipher->key_len,
572 DES_KEY_SZ, DES_SCHEDULE_SZ,
573 ds->cipher->iv_len);
574 printf("\t\tIV: ");
575 for (i=0; i<ds->cipher->iv_len; i++) printf("%02X", ds->iv[i]);
576 printf("\n");
577 printf("\trec->input=");
578 for (ui=0; ui<l; ui++) printf(" %02x", rec->input[ui]);
579 printf("\n");
580 }
581#endif /* KSSL_DEBUG */
582
583 if (!send)
584 {
585 if (l == 0 || l%bs != 0)
586 {
587 SSLerr(SSL_F_TLS1_ENC,SSL_R_BLOCK_CIPHER_PAD_IS_WRONG);
588 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECRYPTION_FAILED);
589 return 0;
590 }
591 }
592
438 EVP_Cipher(ds,rec->data,rec->input,l); 593 EVP_Cipher(ds,rec->data,rec->input,l);
439 594
595#ifdef KSSL_DEBUG
596 {
597 unsigned long i;
598 printf("\trec->data=");
599 for (i=0; i<l; i++)
600 printf(" %02x", rec->data[i]); printf("\n");
601 }
602#endif /* KSSL_DEBUG */
603
440 if ((bs != 1) && !send) 604 if ((bs != 1) && !send)
441 { 605 {
442 ii=i=rec->data[l-1]; 606 ii=i=rec->data[l-1]; /* padding_length */
443 i++; 607 i++;
444 if (s->options&SSL_OP_TLS_BLOCK_PADDING_BUG) 608 if (s->options&SSL_OP_TLS_BLOCK_PADDING_BUG)
445 { 609 {
@@ -450,19 +614,22 @@ int send;
450 if (s->s3->flags & TLS1_FLAGS_TLS_PADDING_BUG) 614 if (s->s3->flags & TLS1_FLAGS_TLS_PADDING_BUG)
451 i--; 615 i--;
452 } 616 }
617 /* TLS 1.0 does not bound the number of padding bytes by the block size.
618 * All of them must have value 'padding_length'. */
453 if (i > (int)rec->length) 619 if (i > (int)rec->length)
454 { 620 {
455 SSLerr(SSL_F_TLS1_ENC,SSL_R_BLOCK_CIPHER_PAD_IS_WRONG); 621 /* Incorrect padding. SSLerr() and ssl3_alert are done
456 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECRYPTION_FAILED); 622 * by caller: we don't want to reveal whether this is
457 return(0); 623 * a decryption error or a MAC verification failure
624 * (see http://www.openssl.org/~bodo/tls-cbc.txt) */
625 return -1;
458 } 626 }
459 for (j=(int)(l-i); j<(int)l; j++) 627 for (j=(int)(l-i); j<(int)l; j++)
460 { 628 {
461 if (rec->data[j] != ii) 629 if (rec->data[j] != ii)
462 { 630 {
463 SSLerr(SSL_F_TLS1_ENC,SSL_R_DECRYPTION_FAILED); 631 /* Incorrect padding */
464 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECRYPTION_FAILED); 632 return -1;
465 return(0);
466 } 633 }
467 } 634 }
468 rec->length-=i; 635 rec->length-=i;
@@ -471,25 +638,20 @@ int send;
471 return(1); 638 return(1);
472 } 639 }
473 640
474int tls1_cert_verify_mac(s,in_ctx,out) 641int tls1_cert_verify_mac(SSL *s, EVP_MD_CTX *in_ctx, unsigned char *out)
475SSL *s;
476EVP_MD_CTX *in_ctx;
477unsigned char *out;
478 { 642 {
479 unsigned int ret; 643 unsigned int ret;
480 EVP_MD_CTX ctx; 644 EVP_MD_CTX ctx;
481 645
482 memcpy(&ctx,in_ctx,sizeof(EVP_MD_CTX)); 646 EVP_MD_CTX_init(&ctx);
483 EVP_DigestFinal(&ctx,out,&ret); 647 EVP_MD_CTX_copy_ex(&ctx,in_ctx);
648 EVP_DigestFinal_ex(&ctx,out,&ret);
649 EVP_MD_CTX_cleanup(&ctx);
484 return((int)ret); 650 return((int)ret);
485 } 651 }
486 652
487int tls1_final_finish_mac(s,in1_ctx,in2_ctx,str,slen,out) 653int tls1_final_finish_mac(SSL *s, EVP_MD_CTX *in1_ctx, EVP_MD_CTX *in2_ctx,
488SSL *s; 654 const char *str, int slen, unsigned char *out)
489EVP_MD_CTX *in1_ctx,*in2_ctx;
490unsigned char *str;
491int slen;
492unsigned char *out;
493 { 655 {
494 unsigned int i; 656 unsigned int i;
495 EVP_MD_CTX ctx; 657 EVP_MD_CTX ctx;
@@ -500,29 +662,27 @@ unsigned char *out;
500 memcpy(q,str,slen); 662 memcpy(q,str,slen);
501 q+=slen; 663 q+=slen;
502 664
503 memcpy(&ctx,in1_ctx,sizeof(EVP_MD_CTX)); 665 EVP_MD_CTX_init(&ctx);
504 EVP_DigestFinal(&ctx,q,&i); 666 EVP_MD_CTX_copy_ex(&ctx,in1_ctx);
667 EVP_DigestFinal_ex(&ctx,q,&i);
505 q+=i; 668 q+=i;
506 memcpy(&ctx,in2_ctx,sizeof(EVP_MD_CTX)); 669 EVP_MD_CTX_copy_ex(&ctx,in2_ctx);
507 EVP_DigestFinal(&ctx,q,&i); 670 EVP_DigestFinal_ex(&ctx,q,&i);
508 q+=i; 671 q+=i;
509 672
510 tls1_PRF(s->ctx->md5,s->ctx->sha1,buf,q-buf, 673 tls1_PRF(s->ctx->md5,s->ctx->sha1,buf,(int)(q-buf),
511 s->session->master_key,s->session->master_key_length, 674 s->session->master_key,s->session->master_key_length,
512 out,buf2,12); 675 out,buf2,12);
513 memset(&ctx,0,sizeof(EVP_MD_CTX)); 676 EVP_MD_CTX_cleanup(&ctx);
514 677
515 return((int)12); 678 return((int)12);
516 } 679 }
517 680
518int tls1_mac(ssl,md,send) 681int tls1_mac(SSL *ssl, unsigned char *md, int send)
519SSL *ssl;
520unsigned char *md;
521int send;
522 { 682 {
523 SSL3_RECORD *rec; 683 SSL3_RECORD *rec;
524 unsigned char *mac_sec,*seq; 684 unsigned char *mac_sec,*seq;
525 EVP_MD *hash; 685 const EVP_MD *hash;
526 unsigned int md_size; 686 unsigned int md_size;
527 int i; 687 int i;
528 HMAC_CTX hmac; 688 HMAC_CTX hmac;
@@ -552,41 +712,47 @@ int send;
552 buf[4]=rec->length&0xff; 712 buf[4]=rec->length&0xff;
553 713
554 /* I should fix this up TLS TLS TLS TLS TLS XXXXXXXX */ 714 /* I should fix this up TLS TLS TLS TLS TLS XXXXXXXX */
555 HMAC_Init(&hmac,mac_sec,EVP_MD_size(hash),hash); 715 HMAC_CTX_init(&hmac);
716 HMAC_Init_ex(&hmac,mac_sec,EVP_MD_size(hash),hash,NULL);
556 HMAC_Update(&hmac,seq,8); 717 HMAC_Update(&hmac,seq,8);
557 HMAC_Update(&hmac,buf,5); 718 HMAC_Update(&hmac,buf,5);
558 HMAC_Update(&hmac,rec->input,rec->length); 719 HMAC_Update(&hmac,rec->input,rec->length);
559 HMAC_Final(&hmac,md,&md_size); 720 HMAC_Final(&hmac,md,&md_size);
721 HMAC_CTX_cleanup(&hmac);
560 722
561#ifdef TLS_DEBUG 723#ifdef TLS_DEBUG
562printf("sec="); 724printf("sec=");
563{int z; for (z=0; z<md_size; z++) printf("%02X ",mac_sec[z]); printf("\n"); } 725{unsigned int z; for (z=0; z<md_size; z++) printf("%02X ",mac_sec[z]); printf("\n"); }
564printf("seq="); 726printf("seq=");
565{int z; for (z=0; z<8; z++) printf("%02X ",seq[z]); printf("\n"); } 727{int z; for (z=0; z<8; z++) printf("%02X ",seq[z]); printf("\n"); }
566printf("buf="); 728printf("buf=");
567{int z; for (z=0; z<5; z++) printf("%02X ",buf[z]); printf("\n"); } 729{int z; for (z=0; z<5; z++) printf("%02X ",buf[z]); printf("\n"); }
568printf("rec="); 730printf("rec=");
569{int z; for (z=0; z<rec->length; z++) printf("%02X ",buf[z]); printf("\n"); } 731{unsigned int z; for (z=0; z<rec->length; z++) printf("%02X ",buf[z]); printf("\n"); }
570#endif 732#endif
571 733
572 for (i=7; i>=0; i--) 734 for (i=7; i>=0; i--)
573 if (++seq[i]) break; 735 {
736 ++seq[i];
737 if (seq[i] != 0) break;
738 }
574 739
575#ifdef TLS_DEBUG 740#ifdef TLS_DEBUG
576{int z; for (z=0; z<md_size; z++) printf("%02X ",md[z]); printf("\n"); } 741{unsigned int z; for (z=0; z<md_size; z++) printf("%02X ",md[z]); printf("\n"); }
577#endif 742#endif
578 return(md_size); 743 return(md_size);
579 } 744 }
580 745
581int tls1_generate_master_secret(s,out,p,len) 746int tls1_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p,
582SSL *s; 747 int len)
583unsigned char *out;
584unsigned char *p;
585int len;
586 { 748 {
587 unsigned char buf[SSL3_RANDOM_SIZE*2+TLS_MD_MASTER_SECRET_CONST_SIZE]; 749 unsigned char buf[SSL3_RANDOM_SIZE*2+TLS_MD_MASTER_SECRET_CONST_SIZE];
588 unsigned char buff[SSL_MAX_MASTER_KEY_LENGTH]; 750 unsigned char buff[SSL_MAX_MASTER_KEY_LENGTH];
589 751
752#ifdef KSSL_DEBUG
753 printf ("tls1_generate_master_secret(%p,%p, %p, %d)\n", s,out, p,len);
754#endif /* KSSL_DEBUG */
755
590 /* Setup the stuff to munge */ 756 /* Setup the stuff to munge */
591 memcpy(buf,TLS_MD_MASTER_SECRET_CONST, 757 memcpy(buf,TLS_MD_MASTER_SECRET_CONST,
592 TLS_MD_MASTER_SECRET_CONST_SIZE); 758 TLS_MD_MASTER_SECRET_CONST_SIZE);
@@ -597,11 +763,13 @@ int len;
597 tls1_PRF(s->ctx->md5,s->ctx->sha1, 763 tls1_PRF(s->ctx->md5,s->ctx->sha1,
598 buf,TLS_MD_MASTER_SECRET_CONST_SIZE+SSL3_RANDOM_SIZE*2,p,len, 764 buf,TLS_MD_MASTER_SECRET_CONST_SIZE+SSL3_RANDOM_SIZE*2,p,len,
599 s->session->master_key,buff,SSL3_MASTER_SECRET_SIZE); 765 s->session->master_key,buff,SSL3_MASTER_SECRET_SIZE);
766#ifdef KSSL_DEBUG
767 printf ("tls1_generate_master_secret() complete\n");
768#endif /* KSSL_DEBUG */
600 return(SSL3_MASTER_SECRET_SIZE); 769 return(SSL3_MASTER_SECRET_SIZE);
601 } 770 }
602 771
603int tls1_alert_code(code) 772int tls1_alert_code(int code)
604int code;
605 { 773 {
606 switch (code) 774 switch (code)
607 { 775 {
@@ -623,11 +791,11 @@ int code;
623 case SSL_AD_ACCESS_DENIED: return(TLS1_AD_ACCESS_DENIED); 791 case SSL_AD_ACCESS_DENIED: return(TLS1_AD_ACCESS_DENIED);
624 case SSL_AD_DECODE_ERROR: return(TLS1_AD_DECODE_ERROR); 792 case SSL_AD_DECODE_ERROR: return(TLS1_AD_DECODE_ERROR);
625 case SSL_AD_DECRYPT_ERROR: return(TLS1_AD_DECRYPT_ERROR); 793 case SSL_AD_DECRYPT_ERROR: return(TLS1_AD_DECRYPT_ERROR);
626 case SSL_AD_EXPORT_RESTRICION: return(TLS1_AD_EXPORT_RESTRICION); 794 case SSL_AD_EXPORT_RESTRICTION: return(TLS1_AD_EXPORT_RESTRICTION);
627 case SSL_AD_PROTOCOL_VERSION: return(TLS1_AD_PROTOCOL_VERSION); 795 case SSL_AD_PROTOCOL_VERSION: return(TLS1_AD_PROTOCOL_VERSION);
628 case SSL_AD_INSUFFICIENT_SECURITY:return(TLS1_AD_INSUFFICIENT_SECURITY); 796 case SSL_AD_INSUFFICIENT_SECURITY:return(TLS1_AD_INSUFFICIENT_SECURITY);
629 case SSL_AD_INTERNAL_ERROR: return(TLS1_AD_INTERNAL_ERROR); 797 case SSL_AD_INTERNAL_ERROR: return(TLS1_AD_INTERNAL_ERROR);
630 case SSL_AD_USER_CANCLED: return(TLS1_AD_USER_CANCLED); 798 case SSL_AD_USER_CANCELLED: return(TLS1_AD_USER_CANCELLED);
631 case SSL_AD_NO_RENEGOTIATION: return(TLS1_AD_NO_RENEGOTIATION); 799 case SSL_AD_NO_RENEGOTIATION: return(TLS1_AD_NO_RENEGOTIATION);
632 default: return(-1); 800 default: return(-1);
633 } 801 }
diff --git a/src/lib/libssl/t1_lib.c b/src/lib/libssl/t1_lib.c
index f9fbfa414c..ca6c03d5af 100644
--- a/src/lib/libssl/t1_lib.c
+++ b/src/lib/libssl/t1_lib.c
@@ -57,16 +57,12 @@
57 */ 57 */
58 58
59#include <stdio.h> 59#include <stdio.h>
60#include "objects.h" 60#include <openssl/objects.h>
61#include "ssl_locl.h" 61#include "ssl_locl.h"
62 62
63char *tls1_version_str="TLSv1 part of SSLeay 0.9.0b 29-Jun-1998"; 63const char *tls1_version_str="TLSv1" OPENSSL_VERSION_PTEXT;
64 64
65#ifndef NO_PROTO
66static long tls1_default_timeout(void); 65static long tls1_default_timeout(void);
67#else
68static long tls1_default_timeout();
69#endif
70 66
71static SSL3_ENC_METHOD TLSv1_enc_data={ 67static SSL3_ENC_METHOD TLSv1_enc_data={
72 tls1_enc, 68 tls1_enc,
@@ -94,6 +90,7 @@ static SSL_METHOD TLSv1_data= {
94 ssl3_write, 90 ssl3_write,
95 ssl3_shutdown, 91 ssl3_shutdown,
96 ssl3_renegotiate, 92 ssl3_renegotiate,
93 ssl3_renegotiate_check,
97 ssl3_ctrl, 94 ssl3_ctrl,
98 ssl3_ctx_ctrl, 95 ssl3_ctx_ctrl,
99 ssl3_get_cipher_by_char, 96 ssl3_get_cipher_by_char,
@@ -104,47 +101,48 @@ static SSL_METHOD TLSv1_data= {
104 ssl_bad_method, 101 ssl_bad_method,
105 tls1_default_timeout, 102 tls1_default_timeout,
106 &TLSv1_enc_data, 103 &TLSv1_enc_data,
104 ssl_undefined_function,
105 ssl3_callback_ctrl,
106 ssl3_ctx_callback_ctrl,
107 }; 107 };
108 108
109static long tls1_default_timeout() 109static long tls1_default_timeout(void)
110 { 110 {
111 /* 2 hours, the 24 hours mentioned in the TLSv1 spec 111 /* 2 hours, the 24 hours mentioned in the TLSv1 spec
112 * is way too long for http, the cache would over fill */ 112 * is way too long for http, the cache would over fill */
113 return(60*60*2); 113 return(60*60*2);
114 } 114 }
115 115
116SSL_METHOD *tlsv1_base_method() 116SSL_METHOD *tlsv1_base_method(void)
117 { 117 {
118 return(&TLSv1_data); 118 return(&TLSv1_data);
119 } 119 }
120 120
121int tls1_new(s) 121int tls1_new(SSL *s)
122SSL *s;
123 { 122 {
124 if (!ssl3_new(s)) return(0); 123 if (!ssl3_new(s)) return(0);
125 s->method->ssl_clear(s); 124 s->method->ssl_clear(s);
126 return(1); 125 return(1);
127 } 126 }
128 127
129void tls1_free(s) 128void tls1_free(SSL *s)
130SSL *s;
131 { 129 {
132 ssl3_free(s); 130 ssl3_free(s);
133 } 131 }
134 132
135void tls1_clear(s) 133void tls1_clear(SSL *s)
136SSL *s;
137 { 134 {
138 ssl3_clear(s); 135 ssl3_clear(s);
139 s->version=TLS1_VERSION; 136 s->version=TLS1_VERSION;
140 } 137 }
141 138
142#if 0 139#if 0
143long tls1_ctrl(s,cmd,larg,parg) 140long tls1_ctrl(SSL *s, int cmd, long larg, char *parg)
144SSL *s; 141 {
145int cmd; 142 return(0);
146long larg; 143 }
147char *parg; 144
145long tls1_callback_ctrl(SSL *s, int cmd, void *(*fp)())
148 { 146 {
149 return(0); 147 return(0);
150 } 148 }
diff --git a/src/lib/libssl/t1_meth.c b/src/lib/libssl/t1_meth.c
index 512c2078e7..9bb36a7d1c 100644
--- a/src/lib/libssl/t1_meth.c
+++ b/src/lib/libssl/t1_meth.c
@@ -57,11 +57,11 @@
57 */ 57 */
58 58
59#include <stdio.h> 59#include <stdio.h>
60#include "objects.h" 60#include <openssl/objects.h>
61#include "ssl_locl.h" 61#include "ssl_locl.h"
62 62
63static SSL_METHOD *tls1_get_method(ver) 63static SSL_METHOD *tls1_get_method(int ver);
64int ver; 64static SSL_METHOD *tls1_get_method(int ver)
65 { 65 {
66 if (ver == TLS1_VERSION) 66 if (ver == TLS1_VERSION)
67 return(TLSv1_method()); 67 return(TLSv1_method());
@@ -69,19 +69,19 @@ int ver;
69 return(NULL); 69 return(NULL);
70 } 70 }
71 71
72SSL_METHOD *TLSv1_method() 72SSL_METHOD *TLSv1_method(void)
73 { 73 {
74 static int init=1; 74 static int init=1;
75 static SSL_METHOD TLSv1_data; 75 static SSL_METHOD TLSv1_data;
76 76
77 if (init) 77 if (init)
78 { 78 {
79 init=0;
80 memcpy((char *)&TLSv1_data,(char *)tlsv1_base_method(), 79 memcpy((char *)&TLSv1_data,(char *)tlsv1_base_method(),
81 sizeof(SSL_METHOD)); 80 sizeof(SSL_METHOD));
82 TLSv1_data.ssl_connect=ssl3_connect; 81 TLSv1_data.ssl_connect=ssl3_connect;
83 TLSv1_data.ssl_accept=ssl3_accept; 82 TLSv1_data.ssl_accept=ssl3_accept;
84 TLSv1_data.get_ssl_method=tls1_get_method; 83 TLSv1_data.get_ssl_method=tls1_get_method;
84 init=0;
85 } 85 }
86 return(&TLSv1_data); 86 return(&TLSv1_data);
87 } 87 }
diff --git a/src/lib/libssl/t1_srvr.c b/src/lib/libssl/t1_srvr.c
index 8cf0addcd9..996b7ca8e2 100644
--- a/src/lib/libssl/t1_srvr.c
+++ b/src/lib/libssl/t1_srvr.c
@@ -57,15 +57,15 @@
57 */ 57 */
58 58
59#include <stdio.h> 59#include <stdio.h>
60#include "buffer.h" 60#include <openssl/buffer.h>
61#include "rand.h" 61#include <openssl/rand.h>
62#include "objects.h" 62#include <openssl/objects.h>
63#include "evp.h" 63#include <openssl/evp.h>
64#include "x509.h" 64#include <openssl/x509.h>
65#include "ssl_locl.h" 65#include "ssl_locl.h"
66 66
67static SSL_METHOD *tls1_get_server_method(ver) 67static SSL_METHOD *tls1_get_server_method(int ver);
68int ver; 68static SSL_METHOD *tls1_get_server_method(int ver)
69 { 69 {
70 if (ver == TLS1_VERSION) 70 if (ver == TLS1_VERSION)
71 return(TLSv1_server_method()); 71 return(TLSv1_server_method());
@@ -73,18 +73,18 @@ int ver;
73 return(NULL); 73 return(NULL);
74 } 74 }
75 75
76SSL_METHOD *TLSv1_server_method() 76SSL_METHOD *TLSv1_server_method(void)
77 { 77 {
78 static int init=1; 78 static int init=1;
79 static SSL_METHOD TLSv1_server_data; 79 static SSL_METHOD TLSv1_server_data;
80 80
81 if (init) 81 if (init)
82 { 82 {
83 init=0;
84 memcpy((char *)&TLSv1_server_data,(char *)tlsv1_base_method(), 83 memcpy((char *)&TLSv1_server_data,(char *)tlsv1_base_method(),
85 sizeof(SSL_METHOD)); 84 sizeof(SSL_METHOD));
86 TLSv1_server_data.ssl_accept=ssl3_accept; 85 TLSv1_server_data.ssl_accept=ssl3_accept;
87 TLSv1_server_data.get_ssl_method=tls1_get_server_method; 86 TLSv1_server_data.get_ssl_method=tls1_get_server_method;
87 init=0;
88 } 88 }
89 return(&TLSv1_server_data); 89 return(&TLSv1_server_data);
90 } 90 }
diff --git a/src/lib/libssl/test/methtest.c b/src/lib/libssl/test/methtest.c
index 630d29dc91..06ccb3b310 100644
--- a/src/lib/libssl/test/methtest.c
+++ b/src/lib/libssl/test/methtest.c
@@ -58,10 +58,10 @@
58 58
59#include <stdio.h> 59#include <stdio.h>
60#include <stdlib.h> 60#include <stdlib.h>
61#include "rsa.h" 61#include <openssl/rsa.h>
62#include "x509.h" 62#include <openssl/x509.h>
63#include "meth.h" 63#include "meth.h"
64#include "err.h" 64#include <openssl/err.h>
65 65
66int main(argc,argv) 66int main(argc,argv)
67int argc; 67int argc;
diff --git a/src/lib/libssl/test/tcrl b/src/lib/libssl/test/tcrl
index 859fba452f..acaf8f3c47 100644
--- a/src/lib/libssl/test/tcrl
+++ b/src/lib/libssl/test/tcrl
@@ -3,7 +3,7 @@
3PATH=../apps:$PATH 3PATH=../apps:$PATH
4export PATH 4export PATH
5 5
6cmd='../apps/ssleay crl' 6cmd='../apps/openssl crl'
7 7
8if [ "$1"x != "x" ]; then 8if [ "$1"x != "x" ]; then
9 t=$1 9 t=$1
diff --git a/src/lib/libssl/test/testca b/src/lib/libssl/test/testca
index a28402f9ca..88c186b6ab 100644
--- a/src/lib/libssl/test/testca
+++ b/src/lib/libssl/test/testca
@@ -23,7 +23,7 @@ if [ $? != 0 ]; then
23fi 23fi
24 24
25 25
26SSLEAY_CONFIG="-config ../apps/ssleay.cnf" 26SSLEAY_CONFIG="-config ../apps/openssl.cnf"
27export SSLEAY_CONFIG 27export SSLEAY_CONFIG
28$SH ../apps/CA.sh -sign <<EOF 28$SH ../apps/CA.sh -sign <<EOF
29y 29y
diff --git a/src/lib/libssl/test/testenc b/src/lib/libssl/test/testenc
index 42db56c2be..0656c7f525 100644
--- a/src/lib/libssl/test/testenc
+++ b/src/lib/libssl/test/testenc
@@ -2,7 +2,7 @@
2 2
3testsrc=Makefile.ssl 3testsrc=Makefile.ssl
4test=./p 4test=./p
5cmd=../apps/ssleay 5cmd=../apps/openssl
6 6
7cat $testsrc >$test; 7cat $testsrc >$test;
8 8
@@ -27,15 +27,7 @@ else
27 /bin/rm $test.cipher $test.clear 27 /bin/rm $test.cipher $test.clear
28fi 28fi
29 29
30for i in rc4 \ 30for i in `$cmd list-cipher-commands`
31 des-cfb des-ede-cfb des-ede3-cfb \
32 des-ofb des-ede-ofb des-ede3-ofb \
33 des-ecb des-ede des-ede3 desx \
34 des-cbc des-ede-cbc des-ede3-cbc \
35 idea-ecb idea-cfb idea-ofb idea-cbc \
36 rc2-ecb rc2-cfb rc2-ofb rc2-cbc \
37 bf-ecb bf-cfb bf-ofb bf-cbc rc4 \
38 cast5-ecb cast5-cfb cast5-ofb cast5-cbc
39do 31do
40 echo $i 32 echo $i
41 $cmd $i -bufsize 113 -e -k test < $test > $test.$i.cipher 33 $cmd $i -bufsize 113 -e -k test < $test > $test.$i.cipher
diff --git a/src/lib/libssl/test/testgen b/src/lib/libssl/test/testgen
index 12a4ca4cea..6a4b6b9221 100644
--- a/src/lib/libssl/test/testgen
+++ b/src/lib/libssl/test/testgen
@@ -11,17 +11,25 @@ export PATH
11 11
12echo "generating certificate request" 12echo "generating certificate request"
13 13
14echo "There should be a 2 sequences of .'s and some +'s." 14echo "string to make the random number generator think it has entropy" >> ./.rnd
15echo "There should not be more that at most 80 per line" 15
16if ../apps/openssl no-rsa; then
17 req_new='-newkey dsa:../apps/dsa512.pem'
18else
19 req_new='-new'
20 echo "There should be a 2 sequences of .'s and some +'s."
21 echo "There should not be more that at most 80 per line"
22fi
23
16echo "This could take some time." 24echo "This could take some time."
17 25
18../apps/ssleay req -config test.cnf -new -out testreq.pem 26../apps/openssl req -config test.cnf $req_new -out testreq.pem
19if [ $? != 0 ]; then 27if [ $? != 0 ]; then
20echo problems creating request 28echo problems creating request
21exit 1 29exit 1
22fi 30fi
23 31
24../apps/ssleay req -verify -in testreq.pem -noout 32../apps/openssl req -config test.cnf -verify -in testreq.pem -noout
25if [ $? != 0 ]; then 33if [ $? != 0 ]; then
26echo signature on req is wrong 34echo signature on req is wrong
27exit 1 35exit 1
diff --git a/src/lib/libssl/test/testp7.pem b/src/lib/libssl/test/testp7.pem
index b3b6dba830..e5b7866c31 100644
--- a/src/lib/libssl/test/testp7.pem
+++ b/src/lib/libssl/test/testp7.pem
@@ -1,46 +1,46 @@
1-----BEGIN PKCS7----- 1-----BEGIN PKCS7-----
2MIAGCSqGSIb3DQEHAqCAMIIIBwIBATEAMIAGCSqGSIb3DQEHAQAAoIIGPDCCBHIw 2MIIIGAYJKoZIhvcNAQcCoIIICTCCCAUCAQExADALBgkqhkiG9w0BBwGgggY8MIIE
3ggQcoAMCAQICEHkvjiX1iVGQMenF9HgIjI8wDQYJKoZIhvcNAQEEBQAwYjERMA8G 3cjCCBBygAwIBAgIQeS+OJfWJUZAx6cX0eAiMjzANBgkqhkiG9w0BAQQFADBiMREw
4A1UEBxMISW50ZXJuZXQxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTQwMgYDVQQL 4DwYDVQQHEwhJbnRlcm5ldDEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNDAyBgNV
5EytWZXJpU2lnbiBDbGFzcyAxIENBIC0gSW5kaXZpZHVhbCBTdWJzY3JpYmVyMB4X 5BAsTK1ZlcmlTaWduIENsYXNzIDEgQ0EgLSBJbmRpdmlkdWFsIFN1YnNjcmliZXIw
6DTk2MDcxOTAwMDAwMFoXDTk3MDMzMDIzNTk1OVowgdUxETAPBgNVBAcTCEludGVy 6HhcNOTYwNzE5MDAwMDAwWhcNOTcwMzMwMjM1OTU5WjCB1TERMA8GA1UEBxMISW50
7bmV0MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE0MDIGA1UECxMrVmVyaVNpZ24g
8Q2xhc3MgMSBDQSAtIEluZGl2aWR1YWwgU3Vic2NyaWJlcjEoMCYGA1UECxMfRGln
9aXRhbCBJRCBDbGFzcyAxIC0gU01JTUUgVGVzdDFHMEUGA1UECxM+d3d3LnZlcmlz
10aWduLmNvbS9yZXBvc2l0b3J5L0NQUy0xLjAgSW5jLiBieSBSZWYuLExJQUIuTFRE
11KGMpOTYwWzANBgkqhkiG9w0BAQEFAANKADBHAkAOy7xxCAIkOfuIA2LyRpxgKlDO
12Rl8htdXYhF5iBGUx1GYaK6KF+bK/CCI0l4j2OfWGFBUrwGoWqxTNcWgTfMzRAgMB
13AAGjggI5MIICNTAJBgNVHRMEAjAAMIICJgYDVR0DBIICHTCCAhkwggIVMIICEQYL
14YIZIAYb4RQEHAQEwggIAFoIBq1RoaXMgY2VydGlmaWNhdGUgaW5jb3Jwb3JhdGVz
15IGJ5IHJlZmVyZW5jZSwgYW5kIGl0cyB1c2UgaXMgc3RyaWN0bHkgc3ViamVjdCB0
16bywgdGhlIFZlcmlTaWduIENlcnRpZmljYXRpb24gUHJhY3RpY2UgU3RhdGVtZW50
17IChDUFMpLCBhdmFpbGFibGUgYXQ6IGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9D
18UFMtMS4wOyBieSBFLW1haWwgYXQgQ1BTLXJlcXVlc3RzQHZlcmlzaWduLmNvbTsg
19b3IgYnkgbWFpbCBhdCBWZXJpU2lnbiwgSW5jLiwgMjU5MyBDb2FzdCBBdmUuLCBN
20b3VudGFpbiBWaWV3LCBDQSA5NDA0MyBVU0EgVGVsLiArMSAoNDE1KSA5NjEtODgz
21MCBDb3B5cmlnaHQgKGMpIDE5OTYgVmVyaVNpZ24sIEluYy4gIEFsbCBSaWdodHMg
22UmVzZXJ2ZWQuIENFUlRBSU4gV0FSUkFOVElFUyBESVNDTEFJTUVEIGFuZCBMSUFC
23SUxJVFkgTElNSVRFRC6gDgYMYIZIAYb4RQEHAQEBoQ4GDGCGSAGG+EUBBwEBAjAv
24MC0WK2h0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9yZXBvc2l0b3J5L0NQUy0xLgMw
25DQYJKoZIhvcNAQEEBQADQQDAmA7km/3iJWEsWN9Z2WU2gmZAknx45WnDKHxMa3Bf
26gNsh6BLk/ngkJKjNKTDR13XVHqEPUY1flbjATZputw1GMIIBwjCCAWygAwIBAgIQ
27fAmE6tW5ERSQWDneu3KfSTANBgkqhkiG9w0BAQIFADA+MQswCQYDVQQGEwJVUzEX
28MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xFjAUBgNVBAsTDVRFU1QgUm9vdCBQQ0Ew
29HhcNOTYwNzE3MDAwMDAwWhcNOTcwNzE3MjM1OTU5WjBiMREwDwYDVQQHEwhJbnRl
30cm5ldDEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNDAyBgNVBAsTK1ZlcmlTaWdu
31IENsYXNzIDEgQ0EgLSBJbmRpdmlkdWFsIFN1YnNjcmliZXIwXDANBgkqhkiG9w0B
32AQEFAANLADBIAkEA7Fc6zYJw4WwCWa1ni3fYNbzGSQNluuw990024GusjLfhEk1h
33MsIUukTT/n8yxoO7rYp4x+LS+tHF2tBtuxg7CwIDAQABoyIwIDALBgNVHQ8EBAMC
34AQYwEQYJYIZIAYb4QgEBBAQDAgIEMA0GCSqGSIb3DQEBAgUAA0EAFKem0cJGg9nd
35TAbP5o1HIEyNn11ZlvLU5v1Hejs1MKQt72IMm4jjgOH+pjguXW8lB6yzrK4oVOO2
36UNCaNQ1H26GCAa0wgeYwgZEwDQYJKoZIhvcNAQECBQAwYjERMA8GA1UEBxMISW50
37ZXJuZXQxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTQwMgYDVQQLEytWZXJpU2ln 7ZXJuZXQxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTQwMgYDVQQLEytWZXJpU2ln
38biBDbGFzcyAxIENBIC0gSW5kaXZpZHVhbCBTdWJzY3JpYmVyFw05NjA3MTcxNzU5 8biBDbGFzcyAxIENBIC0gSW5kaXZpZHVhbCBTdWJzY3JpYmVyMSgwJgYDVQQLEx9E
39MjlaFw05NzA3MTgwMDAwMDBaMA0GCSqGSIb3DQEBAgUAA0EAubVWYTsWsQmste9f 9aWdpdGFsIElEIENsYXNzIDEgLSBTTUlNRSBUZXN0MUcwRQYDVQQLEz53d3cudmVy
40+UgMw8BkjDlM25fwQLrCfmmnLxjewey10kSROypUaJLb+r4oRALc0fG9XfZsaiiI 10aXNpZ24uY29tL3JlcG9zaXRvcnkvQ1BTLTEuMCBJbmMuIGJ5IFJlZi4sTElBQi5M
41gotQHjCBwTBtMA0GCSqGSIb3DQEBAgUAMD4xCzAJBgNVBAYTAlVTMRcwFQYDVQQK 11VEQoYyk5NjBbMA0GCSqGSIb3DQEBAQUAA0oAMEcCQA7LvHEIAiQ5+4gDYvJGnGAq
42Ew5WZXJpU2lnbiwgSW5jLjEWMBQGA1UECxMNVEVTVCBSb290IFBDQRcNOTYwNzE3 12UM5GXyG11diEXmIEZTHUZhorooX5sr8IIjSXiPY59YYUFSvAaharFM1xaBN8zNEC
43MTc0NDA5WhcNOTgwNzE3MDAwMDAwWjANBgkqhkiG9w0BAQIFAANBAHitA0/xAukC 13AwEAAaOCAjkwggI1MAkGA1UdEwQCMAAwggImBgNVHQMEggIdMIICGTCCAhUwggIR
44jHzeh1AMT/l2oC68N+yFb+aJPHBBMxc6gG2MaKjBNwb5hcXUllMlExONA3ju10f7 14BgtghkgBhvhFAQcBATCCAgAWggGrVGhpcyBjZXJ0aWZpY2F0ZSBpbmNvcnBvcmF0
45owIq3s3wx10xAAAAAAA= 15ZXMgYnkgcmVmZXJlbmNlLCBhbmQgaXRzIHVzZSBpcyBzdHJpY3RseSBzdWJqZWN0
16IHRvLCB0aGUgVmVyaVNpZ24gQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1l
17bnQgKENQUyksIGF2YWlsYWJsZSBhdDogaHR0cHM6Ly93d3cudmVyaXNpZ24uY29t
18L0NQUy0xLjA7IGJ5IEUtbWFpbCBhdCBDUFMtcmVxdWVzdHNAdmVyaXNpZ24uY29t
19OyBvciBieSBtYWlsIGF0IFZlcmlTaWduLCBJbmMuLCAyNTkzIENvYXN0IEF2ZS4s
20IE1vdW50YWluIFZpZXcsIENBIDk0MDQzIFVTQSBUZWwuICsxICg0MTUpIDk2MS04
21ODMwIENvcHlyaWdodCAoYykgMTk5NiBWZXJpU2lnbiwgSW5jLiAgQWxsIFJpZ2h0
22cyBSZXNlcnZlZC4gQ0VSVEFJTiBXQVJSQU5USUVTIERJU0NMQUlNRUQgYW5kIExJ
23QUJJTElUWSBMSU1JVEVELqAOBgxghkgBhvhFAQcBAQGhDgYMYIZIAYb4RQEHAQEC
24MC8wLRYraHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JlcG9zaXRvcnkvQ1BTLTEu
25AzANBgkqhkiG9w0BAQQFAANBAMCYDuSb/eIlYSxY31nZZTaCZkCSfHjlacMofExr
26cF+A2yHoEuT+eCQkqM0pMNHXddUeoQ9RjV+VuMBNmm63DUYwggHCMIIBbKADAgEC
27AhB8CYTq1bkRFJBYOd67cp9JMA0GCSqGSIb3DQEBAgUAMD4xCzAJBgNVBAYTAlVT
28MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEWMBQGA1UECxMNVEVTVCBSb290IFBD
29QTAeFw05NjA3MTcwMDAwMDBaFw05NzA3MTcyMzU5NTlaMGIxETAPBgNVBAcTCElu
30dGVybmV0MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE0MDIGA1UECxMrVmVyaVNp
31Z24gQ2xhc3MgMSBDQSAtIEluZGl2aWR1YWwgU3Vic2NyaWJlcjBcMA0GCSqGSIb3
32DQEBAQUAA0sAMEgCQQDsVzrNgnDhbAJZrWeLd9g1vMZJA2W67D33TTbga6yMt+ES
33TWEywhS6RNP+fzLGg7utinjH4tL60cXa0G27GDsLAgMBAAGjIjAgMAsGA1UdDwQE
34AwIBBjARBglghkgBhvhCAQEEBAMCAgQwDQYJKoZIhvcNAQECBQADQQAUp6bRwkaD
352d1MBs/mjUcgTI2fXVmW8tTm/Ud6OzUwpC3vYgybiOOA4f6mOC5dbyUHrLOsrihU
3647ZQ0Jo1DUfboYIBrTCBwTBtMA0GCSqGSIb3DQEBAgUAMD4xCzAJBgNVBAYTAlVT
37MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEWMBQGA1UECxMNVEVTVCBSb290IFBD
38QRcNOTYwNzE3MTc0NDA5WhcNOTgwNzE3MDAwMDAwWjANBgkqhkiG9w0BAQIFAANB
39AHitA0/xAukCjHzeh1AMT/l2oC68N+yFb+aJPHBBMxc6gG2MaKjBNwb5hcXUllMl
40ExONA3ju10f7owIq3s3wx10wgeYwgZEwDQYJKoZIhvcNAQECBQAwYjERMA8GA1UE
41BxMISW50ZXJuZXQxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTQwMgYDVQQLEytW
42ZXJpU2lnbiBDbGFzcyAxIENBIC0gSW5kaXZpZHVhbCBTdWJzY3JpYmVyFw05NjA3
43MTcxNzU5MjlaFw05NzA3MTgwMDAwMDBaMA0GCSqGSIb3DQEBAgUAA0EAubVWYTsW
44sQmste9f+UgMw8BkjDlM25fwQLrCfmmnLxjewey10kSROypUaJLb+r4oRALc0fG9
45XfZsaiiIgotQHjEA
46-----END PKCS7----- 46-----END PKCS7-----
diff --git a/src/lib/libssl/test/testsid.pem b/src/lib/libssl/test/testsid.pem
index cd8617be2e..7ffd008f66 100644
--- a/src/lib/libssl/test/testsid.pem
+++ b/src/lib/libssl/test/testsid.pem
@@ -1,5 +1,5 @@
1-----BEGIN SSL SESSION PARAMETERS----- 1-----BEGIN SSL SESSION PARAMETERS-----
2MIIBxwIBAQIBAgQDAQCABBCi11xa5qkOP8xrr02K/NQCBBBkIYQZM0Bt95W0EHNV 2MIIB1gIBAQIBAgQDAQCABBCi11xa5qkOP8xrr02K/NQCBBBkIYQZM0Bt95W0EHNV
3bA58oQYCBDIBr7WiBAICASyjggGGMIIBgjCCASwCAQMwDQYJKoZIhvcNAQEEBQAw 3bA58oQYCBDIBr7WiBAICASyjggGGMIIBgjCCASwCAQMwDQYJKoZIhvcNAQEEBQAw
4ODELMAkGA1UEBhMCQVUxDDAKBgNVBAgTA1FMRDEbMBkGA1UEAxMSU1NMZWF5L3Jz 4ODELMAkGA1UEBhMCQVUxDDAKBgNVBAgTA1FMRDEbMBkGA1UEAxMSU1NMZWF5L3Jz
5YSB0ZXN0IENBMB4XDTk1MTAwOTIzMzEzNFoXDTk4MDcwNTIzMzEzNFowYDELMAkG 5YSB0ZXN0IENBMB4XDTk1MTAwOTIzMzEzNFoXDTk4MDcwNTIzMzEzNFowYDELMAkG
@@ -8,5 +8,5 @@ LjELMAkGA1UECxMCQ1MxGzAZBgNVBAMTElNTTGVheSBkZW1vIGNsaWVudDBcMA0G
8CSqGSIb3DQEBAQUAA0sAMEgCQQC4pcXEL1lgVA+B5Q3TcuW/O3LZHoA73IYm8oFD 8CSqGSIb3DQEBAQUAA0sAMEgCQQC4pcXEL1lgVA+B5Q3TcuW/O3LZHoA73IYm8oFD
9TezgCDhL2RTMn+seKWF36UtJKRIOBU9jZHCVVd0Me5ls6BEjAgMBAAEwDQYJKoZI 9TezgCDhL2RTMn+seKWF36UtJKRIOBU9jZHCVVd0Me5ls6BEjAgMBAAEwDQYJKoZI
10hvcNAQEEBQADQQBoIpOcwUY1qlVF7j3ROSGvUsbvByOBFmYWkIBgsCqR+9qo1A7L 10hvcNAQEEBQADQQBoIpOcwUY1qlVF7j3ROSGvUsbvByOBFmYWkIBgsCqR+9qo1A7L
11CrWF5i8LWt/vLwAHaxWNx2YuBJMFyuK81fTv 11CrWF5i8LWt/vLwAHaxWNx2YuBJMFyuK81fTvpA0EC3Rlc3Rjb250ZXh0
12-----END SSL SESSION PARAMETERS----- 12-----END SSL SESSION PARAMETERS-----
diff --git a/src/lib/libssl/test/testss b/src/lib/libssl/test/testss
index a5aecf4694..8d3557f356 100644
--- a/src/lib/libssl/test/testss
+++ b/src/lib/libssl/test/testss
@@ -1,9 +1,10 @@
1#!/bin/sh 1#!/bin/sh
2 2
3digest='-mdc2' 3digest='-md5'
4reqcmd="../apps/ssleay req" 4reqcmd="../apps/openssl req"
5x509cmd="../apps/ssleay x509 $digest" 5x509cmd="../apps/openssl x509 $digest"
6verifycmd="../apps/ssleay verify" 6verifycmd="../apps/openssl verify"
7dummycnf="../apps/openssl.cnf"
7 8
8CAkey="keyCA.ss" 9CAkey="keyCA.ss"
9CAcert="certCA.ss" 10CAcert="certCA.ss"
@@ -18,7 +19,16 @@ Ucert="certU.ss"
18 19
19echo 20echo
20echo "make a certificate request using 'req'" 21echo "make a certificate request using 'req'"
21$reqcmd -config $CAconf -out $CAreq -keyout $CAkey -new #>err.ss 22
23echo "string to make the random number generator think it has entropy" >> ./.rnd
24
25if ../apps/openssl no-rsa; then
26 req_new='-newkey dsa:../apps/dsa512.pem'
27else
28 req_new='-new'
29fi
30
31$reqcmd -config $CAconf -out $CAreq -keyout $CAkey $req_new #>err.ss
22if [ $? != 0 ]; then 32if [ $? != 0 ]; then
23 echo "error using 'req' to generate a certificate request" 33 echo "error using 'req' to generate a certificate request"
24 exit 1 34 exit 1
@@ -39,13 +49,13 @@ if [ $? != 0 ]; then
39 exit 1 49 exit 1
40fi 50fi
41 51
42$reqcmd -verify -in $CAreq -noout 52$reqcmd -config $dummycnf -verify -in $CAreq -noout
43if [ $? != 0 ]; then 53if [ $? != 0 ]; then
44 echo first generated request is invalid 54 echo first generated request is invalid
45 exit 1 55 exit 1
46fi 56fi
47 57
48$reqcmd -verify -in $CAreq2 -noout 58$reqcmd -config $dummycnf -verify -in $CAreq2 -noout
49if [ $? != 0 ]; then 59if [ $? != 0 ]; then
50 echo second generated request is invalid 60 echo second generated request is invalid
51 exit 1 61 exit 1
@@ -59,7 +69,7 @@ fi
59 69
60echo 70echo
61echo "make another certificate request using 'req'" 71echo "make another certificate request using 'req'"
62$reqcmd -config $Uconf -out $Ureq -keyout $Ukey -new >err.ss 72$reqcmd -config $Uconf -out $Ureq -keyout $Ukey $req_new >err.ss
63if [ $? != 0 ]; then 73if [ $? != 0 ]; then
64 echo "error using 'req' to generate a certificate request" 74 echo "error using 'req' to generate a certificate request"
65 exit 1 75 exit 1
diff --git a/src/lib/libssl/test/testssl b/src/lib/libssl/test/testssl
index f115adb8e1..ba5e41c861 100644
--- a/src/lib/libssl/test/testssl
+++ b/src/lib/libssl/test/testssl
@@ -1,40 +1,137 @@
1#!/bin/sh 1#!/bin/sh
2 2
3if [ "$1" = "" ]; then
4 key=../apps/server.pem
5else
6 key="$1"
7fi
8if [ "$2" = "" ]; then
9 cert=../apps/server.pem
10else
11 cert="$2"
12fi
13ssltest="./ssltest -key $key -cert $cert -c_key $key -c_cert $cert"
14
15if ../apps/openssl x509 -in $cert -text -noout | fgrep 'DSA Public Key' >/dev/null; then
16 dsa_cert=YES
17else
18 dsa_cert=NO
19fi
20
21if [ "$3" = "" ]; then
22 CA="-CApath ../certs"
23else
24 CA="-CAfile $3"
25fi
26
27if [ "$4" = "" ]; then
28 extra=""
29else
30 extra="$4"
31fi
32
33#############################################################################
34
3echo test sslv2 35echo test sslv2
4./ssltest -ssl2 || exit 1 36$ssltest -ssl2 $extra || exit 1
5 37
6echo test sslv2 with server authentication 38echo test sslv2 with server authentication
7./ssltest -ssl2 -server_auth -CApath ../certs || exit 1 39$ssltest -ssl2 -server_auth $CA $extra || exit 1
8 40
9echo test sslv2 with client authentication 41if [ $dsa_cert = NO ]; then
10./ssltest -ssl2 -client_auth -CApath ../certs || exit 1 42 echo test sslv2 with client authentication
43 $ssltest -ssl2 -client_auth $CA $extra || exit 1
11 44
12echo test sslv2 with both client and server authentication 45 echo test sslv2 with both client and server authentication
13./ssltest -ssl2 -server_auth -client_auth -CApath ../certs || exit 1 46 $ssltest -ssl2 -server_auth -client_auth $CA $extra || exit 1
47fi
14 48
15echo test sslv3 49echo test sslv3
16./ssltest -ssl3 || exit 1 50$ssltest -ssl3 $extra || exit 1
17 51
18echo test sslv3 with server authentication 52echo test sslv3 with server authentication
19./ssltest -ssl3 -server_auth -CApath ../certs || exit 1 53$ssltest -ssl3 -server_auth $CA $extra || exit 1
20 54
21echo test sslv3 with client authentication 55echo test sslv3 with client authentication
22./ssltest -ssl3 -client_auth -CApath ../certs || exit 1 56$ssltest -ssl3 -client_auth $CA $extra || exit 1
23 57
24echo test sslv3 with both client and server authentication 58echo test sslv3 with both client and server authentication
25./ssltest -ssl3 -server_auth -client_auth -CApath ../certs || exit 1 59$ssltest -ssl3 -server_auth -client_auth $CA $extra || exit 1
26 60
27echo test sslv2/sslv3 61echo test sslv2/sslv3
28./ssltest || exit 1 62$ssltest $extra || exit 1
29 63
30echo test sslv2/sslv3 with server authentication 64echo test sslv2/sslv3 with server authentication
31./ssltest -server_auth -CApath ../certs || exit 1 65$ssltest -server_auth $CA $extra || exit 1
32 66
33echo test sslv2/sslv3 with client authentication 67echo test sslv2/sslv3 with client authentication
34./ssltest -client_auth -CApath ../certs || exit 1 68$ssltest -client_auth $CA $extra || exit 1
35 69
36echo test sslv2/sslv3 with both client and server authentication 70echo test sslv2/sslv3 with both client and server authentication
37./ssltest -server_auth -client_auth -CApath ../certs || exit 1 71$ssltest -server_auth -client_auth $CA $extra || exit 1
38 72
39exit 0 73echo test sslv2 via BIO pair
74$ssltest -bio_pair -ssl2 $extra || exit 1
75
76echo test sslv2 with server authentication via BIO pair
77$ssltest -bio_pair -ssl2 -server_auth $CA $extra || exit 1
78
79if [ $dsa_cert = NO ]; then
80 echo test sslv2 with client authentication via BIO pair
81 $ssltest -bio_pair -ssl2 -client_auth $CA $extra || exit 1
82
83 echo test sslv2 with both client and server authentication via BIO pair
84 $ssltest -bio_pair -ssl2 -server_auth -client_auth $CA $extra || exit 1
85fi
86
87echo test sslv3 via BIO pair
88$ssltest -bio_pair -ssl3 $extra || exit 1
89
90echo test sslv3 with server authentication via BIO pair
91$ssltest -bio_pair -ssl3 -server_auth $CA $extra || exit 1
92
93echo test sslv3 with client authentication via BIO pair
94$ssltest -bio_pair -ssl3 -client_auth $CA $extra || exit 1
95
96echo test sslv3 with both client and server authentication via BIO pair
97$ssltest -bio_pair -ssl3 -server_auth -client_auth $CA $extra || exit 1
40 98
99echo test sslv2/sslv3 via BIO pair
100$ssltest $extra || exit 1
101
102if [ $dsa_cert = NO ]; then
103 echo test sslv2/sslv3 w/o DHE via BIO pair
104 $ssltest -bio_pair -no_dhe $extra || exit 1
105fi
106
107echo test sslv2/sslv3 with 1024bit DHE via BIO pair
108$ssltest -bio_pair -dhe1024dsa -v $extra || exit 1
109
110echo test sslv2/sslv3 with server authentication
111$ssltest -bio_pair -server_auth $CA $extra || exit 1
112
113echo test sslv2/sslv3 with client authentication via BIO pair
114$ssltest -bio_pair -client_auth $CA $extra || exit 1
115
116echo test sslv2/sslv3 with both client and server authentication via BIO pair
117$ssltest -bio_pair -server_auth -client_auth $CA $extra || exit 1
118
119echo test sslv2/sslv3 with both client and server authentication via BIO pair and app verify
120$ssltest -bio_pair -server_auth -client_auth -app_verify $CA $extra || exit 1
121
122#############################################################################
123
124echo test tls1 with 1024bit anonymous DH, multiple handshakes
125$ssltest -v -bio_pair -tls1 -cipher ADH -dhe1024dsa -num 10 -f -time $extra || exit 1
126
127if ../apps/openssl no-rsa; then
128 echo skipping RSA tests
129else
130 echo test tls1 with 1024bit RSA, no DHE, multiple handshakes
131 ./ssltest -v -bio_pair -tls1 -cert ../apps/server2.pem -no_dhe -num 10 -f -time $extra || exit 1
132
133 echo test tls1 with 1024bit RSA, 1024bit DHE, multiple handshakes
134 ./ssltest -v -bio_pair -tls1 -cert ../apps/server2.pem -dhe1024dsa -num 10 -f -time $extra || exit 1
135fi
136
137exit 0
diff --git a/src/lib/libssl/test/tpkcs7 b/src/lib/libssl/test/tpkcs7
index ea1f005dac..15bbba42c0 100644
--- a/src/lib/libssl/test/tpkcs7
+++ b/src/lib/libssl/test/tpkcs7
@@ -3,7 +3,7 @@
3PATH=../apps:$PATH 3PATH=../apps:$PATH
4export PATH 4export PATH
5 5
6cmd='../apps/ssleay pkcs7' 6cmd='../apps/openssl pkcs7'
7 7
8if [ "$1"x != "x" ]; then 8if [ "$1"x != "x" ]; then
9 t=$1 9 t=$1
diff --git a/src/lib/libssl/test/tpkcs7d b/src/lib/libssl/test/tpkcs7d
index c8f18fb09c..46e5aa2bd6 100644
--- a/src/lib/libssl/test/tpkcs7d
+++ b/src/lib/libssl/test/tpkcs7d
@@ -3,7 +3,7 @@
3PATH=../apps:$PATH 3PATH=../apps:$PATH
4export PATH 4export PATH
5 5
6cmd='../apps/ssleay pkcs7' 6cmd='../apps/openssl pkcs7'
7 7
8if [ "$1"x != "x" ]; then 8if [ "$1"x != "x" ]; then
9 t=$1 9 t=$1
@@ -11,7 +11,7 @@ else
11 t=pkcs7-1.pem 11 t=pkcs7-1.pem
12fi 12fi
13 13
14echo testing pkcs7 conversions 14echo "testing pkcs7 conversions (2)"
15cp $t fff.p 15cp $t fff.p
16 16
17echo "p -> d" 17echo "p -> d"
diff --git a/src/lib/libssl/test/treq b/src/lib/libssl/test/treq
index e5f1d8cc41..9f5eb7eea5 100644
--- a/src/lib/libssl/test/treq
+++ b/src/lib/libssl/test/treq
@@ -3,7 +3,7 @@
3PATH=../apps:$PATH 3PATH=../apps:$PATH
4export PATH 4export PATH
5 5
6cmd='../apps/ssleay req' 6cmd='../apps/openssl req -config ../apps/openssl.cnf'
7 7
8if [ "$1"x != "x" ]; then 8if [ "$1"x != "x" ]; then
9 t=$1 9 t=$1
@@ -11,6 +11,11 @@ else
11 t=testreq.pem 11 t=testreq.pem
12fi 12fi
13 13
14if $cmd -in $t -inform p -noout -text | fgrep 'Unknown Public Key'; then
15 echo "skipping req conversion test for $t"
16 exit 0
17fi
18
14echo testing req conversions 19echo testing req conversions
15cp $t fff.p 20cp $t fff.p
16 21
diff --git a/src/lib/libssl/test/trsa b/src/lib/libssl/test/trsa
index e5b8fe0448..bd6c07650a 100644
--- a/src/lib/libssl/test/trsa
+++ b/src/lib/libssl/test/trsa
@@ -3,7 +3,12 @@
3PATH=../apps:$PATH 3PATH=../apps:$PATH
4export PATH 4export PATH
5 5
6cmd='../apps/ssleay rsa' 6if ../apps/openssl no-rsa; then
7 echo skipping rsa conversion test
8 exit 0
9fi
10
11cmd='../apps/openssl rsa'
7 12
8if [ "$1"x != "x" ]; then 13if [ "$1"x != "x" ]; then
9 t=$1 14 t=$1
diff --git a/src/lib/libssl/test/tsid b/src/lib/libssl/test/tsid
index 8c7e9b1387..9e0854516c 100644
--- a/src/lib/libssl/test/tsid
+++ b/src/lib/libssl/test/tsid
@@ -3,7 +3,7 @@
3PATH=../apps:$PATH 3PATH=../apps:$PATH
4export PATH 4export PATH
5 5
6cmd='../apps/ssleay sess_id' 6cmd='../apps/openssl sess_id'
7 7
8if [ "$1"x != "x" ]; then 8if [ "$1"x != "x" ]; then
9 t=$1 9 t=$1
diff --git a/src/lib/libssl/test/tx509 b/src/lib/libssl/test/tx509
index f8d1f82cdd..35169f3a43 100644
--- a/src/lib/libssl/test/tx509
+++ b/src/lib/libssl/test/tx509
@@ -3,7 +3,7 @@
3PATH=../apps:$PATH 3PATH=../apps:$PATH
4export PATH 4export PATH
5 5
6cmd='../apps/ssleay x509' 6cmd='../apps/openssl x509'
7 7
8if [ "$1"x != "x" ]; then 8if [ "$1"x != "x" ]; then
9 t=$1 9 t=$1
diff --git a/src/lib/libssl/tls1.h b/src/lib/libssl/tls1.h
index 60978613ef..88ec5fb527 100644
--- a/src/lib/libssl/tls1.h
+++ b/src/lib/libssl/tls1.h
@@ -59,12 +59,14 @@
59#ifndef HEADER_TLS1_H 59#ifndef HEADER_TLS1_H
60#define HEADER_TLS1_H 60#define HEADER_TLS1_H
61 61
62#include "buffer.h" 62#include <openssl/buffer.h>
63 63
64#ifdef __cplusplus 64#ifdef __cplusplus
65extern "C" { 65extern "C" {
66#endif 66#endif
67 67
68#define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES 1
69
68#define TLS1_VERSION 0x0301 70#define TLS1_VERSION 0x0301
69#define TLS1_VERSION_MAJOR 0x03 71#define TLS1_VERSION_MAJOR 0x03
70#define TLS1_VERSION_MINOR 0x01 72#define TLS1_VERSION_MINOR 0x01
@@ -75,13 +77,71 @@ extern "C" {
75#define TLS1_AD_ACCESS_DENIED 49 /* fatal */ 77#define TLS1_AD_ACCESS_DENIED 49 /* fatal */
76#define TLS1_AD_DECODE_ERROR 50 /* fatal */ 78#define TLS1_AD_DECODE_ERROR 50 /* fatal */
77#define TLS1_AD_DECRYPT_ERROR 51 79#define TLS1_AD_DECRYPT_ERROR 51
78#define TLS1_AD_EXPORT_RESTRICION 60 /* fatal */ 80#define TLS1_AD_EXPORT_RESTRICTION 60 /* fatal */
79#define TLS1_AD_PROTOCOL_VERSION 70 /* fatal */ 81#define TLS1_AD_PROTOCOL_VERSION 70 /* fatal */
80#define TLS1_AD_INSUFFICIENT_SECURITY 71 /* fatal */ 82#define TLS1_AD_INSUFFICIENT_SECURITY 71 /* fatal */
81#define TLS1_AD_INTERNAL_ERROR 80 /* fatal */ 83#define TLS1_AD_INTERNAL_ERROR 80 /* fatal */
82#define TLS1_AD_USER_CANCLED 90 84#define TLS1_AD_USER_CANCELLED 90
83#define TLS1_AD_NO_RENEGOTIATION 100 85#define TLS1_AD_NO_RENEGOTIATION 100
84 86
87/* Additional TLS ciphersuites from draft-ietf-tls-56-bit-ciphersuites-00.txt
88 * (available if TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES is defined, see
89 * s3_lib.c). We actually treat them like SSL 3.0 ciphers, which we probably
90 * shouldn't. */
91#define TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_MD5 0x03000060
92#define TLS1_CK_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5 0x03000061
93#define TLS1_CK_RSA_EXPORT1024_WITH_DES_CBC_SHA 0x03000062
94#define TLS1_CK_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA 0x03000063
95#define TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_SHA 0x03000064
96#define TLS1_CK_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA 0x03000065
97#define TLS1_CK_DHE_DSS_WITH_RC4_128_SHA 0x03000066
98
99 /* AES ciphersuites from draft ietf-tls-ciphersuite-03.txt */
100
101#define TLS1_CK_RSA_WITH_AES_128_SHA 0x0300002F
102#define TLS1_CK_DH_DSS_WITH_AES_128_SHA 0x03000030
103#define TLS1_CK_DH_RSA_WITH_AES_128_SHA 0x03000031
104#define TLS1_CK_DHE_DSS_WITH_AES_128_SHA 0x03000032
105#define TLS1_CK_DHE_RSA_WITH_AES_128_SHA 0x03000033
106#define TLS1_CK_ADH_WITH_AES_128_SHA 0x03000034
107
108#define TLS1_CK_RSA_WITH_AES_256_SHA 0x03000035
109#define TLS1_CK_DH_DSS_WITH_AES_256_SHA 0x03000036
110#define TLS1_CK_DH_RSA_WITH_AES_256_SHA 0x03000037
111#define TLS1_CK_DHE_DSS_WITH_AES_256_SHA 0x03000038
112#define TLS1_CK_DHE_RSA_WITH_AES_256_SHA 0x03000039
113#define TLS1_CK_ADH_WITH_AES_256_SHA 0x0300003A
114
115/* XXX
116 * Inconsistency alert:
117 * The OpenSSL names of ciphers with ephemeral DH here include the string
118 * "DHE", while elsewhere it has always been "EDH".
119 * (The alias for the list of all such ciphers also is "EDH".)
120 * The specifications speak of "EDH"; maybe we should allow both forms
121 * for everything. */
122#define TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_MD5 "EXP1024-RC4-MD5"
123#define TLS1_TXT_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5 "EXP1024-RC2-CBC-MD5"
124#define TLS1_TXT_RSA_EXPORT1024_WITH_DES_CBC_SHA "EXP1024-DES-CBC-SHA"
125#define TLS1_TXT_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA "EXP1024-DHE-DSS-DES-CBC-SHA"
126#define TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_SHA "EXP1024-RC4-SHA"
127#define TLS1_TXT_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA "EXP1024-DHE-DSS-RC4-SHA"
128#define TLS1_TXT_DHE_DSS_WITH_RC4_128_SHA "DHE-DSS-RC4-SHA"
129 /* AES ciphersuites from draft-ietf-tls-ciphersuite-06.txt */
130#define TLS1_TXT_RSA_WITH_AES_128_SHA "AESdraft128-SHA"
131#define TLS1_TXT_DH_DSS_WITH_AES_128_SHA "DH-DSS-AESdraft128-SHA"
132#define TLS1_TXT_DH_RSA_WITH_AES_128_SHA "DH-RSA-AESdraft128-SHA"
133#define TLS1_TXT_DHE_DSS_WITH_AES_128_SHA "DHE-DSS-AESdraft128-SHA"
134#define TLS1_TXT_DHE_RSA_WITH_AES_128_SHA "DHE-RSA-AESdraft128-SHA"
135#define TLS1_TXT_ADH_WITH_AES_128_SHA "ADH-AESdraft128-SHA"
136
137#define TLS1_TXT_RSA_WITH_AES_256_SHA "AESdraft256-SHA"
138#define TLS1_TXT_DH_DSS_WITH_AES_256_SHA "DH-DSS-AESdraft256-SHA"
139#define TLS1_TXT_DH_RSA_WITH_AES_256_SHA "DH-RSA-AESdraft256-SHA"
140#define TLS1_TXT_DHE_DSS_WITH_AES_256_SHA "DHE-DSS-AESdraft256-SHA"
141#define TLS1_TXT_DHE_RSA_WITH_AES_256_SHA "DHE-RSA-AESdraft256-SHA"
142#define TLS1_TXT_ADH_WITH_AES_256_SHA "ADH-AESdraft256-SHA"
143
144
85#define TLS_CT_RSA_SIGN 1 145#define TLS_CT_RSA_SIGN 1
86#define TLS_CT_DSS_SIGN 2 146#define TLS_CT_DSS_SIGN 2
87#define TLS_CT_RSA_FIXED_DH 3 147#define TLS_CT_RSA_FIXED_DH 3
@@ -108,6 +168,25 @@ extern "C" {
108#define TLS_MD_MASTER_SECRET_CONST "master secret" 168#define TLS_MD_MASTER_SECRET_CONST "master secret"
109#define TLS_MD_MASTER_SECRET_CONST_SIZE 13 169#define TLS_MD_MASTER_SECRET_CONST_SIZE 13
110 170
171#ifdef CHARSET_EBCDIC
172#undef TLS_MD_CLIENT_FINISH_CONST
173#define TLS_MD_CLIENT_FINISH_CONST "\x63\x6c\x69\x65\x6e\x74\x20\x66\x69\x6e\x69\x73\x68\x65\x64" /*client finished*/
174#undef TLS_MD_SERVER_FINISH_CONST
175#define TLS_MD_SERVER_FINISH_CONST "\x73\x65\x72\x76\x65\x72\x20\x66\x69\x6e\x69\x73\x68\x65\x64" /*server finished*/
176#undef TLS_MD_SERVER_WRITE_KEY_CONST
177#define TLS_MD_SERVER_WRITE_KEY_CONST "\x73\x65\x72\x76\x65\x72\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" /*server write key*/
178#undef TLS_MD_KEY_EXPANSION_CONST
179#define TLS_MD_KEY_EXPANSION_CONST "\x6b\x65\x79\x20\x65\x78\x70\x61\x6e\x73\x69\x6f\x6e" /*key expansion*/
180#undef TLS_MD_CLIENT_WRITE_KEY_CONST
181#define TLS_MD_CLIENT_WRITE_KEY_CONST "\x63\x6c\x69\x65\x6e\x74\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" /*client write key*/
182#undef TLS_MD_SERVER_WRITE_KEY_CONST
183#define TLS_MD_SERVER_WRITE_KEY_CONST "\x73\x65\x72\x76\x65\x72\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" /*server write key*/
184#undef TLS_MD_IV_BLOCK_CONST
185#define TLS_MD_IV_BLOCK_CONST "\x49\x56\x20\x62\x6c\x6f\x63\x6b" /*IV block*/
186#undef TLS_MD_MASTER_SECRET_CONST
187#define TLS_MD_MASTER_SECRET_CONST "\x6d\x61\x73\x74\x65\x72\x20\x73\x65\x63\x72\x65\x74" /*master secret*/
188#endif
189
111#ifdef __cplusplus 190#ifdef __cplusplus
112} 191}
113#endif 192#endif