diff options
author | David Benjamin <davidben@google.com> | 2017-09-18 17:58:24 +0200 |
---|---|---|
committer | Bernd Edlinger <bernd.edlinger@hotmail.de> | 2017-09-26 14:48:51 +0200 |
commit | 7966101e20abdcf1da4815dc41e47f52cce02f0f (patch) | |
tree | b17cffacd29ab9c2e28f11b74515b0fb81d5a158 /test/dhtest.c | |
parent | Add and use function tls1_in_list to avoid code duplication. (diff) | |
download | openssl-7966101e20abdcf1da4815dc41e47f52cce02f0f.tar.xz openssl-7966101e20abdcf1da4815dc41e47f52cce02f0f.zip |
Allow DH_set0_key with only private key.
The pub_key field for DH isn't actually used in DH_compute_key at all.
(Note the peer public key is passed in as as BIGNUM.) It's mostly there
so the caller may extract it from DH_generate_key. It doesn't
particularly need to be present if filling in a DH from external
parameters.
The check in DH_set0_key conflicts with adding OpenSSL 1.1.0 to Node.
Their public API is a thin wrapper over the old OpenSSL one:
https://nodejs.org/api/crypto.html#crypto_class_diffiehellman
They have separate setPrivateKey and setPublicKey methods, so the public
key may be set last or not at all. In 1.0.2, either worked fine since
operations on DH objects generally didn't use the public key. (Like
with OpenSSL, Node's setPublicKey method is also largely a no-op, but so
it goes.) In 1.1.0, DH_set0_key prevents create a private-key-only DH
object.
Reviewed-by: Andy Polyakov <appro@openssl.org>
Reviewed-by: Rich Salz <rsalz@openssl.org>
Reviewed-by: Bernd Edlinger <bernd.edlinger@hotmail.de>
(Merged from https://github.com/openssl/openssl/pull/4384)
Diffstat (limited to 'test/dhtest.c')
-rw-r--r-- | test/dhtest.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/test/dhtest.c b/test/dhtest.c index 7500f37983..96d7027cc6 100644 --- a/test/dhtest.c +++ b/test/dhtest.c @@ -29,12 +29,14 @@ static int dh_test(void) BN_GENCB *_cb = NULL; DH *a = NULL; DH *b = NULL; + DH *c = NULL; const BIGNUM *ap = NULL, *ag = NULL, *apub_key = NULL; - const BIGNUM *bpub_key = NULL; - BIGNUM *bp = NULL, *bg = NULL; + const BIGNUM *bpub_key = NULL, *bpriv_key = NULL; + BIGNUM *bp = NULL, *bg = NULL, *cpriv_key = NULL; unsigned char *abuf = NULL; unsigned char *bbuf = NULL; - int i, alen, blen, aout, bout; + unsigned char *cbuf = NULL; + int i, alen, blen, clen, aout, bout, cout; int ret = 0; if (!TEST_ptr(_cb = BN_GENCB_new())) @@ -70,7 +72,14 @@ static int dh_test(void) if (!DH_generate_key(b)) goto err; - DH_get0_key(b, &bpub_key, NULL); + DH_get0_key(b, &bpub_key, &bpriv_key); + + /* Also test with a private-key-only copy of |b|. */ + if (!TEST_ptr(c = DHparams_dup(b)) + || !TEST_ptr(cpriv_key = BN_dup(bpriv_key)) + || !TEST_true(DH_set0_key(c, NULL, cpriv_key))) + goto err; + cpriv_key = NULL; alen = DH_size(a); if (!TEST_ptr(abuf = OPENSSL_malloc(alen)) @@ -82,8 +91,14 @@ static int dh_test(void) || !TEST_true((bout = DH_compute_key(bbuf, apub_key, b)) != -1)) goto err; + clen = DH_size(c); + if (!TEST_ptr(cbuf = OPENSSL_malloc(clen)) + || !TEST_true((cout = DH_compute_key(cbuf, apub_key, c)) != -1)) + goto err; + if (!TEST_true(aout >= 4) - || !TEST_mem_eq(abuf, aout, bbuf, bout)) + || !TEST_mem_eq(abuf, aout, bbuf, bout) + || !TEST_mem_eq(abuf, aout, cbuf, cout)) goto err; ret = 1; @@ -91,10 +106,13 @@ static int dh_test(void) err: OPENSSL_free(abuf); OPENSSL_free(bbuf); + OPENSSL_free(cbuf); DH_free(b); DH_free(a); + DH_free(c); BN_free(bp); BN_free(bg); + BN_free(cpriv_key); BN_GENCB_free(_cb); return ret; } |