7
7
#ifndef SECP256K1_MODULE_ECDH_TESTS_H
8
8
#define SECP256K1_MODULE_ECDH_TESTS_H
9
9
10
+ int ecdh_hash_function_test_fail (unsigned char * output , const unsigned char * x , const unsigned char * y , void * data ) {
11
+ (void )output ;
12
+ (void )x ;
13
+ (void )y ;
14
+ (void )data ;
15
+ return 0 ;
16
+ }
17
+
18
+ int ecdh_hash_function_custom (unsigned char * output , const unsigned char * x , const unsigned char * y , void * data ) {
19
+ (void )data ;
20
+ /* Save x and y as uncompressed public key */
21
+ output [0 ] = 0x04 ;
22
+ memcpy (output + 1 , x , 32 );
23
+ memcpy (output + 33 , y , 32 );
24
+ return 1 ;
25
+ }
26
+
10
27
void test_ecdh_api (void ) {
11
28
/* Setup context that just counts errors */
12
29
secp256k1_context * tctx = secp256k1_context_create (SECP256K1_CONTEXT_SIGN );
@@ -21,15 +38,15 @@ void test_ecdh_api(void) {
21
38
CHECK (secp256k1_ec_pubkey_create (tctx , & point , s_one ) == 1 );
22
39
23
40
/* Check all NULLs are detected */
24
- CHECK (secp256k1_ecdh (tctx , res , & point , s_one ) == 1 );
41
+ CHECK (secp256k1_ecdh (tctx , res , & point , s_one , NULL , NULL ) == 1 );
25
42
CHECK (ecount == 0 );
26
- CHECK (secp256k1_ecdh (tctx , NULL , & point , s_one ) == 0 );
43
+ CHECK (secp256k1_ecdh (tctx , NULL , & point , s_one , NULL , NULL ) == 0 );
27
44
CHECK (ecount == 1 );
28
- CHECK (secp256k1_ecdh (tctx , res , NULL , s_one ) == 0 );
45
+ CHECK (secp256k1_ecdh (tctx , res , NULL , s_one , NULL , NULL ) == 0 );
29
46
CHECK (ecount == 2 );
30
- CHECK (secp256k1_ecdh (tctx , res , & point , NULL ) == 0 );
47
+ CHECK (secp256k1_ecdh (tctx , res , & point , NULL , NULL , NULL ) == 0 );
31
48
CHECK (ecount == 3 );
32
- CHECK (secp256k1_ecdh (tctx , res , & point , s_one ) == 1 );
49
+ CHECK (secp256k1_ecdh (tctx , res , & point , s_one , NULL , NULL ) == 1 );
33
50
CHECK (ecount == 3 );
34
51
35
52
/* Cleanup */
@@ -46,27 +63,34 @@ void test_ecdh_generator_basepoint(void) {
46
63
for (i = 0 ; i < 100 ; ++ i ) {
47
64
secp256k1_sha256 sha ;
48
65
unsigned char s_b32 [32 ];
49
- unsigned char output_ecdh [32 ];
66
+ unsigned char output_ecdh [65 ];
50
67
unsigned char output_ser [32 ];
51
- unsigned char point_ser [33 ];
68
+ unsigned char point_ser [65 ];
52
69
size_t point_ser_len = sizeof (point_ser );
53
70
secp256k1_scalar s ;
54
71
55
72
random_scalar_order (& s );
56
73
secp256k1_scalar_get_b32 (s_b32 , & s );
57
74
58
- /* compute using ECDH function */
59
75
CHECK (secp256k1_ec_pubkey_create (ctx , & point [0 ], s_one ) == 1 );
60
- CHECK (secp256k1_ecdh (ctx , output_ecdh , & point [0 ], s_b32 ) == 1 );
61
- /* compute "explicitly" */
62
76
CHECK (secp256k1_ec_pubkey_create (ctx , & point [1 ], s_b32 ) == 1 );
77
+
78
+ /* compute using ECDH function with custom hash function */
79
+ CHECK (secp256k1_ecdh (ctx , output_ecdh , & point [0 ], s_b32 , ecdh_hash_function_custom , NULL ) == 1 );
80
+ /* compute "explicitly" */
81
+ CHECK (secp256k1_ec_pubkey_serialize (ctx , point_ser , & point_ser_len , & point [1 ], SECP256K1_EC_UNCOMPRESSED ) == 1 );
82
+ /* compare */
83
+ CHECK (memcmp (output_ecdh , point_ser , 65 ) == 0 );
84
+
85
+ /* compute using ECDH function with default hash function */
86
+ CHECK (secp256k1_ecdh (ctx , output_ecdh , & point [0 ], s_b32 , NULL , NULL ) == 1 );
87
+ /* compute "explicitly" */
63
88
CHECK (secp256k1_ec_pubkey_serialize (ctx , point_ser , & point_ser_len , & point [1 ], SECP256K1_EC_COMPRESSED ) == 1 );
64
- CHECK (point_ser_len == sizeof (point_ser ));
65
89
secp256k1_sha256_initialize (& sha );
66
90
secp256k1_sha256_write (& sha , point_ser , point_ser_len );
67
91
secp256k1_sha256_finalize (& sha , output_ser );
68
92
/* compare */
69
- CHECK (memcmp (output_ecdh , output_ser , sizeof ( output_ser ) ) == 0 );
93
+ CHECK (memcmp (output_ecdh , output_ser , 32 ) == 0 );
70
94
}
71
95
}
72
96
@@ -89,11 +113,14 @@ void test_bad_scalar(void) {
89
113
CHECK (secp256k1_ec_pubkey_create (ctx , & point , s_rand ) == 1 );
90
114
91
115
/* Try to multiply it by bad values */
92
- CHECK (secp256k1_ecdh (ctx , output , & point , s_zero ) == 0 );
93
- CHECK (secp256k1_ecdh (ctx , output , & point , s_overflow ) == 0 );
116
+ CHECK (secp256k1_ecdh (ctx , output , & point , s_zero , NULL , NULL ) == 0 );
117
+ CHECK (secp256k1_ecdh (ctx , output , & point , s_overflow , NULL , NULL ) == 0 );
94
118
/* ...and a good one */
95
119
s_overflow [31 ] -= 1 ;
96
- CHECK (secp256k1_ecdh (ctx , output , & point , s_overflow ) == 1 );
120
+ CHECK (secp256k1_ecdh (ctx , output , & point , s_overflow , NULL , NULL ) == 1 );
121
+
122
+ /* Hash function failure results in ecdh failure */
123
+ CHECK (secp256k1_ecdh (ctx , output , & point , s_overflow , ecdh_hash_function_test_fail , NULL ) == 0 );
97
124
}
98
125
99
126
void run_ecdh_tests (void ) {
0 commit comments