summaryrefslogtreecommitdiff
path: root/src/lib/libssl
diff options
context:
space:
mode:
authorcvs2svn <admin@example.com>2003-03-22 08:02:04 +0000
committercvs2svn <admin@example.com>2003-03-22 08:02:04 +0000
commitdf32a1286ae06981a79e30b678165a784696be4b (patch)
tree3d70e9a28e2db2eee8cd542ce0ce859502668178 /src/lib/libssl
parent2850ebd15c3cfddf6fb7edcd08cb6b2c6f717be9 (diff)
downloadopenbsd-OPENBSD_3_3_BASE.tar.gz
openbsd-OPENBSD_3_3_BASE.tar.bz2
openbsd-OPENBSD_3_3_BASE.zip
This commit was manufactured by cvs2git to create tag 'OPENBSD_3_3_BASE'.OPENBSD_3_3_BASE
Diffstat (limited to 'src/lib/libssl')
-rw-r--r--src/lib/libssl/LICENSE127
-rw-r--r--src/lib/libssl/bio_ssl.c592
-rw-r--r--src/lib/libssl/doc/openssl.cnf255
-rw-r--r--src/lib/libssl/doc/openssl.txt1235
-rw-r--r--src/lib/libssl/doc/standards.txt130
-rw-r--r--src/lib/libssl/s23_clnt.c480
-rw-r--r--src/lib/libssl/s23_lib.c236
-rw-r--r--src/lib/libssl/s23_pkt.c117
-rw-r--r--src/lib/libssl/s23_srvr.c589
-rw-r--r--src/lib/libssl/s3_both.c624
-rw-r--r--src/lib/libssl/s3_clnt.c1963
-rw-r--r--src/lib/libssl/s3_lib.c1682
-rw-r--r--src/lib/libssl/s3_pkt.c1302
-rw-r--r--src/lib/libssl/s3_srvr.c2049
-rw-r--r--src/lib/libssl/shlib_version2
-rw-r--r--src/lib/libssl/ssl.h1838
-rw-r--r--src/lib/libssl/ssl2.h268
-rw-r--r--src/lib/libssl/ssl23.h83
-rw-r--r--src/lib/libssl/ssl3.h504
-rw-r--r--src/lib/libssl/ssl_algs.c111
-rw-r--r--src/lib/libssl/ssl_asn1.c391
-rw-r--r--src/lib/libssl/ssl_cert.c832
-rw-r--r--src/lib/libssl/ssl_ciph.c1139
-rw-r--r--src/lib/libssl/ssl_err.c460
-rw-r--r--src/lib/libssl/ssl_err2.c70
-rw-r--r--src/lib/libssl/ssl_lib.c2302
-rw-r--r--src/lib/libssl/ssl_locl.h620
-rw-r--r--src/lib/libssl/ssl_rsa.c815
-rw-r--r--src/lib/libssl/ssl_sess.c751
-rw-r--r--src/lib/libssl/ssl_stat.c502
-rw-r--r--src/lib/libssl/ssl_txt.c186
-rw-r--r--src/lib/libssl/t1_clnt.c90
-rw-r--r--src/lib/libssl/t1_enc.c814
-rw-r--r--src/lib/libssl/t1_lib.c149
-rw-r--r--src/lib/libssl/t1_meth.c88
-rw-r--r--src/lib/libssl/t1_srvr.c91
-rw-r--r--src/lib/libssl/test/CAss.cnf25
-rw-r--r--src/lib/libssl/test/CAssdh.cnf24
-rw-r--r--src/lib/libssl/test/CAssdsa.cnf23
-rw-r--r--src/lib/libssl/test/CAssrsa.cnf24
-rw-r--r--src/lib/libssl/test/Sssdsa.cnf27
-rw-r--r--src/lib/libssl/test/Sssrsa.cnf26
-rw-r--r--src/lib/libssl/test/Uss.cnf28
-rw-r--r--src/lib/libssl/test/VMSca-response.11
-rw-r--r--src/lib/libssl/test/VMSca-response.22
-rw-r--r--src/lib/libssl/test/bctest111
-rw-r--r--src/lib/libssl/test/methtest.c105
-rw-r--r--src/lib/libssl/test/pkcs7-1.pem15
-rw-r--r--src/lib/libssl/test/pkcs7.pem54
-rw-r--r--src/lib/libssl/test/r160test.c57
-rw-r--r--src/lib/libssl/test/tcrl85
-rw-r--r--src/lib/libssl/test/test.cnf88
-rw-r--r--src/lib/libssl/test/testca48
-rw-r--r--src/lib/libssl/test/testcrl.pem16
-rw-r--r--src/lib/libssl/test/testenc54
-rw-r--r--src/lib/libssl/test/testgen42
-rw-r--r--src/lib/libssl/test/testp7.pem46
-rw-r--r--src/lib/libssl/test/testreq2.pem7
-rw-r--r--src/lib/libssl/test/testrsa.pem9
-rw-r--r--src/lib/libssl/test/testsid.pem12
-rw-r--r--src/lib/libssl/test/testss99
-rw-r--r--src/lib/libssl/test/testssl137
-rw-r--r--src/lib/libssl/test/testx509.pem10
-rw-r--r--src/lib/libssl/test/times113
-rw-r--r--src/lib/libssl/test/tpkcs755
-rw-r--r--src/lib/libssl/test/tpkcs7d48
-rw-r--r--src/lib/libssl/test/treq90
-rw-r--r--src/lib/libssl/test/trsa90
-rw-r--r--src/lib/libssl/test/tsid85
-rw-r--r--src/lib/libssl/test/tx50985
-rw-r--r--src/lib/libssl/test/v3-cert1.pem16
-rw-r--r--src/lib/libssl/test/v3-cert2.pem16
-rw-r--r--src/lib/libssl/tls1.h195
73 files changed, 0 insertions, 25455 deletions
diff --git a/src/lib/libssl/LICENSE b/src/lib/libssl/LICENSE
deleted file mode 100644
index 7b93e0dbce..0000000000
--- a/src/lib/libssl/LICENSE
+++ /dev/null
@@ -1,127 +0,0 @@
1
2 LICENSE ISSUES
3 ==============
4
5 The OpenSSL toolkit stays under a dual license, i.e. both the conditions of
6 the OpenSSL License and the original SSLeay license apply to the toolkit.
7 See below for the actual license texts. Actually both licenses are BSD-style
8 Open Source licenses. In case of any license issues related to OpenSSL
9 please contact openssl-core@openssl.org.
10
11 OpenSSL License
12 ---------------
13
14/* ====================================================================
15 * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved.
16 *
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions
19 * are met:
20 *
21 * 1. Redistributions of source code must retain the above copyright
22 * notice, this list of conditions and the following disclaimer.
23 *
24 * 2. Redistributions in binary form must reproduce the above copyright
25 * notice, this list of conditions and the following disclaimer in
26 * the documentation and/or other materials provided with the
27 * distribution.
28 *
29 * 3. All advertising materials mentioning features or use of this
30 * software must display the following acknowledgment:
31 * "This product includes software developed by the OpenSSL Project
32 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
33 *
34 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
35 * endorse or promote products derived from this software without
36 * prior written permission. For written permission, please contact
37 * openssl-core@openssl.org.
38 *
39 * 5. Products derived from this software may not be called "OpenSSL"
40 * nor may "OpenSSL" appear in their names without prior written
41 * permission of the OpenSSL Project.
42 *
43 * 6. Redistributions of any form whatsoever must retain the following
44 * acknowledgment:
45 * "This product includes software developed by the OpenSSL Project
46 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
47 *
48 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
49 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
51 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
52 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
53 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
54 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
55 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
56 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
57 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
58 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
59 * OF THE POSSIBILITY OF SUCH DAMAGE.
60 * ====================================================================
61 *
62 * This product includes cryptographic software written by Eric Young
63 * (eay@cryptsoft.com). This product includes software written by Tim
64 * Hudson (tjh@cryptsoft.com).
65 *
66 */
67
68 Original SSLeay License
69 -----------------------
70
71/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
72 * All rights reserved.
73 *
74 * This package is an SSL implementation written
75 * by Eric Young (eay@cryptsoft.com).
76 * The implementation was written so as to conform with Netscapes SSL.
77 *
78 * This library is free for commercial and non-commercial use as long as
79 * the following conditions are aheared to. The following conditions
80 * apply to all code found in this distribution, be it the RC4, RSA,
81 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
82 * included with this distribution is covered by the same copyright terms
83 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
84 *
85 * Copyright remains Eric Young's, and as such any Copyright notices in
86 * the code are not to be removed.
87 * If this package is used in a product, Eric Young should be given attribution
88 * as the author of the parts of the library used.
89 * This can be in the form of a textual message at program startup or
90 * in documentation (online or textual) provided with the package.
91 *
92 * Redistribution and use in source and binary forms, with or without
93 * modification, are permitted provided that the following conditions
94 * are met:
95 * 1. Redistributions of source code must retain the copyright
96 * notice, this list of conditions and the following disclaimer.
97 * 2. Redistributions in binary form must reproduce the above copyright
98 * notice, this list of conditions and the following disclaimer in the
99 * documentation and/or other materials provided with the distribution.
100 * 3. All advertising materials mentioning features or use of this software
101 * must display the following acknowledgement:
102 * "This product includes cryptographic software written by
103 * Eric Young (eay@cryptsoft.com)"
104 * The word 'cryptographic' can be left out if the rouines from the library
105 * being used are not cryptographic related :-).
106 * 4. If you include any Windows specific code (or a derivative thereof) from
107 * the apps directory (application code) you must include an acknowledgement:
108 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
109 *
110 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
111 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
112 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
113 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
114 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
115 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
116 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
117 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
118 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
119 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
120 * SUCH DAMAGE.
121 *
122 * The licence and distribution terms for any publically available version or
123 * derivative of this code cannot be changed. i.e. this code cannot simply be
124 * copied and put under another distribution licence
125 * [including the GNU Public Licence.]
126 */
127
diff --git a/src/lib/libssl/bio_ssl.c b/src/lib/libssl/bio_ssl.c
deleted file mode 100644
index 467e149947..0000000000
--- a/src/lib/libssl/bio_ssl.c
+++ /dev/null
@@ -1,592 +0,0 @@
1/* ssl/bio_ssl.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include <stdlib.h>
61#include <string.h>
62#include <errno.h>
63#include <openssl/crypto.h>
64#include <openssl/bio.h>
65#include <openssl/err.h>
66#include <openssl/ssl.h>
67
68static int ssl_write(BIO *h, const char *buf, int num);
69static int ssl_read(BIO *h, char *buf, int size);
70static int ssl_puts(BIO *h, const char *str);
71static long ssl_ctrl(BIO *h, int cmd, long arg1, void *arg2);
72static int ssl_new(BIO *h);
73static int ssl_free(BIO *data);
74static long ssl_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp);
75typedef struct bio_ssl_st
76 {
77 SSL *ssl; /* The ssl handle :-) */
78 /* re-negotiate every time the total number of bytes is this size */
79 int num_renegotiates;
80 unsigned long renegotiate_count;
81 unsigned long byte_count;
82 unsigned long renegotiate_timeout;
83 unsigned long last_time;
84 } BIO_SSL;
85
86static BIO_METHOD methods_sslp=
87 {
88 BIO_TYPE_SSL,"ssl",
89 ssl_write,
90 ssl_read,
91 ssl_puts,
92 NULL, /* ssl_gets, */
93 ssl_ctrl,
94 ssl_new,
95 ssl_free,
96 ssl_callback_ctrl,
97 };
98
99BIO_METHOD *BIO_f_ssl(void)
100 {
101 return(&methods_sslp);
102 }
103
104static int ssl_new(BIO *bi)
105 {
106 BIO_SSL *bs;
107
108 bs=(BIO_SSL *)OPENSSL_malloc(sizeof(BIO_SSL));
109 if (bs == NULL)
110 {
111 BIOerr(BIO_F_SSL_NEW,ERR_R_MALLOC_FAILURE);
112 return(0);
113 }
114 memset(bs,0,sizeof(BIO_SSL));
115 bi->init=0;
116 bi->ptr=(char *)bs;
117 bi->flags=0;
118 return(1);
119 }
120
121static int ssl_free(BIO *a)
122 {
123 BIO_SSL *bs;
124
125 if (a == NULL) return(0);
126 bs=(BIO_SSL *)a->ptr;
127 if (bs->ssl != NULL) SSL_shutdown(bs->ssl);
128 if (a->shutdown)
129 {
130 if (a->init && (bs->ssl != NULL))
131 SSL_free(bs->ssl);
132 a->init=0;
133 a->flags=0;
134 }
135 if (a->ptr != NULL)
136 OPENSSL_free(a->ptr);
137 return(1);
138 }
139
140static int ssl_read(BIO *b, char *out, int outl)
141 {
142 int ret=1;
143 BIO_SSL *sb;
144 SSL *ssl;
145 int retry_reason=0;
146 int r=0;
147
148 if (out == NULL) return(0);
149 sb=(BIO_SSL *)b->ptr;
150 ssl=sb->ssl;
151
152 BIO_clear_retry_flags(b);
153
154#if 0
155 if (!SSL_is_init_finished(ssl))
156 {
157/* ret=SSL_do_handshake(ssl); */
158 if (ret > 0)
159 {
160
161 outflags=(BIO_FLAGS_READ|BIO_FLAGS_SHOULD_RETRY);
162 ret= -1;
163 goto end;
164 }
165 }
166#endif
167/* if (ret > 0) */
168 ret=SSL_read(ssl,out,outl);
169
170 switch (SSL_get_error(ssl,ret))
171 {
172 case SSL_ERROR_NONE:
173 if (ret <= 0) break;
174 if (sb->renegotiate_count > 0)
175 {
176 sb->byte_count+=ret;
177 if (sb->byte_count > sb->renegotiate_count)
178 {
179 sb->byte_count=0;
180 sb->num_renegotiates++;
181 SSL_renegotiate(ssl);
182 r=1;
183 }
184 }
185 if ((sb->renegotiate_timeout > 0) && (!r))
186 {
187 unsigned long tm;
188
189 tm=(unsigned long)time(NULL);
190 if (tm > sb->last_time+sb->renegotiate_timeout)
191 {
192 sb->last_time=tm;
193 sb->num_renegotiates++;
194 SSL_renegotiate(ssl);
195 }
196 }
197
198 break;
199 case SSL_ERROR_WANT_READ:
200 BIO_set_retry_read(b);
201 break;
202 case SSL_ERROR_WANT_WRITE:
203 BIO_set_retry_write(b);
204 break;
205 case SSL_ERROR_WANT_X509_LOOKUP:
206 BIO_set_retry_special(b);
207 retry_reason=BIO_RR_SSL_X509_LOOKUP;
208 break;
209 case SSL_ERROR_WANT_ACCEPT:
210 BIO_set_retry_special(b);
211 retry_reason=BIO_RR_ACCEPT;
212 break;
213 case SSL_ERROR_WANT_CONNECT:
214 BIO_set_retry_special(b);
215 retry_reason=BIO_RR_CONNECT;
216 break;
217 case SSL_ERROR_SYSCALL:
218 case SSL_ERROR_SSL:
219 case SSL_ERROR_ZERO_RETURN:
220 default:
221 break;
222 }
223
224 b->retry_reason=retry_reason;
225 return(ret);
226 }
227
228static int ssl_write(BIO *b, const char *out, int outl)
229 {
230 int ret,r=0;
231 int retry_reason=0;
232 SSL *ssl;
233 BIO_SSL *bs;
234
235 if (out == NULL) return(0);
236 bs=(BIO_SSL *)b->ptr;
237 ssl=bs->ssl;
238
239 BIO_clear_retry_flags(b);
240
241/* ret=SSL_do_handshake(ssl);
242 if (ret > 0) */
243 ret=SSL_write(ssl,out,outl);
244
245 switch (SSL_get_error(ssl,ret))
246 {
247 case SSL_ERROR_NONE:
248 if (ret <= 0) break;
249 if (bs->renegotiate_count > 0)
250 {
251 bs->byte_count+=ret;
252 if (bs->byte_count > bs->renegotiate_count)
253 {
254 bs->byte_count=0;
255 bs->num_renegotiates++;
256 SSL_renegotiate(ssl);
257 r=1;
258 }
259 }
260 if ((bs->renegotiate_timeout > 0) && (!r))
261 {
262 unsigned long tm;
263
264 tm=(unsigned long)time(NULL);
265 if (tm > bs->last_time+bs->renegotiate_timeout)
266 {
267 bs->last_time=tm;
268 bs->num_renegotiates++;
269 SSL_renegotiate(ssl);
270 }
271 }
272 break;
273 case SSL_ERROR_WANT_WRITE:
274 BIO_set_retry_write(b);
275 break;
276 case SSL_ERROR_WANT_READ:
277 BIO_set_retry_read(b);
278 break;
279 case SSL_ERROR_WANT_X509_LOOKUP:
280 BIO_set_retry_special(b);
281 retry_reason=BIO_RR_SSL_X509_LOOKUP;
282 break;
283 case SSL_ERROR_WANT_CONNECT:
284 BIO_set_retry_special(b);
285 retry_reason=BIO_RR_CONNECT;
286 case SSL_ERROR_SYSCALL:
287 case SSL_ERROR_SSL:
288 default:
289 break;
290 }
291
292 b->retry_reason=retry_reason;
293 return(ret);
294 }
295
296static long ssl_ctrl(BIO *b, int cmd, long num, void *ptr)
297 {
298 SSL **sslp,*ssl;
299 BIO_SSL *bs;
300 BIO *dbio,*bio;
301 long ret=1;
302
303 bs=(BIO_SSL *)b->ptr;
304 ssl=bs->ssl;
305 if ((ssl == NULL) && (cmd != BIO_C_SET_SSL))
306 return(0);
307 switch (cmd)
308 {
309 case BIO_CTRL_RESET:
310 SSL_shutdown(ssl);
311
312 if (ssl->handshake_func == ssl->method->ssl_connect)
313 SSL_set_connect_state(ssl);
314 else if (ssl->handshake_func == ssl->method->ssl_accept)
315 SSL_set_accept_state(ssl);
316
317 SSL_clear(ssl);
318
319 if (b->next_bio != NULL)
320 ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
321 else if (ssl->rbio != NULL)
322 ret=BIO_ctrl(ssl->rbio,cmd,num,ptr);
323 else
324 ret=1;
325 break;
326 case BIO_CTRL_INFO:
327 ret=0;
328 break;
329 case BIO_C_SSL_MODE:
330 if (num) /* client mode */
331 SSL_set_connect_state(ssl);
332 else
333 SSL_set_accept_state(ssl);
334 break;
335 case BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT:
336 ret=bs->renegotiate_timeout;
337 if (num < 60) num=5;
338 bs->renegotiate_timeout=(unsigned long)num;
339 bs->last_time=(unsigned long)time(NULL);
340 break;
341 case BIO_C_SET_SSL_RENEGOTIATE_BYTES:
342 ret=bs->renegotiate_count;
343 if ((long)num >=512)
344 bs->renegotiate_count=(unsigned long)num;
345 break;
346 case BIO_C_GET_SSL_NUM_RENEGOTIATES:
347 ret=bs->num_renegotiates;
348 break;
349 case BIO_C_SET_SSL:
350 if (ssl != NULL)
351 ssl_free(b);
352 b->shutdown=(int)num;
353 ssl=(SSL *)ptr;
354 ((BIO_SSL *)b->ptr)->ssl=ssl;
355 bio=SSL_get_rbio(ssl);
356 if (bio != NULL)
357 {
358 if (b->next_bio != NULL)
359 BIO_push(bio,b->next_bio);
360 b->next_bio=bio;
361 CRYPTO_add(&bio->references,1,CRYPTO_LOCK_BIO);
362 }
363 b->init=1;
364 break;
365 case BIO_C_GET_SSL:
366 if (ptr != NULL)
367 {
368 sslp=(SSL **)ptr;
369 *sslp=ssl;
370 }
371 else
372 ret=0;
373 break;
374 case BIO_CTRL_GET_CLOSE:
375 ret=b->shutdown;
376 break;
377 case BIO_CTRL_SET_CLOSE:
378 b->shutdown=(int)num;
379 break;
380 case BIO_CTRL_WPENDING:
381 ret=BIO_ctrl(ssl->wbio,cmd,num,ptr);
382 break;
383 case BIO_CTRL_PENDING:
384 ret=SSL_pending(ssl);
385 if (ret == 0)
386 ret=BIO_pending(ssl->rbio);
387 break;
388 case BIO_CTRL_FLUSH:
389 BIO_clear_retry_flags(b);
390 ret=BIO_ctrl(ssl->wbio,cmd,num,ptr);
391 BIO_copy_next_retry(b);
392 break;
393 case BIO_CTRL_PUSH:
394 if ((b->next_bio != NULL) && (b->next_bio != ssl->rbio))
395 {
396 SSL_set_bio(ssl,b->next_bio,b->next_bio);
397 CRYPTO_add(&b->next_bio->references,1,CRYPTO_LOCK_BIO);
398 }
399 break;
400 case BIO_CTRL_POP:
401 /* ugly bit of a hack */
402 if (ssl->rbio != ssl->wbio) /* we are in trouble :-( */
403 {
404 BIO_free_all(ssl->wbio);
405 }
406 ssl->wbio=NULL;
407 ssl->rbio=NULL;
408 break;
409 case BIO_C_DO_STATE_MACHINE:
410 BIO_clear_retry_flags(b);
411
412 b->retry_reason=0;
413 ret=(int)SSL_do_handshake(ssl);
414
415 switch (SSL_get_error(ssl,(int)ret))
416 {
417 case SSL_ERROR_WANT_READ:
418 BIO_set_flags(b,
419 BIO_FLAGS_READ|BIO_FLAGS_SHOULD_RETRY);
420 break;
421 case SSL_ERROR_WANT_WRITE:
422 BIO_set_flags(b,
423 BIO_FLAGS_WRITE|BIO_FLAGS_SHOULD_RETRY);
424 break;
425 case SSL_ERROR_WANT_CONNECT:
426 BIO_set_flags(b,
427 BIO_FLAGS_IO_SPECIAL|BIO_FLAGS_SHOULD_RETRY);
428 b->retry_reason=b->next_bio->retry_reason;
429 break;
430 default:
431 break;
432 }
433 break;
434 case BIO_CTRL_DUP:
435 dbio=(BIO *)ptr;
436 if (((BIO_SSL *)dbio->ptr)->ssl != NULL)
437 SSL_free(((BIO_SSL *)dbio->ptr)->ssl);
438 ((BIO_SSL *)dbio->ptr)->ssl=SSL_dup(ssl);
439 ((BIO_SSL *)dbio->ptr)->renegotiate_count=
440 ((BIO_SSL *)b->ptr)->renegotiate_count;
441 ((BIO_SSL *)dbio->ptr)->byte_count=
442 ((BIO_SSL *)b->ptr)->byte_count;
443 ((BIO_SSL *)dbio->ptr)->renegotiate_timeout=
444 ((BIO_SSL *)b->ptr)->renegotiate_timeout;
445 ((BIO_SSL *)dbio->ptr)->last_time=
446 ((BIO_SSL *)b->ptr)->last_time;
447 ret=(((BIO_SSL *)dbio->ptr)->ssl != NULL);
448 break;
449 case BIO_C_GET_FD:
450 ret=BIO_ctrl(ssl->rbio,cmd,num,ptr);
451 break;
452 case BIO_CTRL_SET_CALLBACK:
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 }
461 break;
462 case BIO_CTRL_GET_CALLBACK:
463 {
464 void (**fptr)();
465
466 fptr=(void (**)())ptr;
467 *fptr=SSL_get_info_callback(ssl);
468 }
469 break;
470 default:
471 ret=BIO_ctrl(ssl->rbio,cmd,num,ptr);
472 break;
473 }
474 return(ret);
475 }
476
477static long ssl_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp)
478 {
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)
502 {
503 int n,ret;
504
505 n=strlen(str);
506 ret=BIO_write(bp,str,n);
507 return(ret);
508 }
509
510BIO *BIO_new_buffer_ssl_connect(SSL_CTX *ctx)
511 {
512 BIO *ret=NULL,*buf=NULL,*ssl=NULL;
513
514 if ((buf=BIO_new(BIO_f_buffer())) == NULL)
515 return(NULL);
516 if ((ssl=BIO_new_ssl_connect(ctx)) == NULL)
517 goto err;
518 if ((ret=BIO_push(buf,ssl)) == NULL)
519 goto err;
520 return(ret);
521err:
522 if (buf != NULL) BIO_free(buf);
523 if (ssl != NULL) BIO_free(ssl);
524 return(NULL);
525 }
526
527BIO *BIO_new_ssl_connect(SSL_CTX *ctx)
528 {
529 BIO *ret=NULL,*con=NULL,*ssl=NULL;
530
531 if ((con=BIO_new(BIO_s_connect())) == NULL)
532 return(NULL);
533 if ((ssl=BIO_new_ssl(ctx,1)) == NULL)
534 goto err;
535 if ((ret=BIO_push(ssl,con)) == NULL)
536 goto err;
537 return(ret);
538err:
539 if (con != NULL) BIO_free(con);
540 if (ret != NULL) BIO_free(ret);
541 return(NULL);
542 }
543
544BIO *BIO_new_ssl(SSL_CTX *ctx, int client)
545 {
546 BIO *ret;
547 SSL *ssl;
548
549 if ((ret=BIO_new(BIO_f_ssl())) == NULL)
550 return(NULL);
551 if ((ssl=SSL_new(ctx)) == NULL)
552 {
553 BIO_free(ret);
554 return(NULL);
555 }
556 if (client)
557 SSL_set_connect_state(ssl);
558 else
559 SSL_set_accept_state(ssl);
560
561 BIO_set_ssl(ret,ssl,BIO_CLOSE);
562 return(ret);
563 }
564
565int BIO_ssl_copy_session_id(BIO *t, BIO *f)
566 {
567 t=BIO_find_type(t,BIO_TYPE_SSL);
568 f=BIO_find_type(f,BIO_TYPE_SSL);
569 if ((t == NULL) || (f == NULL))
570 return(0);
571 if ( (((BIO_SSL *)t->ptr)->ssl == NULL) ||
572 (((BIO_SSL *)f->ptr)->ssl == NULL))
573 return(0);
574 SSL_copy_session_id(((BIO_SSL *)t->ptr)->ssl,((BIO_SSL *)f->ptr)->ssl);
575 return(1);
576 }
577
578void BIO_ssl_shutdown(BIO *b)
579 {
580 SSL *s;
581
582 while (b != NULL)
583 {
584 if (b->method->type == BIO_TYPE_SSL)
585 {
586 s=((BIO_SSL *)b->ptr)->ssl;
587 SSL_shutdown(s);
588 break;
589 }
590 b=b->next_bio;
591 }
592 }
diff --git a/src/lib/libssl/doc/openssl.cnf b/src/lib/libssl/doc/openssl.cnf
deleted file mode 100644
index eca51c3322..0000000000
--- a/src/lib/libssl/doc/openssl.cnf
+++ /dev/null
@@ -1,255 +0,0 @@
1#
2# OpenSSL example configuration file.
3# This is mostly being used for generation of certificate requests.
4#
5
6# This definition stops the following lines choking if HOME isn't
7# defined.
8HOME = .
9RANDFILE = $ENV::HOME/.rnd
10
11# Extra OBJECT IDENTIFIER info:
12#oid_file = $ENV::HOME/.oid
13oid_section = new_oids
14
15# To use this configuration file with the "-extfile" option of the
16# "openssl x509" utility, name here the section containing the
17# X.509v3 extensions to use:
18# extensions =
19# (Alternatively, use a configuration file that has only
20# X.509v3 extensions in its main [= default] section.)
21
22[ new_oids ]
23
24# We can add new OIDs in here for use by 'ca' and 'req'.
25# Add a simple OID like this:
26# testoid1=1.2.3.4
27# Or use config file substitution like this:
28# testoid2=${testoid1}.5.6
29
30####################################################################
31[ ca ]
32default_ca = CA_default # The default ca section
33
34####################################################################
35[ CA_default ]
36
37dir = ./demoCA # Where everything is kept
38certs = $dir/certs # Where the issued certs are kept
39crl_dir = $dir/crl # Where the issued crl are kept
40database = $dir/index.txt # database index file.
41new_certs_dir = $dir/newcerts # default place for new certs.
42
43certificate = $dir/cacert.pem # The CA certificate
44serial = $dir/serial # The current serial number
45crl = $dir/crl.pem # The current CRL
46private_key = $dir/private/cakey.pem# The private key
47RANDFILE = $dir/private/.rand # private random number file
48
49x509_extensions = usr_cert # The extentions to add to the cert
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
59# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
60# so this is commented out by default to leave a V1 CRL.
61# crl_extensions = crl_ext
62
63default_days = 365 # how long to certify for
64default_crl_days= 30 # how long before next CRL
65default_md = md5 # which md to use.
66preserve = no # keep passed DN ordering
67
68# A few difference way of specifying how similar the request should look
69# For type CA, the listed attributes must be the same, and the optional
70# and supplied fields are just that :-)
71policy = policy_match
72
73# For the CA policy
74[ policy_match ]
75countryName = match
76stateOrProvinceName = match
77organizationName = match
78organizationalUnitName = optional
79commonName = supplied
80emailAddress = optional
81
82# For the 'anything' policy
83# At this point in time, you must list all acceptable 'object'
84# types.
85[ policy_anything ]
86countryName = optional
87stateOrProvinceName = optional
88localityName = optional
89organizationName = optional
90organizationalUnitName = optional
91commonName = supplied
92emailAddress = optional
93
94####################################################################
95[ req ]
96default_bits = 1024
97default_keyfile = privkey.pem
98distinguished_name = req_distinguished_name
99attributes = req_attributes
100x509_extensions = v3_ca # The extentions to add to the self signed cert
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
118[ req_distinguished_name ]
119countryName = Country Name (2 letter code)
120countryName_default = AU
121countryName_min = 2
122countryName_max = 2
123
124stateOrProvinceName = State or Province Name (full name)
125stateOrProvinceName_default = Some-State
126
127localityName = Locality Name (eg, city)
128
1290.organizationName = Organization Name (eg, company)
1300.organizationName_default = Internet Widgits Pty Ltd
131
132# we can do this but it is not needed normally :-)
133#1.organizationName = Second Organization Name (eg, company)
134#1.organizationName_default = World Wide Web Pty Ltd
135
136organizationalUnitName = Organizational Unit Name (eg, section)
137#organizationalUnitName_default =
138
139commonName = Common Name (eg, YOUR name)
140commonName_max = 64
141
142emailAddress = Email Address
143emailAddress_max = 64
144
145# SET-ex3 = SET extension number 3
146
147[ req_attributes ]
148challengePassword = A challenge password
149challengePassword_min = 4
150challengePassword_max = 20
151
152unstructuredName = An optional company name
153
154[ usr_cert ]
155
156# These extensions are added when 'ca' signs a request.
157
158# This goes against PKIX guidelines but some CAs do it and some software
159# requires this to avoid interpreting an end user certificate as a CA.
160
161basicConstraints=CA:FALSE
162
163# Here are some examples of the usage of nsCertType. If it is omitted
164# the certificate can be used for anything *except* object signing.
165
166# This is OK for an SSL server.
167# nsCertType = server
168
169# For an object signing certificate this would be used.
170# nsCertType = objsign
171
172# For normal client use this is typical
173# nsCertType = client, email
174
175# and for everything including object signing:
176# nsCertType = client, email, objsign
177
178# This is typical in keyUsage for a client certificate.
179# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
180
181# This will be displayed in Netscape's comment listbox.
182nsComment = "OpenSSL Generated Certificate"
183
184# PKIX recommendations harmless if included in all certificates.
185subjectKeyIdentifier=hash
186authorityKeyIdentifier=keyid,issuer:always
187
188# This stuff is for subjectAltName and issuerAltname.
189# Import the email address.
190# subjectAltName=email:copy
191# An alternative to produce certificates that aren't
192# deprecated according to PKIX.
193# subjectAltName=email:move
194
195# Copy subject details
196# issuerAltName=issuer:copy
197
198#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem
199#nsBaseUrl
200#nsRevocationUrl
201#nsRenewalUrl
202#nsCaPolicyUrl
203#nsSslServerName
204
205[ v3_req ]
206
207# Extensions to add to a certificate request
208
209basicConstraints = CA:FALSE
210keyUsage = nonRepudiation, digitalSignature, keyEncipherment
211
212[ v3_ca ]
213
214
215# Extensions for a typical CA
216
217
218# PKIX recommendation.
219
220subjectKeyIdentifier=hash
221
222authorityKeyIdentifier=keyid:always,issuer:always
223
224# This is what PKIX recommends but some broken software chokes on critical
225# extensions.
226#basicConstraints = critical,CA:true
227# So we do this instead.
228basicConstraints = CA:true
229
230# Key usage: this is typical for a CA certificate. However since it will
231# prevent it being used as an test self-signed certificate it is best
232# left out by default.
233# keyUsage = cRLSign, keyCertSign
234
235# Some might want this also
236# nsCertType = sslCA, emailCA
237
238# Include email address in subject alt name: another PKIX recommendation
239# subjectAltName=email:copy
240# Copy issuer details
241# issuerAltName=issuer:copy
242
243# DER hex encoding of an extension: beware experts only!
244# obj=DER:02:03
245# Where 'obj' is a standard or added object
246# You can even override a supported extension:
247# basicConstraints= critical, DER:30:03:01:01:FF
248
249[ crl_ext ]
250
251# CRL extensions.
252# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL.
253
254# issuerAltName=issuer:copy
255authorityKeyIdentifier=keyid:always,issuer:always
diff --git a/src/lib/libssl/doc/openssl.txt b/src/lib/libssl/doc/openssl.txt
deleted file mode 100644
index 432a17b66c..0000000000
--- a/src/lib/libssl/doc/openssl.txt
+++ /dev/null
@@ -1,1235 +0,0 @@
1
2This is some preliminary documentation for OpenSSL.
3
4Contents:
5
6 OpenSSL X509V3 extension configuration
7 X509V3 Extension code: programmers guide
8 PKCS#12 Library
9
10
11==============================================================================
12 OpenSSL X509V3 extension configuration
13==============================================================================
14
15OpenSSL X509V3 extension configuration: preliminary documentation.
16
17INTRODUCTION.
18
19For OpenSSL 0.9.2 the extension code has be considerably enhanced. It is now
20possible to add and print out common X509 V3 certificate and CRL extensions.
21
22BEGINNERS NOTE
23
24For most simple applications you don't need to know too much about extensions:
25the default openssl.cnf values will usually do sensible things.
26
27If you want to know more you can initially quickly look through the sections
28describing how the standard OpenSSL utilities display and add extensions and
29then the list of supported extensions.
30
31For more technical information about the meaning of extensions see:
32
33http://www.imc.org/ietf-pkix/
34http://home.netscape.com/eng/security/certs.html
35
36PRINTING EXTENSIONS.
37
38Extension values are automatically printed out for supported extensions.
39
40openssl x509 -in cert.pem -text
41openssl crl -in crl.pem -text
42
43will give information in the extension printout, for example:
44
45 X509v3 extensions:
46 X509v3 Basic Constraints:
47 CA:TRUE
48 X509v3 Subject Key Identifier:
49 73:FE:F7:59:A7:E1:26:84:44:D6:44:36:EE:79:1A:95:7C:B1:4B:15
50 X509v3 Authority Key Identifier:
51 keyid:73:FE:F7:59:A7:E1:26:84:44:D6:44:36:EE:79:1A:95:7C:B1:4B:15, DirName:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/Email=email@1.address/Email=email@2.address, serial:00
52 X509v3 Key Usage:
53 Certificate Sign, CRL Sign
54 X509v3 Subject Alternative Name:
55 email:email@1.address, email:email@2.address
56
57CONFIGURATION FILES.
58
59The OpenSSL utilities 'ca' and 'req' can now have extension sections listing
60which certificate extensions to include. In each case a line:
61
62x509_extensions = extension_section
63
64indicates which section contains the extensions. In the case of 'req' the
65extension section is used when the -x509 option is present to create a
66self signed root certificate.
67
68The 'x509' utility also supports extensions when it signs a certificate.
69The -extfile option is used to set the configuration file containing the
70extensions. In this case a line with:
71
72extensions = extension_section
73
74in the nameless (default) section is used. If no such line is included then
75it uses the default section.
76
77You can also add extensions to CRLs: a line
78
79crl_extensions = crl_extension_section
80
81will include extensions when the -gencrl option is used with the 'ca' utility.
82You can add any extension to a CRL but of the supported extensions only
83issuerAltName and authorityKeyIdentifier make any real sense. Note: these are
84CRL extensions NOT CRL *entry* extensions which cannot currently be generated.
85CRL entry extensions can be displayed.
86
87NB. At this time Netscape Communicator rejects V2 CRLs: to get an old V1 CRL
88you should not include a crl_extensions line in the configuration file.
89
90As with all configuration files you can use the inbuilt environment expansion
91to allow the values to be passed in the environment. Therefore if you have
92several extension sections used for different purposes you can have a line:
93
94x509_extensions = $ENV::ENV_EXT
95
96and set the ENV_EXT environment variable before calling the relevant utility.
97
98EXTENSION SYNTAX.
99
100Extensions have the basic form:
101
102extension_name=[critical,] extension_options
103
104the use of the critical option makes the extension critical. Extreme caution
105should be made when using the critical flag. If an extension is marked
106as critical then any client that does not understand the extension should
107reject it as invalid. Some broken software will reject certificates which
108have *any* critical extensions (these violates PKIX but we have to live
109with it).
110
111There are three main types of extension: string extensions, multi-valued
112extensions, and raw extensions.
113
114String extensions simply have a string which contains either the value itself
115or how it is obtained.
116
117For example:
118
119nsComment="This is a Comment"
120
121Multi-valued extensions have a short form and a long form. The short form
122is a list of names and values:
123
124basicConstraints=critical,CA:true,pathlen:1
125
126The long form allows the values to be placed in a separate section:
127
128basicConstraints=critical,@bs_section
129
130[bs_section]
131
132CA=true
133pathlen=1
134
135Both forms are equivalent. However it should be noted that in some cases the
136same name can appear multiple times, for example,
137
138subjectAltName=email:steve@here,email:steve@there
139
140in this case an equivalent long form is:
141
142subjectAltName=@alt_section
143
144[alt_section]
145
146email.1=steve@here
147email.2=steve@there
148
149This is because the configuration file code cannot handle the same name
150occurring twice in the same section.
151
152The syntax of raw extensions is governed by the extension code: it can
153for example contain data in multiple sections. The correct syntax to
154use is defined by the extension code itself: check out the certificate
155policies extension for an example.
156
157In addition it is also possible to use the word DER to include arbitrary
158data in any extension.
159
1601.2.3.4=critical,DER:01:02:03:04
1611.2.3.4=DER:01020304
162
163The value following DER is a hex dump of the DER encoding of the extension
164Any extension can be placed in this form to override the default behaviour.
165For example:
166
167basicConstraints=critical,DER:00:01:02:03
168
169WARNING: DER should be used with caution. It is possible to create totally
170invalid extensions unless care is taken.
171
172CURRENTLY SUPPORTED EXTENSIONS.
173
174If you aren't sure about extensions then they can be largely ignored: its only
175when you want to do things like restrict certificate usage when you need to
176worry about them.
177
178The only extension that a beginner might want to look at is Basic Constraints.
179If in addition you want to try Netscape object signing the you should also
180look at Netscape Certificate Type.
181
182Literal String extensions.
183
184In each case the 'value' of the extension is placed directly in the
185extension. Currently supported extensions in this category are: nsBaseUrl,
186nsRevocationUrl, nsCaRevocationUrl, nsRenewalUrl, nsCaPolicyUrl,
187nsSslServerName and nsComment.
188
189For example:
190
191nsComment="This is a test comment"
192
193Bit Strings.
194
195Bit string extensions just consist of a list of supported bits, currently
196two extensions are in this category: PKIX keyUsage and the Netscape specific
197nsCertType.
198
199nsCertType (netscape certificate type) takes the flags: client, server, email,
200objsign, reserved, sslCA, emailCA, objCA.
201
202keyUsage (PKIX key usage) takes the flags: digitalSignature, nonRepudiation,
203keyEncipherment, dataEncipherment, keyAgreement, keyCertSign, cRLSign,
204encipherOnly, decipherOnly.
205
206For example:
207
208nsCertType=server
209
210keyUsage=digitalSignature, nonRepudiation
211
212Hints on Netscape Certificate Type.
213
214Other than Basic Constraints this is the only extension a beginner might
215want to use, if you want to try Netscape object signing, otherwise it can
216be ignored.
217
218If you want a certificate that can be used just for object signing then:
219
220nsCertType=objsign
221
222will do the job. If you want to use it as a normal end user and server
223certificate as well then
224
225nsCertType=objsign,email,server
226
227is more appropriate. You cannot use a self signed certificate for object
228signing (well Netscape signtool can but it cheats!) so you need to create
229a CA certificate and sign an end user certificate with it.
230
231Side note: If you want to conform to the Netscape specifications then you
232should really also set:
233
234nsCertType=objCA
235
236in the *CA* certificate for just an object signing CA and
237
238nsCertType=objCA,emailCA,sslCA
239
240for everything. Current Netscape software doesn't enforce this so it can
241be omitted.
242
243Basic Constraints.
244
245This is generally the only extension you need to worry about for simple
246applications. If you want your certificate to be usable as a CA certificate
247(in addition to an end user certificate) then you set this to:
248
249basicConstraints=CA:TRUE
250
251if you want to be certain the certificate cannot be used as a CA then do:
252
253basicConstraints=CA:FALSE
254
255The rest of this section describes more advanced usage.
256
257Basic constraints is a multi-valued extension that supports a CA and an
258optional pathlen option. The CA option takes the values true and false and
259pathlen takes an integer. Note if the CA option is false the pathlen option
260should be omitted.
261
262The pathlen parameter indicates the maximum number of CAs that can appear
263below this one in a chain. So if you have a CA with a pathlen of zero it can
264only be used to sign end user certificates and not further CAs. This all
265assumes that the software correctly interprets this extension of course.
266
267Examples:
268
269basicConstraints=CA:TRUE
270basicConstraints=critical,CA:TRUE, pathlen:0
271
272NOTE: for a CA to be considered valid it must have the CA option set to
273TRUE. An end user certificate MUST NOT have the CA value set to true.
274According to PKIX recommendations it should exclude the extension entirely,
275however some software may require CA set to FALSE for end entity certificates.
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
312Subject Key Identifier.
313
314This is really a string extension and can take two possible values. Either
315a hex string giving details of the extension value to include or the word
316'hash' which then automatically follow PKIX guidelines in selecting and
317appropriate key identifier. The use of the hex string is strongly discouraged.
318
319Example: subjectKeyIdentifier=hash
320
321Authority Key Identifier.
322
323The authority key identifier extension permits two options. keyid and issuer:
324both can take the optional value "always".
325
326If the keyid option is present an attempt is made to copy the subject key
327identifier from the parent certificate. If the value "always" is present
328then an error is returned if the option fails.
329
330The issuer option copies the issuer and serial number from the issuer
331certificate. Normally this will only be done if the keyid option fails or
332is not included: the "always" flag will always include the value.
333
334Subject Alternative Name.
335
336The subject alternative name extension allows various literal values to be
337included in the configuration file. These include "email" (an email address)
338"URI" a uniform resource indicator, "DNS" (a DNS domain name), RID (a
339registered ID: OBJECT IDENTIFIER) and IP (and IP address).
340
341Also the email option include a special 'copy' value. This will automatically
342include and email addresses contained in the certificate subject name in
343the extension.
344
345Examples:
346
347subjectAltName=email:copy,email:my@other.address,URI:http://my.url.here/
348subjectAltName=email:my@other.address,RID:1.2.3.4
349
350Issuer Alternative Name.
351
352The issuer alternative name option supports all the literal options of
353subject alternative name. It does *not* support the email:copy option because
354that would not make sense. It does support an additional issuer:copy option
355that will copy all the subject alternative name values from the issuer
356certificate (if possible).
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
376CRL distribution points.
377
378This is a multi-valued extension that supports all the literal options of
379subject alternative name. Of the few software packages that currently interpret
380this extension most only interpret the URI option.
381
382Currently each option will set a new DistributionPoint with the fullName
383field set to the given value.
384
385Other fields like cRLissuer and reasons cannot currently be set or displayed:
386at this time no examples were available that used these fields.
387
388If you see this extension with <UNSUPPORTED> when you attempt to print it out
389or it doesn't appear to display correctly then let me know, including the
390certificate (mail me at steve@openssl.org) .
391
392Examples:
393
394crlDistributionPoints=URI:http://www.myhost.com/myca.crl
395crlDistributionPoints=URI:http://www.my.com/my.crl,URI:http://www.oth.com/my.crl
396
397Certificate Policies.
398
399This is a RAW extension. It attempts to display the contents of this extension:
400unfortunately this extension is often improperly encoded.
401
402The certificate policies extension will rarely be used in practice: few
403software packages interpret it correctly or at all. IE5 does partially
404support this extension: but it needs the 'ia5org' option because it will
405only correctly support a broken encoding. Of the options below only the
406policy OID, explicitText and CPS options are displayed with IE5.
407
408All the fields of this extension can be set by using the appropriate syntax.
409
410If you follow the PKIX recommendations of not including any qualifiers and just
411using only one OID then you just include the value of that OID. Multiple OIDs
412can be set separated by commas, for example:
413
414certificatePolicies= 1.2.4.5, 1.1.3.4
415
416If you wish to include qualifiers then the policy OID and qualifiers need to
417be specified in a separate section: this is done by using the @section syntax
418instead of a literal OID value.
419
420The section referred to must include the policy OID using the name
421policyIdentifier, cPSuri qualifiers can be included using the syntax:
422
423CPS.nnn=value
424
425userNotice qualifiers can be set using the syntax:
426
427userNotice.nnn=@notice
428
429The value of the userNotice qualifier is specified in the relevant section.
430This section can include explicitText, organization and noticeNumbers
431options. explicitText and organization are text strings, noticeNumbers is a
432comma separated list of numbers. The organization and noticeNumbers options
433(if included) must BOTH be present. If you use the userNotice option with IE5
434then you need the 'ia5org' option at the top level to modify the encoding:
435otherwise it will not be interpreted properly.
436
437Example:
438
439certificatePolicies=ia5org,1.2.3.4,1.5.6.7.8,@polsect
440
441[polsect]
442
443policyIdentifier = 1.3.5.8
444CPS.1="http://my.host.name/"
445CPS.2="http://my.your.name/"
446userNotice.1=@notice
447
448[notice]
449
450explicitText="Explicit Text Here"
451organization="Organisation Name"
452noticeNumbers=1,2,3,4
453
454TECHNICAL NOTE: the ia5org option changes the type of the 'organization' field,
455according to PKIX it should be of type DisplayText but Verisign uses an
456IA5STRING and IE5 needs this too.
457
458Display only extensions.
459
460Some extensions are only partially supported and currently are only displayed
461but cannot be set. These include private key usage period, CRL number, and
462CRL reason.
463
464==============================================================================
465 X509V3 Extension code: programmers guide
466==============================================================================
467
468The purpose of the extension code is twofold. It allows an extension to be
469created from a string or structure describing its contents and it prints out an
470extension in a human or machine readable form.
471
4721. Initialisation and cleanup.
473
474No special initialisation is needed before calling the extension functions.
475You used to have to call X509V3_add_standard_extensions(); but this is no longer
476required and this function no longer does anything.
477
478void X509V3_EXT_cleanup(void);
479
480This function should be called to cleanup the extension code if any custom
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.
484
4852. Printing and parsing extensions.
486
487The simplest way to print out extensions is via the standard X509 printing
488routines: if you use the standard X509_print() function, the supported
489extensions will be printed out automatically.
490
491The following functions allow finer control over extension display:
492
493int X509V3_EXT_print(BIO *out, X509_EXTENSION *ext, int flag, int indent);
494int X509V3_EXT_print_fp(FILE *out, X509_EXTENSION *ext, int flag, int indent);
495
496These two functions print out an individual extension to a BIO or FILE pointer.
497Currently the flag argument is unused and should be set to 0. The 'indent'
498argument is the number of spaces to indent each line.
499
500void *X509V3_EXT_d2i(X509_EXTENSION *ext);
501
502This function parses an extension and returns its internal structure. The
503precise structure you get back depends on the extension being parsed. If the
504extension if basicConstraints you will get back a pointer to a
505BASIC_CONSTRAINTS structure. Check out the source in crypto/x509v3 for more
506details about the structures returned. The returned structure should be freed
507after use using the relevant free function, BASIC_CONSTRAINTS_free() for
508example.
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
5513. Generating extensions.
552
553An extension will typically be generated from a configuration file, or some
554other kind of configuration database.
555
556int X509V3_EXT_add_conf(LHASH *conf, X509V3_CTX *ctx, char *section,
557 X509 *cert);
558int X509V3_EXT_CRL_add_conf(LHASH *conf, X509V3_CTX *ctx, char *section,
559 X509_CRL *crl);
560
561These functions add all the extensions in the given section to the given
562certificate or CRL. They will normally be called just before the certificate
563or CRL is due to be signed. Both return 0 on error on non zero for success.
564
565In each case 'conf' is the LHASH pointer of the configuration file to use
566and 'section' is the section containing the extension details.
567
568See the 'context functions' section for a description of the ctx parameter.
569
570
571X509_EXTENSION *X509V3_EXT_conf(LHASH *conf, X509V3_CTX *ctx, char *name,
572 char *value);
573
574This function returns an extension based on a name and value pair, if the
575pair will not need to access other sections in a config file (or there is no
576config file) then the 'conf' parameter can be set to NULL.
577
578X509_EXTENSION *X509V3_EXT_conf_nid(char *conf, X509V3_CTX *ctx, int nid,
579 char *value);
580
581This function creates an extension in the same way as X509V3_EXT_conf() but
582takes the NID of the extension rather than its name.
583
584For example to produce basicConstraints with the CA flag and a path length of
58510:
586
587x = X509V3_EXT_conf_nid(NULL, NULL, NID_basic_constraints,"CA:TRUE,pathlen:10");
588
589
590X509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, void *ext_struc);
591
592This function sets up an extension from its internal structure. The ext_nid
593parameter is the NID of the extension and 'crit' is the critical flag.
594
5954. Context functions.
596
597The following functions set and manipulate an extension context structure.
598The purpose of the extension context is to allow the extension code to
599access various structures relating to the "environment" of the certificate:
600for example the issuers certificate or the certificate request.
601
602void X509V3_set_ctx(X509V3_CTX *ctx, X509 *issuer, X509 *subject,
603 X509_REQ *req, X509_CRL *crl, int flags);
604
605This function sets up an X509V3_CTX structure with details of the certificate
606environment: specifically the issuers certificate, the subject certificate,
607the certificate request and the CRL: if these are not relevant or not
608available then they can be set to NULL. The 'flags' parameter should be set
609to zero.
610
611X509V3_set_ctx_test(ctx)
612
613This macro is used to set the 'ctx' structure to a 'test' value: this is to
614allow the syntax of an extension (or configuration file) to be tested.
615
616X509V3_set_ctx_nodb(ctx)
617
618This macro is used when no configuration database is present.
619
620void X509V3_set_conf_lhash(X509V3_CTX *ctx, LHASH *lhash);
621
622This function is used to set the configuration database when it is an LHASH
623structure: typically a configuration file.
624
625The following functions are used to access a configuration database: they
626should only be used in RAW extensions.
627
628char * X509V3_get_string(X509V3_CTX *ctx, char *name, char *section);
629
630This function returns the value of the parameter "name" in "section", or NULL
631if there has been an error.
632
633void X509V3_string_free(X509V3_CTX *ctx, char *str);
634
635This function frees up the string returned by the above function.
636
637STACK_OF(CONF_VALUE) * X509V3_get_section(X509V3_CTX *ctx, char *section);
638
639This function returns a whole section as a STACK_OF(CONF_VALUE) .
640
641void X509V3_section_free( X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *section);
642
643This function frees up the STACK returned by the above function.
644
645Note: it is possible to use the extension code with a custom configuration
646database. To do this the "db_meth" element of the X509V3_CTX structure should
647be set to an X509V3_CTX_METHOD structure. This structure contains the following
648function pointers:
649
650char * (*get_string)(void *db, char *section, char *value);
651STACK_OF(CONF_VALUE) * (*get_section)(void *db, char *section);
652void (*free_string)(void *db, char * string);
653void (*free_section)(void *db, STACK_OF(CONF_VALUE) *section);
654
655these will be called and passed the 'db' element in the X509V3_CTX structure
656to access the database. If a given function is not implemented or not required
657it can be set to NULL.
658
6595. String helper functions.
660
661There are several "i2s" and "s2i" functions that convert structures to and
662from ASCII strings. In all the "i2s" cases the returned string should be
663freed using Free() after use. Since some of these are part of other extension
664code they may take a 'method' parameter. Unless otherwise stated it can be
665safely set to NULL.
666
667char *i2s_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, ASN1_OCTET_STRING *oct);
668
669This returns a hex string from an ASN1_OCTET_STRING.
670
671char * i2s_ASN1_INTEGER(X509V3_EXT_METHOD *meth, ASN1_INTEGER *aint);
672char * i2s_ASN1_ENUMERATED(X509V3_EXT_METHOD *meth, ASN1_ENUMERATED *aint);
673
674These return a string decimal representations of an ASN1_INTEGER and an
675ASN1_ENUMERATED type, respectively.
676
677ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method,
678 X509V3_CTX *ctx, char *str);
679
680This converts an ASCII hex string to an ASN1_OCTET_STRING.
681
682ASN1_INTEGER * s2i_ASN1_INTEGER(X509V3_EXT_METHOD *meth, char *value);
683
684This converts a decimal ASCII string into an ASN1_INTEGER.
685
6866. Multi valued extension helper functions.
687
688The following functions can be used to manipulate STACKs of CONF_VALUE
689structures, as used by multi valued extensions.
690
691int X509V3_get_value_bool(CONF_VALUE *value, int *asn1_bool);
692
693This function expects a boolean value in 'value' and sets 'asn1_bool' to
694it. That is it sets it to 0 for FALSE or 0xff for TRUE. The following
695strings are acceptable: "TRUE", "true", "Y", "y", "YES", "yes", "FALSE"
696"false", "N", "n", "NO" or "no".
697
698int X509V3_get_value_int(CONF_VALUE *value, ASN1_INTEGER **aint);
699
700This accepts a decimal integer of arbitrary length and sets an ASN1_INTEGER.
701
702int X509V3_add_value(const char *name, const char *value,
703 STACK_OF(CONF_VALUE) **extlist);
704
705This simply adds a string name and value pair.
706
707int X509V3_add_value_uchar(const char *name, const unsigned char *value,
708 STACK_OF(CONF_VALUE) **extlist);
709
710The same as above but for an unsigned character value.
711
712int X509V3_add_value_bool(const char *name, int asn1_bool,
713 STACK_OF(CONF_VALUE) **extlist);
714
715This adds either "TRUE" or "FALSE" depending on the value of 'asn1_bool'
716
717int X509V3_add_value_bool_nf(char *name, int asn1_bool,
718 STACK_OF(CONF_VALUE) **extlist);
719
720This is the same as above except it adds nothing if asn1_bool is FALSE.
721
722int X509V3_add_value_int(const char *name, ASN1_INTEGER *aint,
723 STACK_OF(CONF_VALUE) **extlist);
724
725This function adds the value of the ASN1_INTEGER in decimal form.
726
7277. Other helper functions.
728
729<to be added>
730
731ADDING CUSTOM EXTENSIONS.
732
733Currently there are three types of supported extensions.
734
735String extensions are simple strings where the value is placed directly in the
736extensions, and the string returned is printed out.
737
738Multi value extensions are passed a STACK_OF(CONF_VALUE) name and value pairs
739or return a STACK_OF(CONF_VALUE).
740
741Raw extensions are just passed a BIO or a value and it is the extensions
742responsibility to handle all the necessary printing.
743
744There are two ways to add an extension. One is simply as an alias to an already
745existing extension. An alias is an extension that is identical in ASN1 structure
746to an existing extension but has a different OBJECT IDENTIFIER. This can be
747done by calling:
748
749int X509V3_EXT_add_alias(int nid_to, int nid_from);
750
751'nid_to' is the new extension NID and 'nid_from' is the already existing
752extension NID.
753
754Alternatively an extension can be written from scratch. This involves writing
755the ASN1 code to encode and decode the extension and functions to print out and
756generate the extension from strings. The relevant functions are then placed in
757a X509V3_EXT_METHOD structure and int X509V3_EXT_add(X509V3_EXT_METHOD *ext);
758called.
759
760The X509V3_EXT_METHOD structure is described below.
761
762strut {
763int ext_nid;
764int ext_flags;
765X509V3_EXT_NEW ext_new;
766X509V3_EXT_FREE ext_free;
767X509V3_EXT_D2I d2i;
768X509V3_EXT_I2D i2d;
769X509V3_EXT_I2S i2s;
770X509V3_EXT_S2I s2i;
771X509V3_EXT_I2V i2v;
772X509V3_EXT_V2I v2i;
773X509V3_EXT_R2I r2i;
774X509V3_EXT_I2R i2r;
775
776void *usr_data;
777};
778
779The elements have the following meanings.
780
781ext_nid is the NID of the object identifier of the extension.
782
783ext_flags is set of flags. Currently the only external flag is
784 X509V3_EXT_MULTILINE which means a multi valued extensions
785 should be printed on separate lines.
786
787usr_data is an extension specific pointer to any relevant data. This
788 allows extensions to share identical code but have different
789 uses. An example of this is the bit string extension which uses
790 usr_data to contain a list of the bit names.
791
792All the remaining elements are function pointers.
793
794ext_new is a pointer to a function that allocates memory for the
795 extension ASN1 structure: for example ASN1_OBJECT_new().
796
797ext_free is a pointer to a function that free up memory of the extension
798 ASN1 structure: for example ASN1_OBJECT_free().
799
800d2i is the standard ASN1 function that converts a DER buffer into
801 the internal ASN1 structure: for example d2i_ASN1_IA5STRING().
802
803i2d is the standard ASN1 function that converts the internal
804 structure into the DER representation: for example
805 i2d_ASN1_IA5STRING().
806
807The remaining functions are depend on the type of extension. One i2X and
808one X2i should be set and the rest set to NULL. The types set do not need
809to match up, for example the extension could be set using the multi valued
810v2i function and printed out using the raw i2r.
811
812All functions have the X509V3_EXT_METHOD passed to them in the 'method'
813parameter and an X509V3_CTX structure. Extension code can then access the
814parent structure via the 'method' parameter to for example make use of the value
815of usr_data. If the code needs to use detail relating to the request it can
816use the 'ctx' parameter.
817
818A note should be given here about the 'flags' member of the 'ctx' parameter.
819If it has the value CTX_TEST then the configuration syntax is being checked
820and no actual certificate or CRL exists. Therefore any attempt in the config
821file to access such information should silently succeed. If the syntax is OK
822then it should simply return a (possibly bogus) extension, otherwise it
823should return NULL.
824
825char *i2s(struct v3_ext_method *method, void *ext);
826
827This function takes the internal structure in the ext parameter and returns
828a Malloc'ed string representing its value.
829
830void * s2i(struct v3_ext_method *method, struct v3_ext_ctx *ctx, char *str);
831
832This function takes the string representation in the ext parameter and returns
833an allocated internal structure: ext_free() will be used on this internal
834structure after use.
835
836i2v and v2i handle a STACK_OF(CONF_VALUE):
837
838typedef struct
839{
840 char *section;
841 char *name;
842 char *value;
843} CONF_VALUE;
844
845Only the name and value members are currently used.
846
847STACK_OF(CONF_VALUE) * i2v(struct v3_ext_method *method, void *ext);
848
849This function is passed the internal structure in the ext parameter and
850returns a STACK of CONF_VALUE structures. The values of name, value,
851section and the structure itself will be freed up with Free after use.
852Several helper functions are available to add values to this STACK.
853
854void * v2i(struct v3_ext_method *method, struct v3_ext_ctx *ctx,
855 STACK_OF(CONF_VALUE) *values);
856
857This function takes a STACK_OF(CONF_VALUE) structures and should set the
858values of the external structure. This typically uses the name element to
859determine which structure element to set and the value element to determine
860what to set it to. Several helper functions are available for this
861purpose (see above).
862
863int i2r(struct v3_ext_method *method, void *ext, BIO *out, int indent);
864
865This function is passed the internal extension structure in the ext parameter
866and sends out a human readable version of the extension to out. The 'indent'
867parameter should be noted to determine the necessary amount of indentation
868needed on the output.
869
870void * r2i(struct v3_ext_method *method, struct v3_ext_ctx *ctx, char *str);
871
872This is just passed the string representation of the extension. It is intended
873to be used for more elaborate extensions where the standard single and multi
874valued options are insufficient. They can use the 'ctx' parameter to parse the
875configuration database themselves. See the context functions section for details
876of how to do this.
877
878Note: although this type takes the same parameters as the "r2s" function there
879is a subtle difference. Whereas an "r2i" function can access a configuration
880database an "s2i" function MUST NOT. This is so the internal code can safely
881assume that an "s2i" function will work without a configuration database.
882
883==============================================================================
884 PKCS#12 Library
885==============================================================================
886
887This section describes the internal PKCS#12 support. There are very few
888differences between the old external library and the new internal code at
889present. This may well change because the external library will not be updated
890much in future.
891
892This version now includes a couple of high level PKCS#12 functions which
893generally "do the right thing" and should make it much easier to handle PKCS#12
894structures.
895
896HIGH LEVEL FUNCTIONS.
897
898For most applications you only need concern yourself with the high level
899functions. They can parse and generate simple PKCS#12 files as produced by
900Netscape and MSIE or indeed any compliant PKCS#12 file containing a single
901private key and certificate pair.
902
9031. Initialisation and cleanup.
904
905No special initialisation is needed for the internal PKCS#12 library: the
906standard SSLeay_add_all_algorithms() is sufficient. If you do not wish to
907add all algorithms (you should at least add SHA1 though) then you can manually
908initialise the PKCS#12 library with:
909
910PKCS12_PBE_add();
911
912The memory allocated by the PKCS#12 library is freed up when EVP_cleanup() is
913called or it can be directly freed with:
914
915EVP_PBE_cleanup();
916
917after this call (or EVP_cleanup() ) no more PKCS#12 library functions should
918be called.
919
9202. I/O functions.
921
922i2d_PKCS12_bio(bp, p12)
923
924This writes out a PKCS12 structure to a BIO.
925
926i2d_PKCS12_fp(fp, p12)
927
928This is the same but for a FILE pointer.
929
930d2i_PKCS12_bio(bp, p12)
931
932This reads in a PKCS12 structure from a BIO.
933
934d2i_PKCS12_fp(fp, p12)
935
936This is the same but for a FILE pointer.
937
9383. High level functions.
939
9403.1 Parsing with PKCS12_parse().
941
942int PKCS12_parse(PKCS12 *p12, char *pass, EVP_PKEY **pkey, X509 **cert,
943 STACK **ca);
944
945This function takes a PKCS12 structure and a password (ASCII, null terminated)
946and returns the private key, the corresponding certificate and any CA
947certificates. If any of these is not required it can be passed as a NULL.
948The 'ca' parameter should be either NULL, a pointer to NULL or a valid STACK
949structure. Typically to read in a PKCS#12 file you might do:
950
951p12 = d2i_PKCS12_fp(fp, NULL);
952PKCS12_parse(p12, password, &pkey, &cert, NULL); /* CAs not wanted */
953PKCS12_free(p12);
954
9553.2 PKCS#12 creation with PKCS12_create().
956
957PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert,
958 STACK *ca, int nid_key, int nid_cert, int iter,
959 int mac_iter, int keytype);
960
961This function will create a PKCS12 structure from a given password, name,
962private key, certificate and optional STACK of CA certificates. The remaining
9635 parameters can be set to 0 and sensible defaults will be used.
964
965The parameters nid_key and nid_cert are the key and certificate encryption
966algorithms, iter is the encryption iteration count, mac_iter is the MAC
967iteration count and keytype is the type of private key. If you really want
968to know what these last 5 parameters do then read the low level section.
969
970Typically to create a PKCS#12 file the following could be used:
971
972p12 = PKCS12_create(pass, "My Certificate", pkey, cert, NULL, 0,0,0,0,0);
973i2d_PKCS12_fp(fp, p12);
974PKCS12_free(p12);
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
984LOW LEVEL FUNCTIONS.
985
986In some cases the high level functions do not provide the necessary
987functionality. For example if you want to generate or parse more complex
988PKCS#12 files. The sample pkcs12 application uses the low level functions
989to display details about the internal structure of a PKCS#12 file.
990
991Introduction.
992
993This is a brief description of how a PKCS#12 file is represented internally:
994some knowledge of PKCS#12 is assumed.
995
996A PKCS#12 object contains several levels.
997
998At the lowest level is a PKCS12_SAFEBAG. This can contain a certificate, a
999CRL, a private key, encrypted or unencrypted, a set of safebags (so the
1000structure can be nested) or other secrets (not documented at present).
1001A safebag can optionally have attributes, currently these are: a unicode
1002friendlyName (a Unicode string) or a localKeyID (a string of bytes).
1003
1004At the next level is an authSafe which is a set of safebags collected into
1005a PKCS#7 ContentInfo. This can be just plain data, or encrypted itself.
1006
1007At the top level is the PKCS12 structure itself which contains a set of
1008authSafes in an embedded PKCS#7 Contentinfo of type data. In addition it
1009contains a MAC which is a kind of password protected digest to preserve
1010integrity (so any unencrypted stuff below can't be tampered with).
1011
1012The reason for these levels is so various objects can be encrypted in various
1013ways. For example you might want to encrypt a set of private keys with
1014triple-DES and then include the related certificates either unencrypted or
1015with lower encryption. Yes it's the dreaded crypto laws at work again which
1016allow strong encryption on private keys and only weak encryption on other
1017stuff.
1018
1019To build one of these things you turn all certificates and keys into safebags
1020(with optional attributes). You collect the safebags into (one or more) STACKS
1021and convert these into authsafes (encrypted or unencrypted). The authsafes
1022are collected into a STACK and added to a PKCS12 structure. Finally a MAC
1023inserted.
1024
1025Pulling one apart is basically the reverse process. The MAC is verified against
1026the given password. The authsafes are extracted and each authsafe split into
1027a set of safebags (possibly involving decryption). Finally the safebags are
1028decomposed into the original keys and certificates and the attributes used to
1029match up private key and certificate pairs.
1030
1031Anyway here are the functions that do the dirty work.
1032
10331. Construction functions.
1034
10351.1 Safebag functions.
1036
1037M_PKCS12_x5092certbag(x509)
1038
1039This macro takes an X509 structure and returns a certificate bag. The
1040X509 structure can be freed up after calling this function.
1041
1042M_PKCS12_x509crl2certbag(crl)
1043
1044As above but for a CRL.
1045
1046PKCS8_PRIV_KEY_INFO *PKEY2PKCS8(EVP_PKEY *pkey)
1047
1048Take a private key and convert it into a PKCS#8 PrivateKeyInfo structure.
1049Works for both RSA and DSA private keys. NB since the PKCS#8 PrivateKeyInfo
1050structure contains a private key data in plain text form it should be free'd
1051up as soon as it has been encrypted for security reasons (freeing up the
1052structure zeros out the sensitive data). This can be done with
1053PKCS8_PRIV_KEY_INFO_free().
1054
1055PKCS8_add_keyusage(PKCS8_PRIV_KEY_INFO *p8, int usage)
1056
1057This sets the key type when a key is imported into MSIE or Outlook 98. Two
1058values are currently supported: KEY_EX and KEY_SIG. KEY_EX is an exchange type
1059key that can also be used for signing but its size is limited in the export
1060versions of MS software to 512 bits, it is also the default. KEY_SIG is a
1061signing only key but the keysize is unlimited (well 16K is supposed to work).
1062If you are using the domestic version of MSIE then you can ignore this because
1063KEY_EX is not limited and can be used for both.
1064
1065PKCS12_SAFEBAG *PKCS12_MAKE_KEYBAG(PKCS8_PRIV_KEY_INFO *p8)
1066
1067Convert a PKCS8 private key structure into a keybag. This routine embeds the
1068p8 structure in the keybag so p8 should not be freed up or used after it is
1069called. The p8 structure will be freed up when the safebag is freed.
1070
1071PKCS12_SAFEBAG *PKCS12_MAKE_SHKEYBAG(int pbe_nid, unsigned char *pass, int passlen, unsigned char *salt, int saltlen, int iter, PKCS8_PRIV_KEY_INFO *p8)
1072
1073Convert a PKCS#8 structure into a shrouded key bag (encrypted). p8 is not
1074embedded and can be freed up after use.
1075
1076int PKCS12_add_localkeyid(PKCS12_SAFEBAG *bag, unsigned char *name, int namelen)
1077int PKCS12_add_friendlyname(PKCS12_SAFEBAG *bag, unsigned char *name, int namelen)
1078
1079Add a local key id or a friendlyname to a safebag.
1080
10811.2 Authsafe functions.
1082
1083PKCS7 *PKCS12_pack_p7data(STACK *sk)
1084Take a stack of safebags and convert them into an unencrypted authsafe. The
1085stack of safebags can be freed up after calling this function.
1086
1087PKCS7 *PKCS12_pack_p7encdata(int pbe_nid, unsigned char *pass, int passlen, unsigned char *salt, int saltlen, int iter, STACK *bags);
1088
1089As above but encrypted.
1090
10911.3 PKCS12 functions.
1092
1093PKCS12 *PKCS12_init(int mode)
1094
1095Initialise a PKCS12 structure (currently mode should be NID_pkcs7_data).
1096
1097M_PKCS12_pack_authsafes(p12, safes)
1098
1099This macro takes a STACK of authsafes and adds them to a PKCS#12 structure.
1100
1101int PKCS12_set_mac(PKCS12 *p12, unsigned char *pass, int passlen, unsigned char *salt, int saltlen, int iter, EVP_MD *md_type);
1102
1103Add a MAC to a PKCS12 structure. If EVP_MD is NULL use SHA-1, the spec suggests
1104that SHA-1 should be used.
1105
11062. Extraction Functions.
1107
11082.1 Safebags.
1109
1110M_PKCS12_bag_type(bag)
1111
1112Return the type of "bag". Returns one of the following
1113
1114NID_keyBag
1115NID_pkcs8ShroudedKeyBag 7
1116NID_certBag 8
1117NID_crlBag 9
1118NID_secretBag 10
1119NID_safeContentsBag 11
1120
1121M_PKCS12_cert_bag_type(bag)
1122
1123Returns type of certificate bag, following are understood.
1124
1125NID_x509Certificate 14
1126NID_sdsiCertificate 15
1127
1128M_PKCS12_crl_bag_type(bag)
1129
1130Returns crl bag type, currently only NID_crlBag is recognised.
1131
1132M_PKCS12_certbag2x509(bag)
1133
1134This macro extracts an X509 certificate from a certificate bag.
1135
1136M_PKCS12_certbag2x509crl(bag)
1137
1138As above but for a CRL.
1139
1140EVP_PKEY * PKCS82PKEY(PKCS8_PRIV_KEY_INFO *p8)
1141
1142Extract a private key from a PKCS8 private key info structure.
1143
1144M_PKCS12_decrypt_skey(bag, pass, passlen)
1145
1146Decrypt a shrouded key bag and return a PKCS8 private key info structure.
1147Works with both RSA and DSA keys
1148
1149char *PKCS12_get_friendlyname(bag)
1150
1151Returns the friendlyName of a bag if present or NULL if none. The returned
1152string is a null terminated ASCII string allocated with Malloc(). It should
1153thus be freed up with Free() after use.
1154
11552.2 AuthSafe functions.
1156
1157M_PKCS12_unpack_p7data(p7)
1158
1159Extract a STACK of safe bags from a PKCS#7 data ContentInfo.
1160
1161#define M_PKCS12_unpack_p7encdata(p7, pass, passlen)
1162
1163As above but for an encrypted content info.
1164
11652.3 PKCS12 functions.
1166
1167M_PKCS12_unpack_authsafes(p12)
1168
1169Extract a STACK of authsafes from a PKCS12 structure.
1170
1171M_PKCS12_mac_present(p12)
1172
1173Check to see if a MAC is present.
1174
1175int PKCS12_verify_mac(PKCS12 *p12, unsigned char *pass, int passlen)
1176
1177Verify a MAC on a PKCS12 structure. Returns an error if MAC not present.
1178
1179
1180Notes.
1181
11821. All the function return 0 or NULL on error.
11832. Encryption based functions take a common set of parameters. These are
1184described below.
1185
1186pass, passlen
1187ASCII password and length. The password on the MAC is called the "integrity
1188password" the encryption password is called the "privacy password" in the
1189PKCS#12 documentation. The passwords do not have to be the same. If -1 is
1190passed for the length it is worked out by the function itself (currently
1191this is sometimes done whatever is passed as the length but that may change).
1192
1193salt, saltlen
1194A 'salt' if salt is NULL a random salt is used. If saltlen is also zero a
1195default length is used.
1196
1197iter
1198Iteration count. This is a measure of how many times an internal function is
1199called to encrypt the data. The larger this value is the longer it takes, it
1200makes dictionary attacks on passwords harder. NOTE: Some implementations do
1201not support an iteration count on the MAC. If the password for the MAC and
1202encryption is the same then there is no point in having a high iteration
1203count for encryption if the MAC has no count. The MAC could be attacked
1204and the password used for the main decryption.
1205
1206pbe_nid
1207This is the NID of the password based encryption method used. The following are
1208supported.
1209NID_pbe_WithSHA1And128BitRC4
1210NID_pbe_WithSHA1And40BitRC4
1211NID_pbe_WithSHA1And3_Key_TripleDES_CBC
1212NID_pbe_WithSHA1And2_Key_TripleDES_CBC
1213NID_pbe_WithSHA1And128BitRC2_CBC
1214NID_pbe_WithSHA1And40BitRC2_CBC
1215
1216Which you use depends on the implementation you are exporting to. "Export
1217grade" (i.e. cryptographically challenged) products cannot support all
1218algorithms. Typically you may be able to use any encryption on shrouded key
1219bags but they must then be placed in an unencrypted authsafe. Other authsafes
1220may only support 40bit encryption. Of course if you are using SSLeay
1221throughout you can strongly encrypt everything and have high iteration counts
1222on everything.
1223
12243. For decryption routines only the password and length are needed.
1225
12264. Unlike the external version the nid's of objects are the values of the
1227constants: that is NID_certBag is the real nid, therefore there is no
1228PKCS12_obj_offset() function. Note the object constants are not the same as
1229those of the external version. If you use these constants then you will need
1230to recompile your code.
1231
12325. With the exception of PKCS12_MAKE_KEYBAG(), after calling any function or
1233macro of the form PKCS12_MAKE_SOMETHING(other) the "other" structure can be
1234reused or freed up safely.
1235
diff --git a/src/lib/libssl/doc/standards.txt b/src/lib/libssl/doc/standards.txt
deleted file mode 100644
index 596d9001e6..0000000000
--- a/src/lib/libssl/doc/standards.txt
+++ /dev/null
@@ -1,130 +0,0 @@
1Standards related to OpenSSL
2============================
3
4[Please, this is currently a draft. I made a first try at finding
5 documents that describe parts of what OpenSSL implements. There are
6 big gaps, and I've most certainly done something wrong. Please
7 correct whatever is... Also, this note should be removed when this
8 file is reaching a somewhat correct state. -- Richard Levitte]
9
10
11All pointers in here will be either URL's or blobs of text borrowed
12from miscellaneous indexes, like rfc-index.txt (index of RFCs),
131id-index.txt (index of Internet drafts) and the like.
14
15To find the latest possible RFCs, it's recommended to either browse
16ftp://ftp.isi.edu/in-notes/ or go to http://www.rfc-editor.org/ and
17use the search mechanism found there.
18To find the latest possible Internet drafts, it's recommended to
19browse ftp://ftp.isi.edu/internet-drafts/.
20To find the latest possible PKCS, it's recommended to browse
21http://www.rsasecurity.com/rsalabs/pkcs/.
22
23
24Implemented:
25------------
26
27These are documents that describe things that are implemented (in
28whole or at least great parts) in OpenSSL.
29
301319 The MD2 Message-Digest Algorithm. B. Kaliski. April 1992.
31 (Format: TXT=25661 bytes) (Status: INFORMATIONAL)
32
331320 The MD4 Message-Digest Algorithm. R. Rivest. April 1992. (Format:
34 TXT=32407 bytes) (Status: INFORMATIONAL)
35
361321 The MD5 Message-Digest Algorithm. R. Rivest. April 1992. (Format:
37 TXT=35222 bytes) (Status: INFORMATIONAL)
38
392246 The TLS Protocol Version 1.0. T. Dierks, C. Allen. January 1999.
40 (Format: TXT=170401 bytes) (Status: PROPOSED STANDARD)
41
422268 A Description of the RC2(r) Encryption Algorithm. R. Rivest.
43 January 1998. (Format: TXT=19048 bytes) (Status: INFORMATIONAL)
44
452314 PKCS 10: Certification Request Syntax Version 1.5. B. Kaliski.
46 March 1998. (Format: TXT=15814 bytes) (Status: INFORMATIONAL)
47
482315 PKCS 7: Cryptographic Message Syntax Version 1.5. B. Kaliski.
49 March 1998. (Format: TXT=69679 bytes) (Status: INFORMATIONAL)
50
512437 PKCS #1: RSA Cryptography Specifications Version 2.0. B. Kaliski,
52 J. Staddon. October 1998. (Format: TXT=73529 bytes) (Obsoletes
53 RFC2313) (Status: INFORMATIONAL)
54
552459 Internet X.509 Public Key Infrastructure Certificate and CRL
56 Profile. R. Housley, W. Ford, W. Polk, D. Solo. January 1999.
57 (Format: TXT=278438 bytes) (Status: PROPOSED STANDARD)
58
59PKCS#8: Private-Key Information Syntax Standard
60
61PKCS#12: Personal Information Exchange Syntax Standard, version 1.0.
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
68
69Related:
70--------
71
72These are documents that are close to OpenSSL, for example the
73STARTTLS documents.
74
751421 Privacy Enhancement for Internet Electronic Mail: Part I: Message
76 Encryption and Authentication Procedures. J. Linn. February 1993.
77 (Format: TXT=103894 bytes) (Obsoletes RFC1113) (Status: PROPOSED
78 STANDARD)
79
801422 Privacy Enhancement for Internet Electronic Mail: Part II:
81 Certificate-Based Key Management. S. Kent. February 1993. (Format:
82 TXT=86085 bytes) (Obsoletes RFC1114) (Status: PROPOSED STANDARD)
83
841423 Privacy Enhancement for Internet Electronic Mail: Part III:
85 Algorithms, Modes, and Identifiers. D. Balenson. February 1993.
86 (Format: TXT=33277 bytes) (Obsoletes RFC1115) (Status: PROPOSED
87 STANDARD)
88
891424 Privacy Enhancement for Internet Electronic Mail: Part IV: Key
90 Certification and Related Services. B. Kaliski. February 1993.
91 (Format: TXT=17537 bytes) (Status: PROPOSED STANDARD)
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
972487 SMTP Service Extension for Secure SMTP over TLS. P. Hoffman.
98 January 1999. (Format: TXT=15120 bytes) (Status: PROPOSED STANDARD)
99
1002585 Internet X.509 Public Key Infrastructure Operational Protocols:
101 FTP and HTTP. R. Housley, P. Hoffman. May 1999. (Format: TXT=14813
102 bytes) (Status: PROPOSED STANDARD)
103
1042595 Using TLS with IMAP, POP3 and ACAP. C. Newman. June 1999.
105 (Format: TXT=32440 bytes) (Status: PROPOSED STANDARD)
106
1072712 Addition of Kerberos Cipher Suites to Transport Layer Security
108 (TLS). A. Medvinsky, M. Hur. October 1999. (Format: TXT=13763 bytes)
109 (Status: PROPOSED STANDARD)
110
1112817 Upgrading to TLS Within HTTP/1.1. R. Khare, S. Lawrence. May
112 2000. (Format: TXT=27598 bytes) (Updates RFC2616) (Status: PROPOSED
113 STANDARD)
114
1152818 HTTP Over TLS. E. Rescorla. May 2000. (Format: TXT=15170 bytes)
116 (Status: INFORMATIONAL)
117
118 "Securing FTP with TLS", 01/27/2000, <draft-murray-auth-ftp-ssl-05.txt>
119
120
121To be implemented:
122------------------
123
124These are documents that describe things that are planed to be
125implemented in the hopefully short future.
126
1272712 Addition of Kerberos Cipher Suites to Transport Layer Security
128 (TLS). A. Medvinsky, M. Hur. October 1999. (Format: TXT=13763 bytes)
129 (Status: PROPOSED STANDARD)
130
diff --git a/src/lib/libssl/s23_clnt.c b/src/lib/libssl/s23_clnt.c
deleted file mode 100644
index 019e9aecee..0000000000
--- a/src/lib/libssl/s23_clnt.c
+++ /dev/null
@@ -1,480 +0,0 @@
1/* ssl/s23_clnt.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include "ssl_locl.h"
61#include <openssl/buffer.h>
62#include <openssl/rand.h>
63#include <openssl/objects.h>
64#include <openssl/evp.h>
65
66static SSL_METHOD *ssl23_get_client_method(int ver);
67static int ssl23_client_hello(SSL *s);
68static int ssl23_get_server_hello(SSL *s);
69static SSL_METHOD *ssl23_get_client_method(int ver)
70 {
71#ifndef OPENSSL_NO_SSL2
72 if (ver == SSL2_VERSION)
73 return(SSLv2_client_method());
74#endif
75 if (ver == SSL3_VERSION)
76 return(SSLv3_client_method());
77 else if (ver == TLS1_VERSION)
78 return(TLSv1_client_method());
79 else
80 return(NULL);
81 }
82
83SSL_METHOD *SSLv23_client_method(void)
84 {
85 static int init=1;
86 static SSL_METHOD SSLv23_client_data;
87
88 if (init)
89 {
90 memcpy((char *)&SSLv23_client_data,
91 (char *)sslv23_base_method(),sizeof(SSL_METHOD));
92 SSLv23_client_data.ssl_connect=ssl23_connect;
93 SSLv23_client_data.get_ssl_method=ssl23_get_client_method;
94 init=0;
95 }
96 return(&SSLv23_client_data);
97 }
98
99int ssl23_connect(SSL *s)
100 {
101 BUF_MEM *buf;
102 unsigned long Time=time(NULL);
103 void (*cb)(const SSL *ssl,int type,int val)=NULL;
104 int ret= -1;
105 int new_state,state;
106
107 RAND_add(&Time,sizeof(Time),0);
108 ERR_clear_error();
109 clear_sys_error();
110
111 if (s->info_callback != NULL)
112 cb=s->info_callback;
113 else if (s->ctx->info_callback != NULL)
114 cb=s->ctx->info_callback;
115
116 s->in_handshake++;
117 if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
118
119 for (;;)
120 {
121 state=s->state;
122
123 switch(s->state)
124 {
125 case SSL_ST_BEFORE:
126 case SSL_ST_CONNECT:
127 case SSL_ST_BEFORE|SSL_ST_CONNECT:
128 case SSL_ST_OK|SSL_ST_CONNECT:
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);
138
139 /* s->version=TLS1_VERSION; */
140 s->type=SSL_ST_CONNECT;
141
142 if (s->init_buf == NULL)
143 {
144 if ((buf=BUF_MEM_new()) == NULL)
145 {
146 ret= -1;
147 goto end;
148 }
149 if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
150 {
151 ret= -1;
152 goto end;
153 }
154 s->init_buf=buf;
155 }
156
157 if (!ssl3_setup_buffers(s)) { ret= -1; goto end; }
158
159 ssl3_init_finished_mac(s);
160
161 s->state=SSL23_ST_CW_CLNT_HELLO_A;
162 s->ctx->stats.sess_connect++;
163 s->init_num=0;
164 break;
165
166 case SSL23_ST_CW_CLNT_HELLO_A:
167 case SSL23_ST_CW_CLNT_HELLO_B:
168
169 s->shutdown=0;
170 ret=ssl23_client_hello(s);
171 if (ret <= 0) goto end;
172 s->state=SSL23_ST_CR_SRVR_HELLO_A;
173 s->init_num=0;
174
175 break;
176
177 case SSL23_ST_CR_SRVR_HELLO_A:
178 case SSL23_ST_CR_SRVR_HELLO_B:
179 ret=ssl23_get_server_hello(s);
180 if (ret >= 0) cb=NULL;
181 goto end;
182 /* break; */
183
184 default:
185 SSLerr(SSL_F_SSL23_CONNECT,SSL_R_UNKNOWN_STATE);
186 ret= -1;
187 goto end;
188 /* break; */
189 }
190
191 if (s->debug) { (void)BIO_flush(s->wbio); }
192
193 if ((cb != NULL) && (s->state != state))
194 {
195 new_state=s->state;
196 s->state=state;
197 cb(s,SSL_CB_CONNECT_LOOP,1);
198 s->state=new_state;
199 }
200 }
201end:
202 s->in_handshake--;
203 if (cb != NULL)
204 cb(s,SSL_CB_CONNECT_EXIT,ret);
205 return(ret);
206 }
207
208
209static int ssl23_client_hello(SSL *s)
210 {
211 unsigned char *buf;
212 unsigned char *p,*d;
213 int i,ch_len;
214 int ret;
215
216 buf=(unsigned char *)s->init_buf->data;
217 if (s->state == SSL23_ST_CW_CLNT_HELLO_A)
218 {
219#if 0
220 /* don't reuse session-id's */
221 if (!ssl_get_new_session(s,0))
222 {
223 return(-1);
224 }
225#endif
226
227 p=s->s3->client_random;
228 RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE);
229
230 /* Do the message type and length last */
231 d= &(buf[2]);
232 p=d+9;
233
234 *(d++)=SSL2_MT_CLIENT_HELLO;
235 if (!(s->options & SSL_OP_NO_TLSv1))
236 {
237 *(d++)=TLS1_VERSION_MAJOR;
238 *(d++)=TLS1_VERSION_MINOR;
239 s->client_version=TLS1_VERSION;
240 }
241 else if (!(s->options & SSL_OP_NO_SSLv3))
242 {
243 *(d++)=SSL3_VERSION_MAJOR;
244 *(d++)=SSL3_VERSION_MINOR;
245 s->client_version=SSL3_VERSION;
246 }
247 else if (!(s->options & SSL_OP_NO_SSLv2))
248 {
249 *(d++)=SSL2_VERSION_MAJOR;
250 *(d++)=SSL2_VERSION_MINOR;
251 s->client_version=SSL2_VERSION;
252 }
253 else
254 {
255 SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_NO_PROTOCOLS_AVAILABLE);
256 return(-1);
257 }
258
259 /* Ciphers supported */
260 i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),p);
261 if (i == 0)
262 {
263 /* no ciphers */
264 SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE);
265 return(-1);
266 }
267 s2n(i,d);
268 p+=i;
269
270 /* put in the session-id, zero since there is no
271 * reuse. */
272#if 0
273 s->session->session_id_length=0;
274#endif
275 s2n(0,d);
276
277 if (s->options & SSL_OP_NETSCAPE_CHALLENGE_BUG)
278 ch_len=SSL2_CHALLENGE_LENGTH;
279 else
280 ch_len=SSL2_MAX_CHALLENGE_LENGTH;
281
282 /* write out sslv2 challenge */
283 if (SSL3_RANDOM_SIZE < ch_len)
284 i=SSL3_RANDOM_SIZE;
285 else
286 i=ch_len;
287 s2n(i,d);
288 memset(&(s->s3->client_random[0]),0,SSL3_RANDOM_SIZE);
289 RAND_pseudo_bytes(&(s->s3->client_random[SSL3_RANDOM_SIZE-i]),i);
290 memcpy(p,&(s->s3->client_random[SSL3_RANDOM_SIZE-i]),i);
291 p+=i;
292
293 i= p- &(buf[2]);
294 buf[0]=((i>>8)&0xff)|0x80;
295 buf[1]=(i&0xff);
296
297 s->state=SSL23_ST_CW_CLNT_HELLO_B;
298 /* number of bytes to write */
299 s->init_num=i+2;
300 s->init_off=0;
301
302 ssl3_finish_mac(s,&(buf[2]),i);
303 }
304
305 /* SSL3_ST_CW_CLNT_HELLO_B */
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;
311 }
312
313static int ssl23_get_server_hello(SSL *s)
314 {
315 char buf[8];
316 unsigned char *p;
317 int i;
318 int n;
319
320 n=ssl23_read_bytes(s,7);
321
322 if (n != 7) return(n);
323 p=s->packet;
324
325 memcpy(buf,p,n);
326
327 if ((p[0] & 0x80) && (p[2] == SSL2_MT_SERVER_HELLO) &&
328 (p[5] == 0x00) && (p[6] == 0x02))
329 {
330#ifdef OPENSSL_NO_SSL2
331 SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_PROTOCOL);
332 goto err;
333#else
334 /* we are talking sslv2 */
335 /* we need to clean up the SSLv3 setup and put in the
336 * sslv2 stuff. */
337 int ch_len;
338
339 if (s->options & SSL_OP_NO_SSLv2)
340 {
341 SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_PROTOCOL);
342 goto err;
343 }
344 if (s->s2 == NULL)
345 {
346 if (!ssl2_new(s))
347 goto err;
348 }
349 else
350 ssl2_clear(s);
351
352 if (s->options & SSL_OP_NETSCAPE_CHALLENGE_BUG)
353 ch_len=SSL2_CHALLENGE_LENGTH;
354 else
355 ch_len=SSL2_MAX_CHALLENGE_LENGTH;
356
357 /* write out sslv2 challenge */
358 i=(SSL3_RANDOM_SIZE < ch_len)
359 ?SSL3_RANDOM_SIZE:ch_len;
360 s->s2->challenge_length=i;
361 memcpy(s->s2->challenge,
362 &(s->s3->client_random[SSL3_RANDOM_SIZE-i]),i);
363
364 if (s->s3 != NULL) ssl3_free(s);
365
366 if (!BUF_MEM_grow(s->init_buf,
367 SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER))
368 {
369 SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,ERR_R_BUF_LIB);
370 goto err;
371 }
372
373 s->state=SSL2_ST_GET_SERVER_HELLO_A;
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;
377
378 /* setup the 5 bytes we have read so we get them from
379 * the sslv2 buffer */
380 s->rstate=SSL_ST_READ_HEADER;
381 s->packet_length=n;
382 s->packet= &(s->s2->rbuf[0]);
383 memcpy(s->packet,buf,n);
384 s->s2->rbuf_left=n;
385 s->s2->rbuf_offs=0;
386
387 /* we have already written one */
388 s->s2->write_sequence=1;
389
390 s->method=SSLv2_client_method();
391 s->handshake_func=s->method->ssl_connect;
392#endif
393 }
394 else if ((p[0] == SSL3_RT_HANDSHAKE) &&
395 (p[1] == SSL3_VERSION_MAJOR) &&
396 ((p[2] == SSL3_VERSION_MINOR) ||
397 (p[2] == TLS1_VERSION_MINOR)) &&
398 (p[5] == SSL3_MT_SERVER_HELLO))
399 {
400 /* we have sslv3 or tls1 */
401
402 if (!ssl_init_wbio_buffer(s,1)) goto err;
403
404 /* we are in this state */
405 s->state=SSL3_ST_CR_SRVR_HELLO_A;
406
407 /* put the 5 bytes we have read into the input buffer
408 * for SSLv3 */
409 s->rstate=SSL_ST_READ_HEADER;
410 s->packet_length=n;
411 s->packet= &(s->s3->rbuf.buf[0]);
412 memcpy(s->packet,buf,n);
413 s->s3->rbuf.left=n;
414 s->s3->rbuf.offset=0;
415
416 if ((p[2] == SSL3_VERSION_MINOR) &&
417 !(s->options & SSL_OP_NO_SSLv3))
418 {
419 s->version=SSL3_VERSION;
420 s->method=SSLv3_client_method();
421 }
422 else if ((p[2] == TLS1_VERSION_MINOR) &&
423 !(s->options & SSL_OP_NO_TLSv1))
424 {
425 s->version=TLS1_VERSION;
426 s->method=TLSv1_client_method();
427 }
428 else
429 {
430 SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_PROTOCOL);
431 goto err;
432 }
433
434 s->handshake_func=s->method->ssl_connect;
435 }
436 else if ((p[0] == SSL3_RT_ALERT) &&
437 (p[1] == SSL3_VERSION_MAJOR) &&
438 ((p[2] == SSL3_VERSION_MINOR) ||
439 (p[2] == TLS1_VERSION_MINOR)) &&
440 (p[3] == 0) &&
441 (p[4] == 2))
442 {
443 void (*cb)(const SSL *ssl,int type,int val)=NULL;
444 int j;
445
446 /* An alert */
447 if (s->info_callback != NULL)
448 cb=s->info_callback;
449 else if (s->ctx->info_callback != NULL)
450 cb=s->ctx->info_callback;
451
452 i=p[5];
453 if (cb != NULL)
454 {
455 j=(i<<8)|p[6];
456 cb(s,SSL_CB_READ_ALERT,j);
457 }
458
459 s->rwstate=SSL_NOTHING;
460 SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_AD_REASON_OFFSET+p[6]);
461 goto err;
462 }
463 else
464 {
465 SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_UNKNOWN_PROTOCOL);
466 goto err;
467 }
468 s->init_num=0;
469
470 /* Since, if we are sending a ssl23 client hello, we are not
471 * reusing a session-id */
472 if (!ssl_get_new_session(s,0))
473 goto err;
474
475 s->first_packet=1;
476 return(SSL_connect(s));
477err:
478 return(-1);
479 }
480
diff --git a/src/lib/libssl/s23_lib.c b/src/lib/libssl/s23_lib.c
deleted file mode 100644
index b70002a647..0000000000
--- a/src/lib/libssl/s23_lib.c
+++ /dev/null
@@ -1,236 +0,0 @@
1/* ssl/s23_lib.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include <openssl/objects.h>
61#include "ssl_locl.h"
62
63static int ssl23_num_ciphers(void );
64static SSL_CIPHER *ssl23_get_cipher(unsigned int u);
65static int ssl23_read(SSL *s, void *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 );
69static int ssl23_put_cipher_by_char(const SSL_CIPHER *c, unsigned char *p);
70static SSL_CIPHER *ssl23_get_cipher_by_char(const unsigned char *p);
71const char *SSL23_version_str="SSLv2/3 compatibility" OPENSSL_VERSION_PTEXT;
72
73static SSL_METHOD SSLv23_data= {
74 TLS1_VERSION,
75 tls1_new,
76 tls1_clear,
77 tls1_free,
78 ssl_undefined_function,
79 ssl_undefined_function,
80 ssl23_read,
81 ssl23_peek,
82 ssl23_write,
83 ssl_undefined_function,
84 ssl_undefined_function,
85 ssl_ok,
86 ssl3_ctrl,
87 ssl3_ctx_ctrl,
88 ssl23_get_cipher_by_char,
89 ssl23_put_cipher_by_char,
90 ssl_undefined_function,
91 ssl23_num_ciphers,
92 ssl23_get_cipher,
93 ssl_bad_method,
94 ssl23_default_timeout,
95 &ssl3_undef_enc_method,
96 ssl_undefined_function,
97 ssl3_callback_ctrl,
98 ssl3_ctx_callback_ctrl,
99 };
100
101static long ssl23_default_timeout(void)
102 {
103 return(300);
104 }
105
106SSL_METHOD *sslv23_base_method(void)
107 {
108 return(&SSLv23_data);
109 }
110
111static int ssl23_num_ciphers(void)
112 {
113 return(ssl3_num_ciphers()
114#ifndef OPENSSL_NO_SSL2
115 + ssl2_num_ciphers()
116#endif
117 );
118 }
119
120static SSL_CIPHER *ssl23_get_cipher(unsigned int u)
121 {
122 unsigned int uu=ssl3_num_ciphers();
123
124 if (u < uu)
125 return(ssl3_get_cipher(u));
126 else
127#ifndef OPENSSL_NO_SSL2
128 return(ssl2_get_cipher(u-uu));
129#else
130 return(NULL);
131#endif
132 }
133
134/* This function needs to check if the ciphers required are actually
135 * available */
136static SSL_CIPHER *ssl23_get_cipher_by_char(const unsigned char *p)
137 {
138 SSL_CIPHER c,*cp;
139 unsigned long id;
140 int n;
141
142 n=ssl3_num_ciphers();
143 id=0x03000000|((unsigned long)p[0]<<16L)|
144 ((unsigned long)p[1]<<8L)|(unsigned long)p[2];
145 c.id=id;
146 cp=ssl3_get_cipher_by_char(p);
147#ifndef OPENSSL_NO_SSL2
148 if (cp == NULL)
149 cp=ssl2_get_cipher_by_char(p);
150#endif
151 return(cp);
152 }
153
154static int ssl23_put_cipher_by_char(const SSL_CIPHER *c, unsigned char *p)
155 {
156 long l;
157
158 /* We can write SSLv2 and SSLv3 ciphers */
159 if (p != NULL)
160 {
161 l=c->id;
162 p[0]=((unsigned char)(l>>16L))&0xFF;
163 p[1]=((unsigned char)(l>> 8L))&0xFF;
164 p[2]=((unsigned char)(l ))&0xFF;
165 }
166 return(3);
167 }
168
169static int ssl23_read(SSL *s, void *buf, int len)
170 {
171 int n;
172
173 clear_sys_error();
174 if (SSL_in_init(s) && (!s->in_handshake))
175 {
176 n=s->handshake_func(s);
177 if (n < 0) return(n);
178 if (n == 0)
179 {
180 SSLerr(SSL_F_SSL23_READ,SSL_R_SSL_HANDSHAKE_FAILURE);
181 return(-1);
182 }
183 return(SSL_read(s,buf,len));
184 }
185 else
186 {
187 ssl_undefined_function(s);
188 return(-1);
189 }
190 }
191
192static int ssl23_peek(SSL *s, void *buf, int len)
193 {
194 int n;
195
196 clear_sys_error();
197 if (SSL_in_init(s) && (!s->in_handshake))
198 {
199 n=s->handshake_func(s);
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));
207 }
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
219 clear_sys_error();
220 if (SSL_in_init(s) && (!s->in_handshake))
221 {
222 n=s->handshake_func(s);
223 if (n < 0) return(n);
224 if (n == 0)
225 {
226 SSLerr(SSL_F_SSL23_WRITE,SSL_R_SSL_HANDSHAKE_FAILURE);
227 return(-1);
228 }
229 return(SSL_write(s,buf,len));
230 }
231 else
232 {
233 ssl_undefined_function(s);
234 return(-1);
235 }
236 }
diff --git a/src/lib/libssl/s23_pkt.c b/src/lib/libssl/s23_pkt.c
deleted file mode 100644
index 4ca6a1b258..0000000000
--- a/src/lib/libssl/s23_pkt.c
+++ /dev/null
@@ -1,117 +0,0 @@
1/* ssl/s23_pkt.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include <errno.h>
61#define USE_SOCKETS
62#include "ssl_locl.h"
63#include <openssl/evp.h>
64#include <openssl/buffer.h>
65
66int ssl23_write_bytes(SSL *s)
67 {
68 int i,num,tot;
69 char *buf;
70
71 buf=s->init_buf->data;
72 tot=s->init_off;
73 num=s->init_num;
74 for (;;)
75 {
76 s->rwstate=SSL_WRITING;
77 i=BIO_write(s->wbio,&(buf[tot]),num);
78 if (i <= 0)
79 {
80 s->init_off=tot;
81 s->init_num=num;
82 return(i);
83 }
84 s->rwstate=SSL_NOTHING;
85 if (i == num) return(tot+i);
86
87 num-=i;
88 tot+=i;
89 }
90 }
91
92/* return regularly only when we have read (at least) 'n' bytes */
93int ssl23_read_bytes(SSL *s, int n)
94 {
95 unsigned char *p;
96 int j;
97
98 if (s->packet_length < (unsigned int)n)
99 {
100 p=s->packet;
101
102 for (;;)
103 {
104 s->rwstate=SSL_READING;
105 j=BIO_read(s->rbio,(char *)&(p[s->packet_length]),
106 n-s->packet_length);
107 if (j <= 0)
108 return(j);
109 s->rwstate=SSL_NOTHING;
110 s->packet_length+=j;
111 if (s->packet_length >= (unsigned int)n)
112 return(s->packet_length);
113 }
114 }
115 return(n);
116 }
117
diff --git a/src/lib/libssl/s23_srvr.c b/src/lib/libssl/s23_srvr.c
deleted file mode 100644
index 8743b61cbb..0000000000
--- a/src/lib/libssl/s23_srvr.c
+++ /dev/null
@@ -1,589 +0,0 @@
1/* ssl/s23_srvr.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58/* ====================================================================
59 * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved.
60 *
61 * Redistribution and use in source and binary forms, with or without
62 * modification, are permitted provided that the following conditions
63 * are met:
64 *
65 * 1. Redistributions of source code must retain the above copyright
66 * notice, this list of conditions and the following disclaimer.
67 *
68 * 2. Redistributions in binary form must reproduce the above copyright
69 * notice, this list of conditions and the following disclaimer in
70 * the documentation and/or other materials provided with the
71 * distribution.
72 *
73 * 3. All advertising materials mentioning features or use of this
74 * software must display the following acknowledgment:
75 * "This product includes software developed by the OpenSSL Project
76 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77 *
78 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79 * endorse or promote products derived from this software without
80 * prior written permission. For written permission, please contact
81 * openssl-core@openssl.org.
82 *
83 * 5. Products derived from this software may not be called "OpenSSL"
84 * nor may "OpenSSL" appear in their names without prior written
85 * permission of the OpenSSL Project.
86 *
87 * 6. Redistributions of any form whatsoever must retain the following
88 * acknowledgment:
89 * "This product includes software developed by the OpenSSL Project
90 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91 *
92 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
96 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103 * OF THE POSSIBILITY OF SUCH DAMAGE.
104 * ====================================================================
105 *
106 * This product includes cryptographic software written by Eric Young
107 * (eay@cryptsoft.com). This product includes software written by Tim
108 * Hudson (tjh@cryptsoft.com).
109 *
110 */
111
112#include <stdio.h>
113#include "ssl_locl.h"
114#include <openssl/buffer.h>
115#include <openssl/rand.h>
116#include <openssl/objects.h>
117#include <openssl/evp.h>
118
119static SSL_METHOD *ssl23_get_server_method(int ver);
120int ssl23_get_client_hello(SSL *s);
121static SSL_METHOD *ssl23_get_server_method(int ver)
122 {
123#ifndef OPENSSL_NO_SSL2
124 if (ver == SSL2_VERSION)
125 return(SSLv2_server_method());
126#endif
127 if (ver == SSL3_VERSION)
128 return(SSLv3_server_method());
129 else if (ver == TLS1_VERSION)
130 return(TLSv1_server_method());
131 else
132 return(NULL);
133 }
134
135SSL_METHOD *SSLv23_server_method(void)
136 {
137 static int init=1;
138 static SSL_METHOD SSLv23_server_data;
139
140 if (init)
141 {
142 memcpy((char *)&SSLv23_server_data,
143 (char *)sslv23_base_method(),sizeof(SSL_METHOD));
144 SSLv23_server_data.ssl_accept=ssl23_accept;
145 SSLv23_server_data.get_ssl_method=ssl23_get_server_method;
146 init=0;
147 }
148 return(&SSLv23_server_data);
149 }
150
151int ssl23_accept(SSL *s)
152 {
153 BUF_MEM *buf;
154 unsigned long Time=time(NULL);
155 void (*cb)(const SSL *ssl,int type,int val)=NULL;
156 int ret= -1;
157 int new_state,state;
158
159 RAND_add(&Time,sizeof(Time),0);
160 ERR_clear_error();
161 clear_sys_error();
162
163 if (s->info_callback != NULL)
164 cb=s->info_callback;
165 else if (s->ctx->info_callback != NULL)
166 cb=s->ctx->info_callback;
167
168 s->in_handshake++;
169 if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
170
171 for (;;)
172 {
173 state=s->state;
174
175 switch(s->state)
176 {
177 case SSL_ST_BEFORE:
178 case SSL_ST_ACCEPT:
179 case SSL_ST_BEFORE|SSL_ST_ACCEPT:
180 case SSL_ST_OK|SSL_ST_ACCEPT:
181
182 s->server=1;
183 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
184
185 /* s->version=SSL3_VERSION; */
186 s->type=SSL_ST_ACCEPT;
187
188 if (s->init_buf == NULL)
189 {
190 if ((buf=BUF_MEM_new()) == NULL)
191 {
192 ret= -1;
193 goto end;
194 }
195 if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
196 {
197 ret= -1;
198 goto end;
199 }
200 s->init_buf=buf;
201 }
202
203 ssl3_init_finished_mac(s);
204
205 s->state=SSL23_ST_SR_CLNT_HELLO_A;
206 s->ctx->stats.sess_accept++;
207 s->init_num=0;
208 break;
209
210 case SSL23_ST_SR_CLNT_HELLO_A:
211 case SSL23_ST_SR_CLNT_HELLO_B:
212
213 s->shutdown=0;
214 ret=ssl23_get_client_hello(s);
215 if (ret >= 0) cb=NULL;
216 goto end;
217 /* break; */
218
219 default:
220 SSLerr(SSL_F_SSL23_ACCEPT,SSL_R_UNKNOWN_STATE);
221 ret= -1;
222 goto end;
223 /* break; */
224 }
225
226 if ((cb != NULL) && (s->state != state))
227 {
228 new_state=s->state;
229 s->state=state;
230 cb(s,SSL_CB_ACCEPT_LOOP,1);
231 s->state=new_state;
232 }
233 }
234end:
235 s->in_handshake--;
236 if (cb != NULL)
237 cb(s,SSL_CB_ACCEPT_EXIT,ret);
238 return(ret);
239 }
240
241
242int ssl23_get_client_hello(SSL *s)
243 {
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 */
257 char *buf= &(buf_space[0]);
258 unsigned char *p,*d,*d_len,*dd;
259 unsigned int i;
260 unsigned int csl,sil,cl;
261 int n=0,j;
262 int type=0;
263 int v[2];
264#ifndef OPENSSL_NO_RSA
265 int use_sslv2_strong=0;
266#endif
267
268 if (s->state == SSL23_ST_SR_CLNT_HELLO_A)
269 {
270 /* read the initial header */
271 v[0]=v[1]=0;
272
273 if (!ssl3_setup_buffers(s)) goto err;
274
275 n=ssl23_read_bytes(s, sizeof buf_space);
276 if (n != sizeof buf_space) return(n); /* n == -1 || n == 0 */
277
278 p=s->packet;
279
280 memcpy(buf,p,n);
281
282 if ((p[0] & 0x80) && (p[2] == SSL2_MT_CLIENT_HELLO))
283 {
284 /*
285 * SSLv2 header
286 */
287 if ((p[3] == 0x00) && (p[4] == 0x02))
288 {
289 v[0]=p[3]; v[1]=p[4];
290 /* SSLv2 */
291 if (!(s->options & SSL_OP_NO_SSLv2))
292 type=1;
293 }
294 else if (p[3] == SSL3_VERSION_MAJOR)
295 {
296 v[0]=p[3]; v[1]=p[4];
297 /* SSLv3/TLSv1 */
298 if (p[4] >= TLS1_VERSION_MINOR)
299 {
300 if (!(s->options & SSL_OP_NO_TLSv1))
301 {
302 s->version=TLS1_VERSION;
303 /* type=2; */ /* done later to survive restarts */
304 s->state=SSL23_ST_SR_CLNT_HELLO_B;
305 }
306 else if (!(s->options & SSL_OP_NO_SSLv3))
307 {
308 s->version=SSL3_VERSION;
309 /* type=2; */
310 s->state=SSL23_ST_SR_CLNT_HELLO_B;
311 }
312 else if (!(s->options & SSL_OP_NO_SSLv2))
313 {
314 type=1;
315 }
316 }
317 else if (!(s->options & SSL_OP_NO_SSLv3))
318 {
319 s->version=SSL3_VERSION;
320 /* type=2; */
321 s->state=SSL23_ST_SR_CLNT_HELLO_B;
322 }
323 else if (!(s->options & SSL_OP_NO_SSLv2))
324 type=1;
325
326 }
327 }
328 else if ((p[0] == SSL3_RT_HANDSHAKE) &&
329 (p[1] == SSL3_VERSION_MAJOR) &&
330 (p[5] == SSL3_MT_CLIENT_HELLO) &&
331 ((p[3] == 0 && p[4] < 5 /* silly record length? */)
332 || (p[9] == p[1])))
333 {
334 /*
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)
359 {
360 if (!(s->options & SSL_OP_NO_TLSv1))
361 {
362 s->version=TLS1_VERSION;
363 type=3;
364 }
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;
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 }
386 }
387 }
388 else if ((strncmp("GET ", (char *)p,4) == 0) ||
389 (strncmp("POST ",(char *)p,5) == 0) ||
390 (strncmp("HEAD ",(char *)p,5) == 0) ||
391 (strncmp("PUT ", (char *)p,4) == 0))
392 {
393 SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_HTTP_REQUEST);
394 goto err;
395 }
396 else if (strncmp("CONNECT",(char *)p,7) == 0)
397 {
398 SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_HTTPS_PROXY_REQUEST);
399 goto err;
400 }
401 }
402
403 if (s->state == SSL23_ST_SR_CLNT_HELLO_B)
404 {
405 /* we have SSLv3/TLSv1 in an SSLv2 header
406 * (other cases skip this state) */
407
408 type=2;
409 p=s->packet;
410 v[0] = p[3]; /* == SSL3_VERSION_MAJOR */
411 v[1] = p[4];
412
413 n=((p[0]&0x7f)<<8)|p[1];
414 if (n > (1024*4))
415 {
416 SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_RECORD_TOO_LARGE);
417 goto err;
418 }
419
420 j=ssl23_read_bytes(s,n+2);
421 if (j <= 0) return(j);
422
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 */
426
427 p=s->packet;
428 p+=5;
429 n2s(p,csl);
430 n2s(p,sil);
431 n2s(p,cl);
432 d=(unsigned char *)s->init_buf->data;
433 if ((csl+sil+cl+11) != s->packet_length)
434 {
435 SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_RECORD_LENGTH_MISMATCH);
436 goto err;
437 }
438
439 /* record header: msg_type ... */
440 *(d++) = SSL3_MT_CLIENT_HELLO;
441 /* ... and length (actual value will be written later) */
442 d_len = d;
443 d += 3;
444
445 /* client_version */
446 *(d++) = SSL3_VERSION_MAJOR; /* == v[0] */
447 *(d++) = v[1];
448
449 /* lets populate the random area */
450 /* get the challenge_length */
451 i=(cl > SSL3_RANDOM_SIZE)?SSL3_RANDOM_SIZE:cl;
452 memset(d,0,SSL3_RANDOM_SIZE);
453 memcpy(&(d[SSL3_RANDOM_SIZE-i]),&(p[csl+sil]),i);
454 d+=SSL3_RANDOM_SIZE;
455
456 /* no session-id reuse */
457 *(d++)=0;
458
459 /* ciphers */
460 j=0;
461 dd=d;
462 d+=2;
463 for (i=0; i<csl; i+=3)
464 {
465 if (p[i] != 0) continue;
466 *(d++)=p[i+1];
467 *(d++)=p[i+2];
468 j+=2;
469 }
470 s2n(j,dd);
471
472 /* COMPRESSION */
473 *(d++)=1;
474 *(d++)=0;
475
476 i = (d-(unsigned char *)s->init_buf->data) - 4;
477 l2n3((long)i, d_len);
478
479 /* get the data reused from the init_buf */
480 s->s3->tmp.reuse_message=1;
481 s->s3->tmp.message_type=SSL3_MT_CLIENT_HELLO;
482 s->s3->tmp.message_size=i;
483 }
484
485 /* imaginary new state (for program structure): */
486 /* s->state = SSL23_SR_CLNT_HELLO_C */
487
488 if (type == 1)
489 {
490#ifdef OPENSSL_NO_SSL2
491 SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_UNSUPPORTED_PROTOCOL);
492 goto err;
493#else
494 /* we are talking sslv2 */
495 /* we need to clean up the SSLv3/TLSv1 setup and put in the
496 * sslv2 stuff. */
497
498 if (s->s2 == NULL)
499 {
500 if (!ssl2_new(s))
501 goto err;
502 }
503 else
504 ssl2_clear(s);
505
506 if (s->s3 != NULL) ssl3_free(s);
507
508 if (!BUF_MEM_grow(s->init_buf,
509 SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER))
510 {
511 goto err;
512 }
513
514 s->state=SSL2_ST_GET_CLIENT_HELLO_A;
515 if ((s->options & SSL_OP_MSIE_SSLV2_RSA_PADDING) ||
516 use_sslv2_strong ||
517 (s->options & SSL_OP_NO_TLSv1 && s->options & SSL_OP_NO_SSLv3))
518 s->s2->ssl2_rollback=0;
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) */
522 s->s2->ssl2_rollback=1;
523
524 /* setup the n bytes we have read so we get them from
525 * the sslv2 buffer */
526 s->rstate=SSL_ST_READ_HEADER;
527 s->packet_length=n;
528 s->packet= &(s->s2->rbuf[0]);
529 memcpy(s->packet,buf,n);
530 s->s2->rbuf_left=n;
531 s->s2->rbuf_offs=0;
532
533 s->method=SSLv2_server_method();
534 s->handshake_func=s->method->ssl_accept;
535#endif
536 }
537
538 if ((type == 2) || (type == 3))
539 {
540 /* we have SSLv3/TLSv1 (type 2: SSL2 style, type 3: SSL3/TLS style) */
541
542 if (!ssl_init_wbio_buffer(s,1)) goto err;
543
544 /* we are in this state */
545 s->state=SSL3_ST_SR_CLNT_HELLO_A;
546
547 if (type == 3)
548 {
549 /* put the 'n' bytes we have read into the input buffer
550 * for SSLv3 */
551 s->rstate=SSL_ST_READ_HEADER;
552 s->packet_length=n;
553 s->packet= &(s->s3->rbuf.buf[0]);
554 memcpy(s->packet,buf,n);
555 s->s3->rbuf.left=n;
556 s->s3->rbuf.offset=0;
557 }
558 else
559 {
560 s->packet_length=0;
561 s->s3->rbuf.left=0;
562 s->s3->rbuf.offset=0;
563 }
564
565 if (s->version == TLS1_VERSION)
566 s->method = TLSv1_server_method();
567 else
568 s->method = SSLv3_server_method();
569#if 0 /* ssl3_get_client_hello does this */
570 s->client_version=(v[0]<<8)|v[1];
571#endif
572 s->handshake_func=s->method->ssl_accept;
573 }
574
575 if ((type < 1) || (type > 3))
576 {
577 /* bad, very bad */
578 SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_UNKNOWN_PROTOCOL);
579 goto err;
580 }
581 s->init_num=0;
582
583 if (buf != buf_space) OPENSSL_free(buf);
584 s->first_packet=1;
585 return(SSL_accept(s));
586err:
587 if (buf != buf_space) OPENSSL_free(buf);
588 return(-1);
589 }
diff --git a/src/lib/libssl/s3_both.c b/src/lib/libssl/s3_both.c
deleted file mode 100644
index 8864366f59..0000000000
--- a/src/lib/libssl/s3_both.c
+++ /dev/null
@@ -1,624 +0,0 @@
1/* ssl/s3_both.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58/* ====================================================================
59 * 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 */
111
112#include <limits.h>
113#include <string.h>
114#include <stdio.h>
115#include "ssl_locl.h"
116#include <openssl/buffer.h>
117#include <openssl/rand.h>
118#include <openssl/objects.h>
119#include <openssl/evp.h>
120#include <openssl/x509.h>
121
122/* send s->init_buf in records of type 'type' (SSL3_RT_HANDSHAKE or SSL3_RT_CHANGE_CIPHER_SPEC) */
123int ssl3_do_write(SSL *s, int type)
124 {
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 }
145
146int ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen)
147 {
148 unsigned char *p,*d;
149 int i;
150 unsigned long l;
151
152 if (s->state == a)
153 {
154 d=(unsigned char *)s->init_buf->data;
155 p= &(d[4]);
156
157 i=s->method->ssl3_enc->final_finish_mac(s,
158 &(s->s3->finish_dgst1),
159 &(s->s3->finish_dgst2),
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);
163 p+=i;
164 l=i;
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
173 *(d++)=SSL3_MT_FINISHED;
174 l2n3(l,d);
175 s->init_num=(int)l+4;
176 s->init_off=0;
177
178 s->state=b;
179 }
180
181 /* SSL3_ST_SEND_xxxxxx_HELLO_B */
182 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
183 }
184
185int ssl3_get_finished(SSL *s, int a, int b)
186 {
187 int al,i,ok;
188 long n;
189 unsigned char *p;
190
191 /* the mac has already been generated when we received the
192 * change cipher spec message and is in s->s3->tmp.peer_finish_md
193 */
194
195 n=ssl3_get_message(s,
196 a,
197 b,
198 SSL3_MT_FINISHED,
199 64, /* should actually be 36+4 :-) */
200 &ok);
201
202 if (!ok) return((int)n);
203
204 /* If this occurs, we have missed a message */
205 if (!s->s3->change_cipher_spec)
206 {
207 al=SSL_AD_UNEXPECTED_MESSAGE;
208 SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_GOT_A_FIN_BEFORE_A_CCS);
209 goto f_err;
210 }
211 s->s3->change_cipher_spec=0;
212
213 p = (unsigned char *)s->init_msg;
214 i = s->s3->tmp.peer_finish_md_len;
215
216 if (i != n)
217 {
218 al=SSL_AD_DECODE_ERROR;
219 SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_BAD_DIGEST_LENGTH);
220 goto f_err;
221 }
222
223 if (memcmp(p, s->s3->tmp.peer_finish_md, i) != 0)
224 {
225 al=SSL_AD_DECRYPT_ERROR;
226 SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_DIGEST_CHECK_FAILED);
227 goto f_err;
228 }
229
230 return(1);
231f_err:
232 ssl3_send_alert(s,SSL3_AL_FATAL,al);
233 return(0);
234 }
235
236/* for these 2 messages, we need to
237 * ssl->enc_read_ctx re-init
238 * ssl->s3->read_sequence zero
239 * ssl->s3->read_mac_secret re-init
240 * ssl->session->read_sym_enc assign
241 * ssl->session->read_compression assign
242 * ssl->session->read_hash assign
243 */
244int ssl3_send_change_cipher_spec(SSL *s, int a, int b)
245 {
246 unsigned char *p;
247
248 if (s->state == a)
249 {
250 p=(unsigned char *)s->init_buf->data;
251 *p=SSL3_MT_CCS;
252 s->init_num=1;
253 s->init_off=0;
254
255 s->state=b;
256 }
257
258 /* SSL3_ST_CW_CHANGE_B */
259 return(ssl3_do_write(s,SSL3_RT_CHANGE_CIPHER_SPEC));
260 }
261
262unsigned long ssl3_output_cert_chain(SSL *s, X509 *x)
263 {
264 unsigned char *p;
265 int n,i;
266 unsigned long l=7;
267 BUF_MEM *buf;
268 X509_STORE_CTX xs_ctx;
269 X509_OBJECT obj;
270
271 /* TLSv1 sends a chain with nothing in it, instead of an alert */
272 buf=s->init_buf;
273 if (!BUF_MEM_grow(buf,(int)(10)))
274 {
275 SSLerr(SSL_F_SSL3_OUTPUT_CERT_CHAIN,ERR_R_BUF_LIB);
276 return(0);
277 }
278 if (x != NULL)
279 {
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 }
285
286 for (;;)
287 {
288 n=i2d_X509(x,NULL);
289 if (!BUF_MEM_grow(buf,(int)(n+l+3)))
290 {
291 SSLerr(SSL_F_SSL3_OUTPUT_CERT_CHAIN,ERR_R_BUF_LIB);
292 return(0);
293 }
294 p=(unsigned char *)&(buf->data[l]);
295 l2n3(n,p);
296 i2d_X509(x,&p);
297 l+=n+3;
298 if (X509_NAME_cmp(X509_get_subject_name(x),
299 X509_get_issuer_name(x)) == 0) break;
300
301 i=X509_STORE_get_by_subject(&xs_ctx,X509_LU_X509,
302 X509_get_issuer_name(x),&obj);
303 if (i <= 0) break;
304 x=obj.data.x509;
305 /* Count is one too high since the X509_STORE_get uped the
306 * ref count */
307 X509_free(x);
308 }
309
310 X509_STORE_CTX_cleanup(&xs_ctx);
311 }
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
330 l-=7;
331 p=(unsigned char *)&(buf->data[4]);
332 l2n3(l,p);
333 l+=3;
334 p=(unsigned char *)&(buf->data[0]);
335 *(p++)=SSL3_MT_CERTIFICATE;
336 l2n3(l,p);
337 l+=4;
338 return(l);
339 }
340
341/* Obtain handshake message of message type 'mt' (any if mt == -1),
342 * maximum acceptable body length 'max'.
343 * The first four bytes (msg_type and length) are read in state 'st1',
344 * the body is read in state 'stn'.
345 */
346long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok)
347 {
348 unsigned char *p;
349 unsigned long l;
350 long n;
351 int i,al;
352
353 if (s->s3->tmp.reuse_message)
354 {
355 s->s3->tmp.reuse_message=0;
356 if ((mt >= 0) && (s->s3->tmp.message_type != mt))
357 {
358 al=SSL_AD_UNEXPECTED_MESSAGE;
359 SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_UNEXPECTED_MESSAGE);
360 goto f_err;
361 }
362 *ok=1;
363 s->init_msg = s->init_buf->data + 4;
364 s->init_num = (int)s->s3->tmp.message_size;
365 return s->init_num;
366 }
367
368 p=(unsigned char *)s->init_buf->data;
369
370 if (s->state == st1) /* s->init_num < 4 */
371 {
372 int skip_message;
373
374 do
375 {
376 while (s->init_num < 4)
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 }
404 }
405 while (skip_message);
406
407 /* s->init_num == 4 */
408
409 if ((mt >= 0) && (*p != mt))
410 {
411 al=SSL_AD_UNEXPECTED_MESSAGE;
412 SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_UNEXPECTED_MESSAGE);
413 goto f_err;
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
427 s->s3->tmp.message_type= *(p++);
428
429 n2l3(p,l);
430 if (l > (unsigned long)max)
431 {
432 al=SSL_AD_ILLEGAL_PARAMETER;
433 SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_EXCESSIVE_MESSAGE_SIZE);
434 goto f_err;
435 }
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))
443 {
444 SSLerr(SSL_F_SSL3_GET_MESSAGE,ERR_R_BUF_LIB);
445 goto err;
446 }
447 s->s3->tmp.message_size=l;
448 s->state=stn;
449
450 s->init_msg = s->init_buf->data + 4;
451 s->init_num = 0;
452 }
453
454 /* next state (stn) */
455 p = s->init_msg;
456 n = s->s3->tmp.message_size - s->init_num;
457 while (n > 0)
458 {
459 i=ssl3_read_bytes(s,SSL3_RT_HANDSHAKE,&p[s->init_num],n,0);
460 if (i <= 0)
461 {
462 s->rwstate=SSL_READING;
463 *ok = 0;
464 return i;
465 }
466 s->init_num += i;
467 n -= i;
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);
472 *ok=1;
473 return s->init_num;
474f_err:
475 ssl3_send_alert(s,SSL3_AL_FATAL,al);
476err:
477 *ok=0;
478 return(-1);
479 }
480
481int ssl_cert_type(X509 *x, EVP_PKEY *pkey)
482 {
483 EVP_PKEY *pk;
484 int ret= -1,i,j;
485
486 if (pkey == NULL)
487 pk=X509_get_pubkey(x);
488 else
489 pk=pkey;
490 if (pk == NULL) goto err;
491
492 i=pk->type;
493 if (i == EVP_PKEY_RSA)
494 {
495 ret=SSL_PKEY_RSA_ENC;
496 if (x != NULL)
497 {
498 j=X509_get_ext_count(x);
499 /* check to see if this is a signing only certificate */
500 /* EAY EAY EAY EAY */
501 }
502 }
503 else if (i == EVP_PKEY_DSA)
504 {
505 ret=SSL_PKEY_DSA_SIGN;
506 }
507 else if (i == EVP_PKEY_DH)
508 {
509 /* if we just have a key, we needs to be guess */
510
511 if (x == NULL)
512 ret=SSL_PKEY_DH_DSA;
513 else
514 {
515 j=X509_get_signature_type(x);
516 if (j == EVP_PKEY_RSA)
517 ret=SSL_PKEY_DH_RSA;
518 else if (j== EVP_PKEY_DSA)
519 ret=SSL_PKEY_DH_DSA;
520 else ret= -1;
521 }
522 }
523 else
524 ret= -1;
525
526err:
527 if(!pkey) EVP_PKEY_free(pk);
528 return(ret);
529 }
530
531int ssl_verify_alarm_type(long type)
532 {
533 int al;
534
535 switch(type)
536 {
537 case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
538 case X509_V_ERR_UNABLE_TO_GET_CRL:
539 case X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER:
540 al=SSL_AD_UNKNOWN_CA;
541 break;
542 case X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE:
543 case X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE:
544 case X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY:
545 case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
546 case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
547 case X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD:
548 case X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD:
549 case X509_V_ERR_CERT_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:
553 al=SSL_AD_BAD_CERTIFICATE;
554 break;
555 case X509_V_ERR_CERT_SIGNATURE_FAILURE:
556 case X509_V_ERR_CRL_SIGNATURE_FAILURE:
557 al=SSL_AD_DECRYPT_ERROR;
558 break;
559 case X509_V_ERR_CERT_HAS_EXPIRED:
560 case X509_V_ERR_CRL_HAS_EXPIRED:
561 al=SSL_AD_CERTIFICATE_EXPIRED;
562 break;
563 case X509_V_ERR_CERT_REVOKED:
564 al=SSL_AD_CERTIFICATE_REVOKED;
565 break;
566 case X509_V_ERR_OUT_OF_MEM:
567 al=SSL_AD_INTERNAL_ERROR;
568 break;
569 case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
570 case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:
571 case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
572 case X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE:
573 case X509_V_ERR_CERT_CHAIN_TOO_LONG:
574 case X509_V_ERR_PATH_LENGTH_EXCEEDED:
575 case X509_V_ERR_INVALID_CA:
576 al=SSL_AD_UNKNOWN_CA;
577 break;
578 case X509_V_ERR_APPLICATION_VERIFICATION:
579 al=SSL_AD_HANDSHAKE_FAILURE;
580 break;
581 case X509_V_ERR_INVALID_PURPOSE:
582 al=SSL_AD_UNSUPPORTED_CERTIFICATE;
583 break;
584 default:
585 al=SSL_AD_CERTIFICATE_UNKNOWN;
586 break;
587 }
588 return(al);
589 }
590
591int ssl3_setup_buffers(SSL *s)
592 {
593 unsigned char *p;
594 unsigned int extra;
595 size_t len;
596
597 if (s->s3->rbuf.buf == NULL)
598 {
599 if (s->options & SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER)
600 extra=SSL3_RT_MAX_EXTRA;
601 else
602 extra=0;
603 len = SSL3_RT_MAX_PACKET_SIZE + extra;
604 if ((p=OPENSSL_malloc(len)) == NULL)
605 goto err;
606 s->s3->rbuf.buf = p;
607 s->s3->rbuf.len = len;
608 }
609
610 if (s->s3->wbuf.buf == NULL)
611 {
612 len = SSL3_RT_MAX_PACKET_SIZE;
613 len += SSL3_RT_HEADER_LENGTH + 256; /* extra space for empty fragment */
614 if ((p=OPENSSL_malloc(len)) == NULL)
615 goto err;
616 s->s3->wbuf.buf = p;
617 s->s3->wbuf.len = len;
618 }
619 s->packet= &(s->s3->rbuf.buf[0]);
620 return(1);
621err:
622 SSLerr(SSL_F_SSL3_SETUP_BUFFERS,ERR_R_MALLOC_FAILURE);
623 return(0);
624 }
diff --git a/src/lib/libssl/s3_clnt.c b/src/lib/libssl/s3_clnt.c
deleted file mode 100644
index 7da9363ef5..0000000000
--- a/src/lib/libssl/s3_clnt.c
+++ /dev/null
@@ -1,1963 +0,0 @@
1/* ssl/s3_clnt.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58/* ====================================================================
59 * Copyright (c) 1998-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 */
111
112#include <stdio.h>
113#include "ssl_locl.h"
114#include "kssl_lcl.h"
115#include <openssl/buffer.h>
116#include <openssl/rand.h>
117#include <openssl/objects.h>
118#include <openssl/evp.h>
119#include <openssl/md5.h>
120
121static SSL_METHOD *ssl3_get_client_method(int ver);
122static int ssl3_client_hello(SSL *s);
123static int ssl3_get_server_hello(SSL *s);
124static int ssl3_get_certificate_request(SSL *s);
125static int ca_dn_cmp(const X509_NAME * const *a,const X509_NAME * const *b);
126static int ssl3_get_server_done(SSL *s);
127static int ssl3_send_client_verify(SSL *s);
128static int ssl3_send_client_certificate(SSL *s);
129static int ssl3_send_client_key_exchange(SSL *s);
130static int ssl3_get_key_exchange(SSL *s);
131static int ssl3_get_server_certificate(SSL *s);
132static int ssl3_check_cert_and_algorithm(SSL *s);
133static SSL_METHOD *ssl3_get_client_method(int ver)
134 {
135 if (ver == SSL3_VERSION)
136 return(SSLv3_client_method());
137 else
138 return(NULL);
139 }
140
141SSL_METHOD *SSLv3_client_method(void)
142 {
143 static int init=1;
144 static SSL_METHOD SSLv3_client_data;
145
146 if (init)
147 {
148 init=0;
149 memcpy((char *)&SSLv3_client_data,(char *)sslv3_base_method(),
150 sizeof(SSL_METHOD));
151 SSLv3_client_data.ssl_connect=ssl3_connect;
152 SSLv3_client_data.get_ssl_method=ssl3_get_client_method;
153 }
154 return(&SSLv3_client_data);
155 }
156
157int ssl3_connect(SSL *s)
158 {
159 BUF_MEM *buf;
160 unsigned long Time=time(NULL),l;
161 long num1;
162 void (*cb)(const SSL *ssl,int type,int val)=NULL;
163 int ret= -1;
164 int new_state,state,skip=0;;
165
166 RAND_add(&Time,sizeof(Time),0);
167 ERR_clear_error();
168 clear_sys_error();
169
170 if (s->info_callback != NULL)
171 cb=s->info_callback;
172 else if (s->ctx->info_callback != NULL)
173 cb=s->ctx->info_callback;
174
175 s->in_handshake++;
176 if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
177
178 for (;;)
179 {
180 state=s->state;
181
182 switch(s->state)
183 {
184 case SSL_ST_RENEGOTIATE:
185 s->new_session=1;
186 s->state=SSL_ST_CONNECT;
187 s->ctx->stats.sess_connect_renegotiate++;
188 /* break */
189 case SSL_ST_BEFORE:
190 case SSL_ST_CONNECT:
191 case SSL_ST_BEFORE|SSL_ST_CONNECT:
192 case SSL_ST_OK|SSL_ST_CONNECT:
193
194 s->server=0;
195 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
196
197 if ((s->version & 0xff00 ) != 0x0300)
198 {
199 SSLerr(SSL_F_SSL3_CONNECT, ERR_R_INTERNAL_ERROR);
200 ret = -1;
201 goto end;
202 }
203
204 /* s->version=SSL3_VERSION; */
205 s->type=SSL_ST_CONNECT;
206
207 if (s->init_buf == NULL)
208 {
209 if ((buf=BUF_MEM_new()) == NULL)
210 {
211 ret= -1;
212 goto end;
213 }
214 if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
215 {
216 ret= -1;
217 goto end;
218 }
219 s->init_buf=buf;
220 }
221
222 if (!ssl3_setup_buffers(s)) { ret= -1; goto end; }
223
224 /* setup buffing BIO */
225 if (!ssl_init_wbio_buffer(s,0)) { ret= -1; goto end; }
226
227 /* don't push the buffering BIO quite yet */
228
229 ssl3_init_finished_mac(s);
230
231 s->state=SSL3_ST_CW_CLNT_HELLO_A;
232 s->ctx->stats.sess_connect++;
233 s->init_num=0;
234 break;
235
236 case SSL3_ST_CW_CLNT_HELLO_A:
237 case SSL3_ST_CW_CLNT_HELLO_B:
238
239 s->shutdown=0;
240 ret=ssl3_client_hello(s);
241 if (ret <= 0) goto end;
242 s->state=SSL3_ST_CR_SRVR_HELLO_A;
243 s->init_num=0;
244
245 /* turn on buffering for the next lot of output */
246 if (s->bbio != s->wbio)
247 s->wbio=BIO_push(s->bbio,s->wbio);
248
249 break;
250
251 case SSL3_ST_CR_SRVR_HELLO_A:
252 case SSL3_ST_CR_SRVR_HELLO_B:
253 ret=ssl3_get_server_hello(s);
254 if (ret <= 0) goto end;
255 if (s->hit)
256 s->state=SSL3_ST_CR_FINISHED_A;
257 else
258 s->state=SSL3_ST_CR_CERT_A;
259 s->init_num=0;
260 break;
261
262 case SSL3_ST_CR_CERT_A:
263 case SSL3_ST_CR_CERT_B:
264 /* Check if it is anon DH */
265 if (!(s->s3->tmp.new_cipher->algorithms & SSL_aNULL))
266 {
267 ret=ssl3_get_server_certificate(s);
268 if (ret <= 0) goto end;
269 }
270 else
271 skip=1;
272 s->state=SSL3_ST_CR_KEY_EXCH_A;
273 s->init_num=0;
274 break;
275
276 case SSL3_ST_CR_KEY_EXCH_A:
277 case SSL3_ST_CR_KEY_EXCH_B:
278 ret=ssl3_get_key_exchange(s);
279 if (ret <= 0) goto end;
280 s->state=SSL3_ST_CR_CERT_REQ_A;
281 s->init_num=0;
282
283 /* at this point we check that we have the
284 * required stuff from the server */
285 if (!ssl3_check_cert_and_algorithm(s))
286 {
287 ret= -1;
288 goto end;
289 }
290 break;
291
292 case SSL3_ST_CR_CERT_REQ_A:
293 case SSL3_ST_CR_CERT_REQ_B:
294 ret=ssl3_get_certificate_request(s);
295 if (ret <= 0) goto end;
296 s->state=SSL3_ST_CR_SRVR_DONE_A;
297 s->init_num=0;
298 break;
299
300 case SSL3_ST_CR_SRVR_DONE_A:
301 case SSL3_ST_CR_SRVR_DONE_B:
302 ret=ssl3_get_server_done(s);
303 if (ret <= 0) goto end;
304 if (s->s3->tmp.cert_req)
305 s->state=SSL3_ST_CW_CERT_A;
306 else
307 s->state=SSL3_ST_CW_KEY_EXCH_A;
308 s->init_num=0;
309
310 break;
311
312 case SSL3_ST_CW_CERT_A:
313 case SSL3_ST_CW_CERT_B:
314 case SSL3_ST_CW_CERT_C:
315 case SSL3_ST_CW_CERT_D:
316 ret=ssl3_send_client_certificate(s);
317 if (ret <= 0) goto end;
318 s->state=SSL3_ST_CW_KEY_EXCH_A;
319 s->init_num=0;
320 break;
321
322 case SSL3_ST_CW_KEY_EXCH_A:
323 case SSL3_ST_CW_KEY_EXCH_B:
324 ret=ssl3_send_client_key_exchange(s);
325 if (ret <= 0) goto end;
326 l=s->s3->tmp.new_cipher->algorithms;
327 /* EAY EAY EAY need to check for DH fix cert
328 * sent back */
329 /* For TLS, cert_req is set to 2, so a cert chain
330 * of nothing is sent, but no verify packet is sent */
331 if (s->s3->tmp.cert_req == 1)
332 {
333 s->state=SSL3_ST_CW_CERT_VRFY_A;
334 }
335 else
336 {
337 s->state=SSL3_ST_CW_CHANGE_A;
338 s->s3->change_cipher_spec=0;
339 }
340
341 s->init_num=0;
342 break;
343
344 case SSL3_ST_CW_CERT_VRFY_A:
345 case SSL3_ST_CW_CERT_VRFY_B:
346 ret=ssl3_send_client_verify(s);
347 if (ret <= 0) goto end;
348 s->state=SSL3_ST_CW_CHANGE_A;
349 s->init_num=0;
350 s->s3->change_cipher_spec=0;
351 break;
352
353 case SSL3_ST_CW_CHANGE_A:
354 case SSL3_ST_CW_CHANGE_B:
355 ret=ssl3_send_change_cipher_spec(s,
356 SSL3_ST_CW_CHANGE_A,SSL3_ST_CW_CHANGE_B);
357 if (ret <= 0) goto end;
358 s->state=SSL3_ST_CW_FINISHED_A;
359 s->init_num=0;
360
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;
367 if (!s->method->ssl3_enc->setup_key_block(s))
368 {
369 ret= -1;
370 goto end;
371 }
372
373 if (!s->method->ssl3_enc->change_cipher_state(s,
374 SSL3_CHANGE_CIPHER_CLIENT_WRITE))
375 {
376 ret= -1;
377 goto end;
378 }
379
380 break;
381
382 case SSL3_ST_CW_FINISHED_A:
383 case SSL3_ST_CW_FINISHED_B:
384 ret=ssl3_send_finished(s,
385 SSL3_ST_CW_FINISHED_A,SSL3_ST_CW_FINISHED_B,
386 s->method->ssl3_enc->client_finished_label,
387 s->method->ssl3_enc->client_finished_label_len);
388 if (ret <= 0) goto end;
389 s->state=SSL3_ST_CW_FLUSH;
390
391 /* clear flags */
392 s->s3->flags&= ~SSL3_FLAGS_POP_BUFFER;
393 if (s->hit)
394 {
395 s->s3->tmp.next_state=SSL_ST_OK;
396 if (s->s3->flags & SSL3_FLAGS_DELAY_CLIENT_FINISHED)
397 {
398 s->state=SSL_ST_OK;
399 s->s3->flags|=SSL3_FLAGS_POP_BUFFER;
400 s->s3->delay_buf_pop_ret=0;
401 }
402 }
403 else
404 {
405 s->s3->tmp.next_state=SSL3_ST_CR_FINISHED_A;
406 }
407 s->init_num=0;
408 break;
409
410 case SSL3_ST_CR_FINISHED_A:
411 case SSL3_ST_CR_FINISHED_B:
412
413 ret=ssl3_get_finished(s,SSL3_ST_CR_FINISHED_A,
414 SSL3_ST_CR_FINISHED_B);
415 if (ret <= 0) goto end;
416
417 if (s->hit)
418 s->state=SSL3_ST_CW_CHANGE_A;
419 else
420 s->state=SSL_ST_OK;
421 s->init_num=0;
422 break;
423
424 case SSL3_ST_CW_FLUSH:
425 /* number of bytes to be flushed */
426 num1=BIO_ctrl(s->wbio,BIO_CTRL_INFO,0,NULL);
427 if (num1 > 0)
428 {
429 s->rwstate=SSL_WRITING;
430 num1=BIO_flush(s->wbio);
431 if (num1 <= 0) { ret= -1; goto end; }
432 s->rwstate=SSL_NOTHING;
433 }
434
435 s->state=s->s3->tmp.next_state;
436 break;
437
438 case SSL_ST_OK:
439 /* clean a few things up */
440 ssl3_cleanup_key_block(s);
441
442 if (s->init_buf != NULL)
443 {
444 BUF_MEM_free(s->init_buf);
445 s->init_buf=NULL;
446 }
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 */
453
454 s->init_num=0;
455 s->new_session=0;
456
457 ssl_update_cache(s,SSL_SESS_CACHE_CLIENT);
458 if (s->hit) s->ctx->stats.sess_hit++;
459
460 ret=1;
461 /* s->server=0; */
462 s->handshake_func=ssl3_connect;
463 s->ctx->stats.sess_connect_good++;
464
465 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
466
467 goto end;
468 /* break; */
469
470 default:
471 SSLerr(SSL_F_SSL3_CONNECT,SSL_R_UNKNOWN_STATE);
472 ret= -1;
473 goto end;
474 /* break; */
475 }
476
477 /* did we do anything */
478 if (!s->s3->tmp.reuse_message && !skip)
479 {
480 if (s->debug)
481 {
482 if ((ret=BIO_flush(s->wbio)) <= 0)
483 goto end;
484 }
485
486 if ((cb != NULL) && (s->state != state))
487 {
488 new_state=s->state;
489 s->state=state;
490 cb(s,SSL_CB_CONNECT_LOOP,1);
491 s->state=new_state;
492 }
493 }
494 skip=0;
495 }
496end:
497 s->in_handshake--;
498 if (cb != NULL)
499 cb(s,SSL_CB_CONNECT_EXIT,ret);
500 return(ret);
501 }
502
503
504static int ssl3_client_hello(SSL *s)
505 {
506 unsigned char *buf;
507 unsigned char *p,*d;
508 int i,j;
509 unsigned long Time,l;
510 SSL_COMP *comp;
511
512 buf=(unsigned char *)s->init_buf->data;
513 if (s->state == SSL3_ST_CW_CLNT_HELLO_A)
514 {
515 if ((s->session == NULL) ||
516 (s->session->ssl_version != s->version) ||
517 (s->session->not_resumable))
518 {
519 if (!ssl_get_new_session(s,0))
520 goto err;
521 }
522 /* else use the pre-loaded session */
523
524 p=s->s3->client_random;
525 Time=time(NULL); /* Time */
526 l2n(Time,p);
527 RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE-sizeof(Time));
528
529 /* Do the message type and length last */
530 d=p= &(buf[4]);
531
532 *(p++)=s->version>>8;
533 *(p++)=s->version&0xff;
534 s->client_version=s->version;
535
536 /* Random stuff */
537 memcpy(p,s->s3->client_random,SSL3_RANDOM_SIZE);
538 p+=SSL3_RANDOM_SIZE;
539
540 /* Session ID */
541 if (s->new_session)
542 i=0;
543 else
544 i=s->session->session_id_length;
545 *(p++)=i;
546 if (i != 0)
547 {
548 if (i > sizeof s->session->session_id)
549 {
550 SSLerr(SSL_F_SSL3_CLIENT_HELLO, ERR_R_INTERNAL_ERROR);
551 goto err;
552 }
553 memcpy(p,s->session->session_id,i);
554 p+=i;
555 }
556
557 /* Ciphers supported */
558 i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),&(p[2]));
559 if (i == 0)
560 {
561 SSLerr(SSL_F_SSL3_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE);
562 goto err;
563 }
564 s2n(i,p);
565 p+=i;
566
567 /* COMPRESSION */
568 if (s->ctx->comp_methods == NULL)
569 j=0;
570 else
571 j=sk_SSL_COMP_num(s->ctx->comp_methods);
572 *(p++)=1+j;
573 for (i=0; i<j; i++)
574 {
575 comp=sk_SSL_COMP_value(s->ctx->comp_methods,i);
576 *(p++)=comp->id;
577 }
578 *(p++)=0; /* Add the NULL method */
579
580 l=(p-d);
581 d=buf;
582 *(d++)=SSL3_MT_CLIENT_HELLO;
583 l2n3(l,d);
584
585 s->state=SSL3_ST_CW_CLNT_HELLO_B;
586 /* number of bytes to write */
587 s->init_num=p-buf;
588 s->init_off=0;
589 }
590
591 /* SSL3_ST_CW_CLNT_HELLO_B */
592 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
593err:
594 return(-1);
595 }
596
597static int ssl3_get_server_hello(SSL *s)
598 {
599 STACK_OF(SSL_CIPHER) *sk;
600 SSL_CIPHER *c;
601 unsigned char *p,*d;
602 int i,al,ok;
603 unsigned int j;
604 long n;
605 SSL_COMP *comp;
606
607 n=ssl3_get_message(s,
608 SSL3_ST_CR_SRVR_HELLO_A,
609 SSL3_ST_CR_SRVR_HELLO_B,
610 SSL3_MT_SERVER_HELLO,
611 300, /* ?? */
612 &ok);
613
614 if (!ok) return((int)n);
615 d=p=(unsigned char *)s->init_msg;
616
617 if ((p[0] != (s->version>>8)) || (p[1] != (s->version&0xff)))
618 {
619 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_WRONG_SSL_VERSION);
620 s->version=(s->version&0xff00)|p[1];
621 al=SSL_AD_PROTOCOL_VERSION;
622 goto f_err;
623 }
624 p+=2;
625
626 /* load the server hello data */
627 /* load the server random */
628 memcpy(s->s3->server_random,p,SSL3_RANDOM_SIZE);
629 p+=SSL3_RANDOM_SIZE;
630
631 /* get the session-id */
632 j= *(p++);
633
634 if ((j > sizeof s->session->session_id) || (j > SSL3_SESSION_ID_SIZE))
635 {
636 al=SSL_AD_ILLEGAL_PARAMETER;
637 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_SSL3_SESSION_ID_TOO_LONG);
638 goto f_err;
639 }
640 if (j != 0 && j == s->session->session_id_length
641 && memcmp(p,s->session->session_id,j) == 0)
642 {
643 if(s->sid_ctx_length != s->session->sid_ctx_length
644 || memcmp(s->session->sid_ctx,s->sid_ctx,s->sid_ctx_length))
645 {
646 /* actually a client application bug */
647 al=SSL_AD_ILLEGAL_PARAMETER;
648 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT);
649 goto f_err;
650 }
651 s->hit=1;
652 }
653 else /* a miss or crap from the other end */
654 {
655 /* If we were trying for session-id reuse, make a new
656 * SSL_SESSION so we don't stuff up other people */
657 s->hit=0;
658 if (s->session->session_id_length > 0)
659 {
660 if (!ssl_get_new_session(s,0))
661 {
662 al=SSL_AD_INTERNAL_ERROR;
663 goto f_err;
664 }
665 }
666 s->session->session_id_length=j;
667 memcpy(s->session->session_id,p,j); /* j could be 0 */
668 }
669 p+=j;
670 c=ssl_get_cipher_by_char(s,p);
671 if (c == NULL)
672 {
673 /* unknown cipher */
674 al=SSL_AD_ILLEGAL_PARAMETER;
675 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_UNKNOWN_CIPHER_RETURNED);
676 goto f_err;
677 }
678 p+=ssl_put_cipher_by_char(s,NULL,NULL);
679
680 sk=ssl_get_ciphers_by_id(s);
681 i=sk_SSL_CIPHER_find(sk,c);
682 if (i < 0)
683 {
684 /* we did not say we would use this cipher */
685 al=SSL_AD_ILLEGAL_PARAMETER;
686 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_WRONG_CIPHER_RETURNED);
687 goto f_err;
688 }
689
690 if (s->hit && (s->session->cipher != c))
691 {
692 if (!(s->options &
693 SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG))
694 {
695 al=SSL_AD_ILLEGAL_PARAMETER;
696 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED);
697 goto f_err;
698 }
699 }
700 s->s3->tmp.new_cipher=c;
701
702 /* lets get the compression algorithm */
703 /* COMPRESSION */
704 j= *(p++);
705 if (j == 0)
706 comp=NULL;
707 else
708 comp=ssl3_comp_find(s->ctx->comp_methods,j);
709
710 if ((j != 0) && (comp == NULL))
711 {
712 al=SSL_AD_ILLEGAL_PARAMETER;
713 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM);
714 goto f_err;
715 }
716 else
717 {
718 s->s3->tmp.new_compression=comp;
719 }
720
721 if (p != (d+n))
722 {
723 /* wrong packet length */
724 al=SSL_AD_DECODE_ERROR;
725 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_BAD_PACKET_LENGTH);
726 goto err;
727 }
728
729 return(1);
730f_err:
731 ssl3_send_alert(s,SSL3_AL_FATAL,al);
732err:
733 return(-1);
734 }
735
736static int ssl3_get_server_certificate(SSL *s)
737 {
738 int al,i,ok,ret= -1;
739 unsigned long n,nc,llen,l;
740 X509 *x=NULL;
741 unsigned char *p,*d,*q;
742 STACK_OF(X509) *sk=NULL;
743 SESS_CERT *sc;
744 EVP_PKEY *pkey=NULL;
745 int need_cert = 1; /* VRS: 0=> will allow null cert if auth == KRB5 */
746
747 n=ssl3_get_message(s,
748 SSL3_ST_CR_CERT_A,
749 SSL3_ST_CR_CERT_B,
750 -1,
751 s->max_cert_list,
752 &ok);
753
754 if (!ok) return((int)n);
755
756 if (s->s3->tmp.message_type == SSL3_MT_SERVER_KEY_EXCHANGE)
757 {
758 s->s3->tmp.reuse_message=1;
759 return(1);
760 }
761
762 if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE)
763 {
764 al=SSL_AD_UNEXPECTED_MESSAGE;
765 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_BAD_MESSAGE_TYPE);
766 goto f_err;
767 }
768 d=p=(unsigned char *)s->init_msg;
769
770 if ((sk=sk_X509_new_null()) == NULL)
771 {
772 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,ERR_R_MALLOC_FAILURE);
773 goto err;
774 }
775
776 n2l3(p,llen);
777 if (llen+3 != n)
778 {
779 al=SSL_AD_DECODE_ERROR;
780 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_LENGTH_MISMATCH);
781 goto f_err;
782 }
783 for (nc=0; nc<llen; )
784 {
785 n2l3(p,l);
786 if ((l+nc+3) > llen)
787 {
788 al=SSL_AD_DECODE_ERROR;
789 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);
790 goto f_err;
791 }
792
793 q=p;
794 x=d2i_X509(NULL,&q,l);
795 if (x == NULL)
796 {
797 al=SSL_AD_BAD_CERTIFICATE;
798 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,ERR_R_ASN1_LIB);
799 goto f_err;
800 }
801 if (q != (p+l))
802 {
803 al=SSL_AD_DECODE_ERROR;
804 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);
805 goto f_err;
806 }
807 if (!sk_X509_push(sk,x))
808 {
809 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,ERR_R_MALLOC_FAILURE);
810 goto err;
811 }
812 x=NULL;
813 nc+=l+3;
814 p=q;
815 }
816
817 i=ssl_verify_cert_chain(s,sk);
818 if ((s->verify_mode != SSL_VERIFY_NONE) && (!i)
819#ifndef OPENSSL_NO_KRB5
820 && (s->s3->tmp.new_cipher->algorithms & (SSL_MKEY_MASK|SSL_AUTH_MASK))
821 != (SSL_aKRB5|SSL_kKRB5)
822#endif /* OPENSSL_NO_KRB5 */
823 )
824 {
825 al=ssl_verify_alarm_type(s->verify_result);
826 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_CERTIFICATE_VERIFY_FAILED);
827 goto f_err;
828 }
829 ERR_clear_error(); /* but we keep s->verify_result */
830
831 sc=ssl_sess_cert_new();
832 if (sc == NULL) goto err;
833
834 if (s->session->sess_cert) ssl_sess_cert_free(s->session->sess_cert);
835 s->session->sess_cert=sc;
836
837 sc->cert_chain=sk;
838 /* Inconsistency alert: cert_chain does include the peer's
839 * certificate, which we don't include in s3_srvr.c */
840 x=sk_X509_value(sk,0);
841 sk=NULL;
842 /* VRS 19990621: possible memory leak; sk=null ==> !sk_pop_free() @end*/
843
844 pkey=X509_get_pubkey(x);
845
846 /* VRS: allow null cert if auth == KRB5 */
847 need_cert = ((s->s3->tmp.new_cipher->algorithms
848 & (SSL_MKEY_MASK|SSL_AUTH_MASK))
849 == (SSL_aKRB5|SSL_kKRB5))? 0: 1;
850
851#ifdef KSSL_DEBUG
852 printf("pkey,x = %p, %p\n", pkey,x);
853 printf("ssl_cert_type(x,pkey) = %d\n", ssl_cert_type(x,pkey));
854 printf("cipher, alg, nc = %s, %lx, %d\n", s->s3->tmp.new_cipher->name,
855 s->s3->tmp.new_cipher->algorithms, need_cert);
856#endif /* KSSL_DEBUG */
857
858 if (need_cert && ((pkey == NULL) || EVP_PKEY_missing_parameters(pkey)))
859 {
860 x=NULL;
861 al=SSL3_AL_FATAL;
862 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,
863 SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS);
864 goto f_err;
865 }
866
867 i=ssl_cert_type(x,pkey);
868 if (need_cert && i < 0)
869 {
870 x=NULL;
871 al=SSL3_AL_FATAL;
872 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,
873 SSL_R_UNKNOWN_CERTIFICATE_TYPE);
874 goto f_err;
875 }
876
877 if (need_cert)
878 {
879 sc->peer_cert_type=i;
880 CRYPTO_add(&x->references,1,CRYPTO_LOCK_X509);
881 /* Why would the following ever happen?
882 * We just created sc a couple of lines ago. */
883 if (sc->peer_pkeys[i].x509 != NULL)
884 X509_free(sc->peer_pkeys[i].x509);
885 sc->peer_pkeys[i].x509=x;
886 sc->peer_key= &(sc->peer_pkeys[i]);
887
888 if (s->session->peer != NULL)
889 X509_free(s->session->peer);
890 CRYPTO_add(&x->references,1,CRYPTO_LOCK_X509);
891 s->session->peer=x;
892 }
893 else
894 {
895 sc->peer_cert_type=i;
896 sc->peer_key= NULL;
897
898 if (s->session->peer != NULL)
899 X509_free(s->session->peer);
900 s->session->peer=NULL;
901 }
902 s->session->verify_result = s->verify_result;
903
904 x=NULL;
905 ret=1;
906
907 if (0)
908 {
909f_err:
910 ssl3_send_alert(s,SSL3_AL_FATAL,al);
911 }
912err:
913 EVP_PKEY_free(pkey);
914 X509_free(x);
915 sk_X509_pop_free(sk,X509_free);
916 return(ret);
917 }
918
919static int ssl3_get_key_exchange(SSL *s)
920 {
921#ifndef OPENSSL_NO_RSA
922 unsigned char *q,md_buf[EVP_MAX_MD_SIZE*2];
923#endif
924 EVP_MD_CTX md_ctx;
925 unsigned char *param,*p;
926 int al,i,j,param_len,ok;
927 long n,alg;
928 EVP_PKEY *pkey=NULL;
929#ifndef OPENSSL_NO_RSA
930 RSA *rsa=NULL;
931#endif
932#ifndef OPENSSL_NO_DH
933 DH *dh=NULL;
934#endif
935
936 /* use same message size as in ssl3_get_certificate_request()
937 * as ServerKeyExchange message may be skipped */
938 n=ssl3_get_message(s,
939 SSL3_ST_CR_KEY_EXCH_A,
940 SSL3_ST_CR_KEY_EXCH_B,
941 -1,
942 s->max_cert_list,
943 &ok);
944
945 if (!ok) return((int)n);
946
947 if (s->s3->tmp.message_type != SSL3_MT_SERVER_KEY_EXCHANGE)
948 {
949 s->s3->tmp.reuse_message=1;
950 return(1);
951 }
952
953 param=p=(unsigned char *)s->init_msg;
954
955 if (s->session->sess_cert != NULL)
956 {
957#ifndef OPENSSL_NO_RSA
958 if (s->session->sess_cert->peer_rsa_tmp != NULL)
959 {
960 RSA_free(s->session->sess_cert->peer_rsa_tmp);
961 s->session->sess_cert->peer_rsa_tmp=NULL;
962 }
963#endif
964#ifndef OPENSSL_NO_DH
965 if (s->session->sess_cert->peer_dh_tmp)
966 {
967 DH_free(s->session->sess_cert->peer_dh_tmp);
968 s->session->sess_cert->peer_dh_tmp=NULL;
969 }
970#endif
971 }
972 else
973 {
974 s->session->sess_cert=ssl_sess_cert_new();
975 }
976
977 param_len=0;
978 alg=s->s3->tmp.new_cipher->algorithms;
979 EVP_MD_CTX_init(&md_ctx);
980
981#ifndef OPENSSL_NO_RSA
982 if (alg & SSL_kRSA)
983 {
984 if ((rsa=RSA_new()) == NULL)
985 {
986 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
987 goto err;
988 }
989 n2s(p,i);
990 param_len=i+2;
991 if (param_len > n)
992 {
993 al=SSL_AD_DECODE_ERROR;
994 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_RSA_MODULUS_LENGTH);
995 goto f_err;
996 }
997 if (!(rsa->n=BN_bin2bn(p,i,rsa->n)))
998 {
999 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
1000 goto err;
1001 }
1002 p+=i;
1003
1004 n2s(p,i);
1005 param_len+=i+2;
1006 if (param_len > n)
1007 {
1008 al=SSL_AD_DECODE_ERROR;
1009 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_RSA_E_LENGTH);
1010 goto f_err;
1011 }
1012 if (!(rsa->e=BN_bin2bn(p,i,rsa->e)))
1013 {
1014 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
1015 goto err;
1016 }
1017 p+=i;
1018 n-=param_len;
1019
1020 /* this should be because we are using an export cipher */
1021 if (alg & SSL_aRSA)
1022 pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
1023 else
1024 {
1025 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
1026 goto err;
1027 }
1028 s->session->sess_cert->peer_rsa_tmp=rsa;
1029 rsa=NULL;
1030 }
1031#else /* OPENSSL_NO_RSA */
1032 if (0)
1033 ;
1034#endif
1035#ifndef OPENSSL_NO_DH
1036 else if (alg & SSL_kEDH)
1037 {
1038 if ((dh=DH_new()) == NULL)
1039 {
1040 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_DH_LIB);
1041 goto err;
1042 }
1043 n2s(p,i);
1044 param_len=i+2;
1045 if (param_len > n)
1046 {
1047 al=SSL_AD_DECODE_ERROR;
1048 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_DH_P_LENGTH);
1049 goto f_err;
1050 }
1051 if (!(dh->p=BN_bin2bn(p,i,NULL)))
1052 {
1053 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
1054 goto err;
1055 }
1056 p+=i;
1057
1058 n2s(p,i);
1059 param_len+=i+2;
1060 if (param_len > n)
1061 {
1062 al=SSL_AD_DECODE_ERROR;
1063 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_DH_G_LENGTH);
1064 goto f_err;
1065 }
1066 if (!(dh->g=BN_bin2bn(p,i,NULL)))
1067 {
1068 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
1069 goto err;
1070 }
1071 p+=i;
1072
1073 n2s(p,i);
1074 param_len+=i+2;
1075 if (param_len > n)
1076 {
1077 al=SSL_AD_DECODE_ERROR;
1078 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_DH_PUB_KEY_LENGTH);
1079 goto f_err;
1080 }
1081 if (!(dh->pub_key=BN_bin2bn(p,i,NULL)))
1082 {
1083 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
1084 goto err;
1085 }
1086 p+=i;
1087 n-=param_len;
1088
1089#ifndef OPENSSL_NO_RSA
1090 if (alg & SSL_aRSA)
1091 pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
1092#else
1093 if (0)
1094 ;
1095#endif
1096#ifndef OPENSSL_NO_DSA
1097 else if (alg & SSL_aDSS)
1098 pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_DSA_SIGN].x509);
1099#endif
1100 /* else anonymous DH, so no certificate or pkey. */
1101
1102 s->session->sess_cert->peer_dh_tmp=dh;
1103 dh=NULL;
1104 }
1105 else if ((alg & SSL_kDHr) || (alg & SSL_kDHd))
1106 {
1107 al=SSL_AD_ILLEGAL_PARAMETER;
1108 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER);
1109 goto f_err;
1110 }
1111#endif /* !OPENSSL_NO_DH */
1112 if (alg & SSL_aFZA)
1113 {
1114 al=SSL_AD_HANDSHAKE_FAILURE;
1115 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER);
1116 goto f_err;
1117 }
1118
1119
1120 /* p points to the next byte, there are 'n' bytes left */
1121
1122
1123 /* if it was signed, check the signature */
1124 if (pkey != NULL)
1125 {
1126 n2s(p,i);
1127 n-=2;
1128 j=EVP_PKEY_size(pkey);
1129
1130 if ((i != n) || (n > j) || (n <= 0))
1131 {
1132 /* wrong packet length */
1133 al=SSL_AD_DECODE_ERROR;
1134 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_WRONG_SIGNATURE_LENGTH);
1135 goto f_err;
1136 }
1137
1138#ifndef OPENSSL_NO_RSA
1139 if (pkey->type == EVP_PKEY_RSA)
1140 {
1141 int num;
1142
1143 j=0;
1144 q=md_buf;
1145 for (num=2; num > 0; num--)
1146 {
1147 EVP_DigestInit_ex(&md_ctx,(num == 2)
1148 ?s->ctx->md5:s->ctx->sha1, NULL);
1149 EVP_DigestUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1150 EVP_DigestUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1151 EVP_DigestUpdate(&md_ctx,param,param_len);
1152 EVP_DigestFinal_ex(&md_ctx,q,(unsigned int *)&i);
1153 q+=i;
1154 j+=i;
1155 }
1156 i=RSA_verify(NID_md5_sha1, md_buf, j, p, n,
1157 pkey->pkey.rsa);
1158 if (i < 0)
1159 {
1160 al=SSL_AD_DECRYPT_ERROR;
1161 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_RSA_DECRYPT);
1162 goto f_err;
1163 }
1164 if (i == 0)
1165 {
1166 /* bad signature */
1167 al=SSL_AD_DECRYPT_ERROR;
1168 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_SIGNATURE);
1169 goto f_err;
1170 }
1171 }
1172 else
1173#endif
1174#ifndef OPENSSL_NO_DSA
1175 if (pkey->type == EVP_PKEY_DSA)
1176 {
1177 /* lets do DSS */
1178 EVP_VerifyInit_ex(&md_ctx,EVP_dss1(), NULL);
1179 EVP_VerifyUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1180 EVP_VerifyUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1181 EVP_VerifyUpdate(&md_ctx,param,param_len);
1182 if (!EVP_VerifyFinal(&md_ctx,p,(int)n,pkey))
1183 {
1184 /* bad signature */
1185 al=SSL_AD_DECRYPT_ERROR;
1186 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_SIGNATURE);
1187 goto f_err;
1188 }
1189 }
1190 else
1191#endif
1192 {
1193 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
1194 goto err;
1195 }
1196 }
1197 else
1198 {
1199 /* still data left over */
1200 if (!(alg & SSL_aNULL))
1201 {
1202 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
1203 goto err;
1204 }
1205 if (n != 0)
1206 {
1207 al=SSL_AD_DECODE_ERROR;
1208 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_EXTRA_DATA_IN_MESSAGE);
1209 goto f_err;
1210 }
1211 }
1212 EVP_PKEY_free(pkey);
1213 EVP_MD_CTX_cleanup(&md_ctx);
1214 return(1);
1215f_err:
1216 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1217err:
1218 EVP_PKEY_free(pkey);
1219#ifndef OPENSSL_NO_RSA
1220 if (rsa != NULL)
1221 RSA_free(rsa);
1222#endif
1223#ifndef OPENSSL_NO_DH
1224 if (dh != NULL)
1225 DH_free(dh);
1226#endif
1227 EVP_MD_CTX_cleanup(&md_ctx);
1228 return(-1);
1229 }
1230
1231static int ssl3_get_certificate_request(SSL *s)
1232 {
1233 int ok,ret=0;
1234 unsigned long n,nc,l;
1235 unsigned int llen,ctype_num,i;
1236 X509_NAME *xn=NULL;
1237 unsigned char *p,*d,*q;
1238 STACK_OF(X509_NAME) *ca_sk=NULL;
1239
1240 n=ssl3_get_message(s,
1241 SSL3_ST_CR_CERT_REQ_A,
1242 SSL3_ST_CR_CERT_REQ_B,
1243 -1,
1244 s->max_cert_list,
1245 &ok);
1246
1247 if (!ok) return((int)n);
1248
1249 s->s3->tmp.cert_req=0;
1250
1251 if (s->s3->tmp.message_type == SSL3_MT_SERVER_DONE)
1252 {
1253 s->s3->tmp.reuse_message=1;
1254 return(1);
1255 }
1256
1257 if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE_REQUEST)
1258 {
1259 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_UNEXPECTED_MESSAGE);
1260 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_WRONG_MESSAGE_TYPE);
1261 goto err;
1262 }
1263
1264 /* TLS does not like anon-DH with client cert */
1265 if (s->version > SSL3_VERSION)
1266 {
1267 l=s->s3->tmp.new_cipher->algorithms;
1268 if (l & SSL_aNULL)
1269 {
1270 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_UNEXPECTED_MESSAGE);
1271 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER);
1272 goto err;
1273 }
1274 }
1275
1276 d=p=(unsigned char *)s->init_msg;
1277
1278 if ((ca_sk=sk_X509_NAME_new(ca_dn_cmp)) == NULL)
1279 {
1280 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,ERR_R_MALLOC_FAILURE);
1281 goto err;
1282 }
1283
1284 /* get the certificate types */
1285 ctype_num= *(p++);
1286 if (ctype_num > SSL3_CT_NUMBER)
1287 ctype_num=SSL3_CT_NUMBER;
1288 for (i=0; i<ctype_num; i++)
1289 s->s3->tmp.ctype[i]= p[i];
1290 p+=ctype_num;
1291
1292 /* get the CA RDNs */
1293 n2s(p,llen);
1294#if 0
1295{
1296FILE *out;
1297out=fopen("/tmp/vsign.der","w");
1298fwrite(p,1,llen,out);
1299fclose(out);
1300}
1301#endif
1302
1303 if ((llen+ctype_num+2+1) != n)
1304 {
1305 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
1306 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_LENGTH_MISMATCH);
1307 goto err;
1308 }
1309
1310 for (nc=0; nc<llen; )
1311 {
1312 n2s(p,l);
1313 if ((l+nc+2) > llen)
1314 {
1315 if ((s->options & SSL_OP_NETSCAPE_CA_DN_BUG))
1316 goto cont; /* netscape bugs */
1317 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
1318 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_CA_DN_TOO_LONG);
1319 goto err;
1320 }
1321
1322 q=p;
1323
1324 if ((xn=d2i_X509_NAME(NULL,&q,l)) == NULL)
1325 {
1326 /* If netscape tolerance is on, ignore errors */
1327 if (s->options & SSL_OP_NETSCAPE_CA_DN_BUG)
1328 goto cont;
1329 else
1330 {
1331 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
1332 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,ERR_R_ASN1_LIB);
1333 goto err;
1334 }
1335 }
1336
1337 if (q != (p+l))
1338 {
1339 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
1340 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_CA_DN_LENGTH_MISMATCH);
1341 goto err;
1342 }
1343 if (!sk_X509_NAME_push(ca_sk,xn))
1344 {
1345 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,ERR_R_MALLOC_FAILURE);
1346 goto err;
1347 }
1348
1349 p+=l;
1350 nc+=l+2;
1351 }
1352
1353 if (0)
1354 {
1355cont:
1356 ERR_clear_error();
1357 }
1358
1359 /* we should setup a certificate to return.... */
1360 s->s3->tmp.cert_req=1;
1361 s->s3->tmp.ctype_num=ctype_num;
1362 if (s->s3->tmp.ca_names != NULL)
1363 sk_X509_NAME_pop_free(s->s3->tmp.ca_names,X509_NAME_free);
1364 s->s3->tmp.ca_names=ca_sk;
1365 ca_sk=NULL;
1366
1367 ret=1;
1368err:
1369 if (ca_sk != NULL) sk_X509_NAME_pop_free(ca_sk,X509_NAME_free);
1370 return(ret);
1371 }
1372
1373static int ca_dn_cmp(const X509_NAME * const *a, const X509_NAME * const *b)
1374 {
1375 return(X509_NAME_cmp(*a,*b));
1376 }
1377
1378static int ssl3_get_server_done(SSL *s)
1379 {
1380 int ok,ret=0;
1381 long n;
1382
1383 n=ssl3_get_message(s,
1384 SSL3_ST_CR_SRVR_DONE_A,
1385 SSL3_ST_CR_SRVR_DONE_B,
1386 SSL3_MT_SERVER_DONE,
1387 30, /* should be very small, like 0 :-) */
1388 &ok);
1389
1390 if (!ok) return((int)n);
1391 if (n > 0)
1392 {
1393 /* should contain no data */
1394 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
1395 SSLerr(SSL_F_SSL3_GET_SERVER_DONE,SSL_R_LENGTH_MISMATCH);
1396 return -1;
1397 }
1398 ret=1;
1399 return(ret);
1400 }
1401
1402static int ssl3_send_client_key_exchange(SSL *s)
1403 {
1404 unsigned char *p,*d;
1405 int n;
1406 unsigned long l;
1407#ifndef OPENSSL_NO_RSA
1408 unsigned char *q;
1409 EVP_PKEY *pkey=NULL;
1410#endif
1411#ifndef OPENSSL_NO_KRB5
1412 KSSL_ERR kssl_err;
1413#endif /* OPENSSL_NO_KRB5 */
1414
1415 if (s->state == SSL3_ST_CW_KEY_EXCH_A)
1416 {
1417 d=(unsigned char *)s->init_buf->data;
1418 p= &(d[4]);
1419
1420 l=s->s3->tmp.new_cipher->algorithms;
1421
1422 /* Fool emacs indentation */
1423 if (0) {}
1424#ifndef OPENSSL_NO_RSA
1425 else if (l & SSL_kRSA)
1426 {
1427 RSA *rsa;
1428 unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH];
1429
1430 if (s->session->sess_cert->peer_rsa_tmp != NULL)
1431 rsa=s->session->sess_cert->peer_rsa_tmp;
1432 else
1433 {
1434 pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
1435 if ((pkey == NULL) ||
1436 (pkey->type != EVP_PKEY_RSA) ||
1437 (pkey->pkey.rsa == NULL))
1438 {
1439 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
1440 goto err;
1441 }
1442 rsa=pkey->pkey.rsa;
1443 EVP_PKEY_free(pkey);
1444 }
1445
1446 tmp_buf[0]=s->client_version>>8;
1447 tmp_buf[1]=s->client_version&0xff;
1448 if (RAND_bytes(&(tmp_buf[2]),SSL_MAX_MASTER_KEY_LENGTH-2) <= 0)
1449 goto err;
1450
1451 s->session->master_key_length=SSL_MAX_MASTER_KEY_LENGTH;
1452
1453 q=p;
1454 /* Fix buf for TLS and beyond */
1455 if (s->version > SSL3_VERSION)
1456 p+=2;
1457 n=RSA_public_encrypt(SSL_MAX_MASTER_KEY_LENGTH,
1458 tmp_buf,p,rsa,RSA_PKCS1_PADDING);
1459#ifdef PKCS1_CHECK
1460 if (s->options & SSL_OP_PKCS1_CHECK_1) p[1]++;
1461 if (s->options & SSL_OP_PKCS1_CHECK_2) tmp_buf[0]=0x70;
1462#endif
1463 if (n <= 0)
1464 {
1465 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_ENCRYPT);
1466 goto err;
1467 }
1468
1469 /* Fix buf for TLS and beyond */
1470 if (s->version > SSL3_VERSION)
1471 {
1472 s2n(n,q);
1473 n+=2;
1474 }
1475
1476 s->session->master_key_length=
1477 s->method->ssl3_enc->generate_master_secret(s,
1478 s->session->master_key,
1479 tmp_buf,SSL_MAX_MASTER_KEY_LENGTH);
1480 memset(tmp_buf,0,SSL_MAX_MASTER_KEY_LENGTH);
1481 }
1482#endif
1483#ifndef OPENSSL_NO_KRB5
1484 else if (l & SSL_kKRB5)
1485 {
1486 krb5_error_code krb5rc;
1487 KSSL_CTX *kssl_ctx = s->kssl_ctx;
1488 /* krb5_data krb5_ap_req; */
1489 krb5_data *enc_ticket;
1490 krb5_data authenticator, *authp = NULL;
1491 EVP_CIPHER_CTX ciph_ctx;
1492 EVP_CIPHER *enc = NULL;
1493 unsigned char iv[EVP_MAX_IV_LENGTH];
1494 unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH];
1495 unsigned char epms[SSL_MAX_MASTER_KEY_LENGTH
1496 + EVP_MAX_IV_LENGTH];
1497 int padl, outl = sizeof(epms);
1498
1499 EVP_CIPHER_CTX_init(&ciph_ctx);
1500
1501#ifdef KSSL_DEBUG
1502 printf("ssl3_send_client_key_exchange(%lx & %lx)\n",
1503 l, SSL_kKRB5);
1504#endif /* KSSL_DEBUG */
1505
1506 authp = NULL;
1507#ifdef KRB5SENDAUTH
1508 if (KRB5SENDAUTH) authp = &authenticator;
1509#endif /* KRB5SENDAUTH */
1510
1511 krb5rc = kssl_cget_tkt(kssl_ctx, &enc_ticket, authp,
1512 &kssl_err);
1513 enc = kssl_map_enc(kssl_ctx->enctype);
1514 if (enc == NULL)
1515 goto err;
1516#ifdef KSSL_DEBUG
1517 {
1518 printf("kssl_cget_tkt rtn %d\n", krb5rc);
1519 if (krb5rc && kssl_err.text)
1520 printf("kssl_cget_tkt kssl_err=%s\n", kssl_err.text);
1521 }
1522#endif /* KSSL_DEBUG */
1523
1524 if (krb5rc)
1525 {
1526 ssl3_send_alert(s,SSL3_AL_FATAL,
1527 SSL_AD_HANDSHAKE_FAILURE);
1528 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
1529 kssl_err.reason);
1530 goto err;
1531 }
1532
1533 /* 20010406 VRS - Earlier versions used KRB5 AP_REQ
1534 ** in place of RFC 2712 KerberosWrapper, as in:
1535 **
1536 ** Send ticket (copy to *p, set n = length)
1537 ** n = krb5_ap_req.length;
1538 ** memcpy(p, krb5_ap_req.data, krb5_ap_req.length);
1539 ** if (krb5_ap_req.data)
1540 ** kssl_krb5_free_data_contents(NULL,&krb5_ap_req);
1541 **
1542 ** Now using real RFC 2712 KerberosWrapper
1543 ** (Thanks to Simon Wilkinson <sxw@sxw.org.uk>)
1544 ** Note: 2712 "opaque" types are here replaced
1545 ** with a 2-byte length followed by the value.
1546 ** Example:
1547 ** KerberosWrapper= xx xx asn1ticket 0 0 xx xx encpms
1548 ** Where "xx xx" = length bytes. Shown here with
1549 ** optional authenticator omitted.
1550 */
1551
1552 /* KerberosWrapper.Ticket */
1553 s2n(enc_ticket->length,p);
1554 memcpy(p, enc_ticket->data, enc_ticket->length);
1555 p+= enc_ticket->length;
1556 n = enc_ticket->length + 2;
1557
1558 /* KerberosWrapper.Authenticator */
1559 if (authp && authp->length)
1560 {
1561 s2n(authp->length,p);
1562 memcpy(p, authp->data, authp->length);
1563 p+= authp->length;
1564 n+= authp->length + 2;
1565
1566 free(authp->data);
1567 authp->data = NULL;
1568 authp->length = 0;
1569 }
1570 else
1571 {
1572 s2n(0,p);/* null authenticator length */
1573 n+=2;
1574 }
1575
1576 if (RAND_bytes(tmp_buf,SSL_MAX_MASTER_KEY_LENGTH) <= 0)
1577 goto err;
1578
1579 /* 20010420 VRS. Tried it this way; failed.
1580 ** EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,NULL);
1581 ** EVP_CIPHER_CTX_set_key_length(&ciph_ctx,
1582 ** kssl_ctx->length);
1583 ** EVP_EncryptInit_ex(&ciph_ctx,NULL, key,iv);
1584 */
1585
1586 memset(iv, 0, EVP_MAX_IV_LENGTH); /* per RFC 1510 */
1587 EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,
1588 kssl_ctx->key,iv);
1589 EVP_EncryptUpdate(&ciph_ctx,epms,&outl,tmp_buf,
1590 SSL_MAX_MASTER_KEY_LENGTH);
1591 EVP_EncryptFinal_ex(&ciph_ctx,&(epms[outl]),&padl);
1592 outl += padl;
1593 if (outl > sizeof epms)
1594 {
1595 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
1596 goto err;
1597 }
1598 EVP_CIPHER_CTX_cleanup(&ciph_ctx);
1599
1600 /* KerberosWrapper.EncryptedPreMasterSecret */
1601 s2n(outl,p);
1602 memcpy(p, epms, outl);
1603 p+=outl;
1604 n+=outl + 2;
1605
1606 s->session->master_key_length=
1607 s->method->ssl3_enc->generate_master_secret(s,
1608 s->session->master_key,
1609 tmp_buf, SSL_MAX_MASTER_KEY_LENGTH);
1610
1611 memset(tmp_buf, 0, SSL_MAX_MASTER_KEY_LENGTH);
1612 memset(epms, 0, outl);
1613 }
1614#endif
1615#ifndef OPENSSL_NO_DH
1616 else if (l & (SSL_kEDH|SSL_kDHr|SSL_kDHd))
1617 {
1618 DH *dh_srvr,*dh_clnt;
1619
1620 if (s->session->sess_cert->peer_dh_tmp != NULL)
1621 dh_srvr=s->session->sess_cert->peer_dh_tmp;
1622 else
1623 {
1624 /* we get them from the cert */
1625 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
1626 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,SSL_R_UNABLE_TO_FIND_DH_PARAMETERS);
1627 goto err;
1628 }
1629
1630 /* generate a new random key */
1631 if ((dh_clnt=DHparams_dup(dh_srvr)) == NULL)
1632 {
1633 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB);
1634 goto err;
1635 }
1636 if (!DH_generate_key(dh_clnt))
1637 {
1638 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB);
1639 goto err;
1640 }
1641
1642 /* use the 'p' output buffer for the DH key, but
1643 * make sure to clear it out afterwards */
1644
1645 n=DH_compute_key(p,dh_srvr->pub_key,dh_clnt);
1646
1647 if (n <= 0)
1648 {
1649 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB);
1650 goto err;
1651 }
1652
1653 /* generate master key from the result */
1654 s->session->master_key_length=
1655 s->method->ssl3_enc->generate_master_secret(s,
1656 s->session->master_key,p,n);
1657 /* clean up */
1658 memset(p,0,n);
1659
1660 /* send off the data */
1661 n=BN_num_bytes(dh_clnt->pub_key);
1662 s2n(n,p);
1663 BN_bn2bin(dh_clnt->pub_key,p);
1664 n+=2;
1665
1666 DH_free(dh_clnt);
1667
1668 /* perhaps clean things up a bit EAY EAY EAY EAY*/
1669 }
1670#endif
1671 else
1672 {
1673 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
1674 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
1675 goto err;
1676 }
1677
1678 *(d++)=SSL3_MT_CLIENT_KEY_EXCHANGE;
1679 l2n3(n,d);
1680
1681 s->state=SSL3_ST_CW_KEY_EXCH_B;
1682 /* number of bytes to write */
1683 s->init_num=n+4;
1684 s->init_off=0;
1685 }
1686
1687 /* SSL3_ST_CW_KEY_EXCH_B */
1688 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
1689err:
1690 return(-1);
1691 }
1692
1693static int ssl3_send_client_verify(SSL *s)
1694 {
1695 unsigned char *p,*d;
1696 unsigned char data[MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH];
1697 EVP_PKEY *pkey;
1698#ifndef OPENSSL_NO_RSA
1699 unsigned u=0;
1700#endif
1701 unsigned long n;
1702#ifndef OPENSSL_NO_DSA
1703 int j;
1704#endif
1705
1706 if (s->state == SSL3_ST_CW_CERT_VRFY_A)
1707 {
1708 d=(unsigned char *)s->init_buf->data;
1709 p= &(d[4]);
1710 pkey=s->cert->key->privatekey;
1711
1712 s->method->ssl3_enc->cert_verify_mac(s,&(s->s3->finish_dgst2),
1713 &(data[MD5_DIGEST_LENGTH]));
1714
1715#ifndef OPENSSL_NO_RSA
1716 if (pkey->type == EVP_PKEY_RSA)
1717 {
1718 s->method->ssl3_enc->cert_verify_mac(s,
1719 &(s->s3->finish_dgst1),&(data[0]));
1720 if (RSA_sign(NID_md5_sha1, data,
1721 MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH,
1722 &(p[2]), &u, pkey->pkey.rsa) <= 0 )
1723 {
1724 SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,ERR_R_RSA_LIB);
1725 goto err;
1726 }
1727 s2n(u,p);
1728 n=u+2;
1729 }
1730 else
1731#endif
1732#ifndef OPENSSL_NO_DSA
1733 if (pkey->type == EVP_PKEY_DSA)
1734 {
1735 if (!DSA_sign(pkey->save_type,
1736 &(data[MD5_DIGEST_LENGTH]),
1737 SHA_DIGEST_LENGTH,&(p[2]),
1738 (unsigned int *)&j,pkey->pkey.dsa))
1739 {
1740 SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,ERR_R_DSA_LIB);
1741 goto err;
1742 }
1743 s2n(j,p);
1744 n=j+2;
1745 }
1746 else
1747#endif
1748 {
1749 SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,ERR_R_INTERNAL_ERROR);
1750 goto err;
1751 }
1752 *(d++)=SSL3_MT_CERTIFICATE_VERIFY;
1753 l2n3(n,d);
1754
1755 s->init_num=(int)n+4;
1756 s->init_off=0;
1757 }
1758 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
1759err:
1760 return(-1);
1761 }
1762
1763static int ssl3_send_client_certificate(SSL *s)
1764 {
1765 X509 *x509=NULL;
1766 EVP_PKEY *pkey=NULL;
1767 int i;
1768 unsigned long l;
1769
1770 if (s->state == SSL3_ST_CW_CERT_A)
1771 {
1772 if ((s->cert == NULL) ||
1773 (s->cert->key->x509 == NULL) ||
1774 (s->cert->key->privatekey == NULL))
1775 s->state=SSL3_ST_CW_CERT_B;
1776 else
1777 s->state=SSL3_ST_CW_CERT_C;
1778 }
1779
1780 /* We need to get a client cert */
1781 if (s->state == SSL3_ST_CW_CERT_B)
1782 {
1783 /* If we get an error, we need to
1784 * ssl->rwstate=SSL_X509_LOOKUP; return(-1);
1785 * We then get retied later */
1786 i=0;
1787 if (s->ctx->client_cert_cb != NULL)
1788 i=s->ctx->client_cert_cb(s,&(x509),&(pkey));
1789 if (i < 0)
1790 {
1791 s->rwstate=SSL_X509_LOOKUP;
1792 return(-1);
1793 }
1794 s->rwstate=SSL_NOTHING;
1795 if ((i == 1) && (pkey != NULL) && (x509 != NULL))
1796 {
1797 s->state=SSL3_ST_CW_CERT_B;
1798 if ( !SSL_use_certificate(s,x509) ||
1799 !SSL_use_PrivateKey(s,pkey))
1800 i=0;
1801 }
1802 else if (i == 1)
1803 {
1804 i=0;
1805 SSLerr(SSL_F_SSL3_SEND_CLIENT_CERTIFICATE,SSL_R_BAD_DATA_RETURNED_BY_CALLBACK);
1806 }
1807
1808 if (x509 != NULL) X509_free(x509);
1809 if (pkey != NULL) EVP_PKEY_free(pkey);
1810 if (i == 0)
1811 {
1812 if (s->version == SSL3_VERSION)
1813 {
1814 s->s3->tmp.cert_req=0;
1815 ssl3_send_alert(s,SSL3_AL_WARNING,SSL_AD_NO_CERTIFICATE);
1816 return(1);
1817 }
1818 else
1819 {
1820 s->s3->tmp.cert_req=2;
1821 }
1822 }
1823
1824 /* Ok, we have a cert */
1825 s->state=SSL3_ST_CW_CERT_C;
1826 }
1827
1828 if (s->state == SSL3_ST_CW_CERT_C)
1829 {
1830 s->state=SSL3_ST_CW_CERT_D;
1831 l=ssl3_output_cert_chain(s,
1832 (s->s3->tmp.cert_req == 2)?NULL:s->cert->key->x509);
1833 s->init_num=(int)l;
1834 s->init_off=0;
1835 }
1836 /* SSL3_ST_CW_CERT_D */
1837 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
1838 }
1839
1840#define has_bits(i,m) (((i)&(m)) == (m))
1841
1842static int ssl3_check_cert_and_algorithm(SSL *s)
1843 {
1844 int i,idx;
1845 long algs;
1846 EVP_PKEY *pkey=NULL;
1847 SESS_CERT *sc;
1848#ifndef OPENSSL_NO_RSA
1849 RSA *rsa;
1850#endif
1851#ifndef OPENSSL_NO_DH
1852 DH *dh;
1853#endif
1854
1855 sc=s->session->sess_cert;
1856
1857 if (sc == NULL)
1858 {
1859 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,ERR_R_INTERNAL_ERROR);
1860 goto err;
1861 }
1862
1863 algs=s->s3->tmp.new_cipher->algorithms;
1864
1865 /* we don't have a certificate */
1866 if (algs & (SSL_aDH|SSL_aNULL|SSL_aKRB5))
1867 return(1);
1868
1869#ifndef OPENSSL_NO_RSA
1870 rsa=s->session->sess_cert->peer_rsa_tmp;
1871#endif
1872#ifndef OPENSSL_NO_DH
1873 dh=s->session->sess_cert->peer_dh_tmp;
1874#endif
1875
1876 /* This is the passed certificate */
1877
1878 idx=sc->peer_cert_type;
1879 pkey=X509_get_pubkey(sc->peer_pkeys[idx].x509);
1880 i=X509_certificate_type(sc->peer_pkeys[idx].x509,pkey);
1881 EVP_PKEY_free(pkey);
1882
1883
1884 /* Check that we have a certificate if we require one */
1885 if ((algs & SSL_aRSA) && !has_bits(i,EVP_PK_RSA|EVP_PKT_SIGN))
1886 {
1887 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_RSA_SIGNING_CERT);
1888 goto f_err;
1889 }
1890#ifndef OPENSSL_NO_DSA
1891 else if ((algs & SSL_aDSS) && !has_bits(i,EVP_PK_DSA|EVP_PKT_SIGN))
1892 {
1893 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DSA_SIGNING_CERT);
1894 goto f_err;
1895 }
1896#endif
1897#ifndef OPENSSL_NO_RSA
1898 if ((algs & SSL_kRSA) &&
1899 !(has_bits(i,EVP_PK_RSA|EVP_PKT_ENC) || (rsa != NULL)))
1900 {
1901 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_RSA_ENCRYPTING_CERT);
1902 goto f_err;
1903 }
1904#endif
1905#ifndef OPENSSL_NO_DH
1906 if ((algs & SSL_kEDH) &&
1907 !(has_bits(i,EVP_PK_DH|EVP_PKT_EXCH) || (dh != NULL)))
1908 {
1909 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DH_KEY);
1910 goto f_err;
1911 }
1912 else if ((algs & SSL_kDHr) && !has_bits(i,EVP_PK_DH|EVP_PKS_RSA))
1913 {
1914 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DH_RSA_CERT);
1915 goto f_err;
1916 }
1917#ifndef OPENSSL_NO_DSA
1918 else if ((algs & SSL_kDHd) && !has_bits(i,EVP_PK_DH|EVP_PKS_DSA))
1919 {
1920 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DH_DSA_CERT);
1921 goto f_err;
1922 }
1923#endif
1924#endif
1925
1926 if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) && !has_bits(i,EVP_PKT_EXP))
1927 {
1928#ifndef OPENSSL_NO_RSA
1929 if (algs & SSL_kRSA)
1930 {
1931 if (rsa == NULL
1932 || RSA_size(rsa) > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher))
1933 {
1934 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_EXPORT_TMP_RSA_KEY);
1935 goto f_err;
1936 }
1937 }
1938 else
1939#endif
1940#ifndef OPENSSL_NO_DH
1941 if (algs & (SSL_kEDH|SSL_kDHr|SSL_kDHd))
1942 {
1943 if (dh == NULL
1944 || DH_size(dh) > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher))
1945 {
1946 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_EXPORT_TMP_DH_KEY);
1947 goto f_err;
1948 }
1949 }
1950 else
1951#endif
1952 {
1953 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE);
1954 goto f_err;
1955 }
1956 }
1957 return(1);
1958f_err:
1959 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
1960err:
1961 return(0);
1962 }
1963
diff --git a/src/lib/libssl/s3_lib.c b/src/lib/libssl/s3_lib.c
deleted file mode 100644
index cc0aeef511..0000000000
--- a/src/lib/libssl/s3_lib.c
+++ /dev/null
@@ -1,1682 +0,0 @@
1/* ssl/s3_lib.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58/* ====================================================================
59 * Copyright (c) 1998-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 */
111
112#include <stdio.h>
113#include <openssl/objects.h>
114#include "ssl_locl.h"
115#include "kssl_lcl.h"
116#include <openssl/md5.h>
117
118const char *ssl3_version_str="SSLv3" OPENSSL_VERSION_PTEXT;
119
120#define SSL3_NUM_CIPHERS (sizeof(ssl3_ciphers)/sizeof(SSL_CIPHER))
121
122static long ssl3_default_timeout(void );
123
124OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={
125/* The RSA ciphers */
126/* Cipher 01 */
127 {
128 1,
129 SSL3_TXT_RSA_NULL_MD5,
130 SSL3_CK_RSA_NULL_MD5,
131 SSL_kRSA|SSL_aRSA|SSL_eNULL |SSL_MD5|SSL_SSLV3,
132 SSL_NOT_EXP|SSL_STRONG_NONE,
133 0,
134 0,
135 0,
136 SSL_ALL_CIPHERS,
137 SSL_ALL_STRENGTHS,
138 },
139/* Cipher 02 */
140 {
141 1,
142 SSL3_TXT_RSA_NULL_SHA,
143 SSL3_CK_RSA_NULL_SHA,
144 SSL_kRSA|SSL_aRSA|SSL_eNULL |SSL_SHA1|SSL_SSLV3,
145 SSL_NOT_EXP|SSL_STRONG_NONE,
146 0,
147 0,
148 0,
149 SSL_ALL_CIPHERS,
150 SSL_ALL_STRENGTHS,
151 },
152
153/* anon DH */
154/* Cipher 17 */
155 {
156 1,
157 SSL3_TXT_ADH_RC4_40_MD5,
158 SSL3_CK_ADH_RC4_40_MD5,
159 SSL_kEDH |SSL_aNULL|SSL_RC4 |SSL_MD5 |SSL_SSLV3,
160 SSL_EXPORT|SSL_EXP40,
161 0,
162 40,
163 128,
164 SSL_ALL_CIPHERS,
165 SSL_ALL_STRENGTHS,
166 },
167/* Cipher 18 */
168 {
169 1,
170 SSL3_TXT_ADH_RC4_128_MD5,
171 SSL3_CK_ADH_RC4_128_MD5,
172 SSL_kEDH |SSL_aNULL|SSL_RC4 |SSL_MD5 |SSL_SSLV3,
173 SSL_NOT_EXP|SSL_MEDIUM,
174 0,
175 128,
176 128,
177 SSL_ALL_CIPHERS,
178 SSL_ALL_STRENGTHS,
179 },
180/* Cipher 19 */
181 {
182 1,
183 SSL3_TXT_ADH_DES_40_CBC_SHA,
184 SSL3_CK_ADH_DES_40_CBC_SHA,
185 SSL_kEDH |SSL_aNULL|SSL_DES|SSL_SHA1|SSL_SSLV3,
186 SSL_EXPORT|SSL_EXP40,
187 0,
188 40,
189 128,
190 SSL_ALL_CIPHERS,
191 SSL_ALL_STRENGTHS,
192 },
193/* Cipher 1A */
194 {
195 1,
196 SSL3_TXT_ADH_DES_64_CBC_SHA,
197 SSL3_CK_ADH_DES_64_CBC_SHA,
198 SSL_kEDH |SSL_aNULL|SSL_DES |SSL_SHA1|SSL_SSLV3,
199 SSL_NOT_EXP|SSL_LOW,
200 0,
201 56,
202 56,
203 SSL_ALL_CIPHERS,
204 SSL_ALL_STRENGTHS,
205 },
206/* Cipher 1B */
207 {
208 1,
209 SSL3_TXT_ADH_DES_192_CBC_SHA,
210 SSL3_CK_ADH_DES_192_CBC_SHA,
211 SSL_kEDH |SSL_aNULL|SSL_3DES |SSL_SHA1|SSL_SSLV3,
212 SSL_NOT_EXP|SSL_HIGH,
213 0,
214 168,
215 168,
216 SSL_ALL_CIPHERS,
217 SSL_ALL_STRENGTHS,
218 },
219
220/* RSA again */
221/* Cipher 03 */
222 {
223 1,
224 SSL3_TXT_RSA_RC4_40_MD5,
225 SSL3_CK_RSA_RC4_40_MD5,
226 SSL_kRSA|SSL_aRSA|SSL_RC4 |SSL_MD5 |SSL_SSLV3,
227 SSL_EXPORT|SSL_EXP40,
228 0,
229 40,
230 128,
231 SSL_ALL_CIPHERS,
232 SSL_ALL_STRENGTHS,
233 },
234/* Cipher 04 */
235 {
236 1,
237 SSL3_TXT_RSA_RC4_128_MD5,
238 SSL3_CK_RSA_RC4_128_MD5,
239 SSL_kRSA|SSL_aRSA|SSL_RC4 |SSL_MD5|SSL_SSLV3,
240 SSL_NOT_EXP|SSL_MEDIUM,
241 0,
242 128,
243 128,
244 SSL_ALL_CIPHERS,
245 SSL_ALL_STRENGTHS,
246 },
247/* Cipher 05 */
248 {
249 1,
250 SSL3_TXT_RSA_RC4_128_SHA,
251 SSL3_CK_RSA_RC4_128_SHA,
252 SSL_kRSA|SSL_aRSA|SSL_RC4 |SSL_SHA1|SSL_SSLV3,
253 SSL_NOT_EXP|SSL_MEDIUM,
254 0,
255 128,
256 128,
257 SSL_ALL_CIPHERS,
258 SSL_ALL_STRENGTHS,
259 },
260/* Cipher 06 */
261 {
262 1,
263 SSL3_TXT_RSA_RC2_40_MD5,
264 SSL3_CK_RSA_RC2_40_MD5,
265 SSL_kRSA|SSL_aRSA|SSL_RC2 |SSL_MD5 |SSL_SSLV3,
266 SSL_EXPORT|SSL_EXP40,
267 0,
268 40,
269 128,
270 SSL_ALL_CIPHERS,
271 SSL_ALL_STRENGTHS,
272 },
273/* Cipher 07 */
274#ifndef OPENSSL_NO_IDEA
275 {
276 1,
277 SSL3_TXT_RSA_IDEA_128_SHA,
278 SSL3_CK_RSA_IDEA_128_SHA,
279 SSL_kRSA|SSL_aRSA|SSL_IDEA |SSL_SHA1|SSL_SSLV3,
280 SSL_NOT_EXP|SSL_MEDIUM,
281 0,
282 128,
283 128,
284 SSL_ALL_CIPHERS,
285 SSL_ALL_STRENGTHS,
286 },
287#endif
288/* Cipher 08 */
289 {
290 1,
291 SSL3_TXT_RSA_DES_40_CBC_SHA,
292 SSL3_CK_RSA_DES_40_CBC_SHA,
293 SSL_kRSA|SSL_aRSA|SSL_DES|SSL_SHA1|SSL_SSLV3,
294 SSL_EXPORT|SSL_EXP40,
295 0,
296 40,
297 56,
298 SSL_ALL_CIPHERS,
299 SSL_ALL_STRENGTHS,
300 },
301/* Cipher 09 */
302 {
303 1,
304 SSL3_TXT_RSA_DES_64_CBC_SHA,
305 SSL3_CK_RSA_DES_64_CBC_SHA,
306 SSL_kRSA|SSL_aRSA|SSL_DES |SSL_SHA1|SSL_SSLV3,
307 SSL_NOT_EXP|SSL_LOW,
308 0,
309 56,
310 56,
311 SSL_ALL_CIPHERS,
312 SSL_ALL_STRENGTHS,
313 },
314/* Cipher 0A */
315 {
316 1,
317 SSL3_TXT_RSA_DES_192_CBC3_SHA,
318 SSL3_CK_RSA_DES_192_CBC3_SHA,
319 SSL_kRSA|SSL_aRSA|SSL_3DES |SSL_SHA1|SSL_SSLV3,
320 SSL_NOT_EXP|SSL_HIGH,
321 0,
322 168,
323 168,
324 SSL_ALL_CIPHERS,
325 SSL_ALL_STRENGTHS,
326 },
327
328/* The DH ciphers */
329/* Cipher 0B */
330 {
331 0,
332 SSL3_TXT_DH_DSS_DES_40_CBC_SHA,
333 SSL3_CK_DH_DSS_DES_40_CBC_SHA,
334 SSL_kDHd |SSL_aDH|SSL_DES|SSL_SHA1|SSL_SSLV3,
335 SSL_EXPORT|SSL_EXP40,
336 0,
337 40,
338 56,
339 SSL_ALL_CIPHERS,
340 SSL_ALL_STRENGTHS,
341 },
342/* Cipher 0C */
343 {
344 0,
345 SSL3_TXT_DH_DSS_DES_64_CBC_SHA,
346 SSL3_CK_DH_DSS_DES_64_CBC_SHA,
347 SSL_kDHd |SSL_aDH|SSL_DES |SSL_SHA1|SSL_SSLV3,
348 SSL_NOT_EXP|SSL_LOW,
349 0,
350 56,
351 56,
352 SSL_ALL_CIPHERS,
353 SSL_ALL_STRENGTHS,
354 },
355/* Cipher 0D */
356 {
357 0,
358 SSL3_TXT_DH_DSS_DES_192_CBC3_SHA,
359 SSL3_CK_DH_DSS_DES_192_CBC3_SHA,
360 SSL_kDHd |SSL_aDH|SSL_3DES |SSL_SHA1|SSL_SSLV3,
361 SSL_NOT_EXP|SSL_HIGH,
362 0,
363 168,
364 168,
365 SSL_ALL_CIPHERS,
366 SSL_ALL_STRENGTHS,
367 },
368/* Cipher 0E */
369 {
370 0,
371 SSL3_TXT_DH_RSA_DES_40_CBC_SHA,
372 SSL3_CK_DH_RSA_DES_40_CBC_SHA,
373 SSL_kDHr |SSL_aDH|SSL_DES|SSL_SHA1|SSL_SSLV3,
374 SSL_EXPORT|SSL_EXP40,
375 0,
376 40,
377 56,
378 SSL_ALL_CIPHERS,
379 SSL_ALL_STRENGTHS,
380 },
381/* Cipher 0F */
382 {
383 0,
384 SSL3_TXT_DH_RSA_DES_64_CBC_SHA,
385 SSL3_CK_DH_RSA_DES_64_CBC_SHA,
386 SSL_kDHr |SSL_aDH|SSL_DES |SSL_SHA1|SSL_SSLV3,
387 SSL_NOT_EXP|SSL_LOW,
388 0,
389 56,
390 56,
391 SSL_ALL_CIPHERS,
392 SSL_ALL_STRENGTHS,
393 },
394/* Cipher 10 */
395 {
396 0,
397 SSL3_TXT_DH_RSA_DES_192_CBC3_SHA,
398 SSL3_CK_DH_RSA_DES_192_CBC3_SHA,
399 SSL_kDHr |SSL_aDH|SSL_3DES |SSL_SHA1|SSL_SSLV3,
400 SSL_NOT_EXP|SSL_HIGH,
401 0,
402 168,
403 168,
404 SSL_ALL_CIPHERS,
405 SSL_ALL_STRENGTHS,
406 },
407
408/* The Ephemeral DH ciphers */
409/* Cipher 11 */
410 {
411 1,
412 SSL3_TXT_EDH_DSS_DES_40_CBC_SHA,
413 SSL3_CK_EDH_DSS_DES_40_CBC_SHA,
414 SSL_kEDH|SSL_aDSS|SSL_DES|SSL_SHA1|SSL_SSLV3,
415 SSL_EXPORT|SSL_EXP40,
416 0,
417 40,
418 56,
419 SSL_ALL_CIPHERS,
420 SSL_ALL_STRENGTHS,
421 },
422/* Cipher 12 */
423 {
424 1,
425 SSL3_TXT_EDH_DSS_DES_64_CBC_SHA,
426 SSL3_CK_EDH_DSS_DES_64_CBC_SHA,
427 SSL_kEDH|SSL_aDSS|SSL_DES |SSL_SHA1|SSL_SSLV3,
428 SSL_NOT_EXP|SSL_LOW,
429 0,
430 56,
431 56,
432 SSL_ALL_CIPHERS,
433 SSL_ALL_STRENGTHS,
434 },
435/* Cipher 13 */
436 {
437 1,
438 SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA,
439 SSL3_CK_EDH_DSS_DES_192_CBC3_SHA,
440 SSL_kEDH|SSL_aDSS|SSL_3DES |SSL_SHA1|SSL_SSLV3,
441 SSL_NOT_EXP|SSL_HIGH,
442 0,
443 168,
444 168,
445 SSL_ALL_CIPHERS,
446 SSL_ALL_STRENGTHS,
447 },
448/* Cipher 14 */
449 {
450 1,
451 SSL3_TXT_EDH_RSA_DES_40_CBC_SHA,
452 SSL3_CK_EDH_RSA_DES_40_CBC_SHA,
453 SSL_kEDH|SSL_aRSA|SSL_DES|SSL_SHA1|SSL_SSLV3,
454 SSL_EXPORT|SSL_EXP40,
455 0,
456 40,
457 56,
458 SSL_ALL_CIPHERS,
459 SSL_ALL_STRENGTHS,
460 },
461/* Cipher 15 */
462 {
463 1,
464 SSL3_TXT_EDH_RSA_DES_64_CBC_SHA,
465 SSL3_CK_EDH_RSA_DES_64_CBC_SHA,
466 SSL_kEDH|SSL_aRSA|SSL_DES |SSL_SHA1|SSL_SSLV3,
467 SSL_NOT_EXP|SSL_LOW,
468 0,
469 56,
470 56,
471 SSL_ALL_CIPHERS,
472 SSL_ALL_STRENGTHS,
473 },
474/* Cipher 16 */
475 {
476 1,
477 SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA,
478 SSL3_CK_EDH_RSA_DES_192_CBC3_SHA,
479 SSL_kEDH|SSL_aRSA|SSL_3DES |SSL_SHA1|SSL_SSLV3,
480 SSL_NOT_EXP|SSL_HIGH,
481 0,
482 168,
483 168,
484 SSL_ALL_CIPHERS,
485 SSL_ALL_STRENGTHS,
486 },
487
488/* Fortezza */
489/* Cipher 1C */
490 {
491 0,
492 SSL3_TXT_FZA_DMS_NULL_SHA,
493 SSL3_CK_FZA_DMS_NULL_SHA,
494 SSL_kFZA|SSL_aFZA |SSL_eNULL |SSL_SHA1|SSL_SSLV3,
495 SSL_NOT_EXP|SSL_STRONG_NONE,
496 0,
497 0,
498 0,
499 SSL_ALL_CIPHERS,
500 SSL_ALL_STRENGTHS,
501 },
502
503/* Cipher 1D */
504 {
505 0,
506 SSL3_TXT_FZA_DMS_FZA_SHA,
507 SSL3_CK_FZA_DMS_FZA_SHA,
508 SSL_kFZA|SSL_aFZA |SSL_eFZA |SSL_SHA1|SSL_SSLV3,
509 SSL_NOT_EXP|SSL_STRONG_NONE,
510 0,
511 0,
512 0,
513 SSL_ALL_CIPHERS,
514 SSL_ALL_STRENGTHS,
515 },
516
517/* Cipher 1E */
518 {
519 0,
520 SSL3_TXT_FZA_DMS_RC4_SHA,
521 SSL3_CK_FZA_DMS_RC4_SHA,
522 SSL_kFZA|SSL_aFZA |SSL_RC4 |SSL_SHA1|SSL_SSLV3,
523 SSL_NOT_EXP|SSL_MEDIUM,
524 0,
525 128,
526 128,
527 SSL_ALL_CIPHERS,
528 SSL_ALL_STRENGTHS,
529 },
530
531#ifndef OPENSSL_NO_KRB5
532/* The Kerberos ciphers
533** 20000107 VRS: And the first shall be last,
534** in hopes of avoiding the lynx ssl renegotiation problem.
535*/
536/* Cipher 21 VRS */
537 {
538 1,
539 SSL3_TXT_KRB5_DES_40_CBC_SHA,
540 SSL3_CK_KRB5_DES_40_CBC_SHA,
541 SSL_kKRB5|SSL_aKRB5| SSL_DES|SSL_SHA1 |SSL_SSLV3,
542 SSL_EXPORT|SSL_EXP40,
543 0,
544 40,
545 56,
546 SSL_ALL_CIPHERS,
547 SSL_ALL_STRENGTHS,
548 },
549
550/* Cipher 22 VRS */
551 {
552 1,
553 SSL3_TXT_KRB5_DES_40_CBC_MD5,
554 SSL3_CK_KRB5_DES_40_CBC_MD5,
555 SSL_kKRB5|SSL_aKRB5| SSL_DES|SSL_MD5 |SSL_SSLV3,
556 SSL_EXPORT|SSL_EXP40,
557 0,
558 40,
559 56,
560 SSL_ALL_CIPHERS,
561 SSL_ALL_STRENGTHS,
562 },
563
564/* Cipher 23 VRS */
565 {
566 1,
567 SSL3_TXT_KRB5_DES_64_CBC_SHA,
568 SSL3_CK_KRB5_DES_64_CBC_SHA,
569 SSL_kKRB5|SSL_aKRB5| SSL_DES|SSL_SHA1 |SSL_SSLV3,
570 SSL_NOT_EXP|SSL_LOW,
571 0,
572 56,
573 56,
574 SSL_ALL_CIPHERS,
575 SSL_ALL_STRENGTHS,
576 },
577
578/* Cipher 24 VRS */
579 {
580 1,
581 SSL3_TXT_KRB5_DES_64_CBC_MD5,
582 SSL3_CK_KRB5_DES_64_CBC_MD5,
583 SSL_kKRB5|SSL_aKRB5| SSL_DES|SSL_MD5 |SSL_SSLV3,
584 SSL_NOT_EXP|SSL_LOW,
585 0,
586 56,
587 56,
588 SSL_ALL_CIPHERS,
589 SSL_ALL_STRENGTHS,
590 },
591
592/* Cipher 25 VRS */
593 {
594 1,
595 SSL3_TXT_KRB5_DES_192_CBC3_SHA,
596 SSL3_CK_KRB5_DES_192_CBC3_SHA,
597 SSL_kKRB5|SSL_aKRB5| SSL_3DES|SSL_SHA1 |SSL_SSLV3,
598 SSL_NOT_EXP|SSL_HIGH,
599 0,
600 112,
601 168,
602 SSL_ALL_CIPHERS,
603 SSL_ALL_STRENGTHS,
604 },
605
606/* Cipher 26 VRS */
607 {
608 1,
609 SSL3_TXT_KRB5_DES_192_CBC3_MD5,
610 SSL3_CK_KRB5_DES_192_CBC3_MD5,
611 SSL_kKRB5|SSL_aKRB5| SSL_3DES|SSL_MD5 |SSL_SSLV3,
612 SSL_NOT_EXP|SSL_HIGH,
613 0,
614 112,
615 168,
616 SSL_ALL_CIPHERS,
617 SSL_ALL_STRENGTHS,
618 },
619#endif /* OPENSSL_NO_KRB5 */
620
621
622#if TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES
623 /* New TLS Export CipherSuites */
624 /* Cipher 60 */
625 {
626 1,
627 TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_MD5,
628 TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_MD5,
629 SSL_kRSA|SSL_aRSA|SSL_RC4|SSL_MD5|SSL_TLSV1,
630 SSL_EXPORT|SSL_EXP56,
631 0,
632 56,
633 128,
634 SSL_ALL_CIPHERS,
635 SSL_ALL_STRENGTHS,
636 },
637 /* Cipher 61 */
638 {
639 1,
640 TLS1_TXT_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5,
641 TLS1_CK_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5,
642 SSL_kRSA|SSL_aRSA|SSL_RC2|SSL_MD5|SSL_TLSV1,
643 SSL_EXPORT|SSL_EXP56,
644 0,
645 56,
646 128,
647 SSL_ALL_CIPHERS,
648 SSL_ALL_STRENGTHS,
649 },
650 /* Cipher 62 */
651 {
652 1,
653 TLS1_TXT_RSA_EXPORT1024_WITH_DES_CBC_SHA,
654 TLS1_CK_RSA_EXPORT1024_WITH_DES_CBC_SHA,
655 SSL_kRSA|SSL_aRSA|SSL_DES|SSL_SHA|SSL_TLSV1,
656 SSL_EXPORT|SSL_EXP56,
657 0,
658 56,
659 56,
660 SSL_ALL_CIPHERS,
661 SSL_ALL_STRENGTHS,
662 },
663 /* Cipher 63 */
664 {
665 1,
666 TLS1_TXT_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA,
667 TLS1_CK_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA,
668 SSL_kEDH|SSL_aDSS|SSL_DES|SSL_SHA|SSL_TLSV1,
669 SSL_EXPORT|SSL_EXP56,
670 0,
671 56,
672 56,
673 SSL_ALL_CIPHERS,
674 SSL_ALL_STRENGTHS,
675 },
676 /* Cipher 64 */
677 {
678 1,
679 TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_SHA,
680 TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_SHA,
681 SSL_kRSA|SSL_aRSA|SSL_RC4|SSL_SHA|SSL_TLSV1,
682 SSL_EXPORT|SSL_EXP56,
683 0,
684 56,
685 128,
686 SSL_ALL_CIPHERS,
687 SSL_ALL_STRENGTHS,
688 },
689 /* Cipher 65 */
690 {
691 1,
692 TLS1_TXT_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA,
693 TLS1_CK_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA,
694 SSL_kEDH|SSL_aDSS|SSL_RC4|SSL_SHA|SSL_TLSV1,
695 SSL_EXPORT|SSL_EXP56,
696 0,
697 56,
698 128,
699 SSL_ALL_CIPHERS,
700 SSL_ALL_STRENGTHS,
701 },
702 /* Cipher 66 */
703 {
704 1,
705 TLS1_TXT_DHE_DSS_WITH_RC4_128_SHA,
706 TLS1_CK_DHE_DSS_WITH_RC4_128_SHA,
707 SSL_kEDH|SSL_aDSS|SSL_RC4|SSL_SHA|SSL_TLSV1,
708 SSL_NOT_EXP|SSL_MEDIUM,
709 0,
710 128,
711 128,
712 SSL_ALL_CIPHERS,
713 SSL_ALL_STRENGTHS
714 },
715#endif
716 /* New AES ciphersuites */
717
718 /* Cipher 2F */
719 {
720 1,
721 TLS1_TXT_RSA_WITH_AES_128_SHA,
722 TLS1_CK_RSA_WITH_AES_128_SHA,
723 SSL_kRSA|SSL_aRSA|SSL_AES|SSL_SHA |SSL_TLSV1,
724 SSL_NOT_EXP|SSL_MEDIUM,
725 0,
726 128,
727 128,
728 SSL_ALL_CIPHERS,
729 SSL_ALL_STRENGTHS,
730 },
731 /* Cipher 30 */
732 {
733 0,
734 TLS1_TXT_DH_DSS_WITH_AES_128_SHA,
735 TLS1_CK_DH_DSS_WITH_AES_128_SHA,
736 SSL_kDHd|SSL_aDH|SSL_AES|SSL_SHA|SSL_TLSV1,
737 SSL_NOT_EXP|SSL_MEDIUM,
738 0,
739 128,
740 128,
741 SSL_ALL_CIPHERS,
742 SSL_ALL_STRENGTHS,
743 },
744 /* Cipher 31 */
745 {
746 0,
747 TLS1_TXT_DH_RSA_WITH_AES_128_SHA,
748 TLS1_CK_DH_RSA_WITH_AES_128_SHA,
749 SSL_kDHr|SSL_aDH|SSL_AES|SSL_SHA|SSL_TLSV1,
750 SSL_NOT_EXP|SSL_MEDIUM,
751 0,
752 128,
753 128,
754 SSL_ALL_CIPHERS,
755 SSL_ALL_STRENGTHS,
756 },
757 /* Cipher 32 */
758 {
759 1,
760 TLS1_TXT_DHE_DSS_WITH_AES_128_SHA,
761 TLS1_CK_DHE_DSS_WITH_AES_128_SHA,
762 SSL_kEDH|SSL_aDSS|SSL_AES|SSL_SHA|SSL_TLSV1,
763 SSL_NOT_EXP|SSL_MEDIUM,
764 0,
765 128,
766 128,
767 SSL_ALL_CIPHERS,
768 SSL_ALL_STRENGTHS,
769 },
770 /* Cipher 33 */
771 {
772 1,
773 TLS1_TXT_DHE_RSA_WITH_AES_128_SHA,
774 TLS1_CK_DHE_RSA_WITH_AES_128_SHA,
775 SSL_kEDH|SSL_aRSA|SSL_AES|SSL_SHA|SSL_TLSV1,
776 SSL_NOT_EXP|SSL_MEDIUM,
777 0,
778 128,
779 128,
780 SSL_ALL_CIPHERS,
781 SSL_ALL_STRENGTHS,
782 },
783 /* Cipher 34 */
784 {
785 1,
786 TLS1_TXT_ADH_WITH_AES_128_SHA,
787 TLS1_CK_ADH_WITH_AES_128_SHA,
788 SSL_kEDH|SSL_aNULL|SSL_AES|SSL_SHA|SSL_TLSV1,
789 SSL_NOT_EXP|SSL_MEDIUM,
790 0,
791 128,
792 128,
793 SSL_ALL_CIPHERS,
794 SSL_ALL_STRENGTHS,
795 },
796
797 /* Cipher 35 */
798 {
799 1,
800 TLS1_TXT_RSA_WITH_AES_256_SHA,
801 TLS1_CK_RSA_WITH_AES_256_SHA,
802 SSL_kRSA|SSL_aRSA|SSL_AES|SSL_SHA |SSL_TLSV1,
803 SSL_NOT_EXP|SSL_HIGH,
804 0,
805 256,
806 256,
807 SSL_ALL_CIPHERS,
808 SSL_ALL_STRENGTHS,
809 },
810 /* Cipher 36 */
811 {
812 0,
813 TLS1_TXT_DH_DSS_WITH_AES_256_SHA,
814 TLS1_CK_DH_DSS_WITH_AES_256_SHA,
815 SSL_kDHd|SSL_aDH|SSL_AES|SSL_SHA|SSL_TLSV1,
816 SSL_NOT_EXP|SSL_HIGH,
817 0,
818 256,
819 256,
820 SSL_ALL_CIPHERS,
821 SSL_ALL_STRENGTHS,
822 },
823 /* Cipher 37 */
824 {
825 0,
826 TLS1_TXT_DH_RSA_WITH_AES_256_SHA,
827 TLS1_CK_DH_RSA_WITH_AES_256_SHA,
828 SSL_kDHr|SSL_aDH|SSL_AES|SSL_SHA|SSL_TLSV1,
829 SSL_NOT_EXP|SSL_HIGH,
830 0,
831 256,
832 256,
833 SSL_ALL_CIPHERS,
834 SSL_ALL_STRENGTHS,
835 },
836 /* Cipher 38 */
837 {
838 1,
839 TLS1_TXT_DHE_DSS_WITH_AES_256_SHA,
840 TLS1_CK_DHE_DSS_WITH_AES_256_SHA,
841 SSL_kEDH|SSL_aDSS|SSL_AES|SSL_SHA|SSL_TLSV1,
842 SSL_NOT_EXP|SSL_HIGH,
843 0,
844 256,
845 256,
846 SSL_ALL_CIPHERS,
847 SSL_ALL_STRENGTHS,
848 },
849 /* Cipher 39 */
850 {
851 1,
852 TLS1_TXT_DHE_RSA_WITH_AES_256_SHA,
853 TLS1_CK_DHE_RSA_WITH_AES_256_SHA,
854 SSL_kEDH|SSL_aRSA|SSL_AES|SSL_SHA|SSL_TLSV1,
855 SSL_NOT_EXP|SSL_HIGH,
856 0,
857 256,
858 256,
859 SSL_ALL_CIPHERS,
860 SSL_ALL_STRENGTHS,
861 },
862 /* Cipher 3A */
863 {
864 1,
865 TLS1_TXT_ADH_WITH_AES_256_SHA,
866 TLS1_CK_ADH_WITH_AES_256_SHA,
867 SSL_kEDH|SSL_aNULL|SSL_AES|SSL_SHA|SSL_TLSV1,
868 SSL_NOT_EXP|SSL_HIGH,
869 0,
870 256,
871 256,
872 SSL_ALL_CIPHERS,
873 SSL_ALL_STRENGTHS,
874 },
875
876/* end of list */
877 };
878
879static SSL3_ENC_METHOD SSLv3_enc_data={
880 ssl3_enc,
881 ssl3_mac,
882 ssl3_setup_key_block,
883 ssl3_generate_master_secret,
884 ssl3_change_cipher_state,
885 ssl3_final_finish_mac,
886 MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH,
887 ssl3_cert_verify_mac,
888 SSL3_MD_CLIENT_FINISHED_CONST,4,
889 SSL3_MD_SERVER_FINISHED_CONST,4,
890 ssl3_alert_code,
891 };
892
893static SSL_METHOD SSLv3_data= {
894 SSL3_VERSION,
895 ssl3_new,
896 ssl3_clear,
897 ssl3_free,
898 ssl_undefined_function,
899 ssl_undefined_function,
900 ssl3_read,
901 ssl3_peek,
902 ssl3_write,
903 ssl3_shutdown,
904 ssl3_renegotiate,
905 ssl3_renegotiate_check,
906 ssl3_ctrl,
907 ssl3_ctx_ctrl,
908 ssl3_get_cipher_by_char,
909 ssl3_put_cipher_by_char,
910 ssl3_pending,
911 ssl3_num_ciphers,
912 ssl3_get_cipher,
913 ssl_bad_method,
914 ssl3_default_timeout,
915 &SSLv3_enc_data,
916 ssl_undefined_function,
917 ssl3_callback_ctrl,
918 ssl3_ctx_callback_ctrl,
919 };
920
921static long ssl3_default_timeout(void)
922 {
923 /* 2 hours, the 24 hours mentioned in the SSLv3 spec
924 * is way too long for http, the cache would over fill */
925 return(60*60*2);
926 }
927
928SSL_METHOD *sslv3_base_method(void)
929 {
930 return(&SSLv3_data);
931 }
932
933int ssl3_num_ciphers(void)
934 {
935 return(SSL3_NUM_CIPHERS);
936 }
937
938SSL_CIPHER *ssl3_get_cipher(unsigned int u)
939 {
940 if (u < SSL3_NUM_CIPHERS)
941 return(&(ssl3_ciphers[SSL3_NUM_CIPHERS-1-u]));
942 else
943 return(NULL);
944 }
945
946int ssl3_pending(SSL *s)
947 {
948 if (s->rstate == SSL_ST_READ_BODY)
949 return 0;
950
951 return (s->s3->rrec.type == SSL3_RT_APPLICATION_DATA) ? s->s3->rrec.length : 0;
952 }
953
954int ssl3_new(SSL *s)
955 {
956 SSL3_STATE *s3;
957
958 if ((s3=OPENSSL_malloc(sizeof *s3)) == NULL) goto err;
959 memset(s3,0,sizeof *s3);
960 EVP_MD_CTX_init(&s3->finish_dgst1);
961 EVP_MD_CTX_init(&s3->finish_dgst2);
962
963 s->s3=s3;
964
965 s->method->ssl_clear(s);
966 return(1);
967err:
968 return(0);
969 }
970
971void ssl3_free(SSL *s)
972 {
973 if(s == NULL)
974 return;
975
976 ssl3_cleanup_key_block(s);
977 if (s->s3->rbuf.buf != NULL)
978 OPENSSL_free(s->s3->rbuf.buf);
979 if (s->s3->wbuf.buf != NULL)
980 OPENSSL_free(s->s3->wbuf.buf);
981 if (s->s3->rrec.comp != NULL)
982 OPENSSL_free(s->s3->rrec.comp);
983#ifndef OPENSSL_NO_DH
984 if (s->s3->tmp.dh != NULL)
985 DH_free(s->s3->tmp.dh);
986#endif
987 if (s->s3->tmp.ca_names != NULL)
988 sk_X509_NAME_pop_free(s->s3->tmp.ca_names,X509_NAME_free);
989 EVP_MD_CTX_cleanup(&s->s3->finish_dgst1);
990 EVP_MD_CTX_cleanup(&s->s3->finish_dgst2);
991 memset(s->s3,0,sizeof *s->s3);
992 OPENSSL_free(s->s3);
993 s->s3=NULL;
994 }
995
996void ssl3_clear(SSL *s)
997 {
998 unsigned char *rp,*wp;
999 size_t rlen, wlen;
1000
1001 ssl3_cleanup_key_block(s);
1002 if (s->s3->tmp.ca_names != NULL)
1003 sk_X509_NAME_pop_free(s->s3->tmp.ca_names,X509_NAME_free);
1004
1005 if (s->s3->rrec.comp != NULL)
1006 {
1007 OPENSSL_free(s->s3->rrec.comp);
1008 s->s3->rrec.comp=NULL;
1009 }
1010#ifndef OPENSSL_NO_DH
1011 if (s->s3->tmp.dh != NULL)
1012 DH_free(s->s3->tmp.dh);
1013#endif
1014
1015 rp = s->s3->rbuf.buf;
1016 wp = s->s3->wbuf.buf;
1017 rlen = s->s3->rbuf.len;
1018 wlen = s->s3->wbuf.len;
1019
1020 EVP_MD_CTX_cleanup(&s->s3->finish_dgst1);
1021 EVP_MD_CTX_cleanup(&s->s3->finish_dgst2);
1022
1023 memset(s->s3,0,sizeof *s->s3);
1024 s->s3->rbuf.buf = rp;
1025 s->s3->wbuf.buf = wp;
1026 s->s3->rbuf.len = rlen;
1027 s->s3->wbuf.len = wlen;
1028
1029 ssl_free_wbio_buffer(s);
1030
1031 s->packet_length=0;
1032 s->s3->renegotiate=0;
1033 s->s3->total_renegotiations=0;
1034 s->s3->num_renegotiations=0;
1035 s->s3->in_read_app_data=0;
1036 s->version=SSL3_VERSION;
1037 }
1038
1039long ssl3_ctrl(SSL *s, int cmd, long larg, void *parg)
1040 {
1041 int ret=0;
1042
1043#if !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_RSA)
1044 if (
1045#ifndef OPENSSL_NO_RSA
1046 cmd == SSL_CTRL_SET_TMP_RSA ||
1047 cmd == SSL_CTRL_SET_TMP_RSA_CB ||
1048#endif
1049#ifndef OPENSSL_NO_DSA
1050 cmd == SSL_CTRL_SET_TMP_DH ||
1051 cmd == SSL_CTRL_SET_TMP_DH_CB ||
1052#endif
1053 0)
1054 {
1055 if (!ssl_cert_inst(&s->cert))
1056 {
1057 SSLerr(SSL_F_SSL3_CTRL, ERR_R_MALLOC_FAILURE);
1058 return(0);
1059 }
1060 }
1061#endif
1062
1063 switch (cmd)
1064 {
1065 case SSL_CTRL_GET_SESSION_REUSED:
1066 ret=s->hit;
1067 break;
1068 case SSL_CTRL_GET_CLIENT_CERT_REQUEST:
1069 break;
1070 case SSL_CTRL_GET_NUM_RENEGOTIATIONS:
1071 ret=s->s3->num_renegotiations;
1072 break;
1073 case SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS:
1074 ret=s->s3->num_renegotiations;
1075 s->s3->num_renegotiations=0;
1076 break;
1077 case SSL_CTRL_GET_TOTAL_RENEGOTIATIONS:
1078 ret=s->s3->total_renegotiations;
1079 break;
1080 case SSL_CTRL_GET_FLAGS:
1081 ret=(int)(s->s3->flags);
1082 break;
1083#ifndef OPENSSL_NO_RSA
1084 case SSL_CTRL_NEED_TMP_RSA:
1085 if ((s->cert != NULL) && (s->cert->rsa_tmp == NULL) &&
1086 ((s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL) ||
1087 (EVP_PKEY_size(s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey) > (512/8))))
1088 ret = 1;
1089 break;
1090 case SSL_CTRL_SET_TMP_RSA:
1091 {
1092 RSA *rsa = (RSA *)parg;
1093 if (rsa == NULL)
1094 {
1095 SSLerr(SSL_F_SSL3_CTRL, ERR_R_PASSED_NULL_PARAMETER);
1096 return(ret);
1097 }
1098 if ((rsa = RSAPrivateKey_dup(rsa)) == NULL)
1099 {
1100 SSLerr(SSL_F_SSL3_CTRL, ERR_R_RSA_LIB);
1101 return(ret);
1102 }
1103 if (s->cert->rsa_tmp != NULL)
1104 RSA_free(s->cert->rsa_tmp);
1105 s->cert->rsa_tmp = rsa;
1106 ret = 1;
1107 }
1108 break;
1109 case SSL_CTRL_SET_TMP_RSA_CB:
1110 {
1111 SSLerr(SSL_F_SSL3_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
1112 return(ret);
1113 }
1114 break;
1115#endif
1116#ifndef OPENSSL_NO_DH
1117 case SSL_CTRL_SET_TMP_DH:
1118 {
1119 DH *dh = (DH *)parg;
1120 if (dh == NULL)
1121 {
1122 SSLerr(SSL_F_SSL3_CTRL, ERR_R_PASSED_NULL_PARAMETER);
1123 return(ret);
1124 }
1125 if ((dh = DHparams_dup(dh)) == NULL)
1126 {
1127 SSLerr(SSL_F_SSL3_CTRL, ERR_R_DH_LIB);
1128 return(ret);
1129 }
1130 if (!(s->options & SSL_OP_SINGLE_DH_USE))
1131 {
1132 if (!DH_generate_key(dh))
1133 {
1134 DH_free(dh);
1135 SSLerr(SSL_F_SSL3_CTRL, ERR_R_DH_LIB);
1136 return(ret);
1137 }
1138 }
1139 if (s->cert->dh_tmp != NULL)
1140 DH_free(s->cert->dh_tmp);
1141 s->cert->dh_tmp = dh;
1142 ret = 1;
1143 }
1144 break;
1145 case SSL_CTRL_SET_TMP_DH_CB:
1146 {
1147 SSLerr(SSL_F_SSL3_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
1148 return(ret);
1149 }
1150 break;
1151#endif
1152 default:
1153 break;
1154 }
1155 return(ret);
1156 }
1157
1158long ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)())
1159 {
1160 int ret=0;
1161
1162#if !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_RSA)
1163 if (
1164#ifndef OPENSSL_NO_RSA
1165 cmd == SSL_CTRL_SET_TMP_RSA_CB ||
1166#endif
1167#ifndef OPENSSL_NO_DSA
1168 cmd == SSL_CTRL_SET_TMP_DH_CB ||
1169#endif
1170 0)
1171 {
1172 if (!ssl_cert_inst(&s->cert))
1173 {
1174 SSLerr(SSL_F_SSL3_CALLBACK_CTRL, ERR_R_MALLOC_FAILURE);
1175 return(0);
1176 }
1177 }
1178#endif
1179
1180 switch (cmd)
1181 {
1182#ifndef OPENSSL_NO_RSA
1183 case SSL_CTRL_SET_TMP_RSA_CB:
1184 {
1185 s->cert->rsa_tmp_cb = (RSA *(*)(SSL *, int, int))fp;
1186 }
1187 break;
1188#endif
1189#ifndef OPENSSL_NO_DH
1190 case SSL_CTRL_SET_TMP_DH_CB:
1191 {
1192 s->cert->dh_tmp_cb = (DH *(*)(SSL *, int, int))fp;
1193 }
1194 break;
1195#endif
1196 default:
1197 break;
1198 }
1199 return(ret);
1200 }
1201
1202long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg)
1203 {
1204 CERT *cert;
1205
1206 cert=ctx->cert;
1207
1208 switch (cmd)
1209 {
1210#ifndef OPENSSL_NO_RSA
1211 case SSL_CTRL_NEED_TMP_RSA:
1212 if ( (cert->rsa_tmp == NULL) &&
1213 ((cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL) ||
1214 (EVP_PKEY_size(cert->pkeys[SSL_PKEY_RSA_ENC].privatekey) > (512/8)))
1215 )
1216 return(1);
1217 else
1218 return(0);
1219 /* break; */
1220 case SSL_CTRL_SET_TMP_RSA:
1221 {
1222 RSA *rsa;
1223 int i;
1224
1225 rsa=(RSA *)parg;
1226 i=1;
1227 if (rsa == NULL)
1228 i=0;
1229 else
1230 {
1231 if ((rsa=RSAPrivateKey_dup(rsa)) == NULL)
1232 i=0;
1233 }
1234 if (!i)
1235 {
1236 SSLerr(SSL_F_SSL3_CTX_CTRL,ERR_R_RSA_LIB);
1237 return(0);
1238 }
1239 else
1240 {
1241 if (cert->rsa_tmp != NULL)
1242 RSA_free(cert->rsa_tmp);
1243 cert->rsa_tmp=rsa;
1244 return(1);
1245 }
1246 }
1247 /* break; */
1248 case SSL_CTRL_SET_TMP_RSA_CB:
1249 {
1250 SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
1251 return(0);
1252 }
1253 break;
1254#endif
1255#ifndef OPENSSL_NO_DH
1256 case SSL_CTRL_SET_TMP_DH:
1257 {
1258 DH *new=NULL,*dh;
1259
1260 dh=(DH *)parg;
1261 if ((new=DHparams_dup(dh)) == NULL)
1262 {
1263 SSLerr(SSL_F_SSL3_CTX_CTRL,ERR_R_DH_LIB);
1264 return 0;
1265 }
1266 if (!(ctx->options & SSL_OP_SINGLE_DH_USE))
1267 {
1268 if (!DH_generate_key(new))
1269 {
1270 SSLerr(SSL_F_SSL3_CTX_CTRL,ERR_R_DH_LIB);
1271 DH_free(new);
1272 return 0;
1273 }
1274 }
1275 if (cert->dh_tmp != NULL)
1276 DH_free(cert->dh_tmp);
1277 cert->dh_tmp=new;
1278 return 1;
1279 }
1280 /*break; */
1281 case SSL_CTRL_SET_TMP_DH_CB:
1282 {
1283 SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
1284 return(0);
1285 }
1286 break;
1287#endif
1288 /* A Thawte special :-) */
1289 case SSL_CTRL_EXTRA_CHAIN_CERT:
1290 if (ctx->extra_certs == NULL)
1291 {
1292 if ((ctx->extra_certs=sk_X509_new_null()) == NULL)
1293 return(0);
1294 }
1295 sk_X509_push(ctx->extra_certs,(X509 *)parg);
1296 break;
1297
1298 default:
1299 return(0);
1300 }
1301 return(1);
1302 }
1303
1304long ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)())
1305 {
1306 CERT *cert;
1307
1308 cert=ctx->cert;
1309
1310 switch (cmd)
1311 {
1312#ifndef OPENSSL_NO_RSA
1313 case SSL_CTRL_SET_TMP_RSA_CB:
1314 {
1315 cert->rsa_tmp_cb = (RSA *(*)(SSL *, int, int))fp;
1316 }
1317 break;
1318#endif
1319#ifndef OPENSSL_NO_DH
1320 case SSL_CTRL_SET_TMP_DH_CB:
1321 {
1322 cert->dh_tmp_cb = (DH *(*)(SSL *, int, int))fp;
1323 }
1324 break;
1325#endif
1326 default:
1327 return(0);
1328 }
1329 return(1);
1330 }
1331
1332/* This function needs to check if the ciphers required are actually
1333 * available */
1334SSL_CIPHER *ssl3_get_cipher_by_char(const unsigned char *p)
1335 {
1336 static int init=1;
1337 static SSL_CIPHER *sorted[SSL3_NUM_CIPHERS];
1338 SSL_CIPHER c,*cp= &c,**cpp;
1339 unsigned long id;
1340 int i;
1341
1342 if (init)
1343 {
1344 CRYPTO_w_lock(CRYPTO_LOCK_SSL);
1345
1346 for (i=0; i<SSL3_NUM_CIPHERS; i++)
1347 sorted[i]= &(ssl3_ciphers[i]);
1348
1349 qsort( (char *)sorted,
1350 SSL3_NUM_CIPHERS,sizeof(SSL_CIPHER *),
1351 FP_ICC ssl_cipher_ptr_id_cmp);
1352
1353 CRYPTO_w_unlock(CRYPTO_LOCK_SSL);
1354
1355 init=0;
1356 }
1357
1358 id=0x03000000L|((unsigned long)p[0]<<8L)|(unsigned long)p[1];
1359 c.id=id;
1360 cpp=(SSL_CIPHER **)OBJ_bsearch((char *)&cp,
1361 (char *)sorted,
1362 SSL3_NUM_CIPHERS,sizeof(SSL_CIPHER *),
1363 FP_ICC ssl_cipher_ptr_id_cmp);
1364 if ((cpp == NULL) || !(*cpp)->valid)
1365 return(NULL);
1366 else
1367 return(*cpp);
1368 }
1369
1370int ssl3_put_cipher_by_char(const SSL_CIPHER *c, unsigned char *p)
1371 {
1372 long l;
1373
1374 if (p != NULL)
1375 {
1376 l=c->id;
1377 if ((l & 0xff000000) != 0x03000000) return(0);
1378 p[0]=((unsigned char)(l>> 8L))&0xFF;
1379 p[1]=((unsigned char)(l ))&0xFF;
1380 }
1381 return(2);
1382 }
1383
1384SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt,
1385 STACK_OF(SSL_CIPHER) *srvr)
1386 {
1387 SSL_CIPHER *c,*ret=NULL;
1388 STACK_OF(SSL_CIPHER) *prio, *allow;
1389 int i,j,ok;
1390 CERT *cert;
1391 unsigned long alg,mask,emask;
1392
1393 /* Let's see which ciphers we can support */
1394 cert=s->cert;
1395
1396#if 0
1397 /* Do not set the compare functions, because this may lead to a
1398 * reordering by "id". We want to keep the original ordering.
1399 * We may pay a price in performance during sk_SSL_CIPHER_find(),
1400 * but would have to pay with the price of sk_SSL_CIPHER_dup().
1401 */
1402 sk_SSL_CIPHER_set_cmp_func(srvr, ssl_cipher_ptr_id_cmp);
1403 sk_SSL_CIPHER_set_cmp_func(clnt, ssl_cipher_ptr_id_cmp);
1404#endif
1405
1406#ifdef CIPHER_DEBUG
1407 printf("Server has %d from %p:\n", sk_SSL_CIPHER_num(srvr), srvr);
1408 for(i=0 ; i < sk_SSL_CIPHER_num(srvr) ; ++i)
1409 {
1410 c=sk_SSL_CIPHER_value(srvr,i);
1411 printf("%p:%s\n",c,c->name);
1412 }
1413 printf("Client sent %d from %p:\n", sk_SSL_CIPHER_num(clnt), clnt);
1414 for(i=0 ; i < sk_SSL_CIPHER_num(clnt) ; ++i)
1415 {
1416 c=sk_SSL_CIPHER_value(clnt,i);
1417 printf("%p:%s\n",c,c->name);
1418 }
1419#endif
1420
1421 if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE)
1422 {
1423 prio = srvr;
1424 allow = clnt;
1425 }
1426 else
1427 {
1428 prio = clnt;
1429 allow = srvr;
1430 }
1431
1432 for (i=0; i<sk_SSL_CIPHER_num(prio); i++)
1433 {
1434 c=sk_SSL_CIPHER_value(prio,i);
1435
1436 ssl_set_cert_masks(cert,c);
1437 mask=cert->mask;
1438 emask=cert->export_mask;
1439
1440#ifdef KSSL_DEBUG
1441 printf("ssl3_choose_cipher %d alg= %lx\n", i,c->algorithms);
1442#endif /* KSSL_DEBUG */
1443
1444 alg=c->algorithms&(SSL_MKEY_MASK|SSL_AUTH_MASK);
1445#ifndef OPENSSL_NO_KRB5
1446 if (alg & SSL_KRB5)
1447 {
1448 if ( !kssl_keytab_is_available(s->kssl_ctx) )
1449 continue;
1450 }
1451#endif /* OPENSSL_NO_KRB5 */
1452 if (SSL_C_IS_EXPORT(c))
1453 {
1454 ok=((alg & emask) == alg)?1:0;
1455#ifdef CIPHER_DEBUG
1456 printf("%d:[%08lX:%08lX]%p:%s (export)\n",ok,alg,emask,
1457 c,c->name);
1458#endif
1459 }
1460 else
1461 {
1462 ok=((alg & mask) == alg)?1:0;
1463#ifdef CIPHER_DEBUG
1464 printf("%d:[%08lX:%08lX]%p:%s\n",ok,alg,mask,c,
1465 c->name);
1466#endif
1467 }
1468
1469 if (!ok) continue;
1470
1471 j=sk_SSL_CIPHER_find(allow,c);
1472 if (j >= 0)
1473 {
1474 ret=sk_SSL_CIPHER_value(allow,j);
1475 break;
1476 }
1477 }
1478 return(ret);
1479 }
1480
1481int ssl3_get_req_cert_type(SSL *s, unsigned char *p)
1482 {
1483 int ret=0;
1484 unsigned long alg;
1485
1486 alg=s->s3->tmp.new_cipher->algorithms;
1487
1488#ifndef OPENSSL_NO_DH
1489 if (alg & (SSL_kDHr|SSL_kEDH))
1490 {
1491# ifndef OPENSSL_NO_RSA
1492 p[ret++]=SSL3_CT_RSA_FIXED_DH;
1493# endif
1494# ifndef OPENSSL_NO_DSA
1495 p[ret++]=SSL3_CT_DSS_FIXED_DH;
1496# endif
1497 }
1498 if ((s->version == SSL3_VERSION) &&
1499 (alg & (SSL_kEDH|SSL_kDHd|SSL_kDHr)))
1500 {
1501# ifndef OPENSSL_NO_RSA
1502 p[ret++]=SSL3_CT_RSA_EPHEMERAL_DH;
1503# endif
1504# ifndef OPENSSL_NO_DSA
1505 p[ret++]=SSL3_CT_DSS_EPHEMERAL_DH;
1506# endif
1507 }
1508#endif /* !OPENSSL_NO_DH */
1509#ifndef OPENSSL_NO_RSA
1510 p[ret++]=SSL3_CT_RSA_SIGN;
1511#endif
1512#ifndef OPENSSL_NO_DSA
1513 p[ret++]=SSL3_CT_DSS_SIGN;
1514#endif
1515 return(ret);
1516 }
1517
1518int ssl3_shutdown(SSL *s)
1519 {
1520
1521 /* Don't do anything much if we have not done the handshake or
1522 * we don't want to send messages :-) */
1523 if ((s->quiet_shutdown) || (s->state == SSL_ST_BEFORE))
1524 {
1525 s->shutdown=(SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);
1526 return(1);
1527 }
1528
1529 if (!(s->shutdown & SSL_SENT_SHUTDOWN))
1530 {
1531 s->shutdown|=SSL_SENT_SHUTDOWN;
1532#if 1
1533 ssl3_send_alert(s,SSL3_AL_WARNING,SSL_AD_CLOSE_NOTIFY);
1534#endif
1535 /* our shutdown alert has been sent now, and if it still needs
1536 * to be written, s->s3->alert_dispatch will be true */
1537 }
1538 else if (s->s3->alert_dispatch)
1539 {
1540 /* resend it if not sent */
1541#if 1
1542 ssl3_dispatch_alert(s);
1543#endif
1544 }
1545 else if (!(s->shutdown & SSL_RECEIVED_SHUTDOWN))
1546 {
1547 /* If we are waiting for a close from our peer, we are closed */
1548 ssl3_read_bytes(s,0,NULL,0,0);
1549 }
1550
1551 if ((s->shutdown == (SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN)) &&
1552 !s->s3->alert_dispatch)
1553 return(1);
1554 else
1555 return(0);
1556 }
1557
1558int ssl3_write(SSL *s, const void *buf, int len)
1559 {
1560 int ret,n;
1561
1562#if 0
1563 if (s->shutdown & SSL_SEND_SHUTDOWN)
1564 {
1565 s->rwstate=SSL_NOTHING;
1566 return(0);
1567 }
1568#endif
1569 clear_sys_error();
1570 if (s->s3->renegotiate) ssl3_renegotiate_check(s);
1571
1572 /* This is an experimental flag that sends the
1573 * last handshake message in the same packet as the first
1574 * use data - used to see if it helps the TCP protocol during
1575 * session-id reuse */
1576 /* The second test is because the buffer may have been removed */
1577 if ((s->s3->flags & SSL3_FLAGS_POP_BUFFER) && (s->wbio == s->bbio))
1578 {
1579 /* First time through, we write into the buffer */
1580 if (s->s3->delay_buf_pop_ret == 0)
1581 {
1582 ret=ssl3_write_bytes(s,SSL3_RT_APPLICATION_DATA,
1583 buf,len);
1584 if (ret <= 0) return(ret);
1585
1586 s->s3->delay_buf_pop_ret=ret;
1587 }
1588
1589 s->rwstate=SSL_WRITING;
1590 n=BIO_flush(s->wbio);
1591 if (n <= 0) return(n);
1592 s->rwstate=SSL_NOTHING;
1593
1594 /* We have flushed the buffer, so remove it */
1595 ssl_free_wbio_buffer(s);
1596 s->s3->flags&= ~SSL3_FLAGS_POP_BUFFER;
1597
1598 ret=s->s3->delay_buf_pop_ret;
1599 s->s3->delay_buf_pop_ret=0;
1600 }
1601 else
1602 {
1603 ret=ssl3_write_bytes(s,SSL3_RT_APPLICATION_DATA,
1604 buf,len);
1605 if (ret <= 0) return(ret);
1606 }
1607
1608 return(ret);
1609 }
1610
1611static int ssl3_read_internal(SSL *s, void *buf, int len, int peek)
1612 {
1613 int ret;
1614
1615 clear_sys_error();
1616 if (s->s3->renegotiate) ssl3_renegotiate_check(s);
1617 s->s3->in_read_app_data=1;
1618 ret=ssl3_read_bytes(s,SSL3_RT_APPLICATION_DATA,buf,len,peek);
1619 if ((ret == -1) && (s->s3->in_read_app_data == 2))
1620 {
1621 /* ssl3_read_bytes decided to call s->handshake_func, which
1622 * called ssl3_read_bytes to read handshake data.
1623 * However, ssl3_read_bytes actually found application data
1624 * and thinks that application data makes sense here; so disable
1625 * handshake processing and try to read application data again. */
1626 s->in_handshake++;
1627 ret=ssl3_read_bytes(s,SSL3_RT_APPLICATION_DATA,buf,len,peek);
1628 s->in_handshake--;
1629 }
1630 else
1631 s->s3->in_read_app_data=0;
1632
1633 return(ret);
1634 }
1635
1636int ssl3_read(SSL *s, void *buf, int len)
1637 {
1638 return ssl3_read_internal(s, buf, len, 0);
1639 }
1640
1641int ssl3_peek(SSL *s, void *buf, int len)
1642 {
1643 return ssl3_read_internal(s, buf, len, 1);
1644 }
1645
1646int ssl3_renegotiate(SSL *s)
1647 {
1648 if (s->handshake_func == NULL)
1649 return(1);
1650
1651 if (s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS)
1652 return(0);
1653
1654 s->s3->renegotiate=1;
1655 return(1);
1656 }
1657
1658int ssl3_renegotiate_check(SSL *s)
1659 {
1660 int ret=0;
1661
1662 if (s->s3->renegotiate)
1663 {
1664 if ( (s->s3->rbuf.left == 0) &&
1665 (s->s3->wbuf.left == 0) &&
1666 !SSL_in_init(s))
1667 {
1668/*
1669if we are the server, and we have sent a 'RENEGOTIATE' message, we
1670need to go to SSL_ST_ACCEPT.
1671*/
1672 /* SSL_ST_ACCEPT */
1673 s->state=SSL_ST_RENEGOTIATE;
1674 s->s3->renegotiate=0;
1675 s->s3->num_renegotiations++;
1676 s->s3->total_renegotiations++;
1677 ret=1;
1678 }
1679 }
1680 return(ret);
1681 }
1682
diff --git a/src/lib/libssl/s3_pkt.c b/src/lib/libssl/s3_pkt.c
deleted file mode 100644
index 3f88429e79..0000000000
--- a/src/lib/libssl/s3_pkt.c
+++ /dev/null
@@ -1,1302 +0,0 @@
1/* ssl/s3_pkt.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58/* ====================================================================
59 * Copyright (c) 1998-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 */
111
112#include <stdio.h>
113#include <errno.h>
114#define USE_SOCKETS
115#include "ssl_locl.h"
116#include <openssl/evp.h>
117#include <openssl/buffer.h>
118
119static int do_ssl3_write(SSL *s, int type, const unsigned char *buf,
120 unsigned int len, int create_empty_fragment);
121static int ssl3_write_pending(SSL *s, int type, const unsigned char *buf,
122 unsigned int len);
123static int ssl3_get_record(SSL *s);
124static int do_compress(SSL *ssl);
125static int do_uncompress(SSL *ssl);
126static int do_change_cipher_spec(SSL *ssl);
127
128/* used only by ssl3_get_record */
129static int ssl3_read_n(SSL *s, int n, int max, int extend)
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 */
138 int i,off,newb;
139
140 if (!extend)
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 */
151 if (s->s3->rbuf.left >= (int)n)
152 {
153 s->packet_length+=n;
154 s->s3->rbuf.left-=n;
155 s->s3->rbuf.offset+=n;
156 return(n);
157 }
158
159 /* else we need to read more data */
160 if (!s->read_ahead)
161 max=n;
162
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;
173 }
174
175 off = s->packet_length;
176 newb = s->s3->rbuf.left;
177 /* Move any available bytes to front of buffer:
178 * 'off' bytes already pointed to by 'packet',
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 }
186
187 while (newb < n)
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
192 clear_sys_error();
193 if (s->rbio != NULL)
194 {
195 s->rwstate=SSL_READING;
196 i=BIO_read(s->rbio, &(s->s3->rbuf.buf[off+newb]), max-newb);
197 }
198 else
199 {
200 SSLerr(SSL_F_SSL3_READ_N,SSL_R_READ_BIO_NOT_SET);
201 i = -1;
202 }
203
204 if (i <= 0)
205 {
206 s->s3->rbuf.left = newb;
207 return(i);
208 }
209 newb+=i;
210 }
211
212 /* done reading, now the book-keeping */
213 s->s3->rbuf.offset = off + n;
214 s->s3->rbuf.left = newb - n;
215 s->packet_length += n;
216 s->rwstate=SSL_NOTHING;
217 return(n);
218 }
219
220/* Call this to get a new input record.
221 * It will return <= 0 if more data is needed, normally due to an error
222 * or non-blocking IO.
223 * When it finishes, one packet has been decoded and can be found in
224 * ssl->s3->rrec.type - is the type of record
225 * ssl->s3->rrec.data, - data
226 * ssl->s3->rrec.length, - number of bytes
227 */
228/* used only by ssl3_read_bytes */
229static int ssl3_get_record(SSL *s)
230 {
231 int ssl_major,ssl_minor,al;
232 int enc_err,n,i,ret= -1;
233 SSL3_RECORD *rr;
234 SSL_SESSION *sess;
235 unsigned char *p;
236 unsigned char md[EVP_MAX_MD_SIZE];
237 short version;
238 unsigned int mac_size;
239 int clear=0;
240 size_t extra;
241 int decryption_failed_or_bad_record_mac = 0;
242 unsigned char *mac = NULL;
243
244 rr= &(s->s3->rrec);
245 sess=s->session;
246
247 if (s->options & SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER)
248 extra=SSL3_RT_MAX_EXTRA;
249 else
250 extra=0;
251 if (extra != s->s3->rbuf.len - SSL3_RT_MAX_PACKET_SIZE)
252 {
253 /* actually likely an application error: SLS_OP_MICROSOFT_BIG_SSLV3_BUFFER
254 * set after ssl3_setup_buffers() was done */
255 SSLerr(SSL_F_SSL3_GET_RECORD, ERR_R_INTERNAL_ERROR);
256 return -1;
257 }
258
259again:
260 /* check if we have the header */
261 if ( (s->rstate != SSL_ST_READ_BODY) ||
262 (s->packet_length < SSL3_RT_HEADER_LENGTH))
263 {
264 n=ssl3_read_n(s, SSL3_RT_HEADER_LENGTH, s->s3->rbuf.len, 0);
265 if (n <= 0) return(n); /* error or non-blocking */
266 s->rstate=SSL_ST_READ_BODY;
267
268 p=s->packet;
269
270 /* Pull apart the header into the SSL3_RECORD */
271 rr->type= *(p++);
272 ssl_major= *(p++);
273 ssl_minor= *(p++);
274 version=(ssl_major<<8)|ssl_minor;
275 n2s(p,rr->length);
276
277 /* Lets check version */
278 if (s->first_packet)
279 {
280 s->first_packet=0;
281 }
282 else
283 {
284 if (version != s->version)
285 {
286 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_WRONG_VERSION_NUMBER);
287 /* Send back error using their
288 * version number :-) */
289 s->version=version;
290 al=SSL_AD_PROTOCOL_VERSION;
291 goto f_err;
292 }
293 }
294
295 if ((version>>8) != SSL3_VERSION_MAJOR)
296 {
297 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_WRONG_VERSION_NUMBER);
298 goto err;
299 }
300
301 if (rr->length > SSL3_RT_MAX_ENCRYPTED_LENGTH+extra)
302 {
303 al=SSL_AD_RECORD_OVERFLOW;
304 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_PACKET_LENGTH_TOO_LONG);
305 goto f_err;
306 }
307
308 /* now s->rstate == SSL_ST_READ_BODY */
309 }
310
311 /* s->rstate == SSL_ST_READ_BODY, get and decode the data */
312
313 if (rr->length > s->packet_length-SSL3_RT_HEADER_LENGTH)
314 {
315 /* now s->packet_length == SSL3_RT_HEADER_LENGTH */
316 i=rr->length;
317 n=ssl3_read_n(s,i,i,1);
318 if (n <= 0) return(n); /* error or non-blocking io */
319 /* now n == rr->length,
320 * and s->packet_length == SSL3_RT_HEADER_LENGTH + rr->length */
321 }
322
323 s->rstate=SSL_ST_READ_HEADER; /* set state for later operations */
324
325 /* At this point, s->packet_length == SSL3_RT_HEADER_LNGTH + rr->length,
326 * and we have that many bytes in s->packet
327 */
328 rr->input= &(s->packet[SSL3_RT_HEADER_LENGTH]);
329
330 /* ok, we can now read from 's->packet' data into 'rr'
331 * rr->input points at rr->length bytes, which
332 * need to be copied into rr->data by either
333 * the decryption or by the decompression
334 * When the data is 'copied' into the rr->data buffer,
335 * rr->input will be pointed at the new buffer */
336
337 /* We now have - encrypted [ MAC [ compressed [ plain ] ] ]
338 * rr->length bytes of encrypted compressed stuff. */
339
340 /* check is not needed I believe */
341 if (rr->length > SSL3_RT_MAX_ENCRYPTED_LENGTH+extra)
342 {
343 al=SSL_AD_RECORD_OVERFLOW;
344 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_ENCRYPTED_LENGTH_TOO_LONG);
345 goto f_err;
346 }
347
348 /* decrypt in place in 'rr->input' */
349 rr->data=rr->input;
350
351 enc_err = s->method->ssl3_enc->enc(s,0);
352 if (enc_err <= 0)
353 {
354 if (enc_err == 0)
355 /* SSLerr() and ssl3_send_alert() have been called */
356 goto err;
357
358 /* Otherwise enc_err == -1, which indicates bad padding
359 * (rec->length has not been changed in this case).
360 * To minimize information leaked via timing, we will perform
361 * the MAC computation anyway. */
362 decryption_failed_or_bad_record_mac = 1;
363 }
364
365#ifdef TLS_DEBUG
366printf("dec %d\n",rr->length);
367{ unsigned int z; for (z=0; z<rr->length; z++) printf("%02X%c",rr->data[z],((z+1)%16)?' ':'\n'); }
368printf("\n");
369#endif
370
371 /* r->length is now the compressed data plus mac */
372 if ( (sess == NULL) ||
373 (s->enc_read_ctx == NULL) ||
374 (s->read_hash == NULL))
375 clear=1;
376
377 if (!clear)
378 {
379 mac_size=EVP_MD_size(s->read_hash);
380
381 if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH+extra+mac_size)
382 {
383#if 0 /* OK only for stream ciphers (then rr->length is visible from ciphertext anyway) */
384 al=SSL_AD_RECORD_OVERFLOW;
385 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_PRE_MAC_LENGTH_TOO_LONG);
386 goto f_err;
387#else
388 decryption_failed_or_bad_record_mac = 1;
389#endif
390 }
391 /* check the MAC for rr->input (it's in mac_size bytes at the tail) */
392 if (rr->length >= mac_size)
393 {
394 rr->length -= mac_size;
395 mac = &rr->data[rr->length];
396 }
397 else
398 {
399 /* record (minus padding) is too short to contain a MAC */
400#if 0 /* OK only for stream ciphers */
401 al=SSL_AD_DECODE_ERROR;
402 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_LENGTH_TOO_SHORT);
403 goto f_err;
404#else
405 decryption_failed_or_bad_record_mac = 1;
406 rr->length = 0;
407#endif
408 }
409 i=s->method->ssl3_enc->mac(s,md,0);
410 if (mac == NULL || memcmp(md, mac, mac_size) != 0)
411 {
412 decryption_failed_or_bad_record_mac = 1;
413 }
414 }
415
416 if (decryption_failed_or_bad_record_mac)
417 {
418 /* A separate 'decryption_failed' alert was introduced with TLS 1.0,
419 * SSL 3.0 only has 'bad_record_mac'. But unless a decryption
420 * failure is directly visible from the ciphertext anyway,
421 * we should not reveal which kind of error occured -- this
422 * might become visible to an attacker (e.g. via a logfile) */
423 al=SSL_AD_BAD_RECORD_MAC;
424 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC);
425 goto f_err;
426 }
427
428 /* r->length is now just compressed */
429 if (s->expand != NULL)
430 {
431 if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH+extra)
432 {
433 al=SSL_AD_RECORD_OVERFLOW;
434 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_COMPRESSED_LENGTH_TOO_LONG);
435 goto f_err;
436 }
437 if (!do_uncompress(s))
438 {
439 al=SSL_AD_DECOMPRESSION_FAILURE;
440 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_BAD_DECOMPRESSION);
441 goto f_err;
442 }
443 }
444
445 if (rr->length > SSL3_RT_MAX_PLAIN_LENGTH+extra)
446 {
447 al=SSL_AD_RECORD_OVERFLOW;
448 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_DATA_LENGTH_TOO_LONG);
449 goto f_err;
450 }
451
452 rr->off=0;
453 /* So at this point the following is true
454 * ssl->s3->rrec.type is the type of record
455 * ssl->s3->rrec.length == number of bytes in record
456 * ssl->s3->rrec.off == offset to first valid byte
457 * ssl->s3->rrec.data == where to take bytes from, increment
458 * after use :-).
459 */
460
461 /* we have pulled in a full packet so zero things */
462 s->packet_length=0;
463
464 /* just read a 0 length packet */
465 if (rr->length == 0) goto again;
466
467 return(1);
468
469f_err:
470 ssl3_send_alert(s,SSL3_AL_FATAL,al);
471err:
472 return(ret);
473 }
474
475static int do_uncompress(SSL *ssl)
476 {
477 int i;
478 SSL3_RECORD *rr;
479
480 rr= &(ssl->s3->rrec);
481 i=COMP_expand_block(ssl->expand,rr->comp,
482 SSL3_RT_MAX_PLAIN_LENGTH,rr->data,(int)rr->length);
483 if (i < 0)
484 return(0);
485 else
486 rr->length=i;
487 rr->data=rr->comp;
488
489 return(1);
490 }
491
492static int do_compress(SSL *ssl)
493 {
494 int i;
495 SSL3_RECORD *wr;
496
497 wr= &(ssl->s3->wrec);
498 i=COMP_compress_block(ssl->compress,wr->data,
499 SSL3_RT_MAX_COMPRESSED_LENGTH,
500 wr->input,(int)wr->length);
501 if (i < 0)
502 return(0);
503 else
504 wr->length=i;
505
506 wr->input=wr->data;
507 return(1);
508 }
509
510/* Call this to write data in records of type 'type'
511 * It will return <= 0 if not all data has been sent or non-blocking IO.
512 */
513int ssl3_write_bytes(SSL *s, int type, const void *buf_, int len)
514 {
515 const unsigned char *buf=buf_;
516 unsigned int tot,n,nw;
517 int i;
518
519 s->rwstate=SSL_NOTHING;
520 tot=s->s3->wnum;
521 s->s3->wnum=0;
522
523 if (SSL_in_init(s) && !s->in_handshake)
524 {
525 i=s->handshake_func(s);
526 if (i < 0) return(i);
527 if (i == 0)
528 {
529 SSLerr(SSL_F_SSL3_WRITE_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE);
530 return -1;
531 }
532 }
533
534 n=(len-tot);
535 for (;;)
536 {
537 if (n > SSL3_RT_MAX_PLAIN_LENGTH)
538 nw=SSL3_RT_MAX_PLAIN_LENGTH;
539 else
540 nw=n;
541
542 i=do_ssl3_write(s, type, &(buf[tot]), nw, 0);
543 if (i <= 0)
544 {
545 s->s3->wnum=tot;
546 return i;
547 }
548
549 if ((i == (int)n) ||
550 (type == SSL3_RT_APPLICATION_DATA &&
551 (s->mode & SSL_MODE_ENABLE_PARTIAL_WRITE)))
552 {
553 /* next chunk of data should get another prepended empty fragment
554 * in ciphersuites with known-IV weakness: */
555 s->s3->empty_fragment_done = 0;
556
557 return tot+i;
558 }
559
560 n-=i;
561 tot+=i;
562 }
563 }
564
565static int do_ssl3_write(SSL *s, int type, const unsigned char *buf,
566 unsigned int len, int create_empty_fragment)
567 {
568 unsigned char *p,*plen;
569 int i,mac_size,clear=0;
570 int prefix_len = 0;
571 SSL3_RECORD *wr;
572 SSL3_BUFFER *wb;
573 SSL_SESSION *sess;
574
575 /* first check if there is a SSL3_BUFFER still being written
576 * out. This will happen with non blocking IO */
577 if (s->s3->wbuf.left != 0)
578 return(ssl3_write_pending(s,type,buf,len));
579
580 /* If we have an alert to send, lets send it */
581 if (s->s3->alert_dispatch)
582 {
583 i=ssl3_dispatch_alert(s);
584 if (i <= 0)
585 return(i);
586 /* if it went, fall through and send more stuff */
587 }
588
589 if (len == 0 && !create_empty_fragment)
590 return 0;
591
592 wr= &(s->s3->wrec);
593 wb= &(s->s3->wbuf);
594 sess=s->session;
595
596 if ( (sess == NULL) ||
597 (s->enc_write_ctx == NULL) ||
598 (s->write_hash == NULL))
599 clear=1;
600
601 if (clear)
602 mac_size=0;
603 else
604 mac_size=EVP_MD_size(s->write_hash);
605
606 /* 'create_empty_fragment' is true only when this function calls itself */
607 if (!clear && !create_empty_fragment && !s->s3->empty_fragment_done)
608 {
609 /* countermeasure against known-IV weakness in CBC ciphersuites
610 * (see http://www.openssl.org/~bodo/tls-cbc.txt) */
611
612 if (s->s3->need_empty_fragments && type == SSL3_RT_APPLICATION_DATA)
613 {
614 /* recursive function call with 'create_empty_fragment' set;
615 * this prepares and buffers the data for an empty fragment
616 * (these 'prefix_len' bytes are sent out later
617 * together with the actual payload) */
618 prefix_len = do_ssl3_write(s, type, buf, 0, 1);
619 if (prefix_len <= 0)
620 goto err;
621
622 if (s->s3->wbuf.len < (size_t)prefix_len + SSL3_RT_MAX_PACKET_SIZE)
623 {
624 /* insufficient space */
625 SSLerr(SSL_F_DO_SSL3_WRITE, ERR_R_INTERNAL_ERROR);
626 goto err;
627 }
628 }
629
630 s->s3->empty_fragment_done = 1;
631 }
632
633 p = wb->buf + prefix_len;
634
635 /* write the header */
636
637 *(p++)=type&0xff;
638 wr->type=type;
639
640 *(p++)=(s->version>>8);
641 *(p++)=s->version&0xff;
642
643 /* field where we are to write out packet length */
644 plen=p;
645 p+=2;
646
647 /* lets setup the record stuff. */
648 wr->data=p;
649 wr->length=(int)len;
650 wr->input=(unsigned char *)buf;
651
652 /* we now 'read' from wr->input, wr->length bytes into
653 * wr->data */
654
655 /* first we compress */
656 if (s->compress != NULL)
657 {
658 if (!do_compress(s))
659 {
660 SSLerr(SSL_F_DO_SSL3_WRITE,SSL_R_COMPRESSION_FAILURE);
661 goto err;
662 }
663 }
664 else
665 {
666 memcpy(wr->data,wr->input,wr->length);
667 wr->input=wr->data;
668 }
669
670 /* we should still have the output to wr->data and the input
671 * from wr->input. Length should be wr->length.
672 * wr->data still points in the wb->buf */
673
674 if (mac_size != 0)
675 {
676 s->method->ssl3_enc->mac(s,&(p[wr->length]),1);
677 wr->length+=mac_size;
678 wr->input=p;
679 wr->data=p;
680 }
681
682 /* ssl3_enc can only have an error on read */
683 s->method->ssl3_enc->enc(s,1);
684
685 /* record length after mac and block padding */
686 s2n(wr->length,plen);
687
688 /* we should now have
689 * wr->data pointing to the encrypted data, which is
690 * wr->length long */
691 wr->type=type; /* not needed but helps for debugging */
692 wr->length+=SSL3_RT_HEADER_LENGTH;
693
694 if (create_empty_fragment)
695 {
696 /* we are in a recursive call;
697 * just return the length, don't write out anything here
698 */
699 return wr->length;
700 }
701
702 /* now let's set up wb */
703 wb->left = prefix_len + wr->length;
704 wb->offset = 0;
705
706 /* memorize arguments so that ssl3_write_pending can detect bad write retries later */
707 s->s3->wpend_tot=len;
708 s->s3->wpend_buf=buf;
709 s->s3->wpend_type=type;
710 s->s3->wpend_ret=len;
711
712 /* we now just need to write the buffer */
713 return ssl3_write_pending(s,type,buf,len);
714err:
715 return -1;
716 }
717
718/* if s->s3->wbuf.left != 0, we need to call this */
719static int ssl3_write_pending(SSL *s, int type, const unsigned char *buf,
720 unsigned int len)
721 {
722 int i;
723
724/* XXXX */
725 if ((s->s3->wpend_tot > (int)len)
726 || ((s->s3->wpend_buf != buf) &&
727 !(s->mode & SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER))
728 || (s->s3->wpend_type != type))
729 {
730 SSLerr(SSL_F_SSL3_WRITE_PENDING,SSL_R_BAD_WRITE_RETRY);
731 return(-1);
732 }
733
734 for (;;)
735 {
736 clear_sys_error();
737 if (s->wbio != NULL)
738 {
739 s->rwstate=SSL_WRITING;
740 i=BIO_write(s->wbio,
741 (char *)&(s->s3->wbuf.buf[s->s3->wbuf.offset]),
742 (unsigned int)s->s3->wbuf.left);
743 }
744 else
745 {
746 SSLerr(SSL_F_SSL3_WRITE_PENDING,SSL_R_BIO_NOT_SET);
747 i= -1;
748 }
749 if (i == s->s3->wbuf.left)
750 {
751 s->s3->wbuf.left=0;
752 s->rwstate=SSL_NOTHING;
753 return(s->s3->wpend_ret);
754 }
755 else if (i <= 0)
756 return(i);
757 s->s3->wbuf.offset+=i;
758 s->s3->wbuf.left-=i;
759 }
760 }
761
762/* Return up to 'len' payload bytes received in 'type' records.
763 * 'type' is one of the following:
764 *
765 * - SSL3_RT_HANDSHAKE (when ssl3_get_message calls us)
766 * - SSL3_RT_APPLICATION_DATA (when ssl3_read calls us)
767 * - 0 (during a shutdown, no data has to be returned)
768 *
769 * If we don't have stored data to work from, read a SSL/TLS record first
770 * (possibly multiple records if we still don't have anything to return).
771 *
772 * This function must handle any surprises the peer may have for us, such as
773 * Alert records (e.g. close_notify), ChangeCipherSpec records (not really
774 * a surprise, but handled as if it were), or renegotiation requests.
775 * Also if record payloads contain fragments too small to process, we store
776 * them until there is enough for the respective protocol (the record protocol
777 * may use arbitrary fragmentation and even interleaving):
778 * Change cipher spec protocol
779 * just 1 byte needed, no need for keeping anything stored
780 * Alert protocol
781 * 2 bytes needed (AlertLevel, AlertDescription)
782 * Handshake protocol
783 * 4 bytes needed (HandshakeType, uint24 length) -- we just have
784 * to detect unexpected Client Hello and Hello Request messages
785 * here, anything else is handled by higher layers
786 * Application data protocol
787 * none of our business
788 */
789int ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
790 {
791 int al,i,j,ret;
792 unsigned int n;
793 SSL3_RECORD *rr;
794 void (*cb)(const SSL *ssl,int type2,int val)=NULL;
795
796 if (s->s3->rbuf.buf == NULL) /* Not initialized yet */
797 if (!ssl3_setup_buffers(s))
798 return(-1);
799
800 if ((type && (type != SSL3_RT_APPLICATION_DATA) && (type != SSL3_RT_HANDSHAKE) && type) ||
801 (peek && (type != SSL3_RT_APPLICATION_DATA)))
802 {
803 SSLerr(SSL_F_SSL3_READ_BYTES, ERR_R_INTERNAL_ERROR);
804 return -1;
805 }
806
807 if ((type == SSL3_RT_HANDSHAKE) && (s->s3->handshake_fragment_len > 0))
808 /* (partially) satisfy request from storage */
809 {
810 unsigned char *src = s->s3->handshake_fragment;
811 unsigned char *dst = buf;
812 unsigned int k;
813
814 /* peek == 0 */
815 n = 0;
816 while ((len > 0) && (s->s3->handshake_fragment_len > 0))
817 {
818 *dst++ = *src++;
819 len--; s->s3->handshake_fragment_len--;
820 n++;
821 }
822 /* move any remaining fragment bytes: */
823 for (k = 0; k < s->s3->handshake_fragment_len; k++)
824 s->s3->handshake_fragment[k] = *src++;
825 return n;
826 }
827
828 /* Now s->s3->handshake_fragment_len == 0 if type == SSL3_RT_HANDSHAKE. */
829
830 if (!s->in_handshake && SSL_in_init(s))
831 {
832 /* type == SSL3_RT_APPLICATION_DATA */
833 i=s->handshake_func(s);
834 if (i < 0) return(i);
835 if (i == 0)
836 {
837 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE);
838 return(-1);
839 }
840 }
841start:
842 s->rwstate=SSL_NOTHING;
843
844 /* s->s3->rrec.type - is the type of record
845 * s->s3->rrec.data, - data
846 * s->s3->rrec.off, - offset into 'data' for next read
847 * s->s3->rrec.length, - number of bytes. */
848 rr = &(s->s3->rrec);
849
850 /* get new packet if necessary */
851 if ((rr->length == 0) || (s->rstate == SSL_ST_READ_BODY))
852 {
853 ret=ssl3_get_record(s);
854 if (ret <= 0) return(ret);
855 }
856
857 /* we now have a packet which can be read and processed */
858
859 if (s->s3->change_cipher_spec /* set when we receive ChangeCipherSpec,
860 * reset by ssl3_get_finished */
861 && (rr->type != SSL3_RT_HANDSHAKE))
862 {
863 al=SSL_AD_UNEXPECTED_MESSAGE;
864 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_DATA_BETWEEN_CCS_AND_FINISHED);
865 goto err;
866 }
867
868 /* If the other end has shut down, throw anything we read away
869 * (even in 'peek' mode) */
870 if (s->shutdown & SSL_RECEIVED_SHUTDOWN)
871 {
872 rr->length=0;
873 s->rwstate=SSL_NOTHING;
874 return(0);
875 }
876
877
878 if (type == rr->type) /* SSL3_RT_APPLICATION_DATA or SSL3_RT_HANDSHAKE */
879 {
880 /* make sure that we are not getting application data when we
881 * are doing a handshake for the first time */
882 if (SSL_in_init(s) && (type == SSL3_RT_APPLICATION_DATA) &&
883 (s->enc_read_ctx == NULL))
884 {
885 al=SSL_AD_UNEXPECTED_MESSAGE;
886 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_APP_DATA_IN_HANDSHAKE);
887 goto f_err;
888 }
889
890 if (len <= 0) return(len);
891
892 if ((unsigned int)len > rr->length)
893 n = rr->length;
894 else
895 n = (unsigned int)len;
896
897 memcpy(buf,&(rr->data[rr->off]),n);
898 if (!peek)
899 {
900 rr->length-=n;
901 rr->off+=n;
902 if (rr->length == 0)
903 {
904 s->rstate=SSL_ST_READ_HEADER;
905 rr->off=0;
906 }
907 }
908 return(n);
909 }
910
911
912 /* If we get here, then type != rr->type; if we have a handshake
913 * message, then it was unexpected (Hello Request or Client Hello). */
914
915 /* In case of record types for which we have 'fragment' storage,
916 * fill that so that we can process the data at a fixed place.
917 */
918 {
919 unsigned int dest_maxlen = 0;
920 unsigned char *dest = NULL;
921 unsigned int *dest_len = NULL;
922
923 if (rr->type == SSL3_RT_HANDSHAKE)
924 {
925 dest_maxlen = sizeof s->s3->handshake_fragment;
926 dest = s->s3->handshake_fragment;
927 dest_len = &s->s3->handshake_fragment_len;
928 }
929 else if (rr->type == SSL3_RT_ALERT)
930 {
931 dest_maxlen = sizeof s->s3->alert_fragment;
932 dest = s->s3->alert_fragment;
933 dest_len = &s->s3->alert_fragment_len;
934 }
935
936 if (dest_maxlen > 0)
937 {
938 n = dest_maxlen - *dest_len; /* available space in 'dest' */
939 if (rr->length < n)
940 n = rr->length; /* available bytes */
941
942 /* now move 'n' bytes: */
943 while (n-- > 0)
944 {
945 dest[(*dest_len)++] = rr->data[rr->off++];
946 rr->length--;
947 }
948
949 if (*dest_len < dest_maxlen)
950 goto start; /* fragment was too small */
951 }
952 }
953
954 /* s->s3->handshake_fragment_len == 4 iff rr->type == SSL3_RT_HANDSHAKE;
955 * s->s3->alert_fragment_len == 2 iff rr->type == SSL3_RT_ALERT.
956 * (Possibly rr is 'empty' now, i.e. rr->length may be 0.) */
957
958 /* If we are a client, check for an incoming 'Hello Request': */
959 if ((!s->server) &&
960 (s->s3->handshake_fragment_len >= 4) &&
961 (s->s3->handshake_fragment[0] == SSL3_MT_HELLO_REQUEST) &&
962 (s->session != NULL) && (s->session->cipher != NULL))
963 {
964 s->s3->handshake_fragment_len = 0;
965
966 if ((s->s3->handshake_fragment[1] != 0) ||
967 (s->s3->handshake_fragment[2] != 0) ||
968 (s->s3->handshake_fragment[3] != 0))
969 {
970 al=SSL_AD_DECODE_ERROR;
971 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_BAD_HELLO_REQUEST);
972 goto err;
973 }
974
975 if (s->msg_callback)
976 s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, s->s3->handshake_fragment, 4, s, s->msg_callback_arg);
977
978 if (SSL_is_init_finished(s) &&
979 !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) &&
980 !s->s3->renegotiate)
981 {
982 ssl3_renegotiate(s);
983 if (ssl3_renegotiate_check(s))
984 {
985 i=s->handshake_func(s);
986 if (i < 0) return(i);
987 if (i == 0)
988 {
989 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE);
990 return(-1);
991 }
992
993 if (!(s->mode & SSL_MODE_AUTO_RETRY))
994 {
995 if (s->s3->rbuf.left == 0) /* no read-ahead left? */
996 {
997 BIO *bio;
998 /* In the case where we try to read application data,
999 * but we trigger an SSL handshake, we return -1 with
1000 * the retry option set. Otherwise renegotiation may
1001 * cause nasty problems in the blocking world */
1002 s->rwstate=SSL_READING;
1003 bio=SSL_get_rbio(s);
1004 BIO_clear_retry_flags(bio);
1005 BIO_set_retry_read(bio);
1006 return(-1);
1007 }
1008 }
1009 }
1010 }
1011 /* we either finished a handshake or ignored the request,
1012 * now try again to obtain the (application) data we were asked for */
1013 goto start;
1014 }
1015
1016 if (s->s3->alert_fragment_len >= 2)
1017 {
1018 int alert_level = s->s3->alert_fragment[0];
1019 int alert_descr = s->s3->alert_fragment[1];
1020
1021 s->s3->alert_fragment_len = 0;
1022
1023 if (s->msg_callback)
1024 s->msg_callback(0, s->version, SSL3_RT_ALERT, s->s3->alert_fragment, 2, s, s->msg_callback_arg);
1025
1026 if (s->info_callback != NULL)
1027 cb=s->info_callback;
1028 else if (s->ctx->info_callback != NULL)
1029 cb=s->ctx->info_callback;
1030
1031 if (cb != NULL)
1032 {
1033 j = (alert_level << 8) | alert_descr;
1034 cb(s, SSL_CB_READ_ALERT, j);
1035 }
1036
1037 if (alert_level == 1) /* warning */
1038 {
1039 s->s3->warn_alert = alert_descr;
1040 if (alert_descr == SSL_AD_CLOSE_NOTIFY)
1041 {
1042 s->shutdown |= SSL_RECEIVED_SHUTDOWN;
1043 return(0);
1044 }
1045 }
1046 else if (alert_level == 2) /* fatal */
1047 {
1048 char tmp[16];
1049
1050 s->rwstate=SSL_NOTHING;
1051 s->s3->fatal_alert = alert_descr;
1052 SSLerr(SSL_F_SSL3_READ_BYTES, SSL_AD_REASON_OFFSET + alert_descr);
1053 BIO_snprintf(tmp,sizeof tmp,"%d",alert_descr);
1054 ERR_add_error_data(2,"SSL alert number ",tmp);
1055 s->shutdown|=SSL_RECEIVED_SHUTDOWN;
1056 SSL_CTX_remove_session(s->ctx,s->session);
1057 return(0);
1058 }
1059 else
1060 {
1061 al=SSL_AD_ILLEGAL_PARAMETER;
1062 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_UNKNOWN_ALERT_TYPE);
1063 goto f_err;
1064 }
1065
1066 goto start;
1067 }
1068
1069 if (s->shutdown & SSL_SENT_SHUTDOWN) /* but we have not received a shutdown */
1070 {
1071 s->rwstate=SSL_NOTHING;
1072 rr->length=0;
1073 return(0);
1074 }
1075
1076 if (rr->type == SSL3_RT_CHANGE_CIPHER_SPEC)
1077 {
1078 /* 'Change Cipher Spec' is just a single byte, so we know
1079 * exactly what the record payload has to look like */
1080 if ( (rr->length != 1) || (rr->off != 0) ||
1081 (rr->data[0] != SSL3_MT_CCS))
1082 {
1083 i=SSL_AD_ILLEGAL_PARAMETER;
1084 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_BAD_CHANGE_CIPHER_SPEC);
1085 goto err;
1086 }
1087
1088 rr->length=0;
1089
1090 if (s->msg_callback)
1091 s->msg_callback(0, s->version, SSL3_RT_CHANGE_CIPHER_SPEC, rr->data, 1, s, s->msg_callback_arg);
1092
1093 s->s3->change_cipher_spec=1;
1094 if (!do_change_cipher_spec(s))
1095 goto err;
1096 else
1097 goto start;
1098 }
1099
1100 /* Unexpected handshake message (Client Hello, or protocol violation) */
1101 if ((s->s3->handshake_fragment_len >= 4) && !s->in_handshake)
1102 {
1103 if (((s->state&SSL_ST_MASK) == SSL_ST_OK) &&
1104 !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS))
1105 {
1106#if 0 /* worked only because C operator preferences are not as expected (and
1107 * because this is not really needed for clients except for detecting
1108 * protocol violations): */
1109 s->state=SSL_ST_BEFORE|(s->server)
1110 ?SSL_ST_ACCEPT
1111 :SSL_ST_CONNECT;
1112#else
1113 s->state = s->server ? SSL_ST_ACCEPT : SSL_ST_CONNECT;
1114#endif
1115 s->new_session=1;
1116 }
1117 i=s->handshake_func(s);
1118 if (i < 0) return(i);
1119 if (i == 0)
1120 {
1121 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE);
1122 return(-1);
1123 }
1124
1125 if (!(s->mode & SSL_MODE_AUTO_RETRY))
1126 {
1127 if (s->s3->rbuf.left == 0) /* no read-ahead left? */
1128 {
1129 BIO *bio;
1130 /* In the case where we try to read application data,
1131 * but we trigger an SSL handshake, we return -1 with
1132 * the retry option set. Otherwise renegotiation may
1133 * cause nasty problems in the blocking world */
1134 s->rwstate=SSL_READING;
1135 bio=SSL_get_rbio(s);
1136 BIO_clear_retry_flags(bio);
1137 BIO_set_retry_read(bio);
1138 return(-1);
1139 }
1140 }
1141 goto start;
1142 }
1143
1144 switch (rr->type)
1145 {
1146 default:
1147#ifndef OPENSSL_NO_TLS
1148 /* TLS just ignores unknown message types */
1149 if (s->version == TLS1_VERSION)
1150 {
1151 rr->length = 0;
1152 goto start;
1153 }
1154#endif
1155 al=SSL_AD_UNEXPECTED_MESSAGE;
1156 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_UNEXPECTED_RECORD);
1157 goto f_err;
1158 case SSL3_RT_CHANGE_CIPHER_SPEC:
1159 case SSL3_RT_ALERT:
1160 case SSL3_RT_HANDSHAKE:
1161 /* we already handled all of these, with the possible exception
1162 * of SSL3_RT_HANDSHAKE when s->in_handshake is set, but that
1163 * should not happen when type != rr->type */
1164 al=SSL_AD_UNEXPECTED_MESSAGE;
1165 SSLerr(SSL_F_SSL3_READ_BYTES,ERR_R_INTERNAL_ERROR);
1166 goto f_err;
1167 case SSL3_RT_APPLICATION_DATA:
1168 /* At this point, we were expecting handshake data,
1169 * but have application data. If the library was
1170 * running inside ssl3_read() (i.e. in_read_app_data
1171 * is set) and it makes sense to read application data
1172 * at this point (session renegotiation not yet started),
1173 * we will indulge it.
1174 */
1175 if (s->s3->in_read_app_data &&
1176 (s->s3->total_renegotiations != 0) &&
1177 ((
1178 (s->state & SSL_ST_CONNECT) &&
1179 (s->state >= SSL3_ST_CW_CLNT_HELLO_A) &&
1180 (s->state <= SSL3_ST_CR_SRVR_HELLO_A)
1181 ) || (
1182 (s->state & SSL_ST_ACCEPT) &&
1183 (s->state <= SSL3_ST_SW_HELLO_REQ_A) &&
1184 (s->state >= SSL3_ST_SR_CLNT_HELLO_A)
1185 )
1186 ))
1187 {
1188 s->s3->in_read_app_data=2;
1189 return(-1);
1190 }
1191 else
1192 {
1193 al=SSL_AD_UNEXPECTED_MESSAGE;
1194 SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_UNEXPECTED_RECORD);
1195 goto f_err;
1196 }
1197 }
1198 /* not reached */
1199
1200f_err:
1201 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1202err:
1203 return(-1);
1204 }
1205
1206static int do_change_cipher_spec(SSL *s)
1207 {
1208 int i;
1209 const char *sender;
1210 int slen;
1211
1212 if (s->state & SSL_ST_ACCEPT)
1213 i=SSL3_CHANGE_CIPHER_SERVER_READ;
1214 else
1215 i=SSL3_CHANGE_CIPHER_CLIENT_READ;
1216
1217 if (s->s3->tmp.key_block == NULL)
1218 {
1219 s->session->cipher=s->s3->tmp.new_cipher;
1220 if (!s->method->ssl3_enc->setup_key_block(s)) return(0);
1221 }
1222
1223 if (!s->method->ssl3_enc->change_cipher_state(s,i))
1224 return(0);
1225
1226 /* we have to record the message digest at
1227 * this point so we can get it before we read
1228 * the finished message */
1229 if (s->state & SSL_ST_CONNECT)
1230 {
1231 sender=s->method->ssl3_enc->server_finished_label;
1232 slen=s->method->ssl3_enc->server_finished_label_len;
1233 }
1234 else
1235 {
1236 sender=s->method->ssl3_enc->client_finished_label;
1237 slen=s->method->ssl3_enc->client_finished_label_len;
1238 }
1239
1240 s->s3->tmp.peer_finish_md_len = s->method->ssl3_enc->final_finish_mac(s,
1241 &(s->s3->finish_dgst1),
1242 &(s->s3->finish_dgst2),
1243 sender,slen,s->s3->tmp.peer_finish_md);
1244
1245 return(1);
1246 }
1247
1248void ssl3_send_alert(SSL *s, int level, int desc)
1249 {
1250 /* Map tls/ssl alert value to correct one */
1251 desc=s->method->ssl3_enc->alert_value(desc);
1252 if (s->version == SSL3_VERSION && desc == SSL_AD_PROTOCOL_VERSION)
1253 desc = SSL_AD_HANDSHAKE_FAILURE; /* SSL 3.0 does not have protocol_version alerts */
1254 if (desc < 0) return;
1255 /* If a fatal one, remove from cache */
1256 if ((level == 2) && (s->session != NULL))
1257 SSL_CTX_remove_session(s->ctx,s->session);
1258
1259 s->s3->alert_dispatch=1;
1260 s->s3->send_alert[0]=level;
1261 s->s3->send_alert[1]=desc;
1262 if (s->s3->wbuf.left == 0) /* data still being written out? */
1263 ssl3_dispatch_alert(s);
1264 /* else data is still being written out, we will get written
1265 * some time in the future */
1266 }
1267
1268int ssl3_dispatch_alert(SSL *s)
1269 {
1270 int i,j;
1271 void (*cb)(const SSL *ssl,int type,int val)=NULL;
1272
1273 s->s3->alert_dispatch=0;
1274 i = do_ssl3_write(s, SSL3_RT_ALERT, &s->s3->send_alert[0], 2, 0);
1275 if (i <= 0)
1276 {
1277 s->s3->alert_dispatch=1;
1278 }
1279 else
1280 {
1281 /* Alert sent to BIO. If it is important, flush it now.
1282 * If the message does not get sent due to non-blocking IO,
1283 * we will not worry too much. */
1284 if (s->s3->send_alert[0] == SSL3_AL_FATAL)
1285 (void)BIO_flush(s->wbio);
1286
1287 if (s->msg_callback)
1288 s->msg_callback(1, s->version, SSL3_RT_ALERT, s->s3->send_alert, 2, s, s->msg_callback_arg);
1289
1290 if (s->info_callback != NULL)
1291 cb=s->info_callback;
1292 else if (s->ctx->info_callback != NULL)
1293 cb=s->ctx->info_callback;
1294
1295 if (cb != NULL)
1296 {
1297 j=(s->s3->send_alert[0]<<8)|s->s3->send_alert[1];
1298 cb(s,SSL_CB_WRITE_ALERT,j);
1299 }
1300 }
1301 return(i);
1302 }
diff --git a/src/lib/libssl/s3_srvr.c b/src/lib/libssl/s3_srvr.c
deleted file mode 100644
index a2c17f2950..0000000000
--- a/src/lib/libssl/s3_srvr.c
+++ /dev/null
@@ -1,2049 +0,0 @@
1/* ssl/s3_srvr.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58/* ====================================================================
59 * Copyright (c) 1998-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 */
111
112#define REUSE_CIPHER_BUG
113#define NETSCAPE_HANG_BUG
114
115
116#include <stdio.h>
117#include "ssl_locl.h"
118#include "kssl_lcl.h"
119#include <openssl/buffer.h>
120#include <openssl/rand.h>
121#include <openssl/objects.h>
122#include <openssl/evp.h>
123#include <openssl/x509.h>
124#ifndef OPENSSL_NO_KRB5
125#include <openssl/krb5_asn.h>
126#endif
127#include <openssl/md5.h>
128
129static SSL_METHOD *ssl3_get_server_method(int ver);
130static int ssl3_get_client_hello(SSL *s);
131static int ssl3_check_client_hello(SSL *s);
132static int ssl3_send_server_hello(SSL *s);
133static int ssl3_send_server_key_exchange(SSL *s);
134static int ssl3_send_certificate_request(SSL *s);
135static int ssl3_send_server_done(SSL *s);
136static int ssl3_get_client_key_exchange(SSL *s);
137static int ssl3_get_client_certificate(SSL *s);
138static int ssl3_get_cert_verify(SSL *s);
139static int ssl3_send_hello_request(SSL *s);
140
141static SSL_METHOD *ssl3_get_server_method(int ver)
142 {
143 if (ver == SSL3_VERSION)
144 return(SSLv3_server_method());
145 else
146 return(NULL);
147 }
148
149SSL_METHOD *SSLv3_server_method(void)
150 {
151 static int init=1;
152 static SSL_METHOD SSLv3_server_data;
153
154 if (init)
155 {
156 memcpy((char *)&SSLv3_server_data,(char *)sslv3_base_method(),
157 sizeof(SSL_METHOD));
158 SSLv3_server_data.ssl_accept=ssl3_accept;
159 SSLv3_server_data.get_ssl_method=ssl3_get_server_method;
160 init=0;
161 }
162 return(&SSLv3_server_data);
163 }
164
165int ssl3_accept(SSL *s)
166 {
167 BUF_MEM *buf;
168 unsigned long l,Time=time(NULL);
169 void (*cb)(const SSL *ssl,int type,int val)=NULL;
170 long num1;
171 int ret= -1;
172 int new_state,state,skip=0;
173
174 RAND_add(&Time,sizeof(Time),0);
175 ERR_clear_error();
176 clear_sys_error();
177
178 if (s->info_callback != NULL)
179 cb=s->info_callback;
180 else if (s->ctx->info_callback != NULL)
181 cb=s->ctx->info_callback;
182
183 /* init things to blank */
184 s->in_handshake++;
185 if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
186
187 if (s->cert == NULL)
188 {
189 SSLerr(SSL_F_SSL3_ACCEPT,SSL_R_NO_CERTIFICATE_SET);
190 return(-1);
191 }
192
193 for (;;)
194 {
195 state=s->state;
196
197 switch (s->state)
198 {
199 case SSL_ST_RENEGOTIATE:
200 s->new_session=1;
201 /* s->state=SSL_ST_ACCEPT; */
202
203 case SSL_ST_BEFORE:
204 case SSL_ST_ACCEPT:
205 case SSL_ST_BEFORE|SSL_ST_ACCEPT:
206 case SSL_ST_OK|SSL_ST_ACCEPT:
207
208 s->server=1;
209 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
210
211 if ((s->version>>8) != 3)
212 {
213 SSLerr(SSL_F_SSL3_ACCEPT, ERR_R_INTERNAL_ERROR);
214 return -1;
215 }
216 s->type=SSL_ST_ACCEPT;
217
218 if (s->init_buf == NULL)
219 {
220 if ((buf=BUF_MEM_new()) == NULL)
221 {
222 ret= -1;
223 goto end;
224 }
225 if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
226 {
227 ret= -1;
228 goto end;
229 }
230 s->init_buf=buf;
231 }
232
233 if (!ssl3_setup_buffers(s))
234 {
235 ret= -1;
236 goto end;
237 }
238
239 s->init_num=0;
240
241 if (s->state != SSL_ST_RENEGOTIATE)
242 {
243 /* Ok, we now need to push on a buffering BIO so that
244 * the output is sent in a way that TCP likes :-)
245 */
246 if (!ssl_init_wbio_buffer(s,1)) { ret= -1; goto end; }
247
248 ssl3_init_finished_mac(s);
249 s->state=SSL3_ST_SR_CLNT_HELLO_A;
250 s->ctx->stats.sess_accept++;
251 }
252 else
253 {
254 /* s->state == SSL_ST_RENEGOTIATE,
255 * we will just send a HelloRequest */
256 s->ctx->stats.sess_accept_renegotiate++;
257 s->state=SSL3_ST_SW_HELLO_REQ_A;
258 }
259 break;
260
261 case SSL3_ST_SW_HELLO_REQ_A:
262 case SSL3_ST_SW_HELLO_REQ_B:
263
264 s->shutdown=0;
265 ret=ssl3_send_hello_request(s);
266 if (ret <= 0) goto end;
267 s->s3->tmp.next_state=SSL3_ST_SW_HELLO_REQ_C;
268 s->state=SSL3_ST_SW_FLUSH;
269 s->init_num=0;
270
271 ssl3_init_finished_mac(s);
272 break;
273
274 case SSL3_ST_SW_HELLO_REQ_C:
275 s->state=SSL_ST_OK;
276 break;
277
278 case SSL3_ST_SR_CLNT_HELLO_A:
279 case SSL3_ST_SR_CLNT_HELLO_B:
280 case SSL3_ST_SR_CLNT_HELLO_C:
281
282 s->shutdown=0;
283 ret=ssl3_get_client_hello(s);
284 if (ret <= 0) goto end;
285 s->new_session = 2;
286 s->state=SSL3_ST_SW_SRVR_HELLO_A;
287 s->init_num=0;
288 break;
289
290 case SSL3_ST_SW_SRVR_HELLO_A:
291 case SSL3_ST_SW_SRVR_HELLO_B:
292 ret=ssl3_send_server_hello(s);
293 if (ret <= 0) goto end;
294
295 if (s->hit)
296 s->state=SSL3_ST_SW_CHANGE_A;
297 else
298 s->state=SSL3_ST_SW_CERT_A;
299 s->init_num=0;
300 break;
301
302 case SSL3_ST_SW_CERT_A:
303 case SSL3_ST_SW_CERT_B:
304 /* Check if it is anon DH */
305 if (!(s->s3->tmp.new_cipher->algorithms & SSL_aNULL))
306 {
307 ret=ssl3_send_server_certificate(s);
308 if (ret <= 0) goto end;
309 }
310 else
311 skip=1;
312 s->state=SSL3_ST_SW_KEY_EXCH_A;
313 s->init_num=0;
314 break;
315
316 case SSL3_ST_SW_KEY_EXCH_A:
317 case SSL3_ST_SW_KEY_EXCH_B:
318 l=s->s3->tmp.new_cipher->algorithms;
319
320 /* clear this, it may get reset by
321 * send_server_key_exchange */
322 if ((s->options & SSL_OP_EPHEMERAL_RSA)
323#ifndef OPENSSL_NO_KRB5
324 && !(l & SSL_KRB5)
325#endif /* OPENSSL_NO_KRB5 */
326 )
327 /* option SSL_OP_EPHEMERAL_RSA sends temporary RSA key
328 * even when forbidden by protocol specs
329 * (handshake may fail as clients are not required to
330 * be able to handle this) */
331 s->s3->tmp.use_rsa_tmp=1;
332 else
333 s->s3->tmp.use_rsa_tmp=0;
334
335 /* only send if a DH key exchange, fortezza or
336 * RSA but we have a sign only certificate */
337 if (s->s3->tmp.use_rsa_tmp
338 || (l & (SSL_DH|SSL_kFZA))
339 || ((l & SSL_kRSA)
340 && (s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL
341 || (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher)
342 && EVP_PKEY_size(s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey)*8 > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher)
343 )
344 )
345 )
346 )
347 {
348 ret=ssl3_send_server_key_exchange(s);
349 if (ret <= 0) goto end;
350 }
351 else
352 skip=1;
353
354 s->state=SSL3_ST_SW_CERT_REQ_A;
355 s->init_num=0;
356 break;
357
358 case SSL3_ST_SW_CERT_REQ_A:
359 case SSL3_ST_SW_CERT_REQ_B:
360 if (/* don't request cert unless asked for it: */
361 !(s->verify_mode & SSL_VERIFY_PEER) ||
362 /* if SSL_VERIFY_CLIENT_ONCE is set,
363 * don't request cert during re-negotiation: */
364 ((s->session->peer != NULL) &&
365 (s->verify_mode & SSL_VERIFY_CLIENT_ONCE)) ||
366 /* never request cert in anonymous ciphersuites
367 * (see section "Certificate request" in SSL 3 drafts
368 * and in RFC 2246): */
369 ((s->s3->tmp.new_cipher->algorithms & SSL_aNULL) &&
370 /* ... except when the application insists on verification
371 * (against the specs, but s3_clnt.c accepts this for SSL 3) */
372 !(s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT)) ||
373 /* never request cert in Kerberos ciphersuites */
374 (s->s3->tmp.new_cipher->algorithms & SSL_aKRB5))
375 {
376 /* no cert request */
377 skip=1;
378 s->s3->tmp.cert_request=0;
379 s->state=SSL3_ST_SW_SRVR_DONE_A;
380 }
381 else
382 {
383 s->s3->tmp.cert_request=1;
384 ret=ssl3_send_certificate_request(s);
385 if (ret <= 0) goto end;
386#ifndef NETSCAPE_HANG_BUG
387 s->state=SSL3_ST_SW_SRVR_DONE_A;
388#else
389 s->state=SSL3_ST_SW_FLUSH;
390 s->s3->tmp.next_state=SSL3_ST_SR_CERT_A;
391#endif
392 s->init_num=0;
393 }
394 break;
395
396 case SSL3_ST_SW_SRVR_DONE_A:
397 case SSL3_ST_SW_SRVR_DONE_B:
398 ret=ssl3_send_server_done(s);
399 if (ret <= 0) goto end;
400 s->s3->tmp.next_state=SSL3_ST_SR_CERT_A;
401 s->state=SSL3_ST_SW_FLUSH;
402 s->init_num=0;
403 break;
404
405 case SSL3_ST_SW_FLUSH:
406 /* number of bytes to be flushed */
407 num1=BIO_ctrl(s->wbio,BIO_CTRL_INFO,0,NULL);
408 if (num1 > 0)
409 {
410 s->rwstate=SSL_WRITING;
411 num1=BIO_flush(s->wbio);
412 if (num1 <= 0) { ret= -1; goto end; }
413 s->rwstate=SSL_NOTHING;
414 }
415
416 s->state=s->s3->tmp.next_state;
417 break;
418
419 case SSL3_ST_SR_CERT_A:
420 case SSL3_ST_SR_CERT_B:
421 /* Check for second client hello (MS SGC) */
422 ret = ssl3_check_client_hello(s);
423 if (ret <= 0)
424 goto end;
425 if (ret == 2)
426 s->state = SSL3_ST_SR_CLNT_HELLO_C;
427 else {
428 /* could be sent for a DH cert, even if we
429 * have not asked for it :-) */
430 ret=ssl3_get_client_certificate(s);
431 if (ret <= 0) goto end;
432 s->init_num=0;
433 s->state=SSL3_ST_SR_KEY_EXCH_A;
434 }
435 break;
436
437 case SSL3_ST_SR_KEY_EXCH_A:
438 case SSL3_ST_SR_KEY_EXCH_B:
439 ret=ssl3_get_client_key_exchange(s);
440 if (ret <= 0) goto end;
441 s->state=SSL3_ST_SR_CERT_VRFY_A;
442 s->init_num=0;
443
444 /* We need to get hashes here so if there is
445 * a client cert, it can be verified */
446 s->method->ssl3_enc->cert_verify_mac(s,
447 &(s->s3->finish_dgst1),
448 &(s->s3->tmp.cert_verify_md[0]));
449 s->method->ssl3_enc->cert_verify_mac(s,
450 &(s->s3->finish_dgst2),
451 &(s->s3->tmp.cert_verify_md[MD5_DIGEST_LENGTH]));
452
453 break;
454
455 case SSL3_ST_SR_CERT_VRFY_A:
456 case SSL3_ST_SR_CERT_VRFY_B:
457
458 /* we should decide if we expected this one */
459 ret=ssl3_get_cert_verify(s);
460 if (ret <= 0) goto end;
461
462 s->state=SSL3_ST_SR_FINISHED_A;
463 s->init_num=0;
464 break;
465
466 case SSL3_ST_SR_FINISHED_A:
467 case SSL3_ST_SR_FINISHED_B:
468 ret=ssl3_get_finished(s,SSL3_ST_SR_FINISHED_A,
469 SSL3_ST_SR_FINISHED_B);
470 if (ret <= 0) goto end;
471 if (s->hit)
472 s->state=SSL_ST_OK;
473 else
474 s->state=SSL3_ST_SW_CHANGE_A;
475 s->init_num=0;
476 break;
477
478 case SSL3_ST_SW_CHANGE_A:
479 case SSL3_ST_SW_CHANGE_B:
480
481 s->session->cipher=s->s3->tmp.new_cipher;
482 if (!s->method->ssl3_enc->setup_key_block(s))
483 { ret= -1; goto end; }
484
485 ret=ssl3_send_change_cipher_spec(s,
486 SSL3_ST_SW_CHANGE_A,SSL3_ST_SW_CHANGE_B);
487
488 if (ret <= 0) goto end;
489 s->state=SSL3_ST_SW_FINISHED_A;
490 s->init_num=0;
491
492 if (!s->method->ssl3_enc->change_cipher_state(s,
493 SSL3_CHANGE_CIPHER_SERVER_WRITE))
494 {
495 ret= -1;
496 goto end;
497 }
498
499 break;
500
501 case SSL3_ST_SW_FINISHED_A:
502 case SSL3_ST_SW_FINISHED_B:
503 ret=ssl3_send_finished(s,
504 SSL3_ST_SW_FINISHED_A,SSL3_ST_SW_FINISHED_B,
505 s->method->ssl3_enc->server_finished_label,
506 s->method->ssl3_enc->server_finished_label_len);
507 if (ret <= 0) goto end;
508 s->state=SSL3_ST_SW_FLUSH;
509 if (s->hit)
510 s->s3->tmp.next_state=SSL3_ST_SR_FINISHED_A;
511 else
512 s->s3->tmp.next_state=SSL_ST_OK;
513 s->init_num=0;
514 break;
515
516 case SSL_ST_OK:
517 /* clean a few things up */
518 ssl3_cleanup_key_block(s);
519
520 BUF_MEM_free(s->init_buf);
521 s->init_buf=NULL;
522
523 /* remove buffering on output */
524 ssl_free_wbio_buffer(s);
525
526 s->init_num=0;
527
528 if (s->new_session == 2) /* skipped if we just sent a HelloRequest */
529 {
530 /* actually not necessarily a 'new' session unless
531 * SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION is set */
532
533 s->new_session=0;
534
535 ssl_update_cache(s,SSL_SESS_CACHE_SERVER);
536
537 s->ctx->stats.sess_accept_good++;
538 /* s->server=1; */
539 s->handshake_func=ssl3_accept;
540
541 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
542 }
543
544 ret = 1;
545 goto end;
546 /* break; */
547
548 default:
549 SSLerr(SSL_F_SSL3_ACCEPT,SSL_R_UNKNOWN_STATE);
550 ret= -1;
551 goto end;
552 /* break; */
553 }
554
555 if (!s->s3->tmp.reuse_message && !skip)
556 {
557 if (s->debug)
558 {
559 if ((ret=BIO_flush(s->wbio)) <= 0)
560 goto end;
561 }
562
563
564 if ((cb != NULL) && (s->state != state))
565 {
566 new_state=s->state;
567 s->state=state;
568 cb(s,SSL_CB_ACCEPT_LOOP,1);
569 s->state=new_state;
570 }
571 }
572 skip=0;
573 }
574end:
575 /* BIO_flush(s->wbio); */
576
577 s->in_handshake--;
578 if (cb != NULL)
579 cb(s,SSL_CB_ACCEPT_EXIT,ret);
580 return(ret);
581 }
582
583static int ssl3_send_hello_request(SSL *s)
584 {
585 unsigned char *p;
586
587 if (s->state == SSL3_ST_SW_HELLO_REQ_A)
588 {
589 p=(unsigned char *)s->init_buf->data;
590 *(p++)=SSL3_MT_HELLO_REQUEST;
591 *(p++)=0;
592 *(p++)=0;
593 *(p++)=0;
594
595 s->state=SSL3_ST_SW_HELLO_REQ_B;
596 /* number of bytes to write */
597 s->init_num=4;
598 s->init_off=0;
599 }
600
601 /* SSL3_ST_SW_HELLO_REQ_B */
602 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
603 }
604
605static int ssl3_check_client_hello(SSL *s)
606 {
607 int ok;
608 long n;
609
610 /* this function is called when we really expect a Certificate message,
611 * so permit appropriate message length */
612 n=ssl3_get_message(s,
613 SSL3_ST_SR_CERT_A,
614 SSL3_ST_SR_CERT_B,
615 -1,
616 s->max_cert_list,
617 &ok);
618 if (!ok) return((int)n);
619 s->s3->tmp.reuse_message = 1;
620 if (s->s3->tmp.message_type == SSL3_MT_CLIENT_HELLO)
621 {
622 /* Throw away what we have done so far in the current handshake,
623 * which will now be aborted. (A full SSL_clear would be too much.)
624 * I hope that tmp.dh is the only thing that may need to be cleared
625 * when a handshake is not completed ... */
626#ifndef OPENSSL_NO_DH
627 if (s->s3->tmp.dh != NULL)
628 {
629 DH_free(s->s3->tmp.dh);
630 s->s3->tmp.dh = NULL;
631 }
632#endif
633 return 2;
634 }
635 return 1;
636}
637
638static int ssl3_get_client_hello(SSL *s)
639 {
640 int i,j,ok,al,ret= -1;
641 long n;
642 unsigned long id;
643 unsigned char *p,*d,*q;
644 SSL_CIPHER *c;
645 SSL_COMP *comp=NULL;
646 STACK_OF(SSL_CIPHER) *ciphers=NULL;
647
648 /* We do this so that we will respond with our native type.
649 * If we are TLSv1 and we get SSLv3, we will respond with TLSv1,
650 * This down switching should be handled by a different method.
651 * If we are SSLv3, we will respond with SSLv3, even if prompted with
652 * TLSv1.
653 */
654 if (s->state == SSL3_ST_SR_CLNT_HELLO_A)
655 {
656 s->first_packet=1;
657 s->state=SSL3_ST_SR_CLNT_HELLO_B;
658 }
659 n=ssl3_get_message(s,
660 SSL3_ST_SR_CLNT_HELLO_B,
661 SSL3_ST_SR_CLNT_HELLO_C,
662 SSL3_MT_CLIENT_HELLO,
663 SSL3_RT_MAX_PLAIN_LENGTH,
664 &ok);
665
666 if (!ok) return((int)n);
667 d=p=(unsigned char *)s->init_msg;
668
669 /* use version from inside client hello, not from record header
670 * (may differ: see RFC 2246, Appendix E, second paragraph) */
671 s->client_version=(((int)p[0])<<8)|(int)p[1];
672 p+=2;
673
674 if (s->client_version < s->version)
675 {
676 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_WRONG_VERSION_NUMBER);
677 if ((s->client_version>>8) == SSL3_VERSION_MAJOR)
678 {
679 /* similar to ssl3_get_record, send alert using remote version number */
680 s->version = s->client_version;
681 }
682 al = SSL_AD_PROTOCOL_VERSION;
683 goto f_err;
684 }
685
686 /* load the client random */
687 memcpy(s->s3->client_random,p,SSL3_RANDOM_SIZE);
688 p+=SSL3_RANDOM_SIZE;
689
690 /* get the session-id */
691 j= *(p++);
692
693 s->hit=0;
694 /* Versions before 0.9.7 always allow session reuse during renegotiation
695 * (i.e. when s->new_session is true), option
696 * SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION is new with 0.9.7.
697 * Maybe this optional behaviour should always have been the default,
698 * but we cannot safely change the default behaviour (or new applications
699 * might be written that become totally unsecure when compiled with
700 * an earlier library version)
701 */
702 if (j == 0 || (s->new_session && (s->options & SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION)))
703 {
704 if (!ssl_get_new_session(s,1))
705 goto err;
706 }
707 else
708 {
709 i=ssl_get_prev_session(s,p,j);
710 if (i == 1)
711 { /* previous session */
712 s->hit=1;
713 }
714 else if (i == -1)
715 goto err;
716 else /* i == 0 */
717 {
718 if (!ssl_get_new_session(s,1))
719 goto err;
720 }
721 }
722
723 p+=j;
724 n2s(p,i);
725 if ((i == 0) && (j != 0))
726 {
727 /* we need a cipher if we are not resuming a session */
728 al=SSL_AD_ILLEGAL_PARAMETER;
729 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_NO_CIPHERS_SPECIFIED);
730 goto f_err;
731 }
732 if ((p+i) >= (d+n))
733 {
734 /* not enough data */
735 al=SSL_AD_DECODE_ERROR;
736 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_LENGTH_MISMATCH);
737 goto f_err;
738 }
739 if ((i > 0) && (ssl_bytes_to_cipher_list(s,p,i,&(ciphers))
740 == NULL))
741 {
742 goto err;
743 }
744 p+=i;
745
746 /* If it is a hit, check that the cipher is in the list */
747 if ((s->hit) && (i > 0))
748 {
749 j=0;
750 id=s->session->cipher->id;
751
752#ifdef CIPHER_DEBUG
753 printf("client sent %d ciphers\n",sk_num(ciphers));
754#endif
755 for (i=0; i<sk_SSL_CIPHER_num(ciphers); i++)
756 {
757 c=sk_SSL_CIPHER_value(ciphers,i);
758#ifdef CIPHER_DEBUG
759 printf("client [%2d of %2d]:%s\n",
760 i,sk_num(ciphers),SSL_CIPHER_get_name(c));
761#endif
762 if (c->id == id)
763 {
764 j=1;
765 break;
766 }
767 }
768 if (j == 0)
769 {
770 if ((s->options & SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG) && (sk_SSL_CIPHER_num(ciphers) == 1))
771 {
772 /* Very bad for multi-threading.... */
773 s->session->cipher=sk_SSL_CIPHER_value(ciphers,
774 0);
775 }
776 else
777 {
778 /* we need to have the cipher in the cipher
779 * list if we are asked to reuse it */
780 al=SSL_AD_ILLEGAL_PARAMETER;
781 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_REQUIRED_CIPHER_MISSING);
782 goto f_err;
783 }
784 }
785 }
786
787 /* compression */
788 i= *(p++);
789 if ((p+i) > (d+n))
790 {
791 /* not enough data */
792 al=SSL_AD_DECODE_ERROR;
793 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_LENGTH_MISMATCH);
794 goto f_err;
795 }
796 q=p;
797 for (j=0; j<i; j++)
798 {
799 if (p[j] == 0) break;
800 }
801
802 p+=i;
803 if (j >= i)
804 {
805 /* no compress */
806 al=SSL_AD_DECODE_ERROR;
807 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_NO_COMPRESSION_SPECIFIED);
808 goto f_err;
809 }
810
811 /* Worst case, we will use the NULL compression, but if we have other
812 * options, we will now look for them. We have i-1 compression
813 * algorithms from the client, starting at q. */
814 s->s3->tmp.new_compression=NULL;
815 if (s->ctx->comp_methods != NULL)
816 { /* See if we have a match */
817 int m,nn,o,v,done=0;
818
819 nn=sk_SSL_COMP_num(s->ctx->comp_methods);
820 for (m=0; m<nn; m++)
821 {
822 comp=sk_SSL_COMP_value(s->ctx->comp_methods,m);
823 v=comp->id;
824 for (o=0; o<i; o++)
825 {
826 if (v == q[o])
827 {
828 done=1;
829 break;
830 }
831 }
832 if (done) break;
833 }
834 if (done)
835 s->s3->tmp.new_compression=comp;
836 else
837 comp=NULL;
838 }
839
840 /* TLS does not mind if there is extra stuff */
841 if (s->version == SSL3_VERSION)
842 {
843 if (p < (d+n))
844 {
845 /* wrong number of bytes,
846 * there could be more to follow */
847 al=SSL_AD_DECODE_ERROR;
848 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_LENGTH_MISMATCH);
849 goto f_err;
850 }
851 }
852
853 /* Given s->session->ciphers and SSL_get_ciphers, we must
854 * pick a cipher */
855
856 if (!s->hit)
857 {
858 s->session->compress_meth=(comp == NULL)?0:comp->id;
859 if (s->session->ciphers != NULL)
860 sk_SSL_CIPHER_free(s->session->ciphers);
861 s->session->ciphers=ciphers;
862 if (ciphers == NULL)
863 {
864 al=SSL_AD_ILLEGAL_PARAMETER;
865 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_NO_CIPHERS_PASSED);
866 goto f_err;
867 }
868 ciphers=NULL;
869 c=ssl3_choose_cipher(s,s->session->ciphers,
870 SSL_get_ciphers(s));
871
872 if (c == NULL)
873 {
874 al=SSL_AD_HANDSHAKE_FAILURE;
875 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_NO_SHARED_CIPHER);
876 goto f_err;
877 }
878 s->s3->tmp.new_cipher=c;
879 }
880 else
881 {
882 /* Session-id reuse */
883#ifdef REUSE_CIPHER_BUG
884 STACK_OF(SSL_CIPHER) *sk;
885 SSL_CIPHER *nc=NULL;
886 SSL_CIPHER *ec=NULL;
887
888 if (s->options & SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG)
889 {
890 sk=s->session->ciphers;
891 for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
892 {
893 c=sk_SSL_CIPHER_value(sk,i);
894 if (c->algorithms & SSL_eNULL)
895 nc=c;
896 if (SSL_C_IS_EXPORT(c))
897 ec=c;
898 }
899 if (nc != NULL)
900 s->s3->tmp.new_cipher=nc;
901 else if (ec != NULL)
902 s->s3->tmp.new_cipher=ec;
903 else
904 s->s3->tmp.new_cipher=s->session->cipher;
905 }
906 else
907#endif
908 s->s3->tmp.new_cipher=s->session->cipher;
909 }
910
911 /* we now have the following setup.
912 * client_random
913 * cipher_list - our prefered list of ciphers
914 * ciphers - the clients prefered list of ciphers
915 * compression - basically ignored right now
916 * ssl version is set - sslv3
917 * s->session - The ssl session has been setup.
918 * s->hit - session reuse flag
919 * s->tmp.new_cipher - the new cipher to use.
920 */
921
922 ret=1;
923 if (0)
924 {
925f_err:
926 ssl3_send_alert(s,SSL3_AL_FATAL,al);
927 }
928err:
929 if (ciphers != NULL) sk_SSL_CIPHER_free(ciphers);
930 return(ret);
931 }
932
933static int ssl3_send_server_hello(SSL *s)
934 {
935 unsigned char *buf;
936 unsigned char *p,*d;
937 int i,sl;
938 unsigned long l,Time;
939
940 if (s->state == SSL3_ST_SW_SRVR_HELLO_A)
941 {
942 buf=(unsigned char *)s->init_buf->data;
943 p=s->s3->server_random;
944 Time=time(NULL); /* Time */
945 l2n(Time,p);
946 RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE-sizeof(Time));
947 /* Do the message type and length last */
948 d=p= &(buf[4]);
949
950 *(p++)=s->version>>8;
951 *(p++)=s->version&0xff;
952
953 /* Random stuff */
954 memcpy(p,s->s3->server_random,SSL3_RANDOM_SIZE);
955 p+=SSL3_RANDOM_SIZE;
956
957 /* now in theory we have 3 options to sending back the
958 * session id. If it is a re-use, we send back the
959 * old session-id, if it is a new session, we send
960 * back the new session-id or we send back a 0 length
961 * session-id if we want it to be single use.
962 * Currently I will not implement the '0' length session-id
963 * 12-Jan-98 - I'll now support the '0' length stuff.
964 */
965 if (!(s->ctx->session_cache_mode & SSL_SESS_CACHE_SERVER))
966 s->session->session_id_length=0;
967
968 sl=s->session->session_id_length;
969 if (sl > sizeof s->session->session_id)
970 {
971 SSLerr(SSL_F_SSL3_SEND_SERVER_HELLO, ERR_R_INTERNAL_ERROR);
972 return -1;
973 }
974 *(p++)=sl;
975 memcpy(p,s->session->session_id,sl);
976 p+=sl;
977
978 /* put the cipher */
979 i=ssl3_put_cipher_by_char(s->s3->tmp.new_cipher,p);
980 p+=i;
981
982 /* put the compression method */
983 if (s->s3->tmp.new_compression == NULL)
984 *(p++)=0;
985 else
986 *(p++)=s->s3->tmp.new_compression->id;
987
988 /* do the header */
989 l=(p-d);
990 d=buf;
991 *(d++)=SSL3_MT_SERVER_HELLO;
992 l2n3(l,d);
993
994 s->state=SSL3_ST_CW_CLNT_HELLO_B;
995 /* number of bytes to write */
996 s->init_num=p-buf;
997 s->init_off=0;
998 }
999
1000 /* SSL3_ST_CW_CLNT_HELLO_B */
1001 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
1002 }
1003
1004static int ssl3_send_server_done(SSL *s)
1005 {
1006 unsigned char *p;
1007
1008 if (s->state == SSL3_ST_SW_SRVR_DONE_A)
1009 {
1010 p=(unsigned char *)s->init_buf->data;
1011
1012 /* do the header */
1013 *(p++)=SSL3_MT_SERVER_DONE;
1014 *(p++)=0;
1015 *(p++)=0;
1016 *(p++)=0;
1017
1018 s->state=SSL3_ST_SW_SRVR_DONE_B;
1019 /* number of bytes to write */
1020 s->init_num=4;
1021 s->init_off=0;
1022 }
1023
1024 /* SSL3_ST_CW_CLNT_HELLO_B */
1025 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
1026 }
1027
1028static int ssl3_send_server_key_exchange(SSL *s)
1029 {
1030#ifndef OPENSSL_NO_RSA
1031 unsigned char *q;
1032 int j,num;
1033 RSA *rsa;
1034 unsigned char md_buf[MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH];
1035 unsigned int u;
1036#endif
1037#ifndef OPENSSL_NO_DH
1038 DH *dh=NULL,*dhp;
1039#endif
1040 EVP_PKEY *pkey;
1041 unsigned char *p,*d;
1042 int al,i;
1043 unsigned long type;
1044 int n;
1045 CERT *cert;
1046 BIGNUM *r[4];
1047 int nr[4],kn;
1048 BUF_MEM *buf;
1049 EVP_MD_CTX md_ctx;
1050
1051 EVP_MD_CTX_init(&md_ctx);
1052 if (s->state == SSL3_ST_SW_KEY_EXCH_A)
1053 {
1054 type=s->s3->tmp.new_cipher->algorithms & SSL_MKEY_MASK;
1055 cert=s->cert;
1056
1057 buf=s->init_buf;
1058
1059 r[0]=r[1]=r[2]=r[3]=NULL;
1060 n=0;
1061#ifndef OPENSSL_NO_RSA
1062 if (type & SSL_kRSA)
1063 {
1064 rsa=cert->rsa_tmp;
1065 if ((rsa == NULL) && (s->cert->rsa_tmp_cb != NULL))
1066 {
1067 rsa=s->cert->rsa_tmp_cb(s,
1068 SSL_C_IS_EXPORT(s->s3->tmp.new_cipher),
1069 SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher));
1070 if(rsa == NULL)
1071 {
1072 al=SSL_AD_HANDSHAKE_FAILURE;
1073 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_ERROR_GENERATING_TMP_RSA_KEY);
1074 goto f_err;
1075 }
1076 RSA_up_ref(rsa);
1077 cert->rsa_tmp=rsa;
1078 }
1079 if (rsa == NULL)
1080 {
1081 al=SSL_AD_HANDSHAKE_FAILURE;
1082 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_MISSING_TMP_RSA_KEY);
1083 goto f_err;
1084 }
1085 r[0]=rsa->n;
1086 r[1]=rsa->e;
1087 s->s3->tmp.use_rsa_tmp=1;
1088 }
1089 else
1090#endif
1091#ifndef OPENSSL_NO_DH
1092 if (type & SSL_kEDH)
1093 {
1094 dhp=cert->dh_tmp;
1095 if ((dhp == NULL) && (s->cert->dh_tmp_cb != NULL))
1096 dhp=s->cert->dh_tmp_cb(s,
1097 SSL_C_IS_EXPORT(s->s3->tmp.new_cipher),
1098 SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher));
1099 if (dhp == NULL)
1100 {
1101 al=SSL_AD_HANDSHAKE_FAILURE;
1102 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_MISSING_TMP_DH_KEY);
1103 goto f_err;
1104 }
1105
1106 if (s->s3->tmp.dh != NULL)
1107 {
1108 DH_free(dh);
1109 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
1110 goto err;
1111 }
1112
1113 if ((dh=DHparams_dup(dhp)) == NULL)
1114 {
1115 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_R_DH_LIB);
1116 goto err;
1117 }
1118
1119 s->s3->tmp.dh=dh;
1120 if ((dhp->pub_key == NULL ||
1121 dhp->priv_key == NULL ||
1122 (s->options & SSL_OP_SINGLE_DH_USE)))
1123 {
1124 if(!DH_generate_key(dh))
1125 {
1126 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,
1127 ERR_R_DH_LIB);
1128 goto err;
1129 }
1130 }
1131 else
1132 {
1133 dh->pub_key=BN_dup(dhp->pub_key);
1134 dh->priv_key=BN_dup(dhp->priv_key);
1135 if ((dh->pub_key == NULL) ||
1136 (dh->priv_key == NULL))
1137 {
1138 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_R_DH_LIB);
1139 goto err;
1140 }
1141 }
1142 r[0]=dh->p;
1143 r[1]=dh->g;
1144 r[2]=dh->pub_key;
1145 }
1146 else
1147#endif
1148 {
1149 al=SSL_AD_HANDSHAKE_FAILURE;
1150 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE);
1151 goto f_err;
1152 }
1153 for (i=0; r[i] != NULL; i++)
1154 {
1155 nr[i]=BN_num_bytes(r[i]);
1156 n+=2+nr[i];
1157 }
1158
1159 if (!(s->s3->tmp.new_cipher->algorithms & SSL_aNULL))
1160 {
1161 if ((pkey=ssl_get_sign_pkey(s,s->s3->tmp.new_cipher))
1162 == NULL)
1163 {
1164 al=SSL_AD_DECODE_ERROR;
1165 goto f_err;
1166 }
1167 kn=EVP_PKEY_size(pkey);
1168 }
1169 else
1170 {
1171 pkey=NULL;
1172 kn=0;
1173 }
1174
1175 if (!BUF_MEM_grow(buf,n+4+kn))
1176 {
1177 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_BUF);
1178 goto err;
1179 }
1180 d=(unsigned char *)s->init_buf->data;
1181 p= &(d[4]);
1182
1183 for (i=0; r[i] != NULL; i++)
1184 {
1185 s2n(nr[i],p);
1186 BN_bn2bin(r[i],p);
1187 p+=nr[i];
1188 }
1189
1190 /* not anonymous */
1191 if (pkey != NULL)
1192 {
1193 /* n is the length of the params, they start at &(d[4])
1194 * and p points to the space at the end. */
1195#ifndef OPENSSL_NO_RSA
1196 if (pkey->type == EVP_PKEY_RSA)
1197 {
1198 q=md_buf;
1199 j=0;
1200 for (num=2; num > 0; num--)
1201 {
1202 EVP_DigestInit_ex(&md_ctx,(num == 2)
1203 ?s->ctx->md5:s->ctx->sha1, NULL);
1204 EVP_DigestUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1205 EVP_DigestUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1206 EVP_DigestUpdate(&md_ctx,&(d[4]),n);
1207 EVP_DigestFinal_ex(&md_ctx,q,
1208 (unsigned int *)&i);
1209 q+=i;
1210 j+=i;
1211 }
1212 if (RSA_sign(NID_md5_sha1, md_buf, j,
1213 &(p[2]), &u, pkey->pkey.rsa) <= 0)
1214 {
1215 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_RSA);
1216 goto err;
1217 }
1218 s2n(u,p);
1219 n+=u+2;
1220 }
1221 else
1222#endif
1223#if !defined(OPENSSL_NO_DSA)
1224 if (pkey->type == EVP_PKEY_DSA)
1225 {
1226 /* lets do DSS */
1227 EVP_SignInit_ex(&md_ctx,EVP_dss1(), NULL);
1228 EVP_SignUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1229 EVP_SignUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1230 EVP_SignUpdate(&md_ctx,&(d[4]),n);
1231 if (!EVP_SignFinal(&md_ctx,&(p[2]),
1232 (unsigned int *)&i,pkey))
1233 {
1234 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_DSA);
1235 goto err;
1236 }
1237 s2n(i,p);
1238 n+=i+2;
1239 }
1240 else
1241#endif
1242 {
1243 /* Is this error check actually needed? */
1244 al=SSL_AD_HANDSHAKE_FAILURE;
1245 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_UNKNOWN_PKEY_TYPE);
1246 goto f_err;
1247 }
1248 }
1249
1250 *(d++)=SSL3_MT_SERVER_KEY_EXCHANGE;
1251 l2n3(n,d);
1252
1253 /* we should now have things packed up, so lets send
1254 * it off */
1255 s->init_num=n+4;
1256 s->init_off=0;
1257 }
1258
1259 s->state = SSL3_ST_SW_KEY_EXCH_B;
1260 EVP_MD_CTX_cleanup(&md_ctx);
1261 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
1262f_err:
1263 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1264err:
1265 EVP_MD_CTX_cleanup(&md_ctx);
1266 return(-1);
1267 }
1268
1269static int ssl3_send_certificate_request(SSL *s)
1270 {
1271 unsigned char *p,*d;
1272 int i,j,nl,off,n;
1273 STACK_OF(X509_NAME) *sk=NULL;
1274 X509_NAME *name;
1275 BUF_MEM *buf;
1276
1277 if (s->state == SSL3_ST_SW_CERT_REQ_A)
1278 {
1279 buf=s->init_buf;
1280
1281 d=p=(unsigned char *)&(buf->data[4]);
1282
1283 /* get the list of acceptable cert types */
1284 p++;
1285 n=ssl3_get_req_cert_type(s,p);
1286 d[0]=n;
1287 p+=n;
1288 n++;
1289
1290 off=n;
1291 p+=2;
1292 n+=2;
1293
1294 sk=SSL_get_client_CA_list(s);
1295 nl=0;
1296 if (sk != NULL)
1297 {
1298 for (i=0; i<sk_X509_NAME_num(sk); i++)
1299 {
1300 name=sk_X509_NAME_value(sk,i);
1301 j=i2d_X509_NAME(name,NULL);
1302 if (!BUF_MEM_grow(buf,4+n+j+2))
1303 {
1304 SSLerr(SSL_F_SSL3_SEND_CERTIFICATE_REQUEST,ERR_R_BUF_LIB);
1305 goto err;
1306 }
1307 p=(unsigned char *)&(buf->data[4+n]);
1308 if (!(s->options & SSL_OP_NETSCAPE_CA_DN_BUG))
1309 {
1310 s2n(j,p);
1311 i2d_X509_NAME(name,&p);
1312 n+=2+j;
1313 nl+=2+j;
1314 }
1315 else
1316 {
1317 d=p;
1318 i2d_X509_NAME(name,&p);
1319 j-=2; s2n(j,d); j+=2;
1320 n+=j;
1321 nl+=j;
1322 }
1323 }
1324 }
1325 /* else no CA names */
1326 p=(unsigned char *)&(buf->data[4+off]);
1327 s2n(nl,p);
1328
1329 d=(unsigned char *)buf->data;
1330 *(d++)=SSL3_MT_CERTIFICATE_REQUEST;
1331 l2n3(n,d);
1332
1333 /* we should now have things packed up, so lets send
1334 * it off */
1335
1336 s->init_num=n+4;
1337 s->init_off=0;
1338#ifdef NETSCAPE_HANG_BUG
1339 p=(unsigned char *)s->init_buf->data + s->init_num;
1340
1341 /* do the header */
1342 *(p++)=SSL3_MT_SERVER_DONE;
1343 *(p++)=0;
1344 *(p++)=0;
1345 *(p++)=0;
1346 s->init_num += 4;
1347#endif
1348
1349 }
1350
1351 /* SSL3_ST_SW_CERT_REQ_B */
1352 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
1353err:
1354 return(-1);
1355 }
1356
1357static int ssl3_get_client_key_exchange(SSL *s)
1358 {
1359 int i,al,ok;
1360 long n;
1361 unsigned long l;
1362 unsigned char *p;
1363#ifndef OPENSSL_NO_RSA
1364 RSA *rsa=NULL;
1365 EVP_PKEY *pkey=NULL;
1366#endif
1367#ifndef OPENSSL_NO_DH
1368 BIGNUM *pub=NULL;
1369 DH *dh_srvr;
1370#endif
1371#ifndef OPENSSL_NO_KRB5
1372 KSSL_ERR kssl_err;
1373#endif /* OPENSSL_NO_KRB5 */
1374
1375 n=ssl3_get_message(s,
1376 SSL3_ST_SR_KEY_EXCH_A,
1377 SSL3_ST_SR_KEY_EXCH_B,
1378 SSL3_MT_CLIENT_KEY_EXCHANGE,
1379 2048, /* ??? */
1380 &ok);
1381
1382 if (!ok) return((int)n);
1383 p=(unsigned char *)s->init_msg;
1384
1385 l=s->s3->tmp.new_cipher->algorithms;
1386
1387#ifndef OPENSSL_NO_RSA
1388 if (l & SSL_kRSA)
1389 {
1390 /* FIX THIS UP EAY EAY EAY EAY */
1391 if (s->s3->tmp.use_rsa_tmp)
1392 {
1393 if ((s->cert != NULL) && (s->cert->rsa_tmp != NULL))
1394 rsa=s->cert->rsa_tmp;
1395 /* Don't do a callback because rsa_tmp should
1396 * be sent already */
1397 if (rsa == NULL)
1398 {
1399 al=SSL_AD_HANDSHAKE_FAILURE;
1400 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_MISSING_TMP_RSA_PKEY);
1401 goto f_err;
1402
1403 }
1404 }
1405 else
1406 {
1407 pkey=s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey;
1408 if ( (pkey == NULL) ||
1409 (pkey->type != EVP_PKEY_RSA) ||
1410 (pkey->pkey.rsa == NULL))
1411 {
1412 al=SSL_AD_HANDSHAKE_FAILURE;
1413 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_MISSING_RSA_CERTIFICATE);
1414 goto f_err;
1415 }
1416 rsa=pkey->pkey.rsa;
1417 }
1418
1419 /* TLS */
1420 if (s->version > SSL3_VERSION)
1421 {
1422 n2s(p,i);
1423 if (n != i+2)
1424 {
1425 if (!(s->options & SSL_OP_TLS_D5_BUG))
1426 {
1427 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG);
1428 goto err;
1429 }
1430 else
1431 p-=2;
1432 }
1433 else
1434 n=i;
1435 }
1436
1437 i=RSA_private_decrypt((int)n,p,p,rsa,RSA_PKCS1_PADDING);
1438
1439 al = -1;
1440
1441 if (i != SSL_MAX_MASTER_KEY_LENGTH)
1442 {
1443 al=SSL_AD_DECODE_ERROR;
1444 /* SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_DECRYPT); */
1445 }
1446
1447 if ((al == -1) && !((p[0] == (s->client_version>>8)) && (p[1] == (s->client_version & 0xff))))
1448 {
1449 /* The premaster secret must contain the same version number as the
1450 * ClientHello to detect version rollback attacks (strangely, the
1451 * protocol does not offer such protection for DH ciphersuites).
1452 * However, buggy clients exist that send the negotiated protocol
1453 * version instead if the server does not support the requested
1454 * protocol version.
1455 * If SSL_OP_TLS_ROLLBACK_BUG is set, tolerate such clients. */
1456 if (!((s->options & SSL_OP_TLS_ROLLBACK_BUG) &&
1457 (p[0] == (s->version>>8)) && (p[1] == (s->version & 0xff))))
1458 {
1459 al=SSL_AD_DECODE_ERROR;
1460 /* SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BAD_PROTOCOL_VERSION_NUMBER); */
1461
1462 /* The Klima-Pokorny-Rosa extension of Bleichenbacher's attack
1463 * (http://eprint.iacr.org/2003/052/) exploits the version
1464 * number check as a "bad version oracle" -- an alert would
1465 * reveal that the plaintext corresponding to some ciphertext
1466 * made up by the adversary is properly formatted except
1467 * that the version number is wrong. To avoid such attacks,
1468 * we should treat this just like any other decryption error. */
1469 p[0] = (char)(int) "CAN-2003-0131 patch 2003-03-20";
1470 }
1471 }
1472
1473 if (al != -1)
1474 {
1475 /* Some decryption failure -- use random value instead as countermeasure
1476 * against Bleichenbacher's attack on PKCS #1 v1.5 RSA padding
1477 * (see RFC 2246, section 7.4.7.1). */
1478 ERR_clear_error();
1479 i = SSL_MAX_MASTER_KEY_LENGTH;
1480 p[0] = s->client_version >> 8;
1481 p[1] = s->client_version & 0xff;
1482 RAND_pseudo_bytes(p+2, i-2); /* should be RAND_bytes, but we cannot work around a failure */
1483 }
1484
1485 s->session->master_key_length=
1486 s->method->ssl3_enc->generate_master_secret(s,
1487 s->session->master_key,
1488 p,i);
1489 memset(p,0,i);
1490 }
1491 else
1492#endif
1493#ifndef OPENSSL_NO_DH
1494 if (l & (SSL_kEDH|SSL_kDHr|SSL_kDHd))
1495 {
1496 n2s(p,i);
1497 if (n != i+2)
1498 {
1499 if (!(s->options & SSL_OP_SSLEAY_080_CLIENT_DH_BUG))
1500 {
1501 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG);
1502 goto err;
1503 }
1504 else
1505 {
1506 p-=2;
1507 i=(int)n;
1508 }
1509 }
1510
1511 if (n == 0L) /* the parameters are in the cert */
1512 {
1513 al=SSL_AD_HANDSHAKE_FAILURE;
1514 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_UNABLE_TO_DECODE_DH_CERTS);
1515 goto f_err;
1516 }
1517 else
1518 {
1519 if (s->s3->tmp.dh == NULL)
1520 {
1521 al=SSL_AD_HANDSHAKE_FAILURE;
1522 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_MISSING_TMP_DH_KEY);
1523 goto f_err;
1524 }
1525 else
1526 dh_srvr=s->s3->tmp.dh;
1527 }
1528
1529 pub=BN_bin2bn(p,i,NULL);
1530 if (pub == NULL)
1531 {
1532 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BN_LIB);
1533 goto err;
1534 }
1535
1536 i=DH_compute_key(p,pub,dh_srvr);
1537
1538 if (i <= 0)
1539 {
1540 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB);
1541 goto err;
1542 }
1543
1544 DH_free(s->s3->tmp.dh);
1545 s->s3->tmp.dh=NULL;
1546
1547 BN_clear_free(pub);
1548 pub=NULL;
1549 s->session->master_key_length=
1550 s->method->ssl3_enc->generate_master_secret(s,
1551 s->session->master_key,p,i);
1552 memset(p,0,i);
1553 }
1554 else
1555#endif
1556#ifndef OPENSSL_NO_KRB5
1557 if (l & SSL_kKRB5)
1558 {
1559 krb5_error_code krb5rc;
1560 krb5_data enc_ticket;
1561 krb5_data authenticator;
1562 krb5_data enc_pms;
1563 KSSL_CTX *kssl_ctx = s->kssl_ctx;
1564 EVP_CIPHER_CTX ciph_ctx;
1565 EVP_CIPHER *enc = NULL;
1566 unsigned char iv[EVP_MAX_IV_LENGTH];
1567 unsigned char pms[SSL_MAX_MASTER_KEY_LENGTH
1568 + EVP_MAX_BLOCK_LENGTH];
1569 int padl, outl;
1570 krb5_timestamp authtime = 0;
1571 krb5_ticket_times ttimes;
1572
1573 EVP_CIPHER_CTX_init(&ciph_ctx);
1574
1575 if (!kssl_ctx) kssl_ctx = kssl_ctx_new();
1576
1577 n2s(p,i);
1578 enc_ticket.length = i;
1579 enc_ticket.data = (char *)p;
1580 p+=enc_ticket.length;
1581
1582 n2s(p,i);
1583 authenticator.length = i;
1584 authenticator.data = (char *)p;
1585 p+=authenticator.length;
1586
1587 n2s(p,i);
1588 enc_pms.length = i;
1589 enc_pms.data = (char *)p;
1590 p+=enc_pms.length;
1591
1592 /* Note that the length is checked again below,
1593 ** after decryption
1594 */
1595 if(enc_pms.length > sizeof pms)
1596 {
1597 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1598 SSL_R_DATA_LENGTH_TOO_LONG);
1599 goto err;
1600 }
1601
1602 if (n != enc_ticket.length + authenticator.length +
1603 enc_pms.length + 6)
1604 {
1605 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1606 SSL_R_DATA_LENGTH_TOO_LONG);
1607 goto err;
1608 }
1609
1610 if ((krb5rc = kssl_sget_tkt(kssl_ctx, &enc_ticket, &ttimes,
1611 &kssl_err)) != 0)
1612 {
1613#ifdef KSSL_DEBUG
1614 printf("kssl_sget_tkt rtn %d [%d]\n",
1615 krb5rc, kssl_err.reason);
1616 if (kssl_err.text)
1617 printf("kssl_err text= %s\n", kssl_err.text);
1618#endif /* KSSL_DEBUG */
1619 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
1620 kssl_err.reason);
1621 goto err;
1622 }
1623
1624 /* Note: no authenticator is not considered an error,
1625 ** but will return authtime == 0.
1626 */
1627 if ((krb5rc = kssl_check_authent(kssl_ctx, &authenticator,
1628 &authtime, &kssl_err)) != 0)
1629 {
1630#ifdef KSSL_DEBUG
1631 printf("kssl_check_authent rtn %d [%d]\n",
1632 krb5rc, kssl_err.reason);
1633 if (kssl_err.text)
1634 printf("kssl_err text= %s\n", kssl_err.text);
1635#endif /* KSSL_DEBUG */
1636 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
1637 kssl_err.reason);
1638 goto err;
1639 }
1640
1641 if ((krb5rc = kssl_validate_times(authtime, &ttimes)) != 0)
1642 {
1643 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, krb5rc);
1644 goto err;
1645 }
1646
1647#ifdef KSSL_DEBUG
1648 kssl_ctx_show(kssl_ctx);
1649#endif /* KSSL_DEBUG */
1650
1651 enc = kssl_map_enc(kssl_ctx->enctype);
1652 if (enc == NULL)
1653 goto err;
1654
1655 memset(iv, 0, EVP_MAX_IV_LENGTH); /* per RFC 1510 */
1656
1657 if (!EVP_DecryptInit_ex(&ciph_ctx,enc,NULL,kssl_ctx->key,iv))
1658 {
1659 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1660 SSL_R_DECRYPTION_FAILED);
1661 goto err;
1662 }
1663 if (!EVP_DecryptUpdate(&ciph_ctx, pms,&outl,
1664 (unsigned char *)enc_pms.data, enc_pms.length))
1665 {
1666 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1667 SSL_R_DECRYPTION_FAILED);
1668 goto err;
1669 }
1670 if (outl > SSL_MAX_MASTER_KEY_LENGTH)
1671 {
1672 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1673 SSL_R_DATA_LENGTH_TOO_LONG);
1674 goto err;
1675 }
1676 if (!EVP_DecryptFinal_ex(&ciph_ctx,&(pms[outl]),&padl))
1677 {
1678 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1679 SSL_R_DECRYPTION_FAILED);
1680 goto err;
1681 }
1682 outl += padl;
1683 if (outl > SSL_MAX_MASTER_KEY_LENGTH)
1684 {
1685 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1686 SSL_R_DATA_LENGTH_TOO_LONG);
1687 goto err;
1688 }
1689 EVP_CIPHER_CTX_cleanup(&ciph_ctx);
1690
1691 s->session->master_key_length=
1692 s->method->ssl3_enc->generate_master_secret(s,
1693 s->session->master_key, pms, outl);
1694
1695 if (kssl_ctx->client_princ)
1696 {
1697 int len = strlen(kssl_ctx->client_princ);
1698 if ( len < SSL_MAX_KRB5_PRINCIPAL_LENGTH )
1699 {
1700 s->session->krb5_client_princ_len = len;
1701 memcpy(s->session->krb5_client_princ,kssl_ctx->client_princ,len);
1702 }
1703 }
1704
1705
1706 /* Was doing kssl_ctx_free() here,
1707 ** but it caused problems for apache.
1708 ** kssl_ctx = kssl_ctx_free(kssl_ctx);
1709 ** if (s->kssl_ctx) s->kssl_ctx = NULL;
1710 */
1711 }
1712 else
1713#endif /* OPENSSL_NO_KRB5 */
1714 {
1715 al=SSL_AD_HANDSHAKE_FAILURE;
1716 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1717 SSL_R_UNKNOWN_CIPHER_TYPE);
1718 goto f_err;
1719 }
1720
1721 return(1);
1722f_err:
1723 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1724#if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_RSA)
1725err:
1726#endif
1727 return(-1);
1728 }
1729
1730static int ssl3_get_cert_verify(SSL *s)
1731 {
1732 EVP_PKEY *pkey=NULL;
1733 unsigned char *p;
1734 int al,ok,ret=0;
1735 long n;
1736 int type=0,i,j;
1737 X509 *peer;
1738
1739 n=ssl3_get_message(s,
1740 SSL3_ST_SR_CERT_VRFY_A,
1741 SSL3_ST_SR_CERT_VRFY_B,
1742 -1,
1743 512, /* 512? */
1744 &ok);
1745
1746 if (!ok) return((int)n);
1747
1748 if (s->session->peer != NULL)
1749 {
1750 peer=s->session->peer;
1751 pkey=X509_get_pubkey(peer);
1752 type=X509_certificate_type(peer,pkey);
1753 }
1754 else
1755 {
1756 peer=NULL;
1757 pkey=NULL;
1758 }
1759
1760 if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE_VERIFY)
1761 {
1762 s->s3->tmp.reuse_message=1;
1763 if ((peer != NULL) && (type | EVP_PKT_SIGN))
1764 {
1765 al=SSL_AD_UNEXPECTED_MESSAGE;
1766 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_MISSING_VERIFY_MESSAGE);
1767 goto f_err;
1768 }
1769 ret=1;
1770 goto end;
1771 }
1772
1773 if (peer == NULL)
1774 {
1775 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_NO_CLIENT_CERT_RECEIVED);
1776 al=SSL_AD_UNEXPECTED_MESSAGE;
1777 goto f_err;
1778 }
1779
1780 if (!(type & EVP_PKT_SIGN))
1781 {
1782 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE);
1783 al=SSL_AD_ILLEGAL_PARAMETER;
1784 goto f_err;
1785 }
1786
1787 if (s->s3->change_cipher_spec)
1788 {
1789 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_CCS_RECEIVED_EARLY);
1790 al=SSL_AD_UNEXPECTED_MESSAGE;
1791 goto f_err;
1792 }
1793
1794 /* we now have a signature that we need to verify */
1795 p=(unsigned char *)s->init_msg;
1796 n2s(p,i);
1797 n-=2;
1798 if (i > n)
1799 {
1800 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_LENGTH_MISMATCH);
1801 al=SSL_AD_DECODE_ERROR;
1802 goto f_err;
1803 }
1804
1805 j=EVP_PKEY_size(pkey);
1806 if ((i > j) || (n > j) || (n <= 0))
1807 {
1808 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_WRONG_SIGNATURE_SIZE);
1809 al=SSL_AD_DECODE_ERROR;
1810 goto f_err;
1811 }
1812
1813#ifndef OPENSSL_NO_RSA
1814 if (pkey->type == EVP_PKEY_RSA)
1815 {
1816 i=RSA_verify(NID_md5_sha1, s->s3->tmp.cert_verify_md,
1817 MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH, p, i,
1818 pkey->pkey.rsa);
1819 if (i < 0)
1820 {
1821 al=SSL_AD_DECRYPT_ERROR;
1822 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_BAD_RSA_DECRYPT);
1823 goto f_err;
1824 }
1825 if (i == 0)
1826 {
1827 al=SSL_AD_DECRYPT_ERROR;
1828 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_BAD_RSA_SIGNATURE);
1829 goto f_err;
1830 }
1831 }
1832 else
1833#endif
1834#ifndef OPENSSL_NO_DSA
1835 if (pkey->type == EVP_PKEY_DSA)
1836 {
1837 j=DSA_verify(pkey->save_type,
1838 &(s->s3->tmp.cert_verify_md[MD5_DIGEST_LENGTH]),
1839 SHA_DIGEST_LENGTH,p,i,pkey->pkey.dsa);
1840 if (j <= 0)
1841 {
1842 /* bad signature */
1843 al=SSL_AD_DECRYPT_ERROR;
1844 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_BAD_DSA_SIGNATURE);
1845 goto f_err;
1846 }
1847 }
1848 else
1849#endif
1850 {
1851 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,ERR_R_INTERNAL_ERROR);
1852 al=SSL_AD_UNSUPPORTED_CERTIFICATE;
1853 goto f_err;
1854 }
1855
1856
1857 ret=1;
1858 if (0)
1859 {
1860f_err:
1861 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1862 }
1863end:
1864 EVP_PKEY_free(pkey);
1865 return(ret);
1866 }
1867
1868static int ssl3_get_client_certificate(SSL *s)
1869 {
1870 int i,ok,al,ret= -1;
1871 X509 *x=NULL;
1872 unsigned long l,nc,llen,n;
1873 unsigned char *p,*d,*q;
1874 STACK_OF(X509) *sk=NULL;
1875
1876 n=ssl3_get_message(s,
1877 SSL3_ST_SR_CERT_A,
1878 SSL3_ST_SR_CERT_B,
1879 -1,
1880 s->max_cert_list,
1881 &ok);
1882
1883 if (!ok) return((int)n);
1884
1885 if (s->s3->tmp.message_type == SSL3_MT_CLIENT_KEY_EXCHANGE)
1886 {
1887 if ( (s->verify_mode & SSL_VERIFY_PEER) &&
1888 (s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT))
1889 {
1890 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
1891 al=SSL_AD_HANDSHAKE_FAILURE;
1892 goto f_err;
1893 }
1894 /* If tls asked for a client cert, the client must return a 0 list */
1895 if ((s->version > SSL3_VERSION) && s->s3->tmp.cert_request)
1896 {
1897 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST);
1898 al=SSL_AD_UNEXPECTED_MESSAGE;
1899 goto f_err;
1900 }
1901 s->s3->tmp.reuse_message=1;
1902 return(1);
1903 }
1904
1905 if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE)
1906 {
1907 al=SSL_AD_UNEXPECTED_MESSAGE;
1908 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_WRONG_MESSAGE_TYPE);
1909 goto f_err;
1910 }
1911 d=p=(unsigned char *)s->init_msg;
1912
1913 if ((sk=sk_X509_new_null()) == NULL)
1914 {
1915 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,ERR_R_MALLOC_FAILURE);
1916 goto err;
1917 }
1918
1919 n2l3(p,llen);
1920 if (llen+3 != n)
1921 {
1922 al=SSL_AD_DECODE_ERROR;
1923 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_LENGTH_MISMATCH);
1924 goto f_err;
1925 }
1926 for (nc=0; nc<llen; )
1927 {
1928 n2l3(p,l);
1929 if ((l+nc+3) > llen)
1930 {
1931 al=SSL_AD_DECODE_ERROR;
1932 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);
1933 goto f_err;
1934 }
1935
1936 q=p;
1937 x=d2i_X509(NULL,&p,l);
1938 if (x == NULL)
1939 {
1940 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,ERR_R_ASN1_LIB);
1941 goto err;
1942 }
1943 if (p != (q+l))
1944 {
1945 al=SSL_AD_DECODE_ERROR;
1946 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);
1947 goto f_err;
1948 }
1949 if (!sk_X509_push(sk,x))
1950 {
1951 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,ERR_R_MALLOC_FAILURE);
1952 goto err;
1953 }
1954 x=NULL;
1955 nc+=l+3;
1956 }
1957
1958 if (sk_X509_num(sk) <= 0)
1959 {
1960 /* TLS does not mind 0 certs returned */
1961 if (s->version == SSL3_VERSION)
1962 {
1963 al=SSL_AD_HANDSHAKE_FAILURE;
1964 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_NO_CERTIFICATES_RETURNED);
1965 goto f_err;
1966 }
1967 /* Fail for TLS only if we required a certificate */
1968 else if ((s->verify_mode & SSL_VERIFY_PEER) &&
1969 (s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT))
1970 {
1971 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
1972 al=SSL_AD_HANDSHAKE_FAILURE;
1973 goto f_err;
1974 }
1975 }
1976 else
1977 {
1978 i=ssl_verify_cert_chain(s,sk);
1979 if (!i)
1980 {
1981 al=ssl_verify_alarm_type(s->verify_result);
1982 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_NO_CERTIFICATE_RETURNED);
1983 goto f_err;
1984 }
1985 }
1986
1987 if (s->session->peer != NULL) /* This should not be needed */
1988 X509_free(s->session->peer);
1989 s->session->peer=sk_X509_shift(sk);
1990 s->session->verify_result = s->verify_result;
1991
1992 /* With the current implementation, sess_cert will always be NULL
1993 * when we arrive here. */
1994 if (s->session->sess_cert == NULL)
1995 {
1996 s->session->sess_cert = ssl_sess_cert_new();
1997 if (s->session->sess_cert == NULL)
1998 {
1999 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, ERR_R_MALLOC_FAILURE);
2000 goto err;
2001 }
2002 }
2003 if (s->session->sess_cert->cert_chain != NULL)
2004 sk_X509_pop_free(s->session->sess_cert->cert_chain, X509_free);
2005 s->session->sess_cert->cert_chain=sk;
2006 /* Inconsistency alert: cert_chain does *not* include the
2007 * peer's own certificate, while we do include it in s3_clnt.c */
2008
2009 sk=NULL;
2010
2011 ret=1;
2012 if (0)
2013 {
2014f_err:
2015 ssl3_send_alert(s,SSL3_AL_FATAL,al);
2016 }
2017err:
2018 if (x != NULL) X509_free(x);
2019 if (sk != NULL) sk_X509_pop_free(sk,X509_free);
2020 return(ret);
2021 }
2022
2023int ssl3_send_server_certificate(SSL *s)
2024 {
2025 unsigned long l;
2026 X509 *x;
2027
2028 if (s->state == SSL3_ST_SW_CERT_A)
2029 {
2030 x=ssl_get_server_send_cert(s);
2031 if (x == NULL &&
2032 /* VRS: allow null cert if auth == KRB5 */
2033 (s->s3->tmp.new_cipher->algorithms
2034 & (SSL_MKEY_MASK|SSL_AUTH_MASK))
2035 != (SSL_aKRB5|SSL_kKRB5))
2036 {
2037 SSLerr(SSL_F_SSL3_SEND_SERVER_CERTIFICATE,ERR_R_INTERNAL_ERROR);
2038 return(0);
2039 }
2040
2041 l=ssl3_output_cert_chain(s,x);
2042 s->state=SSL3_ST_SW_CERT_B;
2043 s->init_num=(int)l;
2044 s->init_off=0;
2045 }
2046
2047 /* SSL3_ST_SW_CERT_B */
2048 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
2049 }
diff --git a/src/lib/libssl/shlib_version b/src/lib/libssl/shlib_version
deleted file mode 100644
index 5b844bbf42..0000000000
--- a/src/lib/libssl/shlib_version
+++ /dev/null
@@ -1,2 +0,0 @@
1major=7
2minor=0
diff --git a/src/lib/libssl/ssl.h b/src/lib/libssl/ssl.h
deleted file mode 100644
index e9d1e896d7..0000000000
--- a/src/lib/libssl/ssl.h
+++ /dev/null
@@ -1,1838 +0,0 @@
1/* ssl/ssl.h */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58/* ====================================================================
59 * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved.
60 *
61 * Redistribution and use in source and binary forms, with or without
62 * modification, are permitted provided that the following conditions
63 * are met:
64 *
65 * 1. Redistributions of source code must retain the above copyright
66 * notice, this list of conditions and the following disclaimer.
67 *
68 * 2. Redistributions in binary form must reproduce the above copyright
69 * notice, this list of conditions and the following disclaimer in
70 * the documentation and/or other materials provided with the
71 * distribution.
72 *
73 * 3. All advertising materials mentioning features or use of this
74 * software must display the following acknowledgment:
75 * "This product includes software developed by the OpenSSL Project
76 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77 *
78 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79 * endorse or promote products derived from this software without
80 * prior written permission. For written permission, please contact
81 * openssl-core@openssl.org.
82 *
83 * 5. Products derived from this software may not be called "OpenSSL"
84 * nor may "OpenSSL" appear in their names without prior written
85 * permission of the OpenSSL Project.
86 *
87 * 6. Redistributions of any form whatsoever must retain the following
88 * acknowledgment:
89 * "This product includes software developed by the OpenSSL Project
90 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91 *
92 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
96 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103 * OF THE POSSIBILITY OF SUCH DAMAGE.
104 * ====================================================================
105 *
106 * This product includes cryptographic software written by Eric Young
107 * (eay@cryptsoft.com). This product includes software written by Tim
108 * Hudson (tjh@cryptsoft.com).
109 *
110 */
111/* ====================================================================
112 * 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 */
164
165#ifndef HEADER_SSL_H
166#define HEADER_SSL_H
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
183#ifdef __cplusplus
184extern "C" {
185#endif
186
187/* SSLeay version number for ASN.1 encoding of the session information */
188/* Version 0 - initial version
189 * Version 1 - added the optional peer certificate
190 */
191#define SSL_SESSION_ASN1_VERSION 0x0001
192
193/* text strings for the ciphers */
194#define SSL_TXT_NULL_WITH_MD5 SSL2_TXT_NULL_WITH_MD5
195#define SSL_TXT_RC4_128_WITH_MD5 SSL2_TXT_RC4_128_WITH_MD5
196#define SSL_TXT_RC4_128_EXPORT40_WITH_MD5 SSL2_TXT_RC4_128_EXPORT40_WITH_MD5
197#define SSL_TXT_RC2_128_CBC_WITH_MD5 SSL2_TXT_RC2_128_CBC_WITH_MD5
198#define SSL_TXT_RC2_128_CBC_EXPORT40_WITH_MD5 SSL2_TXT_RC2_128_CBC_EXPORT40_WITH_MD5
199#define SSL_TXT_IDEA_128_CBC_WITH_MD5 SSL2_TXT_IDEA_128_CBC_WITH_MD5
200#define SSL_TXT_DES_64_CBC_WITH_MD5 SSL2_TXT_DES_64_CBC_WITH_MD5
201#define SSL_TXT_DES_64_CBC_WITH_SHA SSL2_TXT_DES_64_CBC_WITH_SHA
202#define SSL_TXT_DES_192_EDE3_CBC_WITH_MD5 SSL2_TXT_DES_192_EDE3_CBC_WITH_MD5
203#define SSL_TXT_DES_192_EDE3_CBC_WITH_SHA SSL2_TXT_DES_192_EDE3_CBC_WITH_SHA
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
215#define SSL_MAX_SSL_SESSION_ID_LENGTH 32
216#define SSL_MAX_SID_CTX_LENGTH 32
217
218#define SSL_MIN_RSA_MODULUS_LENGTH_IN_BYTES (512/8)
219#define SSL_MAX_KEY_ARG_LENGTH 8
220#define SSL_MAX_MASTER_KEY_LENGTH 48
221
222/* These are used to specify which ciphers to use and not to use */
223#define SSL_TXT_LOW "LOW"
224#define SSL_TXT_MEDIUM "MEDIUM"
225#define SSL_TXT_HIGH "HIGH"
226#define SSL_TXT_kFZA "kFZA"
227#define SSL_TXT_aFZA "aFZA"
228#define SSL_TXT_eFZA "eFZA"
229#define SSL_TXT_FZA "FZA"
230
231#define SSL_TXT_aNULL "aNULL"
232#define SSL_TXT_eNULL "eNULL"
233#define SSL_TXT_NULL "NULL"
234
235#define SSL_TXT_kKRB5 "kKRB5"
236#define SSL_TXT_aKRB5 "aKRB5"
237#define SSL_TXT_KRB5 "KRB5"
238
239#define SSL_TXT_kRSA "kRSA"
240#define SSL_TXT_kDHr "kDHr"
241#define SSL_TXT_kDHd "kDHd"
242#define SSL_TXT_kEDH "kEDH"
243#define SSL_TXT_aRSA "aRSA"
244#define SSL_TXT_aDSS "aDSS"
245#define SSL_TXT_aDH "aDH"
246#define SSL_TXT_DSS "DSS"
247#define SSL_TXT_DH "DH"
248#define SSL_TXT_EDH "EDH"
249#define SSL_TXT_ADH "ADH"
250#define SSL_TXT_RSA "RSA"
251#define SSL_TXT_DES "DES"
252#define SSL_TXT_3DES "3DES"
253#define SSL_TXT_RC4 "RC4"
254#define SSL_TXT_RC2 "RC2"
255#define SSL_TXT_IDEA "IDEA"
256#define SSL_TXT_AES "AES"
257#define SSL_TXT_MD5 "MD5"
258#define SSL_TXT_SHA1 "SHA1"
259#define SSL_TXT_SHA "SHA"
260#define SSL_TXT_EXP "EXP"
261#define SSL_TXT_EXPORT "EXPORT"
262#define SSL_TXT_EXP40 "EXPORT40"
263#define SSL_TXT_EXP56 "EXPORT56"
264#define SSL_TXT_SSLV2 "SSLv2"
265#define SSL_TXT_SSLV3 "SSLv3"
266#define SSL_TXT_TLSV1 "TLSv1"
267#define SSL_TXT_ALL "ALL"
268
269/*
270 * COMPLEMENTOF* definitions. These identifiers are used to (de-select)
271 * ciphers normally not being used.
272 * Example: "RC4" will activate all ciphers using RC4 including ciphers
273 * without authentication, which would normally disabled by DEFAULT (due
274 * the "!ADH" being part of default). Therefore "RC4:!COMPLEMENTOFDEFAULT"
275 * will make sure that it is also disabled in the specific selection.
276 * COMPLEMENTOF* identifiers are portable between version, as adjustments
277 * to the default cipher setup will also be included here.
278 *
279 * COMPLEMENTOFDEFAULT does not experience the same special treatment that
280 * DEFAULT gets, as only selection is being done and no sorting as needed
281 * for DEFAULT.
282 */
283#define SSL_TXT_CMPALL "COMPLEMENTOFALL"
284#define SSL_TXT_CMPDEF "COMPLEMENTOFDEFAULT"
285
286/* The following cipher list is used by default.
287 * It also is substituted when an application-defined cipher list string
288 * starts with 'DEFAULT'. */
289#define SSL_DEFAULT_CIPHER_LIST "ALL:!ADH:+RC4:@STRENGTH" /* low priority for RC4 */
290
291/* Used in SSL_set_shutdown()/SSL_get_shutdown(); */
292#define SSL_SENT_SHUTDOWN 1
293#define SSL_RECEIVED_SHUTDOWN 2
294
295#ifdef __cplusplus
296}
297#endif
298
299#include <openssl/crypto.h>
300#include <openssl/lhash.h>
301#include <openssl/buffer.h>
302#include <openssl/bio.h>
303#include <openssl/pem.h>
304#include <openssl/x509.h>
305
306#ifdef __cplusplus
307extern "C" {
308#endif
309
310#if (defined(OPENSSL_NO_RSA) || defined(OPENSSL_NO_MD5)) && !defined(OPENSSL_NO_SSL2)
311#define OPENSSL_NO_SSL2
312#endif
313
314#define SSL_FILETYPE_ASN1 X509_FILETYPE_ASN1
315#define SSL_FILETYPE_PEM X509_FILETYPE_PEM
316
317/* This is needed to stop compilers complaining about the
318 * 'struct ssl_st *' function parameters used to prototype callbacks
319 * in SSL_CTX. */
320typedef struct ssl_st *ssl_crock_st;
321
322/* used to hold info on the particular ciphers used */
323typedef struct ssl_cipher_st
324 {
325 int valid;
326 const char *name; /* text name */
327 unsigned long id; /* id, 4 bytes, first is version */
328 unsigned long algorithms; /* what ciphers are used */
329 unsigned long algo_strength; /* strength and export flags */
330 unsigned long algorithm2; /* Extra flags */
331 int strength_bits; /* Number of bits really used */
332 int alg_bits; /* Number of bits for algorithm */
333 unsigned long mask; /* used for matching */
334 unsigned long mask_strength; /* also used for matching */
335 } SSL_CIPHER;
336
337DECLARE_STACK_OF(SSL_CIPHER)
338
339typedef struct ssl_st SSL;
340typedef struct ssl_ctx_st SSL_CTX;
341
342/* Used to hold functions for SSLv2 or SSLv3/TLSv1 functions */
343typedef struct ssl_method_st
344 {
345 int version;
346 int (*ssl_new)(SSL *s);
347 void (*ssl_clear)(SSL *s);
348 void (*ssl_free)(SSL *s);
349 int (*ssl_accept)(SSL *s);
350 int (*ssl_connect)(SSL *s);
351 int (*ssl_read)(SSL *s,void *buf,int len);
352 int (*ssl_peek)(SSL *s,void *buf,int len);
353 int (*ssl_write)(SSL *s,const void *buf,int len);
354 int (*ssl_shutdown)(SSL *s);
355 int (*ssl_renegotiate)(SSL *s);
356 int (*ssl_renegotiate_check)(SSL *s);
357 long (*ssl_ctrl)(SSL *s,int cmd,long larg,void *parg);
358 long (*ssl_ctx_ctrl)(SSL_CTX *ctx,int cmd,long larg,void *parg);
359 SSL_CIPHER *(*get_cipher_by_char)(const unsigned char *ptr);
360 int (*put_cipher_by_char)(const SSL_CIPHER *cipher,unsigned char *ptr);
361 int (*ssl_pending)(SSL *s);
362 int (*num_ciphers)(void);
363 SSL_CIPHER *(*get_cipher)(unsigned ncipher);
364 struct ssl_method_st *(*get_ssl_method)(int version);
365 long (*get_timeout)(void);
366 struct ssl3_enc_method *ssl3_enc; /* Extra SSLv3/TLS stuff */
367 int (*ssl_version)();
368 long (*ssl_callback_ctrl)(SSL *s, int cb_id, void (*fp)());
369 long (*ssl_ctx_callback_ctrl)(SSL_CTX *s, int cb_id, void (*fp)());
370 } SSL_METHOD;
371
372/* Lets make this into an ASN.1 type structure as follows
373 * SSL_SESSION_ID ::= SEQUENCE {
374 * version INTEGER, -- structure version number
375 * SSLversion INTEGER, -- SSL version number
376 * Cipher OCTET_STRING, -- the 3 byte cipher ID
377 * Session_ID OCTET_STRING, -- the Session ID
378 * Master_key OCTET_STRING, -- the master key
379 * KRB5_principal OCTET_STRING -- optional Kerberos principal
380 * Key_Arg [ 0 ] IMPLICIT OCTET_STRING, -- the optional Key argument
381 * Time [ 1 ] EXPLICIT INTEGER, -- optional Start Time
382 * Timeout [ 2 ] EXPLICIT INTEGER, -- optional Timeout ins seconds
383 * Peer [ 3 ] EXPLICIT X509, -- optional Peer Certificate
384 * Session_ID_context [ 4 ] EXPLICIT OCTET_STRING, -- the Session ID context
385 * Verify_result [ 5 ] EXPLICIT INTEGER -- X509_V_... code for `Peer'
386 * Compression [6] IMPLICIT ASN1_OBJECT -- compression OID XXXXX
387 * }
388 * Look in ssl/ssl_asn1.c for more details
389 * I'm using EXPLICIT tags so I can read the damn things using asn1parse :-).
390 */
391typedef struct ssl_session_st
392 {
393 int ssl_version; /* what ssl version session info is
394 * being kept in here? */
395
396 /* only really used in SSLv2 */
397 unsigned int key_arg_length;
398 unsigned char key_arg[SSL_MAX_KEY_ARG_LENGTH];
399 int master_key_length;
400 unsigned char master_key[SSL_MAX_MASTER_KEY_LENGTH];
401 /* session_id - valid? */
402 unsigned int session_id_length;
403 unsigned char session_id[SSL_MAX_SSL_SESSION_ID_LENGTH];
404 /* this is used to determine whether the session is being reused in
405 * the appropriate context. It is up to the application to set this,
406 * via SSL_new */
407 unsigned int sid_ctx_length;
408 unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH];
409
410#ifndef OPENSSL_NO_KRB5
411 unsigned int krb5_client_princ_len;
412 unsigned char krb5_client_princ[SSL_MAX_KRB5_PRINCIPAL_LENGTH];
413#endif /* OPENSSL_NO_KRB5 */
414
415 int not_resumable;
416
417 /* The cert is the certificate used to establish this connection */
418 struct sess_cert_st /* SESS_CERT */ *sess_cert;
419
420 /* This is the cert for the other end.
421 * On clients, it will be the same as sess_cert->peer_key->x509
422 * (the latter is not enough as sess_cert is not retained
423 * in the external representation of sessions, see ssl_asn1.c). */
424 X509 *peer;
425 /* when app_verify_callback accepts a session where the peer's certificate
426 * is not ok, we must remember the error for session reuse: */
427 long verify_result; /* only for servers */
428
429 int references;
430 long timeout;
431 long time;
432
433 int compress_meth; /* Need to lookup the method */
434
435 SSL_CIPHER *cipher;
436 unsigned long cipher_id; /* when ASN.1 loaded, this
437 * needs to be used to load
438 * the 'cipher' structure */
439
440 STACK_OF(SSL_CIPHER) *ciphers; /* shared ciphers? */
441
442 CRYPTO_EX_DATA ex_data; /* application specific data */
443
444 /* These are used to make removal of session-ids more
445 * efficient and to implement a maximum cache size. */
446 struct ssl_session_st *prev,*next;
447 } SSL_SESSION;
448
449
450#define SSL_OP_MICROSOFT_SESS_ID_BUG 0x00000001L
451#define SSL_OP_NETSCAPE_CHALLENGE_BUG 0x00000002L
452#define SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG 0x00000008L
453#define SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG 0x00000010L
454#define SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER 0x00000020L
455#define SSL_OP_MSIE_SSLV2_RSA_PADDING 0x00000040L
456#define SSL_OP_SSLEAY_080_CLIENT_DH_BUG 0x00000080L
457#define SSL_OP_TLS_D5_BUG 0x00000100L
458#define SSL_OP_TLS_BLOCK_PADDING_BUG 0x00000200L
459
460/* Disable SSL 3.0/TLS 1.0 CBC vulnerability workaround that was added
461 * in OpenSSL 0.9.6d. Usually (depending on the application protocol)
462 * the workaround is not needed. Unfortunately some broken SSL/TLS
463 * implementations cannot handle it at all, which is why we include
464 * it in SSL_OP_ALL. */
465#define SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS 0x00000800L /* added in 0.9.6e */
466
467/* SSL_OP_ALL: various bug workarounds that should be rather harmless.
468 * This used to be 0x000FFFFFL before 0.9.7. */
469#define SSL_OP_ALL 0x00000FFFL
470
471/* As server, disallow session resumption on renegotiation */
472#define SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION 0x00010000L
473/* If set, always create a new key when using tmp_dh parameters */
474#define SSL_OP_SINGLE_DH_USE 0x00100000L
475/* Set to always use the tmp_rsa key when doing RSA operations,
476 * even when this violates protocol specs */
477#define SSL_OP_EPHEMERAL_RSA 0x00200000L
478/* Set on servers to choose the cipher according to the server's
479 * preferences */
480#define SSL_OP_CIPHER_SERVER_PREFERENCE 0x00400000L
481/* If set, a server will allow a client to issue a SSLv3.0 version number
482 * as latest version supported in the premaster secret, even when TLSv1.0
483 * (version 3.1) was announced in the client hello. Normally this is
484 * forbidden to prevent version rollback attacks. */
485#define SSL_OP_TLS_ROLLBACK_BUG 0x00800000L
486
487#define SSL_OP_NO_SSLv2 0x01000000L
488#define SSL_OP_NO_SSLv3 0x02000000L
489#define SSL_OP_NO_TLSv1 0x04000000L
490
491/* The next flag deliberately changes the ciphertest, this is a check
492 * for the PKCS#1 attack */
493#define SSL_OP_PKCS1_CHECK_1 0x08000000L
494#define SSL_OP_PKCS1_CHECK_2 0x10000000L
495#define SSL_OP_NETSCAPE_CA_DN_BUG 0x20000000L
496#define SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG 0x40000000L
497
498
499/* Allow SSL_write(..., n) to return r with 0 < r < n (i.e. report success
500 * when just a single record has been written): */
501#define SSL_MODE_ENABLE_PARTIAL_WRITE 0x00000001L
502/* Make it possible to retry SSL_write() with changed buffer location
503 * (buffer contents must stay the same!); this is not the default to avoid
504 * the misconception that non-blocking SSL_write() behaves like
505 * non-blocking write(): */
506#define SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER 0x00000002L
507/* Never bother the application with retries if the transport
508 * is blocking: */
509#define SSL_MODE_AUTO_RETRY 0x00000004L
510
511
512/* Note: SSL[_CTX]_set_{options,mode} use |= op on the previous value,
513 * they cannot be used to clear bits. */
514
515#define SSL_CTX_set_options(ctx,op) \
516 SSL_CTX_ctrl((ctx),SSL_CTRL_OPTIONS,(op),NULL)
517#define SSL_CTX_get_options(ctx) \
518 SSL_CTX_ctrl((ctx),SSL_CTRL_OPTIONS,0,NULL)
519#define SSL_set_options(ssl,op) \
520 SSL_ctrl((ssl),SSL_CTRL_OPTIONS,(op),NULL)
521#define SSL_get_options(ssl) \
522 SSL_ctrl((ssl),SSL_CTRL_OPTIONS,0,NULL)
523
524#define SSL_CTX_set_mode(ctx,op) \
525 SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,(op),NULL)
526#define SSL_CTX_get_mode(ctx) \
527 SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,0,NULL)
528#define SSL_set_mode(ssl,op) \
529 SSL_ctrl((ssl),SSL_CTRL_MODE,(op),NULL)
530#define SSL_get_mode(ssl) \
531 SSL_ctrl((ssl),SSL_CTRL_MODE,0,NULL)
532
533
534void 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));
535void 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));
536#define SSL_CTX_set_msg_callback_arg(ctx, arg) SSL_CTX_ctrl((ctx), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg))
537#define SSL_set_msg_callback_arg(ssl, arg) SSL_ctrl((ssl), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg))
538
539
540
541#if defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN32)
542#define SSL_MAX_CERT_LIST_DEFAULT 1024*30 /* 30k max cert list :-) */
543#else
544#define SSL_MAX_CERT_LIST_DEFAULT 1024*100 /* 100k max cert list :-) */
545#endif
546
547#define SSL_SESSION_CACHE_MAX_SIZE_DEFAULT (1024*20)
548
549/* This callback type is used inside SSL_CTX, SSL, and in the functions that set
550 * them. It is used to override the generation of SSL/TLS session IDs in a
551 * server. Return value should be zero on an error, non-zero to proceed. Also,
552 * callbacks should themselves check if the id they generate is unique otherwise
553 * the SSL handshake will fail with an error - callbacks can do this using the
554 * 'ssl' value they're passed by;
555 * SSL_has_matching_session_id(ssl, id, *id_len)
556 * The length value passed in is set at the maximum size the session ID can be.
557 * In SSLv2 this is 16 bytes, whereas SSLv3/TLSv1 it is 32 bytes. The callback
558 * can alter this length to be less if desired, but under SSLv2 session IDs are
559 * supposed to be fixed at 16 bytes so the id will be padded after the callback
560 * returns in this case. It is also an error for the callback to set the size to
561 * zero. */
562typedef int (*GEN_SESSION_CB)(const SSL *ssl, unsigned char *id,
563 unsigned int *id_len);
564
565typedef struct ssl_comp_st
566 {
567 int id;
568 char *name;
569#ifndef OPENSSL_NO_COMP
570 COMP_METHOD *method;
571#else
572 char *method;
573#endif
574 } SSL_COMP;
575
576DECLARE_STACK_OF(SSL_COMP)
577
578struct ssl_ctx_st
579 {
580 SSL_METHOD *method;
581
582 STACK_OF(SSL_CIPHER) *cipher_list;
583 /* same as above but sorted for lookup */
584 STACK_OF(SSL_CIPHER) *cipher_list_by_id;
585
586 struct x509_store_st /* X509_STORE */ *cert_store;
587 struct lhash_st /* LHASH */ *sessions; /* a set of SSL_SESSIONs */
588 /* Most session-ids that will be cached, default is
589 * SSL_SESSION_CACHE_MAX_SIZE_DEFAULT. 0 is unlimited. */
590 unsigned long session_cache_size;
591 struct ssl_session_st *session_cache_head;
592 struct ssl_session_st *session_cache_tail;
593
594 /* This can have one of 2 values, ored together,
595 * SSL_SESS_CACHE_CLIENT,
596 * SSL_SESS_CACHE_SERVER,
597 * Default is SSL_SESSION_CACHE_SERVER, which means only
598 * SSL_accept which cache SSL_SESSIONS. */
599 int session_cache_mode;
600
601 /* If timeout is not 0, it is the default timeout value set
602 * when SSL_new() is called. This has been put in to make
603 * life easier to set things up */
604 long session_timeout;
605
606 /* If this callback is not null, it will be called each
607 * time a session id is added to the cache. If this function
608 * returns 1, it means that the callback will do a
609 * SSL_SESSION_free() when it has finished using it. Otherwise,
610 * on 0, it means the callback has finished with it.
611 * If remove_session_cb is not null, it will be called when
612 * a session-id is removed from the cache. After the call,
613 * OpenSSL will SSL_SESSION_free() it. */
614 int (*new_session_cb)(struct ssl_st *ssl,SSL_SESSION *sess);
615 void (*remove_session_cb)(struct ssl_ctx_st *ctx,SSL_SESSION *sess);
616 SSL_SESSION *(*get_session_cb)(struct ssl_st *ssl,
617 unsigned char *data,int len,int *copy);
618
619 struct
620 {
621 int sess_connect; /* SSL new conn - started */
622 int sess_connect_renegotiate;/* SSL reneg - requested */
623 int sess_connect_good; /* SSL new conne/reneg - finished */
624 int sess_accept; /* SSL new accept - started */
625 int sess_accept_renegotiate;/* SSL reneg - requested */
626 int sess_accept_good; /* SSL accept/reneg - finished */
627 int sess_miss; /* session lookup misses */
628 int sess_timeout; /* reuse attempt on timeouted session */
629 int sess_cache_full; /* session removed due to full cache */
630 int sess_hit; /* session reuse actually done */
631 int sess_cb_hit; /* session-id that was not
632 * in the cache was
633 * passed back via the callback. This
634 * indicates that the application is
635 * supplying session-id's from other
636 * processes - spooky :-) */
637 } stats;
638
639 int references;
640
641 /* if defined, these override the X509_verify_cert() calls */
642 int (*app_verify_callback)(X509_STORE_CTX *, void *);
643 void *app_verify_arg;
644 /* before OpenSSL 0.9.7, 'app_verify_arg' was ignored
645 * ('app_verify_callback' was called with just one argument) */
646
647 /* Default password callback. */
648 pem_password_cb *default_passwd_callback;
649
650 /* Default password callback user data. */
651 void *default_passwd_callback_userdata;
652
653 /* get client cert callback */
654 int (*client_cert_cb)(SSL *ssl, X509 **x509, EVP_PKEY **pkey);
655
656 CRYPTO_EX_DATA ex_data;
657
658 const EVP_MD *rsa_md5;/* For SSLv2 - name is 'ssl2-md5' */
659 const EVP_MD *md5; /* For SSLv3/TLSv1 'ssl3-md5' */
660 const EVP_MD *sha1; /* For SSLv3/TLSv1 'ssl3->sha1' */
661
662 STACK_OF(X509) *extra_certs;
663 STACK_OF(SSL_COMP) *comp_methods; /* stack of SSL_COMP, SSLv3/TLSv1 */
664
665
666 /* Default values used when no per-SSL value is defined follow */
667
668 void (*info_callback)(const SSL *ssl,int type,int val); /* used if SSL's info_callback is NULL */
669
670 /* what we put in client cert requests */
671 STACK_OF(X509_NAME) *client_CA;
672
673
674 /* Default values to use in SSL structures follow (these are copied by SSL_new) */
675
676 unsigned long options;
677 unsigned long mode;
678 long max_cert_list;
679
680 struct cert_st /* CERT */ *cert;
681 int read_ahead;
682
683 /* callback that allows applications to peek at protocol messages */
684 void (*msg_callback)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg);
685 void *msg_callback_arg;
686
687 int verify_mode;
688 int verify_depth;
689 unsigned int sid_ctx_length;
690 unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH];
691 int (*default_verify_callback)(int ok,X509_STORE_CTX *ctx); /* called 'verify_callback' in the SSL */
692
693 /* Default generate session ID callback. */
694 GEN_SESSION_CB generate_session_id;
695
696 int purpose; /* Purpose setting */
697 int trust; /* Trust setting */
698
699 int quiet_shutdown;
700 };
701
702#define SSL_SESS_CACHE_OFF 0x0000
703#define SSL_SESS_CACHE_CLIENT 0x0001
704#define SSL_SESS_CACHE_SERVER 0x0002
705#define SSL_SESS_CACHE_BOTH (SSL_SESS_CACHE_CLIENT|SSL_SESS_CACHE_SERVER)
706#define SSL_SESS_CACHE_NO_AUTO_CLEAR 0x0080
707/* This one, when set, makes the server session-id lookup not look
708 * in the cache. If there is an application get_session callback
709 * defined, this will still get called. */
710#define SSL_SESS_CACHE_NO_INTERNAL_LOOKUP 0x0100
711
712 struct lhash_st *SSL_CTX_sessions(SSL_CTX *ctx);
713#define SSL_CTX_sess_number(ctx) \
714 SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_NUMBER,0,NULL)
715#define SSL_CTX_sess_connect(ctx) \
716 SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT,0,NULL)
717#define SSL_CTX_sess_connect_good(ctx) \
718 SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_GOOD,0,NULL)
719#define SSL_CTX_sess_connect_renegotiate(ctx) \
720 SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_RENEGOTIATE,0,NULL)
721#define SSL_CTX_sess_accept(ctx) \
722 SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT,0,NULL)
723#define SSL_CTX_sess_accept_renegotiate(ctx) \
724 SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_RENEGOTIATE,0,NULL)
725#define SSL_CTX_sess_accept_good(ctx) \
726 SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_GOOD,0,NULL)
727#define SSL_CTX_sess_hits(ctx) \
728 SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_HIT,0,NULL)
729#define SSL_CTX_sess_cb_hits(ctx) \
730 SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CB_HIT,0,NULL)
731#define SSL_CTX_sess_misses(ctx) \
732 SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_MISSES,0,NULL)
733#define SSL_CTX_sess_timeouts(ctx) \
734 SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_TIMEOUTS,0,NULL)
735#define SSL_CTX_sess_cache_full(ctx) \
736 SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CACHE_FULL,0,NULL)
737
738#define SSL_CTX_sess_set_new_cb(ctx,cb) ((ctx)->new_session_cb=(cb))
739#define SSL_CTX_sess_get_new_cb(ctx) ((ctx)->new_session_cb)
740#define SSL_CTX_sess_set_remove_cb(ctx,cb) ((ctx)->remove_session_cb=(cb))
741#define SSL_CTX_sess_get_remove_cb(ctx) ((ctx)->remove_session_cb)
742#define SSL_CTX_sess_set_get_cb(ctx,cb) ((ctx)->get_session_cb=(cb))
743#define SSL_CTX_sess_get_get_cb(ctx) ((ctx)->get_session_cb)
744#define SSL_CTX_set_info_callback(ctx,cb) ((ctx)->info_callback=(cb))
745#define SSL_CTX_get_info_callback(ctx) ((ctx)->info_callback)
746#define SSL_CTX_set_client_cert_cb(ctx,cb) ((ctx)->client_cert_cb=(cb))
747#define SSL_CTX_get_client_cert_cb(ctx) ((ctx)->client_cert_cb)
748
749#define SSL_NOTHING 1
750#define SSL_WRITING 2
751#define SSL_READING 3
752#define SSL_X509_LOOKUP 4
753
754/* These will only be used when doing non-blocking IO */
755#define SSL_want_nothing(s) (SSL_want(s) == SSL_NOTHING)
756#define SSL_want_read(s) (SSL_want(s) == SSL_READING)
757#define SSL_want_write(s) (SSL_want(s) == SSL_WRITING)
758#define SSL_want_x509_lookup(s) (SSL_want(s) == SSL_X509_LOOKUP)
759
760struct ssl_st
761 {
762 /* protocol version
763 * (one of SSL2_VERSION, SSL3_VERSION, TLS1_VERSION)
764 */
765 int version;
766 int type; /* SSL_ST_CONNECT or SSL_ST_ACCEPT */
767
768 SSL_METHOD *method; /* SSLv3 */
769
770 /* There are 2 BIO's even though they are normally both the
771 * same. This is so data can be read and written to different
772 * handlers */
773
774#ifndef OPENSSL_NO_BIO
775 BIO *rbio; /* used by SSL_read */
776 BIO *wbio; /* used by SSL_write */
777 BIO *bbio; /* used during session-id reuse to concatenate
778 * messages */
779#else
780 char *rbio; /* used by SSL_read */
781 char *wbio; /* used by SSL_write */
782 char *bbio;
783#endif
784 /* This holds a variable that indicates what we were doing
785 * when a 0 or -1 is returned. This is needed for
786 * non-blocking IO so we know what request needs re-doing when
787 * in SSL_accept or SSL_connect */
788 int rwstate;
789
790 /* true when we are actually in SSL_accept() or SSL_connect() */
791 int in_handshake;
792 int (*handshake_func)();
793
794 /* Imagine that here's a boolean member "init" that is
795 * switched as soon as SSL_set_{accept/connect}_state
796 * is called for the first time, so that "state" and
797 * "handshake_func" are properly initialized. But as
798 * handshake_func is == 0 until then, we use this
799 * test instead of an "init" member.
800 */
801
802 int server; /* are we the server side? - mostly used by SSL_clear*/
803
804 int new_session;/* 1 if we are to use a new session.
805 * 2 if we are a server and are inside a handshake
806 * (i.e. not just sending a HelloRequest)
807 * NB: For servers, the 'new' session may actually be a previously
808 * cached session or even the previous session unless
809 * SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION is set */
810 int quiet_shutdown;/* don't send shutdown packets */
811 int shutdown; /* we have shut things down, 0x01 sent, 0x02
812 * for received */
813 int state; /* where we are */
814 int rstate; /* where we are when reading */
815
816 BUF_MEM *init_buf; /* buffer used during init */
817 void *init_msg; /* pointer to handshake message body, set by ssl3_get_message() */
818 int init_num; /* amount read/written */
819 int init_off; /* amount read/written */
820
821 /* used internally to point at a raw packet */
822 unsigned char *packet;
823 unsigned int packet_length;
824
825 struct ssl2_state_st *s2; /* SSLv2 variables */
826 struct ssl3_state_st *s3; /* SSLv3 variables */
827
828 int read_ahead; /* Read as many input bytes as possible
829 * (for non-blocking reads) */
830
831 /* callback that allows applications to peek at protocol messages */
832 void (*msg_callback)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg);
833 void *msg_callback_arg;
834
835 int hit; /* reusing a previous session */
836
837 int purpose; /* Purpose setting */
838 int trust; /* Trust setting */
839
840 /* crypto */
841 STACK_OF(SSL_CIPHER) *cipher_list;
842 STACK_OF(SSL_CIPHER) *cipher_list_by_id;
843
844 /* These are the ones being used, the ones in SSL_SESSION are
845 * the ones to be 'copied' into these ones */
846
847 EVP_CIPHER_CTX *enc_read_ctx; /* cryptographic state */
848 const EVP_MD *read_hash; /* used for mac generation */
849#ifndef OPENSSL_NO_COMP
850 COMP_CTX *expand; /* uncompress */
851#else
852 char *expand;
853#endif
854
855 EVP_CIPHER_CTX *enc_write_ctx; /* cryptographic state */
856 const EVP_MD *write_hash; /* used for mac generation */
857#ifndef OPENSSL_NO_COMP
858 COMP_CTX *compress; /* compression */
859#else
860 char *compress;
861#endif
862
863 /* session info */
864
865 /* client cert? */
866 /* This is used to hold the server certificate used */
867 struct cert_st /* CERT */ *cert;
868
869 /* the session_id_context is used to ensure sessions are only reused
870 * in the appropriate context */
871 unsigned int sid_ctx_length;
872 unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH];
873
874 /* This can also be in the session once a session is established */
875 SSL_SESSION *session;
876
877 /* Default generate session ID callback. */
878 GEN_SESSION_CB generate_session_id;
879
880 /* Used in SSL2 and SSL3 */
881 int verify_mode; /* 0 don't care about verify failure.
882 * 1 fail if verify fails */
883 int verify_depth;
884 int (*verify_callback)(int ok,X509_STORE_CTX *ctx); /* fail if callback returns 0 */
885
886 void (*info_callback)(const SSL *ssl,int type,int val); /* optional informational callback */
887
888 int error; /* error bytes to be written */
889 int error_code; /* actual code */
890
891#ifndef OPENSSL_NO_KRB5
892 KSSL_CTX *kssl_ctx; /* Kerberos 5 context */
893#endif /* OPENSSL_NO_KRB5 */
894
895 SSL_CTX *ctx;
896 /* set this flag to 1 and a sleep(1) is put into all SSL_read()
897 * and SSL_write() calls, good for nbio debuging :-) */
898 int debug;
899
900 /* extra application data */
901 long verify_result;
902 CRYPTO_EX_DATA ex_data;
903
904 /* for server side, keep the list of CA_dn we can use */
905 STACK_OF(X509_NAME) *client_CA;
906
907 int references;
908 unsigned long options; /* protocol behaviour */
909 unsigned long mode; /* API behaviour */
910 long max_cert_list;
911 int first_packet;
912 int client_version; /* what was passed, used for
913 * SSLv3/TLS rollback check */
914 };
915
916#ifdef __cplusplus
917}
918#endif
919
920#include <openssl/ssl2.h>
921#include <openssl/ssl3.h>
922#include <openssl/tls1.h> /* This is mostly sslv3 with a few tweaks */
923#include <openssl/ssl23.h>
924
925#ifdef __cplusplus
926extern "C" {
927#endif
928
929/* compatibility */
930#define SSL_set_app_data(s,arg) (SSL_set_ex_data(s,0,(char *)arg))
931#define SSL_get_app_data(s) (SSL_get_ex_data(s,0))
932#define SSL_SESSION_set_app_data(s,a) (SSL_SESSION_set_ex_data(s,0,(char *)a))
933#define SSL_SESSION_get_app_data(s) (SSL_SESSION_get_ex_data(s,0))
934#define SSL_CTX_get_app_data(ctx) (SSL_CTX_get_ex_data(ctx,0))
935#define SSL_CTX_set_app_data(ctx,arg) (SSL_CTX_set_ex_data(ctx,0,(char *)arg))
936
937/* The following are the possible values for ssl->state are are
938 * used to indicate where we are up to in the SSL connection establishment.
939 * The macros that follow are about the only things you should need to use
940 * and even then, only when using non-blocking IO.
941 * It can also be useful to work out where you were when the connection
942 * failed */
943
944#define SSL_ST_CONNECT 0x1000
945#define SSL_ST_ACCEPT 0x2000
946#define SSL_ST_MASK 0x0FFF
947#define SSL_ST_INIT (SSL_ST_CONNECT|SSL_ST_ACCEPT)
948#define SSL_ST_BEFORE 0x4000
949#define SSL_ST_OK 0x03
950#define SSL_ST_RENEGOTIATE (0x04|SSL_ST_INIT)
951
952#define SSL_CB_LOOP 0x01
953#define SSL_CB_EXIT 0x02
954#define SSL_CB_READ 0x04
955#define SSL_CB_WRITE 0x08
956#define SSL_CB_ALERT 0x4000 /* used in callback */
957#define SSL_CB_READ_ALERT (SSL_CB_ALERT|SSL_CB_READ)
958#define SSL_CB_WRITE_ALERT (SSL_CB_ALERT|SSL_CB_WRITE)
959#define SSL_CB_ACCEPT_LOOP (SSL_ST_ACCEPT|SSL_CB_LOOP)
960#define SSL_CB_ACCEPT_EXIT (SSL_ST_ACCEPT|SSL_CB_EXIT)
961#define SSL_CB_CONNECT_LOOP (SSL_ST_CONNECT|SSL_CB_LOOP)
962#define SSL_CB_CONNECT_EXIT (SSL_ST_CONNECT|SSL_CB_EXIT)
963#define SSL_CB_HANDSHAKE_START 0x10
964#define SSL_CB_HANDSHAKE_DONE 0x20
965
966/* Is the SSL_connection established? */
967#define SSL_get_state(a) SSL_state(a)
968#define SSL_is_init_finished(a) (SSL_state(a) == SSL_ST_OK)
969#define SSL_in_init(a) (SSL_state(a)&SSL_ST_INIT)
970#define SSL_in_before(a) (SSL_state(a)&SSL_ST_BEFORE)
971#define SSL_in_connect_init(a) (SSL_state(a)&SSL_ST_CONNECT)
972#define SSL_in_accept_init(a) (SSL_state(a)&SSL_ST_ACCEPT)
973
974/* The following 2 states are kept in ssl->rstate when reads fail,
975 * you should not need these */
976#define SSL_ST_READ_HEADER 0xF0
977#define SSL_ST_READ_BODY 0xF1
978#define SSL_ST_READ_DONE 0xF2
979
980/* Obtain latest Finished message
981 * -- that we sent (SSL_get_finished)
982 * -- that we expected from peer (SSL_get_peer_finished).
983 * Returns length (0 == no Finished so far), copies up to 'count' bytes. */
984size_t SSL_get_finished(SSL *s, void *buf, size_t count);
985size_t SSL_get_peer_finished(SSL *s, void *buf, size_t count);
986
987/* use either SSL_VERIFY_NONE or SSL_VERIFY_PEER, the last 2 options
988 * are 'ored' with SSL_VERIFY_PEER if they are desired */
989#define SSL_VERIFY_NONE 0x00
990#define SSL_VERIFY_PEER 0x01
991#define SSL_VERIFY_FAIL_IF_NO_PEER_CERT 0x02
992#define SSL_VERIFY_CLIENT_ONCE 0x04
993
994#define OpenSSL_add_ssl_algorithms() SSL_library_init()
995#define SSLeay_add_ssl_algorithms() SSL_library_init()
996
997/* this is for backward compatibility */
998#if 0 /* NEW_SSLEAY */
999#define SSL_CTX_set_default_verify(a,b,c) SSL_CTX_set_verify(a,b,c)
1000#define SSL_set_pref_cipher(c,n) SSL_set_cipher_list(c,n)
1001#define SSL_add_session(a,b) SSL_CTX_add_session((a),(b))
1002#define SSL_remove_session(a,b) SSL_CTX_remove_session((a),(b))
1003#define SSL_flush_sessions(a,b) SSL_CTX_flush_sessions((a),(b))
1004#endif
1005/* More backward compatibility */
1006#define SSL_get_cipher(s) \
1007 SSL_CIPHER_get_name(SSL_get_current_cipher(s))
1008#define SSL_get_cipher_bits(s,np) \
1009 SSL_CIPHER_get_bits(SSL_get_current_cipher(s),np)
1010#define SSL_get_cipher_version(s) \
1011 SSL_CIPHER_get_version(SSL_get_current_cipher(s))
1012#define SSL_get_cipher_name(s) \
1013 SSL_CIPHER_get_name(SSL_get_current_cipher(s))
1014#define SSL_get_time(a) SSL_SESSION_get_time(a)
1015#define SSL_set_time(a,b) SSL_SESSION_set_time((a),(b))
1016#define SSL_get_timeout(a) SSL_SESSION_get_timeout(a)
1017#define SSL_set_timeout(a,b) SSL_SESSION_set_timeout((a),(b))
1018
1019#if 1 /*SSLEAY_MACROS*/
1020#define d2i_SSL_SESSION_bio(bp,s_id) (SSL_SESSION *)ASN1_d2i_bio( \
1021 (char *(*)())SSL_SESSION_new,(char *(*)())d2i_SSL_SESSION, \
1022 (bp),(unsigned char **)(s_id))
1023#define i2d_SSL_SESSION_bio(bp,s_id) ASN1_i2d_bio(i2d_SSL_SESSION, \
1024 bp,(unsigned char *)s_id)
1025#define PEM_read_SSL_SESSION(fp,x,cb,u) (SSL_SESSION *)PEM_ASN1_read( \
1026 (char *(*)())d2i_SSL_SESSION,PEM_STRING_SSL_SESSION,fp,(char **)x,cb,u)
1027#define PEM_read_bio_SSL_SESSION(bp,x,cb,u) (SSL_SESSION *)PEM_ASN1_read_bio( \
1028 (char *(*)())d2i_SSL_SESSION,PEM_STRING_SSL_SESSION,bp,(char **)x,cb,u)
1029#define PEM_write_SSL_SESSION(fp,x) \
1030 PEM_ASN1_write((int (*)())i2d_SSL_SESSION, \
1031 PEM_STRING_SSL_SESSION,fp, (char *)x, NULL,NULL,0,NULL,NULL)
1032#define PEM_write_bio_SSL_SESSION(bp,x) \
1033 PEM_ASN1_write_bio((int (*)())i2d_SSL_SESSION, \
1034 PEM_STRING_SSL_SESSION,bp, (char *)x, NULL,NULL,0,NULL,NULL)
1035#endif
1036
1037#define SSL_AD_REASON_OFFSET 1000
1038/* These alert types are for SSLv3 and TLSv1 */
1039#define SSL_AD_CLOSE_NOTIFY SSL3_AD_CLOSE_NOTIFY
1040#define SSL_AD_UNEXPECTED_MESSAGE SSL3_AD_UNEXPECTED_MESSAGE /* fatal */
1041#define SSL_AD_BAD_RECORD_MAC SSL3_AD_BAD_RECORD_MAC /* fatal */
1042#define SSL_AD_DECRYPTION_FAILED TLS1_AD_DECRYPTION_FAILED
1043#define SSL_AD_RECORD_OVERFLOW TLS1_AD_RECORD_OVERFLOW
1044#define SSL_AD_DECOMPRESSION_FAILURE SSL3_AD_DECOMPRESSION_FAILURE/* fatal */
1045#define SSL_AD_HANDSHAKE_FAILURE SSL3_AD_HANDSHAKE_FAILURE/* fatal */
1046#define SSL_AD_NO_CERTIFICATE SSL3_AD_NO_CERTIFICATE /* Not for TLS */
1047#define SSL_AD_BAD_CERTIFICATE SSL3_AD_BAD_CERTIFICATE
1048#define SSL_AD_UNSUPPORTED_CERTIFICATE SSL3_AD_UNSUPPORTED_CERTIFICATE
1049#define SSL_AD_CERTIFICATE_REVOKED SSL3_AD_CERTIFICATE_REVOKED
1050#define SSL_AD_CERTIFICATE_EXPIRED SSL3_AD_CERTIFICATE_EXPIRED
1051#define SSL_AD_CERTIFICATE_UNKNOWN SSL3_AD_CERTIFICATE_UNKNOWN
1052#define SSL_AD_ILLEGAL_PARAMETER SSL3_AD_ILLEGAL_PARAMETER /* fatal */
1053#define SSL_AD_UNKNOWN_CA TLS1_AD_UNKNOWN_CA /* fatal */
1054#define SSL_AD_ACCESS_DENIED TLS1_AD_ACCESS_DENIED /* fatal */
1055#define SSL_AD_DECODE_ERROR TLS1_AD_DECODE_ERROR /* fatal */
1056#define SSL_AD_DECRYPT_ERROR TLS1_AD_DECRYPT_ERROR
1057#define SSL_AD_EXPORT_RESTRICTION TLS1_AD_EXPORT_RESTRICTION/* fatal */
1058#define SSL_AD_PROTOCOL_VERSION TLS1_AD_PROTOCOL_VERSION /* fatal */
1059#define SSL_AD_INSUFFICIENT_SECURITY TLS1_AD_INSUFFICIENT_SECURITY/* fatal */
1060#define SSL_AD_INTERNAL_ERROR TLS1_AD_INTERNAL_ERROR /* fatal */
1061#define SSL_AD_USER_CANCELLED TLS1_AD_USER_CANCELLED
1062#define SSL_AD_NO_RENEGOTIATION TLS1_AD_NO_RENEGOTIATION
1063
1064#define SSL_ERROR_NONE 0
1065#define SSL_ERROR_SSL 1
1066#define SSL_ERROR_WANT_READ 2
1067#define SSL_ERROR_WANT_WRITE 3
1068#define SSL_ERROR_WANT_X509_LOOKUP 4
1069#define SSL_ERROR_SYSCALL 5 /* look at error stack/return value/errno */
1070#define SSL_ERROR_ZERO_RETURN 6
1071#define SSL_ERROR_WANT_CONNECT 7
1072#define SSL_ERROR_WANT_ACCEPT 8
1073
1074#define SSL_CTRL_NEED_TMP_RSA 1
1075#define SSL_CTRL_SET_TMP_RSA 2
1076#define SSL_CTRL_SET_TMP_DH 3
1077#define SSL_CTRL_SET_TMP_RSA_CB 4
1078#define SSL_CTRL_SET_TMP_DH_CB 5
1079
1080#define SSL_CTRL_GET_SESSION_REUSED 6
1081#define SSL_CTRL_GET_CLIENT_CERT_REQUEST 7
1082#define SSL_CTRL_GET_NUM_RENEGOTIATIONS 8
1083#define SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS 9
1084#define SSL_CTRL_GET_TOTAL_RENEGOTIATIONS 10
1085#define SSL_CTRL_GET_FLAGS 11
1086#define SSL_CTRL_EXTRA_CHAIN_CERT 12
1087
1088#define SSL_CTRL_SET_MSG_CALLBACK 13
1089#define SSL_CTRL_SET_MSG_CALLBACK_ARG 14
1090
1091/* Stats */
1092#define SSL_CTRL_SESS_NUMBER 20
1093#define SSL_CTRL_SESS_CONNECT 21
1094#define SSL_CTRL_SESS_CONNECT_GOOD 22
1095#define SSL_CTRL_SESS_CONNECT_RENEGOTIATE 23
1096#define SSL_CTRL_SESS_ACCEPT 24
1097#define SSL_CTRL_SESS_ACCEPT_GOOD 25
1098#define SSL_CTRL_SESS_ACCEPT_RENEGOTIATE 26
1099#define SSL_CTRL_SESS_HIT 27
1100#define SSL_CTRL_SESS_CB_HIT 28
1101#define SSL_CTRL_SESS_MISSES 29
1102#define SSL_CTRL_SESS_TIMEOUTS 30
1103#define SSL_CTRL_SESS_CACHE_FULL 31
1104#define SSL_CTRL_OPTIONS 32
1105#define SSL_CTRL_MODE 33
1106
1107#define SSL_CTRL_GET_READ_AHEAD 40
1108#define SSL_CTRL_SET_READ_AHEAD 41
1109#define SSL_CTRL_SET_SESS_CACHE_SIZE 42
1110#define SSL_CTRL_GET_SESS_CACHE_SIZE 43
1111#define SSL_CTRL_SET_SESS_CACHE_MODE 44
1112#define SSL_CTRL_GET_SESS_CACHE_MODE 45
1113
1114#define SSL_CTRL_GET_MAX_CERT_LIST 50
1115#define SSL_CTRL_SET_MAX_CERT_LIST 51
1116
1117#define SSL_session_reused(ssl) \
1118 SSL_ctrl((ssl),SSL_CTRL_GET_SESSION_REUSED,0,NULL)
1119#define SSL_num_renegotiations(ssl) \
1120 SSL_ctrl((ssl),SSL_CTRL_GET_NUM_RENEGOTIATIONS,0,NULL)
1121#define SSL_clear_num_renegotiations(ssl) \
1122 SSL_ctrl((ssl),SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS,0,NULL)
1123#define SSL_total_renegotiations(ssl) \
1124 SSL_ctrl((ssl),SSL_CTRL_GET_TOTAL_RENEGOTIATIONS,0,NULL)
1125
1126#define SSL_CTX_need_tmp_RSA(ctx) \
1127 SSL_CTX_ctrl(ctx,SSL_CTRL_NEED_TMP_RSA,0,NULL)
1128#define SSL_CTX_set_tmp_rsa(ctx,rsa) \
1129 SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_RSA,0,(char *)rsa)
1130#define SSL_CTX_set_tmp_dh(ctx,dh) \
1131 SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH,0,(char *)dh)
1132
1133#define SSL_need_tmp_RSA(ssl) \
1134 SSL_ctrl(ssl,SSL_CTRL_NEED_TMP_RSA,0,NULL)
1135#define SSL_set_tmp_rsa(ssl,rsa) \
1136 SSL_ctrl(ssl,SSL_CTRL_SET_TMP_RSA,0,(char *)rsa)
1137#define SSL_set_tmp_dh(ssl,dh) \
1138 SSL_ctrl(ssl,SSL_CTRL_SET_TMP_DH,0,(char *)dh)
1139
1140#define SSL_CTX_add_extra_chain_cert(ctx,x509) \
1141 SSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,(char *)x509)
1142
1143#ifndef OPENSSL_NO_BIO
1144BIO_METHOD *BIO_f_ssl(void);
1145BIO *BIO_new_ssl(SSL_CTX *ctx,int client);
1146BIO *BIO_new_ssl_connect(SSL_CTX *ctx);
1147BIO *BIO_new_buffer_ssl_connect(SSL_CTX *ctx);
1148int BIO_ssl_copy_session_id(BIO *to,BIO *from);
1149void BIO_ssl_shutdown(BIO *ssl_bio);
1150
1151#endif
1152
1153int SSL_CTX_set_cipher_list(SSL_CTX *,const char *str);
1154SSL_CTX *SSL_CTX_new(SSL_METHOD *meth);
1155void SSL_CTX_free(SSL_CTX *);
1156long SSL_CTX_set_timeout(SSL_CTX *ctx,long t);
1157long SSL_CTX_get_timeout(SSL_CTX *ctx);
1158X509_STORE *SSL_CTX_get_cert_store(SSL_CTX *);
1159void SSL_CTX_set_cert_store(SSL_CTX *,X509_STORE *);
1160int SSL_want(SSL *s);
1161int SSL_clear(SSL *s);
1162
1163void SSL_CTX_flush_sessions(SSL_CTX *ctx,long tm);
1164
1165SSL_CIPHER *SSL_get_current_cipher(SSL *s);
1166int SSL_CIPHER_get_bits(SSL_CIPHER *c,int *alg_bits);
1167char * SSL_CIPHER_get_version(SSL_CIPHER *c);
1168const char * SSL_CIPHER_get_name(SSL_CIPHER *c);
1169
1170int SSL_get_fd(SSL *s);
1171int SSL_get_rfd(SSL *s);
1172int SSL_get_wfd(SSL *s);
1173const char * SSL_get_cipher_list(SSL *s,int n);
1174char * SSL_get_shared_ciphers(SSL *s, char *buf, int len);
1175int SSL_get_read_ahead(SSL * s);
1176int SSL_pending(SSL *s);
1177#ifndef OPENSSL_NO_SOCK
1178int SSL_set_fd(SSL *s, int fd);
1179int SSL_set_rfd(SSL *s, int fd);
1180int SSL_set_wfd(SSL *s, int fd);
1181#endif
1182#ifndef OPENSSL_NO_BIO
1183void SSL_set_bio(SSL *s, BIO *rbio,BIO *wbio);
1184BIO * SSL_get_rbio(SSL *s);
1185BIO * SSL_get_wbio(SSL *s);
1186#endif
1187int SSL_set_cipher_list(SSL *s, const char *str);
1188void SSL_set_read_ahead(SSL *s, int yes);
1189int SSL_get_verify_mode(SSL *s);
1190int SSL_get_verify_depth(SSL *s);
1191int (*SSL_get_verify_callback(SSL *s))(int,X509_STORE_CTX *);
1192void SSL_set_verify(SSL *s, int mode,
1193 int (*callback)(int ok,X509_STORE_CTX *ctx));
1194void SSL_set_verify_depth(SSL *s, int depth);
1195#ifndef OPENSSL_NO_RSA
1196int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa);
1197#endif
1198int SSL_use_RSAPrivateKey_ASN1(SSL *ssl, unsigned char *d, long len);
1199int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey);
1200int SSL_use_PrivateKey_ASN1(int pk,SSL *ssl, unsigned char *d, long len);
1201int SSL_use_certificate(SSL *ssl, X509 *x);
1202int SSL_use_certificate_ASN1(SSL *ssl, unsigned char *d, int len);
1203
1204#ifndef OPENSSL_NO_STDIO
1205int SSL_use_RSAPrivateKey_file(SSL *ssl, const char *file, int type);
1206int SSL_use_PrivateKey_file(SSL *ssl, const char *file, int type);
1207int SSL_use_certificate_file(SSL *ssl, const char *file, int type);
1208int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, const char *file, int type);
1209int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type);
1210int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type);
1211int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file); /* PEM type */
1212STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file);
1213int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs,
1214 const char *file);
1215#ifndef OPENSSL_SYS_WIN32
1216#ifndef OPENSSL_SYS_VMS
1217#ifndef OPENSSL_SYS_MACINTOSH_CLASSIC /* XXXXX: Better scheme needed! [was: #ifndef MAC_OS_pre_X] */
1218int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs,
1219 const char *dir);
1220#endif
1221#endif
1222#endif
1223
1224#endif
1225
1226void SSL_load_error_strings(void );
1227const char *SSL_state_string(const SSL *s);
1228const char *SSL_rstate_string(const SSL *s);
1229const char *SSL_state_string_long(const SSL *s);
1230const char *SSL_rstate_string_long(const SSL *s);
1231long SSL_SESSION_get_time(SSL_SESSION *s);
1232long SSL_SESSION_set_time(SSL_SESSION *s, long t);
1233long SSL_SESSION_get_timeout(SSL_SESSION *s);
1234long SSL_SESSION_set_timeout(SSL_SESSION *s, long t);
1235void SSL_copy_session_id(SSL *to,SSL *from);
1236
1237SSL_SESSION *SSL_SESSION_new(void);
1238unsigned long SSL_SESSION_hash(SSL_SESSION *a);
1239int SSL_SESSION_cmp(SSL_SESSION *a,SSL_SESSION *b);
1240#ifndef OPENSSL_NO_FP_API
1241int SSL_SESSION_print_fp(FILE *fp,SSL_SESSION *ses);
1242#endif
1243#ifndef OPENSSL_NO_BIO
1244int SSL_SESSION_print(BIO *fp,SSL_SESSION *ses);
1245#endif
1246void SSL_SESSION_free(SSL_SESSION *ses);
1247int i2d_SSL_SESSION(SSL_SESSION *in,unsigned char **pp);
1248int SSL_set_session(SSL *to, SSL_SESSION *session);
1249int SSL_CTX_add_session(SSL_CTX *s, SSL_SESSION *c);
1250int SSL_CTX_remove_session(SSL_CTX *,SSL_SESSION *c);
1251int SSL_CTX_set_generate_session_id(SSL_CTX *, GEN_SESSION_CB);
1252int SSL_set_generate_session_id(SSL *, GEN_SESSION_CB);
1253int SSL_has_matching_session_id(const SSL *ssl, const unsigned char *id,
1254 unsigned int id_len);
1255SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a,unsigned char **pp,long length);
1256
1257#ifdef HEADER_X509_H
1258X509 * SSL_get_peer_certificate(SSL *s);
1259#endif
1260
1261STACK_OF(X509) *SSL_get_peer_cert_chain(SSL *s);
1262
1263int SSL_CTX_get_verify_mode(SSL_CTX *ctx);
1264int SSL_CTX_get_verify_depth(SSL_CTX *ctx);
1265int (*SSL_CTX_get_verify_callback(SSL_CTX *ctx))(int,X509_STORE_CTX *);
1266void SSL_CTX_set_verify(SSL_CTX *ctx,int mode,
1267 int (*callback)(int, X509_STORE_CTX *));
1268void SSL_CTX_set_verify_depth(SSL_CTX *ctx,int depth);
1269void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, int (*cb)(X509_STORE_CTX *,void *), void *arg);
1270#ifndef OPENSSL_NO_RSA
1271int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa);
1272#endif
1273int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, unsigned char *d, long len);
1274int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey);
1275int SSL_CTX_use_PrivateKey_ASN1(int pk,SSL_CTX *ctx,
1276 unsigned char *d, long len);
1277int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x);
1278int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len, unsigned char *d);
1279
1280void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb);
1281void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u);
1282
1283int SSL_CTX_check_private_key(SSL_CTX *ctx);
1284int SSL_check_private_key(SSL *ctx);
1285
1286int SSL_CTX_set_session_id_context(SSL_CTX *ctx,const unsigned char *sid_ctx,
1287 unsigned int sid_ctx_len);
1288
1289SSL * SSL_new(SSL_CTX *ctx);
1290int SSL_set_session_id_context(SSL *ssl,const unsigned char *sid_ctx,
1291 unsigned int sid_ctx_len);
1292
1293int SSL_CTX_set_purpose(SSL_CTX *s, int purpose);
1294int SSL_set_purpose(SSL *s, int purpose);
1295int SSL_CTX_set_trust(SSL_CTX *s, int trust);
1296int SSL_set_trust(SSL *s, int trust);
1297
1298void SSL_free(SSL *ssl);
1299int SSL_accept(SSL *ssl);
1300int SSL_connect(SSL *ssl);
1301int SSL_read(SSL *ssl,void *buf,int num);
1302int SSL_peek(SSL *ssl,void *buf,int num);
1303int SSL_write(SSL *ssl,const void *buf,int num);
1304long SSL_ctrl(SSL *ssl,int cmd, long larg, void *parg);
1305long SSL_callback_ctrl(SSL *, int, void (*)());
1306long SSL_CTX_ctrl(SSL_CTX *ctx,int cmd, long larg, void *parg);
1307long SSL_CTX_callback_ctrl(SSL_CTX *, int, void (*)());
1308
1309int SSL_get_error(SSL *s,int ret_code);
1310const char *SSL_get_version(SSL *s);
1311
1312/* This sets the 'default' SSL version that SSL_new() will create */
1313int SSL_CTX_set_ssl_version(SSL_CTX *ctx,SSL_METHOD *meth);
1314
1315SSL_METHOD *SSLv2_method(void); /* SSLv2 */
1316SSL_METHOD *SSLv2_server_method(void); /* SSLv2 */
1317SSL_METHOD *SSLv2_client_method(void); /* SSLv2 */
1318
1319SSL_METHOD *SSLv3_method(void); /* SSLv3 */
1320SSL_METHOD *SSLv3_server_method(void); /* SSLv3 */
1321SSL_METHOD *SSLv3_client_method(void); /* SSLv3 */
1322
1323SSL_METHOD *SSLv23_method(void); /* SSLv3 but can rollback to v2 */
1324SSL_METHOD *SSLv23_server_method(void); /* SSLv3 but can rollback to v2 */
1325SSL_METHOD *SSLv23_client_method(void); /* SSLv3 but can rollback to v2 */
1326
1327SSL_METHOD *TLSv1_method(void); /* TLSv1.0 */
1328SSL_METHOD *TLSv1_server_method(void); /* TLSv1.0 */
1329SSL_METHOD *TLSv1_client_method(void); /* TLSv1.0 */
1330
1331STACK_OF(SSL_CIPHER) *SSL_get_ciphers(SSL *s);
1332
1333int SSL_do_handshake(SSL *s);
1334int SSL_renegotiate(SSL *s);
1335int SSL_renegotiate_pending(SSL *s);
1336int SSL_shutdown(SSL *s);
1337
1338SSL_METHOD *SSL_get_ssl_method(SSL *s);
1339int SSL_set_ssl_method(SSL *s,SSL_METHOD *method);
1340const char *SSL_alert_type_string_long(int value);
1341const char *SSL_alert_type_string(int value);
1342const char *SSL_alert_desc_string_long(int value);
1343const char *SSL_alert_desc_string(int value);
1344
1345void SSL_set_client_CA_list(SSL *s, STACK_OF(X509_NAME) *list);
1346void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *list);
1347STACK_OF(X509_NAME) *SSL_get_client_CA_list(SSL *s);
1348STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(SSL_CTX *s);
1349int SSL_add_client_CA(SSL *ssl,X509 *x);
1350int SSL_CTX_add_client_CA(SSL_CTX *ctx,X509 *x);
1351
1352void SSL_set_connect_state(SSL *s);
1353void SSL_set_accept_state(SSL *s);
1354
1355long SSL_get_default_timeout(SSL *s);
1356
1357int SSL_library_init(void );
1358
1359char *SSL_CIPHER_description(SSL_CIPHER *,char *buf,int size);
1360STACK_OF(X509_NAME) *SSL_dup_CA_list(STACK_OF(X509_NAME) *sk);
1361
1362SSL *SSL_dup(SSL *ssl);
1363
1364X509 *SSL_get_certificate(SSL *ssl);
1365/* EVP_PKEY */ struct evp_pkey_st *SSL_get_privatekey(SSL *ssl);
1366
1367void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx,int mode);
1368int SSL_CTX_get_quiet_shutdown(SSL_CTX *ctx);
1369void SSL_set_quiet_shutdown(SSL *ssl,int mode);
1370int SSL_get_quiet_shutdown(SSL *ssl);
1371void SSL_set_shutdown(SSL *ssl,int mode);
1372int SSL_get_shutdown(SSL *ssl);
1373int SSL_version(SSL *ssl);
1374int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx);
1375int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile,
1376 const char *CApath);
1377#define SSL_get0_session SSL_get_session /* just peek at pointer */
1378SSL_SESSION *SSL_get_session(SSL *ssl);
1379SSL_SESSION *SSL_get1_session(SSL *ssl); /* obtain a reference count */
1380SSL_CTX *SSL_get_SSL_CTX(SSL *ssl);
1381void SSL_set_info_callback(SSL *ssl,
1382 void (*cb)(const SSL *ssl,int type,int val));
1383void (*SSL_get_info_callback(SSL *ssl))(const SSL *ssl,int type,int val);
1384int SSL_state(SSL *ssl);
1385
1386void SSL_set_verify_result(SSL *ssl,long v);
1387long SSL_get_verify_result(SSL *ssl);
1388
1389int SSL_set_ex_data(SSL *ssl,int idx,void *data);
1390void *SSL_get_ex_data(SSL *ssl,int idx);
1391int SSL_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
1392 CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
1393
1394int SSL_SESSION_set_ex_data(SSL_SESSION *ss,int idx,void *data);
1395void *SSL_SESSION_get_ex_data(SSL_SESSION *ss,int idx);
1396int SSL_SESSION_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
1397 CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
1398
1399int SSL_CTX_set_ex_data(SSL_CTX *ssl,int idx,void *data);
1400void *SSL_CTX_get_ex_data(SSL_CTX *ssl,int idx);
1401int SSL_CTX_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
1402 CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
1403
1404int SSL_get_ex_data_X509_STORE_CTX_idx(void );
1405
1406#define SSL_CTX_sess_set_cache_size(ctx,t) \
1407 SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_SIZE,t,NULL)
1408#define SSL_CTX_sess_get_cache_size(ctx) \
1409 SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_SIZE,0,NULL)
1410#define SSL_CTX_set_session_cache_mode(ctx,m) \
1411 SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_MODE,m,NULL)
1412#define SSL_CTX_get_session_cache_mode(ctx) \
1413 SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_MODE,0,NULL)
1414
1415#define SSL_CTX_get_default_read_ahead(ctx) SSL_CTX_get_read_ahead(ctx)
1416#define SSL_CTX_set_default_read_ahead(ctx,m) SSL_CTX_set_read_ahead(ctx,m)
1417#define SSL_CTX_get_read_ahead(ctx) \
1418 SSL_CTX_ctrl(ctx,SSL_CTRL_GET_READ_AHEAD,0,NULL)
1419#define SSL_CTX_set_read_ahead(ctx,m) \
1420 SSL_CTX_ctrl(ctx,SSL_CTRL_SET_READ_AHEAD,m,NULL)
1421#define SSL_CTX_get_max_cert_list(ctx) \
1422 SSL_CTX_ctrl(ctx,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL)
1423#define SSL_CTX_set_max_cert_list(ctx,m) \
1424 SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL)
1425#define SSL_get_max_cert_list(ssl) \
1426 SSL_ctrl(ssl,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL)
1427#define SSL_set_max_cert_list(ssl,m) \
1428 SSL_ctrl(ssl,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL)
1429
1430 /* NB: the keylength is only applicable when is_export is true */
1431#ifndef OPENSSL_NO_RSA
1432void SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx,
1433 RSA *(*cb)(SSL *ssl,int is_export,
1434 int keylength));
1435
1436void SSL_set_tmp_rsa_callback(SSL *ssl,
1437 RSA *(*cb)(SSL *ssl,int is_export,
1438 int keylength));
1439#endif
1440#ifndef OPENSSL_NO_DH
1441void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,
1442 DH *(*dh)(SSL *ssl,int is_export,
1443 int keylength));
1444void SSL_set_tmp_dh_callback(SSL *ssl,
1445 DH *(*dh)(SSL *ssl,int is_export,
1446 int keylength));
1447#endif
1448
1449#ifndef OPENSSL_NO_COMP
1450int SSL_COMP_add_compression_method(int id,COMP_METHOD *cm);
1451#else
1452int SSL_COMP_add_compression_method(int id,char *cm);
1453#endif
1454
1455/* BEGIN ERROR CODES */
1456/* The following lines are auto generated by the script mkerr.pl. Any changes
1457 * made after this point may be overwritten when the script is next run.
1458 */
1459void ERR_load_SSL_strings(void);
1460
1461/* Error codes for the SSL functions. */
1462
1463/* Function codes. */
1464#define SSL_F_CLIENT_CERTIFICATE 100
1465#define SSL_F_CLIENT_FINISHED 238
1466#define SSL_F_CLIENT_HELLO 101
1467#define SSL_F_CLIENT_MASTER_KEY 102
1468#define SSL_F_D2I_SSL_SESSION 103
1469#define SSL_F_DO_SSL3_WRITE 104
1470#define SSL_F_GET_CLIENT_FINISHED 105
1471#define SSL_F_GET_CLIENT_HELLO 106
1472#define SSL_F_GET_CLIENT_MASTER_KEY 107
1473#define SSL_F_GET_SERVER_FINISHED 108
1474#define SSL_F_GET_SERVER_HELLO 109
1475#define SSL_F_GET_SERVER_VERIFY 110
1476#define SSL_F_I2D_SSL_SESSION 111
1477#define SSL_F_READ_N 112
1478#define SSL_F_REQUEST_CERTIFICATE 113
1479#define SSL_F_SERVER_FINISH 239
1480#define SSL_F_SERVER_HELLO 114
1481#define SSL_F_SERVER_VERIFY 240
1482#define SSL_F_SSL23_ACCEPT 115
1483#define SSL_F_SSL23_CLIENT_HELLO 116
1484#define SSL_F_SSL23_CONNECT 117
1485#define SSL_F_SSL23_GET_CLIENT_HELLO 118
1486#define SSL_F_SSL23_GET_SERVER_HELLO 119
1487#define SSL_F_SSL23_PEEK 237
1488#define SSL_F_SSL23_READ 120
1489#define SSL_F_SSL23_WRITE 121
1490#define SSL_F_SSL2_ACCEPT 122
1491#define SSL_F_SSL2_CONNECT 123
1492#define SSL_F_SSL2_ENC_INIT 124
1493#define SSL_F_SSL2_GENERATE_KEY_MATERIAL 241
1494#define SSL_F_SSL2_PEEK 234
1495#define SSL_F_SSL2_READ 125
1496#define SSL_F_SSL2_READ_INTERNAL 236
1497#define SSL_F_SSL2_SET_CERTIFICATE 126
1498#define SSL_F_SSL2_WRITE 127
1499#define SSL_F_SSL3_ACCEPT 128
1500#define SSL_F_SSL3_CALLBACK_CTRL 233
1501#define SSL_F_SSL3_CHANGE_CIPHER_STATE 129
1502#define SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM 130
1503#define SSL_F_SSL3_CLIENT_HELLO 131
1504#define SSL_F_SSL3_CONNECT 132
1505#define SSL_F_SSL3_CTRL 213
1506#define SSL_F_SSL3_CTX_CTRL 133
1507#define SSL_F_SSL3_ENC 134
1508#define SSL_F_SSL3_GENERATE_KEY_BLOCK 238
1509#define SSL_F_SSL3_GET_CERTIFICATE_REQUEST 135
1510#define SSL_F_SSL3_GET_CERT_VERIFY 136
1511#define SSL_F_SSL3_GET_CLIENT_CERTIFICATE 137
1512#define SSL_F_SSL3_GET_CLIENT_HELLO 138
1513#define SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE 139
1514#define SSL_F_SSL3_GET_FINISHED 140
1515#define SSL_F_SSL3_GET_KEY_EXCHANGE 141
1516#define SSL_F_SSL3_GET_MESSAGE 142
1517#define SSL_F_SSL3_GET_RECORD 143
1518#define SSL_F_SSL3_GET_SERVER_CERTIFICATE 144
1519#define SSL_F_SSL3_GET_SERVER_DONE 145
1520#define SSL_F_SSL3_GET_SERVER_HELLO 146
1521#define SSL_F_SSL3_OUTPUT_CERT_CHAIN 147
1522#define SSL_F_SSL3_PEEK 235
1523#define SSL_F_SSL3_READ_BYTES 148
1524#define SSL_F_SSL3_READ_N 149
1525#define SSL_F_SSL3_SEND_CERTIFICATE_REQUEST 150
1526#define SSL_F_SSL3_SEND_CLIENT_CERTIFICATE 151
1527#define SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE 152
1528#define SSL_F_SSL3_SEND_CLIENT_VERIFY 153
1529#define SSL_F_SSL3_SEND_SERVER_CERTIFICATE 154
1530#define SSL_F_SSL3_SEND_SERVER_HELLO 242
1531#define SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE 155
1532#define SSL_F_SSL3_SETUP_BUFFERS 156
1533#define SSL_F_SSL3_SETUP_KEY_BLOCK 157
1534#define SSL_F_SSL3_WRITE_BYTES 158
1535#define SSL_F_SSL3_WRITE_PENDING 159
1536#define SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK 215
1537#define SSL_F_SSL_ADD_FILE_CERT_SUBJECTS_TO_STACK 216
1538#define SSL_F_SSL_BAD_METHOD 160
1539#define SSL_F_SSL_BYTES_TO_CIPHER_LIST 161
1540#define SSL_F_SSL_CERT_DUP 221
1541#define SSL_F_SSL_CERT_INST 222
1542#define SSL_F_SSL_CERT_INSTANTIATE 214
1543#define SSL_F_SSL_CERT_NEW 162
1544#define SSL_F_SSL_CHECK_PRIVATE_KEY 163
1545#define SSL_F_SSL_CIPHER_PROCESS_RULESTR 230
1546#define SSL_F_SSL_CIPHER_STRENGTH_SORT 231
1547#define SSL_F_SSL_CLEAR 164
1548#define SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD 165
1549#define SSL_F_SSL_CREATE_CIPHER_LIST 166
1550#define SSL_F_SSL_CTRL 232
1551#define SSL_F_SSL_CTX_CHECK_PRIVATE_KEY 168
1552#define SSL_F_SSL_CTX_NEW 169
1553#define SSL_F_SSL_CTX_SET_PURPOSE 226
1554#define SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT 219
1555#define SSL_F_SSL_CTX_SET_SSL_VERSION 170
1556#define SSL_F_SSL_CTX_SET_TRUST 229
1557#define SSL_F_SSL_CTX_USE_CERTIFICATE 171
1558#define SSL_F_SSL_CTX_USE_CERTIFICATE_ASN1 172
1559#define SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE 220
1560#define SSL_F_SSL_CTX_USE_CERTIFICATE_FILE 173
1561#define SSL_F_SSL_CTX_USE_PRIVATEKEY 174
1562#define SSL_F_SSL_CTX_USE_PRIVATEKEY_ASN1 175
1563#define SSL_F_SSL_CTX_USE_PRIVATEKEY_FILE 176
1564#define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY 177
1565#define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_ASN1 178
1566#define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_FILE 179
1567#define SSL_F_SSL_DO_HANDSHAKE 180
1568#define SSL_F_SSL_GET_NEW_SESSION 181
1569#define SSL_F_SSL_GET_PREV_SESSION 217
1570#define SSL_F_SSL_GET_SERVER_SEND_CERT 182
1571#define SSL_F_SSL_GET_SIGN_PKEY 183
1572#define SSL_F_SSL_INIT_WBIO_BUFFER 184
1573#define SSL_F_SSL_LOAD_CLIENT_CA_FILE 185
1574#define SSL_F_SSL_NEW 186
1575#define SSL_F_SSL_READ 223
1576#define SSL_F_SSL_RSA_PRIVATE_DECRYPT 187
1577#define SSL_F_SSL_RSA_PUBLIC_ENCRYPT 188
1578#define SSL_F_SSL_SESSION_NEW 189
1579#define SSL_F_SSL_SESSION_PRINT_FP 190
1580#define SSL_F_SSL_SESS_CERT_NEW 225
1581#define SSL_F_SSL_SET_CERT 191
1582#define SSL_F_SSL_SET_FD 192
1583#define SSL_F_SSL_SET_PKEY 193
1584#define SSL_F_SSL_SET_PURPOSE 227
1585#define SSL_F_SSL_SET_RFD 194
1586#define SSL_F_SSL_SET_SESSION 195
1587#define SSL_F_SSL_SET_SESSION_ID_CONTEXT 218
1588#define SSL_F_SSL_SET_TRUST 228
1589#define SSL_F_SSL_SET_WFD 196
1590#define SSL_F_SSL_SHUTDOWN 224
1591#define SSL_F_SSL_UNDEFINED_FUNCTION 197
1592#define SSL_F_SSL_USE_CERTIFICATE 198
1593#define SSL_F_SSL_USE_CERTIFICATE_ASN1 199
1594#define SSL_F_SSL_USE_CERTIFICATE_FILE 200
1595#define SSL_F_SSL_USE_PRIVATEKEY 201
1596#define SSL_F_SSL_USE_PRIVATEKEY_ASN1 202
1597#define SSL_F_SSL_USE_PRIVATEKEY_FILE 203
1598#define SSL_F_SSL_USE_RSAPRIVATEKEY 204
1599#define SSL_F_SSL_USE_RSAPRIVATEKEY_ASN1 205
1600#define SSL_F_SSL_USE_RSAPRIVATEKEY_FILE 206
1601#define SSL_F_SSL_VERIFY_CERT_CHAIN 207
1602#define SSL_F_SSL_WRITE 208
1603#define SSL_F_TLS1_CHANGE_CIPHER_STATE 209
1604#define SSL_F_TLS1_ENC 210
1605#define SSL_F_TLS1_SETUP_KEY_BLOCK 211
1606#define SSL_F_WRITE_PENDING 212
1607
1608/* Reason codes. */
1609#define SSL_R_APP_DATA_IN_HANDSHAKE 100
1610#define SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT 272
1611#define SSL_R_BAD_ALERT_RECORD 101
1612#define SSL_R_BAD_AUTHENTICATION_TYPE 102
1613#define SSL_R_BAD_CHANGE_CIPHER_SPEC 103
1614#define SSL_R_BAD_CHECKSUM 104
1615#define SSL_R_BAD_DATA_RETURNED_BY_CALLBACK 106
1616#define SSL_R_BAD_DECOMPRESSION 107
1617#define SSL_R_BAD_DH_G_LENGTH 108
1618#define SSL_R_BAD_DH_PUB_KEY_LENGTH 109
1619#define SSL_R_BAD_DH_P_LENGTH 110
1620#define SSL_R_BAD_DIGEST_LENGTH 111
1621#define SSL_R_BAD_DSA_SIGNATURE 112
1622#define SSL_R_BAD_HELLO_REQUEST 105
1623#define SSL_R_BAD_LENGTH 271
1624#define SSL_R_BAD_MAC_DECODE 113
1625#define SSL_R_BAD_MESSAGE_TYPE 114
1626#define SSL_R_BAD_PACKET_LENGTH 115
1627#define SSL_R_BAD_PROTOCOL_VERSION_NUMBER 116
1628#define SSL_R_BAD_RESPONSE_ARGUMENT 117
1629#define SSL_R_BAD_RSA_DECRYPT 118
1630#define SSL_R_BAD_RSA_ENCRYPT 119
1631#define SSL_R_BAD_RSA_E_LENGTH 120
1632#define SSL_R_BAD_RSA_MODULUS_LENGTH 121
1633#define SSL_R_BAD_RSA_SIGNATURE 122
1634#define SSL_R_BAD_SIGNATURE 123
1635#define SSL_R_BAD_SSL_FILETYPE 124
1636#define SSL_R_BAD_SSL_SESSION_ID_LENGTH 125
1637#define SSL_R_BAD_STATE 126
1638#define SSL_R_BAD_WRITE_RETRY 127
1639#define SSL_R_BIO_NOT_SET 128
1640#define SSL_R_BLOCK_CIPHER_PAD_IS_WRONG 129
1641#define SSL_R_BN_LIB 130
1642#define SSL_R_CA_DN_LENGTH_MISMATCH 131
1643#define SSL_R_CA_DN_TOO_LONG 132
1644#define SSL_R_CCS_RECEIVED_EARLY 133
1645#define SSL_R_CERTIFICATE_VERIFY_FAILED 134
1646#define SSL_R_CERT_LENGTH_MISMATCH 135
1647#define SSL_R_CHALLENGE_IS_DIFFERENT 136
1648#define SSL_R_CIPHER_CODE_WRONG_LENGTH 137
1649#define SSL_R_CIPHER_OR_HASH_UNAVAILABLE 138
1650#define SSL_R_CIPHER_TABLE_SRC_ERROR 139
1651#define SSL_R_COMPRESSED_LENGTH_TOO_LONG 140
1652#define SSL_R_COMPRESSION_FAILURE 141
1653#define SSL_R_COMPRESSION_LIBRARY_ERROR 142
1654#define SSL_R_CONNECTION_ID_IS_DIFFERENT 143
1655#define SSL_R_CONNECTION_TYPE_NOT_SET 144
1656#define SSL_R_DATA_BETWEEN_CCS_AND_FINISHED 145
1657#define SSL_R_DATA_LENGTH_TOO_LONG 146
1658#define SSL_R_DECRYPTION_FAILED 147
1659#define SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC 1109
1660#define SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG 148
1661#define SSL_R_DIGEST_CHECK_FAILED 149
1662#define SSL_R_ENCRYPTED_LENGTH_TOO_LONG 150
1663#define SSL_R_ERROR_GENERATING_TMP_RSA_KEY 1092
1664#define SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST 151
1665#define SSL_R_EXCESSIVE_MESSAGE_SIZE 152
1666#define SSL_R_EXTRA_DATA_IN_MESSAGE 153
1667#define SSL_R_GOT_A_FIN_BEFORE_A_CCS 154
1668#define SSL_R_HTTPS_PROXY_REQUEST 155
1669#define SSL_R_HTTP_REQUEST 156
1670#define SSL_R_ILLEGAL_PADDING 1110
1671#define SSL_R_INVALID_CHALLENGE_LENGTH 158
1672#define SSL_R_INVALID_COMMAND 280
1673#define SSL_R_INVALID_PURPOSE 278
1674#define SSL_R_INVALID_TRUST 279
1675#define SSL_R_KEY_ARG_TOO_LONG 1112
1676#define SSL_R_KRB5 1104
1677#define SSL_R_KRB5_C_CC_PRINC 1094
1678#define SSL_R_KRB5_C_GET_CRED 1095
1679#define SSL_R_KRB5_C_INIT 1096
1680#define SSL_R_KRB5_C_MK_REQ 1097
1681#define SSL_R_KRB5_S_BAD_TICKET 1098
1682#define SSL_R_KRB5_S_INIT 1099
1683#define SSL_R_KRB5_S_RD_REQ 1108
1684#define SSL_R_KRB5_S_TKT_EXPIRED 1105
1685#define SSL_R_KRB5_S_TKT_NYV 1106
1686#define SSL_R_KRB5_S_TKT_SKEW 1107
1687#define SSL_R_LENGTH_MISMATCH 159
1688#define SSL_R_LENGTH_TOO_SHORT 160
1689#define SSL_R_LIBRARY_BUG 274
1690#define SSL_R_LIBRARY_HAS_NO_CIPHERS 161
1691#define SSL_R_MESSAGE_TOO_LONG 1111
1692#define SSL_R_MISSING_DH_DSA_CERT 162
1693#define SSL_R_MISSING_DH_KEY 163
1694#define SSL_R_MISSING_DH_RSA_CERT 164
1695#define SSL_R_MISSING_DSA_SIGNING_CERT 165
1696#define SSL_R_MISSING_EXPORT_TMP_DH_KEY 166
1697#define SSL_R_MISSING_EXPORT_TMP_RSA_KEY 167
1698#define SSL_R_MISSING_RSA_CERTIFICATE 168
1699#define SSL_R_MISSING_RSA_ENCRYPTING_CERT 169
1700#define SSL_R_MISSING_RSA_SIGNING_CERT 170
1701#define SSL_R_MISSING_TMP_DH_KEY 171
1702#define SSL_R_MISSING_TMP_RSA_KEY 172
1703#define SSL_R_MISSING_TMP_RSA_PKEY 173
1704#define SSL_R_MISSING_VERIFY_MESSAGE 174
1705#define SSL_R_NON_SSLV2_INITIAL_PACKET 175
1706#define SSL_R_NO_CERTIFICATES_RETURNED 176
1707#define SSL_R_NO_CERTIFICATE_ASSIGNED 177
1708#define SSL_R_NO_CERTIFICATE_RETURNED 178
1709#define SSL_R_NO_CERTIFICATE_SET 179
1710#define SSL_R_NO_CERTIFICATE_SPECIFIED 180
1711#define SSL_R_NO_CIPHERS_AVAILABLE 181
1712#define SSL_R_NO_CIPHERS_PASSED 182
1713#define SSL_R_NO_CIPHERS_SPECIFIED 183
1714#define SSL_R_NO_CIPHER_LIST 184
1715#define SSL_R_NO_CIPHER_MATCH 185
1716#define SSL_R_NO_CLIENT_CERT_RECEIVED 186
1717#define SSL_R_NO_COMPRESSION_SPECIFIED 187
1718#define SSL_R_NO_METHOD_SPECIFIED 188
1719#define SSL_R_NO_PRIVATEKEY 189
1720#define SSL_R_NO_PRIVATE_KEY_ASSIGNED 190
1721#define SSL_R_NO_PROTOCOLS_AVAILABLE 191
1722#define SSL_R_NO_PUBLICKEY 192
1723#define SSL_R_NO_SHARED_CIPHER 193
1724#define SSL_R_NO_VERIFY_CALLBACK 194
1725#define SSL_R_NULL_SSL_CTX 195
1726#define SSL_R_NULL_SSL_METHOD_PASSED 196
1727#define SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED 197
1728#define SSL_R_PACKET_LENGTH_TOO_LONG 198
1729#define SSL_R_PATH_TOO_LONG 270
1730#define SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE 199
1731#define SSL_R_PEER_ERROR 200
1732#define SSL_R_PEER_ERROR_CERTIFICATE 201
1733#define SSL_R_PEER_ERROR_NO_CERTIFICATE 202
1734#define SSL_R_PEER_ERROR_NO_CIPHER 203
1735#define SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE 204
1736#define SSL_R_PRE_MAC_LENGTH_TOO_LONG 205
1737#define SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS 206
1738#define SSL_R_PROTOCOL_IS_SHUTDOWN 207
1739#define SSL_R_PUBLIC_KEY_ENCRYPT_ERROR 208
1740#define SSL_R_PUBLIC_KEY_IS_NOT_RSA 209
1741#define SSL_R_PUBLIC_KEY_NOT_RSA 210
1742#define SSL_R_READ_BIO_NOT_SET 211
1743#define SSL_R_READ_WRONG_PACKET_TYPE 212
1744#define SSL_R_RECORD_LENGTH_MISMATCH 213
1745#define SSL_R_RECORD_TOO_LARGE 214
1746#define SSL_R_RECORD_TOO_SMALL 1093
1747#define SSL_R_REQUIRED_CIPHER_MISSING 215
1748#define SSL_R_REUSE_CERT_LENGTH_NOT_ZERO 216
1749#define SSL_R_REUSE_CERT_TYPE_NOT_ZERO 217
1750#define SSL_R_REUSE_CIPHER_LIST_NOT_ZERO 218
1751#define SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED 277
1752#define SSL_R_SHORT_READ 219
1753#define SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE 220
1754#define SSL_R_SSL23_DOING_SESSION_ID_REUSE 221
1755#define SSL_R_SSL2_CONNECTION_ID_TOO_LONG 1114
1756#define SSL_R_SSL3_SESSION_ID_TOO_LONG 1113
1757#define SSL_R_SSL3_SESSION_ID_TOO_SHORT 222
1758#define SSL_R_SSLV3_ALERT_BAD_CERTIFICATE 1042
1759#define SSL_R_SSLV3_ALERT_BAD_RECORD_MAC 1020
1760#define SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED 1045
1761#define SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED 1044
1762#define SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN 1046
1763#define SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE 1030
1764#define SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE 1040
1765#define SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER 1047
1766#define SSL_R_SSLV3_ALERT_NO_CERTIFICATE 1041
1767#define SSL_R_SSLV3_ALERT_PEER_ERROR_CERTIFICATE 223
1768#define SSL_R_SSLV3_ALERT_PEER_ERROR_NO_CERTIFICATE 224
1769#define SSL_R_SSLV3_ALERT_PEER_ERROR_NO_CIPHER 225
1770#define SSL_R_SSLV3_ALERT_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE 226
1771#define SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE 1010
1772#define SSL_R_SSLV3_ALERT_UNKNOWN_REMOTE_ERROR_TYPE 227
1773#define SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE 1043
1774#define SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION 228
1775#define SSL_R_SSL_HANDSHAKE_FAILURE 229
1776#define SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS 230
1777#define SSL_R_SSL_SESSION_ID_CALLBACK_FAILED 1102
1778#define SSL_R_SSL_SESSION_ID_CONFLICT 1103
1779#define SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG 273
1780#define SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH 1101
1781#define SSL_R_SSL_SESSION_ID_IS_DIFFERENT 231
1782#define SSL_R_TLSV1_ALERT_ACCESS_DENIED 1049
1783#define SSL_R_TLSV1_ALERT_DECODE_ERROR 1050
1784#define SSL_R_TLSV1_ALERT_DECRYPTION_FAILED 1021
1785#define SSL_R_TLSV1_ALERT_DECRYPT_ERROR 1051
1786#define SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION 1060
1787#define SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY 1071
1788#define SSL_R_TLSV1_ALERT_INTERNAL_ERROR 1080
1789#define SSL_R_TLSV1_ALERT_NO_RENEGOTIATION 1100
1790#define SSL_R_TLSV1_ALERT_PROTOCOL_VERSION 1070
1791#define SSL_R_TLSV1_ALERT_RECORD_OVERFLOW 1022
1792#define SSL_R_TLSV1_ALERT_UNKNOWN_CA 1048
1793#define SSL_R_TLSV1_ALERT_USER_CANCELLED 1090
1794#define SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER 232
1795#define SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST 233
1796#define SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG 234
1797#define SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER 235
1798#define SSL_R_UNABLE_TO_DECODE_DH_CERTS 236
1799#define SSL_R_UNABLE_TO_EXTRACT_PUBLIC_KEY 237
1800#define SSL_R_UNABLE_TO_FIND_DH_PARAMETERS 238
1801#define SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS 239
1802#define SSL_R_UNABLE_TO_FIND_SSL_METHOD 240
1803#define SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES 241
1804#define SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES 242
1805#define SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES 243
1806#define SSL_R_UNEXPECTED_MESSAGE 244
1807#define SSL_R_UNEXPECTED_RECORD 245
1808#define SSL_R_UNINITIALIZED 276
1809#define SSL_R_UNKNOWN_ALERT_TYPE 246
1810#define SSL_R_UNKNOWN_CERTIFICATE_TYPE 247
1811#define SSL_R_UNKNOWN_CIPHER_RETURNED 248
1812#define SSL_R_UNKNOWN_CIPHER_TYPE 249
1813#define SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE 250
1814#define SSL_R_UNKNOWN_PKEY_TYPE 251
1815#define SSL_R_UNKNOWN_PROTOCOL 252
1816#define SSL_R_UNKNOWN_REMOTE_ERROR_TYPE 253
1817#define SSL_R_UNKNOWN_SSL_VERSION 254
1818#define SSL_R_UNKNOWN_STATE 255
1819#define SSL_R_UNSUPPORTED_CIPHER 256
1820#define SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM 257
1821#define SSL_R_UNSUPPORTED_OPTION 1091
1822#define SSL_R_UNSUPPORTED_PROTOCOL 258
1823#define SSL_R_UNSUPPORTED_SSL_VERSION 259
1824#define SSL_R_WRITE_BIO_NOT_SET 260
1825#define SSL_R_WRONG_CIPHER_RETURNED 261
1826#define SSL_R_WRONG_MESSAGE_TYPE 262
1827#define SSL_R_WRONG_NUMBER_OF_KEY_BITS 263
1828#define SSL_R_WRONG_SIGNATURE_LENGTH 264
1829#define SSL_R_WRONG_SIGNATURE_SIZE 265
1830#define SSL_R_WRONG_SSL_VERSION 266
1831#define SSL_R_WRONG_VERSION_NUMBER 267
1832#define SSL_R_X509_LIB 268
1833#define SSL_R_X509_VERIFICATION_SETUP_PROBLEMS 269
1834
1835#ifdef __cplusplus
1836}
1837#endif
1838#endif
diff --git a/src/lib/libssl/ssl2.h b/src/lib/libssl/ssl2.h
deleted file mode 100644
index 99a52ea0dd..0000000000
--- a/src/lib/libssl/ssl2.h
+++ /dev/null
@@ -1,268 +0,0 @@
1/* ssl/ssl2.h */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#ifndef HEADER_SSL2_H
60#define HEADER_SSL2_H
61
62#ifdef __cplusplus
63extern "C" {
64#endif
65
66/* Protocol Version Codes */
67#define SSL2_VERSION 0x0002
68#define SSL2_VERSION_MAJOR 0x00
69#define SSL2_VERSION_MINOR 0x02
70/* #define SSL2_CLIENT_VERSION 0x0002 */
71/* #define SSL2_SERVER_VERSION 0x0002 */
72
73/* Protocol Message Codes */
74#define SSL2_MT_ERROR 0
75#define SSL2_MT_CLIENT_HELLO 1
76#define SSL2_MT_CLIENT_MASTER_KEY 2
77#define SSL2_MT_CLIENT_FINISHED 3
78#define SSL2_MT_SERVER_HELLO 4
79#define SSL2_MT_SERVER_VERIFY 5
80#define SSL2_MT_SERVER_FINISHED 6
81#define SSL2_MT_REQUEST_CERTIFICATE 7
82#define SSL2_MT_CLIENT_CERTIFICATE 8
83
84/* Error Message Codes */
85#define SSL2_PE_UNDEFINED_ERROR 0x0000
86#define SSL2_PE_NO_CIPHER 0x0001
87#define SSL2_PE_NO_CERTIFICATE 0x0002
88#define SSL2_PE_BAD_CERTIFICATE 0x0004
89#define SSL2_PE_UNSUPPORTED_CERTIFICATE_TYPE 0x0006
90
91/* Cipher Kind Values */
92#define SSL2_CK_NULL_WITH_MD5 0x02000000 /* v3 */
93#define SSL2_CK_RC4_128_WITH_MD5 0x02010080
94#define SSL2_CK_RC4_128_EXPORT40_WITH_MD5 0x02020080
95#define SSL2_CK_RC2_128_CBC_WITH_MD5 0x02030080
96#define SSL2_CK_RC2_128_CBC_EXPORT40_WITH_MD5 0x02040080
97#define SSL2_CK_IDEA_128_CBC_WITH_MD5 0x02050080
98#define SSL2_CK_DES_64_CBC_WITH_MD5 0x02060040
99#define SSL2_CK_DES_64_CBC_WITH_SHA 0x02060140 /* v3 */
100#define SSL2_CK_DES_192_EDE3_CBC_WITH_MD5 0x020700c0
101#define SSL2_CK_DES_192_EDE3_CBC_WITH_SHA 0x020701c0 /* v3 */
102#define SSL2_CK_RC4_64_WITH_MD5 0x02080080 /* MS hack */
103
104#define SSL2_CK_DES_64_CFB64_WITH_MD5_1 0x02ff0800 /* SSLeay */
105#define SSL2_CK_NULL 0x02ff0810 /* SSLeay */
106
107#define SSL2_TXT_DES_64_CFB64_WITH_MD5_1 "DES-CFB-M1"
108#define SSL2_TXT_NULL_WITH_MD5 "NULL-MD5"
109#define SSL2_TXT_RC4_128_WITH_MD5 "RC4-MD5"
110#define SSL2_TXT_RC4_128_EXPORT40_WITH_MD5 "EXP-RC4-MD5"
111#define SSL2_TXT_RC2_128_CBC_WITH_MD5 "RC2-CBC-MD5"
112#define SSL2_TXT_RC2_128_CBC_EXPORT40_WITH_MD5 "EXP-RC2-CBC-MD5"
113#define SSL2_TXT_IDEA_128_CBC_WITH_MD5 "IDEA-CBC-MD5"
114#define SSL2_TXT_DES_64_CBC_WITH_MD5 "DES-CBC-MD5"
115#define SSL2_TXT_DES_64_CBC_WITH_SHA "DES-CBC-SHA"
116#define SSL2_TXT_DES_192_EDE3_CBC_WITH_MD5 "DES-CBC3-MD5"
117#define SSL2_TXT_DES_192_EDE3_CBC_WITH_SHA "DES-CBC3-SHA"
118#define SSL2_TXT_RC4_64_WITH_MD5 "RC4-64-MD5"
119
120#define SSL2_TXT_NULL "NULL"
121
122/* Flags for the SSL_CIPHER.algorithm2 field */
123#define SSL2_CF_5_BYTE_ENC 0x01
124#define SSL2_CF_8_BYTE_ENC 0x02
125
126/* Certificate Type Codes */
127#define SSL2_CT_X509_CERTIFICATE 0x01
128
129/* Authentication Type Code */
130#define SSL2_AT_MD5_WITH_RSA_ENCRYPTION 0x01
131
132#define SSL2_MAX_SSL_SESSION_ID_LENGTH 32
133
134/* Upper/Lower Bounds */
135#define SSL2_MAX_MASTER_KEY_LENGTH_IN_BITS 256
136#ifdef OPENSSL_SYS_MPE
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 */
142
143#define SSL2_CHALLENGE_LENGTH 16
144/*#define SSL2_CHALLENGE_LENGTH 32 */
145#define SSL2_MIN_CHALLENGE_LENGTH 16
146#define SSL2_MAX_CHALLENGE_LENGTH 32
147#define SSL2_CONNECTION_ID_LENGTH 16
148#define SSL2_MAX_CONNECTION_ID_LENGTH 16
149#define SSL2_SSL_SESSION_ID_LENGTH 16
150#define SSL2_MAX_CERT_CHALLENGE_LENGTH 32
151#define SSL2_MIN_CERT_CHALLENGE_LENGTH 16
152#define SSL2_MAX_KEY_MATERIAL_LENGTH 24
153
154#ifndef HEADER_SSL_LOCL_H
155#define CERT char
156#endif
157
158typedef struct ssl2_state_st
159 {
160 int three_byte_header;
161 int clear_text; /* clear text */
162 int escape; /* not used in SSLv2 */
163 int ssl2_rollback; /* used if SSLv23 rolled back to SSLv2 */
164
165 /* non-blocking io info, used to make sure the same
166 * args were passwd */
167 unsigned int wnum; /* number of bytes sent so far */
168 int wpend_tot;
169 const unsigned char *wpend_buf;
170
171 int wpend_off; /* offset to data to write */
172 int wpend_len; /* number of bytes passwd to write */
173 int wpend_ret; /* number of bytes to return to caller */
174
175 /* buffer raw data */
176 int rbuf_left;
177 int rbuf_offs;
178 unsigned char *rbuf;
179 unsigned char *wbuf;
180
181 unsigned char *write_ptr;/* used to point to the start due to
182 * 2/3 byte header. */
183
184 unsigned int padding;
185 unsigned int rlength; /* passed to ssl2_enc */
186 int ract_data_length; /* Set when things are encrypted. */
187 unsigned int wlength; /* passed to ssl2_enc */
188 int wact_data_length; /* Set when things are decrypted. */
189 unsigned char *ract_data;
190 unsigned char *wact_data;
191 unsigned char *mac_data;
192
193 unsigned char *read_key;
194 unsigned char *write_key;
195
196 /* Stuff specifically to do with this SSL session */
197 unsigned int challenge_length;
198 unsigned char challenge[SSL2_MAX_CHALLENGE_LENGTH];
199 unsigned int conn_id_length;
200 unsigned char conn_id[SSL2_MAX_CONNECTION_ID_LENGTH];
201 unsigned int key_material_length;
202 unsigned char key_material[SSL2_MAX_KEY_MATERIAL_LENGTH*2];
203
204 unsigned long read_sequence;
205 unsigned long write_sequence;
206
207 struct {
208 unsigned int conn_id_length;
209 unsigned int cert_type;
210 unsigned int cert_length;
211 unsigned int csl;
212 unsigned int clear;
213 unsigned int enc;
214 unsigned char ccl[SSL2_MAX_CERT_CHALLENGE_LENGTH];
215 unsigned int cipher_spec_length;
216 unsigned int session_id_length;
217 unsigned int clen;
218 unsigned int rlen;
219 } tmp;
220 } SSL2_STATE;
221
222/* SSLv2 */
223/* client */
224#define SSL2_ST_SEND_CLIENT_HELLO_A (0x10|SSL_ST_CONNECT)
225#define SSL2_ST_SEND_CLIENT_HELLO_B (0x11|SSL_ST_CONNECT)
226#define SSL2_ST_GET_SERVER_HELLO_A (0x20|SSL_ST_CONNECT)
227#define SSL2_ST_GET_SERVER_HELLO_B (0x21|SSL_ST_CONNECT)
228#define SSL2_ST_SEND_CLIENT_MASTER_KEY_A (0x30|SSL_ST_CONNECT)
229#define SSL2_ST_SEND_CLIENT_MASTER_KEY_B (0x31|SSL_ST_CONNECT)
230#define SSL2_ST_SEND_CLIENT_FINISHED_A (0x40|SSL_ST_CONNECT)
231#define SSL2_ST_SEND_CLIENT_FINISHED_B (0x41|SSL_ST_CONNECT)
232#define SSL2_ST_SEND_CLIENT_CERTIFICATE_A (0x50|SSL_ST_CONNECT)
233#define SSL2_ST_SEND_CLIENT_CERTIFICATE_B (0x51|SSL_ST_CONNECT)
234#define SSL2_ST_SEND_CLIENT_CERTIFICATE_C (0x52|SSL_ST_CONNECT)
235#define SSL2_ST_SEND_CLIENT_CERTIFICATE_D (0x53|SSL_ST_CONNECT)
236#define SSL2_ST_GET_SERVER_VERIFY_A (0x60|SSL_ST_CONNECT)
237#define SSL2_ST_GET_SERVER_VERIFY_B (0x61|SSL_ST_CONNECT)
238#define SSL2_ST_GET_SERVER_FINISHED_A (0x70|SSL_ST_CONNECT)
239#define SSL2_ST_GET_SERVER_FINISHED_B (0x71|SSL_ST_CONNECT)
240#define SSL2_ST_CLIENT_START_ENCRYPTION (0x80|SSL_ST_CONNECT)
241#define SSL2_ST_X509_GET_CLIENT_CERTIFICATE (0x90|SSL_ST_CONNECT)
242/* server */
243#define SSL2_ST_GET_CLIENT_HELLO_A (0x10|SSL_ST_ACCEPT)
244#define SSL2_ST_GET_CLIENT_HELLO_B (0x11|SSL_ST_ACCEPT)
245#define SSL2_ST_GET_CLIENT_HELLO_C (0x12|SSL_ST_ACCEPT)
246#define SSL2_ST_SEND_SERVER_HELLO_A (0x20|SSL_ST_ACCEPT)
247#define SSL2_ST_SEND_SERVER_HELLO_B (0x21|SSL_ST_ACCEPT)
248#define SSL2_ST_GET_CLIENT_MASTER_KEY_A (0x30|SSL_ST_ACCEPT)
249#define SSL2_ST_GET_CLIENT_MASTER_KEY_B (0x31|SSL_ST_ACCEPT)
250#define SSL2_ST_SEND_SERVER_VERIFY_A (0x40|SSL_ST_ACCEPT)
251#define SSL2_ST_SEND_SERVER_VERIFY_B (0x41|SSL_ST_ACCEPT)
252#define SSL2_ST_SEND_SERVER_VERIFY_C (0x42|SSL_ST_ACCEPT)
253#define SSL2_ST_GET_CLIENT_FINISHED_A (0x50|SSL_ST_ACCEPT)
254#define SSL2_ST_GET_CLIENT_FINISHED_B (0x51|SSL_ST_ACCEPT)
255#define SSL2_ST_SEND_SERVER_FINISHED_A (0x60|SSL_ST_ACCEPT)
256#define SSL2_ST_SEND_SERVER_FINISHED_B (0x61|SSL_ST_ACCEPT)
257#define SSL2_ST_SEND_REQUEST_CERTIFICATE_A (0x70|SSL_ST_ACCEPT)
258#define SSL2_ST_SEND_REQUEST_CERTIFICATE_B (0x71|SSL_ST_ACCEPT)
259#define SSL2_ST_SEND_REQUEST_CERTIFICATE_C (0x72|SSL_ST_ACCEPT)
260#define SSL2_ST_SEND_REQUEST_CERTIFICATE_D (0x73|SSL_ST_ACCEPT)
261#define SSL2_ST_SERVER_START_ENCRYPTION (0x80|SSL_ST_ACCEPT)
262#define SSL2_ST_X509_GET_SERVER_CERTIFICATE (0x90|SSL_ST_ACCEPT)
263
264#ifdef __cplusplus
265}
266#endif
267#endif
268
diff --git a/src/lib/libssl/ssl23.h b/src/lib/libssl/ssl23.h
deleted file mode 100644
index d3228983c7..0000000000
--- a/src/lib/libssl/ssl23.h
+++ /dev/null
@@ -1,83 +0,0 @@
1/* ssl/ssl23.h */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#ifndef HEADER_SSL23_H
60#define HEADER_SSL23_H
61
62#ifdef __cplusplus
63extern "C" {
64#endif
65
66/*client */
67/* write to server */
68#define SSL23_ST_CW_CLNT_HELLO_A (0x210|SSL_ST_CONNECT)
69#define SSL23_ST_CW_CLNT_HELLO_B (0x211|SSL_ST_CONNECT)
70/* read from server */
71#define SSL23_ST_CR_SRVR_HELLO_A (0x220|SSL_ST_CONNECT)
72#define SSL23_ST_CR_SRVR_HELLO_B (0x221|SSL_ST_CONNECT)
73
74/* server */
75/* read from client */
76#define SSL23_ST_SR_CLNT_HELLO_A (0x210|SSL_ST_ACCEPT)
77#define SSL23_ST_SR_CLNT_HELLO_B (0x211|SSL_ST_ACCEPT)
78
79#ifdef __cplusplus
80}
81#endif
82#endif
83
diff --git a/src/lib/libssl/ssl3.h b/src/lib/libssl/ssl3.h
deleted file mode 100644
index 8fd6951d77..0000000000
--- a/src/lib/libssl/ssl3.h
+++ /dev/null
@@ -1,504 +0,0 @@
1/* ssl/ssl3.h */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58/* ====================================================================
59 * Copyright (c) 1998-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 */
111
112#ifndef HEADER_SSL3_H
113#define HEADER_SSL3_H
114
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>
121
122#ifdef __cplusplus
123extern "C" {
124#endif
125
126#define SSL3_CK_RSA_NULL_MD5 0x03000001
127#define SSL3_CK_RSA_NULL_SHA 0x03000002
128#define SSL3_CK_RSA_RC4_40_MD5 0x03000003
129#define SSL3_CK_RSA_RC4_128_MD5 0x03000004
130#define SSL3_CK_RSA_RC4_128_SHA 0x03000005
131#define SSL3_CK_RSA_RC2_40_MD5 0x03000006
132#define SSL3_CK_RSA_IDEA_128_SHA 0x03000007
133#define SSL3_CK_RSA_DES_40_CBC_SHA 0x03000008
134#define SSL3_CK_RSA_DES_64_CBC_SHA 0x03000009
135#define SSL3_CK_RSA_DES_192_CBC3_SHA 0x0300000A
136
137#define SSL3_CK_DH_DSS_DES_40_CBC_SHA 0x0300000B
138#define SSL3_CK_DH_DSS_DES_64_CBC_SHA 0x0300000C
139#define SSL3_CK_DH_DSS_DES_192_CBC3_SHA 0x0300000D
140#define SSL3_CK_DH_RSA_DES_40_CBC_SHA 0x0300000E
141#define SSL3_CK_DH_RSA_DES_64_CBC_SHA 0x0300000F
142#define SSL3_CK_DH_RSA_DES_192_CBC3_SHA 0x03000010
143
144#define SSL3_CK_EDH_DSS_DES_40_CBC_SHA 0x03000011
145#define SSL3_CK_EDH_DSS_DES_64_CBC_SHA 0x03000012
146#define SSL3_CK_EDH_DSS_DES_192_CBC3_SHA 0x03000013
147#define SSL3_CK_EDH_RSA_DES_40_CBC_SHA 0x03000014
148#define SSL3_CK_EDH_RSA_DES_64_CBC_SHA 0x03000015
149#define SSL3_CK_EDH_RSA_DES_192_CBC3_SHA 0x03000016
150
151#define SSL3_CK_ADH_RC4_40_MD5 0x03000017
152#define SSL3_CK_ADH_RC4_128_MD5 0x03000018
153#define SSL3_CK_ADH_DES_40_CBC_SHA 0x03000019
154#define SSL3_CK_ADH_DES_64_CBC_SHA 0x0300001A
155#define SSL3_CK_ADH_DES_192_CBC_SHA 0x0300001B
156
157#define SSL3_CK_FZA_DMS_NULL_SHA 0x0300001C
158#define SSL3_CK_FZA_DMS_FZA_SHA 0x0300001D
159#define SSL3_CK_FZA_DMS_RC4_SHA 0x0300001E
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
177#define SSL3_TXT_RSA_NULL_MD5 "NULL-MD5"
178#define SSL3_TXT_RSA_NULL_SHA "NULL-SHA"
179#define SSL3_TXT_RSA_RC4_40_MD5 "EXP-RC4-MD5"
180#define SSL3_TXT_RSA_RC4_128_MD5 "RC4-MD5"
181#define SSL3_TXT_RSA_RC4_128_SHA "RC4-SHA"
182#define SSL3_TXT_RSA_RC2_40_MD5 "EXP-RC2-CBC-MD5"
183#define SSL3_TXT_RSA_IDEA_128_SHA "IDEA-CBC-SHA"
184#define SSL3_TXT_RSA_DES_40_CBC_SHA "EXP-DES-CBC-SHA"
185#define SSL3_TXT_RSA_DES_64_CBC_SHA "DES-CBC-SHA"
186#define SSL3_TXT_RSA_DES_192_CBC3_SHA "DES-CBC3-SHA"
187
188#define SSL3_TXT_DH_DSS_DES_40_CBC_SHA "EXP-DH-DSS-DES-CBC-SHA"
189#define SSL3_TXT_DH_DSS_DES_64_CBC_SHA "DH-DSS-DES-CBC-SHA"
190#define SSL3_TXT_DH_DSS_DES_192_CBC3_SHA "DH-DSS-DES-CBC3-SHA"
191#define SSL3_TXT_DH_RSA_DES_40_CBC_SHA "EXP-DH-RSA-DES-CBC-SHA"
192#define SSL3_TXT_DH_RSA_DES_64_CBC_SHA "DH-RSA-DES-CBC-SHA"
193#define SSL3_TXT_DH_RSA_DES_192_CBC3_SHA "DH-RSA-DES-CBC3-SHA"
194
195#define SSL3_TXT_EDH_DSS_DES_40_CBC_SHA "EXP-EDH-DSS-DES-CBC-SHA"
196#define SSL3_TXT_EDH_DSS_DES_64_CBC_SHA "EDH-DSS-DES-CBC-SHA"
197#define SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA "EDH-DSS-DES-CBC3-SHA"
198#define SSL3_TXT_EDH_RSA_DES_40_CBC_SHA "EXP-EDH-RSA-DES-CBC-SHA"
199#define SSL3_TXT_EDH_RSA_DES_64_CBC_SHA "EDH-RSA-DES-CBC-SHA"
200#define SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA "EDH-RSA-DES-CBC3-SHA"
201
202#define SSL3_TXT_ADH_RC4_40_MD5 "EXP-ADH-RC4-MD5"
203#define SSL3_TXT_ADH_RC4_128_MD5 "ADH-RC4-MD5"
204#define SSL3_TXT_ADH_DES_40_CBC_SHA "EXP-ADH-DES-CBC-SHA"
205#define SSL3_TXT_ADH_DES_64_CBC_SHA "ADH-DES-CBC-SHA"
206#define SSL3_TXT_ADH_DES_192_CBC_SHA "ADH-DES-CBC3-SHA"
207
208#define SSL3_TXT_FZA_DMS_NULL_SHA "FZA-NULL-SHA"
209#define SSL3_TXT_FZA_DMS_FZA_SHA "FZA-FZA-CBC-SHA"
210#define SSL3_TXT_FZA_DMS_RC4_SHA "FZA-RC4-SHA"
211
212#define SSL3_SSL_SESSION_ID_LENGTH 32
213#define SSL3_MAX_SSL_SESSION_ID_LENGTH 32
214
215#define SSL3_MASTER_SECRET_SIZE 48
216#define SSL3_RANDOM_SIZE 32
217#define SSL3_SESSION_ID_SIZE 32
218#define SSL3_RT_HEADER_LENGTH 5
219
220/* Due to MS stuffing up, this can change.... */
221#if defined(OPENSSL_SYS_WIN16) || \
222 (defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN32))
223#define SSL3_RT_MAX_EXTRA (14000)
224#else
225#define SSL3_RT_MAX_EXTRA (16384)
226#endif
227
228#define SSL3_RT_MAX_PLAIN_LENGTH 16384
229#define SSL3_RT_MAX_COMPRESSED_LENGTH (1024+SSL3_RT_MAX_PLAIN_LENGTH)
230#define SSL3_RT_MAX_ENCRYPTED_LENGTH (1024+SSL3_RT_MAX_COMPRESSED_LENGTH)
231#define SSL3_RT_MAX_PACKET_SIZE (SSL3_RT_MAX_ENCRYPTED_LENGTH+SSL3_RT_HEADER_LENGTH)
232#define SSL3_RT_MAX_DATA_SIZE (1024*1024)
233
234#define SSL3_MD_CLIENT_FINISHED_CONST "\x43\x4C\x4E\x54"
235#define SSL3_MD_SERVER_FINISHED_CONST "\x53\x52\x56\x52"
236
237#define SSL3_VERSION 0x0300
238#define SSL3_VERSION_MAJOR 0x03
239#define SSL3_VERSION_MINOR 0x00
240
241#define SSL3_RT_CHANGE_CIPHER_SPEC 20
242#define SSL3_RT_ALERT 21
243#define SSL3_RT_HANDSHAKE 22
244#define SSL3_RT_APPLICATION_DATA 23
245
246#define SSL3_AL_WARNING 1
247#define SSL3_AL_FATAL 2
248
249#define SSL3_AD_CLOSE_NOTIFY 0
250#define SSL3_AD_UNEXPECTED_MESSAGE 10 /* fatal */
251#define SSL3_AD_BAD_RECORD_MAC 20 /* fatal */
252#define SSL3_AD_DECOMPRESSION_FAILURE 30 /* fatal */
253#define SSL3_AD_HANDSHAKE_FAILURE 40 /* fatal */
254#define SSL3_AD_NO_CERTIFICATE 41
255#define SSL3_AD_BAD_CERTIFICATE 42
256#define SSL3_AD_UNSUPPORTED_CERTIFICATE 43
257#define SSL3_AD_CERTIFICATE_REVOKED 44
258#define SSL3_AD_CERTIFICATE_EXPIRED 45
259#define SSL3_AD_CERTIFICATE_UNKNOWN 46
260#define SSL3_AD_ILLEGAL_PARAMETER 47 /* fatal */
261
262typedef struct ssl3_record_st
263 {
264/*r */ int type; /* type of record */
265/*rw*/ unsigned int length; /* How many bytes available */
266/*r */ unsigned int off; /* read/write offset into 'buf' */
267/*rw*/ unsigned char *data; /* pointer to the record data */
268/*rw*/ unsigned char *input; /* where the decode bytes are */
269/*r */ unsigned char *comp; /* only used with decompression - malloc()ed */
270 } SSL3_RECORD;
271
272typedef struct ssl3_buffer_st
273 {
274 unsigned char *buf; /* at least SSL3_RT_MAX_PACKET_SIZE bytes,
275 * see ssl3_setup_buffers() */
276 size_t len; /* buffer size */
277 int offset; /* where to 'copy from' */
278 int left; /* how many bytes left */
279 } SSL3_BUFFER;
280
281#define SSL3_CT_RSA_SIGN 1
282#define SSL3_CT_DSS_SIGN 2
283#define SSL3_CT_RSA_FIXED_DH 3
284#define SSL3_CT_DSS_FIXED_DH 4
285#define SSL3_CT_RSA_EPHEMERAL_DH 5
286#define SSL3_CT_DSS_EPHEMERAL_DH 6
287#define SSL3_CT_FORTEZZA_DMS 20
288#define SSL3_CT_NUMBER 7
289
290#define SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS 0x0001
291#define SSL3_FLAGS_DELAY_CLIENT_FINISHED 0x0002
292#define SSL3_FLAGS_POP_BUFFER 0x0004
293#define TLS1_FLAGS_TLS_PADDING_BUG 0x0008
294
295typedef struct ssl3_state_st
296 {
297 long flags;
298 int delay_buf_pop_ret;
299
300 unsigned char read_sequence[8];
301 unsigned char read_mac_secret[EVP_MAX_MD_SIZE];
302 unsigned char write_sequence[8];
303 unsigned char write_mac_secret[EVP_MAX_MD_SIZE];
304
305 unsigned char server_random[SSL3_RANDOM_SIZE];
306 unsigned char client_random[SSL3_RANDOM_SIZE];
307
308 /* flags for countermeasure against known-IV weakness */
309 int need_empty_fragments;
310 int empty_fragment_done;
311
312 SSL3_BUFFER rbuf; /* read IO goes into here */
313 SSL3_BUFFER wbuf; /* write IO goes into here */
314
315 SSL3_RECORD rrec; /* each decoded record goes in here */
316 SSL3_RECORD wrec; /* goes out from here */
317
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;
324
325 /* partial write - check the numbers match */
326 unsigned int wnum; /* number of bytes sent so far */
327 int wpend_tot; /* number bytes written */
328 int wpend_type;
329 int wpend_ret; /* number of bytes submitted */
330 const unsigned char *wpend_buf;
331
332 /* used during startup, digest all incoming/outgoing packets */
333 EVP_MD_CTX finish_dgst1;
334 EVP_MD_CTX finish_dgst2;
335
336 /* this is set whenerver we see a change_cipher_spec message
337 * come in when we are not looking for one */
338 int change_cipher_spec;
339
340 int warn_alert;
341 int fatal_alert;
342 /* we allow one fatal and one warning alert to be outstanding,
343 * send close alert via the warning alert */
344 int alert_dispatch;
345 unsigned char send_alert[2];
346
347 /* This flag is set when we should renegotiate ASAP, basically when
348 * there is no more data in the read or write buffers */
349 int renegotiate;
350 int total_renegotiations;
351 int num_renegotiations;
352
353 int in_read_app_data;
354
355 struct {
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 */
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;
364
365 unsigned long message_size;
366 int message_type;
367
368 /* used to hold the new cipher we are going to use */
369 SSL_CIPHER *new_cipher;
370#ifndef OPENSSL_NO_DH
371 DH *dh;
372#endif
373 /* used when SSL_ST_FLUSH_DATA is entered */
374 int next_state;
375
376 int reuse_message;
377
378 /* used for certificate requests */
379 int cert_req;
380 int ctype_num;
381 char ctype[SSL3_CT_NUMBER];
382 STACK_OF(X509_NAME) *ca_names;
383
384 int use_rsa_tmp;
385
386 int key_block_length;
387 unsigned char *key_block;
388
389 const EVP_CIPHER *new_sym_enc;
390 const EVP_MD *new_hash;
391#ifndef OPENSSL_NO_COMP
392 const SSL_COMP *new_compression;
393#else
394 char *new_compression;
395#endif
396 int cert_request;
397 } tmp;
398
399 } SSL3_STATE;
400
401/* SSLv3 */
402/*client */
403/* extra state */
404#define SSL3_ST_CW_FLUSH (0x100|SSL_ST_CONNECT)
405/* write to server */
406#define SSL3_ST_CW_CLNT_HELLO_A (0x110|SSL_ST_CONNECT)
407#define SSL3_ST_CW_CLNT_HELLO_B (0x111|SSL_ST_CONNECT)
408/* read from server */
409#define SSL3_ST_CR_SRVR_HELLO_A (0x120|SSL_ST_CONNECT)
410#define SSL3_ST_CR_SRVR_HELLO_B (0x121|SSL_ST_CONNECT)
411#define SSL3_ST_CR_CERT_A (0x130|SSL_ST_CONNECT)
412#define SSL3_ST_CR_CERT_B (0x131|SSL_ST_CONNECT)
413#define SSL3_ST_CR_KEY_EXCH_A (0x140|SSL_ST_CONNECT)
414#define SSL3_ST_CR_KEY_EXCH_B (0x141|SSL_ST_CONNECT)
415#define SSL3_ST_CR_CERT_REQ_A (0x150|SSL_ST_CONNECT)
416#define SSL3_ST_CR_CERT_REQ_B (0x151|SSL_ST_CONNECT)
417#define SSL3_ST_CR_SRVR_DONE_A (0x160|SSL_ST_CONNECT)
418#define SSL3_ST_CR_SRVR_DONE_B (0x161|SSL_ST_CONNECT)
419/* write to server */
420#define SSL3_ST_CW_CERT_A (0x170|SSL_ST_CONNECT)
421#define SSL3_ST_CW_CERT_B (0x171|SSL_ST_CONNECT)
422#define SSL3_ST_CW_CERT_C (0x172|SSL_ST_CONNECT)
423#define SSL3_ST_CW_CERT_D (0x173|SSL_ST_CONNECT)
424#define SSL3_ST_CW_KEY_EXCH_A (0x180|SSL_ST_CONNECT)
425#define SSL3_ST_CW_KEY_EXCH_B (0x181|SSL_ST_CONNECT)
426#define SSL3_ST_CW_CERT_VRFY_A (0x190|SSL_ST_CONNECT)
427#define SSL3_ST_CW_CERT_VRFY_B (0x191|SSL_ST_CONNECT)
428#define SSL3_ST_CW_CHANGE_A (0x1A0|SSL_ST_CONNECT)
429#define SSL3_ST_CW_CHANGE_B (0x1A1|SSL_ST_CONNECT)
430#define SSL3_ST_CW_FINISHED_A (0x1B0|SSL_ST_CONNECT)
431#define SSL3_ST_CW_FINISHED_B (0x1B1|SSL_ST_CONNECT)
432/* read from server */
433#define SSL3_ST_CR_CHANGE_A (0x1C0|SSL_ST_CONNECT)
434#define SSL3_ST_CR_CHANGE_B (0x1C1|SSL_ST_CONNECT)
435#define SSL3_ST_CR_FINISHED_A (0x1D0|SSL_ST_CONNECT)
436#define SSL3_ST_CR_FINISHED_B (0x1D1|SSL_ST_CONNECT)
437
438/* server */
439/* extra state */
440#define SSL3_ST_SW_FLUSH (0x100|SSL_ST_ACCEPT)
441/* read from client */
442/* Do not change the number values, they do matter */
443#define SSL3_ST_SR_CLNT_HELLO_A (0x110|SSL_ST_ACCEPT)
444#define SSL3_ST_SR_CLNT_HELLO_B (0x111|SSL_ST_ACCEPT)
445#define SSL3_ST_SR_CLNT_HELLO_C (0x112|SSL_ST_ACCEPT)
446/* write to client */
447#define SSL3_ST_SW_HELLO_REQ_A (0x120|SSL_ST_ACCEPT)
448#define SSL3_ST_SW_HELLO_REQ_B (0x121|SSL_ST_ACCEPT)
449#define SSL3_ST_SW_HELLO_REQ_C (0x122|SSL_ST_ACCEPT)
450#define SSL3_ST_SW_SRVR_HELLO_A (0x130|SSL_ST_ACCEPT)
451#define SSL3_ST_SW_SRVR_HELLO_B (0x131|SSL_ST_ACCEPT)
452#define SSL3_ST_SW_CERT_A (0x140|SSL_ST_ACCEPT)
453#define SSL3_ST_SW_CERT_B (0x141|SSL_ST_ACCEPT)
454#define SSL3_ST_SW_KEY_EXCH_A (0x150|SSL_ST_ACCEPT)
455#define SSL3_ST_SW_KEY_EXCH_B (0x151|SSL_ST_ACCEPT)
456#define SSL3_ST_SW_CERT_REQ_A (0x160|SSL_ST_ACCEPT)
457#define SSL3_ST_SW_CERT_REQ_B (0x161|SSL_ST_ACCEPT)
458#define SSL3_ST_SW_SRVR_DONE_A (0x170|SSL_ST_ACCEPT)
459#define SSL3_ST_SW_SRVR_DONE_B (0x171|SSL_ST_ACCEPT)
460/* read from client */
461#define SSL3_ST_SR_CERT_A (0x180|SSL_ST_ACCEPT)
462#define SSL3_ST_SR_CERT_B (0x181|SSL_ST_ACCEPT)
463#define SSL3_ST_SR_KEY_EXCH_A (0x190|SSL_ST_ACCEPT)
464#define SSL3_ST_SR_KEY_EXCH_B (0x191|SSL_ST_ACCEPT)
465#define SSL3_ST_SR_CERT_VRFY_A (0x1A0|SSL_ST_ACCEPT)
466#define SSL3_ST_SR_CERT_VRFY_B (0x1A1|SSL_ST_ACCEPT)
467#define SSL3_ST_SR_CHANGE_A (0x1B0|SSL_ST_ACCEPT)
468#define SSL3_ST_SR_CHANGE_B (0x1B1|SSL_ST_ACCEPT)
469#define SSL3_ST_SR_FINISHED_A (0x1C0|SSL_ST_ACCEPT)
470#define SSL3_ST_SR_FINISHED_B (0x1C1|SSL_ST_ACCEPT)
471/* write to client */
472#define SSL3_ST_SW_CHANGE_A (0x1D0|SSL_ST_ACCEPT)
473#define SSL3_ST_SW_CHANGE_B (0x1D1|SSL_ST_ACCEPT)
474#define SSL3_ST_SW_FINISHED_A (0x1E0|SSL_ST_ACCEPT)
475#define SSL3_ST_SW_FINISHED_B (0x1E1|SSL_ST_ACCEPT)
476
477#define SSL3_MT_HELLO_REQUEST 0
478#define SSL3_MT_CLIENT_HELLO 1
479#define SSL3_MT_SERVER_HELLO 2
480#define SSL3_MT_CERTIFICATE 11
481#define SSL3_MT_SERVER_KEY_EXCHANGE 12
482#define SSL3_MT_CERTIFICATE_REQUEST 13
483#define SSL3_MT_SERVER_DONE 14
484#define SSL3_MT_CERTIFICATE_VERIFY 15
485#define SSL3_MT_CLIENT_KEY_EXCHANGE 16
486#define SSL3_MT_FINISHED 20
487
488#define SSL3_MT_CCS 1
489
490/* These are used when changing over to a new cipher */
491#define SSL3_CC_READ 0x01
492#define SSL3_CC_WRITE 0x02
493#define SSL3_CC_CLIENT 0x10
494#define SSL3_CC_SERVER 0x20
495#define SSL3_CHANGE_CIPHER_CLIENT_WRITE (SSL3_CC_CLIENT|SSL3_CC_WRITE)
496#define SSL3_CHANGE_CIPHER_SERVER_READ (SSL3_CC_SERVER|SSL3_CC_READ)
497#define SSL3_CHANGE_CIPHER_CLIENT_READ (SSL3_CC_CLIENT|SSL3_CC_READ)
498#define SSL3_CHANGE_CIPHER_SERVER_WRITE (SSL3_CC_SERVER|SSL3_CC_WRITE)
499
500#ifdef __cplusplus
501}
502#endif
503#endif
504
diff --git a/src/lib/libssl/ssl_algs.c b/src/lib/libssl/ssl_algs.c
deleted file mode 100644
index 3d1299ee7b..0000000000
--- a/src/lib/libssl/ssl_algs.c
+++ /dev/null
@@ -1,111 +0,0 @@
1/* ssl/ssl_algs.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include <openssl/objects.h>
61#include <openssl/lhash.h>
62#include "ssl_locl.h"
63
64int SSL_library_init(void)
65 {
66
67#ifndef OPENSSL_NO_DES
68 EVP_add_cipher(EVP_des_cbc());
69 EVP_add_cipher(EVP_des_ede3_cbc());
70#endif
71#ifndef OPENSSL_NO_IDEA
72 EVP_add_cipher(EVP_idea_cbc());
73#endif
74#ifndef OPENSSL_NO_RC4
75 EVP_add_cipher(EVP_rc4());
76#endif
77#ifndef OPENSSL_NO_RC2
78 EVP_add_cipher(EVP_rc2_cbc());
79#endif
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
89 EVP_add_digest(EVP_md5());
90 EVP_add_digest_alias(SN_md5,"ssl2-md5");
91 EVP_add_digest_alias(SN_md5,"ssl3-md5");
92#endif
93#ifndef OPENSSL_NO_SHA
94 EVP_add_digest(EVP_sha1()); /* RSA with sha1 */
95 EVP_add_digest_alias(SN_sha1,"ssl3-sha1");
96 EVP_add_digest_alias(SN_sha1WithRSAEncryption,SN_sha1WithRSA);
97#endif
98#if !defined(OPENSSL_NO_SHA) && !defined(OPENSSL_NO_DSA)
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");
103#endif
104 /* If you want support for phased out ciphers, add the following */
105#if 0
106 EVP_add_digest(EVP_sha());
107 EVP_add_digest(EVP_dss());
108#endif
109 return(1);
110 }
111
diff --git a/src/lib/libssl/ssl_asn1.c b/src/lib/libssl/ssl_asn1.c
deleted file mode 100644
index 23bfe44e21..0000000000
--- a/src/lib/libssl/ssl_asn1.c
+++ /dev/null
@@ -1,391 +0,0 @@
1/* ssl/ssl_asn1.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include <stdlib.h>
61#include "ssl_locl.h"
62#include <openssl/asn1_mac.h>
63#include <openssl/objects.h>
64#include <openssl/x509.h>
65
66typedef struct ssl_session_asn1_st
67 {
68 ASN1_INTEGER version;
69 ASN1_INTEGER ssl_version;
70 ASN1_OCTET_STRING cipher;
71 ASN1_OCTET_STRING master_key;
72 ASN1_OCTET_STRING session_id;
73 ASN1_OCTET_STRING session_id_context;
74 ASN1_OCTET_STRING key_arg;
75#ifndef OPENSSL_NO_KRB5
76 ASN1_OCTET_STRING krb5_princ;
77#endif /* OPENSSL_NO_KRB5 */
78 ASN1_INTEGER time;
79 ASN1_INTEGER timeout;
80 ASN1_INTEGER verify_result;
81 } SSL_SESSION_ASN1;
82
83int i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp)
84 {
85#define LSIZE2 (sizeof(long)*2)
86 int v1=0,v2=0,v3=0,v4=0,v5=0;
87 unsigned char buf[4],ibuf1[LSIZE2],ibuf2[LSIZE2];
88 unsigned char ibuf3[LSIZE2],ibuf4[LSIZE2],ibuf5[LSIZE2];
89 long l;
90 SSL_SESSION_ASN1 a;
91 M_ASN1_I2D_vars(in);
92
93 if ((in == NULL) || ((in->cipher == NULL) && (in->cipher_id == 0)))
94 return(0);
95
96 /* Note that I cheat in the following 2 assignments. I know
97 * that if the ASN1_INTEGER passed to ASN1_INTEGER_set
98 * is > sizeof(long)+1, the buffer will not be re-OPENSSL_malloc()ed.
99 * This is a bit evil but makes things simple, no dynamic allocation
100 * to clean up :-) */
101 a.version.length=LSIZE2;
102 a.version.type=V_ASN1_INTEGER;
103 a.version.data=ibuf1;
104 ASN1_INTEGER_set(&(a.version),SSL_SESSION_ASN1_VERSION);
105
106 a.ssl_version.length=LSIZE2;
107 a.ssl_version.type=V_ASN1_INTEGER;
108 a.ssl_version.data=ibuf2;
109 ASN1_INTEGER_set(&(a.ssl_version),in->ssl_version);
110
111 a.cipher.type=V_ASN1_OCTET_STRING;
112 a.cipher.data=buf;
113
114 if (in->cipher == NULL)
115 l=in->cipher_id;
116 else
117 l=in->cipher->id;
118 if (in->ssl_version == SSL2_VERSION)
119 {
120 a.cipher.length=3;
121 buf[0]=((unsigned char)(l>>16L))&0xff;
122 buf[1]=((unsigned char)(l>> 8L))&0xff;
123 buf[2]=((unsigned char)(l ))&0xff;
124 }
125 else
126 {
127 a.cipher.length=2;
128 buf[0]=((unsigned char)(l>>8L))&0xff;
129 buf[1]=((unsigned char)(l ))&0xff;
130 }
131
132 a.master_key.length=in->master_key_length;
133 a.master_key.type=V_ASN1_OCTET_STRING;
134 a.master_key.data=in->master_key;
135
136 a.session_id.length=in->session_id_length;
137 a.session_id.type=V_ASN1_OCTET_STRING;
138 a.session_id.data=in->session_id;
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
144 a.key_arg.length=in->key_arg_length;
145 a.key_arg.type=V_ASN1_OCTET_STRING;
146 a.key_arg.data=in->key_arg;
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
157 if (in->time != 0L)
158 {
159 a.time.length=LSIZE2;
160 a.time.type=V_ASN1_INTEGER;
161 a.time.data=ibuf3;
162 ASN1_INTEGER_set(&(a.time),in->time);
163 }
164
165 if (in->timeout != 0L)
166 {
167 a.timeout.length=LSIZE2;
168 a.timeout.type=V_ASN1_INTEGER;
169 a.timeout.data=ibuf4;
170 ASN1_INTEGER_set(&(a.timeout),in->timeout);
171 }
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
182 M_ASN1_I2D_len(&(a.version), i2d_ASN1_INTEGER);
183 M_ASN1_I2D_len(&(a.ssl_version), i2d_ASN1_INTEGER);
184 M_ASN1_I2D_len(&(a.cipher), i2d_ASN1_OCTET_STRING);
185 M_ASN1_I2D_len(&(a.session_id), 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 */
191 if (in->key_arg_length > 0)
192 M_ASN1_I2D_len_IMP_opt(&(a.key_arg),i2d_ASN1_OCTET_STRING);
193 if (in->time != 0L)
194 M_ASN1_I2D_len_EXP_opt(&(a.time),i2d_ASN1_INTEGER,1,v1);
195 if (in->timeout != 0L)
196 M_ASN1_I2D_len_EXP_opt(&(a.timeout),i2d_ASN1_INTEGER,2,v2);
197 if (in->peer != NULL)
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);
202
203 M_ASN1_I2D_seq_total();
204
205 M_ASN1_I2D_put(&(a.version), i2d_ASN1_INTEGER);
206 M_ASN1_I2D_put(&(a.ssl_version), i2d_ASN1_INTEGER);
207 M_ASN1_I2D_put(&(a.cipher), i2d_ASN1_OCTET_STRING);
208 M_ASN1_I2D_put(&(a.session_id), 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 */
214 if (in->key_arg_length > 0)
215 M_ASN1_I2D_put_IMP_opt(&(a.key_arg),i2d_ASN1_OCTET_STRING,0);
216 if (in->time != 0L)
217 M_ASN1_I2D_put_EXP_opt(&(a.time),i2d_ASN1_INTEGER,1,v1);
218 if (in->timeout != 0L)
219 M_ASN1_I2D_put_EXP_opt(&(a.timeout),i2d_ASN1_INTEGER,2,v2);
220 if (in->peer != NULL)
221 M_ASN1_I2D_put_EXP_opt(in->peer,i2d_X509,3,v3);
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);
226 M_ASN1_I2D_finish();
227 }
228
229SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, unsigned char **pp,
230 long length)
231 {
232 int version,ssl_version=0,i;
233 long id;
234 ASN1_INTEGER ai,*aip;
235 ASN1_OCTET_STRING os,*osp;
236 M_ASN1_D2I_vars(a,SSL_SESSION *,SSL_SESSION_new);
237
238 aip= &ai;
239 osp= &os;
240
241 M_ASN1_D2I_Init();
242 M_ASN1_D2I_start_sequence();
243
244 ai.data=NULL; ai.length=0;
245 M_ASN1_D2I_get(aip,d2i_ASN1_INTEGER);
246 version=(int)ASN1_INTEGER_get(aip);
247 if (ai.data != NULL) { OPENSSL_free(ai.data); ai.data=NULL; ai.length=0; }
248
249 /* we don't care about the version right now :-) */
250 M_ASN1_D2I_get(aip,d2i_ASN1_INTEGER);
251 ssl_version=(int)ASN1_INTEGER_get(aip);
252 ret->ssl_version=ssl_version;
253 if (ai.data != NULL) { OPENSSL_free(ai.data); ai.data=NULL; ai.length=0; }
254
255 os.data=NULL; os.length=0;
256 M_ASN1_D2I_get(osp,d2i_ASN1_OCTET_STRING);
257 if (ssl_version == SSL2_VERSION)
258 {
259 if (os.length != 3)
260 {
261 c.error=SSL_R_CIPHER_CODE_WRONG_LENGTH;
262 goto err;
263 }
264 id=0x02000000L|
265 ((unsigned long)os.data[0]<<16L)|
266 ((unsigned long)os.data[1]<< 8L)|
267 (unsigned long)os.data[2];
268 }
269 else if ((ssl_version>>8) == 3)
270 {
271 if (os.length != 2)
272 {
273 c.error=SSL_R_CIPHER_CODE_WRONG_LENGTH;
274 goto err;
275 }
276 id=0x03000000L|
277 ((unsigned long)os.data[0]<<8L)|
278 (unsigned long)os.data[1];
279 }
280 else
281 {
282 SSLerr(SSL_F_D2I_SSL_SESSION,SSL_R_UNKNOWN_SSL_VERSION);
283 return(NULL);
284 }
285
286 ret->cipher=NULL;
287 ret->cipher_id=id;
288
289 M_ASN1_D2I_get(osp,d2i_ASN1_OCTET_STRING);
290 if ((ssl_version>>8) == SSL3_VERSION)
291 i=SSL3_MAX_SSL_SESSION_ID_LENGTH;
292 else /* if (ssl_version == SSL2_VERSION) */
293 i=SSL2_MAX_SSL_SESSION_ID_LENGTH;
294
295 if (os.length > i)
296 os.length = i;
297 if (os.length > sizeof ret->session_id) /* can't happen */
298 os.length = sizeof ret->session_id;
299
300 ret->session_id_length=os.length;
301 memcpy(ret->session_id,os.data,os.length);
302
303 M_ASN1_D2I_get(osp,d2i_ASN1_OCTET_STRING);
304 if (ret->master_key_length > SSL_MAX_MASTER_KEY_LENGTH)
305 ret->master_key_length=SSL_MAX_MASTER_KEY_LENGTH;
306 else
307 ret->master_key_length=os.length;
308 memcpy(ret->master_key,os.data,ret->master_key_length);
309
310 os.length=0;
311
312#ifndef OPENSSL_NO_KRB5
313 os.length=0;
314 M_ASN1_D2I_get_opt(osp,d2i_ASN1_OCTET_STRING,V_ASN1_OCTET_STRING);
315 if (os.data)
316 {
317 if (os.length > SSL_MAX_KRB5_PRINCIPAL_LENGTH)
318 ret->krb5_client_princ_len=0;
319 else
320 ret->krb5_client_princ_len=os.length;
321 memcpy(ret->krb5_client_princ,os.data,ret->krb5_client_princ_len);
322 OPENSSL_free(os.data);
323 os.data = NULL;
324 os.length = 0;
325 }
326 else
327 ret->krb5_client_princ_len=0;
328#endif /* OPENSSL_NO_KRB5 */
329
330 M_ASN1_D2I_get_IMP_opt(osp,d2i_ASN1_OCTET_STRING,0,V_ASN1_OCTET_STRING);
331 if (os.length > SSL_MAX_KEY_ARG_LENGTH)
332 ret->key_arg_length=SSL_MAX_KEY_ARG_LENGTH;
333 else
334 ret->key_arg_length=os.length;
335 memcpy(ret->key_arg,os.data,ret->key_arg_length);
336 if (os.data != NULL) OPENSSL_free(os.data);
337
338 ai.length=0;
339 M_ASN1_D2I_get_EXP_opt(aip,d2i_ASN1_INTEGER,1);
340 if (ai.data != NULL)
341 {
342 ret->time=ASN1_INTEGER_get(aip);
343 OPENSSL_free(ai.data); ai.data=NULL; ai.length=0;
344 }
345 else
346 ret->time=time(NULL);
347
348 ai.length=0;
349 M_ASN1_D2I_get_EXP_opt(aip,d2i_ASN1_INTEGER,2);
350 if (ai.data != NULL)
351 {
352 ret->timeout=ASN1_INTEGER_get(aip);
353 OPENSSL_free(ai.data); ai.data=NULL; ai.length=0;
354 }
355 else
356 ret->timeout=3;
357
358 if (ret->peer != NULL)
359 {
360 X509_free(ret->peer);
361 ret->peer=NULL;
362 }
363 M_ASN1_D2I_get_EXP_opt(ret->peer,d2i_X509,3);
364
365 os.length=0;
366 os.data=NULL;
367 M_ASN1_D2I_get_EXP_opt(osp,d2i_ASN1_OCTET_STRING,4);
368
369 if(os.data != NULL)
370 {
371 if (os.length > SSL_MAX_SID_CTX_LENGTH)
372 SSLerr(SSL_F_D2I_SSL_SESSION,SSL_R_BAD_LENGTH);
373 ret->sid_ctx_length=os.length;
374 memcpy(ret->sid_ctx,os.data,os.length);
375 OPENSSL_free(os.data); os.data=NULL; os.length=0;
376 }
377 else
378 ret->sid_ctx_length=0;
379
380 ai.length=0;
381 M_ASN1_D2I_get_EXP_opt(aip,d2i_ASN1_INTEGER,5);
382 if (ai.data != NULL)
383 {
384 ret->verify_result=ASN1_INTEGER_get(aip);
385 OPENSSL_free(ai.data); ai.data=NULL; ai.length=0;
386 }
387 else
388 ret->verify_result=X509_V_OK;
389
390 M_ASN1_D2I_Finish(a,SSL_SESSION_free,SSL_F_D2I_SSL_SESSION);
391 }
diff --git a/src/lib/libssl/ssl_cert.c b/src/lib/libssl/ssl_cert.c
deleted file mode 100644
index 3d31bbf05f..0000000000
--- a/src/lib/libssl/ssl_cert.c
+++ /dev/null
@@ -1,832 +0,0 @@
1/*! \file ssl/ssl_cert.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58/* ====================================================================
59 * Copyright (c) 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 */
106
107#include <stdio.h>
108
109#include "e_os.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>
131#include "ssl_locl.h"
132
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)
155 {
156 CERT *ret;
157
158 ret=(CERT *)OPENSSL_malloc(sizeof(CERT));
159 if (ret == NULL)
160 {
161 SSLerr(SSL_F_SSL_CERT_NEW,ERR_R_MALLOC_FAILURE);
162 return(NULL);
163 }
164 memset(ret,0,sizeof(CERT));
165
166 ret->key= &(ret->pkeys[SSL_PKEY_RSA_ENC]);
167 ret->references=1;
168
169 return(ret);
170 }
171
172CERT *ssl_cert_dup(CERT *cert)
173 {
174 CERT *ret;
175 int i;
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
317 i=CRYPTO_add(&c->references,-1,CRYPTO_LOCK_SSL_CERT);
318#ifdef REF_PRINT
319 REF_PRINT("CERT",c);
320#endif
321 if (i > 0) return;
322#ifdef REF_CHECK
323 if (i < 0)
324 {
325 fprintf(stderr,"ssl_cert_free, bad reference count\n");
326 abort(); /* ok */
327 }
328#endif
329
330#ifndef OPENSSL_NO_RSA
331 if (c->rsa_tmp) RSA_free(c->rsa_tmp);
332#endif
333#ifndef OPENSSL_NO_DH
334 if (c->dh_tmp) DH_free(c->dh_tmp);
335#endif
336
337 for (i=0; i<SSL_PKEY_NUM; i++)
338 {
339 if (c->pkeys[i].x509 != NULL)
340 X509_free(c->pkeys[i].x509);
341 if (c->pkeys[i].privatekey != NULL)
342 EVP_PKEY_free(c->pkeys[i].privatekey);
343#if 0
344 if (c->pkeys[i].publickey != NULL)
345 EVP_PKEY_free(c->pkeys[i].publickey);
346#endif
347 }
348 OPENSSL_free(c);
349 }
350
351int ssl_cert_inst(CERT **o)
352 {
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 }
376 return(1);
377 }
378
379
380SESS_CERT *ssl_sess_cert_new(void)
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)
453 {
454 X509 *x;
455 int i;
456 X509_STORE_CTX ctx;
457
458 if ((sk == NULL) || (sk_X509_num(sk) == 0))
459 return(0);
460
461 x=sk_X509_value(sk,0);
462 if(!X509_STORE_CTX_init(&ctx,s->ctx->cert_store,x,sk))
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);
484
485 if (s->ctx->app_verify_callback != NULL)
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
491 else
492 {
493#ifndef OPENSSL_NO_X509_VERIFY
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 }
501
502 s->verify_result=ctx.error;
503 X509_STORE_CTX_cleanup(&ctx);
504
505 return(i);
506 }
507
508static void set_client_CA_list(STACK_OF(X509_NAME) **ca_list,STACK_OF(X509_NAME) *list)
509 {
510 if (*ca_list != NULL)
511 sk_X509_NAME_pop_free(*ca_list,X509_NAME_free);
512
513 *ca_list=list;
514 }
515
516STACK_OF(X509_NAME) *SSL_dup_CA_list(STACK_OF(X509_NAME) *sk)
517 {
518 int i;
519 STACK_OF(X509_NAME) *ret;
520 X509_NAME *name;
521
522 ret=sk_X509_NAME_new_null();
523 for (i=0; i<sk_X509_NAME_num(sk); i++)
524 {
525 name=X509_NAME_dup(sk_X509_NAME_value(sk,i));
526 if ((name == NULL) || !sk_X509_NAME_push(ret,name))
527 {
528 sk_X509_NAME_pop_free(ret,X509_NAME_free);
529 return(NULL);
530 }
531 }
532 return(ret);
533 }
534
535void SSL_set_client_CA_list(SSL *s,STACK_OF(X509_NAME) *list)
536 {
537 set_client_CA_list(&(s->client_CA),list);
538 }
539
540void SSL_CTX_set_client_CA_list(SSL_CTX *ctx,STACK_OF(X509_NAME) *list)
541 {
542 set_client_CA_list(&(ctx->client_CA),list);
543 }
544
545STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(SSL_CTX *ctx)
546 {
547 return(ctx->client_CA);
548 }
549
550STACK_OF(X509_NAME) *SSL_get_client_CA_list(SSL *s)
551 {
552 if (s->type == SSL_ST_CONNECT)
553 { /* we are in the client */
554 if (((s->version>>8) == SSL3_VERSION_MAJOR) &&
555 (s->s3 != NULL))
556 return(s->s3->tmp.ca_names);
557 else
558 return(NULL);
559 }
560 else
561 {
562 if (s->client_CA != NULL)
563 return(s->client_CA);
564 else
565 return(s->ctx->client_CA);
566 }
567 }
568
569static int add_client_CA(STACK_OF(X509_NAME) **sk,X509 *x)
570 {
571 X509_NAME *name;
572
573 if (x == NULL) return(0);
574 if ((*sk == NULL) && ((*sk=sk_X509_NAME_new_null()) == NULL))
575 return(0);
576
577 if ((name=X509_NAME_dup(X509_get_subject_name(x))) == NULL)
578 return(0);
579
580 if (!sk_X509_NAME_push(*sk,name))
581 {
582 X509_NAME_free(name);
583 return(0);
584 }
585 return(1);
586 }
587
588int SSL_add_client_CA(SSL *ssl,X509 *x)
589 {
590 return(add_client_CA(&(ssl->client_CA),x));
591 }
592
593int SSL_CTX_add_client_CA(SSL_CTX *ctx,X509 *x)
594 {
595 return(add_client_CA(&(ctx->client_CA),x));
596 }
597
598static int xname_cmp(const X509_NAME * const *a, const X509_NAME * const *b)
599 {
600 return(X509_NAME_cmp(*a,*b));
601 }
602
603#ifndef OPENSSL_NO_STDIO
604/*!
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)
613 {
614 BIO *in;
615 X509 *x=NULL;
616 X509_NAME *xn=NULL;
617 STACK_OF(X509_NAME) *ret,*sk;
618
619 ret=sk_X509_NAME_new_null();
620 sk=sk_X509_NAME_new(xname_cmp);
621
622 in=BIO_new(BIO_s_file_internal());
623
624 if ((ret == NULL) || (sk == NULL) || (in == NULL))
625 {
626 SSLerr(SSL_F_SSL_LOAD_CLIENT_CA_FILE,ERR_R_MALLOC_FAILURE);
627 goto err;
628 }
629
630 if (!BIO_read_filename(in,file))
631 goto err;
632
633 for (;;)
634 {
635 if (PEM_read_bio_X509(in,&x,NULL,NULL) == NULL)
636 break;
637 if ((xn=X509_get_subject_name(x)) == NULL) goto err;
638 /* check for duplicates */
639 xn=X509_NAME_dup(xn);
640 if (xn == NULL) goto err;
641 if (sk_X509_NAME_find(sk,xn) >= 0)
642 X509_NAME_free(xn);
643 else
644 {
645 sk_X509_NAME_push(sk,xn);
646 sk_X509_NAME_push(ret,xn);
647 }
648 }
649
650 if (0)
651 {
652err:
653 if (ret != NULL) sk_X509_NAME_pop_free(ret,X509_NAME_free);
654 ret=NULL;
655 }
656 if (sk != NULL) sk_X509_NAME_free(sk);
657 if (in != NULL) BIO_free(in);
658 if (x != NULL) X509_free(x);
659 return(ret);
660 }
661#endif
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
deleted file mode 100644
index df48245b2c..0000000000
--- a/src/lib/libssl/ssl_ciph.c
+++ /dev/null
@@ -1,1139 +0,0 @@
1/* ssl/ssl_ciph.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include <openssl/objects.h>
61#include <openssl/comp.h>
62#include "ssl_locl.h"
63
64#define SSL_ENC_DES_IDX 0
65#define SSL_ENC_3DES_IDX 1
66#define SSL_ENC_RC4_IDX 2
67#define SSL_ENC_RC2_IDX 3
68#define SSL_ENC_IDEA_IDX 4
69#define SSL_ENC_eFZA_IDX 5
70#define SSL_ENC_NULL_IDX 6
71#define SSL_ENC_AES128_IDX 7
72#define SSL_ENC_AES256_IDX 8
73#define SSL_ENC_NUM_IDX 9
74
75static const EVP_CIPHER *ssl_cipher_methods[SSL_ENC_NUM_IDX]={
76 NULL,NULL,NULL,NULL,NULL,NULL,
77 };
78
79static STACK_OF(SSL_COMP) *ssl_comp_methods=NULL;
80
81#define SSL_MD_MD5_IDX 0
82#define SSL_MD_SHA1_IDX 1
83#define SSL_MD_NUM_IDX 2
84static const EVP_MD *ssl_digest_methods[SSL_MD_NUM_IDX]={
85 NULL,NULL,
86 };
87
88#define CIPHER_ADD 1
89#define CIPHER_KILL 2
90#define CIPHER_DEL 3
91#define CIPHER_ORD 4
92#define CIPHER_SPECIAL 5
93
94typedef struct cipher_order_st
95 {
96 SSL_CIPHER *cipher;
97 int active;
98 int dead;
99 struct cipher_order_st *next,*prev;
100 } CIPHER_ORDER;
101
102static const SSL_CIPHER cipher_aliases[]={
103 /* Don't include eNULL unless specifically enabled. */
104 {0,SSL_TXT_ALL, 0,SSL_ALL & ~SSL_eNULL, SSL_ALL ,0,0,0,SSL_ALL,SSL_ALL}, /* must be first */
105 {0,SSL_TXT_CMPALL,0,SSL_eNULL,0,0,0,0,SSL_ENC_MASK,0}, /* COMPLEMENT OF ALL */
106 {0,SSL_TXT_CMPDEF,0,SSL_ADH, 0,0,0,0,SSL_AUTH_MASK,0},
107 {0,SSL_TXT_kKRB5,0,SSL_kKRB5,0,0,0,0,SSL_MKEY_MASK,0}, /* VRS Kerberos5 */
108 {0,SSL_TXT_kRSA,0,SSL_kRSA, 0,0,0,0,SSL_MKEY_MASK,0},
109 {0,SSL_TXT_kDHr,0,SSL_kDHr, 0,0,0,0,SSL_MKEY_MASK,0},
110 {0,SSL_TXT_kDHd,0,SSL_kDHd, 0,0,0,0,SSL_MKEY_MASK,0},
111 {0,SSL_TXT_kEDH,0,SSL_kEDH, 0,0,0,0,SSL_MKEY_MASK,0},
112 {0,SSL_TXT_kFZA,0,SSL_kFZA, 0,0,0,0,SSL_MKEY_MASK,0},
113 {0,SSL_TXT_DH, 0,SSL_DH, 0,0,0,0,SSL_MKEY_MASK,0},
114 {0,SSL_TXT_EDH, 0,SSL_EDH, 0,0,0,0,SSL_MKEY_MASK|SSL_AUTH_MASK,0},
115
116 {0,SSL_TXT_aKRB5,0,SSL_aKRB5,0,0,0,0,SSL_AUTH_MASK,0}, /* VRS Kerberos5 */
117 {0,SSL_TXT_aRSA,0,SSL_aRSA, 0,0,0,0,SSL_AUTH_MASK,0},
118 {0,SSL_TXT_aDSS,0,SSL_aDSS, 0,0,0,0,SSL_AUTH_MASK,0},
119 {0,SSL_TXT_aFZA,0,SSL_aFZA, 0,0,0,0,SSL_AUTH_MASK,0},
120 {0,SSL_TXT_aNULL,0,SSL_aNULL,0,0,0,0,SSL_AUTH_MASK,0},
121 {0,SSL_TXT_aDH, 0,SSL_aDH, 0,0,0,0,SSL_AUTH_MASK,0},
122 {0,SSL_TXT_DSS, 0,SSL_DSS, 0,0,0,0,SSL_AUTH_MASK,0},
123
124 {0,SSL_TXT_DES, 0,SSL_DES, 0,0,0,0,SSL_ENC_MASK,0},
125 {0,SSL_TXT_3DES,0,SSL_3DES, 0,0,0,0,SSL_ENC_MASK,0},
126 {0,SSL_TXT_RC4, 0,SSL_RC4, 0,0,0,0,SSL_ENC_MASK,0},
127 {0,SSL_TXT_RC2, 0,SSL_RC2, 0,0,0,0,SSL_ENC_MASK,0},
128#ifndef OPENSSL_NO_IDEA
129 {0,SSL_TXT_IDEA,0,SSL_IDEA, 0,0,0,0,SSL_ENC_MASK,0},
130#endif
131 {0,SSL_TXT_eNULL,0,SSL_eNULL,0,0,0,0,SSL_ENC_MASK,0},
132 {0,SSL_TXT_eFZA,0,SSL_eFZA, 0,0,0,0,SSL_ENC_MASK,0},
133 {0,SSL_TXT_AES, 0,SSL_AES, 0,0,0,0,SSL_ENC_MASK,0},
134
135 {0,SSL_TXT_MD5, 0,SSL_MD5, 0,0,0,0,SSL_MAC_MASK,0},
136 {0,SSL_TXT_SHA1,0,SSL_SHA1, 0,0,0,0,SSL_MAC_MASK,0},
137 {0,SSL_TXT_SHA, 0,SSL_SHA, 0,0,0,0,SSL_MAC_MASK,0},
138
139 {0,SSL_TXT_NULL,0,SSL_NULL, 0,0,0,0,SSL_ENC_MASK,0},
140 {0,SSL_TXT_KRB5,0,SSL_KRB5, 0,0,0,0,SSL_AUTH_MASK|SSL_MKEY_MASK,0},
141 {0,SSL_TXT_RSA, 0,SSL_RSA, 0,0,0,0,SSL_AUTH_MASK|SSL_MKEY_MASK,0},
142 {0,SSL_TXT_ADH, 0,SSL_ADH, 0,0,0,0,SSL_AUTH_MASK|SSL_MKEY_MASK,0},
143 {0,SSL_TXT_FZA, 0,SSL_FZA, 0,0,0,0,SSL_AUTH_MASK|SSL_MKEY_MASK|SSL_ENC_MASK,0},
144
145 {0,SSL_TXT_SSLV2, 0,SSL_SSLV2, 0,0,0,0,SSL_SSL_MASK,0},
146 {0,SSL_TXT_SSLV3, 0,SSL_SSLV3, 0,0,0,0,SSL_SSL_MASK,0},
147 {0,SSL_TXT_TLSV1, 0,SSL_TLSV1, 0,0,0,0,SSL_SSL_MASK,0},
148
149 {0,SSL_TXT_EXP ,0, 0,SSL_EXPORT, 0,0,0,0,SSL_EXP_MASK},
150 {0,SSL_TXT_EXPORT,0, 0,SSL_EXPORT, 0,0,0,0,SSL_EXP_MASK},
151 {0,SSL_TXT_EXP40, 0, 0, SSL_EXP40, 0,0,0,0,SSL_STRONG_MASK},
152 {0,SSL_TXT_EXP56, 0, 0, SSL_EXP56, 0,0,0,0,SSL_STRONG_MASK},
153 {0,SSL_TXT_LOW, 0, 0, SSL_LOW, 0,0,0,0,SSL_STRONG_MASK},
154 {0,SSL_TXT_MEDIUM,0, 0,SSL_MEDIUM, 0,0,0,0,SSL_STRONG_MASK},
155 {0,SSL_TXT_HIGH, 0, 0, SSL_HIGH, 0,0,0,0,SSL_STRONG_MASK},
156 };
157
158static int init_ciphers=1;
159
160static void load_ciphers(void)
161 {
162 init_ciphers=0;
163 ssl_cipher_methods[SSL_ENC_DES_IDX]=
164 EVP_get_cipherbyname(SN_des_cbc);
165 ssl_cipher_methods[SSL_ENC_3DES_IDX]=
166 EVP_get_cipherbyname(SN_des_ede3_cbc);
167 ssl_cipher_methods[SSL_ENC_RC4_IDX]=
168 EVP_get_cipherbyname(SN_rc4);
169 ssl_cipher_methods[SSL_ENC_RC2_IDX]=
170 EVP_get_cipherbyname(SN_rc2_cbc);
171#ifndef OPENSSL_NO_IDEA
172 ssl_cipher_methods[SSL_ENC_IDEA_IDX]=
173 EVP_get_cipherbyname(SN_idea_cbc);
174#else
175 ssl_cipher_methods[SSL_ENC_IDEA_IDX]= NULL;
176#endif
177 ssl_cipher_methods[SSL_ENC_AES128_IDX]=
178 EVP_get_cipherbyname(SN_aes_128_cbc);
179 ssl_cipher_methods[SSL_ENC_AES256_IDX]=
180 EVP_get_cipherbyname(SN_aes_256_cbc);
181
182 ssl_digest_methods[SSL_MD_MD5_IDX]=
183 EVP_get_digestbyname(SN_md5);
184 ssl_digest_methods[SSL_MD_SHA1_IDX]=
185 EVP_get_digestbyname(SN_sha1);
186 }
187
188int ssl_cipher_get_evp(SSL_SESSION *s, const EVP_CIPHER **enc,
189 const EVP_MD **md, SSL_COMP **comp)
190 {
191 int i;
192 SSL_CIPHER *c;
193
194 c=s->cipher;
195 if (c == NULL) return(0);
196 if (comp != NULL)
197 {
198 SSL_COMP ctmp;
199
200 if (s->compress_meth == 0)
201 *comp=NULL;
202 else if (ssl_comp_methods == NULL)
203 {
204 /* bad */
205 *comp=NULL;
206 }
207 else
208 {
209
210 ctmp.id=s->compress_meth;
211 i=sk_SSL_COMP_find(ssl_comp_methods,&ctmp);
212 if (i >= 0)
213 *comp=sk_SSL_COMP_value(ssl_comp_methods,i);
214 else
215 *comp=NULL;
216 }
217 }
218
219 if ((enc == NULL) || (md == NULL)) return(0);
220
221 switch (c->algorithms & SSL_ENC_MASK)
222 {
223 case SSL_DES:
224 i=SSL_ENC_DES_IDX;
225 break;
226 case SSL_3DES:
227 i=SSL_ENC_3DES_IDX;
228 break;
229 case SSL_RC4:
230 i=SSL_ENC_RC4_IDX;
231 break;
232 case SSL_RC2:
233 i=SSL_ENC_RC2_IDX;
234 break;
235 case SSL_IDEA:
236 i=SSL_ENC_IDEA_IDX;
237 break;
238 case SSL_eNULL:
239 i=SSL_ENC_NULL_IDX;
240 break;
241 case SSL_AES:
242 switch(c->alg_bits)
243 {
244 case 128: i=SSL_ENC_AES128_IDX; break;
245 case 256: i=SSL_ENC_AES256_IDX; break;
246 default: i=-1; break;
247 }
248 break;
249 default:
250 i= -1;
251 break;
252 }
253
254 if ((i < 0) || (i > SSL_ENC_NUM_IDX))
255 *enc=NULL;
256 else
257 {
258 if (i == SSL_ENC_NULL_IDX)
259 *enc=EVP_enc_null();
260 else
261 *enc=ssl_cipher_methods[i];
262 }
263
264 switch (c->algorithms & SSL_MAC_MASK)
265 {
266 case SSL_MD5:
267 i=SSL_MD_MD5_IDX;
268 break;
269 case SSL_SHA1:
270 i=SSL_MD_SHA1_IDX;
271 break;
272 default:
273 i= -1;
274 break;
275 }
276 if ((i < 0) || (i > SSL_MD_NUM_IDX))
277 *md=NULL;
278 else
279 *md=ssl_digest_methods[i];
280
281 if ((*enc != NULL) && (*md != NULL))
282 return(1);
283 else
284 return(0);
285 }
286
287#define ITEM_SEP(a) \
288 (((a) == ':') || ((a) == ' ') || ((a) == ';') || ((a) == ','))
289
290static void ll_append_tail(CIPHER_ORDER **head, CIPHER_ORDER *curr,
291 CIPHER_ORDER **tail)
292 {
293 if (curr == *tail) return;
294 if (curr == *head)
295 *head=curr->next;
296 if (curr->prev != NULL)
297 curr->prev->next=curr->next;
298 if (curr->next != NULL) /* should always be true */
299 curr->next->prev=curr->prev;
300 (*tail)->next=curr;
301 curr->prev= *tail;
302 curr->next=NULL;
303 *tail=curr;
304 }
305
306static unsigned long ssl_cipher_get_disabled(void)
307 {
308 unsigned long mask;
309
310 mask = SSL_kFZA;
311#ifdef OPENSSL_NO_RSA
312 mask |= SSL_aRSA|SSL_kRSA;
313#endif
314#ifdef OPENSSL_NO_DSA
315 mask |= SSL_aDSS;
316#endif
317#ifdef OPENSSL_NO_DH
318 mask |= SSL_kDHr|SSL_kDHd|SSL_kEDH|SSL_aDH;
319#endif
320#ifdef OPENSSL_NO_KRB5
321 mask |= SSL_kKRB5|SSL_aKRB5;
322#endif
323
324#ifdef SSL_FORBID_ENULL
325 mask |= SSL_eNULL;
326#endif
327
328 mask |= (ssl_cipher_methods[SSL_ENC_DES_IDX ] == NULL) ? SSL_DES :0;
329 mask |= (ssl_cipher_methods[SSL_ENC_3DES_IDX] == NULL) ? SSL_3DES:0;
330 mask |= (ssl_cipher_methods[SSL_ENC_RC4_IDX ] == NULL) ? SSL_RC4 :0;
331 mask |= (ssl_cipher_methods[SSL_ENC_RC2_IDX ] == NULL) ? SSL_RC2 :0;
332 mask |= (ssl_cipher_methods[SSL_ENC_IDEA_IDX] == NULL) ? SSL_IDEA:0;
333 mask |= (ssl_cipher_methods[SSL_ENC_eFZA_IDX] == NULL) ? SSL_eFZA:0;
334 mask |= (ssl_cipher_methods[SSL_ENC_AES128_IDX] == NULL) ? SSL_AES:0;
335
336 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;
338
339 return(mask);
340 }
341
342static void ssl_cipher_collect_ciphers(const SSL_METHOD *ssl_method,
343 int num_of_ciphers, unsigned long mask, CIPHER_ORDER *list,
344 CIPHER_ORDER **head_p, CIPHER_ORDER **tail_p)
345 {
346 int i, list_num;
347 SSL_CIPHER *c;
348
349 /*
350 * We have num_of_ciphers descriptions compiled in, depending on the
351 * method selected (SSLv2 and/or SSLv3, TLSv1 etc).
352 * These will later be sorted in a linked list with at most num
353 * entries.
354 */
355
356 /* Get the initial list of ciphers */
357 list_num = 0; /* actual count of ciphers */
358 for (i = 0; i < num_of_ciphers; i++)
359 {
360 c = ssl_method->get_cipher(i);
361 /* drop those that use any of that is not available */
362 if ((c != NULL) && c->valid && !(c->algorithms & mask))
363 {
364 list[list_num].cipher = c;
365 list[list_num].next = NULL;
366 list[list_num].prev = NULL;
367 list[list_num].active = 0;
368 list_num++;
369#ifdef KSSL_DEBUG
370 printf("\t%d: %s %lx %lx\n",i,c->name,c->id,c->algorithms);
371#endif /* KSSL_DEBUG */
372 /*
373 if (!sk_push(ca_list,(char *)c)) goto err;
374 */
375 }
376 }
377
378 /*
379 * Prepare linked list from list entries
380 */
381 for (i = 1; i < list_num - 1; i++)
382 {
383 list[i].prev = &(list[i-1]);
384 list[i].next = &(list[i+1]);
385 }
386 if (list_num > 0)
387 {
388 (*head_p) = &(list[0]);
389 (*head_p)->prev = NULL;
390 (*head_p)->next = &(list[1]);
391 (*tail_p) = &(list[list_num - 1]);
392 (*tail_p)->prev = &(list[list_num - 2]);
393 (*tail_p)->next = NULL;
394 }
395 }
396
397static void ssl_cipher_collect_aliases(SSL_CIPHER **ca_list,
398 int num_of_group_aliases, unsigned long mask,
399 CIPHER_ORDER *head)
400 {
401 CIPHER_ORDER *ciph_curr;
402 SSL_CIPHER **ca_curr;
403 int i;
404
405 /*
406 * First, add the real ciphers as already collected
407 */
408 ciph_curr = head;
409 ca_curr = ca_list;
410 while (ciph_curr != NULL)
411 {
412 *ca_curr = ciph_curr->cipher;
413 ca_curr++;
414 ciph_curr = ciph_curr->next;
415 }
416
417 /*
418 * Now we add the available ones from the cipher_aliases[] table.
419 * They represent either an algorithm, that must be fully
420 * supported (not match any bit in mask) or represent a cipher
421 * strength value (will be added in any case because algorithms=0).
422 */
423 for (i = 0; i < num_of_group_aliases; i++)
424 {
425 if ((i == 0) || /* always fetch "ALL" */
426 !(cipher_aliases[i].algorithms & mask))
427 {
428 *ca_curr = (SSL_CIPHER *)(cipher_aliases + i);
429 ca_curr++;
430 }
431 }
432
433 *ca_curr = NULL; /* end of list */
434 }
435
436static void ssl_cipher_apply_rule(unsigned long algorithms, unsigned long mask,
437 unsigned long algo_strength, unsigned long mask_strength,
438 int rule, int strength_bits, CIPHER_ORDER *list,
439 CIPHER_ORDER **head_p, CIPHER_ORDER **tail_p)
440 {
441 CIPHER_ORDER *head, *tail, *curr, *curr2, *tail2;
442 SSL_CIPHER *cp;
443 unsigned long ma, ma_s;
444
445#ifdef CIPHER_DEBUG
446 printf("Applying rule %d with %08lx %08lx %08lx %08lx (%d)\n",
447 rule, algorithms, mask, algo_strength, mask_strength,
448 strength_bits);
449#endif
450
451 curr = head = *head_p;
452 curr2 = head;
453 tail2 = tail = *tail_p;
454 for (;;)
455 {
456 if ((curr == NULL) || (curr == tail2)) break;
457 curr = curr2;
458 curr2 = curr->next;
459
460 cp = curr->cipher;
461
462 /*
463 * Selection criteria is either the number of strength_bits
464 * or the algorithm used.
465 */
466 if (strength_bits == -1)
467 {
468 ma = mask & cp->algorithms;
469 ma_s = mask_strength & cp->algo_strength;
470
471#ifdef CIPHER_DEBUG
472 printf("\nName: %s:\nAlgo = %08lx Algo_strength = %08lx\nMask = %08lx Mask_strength %08lx\n", cp->name, cp->algorithms, cp->algo_strength, mask, mask_strength);
473 printf("ma = %08lx ma_s %08lx, ma&algo=%08lx, ma_s&algos=%08lx\n", ma, ma_s, ma&algorithms, ma_s&algo_strength);
474#endif
475 /*
476 * Select: if none of the mask bit was met from the
477 * cipher or not all of the bits were met, the
478 * selection does not apply.
479 */
480 if (((ma == 0) && (ma_s == 0)) ||
481 ((ma & algorithms) != ma) ||
482 ((ma_s & algo_strength) != ma_s))
483 continue; /* does not apply */
484 }
485 else if (strength_bits != cp->strength_bits)
486 continue; /* does not apply */
487
488#ifdef CIPHER_DEBUG
489 printf("Action = %d\n", rule);
490#endif
491
492 /* add the cipher if it has not been added yet. */
493 if (rule == CIPHER_ADD)
494 {
495 if (!curr->active)
496 {
497 ll_append_tail(&head, curr, &tail);
498 curr->active = 1;
499 }
500 }
501 /* Move the added cipher to this location */
502 else if (rule == CIPHER_ORD)
503 {
504 if (curr->active)
505 {
506 ll_append_tail(&head, curr, &tail);
507 }
508 }
509 else if (rule == CIPHER_DEL)
510 curr->active = 0;
511 else if (rule == CIPHER_KILL)
512 {
513 if (head == curr)
514 head = curr->next;
515 else
516 curr->prev->next = curr->next;
517 if (tail == curr)
518 tail = curr->prev;
519 curr->active = 0;
520 if (curr->next != NULL)
521 curr->next->prev = curr->prev;
522 if (curr->prev != NULL)
523 curr->prev->next = curr->next;
524 curr->next = NULL;
525 curr->prev = NULL;
526 }
527 }
528
529 *head_p = head;
530 *tail_p = tail;
531 }
532
533static int ssl_cipher_strength_sort(CIPHER_ORDER *list, CIPHER_ORDER **head_p,
534 CIPHER_ORDER **tail_p)
535 {
536 int max_strength_bits, i, *number_uses;
537 CIPHER_ORDER *curr;
538
539 /*
540 * This routine sorts the ciphers with descending strength. The sorting
541 * must keep the pre-sorted sequence, so we apply the normal sorting
542 * routine as '+' movement to the end of the list.
543 */
544 max_strength_bits = 0;
545 curr = *head_p;
546 while (curr != NULL)
547 {
548 if (curr->active &&
549 (curr->cipher->strength_bits > max_strength_bits))
550 max_strength_bits = curr->cipher->strength_bits;
551 curr = curr->next;
552 }
553
554 number_uses = OPENSSL_malloc((max_strength_bits + 1) * sizeof(int));
555 if (!number_uses)
556 {
557 SSLerr(SSL_F_SSL_CIPHER_STRENGTH_SORT,ERR_R_MALLOC_FAILURE);
558 return(0);
559 }
560 memset(number_uses, 0, (max_strength_bits + 1) * sizeof(int));
561
562 /*
563 * Now find the strength_bits values actually used
564 */
565 curr = *head_p;
566 while (curr != NULL)
567 {
568 if (curr->active)
569 number_uses[curr->cipher->strength_bits]++;
570 curr = curr->next;
571 }
572 /*
573 * Go through the list of used strength_bits values in descending
574 * order.
575 */
576 for (i = max_strength_bits; i >= 0; i--)
577 if (number_uses[i] > 0)
578 ssl_cipher_apply_rule(0, 0, 0, 0, CIPHER_ORD, i,
579 list, head_p, tail_p);
580
581 OPENSSL_free(number_uses);
582 return(1);
583 }
584
585static int ssl_cipher_process_rulestr(const char *rule_str,
586 CIPHER_ORDER *list, CIPHER_ORDER **head_p,
587 CIPHER_ORDER **tail_p, SSL_CIPHER **ca_list)
588 {
589 unsigned long algorithms, mask, algo_strength, mask_strength;
590 const char *l, *start, *buf;
591 int j, multi, found, rule, retval, ok, buflen;
592 char ch;
593
594 retval = 1;
595 l = rule_str;
596 for (;;)
597 {
598 ch = *l;
599
600 if (ch == '\0')
601 break; /* done */
602 if (ch == '-')
603 { rule = CIPHER_DEL; l++; }
604 else if (ch == '+')
605 { rule = CIPHER_ORD; l++; }
606 else if (ch == '!')
607 { rule = CIPHER_KILL; l++; }
608 else if (ch == '@')
609 { rule = CIPHER_SPECIAL; l++; }
610 else
611 { rule = CIPHER_ADD; }
612
613 if (ITEM_SEP(ch))
614 {
615 l++;
616 continue;
617 }
618
619 algorithms = mask = algo_strength = mask_strength = 0;
620
621 start=l;
622 for (;;)
623 {
624 ch = *l;
625 buf = l;
626 buflen = 0;
627#ifndef CHARSET_EBCDIC
628 while ( ((ch >= 'A') && (ch <= 'Z')) ||
629 ((ch >= '0') && (ch <= '9')) ||
630 ((ch >= 'a') && (ch <= 'z')) ||
631 (ch == '-'))
632#else
633 while ( isalnum(ch) || (ch == '-'))
634#endif
635 {
636 ch = *(++l);
637 buflen++;
638 }
639
640 if (buflen == 0)
641 {
642 /*
643 * We hit something we cannot deal with,
644 * it is no command or separator nor
645 * alphanumeric, so we call this an error.
646 */
647 SSLerr(SSL_F_SSL_CIPHER_PROCESS_RULESTR,
648 SSL_R_INVALID_COMMAND);
649 retval = found = 0;
650 l++;
651 break;
652 }
653
654 if (rule == CIPHER_SPECIAL)
655 {
656 found = 0; /* unused -- avoid compiler warning */
657 break; /* special treatment */
658 }
659
660 /* check for multi-part specification */
661 if (ch == '+')
662 {
663 multi=1;
664 l++;
665 }
666 else
667 multi=0;
668
669 /*
670 * Now search for the cipher alias in the ca_list. Be careful
671 * with the strncmp, because the "buflen" limitation
672 * will make the rule "ADH:SOME" and the cipher
673 * "ADH-MY-CIPHER" look like a match for buflen=3.
674 * So additionally check whether the cipher name found
675 * has the correct length. We can save a strlen() call:
676 * just checking for the '\0' at the right place is
677 * sufficient, we have to strncmp() anyway.
678 */
679 j = found = 0;
680 while (ca_list[j])
681 {
682 if ((ca_list[j]->name[buflen] == '\0') &&
683 !strncmp(buf, ca_list[j]->name, buflen))
684 {
685 found = 1;
686 break;
687 }
688 else
689 j++;
690 }
691 if (!found)
692 break; /* ignore this entry */
693
694 algorithms |= ca_list[j]->algorithms;
695 mask |= ca_list[j]->mask;
696 algo_strength |= ca_list[j]->algo_strength;
697 mask_strength |= ca_list[j]->mask_strength;
698
699 if (!multi) break;
700 }
701
702 /*
703 * Ok, we have the rule, now apply it
704 */
705 if (rule == CIPHER_SPECIAL)
706 { /* special command */
707 ok = 0;
708 if ((buflen == 8) &&
709 !strncmp(buf, "STRENGTH", 8))
710 ok = ssl_cipher_strength_sort(list,
711 head_p, tail_p);
712 else
713 SSLerr(SSL_F_SSL_CIPHER_PROCESS_RULESTR,
714 SSL_R_INVALID_COMMAND);
715 if (ok == 0)
716 retval = 0;
717 /*
718 * We do not support any "multi" options
719 * together with "@", so throw away the
720 * rest of the command, if any left, until
721 * end or ':' is found.
722 */
723 while ((*l != '\0') && ITEM_SEP(*l))
724 l++;
725 }
726 else if (found)
727 {
728 ssl_cipher_apply_rule(algorithms, mask,
729 algo_strength, mask_strength, rule, -1,
730 list, head_p, tail_p);
731 }
732 else
733 {
734 while ((*l != '\0') && ITEM_SEP(*l))
735 l++;
736 }
737 if (*l == '\0') break; /* done */
738 }
739
740 return(retval);
741 }
742
743STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(const SSL_METHOD *ssl_method,
744 STACK_OF(SSL_CIPHER) **cipher_list,
745 STACK_OF(SSL_CIPHER) **cipher_list_by_id,
746 const char *rule_str)
747 {
748 int ok, num_of_ciphers, num_of_alias_max, num_of_group_aliases;
749 unsigned long disabled_mask;
750 STACK_OF(SSL_CIPHER) *cipherstack;
751 const char *rule_p;
752 CIPHER_ORDER *list = NULL, *head = NULL, *tail = NULL, *curr;
753 SSL_CIPHER **ca_list = NULL;
754
755 /*
756 * Return with error if nothing to do.
757 */
758 if (rule_str == NULL) return(NULL);
759
760 if (init_ciphers) load_ciphers();
761
762 /*
763 * To reduce the work to do we only want to process the compiled
764 * in algorithms, so we first get the mask of disabled ciphers.
765 */
766 disabled_mask = ssl_cipher_get_disabled();
767
768 /*
769 * Now we have to collect the available ciphers from the compiled
770 * in ciphers. We cannot get more than the number compiled in, so
771 * it is used for allocation.
772 */
773 num_of_ciphers = ssl_method->num_ciphers();
774#ifdef KSSL_DEBUG
775 printf("ssl_create_cipher_list() for %d ciphers\n", num_of_ciphers);
776#endif /* KSSL_DEBUG */
777 list = (CIPHER_ORDER *)OPENSSL_malloc(sizeof(CIPHER_ORDER) * num_of_ciphers);
778 if (list == NULL)
779 {
780 SSLerr(SSL_F_SSL_CREATE_CIPHER_LIST,ERR_R_MALLOC_FAILURE);
781 return(NULL); /* Failure */
782 }
783
784 ssl_cipher_collect_ciphers(ssl_method, num_of_ciphers, disabled_mask,
785 list, &head, &tail);
786
787 /*
788 * We also need cipher aliases for selecting based on the rule_str.
789 * There might be two types of entries in the rule_str: 1) names
790 * of ciphers themselves 2) aliases for groups of ciphers.
791 * For 1) we need the available ciphers and for 2) the cipher
792 * groups of cipher_aliases added together in one list (otherwise
793 * we would be happy with just the cipher_aliases table).
794 */
795 num_of_group_aliases = sizeof(cipher_aliases) / sizeof(SSL_CIPHER);
796 num_of_alias_max = num_of_ciphers + num_of_group_aliases + 1;
797 ca_list =
798 (SSL_CIPHER **)OPENSSL_malloc(sizeof(SSL_CIPHER *) * num_of_alias_max);
799 if (ca_list == NULL)
800 {
801 OPENSSL_free(list);
802 SSLerr(SSL_F_SSL_CREATE_CIPHER_LIST,ERR_R_MALLOC_FAILURE);
803 return(NULL); /* Failure */
804 }
805 ssl_cipher_collect_aliases(ca_list, num_of_group_aliases, disabled_mask,
806 head);
807
808 /*
809 * If the rule_string begins with DEFAULT, apply the default rule
810 * before using the (possibly available) additional rules.
811 */
812 ok = 1;
813 rule_p = rule_str;
814 if (strncmp(rule_str,"DEFAULT",7) == 0)
815 {
816 ok = ssl_cipher_process_rulestr(SSL_DEFAULT_CIPHER_LIST,
817 list, &head, &tail, ca_list);
818 rule_p += 7;
819 if (*rule_p == ':')
820 rule_p++;
821 }
822
823 if (ok && (strlen(rule_p) > 0))
824 ok = ssl_cipher_process_rulestr(rule_p, list, &head, &tail,
825 ca_list);
826
827 OPENSSL_free(ca_list); /* Not needed anymore */
828
829 if (!ok)
830 { /* Rule processing failure */
831 OPENSSL_free(list);
832 return(NULL);
833 }
834 /*
835 * Allocate new "cipherstack" for the result, return with error
836 * if we cannot get one.
837 */
838 if ((cipherstack = sk_SSL_CIPHER_new_null()) == NULL)
839 {
840 OPENSSL_free(list);
841 return(NULL);
842 }
843
844 /*
845 * The cipher selection for the list is done. The ciphers are added
846 * to the resulting precedence to the STACK_OF(SSL_CIPHER).
847 */
848 for (curr = head; curr != NULL; curr = curr->next)
849 {
850 if (curr->active)
851 {
852 sk_SSL_CIPHER_push(cipherstack, curr->cipher);
853#ifdef CIPHER_DEBUG
854 printf("<%s>\n",curr->cipher->name);
855#endif
856 }
857 }
858 OPENSSL_free(list); /* Not needed any longer */
859
860 /*
861 * The following passage is a little bit odd. If pointer variables
862 * were supplied to hold STACK_OF(SSL_CIPHER) return information,
863 * the old memory pointed to is free()ed. Then, however, the
864 * cipher_list entry will be assigned just a copy of the returned
865 * cipher stack. For cipher_list_by_id a copy of the cipher stack
866 * will be created. See next comment...
867 */
868 if (cipher_list != NULL)
869 {
870 if (*cipher_list != NULL)
871 sk_SSL_CIPHER_free(*cipher_list);
872 *cipher_list = cipherstack;
873 }
874
875 if (cipher_list_by_id != NULL)
876 {
877 if (*cipher_list_by_id != NULL)
878 sk_SSL_CIPHER_free(*cipher_list_by_id);
879 *cipher_list_by_id = sk_SSL_CIPHER_dup(cipherstack);
880 }
881
882 /*
883 * Now it is getting really strange. If something failed during
884 * the previous pointer assignment or if one of the pointers was
885 * not requested, the error condition is met. That might be
886 * discussable. The strange thing is however that in this case
887 * the memory "ret" pointed to is "free()ed" and hence the pointer
888 * cipher_list becomes wild. The memory reserved for
889 * cipher_list_by_id however is not "free()ed" and stays intact.
890 */
891 if ( (cipher_list_by_id == NULL) ||
892 (*cipher_list_by_id == NULL) ||
893 (cipher_list == NULL) ||
894 (*cipher_list == NULL))
895 {
896 sk_SSL_CIPHER_free(cipherstack);
897 return(NULL);
898 }
899
900 sk_SSL_CIPHER_set_cmp_func(*cipher_list_by_id,ssl_cipher_ptr_id_cmp);
901
902 return(cipherstack);
903 }
904
905char *SSL_CIPHER_description(SSL_CIPHER *cipher, char *buf, int len)
906 {
907 int is_export,pkl,kl;
908 char *ver,*exp;
909 char *kx,*au,*enc,*mac;
910 unsigned long alg,alg2,alg_s;
911#ifdef KSSL_DEBUG
912 static char *format="%-23s %s Kx=%-8s Au=%-4s Enc=%-9s Mac=%-4s%s AL=%lx\n";
913#else
914 static char *format="%-23s %s Kx=%-8s Au=%-4s Enc=%-9s Mac=%-4s%s\n";
915#endif /* KSSL_DEBUG */
916
917 alg=cipher->algorithms;
918 alg_s=cipher->algo_strength;
919 alg2=cipher->algorithm2;
920
921 is_export=SSL_C_IS_EXPORT(cipher);
922 pkl=SSL_C_EXPORT_PKEYLENGTH(cipher);
923 kl=SSL_C_EXPORT_KEYLENGTH(cipher);
924 exp=is_export?" export":"";
925
926 if (alg & SSL_SSLV2)
927 ver="SSLv2";
928 else if (alg & SSL_SSLV3)
929 ver="SSLv3";
930 else
931 ver="unknown";
932
933 switch (alg&SSL_MKEY_MASK)
934 {
935 case SSL_kRSA:
936 kx=is_export?(pkl == 512 ? "RSA(512)" : "RSA(1024)"):"RSA";
937 break;
938 case SSL_kDHr:
939 kx="DH/RSA";
940 break;
941 case SSL_kDHd:
942 kx="DH/DSS";
943 break;
944 case SSL_kKRB5: /* VRS */
945 case SSL_KRB5: /* VRS */
946 kx="KRB5";
947 break;
948 case SSL_kFZA:
949 kx="Fortezza";
950 break;
951 case SSL_kEDH:
952 kx=is_export?(pkl == 512 ? "DH(512)" : "DH(1024)"):"DH";
953 break;
954 default:
955 kx="unknown";
956 }
957
958 switch (alg&SSL_AUTH_MASK)
959 {
960 case SSL_aRSA:
961 au="RSA";
962 break;
963 case SSL_aDSS:
964 au="DSS";
965 break;
966 case SSL_aDH:
967 au="DH";
968 break;
969 case SSL_aKRB5: /* VRS */
970 case SSL_KRB5: /* VRS */
971 au="KRB5";
972 break;
973 case SSL_aFZA:
974 case SSL_aNULL:
975 au="None";
976 break;
977 default:
978 au="unknown";
979 break;
980 }
981
982 switch (alg&SSL_ENC_MASK)
983 {
984 case SSL_DES:
985 enc=(is_export && kl == 5)?"DES(40)":"DES(56)";
986 break;
987 case SSL_3DES:
988 enc="3DES(168)";
989 break;
990 case SSL_RC4:
991 enc=is_export?(kl == 5 ? "RC4(40)" : "RC4(56)")
992 :((alg2&SSL2_CF_8_BYTE_ENC)?"RC4(64)":"RC4(128)");
993 break;
994 case SSL_RC2:
995 enc=is_export?(kl == 5 ? "RC2(40)" : "RC2(56)"):"RC2(128)";
996 break;
997 case SSL_IDEA:
998 enc="IDEA(128)";
999 break;
1000 case SSL_eFZA:
1001 enc="Fortezza";
1002 break;
1003 case SSL_eNULL:
1004 enc="None";
1005 break;
1006 case SSL_AES:
1007 switch(cipher->strength_bits)
1008 {
1009 case 128: enc="AES(128)"; break;
1010 case 192: enc="AES(192)"; break;
1011 case 256: enc="AES(256)"; break;
1012 default: enc="AES(?""?""?)"; break;
1013 }
1014 break;
1015 default:
1016 enc="unknown";
1017 break;
1018 }
1019
1020 switch (alg&SSL_MAC_MASK)
1021 {
1022 case SSL_MD5:
1023 mac="MD5";
1024 break;
1025 case SSL_SHA1:
1026 mac="SHA1";
1027 break;
1028 default:
1029 mac="unknown";
1030 break;
1031 }
1032
1033 if (buf == NULL)
1034 {
1035 len=128;
1036 buf=OPENSSL_malloc(len);
1037 if (buf == NULL) return("OPENSSL_malloc Error");
1038 }
1039 else if (len < 128)
1040 return("Buffer too small");
1041
1042#ifdef KSSL_DEBUG
1043 BIO_snprintf(buf,len,format,cipher->name,ver,kx,au,enc,mac,exp,alg);
1044#else
1045 BIO_snprintf(buf,len,format,cipher->name,ver,kx,au,enc,mac,exp);
1046#endif /* KSSL_DEBUG */
1047 return(buf);
1048 }
1049
1050char *SSL_CIPHER_get_version(SSL_CIPHER *c)
1051 {
1052 int i;
1053
1054 if (c == NULL) return("(NONE)");
1055 i=(int)(c->id>>24L);
1056 if (i == 3)
1057 return("TLSv1/SSLv3");
1058 else if (i == 2)
1059 return("SSLv2");
1060 else
1061 return("unknown");
1062 }
1063
1064/* return the actual cipher being used */
1065const char *SSL_CIPHER_get_name(SSL_CIPHER *c)
1066 {
1067 if (c != NULL)
1068 return(c->name);
1069 return("(NONE)");
1070 }
1071
1072/* number of bits for symmetric cipher */
1073int SSL_CIPHER_get_bits(SSL_CIPHER *c, int *alg_bits)
1074 {
1075 int ret=0;
1076
1077 if (c != NULL)
1078 {
1079 if (alg_bits != NULL) *alg_bits = c->alg_bits;
1080 ret = c->strength_bits;
1081 }
1082 return(ret);
1083 }
1084
1085SSL_COMP *ssl3_comp_find(STACK_OF(SSL_COMP) *sk, int n)
1086 {
1087 SSL_COMP *ctmp;
1088 int i,nn;
1089
1090 if ((n == 0) || (sk == NULL)) return(NULL);
1091 nn=sk_SSL_COMP_num(sk);
1092 for (i=0; i<nn; i++)
1093 {
1094 ctmp=sk_SSL_COMP_value(sk,i);
1095 if (ctmp->id == n)
1096 return(ctmp);
1097 }
1098 return(NULL);
1099 }
1100
1101static int sk_comp_cmp(const SSL_COMP * const *a,
1102 const SSL_COMP * const *b)
1103 {
1104 return((*a)->id-(*b)->id);
1105 }
1106
1107STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void)
1108 {
1109 return(ssl_comp_methods);
1110 }
1111
1112int SSL_COMP_add_compression_method(int id, COMP_METHOD *cm)
1113 {
1114 SSL_COMP *comp;
1115 STACK_OF(SSL_COMP) *sk;
1116
1117 if (cm == NULL || cm->type == NID_undef)
1118 return 1;
1119
1120 MemCheck_off();
1121 comp=(SSL_COMP *)OPENSSL_malloc(sizeof(SSL_COMP));
1122 comp->id=id;
1123 comp->method=cm;
1124 if (ssl_comp_methods == NULL)
1125 sk=ssl_comp_methods=sk_SSL_COMP_new(sk_comp_cmp);
1126 else
1127 sk=ssl_comp_methods;
1128 if ((sk == NULL) || !sk_SSL_COMP_push(sk,comp))
1129 {
1130 MemCheck_on();
1131 SSLerr(SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD,ERR_R_MALLOC_FAILURE);
1132 return(0);
1133 }
1134 else
1135 {
1136 MemCheck_on();
1137 return(1);
1138 }
1139 }
diff --git a/src/lib/libssl/ssl_err.c b/src/lib/libssl/ssl_err.c
deleted file mode 100644
index 7067a745f3..0000000000
--- a/src/lib/libssl/ssl_err.c
+++ /dev/null
@@ -1,460 +0,0 @@
1/* ssl/ssl_err.c */
2/* ====================================================================
3 * Copyright (c) 1999-2002 The OpenSSL Project. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in
14 * the documentation and/or other materials provided with the
15 * distribution.
16 *
17 * 3. All advertising materials mentioning features or use of this
18 * software must display the following acknowledgment:
19 * "This product includes software developed by the OpenSSL Project
20 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
21 *
22 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
23 * endorse or promote products derived from this software without
24 * prior written permission. For written permission, please contact
25 * openssl-core@OpenSSL.org.
26 *
27 * 5. Products derived from this software may not be called "OpenSSL"
28 * nor may "OpenSSL" appear in their names without prior written
29 * permission of the OpenSSL Project.
30 *
31 * 6. Redistributions of any form whatsoever must retain the following
32 * acknowledgment:
33 * "This product includes software developed by the OpenSSL Project
34 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
35 *
36 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
37 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
39 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
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 *
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
61#include <stdio.h>
62#include <openssl/err.h>
63#include <openssl/ssl.h>
64
65/* BEGIN ERROR CODES */
66#ifndef OPENSSL_NO_ERR
67static ERR_STRING_DATA SSL_str_functs[]=
68 {
69{ERR_PACK(0,SSL_F_CLIENT_CERTIFICATE,0), "CLIENT_CERTIFICATE"},
70{ERR_PACK(0,SSL_F_CLIENT_FINISHED,0), "CLIENT_FINISHED"},
71{ERR_PACK(0,SSL_F_CLIENT_HELLO,0), "CLIENT_HELLO"},
72{ERR_PACK(0,SSL_F_CLIENT_MASTER_KEY,0), "CLIENT_MASTER_KEY"},
73{ERR_PACK(0,SSL_F_D2I_SSL_SESSION,0), "d2i_SSL_SESSION"},
74{ERR_PACK(0,SSL_F_DO_SSL3_WRITE,0), "DO_SSL3_WRITE"},
75{ERR_PACK(0,SSL_F_GET_CLIENT_FINISHED,0), "GET_CLIENT_FINISHED"},
76{ERR_PACK(0,SSL_F_GET_CLIENT_HELLO,0), "GET_CLIENT_HELLO"},
77{ERR_PACK(0,SSL_F_GET_CLIENT_MASTER_KEY,0), "GET_CLIENT_MASTER_KEY"},
78{ERR_PACK(0,SSL_F_GET_SERVER_FINISHED,0), "GET_SERVER_FINISHED"},
79{ERR_PACK(0,SSL_F_GET_SERVER_HELLO,0), "GET_SERVER_HELLO"},
80{ERR_PACK(0,SSL_F_GET_SERVER_VERIFY,0), "GET_SERVER_VERIFY"},
81{ERR_PACK(0,SSL_F_I2D_SSL_SESSION,0), "i2d_SSL_SESSION"},
82{ERR_PACK(0,SSL_F_READ_N,0), "READ_N"},
83{ERR_PACK(0,SSL_F_REQUEST_CERTIFICATE,0), "REQUEST_CERTIFICATE"},
84{ERR_PACK(0,SSL_F_SERVER_FINISH,0), "SERVER_FINISH"},
85{ERR_PACK(0,SSL_F_SERVER_HELLO,0), "SERVER_HELLO"},
86{ERR_PACK(0,SSL_F_SERVER_VERIFY,0), "SERVER_VERIFY"},
87{ERR_PACK(0,SSL_F_SSL23_ACCEPT,0), "SSL23_ACCEPT"},
88{ERR_PACK(0,SSL_F_SSL23_CLIENT_HELLO,0), "SSL23_CLIENT_HELLO"},
89{ERR_PACK(0,SSL_F_SSL23_CONNECT,0), "SSL23_CONNECT"},
90{ERR_PACK(0,SSL_F_SSL23_GET_CLIENT_HELLO,0), "SSL23_GET_CLIENT_HELLO"},
91{ERR_PACK(0,SSL_F_SSL23_GET_SERVER_HELLO,0), "SSL23_GET_SERVER_HELLO"},
92{ERR_PACK(0,SSL_F_SSL23_PEEK,0), "SSL23_PEEK"},
93{ERR_PACK(0,SSL_F_SSL23_READ,0), "SSL23_READ"},
94{ERR_PACK(0,SSL_F_SSL23_WRITE,0), "SSL23_WRITE"},
95{ERR_PACK(0,SSL_F_SSL2_ACCEPT,0), "SSL2_ACCEPT"},
96{ERR_PACK(0,SSL_F_SSL2_CONNECT,0), "SSL2_CONNECT"},
97{ERR_PACK(0,SSL_F_SSL2_ENC_INIT,0), "SSL2_ENC_INIT"},
98{ERR_PACK(0,SSL_F_SSL2_GENERATE_KEY_MATERIAL,0), "SSL2_GENERATE_KEY_MATERIAL"},
99{ERR_PACK(0,SSL_F_SSL2_PEEK,0), "SSL2_PEEK"},
100{ERR_PACK(0,SSL_F_SSL2_READ,0), "SSL2_READ"},
101{ERR_PACK(0,SSL_F_SSL2_READ_INTERNAL,0), "SSL2_READ_INTERNAL"},
102{ERR_PACK(0,SSL_F_SSL2_SET_CERTIFICATE,0), "SSL2_SET_CERTIFICATE"},
103{ERR_PACK(0,SSL_F_SSL2_WRITE,0), "SSL2_WRITE"},
104{ERR_PACK(0,SSL_F_SSL3_ACCEPT,0), "SSL3_ACCEPT"},
105{ERR_PACK(0,SSL_F_SSL3_CALLBACK_CTRL,0), "SSL3_CALLBACK_CTRL"},
106{ERR_PACK(0,SSL_F_SSL3_CHANGE_CIPHER_STATE,0), "SSL3_CHANGE_CIPHER_STATE"},
107{ERR_PACK(0,SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,0), "SSL3_CHECK_CERT_AND_ALGORITHM"},
108{ERR_PACK(0,SSL_F_SSL3_CLIENT_HELLO,0), "SSL3_CLIENT_HELLO"},
109{ERR_PACK(0,SSL_F_SSL3_CONNECT,0), "SSL3_CONNECT"},
110{ERR_PACK(0,SSL_F_SSL3_CTRL,0), "SSL3_CTRL"},
111{ERR_PACK(0,SSL_F_SSL3_CTX_CTRL,0), "SSL3_CTX_CTRL"},
112{ERR_PACK(0,SSL_F_SSL3_ENC,0), "SSL3_ENC"},
113{ERR_PACK(0,SSL_F_SSL3_GENERATE_KEY_BLOCK,0), "SSL3_GENERATE_KEY_BLOCK"},
114{ERR_PACK(0,SSL_F_SSL3_GET_CERTIFICATE_REQUEST,0), "SSL3_GET_CERTIFICATE_REQUEST"},
115{ERR_PACK(0,SSL_F_SSL3_GET_CERT_VERIFY,0), "SSL3_GET_CERT_VERIFY"},
116{ERR_PACK(0,SSL_F_SSL3_GET_CLIENT_CERTIFICATE,0), "SSL3_GET_CLIENT_CERTIFICATE"},
117{ERR_PACK(0,SSL_F_SSL3_GET_CLIENT_HELLO,0), "SSL3_GET_CLIENT_HELLO"},
118{ERR_PACK(0,SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,0), "SSL3_GET_CLIENT_KEY_EXCHANGE"},
119{ERR_PACK(0,SSL_F_SSL3_GET_FINISHED,0), "SSL3_GET_FINISHED"},
120{ERR_PACK(0,SSL_F_SSL3_GET_KEY_EXCHANGE,0), "SSL3_GET_KEY_EXCHANGE"},
121{ERR_PACK(0,SSL_F_SSL3_GET_MESSAGE,0), "SSL3_GET_MESSAGE"},
122{ERR_PACK(0,SSL_F_SSL3_GET_RECORD,0), "SSL3_GET_RECORD"},
123{ERR_PACK(0,SSL_F_SSL3_GET_SERVER_CERTIFICATE,0), "SSL3_GET_SERVER_CERTIFICATE"},
124{ERR_PACK(0,SSL_F_SSL3_GET_SERVER_DONE,0), "SSL3_GET_SERVER_DONE"},
125{ERR_PACK(0,SSL_F_SSL3_GET_SERVER_HELLO,0), "SSL3_GET_SERVER_HELLO"},
126{ERR_PACK(0,SSL_F_SSL3_OUTPUT_CERT_CHAIN,0), "SSL3_OUTPUT_CERT_CHAIN"},
127{ERR_PACK(0,SSL_F_SSL3_PEEK,0), "SSL3_PEEK"},
128{ERR_PACK(0,SSL_F_SSL3_READ_BYTES,0), "SSL3_READ_BYTES"},
129{ERR_PACK(0,SSL_F_SSL3_READ_N,0), "SSL3_READ_N"},
130{ERR_PACK(0,SSL_F_SSL3_SEND_CERTIFICATE_REQUEST,0), "SSL3_SEND_CERTIFICATE_REQUEST"},
131{ERR_PACK(0,SSL_F_SSL3_SEND_CLIENT_CERTIFICATE,0), "SSL3_SEND_CLIENT_CERTIFICATE"},
132{ERR_PACK(0,SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,0), "SSL3_SEND_CLIENT_KEY_EXCHANGE"},
133{ERR_PACK(0,SSL_F_SSL3_SEND_CLIENT_VERIFY,0), "SSL3_SEND_CLIENT_VERIFY"},
134{ERR_PACK(0,SSL_F_SSL3_SEND_SERVER_CERTIFICATE,0), "SSL3_SEND_SERVER_CERTIFICATE"},
135{ERR_PACK(0,SSL_F_SSL3_SEND_SERVER_HELLO,0), "SSL3_SEND_SERVER_HELLO"},
136{ERR_PACK(0,SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,0), "SSL3_SEND_SERVER_KEY_EXCHANGE"},
137{ERR_PACK(0,SSL_F_SSL3_SETUP_BUFFERS,0), "SSL3_SETUP_BUFFERS"},
138{ERR_PACK(0,SSL_F_SSL3_SETUP_KEY_BLOCK,0), "SSL3_SETUP_KEY_BLOCK"},
139{ERR_PACK(0,SSL_F_SSL3_WRITE_BYTES,0), "SSL3_WRITE_BYTES"},
140{ERR_PACK(0,SSL_F_SSL3_WRITE_PENDING,0), "SSL3_WRITE_PENDING"},
141{ERR_PACK(0,SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK,0), "SSL_add_dir_cert_subjects_to_stack"},
142{ERR_PACK(0,SSL_F_SSL_ADD_FILE_CERT_SUBJECTS_TO_STACK,0), "SSL_add_file_cert_subjects_to_stack"},
143{ERR_PACK(0,SSL_F_SSL_BAD_METHOD,0), "SSL_BAD_METHOD"},
144{ERR_PACK(0,SSL_F_SSL_BYTES_TO_CIPHER_LIST,0), "SSL_BYTES_TO_CIPHER_LIST"},
145{ERR_PACK(0,SSL_F_SSL_CERT_DUP,0), "SSL_CERT_DUP"},
146{ERR_PACK(0,SSL_F_SSL_CERT_INST,0), "SSL_CERT_INST"},
147{ERR_PACK(0,SSL_F_SSL_CERT_INSTANTIATE,0), "SSL_CERT_INSTANTIATE"},
148{ERR_PACK(0,SSL_F_SSL_CERT_NEW,0), "SSL_CERT_NEW"},
149{ERR_PACK(0,SSL_F_SSL_CHECK_PRIVATE_KEY,0), "SSL_check_private_key"},
150{ERR_PACK(0,SSL_F_SSL_CIPHER_PROCESS_RULESTR,0), "SSL_CIPHER_PROCESS_RULESTR"},
151{ERR_PACK(0,SSL_F_SSL_CIPHER_STRENGTH_SORT,0), "SSL_CIPHER_STRENGTH_SORT"},
152{ERR_PACK(0,SSL_F_SSL_CLEAR,0), "SSL_clear"},
153{ERR_PACK(0,SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD,0), "SSL_COMP_add_compression_method"},
154{ERR_PACK(0,SSL_F_SSL_CREATE_CIPHER_LIST,0), "SSL_CREATE_CIPHER_LIST"},
155{ERR_PACK(0,SSL_F_SSL_CTRL,0), "SSL_ctrl"},
156{ERR_PACK(0,SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,0), "SSL_CTX_check_private_key"},
157{ERR_PACK(0,SSL_F_SSL_CTX_NEW,0), "SSL_CTX_new"},
158{ERR_PACK(0,SSL_F_SSL_CTX_SET_PURPOSE,0), "SSL_CTX_set_purpose"},
159{ERR_PACK(0,SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT,0), "SSL_CTX_set_session_id_context"},
160{ERR_PACK(0,SSL_F_SSL_CTX_SET_SSL_VERSION,0), "SSL_CTX_set_ssl_version"},
161{ERR_PACK(0,SSL_F_SSL_CTX_SET_TRUST,0), "SSL_CTX_set_trust"},
162{ERR_PACK(0,SSL_F_SSL_CTX_USE_CERTIFICATE,0), "SSL_CTX_use_certificate"},
163{ERR_PACK(0,SSL_F_SSL_CTX_USE_CERTIFICATE_ASN1,0), "SSL_CTX_use_certificate_ASN1"},
164{ERR_PACK(0,SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE,0), "SSL_CTX_use_certificate_chain_file"},
165{ERR_PACK(0,SSL_F_SSL_CTX_USE_CERTIFICATE_FILE,0), "SSL_CTX_use_certificate_file"},
166{ERR_PACK(0,SSL_F_SSL_CTX_USE_PRIVATEKEY,0), "SSL_CTX_use_PrivateKey"},
167{ERR_PACK(0,SSL_F_SSL_CTX_USE_PRIVATEKEY_ASN1,0), "SSL_CTX_use_PrivateKey_ASN1"},
168{ERR_PACK(0,SSL_F_SSL_CTX_USE_PRIVATEKEY_FILE,0), "SSL_CTX_use_PrivateKey_file"},
169{ERR_PACK(0,SSL_F_SSL_CTX_USE_RSAPRIVATEKEY,0), "SSL_CTX_use_RSAPrivateKey"},
170{ERR_PACK(0,SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_ASN1,0), "SSL_CTX_use_RSAPrivateKey_ASN1"},
171{ERR_PACK(0,SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_FILE,0), "SSL_CTX_use_RSAPrivateKey_file"},
172{ERR_PACK(0,SSL_F_SSL_DO_HANDSHAKE,0), "SSL_do_handshake"},
173{ERR_PACK(0,SSL_F_SSL_GET_NEW_SESSION,0), "SSL_GET_NEW_SESSION"},
174{ERR_PACK(0,SSL_F_SSL_GET_PREV_SESSION,0), "SSL_GET_PREV_SESSION"},
175{ERR_PACK(0,SSL_F_SSL_GET_SERVER_SEND_CERT,0), "SSL_GET_SERVER_SEND_CERT"},
176{ERR_PACK(0,SSL_F_SSL_GET_SIGN_PKEY,0), "SSL_GET_SIGN_PKEY"},
177{ERR_PACK(0,SSL_F_SSL_INIT_WBIO_BUFFER,0), "SSL_INIT_WBIO_BUFFER"},
178{ERR_PACK(0,SSL_F_SSL_LOAD_CLIENT_CA_FILE,0), "SSL_load_client_CA_file"},
179{ERR_PACK(0,SSL_F_SSL_NEW,0), "SSL_new"},
180{ERR_PACK(0,SSL_F_SSL_READ,0), "SSL_read"},
181{ERR_PACK(0,SSL_F_SSL_RSA_PRIVATE_DECRYPT,0), "SSL_RSA_PRIVATE_DECRYPT"},
182{ERR_PACK(0,SSL_F_SSL_RSA_PUBLIC_ENCRYPT,0), "SSL_RSA_PUBLIC_ENCRYPT"},
183{ERR_PACK(0,SSL_F_SSL_SESSION_NEW,0), "SSL_SESSION_new"},
184{ERR_PACK(0,SSL_F_SSL_SESSION_PRINT_FP,0), "SSL_SESSION_print_fp"},
185{ERR_PACK(0,SSL_F_SSL_SESS_CERT_NEW,0), "SSL_SESS_CERT_NEW"},
186{ERR_PACK(0,SSL_F_SSL_SET_CERT,0), "SSL_SET_CERT"},
187{ERR_PACK(0,SSL_F_SSL_SET_FD,0), "SSL_set_fd"},
188{ERR_PACK(0,SSL_F_SSL_SET_PKEY,0), "SSL_SET_PKEY"},
189{ERR_PACK(0,SSL_F_SSL_SET_PURPOSE,0), "SSL_set_purpose"},
190{ERR_PACK(0,SSL_F_SSL_SET_RFD,0), "SSL_set_rfd"},
191{ERR_PACK(0,SSL_F_SSL_SET_SESSION,0), "SSL_set_session"},
192{ERR_PACK(0,SSL_F_SSL_SET_SESSION_ID_CONTEXT,0), "SSL_set_session_id_context"},
193{ERR_PACK(0,SSL_F_SSL_SET_TRUST,0), "SSL_set_trust"},
194{ERR_PACK(0,SSL_F_SSL_SET_WFD,0), "SSL_set_wfd"},
195{ERR_PACK(0,SSL_F_SSL_SHUTDOWN,0), "SSL_shutdown"},
196{ERR_PACK(0,SSL_F_SSL_UNDEFINED_FUNCTION,0), "SSL_UNDEFINED_FUNCTION"},
197{ERR_PACK(0,SSL_F_SSL_USE_CERTIFICATE,0), "SSL_use_certificate"},
198{ERR_PACK(0,SSL_F_SSL_USE_CERTIFICATE_ASN1,0), "SSL_use_certificate_ASN1"},
199{ERR_PACK(0,SSL_F_SSL_USE_CERTIFICATE_FILE,0), "SSL_use_certificate_file"},
200{ERR_PACK(0,SSL_F_SSL_USE_PRIVATEKEY,0), "SSL_use_PrivateKey"},
201{ERR_PACK(0,SSL_F_SSL_USE_PRIVATEKEY_ASN1,0), "SSL_use_PrivateKey_ASN1"},
202{ERR_PACK(0,SSL_F_SSL_USE_PRIVATEKEY_FILE,0), "SSL_use_PrivateKey_file"},
203{ERR_PACK(0,SSL_F_SSL_USE_RSAPRIVATEKEY,0), "SSL_use_RSAPrivateKey"},
204{ERR_PACK(0,SSL_F_SSL_USE_RSAPRIVATEKEY_ASN1,0), "SSL_use_RSAPrivateKey_ASN1"},
205{ERR_PACK(0,SSL_F_SSL_USE_RSAPRIVATEKEY_FILE,0), "SSL_use_RSAPrivateKey_file"},
206{ERR_PACK(0,SSL_F_SSL_VERIFY_CERT_CHAIN,0), "SSL_VERIFY_CERT_CHAIN"},
207{ERR_PACK(0,SSL_F_SSL_WRITE,0), "SSL_write"},
208{ERR_PACK(0,SSL_F_TLS1_CHANGE_CIPHER_STATE,0), "TLS1_CHANGE_CIPHER_STATE"},
209{ERR_PACK(0,SSL_F_TLS1_ENC,0), "TLS1_ENC"},
210{ERR_PACK(0,SSL_F_TLS1_SETUP_KEY_BLOCK,0), "TLS1_SETUP_KEY_BLOCK"},
211{ERR_PACK(0,SSL_F_WRITE_PENDING,0), "WRITE_PENDING"},
212{0,NULL}
213 };
214
215static ERR_STRING_DATA SSL_str_reasons[]=
216 {
217{SSL_R_APP_DATA_IN_HANDSHAKE ,"app data in handshake"},
218{SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT,"attempt to reuse session in different context"},
219{SSL_R_BAD_ALERT_RECORD ,"bad alert record"},
220{SSL_R_BAD_AUTHENTICATION_TYPE ,"bad authentication type"},
221{SSL_R_BAD_CHANGE_CIPHER_SPEC ,"bad change cipher spec"},
222{SSL_R_BAD_CHECKSUM ,"bad checksum"},
223{SSL_R_BAD_DATA_RETURNED_BY_CALLBACK ,"bad data returned by callback"},
224{SSL_R_BAD_DECOMPRESSION ,"bad decompression"},
225{SSL_R_BAD_DH_G_LENGTH ,"bad dh g length"},
226{SSL_R_BAD_DH_PUB_KEY_LENGTH ,"bad dh pub key length"},
227{SSL_R_BAD_DH_P_LENGTH ,"bad dh p length"},
228{SSL_R_BAD_DIGEST_LENGTH ,"bad digest length"},
229{SSL_R_BAD_DSA_SIGNATURE ,"bad dsa signature"},
230{SSL_R_BAD_HELLO_REQUEST ,"bad hello request"},
231{SSL_R_BAD_LENGTH ,"bad length"},
232{SSL_R_BAD_MAC_DECODE ,"bad mac decode"},
233{SSL_R_BAD_MESSAGE_TYPE ,"bad message type"},
234{SSL_R_BAD_PACKET_LENGTH ,"bad packet length"},
235{SSL_R_BAD_PROTOCOL_VERSION_NUMBER ,"bad protocol version number"},
236{SSL_R_BAD_RESPONSE_ARGUMENT ,"bad response argument"},
237{SSL_R_BAD_RSA_DECRYPT ,"bad rsa decrypt"},
238{SSL_R_BAD_RSA_ENCRYPT ,"bad rsa encrypt"},
239{SSL_R_BAD_RSA_E_LENGTH ,"bad rsa e length"},
240{SSL_R_BAD_RSA_MODULUS_LENGTH ,"bad rsa modulus length"},
241{SSL_R_BAD_RSA_SIGNATURE ,"bad rsa signature"},
242{SSL_R_BAD_SIGNATURE ,"bad signature"},
243{SSL_R_BAD_SSL_FILETYPE ,"bad ssl filetype"},
244{SSL_R_BAD_SSL_SESSION_ID_LENGTH ,"bad ssl session id length"},
245{SSL_R_BAD_STATE ,"bad state"},
246{SSL_R_BAD_WRITE_RETRY ,"bad write retry"},
247{SSL_R_BIO_NOT_SET ,"bio not set"},
248{SSL_R_BLOCK_CIPHER_PAD_IS_WRONG ,"block cipher pad is wrong"},
249{SSL_R_BN_LIB ,"bn lib"},
250{SSL_R_CA_DN_LENGTH_MISMATCH ,"ca dn length mismatch"},
251{SSL_R_CA_DN_TOO_LONG ,"ca dn too long"},
252{SSL_R_CCS_RECEIVED_EARLY ,"ccs received early"},
253{SSL_R_CERTIFICATE_VERIFY_FAILED ,"certificate verify failed"},
254{SSL_R_CERT_LENGTH_MISMATCH ,"cert length mismatch"},
255{SSL_R_CHALLENGE_IS_DIFFERENT ,"challenge is different"},
256{SSL_R_CIPHER_CODE_WRONG_LENGTH ,"cipher code wrong length"},
257{SSL_R_CIPHER_OR_HASH_UNAVAILABLE ,"cipher or hash unavailable"},
258{SSL_R_CIPHER_TABLE_SRC_ERROR ,"cipher table src error"},
259{SSL_R_COMPRESSED_LENGTH_TOO_LONG ,"compressed length too long"},
260{SSL_R_COMPRESSION_FAILURE ,"compression failure"},
261{SSL_R_COMPRESSION_LIBRARY_ERROR ,"compression library error"},
262{SSL_R_CONNECTION_ID_IS_DIFFERENT ,"connection id is different"},
263{SSL_R_CONNECTION_TYPE_NOT_SET ,"connection type not set"},
264{SSL_R_DATA_BETWEEN_CCS_AND_FINISHED ,"data between ccs and finished"},
265{SSL_R_DATA_LENGTH_TOO_LONG ,"data length too long"},
266{SSL_R_DECRYPTION_FAILED ,"decryption failed"},
267{SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC,"decryption failed or bad record mac"},
268{SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG ,"dh public value length is wrong"},
269{SSL_R_DIGEST_CHECK_FAILED ,"digest check failed"},
270{SSL_R_ENCRYPTED_LENGTH_TOO_LONG ,"encrypted length too long"},
271{SSL_R_ERROR_GENERATING_TMP_RSA_KEY ,"error generating tmp rsa key"},
272{SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST ,"error in received cipher list"},
273{SSL_R_EXCESSIVE_MESSAGE_SIZE ,"excessive message size"},
274{SSL_R_EXTRA_DATA_IN_MESSAGE ,"extra data in message"},
275{SSL_R_GOT_A_FIN_BEFORE_A_CCS ,"got a fin before a ccs"},
276{SSL_R_HTTPS_PROXY_REQUEST ,"https proxy request"},
277{SSL_R_HTTP_REQUEST ,"http request"},
278{SSL_R_ILLEGAL_PADDING ,"illegal padding"},
279{SSL_R_INVALID_CHALLENGE_LENGTH ,"invalid challenge length"},
280{SSL_R_INVALID_COMMAND ,"invalid command"},
281{SSL_R_INVALID_PURPOSE ,"invalid purpose"},
282{SSL_R_INVALID_TRUST ,"invalid trust"},
283{SSL_R_KEY_ARG_TOO_LONG ,"key arg too long"},
284{SSL_R_KRB5 ,"krb5"},
285{SSL_R_KRB5_C_CC_PRINC ,"krb5 client cc principal (no tkt?)"},
286{SSL_R_KRB5_C_GET_CRED ,"krb5 client get cred"},
287{SSL_R_KRB5_C_INIT ,"krb5 client init"},
288{SSL_R_KRB5_C_MK_REQ ,"krb5 client mk_req (expired tkt?)"},
289{SSL_R_KRB5_S_BAD_TICKET ,"krb5 server bad ticket"},
290{SSL_R_KRB5_S_INIT ,"krb5 server init"},
291{SSL_R_KRB5_S_RD_REQ ,"krb5 server rd_req (keytab perms?)"},
292{SSL_R_KRB5_S_TKT_EXPIRED ,"krb5 server tkt expired"},
293{SSL_R_KRB5_S_TKT_NYV ,"krb5 server tkt not yet valid"},
294{SSL_R_KRB5_S_TKT_SKEW ,"krb5 server tkt skew"},
295{SSL_R_LENGTH_MISMATCH ,"length mismatch"},
296{SSL_R_LENGTH_TOO_SHORT ,"length too short"},
297{SSL_R_LIBRARY_BUG ,"library bug"},
298{SSL_R_LIBRARY_HAS_NO_CIPHERS ,"library has no ciphers"},
299{SSL_R_MESSAGE_TOO_LONG ,"message too long"},
300{SSL_R_MISSING_DH_DSA_CERT ,"missing dh dsa cert"},
301{SSL_R_MISSING_DH_KEY ,"missing dh key"},
302{SSL_R_MISSING_DH_RSA_CERT ,"missing dh rsa cert"},
303{SSL_R_MISSING_DSA_SIGNING_CERT ,"missing dsa signing cert"},
304{SSL_R_MISSING_EXPORT_TMP_DH_KEY ,"missing export tmp dh key"},
305{SSL_R_MISSING_EXPORT_TMP_RSA_KEY ,"missing export tmp rsa key"},
306{SSL_R_MISSING_RSA_CERTIFICATE ,"missing rsa certificate"},
307{SSL_R_MISSING_RSA_ENCRYPTING_CERT ,"missing rsa encrypting cert"},
308{SSL_R_MISSING_RSA_SIGNING_CERT ,"missing rsa signing cert"},
309{SSL_R_MISSING_TMP_DH_KEY ,"missing tmp dh key"},
310{SSL_R_MISSING_TMP_RSA_KEY ,"missing tmp rsa key"},
311{SSL_R_MISSING_TMP_RSA_PKEY ,"missing tmp rsa pkey"},
312{SSL_R_MISSING_VERIFY_MESSAGE ,"missing verify message"},
313{SSL_R_NON_SSLV2_INITIAL_PACKET ,"non sslv2 initial packet"},
314{SSL_R_NO_CERTIFICATES_RETURNED ,"no certificates returned"},
315{SSL_R_NO_CERTIFICATE_ASSIGNED ,"no certificate assigned"},
316{SSL_R_NO_CERTIFICATE_RETURNED ,"no certificate returned"},
317{SSL_R_NO_CERTIFICATE_SET ,"no certificate set"},
318{SSL_R_NO_CERTIFICATE_SPECIFIED ,"no certificate specified"},
319{SSL_R_NO_CIPHERS_AVAILABLE ,"no ciphers available"},
320{SSL_R_NO_CIPHERS_PASSED ,"no ciphers passed"},
321{SSL_R_NO_CIPHERS_SPECIFIED ,"no ciphers specified"},
322{SSL_R_NO_CIPHER_LIST ,"no cipher list"},
323{SSL_R_NO_CIPHER_MATCH ,"no cipher match"},
324{SSL_R_NO_CLIENT_CERT_RECEIVED ,"no client cert received"},
325{SSL_R_NO_COMPRESSION_SPECIFIED ,"no compression specified"},
326{SSL_R_NO_METHOD_SPECIFIED ,"no method specified"},
327{SSL_R_NO_PRIVATEKEY ,"no privatekey"},
328{SSL_R_NO_PRIVATE_KEY_ASSIGNED ,"no private key assigned"},
329{SSL_R_NO_PROTOCOLS_AVAILABLE ,"no protocols available"},
330{SSL_R_NO_PUBLICKEY ,"no publickey"},
331{SSL_R_NO_SHARED_CIPHER ,"no shared cipher"},
332{SSL_R_NO_VERIFY_CALLBACK ,"no verify callback"},
333{SSL_R_NULL_SSL_CTX ,"null ssl ctx"},
334{SSL_R_NULL_SSL_METHOD_PASSED ,"null ssl method passed"},
335{SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED ,"old session cipher not returned"},
336{SSL_R_PACKET_LENGTH_TOO_LONG ,"packet length too long"},
337{SSL_R_PATH_TOO_LONG ,"path too long"},
338{SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE ,"peer did not return a certificate"},
339{SSL_R_PEER_ERROR ,"peer error"},
340{SSL_R_PEER_ERROR_CERTIFICATE ,"peer error certificate"},
341{SSL_R_PEER_ERROR_NO_CERTIFICATE ,"peer error no certificate"},
342{SSL_R_PEER_ERROR_NO_CIPHER ,"peer error no cipher"},
343{SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE,"peer error unsupported certificate type"},
344{SSL_R_PRE_MAC_LENGTH_TOO_LONG ,"pre mac length too long"},
345{SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS ,"problems mapping cipher functions"},
346{SSL_R_PROTOCOL_IS_SHUTDOWN ,"protocol is shutdown"},
347{SSL_R_PUBLIC_KEY_ENCRYPT_ERROR ,"public key encrypt error"},
348{SSL_R_PUBLIC_KEY_IS_NOT_RSA ,"public key is not rsa"},
349{SSL_R_PUBLIC_KEY_NOT_RSA ,"public key not rsa"},
350{SSL_R_READ_BIO_NOT_SET ,"read bio not set"},
351{SSL_R_READ_WRONG_PACKET_TYPE ,"read wrong packet type"},
352{SSL_R_RECORD_LENGTH_MISMATCH ,"record length mismatch"},
353{SSL_R_RECORD_TOO_LARGE ,"record too large"},
354{SSL_R_RECORD_TOO_SMALL ,"record too small"},
355{SSL_R_REQUIRED_CIPHER_MISSING ,"required cipher missing"},
356{SSL_R_REUSE_CERT_LENGTH_NOT_ZERO ,"reuse cert length not zero"},
357{SSL_R_REUSE_CERT_TYPE_NOT_ZERO ,"reuse cert type not zero"},
358{SSL_R_REUSE_CIPHER_LIST_NOT_ZERO ,"reuse cipher list not zero"},
359{SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED ,"session id context uninitialized"},
360{SSL_R_SHORT_READ ,"short read"},
361{SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE,"signature for non signing certificate"},
362{SSL_R_SSL23_DOING_SESSION_ID_REUSE ,"ssl23 doing session id reuse"},
363{SSL_R_SSL2_CONNECTION_ID_TOO_LONG ,"ssl2 connection id too long"},
364{SSL_R_SSL3_SESSION_ID_TOO_LONG ,"ssl3 session id too long"},
365{SSL_R_SSL3_SESSION_ID_TOO_SHORT ,"ssl3 session id too short"},
366{SSL_R_SSLV3_ALERT_BAD_CERTIFICATE ,"sslv3 alert bad certificate"},
367{SSL_R_SSLV3_ALERT_BAD_RECORD_MAC ,"sslv3 alert bad record mac"},
368{SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED ,"sslv3 alert certificate expired"},
369{SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED ,"sslv3 alert certificate revoked"},
370{SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN ,"sslv3 alert certificate unknown"},
371{SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE ,"sslv3 alert decompression failure"},
372{SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE ,"sslv3 alert handshake failure"},
373{SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER ,"sslv3 alert illegal parameter"},
374{SSL_R_SSLV3_ALERT_NO_CERTIFICATE ,"sslv3 alert no certificate"},
375{SSL_R_SSLV3_ALERT_PEER_ERROR_CERTIFICATE,"sslv3 alert peer error certificate"},
376{SSL_R_SSLV3_ALERT_PEER_ERROR_NO_CERTIFICATE,"sslv3 alert peer error no certificate"},
377{SSL_R_SSLV3_ALERT_PEER_ERROR_NO_CIPHER ,"sslv3 alert peer error no cipher"},
378{SSL_R_SSLV3_ALERT_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE,"sslv3 alert peer error unsupported certificate type"},
379{SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE ,"sslv3 alert unexpected message"},
380{SSL_R_SSLV3_ALERT_UNKNOWN_REMOTE_ERROR_TYPE,"sslv3 alert unknown remote error type"},
381{SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE,"sslv3 alert unsupported certificate"},
382{SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION,"ssl ctx has no default ssl version"},
383{SSL_R_SSL_HANDSHAKE_FAILURE ,"ssl handshake failure"},
384{SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS ,"ssl library has no ciphers"},
385{SSL_R_SSL_SESSION_ID_CALLBACK_FAILED ,"ssl session id callback failed"},
386{SSL_R_SSL_SESSION_ID_CONFLICT ,"ssl session id conflict"},
387{SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG ,"ssl session id context too long"},
388{SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH ,"ssl session id has bad length"},
389{SSL_R_SSL_SESSION_ID_IS_DIFFERENT ,"ssl session id is different"},
390{SSL_R_TLSV1_ALERT_ACCESS_DENIED ,"tlsv1 alert access denied"},
391{SSL_R_TLSV1_ALERT_DECODE_ERROR ,"tlsv1 alert decode error"},
392{SSL_R_TLSV1_ALERT_DECRYPTION_FAILED ,"tlsv1 alert decryption failed"},
393{SSL_R_TLSV1_ALERT_DECRYPT_ERROR ,"tlsv1 alert decrypt error"},
394{SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION ,"tlsv1 alert export restriction"},
395{SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY ,"tlsv1 alert insufficient security"},
396{SSL_R_TLSV1_ALERT_INTERNAL_ERROR ,"tlsv1 alert internal error"},
397{SSL_R_TLSV1_ALERT_NO_RENEGOTIATION ,"tlsv1 alert no renegotiation"},
398{SSL_R_TLSV1_ALERT_PROTOCOL_VERSION ,"tlsv1 alert protocol version"},
399{SSL_R_TLSV1_ALERT_RECORD_OVERFLOW ,"tlsv1 alert record overflow"},
400{SSL_R_TLSV1_ALERT_UNKNOWN_CA ,"tlsv1 alert unknown ca"},
401{SSL_R_TLSV1_ALERT_USER_CANCELLED ,"tlsv1 alert user cancelled"},
402{SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER,"tls client cert req with anon cipher"},
403{SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST,"tls peer did not respond with certificate list"},
404{SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG,"tls rsa encrypted value length is wrong"},
405{SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER ,"tried to use unsupported cipher"},
406{SSL_R_UNABLE_TO_DECODE_DH_CERTS ,"unable to decode dh certs"},
407{SSL_R_UNABLE_TO_EXTRACT_PUBLIC_KEY ,"unable to extract public key"},
408{SSL_R_UNABLE_TO_FIND_DH_PARAMETERS ,"unable to find dh parameters"},
409{SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS,"unable to find public key parameters"},
410{SSL_R_UNABLE_TO_FIND_SSL_METHOD ,"unable to find ssl method"},
411{SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES ,"unable to load ssl2 md5 routines"},
412{SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES ,"unable to load ssl3 md5 routines"},
413{SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES ,"unable to load ssl3 sha1 routines"},
414{SSL_R_UNEXPECTED_MESSAGE ,"unexpected message"},
415{SSL_R_UNEXPECTED_RECORD ,"unexpected record"},
416{SSL_R_UNINITIALIZED ,"uninitialized"},
417{SSL_R_UNKNOWN_ALERT_TYPE ,"unknown alert type"},
418{SSL_R_UNKNOWN_CERTIFICATE_TYPE ,"unknown certificate type"},
419{SSL_R_UNKNOWN_CIPHER_RETURNED ,"unknown cipher returned"},
420{SSL_R_UNKNOWN_CIPHER_TYPE ,"unknown cipher type"},
421{SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE ,"unknown key exchange type"},
422{SSL_R_UNKNOWN_PKEY_TYPE ,"unknown pkey type"},
423{SSL_R_UNKNOWN_PROTOCOL ,"unknown protocol"},
424{SSL_R_UNKNOWN_REMOTE_ERROR_TYPE ,"unknown remote error type"},
425{SSL_R_UNKNOWN_SSL_VERSION ,"unknown ssl version"},
426{SSL_R_UNKNOWN_STATE ,"unknown state"},
427{SSL_R_UNSUPPORTED_CIPHER ,"unsupported cipher"},
428{SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM ,"unsupported compression algorithm"},
429{SSL_R_UNSUPPORTED_OPTION ,"unsupported option"},
430{SSL_R_UNSUPPORTED_PROTOCOL ,"unsupported protocol"},
431{SSL_R_UNSUPPORTED_SSL_VERSION ,"unsupported ssl version"},
432{SSL_R_WRITE_BIO_NOT_SET ,"write bio not set"},
433{SSL_R_WRONG_CIPHER_RETURNED ,"wrong cipher returned"},
434{SSL_R_WRONG_MESSAGE_TYPE ,"wrong message type"},
435{SSL_R_WRONG_NUMBER_OF_KEY_BITS ,"wrong number of key bits"},
436{SSL_R_WRONG_SIGNATURE_LENGTH ,"wrong signature length"},
437{SSL_R_WRONG_SIGNATURE_SIZE ,"wrong signature size"},
438{SSL_R_WRONG_SSL_VERSION ,"wrong ssl version"},
439{SSL_R_WRONG_VERSION_NUMBER ,"wrong version number"},
440{SSL_R_X509_LIB ,"x509 lib"},
441{SSL_R_X509_VERIFICATION_SETUP_PROBLEMS ,"x509 verification setup problems"},
442{0,NULL}
443 };
444
445#endif
446
447void ERR_load_SSL_strings(void)
448 {
449 static int init=1;
450
451 if (init)
452 {
453 init=0;
454#ifndef OPENSSL_NO_ERR
455 ERR_load_strings(ERR_LIB_SSL,SSL_str_functs);
456 ERR_load_strings(ERR_LIB_SSL,SSL_str_reasons);
457#endif
458
459 }
460 }
diff --git a/src/lib/libssl/ssl_err2.c b/src/lib/libssl/ssl_err2.c
deleted file mode 100644
index ea95a5f983..0000000000
--- a/src/lib/libssl/ssl_err2.c
+++ /dev/null
@@ -1,70 +0,0 @@
1/* ssl/ssl_err2.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include <openssl/err.h>
61#include <openssl/ssl.h>
62
63void SSL_load_error_strings(void)
64 {
65#ifndef OPENSSL_NO_ERR
66 ERR_load_crypto_strings();
67 ERR_load_SSL_strings();
68#endif
69 }
70
diff --git a/src/lib/libssl/ssl_lib.c b/src/lib/libssl/ssl_lib.c
deleted file mode 100644
index 4bc4ce5b3a..0000000000
--- a/src/lib/libssl/ssl_lib.c
+++ /dev/null
@@ -1,2302 +0,0 @@
1/*! \file ssl/ssl_lib.c
2 * \brief Version independent SSL functions.
3 */
4/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
5 * All rights reserved.
6 *
7 * This package is an SSL implementation written
8 * by Eric Young (eay@cryptsoft.com).
9 * The implementation was written so as to conform with Netscapes SSL.
10 *
11 * This library is free for commercial and non-commercial use as long as
12 * the following conditions are aheared to. The following conditions
13 * apply to all code found in this distribution, be it the RC4, RSA,
14 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
15 * included with this distribution is covered by the same copyright terms
16 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
17 *
18 * Copyright remains Eric Young's, and as such any Copyright notices in
19 * the code are not to be removed.
20 * If this package is used in a product, Eric Young should be given attribution
21 * as the author of the parts of the library used.
22 * This can be in the form of a textual message at program startup or
23 * in documentation (online or textual) provided with the package.
24 *
25 * Redistribution and use in source and binary forms, with or without
26 * modification, are permitted provided that the following conditions
27 * are met:
28 * 1. Redistributions of source code must retain the copyright
29 * notice, this list of conditions and the following disclaimer.
30 * 2. Redistributions in binary form must reproduce the above copyright
31 * notice, this list of conditions and the following disclaimer in the
32 * documentation and/or other materials provided with the distribution.
33 * 3. All advertising materials mentioning features or use of this software
34 * must display the following acknowledgement:
35 * "This product includes cryptographic software written by
36 * Eric Young (eay@cryptsoft.com)"
37 * The word 'cryptographic' can be left out if the rouines from the library
38 * being used are not cryptographic related :-).
39 * 4. If you include any Windows specific code (or a derivative thereof) from
40 * the apps directory (application code) you must include an acknowledgement:
41 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
42 *
43 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
44 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
45 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
46 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
47 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
48 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
49 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
50 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
51 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
52 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
53 * SUCH DAMAGE.
54 *
55 * The licence and distribution terms for any publically available version or
56 * derivative of this code cannot be changed. i.e. this code cannot simply be
57 * copied and put under another distribution licence
58 * [including the GNU Public Licence.]
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 */
113
114
115#ifdef REF_CHECK
116# include <assert.h>
117#endif
118#include <stdio.h>
119#include "ssl_locl.h"
120#include "kssl_lcl.h"
121#include <openssl/objects.h>
122#include <openssl/lhash.h>
123#include <openssl/x509v3.h>
124
125const char *SSL_version_str=OPENSSL_VERSION_TEXT;
126
127OPENSSL_GLOBAL SSL3_ENC_METHOD ssl3_undef_enc_method={
128 /* evil casts, but these functions are only called if there's a library bug */
129 (int (*)(SSL *,int))ssl_undefined_function,
130 (int (*)(SSL *, unsigned char *, int))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
135 };
136
137int SSL_clear(SSL *s)
138 {
139
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 }
151
152 s->error=0;
153 s->hit=0;
154 s->shutdown=0;
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) */
158 /* This is set if we are doing dynamic renegotiation so keep
159 * the old cipher. It is sort of a SSL_clear_lite :-) */
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
168
169 s->type=0;
170
171 s->state=SSL_ST_BEFORE|((s->server)?SSL_ST_ACCEPT:SSL_ST_CONNECT);
172
173 s->version=s->method->version;
174 s->client_version=s->version;
175 s->rwstate=SSL_NOTHING;
176 s->rstate=SSL_ST_READ_HEADER;
177#if 0
178 s->read_ahead=s->ctx->read_ahead;
179#endif
180
181 if (s->init_buf != NULL)
182 {
183 BUF_MEM_free(s->init_buf);
184 s->init_buf=NULL;
185 }
186
187 ssl_clear_cipher_ctx(s);
188
189 s->first_packet=0;
190
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);
205 }
206
207/** Used to change an SSL_CTXs default SSL method type */
208int SSL_CTX_set_ssl_version(SSL_CTX *ctx,SSL_METHOD *meth)
209 {
210 STACK_OF(SSL_CIPHER) *sk;
211
212 ctx->method=meth;
213
214 sk=ssl_create_cipher_list(ctx->method,&(ctx->cipher_list),
215 &(ctx->cipher_list_by_id),SSL_DEFAULT_CIPHER_LIST);
216 if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= 0))
217 {
218 SSLerr(SSL_F_SSL_CTX_SET_SSL_VERSION,SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS);
219 return(0);
220 }
221 return(1);
222 }
223
224SSL *SSL_new(SSL_CTX *ctx)
225 {
226 SSL *s;
227
228 if (ctx == NULL)
229 {
230 SSLerr(SSL_F_SSL_NEW,SSL_R_NULL_SSL_CTX);
231 return(NULL);
232 }
233 if (ctx->method == NULL)
234 {
235 SSLerr(SSL_F_SSL_NEW,SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION);
236 return(NULL);
237 }
238
239 s=(SSL *)OPENSSL_malloc(sizeof(SSL));
240 if (s == NULL) goto err;
241 memset(s,0,sizeof(SSL));
242
243#ifndef OPENSSL_NO_KRB5
244 s->kssl_ctx = kssl_ctx_new();
245#endif /* OPENSSL_NO_KRB5 */
246
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;
266 }
267 else
268 s->cert=NULL; /* Cannot really happen (see SSL_CTX_new) */
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));
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
283 CRYPTO_add(&ctx->references,1,CRYPTO_LOCK_SSL_CTX);
284 s->ctx=ctx;
285
286 s->verify_result=X509_V_OK;
287
288 s->method=ctx->method;
289
290 if (!s->method->ssl_new(s))
291 goto err;
292
293 s->references=1;
294 s->server=(ctx->method->ssl_accept == ssl_undefined_function)?0:1;
295
296 SSL_clear(s);
297
298 CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL, s, &s->ex_data);
299
300 return(s);
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 }
310 SSLerr(SSL_F_SSL_NEW,ERR_R_MALLOC_FAILURE);
311 return(NULL);
312 }
313
314int SSL_CTX_set_session_id_context(SSL_CTX *ctx,const unsigned char *sid_ctx,
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)
409 {
410 int i;
411
412 if(s == NULL)
413 return;
414
415 i=CRYPTO_add(&s->references,-1,CRYPTO_LOCK_SSL);
416#ifdef REF_PRINT
417 REF_PRINT("SSL",s);
418#endif
419 if (i > 0) return;
420#ifdef REF_CHECK
421 if (i < 0)
422 {
423 fprintf(stderr,"SSL_free, bad reference count\n");
424 abort(); /* ok */
425 }
426#endif
427
428 CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL, s, &s->ex_data);
429
430 if (s->bbio != NULL)
431 {
432 /* If the buffering BIO is in place, pop it off */
433 if (s->bbio == s->wbio)
434 {
435 s->wbio=BIO_pop(s->wbio);
436 }
437 BIO_free(s->bbio);
438 s->bbio=NULL;
439 }
440 if (s->rbio != NULL)
441 BIO_free_all(s->rbio);
442 if ((s->wbio != NULL) && (s->wbio != s->rbio))
443 BIO_free_all(s->wbio);
444
445 if (s->init_buf != NULL) BUF_MEM_free(s->init_buf);
446
447 /* add extra stuff */
448 if (s->cipher_list != NULL) sk_SSL_CIPHER_free(s->cipher_list);
449 if (s->cipher_list_by_id != NULL) sk_SSL_CIPHER_free(s->cipher_list_by_id);
450
451 /* Make the next call work :-) */
452 if (s->session != NULL)
453 {
454 ssl_clear_bad_session(s);
455 SSL_SESSION_free(s->session);
456 }
457
458 ssl_clear_cipher_ctx(s);
459
460 if (s->cert != NULL) ssl_cert_free(s->cert);
461 /* Free up if allocated */
462
463 if (s->ctx) SSL_CTX_free(s->ctx);
464
465 if (s->client_CA != NULL)
466 sk_X509_NAME_pop_free(s->client_CA,X509_NAME_free);
467
468 if (s->method != NULL) s->method->ssl_free(s);
469
470 OPENSSL_free(s);
471 }
472
473void SSL_set_bio(SSL *s,BIO *rbio,BIO *wbio)
474 {
475 /* If the output buffering BIO is still in place, remove it
476 */
477 if (s->bbio != NULL)
478 {
479 if (s->wbio == s->bbio)
480 {
481 s->wbio=s->wbio->next_bio;
482 s->bbio->next_bio=NULL;
483 }
484 }
485 if ((s->rbio != NULL) && (s->rbio != rbio))
486 BIO_free_all(s->rbio);
487 if ((s->wbio != NULL) && (s->wbio != wbio) && (s->rbio != s->wbio))
488 BIO_free_all(s->wbio);
489 s->rbio=rbio;
490 s->wbio=wbio;
491 }
492
493BIO *SSL_get_rbio(SSL *s)
494 { return(s->rbio); }
495
496BIO *SSL_get_wbio(SSL *s)
497 { return(s->wbio); }
498
499int SSL_get_fd(SSL *s)
500 {
501 return(SSL_get_rfd(s));
502 }
503
504int SSL_get_rfd(SSL *s)
505 {
506 int ret= -1;
507 BIO *b,*r;
508
509 b=SSL_get_rbio(s);
510 r=BIO_find_type(b,BIO_TYPE_DESCRIPTOR);
511 if (r != NULL)
512 BIO_get_fd(r,&ret);
513 return(ret);
514 }
515
516int SSL_get_wfd(SSL *s)
517 {
518 int ret= -1;
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)
530 {
531 int ret=0;
532 BIO *bio=NULL;
533
534 bio=BIO_new(BIO_s_socket());
535
536 if (bio == NULL)
537 {
538 SSLerr(SSL_F_SSL_SET_FD,ERR_R_BUF_LIB);
539 goto err;
540 }
541 BIO_set_fd(bio,fd,BIO_NOCLOSE);
542 SSL_set_bio(s,bio,bio);
543 ret=1;
544err:
545 return(ret);
546 }
547
548int SSL_set_wfd(SSL *s,int fd)
549 {
550 int ret=0;
551 BIO *bio=NULL;
552
553 if ((s->rbio == NULL) || (BIO_method_type(s->rbio) != BIO_TYPE_SOCKET)
554 || ((int)BIO_get_fd(s->rbio,NULL) != fd))
555 {
556 bio=BIO_new(BIO_s_socket());
557
558 if (bio == NULL)
559 { SSLerr(SSL_F_SSL_SET_WFD,ERR_R_BUF_LIB); goto err; }
560 BIO_set_fd(bio,fd,BIO_NOCLOSE);
561 SSL_set_bio(s,SSL_get_rbio(s),bio);
562 }
563 else
564 SSL_set_bio(s,SSL_get_rbio(s),SSL_get_rbio(s));
565 ret=1;
566err:
567 return(ret);
568 }
569
570int SSL_set_rfd(SSL *s,int fd)
571 {
572 int ret=0;
573 BIO *bio=NULL;
574
575 if ((s->wbio == NULL) || (BIO_method_type(s->wbio) != BIO_TYPE_SOCKET)
576 || ((int)BIO_get_fd(s->wbio,NULL) != fd))
577 {
578 bio=BIO_new(BIO_s_socket());
579
580 if (bio == NULL)
581 {
582 SSLerr(SSL_F_SSL_SET_RFD,ERR_R_BUF_LIB);
583 goto err;
584 }
585 BIO_set_fd(bio,fd,BIO_NOCLOSE);
586 SSL_set_bio(s,bio,SSL_get_wbio(s));
587 }
588 else
589 SSL_set_bio(s,SSL_get_wbio(s),SSL_get_wbio(s));
590 ret=1;
591err:
592 return(ret);
593 }
594#endif
595
596
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)
629 {
630 return(s->verify_mode);
631 }
632
633int SSL_get_verify_depth(SSL *s)
634 {
635 return(s->verify_depth);
636 }
637
638int (*SSL_get_verify_callback(SSL *s))(int,X509_STORE_CTX *)
639 {
640 return(s->verify_callback);
641 }
642
643int SSL_CTX_get_verify_mode(SSL_CTX *ctx)
644 {
645 return(ctx->verify_mode);
646 }
647
648int SSL_CTX_get_verify_depth(SSL_CTX *ctx)
649 {
650 return(ctx->verify_depth);
651 }
652
653int (*SSL_CTX_get_verify_callback(SSL_CTX *ctx))(int,X509_STORE_CTX *)
654 {
655 return(ctx->default_verify_callback);
656 }
657
658void SSL_set_verify(SSL *s,int mode,
659 int (*callback)(int ok,X509_STORE_CTX *ctx))
660 {
661 s->verify_mode=mode;
662 if (callback != NULL)
663 s->verify_callback=callback;
664 }
665
666void SSL_set_verify_depth(SSL *s,int depth)
667 {
668 s->verify_depth=depth;
669 }
670
671void SSL_set_read_ahead(SSL *s,int yes)
672 {
673 s->read_ahead=yes;
674 }
675
676int SSL_get_read_ahead(SSL *s)
677 {
678 return(s->read_ahead);
679 }
680
681int SSL_pending(SSL *s)
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 */
690 return(s->method->ssl_pending(s));
691 }
692
693X509 *SSL_get_peer_certificate(SSL *s)
694 {
695 X509 *r;
696
697 if ((s == NULL) || (s->session == NULL))
698 r=NULL;
699 else
700 r=s->session->peer;
701
702 if (r == NULL) return(r);
703
704 CRYPTO_add(&r->references,1,CRYPTO_LOCK_X509);
705
706 return(r);
707 }
708
709STACK_OF(X509) *SSL_get_peer_cert_chain(SSL *s)
710 {
711 STACK_OF(X509) *r;
712
713 if ((s == NULL) || (s->session == NULL) || (s->session->sess_cert == NULL))
714 r=NULL;
715 else
716 r=s->session->sess_cert->cert_chain;
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
721 return(r);
722 }
723
724/* Now in theory, since the calling process own 't' it should be safe to
725 * modify. We need to be able to read f without being hassled */
726void SSL_copy_session_id(SSL *t,SSL *f)
727 {
728 CERT *tmp;
729
730 /* Do we need to to SSL locking? */
731 SSL_set_session(t,SSL_get_session(f));
732
733 /* what if we are setup as SSLv2 but want to talk SSLv3 or
734 * vice-versa */
735 if (t->method != f->method)
736 {
737 t->method->ssl_free(t); /* cleanup current */
738 t->method=f->method; /* change method */
739 t->method->ssl_new(t); /* setup new */
740 }
741
742 tmp=t->cert;
743 if (f->cert != NULL)
744 {
745 CRYPTO_add(&f->cert->references,1,CRYPTO_LOCK_SSL_CERT);
746 t->cert=f->cert;
747 }
748 else
749 t->cert=NULL;
750 if (tmp != NULL) ssl_cert_free(tmp);
751 SSL_set_session_id_context(t,f->sid_ctx,f->sid_ctx_length);
752 }
753
754/* Fix this so it checks all the valid key/cert options */
755int SSL_CTX_check_private_key(SSL_CTX *ctx)
756 {
757 if ( (ctx == NULL) ||
758 (ctx->cert == NULL) ||
759 (ctx->cert->key->x509 == NULL))
760 {
761 SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);
762 return(0);
763 }
764 if (ctx->cert->key->privatekey == NULL)
765 {
766 SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,SSL_R_NO_PRIVATE_KEY_ASSIGNED);
767 return(0);
768 }
769 return(X509_check_private_key(ctx->cert->key->x509, ctx->cert->key->privatekey));
770 }
771
772/* Fix this function so that it takes an optional type parameter */
773int SSL_check_private_key(SSL *ssl)
774 {
775 if (ssl == NULL)
776 {
777 SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,ERR_R_PASSED_NULL_PARAMETER);
778 return(0);
779 }
780 if (ssl->cert == NULL)
781 {
782 SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);
783 return 0;
784 }
785 if (ssl->cert->key->x509 == NULL)
786 {
787 SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);
788 return(0);
789 }
790 if (ssl->cert->key->privatekey == NULL)
791 {
792 SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_PRIVATE_KEY_ASSIGNED);
793 return(0);
794 }
795 return(X509_check_private_key(ssl->cert->key->x509,
796 ssl->cert->key->privatekey));
797 }
798
799int SSL_accept(SSL *s)
800 {
801 if (s->handshake_func == 0)
802 /* Not properly initialized yet */
803 SSL_set_accept_state(s);
804
805 return(s->method->ssl_accept(s));
806 }
807
808int SSL_connect(SSL *s)
809 {
810 if (s->handshake_func == 0)
811 /* Not properly initialized yet */
812 SSL_set_connect_state(s);
813
814 return(s->method->ssl_connect(s));
815 }
816
817long SSL_get_default_timeout(SSL *s)
818 {
819 return(s->method->get_timeout());
820 }
821
822int SSL_read(SSL *s,void *buf,int num)
823 {
824 if (s->handshake_func == 0)
825 {
826 SSLerr(SSL_F_SSL_READ, SSL_R_UNINITIALIZED);
827 return -1;
828 }
829
830 if (s->shutdown & SSL_RECEIVED_SHUTDOWN)
831 {
832 s->rwstate=SSL_NOTHING;
833 return(0);
834 }
835 return(s->method->ssl_read(s,buf,num));
836 }
837
838int SSL_peek(SSL *s,void *buf,int num)
839 {
840 if (s->handshake_func == 0)
841 {
842 SSLerr(SSL_F_SSL_READ, SSL_R_UNINITIALIZED);
843 return -1;
844 }
845
846 if (s->shutdown & SSL_RECEIVED_SHUTDOWN)
847 {
848 return(0);
849 }
850 return(s->method->ssl_peek(s,buf,num));
851 }
852
853int SSL_write(SSL *s,const void *buf,int num)
854 {
855 if (s->handshake_func == 0)
856 {
857 SSLerr(SSL_F_SSL_WRITE, SSL_R_UNINITIALIZED);
858 return -1;
859 }
860
861 if (s->shutdown & SSL_SENT_SHUTDOWN)
862 {
863 s->rwstate=SSL_NOTHING;
864 SSLerr(SSL_F_SSL_WRITE,SSL_R_PROTOCOL_IS_SHUTDOWN);
865 return(-1);
866 }
867 return(s->method->ssl_write(s,buf,num));
868 }
869
870int SSL_shutdown(SSL *s)
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
884 if ((s != NULL) && !SSL_in_init(s))
885 return(s->method->ssl_shutdown(s));
886 else
887 return(1);
888 }
889
890int SSL_renegotiate(SSL *s)
891 {
892 if (s->new_session == 0)
893 {
894 s->new_session=1;
895 }
896 return(s->method->ssl_renegotiate(s));
897 }
898
899int SSL_renegotiate_pending(SSL *s)
900 {
901 /* becomes true when negotiation is requested;
902 * false again once a handshake has finished */
903 return (s->new_session != 0);
904 }
905
906long SSL_ctrl(SSL *s,int cmd,long larg,void *parg)
907 {
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 }
949 }
950
951struct lhash_st *SSL_CTX_sessions(SSL_CTX *ctx)
952 {
953 return ctx->sessions;
954 }
955
956long SSL_CTX_ctrl(SSL_CTX *ctx,int cmd,long larg,void *parg)
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)
1040 {
1041 long l;
1042
1043 l=a->id-b->id;
1044 if (l == 0L)
1045 return(0);
1046 else
1047 return((l > 0)?1:-1);
1048 }
1049
1050int ssl_cipher_ptr_id_cmp(const SSL_CIPHER * const *ap,
1051 const SSL_CIPHER * const *bp)
1052 {
1053 long l;
1054
1055 l=(*ap)->id-(*bp)->id;
1056 if (l == 0L)
1057 return(0);
1058 else
1059 return((l > 0)?1:-1);
1060 }
1061
1062/** return a STACK of the ciphers available for the SSL and in order of
1063 * preference */
1064STACK_OF(SSL_CIPHER) *SSL_get_ciphers(SSL *s)
1065 {
1066 if ((s != NULL) && (s->cipher_list != NULL))
1067 {
1068 return(s->cipher_list);
1069 }
1070 else if ((s->ctx != NULL) &&
1071 (s->ctx->cipher_list != NULL))
1072 {
1073 return(s->ctx->cipher_list);
1074 }
1075 return(NULL);
1076 }
1077
1078/** return a STACK of the ciphers available for the SSL and in order of
1079 * algorithm id */
1080STACK_OF(SSL_CIPHER) *ssl_get_ciphers_by_id(SSL *s)
1081 {
1082 if ((s != NULL) && (s->cipher_list_by_id != NULL))
1083 {
1084 return(s->cipher_list_by_id);
1085 }
1086 else if ((s != NULL) && (s->ctx != NULL) &&
1087 (s->ctx->cipher_list_by_id != NULL))
1088 {
1089 return(s->ctx->cipher_list_by_id);
1090 }
1091 return(NULL);
1092 }
1093
1094/** The old interface to get the same thing as SSL_get_ciphers() */
1095const char *SSL_get_cipher_list(SSL *s,int n)
1096 {
1097 SSL_CIPHER *c;
1098 STACK_OF(SSL_CIPHER) *sk;
1099
1100 if (s == NULL) return(NULL);
1101 sk=SSL_get_ciphers(s);
1102 if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= n))
1103 return(NULL);
1104 c=sk_SSL_CIPHER_value(sk,n);
1105 if (c == NULL) return(NULL);
1106 return(c->name);
1107 }
1108
1109/** specify the ciphers to be used by default by the SSL_CTX */
1110int SSL_CTX_set_cipher_list(SSL_CTX *ctx, const char *str)
1111 {
1112 STACK_OF(SSL_CIPHER) *sk;
1113
1114 sk=ssl_create_cipher_list(ctx->method,&ctx->cipher_list,
1115 &ctx->cipher_list_by_id,str);
1116/* XXXX */
1117 return((sk == NULL)?0:1);
1118 }
1119
1120/** specify the ciphers to be used by the SSL */
1121int SSL_set_cipher_list(SSL *s,const char *str)
1122 {
1123 STACK_OF(SSL_CIPHER) *sk;
1124
1125 sk=ssl_create_cipher_list(s->ctx->method,&s->cipher_list,
1126 &s->cipher_list_by_id,str);
1127/* XXXX */
1128 return((sk == NULL)?0:1);
1129 }
1130
1131/* works well for SSLv2, not so good for SSLv3 */
1132char *SSL_get_shared_ciphers(SSL *s,char *buf,int len)
1133 {
1134 char *p;
1135 const char *cp;
1136 STACK_OF(SSL_CIPHER) *sk;
1137 SSL_CIPHER *c;
1138 int i;
1139
1140 if ((s->session == NULL) || (s->session->ciphers == NULL) ||
1141 (len < 2))
1142 return(NULL);
1143
1144 p=buf;
1145 sk=s->session->ciphers;
1146 for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
1147 {
1148 /* Decrement for either the ':' or a '\0' */
1149 len--;
1150 c=sk_SSL_CIPHER_value(sk,i);
1151 for (cp=c->name; *cp; )
1152 {
1153 if (len-- == 0)
1154 {
1155 *p='\0';
1156 return(buf);
1157 }
1158 else
1159 *(p++)= *(cp++);
1160 }
1161 *(p++)=':';
1162 }
1163 p[-1]='\0';
1164 return(buf);
1165 }
1166
1167int ssl_cipher_list_to_bytes(SSL *s,STACK_OF(SSL_CIPHER) *sk,unsigned char *p)
1168 {
1169 int i,j=0;
1170 SSL_CIPHER *c;
1171 unsigned char *q;
1172#ifndef OPENSSL_NO_KRB5
1173 int nokrb5 = !kssl_tgt_is_available(s->kssl_ctx);
1174#endif /* OPENSSL_NO_KRB5 */
1175
1176 if (sk == NULL) return(0);
1177 q=p;
1178
1179 for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
1180 {
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 */
1186 j=ssl_put_cipher_by_char(s,c,p);
1187 p+=j;
1188 }
1189 return(p-q);
1190 }
1191
1192STACK_OF(SSL_CIPHER) *ssl_bytes_to_cipher_list(SSL *s,unsigned char *p,int num,
1193 STACK_OF(SSL_CIPHER) **skp)
1194 {
1195 SSL_CIPHER *c;
1196 STACK_OF(SSL_CIPHER) *sk;
1197 int i,n;
1198
1199 n=ssl_put_cipher_by_char(s,NULL,NULL);
1200 if ((num%n) != 0)
1201 {
1202 SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST,SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST);
1203 return(NULL);
1204 }
1205 if ((skp == NULL) || (*skp == NULL))
1206 sk=sk_SSL_CIPHER_new_null(); /* change perhaps later */
1207 else
1208 {
1209 sk= *skp;
1210 sk_SSL_CIPHER_zero(sk);
1211 }
1212
1213 for (i=0; i<num; i+=n)
1214 {
1215 c=ssl_get_cipher_by_char(s,p);
1216 p+=n;
1217 if (c != NULL)
1218 {
1219 if (!sk_SSL_CIPHER_push(sk,c))
1220 {
1221 SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST,ERR_R_MALLOC_FAILURE);
1222 goto err;
1223 }
1224 }
1225 }
1226
1227 if (skp != NULL)
1228 *skp=sk;
1229 return(sk);
1230err:
1231 if ((skp == NULL) || (*skp == NULL))
1232 sk_SSL_CIPHER_free(sk);
1233 return(NULL);
1234 }
1235
1236unsigned long SSL_SESSION_hash(SSL_SESSION *a)
1237 {
1238 unsigned long l;
1239
1240 l=(unsigned long)
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);
1245 return(l);
1246 }
1247
1248/* NB: If this function (or indeed the hash function which uses a sort of
1249 * coarser function than this one) is changed, ensure
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)
1254 {
1255 if (a->ssl_version != b->ssl_version)
1256 return(1);
1257 if (a->session_id_length != b->session_id_length)
1258 return(1);
1259 return(memcmp(a->session_id,b->session_id,a->session_id_length));
1260 }
1261
1262/* These wrapper functions should remain rather than redeclaring
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)
1270 {
1271 SSL_CTX *ret=NULL;
1272
1273 if (meth == NULL)
1274 {
1275 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_NULL_SSL_METHOD_PASSED);
1276 return(NULL);
1277 }
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));
1285 if (ret == NULL)
1286 goto err;
1287
1288 memset(ret,0,sizeof(SSL_CTX));
1289
1290 ret->method=meth;
1291
1292 ret->cert_store=NULL;
1293 ret->session_cache_mode=SSL_SESS_CACHE_SERVER;
1294 ret->session_cache_size=SSL_SESSION_CACHE_MAX_SIZE_DEFAULT;
1295 ret->session_cache_head=NULL;
1296 ret->session_cache_tail=NULL;
1297
1298 /* We take the system default */
1299 ret->session_timeout=meth->get_timeout();
1300
1301 ret->new_session_cb=0;
1302 ret->remove_session_cb=0;
1303 ret->get_session_cb=0;
1304 ret->generate_session_id=0;
1305
1306 memset((char *)&ret->stats,0,sizeof(ret->stats));
1307
1308 ret->references=1;
1309 ret->quiet_shutdown=0;
1310
1311/* ret->cipher=NULL;*/
1312/* ret->s2->challenge=NULL;
1313 ret->master_key=NULL;
1314 ret->key_arg=NULL;
1315 ret->s2->conn_id=NULL; */
1316
1317 ret->info_callback=NULL;
1318
1319 ret->app_verify_callback=0;
1320 ret->app_verify_arg=NULL;
1321
1322 ret->max_cert_list=SSL_MAX_CERT_LIST_DEFAULT;
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;
1329 ret->default_verify_callback=NULL;
1330 if ((ret->cert=ssl_cert_new()) == NULL)
1331 goto err;
1332
1333 ret->default_passwd_callback=0;
1334 ret->default_passwd_callback_userdata=NULL;
1335 ret->client_cert_cb=0;
1336
1337 ret->sessions=lh_new(LHASH_HASH_FN(SSL_SESSION_hash),
1338 LHASH_COMP_FN(SSL_SESSION_cmp));
1339 if (ret->sessions == NULL) goto err;
1340 ret->cert_store=X509_STORE_new();
1341 if (ret->cert_store == NULL) goto err;
1342
1343 ssl_create_cipher_list(ret->method,
1344 &ret->cipher_list,&ret->cipher_list_by_id,
1345 SSL_DEFAULT_CIPHER_LIST);
1346 if (ret->cipher_list == NULL
1347 || sk_SSL_CIPHER_num(ret->cipher_list) <= 0)
1348 {
1349 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_LIBRARY_HAS_NO_CIPHERS);
1350 goto err2;
1351 }
1352
1353 if ((ret->rsa_md5=EVP_get_digestbyname("ssl2-md5")) == NULL)
1354 {
1355 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES);
1356 goto err2;
1357 }
1358 if ((ret->md5=EVP_get_digestbyname("ssl3-md5")) == NULL)
1359 {
1360 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES);
1361 goto err2;
1362 }
1363 if ((ret->sha1=EVP_get_digestbyname("ssl3-sha1")) == NULL)
1364 {
1365 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES);
1366 goto err2;
1367 }
1368
1369 if ((ret->client_CA=sk_X509_NAME_new_null()) == NULL)
1370 goto err;
1371
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();
1376
1377 return(ret);
1378err:
1379 SSLerr(SSL_F_SSL_CTX_NEW,ERR_R_MALLOC_FAILURE);
1380err2:
1381 if (ret != NULL) SSL_CTX_free(ret);
1382 return(NULL);
1383 }
1384
1385#if 0
1386static void SSL_COMP_free(SSL_COMP *comp)
1387 { OPENSSL_free(comp); }
1388#endif
1389
1390void SSL_CTX_free(SSL_CTX *a)
1391 {
1392 int i;
1393
1394 if (a == NULL) return;
1395
1396 i=CRYPTO_add(&a->references,-1,CRYPTO_LOCK_SSL_CTX);
1397#ifdef REF_PRINT
1398 REF_PRINT("SSL_CTX",a);
1399#endif
1400 if (i > 0) return;
1401#ifdef REF_CHECK
1402 if (i < 0)
1403 {
1404 fprintf(stderr,"SSL_CTX_free, bad reference count\n");
1405 abort(); /* ok */
1406 }
1407#endif
1408
1409 /*
1410 * Free internal session cache. However: the remove_cb() may reference
1411 * the ex_data of SSL_CTX, thus the ex_data store can only be removed
1412 * after the sessions were flushed.
1413 * As the ex_data handling routines might also touch the session cache,
1414 * the most secure solution seems to be: empty (flush) the cache, then
1415 * free ex_data, then finally free the cache.
1416 * (See ticket [openssl.org #212].)
1417 */
1418 if (a->sessions != NULL)
1419 SSL_CTX_flush_sessions(a,0);
1420
1421 CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL_CTX, a, &a->ex_data);
1422
1423 if (a->sessions != NULL)
1424 lh_free(a->sessions);
1425
1426 if (a->cert_store != NULL)
1427 X509_STORE_free(a->cert_store);
1428 if (a->cipher_list != NULL)
1429 sk_SSL_CIPHER_free(a->cipher_list);
1430 if (a->cipher_list_by_id != NULL)
1431 sk_SSL_CIPHER_free(a->cipher_list_by_id);
1432 if (a->cert != NULL)
1433 ssl_cert_free(a->cert);
1434 if (a->client_CA != NULL)
1435 sk_X509_NAME_pop_free(a->client_CA,X509_NAME_free);
1436 if (a->extra_certs != NULL)
1437 sk_X509_pop_free(a->extra_certs,X509_free);
1438#if 0 /* This should never be done, since it removes a global database */
1439 if (a->comp_methods != NULL)
1440 sk_SSL_COMP_pop_free(a->comp_methods,SSL_COMP_free);
1441#else
1442 a->comp_methods = NULL;
1443#endif
1444 OPENSSL_free(a);
1445 }
1446
1447void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb)
1448 {
1449 ctx->default_passwd_callback=cb;
1450 }
1451
1452void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx,void *u)
1453 {
1454 ctx->default_passwd_callback_userdata=u;
1455 }
1456
1457void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, int (*cb)(X509_STORE_CTX *,void *), void *arg)
1458 {
1459 ctx->app_verify_callback=cb;
1460 ctx->app_verify_arg=arg;
1461 }
1462
1463void SSL_CTX_set_verify(SSL_CTX *ctx,int mode,int (*cb)(int, X509_STORE_CTX *))
1464 {
1465 ctx->verify_mode=mode;
1466 ctx->default_verify_callback=cb;
1467 }
1468
1469void SSL_CTX_set_verify_depth(SSL_CTX *ctx,int depth)
1470 {
1471 ctx->verify_depth=depth;
1472 }
1473
1474void ssl_set_cert_masks(CERT *c, SSL_CIPHER *cipher)
1475 {
1476 CERT_PKEY *cpk;
1477 int rsa_enc,rsa_tmp,rsa_sign,dh_tmp,dh_rsa,dh_dsa,dsa_sign;
1478 int rsa_enc_export,dh_rsa_export,dh_dsa_export;
1479 int rsa_tmp_export,dh_tmp_export,kl;
1480 unsigned long mask,emask;
1481
1482 if (c == NULL) return;
1483
1484 kl=SSL_C_EXPORT_PKEYLENGTH(cipher);
1485
1486#ifndef OPENSSL_NO_RSA
1487 rsa_tmp=(c->rsa_tmp != NULL || c->rsa_tmp_cb != NULL);
1488 rsa_tmp_export=(c->rsa_tmp_cb != NULL ||
1489 (rsa_tmp && RSA_size(c->rsa_tmp)*8 <= kl));
1490#else
1491 rsa_tmp=rsa_tmp_export=0;
1492#endif
1493#ifndef OPENSSL_NO_DH
1494 dh_tmp=(c->dh_tmp != NULL || c->dh_tmp_cb != NULL);
1495 dh_tmp_export=(c->dh_tmp_cb != NULL ||
1496 (dh_tmp && DH_size(c->dh_tmp)*8 <= kl));
1497#else
1498 dh_tmp=dh_tmp_export=0;
1499#endif
1500
1501 cpk= &(c->pkeys[SSL_PKEY_RSA_ENC]);
1502 rsa_enc= (cpk->x509 != NULL && cpk->privatekey != NULL);
1503 rsa_enc_export=(rsa_enc && EVP_PKEY_size(cpk->privatekey)*8 <= kl);
1504 cpk= &(c->pkeys[SSL_PKEY_RSA_SIGN]);
1505 rsa_sign=(cpk->x509 != NULL && cpk->privatekey != NULL);
1506 cpk= &(c->pkeys[SSL_PKEY_DSA_SIGN]);
1507 dsa_sign=(cpk->x509 != NULL && cpk->privatekey != NULL);
1508 cpk= &(c->pkeys[SSL_PKEY_DH_RSA]);
1509 dh_rsa= (cpk->x509 != NULL && cpk->privatekey != NULL);
1510 dh_rsa_export=(dh_rsa && EVP_PKEY_size(cpk->privatekey)*8 <= kl);
1511 cpk= &(c->pkeys[SSL_PKEY_DH_DSA]);
1512/* FIX THIS EAY EAY EAY */
1513 dh_dsa= (cpk->x509 != NULL && cpk->privatekey != NULL);
1514 dh_dsa_export=(dh_dsa && EVP_PKEY_size(cpk->privatekey)*8 <= kl);
1515
1516 mask=0;
1517 emask=0;
1518
1519#ifdef CIPHER_DEBUG
1520 printf("rt=%d rte=%d dht=%d re=%d ree=%d rs=%d ds=%d dhr=%d dhd=%d\n",
1521 rsa_tmp,rsa_tmp_export,dh_tmp,
1522 rsa_enc,rsa_enc_export,rsa_sign,dsa_sign,dh_rsa,dh_dsa);
1523#endif
1524
1525 if (rsa_enc || (rsa_tmp && rsa_sign))
1526 mask|=SSL_kRSA;
1527 if (rsa_enc_export || (rsa_tmp_export && (rsa_sign || rsa_enc)))
1528 emask|=SSL_kRSA;
1529
1530#if 0
1531 /* The match needs to be both kEDH and aRSA or aDSA, so don't worry */
1532 if ( (dh_tmp || dh_rsa || dh_dsa) &&
1533 (rsa_enc || rsa_sign || dsa_sign))
1534 mask|=SSL_kEDH;
1535 if ((dh_tmp_export || dh_rsa_export || dh_dsa_export) &&
1536 (rsa_enc || rsa_sign || dsa_sign))
1537 emask|=SSL_kEDH;
1538#endif
1539
1540 if (dh_tmp_export)
1541 emask|=SSL_kEDH;
1542
1543 if (dh_tmp)
1544 mask|=SSL_kEDH;
1545
1546 if (dh_rsa) mask|=SSL_kDHr;
1547 if (dh_rsa_export) emask|=SSL_kDHr;
1548
1549 if (dh_dsa) mask|=SSL_kDHd;
1550 if (dh_dsa_export) emask|=SSL_kDHd;
1551
1552 if (rsa_enc || rsa_sign)
1553 {
1554 mask|=SSL_aRSA;
1555 emask|=SSL_aRSA;
1556 }
1557
1558 if (dsa_sign)
1559 {
1560 mask|=SSL_aDSS;
1561 emask|=SSL_aDSS;
1562 }
1563
1564 mask|=SSL_aNULL;
1565 emask|=SSL_aNULL;
1566
1567#ifndef OPENSSL_NO_KRB5
1568 mask|=SSL_kKRB5|SSL_aKRB5;
1569 emask|=SSL_kKRB5|SSL_aKRB5;
1570#endif
1571
1572 c->mask=mask;
1573 c->export_mask=emask;
1574 c->valid=1;
1575 }
1576
1577/* THIS NEEDS CLEANING UP */
1578X509 *ssl_get_server_send_cert(SSL *s)
1579 {
1580 unsigned long alg,mask,kalg;
1581 CERT *c;
1582 int i,is_export;
1583
1584 c=s->cert;
1585 ssl_set_cert_masks(c, s->s3->tmp.new_cipher);
1586 alg=s->s3->tmp.new_cipher->algorithms;
1587 is_export=SSL_C_IS_EXPORT(s->s3->tmp.new_cipher);
1588 mask=is_export?c->export_mask:c->mask;
1589 kalg=alg&(SSL_MKEY_MASK|SSL_AUTH_MASK);
1590
1591 if (kalg & SSL_kDHr)
1592 i=SSL_PKEY_DH_RSA;
1593 else if (kalg & SSL_kDHd)
1594 i=SSL_PKEY_DH_DSA;
1595 else if (kalg & SSL_aDSS)
1596 i=SSL_PKEY_DSA_SIGN;
1597 else if (kalg & SSL_aRSA)
1598 {
1599 if (c->pkeys[SSL_PKEY_RSA_ENC].x509 == NULL)
1600 i=SSL_PKEY_RSA_SIGN;
1601 else
1602 i=SSL_PKEY_RSA_ENC;
1603 }
1604 else if (kalg & SSL_aKRB5)
1605 {
1606 /* VRS something else here? */
1607 return(NULL);
1608 }
1609 else /* if (kalg & SSL_aNULL) */
1610 {
1611 SSLerr(SSL_F_SSL_GET_SERVER_SEND_CERT,ERR_R_INTERNAL_ERROR);
1612 return(NULL);
1613 }
1614 if (c->pkeys[i].x509 == NULL) return(NULL);
1615 return(c->pkeys[i].x509);
1616 }
1617
1618EVP_PKEY *ssl_get_sign_pkey(SSL *s,SSL_CIPHER *cipher)
1619 {
1620 unsigned long alg;
1621 CERT *c;
1622
1623 alg=cipher->algorithms;
1624 c=s->cert;
1625
1626 if ((alg & SSL_aDSS) &&
1627 (c->pkeys[SSL_PKEY_DSA_SIGN].privatekey != NULL))
1628 return(c->pkeys[SSL_PKEY_DSA_SIGN].privatekey);
1629 else if (alg & SSL_aRSA)
1630 {
1631 if (c->pkeys[SSL_PKEY_RSA_SIGN].privatekey != NULL)
1632 return(c->pkeys[SSL_PKEY_RSA_SIGN].privatekey);
1633 else if (c->pkeys[SSL_PKEY_RSA_ENC].privatekey != NULL)
1634 return(c->pkeys[SSL_PKEY_RSA_ENC].privatekey);
1635 else
1636 return(NULL);
1637 }
1638 else /* if (alg & SSL_aNULL) */
1639 {
1640 SSLerr(SSL_F_SSL_GET_SIGN_PKEY,ERR_R_INTERNAL_ERROR);
1641 return(NULL);
1642 }
1643 }
1644
1645void ssl_update_cache(SSL *s,int mode)
1646 {
1647 int i;
1648
1649 /* If the session_id_length is 0, we are not supposed to cache it,
1650 * and it would be rather hard to do anyway :-) */
1651 if (s->session->session_id_length == 0) return;
1652
1653 i=s->ctx->session_cache_mode;
1654 if ((i & mode) && (!s->hit)
1655 && ((i & SSL_SESS_CACHE_NO_INTERNAL_LOOKUP)
1656 || SSL_CTX_add_session(s->ctx,s->session))
1657 && (s->ctx->new_session_cb != NULL))
1658 {
1659 CRYPTO_add(&s->session->references,1,CRYPTO_LOCK_SSL_SESSION);
1660 if (!s->ctx->new_session_cb(s,s->session))
1661 SSL_SESSION_free(s->session);
1662 }
1663
1664 /* auto flush every 255 connections */
1665 if ((!(i & SSL_SESS_CACHE_NO_AUTO_CLEAR)) &&
1666 ((i & mode) == mode))
1667 {
1668 if ( (((mode & SSL_SESS_CACHE_CLIENT)
1669 ?s->ctx->stats.sess_connect_good
1670 :s->ctx->stats.sess_accept_good) & 0xff) == 0xff)
1671 {
1672 SSL_CTX_flush_sessions(s->ctx,time(NULL));
1673 }
1674 }
1675 }
1676
1677SSL_METHOD *SSL_get_ssl_method(SSL *s)
1678 {
1679 return(s->method);
1680 }
1681
1682int SSL_set_ssl_method(SSL *s,SSL_METHOD *meth)
1683 {
1684 int conn= -1;
1685 int ret=1;
1686
1687 if (s->method != meth)
1688 {
1689 if (s->handshake_func != NULL)
1690 conn=(s->handshake_func == s->method->ssl_connect);
1691
1692 if (s->method->version == meth->version)
1693 s->method=meth;
1694 else
1695 {
1696 s->method->ssl_free(s);
1697 s->method=meth;
1698 ret=s->method->ssl_new(s);
1699 }
1700
1701 if (conn == 1)
1702 s->handshake_func=meth->ssl_connect;
1703 else if (conn == 0)
1704 s->handshake_func=meth->ssl_accept;
1705 }
1706 return(ret);
1707 }
1708
1709int SSL_get_error(SSL *s,int i)
1710 {
1711 int reason;
1712 unsigned long l;
1713 BIO *bio;
1714
1715 if (i > 0) return(SSL_ERROR_NONE);
1716
1717 /* Make things return SSL_ERROR_SYSCALL when doing SSL_do_handshake
1718 * etc, where we do encode the error */
1719 if ((l=ERR_peek_error()) != 0)
1720 {
1721 if (ERR_GET_LIB(l) == ERR_LIB_SYS)
1722 return(SSL_ERROR_SYSCALL);
1723 else
1724 return(SSL_ERROR_SSL);
1725 }
1726
1727 if ((i < 0) && SSL_want_read(s))
1728 {
1729 bio=SSL_get_rbio(s);
1730 if (BIO_should_read(bio))
1731 return(SSL_ERROR_WANT_READ);
1732 else if (BIO_should_write(bio))
1733 /* This one doesn't make too much sense ... We never try
1734 * to write to the rbio, and an application program where
1735 * rbio and wbio are separate couldn't even know what it
1736 * should wait for.
1737 * However if we ever set s->rwstate incorrectly
1738 * (so that we have SSL_want_read(s) instead of
1739 * SSL_want_write(s)) and rbio and wbio *are* the same,
1740 * this test works around that bug; so it might be safer
1741 * to keep it. */
1742 return(SSL_ERROR_WANT_WRITE);
1743 else if (BIO_should_io_special(bio))
1744 {
1745 reason=BIO_get_retry_reason(bio);
1746 if (reason == BIO_RR_CONNECT)
1747 return(SSL_ERROR_WANT_CONNECT);
1748 else if (reason == BIO_RR_ACCEPT)
1749 return(SSL_ERROR_WANT_ACCEPT);
1750 else
1751 return(SSL_ERROR_SYSCALL); /* unknown */
1752 }
1753 }
1754
1755 if ((i < 0) && SSL_want_write(s))
1756 {
1757 bio=SSL_get_wbio(s);
1758 if (BIO_should_write(bio))
1759 return(SSL_ERROR_WANT_WRITE);
1760 else if (BIO_should_read(bio))
1761 /* See above (SSL_want_read(s) with BIO_should_write(bio)) */
1762 return(SSL_ERROR_WANT_READ);
1763 else if (BIO_should_io_special(bio))
1764 {
1765 reason=BIO_get_retry_reason(bio);
1766 if (reason == BIO_RR_CONNECT)
1767 return(SSL_ERROR_WANT_CONNECT);
1768 else if (reason == BIO_RR_ACCEPT)
1769 return(SSL_ERROR_WANT_ACCEPT);
1770 else
1771 return(SSL_ERROR_SYSCALL);
1772 }
1773 }
1774 if ((i < 0) && SSL_want_x509_lookup(s))
1775 {
1776 return(SSL_ERROR_WANT_X509_LOOKUP);
1777 }
1778
1779 if (i == 0)
1780 {
1781 if (s->version == SSL2_VERSION)
1782 {
1783 /* assume it is the socket being closed */
1784 return(SSL_ERROR_ZERO_RETURN);
1785 }
1786 else
1787 {
1788 if ((s->shutdown & SSL_RECEIVED_SHUTDOWN) &&
1789 (s->s3->warn_alert == SSL_AD_CLOSE_NOTIFY))
1790 return(SSL_ERROR_ZERO_RETURN);
1791 }
1792 }
1793 return(SSL_ERROR_SYSCALL);
1794 }
1795
1796int SSL_do_handshake(SSL *s)
1797 {
1798 int ret=1;
1799
1800 if (s->handshake_func == NULL)
1801 {
1802 SSLerr(SSL_F_SSL_DO_HANDSHAKE,SSL_R_CONNECTION_TYPE_NOT_SET);
1803 return(-1);
1804 }
1805
1806 s->method->ssl_renegotiate_check(s);
1807
1808 if (SSL_in_init(s) || SSL_in_before(s))
1809 {
1810 ret=s->handshake_func(s);
1811 }
1812 return(ret);
1813 }
1814
1815/* For the next 2 functions, SSL_clear() sets shutdown and so
1816 * one of these calls will reset it */
1817void SSL_set_accept_state(SSL *s)
1818 {
1819 s->server=1;
1820 s->shutdown=0;
1821 s->state=SSL_ST_ACCEPT|SSL_ST_BEFORE;
1822 s->handshake_func=s->method->ssl_accept;
1823 /* clear the current cipher */
1824 ssl_clear_cipher_ctx(s);
1825 }
1826
1827void SSL_set_connect_state(SSL *s)
1828 {
1829 s->server=0;
1830 s->shutdown=0;
1831 s->state=SSL_ST_CONNECT|SSL_ST_BEFORE;
1832 s->handshake_func=s->method->ssl_connect;
1833 /* clear the current cipher */
1834 ssl_clear_cipher_ctx(s);
1835 }
1836
1837int ssl_undefined_function(SSL *s)
1838 {
1839 SSLerr(SSL_F_SSL_UNDEFINED_FUNCTION,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
1840 return(0);
1841 }
1842
1843SSL_METHOD *ssl_bad_method(int ver)
1844 {
1845 SSLerr(SSL_F_SSL_BAD_METHOD,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
1846 return(NULL);
1847 }
1848
1849const char *SSL_get_version(SSL *s)
1850 {
1851 if (s->version == TLS1_VERSION)
1852 return("TLSv1");
1853 else if (s->version == SSL3_VERSION)
1854 return("SSLv3");
1855 else if (s->version == SSL2_VERSION)
1856 return("SSLv2");
1857 else
1858 return("unknown");
1859 }
1860
1861SSL *SSL_dup(SSL *s)
1862 {
1863 STACK_OF(X509_NAME) *sk;
1864 X509_NAME *xn;
1865 SSL *ret;
1866 int i;
1867
1868 if ((ret=SSL_new(SSL_get_SSL_CTX(s))) == NULL)
1869 return(NULL);
1870
1871 ret->version = s->version;
1872 ret->type = s->type;
1873 ret->method = s->method;
1874
1875 if (s->session != NULL)
1876 {
1877 /* This copies session-id, SSL_METHOD, sid_ctx, and 'cert' */
1878 SSL_copy_session_id(ret,s);
1879 }
1880 else
1881 {
1882 /* No session has been established yet, so we have to expect
1883 * that s->cert or ret->cert will be changed later --
1884 * they should not both point to the same object,
1885 * and thus we can't use SSL_copy_session_id. */
1886
1887 ret->method = s->method;
1888 ret->method->ssl_new(ret);
1889
1890 if (s->cert != NULL)
1891 {
1892 if (ret->cert != NULL)
1893 {
1894 ssl_cert_free(ret->cert);
1895 }
1896 ret->cert = ssl_cert_dup(s->cert);
1897 if (ret->cert == NULL)
1898 goto err;
1899 }
1900
1901 SSL_set_session_id_context(ret,
1902 s->sid_ctx, s->sid_ctx_length);
1903 }
1904
1905 ret->options=s->options;
1906 ret->mode=s->mode;
1907 SSL_set_max_cert_list(ret,SSL_get_max_cert_list(s));
1908 SSL_set_read_ahead(ret,SSL_get_read_ahead(s));
1909 ret->msg_callback = s->msg_callback;
1910 ret->msg_callback_arg = s->msg_callback_arg;
1911 SSL_set_verify(ret,SSL_get_verify_mode(s),
1912 SSL_get_verify_callback(s));
1913 SSL_set_verify_depth(ret,SSL_get_verify_depth(s));
1914 ret->generate_session_id = s->generate_session_id;
1915
1916 SSL_set_info_callback(ret,SSL_get_info_callback(s));
1917
1918 ret->debug=s->debug;
1919
1920 /* copy app data, a little dangerous perhaps */
1921 if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_SSL, &ret->ex_data, &s->ex_data))
1922 goto err;
1923
1924 /* setup rbio, and wbio */
1925 if (s->rbio != NULL)
1926 {
1927 if (!BIO_dup_state(s->rbio,(char *)&ret->rbio))
1928 goto err;
1929 }
1930 if (s->wbio != NULL)
1931 {
1932 if (s->wbio != s->rbio)
1933 {
1934 if (!BIO_dup_state(s->wbio,(char *)&ret->wbio))
1935 goto err;
1936 }
1937 else
1938 ret->wbio=ret->rbio;
1939 }
1940 ret->rwstate = s->rwstate;
1941 ret->in_handshake = s->in_handshake;
1942 ret->handshake_func = s->handshake_func;
1943 ret->server = s->server;
1944 ret->new_session = s->new_session;
1945 ret->quiet_shutdown = s->quiet_shutdown;
1946 ret->shutdown=s->shutdown;
1947 ret->state=s->state; /* SSL_dup does not really work at any state, though */
1948 ret->rstate=s->rstate;
1949 ret->init_num = 0; /* would have to copy ret->init_buf, ret->init_msg, ret->init_num, ret->init_off */
1950 ret->hit=s->hit;
1951 ret->purpose=s->purpose;
1952 ret->trust=s->trust;
1953
1954 /* dup the cipher_list and cipher_list_by_id stacks */
1955 if (s->cipher_list != NULL)
1956 {
1957 if ((ret->cipher_list=sk_SSL_CIPHER_dup(s->cipher_list)) == NULL)
1958 goto err;
1959 }
1960 if (s->cipher_list_by_id != NULL)
1961 if ((ret->cipher_list_by_id=sk_SSL_CIPHER_dup(s->cipher_list_by_id))
1962 == NULL)
1963 goto err;
1964
1965 /* Dup the client_CA list */
1966 if (s->client_CA != NULL)
1967 {
1968 if ((sk=sk_X509_NAME_dup(s->client_CA)) == NULL) goto err;
1969 ret->client_CA=sk;
1970 for (i=0; i<sk_X509_NAME_num(sk); i++)
1971 {
1972 xn=sk_X509_NAME_value(sk,i);
1973 if (sk_X509_NAME_set(sk,i,X509_NAME_dup(xn)) == NULL)
1974 {
1975 X509_NAME_free(xn);
1976 goto err;
1977 }
1978 }
1979 }
1980
1981 if (0)
1982 {
1983err:
1984 if (ret != NULL) SSL_free(ret);
1985 ret=NULL;
1986 }
1987 return(ret);
1988 }
1989
1990void ssl_clear_cipher_ctx(SSL *s)
1991 {
1992 if (s->enc_read_ctx != NULL)
1993 {
1994 EVP_CIPHER_CTX_cleanup(s->enc_read_ctx);
1995 OPENSSL_free(s->enc_read_ctx);
1996 s->enc_read_ctx=NULL;
1997 }
1998 if (s->enc_write_ctx != NULL)
1999 {
2000 EVP_CIPHER_CTX_cleanup(s->enc_write_ctx);
2001 OPENSSL_free(s->enc_write_ctx);
2002 s->enc_write_ctx=NULL;
2003 }
2004 if (s->expand != NULL)
2005 {
2006 COMP_CTX_free(s->expand);
2007 s->expand=NULL;
2008 }
2009 if (s->compress != NULL)
2010 {
2011 COMP_CTX_free(s->compress);
2012 s->compress=NULL;
2013 }
2014 }
2015
2016/* Fix this function so that it takes an optional type parameter */
2017X509 *SSL_get_certificate(SSL *s)
2018 {
2019 if (s->cert != NULL)
2020 return(s->cert->key->x509);
2021 else
2022 return(NULL);
2023 }
2024
2025/* Fix this function so that it takes an optional type parameter */
2026EVP_PKEY *SSL_get_privatekey(SSL *s)
2027 {
2028 if (s->cert != NULL)
2029 return(s->cert->key->privatekey);
2030 else
2031 return(NULL);
2032 }
2033
2034SSL_CIPHER *SSL_get_current_cipher(SSL *s)
2035 {
2036 if ((s->session != NULL) && (s->session->cipher != NULL))
2037 return(s->session->cipher);
2038 return(NULL);
2039 }
2040
2041int ssl_init_wbio_buffer(SSL *s,int push)
2042 {
2043 BIO *bbio;
2044
2045 if (s->bbio == NULL)
2046 {
2047 bbio=BIO_new(BIO_f_buffer());
2048 if (bbio == NULL) return(0);
2049 s->bbio=bbio;
2050 }
2051 else
2052 {
2053 bbio=s->bbio;
2054 if (s->bbio == s->wbio)
2055 s->wbio=BIO_pop(s->wbio);
2056 }
2057 (void)BIO_reset(bbio);
2058/* if (!BIO_set_write_buffer_size(bbio,16*1024)) */
2059 if (!BIO_set_read_buffer_size(bbio,1))
2060 {
2061 SSLerr(SSL_F_SSL_INIT_WBIO_BUFFER,ERR_R_BUF_LIB);
2062 return(0);
2063 }
2064 if (push)
2065 {
2066 if (s->wbio != bbio)
2067 s->wbio=BIO_push(bbio,s->wbio);
2068 }
2069 else
2070 {
2071 if (s->wbio == bbio)
2072 s->wbio=BIO_pop(bbio);
2073 }
2074 return(1);
2075 }
2076
2077void ssl_free_wbio_buffer(SSL *s)
2078 {
2079 if (s->bbio == NULL) return;
2080
2081 if (s->bbio == s->wbio)
2082 {
2083 /* remove buffering */
2084 s->wbio=BIO_pop(s->wbio);
2085#ifdef REF_CHECK /* not the usual REF_CHECK, but this avoids adding one more preprocessor symbol */
2086 assert(s->wbio != NULL);
2087#endif
2088 }
2089 BIO_free(s->bbio);
2090 s->bbio=NULL;
2091 }
2092
2093void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx,int mode)
2094 {
2095 ctx->quiet_shutdown=mode;
2096 }
2097
2098int SSL_CTX_get_quiet_shutdown(SSL_CTX *ctx)
2099 {
2100 return(ctx->quiet_shutdown);
2101 }
2102
2103void SSL_set_quiet_shutdown(SSL *s,int mode)
2104 {
2105 s->quiet_shutdown=mode;
2106 }
2107
2108int SSL_get_quiet_shutdown(SSL *s)
2109 {
2110 return(s->quiet_shutdown);
2111 }
2112
2113void SSL_set_shutdown(SSL *s,int mode)
2114 {
2115 s->shutdown=mode;
2116 }
2117
2118int SSL_get_shutdown(SSL *s)
2119 {
2120 return(s->shutdown);
2121 }
2122
2123int SSL_version(SSL *s)
2124 {
2125 return(s->version);
2126 }
2127
2128SSL_CTX *SSL_get_SSL_CTX(SSL *ssl)
2129 {
2130 return(ssl->ctx);
2131 }
2132
2133#ifndef OPENSSL_NO_STDIO
2134int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx)
2135 {
2136 return(X509_STORE_set_default_paths(ctx->cert_store));
2137 }
2138
2139int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile,
2140 const char *CApath)
2141 {
2142 return(X509_STORE_load_locations(ctx->cert_store,CAfile,CApath));
2143 }
2144#endif
2145
2146void SSL_set_info_callback(SSL *ssl,
2147 void (*cb)(const SSL *ssl,int type,int val))
2148 {
2149 ssl->info_callback=cb;
2150 }
2151
2152void (*SSL_get_info_callback(SSL *ssl))(const SSL *ssl,int type,int val)
2153 {
2154 return ssl->info_callback;
2155 }
2156
2157int SSL_state(SSL *ssl)
2158 {
2159 return(ssl->state);
2160 }
2161
2162void SSL_set_verify_result(SSL *ssl,long arg)
2163 {
2164 ssl->verify_result=arg;
2165 }
2166
2167long SSL_get_verify_result(SSL *ssl)
2168 {
2169 return(ssl->verify_result);
2170 }
2171
2172int SSL_get_ex_new_index(long argl,void *argp,CRYPTO_EX_new *new_func,
2173 CRYPTO_EX_dup *dup_func,CRYPTO_EX_free *free_func)
2174 {
2175 return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL, argl, argp,
2176 new_func, dup_func, free_func);
2177 }
2178
2179int SSL_set_ex_data(SSL *s,int idx,void *arg)
2180 {
2181 return(CRYPTO_set_ex_data(&s->ex_data,idx,arg));
2182 }
2183
2184void *SSL_get_ex_data(SSL *s,int idx)
2185 {
2186 return(CRYPTO_get_ex_data(&s->ex_data,idx));
2187 }
2188
2189int SSL_CTX_get_ex_new_index(long argl,void *argp,CRYPTO_EX_new *new_func,
2190 CRYPTO_EX_dup *dup_func,CRYPTO_EX_free *free_func)
2191 {
2192 return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_CTX, argl, argp,
2193 new_func, dup_func, free_func);
2194 }
2195
2196int SSL_CTX_set_ex_data(SSL_CTX *s,int idx,void *arg)
2197 {
2198 return(CRYPTO_set_ex_data(&s->ex_data,idx,arg));
2199 }
2200
2201void *SSL_CTX_get_ex_data(SSL_CTX *s,int idx)
2202 {
2203 return(CRYPTO_get_ex_data(&s->ex_data,idx));
2204 }
2205
2206int ssl_ok(SSL *s)
2207 {
2208 return(1);
2209 }
2210
2211X509_STORE *SSL_CTX_get_cert_store(SSL_CTX *ctx)
2212 {
2213 return(ctx->cert_store);
2214 }
2215
2216void SSL_CTX_set_cert_store(SSL_CTX *ctx,X509_STORE *store)
2217 {
2218 if (ctx->cert_store != NULL)
2219 X509_STORE_free(ctx->cert_store);
2220 ctx->cert_store=store;
2221 }
2222
2223int SSL_want(SSL *s)
2224 {
2225 return(s->rwstate);
2226 }
2227
2228/*!
2229 * \brief Set the callback for generating temporary RSA keys.
2230 * \param ctx the SSL context.
2231 * \param cb the callback
2232 */
2233
2234#ifndef OPENSSL_NO_RSA
2235void SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx,RSA *(*cb)(SSL *ssl,
2236 int is_export,
2237 int keylength))
2238 {
2239 SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TMP_RSA_CB,(void (*)())cb);
2240 }
2241
2242void SSL_set_tmp_rsa_callback(SSL *ssl,RSA *(*cb)(SSL *ssl,
2243 int is_export,
2244 int keylength))
2245 {
2246 SSL_callback_ctrl(ssl,SSL_CTRL_SET_TMP_RSA_CB,(void (*)())cb);
2247 }
2248#endif
2249
2250#ifdef DOXYGEN
2251/*!
2252 * \brief The RSA temporary key callback function.
2253 * \param ssl the SSL session.
2254 * \param is_export \c TRUE if the temp RSA key is for an export ciphersuite.
2255 * \param keylength if \c is_export is \c TRUE, then \c keylength is the size
2256 * of the required key in bits.
2257 * \return the temporary RSA key.
2258 * \sa SSL_CTX_set_tmp_rsa_callback, SSL_set_tmp_rsa_callback
2259 */
2260
2261RSA *cb(SSL *ssl,int is_export,int keylength)
2262 {}
2263#endif
2264
2265/*!
2266 * \brief Set the callback for generating temporary DH keys.
2267 * \param ctx the SSL context.
2268 * \param dh the callback
2269 */
2270
2271#ifndef OPENSSL_NO_DH
2272void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,DH *(*dh)(SSL *ssl,int is_export,
2273 int keylength))
2274 {
2275 SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TMP_DH_CB,(void (*)())dh);
2276 }
2277
2278void SSL_set_tmp_dh_callback(SSL *ssl,DH *(*dh)(SSL *ssl,int is_export,
2279 int keylength))
2280 {
2281 SSL_callback_ctrl(ssl,SSL_CTRL_SET_TMP_DH_CB,(void (*)())dh);
2282 }
2283#endif
2284
2285
2286void 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))
2287 {
2288 SSL_CTX_callback_ctrl(ctx, SSL_CTRL_SET_MSG_CALLBACK, (void (*)())cb);
2289 }
2290void 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))
2291 {
2292 SSL_callback_ctrl(ssl, SSL_CTRL_SET_MSG_CALLBACK, (void (*)())cb);
2293 }
2294
2295
2296
2297#if defined(_WINDLL) && defined(OPENSSL_SYS_WIN16)
2298#include "../crypto/bio/bss_file.c"
2299#endif
2300
2301IMPLEMENT_STACK_OF(SSL_CIPHER)
2302IMPLEMENT_STACK_OF(SSL_COMP)
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h
deleted file mode 100644
index dd6c7a7323..0000000000
--- a/src/lib/libssl/ssl_locl.h
+++ /dev/null
@@ -1,620 +0,0 @@
1/* ssl/ssl_locl.h */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58/* ====================================================================
59 * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved.
60 *
61 * Redistribution and use in source and binary forms, with or without
62 * modification, are permitted provided that the following conditions
63 * are met:
64 *
65 * 1. Redistributions of source code must retain the above copyright
66 * notice, this list of conditions and the following disclaimer.
67 *
68 * 2. Redistributions in binary form must reproduce the above copyright
69 * notice, this list of conditions and the following disclaimer in
70 * the documentation and/or other materials provided with the
71 * distribution.
72 *
73 * 3. All advertising materials mentioning features or use of this
74 * software must display the following acknowledgment:
75 * "This product includes software developed by the OpenSSL Project
76 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77 *
78 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79 * endorse or promote products derived from this software without
80 * prior written permission. For written permission, please contact
81 * openssl-core@openssl.org.
82 *
83 * 5. Products derived from this software may not be called "OpenSSL"
84 * nor may "OpenSSL" appear in their names without prior written
85 * permission of the OpenSSL Project.
86 *
87 * 6. Redistributions of any form whatsoever must retain the following
88 * acknowledgment:
89 * "This product includes software developed by the OpenSSL Project
90 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91 *
92 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
96 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103 * OF THE POSSIBILITY OF SUCH DAMAGE.
104 * ====================================================================
105 *
106 * This product includes cryptographic software written by Eric Young
107 * (eay@cryptsoft.com). This product includes software written by Tim
108 * Hudson (tjh@cryptsoft.com).
109 *
110 */
111
112#ifndef HEADER_SSL_LOCL_H
113#define HEADER_SSL_LOCL_H
114#include <stdlib.h>
115#include <time.h>
116#include <string.h>
117#include <errno.h>
118
119#include "e_os.h"
120
121#include <openssl/buffer.h>
122#include <openssl/comp.h>
123#include <openssl/bio.h>
124#include <openssl/crypto.h>
125#include <openssl/evp.h>
126#include <openssl/stack.h>
127#include <openssl/x509.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
136
137#define PKCS1_CHECK
138
139#define c2l(c,l) (l = ((unsigned long)(*((c)++))) , \
140 l|=(((unsigned long)(*((c)++)))<< 8), \
141 l|=(((unsigned long)(*((c)++)))<<16), \
142 l|=(((unsigned long)(*((c)++)))<<24))
143
144/* NOTE - c is not incremented as per c2l */
145#define c2ln(c,l1,l2,n) { \
146 c+=n; \
147 l1=l2=0; \
148 switch (n) { \
149 case 8: l2 =((unsigned long)(*(--(c))))<<24; \
150 case 7: l2|=((unsigned long)(*(--(c))))<<16; \
151 case 6: l2|=((unsigned long)(*(--(c))))<< 8; \
152 case 5: l2|=((unsigned long)(*(--(c)))); \
153 case 4: l1 =((unsigned long)(*(--(c))))<<24; \
154 case 3: l1|=((unsigned long)(*(--(c))))<<16; \
155 case 2: l1|=((unsigned long)(*(--(c))))<< 8; \
156 case 1: l1|=((unsigned long)(*(--(c)))); \
157 } \
158 }
159
160#define l2c(l,c) (*((c)++)=(unsigned char)(((l) )&0xff), \
161 *((c)++)=(unsigned char)(((l)>> 8)&0xff), \
162 *((c)++)=(unsigned char)(((l)>>16)&0xff), \
163 *((c)++)=(unsigned char)(((l)>>24)&0xff))
164
165#define n2l(c,l) (l =((unsigned long)(*((c)++)))<<24, \
166 l|=((unsigned long)(*((c)++)))<<16, \
167 l|=((unsigned long)(*((c)++)))<< 8, \
168 l|=((unsigned long)(*((c)++))))
169
170#define l2n(l,c) (*((c)++)=(unsigned char)(((l)>>24)&0xff), \
171 *((c)++)=(unsigned char)(((l)>>16)&0xff), \
172 *((c)++)=(unsigned char)(((l)>> 8)&0xff), \
173 *((c)++)=(unsigned char)(((l) )&0xff))
174
175/* NOTE - c is not incremented as per l2c */
176#define l2cn(l1,l2,c,n) { \
177 c+=n; \
178 switch (n) { \
179 case 8: *(--(c))=(unsigned char)(((l2)>>24)&0xff); \
180 case 7: *(--(c))=(unsigned char)(((l2)>>16)&0xff); \
181 case 6: *(--(c))=(unsigned char)(((l2)>> 8)&0xff); \
182 case 5: *(--(c))=(unsigned char)(((l2) )&0xff); \
183 case 4: *(--(c))=(unsigned char)(((l1)>>24)&0xff); \
184 case 3: *(--(c))=(unsigned char)(((l1)>>16)&0xff); \
185 case 2: *(--(c))=(unsigned char)(((l1)>> 8)&0xff); \
186 case 1: *(--(c))=(unsigned char)(((l1) )&0xff); \
187 } \
188 }
189
190#define n2s(c,s) ((s=(((unsigned int)(c[0]))<< 8)| \
191 (((unsigned int)(c[1])) )),c+=2)
192#define s2n(s,c) ((c[0]=(unsigned char)(((s)>> 8)&0xff), \
193 c[1]=(unsigned char)(((s) )&0xff)),c+=2)
194
195#define n2l3(c,l) ((l =(((unsigned long)(c[0]))<<16)| \
196 (((unsigned long)(c[1]))<< 8)| \
197 (((unsigned long)(c[2])) )),c+=3)
198
199#define l2n3(l,c) ((c[0]=(unsigned char)(((l)>>16)&0xff), \
200 c[1]=(unsigned char)(((l)>> 8)&0xff), \
201 c[2]=(unsigned char)(((l) )&0xff)),c+=3)
202
203/* LOCAL STUFF */
204
205#define SSL_DECRYPT 0
206#define SSL_ENCRYPT 1
207
208#define TWO_BYTE_BIT 0x80
209#define SEC_ESC_BIT 0x40
210#define TWO_BYTE_MASK 0x7fff
211#define THREE_BYTE_MASK 0x3fff
212
213#define INC32(a) ((a)=((a)+1)&0xffffffffL)
214#define DEC32(a) ((a)=((a)-1)&0xffffffffL)
215#define MAX_MAC_SIZE 20 /* up from 16 for SSLv3 */
216
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
231#define SSL_kRSA 0x00000001L /* RSA key exchange */
232#define SSL_kDHr 0x00000002L /* DH cert RSA CA cert */
233#define SSL_kDHd 0x00000004L /* DH cert DSA CA cert */
234#define SSL_kFZA 0x00000008L
235#define SSL_kEDH 0x00000010L /* tmp DH key no DH cert */
236#define SSL_kKRB5 0x00000020L /* Kerberos5 key exchange */
237#define SSL_EDH (SSL_kEDH|(SSL_AUTH_MASK^SSL_aNULL))
238
239#define SSL_AUTH_MASK 0x00000FC0L
240#define SSL_aRSA 0x00000040L /* Authenticate with RSA */
241#define SSL_aDSS 0x00000080L /* Authenticate with DSS */
242#define SSL_DSS SSL_aDSS
243#define SSL_aFZA 0x00000100L
244#define SSL_aNULL 0x00000200L /* no Authenticate, ADH */
245#define SSL_aDH 0x00000400L /* no Authenticate, ADH */
246#define SSL_aKRB5 0x00000800L /* Authenticate with KRB5 */
247
248#define SSL_NULL (SSL_eNULL)
249#define SSL_ADH (SSL_kEDH|SSL_aNULL)
250#define SSL_RSA (SSL_kRSA|SSL_aRSA)
251#define SSL_DH (SSL_kDHr|SSL_kDHd|SSL_kEDH)
252#define SSL_FZA (SSL_aFZA|SSL_kFZA|SSL_eFZA)
253#define SSL_KRB5 (SSL_kKRB5|SSL_aKRB5)
254
255#define SSL_ENC_MASK 0x0087F000L
256#define SSL_DES 0x00001000L
257#define SSL_3DES 0x00002000L
258#define SSL_RC4 0x00004000L
259#define SSL_RC2 0x00008000L
260#define SSL_IDEA 0x00010000L
261#define SSL_eFZA 0x00020000L
262#define SSL_eNULL 0x00040000L
263#define SSL_AES 0x00800000L
264
265#define SSL_MAC_MASK 0x00180000L
266#define SSL_MD5 0x00080000L
267#define SSL_SHA1 0x00100000L
268#define SSL_SHA (SSL_SHA1)
269
270#define SSL_SSL_MASK 0x00600000L
271#define SSL_SSLV2 0x00200000L
272#define SSL_SSLV3 0x00400000L
273#define SSL_TLSV1 SSL_SSLV3 /* for now */
274
275/* we have used 007fffff - 9 bits left to go */
276
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 0x000000fcL
297#define SSL_STRONG_NONE 0x00000004L
298#define SSL_EXP40 0x00000008L
299#define SSL_MICRO (SSL_EXP40)
300#define SSL_EXP56 0x00000010L
301#define SSL_MINI (SSL_EXP56)
302#define SSL_LOW 0x00000020L
303#define SSL_MEDIUM 0x00000040L
304#define SSL_HIGH 0x00000080L
305
306/* we have used 000000ff - 24 bits left to go */
307
308/*
309 * Macros to check the export status and cipher strength for export ciphers.
310 * Even though the macros for EXPORT and EXPORT40/56 have similar names,
311 * their meaning is different:
312 * *_EXPORT macros check the 'exportable' status.
313 * *_EXPORT40/56 macros are used to check whether a certain cipher strength
314 * is given.
315 * Since the SSL_IS_EXPORT* and SSL_EXPORT* macros depend on the correct
316 * algorithm structure element to be passed (algorithms, algo_strength) and no
317 * typechecking can be done as they are all of type unsigned long, their
318 * direct usage is discouraged.
319 * Use the SSL_C_* macros instead.
320 */
321#define SSL_IS_EXPORT(a) ((a)&SSL_EXPORT)
322#define SSL_IS_EXPORT56(a) ((a)&SSL_EXP56)
323#define SSL_IS_EXPORT40(a) ((a)&SSL_EXP40)
324#define SSL_C_IS_EXPORT(c) SSL_IS_EXPORT((c)->algo_strength)
325#define SSL_C_IS_EXPORT56(c) SSL_IS_EXPORT56((c)->algo_strength)
326#define SSL_C_IS_EXPORT40(c) SSL_IS_EXPORT40((c)->algo_strength)
327
328#define SSL_EXPORT_KEYLENGTH(a,s) (SSL_IS_EXPORT40(s) ? 5 : \
329 ((a)&SSL_ENC_MASK) == SSL_DES ? 8 : 7)
330#define SSL_EXPORT_PKEYLENGTH(a) (SSL_IS_EXPORT40(a) ? 512 : 1024)
331#define SSL_C_EXPORT_KEYLENGTH(c) SSL_EXPORT_KEYLENGTH((c)->algorithms, \
332 (c)->algo_strength)
333#define SSL_C_EXPORT_PKEYLENGTH(c) SSL_EXPORT_PKEYLENGTH((c)->algo_strength)
334
335
336#define SSL_ALL 0xffffffffL
337#define SSL_ALL_CIPHERS (SSL_MKEY_MASK|SSL_AUTH_MASK|SSL_ENC_MASK|\
338 SSL_MAC_MASK)
339#define SSL_ALL_STRENGTHS (SSL_EXP_MASK|SSL_STRONG_MASK)
340
341/* Mostly for SSLv3 */
342#define SSL_PKEY_RSA_ENC 0
343#define SSL_PKEY_RSA_SIGN 1
344#define SSL_PKEY_DSA_SIGN 2
345#define SSL_PKEY_DH_RSA 3
346#define SSL_PKEY_DH_DSA 4
347#define SSL_PKEY_NUM 5
348
349/* SSL_kRSA <- RSA_ENC | (RSA_TMP & RSA_SIGN) |
350 * <- (EXPORT & (RSA_ENC | RSA_TMP) & RSA_SIGN)
351 * SSL_kDH <- DH_ENC & (RSA_ENC | RSA_SIGN | DSA_SIGN)
352 * SSL_kEDH <- RSA_ENC | RSA_SIGN | DSA_SIGN
353 * SSL_aRSA <- RSA_ENC | RSA_SIGN
354 * SSL_aDSS <- DSA_SIGN
355 */
356
357/*
358#define CERT_INVALID 0
359#define CERT_PUBLIC_KEY 1
360#define CERT_PRIVATE_KEY 2
361*/
362
363typedef struct cert_pkey_st
364 {
365 X509 *x509;
366 EVP_PKEY *privatekey;
367 } CERT_PKEY;
368
369typedef struct cert_st
370 {
371 /* Current active set */
372 CERT_PKEY *key; /* ALWAYS points to an element of the pkeys array
373 * Probably it would make more sense to store
374 * an index, not a pointer. */
375
376 /* The following masks are for the key and auth
377 * algorithms that are supported by the certs below */
378 int valid;
379 unsigned long mask;
380 unsigned long export_mask;
381#ifndef OPENSSL_NO_RSA
382 RSA *rsa_tmp;
383 RSA *(*rsa_tmp_cb)(SSL *ssl,int is_export,int keysize);
384#endif
385#ifndef OPENSSL_NO_DH
386 DH *dh_tmp;
387 DH *(*dh_tmp_cb)(SSL *ssl,int is_export,int keysize);
388#endif
389
390 CERT_PKEY pkeys[SSL_PKEY_NUM];
391
392 int references; /* >1 only if SSL_copy_session_id is used */
393 } CERT;
394
395
396typedef struct sess_cert_st
397 {
398 STACK_OF(X509) *cert_chain; /* as received from peer (not for SSL2) */
399
400 /* The 'peer_...' members are used only by clients. */
401 int peer_cert_type;
402
403 CERT_PKEY *peer_key; /* points to an element of peer_pkeys (never NULL!) */
404 CERT_PKEY peer_pkeys[SSL_PKEY_NUM];
405 /* Obviously we don't have the private keys of these,
406 * so maybe we shouldn't even use the CERT_PKEY type here. */
407
408#ifndef OPENSSL_NO_RSA
409 RSA *peer_rsa_tmp; /* not used for SSL 2 */
410#endif
411#ifndef OPENSSL_NO_DH
412 DH *peer_dh_tmp; /* not used for SSL 2 */
413#endif
414
415 int references; /* actually always 1 at the moment */
416 } SESS_CERT;
417
418
419/*#define MAC_DEBUG */
420
421/*#define ERR_DEBUG */
422/*#define ABORT_DEBUG */
423/*#define PKT_DEBUG 1 */
424/*#define DES_DEBUG */
425/*#define DES_OFB_DEBUG */
426/*#define SSL_DEBUG */
427/*#define RSA_DEBUG */
428/*#define IDEA_DEBUG */
429
430#define FP_ICC (int (*)(const void *,const void *))
431#define ssl_put_cipher_by_char(ssl,ciph,ptr) \
432 ((ssl)->method->put_cipher_by_char((ciph),(ptr)))
433#define ssl_get_cipher_by_char(ssl,ptr) \
434 ((ssl)->method->get_cipher_by_char(ptr))
435
436/* This is for the SSLv3/TLSv1.0 differences in crypto/hash stuff
437 * It is a bit of a mess of functions, but hell, think of it as
438 * an opaque structure :-) */
439typedef struct ssl3_enc_method
440 {
441 int (*enc)(SSL *, int);
442 int (*mac)(SSL *, unsigned char *, int);
443 int (*setup_key_block)(SSL *);
444 int (*generate_master_secret)(SSL *, unsigned char *, unsigned char *, int);
445 int (*change_cipher_state)(SSL *, int);
446 int (*final_finish_mac)(SSL *, EVP_MD_CTX *, EVP_MD_CTX *, const char *, int, unsigned char *);
447 int finish_mac_length;
448 int (*cert_verify_mac)(SSL *, EVP_MD_CTX *, unsigned char *);
449 const char *client_finished_label;
450 int client_finished_label_len;
451 const char *server_finished_label;
452 int server_finished_label_len;
453 int (*alert_value)(int);
454 } SSL3_ENC_METHOD;
455
456/* Used for holding the relevant compression methods loaded into SSL_CTX */
457typedef struct ssl3_comp_st
458 {
459 int comp_id; /* The identifier byte for this compression type */
460 char *name; /* Text name used for the compression type */
461 COMP_METHOD *method; /* The method :-) */
462 } SSL3_COMP;
463
464OPENSSL_EXTERN SSL3_ENC_METHOD ssl3_undef_enc_method;
465OPENSSL_EXTERN SSL_CIPHER ssl2_ciphers[];
466OPENSSL_EXTERN SSL_CIPHER ssl3_ciphers[];
467
468#ifdef OPENSSL_SYS_VMS
469#undef SSL_COMP_get_compression_methods
470#define SSL_COMP_get_compression_methods SSL_COMP_get_compress_methods
471#endif
472
473
474SSL_METHOD *ssl_bad_method(int ver);
475SSL_METHOD *sslv2_base_method(void);
476SSL_METHOD *sslv23_base_method(void);
477SSL_METHOD *sslv3_base_method(void);
478
479void ssl_clear_cipher_ctx(SSL *s);
480int ssl_clear_bad_session(SSL *s);
481CERT *ssl_cert_new(void);
482CERT *ssl_cert_dup(CERT *cert);
483int ssl_cert_inst(CERT **o);
484void ssl_cert_free(CERT *c);
485SESS_CERT *ssl_sess_cert_new(void);
486void ssl_sess_cert_free(SESS_CERT *sc);
487int ssl_set_peer_cert_type(SESS_CERT *c, int type);
488int ssl_get_new_session(SSL *s, int session);
489int ssl_get_prev_session(SSL *s, unsigned char *session,int len);
490int ssl_cipher_id_cmp(const SSL_CIPHER *a,const SSL_CIPHER *b);
491int ssl_cipher_ptr_id_cmp(const SSL_CIPHER * const *ap,
492 const SSL_CIPHER * const *bp);
493STACK_OF(SSL_CIPHER) *ssl_bytes_to_cipher_list(SSL *s,unsigned char *p,int num,
494 STACK_OF(SSL_CIPHER) **skp);
495int ssl_cipher_list_to_bytes(SSL *s,STACK_OF(SSL_CIPHER) *sk,unsigned char *p);
496STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(const SSL_METHOD *meth,
497 STACK_OF(SSL_CIPHER) **pref,
498 STACK_OF(SSL_CIPHER) **sorted,
499 const char *rule_str);
500void ssl_update_cache(SSL *s, int mode);
501int ssl_cipher_get_evp(SSL_SESSION *s,const EVP_CIPHER **enc,const EVP_MD **md,
502 SSL_COMP **comp);
503int ssl_verify_cert_chain(SSL *s,STACK_OF(X509) *sk);
504int ssl_undefined_function(SSL *s);
505X509 *ssl_get_server_send_cert(SSL *);
506EVP_PKEY *ssl_get_sign_pkey(SSL *,SSL_CIPHER *);
507int ssl_cert_type(X509 *x,EVP_PKEY *pkey);
508void ssl_set_cert_masks(CERT *c, SSL_CIPHER *cipher);
509STACK_OF(SSL_CIPHER) *ssl_get_ciphers_by_id(SSL *s);
510int ssl_verify_alarm_type(long type);
511
512int ssl2_enc_init(SSL *s, int client);
513int ssl2_generate_key_material(SSL *s);
514void ssl2_enc(SSL *s,int send_data);
515void ssl2_mac(SSL *s,unsigned char *mac,int send_data);
516SSL_CIPHER *ssl2_get_cipher_by_char(const unsigned char *p);
517int ssl2_put_cipher_by_char(const SSL_CIPHER *c,unsigned char *p);
518int ssl2_part_read(SSL *s, unsigned long f, int i);
519int ssl2_do_write(SSL *s);
520int ssl2_set_certificate(SSL *s, int type, int len, unsigned char *data);
521void ssl2_return_error(SSL *s,int reason);
522void ssl2_write_error(SSL *s);
523int ssl2_num_ciphers(void);
524SSL_CIPHER *ssl2_get_cipher(unsigned int u);
525int ssl2_new(SSL *s);
526void ssl2_free(SSL *s);
527int ssl2_accept(SSL *s);
528int ssl2_connect(SSL *s);
529int ssl2_read(SSL *s, void *buf, int len);
530int ssl2_peek(SSL *s, void *buf, int len);
531int ssl2_write(SSL *s, const void *buf, int len);
532int ssl2_shutdown(SSL *s);
533void ssl2_clear(SSL *s);
534long ssl2_ctrl(SSL *s,int cmd, long larg, void *parg);
535long ssl2_ctx_ctrl(SSL_CTX *s,int cmd, long larg, void *parg);
536long ssl2_callback_ctrl(SSL *s,int cmd, void (*fp)());
537long ssl2_ctx_callback_ctrl(SSL_CTX *s,int cmd, void (*fp)());
538int ssl2_pending(SSL *s);
539
540SSL_CIPHER *ssl3_get_cipher_by_char(const unsigned char *p);
541int ssl3_put_cipher_by_char(const SSL_CIPHER *c,unsigned char *p);
542void ssl3_init_finished_mac(SSL *s);
543int ssl3_send_server_certificate(SSL *s);
544int ssl3_get_finished(SSL *s,int state_a,int state_b);
545int ssl3_setup_key_block(SSL *s);
546int ssl3_send_change_cipher_spec(SSL *s,int state_a,int state_b);
547int ssl3_change_cipher_state(SSL *s,int which);
548void ssl3_cleanup_key_block(SSL *s);
549int ssl3_do_write(SSL *s,int type);
550void ssl3_send_alert(SSL *s,int level, int desc);
551int ssl3_generate_master_secret(SSL *s, unsigned char *out,
552 unsigned char *p, int len);
553int ssl3_get_req_cert_type(SSL *s,unsigned char *p);
554long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok);
555int ssl3_send_finished(SSL *s, int a, int b, const char *sender,int slen);
556int ssl3_num_ciphers(void);
557SSL_CIPHER *ssl3_get_cipher(unsigned int u);
558int ssl3_renegotiate(SSL *ssl);
559int ssl3_renegotiate_check(SSL *ssl);
560int ssl3_dispatch_alert(SSL *s);
561int ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek);
562int ssl3_write_bytes(SSL *s, int type, const void *buf, int len);
563int ssl3_final_finish_mac(SSL *s, EVP_MD_CTX *ctx1, EVP_MD_CTX *ctx2,
564 const char *sender, int slen,unsigned char *p);
565int ssl3_cert_verify_mac(SSL *s, EVP_MD_CTX *in, unsigned char *p);
566void ssl3_finish_mac(SSL *s, const unsigned char *buf, int len);
567int ssl3_enc(SSL *s, int send_data);
568int ssl3_mac(SSL *ssl, unsigned char *md, int send_data);
569unsigned long ssl3_output_cert_chain(SSL *s, X509 *x);
570SSL_CIPHER *ssl3_choose_cipher(SSL *ssl,STACK_OF(SSL_CIPHER) *clnt,
571 STACK_OF(SSL_CIPHER) *srvr);
572int ssl3_setup_buffers(SSL *s);
573int ssl3_new(SSL *s);
574void ssl3_free(SSL *s);
575int ssl3_accept(SSL *s);
576int ssl3_connect(SSL *s);
577int ssl3_read(SSL *s, void *buf, int len);
578int ssl3_peek(SSL *s, void *buf, int len);
579int ssl3_write(SSL *s, const void *buf, int len);
580int ssl3_shutdown(SSL *s);
581void ssl3_clear(SSL *s);
582long ssl3_ctrl(SSL *s,int cmd, long larg, void *parg);
583long ssl3_ctx_ctrl(SSL_CTX *s,int cmd, long larg, void *parg);
584long ssl3_callback_ctrl(SSL *s,int cmd, void (*fp)());
585long ssl3_ctx_callback_ctrl(SSL_CTX *s,int cmd, void (*fp)());
586int ssl3_pending(SSL *s);
587
588int ssl23_accept(SSL *s);
589int ssl23_connect(SSL *s);
590int ssl23_read_bytes(SSL *s, int n);
591int ssl23_write_bytes(SSL *s);
592
593int tls1_new(SSL *s);
594void tls1_free(SSL *s);
595void tls1_clear(SSL *s);
596long tls1_ctrl(SSL *s,int cmd, long larg, void *parg);
597long tls1_callback_ctrl(SSL *s,int cmd, void (*fp)());
598SSL_METHOD *tlsv1_base_method(void );
599
600int ssl_init_wbio_buffer(SSL *s, int push);
601void ssl_free_wbio_buffer(SSL *s);
602
603int tls1_change_cipher_state(SSL *s, int which);
604int tls1_setup_key_block(SSL *s);
605int tls1_enc(SSL *s, int snd);
606int tls1_final_finish_mac(SSL *s, EVP_MD_CTX *in1_ctx, EVP_MD_CTX *in2_ctx,
607 const char *str, int slen, unsigned char *p);
608int tls1_cert_verify_mac(SSL *s, EVP_MD_CTX *in, unsigned char *p);
609int tls1_mac(SSL *ssl, unsigned char *md, int snd);
610int tls1_generate_master_secret(SSL *s, unsigned char *out,
611 unsigned char *p, int len);
612int tls1_alert_code(int code);
613int ssl3_alert_code(int code);
614int ssl_ok(SSL *s);
615
616SSL_COMP *ssl3_comp_find(STACK_OF(SSL_COMP) *sk, int n);
617STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void);
618
619
620#endif
diff --git a/src/lib/libssl/ssl_rsa.c b/src/lib/libssl/ssl_rsa.c
deleted file mode 100644
index 03828b6632..0000000000
--- a/src/lib/libssl/ssl_rsa.c
+++ /dev/null
@@ -1,815 +0,0 @@
1/* ssl/ssl_rsa.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include "ssl_locl.h"
61#include <openssl/bio.h>
62#include <openssl/objects.h>
63#include <openssl/evp.h>
64#include <openssl/x509.h>
65#include <openssl/pem.h>
66
67static int ssl_set_cert(CERT *c, X509 *x509);
68static int ssl_set_pkey(CERT *c, EVP_PKEY *pkey);
69int SSL_use_certificate(SSL *ssl, X509 *x)
70 {
71 if (x == NULL)
72 {
73 SSLerr(SSL_F_SSL_USE_CERTIFICATE,ERR_R_PASSED_NULL_PARAMETER);
74 return(0);
75 }
76 if (!ssl_cert_inst(&ssl->cert))
77 {
78 SSLerr(SSL_F_SSL_USE_CERTIFICATE,ERR_R_MALLOC_FAILURE);
79 return(0);
80 }
81 return(ssl_set_cert(ssl->cert,x));
82 }
83
84#ifndef OPENSSL_NO_STDIO
85int SSL_use_certificate_file(SSL *ssl, const char *file, int type)
86 {
87 int j;
88 BIO *in;
89 int ret=0;
90 X509 *x=NULL;
91
92 in=BIO_new(BIO_s_file_internal());
93 if (in == NULL)
94 {
95 SSLerr(SSL_F_SSL_USE_CERTIFICATE_FILE,ERR_R_BUF_LIB);
96 goto end;
97 }
98
99 if (BIO_read_filename(in,file) <= 0)
100 {
101 SSLerr(SSL_F_SSL_USE_CERTIFICATE_FILE,ERR_R_SYS_LIB);
102 goto end;
103 }
104 if (type == SSL_FILETYPE_ASN1)
105 {
106 j=ERR_R_ASN1_LIB;
107 x=d2i_X509_bio(in,NULL);
108 }
109 else if (type == SSL_FILETYPE_PEM)
110 {
111 j=ERR_R_PEM_LIB;
112 x=PEM_read_bio_X509(in,NULL,ssl->ctx->default_passwd_callback,ssl->ctx->default_passwd_callback_userdata);
113 }
114 else
115 {
116 SSLerr(SSL_F_SSL_USE_CERTIFICATE_FILE,SSL_R_BAD_SSL_FILETYPE);
117 goto end;
118 }
119
120 if (x == NULL)
121 {
122 SSLerr(SSL_F_SSL_USE_CERTIFICATE_FILE,j);
123 goto end;
124 }
125
126 ret=SSL_use_certificate(ssl,x);
127end:
128 if (x != NULL) X509_free(x);
129 if (in != NULL) BIO_free(in);
130 return(ret);
131 }
132#endif
133
134int SSL_use_certificate_ASN1(SSL *ssl, unsigned char *d, int len)
135 {
136 X509 *x;
137 int ret;
138
139 x=d2i_X509(NULL,&d,(long)len);
140 if (x == NULL)
141 {
142 SSLerr(SSL_F_SSL_USE_CERTIFICATE_ASN1,ERR_R_ASN1_LIB);
143 return(0);
144 }
145
146 ret=SSL_use_certificate(ssl,x);
147 X509_free(x);
148 return(ret);
149 }
150
151#ifndef OPENSSL_NO_RSA
152int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa)
153 {
154 EVP_PKEY *pkey;
155 int ret;
156
157 if (rsa == NULL)
158 {
159 SSLerr(SSL_F_SSL_USE_RSAPRIVATEKEY,ERR_R_PASSED_NULL_PARAMETER);
160 return(0);
161 }
162 if (!ssl_cert_inst(&ssl->cert))
163 {
164 SSLerr(SSL_F_SSL_USE_RSAPRIVATEKEY,ERR_R_MALLOC_FAILURE);
165 return(0);
166 }
167 if ((pkey=EVP_PKEY_new()) == NULL)
168 {
169 SSLerr(SSL_F_SSL_USE_RSAPRIVATEKEY,ERR_R_EVP_LIB);
170 return(0);
171 }
172
173 RSA_up_ref(rsa);
174 EVP_PKEY_assign_RSA(pkey,rsa);
175
176 ret=ssl_set_pkey(ssl->cert,pkey);
177 EVP_PKEY_free(pkey);
178 return(ret);
179 }
180#endif
181
182static int ssl_set_pkey(CERT *c, EVP_PKEY *pkey)
183 {
184 int i,ok=0,bad=0;
185
186 i=ssl_cert_type(NULL,pkey);
187 if (i < 0)
188 {
189 SSLerr(SSL_F_SSL_SET_PKEY,SSL_R_UNKNOWN_CERTIFICATE_TYPE);
190 return(0);
191 }
192
193 if (c->pkeys[i].x509 != NULL)
194 {
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
202 /* Don't check the public/private key, this is mostly
203 * for smart cards. */
204 if ((pkey->type == EVP_PKEY_RSA) &&
205 (RSA_flags(pkey->pkey.rsa) &
206 RSA_METHOD_FLAG_NO_CHECK))
207 ok=1;
208 else
209#endif
210 if (!X509_check_private_key(c->pkeys[i].x509,pkey))
211 {
212 if ((i == SSL_PKEY_DH_RSA) || (i == SSL_PKEY_DH_DSA))
213 {
214 i=(i == SSL_PKEY_DH_RSA)?
215 SSL_PKEY_DH_DSA:SSL_PKEY_DH_RSA;
216
217 if (c->pkeys[i].x509 == NULL)
218 ok=1;
219 else
220 {
221 if (!X509_check_private_key(
222 c->pkeys[i].x509,pkey))
223 bad=1;
224 else
225 ok=1;
226 }
227 }
228 else
229 bad=1;
230 }
231 else
232 ok=1;
233 }
234 else
235 ok=1;
236
237 if (bad)
238 {
239 X509_free(c->pkeys[i].x509);
240 c->pkeys[i].x509=NULL;
241 return(0);
242 }
243
244 if (c->pkeys[i].privatekey != NULL)
245 EVP_PKEY_free(c->pkeys[i].privatekey);
246 CRYPTO_add(&pkey->references,1,CRYPTO_LOCK_EVP_PKEY);
247 c->pkeys[i].privatekey=pkey;
248 c->key= &(c->pkeys[i]);
249
250 c->valid=0;
251 return(1);
252 }
253
254#ifndef OPENSSL_NO_RSA
255#ifndef OPENSSL_NO_STDIO
256int SSL_use_RSAPrivateKey_file(SSL *ssl, const char *file, int type)
257 {
258 int j,ret=0;
259 BIO *in;
260 RSA *rsa=NULL;
261
262 in=BIO_new(BIO_s_file_internal());
263 if (in == NULL)
264 {
265 SSLerr(SSL_F_SSL_USE_RSAPRIVATEKEY_FILE,ERR_R_BUF_LIB);
266 goto end;
267 }
268
269 if (BIO_read_filename(in,file) <= 0)
270 {
271 SSLerr(SSL_F_SSL_USE_RSAPRIVATEKEY_FILE,ERR_R_SYS_LIB);
272 goto end;
273 }
274 if (type == SSL_FILETYPE_ASN1)
275 {
276 j=ERR_R_ASN1_LIB;
277 rsa=d2i_RSAPrivateKey_bio(in,NULL);
278 }
279 else if (type == SSL_FILETYPE_PEM)
280 {
281 j=ERR_R_PEM_LIB;
282 rsa=PEM_read_bio_RSAPrivateKey(in,NULL,
283 ssl->ctx->default_passwd_callback,ssl->ctx->default_passwd_callback_userdata);
284 }
285 else
286 {
287 SSLerr(SSL_F_SSL_USE_RSAPRIVATEKEY_FILE,SSL_R_BAD_SSL_FILETYPE);
288 goto end;
289 }
290 if (rsa == NULL)
291 {
292 SSLerr(SSL_F_SSL_USE_RSAPRIVATEKEY_FILE,j);
293 goto end;
294 }
295 ret=SSL_use_RSAPrivateKey(ssl,rsa);
296 RSA_free(rsa);
297end:
298 if (in != NULL) BIO_free(in);
299 return(ret);
300 }
301#endif
302
303int SSL_use_RSAPrivateKey_ASN1(SSL *ssl, unsigned char *d, long len)
304 {
305 int ret;
306 const unsigned char *p;
307 RSA *rsa;
308
309 p=d;
310 if ((rsa=d2i_RSAPrivateKey(NULL,&p,(long)len)) == NULL)
311 {
312 SSLerr(SSL_F_SSL_USE_RSAPRIVATEKEY_ASN1,ERR_R_ASN1_LIB);
313 return(0);
314 }
315
316 ret=SSL_use_RSAPrivateKey(ssl,rsa);
317 RSA_free(rsa);
318 return(ret);
319 }
320#endif /* !OPENSSL_NO_RSA */
321
322int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey)
323 {
324 int ret;
325
326 if (pkey == NULL)
327 {
328 SSLerr(SSL_F_SSL_USE_PRIVATEKEY,ERR_R_PASSED_NULL_PARAMETER);
329 return(0);
330 }
331 if (!ssl_cert_inst(&ssl->cert))
332 {
333 SSLerr(SSL_F_SSL_USE_PRIVATEKEY,ERR_R_MALLOC_FAILURE);
334 return(0);
335 }
336 ret=ssl_set_pkey(ssl->cert,pkey);
337 return(ret);
338 }
339
340#ifndef OPENSSL_NO_STDIO
341int SSL_use_PrivateKey_file(SSL *ssl, const char *file, int type)
342 {
343 int j,ret=0;
344 BIO *in;
345 EVP_PKEY *pkey=NULL;
346
347 in=BIO_new(BIO_s_file_internal());
348 if (in == NULL)
349 {
350 SSLerr(SSL_F_SSL_USE_PRIVATEKEY_FILE,ERR_R_BUF_LIB);
351 goto end;
352 }
353
354 if (BIO_read_filename(in,file) <= 0)
355 {
356 SSLerr(SSL_F_SSL_USE_PRIVATEKEY_FILE,ERR_R_SYS_LIB);
357 goto end;
358 }
359 if (type == SSL_FILETYPE_PEM)
360 {
361 j=ERR_R_PEM_LIB;
362 pkey=PEM_read_bio_PrivateKey(in,NULL,
363 ssl->ctx->default_passwd_callback,ssl->ctx->default_passwd_callback_userdata);
364 }
365 else
366 {
367 SSLerr(SSL_F_SSL_USE_PRIVATEKEY_FILE,SSL_R_BAD_SSL_FILETYPE);
368 goto end;
369 }
370 if (pkey == NULL)
371 {
372 SSLerr(SSL_F_SSL_USE_PRIVATEKEY_FILE,j);
373 goto end;
374 }
375 ret=SSL_use_PrivateKey(ssl,pkey);
376 EVP_PKEY_free(pkey);
377end:
378 if (in != NULL) BIO_free(in);
379 return(ret);
380 }
381#endif
382
383int SSL_use_PrivateKey_ASN1(int type, SSL *ssl, unsigned char *d, long len)
384 {
385 int ret;
386 unsigned char *p;
387 EVP_PKEY *pkey;
388
389 p=d;
390 if ((pkey=d2i_PrivateKey(type,NULL,&p,(long)len)) == NULL)
391 {
392 SSLerr(SSL_F_SSL_USE_PRIVATEKEY_ASN1,ERR_R_ASN1_LIB);
393 return(0);
394 }
395
396 ret=SSL_use_PrivateKey(ssl,pkey);
397 EVP_PKEY_free(pkey);
398 return(ret);
399 }
400
401int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x)
402 {
403 if (x == NULL)
404 {
405 SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE,ERR_R_PASSED_NULL_PARAMETER);
406 return(0);
407 }
408 if (!ssl_cert_inst(&ctx->cert))
409 {
410 SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE,ERR_R_MALLOC_FAILURE);
411 return(0);
412 }
413 return(ssl_set_cert(ctx->cert, x));
414 }
415
416static int ssl_set_cert(CERT *c, X509 *x)
417 {
418 EVP_PKEY *pkey;
419 int i,ok=0,bad=0;
420
421 pkey=X509_get_pubkey(x);
422 if (pkey == NULL)
423 {
424 SSLerr(SSL_F_SSL_SET_CERT,SSL_R_X509_LIB);
425 return(0);
426 }
427
428 i=ssl_cert_type(x,pkey);
429 if (i < 0)
430 {
431 SSLerr(SSL_F_SSL_SET_CERT,SSL_R_UNKNOWN_CERTIFICATE_TYPE);
432 EVP_PKEY_free(pkey);
433 return(0);
434 }
435
436 if (c->pkeys[i].privatekey != NULL)
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 {
451 if (!X509_check_private_key(x,c->pkeys[i].privatekey))
452 {
453 if ((i == SSL_PKEY_DH_RSA) || (i == SSL_PKEY_DH_DSA))
454 {
455 i=(i == SSL_PKEY_DH_RSA)?
456 SSL_PKEY_DH_DSA:SSL_PKEY_DH_RSA;
457
458 if (c->pkeys[i].privatekey == NULL)
459 ok=1;
460 else
461 {
462 if (!X509_check_private_key(x,
463 c->pkeys[i].privatekey))
464 bad=1;
465 else
466 ok=1;
467 }
468 }
469 else
470 bad=1;
471 }
472 else
473 ok=1;
474 } /* OPENSSL_NO_RSA */
475 }
476 else
477 ok=1;
478
479 EVP_PKEY_free(pkey);
480 if (bad)
481 {
482 EVP_PKEY_free(c->pkeys[i].privatekey);
483 c->pkeys[i].privatekey=NULL;
484 }
485
486 if (c->pkeys[i].x509 != NULL)
487 X509_free(c->pkeys[i].x509);
488 CRYPTO_add(&x->references,1,CRYPTO_LOCK_X509);
489 c->pkeys[i].x509=x;
490 c->key= &(c->pkeys[i]);
491
492 c->valid=0;
493 return(1);
494 }
495
496#ifndef OPENSSL_NO_STDIO
497int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type)
498 {
499 int j;
500 BIO *in;
501 int ret=0;
502 X509 *x=NULL;
503
504 in=BIO_new(BIO_s_file_internal());
505 if (in == NULL)
506 {
507 SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_FILE,ERR_R_BUF_LIB);
508 goto end;
509 }
510
511 if (BIO_read_filename(in,file) <= 0)
512 {
513 SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_FILE,ERR_R_SYS_LIB);
514 goto end;
515 }
516 if (type == SSL_FILETYPE_ASN1)
517 {
518 j=ERR_R_ASN1_LIB;
519 x=d2i_X509_bio(in,NULL);
520 }
521 else if (type == SSL_FILETYPE_PEM)
522 {
523 j=ERR_R_PEM_LIB;
524 x=PEM_read_bio_X509(in,NULL,ctx->default_passwd_callback,ctx->default_passwd_callback_userdata);
525 }
526 else
527 {
528 SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_FILE,SSL_R_BAD_SSL_FILETYPE);
529 goto end;
530 }
531
532 if (x == NULL)
533 {
534 SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_FILE,j);
535 goto end;
536 }
537
538 ret=SSL_CTX_use_certificate(ctx,x);
539end:
540 if (x != NULL) X509_free(x);
541 if (in != NULL) BIO_free(in);
542 return(ret);
543 }
544#endif
545
546int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len, unsigned char *d)
547 {
548 X509 *x;
549 int ret;
550
551 x=d2i_X509(NULL,&d,(long)len);
552 if (x == NULL)
553 {
554 SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_ASN1,ERR_R_ASN1_LIB);
555 return(0);
556 }
557
558 ret=SSL_CTX_use_certificate(ctx,x);
559 X509_free(x);
560 return(ret);
561 }
562
563#ifndef OPENSSL_NO_RSA
564int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa)
565 {
566 int ret;
567 EVP_PKEY *pkey;
568
569 if (rsa == NULL)
570 {
571 SSLerr(SSL_F_SSL_CTX_USE_RSAPRIVATEKEY,ERR_R_PASSED_NULL_PARAMETER);
572 return(0);
573 }
574 if (!ssl_cert_inst(&ctx->cert))
575 {
576 SSLerr(SSL_F_SSL_CTX_USE_RSAPRIVATEKEY,ERR_R_MALLOC_FAILURE);
577 return(0);
578 }
579 if ((pkey=EVP_PKEY_new()) == NULL)
580 {
581 SSLerr(SSL_F_SSL_CTX_USE_RSAPRIVATEKEY,ERR_R_EVP_LIB);
582 return(0);
583 }
584
585 RSA_up_ref(rsa);
586 EVP_PKEY_assign_RSA(pkey,rsa);
587
588 ret=ssl_set_pkey(ctx->cert, pkey);
589 EVP_PKEY_free(pkey);
590 return(ret);
591 }
592
593#ifndef OPENSSL_NO_STDIO
594int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, const char *file, int type)
595 {
596 int j,ret=0;
597 BIO *in;
598 RSA *rsa=NULL;
599
600 in=BIO_new(BIO_s_file_internal());
601 if (in == NULL)
602 {
603 SSLerr(SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_FILE,ERR_R_BUF_LIB);
604 goto end;
605 }
606
607 if (BIO_read_filename(in,file) <= 0)
608 {
609 SSLerr(SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_FILE,ERR_R_SYS_LIB);
610 goto end;
611 }
612 if (type == SSL_FILETYPE_ASN1)
613 {
614 j=ERR_R_ASN1_LIB;
615 rsa=d2i_RSAPrivateKey_bio(in,NULL);
616 }
617 else if (type == SSL_FILETYPE_PEM)
618 {
619 j=ERR_R_PEM_LIB;
620 rsa=PEM_read_bio_RSAPrivateKey(in,NULL,
621 ctx->default_passwd_callback,ctx->default_passwd_callback_userdata);
622 }
623 else
624 {
625 SSLerr(SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_FILE,SSL_R_BAD_SSL_FILETYPE);
626 goto end;
627 }
628 if (rsa == NULL)
629 {
630 SSLerr(SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_FILE,j);
631 goto end;
632 }
633 ret=SSL_CTX_use_RSAPrivateKey(ctx,rsa);
634 RSA_free(rsa);
635end:
636 if (in != NULL) BIO_free(in);
637 return(ret);
638 }
639#endif
640
641int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, unsigned char *d, long len)
642 {
643 int ret;
644 const unsigned char *p;
645 RSA *rsa;
646
647 p=d;
648 if ((rsa=d2i_RSAPrivateKey(NULL,&p,(long)len)) == NULL)
649 {
650 SSLerr(SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_ASN1,ERR_R_ASN1_LIB);
651 return(0);
652 }
653
654 ret=SSL_CTX_use_RSAPrivateKey(ctx,rsa);
655 RSA_free(rsa);
656 return(ret);
657 }
658#endif /* !OPENSSL_NO_RSA */
659
660int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey)
661 {
662 if (pkey == NULL)
663 {
664 SSLerr(SSL_F_SSL_CTX_USE_PRIVATEKEY,ERR_R_PASSED_NULL_PARAMETER);
665 return(0);
666 }
667 if (!ssl_cert_inst(&ctx->cert))
668 {
669 SSLerr(SSL_F_SSL_CTX_USE_PRIVATEKEY,ERR_R_MALLOC_FAILURE);
670 return(0);
671 }
672 return(ssl_set_pkey(ctx->cert,pkey));
673 }
674
675#ifndef OPENSSL_NO_STDIO
676int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type)
677 {
678 int j,ret=0;
679 BIO *in;
680 EVP_PKEY *pkey=NULL;
681
682 in=BIO_new(BIO_s_file_internal());
683 if (in == NULL)
684 {
685 SSLerr(SSL_F_SSL_CTX_USE_PRIVATEKEY_FILE,ERR_R_BUF_LIB);
686 goto end;
687 }
688
689 if (BIO_read_filename(in,file) <= 0)
690 {
691 SSLerr(SSL_F_SSL_CTX_USE_PRIVATEKEY_FILE,ERR_R_SYS_LIB);
692 goto end;
693 }
694 if (type == SSL_FILETYPE_PEM)
695 {
696 j=ERR_R_PEM_LIB;
697 pkey=PEM_read_bio_PrivateKey(in,NULL,
698 ctx->default_passwd_callback,ctx->default_passwd_callback_userdata);
699 }
700 else
701 {
702 SSLerr(SSL_F_SSL_CTX_USE_PRIVATEKEY_FILE,SSL_R_BAD_SSL_FILETYPE);
703 goto end;
704 }
705 if (pkey == NULL)
706 {
707 SSLerr(SSL_F_SSL_CTX_USE_PRIVATEKEY_FILE,j);
708 goto end;
709 }
710 ret=SSL_CTX_use_PrivateKey(ctx,pkey);
711 EVP_PKEY_free(pkey);
712end:
713 if (in != NULL) BIO_free(in);
714 return(ret);
715 }
716#endif
717
718int SSL_CTX_use_PrivateKey_ASN1(int type, SSL_CTX *ctx, unsigned char *d,
719 long len)
720 {
721 int ret;
722 unsigned char *p;
723 EVP_PKEY *pkey;
724
725 p=d;
726 if ((pkey=d2i_PrivateKey(type,NULL,&p,(long)len)) == NULL)
727 {
728 SSLerr(SSL_F_SSL_CTX_USE_PRIVATEKEY_ASN1,ERR_R_ASN1_LIB);
729 return(0);
730 }
731
732 ret=SSL_CTX_use_PrivateKey(ctx,pkey);
733 EVP_PKEY_free(pkey);
734 return(ret);
735 }
736
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
deleted file mode 100644
index 664f8c2230..0000000000
--- a/src/lib/libssl/ssl_sess.c
+++ /dev/null
@@ -1,751 +0,0 @@
1/* ssl/ssl_sess.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include <openssl/lhash.h>
61#include <openssl/rand.h>
62#include "ssl_locl.h"
63
64static void SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *s);
65static void SSL_SESSION_list_add(SSL_CTX *ctx,SSL_SESSION *s);
66static int remove_session_lock(SSL_CTX *ctx, SSL_SESSION *c, int lck);
67
68SSL_SESSION *SSL_get_session(SSL *ssl)
69/* aka SSL_get0_session; gets 0 objects, just returns a copy of the pointer */
70 {
71 return(ssl->session);
72 }
73
74SSL_SESSION *SSL_get1_session(SSL *ssl)
75/* variant of SSL_get_session: caller really gets something */
76 {
77 SSL_SESSION *sess;
78 /* Need to lock this all up rather than just use CRYPTO_add so that
79 * somebody doesn't free ssl->session between when we check it's
80 * non-null and when we up the reference count. */
81 CRYPTO_r_lock(CRYPTO_LOCK_SSL_SESSION);
82 sess = ssl->session;
83 if(sess)
84 sess->references++;
85 CRYPTO_r_unlock(CRYPTO_LOCK_SSL_SESSION);
86 return(sess);
87 }
88
89int SSL_SESSION_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
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)
97 {
98 return(CRYPTO_set_ex_data(&s->ex_data,idx,arg));
99 }
100
101void *SSL_SESSION_get_ex_data(SSL_SESSION *s, int idx)
102 {
103 return(CRYPTO_get_ex_data(&s->ex_data,idx));
104 }
105
106SSL_SESSION *SSL_SESSION_new(void)
107 {
108 SSL_SESSION *ss;
109
110 ss=(SSL_SESSION *)OPENSSL_malloc(sizeof(SSL_SESSION));
111 if (ss == NULL)
112 {
113 SSLerr(SSL_F_SSL_SESSION_NEW,ERR_R_MALLOC_FAILURE);
114 return(0);
115 }
116 memset(ss,0,sizeof(SSL_SESSION));
117
118 ss->verify_result = 1; /* avoid 0 (= X509_V_OK) just in case */
119 ss->references=1;
120 ss->timeout=60*5+4; /* 5 minute timeout by default */
121 ss->time=time(NULL);
122 ss->prev=NULL;
123 ss->next=NULL;
124 ss->compress_meth=0;
125 CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, ss, &ss->ex_data);
126 return(ss);
127 }
128
129/* Even with SSLv2, we have 16 bytes (128 bits) of session ID space. SSLv3/TLSv1
130 * has 32 bytes (256 bits). As such, filling the ID with random gunk repeatedly
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)
162 {
163 /* This gets used by clients and servers. */
164
165 unsigned int tmp;
166 SSL_SESSION *ss=NULL;
167 GEN_SESSION_CB cb = def_generate_session_id;
168
169 if ((ss=SSL_SESSION_new()) == NULL) return(0);
170
171 /* If the context has a default timeout, use it */
172 if (s->ctx->session_timeout == 0)
173 ss->timeout=SSL_get_default_timeout(s);
174 else
175 ss->timeout=s->ctx->session_timeout;
176
177 if (s->session != NULL)
178 {
179 SSL_SESSION_free(s->session);
180 s->session=NULL;
181 }
182
183 if (session)
184 {
185 if (s->version == SSL2_VERSION)
186 {
187 ss->ssl_version=SSL2_VERSION;
188 ss->session_id_length=SSL2_SSL_SESSION_ID_LENGTH;
189 }
190 else if (s->version == SSL3_VERSION)
191 {
192 ss->ssl_version=SSL3_VERSION;
193 ss->session_id_length=SSL3_SSL_SESSION_ID_LENGTH;
194 }
195 else if (s->version == TLS1_VERSION)
196 {
197 ss->ssl_version=TLS1_VERSION;
198 ss->session_id_length=SSL3_SSL_SESSION_ID_LENGTH;
199 }
200 else
201 {
202 SSLerr(SSL_F_SSL_GET_NEW_SESSION,SSL_R_UNSUPPORTED_SSL_VERSION);
203 SSL_SESSION_free(ss);
204 return(0);
205 }
206 /* Choose which callback will set the session ID */
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))
241 {
242 SSLerr(SSL_F_SSL_GET_NEW_SESSION,
243 SSL_R_SSL_SESSION_ID_CONFLICT);
244 SSL_SESSION_free(ss);
245 return(0);
246 }
247 }
248 else
249 {
250 ss->session_id_length=0;
251 }
252
253 if (s->sid_ctx_length > sizeof ss->sid_ctx)
254 {
255 SSLerr(SSL_F_SSL_GET_NEW_SESSION, ERR_R_INTERNAL_ERROR);
256 SSL_SESSION_free(ss);
257 return 0;
258 }
259 memcpy(ss->sid_ctx,s->sid_ctx,s->sid_ctx_length);
260 ss->sid_ctx_length=s->sid_ctx_length;
261 s->session=ss;
262 ss->ssl_version=s->version;
263 ss->verify_result = X509_V_OK;
264
265 return(1);
266 }
267
268int ssl_get_prev_session(SSL *s, unsigned char *session_id, int len)
269 {
270 /* This is used only by servers. */
271
272 SSL_SESSION *ret=NULL,data;
273 int fatal = 0;
274
275 data.ssl_version=s->version;
276 data.session_id_length=len;
277 if (len > SSL_MAX_SSL_SESSION_ID_LENGTH)
278 goto err;
279 memcpy(data.session_id,session_id,len);
280
281 if (!(s->ctx->session_cache_mode & SSL_SESS_CACHE_NO_INTERNAL_LOOKUP))
282 {
283 CRYPTO_r_lock(CRYPTO_LOCK_SSL_CTX);
284 ret=(SSL_SESSION *)lh_retrieve(s->ctx->sessions,&data);
285 if (ret != NULL)
286 /* don't allow other threads to steal it: */
287 CRYPTO_add(&ret->references,1,CRYPTO_LOCK_SSL_SESSION);
288 CRYPTO_r_unlock(CRYPTO_LOCK_SSL_CTX);
289 }
290
291 if (ret == NULL)
292 {
293 int copy=1;
294
295 s->ctx->stats.sess_miss++;
296 ret=NULL;
297 if (s->ctx->get_session_cb != NULL
298 && (ret=s->ctx->get_session_cb(s,session_id,len,&copy))
299 != NULL)
300 {
301 s->ctx->stats.sess_cb_hit++;
302
303 /* Increment reference count now if the session callback
304 * asks us to do so (note that if the session structures
305 * returned by the callback are shared between threads,
306 * it must handle the reference count itself [i.e. copy == 0],
307 * or things won't be thread-safe). */
308 if (copy)
309 CRYPTO_add(&ret->references,1,CRYPTO_LOCK_SSL_SESSION);
310
311 /* The following should not return 1, otherwise,
312 * things are very strange */
313 SSL_CTX_add_session(s->ctx,ret);
314 }
315 if (ret == NULL)
316 goto err;
317 }
318
319 /* Now ret is non-NULL, and we own one of its reference counts. */
320
321 if((s->verify_mode&SSL_VERIFY_PEER)
322 && (!s->sid_ctx_length || ret->sid_ctx_length != s->sid_ctx_length
323 || memcmp(ret->sid_ctx,s->sid_ctx,ret->sid_ctx_length)))
324 {
325 /* We've found the session named by the client, but we don't
326 * want to use it in this context. */
327
328 if (s->sid_ctx_length == 0)
329 {
330 /* application should have used SSL[_CTX]_set_session_id_context
331 * -- we could tolerate this and just pretend we never heard
332 * of this session, but then applications could effectively
333 * disable the session cache by accident without anyone noticing */
334
335 SSLerr(SSL_F_SSL_GET_PREV_SESSION,SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED);
336 fatal = 1;
337 goto err;
338 }
339 else
340 {
341#if 0 /* The client cannot always know when a session is not appropriate,
342 * so we shouldn't generate an error message. */
343
344 SSLerr(SSL_F_SSL_GET_PREV_SESSION,SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT);
345#endif
346 goto err; /* treat like cache miss */
347 }
348 }
349
350 if (ret->cipher == NULL)
351 {
352 unsigned char buf[5],*p;
353 unsigned long l;
354
355 p=buf;
356 l=ret->cipher_id;
357 l2n(l,p);
358 if ((ret->ssl_version>>8) == SSL3_VERSION_MAJOR)
359 ret->cipher=ssl_get_cipher_by_char(s,&(buf[2]));
360 else
361 ret->cipher=ssl_get_cipher_by_char(s,&(buf[1]));
362 if (ret->cipher == NULL)
363 goto err;
364 }
365
366
367#if 0 /* This is way too late. */
368
369 /* If a thread got the session, then 'swaped', and another got
370 * it and then due to a time-out decided to 'OPENSSL_free' it we could
371 * be in trouble. So I'll increment it now, then double decrement
372 * later - am I speaking rubbish?. */
373 CRYPTO_add(&ret->references,1,CRYPTO_LOCK_SSL_SESSION);
374#endif
375
376 if ((long)(ret->time+ret->timeout) < (long)time(NULL)) /* timeout */
377 {
378 s->ctx->stats.sess_timeout++;
379 /* remove it from the cache */
380 SSL_CTX_remove_session(s->ctx,ret);
381 goto err;
382 }
383
384 s->ctx->stats.sess_hit++;
385
386 /* ret->time=time(NULL); */ /* rezero timeout? */
387 /* again, just leave the session
388 * if it is the same session, we have just incremented and
389 * then decremented the reference count :-) */
390 if (s->session != NULL)
391 SSL_SESSION_free(s->session);
392 s->session=ret;
393 s->verify_result = s->session->verify_result;
394 return(1);
395
396 err:
397 if (ret != NULL)
398 SSL_SESSION_free(ret);
399 if (fatal)
400 return -1;
401 else
402 return 0;
403 }
404
405int SSL_CTX_add_session(SSL_CTX *ctx, SSL_SESSION *c)
406 {
407 int ret=0;
408 SSL_SESSION *s;
409
410 /* add just 1 reference count for the SSL_CTX's session cache
411 * even though it has two ways of access: each session is in a
412 * doubly linked list and an lhash */
413 CRYPTO_add(&c->references,1,CRYPTO_LOCK_SSL_SESSION);
414 /* if session c is in already in cache, we take back the increment later */
415
416 CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
417 s=(SSL_SESSION *)lh_insert(ctx->sessions,c);
418
419 /* s != NULL iff we already had a session with the given PID.
420 * In this case, s == c should hold (then we did not really modify
421 * ctx->sessions), or we're in trouble. */
422 if (s != NULL && s != c)
423 {
424 /* We *are* in trouble ... */
425 SSL_SESSION_list_remove(ctx,s);
426 SSL_SESSION_free(s);
427 /* ... so pretend the other session did not exist in cache
428 * (we cannot handle two SSL_SESSION structures with identical
429 * session ID in the same cache, which could happen e.g. when
430 * two threads concurrently obtain the same session from an external
431 * cache) */
432 s = NULL;
433 }
434
435 /* Put at the head of the queue unless it is already in the cache */
436 if (s == NULL)
437 SSL_SESSION_list_add(ctx,c);
438
439 if (s != NULL)
440 {
441 /* existing cache entry -- decrement previously incremented reference
442 * count because it already takes into account the cache */
443
444 SSL_SESSION_free(s); /* s == c */
445 ret=0;
446 }
447 else
448 {
449 /* new cache entry -- remove old ones if cache has become too large */
450
451 ret=1;
452
453 if (SSL_CTX_sess_get_cache_size(ctx) > 0)
454 {
455 while (SSL_CTX_sess_number(ctx) >
456 SSL_CTX_sess_get_cache_size(ctx))
457 {
458 if (!remove_session_lock(ctx,
459 ctx->session_cache_tail, 0))
460 break;
461 else
462 ctx->stats.sess_cache_full++;
463 }
464 }
465 }
466 CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
467 return(ret);
468 }
469
470int SSL_CTX_remove_session(SSL_CTX *ctx, SSL_SESSION *c)
471{
472 return remove_session_lock(ctx, c, 1);
473}
474
475static int remove_session_lock(SSL_CTX *ctx, SSL_SESSION *c, int lck)
476 {
477 SSL_SESSION *r;
478 int ret=0;
479
480 if ((c != NULL) && (c->session_id_length != 0))
481 {
482 if(lck) CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
483 if ((r = (SSL_SESSION *)lh_retrieve(ctx->sessions,c)) == c)
484 {
485 ret=1;
486 r=(SSL_SESSION *)lh_delete(ctx->sessions,c);
487 SSL_SESSION_list_remove(ctx,c);
488 }
489
490 if(lck) CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
491
492 if (ret)
493 {
494 r->not_resumable=1;
495 if (ctx->remove_session_cb != NULL)
496 ctx->remove_session_cb(ctx,r);
497 SSL_SESSION_free(r);
498 }
499 }
500 else
501 ret=0;
502 return(ret);
503 }
504
505void SSL_SESSION_free(SSL_SESSION *ss)
506 {
507 int i;
508
509 if(ss == NULL)
510 return;
511
512 i=CRYPTO_add(&ss->references,-1,CRYPTO_LOCK_SSL_SESSION);
513#ifdef REF_PRINT
514 REF_PRINT("SSL_SESSION",ss);
515#endif
516 if (i > 0) return;
517#ifdef REF_CHECK
518 if (i < 0)
519 {
520 fprintf(stderr,"SSL_SESSION_free, bad reference count\n");
521 abort(); /* ok */
522 }
523#endif
524
525 CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, ss, &ss->ex_data);
526
527 memset(ss->key_arg,0,SSL_MAX_KEY_ARG_LENGTH);
528 memset(ss->master_key,0,SSL_MAX_MASTER_KEY_LENGTH);
529 memset(ss->session_id,0,SSL_MAX_SSL_SESSION_ID_LENGTH);
530 if (ss->sess_cert != NULL) ssl_sess_cert_free(ss->sess_cert);
531 if (ss->peer != NULL) X509_free(ss->peer);
532 if (ss->ciphers != NULL) sk_SSL_CIPHER_free(ss->ciphers);
533 memset(ss,0,sizeof(*ss));
534 OPENSSL_free(ss);
535 }
536
537int SSL_set_session(SSL *s, SSL_SESSION *session)
538 {
539 int ret=0;
540 SSL_METHOD *meth;
541
542 if (session != NULL)
543 {
544 meth=s->ctx->method->get_ssl_method(session->ssl_version);
545 if (meth == NULL)
546 meth=s->method->get_ssl_method(session->ssl_version);
547 if (meth == NULL)
548 {
549 SSLerr(SSL_F_SSL_SET_SESSION,SSL_R_UNABLE_TO_FIND_SSL_METHOD);
550 return(0);
551 }
552
553 if (meth != s->method)
554 {
555 if (!SSL_set_ssl_method(s,meth))
556 return(0);
557 if (s->ctx->session_timeout == 0)
558 session->timeout=SSL_get_default_timeout(s);
559 else
560 session->timeout=s->ctx->session_timeout;
561 }
562
563#ifndef OPENSSL_NO_KRB5
564 if (s->kssl_ctx && !s->kssl_ctx->client_princ &&
565 session->krb5_client_princ_len > 0)
566 {
567 s->kssl_ctx->client_princ = (char *)malloc(session->krb5_client_princ_len + 1);
568 memcpy(s->kssl_ctx->client_princ,session->krb5_client_princ,
569 session->krb5_client_princ_len);
570 s->kssl_ctx->client_princ[session->krb5_client_princ_len] = '\0';
571 }
572#endif /* OPENSSL_NO_KRB5 */
573
574 /* CRYPTO_w_lock(CRYPTO_LOCK_SSL);*/
575 CRYPTO_add(&session->references,1,CRYPTO_LOCK_SSL_SESSION);
576 if (s->session != NULL)
577 SSL_SESSION_free(s->session);
578 s->session=session;
579 s->verify_result = s->session->verify_result;
580 /* CRYPTO_w_unlock(CRYPTO_LOCK_SSL);*/
581 ret=1;
582 }
583 else
584 {
585 if (s->session != NULL)
586 {
587 SSL_SESSION_free(s->session);
588 s->session=NULL;
589 }
590
591 meth=s->ctx->method;
592 if (meth != s->method)
593 {
594 if (!SSL_set_ssl_method(s,meth))
595 return(0);
596 }
597 ret=1;
598 }
599 return(ret);
600 }
601
602long SSL_SESSION_set_timeout(SSL_SESSION *s, long t)
603 {
604 if (s == NULL) return(0);
605 s->timeout=t;
606 return(1);
607 }
608
609long SSL_SESSION_get_timeout(SSL_SESSION *s)
610 {
611 if (s == NULL) return(0);
612 return(s->timeout);
613 }
614
615long SSL_SESSION_get_time(SSL_SESSION *s)
616 {
617 if (s == NULL) return(0);
618 return(s->time);
619 }
620
621long SSL_SESSION_set_time(SSL_SESSION *s, long t)
622 {
623 if (s == NULL) return(0);
624 s->time=t;
625 return(t);
626 }
627
628long SSL_CTX_set_timeout(SSL_CTX *s, long t)
629 {
630 long l;
631 if (s == NULL) return(0);
632 l=s->session_timeout;
633 s->session_timeout=t;
634 return(l);
635 }
636
637long SSL_CTX_get_timeout(SSL_CTX *s)
638 {
639 if (s == NULL) return(0);
640 return(s->session_timeout);
641 }
642
643typedef struct timeout_param_st
644 {
645 SSL_CTX *ctx;
646 long time;
647 LHASH *cache;
648 } TIMEOUT_PARAM;
649
650static void timeout(SSL_SESSION *s, TIMEOUT_PARAM *p)
651 {
652 if ((p->time == 0) || (p->time > (s->time+s->timeout))) /* timeout */
653 {
654 /* The reason we don't call SSL_CTX_remove_session() is to
655 * save on locking overhead */
656 lh_delete(p->cache,s);
657 SSL_SESSION_list_remove(p->ctx,s);
658 s->not_resumable=1;
659 if (p->ctx->remove_session_cb != NULL)
660 p->ctx->remove_session_cb(p->ctx,s);
661 SSL_SESSION_free(s);
662 }
663 }
664
665static IMPLEMENT_LHASH_DOALL_ARG_FN(timeout, SSL_SESSION *, TIMEOUT_PARAM *)
666
667void SSL_CTX_flush_sessions(SSL_CTX *s, long t)
668 {
669 unsigned long i;
670 TIMEOUT_PARAM tp;
671
672 tp.ctx=s;
673 tp.cache=s->sessions;
674 if (tp.cache == NULL) return;
675 tp.time=t;
676 CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
677 i=tp.cache->down_load;
678 tp.cache->down_load=0;
679 lh_doall_arg(tp.cache, LHASH_DOALL_ARG_FN(timeout), &tp);
680 tp.cache->down_load=i;
681 CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
682 }
683
684int ssl_clear_bad_session(SSL *s)
685 {
686 if ( (s->session != NULL) &&
687 !(s->shutdown & SSL_SENT_SHUTDOWN) &&
688 !(SSL_in_init(s) || SSL_in_before(s)))
689 {
690 SSL_CTX_remove_session(s->ctx,s->session);
691 return(1);
692 }
693 else
694 return(0);
695 }
696
697/* locked by SSL_CTX in the calling function */
698static void SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *s)
699 {
700 if ((s->next == NULL) || (s->prev == NULL)) return;
701
702 if (s->next == (SSL_SESSION *)&(ctx->session_cache_tail))
703 { /* last element in list */
704 if (s->prev == (SSL_SESSION *)&(ctx->session_cache_head))
705 { /* only one element in list */
706 ctx->session_cache_head=NULL;
707 ctx->session_cache_tail=NULL;
708 }
709 else
710 {
711 ctx->session_cache_tail=s->prev;
712 s->prev->next=(SSL_SESSION *)&(ctx->session_cache_tail);
713 }
714 }
715 else
716 {
717 if (s->prev == (SSL_SESSION *)&(ctx->session_cache_head))
718 { /* first element in list */
719 ctx->session_cache_head=s->next;
720 s->next->prev=(SSL_SESSION *)&(ctx->session_cache_head);
721 }
722 else
723 { /* middle of list */
724 s->next->prev=s->prev;
725 s->prev->next=s->next;
726 }
727 }
728 s->prev=s->next=NULL;
729 }
730
731static void SSL_SESSION_list_add(SSL_CTX *ctx, SSL_SESSION *s)
732 {
733 if ((s->next != NULL) && (s->prev != NULL))
734 SSL_SESSION_list_remove(ctx,s);
735
736 if (ctx->session_cache_head == NULL)
737 {
738 ctx->session_cache_head=s;
739 ctx->session_cache_tail=s;
740 s->prev=(SSL_SESSION *)&(ctx->session_cache_head);
741 s->next=(SSL_SESSION *)&(ctx->session_cache_tail);
742 }
743 else
744 {
745 s->next=ctx->session_cache_head;
746 s->next->prev=s;
747 s->prev=(SSL_SESSION *)&(ctx->session_cache_head);
748 ctx->session_cache_head=s;
749 }
750 }
751
diff --git a/src/lib/libssl/ssl_stat.c b/src/lib/libssl/ssl_stat.c
deleted file mode 100644
index b16d253081..0000000000
--- a/src/lib/libssl/ssl_stat.c
+++ /dev/null
@@ -1,502 +0,0 @@
1/* ssl/ssl_stat.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include "ssl_locl.h"
61
62const char *SSL_state_string_long(const SSL *s)
63 {
64 const char *str;
65
66 switch (s->state)
67 {
68case SSL_ST_BEFORE: str="before SSL initialization"; break;
69case SSL_ST_ACCEPT: str="before accept initialization"; break;
70case SSL_ST_CONNECT: str="before connect initialization"; break;
71case SSL_ST_OK: str="SSL negotiation finished successfully"; break;
72case SSL_ST_RENEGOTIATE: str="SSL renegotiate ciphers"; break;
73case SSL_ST_BEFORE|SSL_ST_CONNECT: str="before/connect initialization"; break;
74case SSL_ST_OK|SSL_ST_CONNECT: str="ok/connect SSL initialization"; break;
75case SSL_ST_BEFORE|SSL_ST_ACCEPT: str="before/accept initialization"; break;
76case SSL_ST_OK|SSL_ST_ACCEPT: str="ok/accept SSL initialization"; break;
77#ifndef OPENSSL_NO_SSL2
78case SSL2_ST_CLIENT_START_ENCRYPTION: str="SSLv2 client start encryption"; break;
79case SSL2_ST_SERVER_START_ENCRYPTION: str="SSLv2 server start encryption"; break;
80case SSL2_ST_SEND_CLIENT_HELLO_A: str="SSLv2 write client hello A"; break;
81case SSL2_ST_SEND_CLIENT_HELLO_B: str="SSLv2 write client hello B"; break;
82case SSL2_ST_GET_SERVER_HELLO_A: str="SSLv2 read server hello A"; break;
83case SSL2_ST_GET_SERVER_HELLO_B: str="SSLv2 read server hello B"; break;
84case SSL2_ST_SEND_CLIENT_MASTER_KEY_A: str="SSLv2 write client master key A"; break;
85case SSL2_ST_SEND_CLIENT_MASTER_KEY_B: str="SSLv2 write client master key B"; break;
86case SSL2_ST_SEND_CLIENT_FINISHED_A: str="SSLv2 write client finished A"; break;
87case SSL2_ST_SEND_CLIENT_FINISHED_B: str="SSLv2 write client finished B"; break;
88case SSL2_ST_SEND_CLIENT_CERTIFICATE_A: str="SSLv2 write client certificate A"; break;
89case SSL2_ST_SEND_CLIENT_CERTIFICATE_B: str="SSLv2 write client certificate B"; break;
90case SSL2_ST_SEND_CLIENT_CERTIFICATE_C: str="SSLv2 write client certificate C"; break;
91case SSL2_ST_SEND_CLIENT_CERTIFICATE_D: str="SSLv2 write client certificate D"; break;
92case SSL2_ST_GET_SERVER_VERIFY_A: str="SSLv2 read server verify A"; break;
93case SSL2_ST_GET_SERVER_VERIFY_B: str="SSLv2 read server verify B"; break;
94case SSL2_ST_GET_SERVER_FINISHED_A: str="SSLv2 read server finished A"; break;
95case SSL2_ST_GET_SERVER_FINISHED_B: str="SSLv2 read server finished B"; break;
96case SSL2_ST_GET_CLIENT_HELLO_A: str="SSLv2 read client hello A"; break;
97case SSL2_ST_GET_CLIENT_HELLO_B: str="SSLv2 read client hello B"; break;
98case SSL2_ST_GET_CLIENT_HELLO_C: str="SSLv2 read client hello C"; break;
99case SSL2_ST_SEND_SERVER_HELLO_A: str="SSLv2 write server hello A"; break;
100case SSL2_ST_SEND_SERVER_HELLO_B: str="SSLv2 write server hello B"; break;
101case SSL2_ST_GET_CLIENT_MASTER_KEY_A: str="SSLv2 read client master key A"; break;
102case SSL2_ST_GET_CLIENT_MASTER_KEY_B: str="SSLv2 read client master key B"; break;
103case SSL2_ST_SEND_SERVER_VERIFY_A: str="SSLv2 write server verify A"; break;
104case SSL2_ST_SEND_SERVER_VERIFY_B: str="SSLv2 write server verify B"; break;
105case SSL2_ST_SEND_SERVER_VERIFY_C: str="SSLv2 write server verify C"; break;
106case SSL2_ST_GET_CLIENT_FINISHED_A: str="SSLv2 read client finished A"; break;
107case SSL2_ST_GET_CLIENT_FINISHED_B: str="SSLv2 read client finished B"; break;
108case SSL2_ST_SEND_SERVER_FINISHED_A: str="SSLv2 write server finished A"; break;
109case SSL2_ST_SEND_SERVER_FINISHED_B: str="SSLv2 write server finished B"; break;
110case SSL2_ST_SEND_REQUEST_CERTIFICATE_A: str="SSLv2 write request certificate A"; break;
111case SSL2_ST_SEND_REQUEST_CERTIFICATE_B: str="SSLv2 write request certificate B"; break;
112case SSL2_ST_SEND_REQUEST_CERTIFICATE_C: str="SSLv2 write request certificate C"; break;
113case SSL2_ST_SEND_REQUEST_CERTIFICATE_D: str="SSLv2 write request certificate D"; break;
114case SSL2_ST_X509_GET_SERVER_CERTIFICATE: str="SSLv2 X509 read server certificate"; break;
115case SSL2_ST_X509_GET_CLIENT_CERTIFICATE: str="SSLv2 X509 read client certificate"; break;
116#endif
117
118#ifndef OPENSSL_NO_SSL3
119/* SSLv3 additions */
120case SSL3_ST_CW_CLNT_HELLO_A: str="SSLv3 write client hello A"; break;
121case SSL3_ST_CW_CLNT_HELLO_B: str="SSLv3 write client hello B"; break;
122case SSL3_ST_CR_SRVR_HELLO_A: str="SSLv3 read server hello A"; break;
123case SSL3_ST_CR_SRVR_HELLO_B: str="SSLv3 read server hello B"; break;
124case SSL3_ST_CR_CERT_A: str="SSLv3 read server certificate A"; break;
125case SSL3_ST_CR_CERT_B: str="SSLv3 read server certificate B"; break;
126case SSL3_ST_CR_KEY_EXCH_A: str="SSLv3 read server key exchange A"; break;
127case SSL3_ST_CR_KEY_EXCH_B: str="SSLv3 read server key exchange B"; break;
128case SSL3_ST_CR_CERT_REQ_A: str="SSLv3 read server certificate request A"; break;
129case SSL3_ST_CR_CERT_REQ_B: str="SSLv3 read server certificate request B"; break;
130case SSL3_ST_CR_SRVR_DONE_A: str="SSLv3 read server done A"; break;
131case SSL3_ST_CR_SRVR_DONE_B: str="SSLv3 read server done B"; break;
132case SSL3_ST_CW_CERT_A: str="SSLv3 write client certificate A"; 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;
136case SSL3_ST_CW_KEY_EXCH_A: str="SSLv3 write client key exchange A"; break;
137case SSL3_ST_CW_KEY_EXCH_B: str="SSLv3 write client key exchange B"; break;
138case SSL3_ST_CW_CERT_VRFY_A: str="SSLv3 write certificate verify A"; break;
139case SSL3_ST_CW_CERT_VRFY_B: str="SSLv3 write certificate verify B"; break;
140
141case SSL3_ST_CW_CHANGE_A:
142case SSL3_ST_SW_CHANGE_A: str="SSLv3 write change cipher spec A"; break;
143case SSL3_ST_CW_CHANGE_B:
144case SSL3_ST_SW_CHANGE_B: str="SSLv3 write change cipher spec B"; break;
145case SSL3_ST_CW_FINISHED_A:
146case SSL3_ST_SW_FINISHED_A: str="SSLv3 write finished A"; break;
147case SSL3_ST_CW_FINISHED_B:
148case SSL3_ST_SW_FINISHED_B: str="SSLv3 write finished B"; break;
149case SSL3_ST_CR_CHANGE_A:
150case SSL3_ST_SR_CHANGE_A: str="SSLv3 read change cipher spec A"; break;
151case SSL3_ST_CR_CHANGE_B:
152case SSL3_ST_SR_CHANGE_B: str="SSLv3 read change cipher spec B"; break;
153case SSL3_ST_CR_FINISHED_A:
154case SSL3_ST_SR_FINISHED_A: str="SSLv3 read finished A"; break;
155case SSL3_ST_CR_FINISHED_B:
156case SSL3_ST_SR_FINISHED_B: str="SSLv3 read finished B"; break;
157
158case SSL3_ST_CW_FLUSH:
159case SSL3_ST_SW_FLUSH: str="SSLv3 flush data"; break;
160
161case SSL3_ST_SR_CLNT_HELLO_A: str="SSLv3 read client hello A"; break;
162case SSL3_ST_SR_CLNT_HELLO_B: str="SSLv3 read client hello B"; break;
163case SSL3_ST_SR_CLNT_HELLO_C: str="SSLv3 read client hello C"; break;
164case SSL3_ST_SW_HELLO_REQ_A: str="SSLv3 write hello request A"; break;
165case SSL3_ST_SW_HELLO_REQ_B: str="SSLv3 write hello request B"; break;
166case SSL3_ST_SW_HELLO_REQ_C: str="SSLv3 write hello request C"; break;
167case SSL3_ST_SW_SRVR_HELLO_A: str="SSLv3 write server hello A"; break;
168case SSL3_ST_SW_SRVR_HELLO_B: str="SSLv3 write server hello B"; break;
169case SSL3_ST_SW_CERT_A: str="SSLv3 write certificate A"; break;
170case SSL3_ST_SW_CERT_B: str="SSLv3 write certificate B"; break;
171case SSL3_ST_SW_KEY_EXCH_A: str="SSLv3 write key exchange A"; break;
172case SSL3_ST_SW_KEY_EXCH_B: str="SSLv3 write key exchange B"; break;
173case SSL3_ST_SW_CERT_REQ_A: str="SSLv3 write certificate request A"; break;
174case SSL3_ST_SW_CERT_REQ_B: str="SSLv3 write certificate request B"; break;
175case SSL3_ST_SW_SRVR_DONE_A: str="SSLv3 write server done A"; break;
176case SSL3_ST_SW_SRVR_DONE_B: str="SSLv3 write server done B"; break;
177case SSL3_ST_SR_CERT_A: str="SSLv3 read client certificate A"; break;
178case SSL3_ST_SR_CERT_B: str="SSLv3 read client certificate B"; break;
179case SSL3_ST_SR_KEY_EXCH_A: str="SSLv3 read client key exchange A"; break;
180case SSL3_ST_SR_KEY_EXCH_B: str="SSLv3 read client key exchange B"; break;
181case SSL3_ST_SR_CERT_VRFY_A: str="SSLv3 read certificate verify A"; break;
182case SSL3_ST_SR_CERT_VRFY_B: str="SSLv3 read certificate verify B"; break;
183#endif
184
185#if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3)
186/* SSLv2/v3 compatibility states */
187/* client */
188case SSL23_ST_CW_CLNT_HELLO_A: str="SSLv2/v3 write client hello A"; break;
189case SSL23_ST_CW_CLNT_HELLO_B: str="SSLv2/v3 write client hello B"; break;
190case SSL23_ST_CR_SRVR_HELLO_A: str="SSLv2/v3 read server hello A"; break;
191case SSL23_ST_CR_SRVR_HELLO_B: str="SSLv2/v3 read server hello B"; break;
192/* server */
193case SSL23_ST_SR_CLNT_HELLO_A: str="SSLv2/v3 read client hello A"; break;
194case SSL23_ST_SR_CLNT_HELLO_B: str="SSLv2/v3 read client hello B"; break;
195#endif
196
197default: str="unknown state"; break;
198 }
199 return(str);
200 }
201
202const char *SSL_rstate_string_long(const SSL *s)
203 {
204 const char *str;
205
206 switch (s->rstate)
207 {
208 case SSL_ST_READ_HEADER: str="read header"; break;
209 case SSL_ST_READ_BODY: str="read body"; break;
210 case SSL_ST_READ_DONE: str="read done"; break;
211 default: str="unknown"; break;
212 }
213 return(str);
214 }
215
216const char *SSL_state_string(const SSL *s)
217 {
218 const char *str;
219
220 switch (s->state)
221 {
222case SSL_ST_BEFORE: str="PINIT "; break;
223case SSL_ST_ACCEPT: str="AINIT "; break;
224case SSL_ST_CONNECT: str="CINIT "; break;
225case SSL_ST_OK: str="SSLOK "; break;
226#ifndef OPENSSL_NO_SSL2
227case SSL2_ST_CLIENT_START_ENCRYPTION: str="2CSENC"; break;
228case SSL2_ST_SERVER_START_ENCRYPTION: str="2SSENC"; break;
229case SSL2_ST_SEND_CLIENT_HELLO_A: str="2SCH_A"; break;
230case SSL2_ST_SEND_CLIENT_HELLO_B: str="2SCH_B"; break;
231case SSL2_ST_GET_SERVER_HELLO_A: str="2GSH_A"; break;
232case SSL2_ST_GET_SERVER_HELLO_B: str="2GSH_B"; break;
233case SSL2_ST_SEND_CLIENT_MASTER_KEY_A: str="2SCMKA"; break;
234case SSL2_ST_SEND_CLIENT_MASTER_KEY_B: str="2SCMKB"; break;
235case SSL2_ST_SEND_CLIENT_FINISHED_A: str="2SCF_A"; break;
236case SSL2_ST_SEND_CLIENT_FINISHED_B: str="2SCF_B"; break;
237case SSL2_ST_SEND_CLIENT_CERTIFICATE_A: str="2SCC_A"; break;
238case SSL2_ST_SEND_CLIENT_CERTIFICATE_B: str="2SCC_B"; break;
239case SSL2_ST_SEND_CLIENT_CERTIFICATE_C: str="2SCC_C"; break;
240case SSL2_ST_SEND_CLIENT_CERTIFICATE_D: str="2SCC_D"; break;
241case SSL2_ST_GET_SERVER_VERIFY_A: str="2GSV_A"; break;
242case SSL2_ST_GET_SERVER_VERIFY_B: str="2GSV_B"; break;
243case SSL2_ST_GET_SERVER_FINISHED_A: str="2GSF_A"; break;
244case SSL2_ST_GET_SERVER_FINISHED_B: str="2GSF_B"; break;
245case SSL2_ST_GET_CLIENT_HELLO_A: str="2GCH_A"; break;
246case SSL2_ST_GET_CLIENT_HELLO_B: str="2GCH_B"; break;
247case SSL2_ST_GET_CLIENT_HELLO_C: str="2GCH_C"; break;
248case SSL2_ST_SEND_SERVER_HELLO_A: str="2SSH_A"; break;
249case SSL2_ST_SEND_SERVER_HELLO_B: str="2SSH_B"; break;
250case SSL2_ST_GET_CLIENT_MASTER_KEY_A: str="2GCMKA"; break;
251case SSL2_ST_GET_CLIENT_MASTER_KEY_B: str="2GCMKA"; break;
252case SSL2_ST_SEND_SERVER_VERIFY_A: str="2SSV_A"; break;
253case SSL2_ST_SEND_SERVER_VERIFY_B: str="2SSV_B"; break;
254case SSL2_ST_SEND_SERVER_VERIFY_C: str="2SSV_C"; break;
255case SSL2_ST_GET_CLIENT_FINISHED_A: str="2GCF_A"; break;
256case SSL2_ST_GET_CLIENT_FINISHED_B: str="2GCF_B"; break;
257case SSL2_ST_SEND_SERVER_FINISHED_A: str="2SSF_A"; break;
258case SSL2_ST_SEND_SERVER_FINISHED_B: str="2SSF_B"; break;
259case SSL2_ST_SEND_REQUEST_CERTIFICATE_A: str="2SRC_A"; break;
260case SSL2_ST_SEND_REQUEST_CERTIFICATE_B: str="2SRC_B"; break;
261case SSL2_ST_SEND_REQUEST_CERTIFICATE_C: str="2SRC_C"; break;
262case SSL2_ST_SEND_REQUEST_CERTIFICATE_D: str="2SRC_D"; break;
263case SSL2_ST_X509_GET_SERVER_CERTIFICATE: str="2X9GSC"; break;
264case SSL2_ST_X509_GET_CLIENT_CERTIFICATE: str="2X9GCC"; break;
265#endif
266
267#ifndef OPENSSL_NO_SSL3
268/* SSLv3 additions */
269case SSL3_ST_SW_FLUSH:
270case SSL3_ST_CW_FLUSH: str="3FLUSH"; break;
271case SSL3_ST_CW_CLNT_HELLO_A: str="3WCH_A"; break;
272case SSL3_ST_CW_CLNT_HELLO_B: str="3WCH_B"; break;
273case SSL3_ST_CR_SRVR_HELLO_A: str="3RSH_A"; break;
274case SSL3_ST_CR_SRVR_HELLO_B: str="3RSH_B"; break;
275case SSL3_ST_CR_CERT_A: str="3RSC_A"; break;
276case SSL3_ST_CR_CERT_B: str="3RSC_B"; break;
277case SSL3_ST_CR_KEY_EXCH_A: str="3RSKEA"; break;
278case SSL3_ST_CR_KEY_EXCH_B: str="3RSKEB"; break;
279case SSL3_ST_CR_CERT_REQ_A: str="3RCR_A"; break;
280case SSL3_ST_CR_CERT_REQ_B: str="3RCR_B"; break;
281case SSL3_ST_CR_SRVR_DONE_A: str="3RSD_A"; break;
282case SSL3_ST_CR_SRVR_DONE_B: str="3RSD_B"; break;
283case SSL3_ST_CW_CERT_A: str="3WCC_A"; 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;
287case SSL3_ST_CW_KEY_EXCH_A: str="3WCKEA"; break;
288case SSL3_ST_CW_KEY_EXCH_B: str="3WCKEB"; break;
289case SSL3_ST_CW_CERT_VRFY_A: str="3WCV_A"; break;
290case SSL3_ST_CW_CERT_VRFY_B: str="3WCV_B"; break;
291
292case SSL3_ST_SW_CHANGE_A:
293case SSL3_ST_CW_CHANGE_A: str="3WCCSA"; break;
294case SSL3_ST_SW_CHANGE_B:
295case SSL3_ST_CW_CHANGE_B: str="3WCCSB"; break;
296case SSL3_ST_SW_FINISHED_A:
297case SSL3_ST_CW_FINISHED_A: str="3WFINA"; break;
298case SSL3_ST_SW_FINISHED_B:
299case SSL3_ST_CW_FINISHED_B: str="3WFINB"; break;
300case SSL3_ST_SR_CHANGE_A:
301case SSL3_ST_CR_CHANGE_A: str="3RCCSA"; break;
302case SSL3_ST_SR_CHANGE_B:
303case SSL3_ST_CR_CHANGE_B: str="3RCCSB"; break;
304case SSL3_ST_SR_FINISHED_A:
305case SSL3_ST_CR_FINISHED_A: str="3RFINA"; break;
306case SSL3_ST_SR_FINISHED_B:
307case SSL3_ST_CR_FINISHED_B: str="3RFINB"; break;
308
309case SSL3_ST_SW_HELLO_REQ_A: str="3WHR_A"; break;
310case SSL3_ST_SW_HELLO_REQ_B: str="3WHR_B"; break;
311case SSL3_ST_SW_HELLO_REQ_C: str="3WHR_C"; break;
312case SSL3_ST_SR_CLNT_HELLO_A: str="3RCH_A"; break;
313case SSL3_ST_SR_CLNT_HELLO_B: str="3RCH_B"; break;
314case SSL3_ST_SR_CLNT_HELLO_C: str="3RCH_C"; break;
315case SSL3_ST_SW_SRVR_HELLO_A: str="3WSH_A"; break;
316case SSL3_ST_SW_SRVR_HELLO_B: str="3WSH_B"; break;
317case SSL3_ST_SW_CERT_A: str="3WSC_A"; break;
318case SSL3_ST_SW_CERT_B: str="3WSC_B"; break;
319case SSL3_ST_SW_KEY_EXCH_A: str="3WSKEA"; break;
320case SSL3_ST_SW_KEY_EXCH_B: str="3WSKEB"; break;
321case SSL3_ST_SW_CERT_REQ_A: str="3WCR_A"; break;
322case SSL3_ST_SW_CERT_REQ_B: str="3WCR_B"; break;
323case SSL3_ST_SW_SRVR_DONE_A: str="3WSD_A"; break;
324case SSL3_ST_SW_SRVR_DONE_B: str="3WSD_B"; break;
325case SSL3_ST_SR_CERT_A: str="3RCC_A"; break;
326case SSL3_ST_SR_CERT_B: str="3RCC_B"; break;
327case SSL3_ST_SR_KEY_EXCH_A: str="3RCKEA"; break;
328case SSL3_ST_SR_KEY_EXCH_B: str="3RCKEB"; break;
329case SSL3_ST_SR_CERT_VRFY_A: str="3RCV_A"; break;
330case SSL3_ST_SR_CERT_VRFY_B: str="3RCV_B"; break;
331#endif
332
333#if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3)
334/* SSLv2/v3 compatibility states */
335/* client */
336case SSL23_ST_CW_CLNT_HELLO_A: str="23WCHA"; break;
337case SSL23_ST_CW_CLNT_HELLO_B: str="23WCHB"; break;
338case SSL23_ST_CR_SRVR_HELLO_A: str="23RSHA"; break;
339case SSL23_ST_CR_SRVR_HELLO_B: str="23RSHA"; break;
340/* server */
341case SSL23_ST_SR_CLNT_HELLO_A: str="23RCHA"; break;
342case SSL23_ST_SR_CLNT_HELLO_B: str="23RCHB"; break;
343#endif
344
345default: str="UNKWN "; break;
346 }
347 return(str);
348 }
349
350const char *SSL_alert_type_string_long(int value)
351 {
352 value>>=8;
353 if (value == SSL3_AL_WARNING)
354 return("warning");
355 else if (value == SSL3_AL_FATAL)
356 return("fatal");
357 else
358 return("unknown");
359 }
360
361const char *SSL_alert_type_string(int value)
362 {
363 value>>=8;
364 if (value == SSL3_AL_WARNING)
365 return("W");
366 else if (value == SSL3_AL_FATAL)
367 return("F");
368 else
369 return("U");
370 }
371
372const char *SSL_alert_desc_string(int value)
373 {
374 const char *str;
375
376 switch (value & 0xff)
377 {
378 case SSL3_AD_CLOSE_NOTIFY: str="CN"; break;
379 case SSL3_AD_UNEXPECTED_MESSAGE: str="UM"; break;
380 case SSL3_AD_BAD_RECORD_MAC: str="BM"; break;
381 case SSL3_AD_DECOMPRESSION_FAILURE: str="DF"; break;
382 case SSL3_AD_HANDSHAKE_FAILURE: str="HF"; break;
383 case SSL3_AD_NO_CERTIFICATE: str="NC"; break;
384 case SSL3_AD_BAD_CERTIFICATE: str="BC"; break;
385 case SSL3_AD_UNSUPPORTED_CERTIFICATE: str="UC"; break;
386 case SSL3_AD_CERTIFICATE_REVOKED: str="CR"; break;
387 case SSL3_AD_CERTIFICATE_EXPIRED: str="CE"; break;
388 case SSL3_AD_CERTIFICATE_UNKNOWN: str="CU"; 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;
402 default: str="UK"; break;
403 }
404 return(str);
405 }
406
407const char *SSL_alert_desc_string_long(int value)
408 {
409 const char *str;
410
411 switch (value & 0xff)
412 {
413 case SSL3_AD_CLOSE_NOTIFY:
414 str="close notify";
415 break;
416 case SSL3_AD_UNEXPECTED_MESSAGE:
417 str="unexpected_message";
418 break;
419 case SSL3_AD_BAD_RECORD_MAC:
420 str="bad record mac";
421 break;
422 case SSL3_AD_DECOMPRESSION_FAILURE:
423 str="decompression failure";
424 break;
425 case SSL3_AD_HANDSHAKE_FAILURE:
426 str="handshake failure";
427 break;
428 case SSL3_AD_NO_CERTIFICATE:
429 str="no certificate";
430 break;
431 case SSL3_AD_BAD_CERTIFICATE:
432 str="bad certificate";
433 break;
434 case SSL3_AD_UNSUPPORTED_CERTIFICATE:
435 str="unsupported certificate";
436 break;
437 case SSL3_AD_CERTIFICATE_REVOKED:
438 str="certificate revoked";
439 break;
440 case SSL3_AD_CERTIFICATE_EXPIRED:
441 str="certificate expired";
442 break;
443 case SSL3_AD_CERTIFICATE_UNKNOWN:
444 str="certificate unknown";
445 break;
446 case SSL3_AD_ILLEGAL_PARAMETER:
447 str="illegal parameter";
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;
485 default: str="unknown"; break;
486 }
487 return(str);
488 }
489
490const char *SSL_rstate_string(const SSL *s)
491 {
492 const char *str;
493
494 switch (s->rstate)
495 {
496 case SSL_ST_READ_HEADER:str="RH"; break;
497 case SSL_ST_READ_BODY: str="RB"; break;
498 case SSL_ST_READ_DONE: str="RD"; break;
499 default: str="unknown"; break;
500 }
501 return(str);
502 }
diff --git a/src/lib/libssl/ssl_txt.c b/src/lib/libssl/ssl_txt.c
deleted file mode 100644
index 40b76b1b26..0000000000
--- a/src/lib/libssl/ssl_txt.c
+++ /dev/null
@@ -1,186 +0,0 @@
1/* ssl/ssl_txt.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include <openssl/buffer.h>
61#include "ssl_locl.h"
62
63#ifndef OPENSSL_NO_FP_API
64int SSL_SESSION_print_fp(FILE *fp, SSL_SESSION *x)
65 {
66 BIO *b;
67 int ret;
68
69 if ((b=BIO_new(BIO_s_file_internal())) == NULL)
70 {
71 SSLerr(SSL_F_SSL_SESSION_PRINT_FP,ERR_R_BUF_LIB);
72 return(0);
73 }
74 BIO_set_fp(b,fp,BIO_NOCLOSE);
75 ret=SSL_SESSION_print(b,x);
76 BIO_free(b);
77 return(ret);
78 }
79#endif
80
81int SSL_SESSION_print(BIO *bp, SSL_SESSION *x)
82 {
83 unsigned int i;
84 char *s;
85
86 if (x == NULL) goto err;
87 if (BIO_puts(bp,"SSL-Session:\n") <= 0) goto err;
88 if (x->ssl_version == SSL2_VERSION)
89 s="SSLv2";
90 else if (x->ssl_version == SSL3_VERSION)
91 s="SSLv3";
92 else if (x->ssl_version == TLS1_VERSION)
93 s="TLSv1";
94 else
95 s="unknown";
96 if (BIO_printf(bp," Protocol : %s\n",s) <= 0) goto err;
97
98 if (x->cipher == NULL)
99 {
100 if (((x->cipher_id) & 0xff000000) == 0x02000000)
101 {
102 if (BIO_printf(bp," Cipher : %06lX\n",x->cipher_id&0xffffff) <= 0)
103 goto err;
104 }
105 else
106 {
107 if (BIO_printf(bp," Cipher : %04lX\n",x->cipher_id&0xffff) <= 0)
108 goto err;
109 }
110 }
111 else
112 {
113 if (BIO_printf(bp," Cipher : %s\n",((x->cipher == NULL)?"unknown":x->cipher->name)) <= 0)
114 goto err;
115 }
116 if (BIO_puts(bp," Session-ID: ") <= 0) goto err;
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++)
123 {
124 if (BIO_printf(bp,"%02X",x->sid_ctx[i]) <= 0)
125 goto err;
126 }
127 if (BIO_puts(bp,"\n Master-Key: ") <= 0) goto err;
128 for (i=0; i<(unsigned int)x->master_key_length; i++)
129 {
130 if (BIO_printf(bp,"%02X",x->master_key[i]) <= 0) goto err;
131 }
132 if (BIO_puts(bp,"\n Key-Arg : ") <= 0) goto err;
133 if (x->key_arg_length == 0)
134 {
135 if (BIO_puts(bp,"None") <= 0) goto err;
136 }
137 else
138 for (i=0; i<x->key_arg_length; i++)
139 {
140 if (BIO_printf(bp,"%02X",x->key_arg[i]) <= 0) goto err;
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 }
168 if (x->time != 0L)
169 {
170 if (BIO_printf(bp, "\n Start Time: %ld",x->time) <= 0) goto err;
171 }
172 if (x->timeout != 0L)
173 {
174 if (BIO_printf(bp, "\n Timeout : %ld (sec)",x->timeout) <= 0) goto err;
175 }
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;
181
182 return(1);
183err:
184 return(0);
185 }
186
diff --git a/src/lib/libssl/t1_clnt.c b/src/lib/libssl/t1_clnt.c
deleted file mode 100644
index 9ad518f9f4..0000000000
--- a/src/lib/libssl/t1_clnt.c
+++ /dev/null
@@ -1,90 +0,0 @@
1/* ssl/t1_clnt.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include "ssl_locl.h"
61#include <openssl/buffer.h>
62#include <openssl/rand.h>
63#include <openssl/objects.h>
64#include <openssl/evp.h>
65
66static SSL_METHOD *tls1_get_client_method(int ver);
67static SSL_METHOD *tls1_get_client_method(int ver)
68 {
69 if (ver == TLS1_VERSION)
70 return(TLSv1_client_method());
71 else
72 return(NULL);
73 }
74
75SSL_METHOD *TLSv1_client_method(void)
76 {
77 static int init=1;
78 static SSL_METHOD TLSv1_client_data;
79
80 if (init)
81 {
82 memcpy((char *)&TLSv1_client_data,(char *)tlsv1_base_method(),
83 sizeof(SSL_METHOD));
84 TLSv1_client_data.ssl_connect=ssl3_connect;
85 TLSv1_client_data.get_ssl_method=tls1_get_client_method;
86 init=0;
87 }
88 return(&TLSv1_client_data);
89 }
90
diff --git a/src/lib/libssl/t1_enc.c b/src/lib/libssl/t1_enc.c
deleted file mode 100644
index 5290bf6665..0000000000
--- a/src/lib/libssl/t1_enc.c
+++ /dev/null
@@ -1,814 +0,0 @@
1/* ssl/t1_enc.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58/* ====================================================================
59 * Copyright (c) 1998-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 */
111
112#include <stdio.h>
113#include "ssl_locl.h"
114#include <openssl/comp.h>
115#include <openssl/evp.h>
116#include <openssl/hmac.h>
117#include <openssl/md5.h>
118
119static void tls1_P_hash(const EVP_MD *md, const unsigned char *sec,
120 int sec_len, unsigned char *seed, int seed_len,
121 unsigned char *out, int olen)
122 {
123 int chunk,n;
124 unsigned int j;
125 HMAC_CTX ctx;
126 HMAC_CTX ctx_tmp;
127 unsigned char A1[HMAC_MAX_MD_CBLOCK];
128 unsigned int A1_len;
129
130 chunk=EVP_MD_size(md);
131
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);
136 HMAC_Update(&ctx,seed,seed_len);
137 HMAC_Final(&ctx,A1,&A1_len);
138
139 n=0;
140 for (;;)
141 {
142 HMAC_Init_ex(&ctx,NULL,0,NULL,NULL); /* re-init */
143 HMAC_Init_ex(&ctx_tmp,NULL,0,NULL,NULL); /* re-init */
144 HMAC_Update(&ctx,A1,A1_len);
145 HMAC_Update(&ctx_tmp,A1,A1_len);
146 HMAC_Update(&ctx,seed,seed_len);
147
148 if (olen > chunk)
149 {
150 HMAC_Final(&ctx,out,&j);
151 out+=j;
152 olen-=j;
153 HMAC_Final(&ctx_tmp,A1,&A1_len); /* calc the next A1 value */
154 }
155 else /* last one */
156 {
157 HMAC_Final(&ctx,A1,&A1_len);
158 memcpy(out,A1,olen);
159 break;
160 }
161 }
162 HMAC_CTX_cleanup(&ctx);
163 HMAC_CTX_cleanup(&ctx_tmp);
164 memset(A1,0,sizeof(A1));
165 }
166
167static void tls1_PRF(const EVP_MD *md5, const EVP_MD *sha1,
168 unsigned char *label, int label_len,
169 const unsigned char *sec, int slen, unsigned char *out1,
170 unsigned char *out2, int olen)
171 {
172 int len,i;
173 const unsigned char *S1,*S2;
174
175 len=slen/2;
176 S1=sec;
177 S2= &(sec[len]);
178 len+=(slen&1); /* add for odd, make longer */
179
180
181 tls1_P_hash(md5 ,S1,len,label,label_len,out1,olen);
182 tls1_P_hash(sha1,S2,len,label,label_len,out2,olen);
183
184 for (i=0; i<olen; i++)
185 out1[i]^=out2[i];
186 }
187
188static void tls1_generate_key_block(SSL *s, unsigned char *km,
189 unsigned char *tmp, int num)
190 {
191 unsigned char *p;
192 unsigned char buf[SSL3_RANDOM_SIZE*2+
193 TLS_MD_MAX_CONST_SIZE];
194 p=buf;
195
196 memcpy(p,TLS_MD_KEY_EXPANSION_CONST,
197 TLS_MD_KEY_EXPANSION_CONST_SIZE);
198 p+=TLS_MD_KEY_EXPANSION_CONST_SIZE;
199 memcpy(p,s->s3->server_random,SSL3_RANDOM_SIZE);
200 p+=SSL3_RANDOM_SIZE;
201 memcpy(p,s->s3->client_random,SSL3_RANDOM_SIZE);
202 p+=SSL3_RANDOM_SIZE;
203
204 tls1_PRF(s->ctx->md5,s->ctx->sha1,buf,(int)(p-buf),
205 s->session->master_key,s->session->master_key_length,
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 */
218 }
219
220int tls1_change_cipher_state(SSL *s, int which)
221 {
222 static const unsigned char empty[]="";
223 unsigned char *p,*key_block,*mac_secret;
224 unsigned char *exp_label,buf[TLS_MD_MAX_CONST_SIZE+
225 SSL3_RANDOM_SIZE*2];
226 unsigned char tmp1[EVP_MAX_KEY_LENGTH];
227 unsigned char tmp2[EVP_MAX_KEY_LENGTH];
228 unsigned char iv1[EVP_MAX_IV_LENGTH*2];
229 unsigned char iv2[EVP_MAX_IV_LENGTH*2];
230 unsigned char *ms,*key,*iv,*er1,*er2;
231 int client_write;
232 EVP_CIPHER_CTX *dd;
233 const EVP_CIPHER *c;
234 const SSL_COMP *comp;
235 const EVP_MD *m;
236 int is_export,n,i,j,k,exp_label_len,cl;
237 int reuse_dd = 0;
238
239 is_export=SSL_C_IS_EXPORT(s->s3->tmp.new_cipher);
240 c=s->s3->tmp.new_sym_enc;
241 m=s->s3->tmp.new_hash;
242 comp=s->s3->tmp.new_compression;
243 key_block=s->s3->tmp.key_block;
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
260 if (which & SSL3_CC_READ)
261 {
262 if (s->enc_read_ctx != NULL)
263 reuse_dd = 1;
264 else if ((s->enc_read_ctx=OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL)
265 goto err;
266 dd= s->enc_read_ctx;
267 s->read_hash=m;
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 }
287 memset(&(s->s3->read_sequence[0]),0,8);
288 mac_secret= &(s->s3->read_mac_secret[0]);
289 }
290 else
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;
296 if ((s->enc_write_ctx == NULL) &&
297 ((s->enc_write_ctx=(EVP_CIPHER_CTX *)
298 OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL))
299 goto err;
300 dd= s->enc_write_ctx;
301 s->write_hash=m;
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 }
316 memset(&(s->s3->write_sequence[0]),0,8);
317 mac_secret= &(s->s3->write_mac_secret[0]);
318 }
319
320 if (reuse_dd)
321 EVP_CIPHER_CTX_cleanup(dd);
322 EVP_CIPHER_CTX_init(dd);
323
324 p=s->s3->tmp.key_block;
325 i=EVP_MD_size(m);
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); */
330 k=EVP_CIPHER_iv_length(c);
331 er1= &(s->s3->client_random[0]);
332 er2= &(s->s3->server_random[0]);
333 if ( (which == SSL3_CHANGE_CIPHER_CLIENT_WRITE) ||
334 (which == SSL3_CHANGE_CIPHER_SERVER_READ))
335 {
336 ms= &(p[ 0]); n=i+i;
337 key= &(p[ n]); n+=j+j;
338 iv= &(p[ n]); n+=k+k;
339 exp_label=(unsigned char *)TLS_MD_CLIENT_WRITE_KEY_CONST;
340 exp_label_len=TLS_MD_CLIENT_WRITE_KEY_CONST_SIZE;
341 client_write=1;
342 }
343 else
344 {
345 n=i;
346 ms= &(p[ n]); n+=i+j;
347 key= &(p[ n]); n+=j+k;
348 iv= &(p[ n]); n+=k;
349 exp_label=(unsigned char *)TLS_MD_SERVER_WRITE_KEY_CONST;
350 exp_label_len=TLS_MD_SERVER_WRITE_KEY_CONST_SIZE;
351 client_write=0;
352 }
353
354 if (n > s->s3->tmp.key_block_length)
355 {
356 SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,ERR_R_INTERNAL_ERROR);
357 goto err2;
358 }
359
360 memcpy(mac_secret,ms,i);
361#ifdef TLS_DEBUG
362printf("which = %04X\nmac key=",which);
363{ int z; for (z=0; z<i; z++) printf("%02X%c",ms[z],((z+1)%16)?' ':'\n'); }
364#endif
365 if (is_export)
366 {
367 /* In here I set both the read and write key/iv to the
368 * same value since only the correct one will be used :-).
369 */
370 p=buf;
371 memcpy(p,exp_label,exp_label_len);
372 p+=exp_label_len;
373 memcpy(p,s->s3->client_random,SSL3_RANDOM_SIZE);
374 p+=SSL3_RANDOM_SIZE;
375 memcpy(p,s->s3->server_random,SSL3_RANDOM_SIZE);
376 p+=SSL3_RANDOM_SIZE;
377 tls1_PRF(s->ctx->md5,s->ctx->sha1,buf,(int)(p-buf),key,j,
378 tmp1,tmp2,EVP_CIPHER_key_length(c));
379 key=tmp1;
380
381 if (k > 0)
382 {
383 p=buf;
384 memcpy(p,TLS_MD_IV_BLOCK_CONST,
385 TLS_MD_IV_BLOCK_CONST_SIZE);
386 p+=TLS_MD_IV_BLOCK_CONST_SIZE;
387 memcpy(p,s->s3->client_random,SSL3_RANDOM_SIZE);
388 p+=SSL3_RANDOM_SIZE;
389 memcpy(p,s->s3->server_random,SSL3_RANDOM_SIZE);
390 p+=SSL3_RANDOM_SIZE;
391 tls1_PRF(s->ctx->md5,s->ctx->sha1,buf,p-buf,empty,0,
392 iv1,iv2,k*2);
393 if (client_write)
394 iv=iv1;
395 else
396 iv= &(iv1[k]);
397 }
398 }
399
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 */
411
412 EVP_CipherInit_ex(dd,c,NULL,key,iv,(which & SSL3_CC_WRITE));
413#ifdef TLS_DEBUG
414printf("which = %04X\nkey=",which);
415{ int z; for (z=0; z<EVP_CIPHER_key_length(c); z++) printf("%02X%c",key[z],((z+1)%16)?' ':'\n'); }
416printf("\niv=");
417{ int z; for (z=0; z<k; z++) printf("%02X%c",iv[z],((z+1)%16)?' ':'\n'); }
418printf("\n");
419#endif
420
421 memset(tmp1,0,sizeof(tmp1));
422 memset(tmp2,0,sizeof(tmp1));
423 memset(iv1,0,sizeof(iv1));
424 memset(iv2,0,sizeof(iv2));
425 return(1);
426err:
427 SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,ERR_R_MALLOC_FAILURE);
428err2:
429 return(0);
430 }
431
432int tls1_setup_key_block(SSL *s)
433 {
434 unsigned char *p1,*p2;
435 const EVP_CIPHER *c;
436 const EVP_MD *hash;
437 int num;
438 SSL_COMP *comp;
439
440#ifdef KSSL_DEBUG
441 printf ("tls1_setup_key_block()\n");
442#endif /* KSSL_DEBUG */
443
444 if (s->s3->tmp.key_block_length != 0)
445 return(1);
446
447 if (!ssl_cipher_get_evp(s->session,&c,&hash,&comp))
448 {
449 SSLerr(SSL_F_TLS1_SETUP_KEY_BLOCK,SSL_R_CIPHER_OR_HASH_UNAVAILABLE);
450 return(0);
451 }
452
453 s->s3->tmp.new_sym_enc=c;
454 s->s3->tmp.new_hash=hash;
455
456 num=EVP_CIPHER_key_length(c)+EVP_MD_size(hash)+EVP_CIPHER_iv_length(c);
457 num*=2;
458
459 ssl3_cleanup_key_block(s);
460
461 if ((p1=(unsigned char *)OPENSSL_malloc(num)) == NULL)
462 goto err;
463 if ((p2=(unsigned char *)OPENSSL_malloc(num)) == NULL)
464 goto err;
465
466 s->s3->tmp.key_block_length=num;
467 s->s3->tmp.key_block=p1;
468
469
470#ifdef TLS_DEBUG
471printf("client random\n");
472{ int z; for (z=0; z<SSL3_RANDOM_SIZE; z++) printf("%02X%c",s->s3->client_random[z],((z+1)%16)?' ':'\n'); }
473printf("server random\n");
474{ int z; for (z=0; z<SSL3_RANDOM_SIZE; z++) printf("%02X%c",s->s3->server_random[z],((z+1)%16)?' ':'\n'); }
475printf("pre-master\n");
476{ int z; for (z=0; z<s->session->master_key_length; z++) printf("%02X%c",s->session->master_key[z],((z+1)%16)?' ':'\n'); }
477#endif
478 tls1_generate_key_block(s,p1,p2,num);
479 memset(p2,0,num);
480 OPENSSL_free(p2);
481#ifdef TLS_DEBUG
482printf("\nkey block\n");
483{ int z; for (z=0; z<num; z++) printf("%02X%c",p1[z],((z+1)%16)?' ':'\n'); }
484#endif
485
486 if (!(s->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS))
487 {
488 /* enable vulnerability countermeasure for CBC ciphers with
489 * known-IV problem (http://www.openssl.org/~bodo/tls-cbc.txt)
490 */
491 s->s3->need_empty_fragments = 1;
492
493 if (s->session->cipher != NULL)
494 {
495 if ((s->session->cipher->algorithms & SSL_ENC_MASK) == SSL_eNULL)
496 s->s3->need_empty_fragments = 0;
497
498#ifndef OPENSSL_NO_RC4
499 if ((s->session->cipher->algorithms & SSL_ENC_MASK) == SSL_RC4)
500 s->s3->need_empty_fragments = 0;
501#endif
502 }
503 }
504
505 return(1);
506err:
507 SSLerr(SSL_F_TLS1_SETUP_KEY_BLOCK,ERR_R_MALLOC_FAILURE);
508 return(0);
509 }
510
511int tls1_enc(SSL *s, int send)
512 {
513 SSL3_RECORD *rec;
514 EVP_CIPHER_CTX *ds;
515 unsigned long l;
516 int bs,i,ii,j,k,n=0;
517 const EVP_CIPHER *enc;
518
519 if (send)
520 {
521 if (s->write_hash != NULL)
522 n=EVP_MD_size(s->write_hash);
523 ds=s->enc_write_ctx;
524 rec= &(s->s3->wrec);
525 if (s->enc_write_ctx == NULL)
526 enc=NULL;
527 else
528 enc=EVP_CIPHER_CTX_cipher(s->enc_write_ctx);
529 }
530 else
531 {
532 if (s->read_hash != NULL)
533 n=EVP_MD_size(s->read_hash);
534 ds=s->enc_read_ctx;
535 rec= &(s->s3->rrec);
536 if (s->enc_read_ctx == NULL)
537 enc=NULL;
538 else
539 enc=EVP_CIPHER_CTX_cipher(s->enc_read_ctx);
540 }
541
542#ifdef KSSL_DEBUG
543 printf("tls1_enc(%d)\n", send);
544#endif /* KSSL_DEBUG */
545
546 if ((s->session == NULL) || (ds == NULL) ||
547 (enc == NULL))
548 {
549 memmove(rec->data,rec->input,rec->length);
550 rec->input=rec->data;
551 }
552 else
553 {
554 l=rec->length;
555 bs=EVP_CIPHER_block_size(ds->cipher);
556
557 if ((bs != 1) && send)
558 {
559 i=bs-((int)l%bs);
560
561 /* Add weird padding of upto 256 bytes */
562
563 /* we need to add 'i' padding bytes of value j */
564 j=i-1;
565 if (s->options & SSL_OP_TLS_BLOCK_PADDING_BUG)
566 {
567 if (s->s3->flags & TLS1_FLAGS_TLS_PADDING_BUG)
568 j++;
569 }
570 for (k=(int)l; k<(int)(l+i); k++)
571 rec->input[k]=j;
572 l+=i;
573 rec->length+=i;
574 }
575
576#ifdef KSSL_DEBUG
577 {
578 unsigned long ui;
579 printf("EVP_Cipher(ds=%p,rec->data=%p,rec->input=%p,l=%ld) ==>\n",
580 ds,rec->data,rec->input,l);
581 printf("\tEVP_CIPHER_CTX: %d buf_len, %d key_len [%d %d], %d iv_len\n",
582 ds->buf_len, ds->cipher->key_len,
583 DES_KEY_SZ, DES_SCHEDULE_SZ,
584 ds->cipher->iv_len);
585 printf("\t\tIV: ");
586 for (i=0; i<ds->cipher->iv_len; i++) printf("%02X", ds->iv[i]);
587 printf("\n");
588 printf("\trec->input=");
589 for (ui=0; ui<l; ui++) printf(" %02x", rec->input[ui]);
590 printf("\n");
591 }
592#endif /* KSSL_DEBUG */
593
594 if (!send)
595 {
596 if (l == 0 || l%bs != 0)
597 {
598 SSLerr(SSL_F_TLS1_ENC,SSL_R_BLOCK_CIPHER_PAD_IS_WRONG);
599 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECRYPTION_FAILED);
600 return 0;
601 }
602 }
603
604 EVP_Cipher(ds,rec->data,rec->input,l);
605
606#ifdef KSSL_DEBUG
607 {
608 unsigned long i;
609 printf("\trec->data=");
610 for (i=0; i<l; i++)
611 printf(" %02x", rec->data[i]); printf("\n");
612 }
613#endif /* KSSL_DEBUG */
614
615 if ((bs != 1) && !send)
616 {
617 ii=i=rec->data[l-1]; /* padding_length */
618 i++;
619 if (s->options&SSL_OP_TLS_BLOCK_PADDING_BUG)
620 {
621 /* First packet is even in size, so check */
622 if ((memcmp(s->s3->read_sequence,
623 "\0\0\0\0\0\0\0\0",8) == 0) && !(ii & 1))
624 s->s3->flags|=TLS1_FLAGS_TLS_PADDING_BUG;
625 if (s->s3->flags & TLS1_FLAGS_TLS_PADDING_BUG)
626 i--;
627 }
628 /* TLS 1.0 does not bound the number of padding bytes by the block size.
629 * All of them must have value 'padding_length'. */
630 if (i > (int)rec->length)
631 {
632 /* Incorrect padding. SSLerr() and ssl3_alert are done
633 * by caller: we don't want to reveal whether this is
634 * a decryption error or a MAC verification failure
635 * (see http://www.openssl.org/~bodo/tls-cbc.txt) */
636 return -1;
637 }
638 for (j=(int)(l-i); j<(int)l; j++)
639 {
640 if (rec->data[j] != ii)
641 {
642 /* Incorrect padding */
643 return -1;
644 }
645 }
646 rec->length-=i;
647 }
648 }
649 return(1);
650 }
651
652int tls1_cert_verify_mac(SSL *s, EVP_MD_CTX *in_ctx, unsigned char *out)
653 {
654 unsigned int ret;
655 EVP_MD_CTX ctx;
656
657 EVP_MD_CTX_init(&ctx);
658 EVP_MD_CTX_copy_ex(&ctx,in_ctx);
659 EVP_DigestFinal_ex(&ctx,out,&ret);
660 EVP_MD_CTX_cleanup(&ctx);
661 return((int)ret);
662 }
663
664int tls1_final_finish_mac(SSL *s, EVP_MD_CTX *in1_ctx, EVP_MD_CTX *in2_ctx,
665 const char *str, int slen, unsigned char *out)
666 {
667 unsigned int i;
668 EVP_MD_CTX ctx;
669 unsigned char buf[TLS_MD_MAX_CONST_SIZE+MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH];
670 unsigned char *q,buf2[12];
671
672 q=buf;
673 memcpy(q,str,slen);
674 q+=slen;
675
676 EVP_MD_CTX_init(&ctx);
677 EVP_MD_CTX_copy_ex(&ctx,in1_ctx);
678 EVP_DigestFinal_ex(&ctx,q,&i);
679 q+=i;
680 EVP_MD_CTX_copy_ex(&ctx,in2_ctx);
681 EVP_DigestFinal_ex(&ctx,q,&i);
682 q+=i;
683
684 tls1_PRF(s->ctx->md5,s->ctx->sha1,buf,(int)(q-buf),
685 s->session->master_key,s->session->master_key_length,
686 out,buf2,12);
687 EVP_MD_CTX_cleanup(&ctx);
688
689 return((int)12);
690 }
691
692int tls1_mac(SSL *ssl, unsigned char *md, int send)
693 {
694 SSL3_RECORD *rec;
695 unsigned char *mac_sec,*seq;
696 const EVP_MD *hash;
697 unsigned int md_size;
698 int i;
699 HMAC_CTX hmac;
700 unsigned char buf[5];
701
702 if (send)
703 {
704 rec= &(ssl->s3->wrec);
705 mac_sec= &(ssl->s3->write_mac_secret[0]);
706 seq= &(ssl->s3->write_sequence[0]);
707 hash=ssl->write_hash;
708 }
709 else
710 {
711 rec= &(ssl->s3->rrec);
712 mac_sec= &(ssl->s3->read_mac_secret[0]);
713 seq= &(ssl->s3->read_sequence[0]);
714 hash=ssl->read_hash;
715 }
716
717 md_size=EVP_MD_size(hash);
718
719 buf[0]=rec->type;
720 buf[1]=TLS1_VERSION_MAJOR;
721 buf[2]=TLS1_VERSION_MINOR;
722 buf[3]=rec->length>>8;
723 buf[4]=rec->length&0xff;
724
725 /* I should fix this up TLS TLS TLS TLS TLS XXXXXXXX */
726 HMAC_CTX_init(&hmac);
727 HMAC_Init_ex(&hmac,mac_sec,EVP_MD_size(hash),hash,NULL);
728 HMAC_Update(&hmac,seq,8);
729 HMAC_Update(&hmac,buf,5);
730 HMAC_Update(&hmac,rec->input,rec->length);
731 HMAC_Final(&hmac,md,&md_size);
732 HMAC_CTX_cleanup(&hmac);
733
734#ifdef TLS_DEBUG
735printf("sec=");
736{unsigned int z; for (z=0; z<md_size; z++) printf("%02X ",mac_sec[z]); printf("\n"); }
737printf("seq=");
738{int z; for (z=0; z<8; z++) printf("%02X ",seq[z]); printf("\n"); }
739printf("buf=");
740{int z; for (z=0; z<5; z++) printf("%02X ",buf[z]); printf("\n"); }
741printf("rec=");
742{unsigned int z; for (z=0; z<rec->length; z++) printf("%02X ",buf[z]); printf("\n"); }
743#endif
744
745 for (i=7; i>=0; i--)
746 {
747 ++seq[i];
748 if (seq[i] != 0) break;
749 }
750
751#ifdef TLS_DEBUG
752{unsigned int z; for (z=0; z<md_size; z++) printf("%02X ",md[z]); printf("\n"); }
753#endif
754 return(md_size);
755 }
756
757int tls1_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p,
758 int len)
759 {
760 unsigned char buf[SSL3_RANDOM_SIZE*2+TLS_MD_MASTER_SECRET_CONST_SIZE];
761 unsigned char buff[SSL_MAX_MASTER_KEY_LENGTH];
762
763#ifdef KSSL_DEBUG
764 printf ("tls1_generate_master_secret(%p,%p, %p, %d)\n", s,out, p,len);
765#endif /* KSSL_DEBUG */
766
767 /* Setup the stuff to munge */
768 memcpy(buf,TLS_MD_MASTER_SECRET_CONST,
769 TLS_MD_MASTER_SECRET_CONST_SIZE);
770 memcpy(&(buf[TLS_MD_MASTER_SECRET_CONST_SIZE]),
771 s->s3->client_random,SSL3_RANDOM_SIZE);
772 memcpy(&(buf[SSL3_RANDOM_SIZE+TLS_MD_MASTER_SECRET_CONST_SIZE]),
773 s->s3->server_random,SSL3_RANDOM_SIZE);
774 tls1_PRF(s->ctx->md5,s->ctx->sha1,
775 buf,TLS_MD_MASTER_SECRET_CONST_SIZE+SSL3_RANDOM_SIZE*2,p,len,
776 s->session->master_key,buff,SSL3_MASTER_SECRET_SIZE);
777#ifdef KSSL_DEBUG
778 printf ("tls1_generate_master_secret() complete\n");
779#endif /* KSSL_DEBUG */
780 return(SSL3_MASTER_SECRET_SIZE);
781 }
782
783int tls1_alert_code(int code)
784 {
785 switch (code)
786 {
787 case SSL_AD_CLOSE_NOTIFY: return(SSL3_AD_CLOSE_NOTIFY);
788 case SSL_AD_UNEXPECTED_MESSAGE: return(SSL3_AD_UNEXPECTED_MESSAGE);
789 case SSL_AD_BAD_RECORD_MAC: return(SSL3_AD_BAD_RECORD_MAC);
790 case SSL_AD_DECRYPTION_FAILED: return(TLS1_AD_DECRYPTION_FAILED);
791 case SSL_AD_RECORD_OVERFLOW: return(TLS1_AD_RECORD_OVERFLOW);
792 case SSL_AD_DECOMPRESSION_FAILURE:return(SSL3_AD_DECOMPRESSION_FAILURE);
793 case SSL_AD_HANDSHAKE_FAILURE: return(SSL3_AD_HANDSHAKE_FAILURE);
794 case SSL_AD_NO_CERTIFICATE: return(-1);
795 case SSL_AD_BAD_CERTIFICATE: return(SSL3_AD_BAD_CERTIFICATE);
796 case SSL_AD_UNSUPPORTED_CERTIFICATE:return(SSL3_AD_UNSUPPORTED_CERTIFICATE);
797 case SSL_AD_CERTIFICATE_REVOKED:return(SSL3_AD_CERTIFICATE_REVOKED);
798 case SSL_AD_CERTIFICATE_EXPIRED:return(SSL3_AD_CERTIFICATE_EXPIRED);
799 case SSL_AD_CERTIFICATE_UNKNOWN:return(SSL3_AD_CERTIFICATE_UNKNOWN);
800 case SSL_AD_ILLEGAL_PARAMETER: return(SSL3_AD_ILLEGAL_PARAMETER);
801 case SSL_AD_UNKNOWN_CA: return(TLS1_AD_UNKNOWN_CA);
802 case SSL_AD_ACCESS_DENIED: return(TLS1_AD_ACCESS_DENIED);
803 case SSL_AD_DECODE_ERROR: return(TLS1_AD_DECODE_ERROR);
804 case SSL_AD_DECRYPT_ERROR: return(TLS1_AD_DECRYPT_ERROR);
805 case SSL_AD_EXPORT_RESTRICTION: return(TLS1_AD_EXPORT_RESTRICTION);
806 case SSL_AD_PROTOCOL_VERSION: return(TLS1_AD_PROTOCOL_VERSION);
807 case SSL_AD_INSUFFICIENT_SECURITY:return(TLS1_AD_INSUFFICIENT_SECURITY);
808 case SSL_AD_INTERNAL_ERROR: return(TLS1_AD_INTERNAL_ERROR);
809 case SSL_AD_USER_CANCELLED: return(TLS1_AD_USER_CANCELLED);
810 case SSL_AD_NO_RENEGOTIATION: return(TLS1_AD_NO_RENEGOTIATION);
811 default: return(-1);
812 }
813 }
814
diff --git a/src/lib/libssl/t1_lib.c b/src/lib/libssl/t1_lib.c
deleted file mode 100644
index ca6c03d5af..0000000000
--- a/src/lib/libssl/t1_lib.c
+++ /dev/null
@@ -1,149 +0,0 @@
1/* ssl/t1_lib.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include <openssl/objects.h>
61#include "ssl_locl.h"
62
63const char *tls1_version_str="TLSv1" OPENSSL_VERSION_PTEXT;
64
65static long tls1_default_timeout(void);
66
67static SSL3_ENC_METHOD TLSv1_enc_data={
68 tls1_enc,
69 tls1_mac,
70 tls1_setup_key_block,
71 tls1_generate_master_secret,
72 tls1_change_cipher_state,
73 tls1_final_finish_mac,
74 TLS1_FINISH_MAC_LENGTH,
75 tls1_cert_verify_mac,
76 TLS_MD_CLIENT_FINISH_CONST,TLS_MD_CLIENT_FINISH_CONST_SIZE,
77 TLS_MD_SERVER_FINISH_CONST,TLS_MD_SERVER_FINISH_CONST_SIZE,
78 tls1_alert_code,
79 };
80
81static SSL_METHOD TLSv1_data= {
82 TLS1_VERSION,
83 tls1_new,
84 tls1_clear,
85 tls1_free,
86 ssl_undefined_function,
87 ssl_undefined_function,
88 ssl3_read,
89 ssl3_peek,
90 ssl3_write,
91 ssl3_shutdown,
92 ssl3_renegotiate,
93 ssl3_renegotiate_check,
94 ssl3_ctrl,
95 ssl3_ctx_ctrl,
96 ssl3_get_cipher_by_char,
97 ssl3_put_cipher_by_char,
98 ssl3_pending,
99 ssl3_num_ciphers,
100 ssl3_get_cipher,
101 ssl_bad_method,
102 tls1_default_timeout,
103 &TLSv1_enc_data,
104 ssl_undefined_function,
105 ssl3_callback_ctrl,
106 ssl3_ctx_callback_ctrl,
107 };
108
109static long tls1_default_timeout(void)
110 {
111 /* 2 hours, the 24 hours mentioned in the TLSv1 spec
112 * is way too long for http, the cache would over fill */
113 return(60*60*2);
114 }
115
116SSL_METHOD *tlsv1_base_method(void)
117 {
118 return(&TLSv1_data);
119 }
120
121int tls1_new(SSL *s)
122 {
123 if (!ssl3_new(s)) return(0);
124 s->method->ssl_clear(s);
125 return(1);
126 }
127
128void tls1_free(SSL *s)
129 {
130 ssl3_free(s);
131 }
132
133void tls1_clear(SSL *s)
134 {
135 ssl3_clear(s);
136 s->version=TLS1_VERSION;
137 }
138
139#if 0
140long tls1_ctrl(SSL *s, int cmd, long larg, char *parg)
141 {
142 return(0);
143 }
144
145long tls1_callback_ctrl(SSL *s, int cmd, void *(*fp)())
146 {
147 return(0);
148 }
149#endif
diff --git a/src/lib/libssl/t1_meth.c b/src/lib/libssl/t1_meth.c
deleted file mode 100644
index 9bb36a7d1c..0000000000
--- a/src/lib/libssl/t1_meth.c
+++ /dev/null
@@ -1,88 +0,0 @@
1/* ssl/t1_meth.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include <openssl/objects.h>
61#include "ssl_locl.h"
62
63static SSL_METHOD *tls1_get_method(int ver);
64static SSL_METHOD *tls1_get_method(int ver)
65 {
66 if (ver == TLS1_VERSION)
67 return(TLSv1_method());
68 else
69 return(NULL);
70 }
71
72SSL_METHOD *TLSv1_method(void)
73 {
74 static int init=1;
75 static SSL_METHOD TLSv1_data;
76
77 if (init)
78 {
79 memcpy((char *)&TLSv1_data,(char *)tlsv1_base_method(),
80 sizeof(SSL_METHOD));
81 TLSv1_data.ssl_connect=ssl3_connect;
82 TLSv1_data.ssl_accept=ssl3_accept;
83 TLSv1_data.get_ssl_method=tls1_get_method;
84 init=0;
85 }
86 return(&TLSv1_data);
87 }
88
diff --git a/src/lib/libssl/t1_srvr.c b/src/lib/libssl/t1_srvr.c
deleted file mode 100644
index 6e765e587f..0000000000
--- a/src/lib/libssl/t1_srvr.c
+++ /dev/null
@@ -1,91 +0,0 @@
1/* ssl/t1_srvr.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include "ssl_locl.h"
61#include <openssl/buffer.h>
62#include <openssl/rand.h>
63#include <openssl/objects.h>
64#include <openssl/evp.h>
65#include <openssl/x509.h>
66
67static SSL_METHOD *tls1_get_server_method(int ver);
68static SSL_METHOD *tls1_get_server_method(int ver)
69 {
70 if (ver == TLS1_VERSION)
71 return(TLSv1_server_method());
72 else
73 return(NULL);
74 }
75
76SSL_METHOD *TLSv1_server_method(void)
77 {
78 static int init=1;
79 static SSL_METHOD TLSv1_server_data;
80
81 if (init)
82 {
83 memcpy((char *)&TLSv1_server_data,(char *)tlsv1_base_method(),
84 sizeof(SSL_METHOD));
85 TLSv1_server_data.ssl_accept=ssl3_accept;
86 TLSv1_server_data.get_ssl_method=tls1_get_server_method;
87 init=0;
88 }
89 return(&TLSv1_server_data);
90 }
91
diff --git a/src/lib/libssl/test/CAss.cnf b/src/lib/libssl/test/CAss.cnf
deleted file mode 100644
index b941b7ae15..0000000000
--- a/src/lib/libssl/test/CAss.cnf
+++ /dev/null
@@ -1,25 +0,0 @@
1#
2# SSLeay example configuration file.
3# This is mostly being used for generation of certificate requests.
4#
5
6RANDFILE = ./.rnd
7
8####################################################################
9[ req ]
10default_bits = 512
11default_keyfile = keySS.pem
12distinguished_name = req_distinguished_name
13encrypt_rsa_key = no
14default_md = sha1
15
16[ req_distinguished_name ]
17countryName = Country Name (2 letter code)
18countryName_default = AU
19countryName_value = AU
20
21organizationName = Organization Name (eg, company)
22organizationName_value = Dodgy Brothers
23
24commonName = Common Name (eg, YOUR name)
25commonName_value = Dodgy CA
diff --git a/src/lib/libssl/test/CAssdh.cnf b/src/lib/libssl/test/CAssdh.cnf
deleted file mode 100644
index 4e0a908679..0000000000
--- a/src/lib/libssl/test/CAssdh.cnf
+++ /dev/null
@@ -1,24 +0,0 @@
1#
2# SSLeay example configuration file.
3# This is mostly being used for generation of certificate requests.
4#
5# hacked by iang to do DH certs - CA
6
7RANDFILE = ./.rnd
8
9####################################################################
10[ req ]
11distinguished_name = req_distinguished_name
12encrypt_rsa_key = no
13
14[ req_distinguished_name ]
15countryName = Country Name (2 letter code)
16countryName_default = CU
17countryName_value = CU
18
19organizationName = Organization Name (eg, company)
20organizationName_value = La Junta de la Revolucion
21
22commonName = Common Name (eg, YOUR name)
23commonName_value = Junta
24
diff --git a/src/lib/libssl/test/CAssdsa.cnf b/src/lib/libssl/test/CAssdsa.cnf
deleted file mode 100644
index a6b4d1810c..0000000000
--- a/src/lib/libssl/test/CAssdsa.cnf
+++ /dev/null
@@ -1,23 +0,0 @@
1#
2# SSLeay example configuration file.
3# This is mostly being used for generation of certificate requests.
4#
5# hacked by iang to do DSA certs - CA
6
7RANDFILE = ./.rnd
8
9####################################################################
10[ req ]
11distinguished_name = req_distinguished_name
12encrypt_rsa_key = no
13
14[ req_distinguished_name ]
15countryName = Country Name (2 letter code)
16countryName_default = ES
17countryName_value = ES
18
19organizationName = Organization Name (eg, company)
20organizationName_value = Hermanos Locos
21
22commonName = Common Name (eg, YOUR name)
23commonName_value = Hermanos Locos CA
diff --git a/src/lib/libssl/test/CAssrsa.cnf b/src/lib/libssl/test/CAssrsa.cnf
deleted file mode 100644
index eb24a6dfc0..0000000000
--- a/src/lib/libssl/test/CAssrsa.cnf
+++ /dev/null
@@ -1,24 +0,0 @@
1#
2# SSLeay example configuration file.
3# This is mostly being used for generation of certificate requests.
4#
5# create RSA certs - CA
6
7RANDFILE = ./.rnd
8
9####################################################################
10[ req ]
11distinguished_name = req_distinguished_name
12encrypt_key = no
13
14[ req_distinguished_name ]
15countryName = Country Name (2 letter code)
16countryName_default = ES
17countryName_value = ES
18
19organizationName = Organization Name (eg, company)
20organizationName_value = Hermanos Locos
21
22commonName = Common Name (eg, YOUR name)
23commonName_value = Hermanos Locos CA
24
diff --git a/src/lib/libssl/test/Sssdsa.cnf b/src/lib/libssl/test/Sssdsa.cnf
deleted file mode 100644
index 8e170a28ef..0000000000
--- a/src/lib/libssl/test/Sssdsa.cnf
+++ /dev/null
@@ -1,27 +0,0 @@
1#
2# SSLeay example configuration file.
3# This is mostly being used for generation of certificate requests.
4#
5# hacked by iang to do DSA certs - Server
6
7RANDFILE = ./.rnd
8
9####################################################################
10[ req ]
11distinguished_name = req_distinguished_name
12encrypt_rsa_key = no
13
14[ req_distinguished_name ]
15countryName = Country Name (2 letter code)
16countryName_default = ES
17countryName_value = ES
18
19organizationName = Organization Name (eg, company)
20organizationName_value = Tortilleras S.A.
21
220.commonName = Common Name (eg, YOUR name)
230.commonName_value = Torti
24
251.commonName = Common Name (eg, YOUR name)
261.commonName_value = Gordita
27
diff --git a/src/lib/libssl/test/Sssrsa.cnf b/src/lib/libssl/test/Sssrsa.cnf
deleted file mode 100644
index 8c79a03fca..0000000000
--- a/src/lib/libssl/test/Sssrsa.cnf
+++ /dev/null
@@ -1,26 +0,0 @@
1#
2# SSLeay example configuration file.
3# This is mostly being used for generation of certificate requests.
4#
5# create RSA certs - Server
6
7RANDFILE = ./.rnd
8
9####################################################################
10[ req ]
11distinguished_name = req_distinguished_name
12encrypt_key = no
13
14[ req_distinguished_name ]
15countryName = Country Name (2 letter code)
16countryName_default = ES
17countryName_value = ES
18
19organizationName = Organization Name (eg, company)
20organizationName_value = Tortilleras S.A.
21
220.commonName = Common Name (eg, YOUR name)
230.commonName_value = Torti
24
251.commonName = Common Name (eg, YOUR name)
261.commonName_value = Gordita
diff --git a/src/lib/libssl/test/Uss.cnf b/src/lib/libssl/test/Uss.cnf
deleted file mode 100644
index c89692d519..0000000000
--- a/src/lib/libssl/test/Uss.cnf
+++ /dev/null
@@ -1,28 +0,0 @@
1#
2# SSLeay example configuration file.
3# This is mostly being used for generation of certificate requests.
4#
5
6RANDFILE = ./.rnd
7
8####################################################################
9[ req ]
10default_bits = 512
11default_keyfile = keySS.pem
12distinguished_name = req_distinguished_name
13encrypt_rsa_key = no
14default_md = md2
15
16[ req_distinguished_name ]
17countryName = Country Name (2 letter code)
18countryName_default = AU
19countryName_value = AU
20
21organizationName = Organization Name (eg, company)
22organizationName_value = Dodgy Brothers
23
240.commonName = Common Name (eg, YOUR name)
250.commonName_value = Brother 1
26
271.commonName = Common Name (eg, YOUR name)
281.commonName_value = Brother 2
diff --git a/src/lib/libssl/test/VMSca-response.1 b/src/lib/libssl/test/VMSca-response.1
deleted file mode 100644
index 8b13789179..0000000000
--- a/src/lib/libssl/test/VMSca-response.1
+++ /dev/null
@@ -1 +0,0 @@
1
diff --git a/src/lib/libssl/test/VMSca-response.2 b/src/lib/libssl/test/VMSca-response.2
deleted file mode 100644
index 9b48ee4cf9..0000000000
--- a/src/lib/libssl/test/VMSca-response.2
+++ /dev/null
@@ -1,2 +0,0 @@
1y
2y
diff --git a/src/lib/libssl/test/bctest b/src/lib/libssl/test/bctest
deleted file mode 100644
index bdb3218f7a..0000000000
--- a/src/lib/libssl/test/bctest
+++ /dev/null
@@ -1,111 +0,0 @@
1#!/bin/sh
2
3# This script is used by test/Makefile.ssl to check whether a sane 'bc'
4# is installed.
5# ('make test_bn' should not try to run 'bc' if it does not exist or if
6# it is a broken 'bc' version that is known to cause trouble.)
7#
8# If 'bc' works, we also test if it knows the 'print' command.
9#
10# In any case, output an appropriate command line for running (or not
11# running) bc.
12
13
14IFS=:
15try_without_dir=true
16# First we try "bc", then "$dir/bc" for each item in $PATH.
17for dir in dummy:$PATH; do
18 if [ "$try_without_dir" = true ]; then
19 # first iteration
20 bc=bc
21 try_without_dir=false
22 else
23 # second and later iterations
24 bc="$dir/bc"
25 if [ ! -f "$bc" ]; then # '-x' is not available on Ultrix
26 bc=''
27 fi
28 fi
29
30 if [ ! "$bc" = '' ]; then
31 failure=none
32
33
34 # Test for SunOS 5.[78] bc bug
35 "$bc" >tmp.bctest <<\EOF
36obase=16
37ibase=16
38a=AD88C418F31B3FC712D0425001D522B3AE9134FF3A98C13C1FCC1682211195406C1A6C66C6A\
39CEEC1A0EC16950233F77F1C2F2363D56DD71A36C57E0B2511FC4BA8F22D261FE2E9356D99AF57\
4010F3817C0E05BF79C423C3F66FDF321BE8D3F18F625D91B670931C1EF25F28E489BDA1C5422D1\
41C3F6F7A1AD21585746ECC4F10A14A778AF56F08898E965E9909E965E0CB6F85B514150C644759\
423BE731877B16EA07B552088FF2EA728AC5E0FF3A23EB939304519AB8B60F2C33D6BA0945B66F0\
434FC3CADF855448B24A9D7640BCF473E
44b=DCE91E7D120B983EA9A104B5A96D634DD644C37657B1C7860B45E6838999B3DCE5A555583C6\
459209E41F413422954175A06E67FFEF6746DD652F0F48AEFECC3D8CAC13523BDAAD3F5AF4212BD\
468B3CD64126E1A82E190228020C05B91C8B141F1110086FC2A4C6ED631EBA129D04BB9A19FC53D\
473ED0E2017D60A68775B75481449
48(a/b)*b + (a%b) - a
49EOF
50 if [ 0 != "`cat tmp.bctest`" ]; then
51 failure=SunOStest
52 fi
53
54
55 if [ "$failure" = none ]; then
56 # Test for SCO bc bug.
57 "$bc" >tmp.bctest <<\EOF
58obase=16
59ibase=16
60-FFDD63BA1A4648F0D804F8A1C66C53F0D2110590E8A3907EC73B4AEC6F15AC177F176F2274D2\
619DC8022EA0D7DD3ABE9746D2D46DD3EA5B5F6F69DF12877E0AC5E7F5ADFACEE54573F5D256A06\
6211B5D2BC24947724E22AE4EC3FB0C39D9B4694A01AFE5E43B4D99FB9812A0E4A5773D8B254117\
631239157EC6E3D8D50199 * -FFDD63BA1A4648F0D804F8A1C66C53F0D2110590E8A3907EC73B4\
64AEC6F15AC177F176F2274D29DC8022EA0D7DD3ABE9746D2D46DD3EA5B5F6F69DF12877E0AC5E7\
65F5ADFACEE54573F5D256A0611B5D2BC24947724E22AE4EC3FB0C39D9B4694A01AFE5E43B4D99F\
66B9812A0E4A5773D8B2541171239157EC6E3D8D50199 - FFBACC221682DA464B6D7F123482522\
6702EDAEDCA38C3B69E9B7BBCD6165A9CD8716C4903417F23C09A85B851961F92C217258CEEB866\
6885EFCC5DD131853A02C07A873B8E2AF2E40C6D5ED598CD0E8F35AD49F3C3A17FDB7653E4E2DC4\
69A8D23CC34686EE4AD01F7407A7CD74429AC6D36DBF0CB6A3E302D0E5BDFCD048A3B90C1BE5AA8\
70E16C3D5884F9136B43FF7BB443764153D4AEC176C681B078F4CC53D6EB6AB76285537DDEE7C18\
718C72441B52EDBDDBC77E02D34E513F2AABF92F44109CAFE8242BD0ECBAC5604A94B02EA44D43C\
7204E9476E6FBC48043916BFA1485C6093603600273C9C33F13114D78064AE42F3DC466C7DA543D\
7389C8D71
74AD534AFBED2FA39EE9F40E20FCF9E2C861024DB98DDCBA1CD118C49CA55EEBC20D6BA51B2271C\
75928B693D6A73F67FEB1B4571448588B46194617D25D910C6A9A130CC963155CF34079CB218A44\
768A1F57E276D92A33386DDCA3D241DB78C8974ABD71DD05B0FA555709C9910D745185E6FE108E3\
7737F1907D0C56F8BFBF52B9704 % -E557905B56B13441574CAFCE2BD257A750B1A8B2C88D0E36\
78E18EF7C38DAC80D3948E17ED63AFF3B3467866E3B89D09A81B3D16B52F6A3C7134D3C6F5123E9\
79F617E3145BBFBE9AFD0D6E437EA4FF6F04BC67C4F1458B4F0F47B64 - 1C2BBBB19B74E86FD32\
809E8DB6A8C3B1B9986D57ED5419C2E855F7D5469E35E76334BB42F4C43E3F3A31B9697C171DAC4\
81D97935A7E1A14AD209D6CF811F55C6DB83AA9E6DFECFCD6669DED7171EE22A40C6181615CAF3F\
825296964
83EOF
84 if [ "0
850" != "`cat tmp.bctest`" ]; then
86 failure=SCOtest
87 fi
88 fi
89
90
91 if [ "$failure" = none ]; then
92 # bc works; now check if it knows the 'print' command.
93 if [ "OK" = "`echo 'print \"OK\"' | $bc 2>/dev/null`" ]
94 then
95 echo "$bc"
96 else
97 echo "sed 's/print.*//' | $bc"
98 fi
99 exit 0
100 fi
101
102 echo "$bc does not work properly ('$failure' failed). Looking for another bc ..." >&2
103 fi
104done
105
106echo "No working bc found. Consider installing GNU bc." >&2
107if [ "$1" = ignore ]; then
108 echo "cat >/dev/null"
109 exit 0
110fi
111exit 1
diff --git a/src/lib/libssl/test/methtest.c b/src/lib/libssl/test/methtest.c
deleted file mode 100644
index 06ccb3b310..0000000000
--- a/src/lib/libssl/test/methtest.c
+++ /dev/null
@@ -1,105 +0,0 @@
1/* test/methtest.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include <stdlib.h>
61#include <openssl/rsa.h>
62#include <openssl/x509.h>
63#include "meth.h"
64#include <openssl/err.h>
65
66int main(argc,argv)
67int argc;
68char *argv[];
69 {
70 METHOD_CTX *top,*tmp1,*tmp2;
71
72 top=METH_new(x509_lookup()); /* get a top level context */
73 if (top == NULL) goto err;
74
75 tmp1=METH_new(x509_by_file());
76 if (top == NULL) goto err;
77 METH_arg(tmp1,METH_TYPE_FILE,"cafile1");
78 METH_arg(tmp1,METH_TYPE_FILE,"cafile2");
79 METH_push(top,METH_X509_CA_BY_SUBJECT,tmp1);
80
81 tmp2=METH_new(x509_by_dir());
82 METH_arg(tmp2,METH_TYPE_DIR,"/home/eay/.CAcerts");
83 METH_arg(tmp2,METH_TYPE_DIR,"/home/eay/SSLeay/certs");
84 METH_arg(tmp2,METH_TYPE_DIR,"/usr/local/ssl/certs");
85 METH_push(top,METH_X509_CA_BY_SUBJECT,tmp2);
86
87/* tmp=METH_new(x509_by_issuer_dir);
88 METH_arg(tmp,METH_TYPE_DIR,"/home/eay/.mycerts");
89 METH_push(top,METH_X509_BY_ISSUER,tmp);
90
91 tmp=METH_new(x509_by_issuer_primary);
92 METH_arg(tmp,METH_TYPE_FILE,"/home/eay/.mycerts/primary.pem");
93 METH_push(top,METH_X509_BY_ISSUER,tmp);
94*/
95
96 METH_init(top);
97 METH_control(tmp1,METH_CONTROL_DUMP,stdout);
98 METH_control(tmp2,METH_CONTROL_DUMP,stdout);
99 exit(0);
100err:
101 ERR_load_crypto_strings();
102 ERR_print_errors_fp(stderr);
103 exit(1);
104 return(0);
105 }
diff --git a/src/lib/libssl/test/pkcs7-1.pem b/src/lib/libssl/test/pkcs7-1.pem
deleted file mode 100644
index c47b27af88..0000000000
--- a/src/lib/libssl/test/pkcs7-1.pem
+++ /dev/null
@@ -1,15 +0,0 @@
1-----BEGIN PKCS7-----
2MIICUAYJKoZIhvcNAQcCoIICQTCCAj0CAQExDjAMBggqhkiG9w0CAgUAMCgGCSqG
3SIb3DQEHAaAbBBlFdmVyeW9uZSBnZXRzIEZyaWRheSBvZmYuoIIBXjCCAVowggEE
4AgQUAAApMA0GCSqGSIb3DQEBAgUAMCwxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRF
5eGFtcGxlIE9yZ2FuaXphdGlvbjAeFw05MjA5MDkyMjE4MDZaFw05NDA5MDkyMjE4
6MDVaMEIxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRFeGFtcGxlIE9yZ2FuaXphdGlv
7bjEUMBIGA1UEAxMLVGVzdCBVc2VyIDEwWzANBgkqhkiG9w0BAQEFAANKADBHAkAK
8ZnkdxpiBaN56t3QZu3+wwAHGJxAnAHUUKULhmo2MUdBTs+N4Kh3l3Fr06+mUaBcB
9FKHf5nzcmpr1XWVWILurAgMBAAEwDQYJKoZIhvcNAQECBQADQQBFGqHhqncgSl/N
109XYGnQL3MsJvNnsNV4puZPOakR9Hld8JlDQFEaDR30ogsmp3TMrvdfxpLlTCoZN8
11BxEmnZsWMYGbMIGYAgEBMDQwLDELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFEV4YW1w
12bGUgT3JnYW5pemF0aW9uAgQUAAApMAwGCCqGSIb3DQICBQAwDQYJKoZIhvcNAQEB
13BQAEQAX6aoEvx9+L9PJUJQngPoRuEbnGIL4gCe+0QO+8xmkhaZSsBPNBtX0FIC1C
14j7Kie1x339mxW/w9VZNTUDQQweHh
15-----END PKCS7-----
diff --git a/src/lib/libssl/test/pkcs7.pem b/src/lib/libssl/test/pkcs7.pem
deleted file mode 100644
index d55c60b94e..0000000000
--- a/src/lib/libssl/test/pkcs7.pem
+++ /dev/null
@@ -1,54 +0,0 @@
1 MIAGCSqGSIb3DQEHAqCAMIACAQExADCABgkqhkiG9w0BBwEAAKCAMIIE+DCCBGGg
2 AwIBAgIQaGSF/JpbS1C223+yrc+N1DANBgkqhkiG9w0BAQQFADBiMREwDwYDVQQH
3 EwhJbnRlcm5ldDEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNDAyBgNVBAsTK1Zl
4 cmlTaWduIENsYXNzIDEgQ0EgLSBJbmRpdmlkdWFsIFN1YnNjcmliZXIwHhcNOTYw
5 ODEyMDAwMDAwWhcNOTYwODE3MjM1OTU5WjCCASAxETAPBgNVBAcTCEludGVybmV0
6 MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE0MDIGA1UECxMrVmVyaVNpZ24gQ2xh
7 c3MgMSBDQSAtIEluZGl2aWR1YWwgU3Vic2NyaWJlcjE3MDUGA1UECxMuRGlnaXRh
8 bCBJRCBDbGFzcyAxIC0gU01JTUUgVmVyaVNpZ24sIEluYy4gVEVTVDFGMEQGA1UE
9 CxM9d3d3LnZlcmlzaWduLmNvbS9yZXBvc2l0b3J5L0NQUyBJbmNvcnAuIGJ5IFJl
10 Zi4sTElBQi5MVEQoYyk5NjEZMBcGA1UEAxMQQWxleGFuZHJlIERlYWNvbjEgMB4G
11 CSqGSIb3DQEJARYRYWxleEB2ZXJpc2lnbi5jb20wWzANBgkqhkiG9w0BAQEFAANK
12 ADBHAkAOy7xxCAIkOfuIA2LyRpxgKlDORl8htdXYhF5iBGUx1GYaK6KF+bK/CCI0
13 l4j2OfWGFBUrwGoWqxTNcWgTfMzRAgMBAAGjggIyMIICLjAJBgNVHRMEAjAAMIIC
14 HwYDVR0DBIICFjCCAhIwggIOMIICCgYLYIZIAYb4RQEHAQEwggH5FoIBp1RoaXMg
15 Y2VydGlmaWNhdGUgaW5jb3Jwb3JhdGVzIGJ5IHJlZmVyZW5jZSwgYW5kIGl0cyB1
16 c2UgaXMgc3RyaWN0bHkgc3ViamVjdCB0bywgdGhlIFZlcmlTaWduIENlcnRpZmlj
17 YXRpb24gUHJhY3RpY2UgU3RhdGVtZW50IChDUFMpLCBhdmFpbGFibGUgYXQ6IGh0
18 dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9DUFM7IGJ5IEUtbWFpbCBhdCBDUFMtcmVx
19 dWVzdHNAdmVyaXNpZ24uY29tOyBvciBieSBtYWlsIGF0IFZlcmlTaWduLCBJbmMu
20 LCAyNTkzIENvYXN0IEF2ZS4sIE1vdW50YWluIFZpZXcsIENBIDk0MDQzIFVTQSBU
21 ZWwuICsxICg0MTUpIDk2MS04ODMwIENvcHlyaWdodCAoYykgMTk5NiBWZXJpU2ln
22 biwgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gQ0VSVEFJTiBXQVJSQU5USUVT
23 IERJU0NMQUlNRUQgYW5kIExJQUJJTElUWSBMSU1JVEVELqAOBgxghkgBhvhFAQcB
24 AQGhDgYMYIZIAYb4RQEHAQECMCwwKhYoaHR0cHM6Ly93d3cudmVyaXNpZ24uY29t
25 L3JlcG9zaXRvcnkvQ1BTIDANBgkqhkiG9w0BAQQFAAOBgQAimWMGQwwwxk+b3KAL
26 HlSWXtU7LWHe29CEG8XeVNTvrqs6SBqT7OoENOkGxpfdpVgZ3Qw2SKjxDvbvpfSF
27 slsqcxWSgB/hWuaVuZCkvTw/dYGGOxkTJGxvDCfl1PZjX4dKbatslsi9Z9HpGWT7
28 ttItRwKqcBKgmCJvKi1pGWED0zCCAnkwggHioAMCAQICEDURpVKQb+fQKaRAGdQR
29 /D4wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlT
30 aWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5IENlcnRp
31 ZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDYyNzAwMDAwMFoXDTk3MDYyNzIzNTk1
32 OVowYjERMA8GA1UEBxMISW50ZXJuZXQxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMu
33 MTQwMgYDVQQLEytWZXJpU2lnbiBDbGFzcyAxIENBIC0gSW5kaXZpZHVhbCBTdWJz
34 Y3JpYmVyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2FKbPTdAFDdjKI9Bv
35 qrQpkmOOLPhvltcunXZLEbE2jVfJw/0cxrr+Hgi6M8qV6r7jW80GqLd5HUQq7XPy
36 sVKDaBBwZJHXPmv5912dFEObbpdFmIFH0S3L3bty10w/cariQPJUObwW7s987Lrb
37 P2wqsxaxhhKdrpM01bjV0Pc+qQIDAQABozMwMTAPBgNVHRMECDAGAQH/AgEBMAsG
38 A1UdDwQEAwIBBjARBglghkgBhvhCAQEEBAMCAgQwDQYJKoZIhvcNAQECBQADgYEA
39 KeXHoBmnbxRCgk0jM9e9mDppdxpsipIna/J8DOHEUuD4nONAr4+xOg73SBl026n7
40 Bk55A2wvAMGo7+kKTZ+rHaFDDcmq4O+rzFri2RIOeGAncj1IcGptAQhvXoIhFMG4
41 Jlzg1KlHZHqy7D3jex78zcSU7kKOu8f5tAX1jC3+sToAAKGAMIIBJzCBkTANBgkq
42 hkiG9w0BAQIFADBiMREwDwYDVQQHEwhJbnRlcm5ldDEXMBUGA1UEChMOVmVyaVNp
43 Z24sIEluYy4xNDAyBgNVBAsTK1ZlcmlTaWduIENsYXNzIDEgQ0EgLSBJbmRpdmlk
44 dWFsIFN1YnNjcmliZXIXDTk2MDcwMTE3MzA0MFoXDTk3MDcwMTAwMDAwMFowDQYJ
45 KoZIhvcNAQECBQADgYEAGLuQ6PX8A7AiqBEtWzYtl6lZNSDI0bR5YUo+D2Jzkw30
46 dxQnJSbKXEc6XYuzAW5HvrzATXu5c19WWPT4cRDwmjH71i9QcDysWwf/wE0qGTiW
47 I3tQT0I5VGh7jIJD07nlBw3R4Xl8dH9kr85JsWinqDH5YKpIo9o8knY5n7+qjOow
48 ggEkMIGOMA0GCSqGSIb3DQEBAgUAMF8xCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5W
49 ZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBD
50 ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eRcNOTYwNzE2MjMxMTI5WhcNOTYwODE1MDAw
51 MDAwWjANBgkqhkiG9w0BAQIFAAOBgQAXsLE4vnsY6sY67QrmWec7iaU2ehzxanEK
52 /9wKHZNuhlNzk+qGZZw2evxfUe2OaRbYpl8zuZvhK9BHD3ad14OSe9/zx5hOPgP/
53 DQXt6R4R8Q/1JheBrolrgbavjvI2wKS8/Psp2prBrkF4T48+AKRmS8Zzh1guxgvP
54 b+xSu/jH0gAAMYAAAAAAAAAAAA==
diff --git a/src/lib/libssl/test/r160test.c b/src/lib/libssl/test/r160test.c
deleted file mode 100644
index a172e393ca..0000000000
--- a/src/lib/libssl/test/r160test.c
+++ /dev/null
@@ -1,57 +0,0 @@
1/* test/r160test.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
diff --git a/src/lib/libssl/test/tcrl b/src/lib/libssl/test/tcrl
deleted file mode 100644
index f71ef7a863..0000000000
--- a/src/lib/libssl/test/tcrl
+++ /dev/null
@@ -1,85 +0,0 @@
1#!/bin/sh
2
3if test "$OSTYPE" = msdosdjgpp; then
4 PATH=../apps\;$PATH
5else
6 PATH=../apps:$PATH
7fi
8export PATH
9
10cmd='../apps/openssl crl'
11
12if [ "$1"x != "x" ]; then
13 t=$1
14else
15 t=testcrl.pem
16fi
17
18echo testing crl conversions
19cp $t fff.p
20
21echo "p -> d"
22$cmd -in fff.p -inform p -outform d >f.d
23if [ $? != 0 ]; then exit 1; fi
24#echo "p -> t"
25#$cmd -in fff.p -inform p -outform t >f.t
26#if [ $? != 0 ]; then exit 1; fi
27echo "p -> p"
28$cmd -in fff.p -inform p -outform p >f.p
29if [ $? != 0 ]; then exit 1; fi
30
31echo "d -> d"
32$cmd -in f.d -inform d -outform d >ff.d1
33if [ $? != 0 ]; then exit 1; fi
34#echo "t -> d"
35#$cmd -in f.t -inform t -outform d >ff.d2
36#if [ $? != 0 ]; then exit 1; fi
37echo "p -> d"
38$cmd -in f.p -inform p -outform d >ff.d3
39if [ $? != 0 ]; then exit 1; fi
40
41#echo "d -> t"
42#$cmd -in f.d -inform d -outform t >ff.t1
43#if [ $? != 0 ]; then exit 1; fi
44#echo "t -> t"
45#$cmd -in f.t -inform t -outform t >ff.t2
46#if [ $? != 0 ]; then exit 1; fi
47#echo "p -> t"
48#$cmd -in f.p -inform p -outform t >ff.t3
49#if [ $? != 0 ]; then exit 1; fi
50
51echo "d -> p"
52$cmd -in f.d -inform d -outform p >ff.p1
53if [ $? != 0 ]; then exit 1; fi
54#echo "t -> p"
55#$cmd -in f.t -inform t -outform p >ff.p2
56#if [ $? != 0 ]; then exit 1; fi
57echo "p -> p"
58$cmd -in f.p -inform p -outform p >ff.p3
59if [ $? != 0 ]; then exit 1; fi
60
61cmp fff.p f.p
62if [ $? != 0 ]; then exit 1; fi
63cmp fff.p ff.p1
64if [ $? != 0 ]; then exit 1; fi
65#cmp fff.p ff.p2
66#if [ $? != 0 ]; then exit 1; fi
67cmp fff.p ff.p3
68if [ $? != 0 ]; then exit 1; fi
69
70#cmp f.t ff.t1
71#if [ $? != 0 ]; then exit 1; fi
72#cmp f.t ff.t2
73#if [ $? != 0 ]; then exit 1; fi
74#cmp f.t ff.t3
75#if [ $? != 0 ]; then exit 1; fi
76
77cmp f.p ff.p1
78if [ $? != 0 ]; then exit 1; fi
79#cmp f.p ff.p2
80#if [ $? != 0 ]; then exit 1; fi
81cmp f.p ff.p3
82if [ $? != 0 ]; then exit 1; fi
83
84/bin/rm -f f.* ff.* fff.*
85exit 0
diff --git a/src/lib/libssl/test/test.cnf b/src/lib/libssl/test/test.cnf
deleted file mode 100644
index faad3914a8..0000000000
--- a/src/lib/libssl/test/test.cnf
+++ /dev/null
@@ -1,88 +0,0 @@
1#
2# SSLeay example configuration file.
3# This is mostly being used for generation of certificate requests.
4#
5
6RANDFILE = ./.rnd
7
8####################################################################
9[ ca ]
10default_ca = CA_default # The default ca section
11
12####################################################################
13[ CA_default ]
14
15dir = ./demoCA # Where everything is kept
16certs = $dir/certs # Where the issued certs are kept
17crl_dir = $dir/crl # Where the issued crl are kept
18database = $dir/index.txt # database index file.
19new_certs_dir = $dir/new_certs # default place for new certs.
20
21certificate = $dir/CAcert.pem # The CA certificate
22serial = $dir/serial # The current serial number
23crl = $dir/crl.pem # The current CRL
24private_key = $dir/private/CAkey.pem# The private key
25RANDFILE = $dir/private/.rand # private random number file
26
27default_days = 365 # how long to certify for
28default_crl_days= 30 # how long before next CRL
29default_md = md5 # which md to use.
30
31# A few difference way of specifying how similar the request should look
32# For type CA, the listed attributes must be the same, and the optional
33# and supplied fields are just that :-)
34policy = policy_match
35
36# For the CA policy
37[ policy_match ]
38countryName = match
39stateOrProvinceName = match
40organizationName = match
41organizationalUnitName = optional
42commonName = supplied
43emailAddress = optional
44
45# For the 'anything' policy
46# At this point in time, you must list all acceptable 'object'
47# types.
48[ policy_anything ]
49countryName = optional
50stateOrProvinceName = optional
51localityName = optional
52organizationName = optional
53organizationalUnitName = optional
54commonName = supplied
55emailAddress = optional
56
57####################################################################
58[ req ]
59default_bits = 512
60default_keyfile = testkey.pem
61distinguished_name = req_distinguished_name
62encrypt_rsa_key = no
63
64[ req_distinguished_name ]
65countryName = Country Name (2 letter code)
66countryName_default = AU
67countryName_value = AU
68
69stateOrProvinceName = State or Province Name (full name)
70stateOrProvinceName_default = Queensland
71stateOrProvinceName_value =
72
73localityName = Locality Name (eg, city)
74localityName_value = Brisbane
75
76organizationName = Organization Name (eg, company)
77organizationName_default =
78organizationName_value = CryptSoft Pty Ltd
79
80organizationalUnitName = Organizational Unit Name (eg, section)
81organizationalUnitName_default =
82organizationalUnitName_value = .
83
84commonName = Common Name (eg, YOUR name)
85commonName_value = Eric Young
86
87emailAddress = Email Address
88emailAddress_value = eay@mincom.oz.au
diff --git a/src/lib/libssl/test/testca b/src/lib/libssl/test/testca
deleted file mode 100644
index 8215ebb5d1..0000000000
--- a/src/lib/libssl/test/testca
+++ /dev/null
@@ -1,48 +0,0 @@
1#!/bin/sh
2
3SH="/bin/sh"
4if test "$OSTYPE" = msdosdjgpp; then
5 PATH=./apps\;../apps\;$PATH
6else
7 PATH=../apps:$PATH
8fi
9export SH PATH
10
11SSLEAY_CONFIG="-config CAss.cnf"
12export SSLEAY_CONFIG
13
14/bin/rm -fr demoCA
15$SH ../apps/CA.sh -newca <<EOF
16EOF
17
18if [ $? != 0 ]; then
19 exit 1;
20fi
21
22SSLEAY_CONFIG="-config Uss.cnf"
23export SSLEAY_CONFIG
24$SH ../apps/CA.sh -newreq
25if [ $? != 0 ]; then
26 exit 1;
27fi
28
29
30SSLEAY_CONFIG="-config ../apps/openssl.cnf"
31export SSLEAY_CONFIG
32$SH ../apps/CA.sh -sign <<EOF
33y
34y
35EOF
36if [ $? != 0 ]; then
37 exit 1;
38fi
39
40
41$SH ../apps/CA.sh -verify newcert.pem
42if [ $? != 0 ]; then
43 exit 1;
44fi
45
46/bin/rm -fr demoCA newcert.pem newreq.pem
47#usage: CA -newcert|-newreq|-newca|-sign|-verify
48
diff --git a/src/lib/libssl/test/testcrl.pem b/src/lib/libssl/test/testcrl.pem
deleted file mode 100644
index 0989788354..0000000000
--- a/src/lib/libssl/test/testcrl.pem
+++ /dev/null
@@ -1,16 +0,0 @@
1-----BEGIN X509 CRL-----
2MIICjTCCAfowDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMxIDAeBgNVBAoT
3F1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2VydmVy
4IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Fw05NTA1MDIwMjEyMjZaFw05NTA2MDEw
5MDAxNDlaMIIBaDAWAgUCQQAABBcNOTUwMjAxMTcyNDI2WjAWAgUCQQAACRcNOTUw
6MjEwMDIxNjM5WjAWAgUCQQAADxcNOTUwMjI0MDAxMjQ5WjAWAgUCQQAADBcNOTUw
7MjI1MDA0NjQ0WjAWAgUCQQAAGxcNOTUwMzEzMTg0MDQ5WjAWAgUCQQAAFhcNOTUw
8MzE1MTkxNjU0WjAWAgUCQQAAGhcNOTUwMzE1MTk0MDQxWjAWAgUCQQAAHxcNOTUw
9MzI0MTk0NDMzWjAWAgUCcgAABRcNOTUwMzI5MjAwNzExWjAWAgUCcgAAERcNOTUw
10MzMwMDIzNDI2WjAWAgUCQQAAIBcNOTUwNDA3MDExMzIxWjAWAgUCcgAAHhcNOTUw
11NDA4MDAwMjU5WjAWAgUCcgAAQRcNOTUwNDI4MTcxNzI0WjAWAgUCcgAAOBcNOTUw
12NDI4MTcyNzIxWjAWAgUCcgAATBcNOTUwNTAyMDIxMjI2WjANBgkqhkiG9w0BAQIF
13AAN+AHqOEJXSDejYy0UwxxrH/9+N2z5xu/if0J6qQmK92W0hW158wpJg+ovV3+wQ
14wvIEPRL2rocL0tKfAsVq1IawSJzSNgxG0lrcla3MrJBnZ4GaZDu4FutZh72MR3Gt
15JaAL3iTJHJD55kK2D/VoyY1djlsPuNh6AEgdVwFAyp0v
16-----END X509 CRL-----
diff --git a/src/lib/libssl/test/testenc b/src/lib/libssl/test/testenc
deleted file mode 100644
index 0656c7f525..0000000000
--- a/src/lib/libssl/test/testenc
+++ /dev/null
@@ -1,54 +0,0 @@
1#!/bin/sh
2
3testsrc=Makefile.ssl
4test=./p
5cmd=../apps/openssl
6
7cat $testsrc >$test;
8
9echo cat
10$cmd enc < $test > $test.cipher
11$cmd enc < $test.cipher >$test.clear
12cmp $test $test.clear
13if [ $? != 0 ]
14then
15 exit 1
16else
17 /bin/rm $test.cipher $test.clear
18fi
19echo base64
20$cmd enc -a -e < $test > $test.cipher
21$cmd enc -a -d < $test.cipher >$test.clear
22cmp $test $test.clear
23if [ $? != 0 ]
24then
25 exit 1
26else
27 /bin/rm $test.cipher $test.clear
28fi
29
30for i in `$cmd list-cipher-commands`
31do
32 echo $i
33 $cmd $i -bufsize 113 -e -k test < $test > $test.$i.cipher
34 $cmd $i -bufsize 157 -d -k test < $test.$i.cipher >$test.$i.clear
35 cmp $test $test.$i.clear
36 if [ $? != 0 ]
37 then
38 exit 1
39 else
40 /bin/rm $test.$i.cipher $test.$i.clear
41 fi
42
43 echo $i base64
44 $cmd $i -bufsize 113 -a -e -k test < $test > $test.$i.cipher
45 $cmd $i -bufsize 157 -a -d -k test < $test.$i.cipher >$test.$i.clear
46 cmp $test $test.$i.clear
47 if [ $? != 0 ]
48 then
49 exit 1
50 else
51 /bin/rm $test.$i.cipher $test.$i.clear
52 fi
53done
54rm -f $test
diff --git a/src/lib/libssl/test/testgen b/src/lib/libssl/test/testgen
deleted file mode 100644
index 55c496f4bc..0000000000
--- a/src/lib/libssl/test/testgen
+++ /dev/null
@@ -1,42 +0,0 @@
1#!/bin/sh
2
3T=testcert
4KEY=512
5CA=../certs/testca.pem
6
7/bin/rm -f $T.1 $T.2 $T.key
8
9if test "$OSTYPE" = msdosdjgpp; then
10 PATH=../apps\;$PATH;
11else
12 PATH=../apps:$PATH;
13fi
14export PATH
15
16echo "generating certificate request"
17
18echo "string to make the random number generator think it has entropy" >> ./.rnd
19
20if ../apps/openssl no-rsa; then
21 req_new='-newkey dsa:../apps/dsa512.pem'
22else
23 req_new='-new'
24 echo "There should be a 2 sequences of .'s and some +'s."
25 echo "There should not be more that at most 80 per line"
26fi
27
28echo "This could take some time."
29
30../apps/openssl req -config test.cnf $req_new -out testreq.pem
31if [ $? != 0 ]; then
32echo problems creating request
33exit 1
34fi
35
36../apps/openssl req -config test.cnf -verify -in testreq.pem -noout
37if [ $? != 0 ]; then
38echo signature on req is wrong
39exit 1
40fi
41
42exit 0
diff --git a/src/lib/libssl/test/testp7.pem b/src/lib/libssl/test/testp7.pem
deleted file mode 100644
index e5b7866c31..0000000000
--- a/src/lib/libssl/test/testp7.pem
+++ /dev/null
@@ -1,46 +0,0 @@
1-----BEGIN PKCS7-----
2MIIIGAYJKoZIhvcNAQcCoIIICTCCCAUCAQExADALBgkqhkiG9w0BBwGgggY8MIIE
3cjCCBBygAwIBAgIQeS+OJfWJUZAx6cX0eAiMjzANBgkqhkiG9w0BAQQFADBiMREw
4DwYDVQQHEwhJbnRlcm5ldDEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNDAyBgNV
5BAsTK1ZlcmlTaWduIENsYXNzIDEgQ0EgLSBJbmRpdmlkdWFsIFN1YnNjcmliZXIw
6HhcNOTYwNzE5MDAwMDAwWhcNOTcwMzMwMjM1OTU5WjCB1TERMA8GA1UEBxMISW50
7ZXJuZXQxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTQwMgYDVQQLEytWZXJpU2ln
8biBDbGFzcyAxIENBIC0gSW5kaXZpZHVhbCBTdWJzY3JpYmVyMSgwJgYDVQQLEx9E
9aWdpdGFsIElEIENsYXNzIDEgLSBTTUlNRSBUZXN0MUcwRQYDVQQLEz53d3cudmVy
10aXNpZ24uY29tL3JlcG9zaXRvcnkvQ1BTLTEuMCBJbmMuIGJ5IFJlZi4sTElBQi5M
11VEQoYyk5NjBbMA0GCSqGSIb3DQEBAQUAA0oAMEcCQA7LvHEIAiQ5+4gDYvJGnGAq
12UM5GXyG11diEXmIEZTHUZhorooX5sr8IIjSXiPY59YYUFSvAaharFM1xaBN8zNEC
13AwEAAaOCAjkwggI1MAkGA1UdEwQCMAAwggImBgNVHQMEggIdMIICGTCCAhUwggIR
14BgtghkgBhvhFAQcBATCCAgAWggGrVGhpcyBjZXJ0aWZpY2F0ZSBpbmNvcnBvcmF0
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-----
diff --git a/src/lib/libssl/test/testreq2.pem b/src/lib/libssl/test/testreq2.pem
deleted file mode 100644
index c3cdcffcbc..0000000000
--- a/src/lib/libssl/test/testreq2.pem
+++ /dev/null
@@ -1,7 +0,0 @@
1-----BEGIN CERTIFICATE REQUEST-----
2MIHaMIGFAgEAMA4xDDAKBgNVBAMTA2NuNDBcMA0GCSqGSIb3DQEBAQUAA0sAMEgC
3QQCQsnkyUGDY2R3mYoeTprFJKgWuJ3f1jUjlIuW5+wfAUoeMt35c4vcFZ2mIBpEG
4DtzkNQN1kr2O9ldm9zYnYhyhAgMBAAGgEjAQBgorBgEEAYI3AgEOMQIwADANBgkq
5hkiG9w0BAQQFAANBAAb2szZgVIxg3vK6kYLjGSBISyuzcXJ6IvuPW6M+yzi1Qgoi
6gQhazHTJp91T8ItZEzUJGZSZl2e5iXlnffWB+/U=
7-----END CERTIFICATE REQUEST-----
diff --git a/src/lib/libssl/test/testrsa.pem b/src/lib/libssl/test/testrsa.pem
deleted file mode 100644
index aad21067a8..0000000000
--- a/src/lib/libssl/test/testrsa.pem
+++ /dev/null
@@ -1,9 +0,0 @@
1-----BEGIN RSA PRIVATE KEY-----
2MIIBPAIBAAJBAKrbeqkuRk8VcRmWFmtP+LviMB3+6dizWW3DwaffznyHGAFwUJ/I
3Tv0XtbsCyl3QoyKGhrOAy3RvPK5M38iuXT0CAwEAAQJAZ3cnzaHXM/bxGaR5CR1R
4rD1qFBAVfoQFiOH9uPJgMaoAuoQEisPHVcZDKcOv4wEg6/TInAIXBnEigtqvRzuy
5oQIhAPcgZzUq3yVooAaoov8UbXPxqHlwo6GBMqnv20xzkf6ZAiEAsP4BnIaQTM8S
6mvcpHZwQJdmdHHkGKAs37Dfxi67HbkUCIQCeZGliHXFa071Fp06ZeWlR2ADonTZz
7rJBhdTe0v5pCeQIhAIZfkiGgGBX4cIuuckzEm43g9WMUjxP/0GlK39vIyihxAiEA
8mymehFRT0MvqW5xAKAx7Pgkt8HVKwVhc2LwGKHE0DZM=
9-----END RSA PRIVATE KEY-----
diff --git a/src/lib/libssl/test/testsid.pem b/src/lib/libssl/test/testsid.pem
deleted file mode 100644
index 7ffd008f66..0000000000
--- a/src/lib/libssl/test/testsid.pem
+++ /dev/null
@@ -1,12 +0,0 @@
1-----BEGIN SSL SESSION PARAMETERS-----
2MIIB1gIBAQIBAgQDAQCABBCi11xa5qkOP8xrr02K/NQCBBBkIYQZM0Bt95W0EHNV
3bA58oQYCBDIBr7WiBAICASyjggGGMIIBgjCCASwCAQMwDQYJKoZIhvcNAQEEBQAw
4ODELMAkGA1UEBhMCQVUxDDAKBgNVBAgTA1FMRDEbMBkGA1UEAxMSU1NMZWF5L3Jz
5YSB0ZXN0IENBMB4XDTk1MTAwOTIzMzEzNFoXDTk4MDcwNTIzMzEzNFowYDELMAkG
6A1UEBhMCQVUxDDAKBgNVBAgTA1FMRDEZMBcGA1UEChMQTWluY29tIFB0eS4gTHRk
7LjELMAkGA1UECxMCQ1MxGzAZBgNVBAMTElNTTGVheSBkZW1vIGNsaWVudDBcMA0G
8CSqGSIb3DQEBAQUAA0sAMEgCQQC4pcXEL1lgVA+B5Q3TcuW/O3LZHoA73IYm8oFD
9TezgCDhL2RTMn+seKWF36UtJKRIOBU9jZHCVVd0Me5ls6BEjAgMBAAEwDQYJKoZI
10hvcNAQEEBQADQQBoIpOcwUY1qlVF7j3ROSGvUsbvByOBFmYWkIBgsCqR+9qo1A7L
11CrWF5i8LWt/vLwAHaxWNx2YuBJMFyuK81fTvpA0EC3Rlc3Rjb250ZXh0
12-----END SSL SESSION PARAMETERS-----
diff --git a/src/lib/libssl/test/testss b/src/lib/libssl/test/testss
deleted file mode 100644
index 8d3557f356..0000000000
--- a/src/lib/libssl/test/testss
+++ /dev/null
@@ -1,99 +0,0 @@
1#!/bin/sh
2
3digest='-md5'
4reqcmd="../apps/openssl req"
5x509cmd="../apps/openssl x509 $digest"
6verifycmd="../apps/openssl verify"
7dummycnf="../apps/openssl.cnf"
8
9CAkey="keyCA.ss"
10CAcert="certCA.ss"
11CAreq="reqCA.ss"
12CAconf="CAss.cnf"
13CAreq2="req2CA.ss" # temp
14
15Uconf="Uss.cnf"
16Ukey="keyU.ss"
17Ureq="reqU.ss"
18Ucert="certU.ss"
19
20echo
21echo "make a certificate request using 'req'"
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
32if [ $? != 0 ]; then
33 echo "error using 'req' to generate a certificate request"
34 exit 1
35fi
36echo
37echo "convert the certificate request into a self signed certificate using 'x509'"
38$x509cmd -CAcreateserial -in $CAreq -days 30 -req -out $CAcert -signkey $CAkey >err.ss
39if [ $? != 0 ]; then
40 echo "error using 'x509' to self sign a certificate request"
41 exit 1
42fi
43
44echo
45echo "convert a certificate into a certificate request using 'x509'"
46$x509cmd -in $CAcert -x509toreq -signkey $CAkey -out $CAreq2 >err.ss
47if [ $? != 0 ]; then
48 echo "error using 'x509' convert a certificate to a certificate request"
49 exit 1
50fi
51
52$reqcmd -config $dummycnf -verify -in $CAreq -noout
53if [ $? != 0 ]; then
54 echo first generated request is invalid
55 exit 1
56fi
57
58$reqcmd -config $dummycnf -verify -in $CAreq2 -noout
59if [ $? != 0 ]; then
60 echo second generated request is invalid
61 exit 1
62fi
63
64$verifycmd -CAfile $CAcert $CAcert
65if [ $? != 0 ]; then
66 echo first generated cert is invalid
67 exit 1
68fi
69
70echo
71echo "make another certificate request using 'req'"
72$reqcmd -config $Uconf -out $Ureq -keyout $Ukey $req_new >err.ss
73if [ $? != 0 ]; then
74 echo "error using 'req' to generate a certificate request"
75 exit 1
76fi
77
78echo
79echo "sign certificate request with the just created CA via 'x509'"
80$x509cmd -CAcreateserial -in $Ureq -days 30 -req -out $Ucert -CA $CAcert -CAkey $CAkey >err.ss
81if [ $? != 0 ]; then
82 echo "error using 'x509' to sign a certificate request"
83 exit 1
84fi
85
86$verifycmd -CAfile $CAcert $Ucert
87echo
88echo "Certificate details"
89$x509cmd -subject -issuer -startdate -enddate -noout -in $Ucert
90
91echo
92echo The generated CA certificate is $CAcert
93echo The generated CA private key is $CAkey
94
95echo The generated user certificate is $Ucert
96echo The generated user private key is $Ukey
97
98/bin/rm err.ss
99exit 0
diff --git a/src/lib/libssl/test/testssl b/src/lib/libssl/test/testssl
deleted file mode 100644
index ba5e41c861..0000000000
--- a/src/lib/libssl/test/testssl
+++ /dev/null
@@ -1,137 +0,0 @@
1#!/bin/sh
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
35echo test sslv2
36$ssltest -ssl2 $extra || exit 1
37
38echo test sslv2 with server authentication
39$ssltest -ssl2 -server_auth $CA $extra || exit 1
40
41if [ $dsa_cert = NO ]; then
42 echo test sslv2 with client authentication
43 $ssltest -ssl2 -client_auth $CA $extra || exit 1
44
45 echo test sslv2 with both client and server authentication
46 $ssltest -ssl2 -server_auth -client_auth $CA $extra || exit 1
47fi
48
49echo test sslv3
50$ssltest -ssl3 $extra || exit 1
51
52echo test sslv3 with server authentication
53$ssltest -ssl3 -server_auth $CA $extra || exit 1
54
55echo test sslv3 with client authentication
56$ssltest -ssl3 -client_auth $CA $extra || exit 1
57
58echo test sslv3 with both client and server authentication
59$ssltest -ssl3 -server_auth -client_auth $CA $extra || exit 1
60
61echo test sslv2/sslv3
62$ssltest $extra || exit 1
63
64echo test sslv2/sslv3 with server authentication
65$ssltest -server_auth $CA $extra || exit 1
66
67echo test sslv2/sslv3 with client authentication
68$ssltest -client_auth $CA $extra || exit 1
69
70echo test sslv2/sslv3 with both client and server authentication
71$ssltest -server_auth -client_auth $CA $extra || exit 1
72
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
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/testx509.pem b/src/lib/libssl/test/testx509.pem
deleted file mode 100644
index 8a85d14964..0000000000
--- a/src/lib/libssl/test/testx509.pem
+++ /dev/null
@@ -1,10 +0,0 @@
1-----BEGIN CERTIFICATE-----
2MIIBWzCCAQYCARgwDQYJKoZIhvcNAQEEBQAwODELMAkGA1UEBhMCQVUxDDAKBgNV
3BAgTA1FMRDEbMBkGA1UEAxMSU1NMZWF5L3JzYSB0ZXN0IENBMB4XDTk1MDYxOTIz
4MzMxMloXDTk1MDcxNzIzMzMxMlowOjELMAkGA1UEBhMCQVUxDDAKBgNVBAgTA1FM
5RDEdMBsGA1UEAxMUU1NMZWF5L3JzYSB0ZXN0IGNlcnQwXDANBgkqhkiG9w0BAQEF
6AANLADBIAkEAqtt6qS5GTxVxGZYWa0/4u+IwHf7p2LNZbcPBp9/OfIcYAXBQn8hO
7/Re1uwLKXdCjIoaGs4DLdG88rkzfyK5dPQIDAQABMAwGCCqGSIb3DQIFBQADQQAE
8Wc7EcF8po2/ZO6kNCwK/ICH6DobgLekA5lSLr5EvuioZniZp5lFzAw4+YzPQ7XKJ
9zl9HYIMxATFyqSiD9jsx
10-----END CERTIFICATE-----
diff --git a/src/lib/libssl/test/times b/src/lib/libssl/test/times
deleted file mode 100644
index 49aeebf216..0000000000
--- a/src/lib/libssl/test/times
+++ /dev/null
@@ -1,113 +0,0 @@
1
2More number for the questions about SSL overheads....
3
4The following numbers were generated on a pentium pro 200, running linux.
5They give an indication of the SSL protocol and encryption overheads.
6
7The program that generated them is an unreleased version of ssl/ssltest.c
8which is the SSLeay ssl protocol testing program. It is a single process that
9talks both sides of the SSL protocol via a non-blocking memory buffer
10interface.
11
12How do I read this? The protocol and cipher are reasonable obvious.
13The next number is the number of connections being made. The next is the
14number of bytes exchanged bewteen the client and server side of the protocol.
15This is the number of bytes that the client sends to the server, and then
16the server sends back. Because this is all happening in one process,
17the data is being encrypted, decrypted, encrypted and then decrypted again.
18It is a round trip of that many bytes. Because the one process performs
19both the client and server sides of the protocol and it sends this many bytes
20each direction, multiply this number by 4 to generate the number
21of bytes encrypted/decrypted/MACed. The first time value is how many seconds
22elapsed doing a full SSL handshake, the second is the cost of one
23full handshake and the rest being session-id reuse.
24
25SSLv2 RC4-MD5 1000 x 1 12.83s 0.70s
26SSLv3 NULL-MD5 1000 x 1 14.35s 1.47s
27SSLv3 RC4-MD5 1000 x 1 14.46s 1.56s
28SSLv3 RC4-MD5 1000 x 1 51.93s 1.62s 1024bit RSA
29SSLv3 RC4-SHA 1000 x 1 14.61s 1.83s
30SSLv3 DES-CBC-SHA 1000 x 1 14.70s 1.89s
31SSLv3 DES-CBC3-SHA 1000 x 1 15.16s 2.16s
32
33SSLv2 RC4-MD5 1000 x 1024 13.72s 1.27s
34SSLv3 NULL-MD5 1000 x 1024 14.79s 1.92s
35SSLv3 RC4-MD5 1000 x 1024 52.58s 2.29s 1024bit RSA
36SSLv3 RC4-SHA 1000 x 1024 15.39s 2.67s
37SSLv3 DES-CBC-SHA 1000 x 1024 16.45s 3.55s
38SSLv3 DES-CBC3-SHA 1000 x 1024 18.21s 5.38s
39
40SSLv2 RC4-MD5 1000 x 10240 18.97s 6.52s
41SSLv3 NULL-MD5 1000 x 10240 17.79s 5.11s
42SSLv3 RC4-MD5 1000 x 10240 20.25s 7.90s
43SSLv3 RC4-MD5 1000 x 10240 58.26s 8.08s 1024bit RSA
44SSLv3 RC4-SHA 1000 x 10240 22.96s 11.44s
45SSLv3 DES-CBC-SHA 1000 x 10240 30.65s 18.41s
46SSLv3 DES-CBC3-SHA 1000 x 10240 47.04s 34.53s
47
48SSLv2 RC4-MD5 1000 x 102400 70.22s 57.74s
49SSLv3 NULL-MD5 1000 x 102400 43.73s 31.03s
50SSLv3 RC4-MD5 1000 x 102400 71.32s 58.83s
51SSLv3 RC4-MD5 1000 x 102400 109.66s 59.20s 1024bit RSA
52SSLv3 RC4-SHA 1000 x 102400 95.88s 82.21s
53SSLv3 DES-CBC-SHA 1000 x 102400 173.22s 160.55s
54SSLv3 DES-CBC3-SHA 1000 x 102400 336.61s 323.82s
55
56What does this all mean? Well for a server, with no session-id reuse, with
57a transfer size of 10240 bytes, using RC4-MD5 and a 512bit server key,
58a pentium pro 200 running linux can handle the SSLv3 protocol overheads of
59about 49 connections a second. Reality will be quite different :-).
60
61Remeber the first number is 1000 full ssl handshakes, the second is
621 full and 999 with session-id reuse. The RSA overheads for each exchange
63would be one public and one private operation, but the protocol/MAC/cipher
64cost would be quite similar in both the client and server.
65
66eric (adding numbers to speculation)
67
68--- Appendix ---
69- The time measured is user time but these number a very rough.
70- Remember this is the cost of both client and server sides of the protocol.
71- The TCP/kernal overhead of connection establishment is normally the
72 killer in SSL. Often delays in the TCP protocol will make session-id
73 reuse look slower that new sessions, but this would not be the case on
74 a loaded server.
75- The TCP round trip latencies, while slowing indervidual connections,
76 would have minimal impact on throughput.
77- Instead of sending one 102400 byte buffer, one 8k buffer is sent until
78- the required number of bytes are processed.
79- The SSLv3 connections were actually SSLv2 compatable SSLv3 headers.
80- A 512bit server key was being used except where noted.
81- No server key verification was being performed on the client side of the
82 protocol. This would slow things down very little.
83- The library being used is SSLeay 0.8.x.
84- The normal mesauring system was commands of the form
85 time ./ssltest -num 1000 -bytes 102400 -cipher DES-CBC-SHA -reuse
86 This modified version of ssltest should be in the next public release of
87 SSLeay.
88
89The general cipher performace number for this platform are
90
91SSLeay 0.8.2a 04-Sep-1997
92built on Fri Sep 5 17:37:05 EST 1997
93options:bn(64,32) md2(int) rc4(idx,int) des(ptr,risc1,16,long) idea(int) blowfish(ptr2)
94C flags:gcc -DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -m486 -Wall -Wuninitialized
95The 'numbers' are in 1000s of bytes per second processed.
96type 8 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
97md2 131.02k 368.41k 500.57k 549.21k 566.09k
98mdc2 535.60k 589.10k 595.88k 595.97k 594.54k
99md5 1801.53k 9674.77k 17484.03k 21849.43k 23592.96k
100sha 1261.63k 5533.25k 9285.63k 11187.88k 11913.90k
101sha1 1103.13k 4782.53k 7933.78k 9472.34k 10070.70k
102rc4 10722.53k 14443.93k 15215.79k 15299.24k 15219.59k
103des cbc 3286.57k 3827.73k 3913.39k 3931.82k 3926.70k
104des ede3 1443.50k 1549.08k 1561.17k 1566.38k 1564.67k
105idea cbc 2203.64k 2508.16k 2538.33k 2543.62k 2547.71k
106rc2 cbc 1430.94k 1511.59k 1524.82k 1527.13k 1523.33k
107blowfish cbc 4716.07k 5965.82k 6190.17k 6243.67k 6234.11k
108 sign verify
109rsa 512 bits 0.0100s 0.0011s
110rsa 1024 bits 0.0451s 0.0012s
111rsa 2048 bits 0.2605s 0.0086s
112rsa 4096 bits 1.6883s 0.0302s
113
diff --git a/src/lib/libssl/test/tpkcs7 b/src/lib/libssl/test/tpkcs7
deleted file mode 100644
index cf3bd9fadb..0000000000
--- a/src/lib/libssl/test/tpkcs7
+++ /dev/null
@@ -1,55 +0,0 @@
1#!/bin/sh
2
3if test "$OSTYPE" = msdosdjgpp; then
4 PATH=../apps\;$PATH
5else
6 PATH=../apps:$PATH
7fi
8export PATH
9
10cmd='../apps/openssl pkcs7'
11
12if [ "$1"x != "x" ]; then
13 t=$1
14else
15 t=testp7.pem
16fi
17
18echo testing pkcs7 conversions
19cp $t fff.p
20
21echo "p -> d"
22$cmd -in fff.p -inform p -outform d >f.d
23if [ $? != 0 ]; then exit 1; fi
24echo "p -> p"
25$cmd -in fff.p -inform p -outform p >f.p
26if [ $? != 0 ]; then exit 1; fi
27
28echo "d -> d"
29$cmd -in f.d -inform d -outform d >ff.d1
30if [ $? != 0 ]; then exit 1; fi
31echo "p -> d"
32$cmd -in f.p -inform p -outform d >ff.d3
33if [ $? != 0 ]; then exit 1; fi
34
35echo "d -> p"
36$cmd -in f.d -inform d -outform p >ff.p1
37if [ $? != 0 ]; then exit 1; fi
38echo "p -> p"
39$cmd -in f.p -inform p -outform p >ff.p3
40if [ $? != 0 ]; then exit 1; fi
41
42cmp fff.p f.p
43if [ $? != 0 ]; then exit 1; fi
44cmp fff.p ff.p1
45if [ $? != 0 ]; then exit 1; fi
46cmp fff.p ff.p3
47if [ $? != 0 ]; then exit 1; fi
48
49cmp f.p ff.p1
50if [ $? != 0 ]; then exit 1; fi
51cmp f.p ff.p3
52if [ $? != 0 ]; then exit 1; fi
53
54/bin/rm -f f.* ff.* fff.*
55exit 0
diff --git a/src/lib/libssl/test/tpkcs7d b/src/lib/libssl/test/tpkcs7d
deleted file mode 100644
index 18f9311b06..0000000000
--- a/src/lib/libssl/test/tpkcs7d
+++ /dev/null
@@ -1,48 +0,0 @@
1#!/bin/sh
2
3if test "$OSTYPE" = msdosdjgpp; then
4 PATH=../apps\;$PATH
5else
6 PATH=../apps:$PATH
7fi
8export PATH
9
10cmd='../apps/openssl pkcs7'
11
12if [ "$1"x != "x" ]; then
13 t=$1
14else
15 t=pkcs7-1.pem
16fi
17
18echo "testing pkcs7 conversions (2)"
19cp $t fff.p
20
21echo "p -> d"
22$cmd -in fff.p -inform p -outform d >f.d
23if [ $? != 0 ]; then exit 1; fi
24echo "p -> p"
25$cmd -in fff.p -inform p -outform p >f.p
26if [ $? != 0 ]; then exit 1; fi
27
28echo "d -> d"
29$cmd -in f.d -inform d -outform d >ff.d1
30if [ $? != 0 ]; then exit 1; fi
31echo "p -> d"
32$cmd -in f.p -inform p -outform d >ff.d3
33if [ $? != 0 ]; then exit 1; fi
34
35echo "d -> p"
36$cmd -in f.d -inform d -outform p >ff.p1
37if [ $? != 0 ]; then exit 1; fi
38echo "p -> p"
39$cmd -in f.p -inform p -outform p >ff.p3
40if [ $? != 0 ]; then exit 1; fi
41
42cmp f.p ff.p1
43if [ $? != 0 ]; then exit 1; fi
44cmp f.p ff.p3
45if [ $? != 0 ]; then exit 1; fi
46
47/bin/rm -f f.* ff.* fff.*
48exit 0
diff --git a/src/lib/libssl/test/treq b/src/lib/libssl/test/treq
deleted file mode 100644
index 47a8273cde..0000000000
--- a/src/lib/libssl/test/treq
+++ /dev/null
@@ -1,90 +0,0 @@
1#!/bin/sh
2
3if test "$OSTYPE" = msdosdjgpp; then
4 PATH=../apps\;$PATH
5else
6 PATH=../apps:$PATH
7fi
8export PATH
9
10cmd='../apps/openssl req -config ../apps/openssl.cnf'
11
12if [ "$1"x != "x" ]; then
13 t=$1
14else
15 t=testreq.pem
16fi
17
18if $cmd -in $t -inform p -noout -text | fgrep 'Unknown Public Key'; then
19 echo "skipping req conversion test for $t"
20 exit 0
21fi
22
23echo testing req conversions
24cp $t fff.p
25
26echo "p -> d"
27$cmd -in fff.p -inform p -outform d >f.d
28if [ $? != 0 ]; then exit 1; fi
29#echo "p -> t"
30#$cmd -in fff.p -inform p -outform t >f.t
31#if [ $? != 0 ]; then exit 1; fi
32echo "p -> p"
33$cmd -in fff.p -inform p -outform p >f.p
34if [ $? != 0 ]; then exit 1; fi
35
36echo "d -> d"
37$cmd -verify -in f.d -inform d -outform d >ff.d1
38if [ $? != 0 ]; then exit 1; fi
39#echo "t -> d"
40#$cmd -in f.t -inform t -outform d >ff.d2
41#if [ $? != 0 ]; then exit 1; fi
42echo "p -> d"
43$cmd -verify -in f.p -inform p -outform d >ff.d3
44if [ $? != 0 ]; then exit 1; fi
45
46#echo "d -> t"
47#$cmd -in f.d -inform d -outform t >ff.t1
48#if [ $? != 0 ]; then exit 1; fi
49#echo "t -> t"
50#$cmd -in f.t -inform t -outform t >ff.t2
51#if [ $? != 0 ]; then exit 1; fi
52#echo "p -> t"
53#$cmd -in f.p -inform p -outform t >ff.t3
54#if [ $? != 0 ]; then exit 1; fi
55
56echo "d -> p"
57$cmd -in f.d -inform d -outform p >ff.p1
58if [ $? != 0 ]; then exit 1; fi
59#echo "t -> p"
60#$cmd -in f.t -inform t -outform p >ff.p2
61#if [ $? != 0 ]; then exit 1; fi
62echo "p -> p"
63$cmd -in f.p -inform p -outform p >ff.p3
64if [ $? != 0 ]; then exit 1; fi
65
66cmp fff.p f.p
67if [ $? != 0 ]; then exit 1; fi
68cmp fff.p ff.p1
69if [ $? != 0 ]; then exit 1; fi
70#cmp fff.p ff.p2
71#if [ $? != 0 ]; then exit 1; fi
72cmp fff.p ff.p3
73if [ $? != 0 ]; then exit 1; fi
74
75#cmp f.t ff.t1
76#if [ $? != 0 ]; then exit 1; fi
77#cmp f.t ff.t2
78#if [ $? != 0 ]; then exit 1; fi
79#cmp f.t ff.t3
80#if [ $? != 0 ]; then exit 1; fi
81
82cmp f.p ff.p1
83if [ $? != 0 ]; then exit 1; fi
84#cmp f.p ff.p2
85#if [ $? != 0 ]; then exit 1; fi
86cmp f.p ff.p3
87if [ $? != 0 ]; then exit 1; fi
88
89/bin/rm -f f.* ff.* fff.*
90exit 0
diff --git a/src/lib/libssl/test/trsa b/src/lib/libssl/test/trsa
deleted file mode 100644
index 413e2ec0a0..0000000000
--- a/src/lib/libssl/test/trsa
+++ /dev/null
@@ -1,90 +0,0 @@
1#!/bin/sh
2
3if test "$OSTYPE" = msdosdjgpp; then
4 PATH=../apps\;$PATH
5else
6 PATH=../apps:$PATH
7fi
8export PATH
9
10if ../apps/openssl no-rsa; then
11 echo skipping rsa conversion test
12 exit 0
13fi
14
15cmd='../apps/openssl rsa'
16
17if [ "$1"x != "x" ]; then
18 t=$1
19else
20 t=testrsa.pem
21fi
22
23echo testing rsa conversions
24cp $t fff.p
25
26echo "p -> d"
27$cmd -in fff.p -inform p -outform d >f.d
28if [ $? != 0 ]; then exit 1; fi
29#echo "p -> t"
30#$cmd -in fff.p -inform p -outform t >f.t
31#if [ $? != 0 ]; then exit 1; fi
32echo "p -> p"
33$cmd -in fff.p -inform p -outform p >f.p
34if [ $? != 0 ]; then exit 1; fi
35
36echo "d -> d"
37$cmd -in f.d -inform d -outform d >ff.d1
38if [ $? != 0 ]; then exit 1; fi
39#echo "t -> d"
40#$cmd -in f.t -inform t -outform d >ff.d2
41#if [ $? != 0 ]; then exit 1; fi
42echo "p -> d"
43$cmd -in f.p -inform p -outform d >ff.d3
44if [ $? != 0 ]; then exit 1; fi
45
46#echo "d -> t"
47#$cmd -in f.d -inform d -outform t >ff.t1
48#if [ $? != 0 ]; then exit 1; fi
49#echo "t -> t"
50#$cmd -in f.t -inform t -outform t >ff.t2
51#if [ $? != 0 ]; then exit 1; fi
52#echo "p -> t"
53#$cmd -in f.p -inform p -outform t >ff.t3
54#if [ $? != 0 ]; then exit 1; fi
55
56echo "d -> p"
57$cmd -in f.d -inform d -outform p >ff.p1
58if [ $? != 0 ]; then exit 1; fi
59#echo "t -> p"
60#$cmd -in f.t -inform t -outform p >ff.p2
61#if [ $? != 0 ]; then exit 1; fi
62echo "p -> p"
63$cmd -in f.p -inform p -outform p >ff.p3
64if [ $? != 0 ]; then exit 1; fi
65
66cmp fff.p f.p
67if [ $? != 0 ]; then exit 1; fi
68cmp fff.p ff.p1
69if [ $? != 0 ]; then exit 1; fi
70#cmp fff.p ff.p2
71#if [ $? != 0 ]; then exit 1; fi
72cmp fff.p ff.p3
73if [ $? != 0 ]; then exit 1; fi
74
75#cmp f.t ff.t1
76#if [ $? != 0 ]; then exit 1; fi
77#cmp f.t ff.t2
78#if [ $? != 0 ]; then exit 1; fi
79#cmp f.t ff.t3
80#if [ $? != 0 ]; then exit 1; fi
81
82cmp f.p ff.p1
83if [ $? != 0 ]; then exit 1; fi
84#cmp f.p ff.p2
85#if [ $? != 0 ]; then exit 1; fi
86cmp f.p ff.p3
87if [ $? != 0 ]; then exit 1; fi
88
89/bin/rm -f f.* ff.* fff.*
90exit 0
diff --git a/src/lib/libssl/test/tsid b/src/lib/libssl/test/tsid
deleted file mode 100644
index 40a1dfa97c..0000000000
--- a/src/lib/libssl/test/tsid
+++ /dev/null
@@ -1,85 +0,0 @@
1#!/bin/sh
2
3if test "$OSTYPE" = msdosdjgpp; then
4 PATH=../apps\;$PATH
5else
6 PATH=../apps:$PATH
7fi
8export PATH
9
10cmd='../apps/openssl sess_id'
11
12if [ "$1"x != "x" ]; then
13 t=$1
14else
15 t=testsid.pem
16fi
17
18echo testing session-id conversions
19cp $t fff.p
20
21echo "p -> d"
22$cmd -in fff.p -inform p -outform d >f.d
23if [ $? != 0 ]; then exit 1; fi
24#echo "p -> t"
25#$cmd -in fff.p -inform p -outform t >f.t
26#if [ $? != 0 ]; then exit 1; fi
27echo "p -> p"
28$cmd -in fff.p -inform p -outform p >f.p
29if [ $? != 0 ]; then exit 1; fi
30
31echo "d -> d"
32$cmd -in f.d -inform d -outform d >ff.d1
33if [ $? != 0 ]; then exit 1; fi
34#echo "t -> d"
35#$cmd -in f.t -inform t -outform d >ff.d2
36#if [ $? != 0 ]; then exit 1; fi
37echo "p -> d"
38$cmd -in f.p -inform p -outform d >ff.d3
39if [ $? != 0 ]; then exit 1; fi
40
41#echo "d -> t"
42#$cmd -in f.d -inform d -outform t >ff.t1
43#if [ $? != 0 ]; then exit 1; fi
44#echo "t -> t"
45#$cmd -in f.t -inform t -outform t >ff.t2
46#if [ $? != 0 ]; then exit 1; fi
47#echo "p -> t"
48#$cmd -in f.p -inform p -outform t >ff.t3
49#if [ $? != 0 ]; then exit 1; fi
50
51echo "d -> p"
52$cmd -in f.d -inform d -outform p >ff.p1
53if [ $? != 0 ]; then exit 1; fi
54#echo "t -> p"
55#$cmd -in f.t -inform t -outform p >ff.p2
56#if [ $? != 0 ]; then exit 1; fi
57echo "p -> p"
58$cmd -in f.p -inform p -outform p >ff.p3
59if [ $? != 0 ]; then exit 1; fi
60
61cmp fff.p f.p
62if [ $? != 0 ]; then exit 1; fi
63cmp fff.p ff.p1
64if [ $? != 0 ]; then exit 1; fi
65#cmp fff.p ff.p2
66#if [ $? != 0 ]; then exit 1; fi
67cmp fff.p ff.p3
68if [ $? != 0 ]; then exit 1; fi
69
70#cmp f.t ff.t1
71#if [ $? != 0 ]; then exit 1; fi
72#cmp f.t ff.t2
73#if [ $? != 0 ]; then exit 1; fi
74#cmp f.t ff.t3
75#if [ $? != 0 ]; then exit 1; fi
76
77cmp f.p ff.p1
78if [ $? != 0 ]; then exit 1; fi
79#cmp f.p ff.p2
80#if [ $? != 0 ]; then exit 1; fi
81cmp f.p ff.p3
82if [ $? != 0 ]; then exit 1; fi
83
84/bin/rm -f f.* ff.* fff.*
85exit 0
diff --git a/src/lib/libssl/test/tx509 b/src/lib/libssl/test/tx509
deleted file mode 100644
index d380963abc..0000000000
--- a/src/lib/libssl/test/tx509
+++ /dev/null
@@ -1,85 +0,0 @@
1#!/bin/sh
2
3if test "$OSTYPE" = msdosdjgpp; then
4 PATH=../apps\;$PATH
5else
6 PATH=../apps:$PATH
7fi
8export PATH
9
10cmd='../apps/openssl x509'
11
12if [ "$1"x != "x" ]; then
13 t=$1
14else
15 t=testx509.pem
16fi
17
18echo testing X509 conversions
19cp $t fff.p
20
21echo "p -> d"
22$cmd -in fff.p -inform p -outform d >f.d
23if [ $? != 0 ]; then exit 1; fi
24echo "p -> n"
25$cmd -in fff.p -inform p -outform n >f.n
26if [ $? != 0 ]; then exit 1; fi
27echo "p -> p"
28$cmd -in fff.p -inform p -outform p >f.p
29if [ $? != 0 ]; then exit 1; fi
30
31echo "d -> d"
32$cmd -in f.d -inform d -outform d >ff.d1
33if [ $? != 0 ]; then exit 1; fi
34echo "n -> d"
35$cmd -in f.n -inform n -outform d >ff.d2
36if [ $? != 0 ]; then exit 1; fi
37echo "p -> d"
38$cmd -in f.p -inform p -outform d >ff.d3
39if [ $? != 0 ]; then exit 1; fi
40
41echo "d -> n"
42$cmd -in f.d -inform d -outform n >ff.n1
43if [ $? != 0 ]; then exit 1; fi
44echo "n -> n"
45$cmd -in f.n -inform n -outform n >ff.n2
46if [ $? != 0 ]; then exit 1; fi
47echo "p -> n"
48$cmd -in f.p -inform p -outform n >ff.n3
49if [ $? != 0 ]; then exit 1; fi
50
51echo "d -> p"
52$cmd -in f.d -inform d -outform p >ff.p1
53if [ $? != 0 ]; then exit 1; fi
54echo "n -> p"
55$cmd -in f.n -inform n -outform p >ff.p2
56if [ $? != 0 ]; then exit 1; fi
57echo "p -> p"
58$cmd -in f.p -inform p -outform p >ff.p3
59if [ $? != 0 ]; then exit 1; fi
60
61cmp fff.p f.p
62if [ $? != 0 ]; then exit 1; fi
63cmp fff.p ff.p1
64if [ $? != 0 ]; then exit 1; fi
65cmp fff.p ff.p2
66if [ $? != 0 ]; then exit 1; fi
67cmp fff.p ff.p3
68if [ $? != 0 ]; then exit 1; fi
69
70cmp f.n ff.n1
71if [ $? != 0 ]; then exit 1; fi
72cmp f.n ff.n2
73if [ $? != 0 ]; then exit 1; fi
74cmp f.n ff.n3
75if [ $? != 0 ]; then exit 1; fi
76
77cmp f.p ff.p1
78if [ $? != 0 ]; then exit 1; fi
79cmp f.p ff.p2
80if [ $? != 0 ]; then exit 1; fi
81cmp f.p ff.p3
82if [ $? != 0 ]; then exit 1; fi
83
84/bin/rm -f f.* ff.* fff.*
85exit 0
diff --git a/src/lib/libssl/test/v3-cert1.pem b/src/lib/libssl/test/v3-cert1.pem
deleted file mode 100644
index 0da253d5c3..0000000000
--- a/src/lib/libssl/test/v3-cert1.pem
+++ /dev/null
@@ -1,16 +0,0 @@
1-----BEGIN CERTIFICATE-----
2MIICjTCCAfigAwIBAgIEMaYgRzALBgkqhkiG9w0BAQQwRTELMAkGA1UEBhMCVVMx
3NjA0BgNVBAoTLU5hdGlvbmFsIEFlcm9uYXV0aWNzIGFuZCBTcGFjZSBBZG1pbmlz
4dHJhdGlvbjAmFxE5NjA1MjgxMzQ5MDUrMDgwMBcROTgwNTI4MTM0OTA1KzA4MDAw
5ZzELMAkGA1UEBhMCVVMxNjA0BgNVBAoTLU5hdGlvbmFsIEFlcm9uYXV0aWNzIGFu
6ZCBTcGFjZSBBZG1pbmlzdHJhdGlvbjEgMAkGA1UEBRMCMTYwEwYDVQQDEwxTdGV2
7ZSBTY2hvY2gwWDALBgkqhkiG9w0BAQEDSQAwRgJBALrAwyYdgxmzNP/ts0Uyf6Bp
8miJYktU/w4NG67ULaN4B5CnEz7k57s9o3YY3LecETgQ5iQHmkwlYDTL2fTgVfw0C
9AQOjgaswgagwZAYDVR0ZAQH/BFowWDBWMFQxCzAJBgNVBAYTAlVTMTYwNAYDVQQK
10Ey1OYXRpb25hbCBBZXJvbmF1dGljcyBhbmQgU3BhY2UgQWRtaW5pc3RyYXRpb24x
11DTALBgNVBAMTBENSTDEwFwYDVR0BAQH/BA0wC4AJODMyOTcwODEwMBgGA1UdAgQR
12MA8ECTgzMjk3MDgyM4ACBSAwDQYDVR0KBAYwBAMCBkAwCwYJKoZIhvcNAQEEA4GB
13AH2y1VCEw/A4zaXzSYZJTTUi3uawbbFiS2yxHvgf28+8Js0OHXk1H1w2d6qOHH21
14X82tZXd/0JtG0g1T9usFFBDvYK8O0ebgz/P5ELJnBL2+atObEuJy1ZZ0pBDWINR3
15WkDNLCGiTkCKp0F5EWIrVDwh54NNevkCQRZita+z4IBO
16-----END CERTIFICATE-----
diff --git a/src/lib/libssl/test/v3-cert2.pem b/src/lib/libssl/test/v3-cert2.pem
deleted file mode 100644
index de0723ff8d..0000000000
--- a/src/lib/libssl/test/v3-cert2.pem
+++ /dev/null
@@ -1,16 +0,0 @@
1-----BEGIN CERTIFICATE-----
2MIICiTCCAfKgAwIBAgIEMeZfHzANBgkqhkiG9w0BAQQFADB9MQswCQYDVQQGEwJD
3YTEPMA0GA1UEBxMGTmVwZWFuMR4wHAYDVQQLExVObyBMaWFiaWxpdHkgQWNjZXB0
4ZWQxHzAdBgNVBAoTFkZvciBEZW1vIFB1cnBvc2VzIE9ubHkxHDAaBgNVBAMTE0Vu
5dHJ1c3QgRGVtbyBXZWIgQ0EwHhcNOTYwNzEyMTQyMDE1WhcNOTYxMDEyMTQyMDE1
6WjB0MSQwIgYJKoZIhvcNAQkBExVjb29rZUBpc3NsLmF0bC5ocC5jb20xCzAJBgNV
7BAYTAlVTMScwJQYDVQQLEx5IZXdsZXR0IFBhY2thcmQgQ29tcGFueSAoSVNTTCkx
8FjAUBgNVBAMTDVBhdWwgQS4gQ29va2UwXDANBgkqhkiG9w0BAQEFAANLADBIAkEA
96ceSq9a9AU6g+zBwaL/yVmW1/9EE8s5you1mgjHnj0wAILuoB3L6rm6jmFRy7QZT
10G43IhVZdDua4e+5/n1ZslwIDAQABo2MwYTARBglghkgBhvhCAQEEBAMCB4AwTAYJ
11YIZIAYb4QgENBD8WPVRoaXMgY2VydGlmaWNhdGUgaXMgb25seSBpbnRlbmRlZCBm
12b3IgZGVtb25zdHJhdGlvbiBwdXJwb3Nlcy4wDQYJKoZIhvcNAQEEBQADgYEAi8qc
13F3zfFqy1sV8NhjwLVwOKuSfhR/Z8mbIEUeSTlnH3QbYt3HWZQ+vXI8mvtZoBc2Fz
14lexKeIkAZXCesqGbs6z6nCt16P6tmdfbZF3I3AWzLquPcOXjPf4HgstkyvVBn0Ap
15jAFN418KF/Cx4qyHB4cjdvLrRjjQLnb2+ibo7QU=
16-----END CERTIFICATE-----
diff --git a/src/lib/libssl/tls1.h b/src/lib/libssl/tls1.h
deleted file mode 100644
index 38838ea9a5..0000000000
--- a/src/lib/libssl/tls1.h
+++ /dev/null
@@ -1,195 +0,0 @@
1/* ssl/tls1.h */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#ifndef HEADER_TLS1_H
60#define HEADER_TLS1_H
61
62#include <openssl/buffer.h>
63
64#ifdef __cplusplus
65extern "C" {
66#endif
67
68#define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES 1
69
70#define TLS1_VERSION 0x0301
71#define TLS1_VERSION_MAJOR 0x03
72#define TLS1_VERSION_MINOR 0x01
73
74#define TLS1_AD_DECRYPTION_FAILED 21
75#define TLS1_AD_RECORD_OVERFLOW 22
76#define TLS1_AD_UNKNOWN_CA 48 /* fatal */
77#define TLS1_AD_ACCESS_DENIED 49 /* fatal */
78#define TLS1_AD_DECODE_ERROR 50 /* fatal */
79#define TLS1_AD_DECRYPT_ERROR 51
80#define TLS1_AD_EXPORT_RESTRICTION 60 /* fatal */
81#define TLS1_AD_PROTOCOL_VERSION 70 /* fatal */
82#define TLS1_AD_INSUFFICIENT_SECURITY 71 /* fatal */
83#define TLS1_AD_INTERNAL_ERROR 80 /* fatal */
84#define TLS1_AD_USER_CANCELLED 90
85#define TLS1_AD_NO_RENEGOTIATION 100
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 RFC3268 */
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
130/* AES ciphersuites from RFC3268 */
131#define TLS1_TXT_RSA_WITH_AES_128_SHA "AES128-SHA"
132#define TLS1_TXT_DH_DSS_WITH_AES_128_SHA "DH-DSS-AES128-SHA"
133#define TLS1_TXT_DH_RSA_WITH_AES_128_SHA "DH-RSA-AES128-SHA"
134#define TLS1_TXT_DHE_DSS_WITH_AES_128_SHA "DHE-DSS-AES128-SHA"
135#define TLS1_TXT_DHE_RSA_WITH_AES_128_SHA "DHE-RSA-AES128-SHA"
136#define TLS1_TXT_ADH_WITH_AES_128_SHA "ADH-AES128-SHA"
137
138#define TLS1_TXT_RSA_WITH_AES_256_SHA "AES256-SHA"
139#define TLS1_TXT_DH_DSS_WITH_AES_256_SHA "DH-DSS-AES256-SHA"
140#define TLS1_TXT_DH_RSA_WITH_AES_256_SHA "DH-RSA-AES256-SHA"
141#define TLS1_TXT_DHE_DSS_WITH_AES_256_SHA "DHE-DSS-AES256-SHA"
142#define TLS1_TXT_DHE_RSA_WITH_AES_256_SHA "DHE-RSA-AES256-SHA"
143#define TLS1_TXT_ADH_WITH_AES_256_SHA "ADH-AES256-SHA"
144
145
146#define TLS_CT_RSA_SIGN 1
147#define TLS_CT_DSS_SIGN 2
148#define TLS_CT_RSA_FIXED_DH 3
149#define TLS_CT_DSS_FIXED_DH 4
150#define TLS_CT_NUMBER 4
151
152#define TLS1_FINISH_MAC_LENGTH 12
153
154#define TLS_MD_MAX_CONST_SIZE 20
155#define TLS_MD_CLIENT_FINISH_CONST "client finished"
156#define TLS_MD_CLIENT_FINISH_CONST_SIZE 15
157#define TLS_MD_SERVER_FINISH_CONST "server finished"
158#define TLS_MD_SERVER_FINISH_CONST_SIZE 15
159#define TLS_MD_SERVER_WRITE_KEY_CONST "server write key"
160#define TLS_MD_SERVER_WRITE_KEY_CONST_SIZE 16
161#define TLS_MD_KEY_EXPANSION_CONST "key expansion"
162#define TLS_MD_KEY_EXPANSION_CONST_SIZE 13
163#define TLS_MD_CLIENT_WRITE_KEY_CONST "client write key"
164#define TLS_MD_CLIENT_WRITE_KEY_CONST_SIZE 16
165#define TLS_MD_SERVER_WRITE_KEY_CONST "server write key"
166#define TLS_MD_SERVER_WRITE_KEY_CONST_SIZE 16
167#define TLS_MD_IV_BLOCK_CONST "IV block"
168#define TLS_MD_IV_BLOCK_CONST_SIZE 8
169#define TLS_MD_MASTER_SECRET_CONST "master secret"
170#define TLS_MD_MASTER_SECRET_CONST_SIZE 13
171
172#ifdef CHARSET_EBCDIC
173#undef TLS_MD_CLIENT_FINISH_CONST
174#define TLS_MD_CLIENT_FINISH_CONST "\x63\x6c\x69\x65\x6e\x74\x20\x66\x69\x6e\x69\x73\x68\x65\x64" /*client finished*/
175#undef TLS_MD_SERVER_FINISH_CONST
176#define TLS_MD_SERVER_FINISH_CONST "\x73\x65\x72\x76\x65\x72\x20\x66\x69\x6e\x69\x73\x68\x65\x64" /*server finished*/
177#undef TLS_MD_SERVER_WRITE_KEY_CONST
178#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*/
179#undef TLS_MD_KEY_EXPANSION_CONST
180#define TLS_MD_KEY_EXPANSION_CONST "\x6b\x65\x79\x20\x65\x78\x70\x61\x6e\x73\x69\x6f\x6e" /*key expansion*/
181#undef TLS_MD_CLIENT_WRITE_KEY_CONST
182#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*/
183#undef TLS_MD_SERVER_WRITE_KEY_CONST
184#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*/
185#undef TLS_MD_IV_BLOCK_CONST
186#define TLS_MD_IV_BLOCK_CONST "\x49\x56\x20\x62\x6c\x6f\x63\x6b" /*IV block*/
187#undef TLS_MD_MASTER_SECRET_CONST
188#define TLS_MD_MASTER_SECRET_CONST "\x6d\x61\x73\x74\x65\x72\x20\x73\x65\x63\x72\x65\x74" /*master secret*/
189#endif
190
191#ifdef __cplusplus
192}
193#endif
194#endif
195