1d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * All rights reserved. 3d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 4d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * This package is an SSL implementation written 5d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * by Eric Young (eay@cryptsoft.com). 6d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * The implementation was written so as to conform with Netscapes SSL. 7d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 8d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * This library is free for commercial and non-commercial use as long as 9d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * the following conditions are aheared to. The following conditions 10d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * apply to all code found in this distribution, be it the RC4, RSA, 11d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * lhash, DES, etc., code; not just the SSL code. The SSL documentation 12d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * included with this distribution is covered by the same copyright terms 13d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * except that the holder is Tim Hudson (tjh@cryptsoft.com). 14d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 15d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Copyright remains Eric Young's, and as such any Copyright notices in 16d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * the code are not to be removed. 17d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * If this package is used in a product, Eric Young should be given attribution 18d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * as the author of the parts of the library used. 19d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * This can be in the form of a textual message at program startup or 20d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * in documentation (online or textual) provided with the package. 21d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 22d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Redistribution and use in source and binary forms, with or without 23d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * modification, are permitted provided that the following conditions 24d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * are met: 25d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 1. Redistributions of source code must retain the copyright 26d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * notice, this list of conditions and the following disclaimer. 27d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 2. Redistributions in binary form must reproduce the above copyright 28d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * notice, this list of conditions and the following disclaimer in the 29d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * documentation and/or other materials provided with the distribution. 30d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 3. All advertising materials mentioning features or use of this software 31d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * must display the following acknowledgement: 32d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * "This product includes cryptographic software written by 33d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Eric Young (eay@cryptsoft.com)" 34d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * The word 'cryptographic' can be left out if the rouines from the library 35d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * being used are not cryptographic related :-). 36d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 4. If you include any Windows specific code (or a derivative thereof) from 37d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * the apps directory (application code) you must include an acknowledgement: 38d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 39d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 40d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 41d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 43d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 44d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 45d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 46d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 47d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 48d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 49d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 50d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * SUCH DAMAGE. 51d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 52d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * The licence and distribution terms for any publically available version or 53d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * derivative of this code cannot be changed. i.e. this code cannot simply be 54d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * copied and put under another distribution licence 55d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * [including the GNU Public Licence.] */ 56d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 57d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/dh.h> 58d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 59d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <string.h> 60d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 61d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/bn.h> 62d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/buf.h> 63d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/err.h> 64d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/ex_data.h> 65d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/mem.h> 66d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/thread.h> 67d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 68d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include "internal.h" 69e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley#include "../internal.h" 70d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 71d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 72d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyextern const DH_METHOD DH_default_method; 73d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 74e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langleystatic CRYPTO_EX_DATA_CLASS g_ex_data_class = CRYPTO_EX_DATA_CLASS_INIT; 75e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley 76d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyDH *DH_new(void) { return DH_new_method(NULL); } 77d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 78d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyDH *DH_new_method(const ENGINE *engine) { 79d9e397b599b13d642138480a28c14db7a136bf0Adam Langley DH *dh = (DH *)OPENSSL_malloc(sizeof(DH)); 80d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (dh == NULL) { 81d9e397b599b13d642138480a28c14db7a136bf0Adam Langley OPENSSL_PUT_ERROR(DH, DH_new_method, ERR_R_MALLOC_FAILURE); 82d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return NULL; 83d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 84d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 85d9e397b599b13d642138480a28c14db7a136bf0Adam Langley memset(dh, 0, sizeof(DH)); 86d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 87d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (engine) { 88d9e397b599b13d642138480a28c14db7a136bf0Adam Langley dh->meth = ENGINE_get_DH_method(engine); 89d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 90d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 91d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (dh->meth == NULL) { 92d9e397b599b13d642138480a28c14db7a136bf0Adam Langley dh->meth = (DH_METHOD*) &DH_default_method; 93d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 94d9e397b599b13d642138480a28c14db7a136bf0Adam Langley METHOD_ref(dh->meth); 95d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 96e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley CRYPTO_MUTEX_init(&dh->method_mont_p_lock); 97e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley 98d9e397b599b13d642138480a28c14db7a136bf0Adam Langley dh->references = 1; 99e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley if (!CRYPTO_new_ex_data(&g_ex_data_class, dh, &dh->ex_data)) { 100d9e397b599b13d642138480a28c14db7a136bf0Adam Langley OPENSSL_free(dh); 101d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return NULL; 102d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 103d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 104d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (dh->meth->init && !dh->meth->init(dh)) { 105e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley CRYPTO_free_ex_data(&g_ex_data_class, dh, &dh->ex_data); 106d9e397b599b13d642138480a28c14db7a136bf0Adam Langley METHOD_unref(dh->meth); 107d9e397b599b13d642138480a28c14db7a136bf0Adam Langley OPENSSL_free(dh); 108d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return NULL; 109d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 110d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 111d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return dh; 112d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 113d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 114d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyvoid DH_free(DH *dh) { 115d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (dh == NULL) { 116d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return; 117d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 118d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 11953b272a2813a0b11f107d77100ff8805ada8fbd2Adam Langley if (!CRYPTO_refcount_dec_and_test_zero(&dh->references)) { 120d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return; 121d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 122d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 123d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (dh->meth->finish) { 124d9e397b599b13d642138480a28c14db7a136bf0Adam Langley dh->meth->finish(dh); 125d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 126d9e397b599b13d642138480a28c14db7a136bf0Adam Langley METHOD_unref(dh->meth); 127d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 128e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley CRYPTO_free_ex_data(&g_ex_data_class, dh, &dh->ex_data); 129d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 130d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (dh->method_mont_p) BN_MONT_CTX_free(dh->method_mont_p); 131d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (dh->p != NULL) BN_clear_free(dh->p); 132d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (dh->g != NULL) BN_clear_free(dh->g); 133d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (dh->q != NULL) BN_clear_free(dh->q); 134d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (dh->j != NULL) BN_clear_free(dh->j); 135d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (dh->seed) OPENSSL_free(dh->seed); 136d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (dh->counter != NULL) BN_clear_free(dh->counter); 137d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (dh->pub_key != NULL) BN_clear_free(dh->pub_key); 138d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (dh->priv_key != NULL) BN_clear_free(dh->priv_key); 139e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley CRYPTO_MUTEX_cleanup(&dh->method_mont_p_lock); 140d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 141d9e397b599b13d642138480a28c14db7a136bf0Adam Langley OPENSSL_free(dh); 142d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 143d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 144d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyint DH_generate_parameters_ex(DH *dh, int prime_bits, int generator, BN_GENCB *cb) { 145d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (dh->meth->generate_parameters) { 146d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return dh->meth->generate_parameters(dh, prime_bits, generator, cb); 147d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 148d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return DH_default_method.generate_parameters(dh, prime_bits, generator, cb); 149d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 150d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 151d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyint DH_generate_key(DH *dh) { 152d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (dh->meth->generate_key) { 153d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return dh->meth->generate_key(dh); 154d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 155d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return DH_default_method.generate_key(dh); 156d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 157d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 158d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyint DH_compute_key(unsigned char *out, const BIGNUM *peers_key, DH *dh) { 159d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (dh->meth->compute_key) { 160d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return dh->meth->compute_key(dh, out, peers_key); 161d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 162d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return DH_default_method.compute_key(dh, out, peers_key); 163d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 164d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 165d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyint DH_size(const DH *dh) { return BN_num_bytes(dh->p); } 166d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 16753b272a2813a0b11f107d77100ff8805ada8fbd2Adam Langleyunsigned DH_num_bits(const DH *dh) { return BN_num_bits(dh->p); } 16853b272a2813a0b11f107d77100ff8805ada8fbd2Adam Langley 16953b272a2813a0b11f107d77100ff8805ada8fbd2Adam Langleyint DH_up_ref(DH *dh) { 17053b272a2813a0b11f107d77100ff8805ada8fbd2Adam Langley CRYPTO_refcount_inc(&dh->references); 171d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return 1; 172d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 173d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 174d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystatic int int_dh_bn_cpy(BIGNUM **dst, const BIGNUM *src) { 175d9e397b599b13d642138480a28c14db7a136bf0Adam Langley BIGNUM *a = NULL; 176d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 177d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (src) { 178d9e397b599b13d642138480a28c14db7a136bf0Adam Langley a = BN_dup(src); 179d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (!a) { 180d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return 0; 181d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 182d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 183d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 184e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley BN_free(*dst); 185d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *dst = a; 186d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return 1; 187d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 188d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 189d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystatic int int_dh_param_copy(DH *to, const DH *from, int is_x942) { 190d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (is_x942 == -1) { 191d9e397b599b13d642138480a28c14db7a136bf0Adam Langley is_x942 = !!from->q; 192d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 193d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (!int_dh_bn_cpy(&to->p, from->p) || 194d9e397b599b13d642138480a28c14db7a136bf0Adam Langley !int_dh_bn_cpy(&to->g, from->g)) { 195d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return 0; 196d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 197d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 198d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (!is_x942) { 199d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return 1; 200d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 201d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 202d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (!int_dh_bn_cpy(&to->q, from->q) || 203d9e397b599b13d642138480a28c14db7a136bf0Adam Langley !int_dh_bn_cpy(&to->j, from->j)) { 204d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return 0; 205d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 206d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 207e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley OPENSSL_free(to->seed); 208e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley to->seed = NULL; 209e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley to->seedlen = 0; 210e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley 211d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (from->seed) { 212d9e397b599b13d642138480a28c14db7a136bf0Adam Langley to->seed = BUF_memdup(from->seed, from->seedlen); 213d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (!to->seed) { 214d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return 0; 215d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 216d9e397b599b13d642138480a28c14db7a136bf0Adam Langley to->seedlen = from->seedlen; 217d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 218d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 219d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return 1; 220d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 221d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 222d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyDH *DHparams_dup(const DH *dh) { 223d9e397b599b13d642138480a28c14db7a136bf0Adam Langley DH *ret = DH_new(); 224d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (!ret) { 225d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return NULL; 226d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 227d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 228d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (!int_dh_param_copy(ret, dh, -1)) { 229d9e397b599b13d642138480a28c14db7a136bf0Adam Langley DH_free(ret); 230d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return NULL; 231d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 232d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 233d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return ret; 234d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 235d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 236d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyint DH_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, 237d9e397b599b13d642138480a28c14db7a136bf0Adam Langley CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) { 238e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley int index; 239e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley if (!CRYPTO_get_ex_new_index(&g_ex_data_class, &index, argl, argp, new_func, 240e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley dup_func, free_func)) { 241e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley return -1; 242e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley } 243e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley return index; 244d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 245d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 246d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyint DH_set_ex_data(DH *d, int idx, void *arg) { 247d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return (CRYPTO_set_ex_data(&d->ex_data, idx, arg)); 248d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 249d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 250d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyvoid *DH_get_ex_data(DH *d, int idx) { 251d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return (CRYPTO_get_ex_data(&d->ex_data, idx)); 252d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 253