diff options
author | Dr. Stephen Henson <steve@openssl.org> | 2011-03-08 19:07:26 +0000 |
---|---|---|
committer | Dr. Stephen Henson <steve@openssl.org> | 2011-03-08 19:07:26 +0000 |
commit | bc91494e064ebdcff68f987947f97e404fbca0b5 (patch) | |
tree | a2cdc113e234f0886918d9b1e43e4132f1569661 /crypto | |
parent | a1e7883edb9041aff44700fc9817891c800ac703 (diff) |
New SP 800-56A compliant version of DH_compute_key().
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/dh/dh.h | 1 | ||||
-rw-r--r-- | crypto/dh/dh_key.c | 15 |
2 files changed, 16 insertions, 0 deletions
diff --git a/crypto/dh/dh.h b/crypto/dh/dh.h index 084dc08c78..63db8c908b 100644 --- a/crypto/dh/dh.h +++ b/crypto/dh/dh.h @@ -202,6 +202,7 @@ int DH_check(const DH *dh,int *codes); int DH_check_pub_key(const DH *dh,const BIGNUM *pub_key, int *codes); int DH_generate_key(DH *dh); int DH_compute_key(unsigned char *key,const BIGNUM *pub_key,DH *dh); +int DH_compute_key_padded(unsigned char *key,const BIGNUM *pub_key,DH *dh); DH * d2i_DHparams(DH **a,const unsigned char **pp, long length); int i2d_DHparams(const DH *a,unsigned char **pp); #ifndef OPENSSL_NO_FP_API diff --git a/crypto/dh/dh_key.c b/crypto/dh/dh_key.c index bba83be312..6c7a457267 100644 --- a/crypto/dh/dh_key.c +++ b/crypto/dh/dh_key.c @@ -86,6 +86,21 @@ int DH_compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh) return dh->meth->compute_key(key, pub_key, dh); } +int DH_compute_key_padded(unsigned char *key, const BIGNUM *pub_key, DH *dh) + { + int rv, pad; + rv = dh->meth->compute_key(key, pub_key, dh); + if (rv <= 0) + return rv; + pad = BN_num_bytes(dh->p) - rv; + if (pad > 0) + { + memmove(key + pad, key, rv); + memset(key, 0, pad); + } + return rv + pad; + } + static DH_METHOD dh_ossl = { "OpenSSL DH Method", generate_key, |