|  | /* | 
|  | * Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved. | 
|  | * | 
|  | * Licensed under the Apache License 2.0 (the "License").  You may not use | 
|  | * this file except in compliance with the License.  You can obtain a copy | 
|  | * in the file LICENSE in the source distribution or at | 
|  | * https://www.openssl.org/source/license.html | 
|  | */ | 
|  |  | 
|  | /* | 
|  | * DH low level APIs are deprecated for public use, but still ok for | 
|  | * internal use. | 
|  | */ | 
|  | #include "internal/deprecated.h" | 
|  |  | 
|  | #include "dh_local.h" | 
|  | #include <string.h> | 
|  | #include <openssl/err.h> | 
|  |  | 
|  | DH_METHOD *DH_meth_new(const char *name, int flags) | 
|  | { | 
|  | DH_METHOD *dhm = OPENSSL_zalloc(sizeof(*dhm)); | 
|  |  | 
|  | if (dhm != NULL) { | 
|  | dhm->flags = flags; | 
|  |  | 
|  | dhm->name = OPENSSL_strdup(name); | 
|  | if (dhm->name != NULL) | 
|  | return dhm; | 
|  |  | 
|  | OPENSSL_free(dhm); | 
|  | } | 
|  |  | 
|  | ERR_raise(ERR_LIB_DH, ERR_R_MALLOC_FAILURE); | 
|  | return NULL; | 
|  | } | 
|  |  | 
|  | void DH_meth_free(DH_METHOD *dhm) | 
|  | { | 
|  | if (dhm != NULL) { | 
|  | OPENSSL_free(dhm->name); | 
|  | OPENSSL_free(dhm); | 
|  | } | 
|  | } | 
|  |  | 
|  | DH_METHOD *DH_meth_dup(const DH_METHOD *dhm) | 
|  | { | 
|  | DH_METHOD *ret = OPENSSL_malloc(sizeof(*ret)); | 
|  |  | 
|  | if (ret != NULL) { | 
|  | memcpy(ret, dhm, sizeof(*dhm)); | 
|  |  | 
|  | ret->name = OPENSSL_strdup(dhm->name); | 
|  | if (ret->name != NULL) | 
|  | return ret; | 
|  |  | 
|  | OPENSSL_free(ret); | 
|  | } | 
|  |  | 
|  | ERR_raise(ERR_LIB_DH, ERR_R_MALLOC_FAILURE); | 
|  | return NULL; | 
|  | } | 
|  |  | 
|  | const char *DH_meth_get0_name(const DH_METHOD *dhm) | 
|  | { | 
|  | return dhm->name; | 
|  | } | 
|  |  | 
|  | int DH_meth_set1_name(DH_METHOD *dhm, const char *name) | 
|  | { | 
|  | char *tmpname = OPENSSL_strdup(name); | 
|  |  | 
|  | if (tmpname == NULL) { | 
|  | ERR_raise(ERR_LIB_DH, ERR_R_MALLOC_FAILURE); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | OPENSSL_free(dhm->name); | 
|  | dhm->name = tmpname; | 
|  |  | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | int DH_meth_get_flags(const DH_METHOD *dhm) | 
|  | { | 
|  | return dhm->flags; | 
|  | } | 
|  |  | 
|  | int DH_meth_set_flags(DH_METHOD *dhm, int flags) | 
|  | { | 
|  | dhm->flags = flags; | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | void *DH_meth_get0_app_data(const DH_METHOD *dhm) | 
|  | { | 
|  | return dhm->app_data; | 
|  | } | 
|  |  | 
|  | int DH_meth_set0_app_data(DH_METHOD *dhm, void *app_data) | 
|  | { | 
|  | dhm->app_data = app_data; | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | int (*DH_meth_get_generate_key(const DH_METHOD *dhm)) (DH *) | 
|  | { | 
|  | return dhm->generate_key; | 
|  | } | 
|  |  | 
|  | int DH_meth_set_generate_key(DH_METHOD *dhm, int (*generate_key) (DH *)) | 
|  | { | 
|  | dhm->generate_key = generate_key; | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | int (*DH_meth_get_compute_key(const DH_METHOD *dhm)) | 
|  | (unsigned char *key, const BIGNUM *pub_key, DH *dh) | 
|  | { | 
|  | return dhm->compute_key; | 
|  | } | 
|  |  | 
|  | int DH_meth_set_compute_key(DH_METHOD *dhm, | 
|  | int (*compute_key) (unsigned char *key, const BIGNUM *pub_key, DH *dh)) | 
|  | { | 
|  | dhm->compute_key = compute_key; | 
|  | return 1; | 
|  | } | 
|  |  | 
|  |  | 
|  | int (*DH_meth_get_bn_mod_exp(const DH_METHOD *dhm)) | 
|  | (const DH *, BIGNUM *, const BIGNUM *, const BIGNUM *, const BIGNUM *, | 
|  | BN_CTX *, BN_MONT_CTX *) | 
|  | { | 
|  | return dhm->bn_mod_exp; | 
|  | } | 
|  |  | 
|  | int DH_meth_set_bn_mod_exp(DH_METHOD *dhm, | 
|  | int (*bn_mod_exp) (const DH *, BIGNUM *, const BIGNUM *, const BIGNUM *, | 
|  | const BIGNUM *, BN_CTX *, BN_MONT_CTX *)) | 
|  | { | 
|  | dhm->bn_mod_exp = bn_mod_exp; | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | int (*DH_meth_get_init(const DH_METHOD *dhm))(DH *) | 
|  | { | 
|  | return dhm->init; | 
|  | } | 
|  |  | 
|  | int DH_meth_set_init(DH_METHOD *dhm, int (*init)(DH *)) | 
|  | { | 
|  | dhm->init = init; | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | int (*DH_meth_get_finish(const DH_METHOD *dhm)) (DH *) | 
|  | { | 
|  | return dhm->finish; | 
|  | } | 
|  |  | 
|  | int DH_meth_set_finish(DH_METHOD *dhm, int (*finish) (DH *)) | 
|  | { | 
|  | dhm->finish = finish; | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | int (*DH_meth_get_generate_params(const DH_METHOD *dhm)) | 
|  | (DH *, int, int, BN_GENCB *) | 
|  | { | 
|  | return dhm->generate_params; | 
|  | } | 
|  |  | 
|  | int DH_meth_set_generate_params(DH_METHOD *dhm, | 
|  | int (*generate_params) (DH *, int, int, BN_GENCB *)) | 
|  | { | 
|  | dhm->generate_params = generate_params; | 
|  | return 1; | 
|  | } |