19a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom/* ssl/t1_reneg.c */
29a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
39a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * All rights reserved.
49a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *
59a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * This package is an SSL implementation written
69a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * by Eric Young (eay@cryptsoft.com).
79a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * The implementation was written so as to conform with Netscapes SSL.
89a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *
99a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * This library is free for commercial and non-commercial use as long as
109a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * the following conditions are aheared to.  The following conditions
119a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * apply to all code found in this distribution, be it the RC4, RSA,
129a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
139a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * included with this distribution is covered by the same copyright terms
149a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * except that the holder is Tim Hudson (tjh@cryptsoft.com).
159a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *
169a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * Copyright remains Eric Young's, and as such any Copyright notices in
179a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * the code are not to be removed.
189a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * If this package is used in a product, Eric Young should be given attribution
199a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * as the author of the parts of the library used.
209a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * This can be in the form of a textual message at program startup or
219a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * in documentation (online or textual) provided with the package.
229a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *
239a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * Redistribution and use in source and binary forms, with or without
249a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * modification, are permitted provided that the following conditions
259a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * are met:
269a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * 1. Redistributions of source code must retain the copyright
279a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *    notice, this list of conditions and the following disclaimer.
289a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * 2. Redistributions in binary form must reproduce the above copyright
299a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *    notice, this list of conditions and the following disclaimer in the
309a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *    documentation and/or other materials provided with the distribution.
319a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * 3. All advertising materials mentioning features or use of this software
329a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *    must display the following acknowledgement:
339a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *    "This product includes cryptographic software written by
349a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *     Eric Young (eay@cryptsoft.com)"
359a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *    The word 'cryptographic' can be left out if the rouines from the library
369a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *    being used are not cryptographic related :-).
379a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * 4. If you include any Windows specific code (or a derivative thereof) from
389a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *    the apps directory (application code) you must include an acknowledgement:
399a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
409a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *
419a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
429a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
439a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
449a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
459a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
469a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
479a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
489a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
499a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
509a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
519a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * SUCH DAMAGE.
529a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *
539a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * The licence and distribution terms for any publically available version or
549a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * derivative of this code cannot be changed.  i.e. this code cannot simply be
559a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * copied and put under another distribution licence
569a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * [including the GNU Public Licence.]
579a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom */
589a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom/* ====================================================================
599a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * Copyright (c) 1998-2009 The OpenSSL Project.  All rights reserved.
609a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *
619a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * Redistribution and use in source and binary forms, with or without
629a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * modification, are permitted provided that the following conditions
639a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * are met:
649a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *
659a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * 1. Redistributions of source code must retain the above copyright
669a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *    notice, this list of conditions and the following disclaimer.
679a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *
689a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * 2. Redistributions in binary form must reproduce the above copyright
699a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *    notice, this list of conditions and the following disclaimer in
709a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *    the documentation and/or other materials provided with the
719a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *    distribution.
729a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *
739a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * 3. All advertising materials mentioning features or use of this
749a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *    software must display the following acknowledgment:
759a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *    "This product includes software developed by the OpenSSL Project
769a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
779a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *
789a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
799a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *    endorse or promote products derived from this software without
809a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *    prior written permission. For written permission, please contact
819a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *    openssl-core@openssl.org.
829a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *
839a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * 5. Products derived from this software may not be called "OpenSSL"
849a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *    nor may "OpenSSL" appear in their names without prior written
859a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *    permission of the OpenSSL Project.
869a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *
879a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * 6. Redistributions of any form whatsoever must retain the following
889a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *    acknowledgment:
899a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *    "This product includes software developed by the OpenSSL Project
909a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
919a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *
929a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
939a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
949a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
959a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
969a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
979a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
989a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
999a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
1009a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
1019a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1029a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
1039a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * OF THE POSSIBILITY OF SUCH DAMAGE.
1049a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * ====================================================================
1059a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *
1069a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * This product includes cryptographic software written by Eric Young
1079a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * (eay@cryptsoft.com).  This product includes software written by Tim
1089a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom * Hudson (tjh@cryptsoft.com).
1099a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom *
1109a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom */
1119a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom#include <stdio.h>
1129a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom#include <openssl/objects.h>
1139a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom#include "ssl_locl.h"
1149a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
1159a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom/* Add the client's renegotiation binding */
1169a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstromint ssl_add_clienthello_renegotiate_ext(SSL *s, unsigned char *p, int *len,
1179a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom					int maxlen)
1189a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    {
1199a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    if(p)
1209a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        {
1219a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom	if((s->s3->previous_client_finished_len+1) > maxlen)
1229a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom            {
1239a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom            SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_RENEGOTIATE_EXT,SSL_R_RENEGOTIATE_EXT_TOO_LONG);
1249a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom            return 0;
1259a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom            }
1269a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
1279a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        /* Length byte */
1289a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom	*p = s->s3->previous_client_finished_len;
1299a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        p++;
1309a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
1319a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        memcpy(p, s->s3->previous_client_finished,
1329a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom	       s->s3->previous_client_finished_len);
1339a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom#ifdef OPENSSL_RI_DEBUG
1349a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    fprintf(stderr, "%s RI extension sent by client\n",
1359a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom		s->s3->previous_client_finished_len ? "Non-empty" : "Empty");
1369a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom#endif
1379a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        }
1389a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
1399a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    *len=s->s3->previous_client_finished_len + 1;
1409a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
1419a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
1429a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    return 1;
1439a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    }
1449a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
1459a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom/* Parse the client's renegotiation binding and abort if it's not
1469a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom   right */
1479a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstromint ssl_parse_clienthello_renegotiate_ext(SSL *s, unsigned char *d, int len,
1489a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom					  int *al)
1499a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    {
1509a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    int ilen;
1519a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
1529a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    /* Parse the length byte */
1539a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    if(len < 1)
1549a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        {
1559a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_RENEGOTIATE_EXT,SSL_R_RENEGOTIATION_ENCODING_ERR);
1569a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        *al=SSL_AD_ILLEGAL_PARAMETER;
1579a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        return 0;
1589a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        }
1599a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    ilen = *d;
1609a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    d++;
1619a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
1629a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    /* Consistency check */
1639a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    if((ilen+1) != len)
1649a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        {
1659a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_RENEGOTIATE_EXT,SSL_R_RENEGOTIATION_ENCODING_ERR);
1669a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        *al=SSL_AD_ILLEGAL_PARAMETER;
1679a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        return 0;
1689a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        }
1699a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
1709a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    /* Check that the extension matches */
1719a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    if(ilen != s->s3->previous_client_finished_len)
1729a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        {
1739a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_RENEGOTIATE_EXT,SSL_R_RENEGOTIATION_MISMATCH);
1749a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        *al=SSL_AD_HANDSHAKE_FAILURE;
1759a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        return 0;
1769a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        }
1779a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
1789a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    if(memcmp(d, s->s3->previous_client_finished,
1799a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom	      s->s3->previous_client_finished_len))
1809a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        {
1819a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_RENEGOTIATE_EXT,SSL_R_RENEGOTIATION_MISMATCH);
1829a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        *al=SSL_AD_HANDSHAKE_FAILURE;
1839a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        return 0;
1849a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        }
1859a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom#ifdef OPENSSL_RI_DEBUG
1869a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    fprintf(stderr, "%s RI extension received by server\n",
1879a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom				ilen ? "Non-empty" : "Empty");
1889a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom#endif
1899a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
1909a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    s->s3->send_connection_binding=1;
1919a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
1929a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    return 1;
1939a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    }
1949a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
1959a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom/* Add the server's renegotiation binding */
1969a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstromint ssl_add_serverhello_renegotiate_ext(SSL *s, unsigned char *p, int *len,
1979a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom					int maxlen)
1989a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    {
1999a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    if(p)
2009a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        {
2019a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        if((s->s3->previous_client_finished_len +
2029a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom            s->s3->previous_server_finished_len + 1) > maxlen)
2039a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom            {
2049a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom            SSLerr(SSL_F_SSL_ADD_SERVERHELLO_RENEGOTIATE_EXT,SSL_R_RENEGOTIATE_EXT_TOO_LONG);
2059a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom            return 0;
2069a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom            }
2079a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
2089a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        /* Length byte */
2099a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        *p = s->s3->previous_client_finished_len + s->s3->previous_server_finished_len;
2109a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        p++;
2119a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
2129a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        memcpy(p, s->s3->previous_client_finished,
2139a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom	       s->s3->previous_client_finished_len);
2149a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        p += s->s3->previous_client_finished_len;
2159a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
2169a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        memcpy(p, s->s3->previous_server_finished,
2179a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom	       s->s3->previous_server_finished_len);
2189a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom#ifdef OPENSSL_RI_DEBUG
2199a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    fprintf(stderr, "%s RI extension sent by server\n",
2209a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    		s->s3->previous_client_finished_len ? "Non-empty" : "Empty");
2219a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom#endif
2229a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        }
2239a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
2249a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    *len=s->s3->previous_client_finished_len
2259a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom	+ s->s3->previous_server_finished_len + 1;
2269a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
2279a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    return 1;
2289a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    }
2299a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
2309a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom/* Parse the server's renegotiation binding and abort if it's not
2319a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom   right */
2329a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstromint ssl_parse_serverhello_renegotiate_ext(SSL *s, unsigned char *d, int len,
2339a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom					  int *al)
2349a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    {
2359a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    int expected_len=s->s3->previous_client_finished_len
2369a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom	+ s->s3->previous_server_finished_len;
2379a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    int ilen;
2389a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
2399a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    /* Check for logic errors */
2409a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    OPENSSL_assert(!expected_len || s->s3->previous_client_finished_len);
2419a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    OPENSSL_assert(!expected_len || s->s3->previous_server_finished_len);
2429a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
2439a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    /* Parse the length byte */
2449a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    if(len < 1)
2459a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        {
2469a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT,SSL_R_RENEGOTIATION_ENCODING_ERR);
2479a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        *al=SSL_AD_ILLEGAL_PARAMETER;
2489a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        return 0;
2499a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        }
2509a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    ilen = *d;
2519a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    d++;
2529a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
2539a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    /* Consistency check */
2549a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    if(ilen+1 != len)
2559a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        {
2569a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT,SSL_R_RENEGOTIATION_ENCODING_ERR);
2579a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        *al=SSL_AD_ILLEGAL_PARAMETER;
2589a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        return 0;
2599a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        }
2609a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
2619a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    /* Check that the extension matches */
2629a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    if(ilen != expected_len)
2639a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        {
2649a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT,SSL_R_RENEGOTIATION_MISMATCH);
2659a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        *al=SSL_AD_HANDSHAKE_FAILURE;
2669a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        return 0;
2679a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        }
2689a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
2699a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    if(memcmp(d, s->s3->previous_client_finished,
2709a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom	      s->s3->previous_client_finished_len))
2719a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        {
2729a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT,SSL_R_RENEGOTIATION_MISMATCH);
2739a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        *al=SSL_AD_HANDSHAKE_FAILURE;
2749a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        return 0;
2759a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        }
2769a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    d += s->s3->previous_client_finished_len;
2779a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
2789a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    if(memcmp(d, s->s3->previous_server_finished,
2799a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom	      s->s3->previous_server_finished_len))
2809a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        {
2819a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT,SSL_R_RENEGOTIATION_MISMATCH);
2829a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        *al=SSL_AD_ILLEGAL_PARAMETER;
2839a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        return 0;
2849a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom        }
2859a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom#ifdef OPENSSL_RI_DEBUG
2869a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    fprintf(stderr, "%s RI extension received by client\n",
2879a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom				ilen ? "Non-empty" : "Empty");
2889a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom#endif
2899a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    s->s3->send_connection_binding=1;
2909a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom
2919a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    return 1;
2929a830ab822682a48105b28e501d6f7c1077557c7Brian Carlstrom    }
293