mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-10 10:52:31 -05:00
![Pieter Wuille](/assets/img/avatar_default.png)
705ce7ed8c Merge bitcoin-core/secp256k1#1129: ElligatorSwift + integrated x-only DH 0702ecb061 Merge bitcoin-core/secp256k1#1338: Drop no longer needed `#include "../include/secp256k1.h"` 90e360acc2 Add doc/ellswift.md with ElligatorSwift explanation 4f091847c2 Add ellswift testing to CI 1bcea8c57f Add benchmarks for ellswift module 2d1d41acf8 Add ctime tests for ellswift module df633cdeba Add _prefix and _bip324 ellswift_xdh hash functions 9695deb351 Add tests for ellswift module c47917bbd6 Add ellswift module implementing ElligatorSwift 79e5b2a8b8 Add functions to test if X coordinate is valid a597a5a9ce Add benchmark for key generation 30574f22ea Merge bitcoin-core/secp256k1#1349: Normalize ge produced from secp256k1_pubkey_load 45c5ca7675 Merge bitcoin-core/secp256k1#1350: scalar: introduce and use `secp256k1_{read,write}_be64` helpers f1652528be Normalize ge produced from secp256k1_pubkey_load 7067ee54b4 tests: add tests for `secp256k1_{read,write}_be64` 740528caad scalar: use newly introduced `secp256k1_{read,write}_be64` helpers (4x64 impl.) 67214f5f7d Merge bitcoin-core/secp256k1#1339: scalar: refactor: use `secp256k1_{read,write}_be32` helpers cb1a59275c Merge bitcoin-core/secp256k1#1341: docs: correct `pubkey` param descriptions for `secp256k1_keypair_{xonly_,}pub` f3644287b1 docs: correct `pubkey` param descriptions for `secp256k1_keypair_{xonly_,}pub` 887183e7de scalar: use `secp256k1_{read,write}_be32` helpers (4x64 impl.) 52b84238de scalar: use `secp256k1_{read,write}_be32` helpers (8x32 impl.) e449af6872 Drop no longer needed `#include "../include/secp256k1.h"` 60556c9f49 Merge bitcoin-core/secp256k1#1337: ci: Fix error D8037 in `cl.exe` (attempt 2) db29bf220c ci: Remove quirk that runs dummy command after wineserver c7db4942b3 ci: Fix error D8037 in `cl.exe` 7dae115861 Revert "ci: Move wine prefix to /tmp to avoid error D8037 in cl.exe" bf29f8d0a6 Merge bitcoin-core/secp256k1#1334: fix input range comment for `secp256k1_fe_add_int` 605e07e365 fix input range comment for `secp256k1_fe_add_int` debf3e5c08 Merge bitcoin-core/secp256k1#1330: refactor: take use of `secp256k1_scalar_{zero,one}` constants d75dc59b58 Merge bitcoin-core/secp256k1#1333: test: Warn if both `VERIFY` and `COVERAGE` are defined ade5b36701 tests: add checks for scalar constants `secp256k1_scalar_{zero,one}` e83801f5db test: Warn if both `VERIFY` and `COVERAGE` are defined 654246c635 refactor: take use of `secp256k1_scalar_{zero,one}` constants 908e02d596 Merge bitcoin-core/secp256k1#1328: build: Bump MSVC warning level up to W3 1549db0ca5 build: Level up MSVC warnings 20a5da5fb1 Merge bitcoin-core/secp256k1#1310: Refine release process ad84603297 release process: clarify change log updates 6348bc7eee release process: fix process for maintenance release 79fa50b082 release process: mention targeted release schedule 165206789b release process: add sanity checks 09df0bfb23 Merge bitcoin-core/secp256k1#1327: ci: Move wine prefix to /tmp to avoid error D8037 in cl.exe 27504d5c94 ci: Move wine prefix to /tmp to avoid error D8037 in cl.exe d373a7215b Merge bitcoin-core/secp256k1#1316: Do not invoke fe_is_zero on failed set_b32_limit 6433175ffe Do not invoke fe_is_zero on failed set_b32_limit 5f7903c73c Merge bitcoin-core/secp256k1#1318: build: Enable -DVERIFY for precomputation binaries e9e4526a4e Merge bitcoin-core/secp256k1#1317: Make fe_cmov take max of magnitudes 5768b50229 build: Enable -DVERIFY for precomputation binaries 31b4bbee1e Make fe_cmov take max of magnitudes 83186db34a Merge bitcoin-core/secp256k1#1314: release cleanup: bump version after 0.3.2 95448ef2f8 release cleanup: bump version after 0.3.2 acf5c55ae6 Merge bitcoin-core/secp256k1#1312: release: Prepare for 0.3.2 d490ca2046 release: Prepare for 0.3.2 3e3d125b83 Merge bitcoin-core/secp256k1#1309: changelog: Catch up e8295d07ab Merge bitcoin-core/secp256k1#1311: Revert "Remove unused scratch space from API" 697e1ccf4a changelog: Catch up 3ad1027a40 Revert "Remove unused scratch space from API" 76b43f3443 changelog: Add entry for #1303 7d4f86d242 Merge bitcoin-core/secp256k1#1307: Mark more assembly outputs as early clobber b54a0672ef Merge bitcoin-core/secp256k1#1304: build: Rename arm to arm32 and check if it's really supported c6bb29b303 build: Rename `64bit` to `x86_64` 8c9ae37a5a Add release note 03246457a8 autotools: Add `SECP_ARM32_ASM_CHECK` macro ed4ba238e2 cmake: Add `check_arm32_assembly` function 350b4bd6e6 Mark stack variables as early clobber for technical correctness 0c729ba70d Bugfix: mark outputs as early clobber in scalar x86_64 asm 3353d3c753 Merge bitcoin-core/secp256k1#1207: Split fe_set_b32 into reducing and normalizing variants 5b32602295 Split fe_set_b32 into reducing and normalizing variants 006ddc1f42 Merge bitcoin-core/secp256k1#1306: build: Make tests work with external default callbacks 1907f0f166 build: Make tests work with external default callbacks fb3a806365 Merge bitcoin-core/secp256k1#1133: schnorrsig: Add test vectors for variable-length messages cd54ac7c1c schnorrsig: Improve docs of schnorrsig_sign_custom 28687b0312 schnorrsig: Add BIP340 varlen test vectors 97a98bed1e schnorrsig: Refactor test vector code to allow varlen messages ab5a917128 Merge bitcoin-core/secp256k1#1303: ct: Use more volatile 9eb6934f69 Merge bitcoin-core/secp256k1#1305: Remove unused scratch space from API 073d98a076 Merge bitcoin-core/secp256k1#1292: refactor: Make 64-bit shift explicit 17fa21733a ct: Be cautious and use volatile trick in more "conditional" paths 5fb336f9ce ct: Use volatile trick in scalar_cond_negate 712e7f8722 Remove unused scratch space from API 54d34b6c24 Merge bitcoin-core/secp256k1#1300: Avoid normalize conditional on VERIFY c63ec88ebf Merge bitcoin-core/secp256k1#1066: Abstract out and merge all the magnitude/normalized logic 7fc642fa25 Simplify secp256k1_fe_{impl_,}verify 4e176ad5b9 Abstract out verify logic for fe_is_square_var 4371f98346 Abstract out verify logic for fe_add_int 89e324c6b9 Abstract out verify logic for fe_half 283cd80ab4 Abstract out verify logic for fe_get_bounds d5aa2f0358 Abstract out verify logic for fe_inv{,_var} 3167646072 Abstract out verify logic for fe_from_storage 76d31e5047 Abstract out verify logic for fe_to_storage 1e6894bdd7 Abstract out verify logic for fe_cmov be82bd8e03 Improve comments/checks for fe_sqrt 6ab35082ef Abstract out verify logic for fe_sqr 4c25f6efbd Abstract out verify logic for fe_mul e179e651cb Abstract out verify logic for fe_add 7e7ad7ff57 Abstract out verify logic for fe_mul_int 65d82a3445 Abstract out verify logic for fe_negate 144670893e Abstract out verify logic for fe_get_b32 f7a7666aeb Abstract out verify logic for fe_set_b32 ce4d2093e8 Abstract out verify logic for fe_cmp_var 7d7d43c6dd Improve comments/check for fe_equal{,_var} c5e788d672 Abstract out verify logic for fe_is_odd d3f3fe8616 Abstract out verify logic for fe_is_zero c701d9a471 Abstract out verify logic for fe_clear 19a2bfeeea Abstract out verify logic for fe_set_int 864f9db491 Abstract out verify logic for fe_normalizes_to_zero{,_var} 6c31371120 Abstract out verify logic for fe_normalize_var e28b51f522 Abstract out verify logic for fe_normalize_weak b6b6f9cb97 Abstract out verify logic for fe_normalize 7fa5195559 Bugfix: correct SECP256K1_FE_CONST mag/norm fields e5cf4bf3ff build: Rename `arm` to `arm32` b29566c51b Merge magnitude/normalized fields, move/improve comments 97c63b9039 Avoid normalize conditional on VERIFY 341cc19726 Merge bitcoin-core/secp256k1#1299: Infinity handling: ecmult_const(infinity) works, and group verification bbc834467c Avoid secp256k1_ge_set_gej_zinv with uninitialized z 0a2e0b2ae4 Make secp256k1_{fe,ge,gej}_verify work as no-op if non-VERIFY f20266722a Add invariant checking to group elements a18821d5b1 Always initialize output coordinates in secp256k1_ge_set_gej 3086cb90ac Expose secp256k1_fe_verify to other modules a0e696fd4d Make secp256k1_ecmult_const handle infinity 24c768ae09 Merge bitcoin-core/secp256k1#1301: Avoid using bench_verify_data as bench_sign_data; merge them 2e65f1fdbc Avoid using bench_verify_data as bench_sign_data; merge them 1cf15ebd94 Merge bitcoin-core/secp256k1#1296: docs: complete interface description for `secp256k1_schnorrsig_sign_custom` 149c41cee1 docs: complete interface description for `secp256k1_schnorrsig_sign_custom` f30c74866b Merge bitcoin-core/secp256k1#1270: cmake: Fix library ABI versioning d1e48e5474 refactor: Make 64-bit shift explicit b2e29e43d0 ci: Treat all compiler warnings as errors in "Windows (VS 2022)" task 3c81838856 Merge bitcoin-core/secp256k1#1289: cmake: Use full signature of `add_test()` command 755629bc03 cmake: Use full signature of `add_test()` command bef448f9af cmake: Fix library ABI versioning 4b0f711d46 Merge bitcoin-core/secp256k1#1277: autotools: Clean up after adding Wycheproof 222ecaf661 Merge bitcoin-core/secp256k1#1284: cmake: Some improvements using `PROJECT_IS_TOP_LEVEL` variable 71f746c057 cmake: Include `include` directory for subtree builds 024a409484 Merge bitcoin-core/secp256k1#1240: cmake: Improve and document compiler flag checks a8d059f76c cmake, doc: Document compiler flags 6ece1507cb cmake, refactor: Rename `try_add_compile_option` to `try_append_cflags` 19516ed3e9 cmake: Use `add_compile_options()` in `try_add_compile_option()` 4b84f4bf0f Merge bitcoin-core/secp256k1#1239: cmake: Bugfix and other improvements after bumping CMake up to 3.13 596b336ff6 Merge bitcoin-core/secp256k1#1234: cmake: Add dev-mode 6b7e5b717d Merge bitcoin-core/secp256k1#1275: build: Fix C4005 "macro redefinition" MSVC warnings in examples 1c89536718 Merge bitcoin-core/secp256k1#1286: tests: remove extra semicolon in macro c4062d6b5d debug: move helper for printing buffers into util.h 7e977b3c50 autotools: Take VPATH builds into account when generating testvectors 2418d3260a autotools: Create src/wycheproof dir before creating file in it 8764034ed5 autotools: Make all "pregenerated" targets .PHONY e1b9ce8811 autotools: Use same conventions for all pregenerated files 3858bad2c6 tests: remove extra semicolon in macro 1f33bb2b1c Merge bitcoin-core/secp256k1#1205: field: Improve docs +tests of secp256k1_fe_set_b32 162da73e9a tests: Add debug helper for printing buffers e9fd3dff76 field: Improve docs and tests of secp256k1_fe_set_b32 f6bef03c0a Merge bitcoin-core/secp256k1#1283: Get rid of secp256k1_fe_const_b 5431b9decd cmake: Make `SECP256K1_INSTALL` default depend on `PROJECT_IS_TOP_LEVEL` 5ec1333d4f Merge bitcoin-core/secp256k1#1285: bench: Make sys/time.h a system include 68b16a1662 bench: Make sys/time.h a system include 162608cc98 cmake: Emulate `PROJECT_IS_TOP_LEVEL` for CMake<3.21 69e1ec0331 Get rid of secp256k1_fe_const_b ce5ba9e24d gitignore: Add CMakeUserPresets.json 0a446a312f cmake: Add dev-mode CMake preset a6f4bcf6e1 Merge bitcoin-core/secp256k1#1231: Move `SECP256K1_INLINE` macro definition out from `include/secp256k1.h` a273d74b2e cmake: Improve version comparison 6a58b483ef cmake: Use `if(... IN_LIST ...)` command 2445808c02 cmake: Use dedicated `GENERATOR_IS_MULTI_CONFIG` property 9f8703ef17 cmake: Use dedicated `CMAKE_HOST_APPLE` variable 8c2017035a cmake: Use recommended `add_compile_definitions` command 04d4cc071a cmake: Add `DESCRIPTION` and `HOMEPAGE_URL` options to `project` command 8a8b6536ef cmake: Use `SameMinorVersion` compatibility mode 5b0444a3b5 Merge bitcoin-core/secp256k1#1263: cmake: Make installation optional 47ac3d63cd cmake: Make installation optional 2e035af251 Merge bitcoin-core/secp256k1#1273: build: Make `SECP_VALGRIND_CHECK` preserve `CPPFLAGS` 5be353d658 Merge bitcoin-core/secp256k1#1279: tests: lint wycheproof's python script 08f4b1632d autotools: Move code around to tidy Makefile 04bf3f6778 Merge bitcoin-core/secp256k1#1230: Build: allow static or shared but not both 9ce9984f32 Merge bitcoin-core/secp256k1#1265: Remove bits argument from secp256k1_wnaf_const{_xonly} 566faa17d3 Merge bitcoin-core/secp256k1#1267: doc: clarify process for patch releases ef49a11d29 build: allow static or shared but not both 35ada3b954 tests: lint wycheproof's python script 529b54d922 autotools: Move Wycheproof header from EXTRA_DIST to noinst_HEADERS dc0657c762 build: Fix C4005 "macro redefinition" MSVC warnings in examples 1ecb94ebe9 build: Make `SECP_VALGRIND_CHECK` preserve `CPPFLAGS` 1b6fb5593c doc: clarify process for patch releases a575339c02 Remove bits argument from secp256k1_wnaf_const (always 256) 36b0adf1b9 build: remove warning until it's reproducible 8e142ca410 Move `SECP256K1_INLINE` macro definition out from `include/secp256k1.h` 77445898a5 Remove `SECP256K1_INLINE` usage from examples ca92a35d01 field: Simplify code in secp256k1_fe_set_b32 d93f62e369 field: Verify field element even after secp256k1_fe_set_b32 fails git-subtree-dir: src/secp256k1 git-subtree-split: 705ce7ed8c1557a31e1bfc99be06082c5098d9f5
198 lines
8.8 KiB
C
198 lines
8.8 KiB
C
#ifndef SECP256K1_ELLSWIFT_H
|
|
#define SECP256K1_ELLSWIFT_H
|
|
|
|
#include "secp256k1.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* This module provides an implementation of ElligatorSwift as well as a
|
|
* version of x-only ECDH using it (including compatibility with BIP324).
|
|
*
|
|
* ElligatorSwift is described in https://eprint.iacr.org/2022/759 by
|
|
* Chavez-Saab, Rodriguez-Henriquez, and Tibouchi. It permits encoding
|
|
* uniformly chosen public keys as 64-byte arrays which are indistinguishable
|
|
* from uniformly random arrays.
|
|
*
|
|
* Let f be the function from pairs of field elements to point X coordinates,
|
|
* defined as follows (all operations modulo p = 2^256 - 2^32 - 977)
|
|
* f(u,t):
|
|
* - Let C = 0xa2d2ba93507f1df233770c2a797962cc61f6d15da14ecd47d8d27ae1cd5f852,
|
|
* a square root of -3.
|
|
* - If u=0, set u=1 instead.
|
|
* - If t=0, set t=1 instead.
|
|
* - If u^3 + t^2 + 7 = 0, multiply t by 2.
|
|
* - Let X = (u^3 + 7 - t^2) / (2 * t)
|
|
* - Let Y = (X + t) / (C * u)
|
|
* - Return the first in [u + 4 * Y^2, (-X/Y - u) / 2, (X/Y - u) / 2] that is an
|
|
* X coordinate on the curve (at least one of them is, for any u and t).
|
|
*
|
|
* Then an ElligatorSwift encoding of x consists of the 32-byte big-endian
|
|
* encodings of field elements u and t concatenated, where f(u,t) = x.
|
|
* The encoding algorithm is described in the paper, and effectively picks a
|
|
* uniformly random pair (u,t) among those which encode x.
|
|
*
|
|
* If the Y coordinate is relevant, it is given the same parity as t.
|
|
*
|
|
* Changes w.r.t. the the paper:
|
|
* - The u=0, t=0, and u^3+t^2+7=0 conditions result in decoding to the point
|
|
* at infinity in the paper. Here they are remapped to finite points.
|
|
* - The paper uses an additional encoding bit for the parity of y. Here the
|
|
* parity of t is used (negating t does not affect the decoded x coordinate,
|
|
* so this is possible).
|
|
*/
|
|
|
|
/** A pointer to a function used by secp256k1_ellswift_xdh to hash the shared X
|
|
* coordinate along with the encoded public keys to a uniform shared secret.
|
|
*
|
|
* Returns: 1 if a shared secret was successfully computed.
|
|
* 0 will cause secp256k1_ellswift_xdh to fail and return 0.
|
|
* Other return values are not allowed, and the behaviour of
|
|
* secp256k1_ellswift_xdh is undefined for other return values.
|
|
* Out: output: pointer to an array to be filled by the function
|
|
* In: x32: pointer to the 32-byte serialized X coordinate
|
|
* of the resulting shared point (will not be NULL)
|
|
* ell_a64: pointer to the 64-byte encoded public key of party A
|
|
* (will not be NULL)
|
|
* ell_b64: pointer to the 64-byte encoded public key of party B
|
|
* (will not be NULL)
|
|
* data: arbitrary data pointer that is passed through
|
|
*/
|
|
typedef int (*secp256k1_ellswift_xdh_hash_function)(
|
|
unsigned char *output,
|
|
const unsigned char *x32,
|
|
const unsigned char *ell_a64,
|
|
const unsigned char *ell_b64,
|
|
void *data
|
|
);
|
|
|
|
/** An implementation of an secp256k1_ellswift_xdh_hash_function which uses
|
|
* SHA256(prefix64 || ell_a64 || ell_b64 || x32), where prefix64 is the 64-byte
|
|
* array pointed to by data. */
|
|
SECP256K1_API_VAR const secp256k1_ellswift_xdh_hash_function secp256k1_ellswift_xdh_hash_function_prefix;
|
|
|
|
/** An implementation of an secp256k1_ellswift_xdh_hash_function compatible with
|
|
* BIP324. It returns H_tag(ell_a64 || ell_b64 || x32), where H_tag is the
|
|
* BIP340 tagged hash function with tag "bip324_ellswift_xonly_ecdh". Equivalent
|
|
* to secp256k1_ellswift_xdh_hash_function_prefix with prefix64 set to
|
|
* SHA256("bip324_ellswift_xonly_ecdh")||SHA256("bip324_ellswift_xonly_ecdh").
|
|
* The data argument is ignored. */
|
|
SECP256K1_API_VAR const secp256k1_ellswift_xdh_hash_function secp256k1_ellswift_xdh_hash_function_bip324;
|
|
|
|
/** Construct a 64-byte ElligatorSwift encoding of a given pubkey.
|
|
*
|
|
* Returns: 1 always.
|
|
* Args: ctx: pointer to a context object
|
|
* Out: ell64: pointer to a 64-byte array to be filled
|
|
* In: pubkey: a pointer to a secp256k1_pubkey containing an
|
|
* initialized public key
|
|
* rnd32: pointer to 32 bytes of randomness
|
|
*
|
|
* It is recommended that rnd32 consists of 32 uniformly random bytes, not
|
|
* known to any adversary trying to detect whether public keys are being
|
|
* encoded, though 16 bytes of randomness (padded to an array of 32 bytes,
|
|
* e.g., with zeros) suffice to make the result indistinguishable from
|
|
* uniform. The randomness in rnd32 must not be a deterministic function of
|
|
* the pubkey (it can be derived from the private key, though).
|
|
*
|
|
* It is not guaranteed that the computed encoding is stable across versions
|
|
* of the library, even if all arguments to this function (including rnd32)
|
|
* are the same.
|
|
*
|
|
* This function runs in variable time.
|
|
*/
|
|
SECP256K1_API int secp256k1_ellswift_encode(
|
|
const secp256k1_context *ctx,
|
|
unsigned char *ell64,
|
|
const secp256k1_pubkey *pubkey,
|
|
const unsigned char *rnd32
|
|
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4);
|
|
|
|
/** Decode a 64-bytes ElligatorSwift encoded public key.
|
|
*
|
|
* Returns: always 1
|
|
* Args: ctx: pointer to a context object
|
|
* Out: pubkey: pointer to a secp256k1_pubkey that will be filled
|
|
* In: ell64: pointer to a 64-byte array to decode
|
|
*
|
|
* This function runs in variable time.
|
|
*/
|
|
SECP256K1_API int secp256k1_ellswift_decode(
|
|
const secp256k1_context *ctx,
|
|
secp256k1_pubkey *pubkey,
|
|
const unsigned char *ell64
|
|
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
|
|
|
|
/** Compute an ElligatorSwift public key for a secret key.
|
|
*
|
|
* Returns: 1: secret was valid, public key was stored.
|
|
* 0: secret was invalid, try again.
|
|
* Args: ctx: pointer to a context object
|
|
* Out: ell64: pointer to a 64-byte array to receive the ElligatorSwift
|
|
* public key
|
|
* In: seckey32: pointer to a 32-byte secret key
|
|
* auxrnd32: (optional) pointer to 32 bytes of randomness
|
|
*
|
|
* Constant time in seckey and auxrnd32, but not in the resulting public key.
|
|
*
|
|
* It is recommended that auxrnd32 contains 32 uniformly random bytes, though
|
|
* it is optional (and does result in encodings that are indistinguishable from
|
|
* uniform even without any auxrnd32). It differs from the (mandatory) rnd32
|
|
* argument to secp256k1_ellswift_encode in this regard.
|
|
*
|
|
* This function can be used instead of calling secp256k1_ec_pubkey_create
|
|
* followed by secp256k1_ellswift_encode. It is safer, as it uses the secret
|
|
* key as entropy for the encoding (supplemented with auxrnd32, if provided).
|
|
*
|
|
* Like secp256k1_ellswift_encode, this function does not guarantee that the
|
|
* computed encoding is stable across versions of the library, even if all
|
|
* arguments (including auxrnd32) are the same.
|
|
*/
|
|
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ellswift_create(
|
|
const secp256k1_context *ctx,
|
|
unsigned char *ell64,
|
|
const unsigned char *seckey32,
|
|
const unsigned char *auxrnd32
|
|
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
|
|
|
|
/** Given a private key, and ElligatorSwift public keys sent in both directions,
|
|
* compute a shared secret using x-only Elliptic Curve Diffie-Hellman (ECDH).
|
|
*
|
|
* Returns: 1: shared secret was succesfully computed
|
|
* 0: secret was invalid or hashfp returned 0
|
|
* Args: ctx: pointer to a context object.
|
|
* Out: output: pointer to an array to be filled by hashfp.
|
|
* In: ell_a64: pointer to the 64-byte encoded public key of party A
|
|
* (will not be NULL)
|
|
* ell_b64: pointer to the 64-byte encoded public key of party B
|
|
* (will not be NULL)
|
|
* seckey32: a pointer to our 32-byte secret key
|
|
* party: boolean indicating which party we are: zero if we are
|
|
* party A, non-zero if we are party B. seckey32 must be
|
|
* the private key corresponding to that party's ell_?64.
|
|
* This correspondence is not checked.
|
|
* hashfp: pointer to a hash function.
|
|
* data: arbitrary data pointer passed through to hashfp.
|
|
*
|
|
* Constant time in seckey32.
|
|
*
|
|
* This function is more efficient than decoding the public keys, and performing
|
|
* ECDH on them.
|
|
*/
|
|
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ellswift_xdh(
|
|
const secp256k1_context *ctx,
|
|
unsigned char *output,
|
|
const unsigned char *ell_a64,
|
|
const unsigned char *ell_b64,
|
|
const unsigned char *seckey32,
|
|
int party,
|
|
secp256k1_ellswift_xdh_hash_function hashfp,
|
|
void *data
|
|
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5) SECP256K1_ARG_NONNULL(7);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* SECP256K1_ELLSWIFT_H */
|