Bitcoin Core
31.1.0
P2P Digital Currency
Toggle main menu visibility
Loading...
Searching...
No Matches
src
secp256k1
src
modules
extrakeys
tests_exhaustive_impl.h
Go to the documentation of this file.
1
/***********************************************************************
2
* Copyright (c) 2020 Pieter Wuille *
3
* Distributed under the MIT software license, see the accompanying *
4
* file COPYING or https://www.opensource.org/licenses/mit-license.php.*
5
***********************************************************************/
6
7
#ifndef SECP256K1_MODULE_EXTRAKEYS_TESTS_EXHAUSTIVE_H
8
#define SECP256K1_MODULE_EXTRAKEYS_TESTS_EXHAUSTIVE_H
9
10
#include "
../../../include/secp256k1_extrakeys.h
"
11
#include "
main_impl.h
"
12
13
static
void
test_exhaustive_extrakeys
(
const
secp256k1_context
*ctx,
const
secp256k1_ge
* group) {
14
secp256k1_keypair
keypair[
EXHAUSTIVE_TEST_ORDER
- 1];
15
secp256k1_pubkey
pubkey[
EXHAUSTIVE_TEST_ORDER
- 1];
16
secp256k1_xonly_pubkey
xonly_pubkey[
EXHAUSTIVE_TEST_ORDER
- 1];
17
int
parities[
EXHAUSTIVE_TEST_ORDER
- 1];
18
unsigned
char
xonly_pubkey_bytes[
EXHAUSTIVE_TEST_ORDER
- 1][32];
19
int
i;
20
21
for
(i = 1; i <
EXHAUSTIVE_TEST_ORDER
; i++) {
22
secp256k1_fe
fe;
23
secp256k1_scalar
scalar_i;
24
unsigned
char
buf[33];
25
int
parity;
26
27
secp256k1_scalar_set_int
(&scalar_i, i);
28
secp256k1_scalar_get_b32
(buf, &scalar_i);
29
30
/* Construct pubkey and keypair. */
31
CHECK
(
secp256k1_keypair_create
(ctx, &keypair[i - 1], buf));
32
CHECK
(
secp256k1_ec_pubkey_create
(ctx, &pubkey[i - 1], buf));
33
34
/* Construct serialized xonly_pubkey from keypair. */
35
CHECK
(
secp256k1_keypair_xonly_pub
(ctx, &xonly_pubkey[i - 1], &parities[i - 1], &keypair[i - 1]));
36
CHECK
(
secp256k1_xonly_pubkey_serialize
(ctx, xonly_pubkey_bytes[i - 1], &xonly_pubkey[i - 1]));
37
38
/* Parse the xonly_pubkey back and verify it matches the previously serialized value. */
39
CHECK
(
secp256k1_xonly_pubkey_parse
(ctx, &xonly_pubkey[i - 1], xonly_pubkey_bytes[i - 1]));
40
CHECK
(
secp256k1_xonly_pubkey_serialize
(ctx, buf, &xonly_pubkey[i - 1]));
41
CHECK
(
secp256k1_memcmp_var
(xonly_pubkey_bytes[i - 1], buf, 32) == 0);
42
43
/* Construct the xonly_pubkey from the pubkey, and verify it matches the same. */
44
CHECK
(
secp256k1_xonly_pubkey_from_pubkey
(ctx, &xonly_pubkey[i - 1], &parity, &pubkey[i - 1]));
45
CHECK
(parity == parities[i - 1]);
46
CHECK
(
secp256k1_xonly_pubkey_serialize
(ctx, buf, &xonly_pubkey[i - 1]));
47
CHECK
(
secp256k1_memcmp_var
(xonly_pubkey_bytes[i - 1], buf, 32) == 0);
48
49
/* Compare the xonly_pubkey bytes against the precomputed group. */
50
secp256k1_fe_set_b32_mod
(&fe, xonly_pubkey_bytes[i - 1]);
51
CHECK
(
secp256k1_fe_equal
(&fe, &group[i].x));
52
53
/* Check the parity against the precomputed group. */
54
fe = group[i].y;
55
secp256k1_fe_normalize_var
(&fe);
56
CHECK
(
secp256k1_fe_is_odd
(&fe) == parities[i - 1]);
57
58
/* Verify that the higher half is identical to the lower half mirrored. */
59
if
(i >
EXHAUSTIVE_TEST_ORDER
/ 2) {
60
CHECK
(
secp256k1_memcmp_var
(xonly_pubkey_bytes[i - 1], xonly_pubkey_bytes[
EXHAUSTIVE_TEST_ORDER
- i - 1], 32) == 0);
61
CHECK
(parities[i - 1] == 1 - parities[
EXHAUSTIVE_TEST_ORDER
- i - 1]);
62
}
63
}
64
65
/* TODO: keypair/xonly_pubkey tweak tests */
66
}
67
68
#endif
main_impl.h
test_exhaustive_extrakeys
static void test_exhaustive_extrakeys(const secp256k1_context *ctx, const secp256k1_ge *group)
Definition
tests_exhaustive_impl.h:13
secp256k1_fe_is_odd
#define secp256k1_fe_is_odd
Definition
field.h:85
secp256k1_fe_normalize_var
#define secp256k1_fe_normalize_var
Definition
field.h:80
secp256k1_fe_set_b32_mod
#define secp256k1_fe_set_b32_mod
Definition
field.h:87
secp256k1_fe_equal
static int secp256k1_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b)
Determine whether two field elements are equal.
CHECK
#define CHECK(cond)
Unconditional failure on condition failure.
Definition
util.h:35
secp256k1_scalar_set_int
static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v)
Set a scalar to an unsigned integer.
secp256k1_scalar_get_b32
static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar *a)
Convert a scalar to a byte array.
secp256k1_memcmp_var
static SECP256K1_INLINE int secp256k1_memcmp_var(const void *s1, const void *s2, size_t n)
Semantics like memcmp.
Definition
util.h:269
secp256k1_context
struct secp256k1_context_struct secp256k1_context
Unless explicitly stated all pointer arguments must not be NULL.
Definition
secp256k1.h:50
secp256k1_ec_pubkey_create
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_create(const secp256k1_context *ctx, secp256k1_pubkey *pubkey, const unsigned char *seckey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Compute the public key for a secret key.
Definition
secp256k1.c:612
secp256k1_extrakeys.h
secp256k1_xonly_pubkey_from_pubkey
SECP256K1_API int secp256k1_xonly_pubkey_from_pubkey(const secp256k1_context *ctx, secp256k1_xonly_pubkey *xonly_pubkey, int *pk_parity, const secp256k1_pubkey *pubkey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(4)
Converts a secp256k1_pubkey into a secp256k1_xonly_pubkey.
Definition
main_impl.h:99
secp256k1_xonly_pubkey_serialize
SECP256K1_API int secp256k1_xonly_pubkey_serialize(const secp256k1_context *ctx, unsigned char *output32, const secp256k1_xonly_pubkey *pubkey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Serialize an xonly_pubkey object into a 32-byte sequence.
Definition
main_impl.h:44
secp256k1_keypair_create
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_keypair_create(const secp256k1_context *ctx, secp256k1_keypair *keypair, const unsigned char *seckey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Compute the keypair for a valid secret key.
Definition
main_impl.h:196
secp256k1_keypair_xonly_pub
SECP256K1_API int secp256k1_keypair_xonly_pub(const secp256k1_context *ctx, secp256k1_xonly_pubkey *pubkey, int *pk_parity, const secp256k1_keypair *keypair) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(4)
Get the x-only public key from a keypair.
Definition
main_impl.h:234
secp256k1_xonly_pubkey_parse
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_xonly_pubkey_parse(const secp256k1_context *ctx, secp256k1_xonly_pubkey *pubkey, const unsigned char *input32) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Parse a 32-byte sequence into a xonly_pubkey object.
Definition
main_impl.h:22
secp256k1_fe
This field implementation represents the value as 10 uint32_t limbs in base 2^26.
Definition
field_10x26.h:14
secp256k1_ge
A group element in affine coordinates on the secp256k1 curve, or occasionally on an isomorphic curve ...
Definition
group.h:16
secp256k1_keypair
Opaque data structure that holds a keypair consisting of a secret and a public key.
Definition
secp256k1_extrakeys.h:33
secp256k1_pubkey
Opaque data structure that holds a parsed and valid public key.
Definition
secp256k1.h:61
secp256k1_scalar
A scalar modulo the group order of the secp256k1 curve.
Definition
scalar_4x64.h:13
secp256k1_xonly_pubkey
Opaque data structure that holds a parsed and valid "x-only" public key.
Definition
secp256k1_extrakeys.h:22
EXHAUSTIVE_TEST_ORDER
#define EXHAUSTIVE_TEST_ORDER
Definition
tests_exhaustive.c:13
Generated on
for Bitcoin Core by
1.17.0