@ -5,6 +5,54 @@
extern " C " {
extern " C " {
# endif
# endif
# if !defined(SECP256K1_GNUC_PREREQ)
# if defined(__GNUC__)&&defined(__GNUC_MINOR__)
# define SECP256K1_GNUC_PREREQ(_maj,_min) \
( ( __GNUC__ < < 16 ) + __GNUC_MINOR__ > = ( ( _maj ) < < 16 ) + ( _min ) )
# else
# define SECP256K1_GNUC_PREREQ(_maj,_min) 0
# endif
# endif
# if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) )
# if SECP256K1_GNUC_PREREQ(3,0)
# define SECP256K1_RESTRICT __restrict__
# elif (defined(_MSC_VER) && _MSC_VER >= 1400)
# define SECP256K1_RESTRICT __restrict
# else
# define SECP256K1_RESTRICT
# endif
# else
# define SECP256K1_RESTRICT restrict
# endif
# if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) )
# if SECP256K1_GNUC_PREREQ(2,7)
# define SECP256K1_INLINE __inline__
# elif (defined(_MSC_VER))
# define SECP256K1_INLINE __inline
# else
# define SECP256K1_INLINE
# endif
# else
# define SECP256K1_INLINE inline
# endif
/**Warning attributes
* NONNULL is not used if SECP256K1_BUILD is set to avoid the compiler optimizing out
* some paranoid null checks . */
# if defined(__GNUC__) && SECP256K1_GNUC_PREREQ(3, 4)
# define SECP256K1_WARN_UNUSED_RESULT __attribute__ ((__warn_unused_result__))
# else
# define SECP256K1_WARN_UNUSED_RESULT
# endif
# if !defined(SECP256K1_BUILD) && defined(__GNUC__) && SECP256K1_GNUC_PREREQ(3, 4)
# define SECP256K1_ARG_NONNULL(_x) __attribute__ ((__nonnull__(_x)))
# else
# define SECP256K1_ARG_NONNULL(_x)
# endif
/** Flags to pass to secp256k1_start. */
/** Flags to pass to secp256k1_start. */
# define SECP256K1_START_VERIFY (1 << 0)
# define SECP256K1_START_VERIFY (1 << 0)
# define SECP256K1_START_SIGN (1 << 1)
# define SECP256K1_START_SIGN (1 << 1)
@ -34,9 +82,14 @@ void secp256k1_stop(void);
* pubkeylen : the length of pubkey
* pubkeylen : the length of pubkey
* Requires starting using SECP256K1_START_VERIFY .
* Requires starting using SECP256K1_START_VERIFY .
*/
*/
int secp256k1_ecdsa_verify ( const unsigned char * msg , int msglen ,
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify (
const unsigned char * sig , int siglen ,
const unsigned char * msg ,
const unsigned char * pubkey , int pubkeylen ) ;
int msglen ,
const unsigned char * sig ,
int siglen ,
const unsigned char * pubkey ,
int pubkeylen
) SECP256K1_ARG_NONNULL ( 1 ) SECP256K1_ARG_NONNULL ( 3 ) SECP256K1_ARG_NONNULL ( 5 ) ;
/** Create an ECDSA signature.
/** Create an ECDSA signature.
* Returns : 1 : signature created
* Returns : 1 : signature created
@ -50,10 +103,14 @@ int secp256k1_ecdsa_verify(const unsigned char *msg, int msglen,
* to contain the actual signature length ( < = 72 ) .
* to contain the actual signature length ( < = 72 ) .
* Requires starting using SECP256K1_START_SIGN .
* Requires starting using SECP256K1_START_SIGN .
*/
*/
int secp256k1_ecdsa_sign ( const unsigned char * msg , int msglen ,
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_sign (
unsigned char * sig , int * siglen ,
const unsigned char * msg ,
int msglen ,
unsigned char * sig ,
int * siglen ,
const unsigned char * seckey ,
const unsigned char * seckey ,
const unsigned char * nonce ) ;
const unsigned char * nonce
) SECP256K1_ARG_NONNULL ( 1 ) SECP256K1_ARG_NONNULL ( 3 ) SECP256K1_ARG_NONNULL ( 4 ) SECP256K1_ARG_NONNULL ( 5 ) SECP256K1_ARG_NONNULL ( 6 ) ;
/** Create a compact ECDSA signature (64 byte + recovery id).
/** Create a compact ECDSA signature (64 byte + recovery id).
* Returns : 1 : signature created
* Returns : 1 : signature created
@ -66,11 +123,14 @@ int secp256k1_ecdsa_sign(const unsigned char *msg, int msglen,
* recid : pointer to an int , which will be updated to contain the recovery id ( can be NULL )
* recid : pointer to an int , which will be updated to contain the recovery id ( can be NULL )
* Requires starting using SECP256K1_START_SIGN .
* Requires starting using SECP256K1_START_SIGN .
*/
*/
int secp256k1_ecdsa_sign_compact ( const unsigned char * msg , int msglen ,
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_sign_compact (
const unsigned char * msg ,
int msglen ,
unsigned char * sig64 ,
unsigned char * sig64 ,
const unsigned char * seckey ,
const unsigned char * seckey ,
const unsigned char * nonce ,
const unsigned char * nonce ,
int * recid ) ;
int * recid
) SECP256K1_ARG_NONNULL ( 1 ) SECP256K1_ARG_NONNULL ( 3 ) SECP256K1_ARG_NONNULL ( 4 ) SECP256K1_ARG_NONNULL ( 5 ) ;
/** Recover an ECDSA public key from a compact signature.
/** Recover an ECDSA public key from a compact signature.
* Returns : 1 : public key successfully recovered ( which guarantees a correct signature ) .
* Returns : 1 : public key successfully recovered ( which guarantees a correct signature ) .
@ -84,17 +144,22 @@ int secp256k1_ecdsa_sign_compact(const unsigned char *msg, int msglen,
* pubkeylen : pointer to an int that will contain the pubkey length ( cannot be NULL )
* pubkeylen : pointer to an int that will contain the pubkey length ( cannot be NULL )
* Requires starting using SECP256K1_START_VERIFY .
* Requires starting using SECP256K1_START_VERIFY .
*/
*/
int secp256k1_ecdsa_recover_compact ( const unsigned char * msg , int msglen ,
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_recover_compact (
const unsigned char * msg ,
int msglen ,
const unsigned char * sig64 ,
const unsigned char * sig64 ,
unsigned char * pubkey , int * pubkeylen ,
unsigned char * pubkey ,
int compressed , int recid ) ;
int * pubkeylen ,
int compressed ,
int recid
) SECP256K1_ARG_NONNULL ( 1 ) SECP256K1_ARG_NONNULL ( 3 ) SECP256K1_ARG_NONNULL ( 4 ) SECP256K1_ARG_NONNULL ( 5 ) ;
/** Verify an ECDSA secret key.
/** Verify an ECDSA secret key.
* Returns : 1 : secret key is valid
* Returns : 1 : secret key is valid
* 0 : secret key is invalid
* 0 : secret key is invalid
* In : seckey : pointer to a 32 - byte secret key ( cannot be NULL )
* In : seckey : pointer to a 32 - byte secret key ( cannot be NULL )
*/
*/
int secp256k1_ec_seckey_verify ( const unsigned char * seckey ) ;
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_verify ( const unsigned char * seckey ) SECP256K1_ARG_NONNULL ( 1 ) ;
/** Just validate a public key.
/** Just validate a public key.
* Returns : 1 : valid public key
* Returns : 1 : valid public key
@ -102,7 +167,7 @@ int secp256k1_ec_seckey_verify(const unsigned char *seckey);
* In : pubkey : pointer to a 33 - byte or 65 - byte public key ( cannot be NULL ) .
* In : pubkey : pointer to a 33 - byte or 65 - byte public key ( cannot be NULL ) .
* pubkeylen : length of pubkey
* pubkeylen : length of pubkey
*/
*/
int secp256k1_ec_pubkey_verify ( const unsigned char * pubkey , int pubkeylen ) ;
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_verify ( const unsigned char * pubkey , int pubkeylen ) SECP256K1_ARG_NONNULL ( 1 ) ;
/** Compute the public key for a secret key.
/** Compute the public key for a secret key.
* In : compressed : whether the computed public key should be compressed
* In : compressed : whether the computed public key should be compressed
@ -115,7 +180,12 @@ int secp256k1_ec_pubkey_verify(const unsigned char *pubkey, int pubkeylen);
* 0 : secret was invalid , try again .
* 0 : secret was invalid , try again .
* Requires starting using SECP256K1_START_SIGN .
* Requires starting using SECP256K1_START_SIGN .
*/
*/
int secp256k1_ec_pubkey_create ( unsigned char * pubkey , int * pubkeylen , const unsigned char * seckey , int compressed ) ;
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_create (
unsigned char * pubkey ,
int * pubkeylen ,
const unsigned char * seckey ,
int compressed
) SECP256K1_ARG_NONNULL ( 1 ) SECP256K1_ARG_NONNULL ( 2 ) SECP256K1_ARG_NONNULL ( 3 ) ;
/** Decompress a public key.
/** Decompress a public key.
* In / Out : pubkey : pointer to a 65 - byte array to put the decompressed public key .
* In / Out : pubkey : pointer to a 65 - byte array to put the decompressed public key .
@ -125,32 +195,55 @@ int secp256k1_ec_pubkey_create(unsigned char *pubkey, int *pubkeylen, const unsi
* Returns : 0 if the passed public key was invalid , 1 otherwise . If 1 is returned , the
* Returns : 0 if the passed public key was invalid , 1 otherwise . If 1 is returned , the
pubkey is replaced with its decompressed version .
pubkey is replaced with its decompressed version .
*/
*/
int secp256k1_ec_pubkey_decompress ( unsigned char * pubkey , int * pubkeylen ) ;
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_decompress (
unsigned char * pubkey ,
int * pubkeylen
) SECP256K1_ARG_NONNULL ( 1 ) SECP256K1_ARG_NONNULL ( 2 ) ;
/** Export a private key in DER format. */
/** Export a private key in DER format. */
int secp256k1_ec_privkey_export ( const unsigned char * seckey ,
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_export (
unsigned char * privkey , int * privkeylen ,
const unsigned char * seckey ,
int compressed ) ;
unsigned char * privkey ,
int * privkeylen ,
int compressed
) SECP256K1_ARG_NONNULL ( 1 ) SECP256K1_ARG_NONNULL ( 2 ) SECP256K1_ARG_NONNULL ( 3 ) ;
/** Import a private key in DER format. */
/** Import a private key in DER format. */
int secp256k1_ec_privkey_import ( unsigned char * seckey ,
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_import (
const unsigned char * privkey , int privkeylen ) ;
unsigned char * seckey ,
const unsigned char * privkey ,
int privkeylen
) SECP256K1_ARG_NONNULL ( 1 ) SECP256K1_ARG_NONNULL ( 2 ) ;
/** Tweak a private key by adding tweak to it. */
/** Tweak a private key by adding tweak to it. */
int secp256k1_ec_privkey_tweak_add ( unsigned char * seckey , const unsigned char * tweak ) ;
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_add (
unsigned char * seckey ,
const unsigned char * tweak
) SECP256K1_ARG_NONNULL ( 1 ) SECP256K1_ARG_NONNULL ( 2 ) ;
/** Tweak a public key by adding tweak times the generator to it.
/** Tweak a public key by adding tweak times the generator to it.
* Requires starting with SECP256K1_START_VERIFY .
* Requires starting with SECP256K1_START_VERIFY .
*/
*/
int secp256k1_ec_pubkey_tweak_add ( unsigned char * pubkey , int pubkeylen , const unsigned char * tweak ) ;
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_add (
unsigned char * pubkey ,
int pubkeylen ,
const unsigned char * tweak
) SECP256K1_ARG_NONNULL ( 1 ) SECP256K1_ARG_NONNULL ( 3 ) ;
/** Tweak a private key by multiplying it with tweak. */
/** Tweak a private key by multiplying it with tweak. */
int secp256k1_ec_privkey_tweak_mul ( unsigned char * seckey , const unsigned char * tweak ) ;
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_mul (
unsigned char * seckey ,
const unsigned char * tweak
) SECP256K1_ARG_NONNULL ( 1 ) SECP256K1_ARG_NONNULL ( 2 ) ;
/** Tweak a public key by multiplying it with tweak.
/** Tweak a public key by multiplying it with tweak.
* Requires starting with SECP256K1_START_VERIFY .
* Requires starting with SECP256K1_START_VERIFY .
*/
*/
int secp256k1_ec_pubkey_tweak_mul ( unsigned char * pubkey , int pubkeylen , const unsigned char * tweak ) ;
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_mul (
unsigned char * pubkey ,
int pubkeylen ,
const unsigned char * tweak
) SECP256K1_ARG_NONNULL ( 1 ) SECP256K1_ARG_NONNULL ( 3 ) ;
# ifdef __cplusplus
# ifdef __cplusplus
}
}