Fabcoin Core  0.16.2
P2P Digital Currency
secp256k1.h
Go to the documentation of this file.
1 #ifndef SECP256K1_H
2 #define SECP256K1_H
3 
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7 
8 #include <stddef.h>
9 
10 /* These rules specify the order of arguments in API calls:
11  *
12  * 1. Context pointers go first, followed by output arguments, combined
13  * output/input arguments, and finally input-only arguments.
14  * 2. Array lengths always immediately the follow the argument whose length
15  * they describe, even if this violates rule 1.
16  * 3. Within the OUT/OUTIN/IN groups, pointers to data that is typically generated
17  * later go first. This means: signatures, public nonces, private nonces,
18  * messages, public keys, secret keys, tweaks.
19  * 4. Arguments that are not data pointers go last, from more complex to less
20  * complex: function pointers, algorithm names, messages, void pointers,
21  * counts, flags, booleans.
22  * 5. Opaque data pointers follow the function pointer they are to be passed to.
23  */
24 
44 
53 typedef struct {
54  unsigned char data[64];
56 
66 typedef struct {
67  unsigned char data[64];
69 
86 typedef int (*secp256k1_nonce_function)(
87  unsigned char *nonce32,
88  const unsigned char *msg32,
89  const unsigned char *key32,
90  const unsigned char *algo16,
91  void *data,
92  unsigned int attempt
93 );
94 
95 # if !defined(SECP256K1_GNUC_PREREQ)
96 # if defined(__GNUC__)&&defined(__GNUC_MINOR__)
97 # define SECP256K1_GNUC_PREREQ(_maj,_min) \
98  ((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min))
99 # else
100 # define SECP256K1_GNUC_PREREQ(_maj,_min) 0
101 # endif
102 # endif
103 
104 # if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) )
105 # if SECP256K1_GNUC_PREREQ(2,7)
106 # define SECP256K1_INLINE __inline__
107 # elif (defined(_MSC_VER))
108 # define SECP256K1_INLINE __inline
109 # else
110 # define SECP256K1_INLINE
111 # endif
112 # else
113 # define SECP256K1_INLINE inline
114 # endif
115 
116 #ifndef SECP256K1_API
117 # if defined(_WIN32)
118 # ifdef SECP256K1_BUILD
119 # define SECP256K1_API __declspec(dllexport)
120 # else
121 # define SECP256K1_API
122 # endif
123 # elif defined(__GNUC__) && defined(SECP256K1_BUILD)
124 # define SECP256K1_API __attribute__ ((visibility ("default")))
125 # else
126 # define SECP256K1_API
127 # endif
128 #endif
129 
133 # if defined(__GNUC__) && SECP256K1_GNUC_PREREQ(3, 4)
134 # define SECP256K1_WARN_UNUSED_RESULT __attribute__ ((__warn_unused_result__))
135 # else
136 # define SECP256K1_WARN_UNUSED_RESULT
137 # endif
138 # if !defined(SECP256K1_BUILD) && defined(__GNUC__) && SECP256K1_GNUC_PREREQ(3, 4)
139 # define SECP256K1_ARG_NONNULL(_x) __attribute__ ((__nonnull__(_x)))
140 # else
141 # define SECP256K1_ARG_NONNULL(_x)
142 # endif
143 
145 #define SECP256K1_FLAGS_TYPE_MASK ((1 << 8) - 1)
146 #define SECP256K1_FLAGS_TYPE_CONTEXT (1 << 0)
147 #define SECP256K1_FLAGS_TYPE_COMPRESSION (1 << 1)
148 
149 #define SECP256K1_FLAGS_BIT_CONTEXT_VERIFY (1 << 8)
150 #define SECP256K1_FLAGS_BIT_CONTEXT_SIGN (1 << 9)
151 #define SECP256K1_FLAGS_BIT_COMPRESSION (1 << 8)
152 
154 #define SECP256K1_CONTEXT_VERIFY (SECP256K1_FLAGS_TYPE_CONTEXT | SECP256K1_FLAGS_BIT_CONTEXT_VERIFY)
155 #define SECP256K1_CONTEXT_SIGN (SECP256K1_FLAGS_TYPE_CONTEXT | SECP256K1_FLAGS_BIT_CONTEXT_SIGN)
156 #define SECP256K1_CONTEXT_NONE (SECP256K1_FLAGS_TYPE_CONTEXT)
157 
159 #define SECP256K1_EC_COMPRESSED (SECP256K1_FLAGS_TYPE_COMPRESSION | SECP256K1_FLAGS_BIT_COMPRESSION)
160 #define SECP256K1_EC_UNCOMPRESSED (SECP256K1_FLAGS_TYPE_COMPRESSION)
161 
163 #define SECP256K1_TAG_PUBKEY_EVEN 0x02
164 #define SECP256K1_TAG_PUBKEY_ODD 0x03
165 #define SECP256K1_TAG_PUBKEY_UNCOMPRESSED 0x04
166 #define SECP256K1_TAG_PUBKEY_HYBRID_EVEN 0x06
167 #define SECP256K1_TAG_PUBKEY_HYBRID_ODD 0x07
168 
177  unsigned int flags
179 
186  const secp256k1_context* ctx
187 ) SECP256K1_ARG_NONNULL(1) SECP256K1_WARN_UNUSED_RESULT;
188 
195  secp256k1_context* ctx
196 );
197 
219  secp256k1_context* ctx,
220  void (*fun)(const char* message, void* data),
221  const void* data
223 
241  secp256k1_context* ctx,
242  void (*fun)(const char* message, void* data),
243  const void* data
244 ) SECP256K1_ARG_NONNULL(1);
245 
260 SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_parse(
261  const secp256k1_context* ctx,
262  secp256k1_pubkey* pubkey,
263  const unsigned char *input,
264  size_t inputlen
265 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
266 
283  const secp256k1_context* ctx,
284  unsigned char *output,
285  size_t *outputlen,
286  const secp256k1_pubkey* pubkey,
287  unsigned int flags
288 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4);
289 
306  const secp256k1_context* ctx,
308  const unsigned char *input64
309 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
310 
327  const secp256k1_context* ctx,
329  const unsigned char *input,
330  size_t inputlen
331 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
332 
345  const secp256k1_context* ctx,
346  unsigned char *output,
347  size_t *outputlen,
348  const secp256k1_ecdsa_signature* sig
349 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4);
350 
361  const secp256k1_context* ctx,
362  unsigned char *output64,
363  const secp256k1_ecdsa_signature* sig
364 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
365 
384 SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify(
385  const secp256k1_context* ctx,
386  const secp256k1_ecdsa_signature *sig,
387  const unsigned char *msg32,
388  const secp256k1_pubkey *pubkey
389 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4);
390 
434  const secp256k1_context* ctx,
436  const secp256k1_ecdsa_signature *sigin
437 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(3);
438 
444 
447 
463  const secp256k1_context* ctx,
465  const unsigned char *msg32,
466  const unsigned char *seckey,
467  secp256k1_nonce_function noncefp,
468  const void *ndata
469 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4);
470 
478 SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_verify(
479  const secp256k1_context* ctx,
480  const unsigned char *seckey
481 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2);
482 
491 SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_create(
492  const secp256k1_context* ctx,
493  secp256k1_pubkey *pubkey,
494  const unsigned char *seckey
495 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
496 
503 SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_negate(
504  const secp256k1_context* ctx,
505  unsigned char *seckey
506 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2);
507 
514 SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_negate(
515  const secp256k1_context* ctx,
516  secp256k1_pubkey *pubkey
517 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2);
518 
528 SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_add(
529  const secp256k1_context* ctx,
530  unsigned char *seckey,
531  const unsigned char *tweak
532 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
533 
544 SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_add(
545  const secp256k1_context* ctx,
546  secp256k1_pubkey *pubkey,
547  const unsigned char *tweak
548 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
549 
557 SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_mul(
558  const secp256k1_context* ctx,
559  unsigned char *seckey,
560  const unsigned char *tweak
561 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
562 
571 SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_mul(
572  const secp256k1_context* ctx,
573  secp256k1_pubkey *pubkey,
574  const unsigned char *tweak
575 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
576 
596 SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_context_randomize(
597  secp256k1_context* ctx,
598  const unsigned char *seed32
599 ) SECP256K1_ARG_NONNULL(1);
600 
610 SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_combine(
611  const secp256k1_context* ctx,
612  secp256k1_pubkey *out,
613  const secp256k1_pubkey * const * ins,
614  size_t n
615 ) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
616 
617 #ifdef __cplusplus
618 }
619 #endif
620 
621 #endif /* SECP256K1_H */
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_add(const secp256k1_context *ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Tweak a public key by adding tweak times the generator to it.
Definition: secp256k1.c:477
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_mul(const secp256k1_context *ctx, unsigned char *seckey, const unsigned char *tweak) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Tweak a private key by multiplying it by a tweak.
Definition: secp256k1.c:501
SECP256K1_API void secp256k1_context_set_illegal_callback(secp256k1_context *ctx, void(*fun)(const char *message, void *data), const void *data) SECP256K1_ARG_NONNULL(1)
Set a callback function to be called when an illegal argument is passed to an API call...
Definition: secp256k1.c:101
SECP256K1_API int secp256k1_ecdsa_signature_serialize_compact(const secp256k1_context *ctx, unsigned char *output64, const secp256k1_ecdsa_signature *sig) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Serialize an ECDSA signature in compact (64 byte) format.
Definition: secp256k1.c:261
#define SECP256K1_WARN_UNUSED_RESULT
Warning attributes NONNULL is not used if SECP256K1_BUILD is set to avoid the compiler optimizing out...
Definition: secp256k1.h:136
SECP256K1_API int secp256k1_ecdsa_signature_normalize(const secp256k1_context *ctx, secp256k1_ecdsa_signature *sigout, const secp256k1_ecdsa_signature *sigin) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(3)
Convert a signature to a normalized lower-S form.
Definition: secp256k1.c:274
SECP256K1_API const secp256k1_nonce_function secp256k1_nonce_function_default
A default safe nonce generation function (currently equal to secp256k1_nonce_function_rfc6979).
Definition: secp256k1.c:343
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_context_randomize(secp256k1_context *ctx, const unsigned char *seed32) SECP256K1_ARG_NONNULL(1)
Updates the context randomization to protect against side-channel leakage.
Definition: secp256k1.c:547
SECP256K1_API int secp256k1_ec_pubkey_serialize(const secp256k1_context *ctx, unsigned char *output, size_t *outputlen, const secp256k1_pubkey *pubkey, unsigned int flags) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Serialize a pubkey object into a serialized byte sequence.
Definition: secp256k1.c:165
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_add(const secp256k1_context *ctx, unsigned char *seckey, const unsigned char *tweak) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Tweak a private key by adding tweak to it.
Definition: secp256k1.c:454
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_negate(const secp256k1_context *ctx, unsigned char *seckey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2)
Negates a private key in place.
Definition: secp256k1.c:427
SECP256K1_API const secp256k1_nonce_function secp256k1_nonce_function_rfc6979
An implementation of RFC6979 (using HMAC-SHA256) as nonce generation function.
Definition: secp256k1.c:342
SECP256K1_API void secp256k1_context_destroy(secp256k1_context *ctx)
Destroy a secp256k1 context object.
Definition: secp256k1.c:92
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_create(const secp256k1_context *ctx, secp256k1_pubkey *pubkey, const unsigned char *seckey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Compute the public key for a secret key.
Definition: secp256k1.c:404
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_verify(const secp256k1_context *ctx, const unsigned char *seckey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2)
Verify an ECDSA secret key.
Definition: secp256k1.c:391
SECP256K1_API int secp256k1_ecdsa_sign(const secp256k1_context *ctx, secp256k1_ecdsa_signature *sig, const unsigned char *msg32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void *ndata) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Create an ECDSA signature.
Definition: secp256k1.c:345
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_mul(const secp256k1_context *ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Tweak a public key by multiplying it by a tweak value.
Definition: secp256k1.c:523
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_parse(const secp256k1_context *ctx, secp256k1_pubkey *pubkey, const unsigned char *input, size_t inputlen) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Parse a variable-length public key into the pubkey object.
Definition: secp256k1.c:150
Opaque data structured that holds a parsed ECDSA signature.
Definition: secp256k1.h:66
SECP256K1_API void secp256k1_context_set_error_callback(secp256k1_context *ctx, void(*fun)(const char *message, void *data), const void *data) SECP256K1_ARG_NONNULL(1)
Set a callback function to be called when an internal consistency check fails.
Definition: secp256k1.c:109
SECP256K1_API int secp256k1_ecdsa_signature_parse_der(const secp256k1_context *ctx, secp256k1_ecdsa_signature *sig, const unsigned char *input, size_t inputlen) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Parse a DER ECDSA signature.
Definition: secp256k1.c:212
#define SECP256K1_ARG_NONNULL(_x)
Definition: secp256k1.h:141
SECP256K1_API secp256k1_context * secp256k1_context_clone(const secp256k1_context *ctx) SECP256K1_ARG_NONNULL(1) SECP256K1_WARN_UNUSED_RESULT
Copies a secp256k1 context object.
Definition: secp256k1.c:83
SECP256K1_API int secp256k1_ecdsa_signature_serialize_der(const secp256k1_context *ctx, unsigned char *output, size_t *outputlen, const secp256k1_ecdsa_signature *sig) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Serialize an ECDSA signature in DER format.
Definition: secp256k1.c:249
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_negate(const secp256k1_context *ctx, secp256k1_pubkey *pubkey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2)
Negates a public key in place.
Definition: secp256k1.c:439
int(* secp256k1_nonce_function)(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int attempt)
A pointer to a function to deterministically generate a nonce.
Definition: secp256k1.h:86
SECP256K1_API int secp256k1_ecdsa_signature_parse_compact(const secp256k1_context *ctx, secp256k1_ecdsa_signature *sig, const unsigned char *input64) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Parse an ECDSA signature in compact (64 bytes) format.
Definition: secp256k1.c:228
#define SECP256K1_API
Definition: secp256k1.h:126
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_combine(const secp256k1_context *ctx, secp256k1_pubkey *out, const secp256k1_pubkey *const *ins, size_t n) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Add a number of public keys together.
Definition: secp256k1.c:554
SECP256K1_API secp256k1_context * secp256k1_context_create(unsigned int flags) SECP256K1_WARN_UNUSED_RESULT
Create a secp256k1 context object.
Definition: secp256k1.c:58
uint8_t const * data
Definition: sha3.h:19
Opaque data structure that holds a parsed and valid public key.
Definition: secp256k1.h:53
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify(const secp256k1_context *ctx, const secp256k1_ecdsa_signature *sig, const unsigned char *msg32, const secp256k1_pubkey *pubkey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Verify an ECDSA signature.
Definition: secp256k1.c:293