1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* apps/s_cb.c - callback functions used by s_client, s_server, and s_time */ 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * All rights reserved. 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This package is an SSL implementation written 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * by Eric Young (eay@cryptsoft.com). 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The implementation was written so as to conform with Netscapes SSL. 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This library is free for commercial and non-commercial use as long as 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the following conditions are aheared to. The following conditions 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * apply to all code found in this distribution, be it the RC4, RSA, 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * included with this distribution is covered by the same copyright terms 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright remains Eric Young's, and as such any Copyright notices in 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the code are not to be removed. 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If this package is used in a product, Eric Young should be given attribution 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * as the author of the parts of the library used. 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This can be in the form of a textual message at program startup or 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in documentation (online or textual) provided with the package. 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met: 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the copyright 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer. 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer in the 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * documentation and/or other materials provided with the distribution. 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this software 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * must display the following acknowledgement: 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes cryptographic software written by 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Eric Young (eay@cryptsoft.com)" 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The word 'cryptographic' can be left out if the rouines from the library 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * being used are not cryptographic related :-). 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. If you include any Windows specific code (or a derivative thereof) from 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the apps directory (application code) you must include an acknowledgement: 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SUCH DAMAGE. 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The licence and distribution terms for any publically available version or 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * derivative of this code cannot be changed. i.e. this code cannot simply be 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * copied and put under another distribution licence 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * [including the GNU Public Licence.] 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* ==================================================================== 59221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met: 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the above copyright 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer. 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer in 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the documentation and/or other materials provided with the 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * distribution. 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * software must display the following acknowledgment: 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software developed by the OpenSSL Project 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * endorse or promote products derived from this software without 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * prior written permission. For written permission, please contact 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * openssl-core@openssl.org. 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5. Products derived from this software may not be called "OpenSSL" 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * nor may "OpenSSL" appear in their names without prior written 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * permission of the OpenSSL Project. 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 6. Redistributions of any form whatsoever must retain the following 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * acknowledgment: 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software developed by the OpenSSL Project 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * for use in the OpenSSL Toolkit (http://www.openssl.org/)" 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OF THE POSSIBILITY OF SUCH DAMAGE. 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ==================================================================== 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This product includes cryptographic software written by Eric Young 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (eay@cryptsoft.com). This product includes software written by Tim 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Hudson (tjh@cryptsoft.com). 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h> 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdlib.h> 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define USE_SOCKETS 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define NON_MAIN 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "apps.h" 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef NON_MAIN 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef USE_SOCKETS 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/err.h> 12098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom#include <openssl/rand.h> 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/x509.h> 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/ssl.h> 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "s_apps.h" 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 12598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom#define COOKIE_SECRET_LENGTH 16 12698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint verify_depth=0; 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint verify_error=X509_V_OK; 129221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint verify_return_error=0; 13098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstromunsigned char cookie_secret[COOKIE_SECRET_LENGTH]; 13198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstromint cookie_initialized=0; 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx) 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509 *err_cert; 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int err,depth; 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project err_cert=X509_STORE_CTX_get_current_cert(ctx); 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project err= X509_STORE_CTX_get_error(ctx); 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project depth= X509_STORE_CTX_get_error_depth(ctx); 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 142221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err,"depth=%d ",depth); 143221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (err_cert) 144221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 145221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509_NAME_print_ex(bio_err, X509_get_subject_name(err_cert), 146221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 0, XN_FLAG_ONELINE); 147221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_puts(bio_err, "\n"); 148221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 149221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 150221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_puts(bio_err, "<no cert>\n"); 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!ok) 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"verify error:num=%d:%s\n",err, 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_verify_cert_error_string(err)); 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (verify_depth >= depth) 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 157221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!verify_return_error) 158221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ok=1; 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project verify_error=X509_V_OK; 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ok=0; 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project verify_error=X509_V_ERR_CERT_CHAIN_TOO_LONG; 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 167221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom switch (err) 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT: 170221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_puts(bio_err,"issuer= "); 171221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509_NAME_print_ex(bio_err, X509_get_issuer_name(err_cert), 172221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 0, XN_FLAG_ONELINE); 173221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_puts(bio_err, "\n"); 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case X509_V_ERR_CERT_NOT_YET_VALID: 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD: 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"notBefore="); 178221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_TIME_print(bio_err,X509_get_notBefore(err_cert)); 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"\n"); 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case X509_V_ERR_CERT_HAS_EXPIRED: 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD: 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"notAfter="); 184221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_TIME_print(bio_err,X509_get_notAfter(err_cert)); 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"\n"); 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 187221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case X509_V_ERR_NO_EXPLICIT_POLICY: 188221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom policies_print(bio_err, ctx); 189221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 191221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (err == X509_V_OK && ok == 2) 192221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom policies_print(bio_err, ctx); 193221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"verify return:%d\n",ok); 195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ok); 196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint set_cert_stuff(SSL_CTX *ctx, char *cert_file, char *key_file) 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cert_file != NULL) 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* 203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL *ssl; 204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509 *x509; 205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (SSL_CTX_use_certificate_file(ctx,cert_file, 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_FILETYPE_PEM) <= 0) 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"unable to get certificate from '%s'\n",cert_file); 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (key_file == NULL) key_file=cert_file; 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (SSL_CTX_use_PrivateKey_file(ctx,key_file, 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_FILETYPE_PEM) <= 0) 217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"unable to get private key from '%s'\n",key_file); 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project In theory this is no longer needed 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ssl=SSL_new(ctx); 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project x509=SSL_get_certificate(ssl); 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (x509 != NULL) { 229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_PKEY *pktmp; 230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pktmp = X509_get_pubkey(x509); 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_PKEY_copy_parameters(pktmp, 232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_get_privatekey(ssl)); 233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_PKEY_free(pktmp); 234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_free(ssl); 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* If we are using DSA, we can copy the parameters from 239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the private key */ 24004ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom 24104ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Now we know that a key and cert have been set against 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the SSL context */ 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!SSL_CTX_check_private_key(ctx)) 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"Private key does not match the certificate public key\n"); 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(1); 251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint set_cert_key_stuff(SSL_CTX *ctx, X509 *cert, EVP_PKEY *key) 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cert == NULL) 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (SSL_CTX_use_certificate(ctx,cert) <= 0) 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"error setting certificate\n"); 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (SSL_CTX_use_PrivateKey(ctx,key) <= 0) 264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"error setting private key\n"); 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Now we know that a key and cert have been set against 272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the SSL context */ 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!SSL_CTX_check_private_key(ctx)) 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"Private key does not match the certificate public key\n"); 276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectlong MS_CALLBACK bio_dump_callback(BIO *bio, int cmd, const char *argp, 282221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int argi, long argl, long ret) 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *out; 285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project out=(BIO *)BIO_get_callback_arg(bio); 287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (out == NULL) return(ret); 288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cmd == (BIO_CB_READ|BIO_CB_RETURN)) 290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 291221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(out,"read from %p [%p] (%lu bytes => %ld (0x%lX))\n", 292221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom (void *)bio,argp,(unsigned long)argi,ret,ret); 293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_dump(out,argp,(int)ret); 294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret); 295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (cmd == (BIO_CB_WRITE|BIO_CB_RETURN)) 297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 298221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(out,"write to %p [%p] (%lu bytes => %ld (0x%lX))\n", 299221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom (void *)bio,argp,(unsigned long)argi,ret,ret); 300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_dump(out,argp,(int)ret); 301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret); 303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid MS_CALLBACK apps_ssl_info_callback(const SSL *s, int where, int ret) 306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const char *str; 308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int w; 309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project w=where& ~SSL_ST_MASK; 311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (w & SSL_ST_CONNECT) str="SSL_connect"; 313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (w & SSL_ST_ACCEPT) str="SSL_accept"; 314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else str="undefined"; 315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (where & SSL_CB_LOOP) 317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%s:%s\n",str,SSL_state_string_long(s)); 319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (where & SSL_CB_ALERT) 321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str=(where & SSL_CB_READ)?"read":"write"; 323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"SSL3 alert %s:%s:%s\n", 324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str, 325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_alert_type_string_long(ret), 326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_alert_desc_string_long(ret)); 327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (where & SSL_CB_EXIT) 329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret == 0) 331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%s:failed in %s\n", 332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str,SSL_state_string_long(s)); 333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (ret < 0) 334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%s:error in %s\n", 336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str,SSL_state_string_long(s)); 337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid MS_CALLBACK msg_cb(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg) 343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *bio = arg; 345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const char *str_write_p, *str_version, *str_content_type = "", *str_details1 = "", *str_details2= ""; 346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_write_p = write_p ? ">>>" : "<<<"; 348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (version) 350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case SSL2_VERSION: 352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_version = "SSL 2.0"; 353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case SSL3_VERSION: 355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_version = "SSL 3.0 "; 356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case TLS1_VERSION: 358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_version = "TLS 1.0 "; 359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 360392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case TLS1_1_VERSION: 361392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom str_version = "TLS 1.1 "; 362392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 363392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case TLS1_2_VERSION: 364392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom str_version = "TLS 1.2 "; 365392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 36698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom case DTLS1_VERSION: 36798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom str_version = "DTLS 1.0 "; 36898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom break; 36998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom case DTLS1_BAD_VER: 37098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom str_version = "DTLS 1.0 (bad) "; 37198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom break; 372221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom default: 373221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom str_version = "???"; 374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (version == SSL2_VERSION) 377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details1 = "???"; 379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (len > 0) 381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (((const unsigned char*)buf)[0]) 383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 0: 385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details1 = ", ERROR:"; 386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " ???"; 387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (len >= 3) 388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned err = (((const unsigned char*)buf)[1]<<8) + ((const unsigned char*)buf)[2]; 390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (err) 392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 0x0001: 394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " NO-CIPHER-ERROR"; 395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 0x0002: 397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " NO-CERTIFICATE-ERROR"; 398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 0x0004: 400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " BAD-CERTIFICATE-ERROR"; 401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 0x0006: 403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " UNSUPPORTED-CERTIFICATE-TYPE-ERROR"; 404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 1: 410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details1 = ", CLIENT-HELLO"; 411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 2: 413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details1 = ", CLIENT-MASTER-KEY"; 414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 3: 416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details1 = ", CLIENT-FINISHED"; 417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 4: 419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details1 = ", SERVER-HELLO"; 420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 5: 422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details1 = ", SERVER-VERIFY"; 423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 6: 425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details1 = ", SERVER-FINISHED"; 426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 7: 428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details1 = ", REQUEST-CERTIFICATE"; 429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 8: 431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details1 = ", CLIENT-CERTIFICATE"; 432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 43798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (version == SSL3_VERSION || 43898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom version == TLS1_VERSION || 43904ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom version == TLS1_1_VERSION || 44004ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom version == TLS1_2_VERSION || 44198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom version == DTLS1_VERSION || 44298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom version == DTLS1_BAD_VER) 443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (content_type) 445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 20: 447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_content_type = "ChangeCipherSpec"; 448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 21: 450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_content_type = "Alert"; 451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 22: 453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_content_type = "Handshake"; 454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (content_type == 21) /* Alert */ 458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details1 = ", ???"; 460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (len == 2) 462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (((const unsigned char*)buf)[0]) 464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 1: 466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details1 = ", warning"; 467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 2: 469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details1 = ", fatal"; 470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " ???"; 474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (((const unsigned char*)buf)[1]) 475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 0: 477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " close_notify"; 478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 10: 480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " unexpected_message"; 481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 20: 483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " bad_record_mac"; 484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 21: 486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " decryption_failed"; 487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 22: 489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " record_overflow"; 490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 30: 492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " decompression_failure"; 493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 40: 495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " handshake_failure"; 496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 42: 498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " bad_certificate"; 499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 43: 501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " unsupported_certificate"; 502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 44: 504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " certificate_revoked"; 505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 45: 507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " certificate_expired"; 508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 46: 510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " certificate_unknown"; 511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 47: 513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " illegal_parameter"; 514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 48: 516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " unknown_ca"; 517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 49: 519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " access_denied"; 520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 50: 522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " decode_error"; 523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 51: 525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " decrypt_error"; 526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 60: 528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " export_restriction"; 529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 70: 531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " protocol_version"; 532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 71: 534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " insufficient_security"; 535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 80: 537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " internal_error"; 538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 90: 540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " user_canceled"; 541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 100: 543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details2 = " no_renegotiation"; 544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 545221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case 110: 546221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom str_details2 = " unsupported_extension"; 547221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 548221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case 111: 549221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom str_details2 = " certificate_unobtainable"; 550221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 551221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case 112: 552221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom str_details2 = " unrecognized_name"; 553221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 554221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case 113: 555221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom str_details2 = " bad_certificate_status_response"; 556221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 557221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case 114: 558221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom str_details2 = " bad_certificate_hash_value"; 559221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 560392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case 115: 561392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom str_details2 = " unknown_psk_identity"; 562392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (content_type == 22) /* Handshake */ 568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details1 = "???"; 570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (len > 0) 572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (((const unsigned char*)buf)[0]) 574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 0: 576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details1 = ", HelloRequest"; 577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 1: 579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details1 = ", ClientHello"; 580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 2: 582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details1 = ", ServerHello"; 583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 584221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case 3: 585221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom str_details1 = ", HelloVerifyRequest"; 586221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 11: 588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details1 = ", Certificate"; 589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 12: 591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details1 = ", ServerKeyExchange"; 592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 13: 594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details1 = ", CertificateRequest"; 595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 14: 597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details1 = ", ServerHelloDone"; 598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 15: 600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details1 = ", CertificateVerify"; 601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 16: 603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details1 = ", ClientKeyExchange"; 604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case 20: 606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str_details1 = ", Finished"; 607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 611392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 612392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifndef OPENSSL_NO_HEARTBEATS 613392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (content_type == 24) /* Heartbeat */ 614392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 615392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom str_details1 = ", Heartbeat"; 616392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 617392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (len > 0) 618392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 619392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom switch (((const unsigned char*)buf)[0]) 620392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 621392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case 1: 622392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom str_details1 = ", HeartbeatRequest"; 623392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 624392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case 2: 625392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom str_details1 = ", HeartbeatResponse"; 626392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 627392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 628392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 629392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 630392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif 631656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 632656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio, "%s %s%s [length %04lx]%s%s\n", str_write_p, str_version, str_content_type, (unsigned long)len, str_details1, str_details2); 634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (len > 0) 636656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 637656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project size_t num, i; 638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio, " "); 640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project num = len; 641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0 642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (num > 16) 643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project num = 16; 644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 645656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i = 0; i < num; i++) 646656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 647656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i % 16 == 0 && i > 0) 648656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio, "\n "); 649656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio, " %02x", ((const unsigned char*)buf)[i]); 650656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i < len) 652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio, " ..."); 653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio, "\n"); 654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (void)BIO_flush(bio); 656656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 658656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid MS_CALLBACK tlsext_cb(SSL *s, int client_server, int type, 659656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned char *data, int len, 660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project void *arg) 661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 662656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *bio = arg; 663656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *extname; 664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch(type) 666656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case TLSEXT_TYPE_server_name: 668656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project extname = "server name"; 669656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 670656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case TLSEXT_TYPE_max_fragment_length: 672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project extname = "max fragment length"; 673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 675656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case TLSEXT_TYPE_client_certificate_url: 676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project extname = "client certificate URL"; 677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case TLSEXT_TYPE_trusted_ca_keys: 680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project extname = "trusted CA keys"; 681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case TLSEXT_TYPE_truncated_hmac: 684656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project extname = "truncated HMAC"; 685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 686656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 687656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case TLSEXT_TYPE_status_request: 688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project extname = "status request"; 689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 691392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case TLSEXT_TYPE_user_mapping: 692392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom extname = "user mapping"; 693392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 694392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 695392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case TLSEXT_TYPE_client_authz: 696392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom extname = "client authz"; 697392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 698392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 699392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case TLSEXT_TYPE_server_authz: 700392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom extname = "server authz"; 701392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 702392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 703392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case TLSEXT_TYPE_cert_type: 704392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom extname = "cert type"; 705392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 706392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 707656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case TLSEXT_TYPE_elliptic_curves: 708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project extname = "elliptic curves"; 709656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 710656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 711656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case TLSEXT_TYPE_ec_point_formats: 712656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project extname = "EC point formats"; 713656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 714656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 715392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case TLSEXT_TYPE_srp: 716392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom extname = "SRP"; 717392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 718392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 719392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case TLSEXT_TYPE_signature_algorithms: 720392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom extname = "signature algorithms"; 721392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 722392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 723392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case TLSEXT_TYPE_use_srtp: 724392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom extname = "use SRTP"; 725392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 726392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 727392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case TLSEXT_TYPE_heartbeat: 728392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom extname = "heartbeat"; 729392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 730392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case TLSEXT_TYPE_session_ticket: 732392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom extname = "session ticket"; 733656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 734656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 735392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case TLSEXT_TYPE_renegotiate: 736392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom extname = "renegotiation info"; 73798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom break; 738656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 739221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifdef TLSEXT_TYPE_opaque_prf_input 740221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case TLSEXT_TYPE_opaque_prf_input: 741221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom extname = "opaque PRF input"; 742221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 743221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 744392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifdef TLSEXT_TYPE_next_proto_neg 745392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case TLSEXT_TYPE_next_proto_neg: 746392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom extname = "next protocol"; 747392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 748392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif 749221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 750656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project default: 751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project extname = "unknown"; 752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 753656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 754656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio, "TLS %s extension \"%s\" (id=%d), len=%d\n", 757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project client_server ? "server": "client", 758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project extname, type, len); 759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_dump(bio, (char *)data, len); 760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (void)BIO_flush(bio); 761656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 76298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 76398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstromint MS_CALLBACK generate_cookie_callback(SSL *ssl, unsigned char *cookie, unsigned int *cookie_len) 76498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom { 76598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom unsigned char *buffer, result[EVP_MAX_MD_SIZE]; 76698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom unsigned int length, resultlength; 767221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom union { 768221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom struct sockaddr sa; 769221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom struct sockaddr_in s4; 770221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if OPENSSL_USE_IPV6 771221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom struct sockaddr_in6 s6; 772221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 773221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } peer; 774221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 77598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom /* Initialize a random secret */ 77698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (!cookie_initialized) 77798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom { 77898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (!RAND_bytes(cookie_secret, COOKIE_SECRET_LENGTH)) 77998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom { 78098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom BIO_printf(bio_err,"error setting random cookie secret\n"); 78198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom return 0; 78298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 78398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom cookie_initialized = 1; 78498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 78598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 78698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom /* Read peer information */ 78798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom (void)BIO_dgram_get_peer(SSL_get_rbio(ssl), &peer); 78898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 78998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom /* Create buffer with peer's address and port */ 790221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom length = 0; 791221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom switch (peer.sa.sa_family) 792221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 793221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case AF_INET: 794221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom length += sizeof(struct in_addr); 795221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom length += sizeof(peer.s4.sin_port); 796221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 797221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if OPENSSL_USE_IPV6 798221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case AF_INET6: 799221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom length += sizeof(struct in6_addr); 800221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom length += sizeof(peer.s6.sin6_port); 801221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 802221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 803221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom default: 804221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom OPENSSL_assert(0); 805221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 806221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 80798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom buffer = OPENSSL_malloc(length); 80898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 80998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (buffer == NULL) 81098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom { 81198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom BIO_printf(bio_err,"out of memory\n"); 81298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom return 0; 81398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 814221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 815221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom switch (peer.sa.sa_family) 816221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 817221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case AF_INET: 818221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom memcpy(buffer, 819221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &peer.s4.sin_port, 820221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sizeof(peer.s4.sin_port)); 821221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom memcpy(buffer + sizeof(peer.s4.sin_port), 822221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &peer.s4.sin_addr, 823221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sizeof(struct in_addr)); 824221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 825221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if OPENSSL_USE_IPV6 826221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case AF_INET6: 827221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom memcpy(buffer, 828221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &peer.s6.sin6_port, 829221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sizeof(peer.s6.sin6_port)); 830221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom memcpy(buffer + sizeof(peer.s6.sin6_port), 831221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &peer.s6.sin6_addr, 832221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sizeof(struct in6_addr)); 833221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 834221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 835221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom default: 836221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom OPENSSL_assert(0); 837221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 838221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 83998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 84098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom /* Calculate HMAC of buffer using the secret */ 84198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom HMAC(EVP_sha1(), cookie_secret, COOKIE_SECRET_LENGTH, 84298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom buffer, length, result, &resultlength); 84398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom OPENSSL_free(buffer); 84498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 84598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom memcpy(cookie, result, resultlength); 84698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom *cookie_len = resultlength; 84798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 84898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom return 1; 84998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 85098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 85198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstromint MS_CALLBACK verify_cookie_callback(SSL *ssl, unsigned char *cookie, unsigned int cookie_len) 85298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom { 85398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom unsigned char *buffer, result[EVP_MAX_MD_SIZE]; 85498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom unsigned int length, resultlength; 855221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom union { 856221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom struct sockaddr sa; 857221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom struct sockaddr_in s4; 858221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if OPENSSL_USE_IPV6 859221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom struct sockaddr_in6 s6; 860221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 861221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } peer; 862221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 86398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom /* If secret isn't initialized yet, the cookie can't be valid */ 86498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (!cookie_initialized) 86598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom return 0; 86698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 86798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom /* Read peer information */ 86898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom (void)BIO_dgram_get_peer(SSL_get_rbio(ssl), &peer); 86998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 87098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom /* Create buffer with peer's address and port */ 871221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom length = 0; 872221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom switch (peer.sa.sa_family) 873221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 874221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case AF_INET: 875221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom length += sizeof(struct in_addr); 876221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom length += sizeof(peer.s4.sin_port); 877221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 878221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if OPENSSL_USE_IPV6 879221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case AF_INET6: 880221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom length += sizeof(struct in6_addr); 881221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom length += sizeof(peer.s6.sin6_port); 882221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 883221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 884221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom default: 885221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom OPENSSL_assert(0); 886221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 887221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 888221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom buffer = OPENSSL_malloc(length); 88998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 89098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (buffer == NULL) 89198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom { 89298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom BIO_printf(bio_err,"out of memory\n"); 89398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom return 0; 89498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 895221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 896221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom switch (peer.sa.sa_family) 897221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 898221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case AF_INET: 899221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom memcpy(buffer, 900221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &peer.s4.sin_port, 901221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sizeof(peer.s4.sin_port)); 902221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom memcpy(buffer + sizeof(peer.s4.sin_port), 903221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &peer.s4.sin_addr, 904221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sizeof(struct in_addr)); 905221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 906221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if OPENSSL_USE_IPV6 907221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case AF_INET6: 908221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom memcpy(buffer, 909221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &peer.s6.sin6_port, 910221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sizeof(peer.s6.sin6_port)); 911221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom memcpy(buffer + sizeof(peer.s6.sin6_port), 912221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &peer.s6.sin6_addr, 913221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sizeof(struct in6_addr)); 914221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 915221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 916221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom default: 917221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom OPENSSL_assert(0); 918221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 919221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 92098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 92198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom /* Calculate HMAC of buffer using the secret */ 92298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom HMAC(EVP_sha1(), cookie_secret, COOKIE_SECRET_LENGTH, 92398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom buffer, length, result, &resultlength); 92498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom OPENSSL_free(buffer); 925221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 92698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (cookie_len == resultlength && memcmp(result, cookie, resultlength) == 0) 92798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom return 1; 92898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 92998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom return 0; 93098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 931