be. The values point to the internal representation of the public key and
private key values. This memory should not be freed directly.
-The public and private key values can be set using DH_set0_key(). The public
-key must be non-NULL the first time this function is called on a given DH
-object. The private key may be NULL. On subsequent calls, either may be NULL,
-which means the corresponding DH field is left untouched. As for DH_set0_pqg()
-this function transfers the memory management of the key values to the DH
-object, and therefore they should not be freed directly after this function has
-been called.
+The public and private key values can be set using DH_set0_key(). Either
+parameter may be NULL, which means the corresponding DH field is left
+untouched. As with DH_set0_pqg() this function transfers the memory management
+of the key values to the DH object, and therefore they should not be freed
+directly after this function has been called.
DH_set_flags() sets the flags in the B<flags> parameter on the DH object.
Multiple flags can be passed in one go (bitwise ORed together). Any flags that
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()))
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))
|| !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;
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;
}