1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci/* 11e1051a39Sopenharmony_ci * DH low level APIs are deprecated for public use, but still ok for 12e1051a39Sopenharmony_ci * internal use. 13e1051a39Sopenharmony_ci */ 14e1051a39Sopenharmony_ci#include "internal/deprecated.h" 15e1051a39Sopenharmony_ci 16e1051a39Sopenharmony_ci#include "dh_local.h" 17e1051a39Sopenharmony_ci#include <string.h> 18e1051a39Sopenharmony_ci#include <openssl/err.h> 19e1051a39Sopenharmony_ci 20e1051a39Sopenharmony_ciDH_METHOD *DH_meth_new(const char *name, int flags) 21e1051a39Sopenharmony_ci{ 22e1051a39Sopenharmony_ci DH_METHOD *dhm = OPENSSL_zalloc(sizeof(*dhm)); 23e1051a39Sopenharmony_ci 24e1051a39Sopenharmony_ci if (dhm != NULL) { 25e1051a39Sopenharmony_ci dhm->flags = flags; 26e1051a39Sopenharmony_ci 27e1051a39Sopenharmony_ci dhm->name = OPENSSL_strdup(name); 28e1051a39Sopenharmony_ci if (dhm->name != NULL) 29e1051a39Sopenharmony_ci return dhm; 30e1051a39Sopenharmony_ci 31e1051a39Sopenharmony_ci OPENSSL_free(dhm); 32e1051a39Sopenharmony_ci } 33e1051a39Sopenharmony_ci 34e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_DH, ERR_R_MALLOC_FAILURE); 35e1051a39Sopenharmony_ci return NULL; 36e1051a39Sopenharmony_ci} 37e1051a39Sopenharmony_ci 38e1051a39Sopenharmony_civoid DH_meth_free(DH_METHOD *dhm) 39e1051a39Sopenharmony_ci{ 40e1051a39Sopenharmony_ci if (dhm != NULL) { 41e1051a39Sopenharmony_ci OPENSSL_free(dhm->name); 42e1051a39Sopenharmony_ci OPENSSL_free(dhm); 43e1051a39Sopenharmony_ci } 44e1051a39Sopenharmony_ci} 45e1051a39Sopenharmony_ci 46e1051a39Sopenharmony_ciDH_METHOD *DH_meth_dup(const DH_METHOD *dhm) 47e1051a39Sopenharmony_ci{ 48e1051a39Sopenharmony_ci DH_METHOD *ret = OPENSSL_malloc(sizeof(*ret)); 49e1051a39Sopenharmony_ci 50e1051a39Sopenharmony_ci if (ret != NULL) { 51e1051a39Sopenharmony_ci memcpy(ret, dhm, sizeof(*dhm)); 52e1051a39Sopenharmony_ci 53e1051a39Sopenharmony_ci ret->name = OPENSSL_strdup(dhm->name); 54e1051a39Sopenharmony_ci if (ret->name != NULL) 55e1051a39Sopenharmony_ci return ret; 56e1051a39Sopenharmony_ci 57e1051a39Sopenharmony_ci OPENSSL_free(ret); 58e1051a39Sopenharmony_ci } 59e1051a39Sopenharmony_ci 60e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_DH, ERR_R_MALLOC_FAILURE); 61e1051a39Sopenharmony_ci return NULL; 62e1051a39Sopenharmony_ci} 63e1051a39Sopenharmony_ci 64e1051a39Sopenharmony_ciconst char *DH_meth_get0_name(const DH_METHOD *dhm) 65e1051a39Sopenharmony_ci{ 66e1051a39Sopenharmony_ci return dhm->name; 67e1051a39Sopenharmony_ci} 68e1051a39Sopenharmony_ci 69e1051a39Sopenharmony_ciint DH_meth_set1_name(DH_METHOD *dhm, const char *name) 70e1051a39Sopenharmony_ci{ 71e1051a39Sopenharmony_ci char *tmpname = OPENSSL_strdup(name); 72e1051a39Sopenharmony_ci 73e1051a39Sopenharmony_ci if (tmpname == NULL) { 74e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_DH, ERR_R_MALLOC_FAILURE); 75e1051a39Sopenharmony_ci return 0; 76e1051a39Sopenharmony_ci } 77e1051a39Sopenharmony_ci 78e1051a39Sopenharmony_ci OPENSSL_free(dhm->name); 79e1051a39Sopenharmony_ci dhm->name = tmpname; 80e1051a39Sopenharmony_ci 81e1051a39Sopenharmony_ci return 1; 82e1051a39Sopenharmony_ci} 83e1051a39Sopenharmony_ci 84e1051a39Sopenharmony_ciint DH_meth_get_flags(const DH_METHOD *dhm) 85e1051a39Sopenharmony_ci{ 86e1051a39Sopenharmony_ci return dhm->flags; 87e1051a39Sopenharmony_ci} 88e1051a39Sopenharmony_ci 89e1051a39Sopenharmony_ciint DH_meth_set_flags(DH_METHOD *dhm, int flags) 90e1051a39Sopenharmony_ci{ 91e1051a39Sopenharmony_ci dhm->flags = flags; 92e1051a39Sopenharmony_ci return 1; 93e1051a39Sopenharmony_ci} 94e1051a39Sopenharmony_ci 95e1051a39Sopenharmony_civoid *DH_meth_get0_app_data(const DH_METHOD *dhm) 96e1051a39Sopenharmony_ci{ 97e1051a39Sopenharmony_ci return dhm->app_data; 98e1051a39Sopenharmony_ci} 99e1051a39Sopenharmony_ci 100e1051a39Sopenharmony_ciint DH_meth_set0_app_data(DH_METHOD *dhm, void *app_data) 101e1051a39Sopenharmony_ci{ 102e1051a39Sopenharmony_ci dhm->app_data = app_data; 103e1051a39Sopenharmony_ci return 1; 104e1051a39Sopenharmony_ci} 105e1051a39Sopenharmony_ci 106e1051a39Sopenharmony_ciint (*DH_meth_get_generate_key(const DH_METHOD *dhm)) (DH *) 107e1051a39Sopenharmony_ci{ 108e1051a39Sopenharmony_ci return dhm->generate_key; 109e1051a39Sopenharmony_ci} 110e1051a39Sopenharmony_ci 111e1051a39Sopenharmony_ciint DH_meth_set_generate_key(DH_METHOD *dhm, int (*generate_key) (DH *)) 112e1051a39Sopenharmony_ci{ 113e1051a39Sopenharmony_ci dhm->generate_key = generate_key; 114e1051a39Sopenharmony_ci return 1; 115e1051a39Sopenharmony_ci} 116e1051a39Sopenharmony_ci 117e1051a39Sopenharmony_ciint (*DH_meth_get_compute_key(const DH_METHOD *dhm)) 118e1051a39Sopenharmony_ci (unsigned char *key, const BIGNUM *pub_key, DH *dh) 119e1051a39Sopenharmony_ci{ 120e1051a39Sopenharmony_ci return dhm->compute_key; 121e1051a39Sopenharmony_ci} 122e1051a39Sopenharmony_ci 123e1051a39Sopenharmony_ciint DH_meth_set_compute_key(DH_METHOD *dhm, 124e1051a39Sopenharmony_ci int (*compute_key) (unsigned char *key, const BIGNUM *pub_key, DH *dh)) 125e1051a39Sopenharmony_ci{ 126e1051a39Sopenharmony_ci dhm->compute_key = compute_key; 127e1051a39Sopenharmony_ci return 1; 128e1051a39Sopenharmony_ci} 129e1051a39Sopenharmony_ci 130e1051a39Sopenharmony_ci 131e1051a39Sopenharmony_ciint (*DH_meth_get_bn_mod_exp(const DH_METHOD *dhm)) 132e1051a39Sopenharmony_ci (const DH *, BIGNUM *, const BIGNUM *, const BIGNUM *, const BIGNUM *, 133e1051a39Sopenharmony_ci BN_CTX *, BN_MONT_CTX *) 134e1051a39Sopenharmony_ci{ 135e1051a39Sopenharmony_ci return dhm->bn_mod_exp; 136e1051a39Sopenharmony_ci} 137e1051a39Sopenharmony_ci 138e1051a39Sopenharmony_ciint DH_meth_set_bn_mod_exp(DH_METHOD *dhm, 139e1051a39Sopenharmony_ci int (*bn_mod_exp) (const DH *, BIGNUM *, const BIGNUM *, const BIGNUM *, 140e1051a39Sopenharmony_ci const BIGNUM *, BN_CTX *, BN_MONT_CTX *)) 141e1051a39Sopenharmony_ci{ 142e1051a39Sopenharmony_ci dhm->bn_mod_exp = bn_mod_exp; 143e1051a39Sopenharmony_ci return 1; 144e1051a39Sopenharmony_ci} 145e1051a39Sopenharmony_ci 146e1051a39Sopenharmony_ciint (*DH_meth_get_init(const DH_METHOD *dhm))(DH *) 147e1051a39Sopenharmony_ci{ 148e1051a39Sopenharmony_ci return dhm->init; 149e1051a39Sopenharmony_ci} 150e1051a39Sopenharmony_ci 151e1051a39Sopenharmony_ciint DH_meth_set_init(DH_METHOD *dhm, int (*init)(DH *)) 152e1051a39Sopenharmony_ci{ 153e1051a39Sopenharmony_ci dhm->init = init; 154e1051a39Sopenharmony_ci return 1; 155e1051a39Sopenharmony_ci} 156e1051a39Sopenharmony_ci 157e1051a39Sopenharmony_ciint (*DH_meth_get_finish(const DH_METHOD *dhm)) (DH *) 158e1051a39Sopenharmony_ci{ 159e1051a39Sopenharmony_ci return dhm->finish; 160e1051a39Sopenharmony_ci} 161e1051a39Sopenharmony_ci 162e1051a39Sopenharmony_ciint DH_meth_set_finish(DH_METHOD *dhm, int (*finish) (DH *)) 163e1051a39Sopenharmony_ci{ 164e1051a39Sopenharmony_ci dhm->finish = finish; 165e1051a39Sopenharmony_ci return 1; 166e1051a39Sopenharmony_ci} 167e1051a39Sopenharmony_ci 168e1051a39Sopenharmony_ciint (*DH_meth_get_generate_params(const DH_METHOD *dhm)) 169e1051a39Sopenharmony_ci (DH *, int, int, BN_GENCB *) 170e1051a39Sopenharmony_ci{ 171e1051a39Sopenharmony_ci return dhm->generate_params; 172e1051a39Sopenharmony_ci} 173e1051a39Sopenharmony_ci 174e1051a39Sopenharmony_ciint DH_meth_set_generate_params(DH_METHOD *dhm, 175e1051a39Sopenharmony_ci int (*generate_params) (DH *, int, int, BN_GENCB *)) 176e1051a39Sopenharmony_ci{ 177e1051a39Sopenharmony_ci dhm->generate_params = generate_params; 178e1051a39Sopenharmony_ci return 1; 179e1051a39Sopenharmony_ci} 180