UltrafastSecp256k1 3.50.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 * 5. Thread safety: each ctx is single-thread; create one per thread or
15 * protect externally.
16 * 6. Dual-layer constant-time: secret-dependent operations (scalar mul,
17 * nonce gen, key tweak) ALWAYS use the CT layer; public operations
18 * (verification, point serialisation) ALWAYS use the fast layer.
19 * Both layers are architecturally wired -- no flag, no opt-in.
20 * This removes flag-based routing mistakes inside the core ABI.
21 * Bindings and callers must still enforce context ownership, buffer
22 * lifetime, and secret-handling discipline.
23 *
24 * ## Naming
25 *
26 * ufsecp_<noun>_<verb>() e.g. ufsecp_ecdsa_sign()
27 * UFSECP_<CONSTANT> e.g. UFSECP_PUBKEY_COMPRESSED_LEN
28 *
29 * ## Memory
30 *
31 * Caller always owns output buffers.
32 * Library never allocates on behalf of caller (except ctx create/clone).
33 *
34 * ============================================================================ */
35
36#ifndef UFSECP_H
37#define UFSECP_H
38
39#include "ufsecp_version.h"
40#include "ufsecp_error.h"
41
42#include <stddef.h>
43#include <stdint.h>
44
45#ifdef __cplusplus
46extern "C" {
47#endif
48
49/* -- Size constants --------------------------------------------------------- */
50
51#define UFSECP_PRIVKEY_LEN 32
52#define UFSECP_PUBKEY_COMPRESSED_LEN 33
53#define UFSECP_PUBKEY_UNCOMPRESSED_LEN 65
54#define UFSECP_PUBKEY_XONLY_LEN 32
55#define UFSECP_SIG_COMPACT_LEN 64 /* R||S for ECDSA, r||s for Schnorr */
56#define UFSECP_SIG_DER_MAX_LEN 72
57#define UFSECP_HASH_LEN 32
58#define UFSECP_HASH160_LEN 20
59#define UFSECP_SHARED_SECRET_LEN 32
60#define UFSECP_BIP32_SERIALIZED_LEN 78
61
62/* -- Network constants ------------------------------------------------------ */
63
64#define UFSECP_NET_MAINNET 0
65#define UFSECP_NET_TESTNET 1
66
67/* ===========================================================================
68 * Context
69 * ===========================================================================
70 *
71 * Constant-time safety is architectural, NOT flag-based.
72 *
73 * +-------------------------------------------------------------+
74 * | Layer 1 -- FAST: public operations (verify, point arith) |
75 * | Layer 2 -- CT : secret operations (sign, nonce, tweak) |
76 * | Both layers are ALWAYS ACTIVE simultaneously. |
77 * | No opt-in / opt-out in the core ABI. |
78 * +-------------------------------------------------------------+
79 *
80 * CT layer guarantees:
81 * - Complete addition formula (branchless, 12M+2S)
82 * - Fixed-trace scalar multiplication (no early exit)
83 * - CT table lookup (scans all entries)
84 * - Valgrind/MSAN verifiable (SECP256K1_CLASSIFY / DECLASSIFY)
85 *
86 * =========================================================================== */
87
89typedef struct ufsecp_ctx ufsecp_ctx;
90
97
100 ufsecp_ctx** ctx_out);
101
104
107
112UFSECP_API const char* ufsecp_last_error_msg(const ufsecp_ctx* ctx);
113
115UFSECP_API size_t ufsecp_ctx_size(void);
116
117/* ===========================================================================
118 * Private key utilities
119 * =========================================================================== */
120
124 const uint8_t privkey[32]);
125
128 uint8_t privkey[32]);
129
132 uint8_t privkey[32],
133 const uint8_t tweak[32]);
134
137 uint8_t privkey[32],
138 const uint8_t tweak[32]);
139
140/* ===========================================================================
141 * Public key
142 * =========================================================================== */
143
146 const uint8_t privkey[32],
147 uint8_t pubkey33_out[33]);
148
151 ufsecp_ctx* ctx,
152 const uint8_t privkey[32],
153 uint8_t pubkey65_out[65]);
154
158 const uint8_t* input,
159 size_t input_len,
160 uint8_t pubkey33_out[33]);
161
164 const uint8_t privkey[32],
165 uint8_t xonly32_out[32]);
166
167/* ===========================================================================
168 * ECDSA (secp256k1, RFC 6979 deterministic nonce)
169 * =========================================================================== */
170
173 const uint8_t msg32[32],
174 const uint8_t privkey[32],
175 uint8_t sig64_out[64]);
176
181 const uint8_t msg32[32],
182 const uint8_t privkey[32],
183 uint8_t sig64_out[64]);
184
188 const uint8_t msg32[32],
189 const uint8_t sig64[64],
190 const uint8_t pubkey33[33]);
191
195 const uint8_t sig64[64],
196 uint8_t* der_out,
197 size_t* der_len);
198
201 const uint8_t* der,
202 size_t der_len,
203 uint8_t sig64_out[64]);
204
205/* -- ECDSA recovery --------------------------------------------------------- */
206
210 ufsecp_ctx* ctx,
211 const uint8_t msg32[32],
212 const uint8_t privkey[32],
213 uint8_t sig64_out[64],
214 int* recid_out);
215
218 const uint8_t msg32[32],
219 const uint8_t sig64[64],
220 int recid,
221 uint8_t pubkey33_out[33]);
222
223/* ===========================================================================
224 * Schnorr / BIP-340
225 * =========================================================================== */
226
230 const uint8_t msg32[32],
231 const uint8_t privkey[32],
232 const uint8_t aux_rand[32],
233 uint8_t sig64_out[64]);
234
238 const uint8_t msg32[32],
239 const uint8_t privkey[32],
240 const uint8_t aux_rand[32],
241 uint8_t sig64_out[64]);
242
246 const uint8_t msg32[32],
247 const uint8_t sig64[64],
248 const uint8_t pubkey_x[32]);
249
250/* ===========================================================================
251 * Batch signing (CPU constant-time dispatch -- private keys never leave host)
252 * =========================================================================== */
253
265 ufsecp_ctx* ctx,
266 size_t count,
267 const uint8_t* msgs32,
268 const uint8_t* privkeys32,
269 uint8_t* sigs64_out);
270
284 ufsecp_ctx* ctx,
285 size_t count,
286 const uint8_t* msgs32,
287 const uint8_t* privkeys32,
288 const uint8_t* aux_rands32,
289 uint8_t* sigs64_out);
290
291/* ===========================================================================
292 * ECDH (Diffie-Hellman key agreement)
293 * =========================================================================== */
294
297 const uint8_t privkey[32],
298 const uint8_t pubkey33[33],
299 uint8_t secret32_out[32]);
300
303 const uint8_t privkey[32],
304 const uint8_t pubkey33[33],
305 uint8_t secret32_out[32]);
306
309 const uint8_t privkey[32],
310 const uint8_t pubkey33[33],
311 uint8_t secret32_out[32]);
312
313/* ===========================================================================
314 * Hashing
315 * =========================================================================== */
316
318UFSECP_API ufsecp_error_t ufsecp_sha256(const uint8_t* data, size_t len,
319 uint8_t digest32_out[32]);
320
322UFSECP_API ufsecp_error_t ufsecp_hash160(const uint8_t* data, size_t len,
323 uint8_t digest20_out[20]);
324
327 const uint8_t* data, size_t len,
328 uint8_t digest32_out[32]);
329
330/* ===========================================================================
331 * Bitcoin addresses
332 * =========================================================================== */
333
337 const uint8_t pubkey33[33],
338 int network,
339 char* addr_out, size_t* addr_len);
340
343 const uint8_t pubkey33[33],
344 int network,
345 char* addr_out, size_t* addr_len);
346
349 const uint8_t internal_key_x[32],
350 int network,
351 char* addr_out, size_t* addr_len);
352
356 const uint8_t* redeem_script, size_t redeem_script_len,
357 int network,
358 char* addr_out, size_t* addr_len);
359
363 ufsecp_ctx* ctx,
364 const uint8_t pubkey33[33],
365 int network,
366 char* addr_out, size_t* addr_len);
367
368/* ===========================================================================
369 * WIF (Wallet Import Format)
370 * =========================================================================== */
371
375 const uint8_t privkey[32],
376 int compressed, int network,
377 char* wif_out, size_t* wif_len);
378
381 const char* wif,
382 uint8_t privkey32_out[32],
383 int* compressed_out,
384 int* network_out);
385
386/* ===========================================================================
387 * BIP-32 (HD key derivation)
388 * =========================================================================== */
389
394typedef struct {
396 uint8_t is_private;
397 uint8_t _pad[3];
399
402 const uint8_t* seed, size_t seed_len,
403 ufsecp_bip32_key* key_out);
404
407 const ufsecp_bip32_key* parent,
408 uint32_t index,
409 ufsecp_bip32_key* child_out);
410
413 const ufsecp_bip32_key* master,
414 const char* path,
415 ufsecp_bip32_key* key_out);
416
419 const ufsecp_bip32_key* key,
420 uint8_t privkey32_out[32]);
421
424 const ufsecp_bip32_key* key,
425 uint8_t pubkey33_out[33]);
426
427/* ===========================================================================
428 * Taproot (BIP-341)
429 * =========================================================================== */
430
434 ufsecp_ctx* ctx,
435 const uint8_t internal_x[32],
436 const uint8_t* merkle_root,
437 uint8_t output_x_out[32],
438 int* parity_out);
439
442 ufsecp_ctx* ctx,
443 const uint8_t privkey[32],
444 const uint8_t* merkle_root,
445 uint8_t tweaked32_out[32]);
446
449 ufsecp_ctx* ctx,
450 const uint8_t output_x[32], int output_parity,
451 const uint8_t internal_x[32],
452 const uint8_t* merkle_root, size_t merkle_root_len);
453
454/* ===========================================================================
455 * BIP-143: SegWit v0 Sighash
456 * =========================================================================== */
457
467 ufsecp_ctx* ctx,
468 uint32_t version,
469 const uint8_t hash_prevouts[32],
470 const uint8_t hash_sequence[32],
471 const uint8_t outpoint_txid[32], uint32_t outpoint_vout,
472 const uint8_t* script_code, size_t script_code_len,
473 uint64_t value,
474 uint32_t sequence,
475 const uint8_t hash_outputs[32],
476 uint32_t locktime,
477 uint32_t sighash_type,
478 uint8_t sighash_out[32]);
479
482 const uint8_t pubkey_hash[20],
483 uint8_t script_code_out[25]);
484
485/* ===========================================================================
486 * BIP-144: Witness Transaction Serialization
487 * =========================================================================== */
488
493 ufsecp_ctx* ctx,
494 const uint8_t* raw_tx, size_t raw_tx_len,
495 uint8_t txid_out[32]);
496
499 ufsecp_ctx* ctx,
500 const uint8_t* raw_tx, size_t raw_tx_len,
501 uint8_t wtxid_out[32]);
502
505 const uint8_t witness_root[32],
506 const uint8_t witness_nonce[32],
507 uint8_t commitment_out[32]);
508
509/* ===========================================================================
510 * BIP-141: Segregated Witness — Witness Programs
511 * =========================================================================== */
512
515 const uint8_t* script, size_t script_len);
516
523 const uint8_t* script, size_t script_len,
524 int* version_out,
525 uint8_t* program_out, size_t* program_len_out);
526
529 const uint8_t pubkey_hash[20],
530 uint8_t spk_out[22]);
531
534 const uint8_t script_hash[32],
535 uint8_t spk_out[34]);
536
539 const uint8_t output_key[32],
540 uint8_t spk_out[34]);
541
544 const uint8_t* script, size_t script_len,
545 uint8_t hash_out[32]);
546
547/* ===========================================================================
548 * BIP-342: Tapscript Sighash
549 * =========================================================================== */
550
555 ufsecp_ctx* ctx,
556 uint32_t version, uint32_t locktime,
557 size_t input_count,
558 const uint8_t* prevout_txids, /* input_count*32 bytes, flattened */
559 const uint32_t* prevout_vouts,
560 const uint64_t* input_amounts,
561 const uint32_t* input_sequences,
562 const uint8_t* const* input_spks,
563 const size_t* input_spk_lens,
564 size_t output_count,
565 const uint64_t* output_values,
566 const uint8_t* const* output_spks,
567 const size_t* output_spk_lens,
568 size_t input_index,
569 uint8_t hash_type,
570 const uint8_t* annex, size_t annex_len,
571 uint8_t sighash_out[32]);
572
575 ufsecp_ctx* ctx,
576 uint32_t version, uint32_t locktime,
577 size_t input_count,
578 const uint8_t* prevout_txids,
579 const uint32_t* prevout_vouts,
580 const uint64_t* input_amounts,
581 const uint32_t* input_sequences,
582 const uint8_t* const* input_spks,
583 const size_t* input_spk_lens,
584 size_t output_count,
585 const uint64_t* output_values,
586 const uint8_t* const* output_spks,
587 const size_t* output_spk_lens,
588 size_t input_index,
589 uint8_t hash_type,
590 const uint8_t tapleaf_hash[32],
591 uint8_t key_version,
592 uint32_t code_separator_pos,
593 const uint8_t* annex, size_t annex_len,
594 uint8_t sighash_out[32]);
595
596/* ===========================================================================
597 * Ethereum (conditional: SECP256K1_BUILD_ETHEREUM)
598 * =========================================================================== */
599
600/* ===========================================================================
601 * Public key arithmetic
602 * =========================================================================== */
603
606 const uint8_t a33[33],
607 const uint8_t b33[33],
608 uint8_t out33[33]);
609
612 const uint8_t pubkey33[33],
613 uint8_t out33[33]);
614
617 const uint8_t pubkey33[33],
618 const uint8_t tweak[32],
619 uint8_t out33[33]);
620
623 const uint8_t pubkey33[33],
624 const uint8_t tweak[32],
625 uint8_t out33[33]);
626
631 const uint8_t* pubkeys,
632 size_t n,
633 uint8_t out33[33]);
634
635/* ===========================================================================
636 * BIP-39 (Mnemonic seed phrases)
637 * =========================================================================== */
638
645 size_t entropy_bytes,
646 const uint8_t* entropy_in,
647 char* mnemonic_out,
648 size_t* mnemonic_len);
649
653 const char* mnemonic);
654
658 const char* mnemonic,
659 const char* passphrase,
660 uint8_t seed64_out[64]);
661
666 const char* mnemonic,
667 uint8_t* entropy_out,
668 size_t* entropy_len);
669
670/* ===========================================================================
671 * Batch verification
672 * =========================================================================== */
673
678 ufsecp_ctx* ctx,
679 const uint8_t* entries, size_t n);
680
685 ufsecp_ctx* ctx,
686 const uint8_t* entries, size_t n);
687
692 ufsecp_ctx* ctx,
693 const uint8_t* entries, size_t n,
694 size_t* invalid_out, size_t* invalid_count);
695
700 ufsecp_ctx* ctx,
701 const uint8_t* entries, size_t n,
702 size_t* invalid_out, size_t* invalid_count);
703
704/* ===========================================================================
705 * SHA-512
706 * =========================================================================== */
707
709UFSECP_API ufsecp_error_t ufsecp_sha512(const uint8_t* data, size_t len,
710 uint8_t digest64_out[64]);
711
712/* ===========================================================================
713 * Multi-scalar multiplication
714 * =========================================================================== */
715
719 ufsecp_ctx* ctx,
720 const uint8_t a[32], const uint8_t P33[33],
721 const uint8_t b[32], const uint8_t Q33[33],
722 uint8_t out33[33]);
723
728 ufsecp_ctx* ctx,
729 const uint8_t* scalars, const uint8_t* points, size_t n,
730 uint8_t out33[33]);
731
732/* ===========================================================================
733 * MuSig2 (BIP-327 multi-signatures)
734 * =========================================================================== */
735
736#define UFSECP_MUSIG2_PUBNONCE_LEN 66
737#define UFSECP_MUSIG2_AGGNONCE_LEN 66
738#define UFSECP_MUSIG2_KEYAGG_LEN 165
739#define UFSECP_MUSIG2_SESSION_LEN 165
740#define UFSECP_MUSIG2_SECNONCE_LEN 64
746 ufsecp_ctx* ctx,
747 const uint8_t* pubkeys, size_t n,
748 uint8_t keyagg_out[UFSECP_MUSIG2_KEYAGG_LEN],
749 uint8_t agg_pubkey32_out[32]);
750
753 ufsecp_ctx* ctx,
754 const uint8_t privkey[32],
755 const uint8_t pubkey32[32],
756 const uint8_t agg_pubkey32[32],
757 const uint8_t msg32[32],
758 const uint8_t extra_in[32],
759 uint8_t secnonce_out[UFSECP_MUSIG2_SECNONCE_LEN],
760 uint8_t pubnonce_out[UFSECP_MUSIG2_PUBNONCE_LEN]);
761
767 ufsecp_ctx* ctx,
768 const uint8_t* pubnonces, size_t n,
769 uint8_t aggnonce_out[UFSECP_MUSIG2_AGGNONCE_LEN]);
770
777 ufsecp_ctx* ctx,
778 const uint8_t aggnonce[UFSECP_MUSIG2_AGGNONCE_LEN],
779 const uint8_t keyagg[UFSECP_MUSIG2_KEYAGG_LEN],
780 const uint8_t msg32[32],
781 uint8_t session_out[UFSECP_MUSIG2_SESSION_LEN]);
782
789 ufsecp_ctx* ctx,
790 uint8_t secnonce[UFSECP_MUSIG2_SECNONCE_LEN],
791 const uint8_t privkey[32],
792 const uint8_t keyagg[UFSECP_MUSIG2_KEYAGG_LEN],
793 const uint8_t session[UFSECP_MUSIG2_SESSION_LEN],
794 size_t signer_index,
795 uint8_t partial_sig32_out[32]);
796
802 ufsecp_ctx* ctx,
803 const uint8_t partial_sig32[32],
804 const uint8_t pubnonce[UFSECP_MUSIG2_PUBNONCE_LEN],
805 const uint8_t pubkey32[32],
806 const uint8_t keyagg[UFSECP_MUSIG2_KEYAGG_LEN],
807 const uint8_t session[UFSECP_MUSIG2_SESSION_LEN],
808 size_t signer_index);
809
814 ufsecp_ctx* ctx,
815 const uint8_t* partial_sigs, size_t n,
816 const uint8_t session[UFSECP_MUSIG2_SESSION_LEN],
817 uint8_t sig64_out[64]);
818
819/* ===========================================================================
820 * FROST (Threshold signatures)
821 * =========================================================================== */
822
823#define UFSECP_FROST_SHARE_LEN 36
824#define UFSECP_FROST_KEYPKG_LEN 141
825#define UFSECP_FROST_NONCE_LEN 64
826#define UFSECP_FROST_NONCE_COMMIT_LEN 70
835 ufsecp_ctx* ctx,
836 uint32_t participant_id, uint32_t threshold, uint32_t num_participants,
837 const uint8_t seed[32],
838 uint8_t* commits_out, size_t* commits_len,
839 uint8_t* shares_out, size_t* shares_len);
840
850 ufsecp_ctx* ctx,
851 uint32_t participant_id,
852 const uint8_t* all_commits, size_t commits_len,
853 const uint8_t* received_shares, size_t shares_len,
854 uint32_t threshold, uint32_t num_participants,
855 uint8_t keypkg_out[UFSECP_FROST_KEYPKG_LEN]);
856
860 ufsecp_ctx* ctx,
861 uint32_t participant_id,
862 const uint8_t nonce_seed[32],
863 uint8_t nonce_out[UFSECP_FROST_NONCE_LEN],
864 uint8_t nonce_commit_out[UFSECP_FROST_NONCE_COMMIT_LEN]);
865
872 ufsecp_ctx* ctx,
873 const uint8_t keypkg[UFSECP_FROST_KEYPKG_LEN],
874 const uint8_t nonce[UFSECP_FROST_NONCE_LEN],
875 const uint8_t msg32[32],
876 const uint8_t* nonce_commits, size_t n_signers,
877 uint8_t partial_sig_out[36]);
878
887 ufsecp_ctx* ctx,
888 const uint8_t partial_sig[36],
889 const uint8_t verification_share33[33],
890 const uint8_t* nonce_commits, size_t n_signers,
891 const uint8_t msg32[32],
892 const uint8_t group_pubkey33[33]);
893
902 ufsecp_ctx* ctx,
903 const uint8_t* partial_sigs, size_t n,
904 const uint8_t* nonce_commits, size_t n_signers,
905 const uint8_t group_pubkey33[33],
906 const uint8_t msg32[32],
907 uint8_t sig64_out[64]);
908
909/* ===========================================================================
910 * Adaptor signatures (Atomic swaps / DLCs)
911 * =========================================================================== */
912
913#define UFSECP_SCHNORR_ADAPTOR_SIG_LEN 97
914#define UFSECP_ECDSA_ADAPTOR_SIG_LEN 130
918 ufsecp_ctx* ctx,
919 const uint8_t privkey[32],
920 const uint8_t msg32[32],
921 const uint8_t adaptor_point33[33],
922 const uint8_t aux_rand[32],
923 uint8_t pre_sig_out[UFSECP_SCHNORR_ADAPTOR_SIG_LEN]);
924
927 ufsecp_ctx* ctx,
928 const uint8_t pre_sig[UFSECP_SCHNORR_ADAPTOR_SIG_LEN],
929 const uint8_t pubkey_x[32],
930 const uint8_t msg32[32],
931 const uint8_t adaptor_point33[33]);
932
935 ufsecp_ctx* ctx,
936 const uint8_t pre_sig[UFSECP_SCHNORR_ADAPTOR_SIG_LEN],
937 const uint8_t adaptor_secret[32],
938 uint8_t sig64_out[64]);
939
942 ufsecp_ctx* ctx,
943 const uint8_t pre_sig[UFSECP_SCHNORR_ADAPTOR_SIG_LEN],
944 const uint8_t sig64[64],
945 uint8_t secret32_out[32]);
946
949 ufsecp_ctx* ctx,
950 const uint8_t privkey[32],
951 const uint8_t msg32[32],
952 const uint8_t adaptor_point33[33],
953 uint8_t pre_sig_out[UFSECP_ECDSA_ADAPTOR_SIG_LEN]);
954
957 ufsecp_ctx* ctx,
958 const uint8_t pre_sig[UFSECP_ECDSA_ADAPTOR_SIG_LEN],
959 const uint8_t pubkey33[33],
960 const uint8_t msg32[32],
961 const uint8_t adaptor_point33[33]);
962
965 ufsecp_ctx* ctx,
966 const uint8_t pre_sig[UFSECP_ECDSA_ADAPTOR_SIG_LEN],
967 const uint8_t adaptor_secret[32],
968 uint8_t sig64_out[64]);
969
972 ufsecp_ctx* ctx,
973 const uint8_t pre_sig[UFSECP_ECDSA_ADAPTOR_SIG_LEN],
974 const uint8_t sig64[64],
975 uint8_t secret32_out[32]);
976
977/* ===========================================================================
978 * Pedersen commitments
979 * =========================================================================== */
980
984 ufsecp_ctx* ctx,
985 const uint8_t value[32],
986 const uint8_t blinding[32],
987 uint8_t commitment33_out[33]);
988
991 ufsecp_ctx* ctx,
992 const uint8_t commitment33[33],
993 const uint8_t value[32],
994 const uint8_t blinding[32]);
995
999 ufsecp_ctx* ctx,
1000 const uint8_t* pos, size_t n_pos,
1001 const uint8_t* neg, size_t n_neg);
1002
1006 ufsecp_ctx* ctx,
1007 const uint8_t* blinds_in, size_t n_in,
1008 const uint8_t* blinds_out, size_t n_out,
1009 uint8_t sum32_out[32]);
1010
1013 ufsecp_ctx* ctx,
1014 const uint8_t value[32],
1015 const uint8_t blinding[32],
1016 const uint8_t switch_blind[32],
1017 uint8_t commitment33_out[33]);
1018
1019/* ===========================================================================
1020 * Zero-knowledge proofs
1021 * =========================================================================== */
1022
1023#define UFSECP_ZK_KNOWLEDGE_PROOF_LEN 64
1024#define UFSECP_ZK_DLEQ_PROOF_LEN 64
1025#define UFSECP_ZK_RANGE_PROOF_MAX_LEN 688
1029 ufsecp_ctx* ctx,
1030 const uint8_t secret[32],
1031 const uint8_t pubkey33[33],
1032 const uint8_t msg32[32],
1033 const uint8_t aux_rand[32],
1034 uint8_t proof_out[UFSECP_ZK_KNOWLEDGE_PROOF_LEN]);
1035
1038 ufsecp_ctx* ctx,
1039 const uint8_t proof[UFSECP_ZK_KNOWLEDGE_PROOF_LEN],
1040 const uint8_t pubkey33[33],
1041 const uint8_t msg32[32]);
1042
1046 ufsecp_ctx* ctx,
1047 const uint8_t secret[32],
1048 const uint8_t G33[33], const uint8_t H33[33],
1049 const uint8_t P33[33], const uint8_t Q33[33],
1050 const uint8_t aux_rand[32],
1051 uint8_t proof_out[UFSECP_ZK_DLEQ_PROOF_LEN]);
1052
1055 ufsecp_ctx* ctx,
1056 const uint8_t proof[UFSECP_ZK_DLEQ_PROOF_LEN],
1057 const uint8_t G33[33], const uint8_t H33[33],
1058 const uint8_t P33[33], const uint8_t Q33[33]);
1059
1063 ufsecp_ctx* ctx,
1064 uint64_t value,
1065 const uint8_t blinding[32],
1066 const uint8_t commitment33[33],
1067 const uint8_t aux_rand[32],
1068 uint8_t* proof_out, size_t* proof_len);
1069
1073 ufsecp_ctx* ctx,
1074 const uint8_t commitment33[33],
1075 const uint8_t* proof, size_t proof_len);
1076
1077/* ===========================================================================
1078 * Multi-coin wallet infrastructure
1079 * =========================================================================== */
1080
1082#define UFSECP_COIN_ADDR_MAX_LEN 128
1083
1085#define UFSECP_COIN_BITCOIN 0
1086#define UFSECP_COIN_LITECOIN 2
1087#define UFSECP_COIN_DOGECOIN 3
1088#define UFSECP_COIN_DASH 5
1089#define UFSECP_COIN_ETHEREUM 60
1090#define UFSECP_COIN_BITCOIN_CASH 145
1091#define UFSECP_COIN_TRON 195
1092
1098 ufsecp_ctx* ctx,
1099 const uint8_t pubkey33[33],
1100 uint32_t coin_type, int testnet,
1101 char* addr_out, size_t* addr_len);
1102
1109 ufsecp_ctx* ctx,
1110 const uint8_t* seed, size_t seed_len,
1111 uint32_t coin_type, uint32_t account, int change, uint32_t index,
1112 int testnet,
1113 uint8_t* privkey32_out,
1114 uint8_t* pubkey33_out,
1115 char* addr_out, size_t* addr_len);
1116
1119 ufsecp_ctx* ctx,
1120 const uint8_t privkey[32],
1121 uint32_t coin_type, int testnet,
1122 char* wif_out, size_t* wif_len);
1123
1128 ufsecp_ctx* ctx,
1129 const uint8_t* msg, size_t msg_len,
1130 const uint8_t privkey[32],
1131 char* base64_out, size_t* base64_len);
1132
1136 ufsecp_ctx* ctx,
1137 const uint8_t* msg, size_t msg_len,
1138 const uint8_t pubkey33[33],
1139 const char* base64_sig);
1140
1143 const uint8_t* msg, size_t msg_len,
1144 uint8_t digest32_out[32]);
1145
1146/* ===========================================================================
1147 * BIP-352 Silent Payments
1148 * =========================================================================== */
1149
1158 ufsecp_ctx* ctx,
1159 const uint8_t scan_privkey[32],
1160 const uint8_t spend_privkey[32],
1161 uint8_t scan_pubkey33_out[33],
1162 uint8_t spend_pubkey33_out[33],
1163 char* addr_out, size_t* addr_len);
1164
1175 ufsecp_ctx* ctx,
1176 const uint8_t* input_privkeys, size_t n_inputs,
1177 const uint8_t scan_pubkey33[33],
1178 const uint8_t spend_pubkey33[33],
1179 uint32_t k,
1180 uint8_t output_pubkey33_out[33],
1181 uint8_t* tweak32_out);
1182
1194 ufsecp_ctx* ctx,
1195 const uint8_t scan_privkey[32],
1196 const uint8_t spend_privkey[32],
1197 const uint8_t* input_pubkeys33, size_t n_input_pubkeys,
1198 const uint8_t* output_xonly32, size_t n_outputs,
1199 uint32_t* found_indices_out,
1200 uint8_t* found_privkeys_out,
1201 size_t* n_found);
1202
1203/* ===========================================================================
1204 * ECIES (Elliptic Curve Integrated Encryption Scheme)
1205 * =========================================================================== */
1206
1208#define UFSECP_ECIES_OVERHEAD 81
1209
1216 ufsecp_ctx* ctx,
1217 const uint8_t recipient_pubkey33[33],
1218 const uint8_t* plaintext, size_t plaintext_len,
1219 uint8_t* envelope_out, size_t* envelope_len);
1220
1227 ufsecp_ctx* ctx,
1228 const uint8_t privkey[32],
1229 const uint8_t* envelope, size_t envelope_len,
1230 uint8_t* plaintext_out, size_t* plaintext_len);
1231
1232/* ========================================================================== */
1233/* BIP-324: Version 2 P2P Encrypted Transport (conditional: SECP256K1_BIP324) */
1234/* ========================================================================== */
1235#ifdef SECP256K1_BIP324
1236
1238typedef struct ufsecp_bip324_session ufsecp_bip324_session;
1239
1244UFSECP_API ufsecp_error_t ufsecp_bip324_create(
1245 ufsecp_ctx* ctx,
1246 int initiator,
1247 ufsecp_bip324_session** session_out,
1248 uint8_t ellswift64_out[64]);
1249
1253UFSECP_API ufsecp_error_t ufsecp_bip324_handshake(
1254 ufsecp_bip324_session* session,
1255 const uint8_t peer_ellswift64[64],
1256 uint8_t session_id32_out[32]);
1257
1262UFSECP_API ufsecp_error_t ufsecp_bip324_encrypt(
1263 ufsecp_bip324_session* session,
1264 const uint8_t* plaintext, size_t plaintext_len,
1265 uint8_t* out, size_t* out_len);
1266
1274UFSECP_API ufsecp_error_t ufsecp_bip324_decrypt(
1275 ufsecp_bip324_session* session,
1276 const uint8_t* encrypted, size_t encrypted_len,
1277 uint8_t* plaintext_out, size_t* plaintext_len);
1278
1280UFSECP_API void ufsecp_bip324_destroy(ufsecp_bip324_session* session);
1281
1289UFSECP_API ufsecp_error_t ufsecp_aead_chacha20_poly1305_encrypt(
1290 const uint8_t key[32], const uint8_t nonce[12],
1291 const uint8_t* aad, size_t aad_len,
1292 const uint8_t* plaintext, size_t plaintext_len,
1293 uint8_t* out, uint8_t tag[16]);
1294
1297UFSECP_API ufsecp_error_t ufsecp_aead_chacha20_poly1305_decrypt(
1298 const uint8_t key[32], const uint8_t nonce[12],
1299 const uint8_t* aad, size_t aad_len,
1300 const uint8_t* ciphertext, size_t ciphertext_len,
1301 const uint8_t tag[16], uint8_t* out);
1302
1306UFSECP_API ufsecp_error_t ufsecp_ellswift_create(
1307 ufsecp_ctx* ctx,
1308 const uint8_t privkey[32],
1309 uint8_t encoding64_out[64]);
1310
1317UFSECP_API ufsecp_error_t ufsecp_ellswift_xdh(
1318 ufsecp_ctx* ctx,
1319 const uint8_t ell_a64[64],
1320 const uint8_t ell_b64[64],
1321 const uint8_t our_privkey[32],
1322 int initiating,
1323 uint8_t secret32_out[32]);
1324
1325#endif /* SECP256K1_BIP324 */
1326
1327#ifdef SECP256K1_BUILD_ETHEREUM
1328
1330#define UFSECP_ETH_ADDR_LEN 20
1331
1334UFSECP_API ufsecp_error_t ufsecp_keccak256(const uint8_t* data, size_t len,
1335 uint8_t digest32_out[32]);
1336
1340UFSECP_API ufsecp_error_t ufsecp_eth_address(ufsecp_ctx* ctx,
1341 const uint8_t pubkey33[33],
1342 uint8_t addr20_out[20]);
1343
1347UFSECP_API ufsecp_error_t ufsecp_eth_address_checksummed(
1348 ufsecp_ctx* ctx,
1349 const uint8_t pubkey33[33],
1350 char* addr_out, size_t* addr_len);
1351
1355UFSECP_API ufsecp_error_t ufsecp_eth_personal_hash(const uint8_t* msg, size_t msg_len,
1356 uint8_t digest32_out[32]);
1357
1363UFSECP_API ufsecp_error_t ufsecp_eth_sign(ufsecp_ctx* ctx,
1364 const uint8_t msg32[32],
1365 const uint8_t privkey[32],
1366 uint8_t r_out[32],
1367 uint8_t s_out[32],
1368 uint64_t* v_out,
1369 uint64_t chain_id);
1370
1374UFSECP_API ufsecp_error_t ufsecp_eth_ecrecover(ufsecp_ctx* ctx,
1375 const uint8_t msg32[32],
1376 const uint8_t r[32],
1377 const uint8_t s[32],
1378 uint64_t v,
1379 uint8_t addr20_out[20]);
1380
1381#endif /* SECP256K1_BUILD_ETHEREUM */
1382
1383/* ===========================================================================
1384 * BIP-85 — Deterministic Entropy from BIP-32 Keychains
1385 * =========================================================================== */
1386
1394 ufsecp_ctx* ctx,
1395 const ufsecp_bip32_key* master_xprv,
1396 const char* path,
1397 uint8_t* entropy_out, size_t entropy_len);
1398
1405 ufsecp_ctx* ctx,
1406 const ufsecp_bip32_key* master_xprv,
1407 uint32_t words, uint32_t language_index, uint32_t index,
1408 char* mnemonic_out, size_t* mnemonic_len);
1409
1410/* ===========================================================================
1411 * BIP-340 Variable-Length Schnorr
1412 * =========================================================================== */
1413
1418 ufsecp_ctx* ctx,
1419 const uint8_t privkey[32],
1420 const uint8_t* msg, size_t msg_len,
1421 const uint8_t* aux_rand32,
1422 uint8_t sig64_out[64]);
1423
1426 ufsecp_ctx* ctx,
1427 const uint8_t pubkey_x[32],
1428 const uint8_t* msg, size_t msg_len,
1429 const uint8_t sig64[64]);
1430
1431/* ===========================================================================
1432 * BIP-322 — Generic Message Signing
1433 * =========================================================================== */
1434
1441
1448 ufsecp_ctx* ctx,
1449 const uint8_t privkey[32],
1450 ufsecp_bip322_addr_type addr_type,
1451 const uint8_t* msg, size_t msg_len,
1452 uint8_t* sig_out, size_t* sig_len);
1453
1459 ufsecp_ctx* ctx,
1460 const uint8_t* pubkey, size_t pubkey_len,
1461 ufsecp_bip322_addr_type addr_type,
1462 const uint8_t* msg, size_t msg_len,
1463 const uint8_t* sig, size_t sig_len);
1464
1465/* ===========================================================================
1466 * BIP-157/158 — Compact Block Filters (Golomb-Coded Set)
1467 * =========================================================================== */
1468
1477 const uint8_t key[16],
1478 const uint8_t** data, const size_t* data_sizes, size_t count,
1479 uint8_t* filter_out, size_t* filter_len);
1480
1484 const uint8_t key[16],
1485 const uint8_t* filter, size_t filter_len,
1486 size_t n_items,
1487 const uint8_t* item, size_t item_len);
1488
1492 const uint8_t key[16],
1493 const uint8_t* filter, size_t filter_len,
1494 size_t n_items,
1495 const uint8_t** query, const size_t* query_sizes, size_t query_count);
1496
1497/* ===========================================================================
1498 * BIP-174/370 — PSBT Signing Helpers
1499 * =========================================================================== */
1500
1502#define UFSECP_SIGHASH_ALL 0x01
1503#define UFSECP_SIGHASH_NONE 0x02
1504#define UFSECP_SIGHASH_SINGLE 0x03
1505#define UFSECP_SIGHASH_ANYONECANPAY 0x80
1506#define UFSECP_SIGHASH_DEFAULT 0x00 /* BIP-341 Taproot default */
1507
1514 ufsecp_ctx* ctx,
1515 const uint8_t sighash32[32],
1516 const uint8_t privkey[32],
1517 uint8_t sighash_type,
1518 uint8_t* sig_out, size_t* sig_len);
1519
1523 ufsecp_ctx* ctx,
1524 const uint8_t sighash32[32],
1525 const uint8_t privkey[32],
1526 uint8_t sighash_type,
1527 uint8_t* sig_out, size_t* sig_len);
1528
1532 ufsecp_ctx* ctx,
1533 const uint8_t sighash32[32],
1534 const uint8_t privkey[32],
1535 uint8_t sighash_type,
1536 const uint8_t* aux_rand32,
1537 uint8_t* sig_out, size_t* sig_len);
1538
1543 ufsecp_ctx* ctx,
1544 const ufsecp_bip32_key* master_xprv,
1545 const char* key_path,
1546 uint8_t privkey_out[32]);
1547
1548/* ===========================================================================
1549 * BIP-380..386 — Output Descriptors (key expression parser)
1550 * =========================================================================== */
1551
1559
1561typedef struct {
1563 uint8_t pubkey[33];
1564 uint8_t pubkey_len;
1566 char path[64];
1568
1576 ufsecp_ctx* ctx,
1577 const char* descriptor,
1578 uint32_t index,
1579 ufsecp_desc_key* key_out,
1580 char* addr_out, size_t* addr_len);
1581
1585 ufsecp_ctx* ctx,
1586 const char* descriptor,
1587 uint32_t index,
1588 char* addr_out, size_t* addr_len);
1589
1590#ifdef __cplusplus
1591}
1592
1593/* -- ABI layout guards (C++ only) ------------------------------------------ */
1594/* These fire at compile time if struct layout changes, preventing silent ABI */
1595/* breaks when bindings or cached objects assume a fixed layout. */
1596static_assert(sizeof(ufsecp_bip32_key) == 82,
1597 "ABI break: ufsecp_bip32_key size changed (expected 82)");
1598static_assert(UFSECP_BIP32_SERIALIZED_LEN == 78,
1599 "ABI break: UFSECP_BIP32_SERIALIZED_LEN changed (expected 78)");
1600static_assert(UFSECP_PRIVKEY_LEN == 32,
1601 "ABI break: UFSECP_PRIVKEY_LEN changed");
1602static_assert(UFSECP_PUBKEY_COMPRESSED_LEN == 33,
1603 "ABI break: UFSECP_PUBKEY_COMPRESSED_LEN changed");
1604static_assert(UFSECP_SIG_COMPACT_LEN == 64,
1605 "ABI break: UFSECP_SIG_COMPACT_LEN changed");
1606#else
1607/* C11 _Static_assert equivalent for pure-C consumers */
1608#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
1609_Static_assert(sizeof(ufsecp_bip32_key) == 82,
1610 "ABI break: ufsecp_bip32_key size changed (expected 82)");
1611#endif
1612#endif
1613
1614#endif /* UFSECP_H */
uint8_t is_private
Definition ufsecp.h:396
ufsecp_desc_type type
Definition ufsecp.h:1562
uint8_t pubkey_len
Definition ufsecp.h:1564
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:826
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_frost_sign(ufsecp_ctx *ctx, const uint8_t keypkg[UFSECP_FROST_KEYPKG_LEN], const 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])
Sign a FROST round-2 partial signature.
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:1023
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_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:740
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:55
UFSECP_API ufsecp_error_t ufsecp_last_error(const ufsecp_ctx *ctx)
#define UFSECP_ZK_DLEQ_PROOF_LEN
Definition ufsecp.h:1024
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:825
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:1552
@ UFSECP_DESC_PKH
Definition ufsecp.h:1554
@ UFSECP_DESC_WPKH
Definition ufsecp.h:1555
@ UFSECP_DESC_PK
Definition ufsecp.h:1553
@ UFSECP_DESC_SH_WPKH
Definition ufsecp.h:1557
@ UFSECP_DESC_TR
Definition ufsecp.h:1556
ufsecp_bip322_addr_type
Definition ufsecp.h:1435
@ UFSECP_BIP322_ADDR_P2PKH
Definition ufsecp.h:1436
@ UFSECP_BIP322_ADDR_P2TR
Definition ufsecp.h:1438
@ UFSECP_BIP322_ADDR_P2SH_P2WPKH
Definition ufsecp.h:1439
@ UFSECP_BIP322_ADDR_P2WPKH
Definition ufsecp.h:1437
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:738
#define UFSECP_PRIVKEY_LEN
Definition ufsecp.h:51
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:824
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_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:60
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:52
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:737
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:736
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:914
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:739
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_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:913
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