blob: 3687862b70680ff7e37b5ca41b2979a6faf30f58 [file] [log] [blame]
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001/* ssl/s3_lib.c */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003 * 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 "objects.h"
61#include "ssl_locl.h"
62
Ralf S. Engelschall9cb09691998-12-31 09:36:40 +000063char *ssl3_version_str="SSLv3 part of OpenSSL 0.9.2 31-Dec-1998";
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000064
65#define SSL3_NUM_CIPHERS (sizeof(ssl3_ciphers)/sizeof(SSL_CIPHER))
66
67#ifndef NOPROTO
68static long ssl3_default_timeout(void );
69#else
70static long ssl3_default_timeout();
71#endif
72
73SSL_CIPHER ssl3_ciphers[]={
74/* The RSA ciphers */
75/* Cipher 01 */
76 {
77 1,
78 SSL3_TXT_RSA_NULL_MD5,
79 SSL3_CK_RSA_NULL_MD5,
Ben Lauriea040ea81999-02-21 20:07:41 +000080 SSL_kRSA|SSL_aRSA|SSL_eNULL |SSL_MD5|SSL_NOT_EXP|SSL_SSLV3,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000081 0,
82 SSL_ALL_CIPHERS,
83 },
84/* Cipher 02 */
85 {
86 1,
87 SSL3_TXT_RSA_NULL_SHA,
88 SSL3_CK_RSA_NULL_SHA,
Ben Lauriea040ea81999-02-21 20:07:41 +000089 SSL_kRSA|SSL_aRSA|SSL_eNULL |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000090 0,
91 SSL_ALL_CIPHERS,
92 },
93
94/* anon DH */
95/* Cipher 17 */
96 {
97 1,
98 SSL3_TXT_ADH_RC4_40_MD5,
99 SSL3_CK_ADH_RC4_40_MD5,
Ben Laurie06ab81f1999-02-21 20:03:24 +0000100 SSL_kEDH |SSL_aNULL|SSL_RC4 |SSL_MD5 |SSL_EXP40|SSL_SSLV3,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000101 0,
102 SSL_ALL_CIPHERS,
103 },
104/* Cipher 18 */
105 {
106 1,
107 SSL3_TXT_ADH_RC4_128_MD5,
108 SSL3_CK_ADH_RC4_128_MD5,
Ben Lauriea040ea81999-02-21 20:07:41 +0000109 SSL_kEDH |SSL_aNULL|SSL_RC4 |SSL_MD5|SSL_NOT_EXP|SSL_SSLV3,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000110 0,
111 SSL_ALL_CIPHERS,
112 },
113/* Cipher 19 */
114 {
115 1,
116 SSL3_TXT_ADH_DES_40_CBC_SHA,
117 SSL3_CK_ADH_DES_40_CBC_SHA,
Ben Laurie06ab81f1999-02-21 20:03:24 +0000118 SSL_kEDH |SSL_aNULL|SSL_DES|SSL_SHA1|SSL_EXP40|SSL_SSLV3,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000119 0,
120 SSL_ALL_CIPHERS,
121 },
122/* Cipher 1A */
123 {
124 1,
125 SSL3_TXT_ADH_DES_64_CBC_SHA,
126 SSL3_CK_ADH_DES_64_CBC_SHA,
Ben Lauriea040ea81999-02-21 20:07:41 +0000127 SSL_kEDH |SSL_aNULL|SSL_DES |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000128 0,
129 SSL_ALL_CIPHERS,
130 },
131/* Cipher 1B */
132 {
133 1,
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000134 SSL3_TXT_ADH_DES_192_CBC_SHA,
135 SSL3_CK_ADH_DES_192_CBC_SHA,
Ben Lauriea040ea81999-02-21 20:07:41 +0000136 SSL_kEDH |SSL_aNULL|SSL_3DES |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000137 0,
138 SSL_ALL_CIPHERS,
139 },
140
141/* RSA again */
142/* Cipher 03 */
143 {
144 1,
145 SSL3_TXT_RSA_RC4_40_MD5,
146 SSL3_CK_RSA_RC4_40_MD5,
Ben Laurie06ab81f1999-02-21 20:03:24 +0000147 SSL_kRSA|SSL_aRSA|SSL_RC4 |SSL_MD5 |SSL_EXP40|SSL_SSLV3,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000148 0,
149 SSL_ALL_CIPHERS,
150 },
151/* Cipher 04 */
152 {
153 1,
154 SSL3_TXT_RSA_RC4_128_MD5,
155 SSL3_CK_RSA_RC4_128_MD5,
Ben Lauriea040ea81999-02-21 20:07:41 +0000156 SSL_kRSA|SSL_aRSA|SSL_RC4 |SSL_MD5|SSL_NOT_EXP|SSL_SSLV3|SSL_MEDIUM,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000157 0,
158 SSL_ALL_CIPHERS,
159 },
160/* Cipher 05 */
161 {
162 1,
163 SSL3_TXT_RSA_RC4_128_SHA,
164 SSL3_CK_RSA_RC4_128_SHA,
Ben Lauriea040ea81999-02-21 20:07:41 +0000165 SSL_kRSA|SSL_aRSA|SSL_RC4 |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3|SSL_MEDIUM,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000166 0,
167 SSL_ALL_CIPHERS,
168 },
169/* Cipher 06 */
170 {
171 1,
172 SSL3_TXT_RSA_RC2_40_MD5,
173 SSL3_CK_RSA_RC2_40_MD5,
Ben Laurie06ab81f1999-02-21 20:03:24 +0000174 SSL_kRSA|SSL_aRSA|SSL_RC2 |SSL_MD5 |SSL_EXP40|SSL_SSLV3,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000175 0,
176 SSL_ALL_CIPHERS,
177 },
178/* Cipher 07 */
179 {
180 1,
181 SSL3_TXT_RSA_IDEA_128_SHA,
182 SSL3_CK_RSA_IDEA_128_SHA,
Ben Lauriea040ea81999-02-21 20:07:41 +0000183 SSL_kRSA|SSL_aRSA|SSL_IDEA |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3|SSL_MEDIUM,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000184 0,
185 SSL_ALL_CIPHERS,
186 },
187/* Cipher 08 */
188 {
189 1,
190 SSL3_TXT_RSA_DES_40_CBC_SHA,
191 SSL3_CK_RSA_DES_40_CBC_SHA,
Ben Laurie06ab81f1999-02-21 20:03:24 +0000192 SSL_kRSA|SSL_aRSA|SSL_DES|SSL_SHA1|SSL_EXP40|SSL_SSLV3,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000193 0,
194 SSL_ALL_CIPHERS,
195 },
196/* Cipher 09 */
197 {
198 1,
199 SSL3_TXT_RSA_DES_64_CBC_SHA,
200 SSL3_CK_RSA_DES_64_CBC_SHA,
Ben Lauriea040ea81999-02-21 20:07:41 +0000201 SSL_kRSA|SSL_aRSA|SSL_DES |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3|SSL_LOW,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000202 0,
203 SSL_ALL_CIPHERS,
204 },
205/* Cipher 0A */
206 {
207 1,
208 SSL3_TXT_RSA_DES_192_CBC3_SHA,
209 SSL3_CK_RSA_DES_192_CBC3_SHA,
Ben Lauriea040ea81999-02-21 20:07:41 +0000210 SSL_kRSA|SSL_aRSA|SSL_3DES |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3|SSL_HIGH,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000211 0,
212 SSL_ALL_CIPHERS,
213 },
214
215/* The DH ciphers */
216/* Cipher 0B */
217 {
218 0,
219 SSL3_TXT_DH_DSS_DES_40_CBC_SHA,
220 SSL3_CK_DH_DSS_DES_40_CBC_SHA,
Ben Laurie06ab81f1999-02-21 20:03:24 +0000221 SSL_kDHd |SSL_aDH|SSL_DES|SSL_SHA1|SSL_EXP40|SSL_SSLV3,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000222 0,
223 SSL_ALL_CIPHERS,
224 },
225/* Cipher 0C */
226 {
227 0,
228 SSL3_TXT_DH_DSS_DES_64_CBC_SHA,
229 SSL3_CK_DH_DSS_DES_64_CBC_SHA,
Ben Lauriea040ea81999-02-21 20:07:41 +0000230 SSL_kDHd |SSL_aDH|SSL_DES |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3|SSL_LOW,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000231 0,
232 SSL_ALL_CIPHERS,
233 },
234/* Cipher 0D */
235 {
236 0,
237 SSL3_TXT_DH_DSS_DES_192_CBC3_SHA,
238 SSL3_CK_DH_DSS_DES_192_CBC3_SHA,
Ben Lauriea040ea81999-02-21 20:07:41 +0000239 SSL_kDHd |SSL_aDH|SSL_3DES |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3|SSL_HIGH,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000240 0,
241 SSL_ALL_CIPHERS,
242 },
243/* Cipher 0E */
244 {
245 0,
246 SSL3_TXT_DH_RSA_DES_40_CBC_SHA,
247 SSL3_CK_DH_RSA_DES_40_CBC_SHA,
Ben Laurie06ab81f1999-02-21 20:03:24 +0000248 SSL_kDHr |SSL_aDH|SSL_DES|SSL_SHA1|SSL_EXP40|SSL_SSLV3,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000249 0,
250 SSL_ALL_CIPHERS,
251 },
252/* Cipher 0F */
253 {
254 0,
255 SSL3_TXT_DH_RSA_DES_64_CBC_SHA,
256 SSL3_CK_DH_RSA_DES_64_CBC_SHA,
Ben Lauriea040ea81999-02-21 20:07:41 +0000257 SSL_kDHr |SSL_aDH|SSL_DES |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3|SSL_LOW,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000258 0,
259 SSL_ALL_CIPHERS,
260 },
261/* Cipher 10 */
262 {
263 0,
264 SSL3_TXT_DH_RSA_DES_192_CBC3_SHA,
265 SSL3_CK_DH_RSA_DES_192_CBC3_SHA,
Ben Lauriea040ea81999-02-21 20:07:41 +0000266 SSL_kDHr |SSL_aDH|SSL_3DES |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3|SSL_HIGH,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000267 0,
268 SSL_ALL_CIPHERS,
269 },
270
271/* The Ephemeral DH ciphers */
272/* Cipher 11 */
273 {
274 1,
275 SSL3_TXT_EDH_DSS_DES_40_CBC_SHA,
276 SSL3_CK_EDH_DSS_DES_40_CBC_SHA,
Ben Laurie06ab81f1999-02-21 20:03:24 +0000277 SSL_kEDH|SSL_aDSS|SSL_DES|SSL_SHA1|SSL_EXP40|SSL_SSLV3,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000278 0,
279 SSL_ALL_CIPHERS,
280 },
281/* Cipher 12 */
282 {
283 1,
284 SSL3_TXT_EDH_DSS_DES_64_CBC_SHA,
285 SSL3_CK_EDH_DSS_DES_64_CBC_SHA,
Ben Lauriea040ea81999-02-21 20:07:41 +0000286 SSL_kEDH|SSL_aDSS|SSL_DES |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3|SSL_LOW,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000287 0,
288 SSL_ALL_CIPHERS,
289 },
290/* Cipher 13 */
291 {
292 1,
293 SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA,
294 SSL3_CK_EDH_DSS_DES_192_CBC3_SHA,
Ben Lauriea040ea81999-02-21 20:07:41 +0000295 SSL_kEDH|SSL_aDSS|SSL_3DES |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3|SSL_HIGH,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000296 0,
297 SSL_ALL_CIPHERS,
298 },
299/* Cipher 14 */
300 {
301 1,
302 SSL3_TXT_EDH_RSA_DES_40_CBC_SHA,
303 SSL3_CK_EDH_RSA_DES_40_CBC_SHA,
Ben Laurie06ab81f1999-02-21 20:03:24 +0000304 SSL_kEDH|SSL_aRSA|SSL_DES|SSL_SHA1|SSL_EXP40|SSL_SSLV3,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000305 0,
306 SSL_ALL_CIPHERS,
307 },
308/* Cipher 15 */
309 {
310 1,
311 SSL3_TXT_EDH_RSA_DES_64_CBC_SHA,
312 SSL3_CK_EDH_RSA_DES_64_CBC_SHA,
Ben Lauriea040ea81999-02-21 20:07:41 +0000313 SSL_kEDH|SSL_aRSA|SSL_DES |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3|SSL_LOW,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000314 0,
315 SSL_ALL_CIPHERS,
316 },
317/* Cipher 16 */
318 {
319 1,
320 SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA,
321 SSL3_CK_EDH_RSA_DES_192_CBC3_SHA,
Ben Lauriea040ea81999-02-21 20:07:41 +0000322 SSL_kEDH|SSL_aRSA|SSL_3DES |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3|SSL_HIGH,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000323 0,
324 SSL_ALL_CIPHERS,
325 },
326
327/* Fortezza */
328/* Cipher 1C */
329 {
330 0,
331 SSL3_TXT_FZA_DMS_NULL_SHA,
332 SSL3_CK_FZA_DMS_NULL_SHA,
Ben Lauriea040ea81999-02-21 20:07:41 +0000333 SSL_kFZA|SSL_aFZA |SSL_eNULL |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000334 0,
335 SSL_ALL_CIPHERS,
336 },
337
338/* Cipher 1D */
339 {
340 0,
341 SSL3_TXT_FZA_DMS_FZA_SHA,
342 SSL3_CK_FZA_DMS_FZA_SHA,
Ben Lauriea040ea81999-02-21 20:07:41 +0000343 SSL_kFZA|SSL_aFZA |SSL_eFZA |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000344 0,
345 SSL_ALL_CIPHERS,
346 },
347
348/* Cipher 1E */
349 {
350 0,
351 SSL3_TXT_FZA_DMS_RC4_SHA,
352 SSL3_CK_FZA_DMS_RC4_SHA,
Ben Lauriea040ea81999-02-21 20:07:41 +0000353 SSL_kFZA|SSL_aFZA |SSL_RC4 |SSL_SHA1|SSL_NOT_EXP|SSL_SSLV3,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000354 0,
355 SSL_ALL_CIPHERS,
356 },
357
Ben Laurie06ab81f1999-02-21 20:03:24 +0000358 /* New TLS Export CipherSuites */
359 /* Cipher 60 */
360 {
361 1,
362 TLS1_TXT_RSA_EXPORT56_WITH_RC4_56_MD5,
363 TLS1_CK_RSA_EXPORT56_WITH_RC4_56_MD5,
364 SSL_kRSA|SSL_aRSA|SSL_RC4|SSL_MD5|SSL_EXP56|SSL_TLSV1,
365 0,
366 SSL_ALL_CIPHERS
367 },
368 /* Cipher 61 */
369 {
370 1,
371 TLS1_TXT_RSA_EXPORT56_WITH_RC2_CBC_56_MD5,
372 TLS1_CK_RSA_EXPORT56_WITH_RC2_CBC_56_MD5,
373 SSL_kRSA|SSL_aRSA|SSL_RC2|SSL_MD5|SSL_EXP56|SSL_TLSV1,
374 0,
375 SSL_ALL_CIPHERS
376 },
377 /* Cipher 62 */
378 {
379 1,
380 TLS1_TXT_RSA_EXPORT56_WITH_DES_CBC_SHA,
381 TLS1_CK_RSA_EXPORT56_WITH_DES_CBC_SHA,
382 SSL_kRSA|SSL_aRSA|SSL_DES|SSL_SHA|SSL_EXP56|SSL_TLSV1,
383 0,
384 SSL_ALL_CIPHERS
385 },
386
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000387/* end of list */
388 };
389
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000390static SSL3_ENC_METHOD SSLv3_enc_data={
391 ssl3_enc,
392 ssl3_mac,
393 ssl3_setup_key_block,
394 ssl3_generate_master_secret,
395 ssl3_change_cipher_state,
396 ssl3_final_finish_mac,
397 MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH,
398 ssl3_cert_verify_mac,
399 SSL3_MD_CLIENT_FINISHED_CONST,4,
400 SSL3_MD_SERVER_FINISHED_CONST,4,
401 ssl3_alert_code,
402 };
403
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000404static SSL_METHOD SSLv3_data= {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000405 SSL3_VERSION,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000406 ssl3_new,
407 ssl3_clear,
408 ssl3_free,
409 ssl_undefined_function,
410 ssl_undefined_function,
411 ssl3_read,
412 ssl3_peek,
413 ssl3_write,
414 ssl3_shutdown,
415 ssl3_renegotiate,
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000416 ssl3_renegotiate_check,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000417 ssl3_ctrl,
418 ssl3_ctx_ctrl,
419 ssl3_get_cipher_by_char,
420 ssl3_put_cipher_by_char,
421 ssl3_pending,
422 ssl3_num_ciphers,
423 ssl3_get_cipher,
424 ssl_bad_method,
425 ssl3_default_timeout,
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000426 &SSLv3_enc_data,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000427 };
428
429static long ssl3_default_timeout()
430 {
431 /* 2 hours, the 24 hours mentioned in the SSLv3 spec
432 * is way too long for http, the cache would over fill */
433 return(60*60*2);
434 }
435
436SSL_METHOD *sslv3_base_method()
437 {
438 return(&SSLv3_data);
439 }
440
441int ssl3_num_ciphers()
442 {
443 return(SSL3_NUM_CIPHERS);
444 }
445
446SSL_CIPHER *ssl3_get_cipher(u)
447unsigned int u;
448 {
449 if (u < SSL3_NUM_CIPHERS)
450 return(&(ssl3_ciphers[SSL3_NUM_CIPHERS-1-u]));
451 else
452 return(NULL);
453 }
454
455/* The problem is that it may not be the correct record type */
456int ssl3_pending(s)
457SSL *s;
458 {
459 return(s->s3->rrec.length);
460 }
461
462int ssl3_new(s)
463SSL *s;
464 {
465 SSL3_CTX *s3;
466
467 if ((s3=(SSL3_CTX *)Malloc(sizeof(SSL3_CTX))) == NULL) goto err;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000468 memset(s3,0,sizeof(SSL3_CTX));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000469
470 s->s3=s3;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000471 /*
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000472 s->s3->tmp.ca_names=NULL;
473 s->s3->tmp.key_block=NULL;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000474 s->s3->tmp.key_block_length=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000475 s->s3->rbuf.buf=NULL;
476 s->s3->wbuf.buf=NULL;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000477 */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000478
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000479 s->method->ssl_clear(s);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000480 return(1);
481err:
482 return(0);
483 }
484
485void ssl3_free(s)
486SSL *s;
487 {
Ben Lauriee03ddfa1999-01-07 19:15:59 +0000488 if(s == NULL)
489 return;
490
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000491 ssl3_cleanup_key_block(s);
492 if (s->s3->rbuf.buf != NULL)
493 Free(s->s3->rbuf.buf);
494 if (s->s3->wbuf.buf != NULL)
495 Free(s->s3->wbuf.buf);
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000496 if (s->s3->rrec.comp != NULL)
497 Free(s->s3->rrec.comp);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000498#ifndef NO_DH
499 if (s->s3->tmp.dh != NULL)
500 DH_free(s->s3->tmp.dh);
501#endif
502 if (s->s3->tmp.ca_names != NULL)
503 sk_pop_free(s->s3->tmp.ca_names,X509_NAME_free);
504 memset(s->s3,0,sizeof(SSL3_CTX));
505 Free(s->s3);
506 s->s3=NULL;
507 }
508
509void ssl3_clear(s)
510SSL *s;
511 {
512 unsigned char *rp,*wp;
513
514 ssl3_cleanup_key_block(s);
515 if (s->s3->tmp.ca_names != NULL)
516 sk_pop_free(s->s3->tmp.ca_names,X509_NAME_free);
517
Mark J. Cox413c4f41999-02-16 09:22:21 +0000518 if (s->s3->rrec.comp != NULL)
519 {
520 Free(s->s3->rrec.comp);
521 s->s3->rrec.comp=NULL;
522 }
523
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000524 rp=s->s3->rbuf.buf;
525 wp=s->s3->wbuf.buf;
526
527 memset(s->s3,0,sizeof(SSL3_CTX));
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000528 if (rp != NULL) s->s3->rbuf.buf=rp;
529 if (wp != NULL) s->s3->wbuf.buf=wp;
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000530
Mark J. Cox413c4f41999-02-16 09:22:21 +0000531 ssl_free_wbio_buffer(s);
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000532
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000533 s->packet_length=0;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000534 s->s3->renegotiate=0;
535 s->s3->total_renegotiations=0;
536 s->s3->num_renegotiations=0;
537 s->s3->in_read_app_data=0;
538 s->version=SSL3_VERSION;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000539 }
540
541long ssl3_ctrl(s,cmd,larg,parg)
542SSL *s;
543int cmd;
544long larg;
545char *parg;
546 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000547 int ret=0;
548
Ralf S. Engelschall15d21c21999-02-25 14:40:29 +0000549#if !defined(NO_DSA) || !defined(NO_RSA)
550 if (
551#ifndef NO_RSA
552 cmd == SSL_CTRL_SET_TMP_RSA ||
553 cmd == SSL_CTRL_SET_TMP_RSA_CB ||
554#endif
555#ifndef NO_DSA
556 cmd == SSL_CTRL_SET_TMP_DH ||
557 cmd == SSL_CTRL_SET_TMP_DH_CB ||
558#endif
559 0)
560 {
561 if (!ssl_cert_instantiate(&s->cert, s->ctx->default_cert))
562 {
563 SSLerr(SSL_F_SSL3_CTRL, ERR_R_MALLOC_FAILURE);
564 return(0);
565 }
566 }
567#endif
568
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000569 switch (cmd)
570 {
571 case SSL_CTRL_GET_SESSION_REUSED:
572 ret=s->hit;
573 break;
574 case SSL_CTRL_GET_CLIENT_CERT_REQUEST:
575 break;
576 case SSL_CTRL_GET_NUM_RENEGOTIATIONS:
577 ret=s->s3->num_renegotiations;
578 break;
579 case SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS:
580 ret=s->s3->num_renegotiations;
581 s->s3->num_renegotiations=0;
582 break;
583 case SSL_CTRL_GET_TOTAL_RENEGOTIATIONS:
584 ret=s->s3->total_renegotiations;
585 break;
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000586 case SSL_CTRL_GET_FLAGS:
Ralf S. Engelschall651d0af1998-12-22 15:04:48 +0000587 ret=(int)(s->s3->flags);
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000588 break;
Ralf S. Engelschall15d21c21999-02-25 14:40:29 +0000589#ifndef NO_RSA
590 case SSL_CTRL_NEED_TMP_RSA:
591 if ((s->cert != NULL) && (s->cert->rsa_tmp == NULL) &&
592 ((s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL) ||
593 (EVP_PKEY_size(s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey) > (512/8))))
594 ret = 1;
595 break;
596 case SSL_CTRL_SET_TMP_RSA:
597 {
598 RSA *rsa = (RSA *)parg;
599 if (rsa == NULL) {
600 SSLerr(SSL_F_SSL3_CTRL, ERR_R_PASSED_NULL_PARAMETER);
601 return(ret);
602 }
603 if ((rsa = RSAPrivateKey_dup(rsa)) == NULL) {
604 SSLerr(SSL_F_SSL3_CTRL, ERR_R_RSA_LIB);
605 return(ret);
606 }
607 if (s->cert->rsa_tmp != NULL)
608 RSA_free(s->cert->rsa_tmp);
609 s->cert->rsa_tmp = rsa;
610 ret = 1;
611 }
612 break;
613 case SSL_CTRL_SET_TMP_RSA_CB:
614#ifndef NOPROTO
615 s->cert->rsa_tmp_cb = (RSA *(*)(SSL *, int, int))parg;
616#else
617 s->cert->rsa_tmp_cb = (RSA *(*)())parg;
618#endif
619 break;
620#endif
621#ifndef NO_DH
622 case SSL_CTRL_SET_TMP_DH:
623 {
624 DH *dh = (DH *)parg;
625 if (dh == NULL) {
626 SSLerr(SSL_F_SSL3_CTRL, ERR_R_PASSED_NULL_PARAMETER);
627 return(ret);
628 }
629 if ((dh = DHparams_dup(dh)) == NULL) {
630 SSLerr(SSL_F_SSL3_CTRL, ERR_R_DH_LIB);
631 return(ret);
632 }
633 if (!DH_generate_key(dh)) {
634 DH_free(dh);
635 SSLerr(SSL_F_SSL3_CTRL, ERR_R_DH_LIB);
636 return(ret);
637 }
638 if (s->cert->dh_tmp != NULL)
639 DH_free(s->cert->dh_tmp);
640 s->cert->dh_tmp = dh;
641 ret = 1;
642 }
643 break;
644 case SSL_CTRL_SET_TMP_DH_CB:
645#ifndef NOPROTO
646 s->cert->dh_tmp_cb = (DH *(*)(SSL *, int, int))parg;
647#else
648 s->cert->dh_tmp_cb = (DH *(*)())parg;
649#endif
650 break;
651#endif
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000652 default:
653 break;
654 }
655 return(ret);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000656 }
657
658long ssl3_ctx_ctrl(ctx,cmd,larg,parg)
659SSL_CTX *ctx;
660int cmd;
661long larg;
662char *parg;
663 {
664 CERT *cert;
665
666 cert=ctx->default_cert;
667
668 switch (cmd)
669 {
670#ifndef NO_RSA
671 case SSL_CTRL_NEED_TMP_RSA:
672 if ( (cert->rsa_tmp == NULL) &&
673 ((cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL) ||
674 (EVP_PKEY_size(cert->pkeys[SSL_PKEY_RSA_ENC].privatekey) > (512/8)))
675 )
676 return(1);
677 else
678 return(0);
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000679 /* break; */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000680 case SSL_CTRL_SET_TMP_RSA:
681 {
682 RSA *rsa;
683 int i;
684
685 rsa=(RSA *)parg;
686 i=1;
687 if (rsa == NULL)
688 i=0;
689 else
690 {
691 if ((rsa=RSAPrivateKey_dup(rsa)) == NULL)
692 i=0;
693 }
694 if (!i)
695 {
696 SSLerr(SSL_F_SSL3_CTX_CTRL,ERR_R_RSA_LIB);
697 return(0);
698 }
699 else
700 {
701 if (cert->rsa_tmp != NULL)
702 RSA_free(cert->rsa_tmp);
703 cert->rsa_tmp=rsa;
704 return(1);
705 }
706 }
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000707 /* break; */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000708 case SSL_CTRL_SET_TMP_RSA_CB:
Dr. Stephen Hensone527ba01999-02-22 01:26:40 +0000709#ifndef NOPROTO
710 cert->rsa_tmp_cb=(RSA *(*)(SSL *, int, int))parg;
711#else
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000712 cert->rsa_tmp_cb=(RSA *(*)())parg;
Dr. Stephen Hensone527ba01999-02-22 01:26:40 +0000713#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000714 break;
715#endif
716#ifndef NO_DH
717 case SSL_CTRL_SET_TMP_DH:
718 {
719 DH *new=NULL,*dh;
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000720 int rret=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000721
722 dh=(DH *)parg;
723 if ( ((new=DHparams_dup(dh)) == NULL) ||
724 (!DH_generate_key(new)))
725 {
726 SSLerr(SSL_F_SSL3_CTX_CTRL,ERR_R_DH_LIB);
727 if (new != NULL) DH_free(new);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000728 }
729 else
730 {
731 if (cert->dh_tmp != NULL)
732 DH_free(cert->dh_tmp);
733 cert->dh_tmp=new;
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000734 rret=1;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000735 }
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000736 return(rret);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000737 }
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000738 /*break; */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000739 case SSL_CTRL_SET_TMP_DH_CB:
Dr. Stephen Hensone527ba01999-02-22 01:26:40 +0000740#ifndef NOPROTO
741 cert->dh_tmp_cb=(DH *(*)(SSL *, int, int))parg;
742#else
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000743 cert->dh_tmp_cb=(DH *(*)())parg;
Dr. Stephen Hensone527ba01999-02-22 01:26:40 +0000744#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000745 break;
746#endif
Ralf S. Engelschall651d0af1998-12-22 15:04:48 +0000747 /* A Thawte special :-) */
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000748 case SSL_CTRL_EXTRA_CHAIN_CERT:
749 if (ctx->extra_certs == NULL)
750 {
751 if ((ctx->extra_certs=sk_new_null()) == NULL)
752 return(0);
753 }
754 sk_push(ctx->extra_certs,(char *)parg);
755 break;
756
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000757 default:
758 return(0);
759 }
760 return(1);
761 }
762
763/* This function needs to check if the ciphers required are actually
764 * available */
765SSL_CIPHER *ssl3_get_cipher_by_char(p)
Ben Laurie207ccf61999-01-16 17:28:15 +0000766const unsigned char *p;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000767 {
768 static int init=1;
769 static SSL_CIPHER *sorted[SSL3_NUM_CIPHERS];
770 SSL_CIPHER c,*cp= &c,**cpp;
771 unsigned long id;
772 int i;
773
774 if (init)
775 {
776 init=0;
777
778 for (i=0; i<SSL3_NUM_CIPHERS; i++)
779 sorted[i]= &(ssl3_ciphers[i]);
780
781 qsort( (char *)sorted,
782 SSL3_NUM_CIPHERS,sizeof(SSL_CIPHER *),
783 FP_ICC ssl_cipher_ptr_id_cmp);
784 }
785
786 id=0x03000000L|((unsigned long)p[0]<<8L)|(unsigned long)p[1];
787 c.id=id;
788 cpp=(SSL_CIPHER **)OBJ_bsearch((char *)&cp,
789 (char *)sorted,
790 SSL3_NUM_CIPHERS,sizeof(SSL_CIPHER *),
791 (int (*)())ssl_cipher_ptr_id_cmp);
792 if ((cpp == NULL) || !(*cpp)->valid)
793 return(NULL);
794 else
795 return(*cpp);
796 }
797
798int ssl3_put_cipher_by_char(c,p)
Ben Laurie207ccf61999-01-16 17:28:15 +0000799const SSL_CIPHER *c;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000800unsigned char *p;
801 {
802 long l;
803
804 if (p != NULL)
805 {
806 l=c->id;
807 if ((l & 0xff000000) != 0x03000000) return(0);
808 p[0]=((unsigned char)(l>> 8L))&0xFF;
809 p[1]=((unsigned char)(l ))&0xFF;
810 }
811 return(2);
812 }
813
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000814int ssl3_part_read(s,i)
815SSL *s;
816int i;
817 {
818 s->rwstate=SSL_READING;
819
820 if (i < 0)
821 {
822 return(i);
823 }
824 else
825 {
826 s->init_num+=i;
827 return(0);
828 }
829 }
830
831SSL_CIPHER *ssl3_choose_cipher(s,have,pref)
832SSL *s;
833STACK *have,*pref;
834 {
835 SSL_CIPHER *c,*ret=NULL;
836 int i,j,ok;
837 CERT *cert;
838 unsigned long alg,mask,emask;
839
840 /* Lets see which ciphers we can supported */
841 if (s->cert != NULL)
842 cert=s->cert;
843 else
844 cert=s->ctx->default_cert;
845
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000846 sk_set_cmp_func(pref,ssl_cipher_ptr_id_cmp);
847
848 for (i=0; i<sk_num(have); i++)
849 {
850 c=(SSL_CIPHER *)sk_value(have,i);
Ben Laurie60e31c31999-02-21 21:58:59 +0000851
852 ssl_set_cert_masks(cert,c);
853 mask=cert->mask;
854 emask=cert->export_mask;
855
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000856 alg=c->algorithms&(SSL_MKEY_MASK|SSL_AUTH_MASK);
Ralf S. Engelschall90a52ce1999-02-25 11:03:18 +0000857 if (SSL_IS_EXPORT(c->algorithms))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000858 {
859 ok=((alg & emask) == alg)?1:0;
860#ifdef CIPHER_DEBUG
Ralf S. Engelschall90a52ce1999-02-25 11:03:18 +0000861 printf("%d:[%08lX:%08lX]%s (export)\n",ok,alg,mask,c->name);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000862#endif
863 }
864 else
865 {
866 ok=((alg & mask) == alg)?1:0;
867#ifdef CIPHER_DEBUG
868 printf("%d:[%08lX:%08lX]%s\n",ok,alg,mask,c->name);
869#endif
870 }
871
872 if (!ok) continue;
873
874 j=sk_find(pref,(char *)c);
875 if (j >= 0)
876 {
877 ret=(SSL_CIPHER *)sk_value(pref,j);
878 break;
879 }
880 }
881 return(ret);
882 }
883
884int ssl3_get_req_cert_type(s,p)
885SSL *s;
886unsigned char *p;
887 {
888 int ret=0;
889 unsigned long alg;
890
891 alg=s->s3->tmp.new_cipher->algorithms;
892
893#ifndef NO_DH
894 if (alg & (SSL_kDHr|SSL_kEDH))
895 {
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000896# ifndef NO_RSA
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000897 p[ret++]=SSL3_CT_RSA_FIXED_DH;
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000898# endif
899# ifndef NO_DSA
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000900 p[ret++]=SSL3_CT_DSS_FIXED_DH;
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000901# endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000902 }
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000903 if ((s->version == SSL3_VERSION) &&
904 (alg & (SSL_kEDH|SSL_kDHd|SSL_kDHr)))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000905 {
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000906# ifndef NO_RSA
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000907 p[ret++]=SSL3_CT_RSA_EPHEMERAL_DH;
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000908# endif
909# ifndef NO_DSA
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000910 p[ret++]=SSL3_CT_DSS_EPHEMERAL_DH;
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000911# endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000912 }
913#endif /* !NO_DH */
914#ifndef NO_RSA
915 p[ret++]=SSL3_CT_RSA_SIGN;
916#endif
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000917#ifndef NO_DSA
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000918 p[ret++]=SSL3_CT_DSS_SIGN;
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000919#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000920 return(ret);
921 }
922
923int ssl3_shutdown(s)
924SSL *s;
925 {
926
927 /* Don't do anything much if we have not done the handshake or
928 * we don't want to send messages :-) */
929 if ((s->quiet_shutdown) || (s->state == SSL_ST_BEFORE))
930 {
931 s->shutdown=(SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);
932 return(1);
933 }
934
935 if (!(s->shutdown & SSL_SENT_SHUTDOWN))
936 {
937 s->shutdown|=SSL_SENT_SHUTDOWN;
938#if 1
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000939 ssl3_send_alert(s,SSL3_AL_WARNING,SSL_AD_CLOSE_NOTIFY);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000940#endif
941 /* our shutdown alert has been sent now, and if it still needs
942 * to be written, s->s3->alert_dispatch will be true */
943 }
944 else if (s->s3->alert_dispatch)
945 {
946 /* resend it if not sent */
947#if 1
948 ssl3_dispatch_alert(s);
949#endif
950 }
951 else if (!(s->shutdown & SSL_RECEIVED_SHUTDOWN))
952 {
953 /* If we are waiting for a close from our peer, we are closed */
954 ssl3_read_bytes(s,0,NULL,0);
955 }
956
957 if ((s->shutdown == (SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN)) &&
958 !s->s3->alert_dispatch)
959 return(1);
960 else
961 return(0);
962 }
963
964int ssl3_write(s,buf,len)
965SSL *s;
Ben Laurie207ccf61999-01-16 17:28:15 +0000966const char *buf;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000967int len;
968 {
969 int ret,n;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000970
971#if 0
972 if (s->shutdown & SSL_SEND_SHUTDOWN)
973 {
974 s->rwstate=SSL_NOTHING;
975 return(0);
976 }
977#endif
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000978 clear_sys_error();
979 if (s->s3->renegotiate) ssl3_renegotiate_check(s);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000980
981 /* This is an experimental flag that sends the
982 * last handshake message in the same packet as the first
983 * use data - used to see if it helps the TCP protocol during
984 * session-id reuse */
985 /* The second test is because the buffer may have been removed */
986 if ((s->s3->flags & SSL3_FLAGS_POP_BUFFER) && (s->wbio == s->bbio))
987 {
988 /* First time through, we write into the buffer */
989 if (s->s3->delay_buf_pop_ret == 0)
990 {
991 ret=ssl3_write_bytes(s,SSL3_RT_APPLICATION_DATA,
992 (char *)buf,len);
993 if (ret <= 0) return(ret);
994
995 s->s3->delay_buf_pop_ret=ret;
996 }
997
998 s->rwstate=SSL_WRITING;
999 n=BIO_flush(s->wbio);
1000 if (n <= 0) return(n);
1001 s->rwstate=SSL_NOTHING;
1002
Mark J. Cox413c4f41999-02-16 09:22:21 +00001003 /* We have flushed the buffer, so remove it */
1004 ssl_free_wbio_buffer(s);
1005 s->s3->flags&= ~SSL3_FLAGS_POP_BUFFER;
1006
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001007 ret=s->s3->delay_buf_pop_ret;
1008 s->s3->delay_buf_pop_ret=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001009 }
1010 else
1011 {
1012 ret=ssl3_write_bytes(s,SSL3_RT_APPLICATION_DATA,
1013 (char *)buf,len);
1014 if (ret <= 0) return(ret);
1015 }
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001016
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001017 return(ret);
1018 }
1019
1020int ssl3_read(s,buf,len)
1021SSL *s;
1022char *buf;
1023int len;
1024 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001025 int ret;
1026
1027 clear_sys_error();
1028 if (s->s3->renegotiate) ssl3_renegotiate_check(s);
1029 s->s3->in_read_app_data=1;
1030 ret=ssl3_read_bytes(s,SSL3_RT_APPLICATION_DATA,buf,len);
1031 if ((ret == -1) && (s->s3->in_read_app_data == 0))
1032 {
1033 ERR_get_error(); /* clear the error */
1034 s->s3->in_read_app_data=0;
1035 s->in_handshake++;
1036 ret=ssl3_read_bytes(s,SSL3_RT_APPLICATION_DATA,buf,len);
1037 s->in_handshake--;
1038 }
1039 else
1040 s->s3->in_read_app_data=0;
1041
1042 return(ret);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001043 }
1044
1045int ssl3_peek(s,buf,len)
1046SSL *s;
1047char *buf;
1048int len;
1049 {
1050 SSL3_RECORD *rr;
1051 int n;
1052
1053 rr= &(s->s3->rrec);
1054 if ((rr->length == 0) || (rr->type != SSL3_RT_APPLICATION_DATA))
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001055 {
1056 n=ssl3_read(s,buf,1);
1057 if (n <= 0) return(n);
1058 rr->length++;
1059 rr->off--;
1060 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001061
1062 if ((unsigned int)len > rr->length)
1063 n=rr->length;
1064 else
1065 n=len;
1066 memcpy(buf,&(rr->data[rr->off]),(unsigned int)n);
1067 return(n);
1068 }
1069
1070int ssl3_renegotiate(s)
1071SSL *s;
1072 {
1073 if (s->handshake_func == NULL)
1074 return(1);
1075
1076 if (s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS)
1077 return(0);
1078
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001079 s->s3->renegotiate=1;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001080 return(1);
1081 }
1082
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001083int ssl3_renegotiate_check(s)
1084SSL *s;
1085 {
1086 int ret=0;
1087
1088 if (s->s3->renegotiate)
1089 {
1090 if ( (s->s3->rbuf.left == 0) &&
1091 (s->s3->wbuf.left == 0) &&
1092 !SSL_in_init(s))
1093 {
1094/*
1095if we are the server, and we have sent a 'RENEGOTIATE' message, we
1096need to go to SSL_ST_ACCEPT.
1097*/
1098 /* SSL_ST_ACCEPT */
1099 s->state=SSL_ST_RENEGOTIATE;
1100 s->s3->renegotiate=0;
1101 s->s3->num_renegotiations++;
1102 s->s3->total_renegotiations++;
1103 ret=1;
1104 }
1105 }
1106 return(ret);
1107 }
1108