diff options
author | Aviv Palivoda <palaviv@gmail.com> | 2016-06-20 22:53:49 +0300 |
---|---|---|
committer | Paul Kehrer <paul.l.kehrer@gmail.com> | 2016-06-20 14:53:49 -0500 |
commit | 8feef6872638af1f320147b9df4da3056491cb59 (patch) | |
tree | afc2f27f0d4fabfa345b1e8444ef20c38aff2043 /src | |
parent | b5a8ad91afe9ae47401135e5b9b6477b702606bb (diff) | |
download | cryptography-8feef6872638af1f320147b9df4da3056491cb59.tar.gz cryptography-8feef6872638af1f320147b9df4da3056491cb59.tar.bz2 cryptography-8feef6872638af1f320147b9df4da3056491cb59.zip |
Added function to access and alter opaque DH struct (#2976)
Diffstat (limited to 'src')
-rw-r--r-- | src/_cffi_src/openssl/dh.py | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/_cffi_src/openssl/dh.py b/src/_cffi_src/openssl/dh.py index 6eb627f1..7998a1bd 100644 --- a/src/_cffi_src/openssl/dh.py +++ b/src/_cffi_src/openssl/dh.py @@ -26,6 +26,12 @@ DH *d2i_DHparams(DH **, const unsigned char **, long); int i2d_DHparams(const DH *, unsigned char **); int DHparams_print_fp(FILE *, const DH *); int DHparams_print(BIO *, const DH *); + +/* added in 1.1.0 when the DH struct was opaqued */ +void DH_get0_pqg(const DH *, BIGNUM **, BIGNUM **, BIGNUM **); +int DH_set0_pqg(DH *, BIGNUM *, BIGNUM *, BIGNUM *); +void DH_get0_key(const DH *, BIGNUM **, BIGNUM **); +int DH_set0_key(DH *, BIGNUM *, BIGNUM *); """ MACROS = """ @@ -33,4 +39,80 @@ int DH_generate_parameters_ex(DH *, int, int, BN_GENCB *); """ CUSTOMIZATIONS = """ +/* These functions were added in OpenSSL 1.1.0-pre5 (beta2) */ +#if OPENSSL_VERSION_NUMBER < 0x10100005 || defined(LIBRESSL_VERSION_NUMBER) +void DH_get0_pqg(const DH *dh, BIGNUM **p, BIGNUM **q, BIGNUM **g) +{ + if (p != NULL) + *p = dh->p; + if (q != NULL) + *q = dh->q; + if (g != NULL) + *g = dh->g; +} + +int DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g) +{ + /* If the fields p and g in d are NULL, the corresponding input + * parameters MUST be non-NULL. q may remain NULL. + * + * It is an error to give the results from get0 on d + * as input parameters. + */ + if (p == dh->p || (dh->q != NULL && q == dh->q) || g == dh->g) + return 0; + + if (p != NULL) { + BN_free(dh->p); + dh->p = p; + } + if (q != NULL) { + BN_free(dh->q); + dh->q = q; + } + if (g != NULL) { + BN_free(dh->g); + dh->g = g; + } + + if (q != NULL) { + dh->length = BN_num_bits(q); + } + + return 1; +} + +void DH_get0_key(const DH *dh, BIGNUM **pub_key, BIGNUM **priv_key) +{ + if (pub_key != NULL) + *pub_key = dh->pub_key; + if (priv_key != NULL) + *priv_key = dh->priv_key; +} + +int DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key) +{ + /* If the pub_key in dh is NULL, the corresponding input + * parameters MUST be non-NULL. The priv_key field may + * be left NULL. + * + * It is an error to give the results from get0 on dh + * as input parameters. + */ + if (dh->pub_key == pub_key + || (dh->priv_key != NULL && priv_key == dh->priv_key)) + return 0; + + if (pub_key != NULL) { + BN_free(dh->pub_key); + dh->pub_key = pub_key; + } + if (priv_key != NULL) { + BN_free(dh->priv_key); + dh->priv_key = priv_key; + } + + return 1; +} +#endif """ |