UltrafastSecp256k1 3.68.0
Ultra high-performance secp256k1 elliptic curve cryptography library
Loading...
Searching...
No Matches
ufsecp.h
Go to the documentation of this file.
1/* ============================================================================
2 * UltrafastSecp256k1 -- Stable C ABI
3 * ============================================================================
4 *
5 * SINGLE HEADER that exposes the entire public C API.
6 * Include only this file from application / binding code.
7 *
8 * ## Design principles
9 *
10 * 1. Opaque context (`ufsecp_ctx*`) -- all state lives here.
11 * 2. Every function returns `ufsecp_error_t` (0 = OK).
12 * 3. No internal types leak -- all I/O is `uint8_t[]` with documented sizes.
13 * 4. ABI version checked at link time via `ufsecp_abi_version()`.
14 * Full policy: docs/ABI_VERSIONING.md
15 * 5. Thread safety: each ctx is single-thread; create one per thread or
16 * protect externally. Blinding state (ufsecp_context_randomize) is
17 * thread-local and orthogonal to context ownership.
18 * Full policy: docs/THREAD_SAFETY.md
19 * 6. Dual-layer constant-time: secret-dependent operations (scalar mul,
20 * nonce gen, key tweak) ALWAYS use the CT layer; public operations
21 * (verification, point serialisation) ALWAYS use the fast layer.
22 * Both layers are architecturally wired -- no flag, no opt-in.
23 * This removes flag-based routing mistakes inside the core ABI.
24 * Bindings and callers must still enforce context ownership, buffer
25 * lifetime, and secret-handling discipline.
26 *
27 * ## Naming
28 *
29 * ufsecp_<noun>_<verb>() e.g. ufsecp_ecdsa_sign()
30 * UFSECP_<CONSTANT> e.g. UFSECP_PUBKEY_COMPRESSED_LEN
31 *
32 * ## Memory
33 *
34 * Caller always owns output buffers.
35 * Library never allocates on behalf of caller (except ctx create/clone).
36 *
37 * ============================================================================ */
38
39#ifndef UFSECP_H
40#define UFSECP_H
41
42#include "ufsecp_version.h"
43#include "ufsecp_error.h"
44
45#include <stddef.h>
46#include <stdint.h>
47
48#ifdef __cplusplus
49extern "C" {
50#endif
51
52/* -- Size constants --------------------------------------------------------- */
53
54#define UFSECP_PRIVKEY_LEN 32
55#define UFSECP_PUBKEY_COMPRESSED_LEN 33
56#define UFSECP_PUBKEY_UNCOMPRESSED_LEN 65
57#define UFSECP_PUBKEY_XONLY_LEN 32
58#define UFSECP_SIG_COMPACT_LEN 64 /* R||S for ECDSA, r||s for Schnorr */
59#define UFSECP_SIG_DER_MAX_LEN 72
60#define UFSECP_HASH_LEN 32
61#define UFSECP_HASH160_LEN 20
62#define UFSECP_SHARED_SECRET_LEN 32
63#define UFSECP_BIP32_SERIALIZED_LEN 78
64
65/* -- Network constants ------------------------------------------------------ */
66
67#define UFSECP_NET_MAINNET 0
68#define UFSECP_NET_TESTNET 1
69
70/* ===========================================================================
71 * Context
72 * ===========================================================================
73 *
74 * Constant-time safety is architectural, NOT flag-based.
75 *
76 * +-------------------------------------------------------------+
77 * | Layer 1 -- FAST: public operations (verify, point arith) |
78 * | Layer 2 -- CT : secret operations (sign, nonce, tweak) |
79 * | Both layers are ALWAYS ACTIVE simultaneously. |
80 * | No opt-in / opt-out in the core ABI. |
81 * +-------------------------------------------------------------+
82 *
83 * CT layer guarantees:
84 * - Complete addition formula (branchless, 12M+2S)
85 * - Fixed-trace scalar multiplication (no early exit)
86 * - CT table lookup (scans all entries)
87 * - Valgrind/MSAN verifiable (SECP256K1_CLASSIFY / DECLASSIFY)
88 *
89 * =========================================================================== */
90
92typedef struct ufsecp_ctx ufsecp_ctx;
93
100
103 ufsecp_ctx** ctx_out);
104
107
110
116
119
138 const uint8_t* seed32);
139
140/* ===========================================================================
141 * Private key utilities
142 * =========================================================================== */
143
147 const uint8_t privkey[32]);
148
151 uint8_t privkey[32]);
152
155 uint8_t privkey[32],
156 const uint8_t tweak[32]);
157
160 uint8_t privkey[32],
161 const uint8_t tweak[32]);
162
163/* ===========================================================================
164 * Public key
165 * =========================================================================== */
166
169 const uint8_t privkey[32],
170 uint8_t pubkey33_out[33]);
171
174 ufsecp_ctx* ctx,
175 const uint8_t privkey[32],
176 uint8_t pubkey65_out[65]);
177
181 const uint8_t* input,
182 size_t input_len,
183 uint8_t pubkey33_out[33]);
184
187 const uint8_t privkey[32],
188 uint8_t xonly32_out[32]);
189
190/* ===========================================================================
191 * ECDSA (secp256k1, RFC 6979 deterministic nonce)
192 * =========================================================================== */
193
196 const uint8_t msg32[32],
197 const uint8_t privkey[32],
198 uint8_t sig64_out[64]);
199
204 const uint8_t msg32[32],
205 const uint8_t privkey[32],
206 uint8_t sig64_out[64]);
207
211 const uint8_t msg32[32],
212 const uint8_t sig64[64],
213 const uint8_t pubkey33[33]);
214
218 const uint8_t sig64[64],
219 uint8_t* der_out,
220 size_t* der_len);
221
224 const uint8_t* der,
225 size_t der_len,
226 uint8_t sig64_out[64]);
227
228/* -- ECDSA recovery --------------------------------------------------------- */
229
233 ufsecp_ctx* ctx,
234 const uint8_t msg32[32],
235 const uint8_t privkey[32],
236 uint8_t sig64_out[64],
237 int* recid_out);
238
241 const uint8_t msg32[32],
242 const uint8_t sig64[64],
243 int recid,
244 uint8_t pubkey33_out[33]);
245
246/* ===========================================================================
247 * Schnorr / BIP-340
248 * =========================================================================== */
249
253 const uint8_t msg32[32],
254 const uint8_t privkey[32],
255 const uint8_t aux_rand[32],
256 uint8_t sig64_out[64]);
257
261 const uint8_t msg32[32],
262 const uint8_t privkey[32],
263 const uint8_t aux_rand[32],
264 uint8_t sig64_out[64]);
265
269 const uint8_t msg32[32],
270 const uint8_t sig64[64],
271 const uint8_t pubkey_x[32]);
272
273/* ===========================================================================
274 * Batch signing (CPU constant-time dispatch -- private keys never leave host)
275 * =========================================================================== */
276
288 ufsecp_ctx* ctx,
289 size_t count,
290 const uint8_t* msgs32,
291 const uint8_t* privkeys32,
292 uint8_t* sigs64_out);
293
307 ufsecp_ctx* ctx,
308 size_t count,
309 const uint8_t* msgs32,
310 const uint8_t* privkeys32,
311 const uint8_t* aux_rands32,
312 uint8_t* sigs64_out);
313
314/* ===========================================================================
315 * ECDH (Diffie-Hellman key agreement)
316 * =========================================================================== */
317
320 const uint8_t privkey[32],
321 const uint8_t pubkey33[33],
322 uint8_t secret32_out[32]);
323
326 const uint8_t privkey[32],
327 const uint8_t pubkey33[33],
328 uint8_t secret32_out[32]);
329
332 const uint8_t privkey[32],
333 const uint8_t pubkey33[33],
334 uint8_t secret32_out[32]);
335
336/* ===========================================================================
337 * Hashing
338 * =========================================================================== */
339
341UFSECP_API ufsecp_error_t ufsecp_sha256(const uint8_t* data, size_t len,
342 uint8_t digest32_out[32]);
343
345UFSECP_API ufsecp_error_t ufsecp_hash160(const uint8_t* data, size_t len,
346 uint8_t digest20_out[20]);
347
350 const uint8_t* data, size_t len,
351 uint8_t digest32_out[32]);
352
353/* ===========================================================================
354 * Bitcoin addresses
355 * =========================================================================== */
356
361 const uint8_t pubkey33[33],
362 int network,
363 char* addr_out, size_t* addr_len);
364
369 const uint8_t pubkey33[33],
370 int network,
371 char* addr_out, size_t* addr_len);
372
377 const uint8_t internal_key_x[32],
378 int network,
379 char* addr_out, size_t* addr_len);
380
385 const uint8_t* redeem_script, size_t redeem_script_len,
386 int network,
387 char* addr_out, size_t* addr_len);
388
393 ufsecp_ctx* ctx,
394 const uint8_t pubkey33[33],
395 int network,
396 char* addr_out, size_t* addr_len);
397
398/* ===========================================================================
399 * WIF (Wallet Import Format)
400 * =========================================================================== */
401
406 const uint8_t privkey[32],
407 int compressed, int network,
408 char* wif_out, size_t* wif_len);
409
412 const char* wif,
413 uint8_t privkey32_out[32],
414 int* compressed_out,
415 int* network_out);
416
417/* ===========================================================================
418 * BIP-32 (HD key derivation)
419 * =========================================================================== */
420
425typedef struct {
427 uint8_t is_private;
428 uint8_t _pad[3];
430
433 const uint8_t* seed, size_t seed_len,
434 ufsecp_bip32_key* key_out);
435
438 const ufsecp_bip32_key* parent,
439 uint32_t index,
440 ufsecp_bip32_key* child_out);
441
444 const ufsecp_bip32_key* master,
445 const char* path,
446 ufsecp_bip32_key* key_out);
447
450 const ufsecp_bip32_key* key,
451 uint8_t privkey32_out[32]);
452
455 const ufsecp_bip32_key* key,
456 uint8_t pubkey33_out[33]);
457
458/* ===========================================================================
459 * Taproot (BIP-341)
460 * =========================================================================== */
461
465 ufsecp_ctx* ctx,
466 const uint8_t internal_x[32],
467 const uint8_t* merkle_root,
468 uint8_t output_x_out[32],
469 int* parity_out);
470
473 ufsecp_ctx* ctx,
474 const uint8_t privkey[32],
475 const uint8_t* merkle_root,
476 uint8_t tweaked32_out[32]);
477
480 ufsecp_ctx* ctx,
481 const uint8_t output_x[32], int output_parity,
482 const uint8_t internal_x[32],
483 const uint8_t* merkle_root, size_t merkle_root_len);
484
485/* ===========================================================================
486 * BIP-143: SegWit v0 Sighash
487 * =========================================================================== */
488
498 ufsecp_ctx* ctx,
499 uint32_t version,
500 const uint8_t hash_prevouts[32],
501 const uint8_t hash_sequence[32],
502 const uint8_t outpoint_txid[32], uint32_t outpoint_vout,
503 const uint8_t* script_code, size_t script_code_len,
504 uint64_t value,
505 uint32_t sequence,
506 const uint8_t hash_outputs[32],
507 uint32_t locktime,
508 uint32_t sighash_type,
509 uint8_t sighash_out[32]);
510
513 const uint8_t pubkey_hash[20],
514 uint8_t script_code_out[25]);
515
516/* ===========================================================================
517 * BIP-144: Witness Transaction Serialization
518 * =========================================================================== */
519
524 ufsecp_ctx* ctx,
525 const uint8_t* raw_tx, size_t raw_tx_len,
526 uint8_t txid_out[32]);
527
530 ufsecp_ctx* ctx,
531 const uint8_t* raw_tx, size_t raw_tx_len,
532 uint8_t wtxid_out[32]);
533
536 const uint8_t witness_root[32],
537 const uint8_t witness_nonce[32],
538 uint8_t commitment_out[32]);
539
540/* ===========================================================================
541 * BIP-141: Segregated Witness — Witness Programs
542 * =========================================================================== */
543
546 const uint8_t* script, size_t script_len);
547
554 const uint8_t* script, size_t script_len,
555 int* version_out,
556 uint8_t* program_out, size_t* program_len_out);
557
560 const uint8_t pubkey_hash[20],
561 uint8_t spk_out[22]);
562
565 const uint8_t script_hash[32],
566 uint8_t spk_out[34]);
567
570 const uint8_t output_key[32],
571 uint8_t spk_out[34]);
572
575 const uint8_t* script, size_t script_len,
576 uint8_t hash_out[32]);
577
578/* ===========================================================================
579 * BIP-342: Tapscript Sighash
580 * =========================================================================== */
581
586 ufsecp_ctx* ctx,
587 uint32_t version, uint32_t locktime,
588 size_t input_count,
589 const uint8_t* prevout_txids, /* input_count*32 bytes, flattened */
590 const uint32_t* prevout_vouts,
591 const uint64_t* input_amounts,
592 const uint32_t* input_sequences,
593 const uint8_t* const* input_spks,
594 const size_t* input_spk_lens,
595 size_t output_count,
596 const uint64_t* output_values,
597 const uint8_t* const* output_spks,
598 const size_t* output_spk_lens,
599 size_t input_index,
600 uint8_t hash_type,
601 const uint8_t* annex, size_t annex_len,
602 uint8_t sighash_out[32]);
603
606 ufsecp_ctx* ctx,
607 uint32_t version, uint32_t locktime,
608 size_t input_count,
609 const uint8_t* prevout_txids,
610 const uint32_t* prevout_vouts,
611 const uint64_t* input_amounts,
612 const uint32_t* input_sequences,
613 const uint8_t* const* input_spks,
614 const size_t* input_spk_lens,
615 size_t output_count,
616 const uint64_t* output_values,
617 const uint8_t* const* output_spks,
618 const size_t* output_spk_lens,
619 size_t input_index,
620 uint8_t hash_type,
621 const uint8_t tapleaf_hash[32],
622 uint8_t key_version,
623 uint32_t code_separator_pos,
624 const uint8_t* annex, size_t annex_len,
625 uint8_t sighash_out[32]);
626
627/* ===========================================================================
628 * Ethereum (conditional: SECP256K1_BUILD_ETHEREUM)
629 * =========================================================================== */
630
631/* ===========================================================================
632 * Public key arithmetic
633 * =========================================================================== */
634
637 const uint8_t a33[33],
638 const uint8_t b33[33],
639 uint8_t out33[33]);
640
643 const uint8_t pubkey33[33],
644 uint8_t out33[33]);
645
648 const uint8_t pubkey33[33],
649 const uint8_t tweak[32],
650 uint8_t out33[33]);
651
654 const uint8_t pubkey33[33],
655 const uint8_t tweak[32],
656 uint8_t out33[33]);
657
662 const uint8_t* pubkeys,
663 size_t n,
664 uint8_t out33[33]);
665
666/* ===========================================================================
667 * BIP-39 (Mnemonic seed phrases)
668 * =========================================================================== */
669
677 size_t entropy_bytes,
678 const uint8_t* entropy_in,
679 char* mnemonic_out,
680 size_t* mnemonic_len);
681
685 const char* mnemonic);
686
690 const char* mnemonic,
691 const char* passphrase,
692 uint8_t seed64_out[64]);
693
698 const char* mnemonic,
699 uint8_t* entropy_out,
700 size_t* entropy_len);
701
702/* ===========================================================================
703 * Batch verification
704 * =========================================================================== */
705
710 ufsecp_ctx* ctx,
711 const uint8_t* entries, size_t n);
712
717 ufsecp_ctx* ctx,
718 const uint8_t* entries, size_t n);
719
724 ufsecp_ctx* ctx,
725 const uint8_t* entries, size_t n,
726 size_t* invalid_out, size_t* invalid_count);
727
732 ufsecp_ctx* ctx,
733 const uint8_t* entries, size_t n,
734 size_t* invalid_out, size_t* invalid_count);
735
736/* ===========================================================================
737 * SHA-512
738 * =========================================================================== */
739
741UFSECP_API ufsecp_error_t ufsecp_sha512(const uint8_t* data, size_t len,
742 uint8_t digest64_out[64]);
743
744/* ===========================================================================
745 * Multi-scalar multiplication
746 * =========================================================================== */
747
751 ufsecp_ctx* ctx,
752 const uint8_t a[32], const uint8_t P33[33],
753 const uint8_t b[32], const uint8_t Q33[33],
754 uint8_t out33[33]);
755
760 ufsecp_ctx* ctx,
761 const uint8_t* scalars, const uint8_t* points, size_t n,
762 uint8_t out33[33]);
763
764/* ===========================================================================
765 * MuSig2 (BIP-327 multi-signatures)
766 * =========================================================================== */
767
768#define UFSECP_MUSIG2_PUBNONCE_LEN 66
769#define UFSECP_MUSIG2_AGGNONCE_LEN 66
770#define UFSECP_MUSIG2_KEYAGG_LEN 165
771#define UFSECP_MUSIG2_SESSION_LEN 165
772#define UFSECP_MUSIG2_SECNONCE_LEN 64
778 ufsecp_ctx* ctx,
779 const uint8_t* pubkeys, size_t n,
780 uint8_t keyagg_out[UFSECP_MUSIG2_KEYAGG_LEN],
781 uint8_t agg_pubkey32_out[32]);
782
785 ufsecp_ctx* ctx,
786 const uint8_t privkey[32],
787 const uint8_t pubkey32[32],
788 const uint8_t agg_pubkey32[32],
789 const uint8_t msg32[32],
790 const uint8_t extra_in[32],
791 uint8_t secnonce_out[UFSECP_MUSIG2_SECNONCE_LEN],
792 uint8_t pubnonce_out[UFSECP_MUSIG2_PUBNONCE_LEN]);
793
799 ufsecp_ctx* ctx,
800 const uint8_t* pubnonces, size_t n,
801 uint8_t aggnonce_out[UFSECP_MUSIG2_AGGNONCE_LEN]);
802
809 ufsecp_ctx* ctx,
810 const uint8_t aggnonce[UFSECP_MUSIG2_AGGNONCE_LEN],
811 const uint8_t keyagg[UFSECP_MUSIG2_KEYAGG_LEN],
812 const uint8_t msg32[32],
813 uint8_t session_out[UFSECP_MUSIG2_SESSION_LEN]);
814
821 ufsecp_ctx* ctx,
822 uint8_t secnonce[UFSECP_MUSIG2_SECNONCE_LEN],
823 const uint8_t privkey[32],
824 const uint8_t keyagg[UFSECP_MUSIG2_KEYAGG_LEN],
825 const uint8_t session[UFSECP_MUSIG2_SESSION_LEN],
826 size_t signer_index,
827 uint8_t partial_sig32_out[32]);
828
834 ufsecp_ctx* ctx,
835 const uint8_t partial_sig32[32],
836 const uint8_t pubnonce[UFSECP_MUSIG2_PUBNONCE_LEN],
837 const uint8_t pubkey32[32],
838 const uint8_t keyagg[UFSECP_MUSIG2_KEYAGG_LEN],
839 const uint8_t session[UFSECP_MUSIG2_SESSION_LEN],
840 size_t signer_index);
841
846 ufsecp_ctx* ctx,
847 const uint8_t* partial_sigs, size_t n,
848 const uint8_t session[UFSECP_MUSIG2_SESSION_LEN],
849 uint8_t sig64_out[64]);
850
851/* ===========================================================================
852 * FROST (Threshold signatures)
853 * =========================================================================== */
854
855#define UFSECP_FROST_SHARE_LEN 36
856#define UFSECP_FROST_KEYPKG_LEN 141
857#define UFSECP_FROST_NONCE_LEN 64
858#define UFSECP_FROST_NONCE_COMMIT_LEN 70
867 ufsecp_ctx* ctx,
868 uint32_t participant_id, uint32_t threshold, uint32_t num_participants,
869 const uint8_t seed[32],
870 uint8_t* commits_out, size_t* commits_len,
871 uint8_t* shares_out, size_t* shares_len);
872
882 ufsecp_ctx* ctx,
883 uint32_t participant_id,
884 const uint8_t* all_commits, size_t commits_len,
885 const uint8_t* received_shares, size_t shares_len,
886 uint32_t threshold, uint32_t num_participants,
887 uint8_t keypkg_out[UFSECP_FROST_KEYPKG_LEN]);
888
892 ufsecp_ctx* ctx,
893 uint32_t participant_id,
894 const uint8_t nonce_seed[32],
895 uint8_t nonce_out[UFSECP_FROST_NONCE_LEN],
896 uint8_t nonce_commit_out[UFSECP_FROST_NONCE_COMMIT_LEN]);
897
904 ufsecp_ctx* ctx,
905 const uint8_t keypkg[UFSECP_FROST_KEYPKG_LEN],
906 uint8_t nonce[UFSECP_FROST_NONCE_LEN],
907 const uint8_t msg32[32],
908 const uint8_t* nonce_commits, size_t n_signers,
909 uint8_t partial_sig_out[36]);
910
919 ufsecp_ctx* ctx,
920 const uint8_t partial_sig[36],
921 const uint8_t verification_share33[33],
922 const uint8_t* nonce_commits, size_t n_signers,
923 const uint8_t msg32[32],
924 const uint8_t group_pubkey33[33]);
925
934 ufsecp_ctx* ctx,
935 const uint8_t* partial_sigs, size_t n,
936 const uint8_t* nonce_commits, size_t n_signers,
937 const uint8_t group_pubkey33[33],
938 const uint8_t msg32[32],
939 uint8_t sig64_out[64]);
940
941/* ===========================================================================
942 * Adaptor signatures (Atomic swaps / DLCs)
943 * =========================================================================== */
944
945#define UFSECP_SCHNORR_ADAPTOR_SIG_LEN 97
946#define UFSECP_ECDSA_ADAPTOR_SIG_LEN 130
950 ufsecp_ctx* ctx,
951 const uint8_t privkey[32],
952 const uint8_t msg32[32],
953 const uint8_t adaptor_point33[33],
954 const uint8_t aux_rand[32],
955 uint8_t pre_sig_out[UFSECP_SCHNORR_ADAPTOR_SIG_LEN]);
956
959 ufsecp_ctx* ctx,
960 const uint8_t pre_sig[UFSECP_SCHNORR_ADAPTOR_SIG_LEN],
961 const uint8_t pubkey_x[32],
962 const uint8_t msg32[32],
963 const uint8_t adaptor_point33[33]);
964
967 ufsecp_ctx* ctx,
968 const uint8_t pre_sig[UFSECP_SCHNORR_ADAPTOR_SIG_LEN],
969 const uint8_t adaptor_secret[32],
970 uint8_t sig64_out[64]);
971
974 ufsecp_ctx* ctx,
975 const uint8_t pre_sig[UFSECP_SCHNORR_ADAPTOR_SIG_LEN],
976 const uint8_t sig64[64],
977 uint8_t secret32_out[32]);
978
981 ufsecp_ctx* ctx,
982 const uint8_t privkey[32],
983 const uint8_t msg32[32],
984 const uint8_t adaptor_point33[33],
985 uint8_t pre_sig_out[UFSECP_ECDSA_ADAPTOR_SIG_LEN]);
986
989 ufsecp_ctx* ctx,
990 const uint8_t pre_sig[UFSECP_ECDSA_ADAPTOR_SIG_LEN],
991 const uint8_t pubkey33[33],
992 const uint8_t msg32[32],
993 const uint8_t adaptor_point33[33]);
994
997 ufsecp_ctx* ctx,
998 const uint8_t pre_sig[UFSECP_ECDSA_ADAPTOR_SIG_LEN],
999 const uint8_t adaptor_secret[32],
1000 uint8_t sig64_out[64]);
1001
1004 ufsecp_ctx* ctx,
1005 const uint8_t pre_sig[UFSECP_ECDSA_ADAPTOR_SIG_LEN],
1006 const uint8_t sig64[64],
1007 uint8_t secret32_out[32]);
1008
1009/* ===========================================================================
1010 * Pedersen commitments
1011 * =========================================================================== */
1012
1016 ufsecp_ctx* ctx,
1017 const uint8_t value[32],
1018 const uint8_t blinding[32],
1019 uint8_t commitment33_out[33]);
1020
1023 ufsecp_ctx* ctx,
1024 const uint8_t commitment33[33],
1025 const uint8_t value[32],
1026 const uint8_t blinding[32]);
1027
1031 ufsecp_ctx* ctx,
1032 const uint8_t* pos, size_t n_pos,
1033 const uint8_t* neg, size_t n_neg);
1034
1038 ufsecp_ctx* ctx,
1039 const uint8_t* blinds_in, size_t n_in,
1040 const uint8_t* blinds_out, size_t n_out,
1041 uint8_t sum32_out[32]);
1042
1045 ufsecp_ctx* ctx,
1046 const uint8_t value[32],
1047 const uint8_t blinding[32],
1048 const uint8_t switch_blind[32],
1049 uint8_t commitment33_out[33]);
1050
1051/* ===========================================================================
1052 * Zero-knowledge proofs
1053 * =========================================================================== */
1054
1055#define UFSECP_ZK_KNOWLEDGE_PROOF_LEN 64
1056#define UFSECP_ZK_DLEQ_PROOF_LEN 64
1057#define UFSECP_ZK_RANGE_PROOF_MAX_LEN 688
1061 ufsecp_ctx* ctx,
1062 const uint8_t secret[32],
1063 const uint8_t pubkey33[33],
1064 const uint8_t msg32[32],
1065 const uint8_t aux_rand[32],
1066 uint8_t proof_out[UFSECP_ZK_KNOWLEDGE_PROOF_LEN]);
1067
1070 ufsecp_ctx* ctx,
1071 const uint8_t proof[UFSECP_ZK_KNOWLEDGE_PROOF_LEN],
1072 const uint8_t pubkey33[33],
1073 const uint8_t msg32[32]);
1074
1078 ufsecp_ctx* ctx,
1079 const uint8_t secret[32],
1080 const uint8_t G33[33], const uint8_t H33[33],
1081 const uint8_t P33[33], const uint8_t Q33[33],
1082 const uint8_t aux_rand[32],
1083 uint8_t proof_out[UFSECP_ZK_DLEQ_PROOF_LEN]);
1084
1087 ufsecp_ctx* ctx,
1088 const uint8_t proof[UFSECP_ZK_DLEQ_PROOF_LEN],
1089 const uint8_t G33[33], const uint8_t H33[33],
1090 const uint8_t P33[33], const uint8_t Q33[33]);
1091
1095 ufsecp_ctx* ctx,
1096 uint64_t value,
1097 const uint8_t blinding[32],
1098 const uint8_t commitment33[33],
1099 const uint8_t aux_rand[32],
1100 uint8_t* proof_out, size_t* proof_len);
1101
1105 ufsecp_ctx* ctx,
1106 const uint8_t commitment33[33],
1107 const uint8_t* proof, size_t proof_len);
1108
1111typedef struct {
1112 uint64_t limbs[5];
1114
1129typedef struct {
1130 /* ── public inputs ─────────────────────────────────────────────────── */
1131 uint8_t msg[32];
1132 uint8_t sig_r[32];
1133 uint8_t sig_s[32];
1134 uint8_t pub_x[32];
1135 uint8_t pub_y[32];
1137 /* ── private witness (circuit signals) ─────────────────────────────── */
1138 uint8_t s_inv[32];
1139 uint8_t u1[32];
1140 uint8_t u2[32];
1141 uint8_t result_x[32];
1142 uint8_t result_y[32];
1143 uint8_t result_x_mod_n[32];
1145 /* ── 5×52-bit foreign-field limb decompositions ─────────────────────── */
1157 /* ── verdict ──────────────────────────────────────────────────────── */
1158 int valid;
1160
1176 ufsecp_ctx* ctx,
1177 const uint8_t msg_hash32[32],
1178 const uint8_t pubkey33[33],
1179 const uint8_t sig64[64],
1181
1182/* ===========================================================================
1183 * BIP340 Schnorr-in-SNARK Foreign-Field Witness
1184 * =========================================================================== */
1185
1194typedef struct {
1195 /* ── public inputs ─────────────────────────────────────────────────── */
1196 uint8_t msg[32];
1197 uint8_t sig_r[32];
1198 uint8_t sig_s[32];
1199 uint8_t pub_x[32];
1201 /* ── private witness (circuit signals) ─────────────────────────────── */
1202 uint8_t r_y[32];
1203 uint8_t pub_y[32];
1204 uint8_t e[32];
1206 /* ── 5×52-bit foreign-field limb decompositions ─────────────────────── */
1214 /* ── verdict ──────────────────────────────────────────────────────── */
1215 int valid;
1217
1233 ufsecp_ctx* ctx,
1234 const uint8_t msg32[32],
1235 const uint8_t pubkey_x32[32],
1236 const uint8_t sig64[64],
1238
1239/* ===========================================================================
1240 * Multi-coin wallet infrastructure
1241 * =========================================================================== */
1242
1244#define UFSECP_COIN_ADDR_MAX_LEN 128
1245
1247#define UFSECP_COIN_BITCOIN 0
1248#define UFSECP_COIN_LITECOIN 2
1249#define UFSECP_COIN_DOGECOIN 3
1250#define UFSECP_COIN_DASH 5
1251#define UFSECP_COIN_ETHEREUM 60
1252#define UFSECP_COIN_BITCOIN_CASH 145
1253#define UFSECP_COIN_TRON 195
1254
1260 ufsecp_ctx* ctx,
1261 const uint8_t pubkey33[33],
1262 uint32_t coin_type, int testnet,
1263 char* addr_out, size_t* addr_len);
1264
1271 ufsecp_ctx* ctx,
1272 const uint8_t* seed, size_t seed_len,
1273 uint32_t coin_type, uint32_t account, int change, uint32_t index,
1274 int testnet,
1275 uint8_t* privkey32_out,
1276 uint8_t* pubkey33_out,
1277 char* addr_out, size_t* addr_len);
1278
1281 ufsecp_ctx* ctx,
1282 const uint8_t privkey[32],
1283 uint32_t coin_type, int testnet,
1284 char* wif_out, size_t* wif_len);
1285
1290 ufsecp_ctx* ctx,
1291 const uint8_t* msg, size_t msg_len,
1292 const uint8_t privkey[32],
1293 char* base64_out, size_t* base64_len);
1294
1298 ufsecp_ctx* ctx,
1299 const uint8_t* msg, size_t msg_len,
1300 const uint8_t pubkey33[33],
1301 const char* base64_sig);
1302
1305 const uint8_t* msg, size_t msg_len,
1306 uint8_t digest32_out[32]);
1307
1308/* ===========================================================================
1309 * BIP-352 Silent Payments
1310 * =========================================================================== */
1311
1320 ufsecp_ctx* ctx,
1321 const uint8_t scan_privkey[32],
1322 const uint8_t spend_privkey[32],
1323 uint8_t scan_pubkey33_out[33],
1324 uint8_t spend_pubkey33_out[33],
1325 char* addr_out, size_t* addr_len);
1326
1337 ufsecp_ctx* ctx,
1338 const uint8_t* input_privkeys, size_t n_inputs,
1339 const uint8_t scan_pubkey33[33],
1340 const uint8_t spend_pubkey33[33],
1341 uint32_t k,
1342 uint8_t output_pubkey33_out[33],
1343 uint8_t* tweak32_out);
1344
1356 ufsecp_ctx* ctx,
1357 const uint8_t scan_privkey[32],
1358 const uint8_t spend_privkey[32],
1359 const uint8_t* input_pubkeys33, size_t n_input_pubkeys,
1360 const uint8_t* output_xonly32, size_t n_outputs,
1361 uint32_t* found_indices_out,
1362 uint8_t* found_privkeys_out,
1363 size_t* n_found);
1364
1365/* ===========================================================================
1366 * ECIES (Elliptic Curve Integrated Encryption Scheme)
1367 * =========================================================================== */
1368
1370#define UFSECP_ECIES_OVERHEAD 81
1371
1378 ufsecp_ctx* ctx,
1379 const uint8_t recipient_pubkey33[33],
1380 const uint8_t* plaintext, size_t plaintext_len,
1381 uint8_t* envelope_out, size_t* envelope_len);
1382
1389 ufsecp_ctx* ctx,
1390 const uint8_t privkey[32],
1391 const uint8_t* envelope, size_t envelope_len,
1392 uint8_t* plaintext_out, size_t* plaintext_len);
1393
1394/* ========================================================================== */
1395/* BIP-324: Version 2 P2P Encrypted Transport (conditional: SECP256K1_BIP324) */
1396/* ========================================================================== */
1397#ifdef SECP256K1_BIP324
1398
1400typedef struct ufsecp_bip324_session ufsecp_bip324_session;
1401
1406UFSECP_API ufsecp_error_t ufsecp_bip324_create(
1407 ufsecp_ctx* ctx,
1408 int initiator,
1409 ufsecp_bip324_session** session_out,
1410 uint8_t ellswift64_out[64]);
1411
1415UFSECP_API ufsecp_error_t ufsecp_bip324_handshake(
1416 ufsecp_bip324_session* session,
1417 const uint8_t peer_ellswift64[64],
1418 uint8_t session_id32_out[32]);
1419
1424UFSECP_API ufsecp_error_t ufsecp_bip324_encrypt(
1425 ufsecp_bip324_session* session,
1426 const uint8_t* plaintext, size_t plaintext_len,
1427 uint8_t* out, size_t* out_len);
1428
1436UFSECP_API ufsecp_error_t ufsecp_bip324_decrypt(
1437 ufsecp_bip324_session* session,
1438 const uint8_t* encrypted, size_t encrypted_len,
1439 uint8_t* plaintext_out, size_t* plaintext_len);
1440
1442UFSECP_API void ufsecp_bip324_destroy(ufsecp_bip324_session* session);
1443
1451UFSECP_API ufsecp_error_t ufsecp_aead_chacha20_poly1305_encrypt(
1452 const uint8_t key[32], const uint8_t nonce[12],
1453 const uint8_t* aad, size_t aad_len,
1454 const uint8_t* plaintext, size_t plaintext_len,
1455 uint8_t* out, uint8_t tag[16]);
1456
1459UFSECP_API ufsecp_error_t ufsecp_aead_chacha20_poly1305_decrypt(
1460 const uint8_t key[32], const uint8_t nonce[12],
1461 const uint8_t* aad, size_t aad_len,
1462 const uint8_t* ciphertext, size_t ciphertext_len,
1463 const uint8_t tag[16], uint8_t* out);
1464
1468UFSECP_API ufsecp_error_t ufsecp_ellswift_create(
1469 ufsecp_ctx* ctx,
1470 const uint8_t privkey[32],
1471 uint8_t encoding64_out[64]);
1472
1479UFSECP_API ufsecp_error_t ufsecp_ellswift_xdh(
1480 ufsecp_ctx* ctx,
1481 const uint8_t ell_a64[64],
1482 const uint8_t ell_b64[64],
1483 const uint8_t our_privkey[32],
1484 int initiating,
1485 uint8_t secret32_out[32]);
1486
1487#endif /* SECP256K1_BIP324 */
1488
1489#ifdef SECP256K1_BUILD_ETHEREUM
1490
1492#define UFSECP_ETH_ADDR_LEN 20
1493
1496UFSECP_API ufsecp_error_t ufsecp_keccak256(const uint8_t* data, size_t len,
1497 uint8_t digest32_out[32]);
1498
1502UFSECP_API ufsecp_error_t ufsecp_eth_address(ufsecp_ctx* ctx,
1503 const uint8_t pubkey33[33],
1504 uint8_t addr20_out[20]);
1505
1509UFSECP_API ufsecp_error_t ufsecp_eth_address_checksummed(
1510 ufsecp_ctx* ctx,
1511 const uint8_t pubkey33[33],
1512 char* addr_out, size_t* addr_len);
1513
1517UFSECP_API ufsecp_error_t ufsecp_eth_personal_hash(const uint8_t* msg, size_t msg_len,
1518 uint8_t digest32_out[32]);
1519
1525UFSECP_API ufsecp_error_t ufsecp_eth_sign(ufsecp_ctx* ctx,
1526 const uint8_t msg32[32],
1527 const uint8_t privkey[32],
1528 uint8_t r_out[32],
1529 uint8_t s_out[32],
1530 uint64_t* v_out,
1531 uint64_t chain_id);
1532
1536UFSECP_API ufsecp_error_t ufsecp_eth_ecrecover(ufsecp_ctx* ctx,
1537 const uint8_t msg32[32],
1538 const uint8_t r[32],
1539 const uint8_t s[32],
1540 uint64_t v,
1541 uint8_t addr20_out[20]);
1542
1543#endif /* SECP256K1_BUILD_ETHEREUM */
1544
1545/* ===========================================================================
1546 * BIP-85 — Deterministic Entropy from BIP-32 Keychains
1547 * =========================================================================== */
1548
1556 ufsecp_ctx* ctx,
1557 const ufsecp_bip32_key* master_xprv,
1558 const char* path,
1559 uint8_t* entropy_out, size_t entropy_len);
1560
1567 ufsecp_ctx* ctx,
1568 const ufsecp_bip32_key* master_xprv,
1569 uint32_t words, uint32_t language_index, uint32_t index,
1570 char* mnemonic_out, size_t* mnemonic_len);
1571
1572/* ===========================================================================
1573 * BIP-340 Variable-Length Schnorr
1574 * =========================================================================== */
1575
1580 ufsecp_ctx* ctx,
1581 const uint8_t privkey[32],
1582 const uint8_t* msg, size_t msg_len,
1583 const uint8_t* aux_rand32,
1584 uint8_t sig64_out[64]);
1585
1588 ufsecp_ctx* ctx,
1589 const uint8_t pubkey_x[32],
1590 const uint8_t* msg, size_t msg_len,
1591 const uint8_t sig64[64]);
1592
1593/* ===========================================================================
1594 * BIP-322 — Generic Message Signing
1595 * =========================================================================== */
1596
1603
1610 ufsecp_ctx* ctx,
1611 const uint8_t privkey[32],
1612 ufsecp_bip322_addr_type addr_type,
1613 const uint8_t* msg, size_t msg_len,
1614 uint8_t* sig_out, size_t* sig_len);
1615
1621 ufsecp_ctx* ctx,
1622 const uint8_t* pubkey, size_t pubkey_len,
1623 ufsecp_bip322_addr_type addr_type,
1624 const uint8_t* msg, size_t msg_len,
1625 const uint8_t* sig, size_t sig_len);
1626
1627/* ===========================================================================
1628 * BIP-157/158 — Compact Block Filters (Golomb-Coded Set)
1629 * =========================================================================== */
1630
1639 const uint8_t key[16],
1640 const uint8_t** data, const size_t* data_sizes, size_t count,
1641 uint8_t* filter_out, size_t* filter_len);
1642
1646 const uint8_t key[16],
1647 const uint8_t* filter, size_t filter_len,
1648 size_t n_items,
1649 const uint8_t* item, size_t item_len);
1650
1654 const uint8_t key[16],
1655 const uint8_t* filter, size_t filter_len,
1656 size_t n_items,
1657 const uint8_t** query, const size_t* query_sizes, size_t query_count);
1658
1659/* ===========================================================================
1660 * BIP-174/370 — PSBT Signing Helpers
1661 * =========================================================================== */
1662
1664#define UFSECP_SIGHASH_ALL 0x01
1665#define UFSECP_SIGHASH_NONE 0x02
1666#define UFSECP_SIGHASH_SINGLE 0x03
1667#define UFSECP_SIGHASH_ANYONECANPAY 0x80
1668#define UFSECP_SIGHASH_DEFAULT 0x00 /* BIP-341 Taproot default */
1669
1676 ufsecp_ctx* ctx,
1677 const uint8_t sighash32[32],
1678 const uint8_t privkey[32],
1679 uint8_t sighash_type,
1680 uint8_t* sig_out, size_t* sig_len);
1681
1685 ufsecp_ctx* ctx,
1686 const uint8_t sighash32[32],
1687 const uint8_t privkey[32],
1688 uint8_t sighash_type,
1689 uint8_t* sig_out, size_t* sig_len);
1690
1694 ufsecp_ctx* ctx,
1695 const uint8_t sighash32[32],
1696 const uint8_t privkey[32],
1697 uint8_t sighash_type,
1698 const uint8_t* aux_rand32,
1699 uint8_t* sig_out, size_t* sig_len);
1700
1705 ufsecp_ctx* ctx,
1706 const ufsecp_bip32_key* master_xprv,
1707 const char* key_path,
1708 uint8_t privkey_out[32]);
1709
1710/* ===========================================================================
1711 * BIP-380..386 — Output Descriptors (key expression parser)
1712 * =========================================================================== */
1713
1721
1723typedef struct {
1725 uint8_t pubkey[33];
1726 uint8_t pubkey_len;
1728 char path[64];
1730
1738 ufsecp_ctx* ctx,
1739 const char* descriptor,
1740 uint32_t index,
1741 ufsecp_desc_key* key_out,
1742 char* addr_out, size_t* addr_len);
1743
1747 ufsecp_ctx* ctx,
1748 const char* descriptor,
1749 uint32_t index,
1750 char* addr_out, size_t* addr_len);
1751
1752#ifdef __cplusplus
1753}
1754
1755/* -- ABI layout guards (C++ only) ------------------------------------------ */
1756/* These fire at compile time if struct layout changes, preventing silent ABI */
1757/* breaks when bindings or cached objects assume a fixed layout. */
1758static_assert(sizeof(ufsecp_bip32_key) == 82,
1759 "ABI break: ufsecp_bip32_key size changed (expected 82)");
1760static_assert(UFSECP_BIP32_SERIALIZED_LEN == 78,
1761 "ABI break: UFSECP_BIP32_SERIALIZED_LEN changed (expected 78)");
1762static_assert(UFSECP_PRIVKEY_LEN == 32,
1763 "ABI break: UFSECP_PRIVKEY_LEN changed");
1764static_assert(UFSECP_PUBKEY_COMPRESSED_LEN == 33,
1765 "ABI break: UFSECP_PUBKEY_COMPRESSED_LEN changed");
1766static_assert(UFSECP_SIG_COMPACT_LEN == 64,
1767 "ABI break: UFSECP_SIG_COMPACT_LEN changed");
1768#else
1769/* C11 _Static_assert equivalent for pure-C consumers */
1770#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
1771_Static_assert(sizeof(ufsecp_bip32_key) == 82,
1772 "ABI break: ufsecp_bip32_key size changed (expected 82)");
1773#endif
1774#endif
1775
1776#endif /* UFSECP_H */
uint8_t is_private
Definition ufsecp.h:427
ufsecp_desc_type type
Definition ufsecp.h:1724
uint8_t pubkey_len
Definition ufsecp.h:1726
ufsecp_ff_limbs_t lmb_pub_y
Definition ufsecp.h:1149
ufsecp_ff_limbs_t lmb_result_x_mod_n
Definition ufsecp.h:1155
ufsecp_ff_limbs_t lmb_sig_r
Definition ufsecp.h:1146
ufsecp_ff_limbs_t lmb_result_x
Definition ufsecp.h:1153
ufsecp_ff_limbs_t lmb_u2
Definition ufsecp.h:1152
ufsecp_ff_limbs_t lmb_u1
Definition ufsecp.h:1151
ufsecp_ff_limbs_t lmb_sig_s
Definition ufsecp.h:1147
ufsecp_ff_limbs_t lmb_s_inv
Definition ufsecp.h:1150
ufsecp_ff_limbs_t lmb_pub_x
Definition ufsecp.h:1148
ufsecp_ff_limbs_t lmb_result_y
Definition ufsecp.h:1154
ufsecp_ff_limbs_t lmb_pub_x
Definition ufsecp.h:1209
ufsecp_ff_limbs_t lmb_sig_s
Definition ufsecp.h:1208
ufsecp_ff_limbs_t lmb_pub_y
Definition ufsecp.h:1211
ufsecp_ff_limbs_t lmb_e
Definition ufsecp.h:1212
ufsecp_ff_limbs_t lmb_sig_r
Definition ufsecp.h:1207
ufsecp_ff_limbs_t lmb_r_y
Definition ufsecp.h:1210
UFSECP_API ufsecp_error_t ufsecp_bip32_master(ufsecp_ctx *ctx, const uint8_t *seed, size_t seed_len, ufsecp_bip32_key *key_out)
UFSECP_API ufsecp_error_t ufsecp_btc_message_sign(ufsecp_ctx *ctx, const uint8_t *msg, size_t msg_len, const uint8_t privkey[32], char *base64_out, size_t *base64_len)
UFSECP_API ufsecp_error_t ufsecp_tapscript_sighash(ufsecp_ctx *ctx, uint32_t version, uint32_t locktime, size_t input_count, const uint8_t *prevout_txids, const uint32_t *prevout_vouts, const uint64_t *input_amounts, const uint32_t *input_sequences, const uint8_t *const *input_spks, const size_t *input_spk_lens, size_t output_count, const uint64_t *output_values, const uint8_t *const *output_spks, const size_t *output_spk_lens, size_t input_index, uint8_t hash_type, const uint8_t tapleaf_hash[32], uint8_t key_version, uint32_t code_separator_pos, const uint8_t *annex, size_t annex_len, uint8_t sighash_out[32])
UFSECP_API ufsecp_error_t ufsecp_ecdsa_batch_verify(ufsecp_ctx *ctx, const uint8_t *entries, size_t n)
UFSECP_API ufsecp_error_t ufsecp_wif_decode(ufsecp_ctx *ctx, const char *wif, uint8_t privkey32_out[32], int *compressed_out, int *network_out)
UFSECP_API ufsecp_error_t ufsecp_schnorr_adaptor_extract(ufsecp_ctx *ctx, const uint8_t pre_sig[UFSECP_SCHNORR_ADAPTOR_SIG_LEN], const uint8_t sig64[64], uint8_t secret32_out[32])
#define UFSECP_FROST_NONCE_COMMIT_LEN
Definition ufsecp.h:858
UFSECP_API ufsecp_error_t ufsecp_pubkey_tweak_add(ufsecp_ctx *ctx, const uint8_t pubkey33[33], const uint8_t tweak[32], uint8_t out33[33])
UFSECP_API ufsecp_error_t ufsecp_pubkey_negate(ufsecp_ctx *ctx, const uint8_t pubkey33[33], uint8_t out33[33])
UFSECP_API ufsecp_error_t ufsecp_bip144_witness_commitment(const uint8_t witness_root[32], const uint8_t witness_nonce[32], uint8_t commitment_out[32])
UFSECP_API ufsecp_error_t ufsecp_segwit_witness_script_hash(const uint8_t *script, size_t script_len, uint8_t hash_out[32])
UFSECP_API ufsecp_error_t ufsecp_pedersen_commit(ufsecp_ctx *ctx, const uint8_t value[32], const uint8_t blinding[32], uint8_t commitment33_out[33])
UFSECP_API ufsecp_error_t ufsecp_tagged_hash(const char *tag, const uint8_t *data, size_t len, uint8_t digest32_out[32])
UFSECP_API ufsecp_error_t ufsecp_frost_aggregate(ufsecp_ctx *ctx, const uint8_t *partial_sigs, size_t n, const uint8_t *nonce_commits, size_t n_signers, const uint8_t group_pubkey33[33], const uint8_t msg32[32], uint8_t sig64_out[64])
UFSECP_API ufsecp_error_t ufsecp_pubkey_tweak_mul(ufsecp_ctx *ctx, const uint8_t pubkey33[33], const uint8_t tweak[32], uint8_t out33[33])
UFSECP_API ufsecp_error_t ufsecp_frost_sign_nonce_gen(ufsecp_ctx *ctx, uint32_t participant_id, const uint8_t nonce_seed[32], uint8_t nonce_out[UFSECP_FROST_NONCE_LEN], uint8_t nonce_commit_out[UFSECP_FROST_NONCE_COMMIT_LEN])
UFSECP_API ufsecp_error_t ufsecp_taproot_keypath_sighash(ufsecp_ctx *ctx, uint32_t version, uint32_t locktime, size_t input_count, const uint8_t *prevout_txids, const uint32_t *prevout_vouts, const uint64_t *input_amounts, const uint32_t *input_sequences, const uint8_t *const *input_spks, const size_t *input_spk_lens, size_t output_count, const uint64_t *output_values, const uint8_t *const *output_spks, const size_t *output_spk_lens, size_t input_index, uint8_t hash_type, const uint8_t *annex, size_t annex_len, uint8_t sighash_out[32])
UFSECP_API ufsecp_error_t ufsecp_ecdsa_adaptor_adapt(ufsecp_ctx *ctx, const uint8_t pre_sig[UFSECP_ECDSA_ADAPTOR_SIG_LEN], const uint8_t adaptor_secret[32], uint8_t sig64_out[64])
UFSECP_API ufsecp_error_t ufsecp_btc_message_verify(ufsecp_ctx *ctx, const uint8_t *msg, size_t msg_len, const uint8_t pubkey33[33], const char *base64_sig)
UFSECP_API ufsecp_error_t ufsecp_addr_p2wpkh(ufsecp_ctx *ctx, const uint8_t pubkey33[33], int network, char *addr_out, size_t *addr_len)
UFSECP_API ufsecp_error_t ufsecp_gcs_match(const uint8_t key[16], const uint8_t *filter, size_t filter_len, size_t n_items, const uint8_t *item, size_t item_len)
UFSECP_API ufsecp_error_t ufsecp_zk_range_prove(ufsecp_ctx *ctx, uint64_t value, const uint8_t blinding[32], const uint8_t commitment33[33], const uint8_t aux_rand[32], uint8_t *proof_out, size_t *proof_len)
UFSECP_API ufsecp_error_t ufsecp_bip322_verify(ufsecp_ctx *ctx, const uint8_t *pubkey, size_t pubkey_len, ufsecp_bip322_addr_type addr_type, const uint8_t *msg, size_t msg_len, const uint8_t *sig, size_t sig_len)
UFSECP_API ufsecp_error_t ufsecp_musig2_start_sign_session(ufsecp_ctx *ctx, const uint8_t aggnonce[UFSECP_MUSIG2_AGGNONCE_LEN], const uint8_t keyagg[UFSECP_MUSIG2_KEYAGG_LEN], const uint8_t msg32[32], uint8_t session_out[UFSECP_MUSIG2_SESSION_LEN])
UFSECP_API ufsecp_error_t ufsecp_schnorr_adaptor_sign(ufsecp_ctx *ctx, const uint8_t privkey[32], const uint8_t msg32[32], const uint8_t adaptor_point33[33], const uint8_t aux_rand[32], uint8_t pre_sig_out[UFSECP_SCHNORR_ADAPTOR_SIG_LEN])
#define UFSECP_ZK_KNOWLEDGE_PROOF_LEN
Definition ufsecp.h:1055
UFSECP_API ufsecp_error_t ufsecp_coin_wif_encode(ufsecp_ctx *ctx, const uint8_t privkey[32], uint32_t coin_type, int testnet, char *wif_out, size_t *wif_len)
UFSECP_API int ufsecp_segwit_is_witness_program(const uint8_t *script, size_t script_len)
UFSECP_API ufsecp_error_t ufsecp_ecdsa_verify(ufsecp_ctx *ctx, const uint8_t msg32[32], const uint8_t sig64[64], const uint8_t pubkey33[33])
UFSECP_API ufsecp_error_t ufsecp_bip144_txid(ufsecp_ctx *ctx, const uint8_t *raw_tx, size_t raw_tx_len, uint8_t txid_out[32])
UFSECP_API ufsecp_error_t ufsecp_frost_sign(ufsecp_ctx *ctx, const uint8_t keypkg[UFSECP_FROST_KEYPKG_LEN], uint8_t nonce[UFSECP_FROST_NONCE_LEN], const uint8_t msg32[32], const uint8_t *nonce_commits, size_t n_signers, uint8_t partial_sig_out[36])
UFSECP_API ufsecp_error_t ufsecp_taproot_tweak_seckey(ufsecp_ctx *ctx, const uint8_t privkey[32], const uint8_t *merkle_root, uint8_t tweaked32_out[32])
UFSECP_API ufsecp_error_t ufsecp_musig2_partial_sign(ufsecp_ctx *ctx, uint8_t secnonce[UFSECP_MUSIG2_SECNONCE_LEN], const uint8_t privkey[32], const uint8_t keyagg[UFSECP_MUSIG2_KEYAGG_LEN], const uint8_t session[UFSECP_MUSIG2_SESSION_LEN], size_t signer_index, uint8_t partial_sig32_out[32])
UFSECP_API ufsecp_error_t ufsecp_schnorr_sign_msg(ufsecp_ctx *ctx, const uint8_t privkey[32], const uint8_t *msg, size_t msg_len, const uint8_t *aux_rand32, uint8_t sig64_out[64])
UFSECP_API ufsecp_error_t ufsecp_ctx_clone(const ufsecp_ctx *src, ufsecp_ctx **ctx_out)
UFSECP_API ufsecp_error_t ufsecp_sha512(const uint8_t *data, size_t len, uint8_t digest64_out[64])
UFSECP_API ufsecp_error_t ufsecp_ecdsa_sign_recoverable(ufsecp_ctx *ctx, const uint8_t msg32[32], const uint8_t privkey[32], uint8_t sig64_out[64], int *recid_out)
UFSECP_API const char * ufsecp_last_error_msg(const ufsecp_ctx *ctx)
#define UFSECP_MUSIG2_SECNONCE_LEN
Definition ufsecp.h:772
UFSECP_API ufsecp_error_t ufsecp_ecdsa_sign(ufsecp_ctx *ctx, const uint8_t msg32[32], const uint8_t privkey[32], uint8_t sig64_out[64])
UFSECP_API ufsecp_error_t ufsecp_addr_p2sh(const uint8_t *redeem_script, size_t redeem_script_len, int network, char *addr_out, size_t *addr_len)
UFSECP_API ufsecp_error_t ufsecp_ecdh_raw(ufsecp_ctx *ctx, const uint8_t privkey[32], const uint8_t pubkey33[33], uint8_t secret32_out[32])
UFSECP_API ufsecp_error_t ufsecp_bip39_to_seed(ufsecp_ctx *ctx, const char *mnemonic, const char *passphrase, uint8_t seed64_out[64])
UFSECP_API ufsecp_error_t ufsecp_sha256(const uint8_t *data, size_t len, uint8_t digest32_out[32])
UFSECP_API ufsecp_error_t ufsecp_segwit_p2tr_spk(const uint8_t output_key[32], uint8_t spk_out[34])
UFSECP_API ufsecp_error_t ufsecp_bip143_sighash(ufsecp_ctx *ctx, uint32_t version, const uint8_t hash_prevouts[32], const uint8_t hash_sequence[32], const uint8_t outpoint_txid[32], uint32_t outpoint_vout, const uint8_t *script_code, size_t script_code_len, uint64_t value, uint32_t sequence, const uint8_t hash_outputs[32], uint32_t locktime, uint32_t sighash_type, uint8_t sighash_out[32])
UFSECP_API ufsecp_error_t ufsecp_wif_encode(ufsecp_ctx *ctx, const uint8_t privkey[32], int compressed, int network, char *wif_out, size_t *wif_len)
UFSECP_API ufsecp_error_t ufsecp_bip39_to_entropy(ufsecp_ctx *ctx, const char *mnemonic, uint8_t *entropy_out, size_t *entropy_len)
UFSECP_API ufsecp_error_t ufsecp_bip143_p2wpkh_script_code(const uint8_t pubkey_hash[20], uint8_t script_code_out[25])
UFSECP_API ufsecp_error_t ufsecp_zk_knowledge_verify(ufsecp_ctx *ctx, const uint8_t proof[UFSECP_ZK_KNOWLEDGE_PROOF_LEN], const uint8_t pubkey33[33], const uint8_t msg32[32])
UFSECP_API size_t ufsecp_ctx_size(void)
UFSECP_API ufsecp_error_t ufsecp_taproot_verify(ufsecp_ctx *ctx, const uint8_t output_x[32], int output_parity, const uint8_t internal_x[32], const uint8_t *merkle_root, size_t merkle_root_len)
UFSECP_API ufsecp_error_t ufsecp_psbt_sign_taproot(ufsecp_ctx *ctx, const uint8_t sighash32[32], const uint8_t privkey[32], uint8_t sighash_type, const uint8_t *aux_rand32, uint8_t *sig_out, size_t *sig_len)
UFSECP_API ufsecp_error_t ufsecp_segwit_p2wpkh_spk(const uint8_t pubkey_hash[20], uint8_t spk_out[22])
UFSECP_API ufsecp_error_t ufsecp_schnorr_batch_identify_invalid(ufsecp_ctx *ctx, const uint8_t *entries, size_t n, size_t *invalid_out, size_t *invalid_count)
#define UFSECP_SIG_COMPACT_LEN
Definition ufsecp.h:58
UFSECP_API ufsecp_error_t ufsecp_last_error(const ufsecp_ctx *ctx)
#define UFSECP_ZK_DLEQ_PROOF_LEN
Definition ufsecp.h:1056
UFSECP_API ufsecp_error_t ufsecp_zk_schnorr_snark_witness(ufsecp_ctx *ctx, const uint8_t msg32[32], const uint8_t pubkey_x32[32], const uint8_t sig64[64], ufsecp_schnorr_snark_witness_t *out)
UFSECP_API ufsecp_error_t ufsecp_schnorr_sign_verified(ufsecp_ctx *ctx, const uint8_t msg32[32], const uint8_t privkey[32], const uint8_t aux_rand[32], uint8_t sig64_out[64])
UFSECP_API ufsecp_error_t ufsecp_pubkey_create_uncompressed(ufsecp_ctx *ctx, const uint8_t privkey[32], uint8_t pubkey65_out[65])
#define UFSECP_FROST_NONCE_LEN
Definition ufsecp.h:857
UFSECP_API ufsecp_error_t ufsecp_zk_dleq_verify(ufsecp_ctx *ctx, const uint8_t proof[UFSECP_ZK_DLEQ_PROOF_LEN], const uint8_t G33[33], const uint8_t H33[33], const uint8_t P33[33], const uint8_t Q33[33])
UFSECP_API ufsecp_error_t ufsecp_bip32_pubkey(ufsecp_ctx *ctx, const ufsecp_bip32_key *key, uint8_t pubkey33_out[33])
UFSECP_API ufsecp_error_t ufsecp_btc_message_hash(const uint8_t *msg, size_t msg_len, uint8_t digest32_out[32])
ufsecp_desc_type
Definition ufsecp.h:1714
@ UFSECP_DESC_PKH
Definition ufsecp.h:1716
@ UFSECP_DESC_WPKH
Definition ufsecp.h:1717
@ UFSECP_DESC_PK
Definition ufsecp.h:1715
@ UFSECP_DESC_SH_WPKH
Definition ufsecp.h:1719
@ UFSECP_DESC_TR
Definition ufsecp.h:1718
ufsecp_bip322_addr_type
Definition ufsecp.h:1597
@ UFSECP_BIP322_ADDR_P2PKH
Definition ufsecp.h:1598
@ UFSECP_BIP322_ADDR_P2TR
Definition ufsecp.h:1600
@ UFSECP_BIP322_ADDR_P2SH_P2WPKH
Definition ufsecp.h:1601
@ UFSECP_BIP322_ADDR_P2WPKH
Definition ufsecp.h:1599
UFSECP_API ufsecp_error_t ufsecp_musig2_key_agg(ufsecp_ctx *ctx, const uint8_t *pubkeys, size_t n, uint8_t keyagg_out[UFSECP_MUSIG2_KEYAGG_LEN], uint8_t agg_pubkey32_out[32])
UFSECP_API ufsecp_error_t ufsecp_ecdsa_adaptor_verify(ufsecp_ctx *ctx, const uint8_t pre_sig[UFSECP_ECDSA_ADAPTOR_SIG_LEN], const uint8_t pubkey33[33], const uint8_t msg32[32], const uint8_t adaptor_point33[33])
UFSECP_API ufsecp_error_t ufsecp_musig2_partial_verify(ufsecp_ctx *ctx, const uint8_t partial_sig32[32], const uint8_t pubnonce[UFSECP_MUSIG2_PUBNONCE_LEN], const uint8_t pubkey32[32], const uint8_t keyagg[UFSECP_MUSIG2_KEYAGG_LEN], const uint8_t session[UFSECP_MUSIG2_SESSION_LEN], size_t signer_index)
UFSECP_API ufsecp_error_t ufsecp_ecdh(ufsecp_ctx *ctx, const uint8_t privkey[32], const uint8_t pubkey33[33], uint8_t secret32_out[32])
UFSECP_API ufsecp_error_t ufsecp_bip322_sign(ufsecp_ctx *ctx, const uint8_t privkey[32], ufsecp_bip322_addr_type addr_type, const uint8_t *msg, size_t msg_len, uint8_t *sig_out, size_t *sig_len)
UFSECP_API void ufsecp_ctx_destroy(ufsecp_ctx *ctx)
UFSECP_API ufsecp_error_t ufsecp_pubkey_xonly(ufsecp_ctx *ctx, const uint8_t privkey[32], uint8_t xonly32_out[32])
UFSECP_API ufsecp_error_t ufsecp_schnorr_verify_msg(ufsecp_ctx *ctx, const uint8_t pubkey_x[32], const uint8_t *msg, size_t msg_len, const uint8_t sig64[64])
UFSECP_API ufsecp_error_t ufsecp_pubkey_parse(ufsecp_ctx *ctx, const uint8_t *input, size_t input_len, uint8_t pubkey33_out[33])
UFSECP_API ufsecp_error_t ufsecp_pedersen_switch_commit(ufsecp_ctx *ctx, const uint8_t value[32], const uint8_t blinding[32], const uint8_t switch_blind[32], uint8_t commitment33_out[33])
UFSECP_API ufsecp_error_t ufsecp_addr_p2sh_p2wpkh(ufsecp_ctx *ctx, const uint8_t pubkey33[33], int network, char *addr_out, size_t *addr_len)
UFSECP_API ufsecp_error_t ufsecp_schnorr_adaptor_verify(ufsecp_ctx *ctx, const uint8_t pre_sig[UFSECP_SCHNORR_ADAPTOR_SIG_LEN], const uint8_t pubkey_x[32], const uint8_t msg32[32], const uint8_t adaptor_point33[33])
UFSECP_API ufsecp_error_t ufsecp_silent_payment_create_output(ufsecp_ctx *ctx, const uint8_t *input_privkeys, size_t n_inputs, const uint8_t scan_pubkey33[33], const uint8_t spend_pubkey33[33], uint32_t k, uint8_t output_pubkey33_out[33], uint8_t *tweak32_out)
UFSECP_API ufsecp_error_t ufsecp_musig2_nonce_gen(ufsecp_ctx *ctx, const uint8_t privkey[32], const uint8_t pubkey32[32], const uint8_t agg_pubkey32[32], const uint8_t msg32[32], const uint8_t extra_in[32], uint8_t secnonce_out[UFSECP_MUSIG2_SECNONCE_LEN], uint8_t pubnonce_out[UFSECP_MUSIG2_PUBNONCE_LEN])
UFSECP_API ufsecp_error_t ufsecp_ecdsa_sig_to_der(ufsecp_ctx *ctx, const uint8_t sig64[64], uint8_t *der_out, size_t *der_len)
#define UFSECP_MUSIG2_KEYAGG_LEN
Definition ufsecp.h:770
#define UFSECP_PRIVKEY_LEN
Definition ufsecp.h:54
UFSECP_API ufsecp_error_t ufsecp_psbt_sign_legacy(ufsecp_ctx *ctx, const uint8_t sighash32[32], const uint8_t privkey[32], uint8_t sighash_type, uint8_t *sig_out, size_t *sig_len)
UFSECP_API ufsecp_error_t ufsecp_bip32_privkey(ufsecp_ctx *ctx, const ufsecp_bip32_key *key, uint8_t privkey32_out[32])
UFSECP_API ufsecp_error_t ufsecp_ecies_encrypt(ufsecp_ctx *ctx, const uint8_t recipient_pubkey33[33], const uint8_t *plaintext, size_t plaintext_len, uint8_t *envelope_out, size_t *envelope_len)
UFSECP_API ufsecp_error_t ufsecp_schnorr_verify(ufsecp_ctx *ctx, const uint8_t msg32[32], const uint8_t sig64[64], const uint8_t pubkey_x[32])
#define UFSECP_FROST_KEYPKG_LEN
Definition ufsecp.h:856
UFSECP_API ufsecp_error_t ufsecp_bip85_bip39(ufsecp_ctx *ctx, const ufsecp_bip32_key *master_xprv, uint32_t words, uint32_t language_index, uint32_t index, char *mnemonic_out, size_t *mnemonic_len)
UFSECP_API ufsecp_error_t ufsecp_gcs_match_any(const uint8_t key[16], const uint8_t *filter, size_t filter_len, size_t n_items, const uint8_t **query, const size_t *query_sizes, size_t query_count)
UFSECP_API ufsecp_error_t ufsecp_schnorr_sign_batch(ufsecp_ctx *ctx, size_t count, const uint8_t *msgs32, const uint8_t *privkeys32, const uint8_t *aux_rands32, uint8_t *sigs64_out)
UFSECP_API ufsecp_error_t ufsecp_schnorr_sign(ufsecp_ctx *ctx, const uint8_t msg32[32], const uint8_t privkey[32], const uint8_t aux_rand[32], uint8_t sig64_out[64])
UFSECP_API ufsecp_error_t ufsecp_multi_scalar_mul(ufsecp_ctx *ctx, const uint8_t *scalars, const uint8_t *points, size_t n, uint8_t out33[33])
UFSECP_API ufsecp_error_t ufsecp_ecdsa_recover(ufsecp_ctx *ctx, const uint8_t msg32[32], const uint8_t sig64[64], int recid, uint8_t pubkey33_out[33])
UFSECP_API ufsecp_error_t ufsecp_bip32_derive_path(ufsecp_ctx *ctx, const ufsecp_bip32_key *master, const char *path, ufsecp_bip32_key *key_out)
UFSECP_API ufsecp_error_t ufsecp_seckey_tweak_mul(ufsecp_ctx *ctx, uint8_t privkey[32], const uint8_t tweak[32])
UFSECP_API ufsecp_error_t ufsecp_psbt_derive_key(ufsecp_ctx *ctx, const ufsecp_bip32_key *master_xprv, const char *key_path, uint8_t privkey_out[32])
UFSECP_API ufsecp_error_t ufsecp_zk_dleq_prove(ufsecp_ctx *ctx, const uint8_t secret[32], const uint8_t G33[33], const uint8_t H33[33], const uint8_t P33[33], const uint8_t Q33[33], const uint8_t aux_rand[32], uint8_t proof_out[UFSECP_ZK_DLEQ_PROOF_LEN])
UFSECP_API ufsecp_error_t ufsecp_context_randomize(ufsecp_ctx *ctx, const uint8_t *seed32)
UFSECP_API ufsecp_error_t ufsecp_shamir_trick(ufsecp_ctx *ctx, const uint8_t a[32], const uint8_t P33[33], const uint8_t b[32], const uint8_t Q33[33], uint8_t out33[33])
UFSECP_API ufsecp_error_t ufsecp_segwit_p2wsh_spk(const uint8_t script_hash[32], uint8_t spk_out[34])
UFSECP_API ufsecp_error_t ufsecp_ecies_decrypt(ufsecp_ctx *ctx, const uint8_t privkey[32], const uint8_t *envelope, size_t envelope_len, uint8_t *plaintext_out, size_t *plaintext_len)
#define UFSECP_BIP32_SERIALIZED_LEN
Definition ufsecp.h:63
UFSECP_API ufsecp_error_t ufsecp_bip144_wtxid(ufsecp_ctx *ctx, const uint8_t *raw_tx, size_t raw_tx_len, uint8_t wtxid_out[32])
#define UFSECP_PUBKEY_COMPRESSED_LEN
Definition ufsecp.h:55
UFSECP_API ufsecp_error_t ufsecp_silent_payment_address(ufsecp_ctx *ctx, const uint8_t scan_privkey[32], const uint8_t spend_privkey[32], uint8_t scan_pubkey33_out[33], uint8_t spend_pubkey33_out[33], char *addr_out, size_t *addr_len)
UFSECP_API ufsecp_error_t ufsecp_seckey_negate(ufsecp_ctx *ctx, uint8_t privkey[32])
UFSECP_API ufsecp_error_t ufsecp_zk_range_verify(ufsecp_ctx *ctx, const uint8_t commitment33[33], const uint8_t *proof, size_t proof_len)
#define UFSECP_MUSIG2_AGGNONCE_LEN
Definition ufsecp.h:769
UFSECP_API ufsecp_error_t ufsecp_addr_p2pkh(ufsecp_ctx *ctx, const uint8_t pubkey33[33], int network, char *addr_out, size_t *addr_len)
UFSECP_API ufsecp_error_t ufsecp_ecdsa_sign_verified(ufsecp_ctx *ctx, const uint8_t msg32[32], const uint8_t privkey[32], uint8_t sig64_out[64])
#define UFSECP_MUSIG2_PUBNONCE_LEN
Definition ufsecp.h:768
UFSECP_API ufsecp_error_t ufsecp_bip32_derive(ufsecp_ctx *ctx, const ufsecp_bip32_key *parent, uint32_t index, ufsecp_bip32_key *child_out)
UFSECP_API ufsecp_error_t ufsecp_coin_derive_from_seed(ufsecp_ctx *ctx, const uint8_t *seed, size_t seed_len, uint32_t coin_type, uint32_t account, int change, uint32_t index, int testnet, uint8_t *privkey32_out, uint8_t *pubkey33_out, char *addr_out, size_t *addr_len)
UFSECP_API ufsecp_error_t ufsecp_psbt_sign_segwit(ufsecp_ctx *ctx, const uint8_t sighash32[32], const uint8_t privkey[32], uint8_t sighash_type, uint8_t *sig_out, size_t *sig_len)
UFSECP_API ufsecp_error_t ufsecp_musig2_nonce_agg(ufsecp_ctx *ctx, const uint8_t *pubnonces, size_t n, uint8_t aggnonce_out[UFSECP_MUSIG2_AGGNONCE_LEN])
UFSECP_API ufsecp_error_t ufsecp_ecdsa_sig_from_der(ufsecp_ctx *ctx, const uint8_t *der, size_t der_len, uint8_t sig64_out[64])
UFSECP_API ufsecp_error_t ufsecp_taproot_output_key(ufsecp_ctx *ctx, const uint8_t internal_x[32], const uint8_t *merkle_root, uint8_t output_x_out[32], int *parity_out)
UFSECP_API ufsecp_error_t ufsecp_ecdh_xonly(ufsecp_ctx *ctx, const uint8_t privkey[32], const uint8_t pubkey33[33], uint8_t secret32_out[32])
#define UFSECP_ECDSA_ADAPTOR_SIG_LEN
Definition ufsecp.h:946
struct ufsecp_ctx ufsecp_ctx
Definition ufsecp.h:92
UFSECP_API ufsecp_error_t ufsecp_pubkey_combine(ufsecp_ctx *ctx, const uint8_t *pubkeys, size_t n, uint8_t out33[33])
UFSECP_API ufsecp_error_t ufsecp_ctx_create(ufsecp_ctx **ctx_out)
UFSECP_API ufsecp_error_t ufsecp_bip39_validate(const ufsecp_ctx *ctx, const char *mnemonic)
UFSECP_API ufsecp_error_t ufsecp_segwit_parse_program(const uint8_t *script, size_t script_len, int *version_out, uint8_t *program_out, size_t *program_len_out)
#define UFSECP_MUSIG2_SESSION_LEN
Definition ufsecp.h:771
UFSECP_API ufsecp_error_t ufsecp_frost_keygen_begin(ufsecp_ctx *ctx, uint32_t participant_id, uint32_t threshold, uint32_t num_participants, const uint8_t seed[32], uint8_t *commits_out, size_t *commits_len, uint8_t *shares_out, size_t *shares_len)
UFSECP_API ufsecp_error_t ufsecp_pedersen_blind_sum(ufsecp_ctx *ctx, const uint8_t *blinds_in, size_t n_in, const uint8_t *blinds_out, size_t n_out, uint8_t sum32_out[32])
UFSECP_API ufsecp_error_t ufsecp_ecdsa_sign_batch(ufsecp_ctx *ctx, size_t count, const uint8_t *msgs32, const uint8_t *privkeys32, uint8_t *sigs64_out)
UFSECP_API ufsecp_error_t ufsecp_zk_ecdsa_snark_witness(ufsecp_ctx *ctx, const uint8_t msg_hash32[32], const uint8_t pubkey33[33], const uint8_t sig64[64], ufsecp_ecdsa_snark_witness_t *out)
UFSECP_API ufsecp_error_t ufsecp_hash160(const uint8_t *data, size_t len, uint8_t digest20_out[20])
UFSECP_API ufsecp_error_t ufsecp_descriptor_parse(ufsecp_ctx *ctx, const char *descriptor, uint32_t index, ufsecp_desc_key *key_out, char *addr_out, size_t *addr_len)
UFSECP_API ufsecp_error_t ufsecp_gcs_build(const uint8_t key[16], const uint8_t **data, const size_t *data_sizes, size_t count, uint8_t *filter_out, size_t *filter_len)
UFSECP_API ufsecp_error_t ufsecp_bip85_entropy(ufsecp_ctx *ctx, const ufsecp_bip32_key *master_xprv, const char *path, uint8_t *entropy_out, size_t entropy_len)
UFSECP_API ufsecp_error_t ufsecp_pubkey_add(ufsecp_ctx *ctx, const uint8_t a33[33], const uint8_t b33[33], uint8_t out33[33])
UFSECP_API ufsecp_error_t ufsecp_ecdsa_batch_identify_invalid(ufsecp_ctx *ctx, const uint8_t *entries, size_t n, size_t *invalid_out, size_t *invalid_count)
UFSECP_API ufsecp_error_t ufsecp_seckey_verify(const ufsecp_ctx *ctx, const uint8_t privkey[32])
UFSECP_API ufsecp_error_t ufsecp_pedersen_verify_sum(ufsecp_ctx *ctx, const uint8_t *pos, size_t n_pos, const uint8_t *neg, size_t n_neg)
UFSECP_API ufsecp_error_t ufsecp_frost_verify_partial(ufsecp_ctx *ctx, const uint8_t partial_sig[36], const uint8_t verification_share33[33], const uint8_t *nonce_commits, size_t n_signers, const uint8_t msg32[32], const uint8_t group_pubkey33[33])
UFSECP_API ufsecp_error_t ufsecp_coin_address(ufsecp_ctx *ctx, const uint8_t pubkey33[33], uint32_t coin_type, int testnet, char *addr_out, size_t *addr_len)
UFSECP_API ufsecp_error_t ufsecp_seckey_tweak_add(ufsecp_ctx *ctx, uint8_t privkey[32], const uint8_t tweak[32])
UFSECP_API ufsecp_error_t ufsecp_schnorr_batch_verify(ufsecp_ctx *ctx, const uint8_t *entries, size_t n)
UFSECP_API ufsecp_error_t ufsecp_zk_knowledge_prove(ufsecp_ctx *ctx, const uint8_t secret[32], const uint8_t pubkey33[33], const uint8_t msg32[32], const uint8_t aux_rand[32], uint8_t proof_out[UFSECP_ZK_KNOWLEDGE_PROOF_LEN])
UFSECP_API ufsecp_error_t ufsecp_silent_payment_scan(ufsecp_ctx *ctx, const uint8_t scan_privkey[32], const uint8_t spend_privkey[32], const uint8_t *input_pubkeys33, size_t n_input_pubkeys, const uint8_t *output_xonly32, size_t n_outputs, uint32_t *found_indices_out, uint8_t *found_privkeys_out, size_t *n_found)
UFSECP_API ufsecp_error_t ufsecp_musig2_partial_sig_agg(ufsecp_ctx *ctx, const uint8_t *partial_sigs, size_t n, const uint8_t session[UFSECP_MUSIG2_SESSION_LEN], uint8_t sig64_out[64])
UFSECP_API ufsecp_error_t ufsecp_ecdsa_adaptor_extract(ufsecp_ctx *ctx, const uint8_t pre_sig[UFSECP_ECDSA_ADAPTOR_SIG_LEN], const uint8_t sig64[64], uint8_t secret32_out[32])
UFSECP_API ufsecp_error_t ufsecp_frost_keygen_finalize(ufsecp_ctx *ctx, uint32_t participant_id, const uint8_t *all_commits, size_t commits_len, const uint8_t *received_shares, size_t shares_len, uint32_t threshold, uint32_t num_participants, uint8_t keypkg_out[UFSECP_FROST_KEYPKG_LEN])
#define UFSECP_SCHNORR_ADAPTOR_SIG_LEN
Definition ufsecp.h:945
UFSECP_API ufsecp_error_t ufsecp_ecdsa_adaptor_sign(ufsecp_ctx *ctx, const uint8_t privkey[32], const uint8_t msg32[32], const uint8_t adaptor_point33[33], uint8_t pre_sig_out[UFSECP_ECDSA_ADAPTOR_SIG_LEN])
UFSECP_API ufsecp_error_t ufsecp_addr_p2tr(ufsecp_ctx *ctx, const uint8_t internal_key_x[32], int network, char *addr_out, size_t *addr_len)
UFSECP_API ufsecp_error_t ufsecp_pedersen_verify(ufsecp_ctx *ctx, const uint8_t commitment33[33], const uint8_t value[32], const uint8_t blinding[32])
UFSECP_API ufsecp_error_t ufsecp_pubkey_create(ufsecp_ctx *ctx, const uint8_t privkey[32], uint8_t pubkey33_out[33])
UFSECP_API ufsecp_error_t ufsecp_bip39_generate(ufsecp_ctx *ctx, size_t entropy_bytes, const uint8_t *entropy_in, char *mnemonic_out, size_t *mnemonic_len)
UFSECP_API ufsecp_error_t ufsecp_descriptor_address(ufsecp_ctx *ctx, const char *descriptor, uint32_t index, char *addr_out, size_t *addr_len)
UFSECP_API ufsecp_error_t ufsecp_schnorr_adaptor_adapt(ufsecp_ctx *ctx, const uint8_t pre_sig[UFSECP_SCHNORR_ADAPTOR_SIG_LEN], const uint8_t adaptor_secret[32], uint8_t sig64_out[64])
int ufsecp_error_t
#define UFSECP_API