1 /* 2 * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the OpenSSL license (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 #include <openssl/dh.h> 11 #include "internal/refcount.h" 12 13 struct dh_st { 14 /* 15 * This first argument is used to pick up errors when a DH is passed 16 * instead of a EVP_PKEY 17 */ 18 int pad; 19 int version; 20 BIGNUM *p; 21 BIGNUM *g; 22 int32_t length; /* optional */ 23 BIGNUM *pub_key; /* g^x % p */ 24 BIGNUM *priv_key; /* x */ 25 int flags; 26 BN_MONT_CTX *method_mont_p; 27 /* Place holders if we want to do X9.42 DH */ 28 BIGNUM *q; 29 BIGNUM *j; 30 unsigned char *seed; 31 int seedlen; 32 BIGNUM *counter; 33 CRYPTO_REF_COUNT references; 34 CRYPTO_EX_DATA ex_data; 35 const DH_METHOD *meth; 36 ENGINE *engine; 37 CRYPTO_RWLOCK *lock; 38 }; 39 40 struct dh_method { 41 char *name; 42 /* Methods here */ 43 int (*generate_key) (DH *dh); 44 int (*compute_key) (unsigned char *key, const BIGNUM *pub_key, DH *dh); 45 46 /* Can be null */ 47 int (*bn_mod_exp) (const DH *dh, BIGNUM *r, const BIGNUM *a, 48 const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx, 49 BN_MONT_CTX *m_ctx); 50 int (*init) (DH *dh); 51 int (*finish) (DH *dh); 52 int flags; 53 char *app_data; 54 /* If this is non-NULL, it will be used to generate parameters */ 55 int (*generate_params) (DH *dh, int prime_len, int generator, 56 BN_GENCB *cb); 57 }; 58