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, *priv_key = NULL;
const BIGNUM *bpub_key = NULL;
- BIGNUM *bp = NULL, *bg = NULL;
+ BIGNUM *bp = NULL, *bg = NULL, *cpriv_key = NULL;
char buf[12] = {0};
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 = 1;
BIO *out = NULL;
BN_print(out, bpub_key);
BIO_puts(out, "\n");
+ /* Also test with a private-key-only copy of |b|. */
+ if ((c = DHparams_dup(b)) == NULL
+ || (cpriv_key = BN_dup(priv_key)) == NULL
+ || !DH_set0_key(c, NULL, cpriv_key))
+ goto err;
+ cpriv_key = NULL;
+
alen = DH_size(a);
abuf = OPENSSL_malloc(alen);
if (abuf == NULL)
BIO_puts(out, buf);
}
BIO_puts(out, "\n");
- if ((aout < 4) || (bout != aout) || (memcmp(abuf, bbuf, aout) != 0)) {
+
+ clen = DH_size(c);
+ cbuf = OPENSSL_malloc(clen);
+ if (cbuf == NULL)
+ goto err;
+
+ cout = DH_compute_key(cbuf, apub_key, c);
+
+ BIO_puts(out, "key3 =");
+ for (i = 0; i < cout; i++) {
+ sprintf(buf, "%02X", cbuf[i]);
+ BIO_puts(out, buf);
+ }
+ BIO_puts(out, "\n");
+
+ if ((aout < 4) || (bout != aout) || (memcmp(abuf, bbuf, aout) != 0)
+ || (cout != aout) || (memcmp(abuf, cbuf, aout) != 0)) {
fprintf(stderr, "Error in DH routines\n");
ret = 1;
} else
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);
BIO_free(out);