#include <stdlib.h>
#include <string.h>
-#include "e_os.h"
+#include "internal/nelem.h"
#include <openssl/crypto.h>
#include <openssl/bio.h>
#include <openssl/bn.h>
#include <openssl/err.h>
#include "testutil.h"
-#ifdef OPENSSL_NO_DH
-int main(int argc, char *argv[])
-{
- printf("No DH support\n");
- return EXIT_SUCCESS;
-}
-#else
+#ifndef OPENSSL_NO_DH
# include <openssl/dh.h>
static int cb(int p, int n, BN_GENCB *arg);
-static const char rnd_seed[] =
- "string to make the random number generator think it has randomness";
-
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;
- RAND_seed(rnd_seed, sizeof rnd_seed);
-
if (!TEST_ptr(_cb = BN_GENCB_new()))
goto err;
BN_GENCB_set(_cb, &cb, NULL);
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;
}
TEST_error("Test failed RFC5114 set %d\n", i + 1);
return 0;
}
+#endif
-void register_tests(void)
+int setup_tests(void)
{
+#ifdef OPENSSL_NO_DH
+ TEST_note("No DH support");
+#else
ADD_TEST(dh_test);
ADD_TEST(rfc5114_test);
-}
#endif
+ return 1;
+}