OpenSSL
1.0.1c
Main Page
Classes
Files
File List
File Members
All
Classes
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
ssl
s3_both.c
Go to the documentation of this file.
1
/* ssl/s3_both.c */
2
/* Copyright (C) 1995-1998 Eric Young (
[email protected]
)
3
* All rights reserved.
4
*
5
* This package is an SSL implementation written
6
* by Eric Young (
[email protected]
).
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 (
[email protected]
).
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 (
[email protected]
)"
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 (
[email protected]
)"
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
*
[email protected]
.
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
* (
[email protected]
). This product includes software written by Tim
108
* Hudson (
[email protected]
).
109
*
110
*/
111
/* ====================================================================
112
* Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
113
* ECC cipher suite support in OpenSSL originally developed by
114
* SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
115
*/
116
117
#include <limits.h>
118
#include <string.h>
119
#include <stdio.h>
120
#include "
ssl_locl.h
"
121
#include <
openssl/buffer.h
>
122
#include <
openssl/rand.h
>
123
#include <
openssl/objects.h
>
124
#include <
openssl/evp.h
>
125
#include <
openssl/x509.h
>
126
127
/* send s->init_buf in records of type 'type' (SSL3_RT_HANDSHAKE or SSL3_RT_CHANGE_CIPHER_SPEC) */
128
int
ssl3_do_write
(
SSL
*s,
int
type
)
129
{
130
int
ret;
131
132
ret=
ssl3_write_bytes
(s,type,&s->
init_buf
->
data
[s->
init_off
],
133
s->
init_num
);
134
if
(ret < 0)
return
(-1);
135
if
(type ==
SSL3_RT_HANDSHAKE
)
136
/* should not be done for 'Hello Request's, but in that case
137
* we'll ignore the result anyway */
138
ssl3_finish_mac
(s,(
unsigned
char
*)&s->
init_buf
->
data
[s->
init_off
],ret);
139
140
if
(ret == s->
init_num
)
141
{
142
if
(s->
msg_callback
)
143
s->
msg_callback
(1, s->
version
, type, s->
init_buf
->
data
, (
size_t
)(s->
init_off
+ s->
init_num
), s, s->
msg_callback_arg
);
144
return
(1);
145
}
146
s->
init_off
+=ret;
147
s->
init_num
-=ret;
148
return
(0);
149
}
150
151
int
ssl3_send_finished
(
SSL
*s,
int
a
,
int
b
,
const
char
*sender,
int
slen)
152
{
153
unsigned
char
*
p
,*d;
154
int
i;
155
unsigned
long
l;
156
157
if
(s->
state
== a)
158
{
159
d=(
unsigned
char
*)s->
init_buf
->
data
;
160
p= &(d[4]);
161
162
i=s->
method
->
ssl3_enc
->
final_finish_mac
(s,
163
sender,slen,s->
s3
->
tmp
.
finish_md
);
164
s->
s3
->
tmp
.
finish_md_len
= i;
165
memcpy(p, s->
s3
->
tmp
.
finish_md
, i);
166
p+=i;
167
l=i;
168
169
/* Copy the finished so we can use it for
170
renegotiation checks */
171
if
(s->
type
==
SSL_ST_CONNECT
)
172
{
173
OPENSSL_assert
(i <=
EVP_MAX_MD_SIZE
);
174
memcpy(s->
s3
->
previous_client_finished
,
175
s->
s3
->
tmp
.
finish_md
, i);
176
s->
s3
->
previous_client_finished_len
=i;
177
}
178
else
179
{
180
OPENSSL_assert
(i <=
EVP_MAX_MD_SIZE
);
181
memcpy(s->
s3
->
previous_server_finished
,
182
s->
s3
->
tmp
.
finish_md
, i);
183
s->
s3
->
previous_server_finished_len
=i;
184
}
185
186
#ifdef OPENSSL_SYS_WIN16
187
/* MSVC 1.5 does not clear the top bytes of the word unless
188
* I do this.
189
*/
190
l&=0xffff;
191
#endif
192
193
*(d++)=
SSL3_MT_FINISHED
;
194
l2n3
(l,d);
195
s->
init_num
=(int)l+4;
196
s->
init_off
=0;
197
198
s->
state
=
b
;
199
}
200
201
/* SSL3_ST_SEND_xxxxxx_HELLO_B */
202
return
(
ssl3_do_write
(s,
SSL3_RT_HANDSHAKE
));
203
}
204
205
#ifndef OPENSSL_NO_NEXTPROTONEG
206
/* ssl3_take_mac calculates the Finished MAC for the handshakes messages seen to far. */
207
static
void
ssl3_take_mac(
SSL
*s) {
208
const
char
*sender;
209
int
slen;
210
211
if
(s->
state
&
SSL_ST_CONNECT
)
212
{
213
sender=s->
method
->
ssl3_enc
->
server_finished_label
;
214
slen=s->
method
->
ssl3_enc
->
server_finished_label_len
;
215
}
216
else
217
{
218
sender=s->
method
->
ssl3_enc
->
client_finished_label
;
219
slen=s->
method
->
ssl3_enc
->
client_finished_label_len
;
220
}
221
222
s->
s3
->
tmp
.
peer_finish_md_len
= s->
method
->
ssl3_enc
->
final_finish_mac
(s,
223
sender,slen,s->
s3
->
tmp
.
peer_finish_md
);
224
}
225
#endif
226
227
int
ssl3_get_finished
(
SSL
*s,
int
a
,
int
b
)
228
{
229
int
al,i,ok;
230
long
n;
231
unsigned
char
*
p
;
232
233
#ifdef OPENSSL_NO_NEXTPROTONEG
234
/* the mac has already been generated when we received the change
235
* cipher spec message and is in s->s3->tmp.peer_finish_md. */
236
#endif
237
238
n=s->
method
->
ssl_get_message
(s,
239
a,
240
b,
241
SSL3_MT_FINISHED
,
242
64,
/* should actually be 36+4 :-) */
243
&ok);
244
245
if
(!ok)
return
((
int
)n);
246
247
/* If this occurs, we have missed a message */
248
if
(!s->
s3
->
change_cipher_spec
)
249
{
250
al=
SSL_AD_UNEXPECTED_MESSAGE
;
251
SSLerr
(
SSL_F_SSL3_GET_FINISHED
,
SSL_R_GOT_A_FIN_BEFORE_A_CCS
);
252
goto
f_err;
253
}
254
s->
s3
->
change_cipher_spec
=0;
255
256
p = (
unsigned
char
*)s->
init_msg
;
257
i = s->
s3
->
tmp
.
peer_finish_md_len
;
258
259
if
(i != n)
260
{
261
al=
SSL_AD_DECODE_ERROR
;
262
SSLerr
(
SSL_F_SSL3_GET_FINISHED
,
SSL_R_BAD_DIGEST_LENGTH
);
263
goto
f_err;
264
}
265
266
if
(memcmp(p, s->
s3
->
tmp
.
peer_finish_md
, i) != 0)
267
{
268
al=
SSL_AD_DECRYPT_ERROR
;
269
SSLerr
(
SSL_F_SSL3_GET_FINISHED
,
SSL_R_DIGEST_CHECK_FAILED
);
270
goto
f_err;
271
}
272
273
/* Copy the finished so we can use it for
274
renegotiation checks */
275
if
(s->
type
==
SSL_ST_ACCEPT
)
276
{
277
OPENSSL_assert
(i <=
EVP_MAX_MD_SIZE
);
278
memcpy(s->
s3
->
previous_client_finished
,
279
s->
s3
->
tmp
.
peer_finish_md
, i);
280
s->
s3
->
previous_client_finished_len
=i;
281
}
282
else
283
{
284
OPENSSL_assert
(i <=
EVP_MAX_MD_SIZE
);
285
memcpy(s->
s3
->
previous_server_finished
,
286
s->
s3
->
tmp
.
peer_finish_md
, i);
287
s->
s3
->
previous_server_finished_len
=i;
288
}
289
290
return
(1);
291
f_err:
292
ssl3_send_alert
(s,
SSL3_AL_FATAL
,al);
293
return
(0);
294
}
295
296
/* for these 2 messages, we need to
297
* ssl->enc_read_ctx re-init
298
* ssl->s3->read_sequence zero
299
* ssl->s3->read_mac_secret re-init
300
* ssl->session->read_sym_enc assign
301
* ssl->session->read_compression assign
302
* ssl->session->read_hash assign
303
*/
304
int
ssl3_send_change_cipher_spec
(
SSL
*s,
int
a
,
int
b
)
305
{
306
unsigned
char
*
p
;
307
308
if
(s->
state
== a)
309
{
310
p=(
unsigned
char
*)s->
init_buf
->
data
;
311
*p=
SSL3_MT_CCS
;
312
s->
init_num
=1;
313
s->
init_off
=0;
314
315
s->
state
=b;
316
}
317
318
/* SSL3_ST_CW_CHANGE_B */
319
return
(
ssl3_do_write
(s,
SSL3_RT_CHANGE_CIPHER_SPEC
));
320
}
321
322
static
int
ssl3_add_cert_to_buf(
BUF_MEM
*buf,
unsigned
long
*l,
X509
*x)
323
{
324
int
n;
325
unsigned
char
*
p
;
326
327
n=i2d_X509(x,NULL);
328
if
(!
BUF_MEM_grow_clean
(buf,(
int
)(n+(*l)+3)))
329
{
330
SSLerr
(
SSL_F_SSL3_ADD_CERT_TO_BUF
,
ERR_R_BUF_LIB
);
331
return
(-1);
332
}
333
p=(
unsigned
char
*)&(buf->
data
[*l]);
334
l2n3
(n,p);
335
i2d_X509(x,&p);
336
*l+=n+3;
337
338
return
(0);
339
}
340
341
unsigned
long
ssl3_output_cert_chain
(
SSL
*s,
X509
*x)
342
{
343
unsigned
char
*
p
;
344
int
i;
345
unsigned
long
l=7;
346
BUF_MEM
*buf;
347
int
no_chain;
348
349
if
((s->
mode
&
SSL_MODE_NO_AUTO_CHAIN
) || s->
ctx
->extra_certs)
350
no_chain = 1;
351
else
352
no_chain = 0;
353
354
/* TLSv1 sends a chain with nothing in it, instead of an alert */
355
buf=s->
init_buf
;
356
if
(!
BUF_MEM_grow_clean
(buf,10))
357
{
358
SSLerr
(
SSL_F_SSL3_OUTPUT_CERT_CHAIN
,
ERR_R_BUF_LIB
);
359
return
(0);
360
}
361
if
(x != NULL)
362
{
363
if
(no_chain)
364
{
365
if
(ssl3_add_cert_to_buf(buf, &l, x))
366
return
(0);
367
}
368
else
369
{
370
X509_STORE_CTX
xs_ctx;
371
372
if
(!
X509_STORE_CTX_init
(&xs_ctx,s->
ctx
->
cert_store
,x,NULL))
373
{
374
SSLerr
(
SSL_F_SSL3_OUTPUT_CERT_CHAIN
,
ERR_R_X509_LIB
);
375
return
(0);
376
}
377
X509_verify_cert
(&xs_ctx);
378
/* Don't leave errors in the queue */
379
ERR_clear_error
();
380
for
(i=0; i <
sk_X509_num
(xs_ctx.chain); i++)
381
{
382
x =
sk_X509_value
(xs_ctx.chain, i);
383
384
if
(ssl3_add_cert_to_buf(buf, &l, x))
385
{
386
X509_STORE_CTX_cleanup
(&xs_ctx);
387
return
0;
388
}
389
}
390
X509_STORE_CTX_cleanup
(&xs_ctx);
391
}
392
}
393
/* Thawte special :-) */
394
for
(i=0; i<
sk_X509_num
(s->
ctx
->extra_certs); i++)
395
{
396
x=
sk_X509_value
(s->
ctx
->extra_certs,i);
397
if
(ssl3_add_cert_to_buf(buf, &l, x))
398
return
(0);
399
}
400
401
l-=7;
402
p=(
unsigned
char
*)&(buf->
data
[4]);
403
l2n3
(l,p);
404
l+=3;
405
p=(
unsigned
char
*)&(buf->
data
[0]);
406
*(p++)=
SSL3_MT_CERTIFICATE
;
407
l2n3
(l,p);
408
l+=4;
409
return
(l);
410
}
411
412
/* Obtain handshake message of message type 'mt' (any if mt == -1),
413
* maximum acceptable body length 'max'.
414
* The first four bytes (msg_type and length) are read in state 'st1',
415
* the body is read in state 'stn'.
416
*/
417
long
ssl3_get_message
(
SSL
*s,
int
st1,
int
stn,
int
mt,
long
max
,
int
*ok)
418
{
419
unsigned
char
*
p
;
420
unsigned
long
l;
421
long
n;
422
int
i,al;
423
424
if
(s->
s3
->
tmp
.
reuse_message
)
425
{
426
s->
s3
->
tmp
.
reuse_message
=0;
427
if
((mt >= 0) && (s->
s3
->
tmp
.
message_type
!= mt))
428
{
429
al=
SSL_AD_UNEXPECTED_MESSAGE
;
430
SSLerr
(
SSL_F_SSL3_GET_MESSAGE
,
SSL_R_UNEXPECTED_MESSAGE
);
431
goto
f_err;
432
}
433
*ok=1;
434
s->
init_msg
= s->
init_buf
->
data
+ 4;
435
s->
init_num
= (int)s->
s3
->
tmp
.
message_size
;
436
return
s->
init_num
;
437
}
438
439
p=(
unsigned
char
*)s->
init_buf
->
data
;
440
441
if
(s->
state
== st1)
/* s->init_num < 4 */
442
{
443
int
skip_message;
444
445
do
446
{
447
while
(s->
init_num
< 4)
448
{
449
i=s->
method
->
ssl_read_bytes
(s,
SSL3_RT_HANDSHAKE
,
450
&p[s->
init_num
],4 - s->
init_num
, 0);
451
if
(i <= 0)
452
{
453
s->
rwstate
=
SSL_READING
;
454
*ok = 0;
455
return
i;
456
}
457
s->
init_num
+=i;
458
}
459
460
skip_message = 0;
461
if
(!s->
server
)
462
if
(p[0] ==
SSL3_MT_HELLO_REQUEST
)
463
/* The server may always send 'Hello Request' messages --
464
* we are doing a handshake anyway now, so ignore them
465
* if their format is correct. Does not count for
466
* 'Finished' MAC. */
467
if
(p[1] == 0 && p[2] == 0 &&p[3] == 0)
468
{
469
s->
init_num
= 0;
470
skip_message = 1;
471
472
if
(s->
msg_callback
)
473
s->
msg_callback
(0, s->
version
,
SSL3_RT_HANDSHAKE
, p, 4, s, s->
msg_callback_arg
);
474
}
475
}
476
while
(skip_message);
477
478
/* s->init_num == 4 */
479
480
if
((mt >= 0) && (*p != mt))
481
{
482
al=
SSL_AD_UNEXPECTED_MESSAGE
;
483
SSLerr
(
SSL_F_SSL3_GET_MESSAGE
,
SSL_R_UNEXPECTED_MESSAGE
);
484
goto
f_err;
485
}
486
if
((mt < 0) && (*p ==
SSL3_MT_CLIENT_HELLO
) &&
487
(st1 ==
SSL3_ST_SR_CERT_A
) &&
488
(stn ==
SSL3_ST_SR_CERT_B
))
489
{
490
/* At this point we have got an MS SGC second client
491
* hello (maybe we should always allow the client to
492
* start a new handshake?). We need to restart the mac.
493
* Don't increment {num,total}_renegotiations because
494
* we have not completed the handshake. */
495
ssl3_init_finished_mac
(s);
496
}
497
498
s->
s3
->
tmp
.
message_type
= *(p++);
499
500
n2l3
(p,l);
501
if
(l > (
unsigned
long
)max)
502
{
503
al=
SSL_AD_ILLEGAL_PARAMETER
;
504
SSLerr
(
SSL_F_SSL3_GET_MESSAGE
,
SSL_R_EXCESSIVE_MESSAGE_SIZE
);
505
goto
f_err;
506
}
507
if
(l > (INT_MAX-4))
/* BUF_MEM_grow takes an 'int' parameter */
508
{
509
al=
SSL_AD_ILLEGAL_PARAMETER
;
510
SSLerr
(
SSL_F_SSL3_GET_MESSAGE
,
SSL_R_EXCESSIVE_MESSAGE_SIZE
);
511
goto
f_err;
512
}
513
if
(l && !
BUF_MEM_grow_clean
(s->
init_buf
,(
int
)l+4))
514
{
515
SSLerr
(
SSL_F_SSL3_GET_MESSAGE
,
ERR_R_BUF_LIB
);
516
goto
err;
517
}
518
s->
s3
->
tmp
.
message_size
=l;
519
s->
state
=stn;
520
521
s->
init_msg
= s->
init_buf
->
data
+ 4;
522
s->
init_num
= 0;
523
}
524
525
/* next state (stn) */
526
p = s->
init_msg
;
527
n = s->
s3
->
tmp
.
message_size
- s->
init_num
;
528
while
(n > 0)
529
{
530
i=s->
method
->
ssl_read_bytes
(s,
SSL3_RT_HANDSHAKE
,&p[s->
init_num
],n,0);
531
if
(i <= 0)
532
{
533
s->
rwstate
=
SSL_READING
;
534
*ok = 0;
535
return
i;
536
}
537
s->
init_num
+= i;
538
n -= i;
539
}
540
#ifndef OPENSSL_NO_NEXTPROTONEG
541
/* If receiving Finished, record MAC of prior handshake messages for
542
* Finished verification. */
543
if
(*s->
init_buf
->
data
==
SSL3_MT_FINISHED
)
544
ssl3_take_mac(s);
545
#endif
546
/* Feed this message into MAC computation. */
547
ssl3_finish_mac
(s, (
unsigned
char
*)s->
init_buf
->
data
, s->
init_num
+ 4);
548
if
(s->
msg_callback
)
549
s->
msg_callback
(0, s->
version
,
SSL3_RT_HANDSHAKE
, s->
init_buf
->
data
, (
size_t
)s->
init_num
+ 4, s, s->
msg_callback_arg
);
550
*ok=1;
551
return
s->
init_num
;
552
f_err:
553
ssl3_send_alert
(s,
SSL3_AL_FATAL
,al);
554
err:
555
*ok=0;
556
return
(-1);
557
}
558
559
int
ssl_cert_type
(
X509
*x,
EVP_PKEY
*pkey)
560
{
561
EVP_PKEY
*pk;
562
int
ret= -1,i;
563
564
if
(pkey == NULL)
565
pk=
X509_get_pubkey
(x);
566
else
567
pk=pkey;
568
if
(pk == NULL)
goto
err;
569
570
i=pk->
type
;
571
if
(i ==
EVP_PKEY_RSA
)
572
{
573
ret=
SSL_PKEY_RSA_ENC
;
574
}
575
else
if
(i ==
EVP_PKEY_DSA
)
576
{
577
ret=
SSL_PKEY_DSA_SIGN
;
578
}
579
#ifndef OPENSSL_NO_EC
580
else
if
(i ==
EVP_PKEY_EC
)
581
{
582
ret =
SSL_PKEY_ECC
;
583
}
584
#endif
585
else
if
(i ==
NID_id_GostR3410_94
|| i ==
NID_id_GostR3410_94_cc
)
586
{
587
ret =
SSL_PKEY_GOST94
;
588
}
589
else
if
(i ==
NID_id_GostR3410_2001
|| i ==
NID_id_GostR3410_2001_cc
)
590
{
591
ret =
SSL_PKEY_GOST01
;
592
}
593
err:
594
if
(!pkey)
EVP_PKEY_free
(pk);
595
return
(ret);
596
}
597
598
int
ssl_verify_alarm_type
(
long
type
)
599
{
600
int
al;
601
602
switch
(type)
603
{
604
case
X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT
:
605
case
X509_V_ERR_UNABLE_TO_GET_CRL
:
606
case
X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER
:
607
al=
SSL_AD_UNKNOWN_CA
;
608
break
;
609
case
X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE
:
610
case
X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE
:
611
case
X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY
:
612
case
X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD
:
613
case
X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD
:
614
case
X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD
:
615
case
X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD
:
616
case
X509_V_ERR_CERT_NOT_YET_VALID
:
617
case
X509_V_ERR_CRL_NOT_YET_VALID
:
618
case
X509_V_ERR_CERT_UNTRUSTED
:
619
case
X509_V_ERR_CERT_REJECTED
:
620
al=
SSL_AD_BAD_CERTIFICATE
;
621
break
;
622
case
X509_V_ERR_CERT_SIGNATURE_FAILURE
:
623
case
X509_V_ERR_CRL_SIGNATURE_FAILURE
:
624
al=
SSL_AD_DECRYPT_ERROR
;
625
break
;
626
case
X509_V_ERR_CERT_HAS_EXPIRED
:
627
case
X509_V_ERR_CRL_HAS_EXPIRED
:
628
al=
SSL_AD_CERTIFICATE_EXPIRED
;
629
break
;
630
case
X509_V_ERR_CERT_REVOKED
:
631
al=
SSL_AD_CERTIFICATE_REVOKED
;
632
break
;
633
case
X509_V_ERR_OUT_OF_MEM
:
634
al=
SSL_AD_INTERNAL_ERROR
;
635
break
;
636
case
X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT
:
637
case
X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN
:
638
case
X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY
:
639
case
X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE
:
640
case
X509_V_ERR_CERT_CHAIN_TOO_LONG
:
641
case
X509_V_ERR_PATH_LENGTH_EXCEEDED
:
642
case
X509_V_ERR_INVALID_CA
:
643
al=
SSL_AD_UNKNOWN_CA
;
644
break
;
645
case
X509_V_ERR_APPLICATION_VERIFICATION
:
646
al=
SSL_AD_HANDSHAKE_FAILURE
;
647
break
;
648
case
X509_V_ERR_INVALID_PURPOSE
:
649
al=
SSL_AD_UNSUPPORTED_CERTIFICATE
;
650
break
;
651
default
:
652
al=
SSL_AD_CERTIFICATE_UNKNOWN
;
653
break
;
654
}
655
return
(al);
656
}
657
658
#ifndef OPENSSL_NO_BUF_FREELISTS
659
/* On some platforms, malloc() performance is bad enough that you can't just
660
* free() and malloc() buffers all the time, so we need to use freelists from
661
* unused buffers. Currently, each freelist holds memory chunks of only a
662
* given size (list->chunklen); other sized chunks are freed and malloced.
663
* This doesn't help much if you're using many different SSL option settings
664
* with a given context. (The options affecting buffer size are
665
* max_send_fragment, read buffer vs write buffer,
666
* SSL_OP_MICROSOFT_BIG_WRITE_BUFFER, SSL_OP_NO_COMPRESSION, and
667
* SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS.) Using a separate freelist for every
668
* possible size is not an option, since max_send_fragment can take on many
669
* different values.
670
*
671
* If you are on a platform with a slow malloc(), and you're using SSL
672
* connections with many different settings for these options, and you need to
673
* use the SSL_MOD_RELEASE_BUFFERS feature, you have a few options:
674
* - Link against a faster malloc implementation.
675
* - Use a separate SSL_CTX for each option set.
676
* - Improve this code.
677
*/
678
static
void
*
679
freelist_extract(
SSL_CTX
*ctx,
int
for_read,
int
sz)
680
{
681
SSL3_BUF_FREELIST
*list;
682
SSL3_BUF_FREELIST_ENTRY
*ent = NULL;
683
void
*result = NULL;
684
685
CRYPTO_w_lock
(
CRYPTO_LOCK_SSL_CTX
);
686
list = for_read ? ctx->
rbuf_freelist
: ctx->
wbuf_freelist
;
687
if
(list != NULL && sz == (
int
)list->
chunklen
)
688
ent = list->
head
;
689
if
(ent != NULL)
690
{
691
list->
head
= ent->
next
;
692
result = ent;
693
if
(--list->
len
== 0)
694
list->
chunklen
= 0;
695
}
696
CRYPTO_w_unlock
(
CRYPTO_LOCK_SSL_CTX
);
697
if
(!result)
698
result =
OPENSSL_malloc
(sz);
699
return
result;
700
}
701
702
static
void
703
freelist_insert(
SSL_CTX
*ctx,
int
for_read,
size_t
sz,
void
*mem)
704
{
705
SSL3_BUF_FREELIST
*list;
706
SSL3_BUF_FREELIST_ENTRY
*ent;
707
708
CRYPTO_w_lock
(
CRYPTO_LOCK_SSL_CTX
);
709
list = for_read ? ctx->
rbuf_freelist
: ctx->
wbuf_freelist
;
710
if
(list != NULL &&
711
(sz == list->
chunklen
|| list->
chunklen
== 0) &&
712
list->
len
< ctx->
freelist_max_len
&&
713
sz >=
sizeof
(*ent))
714
{
715
list->
chunklen
= sz;
716
ent = mem;
717
ent->
next
= list->
head
;
718
list->
head
= ent;
719
++list->
len
;
720
mem = NULL;
721
}
722
723
CRYPTO_w_unlock
(
CRYPTO_LOCK_SSL_CTX
);
724
if
(mem)
725
OPENSSL_free
(mem);
726
}
727
#else
728
#define freelist_extract(c,fr,sz) OPENSSL_malloc(sz)
729
#define freelist_insert(c,fr,sz,m) OPENSSL_free(m)
730
#endif
731
732
int
ssl3_setup_read_buffer
(
SSL
*s)
733
{
734
unsigned
char
*
p
;
735
size_t
len
,align=0,headerlen;
736
737
if
(
SSL_version
(s) ==
DTLS1_VERSION
||
SSL_version
(s) ==
DTLS1_BAD_VER
)
738
headerlen =
DTLS1_RT_HEADER_LENGTH
;
739
else
740
headerlen =
SSL3_RT_HEADER_LENGTH
;
741
742
#if defined(SSL3_ALIGN_PAYLOAD) && SSL3_ALIGN_PAYLOAD!=0
743
align = (-
SSL3_RT_HEADER_LENGTH
)&(
SSL3_ALIGN_PAYLOAD
-1);
744
#endif
745
746
if
(s->
s3
->
rbuf
.
buf
== NULL)
747
{
748
len =
SSL3_RT_MAX_PLAIN_LENGTH
749
+
SSL3_RT_MAX_ENCRYPTED_OVERHEAD
750
+ headerlen + align;
751
if
(s->
options
&
SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER
)
752
{
753
s->
s3
->
init_extra
= 1;
754
len +=
SSL3_RT_MAX_EXTRA
;
755
}
756
#ifndef OPENSSL_NO_COMP
757
if
(!(s->
options
&
SSL_OP_NO_COMPRESSION
))
758
len +=
SSL3_RT_MAX_COMPRESSED_OVERHEAD
;
759
#endif
760
if
((p=freelist_extract(s->
ctx
, 1, len)) == NULL)
761
goto
err;
762
s->
s3
->
rbuf
.
buf
=
p
;
763
s->
s3
->
rbuf
.
len
=
len
;
764
}
765
766
s->
packet
= &(s->
s3
->
rbuf
.
buf
[0]);
767
return
1;
768
769
err:
770
SSLerr
(
SSL_F_SSL3_SETUP_READ_BUFFER
,
ERR_R_MALLOC_FAILURE
);
771
return
0;
772
}
773
774
int
ssl3_setup_write_buffer
(
SSL
*s)
775
{
776
unsigned
char
*
p
;
777
size_t
len
,align=0,headerlen;
778
779
if
(
SSL_version
(s) ==
DTLS1_VERSION
||
SSL_version
(s) ==
DTLS1_BAD_VER
)
780
headerlen =
DTLS1_RT_HEADER_LENGTH
+ 1;
781
else
782
headerlen =
SSL3_RT_HEADER_LENGTH
;
783
784
#if defined(SSL3_ALIGN_PAYLOAD) && SSL3_ALIGN_PAYLOAD!=0
785
align = (-
SSL3_RT_HEADER_LENGTH
)&(
SSL3_ALIGN_PAYLOAD
-1);
786
#endif
787
788
if
(s->
s3
->
wbuf
.
buf
== NULL)
789
{
790
len = s->
max_send_fragment
791
+
SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD
792
+ headerlen + align;
793
#ifndef OPENSSL_NO_COMP
794
if
(!(s->
options
&
SSL_OP_NO_COMPRESSION
))
795
len +=
SSL3_RT_MAX_COMPRESSED_OVERHEAD
;
796
#endif
797
if
(!(s->
options
&
SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS
))
798
len += headerlen + align
799
+
SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD
;
800
801
if
((p=freelist_extract(s->
ctx
, 0, len)) == NULL)
802
goto
err;
803
s->
s3
->
wbuf
.
buf
=
p
;
804
s->
s3
->
wbuf
.
len
=
len
;
805
}
806
807
return
1;
808
809
err:
810
SSLerr
(
SSL_F_SSL3_SETUP_WRITE_BUFFER
,
ERR_R_MALLOC_FAILURE
);
811
return
0;
812
}
813
814
815
int
ssl3_setup_buffers
(
SSL
*s)
816
{
817
if
(!
ssl3_setup_read_buffer
(s))
818
return
0;
819
if
(!
ssl3_setup_write_buffer
(s))
820
return
0;
821
return
1;
822
}
823
824
int
ssl3_release_write_buffer
(
SSL
*s)
825
{
826
if
(s->
s3
->
wbuf
.
buf
!= NULL)
827
{
828
freelist_insert(s->
ctx
, 0, s->
s3
->
wbuf
.
len
, s->
s3
->
wbuf
.
buf
);
829
s->
s3
->
wbuf
.
buf
= NULL;
830
}
831
return
1;
832
}
833
834
int
ssl3_release_read_buffer
(
SSL
*s)
835
{
836
if
(s->
s3
->
rbuf
.
buf
!= NULL)
837
{
838
freelist_insert(s->
ctx
, 1, s->
s3
->
rbuf
.
len
, s->
s3
->
rbuf
.
buf
);
839
s->
s3
->
rbuf
.
buf
= NULL;
840
}
841
return
1;
842
}
843
Generated on Thu Jan 10 2013 09:53:43 for OpenSSL by
1.8.2