]> Git Repo - secp256k1.git/blob - src/modules/ecdh/tests_impl.h
Use size_t for lengths (at least in external API)
[secp256k1.git] / src / modules / ecdh / tests_impl.h
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  **********************************************************************/
6
7 #ifndef _SECP256K1_MODULE_ECDH_TESTS_
8 #define _SECP256K1_MODULE_ECDH_TESTS_
9
10 void test_ecdh_generator_basepoint(void) {
11     unsigned char s_one[32] = { 0 };
12     secp256k1_pubkey_t point[2];
13     int i;
14
15     s_one[31] = 1;
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         size_t point_ser_len = sizeof(point_ser);
24         secp256k1_scalar_t s;
25
26         random_scalar_order(&s);
27         secp256k1_scalar_get_b32(s_b32, &s);
28
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);
39         /* compare */
40         CHECK(memcmp(output_ecdh, output_ser, sizeof(output_ser)) == 0);
41     }
42 }
43
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
51     };
52     unsigned char s_rand[32] = { 0 };
53     unsigned char output[32];
54     secp256k1_scalar_t rand;
55     secp256k1_pubkey_t point;
56
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);
61
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 */
66     s_overflow[31] -= 1;
67     CHECK(secp256k1_ecdh(ctx, output, &point, s_overflow) == 1);
68 }
69
70 void run_ecdh_tests(void) {
71     test_ecdh_generator_basepoint();
72     test_bad_scalar();
73 }
74
75 #endif
This page took 0.028651 seconds and 4 git commands to generate.