195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * All rights reserved. 395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * This package is an SSL implementation written 595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * by Eric Young (eay@cryptsoft.com). 695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * The implementation was written so as to conform with Netscapes SSL. 795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * This library is free for commercial and non-commercial use as long as 995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * the following conditions are aheared to. The following conditions 1095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * apply to all code found in this distribution, be it the RC4, RSA, 1195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * lhash, DES, etc., code; not just the SSL code. The SSL documentation 1295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * included with this distribution is covered by the same copyright terms 1395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * except that the holder is Tim Hudson (tjh@cryptsoft.com). 1495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 1595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * Copyright remains Eric Young's, and as such any Copyright notices in 1695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * the code are not to be removed. 1795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * If this package is used in a product, Eric Young should be given attribution 1895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * as the author of the parts of the library used. 1995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * This can be in the form of a textual message at program startup or 2095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * in documentation (online or textual) provided with the package. 2195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 2295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * Redistribution and use in source and binary forms, with or without 2395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * modification, are permitted provided that the following conditions 2495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * are met: 2595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 1. Redistributions of source code must retain the copyright 2695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * notice, this list of conditions and the following disclaimer. 2795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 2. Redistributions in binary form must reproduce the above copyright 2895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * notice, this list of conditions and the following disclaimer in the 2995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * documentation and/or other materials provided with the distribution. 3095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 3. All advertising materials mentioning features or use of this software 3195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * must display the following acknowledgement: 3295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * "This product includes cryptographic software written by 3395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * Eric Young (eay@cryptsoft.com)" 3495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * The word 'cryptographic' can be left out if the rouines from the library 3595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * being used are not cryptographic related :-). 3695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 4. If you include any Windows specific code (or a derivative thereof) from 3795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * the apps directory (application code) you must include an acknowledgement: 3895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 3995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 4095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 4195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 4295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 4395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 4495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 4595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 4695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 4795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 4895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 4995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 5095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * SUCH DAMAGE. 5195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 5295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * The licence and distribution terms for any publically available version or 5395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * derivative of this code cannot be changed. i.e. this code cannot simply be 5495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * copied and put under another distribution licence 5595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * [including the GNU Public Licence.] */ 5695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 5795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <openssl/dh.h> 5895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 5995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <openssl/bn.h> 6095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <openssl/buf.h> 6195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <openssl/err.h> 6295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <openssl/ex_data.h> 6395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <openssl/mem.h> 6495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <openssl/thread.h> 6595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 6695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include "internal.h" 6795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 6895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 6995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyextern const DH_METHOD DH_default_method; 7095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 7195c29f3cd1f6c08c6c0927868683392eea727ccAdam LangleyDH *DH_new(void) { return DH_new_method(NULL); } 7295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 7395c29f3cd1f6c08c6c0927868683392eea727ccAdam LangleyDH *DH_new_method(const ENGINE *engine) { 7495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley DH *dh = (DH *)OPENSSL_malloc(sizeof(DH)); 7595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (dh == NULL) { 7695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley OPENSSL_PUT_ERROR(DH, DH_new_method, ERR_R_MALLOC_FAILURE); 7795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return NULL; 7895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 7995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 8095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley memset(dh, 0, sizeof(DH)); 8195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 8295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (engine) { 8395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley dh->meth = ENGINE_get_DH_method(engine); 8495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 8595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 8695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (dh->meth == NULL) { 8795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley dh->meth = (DH_METHOD*) &DH_default_method; 8895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 8995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley METHOD_ref(dh->meth); 9095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 9195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley dh->references = 1; 9295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_DH, dh, &dh->ex_data)) { 9395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley OPENSSL_free(dh); 9495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return NULL; 9595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 9695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 9795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (dh->meth->init && !dh->meth->init(dh)) { 9895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley CRYPTO_free_ex_data(CRYPTO_EX_INDEX_DH, dh, &dh->ex_data); 9995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley METHOD_unref(dh->meth); 10095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley OPENSSL_free(dh); 10195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return NULL; 10295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 10395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 10495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return dh; 10595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley} 10695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 10795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyvoid DH_free(DH *dh) { 10895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (dh == NULL) { 10995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return; 11095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 11195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 11295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (CRYPTO_add(&dh->references, -1, CRYPTO_LOCK_DH) > 0) { 11395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return; 11495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 11595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 11695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (dh->meth->finish) { 11795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley dh->meth->finish(dh); 11895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 11995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley METHOD_unref(dh->meth); 12095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 12195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley CRYPTO_free_ex_data(CRYPTO_EX_INDEX_DH, dh, &dh->ex_data); 12295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 12395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (dh->method_mont_p) BN_MONT_CTX_free(dh->method_mont_p); 12495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (dh->p != NULL) BN_clear_free(dh->p); 12595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (dh->g != NULL) BN_clear_free(dh->g); 12695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (dh->q != NULL) BN_clear_free(dh->q); 12795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (dh->j != NULL) BN_clear_free(dh->j); 12895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (dh->seed) OPENSSL_free(dh->seed); 12995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (dh->counter != NULL) BN_clear_free(dh->counter); 13095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (dh->pub_key != NULL) BN_clear_free(dh->pub_key); 13195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (dh->priv_key != NULL) BN_clear_free(dh->priv_key); 13295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 13395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley OPENSSL_free(dh); 13495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley} 13595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 13695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint DH_generate_parameters_ex(DH *dh, int prime_bits, int generator, BN_GENCB *cb) { 13795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (dh->meth->generate_parameters) { 13895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return dh->meth->generate_parameters(dh, prime_bits, generator, cb); 13995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 14095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return DH_default_method.generate_parameters(dh, prime_bits, generator, cb); 14195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley} 14295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 14395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint DH_generate_key(DH *dh) { 14495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (dh->meth->generate_key) { 14595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return dh->meth->generate_key(dh); 14695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 14795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return DH_default_method.generate_key(dh); 14895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley} 14995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 150ded93581f1674f81faa0dba4b15a842756066ab2Adam Langleyint DH_compute_key(unsigned char *out, const BIGNUM *peers_key, DH *dh) { 15195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (dh->meth->compute_key) { 15295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return dh->meth->compute_key(dh, out, peers_key); 15395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 15495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return DH_default_method.compute_key(dh, out, peers_key); 15595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley} 15695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 15795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint DH_size(const DH *dh) { return BN_num_bytes(dh->p); } 15895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 15995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint DH_up_ref(DH *r) { 16095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley CRYPTO_add(&r->references, 1, CRYPTO_LOCK_DH); 16195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return 1; 16295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley} 16395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 16495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleystatic int int_dh_bn_cpy(BIGNUM **dst, const BIGNUM *src) { 16595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley BIGNUM *a = NULL; 16695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 16795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (src) { 16895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley a = BN_dup(src); 16995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (!a) { 17095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return 0; 17195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 17295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 17395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 17495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (*dst) { 17595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley BN_free(*dst); 17695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 17795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *dst = a; 17895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return 1; 17995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley} 18095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 18195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleystatic int int_dh_param_copy(DH *to, const DH *from, int is_x942) { 18295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (is_x942 == -1) { 18395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley is_x942 = !!from->q; 18495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 18595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (!int_dh_bn_cpy(&to->p, from->p) || 18695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley !int_dh_bn_cpy(&to->g, from->g)) { 18795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return 0; 18895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 18995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 19095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (!is_x942) { 19195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return 1; 19295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 19395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 19495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (!int_dh_bn_cpy(&to->q, from->q) || 19595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley !int_dh_bn_cpy(&to->j, from->j)) { 19695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return 0; 19795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 19895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 19995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (to->seed) { 20095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley OPENSSL_free(to->seed); 20195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley to->seed = NULL; 20295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley to->seedlen = 0; 20395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 20495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (from->seed) { 20595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley to->seed = BUF_memdup(from->seed, from->seedlen); 20695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (!to->seed) { 20795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return 0; 20895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 20995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley to->seedlen = from->seedlen; 21095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 21195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 21295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return 1; 21395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley} 21495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 21595c29f3cd1f6c08c6c0927868683392eea727ccAdam LangleyDH *DHparams_dup(const DH *dh) { 21695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley DH *ret = DH_new(); 21795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (!ret) { 21895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return NULL; 21995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 22095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 22195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (!int_dh_param_copy(ret, dh, -1)) { 22295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley DH_free(ret); 22395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return NULL; 22495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 22595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 22695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return ret; 22795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley} 22895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 22995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint DH_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, 23095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) { 23195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_DH, argl, argp, new_func, 23295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley dup_func, free_func); 23395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley} 23495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 23595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint DH_set_ex_data(DH *d, int idx, void *arg) { 23695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return (CRYPTO_set_ex_data(&d->ex_data, idx, arg)); 23795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley} 23895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 23995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyvoid *DH_get_ex_data(DH *d, int idx) { 24095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return (CRYPTO_get_ex_data(&d->ex_data, idx)); 24195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley} 242