Split out non record layer functions out of s3_pkt.c and d1_pkt.c into
the new files s3_msg.c and s1_msg.c respectively. Reviewed-by: Richard Levitte <levitte@openssl.org>
This commit is contained in:
parent
02a36fdae8
commit
c103c7e266
6 changed files with 438 additions and 204 deletions
10
ssl/Makefile
10
ssl/Makefile
|
@ -22,9 +22,10 @@ LIB=$(TOP)/libssl.a
|
|||
SHARED_LIB= libssl$(SHLIB_EXT)
|
||||
LIBSRC= \
|
||||
s3_meth.c s3_srvr.c s3_clnt.c s3_lib.c s3_enc.c s3_pkt.c s3_both.c s3_cbc.c \
|
||||
s23_meth.c s23_srvr.c s23_clnt.c s23_lib.c s23_pkt.c \
|
||||
s3_msg.c \
|
||||
s23_meth.c s23_srvr.c s23_clnt.c s23_lib.c s23_pkt.c \
|
||||
t1_meth.c t1_srvr.c t1_clnt.c t1_lib.c t1_enc.c t1_ext.c \
|
||||
d1_meth.c d1_srvr.c d1_clnt.c d1_lib.c d1_pkt.c \
|
||||
d1_meth.c d1_srvr.c d1_clnt.c d1_lib.c d1_pkt.c d1_msg.c \
|
||||
d1_both.c d1_srtp.c \
|
||||
ssl_lib.c ssl_err2.c ssl_cert.c ssl_sess.c \
|
||||
ssl_ciph.c ssl_stat.c ssl_rsa.c \
|
||||
|
@ -33,9 +34,10 @@ LIBSRC= \
|
|||
record/ssl3_buffer.c record/ssl3_record.c
|
||||
LIBOBJ= \
|
||||
s3_meth.o s3_srvr.o s3_clnt.o s3_lib.o s3_enc.o s3_pkt.o s3_both.o s3_cbc.o \
|
||||
s23_meth.o s23_srvr.o s23_clnt.o s23_lib.o s23_pkt.o \
|
||||
s3_msg.o \
|
||||
s23_meth.o s23_srvr.o s23_clnt.o s23_lib.o s23_pkt.o \
|
||||
t1_meth.o t1_srvr.o t1_clnt.o t1_lib.o t1_enc.o t1_ext.o \
|
||||
d1_meth.o d1_srvr.o d1_clnt.o d1_lib.o d1_pkt.o \
|
||||
d1_meth.o d1_srvr.o d1_clnt.o d1_lib.o d1_pkt.o d1_msg.o \
|
||||
d1_both.o d1_srtp.o\
|
||||
ssl_lib.o ssl_err2.o ssl_cert.o ssl_sess.o \
|
||||
ssl_ciph.o ssl_stat.o ssl_rsa.o \
|
||||
|
|
202
ssl/d1_msg.c
Normal file
202
ssl/d1_msg.c
Normal file
|
@ -0,0 +1,202 @@
|
|||
/* ssl/d1_msg.c */
|
||||
/*
|
||||
* DTLS implementation written by Nagendra Modadugu
|
||||
* (nagendra@cs.stanford.edu) for the OpenSSL project 2005.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-2015 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* openssl-core@openssl.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This product includes cryptographic software written by Eric Young
|
||||
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||
* Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
*/
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
#define USE_SOCKETS
|
||||
#include "ssl_locl.h"
|
||||
|
||||
int dtls1_write_app_data_bytes(SSL *s, int type, const void *buf_, int len)
|
||||
{
|
||||
int i;
|
||||
|
||||
#ifndef OPENSSL_NO_SCTP
|
||||
/*
|
||||
* Check if we have to continue an interrupted handshake for reading
|
||||
* belated app data with SCTP.
|
||||
*/
|
||||
if ((SSL_in_init(s) && !s->in_handshake) ||
|
||||
(BIO_dgram_is_sctp(SSL_get_wbio(s)) &&
|
||||
(s->state == DTLS1_SCTP_ST_SR_READ_SOCK
|
||||
|| s->state == DTLS1_SCTP_ST_CR_READ_SOCK)))
|
||||
#else
|
||||
if (SSL_in_init(s) && !s->in_handshake)
|
||||
#endif
|
||||
{
|
||||
i = s->handshake_func(s);
|
||||
if (i < 0)
|
||||
return (i);
|
||||
if (i == 0) {
|
||||
SSLerr(SSL_F_DTLS1_WRITE_APP_DATA_BYTES,
|
||||
SSL_R_SSL_HANDSHAKE_FAILURE);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (len > SSL3_RT_MAX_PLAIN_LENGTH) {
|
||||
SSLerr(SSL_F_DTLS1_WRITE_APP_DATA_BYTES, SSL_R_DTLS_MESSAGE_TOO_BIG);
|
||||
return -1;
|
||||
}
|
||||
|
||||
i = dtls1_write_bytes(s, type, buf_, len);
|
||||
return i;
|
||||
}
|
||||
|
||||
int dtls1_dispatch_alert(SSL *s)
|
||||
{
|
||||
int i, j;
|
||||
void (*cb) (const SSL *ssl, int type, int val) = NULL;
|
||||
unsigned char buf[DTLS1_AL_HEADER_LENGTH];
|
||||
unsigned char *ptr = &buf[0];
|
||||
|
||||
s->s3->alert_dispatch = 0;
|
||||
|
||||
memset(buf, 0x00, sizeof(buf));
|
||||
*ptr++ = s->s3->send_alert[0];
|
||||
*ptr++ = s->s3->send_alert[1];
|
||||
|
||||
#ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE
|
||||
if (s->s3->send_alert[1] == DTLS1_AD_MISSING_HANDSHAKE_MESSAGE) {
|
||||
s2n(s->d1->handshake_read_seq, ptr);
|
||||
l2n3(s->d1->r_msg_hdr.frag_off, ptr);
|
||||
}
|
||||
#endif
|
||||
|
||||
i = do_dtls1_write(s, SSL3_RT_ALERT, &buf[0], sizeof(buf), 0);
|
||||
if (i <= 0) {
|
||||
s->s3->alert_dispatch = 1;
|
||||
/* fprintf( stderr, "not done with alert\n" ); */
|
||||
} else {
|
||||
if (s->s3->send_alert[0] == SSL3_AL_FATAL
|
||||
#ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE
|
||||
|| s->s3->send_alert[1] == DTLS1_AD_MISSING_HANDSHAKE_MESSAGE
|
||||
#endif
|
||||
)
|
||||
(void)BIO_flush(s->wbio);
|
||||
|
||||
if (s->msg_callback)
|
||||
s->msg_callback(1, s->version, SSL3_RT_ALERT, s->s3->send_alert,
|
||||
2, s, s->msg_callback_arg);
|
||||
|
||||
if (s->info_callback != NULL)
|
||||
cb = s->info_callback;
|
||||
else if (s->ctx->info_callback != NULL)
|
||||
cb = s->ctx->info_callback;
|
||||
|
||||
if (cb != NULL) {
|
||||
j = (s->s3->send_alert[0] << 8) | s->s3->send_alert[1];
|
||||
cb(s, SSL_CB_WRITE_ALERT, j);
|
||||
}
|
||||
}
|
||||
return (i);
|
||||
}
|
84
ssl/d1_pkt.c
84
ssl/d1_pkt.c
|
@ -993,41 +993,6 @@ int dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
|
|||
return (-1);
|
||||
}
|
||||
|
||||
int dtls1_write_app_data_bytes(SSL *s, int type, const void *buf_, int len)
|
||||
{
|
||||
int i;
|
||||
|
||||
#ifndef OPENSSL_NO_SCTP
|
||||
/*
|
||||
* Check if we have to continue an interrupted handshake for reading
|
||||
* belated app data with SCTP.
|
||||
*/
|
||||
if ((SSL_in_init(s) && !s->in_handshake) ||
|
||||
(BIO_dgram_is_sctp(SSL_get_wbio(s)) &&
|
||||
(s->state == DTLS1_SCTP_ST_SR_READ_SOCK
|
||||
|| s->state == DTLS1_SCTP_ST_CR_READ_SOCK)))
|
||||
#else
|
||||
if (SSL_in_init(s) && !s->in_handshake)
|
||||
#endif
|
||||
{
|
||||
i = s->handshake_func(s);
|
||||
if (i < 0)
|
||||
return (i);
|
||||
if (i == 0) {
|
||||
SSLerr(SSL_F_DTLS1_WRITE_APP_DATA_BYTES,
|
||||
SSL_R_SSL_HANDSHAKE_FAILURE);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (len > SSL3_RT_MAX_PLAIN_LENGTH) {
|
||||
SSLerr(SSL_F_DTLS1_WRITE_APP_DATA_BYTES, SSL_R_DTLS_MESSAGE_TOO_BIG);
|
||||
return -1;
|
||||
}
|
||||
|
||||
i = dtls1_write_bytes(s, type, buf_, len);
|
||||
return i;
|
||||
}
|
||||
|
||||
/*
|
||||
* this only happens when a client hello is received and a handshake
|
||||
|
@ -1306,55 +1271,6 @@ void dtls1_record_bitmap_update(SSL *s, DTLS1_BITMAP *bitmap)
|
|||
}
|
||||
}
|
||||
|
||||
int dtls1_dispatch_alert(SSL *s)
|
||||
{
|
||||
int i, j;
|
||||
void (*cb) (const SSL *ssl, int type, int val) = NULL;
|
||||
unsigned char buf[DTLS1_AL_HEADER_LENGTH];
|
||||
unsigned char *ptr = &buf[0];
|
||||
|
||||
s->s3->alert_dispatch = 0;
|
||||
|
||||
memset(buf, 0x00, sizeof(buf));
|
||||
*ptr++ = s->s3->send_alert[0];
|
||||
*ptr++ = s->s3->send_alert[1];
|
||||
|
||||
#ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE
|
||||
if (s->s3->send_alert[1] == DTLS1_AD_MISSING_HANDSHAKE_MESSAGE) {
|
||||
s2n(s->d1->handshake_read_seq, ptr);
|
||||
l2n3(s->d1->r_msg_hdr.frag_off, ptr);
|
||||
}
|
||||
#endif
|
||||
|
||||
i = do_dtls1_write(s, SSL3_RT_ALERT, &buf[0], sizeof(buf), 0);
|
||||
if (i <= 0) {
|
||||
s->s3->alert_dispatch = 1;
|
||||
/* fprintf( stderr, "not done with alert\n" ); */
|
||||
} else {
|
||||
if (s->s3->send_alert[0] == SSL3_AL_FATAL
|
||||
#ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE
|
||||
|| s->s3->send_alert[1] == DTLS1_AD_MISSING_HANDSHAKE_MESSAGE
|
||||
#endif
|
||||
)
|
||||
(void)BIO_flush(s->wbio);
|
||||
|
||||
if (s->msg_callback)
|
||||
s->msg_callback(1, s->version, SSL3_RT_ALERT, s->s3->send_alert,
|
||||
2, s, s->msg_callback_arg);
|
||||
|
||||
if (s->info_callback != NULL)
|
||||
cb = s->info_callback;
|
||||
else if (s->ctx->info_callback != NULL)
|
||||
cb = s->ctx->info_callback;
|
||||
|
||||
if (cb != NULL) {
|
||||
j = (s->s3->send_alert[0] << 8) | s->s3->send_alert[1];
|
||||
cb(s, SSL_CB_WRITE_ALERT, j);
|
||||
}
|
||||
}
|
||||
return (i);
|
||||
}
|
||||
|
||||
DTLS1_BITMAP *dtls1_get_bitmap(SSL *s, SSL3_RECORD *rr,
|
||||
unsigned int *is_next_epoch)
|
||||
{
|
||||
|
|
226
ssl/s3_msg.c
Normal file
226
ssl/s3_msg.c
Normal file
|
@ -0,0 +1,226 @@
|
|||
/* ssl/s3_msg.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-2015 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* openssl-core@openssl.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This product includes cryptographic software written by Eric Young
|
||||
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||
* Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
*/
|
||||
|
||||
#define USE_SOCKETS
|
||||
#include "ssl_locl.h"
|
||||
|
||||
int ssl3_do_change_cipher_spec(SSL *s)
|
||||
{
|
||||
int i;
|
||||
const char *sender;
|
||||
int slen;
|
||||
|
||||
if (s->state & SSL_ST_ACCEPT)
|
||||
i = SSL3_CHANGE_CIPHER_SERVER_READ;
|
||||
else
|
||||
i = SSL3_CHANGE_CIPHER_CLIENT_READ;
|
||||
|
||||
if (s->s3->tmp.key_block == NULL) {
|
||||
if (s->session == NULL || s->session->master_key_length == 0) {
|
||||
/* might happen if dtls1_read_bytes() calls this */
|
||||
SSLerr(SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC,
|
||||
SSL_R_CCS_RECEIVED_EARLY);
|
||||
return (0);
|
||||
}
|
||||
|
||||
s->session->cipher = s->s3->tmp.new_cipher;
|
||||
if (!s->method->ssl3_enc->setup_key_block(s))
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (!s->method->ssl3_enc->change_cipher_state(s, i))
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* we have to record the message digest at this point so we can get it
|
||||
* before we read the finished message
|
||||
*/
|
||||
if (s->state & SSL_ST_CONNECT) {
|
||||
sender = s->method->ssl3_enc->server_finished_label;
|
||||
slen = s->method->ssl3_enc->server_finished_label_len;
|
||||
} else {
|
||||
sender = s->method->ssl3_enc->client_finished_label;
|
||||
slen = s->method->ssl3_enc->client_finished_label_len;
|
||||
}
|
||||
|
||||
i = s->method->ssl3_enc->final_finish_mac(s,
|
||||
sender, slen,
|
||||
s->s3->tmp.peer_finish_md);
|
||||
if (i == 0) {
|
||||
SSLerr(SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC, ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
}
|
||||
s->s3->tmp.peer_finish_md_len = i;
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
||||
int ssl3_send_alert(SSL *s, int level, int desc)
|
||||
{
|
||||
/* Map tls/ssl alert value to correct one */
|
||||
desc = s->method->ssl3_enc->alert_value(desc);
|
||||
if (s->version == SSL3_VERSION && desc == SSL_AD_PROTOCOL_VERSION)
|
||||
desc = SSL_AD_HANDSHAKE_FAILURE; /* SSL 3.0 does not have
|
||||
* protocol_version alerts */
|
||||
if (desc < 0)
|
||||
return -1;
|
||||
/* If a fatal one, remove from cache */
|
||||
if ((level == SSL3_AL_FATAL) && (s->session != NULL))
|
||||
SSL_CTX_remove_session(s->ctx, s->session);
|
||||
|
||||
s->s3->alert_dispatch = 1;
|
||||
s->s3->send_alert[0] = level;
|
||||
s->s3->send_alert[1] = desc;
|
||||
if (SSL3_BUFFER_get_left(RECORD_LAYER_get_wbuf(&s->rlayer)) == 0) {
|
||||
/* data still being written out? */
|
||||
return s->method->ssl_dispatch_alert(s);
|
||||
}
|
||||
/*
|
||||
* else data is still being written out, we will get written some time in
|
||||
* the future
|
||||
*/
|
||||
return -1;
|
||||
}
|
||||
|
||||
int ssl3_dispatch_alert(SSL *s)
|
||||
{
|
||||
int i, j;
|
||||
void (*cb) (const SSL *ssl, int type, int val) = NULL;
|
||||
|
||||
s->s3->alert_dispatch = 0;
|
||||
i = do_ssl3_write(s, SSL3_RT_ALERT, &s->s3->send_alert[0], 2, 0);
|
||||
if (i <= 0) {
|
||||
s->s3->alert_dispatch = 1;
|
||||
} else {
|
||||
/*
|
||||
* Alert sent to BIO. If it is important, flush it now. If the
|
||||
* message does not get sent due to non-blocking IO, we will not
|
||||
* worry too much.
|
||||
*/
|
||||
if (s->s3->send_alert[0] == SSL3_AL_FATAL)
|
||||
(void)BIO_flush(s->wbio);
|
||||
|
||||
if (s->msg_callback)
|
||||
s->msg_callback(1, s->version, SSL3_RT_ALERT, s->s3->send_alert,
|
||||
2, s, s->msg_callback_arg);
|
||||
|
||||
if (s->info_callback != NULL)
|
||||
cb = s->info_callback;
|
||||
else if (s->ctx->info_callback != NULL)
|
||||
cb = s->ctx->info_callback;
|
||||
|
||||
if (cb != NULL) {
|
||||
j = (s->s3->send_alert[0] << 8) | s->s3->send_alert[1];
|
||||
cb(s, SSL_CB_WRITE_ALERT, j);
|
||||
}
|
||||
}
|
||||
return (i);
|
||||
}
|
118
ssl/s3_pkt.c
118
ssl/s3_pkt.c
|
@ -132,9 +132,6 @@
|
|||
# define EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK 0
|
||||
#endif
|
||||
|
||||
static int do_ssl3_write(SSL *s, int type, const unsigned char *buf,
|
||||
unsigned int len, int create_empty_fragment);
|
||||
|
||||
int ssl3_read_n(SSL *s, int n, int max, int extend)
|
||||
{
|
||||
/*
|
||||
|
@ -518,8 +515,8 @@ int ssl3_write_bytes(SSL *s, int type, const void *buf_, int len)
|
|||
}
|
||||
}
|
||||
|
||||
static int do_ssl3_write(SSL *s, int type, const unsigned char *buf,
|
||||
unsigned int len, int create_empty_fragment)
|
||||
int do_ssl3_write(SSL *s, int type, const unsigned char *buf,
|
||||
unsigned int len, int create_empty_fragment)
|
||||
{
|
||||
unsigned char *p, *plen;
|
||||
int i, mac_size, clear = 0;
|
||||
|
@ -1300,115 +1297,4 @@ int ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
|
|||
return (-1);
|
||||
}
|
||||
|
||||
int ssl3_do_change_cipher_spec(SSL *s)
|
||||
{
|
||||
int i;
|
||||
const char *sender;
|
||||
int slen;
|
||||
|
||||
if (s->state & SSL_ST_ACCEPT)
|
||||
i = SSL3_CHANGE_CIPHER_SERVER_READ;
|
||||
else
|
||||
i = SSL3_CHANGE_CIPHER_CLIENT_READ;
|
||||
|
||||
if (s->s3->tmp.key_block == NULL) {
|
||||
if (s->session == NULL || s->session->master_key_length == 0) {
|
||||
/* might happen if dtls1_read_bytes() calls this */
|
||||
SSLerr(SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC,
|
||||
SSL_R_CCS_RECEIVED_EARLY);
|
||||
return (0);
|
||||
}
|
||||
|
||||
s->session->cipher = s->s3->tmp.new_cipher;
|
||||
if (!s->method->ssl3_enc->setup_key_block(s))
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (!s->method->ssl3_enc->change_cipher_state(s, i))
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* we have to record the message digest at this point so we can get it
|
||||
* before we read the finished message
|
||||
*/
|
||||
if (s->state & SSL_ST_CONNECT) {
|
||||
sender = s->method->ssl3_enc->server_finished_label;
|
||||
slen = s->method->ssl3_enc->server_finished_label_len;
|
||||
} else {
|
||||
sender = s->method->ssl3_enc->client_finished_label;
|
||||
slen = s->method->ssl3_enc->client_finished_label_len;
|
||||
}
|
||||
|
||||
i = s->method->ssl3_enc->final_finish_mac(s,
|
||||
sender, slen,
|
||||
s->s3->tmp.peer_finish_md);
|
||||
if (i == 0) {
|
||||
SSLerr(SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC, ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
}
|
||||
s->s3->tmp.peer_finish_md_len = i;
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
||||
int ssl3_send_alert(SSL *s, int level, int desc)
|
||||
{
|
||||
/* Map tls/ssl alert value to correct one */
|
||||
desc = s->method->ssl3_enc->alert_value(desc);
|
||||
if (s->version == SSL3_VERSION && desc == SSL_AD_PROTOCOL_VERSION)
|
||||
desc = SSL_AD_HANDSHAKE_FAILURE; /* SSL 3.0 does not have
|
||||
* protocol_version alerts */
|
||||
if (desc < 0)
|
||||
return -1;
|
||||
/* If a fatal one, remove from cache */
|
||||
if ((level == SSL3_AL_FATAL) && (s->session != NULL))
|
||||
SSL_CTX_remove_session(s->ctx, s->session);
|
||||
|
||||
s->s3->alert_dispatch = 1;
|
||||
s->s3->send_alert[0] = level;
|
||||
s->s3->send_alert[1] = desc;
|
||||
if (SSL3_BUFFER_get_left(RECORD_LAYER_get_wbuf(&s->rlayer)) == 0) {
|
||||
/* data still being written out? */
|
||||
return s->method->ssl_dispatch_alert(s);
|
||||
}
|
||||
/*
|
||||
* else data is still being written out, we will get written some time in
|
||||
* the future
|
||||
*/
|
||||
return -1;
|
||||
}
|
||||
|
||||
int ssl3_dispatch_alert(SSL *s)
|
||||
{
|
||||
int i, j;
|
||||
void (*cb) (const SSL *ssl, int type, int val) = NULL;
|
||||
|
||||
s->s3->alert_dispatch = 0;
|
||||
i = do_ssl3_write(s, SSL3_RT_ALERT, &s->s3->send_alert[0], 2, 0);
|
||||
if (i <= 0) {
|
||||
s->s3->alert_dispatch = 1;
|
||||
} else {
|
||||
/*
|
||||
* Alert sent to BIO. If it is important, flush it now. If the
|
||||
* message does not get sent due to non-blocking IO, we will not
|
||||
* worry too much.
|
||||
*/
|
||||
if (s->s3->send_alert[0] == SSL3_AL_FATAL)
|
||||
(void)BIO_flush(s->wbio);
|
||||
|
||||
if (s->msg_callback)
|
||||
s->msg_callback(1, s->version, SSL3_RT_ALERT, s->s3->send_alert,
|
||||
2, s, s->msg_callback_arg);
|
||||
|
||||
if (s->info_callback != NULL)
|
||||
cb = s->info_callback;
|
||||
else if (s->ctx->info_callback != NULL)
|
||||
cb = s->ctx->info_callback;
|
||||
|
||||
if (cb != NULL) {
|
||||
j = (s->s3->send_alert[0] << 8) | s->s3->send_alert[1];
|
||||
cb(s, SSL_CB_WRITE_ALERT, j);
|
||||
}
|
||||
}
|
||||
return (i);
|
||||
}
|
||||
|
|
|
@ -2135,6 +2135,8 @@ __owur int ssl_allow_compression(SSL *s);
|
|||
|
||||
__owur long tls1_default_timeout(void);
|
||||
__owur int dtls1_do_write(SSL *s, int type);
|
||||
__owur int do_ssl3_write(SSL *s, int type, const unsigned char *buf,
|
||||
unsigned int len, int create_empty_fragment);
|
||||
__owur int ssl3_read_n(SSL *s, int n, int max, int extend);
|
||||
__owur int dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek);
|
||||
__owur int ssl3_write_pending(SSL *s, int type, const unsigned char *buf,
|
||||
|
|
Loading…
Reference in a new issue