1 /**********************************************************************
2 * Copyright (c) 2015 Andrew Poelstra *
3 * Distributed under the MIT software license, see the accompanying *
4 * file COPYING or http://www.opensource.org/licenses/mit-license.php.*
5 **********************************************************************/
7 #ifndef _SECP256K1_MODULE_ECDH_TESTS_
8 #define _SECP256K1_MODULE_ECDH_TESTS_
10 void test_ecdh_generator_basepoint(void) {
11 unsigned char s_one[32] = { 0 };
12 secp256k1_pubkey_t point[2];
16 /* Check against pubkey creation when the basepoint is the generator */
17 for (i = 0; i < 100; ++i) {
18 secp256k1_sha256_t sha;
19 unsigned char s_b32[32];
20 unsigned char output_ecdh[32];
21 unsigned char output_ser[32];
22 unsigned char point_ser[33];
23 int point_ser_len = sizeof(point_ser);
26 random_scalar_order(&s);
27 secp256k1_scalar_get_b32(s_b32, &s);
29 /* compute using ECDH function */
30 CHECK(secp256k1_ec_pubkey_create(ctx, &point[0], s_one) == 1);
31 CHECK(secp256k1_ecdh(ctx, output_ecdh, &point[0], s_b32) == 1);
32 /* compute "explicitly" */
33 CHECK(secp256k1_ec_pubkey_create(ctx, &point[1], s_b32) == 1);
34 CHECK(secp256k1_ec_pubkey_serialize(ctx, point_ser, &point_ser_len, &point[1], 1) == 1);
35 CHECK(point_ser_len == sizeof(point_ser));
36 secp256k1_sha256_initialize(&sha);
37 secp256k1_sha256_write(&sha, point_ser, point_ser_len);
38 secp256k1_sha256_finalize(&sha, output_ser);
40 CHECK(memcmp(output_ecdh, output_ser, sizeof(output_ser)) == 0);
44 void test_bad_scalar(void) {
45 unsigned char s_zero[32] = { 0 };
46 unsigned char s_overflow[32] = {
47 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
48 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
49 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
50 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41
52 unsigned char s_rand[32] = { 0 };
53 unsigned char output[32];
54 secp256k1_scalar_t rand;
55 secp256k1_pubkey_t point;
57 /* Create random point */
58 random_scalar_order(&rand);
59 secp256k1_scalar_get_b32(s_rand, &rand);
60 CHECK(secp256k1_ec_pubkey_create(ctx, &point, s_rand) == 1);
62 /* Try to multiply it by bad values */
63 CHECK(secp256k1_ecdh(ctx, output, &point, s_zero) == 0);
64 CHECK(secp256k1_ecdh(ctx, output, &point, s_overflow) == 0);
65 /* ...and a good one */
67 CHECK(secp256k1_ecdh(ctx, output, &point, s_overflow) == 1);
70 void run_ecdh_tests(void) {
71 test_ecdh_generator_basepoint();