| 
									
										
										
										
											2013-03-11 22:27:43 +01:00
										 |  |  | #ifndef _SECP256K1_
 | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  | # define _SECP256K1_
 | 
					
						
							| 
									
										
										
										
											2013-03-11 22:27:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  | # ifdef __cplusplus
 | 
					
						
							| 
									
										
										
										
											2013-03-31 06:34:15 +02:00
										 |  |  | extern "C" { | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  | # 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(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
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  | /** Opaque data structure that holds context information (precomputed tables etc.).
 | 
					
						
							|  |  |  |  *  Only functions that take a pointer to a non-const context require exclusive | 
					
						
							|  |  |  |  *  access to it. Multiple functions that take a pointer to a const context may | 
					
						
							|  |  |  |  *  run simultaneously. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | typedef struct secp256k1_context_struct secp256k1_context_t; | 
					
						
							| 
									
										
										
										
											2013-04-01 07:52:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  | /** Flags to pass to secp256k1_context_create. */ | 
					
						
							|  |  |  | # define SECP256K1_CONTEXT_VERIFY (1 << 0)
 | 
					
						
							|  |  |  | # define SECP256K1_CONTEXT_SIGN   (1 << 1)
 | 
					
						
							| 
									
										
										
										
											2014-09-08 23:09:06 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  | /** Create a secp256k1 context object.
 | 
					
						
							|  |  |  |  *  Returns: a newly created context object. | 
					
						
							|  |  |  |  *  In:      flags: which parts of the context to initialize. | 
					
						
							| 
									
										
										
										
											2013-04-14 22:44:45 +02:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  | secp256k1_context_t* secp256k1_context_create( | 
					
						
							|  |  |  |   int flags | 
					
						
							|  |  |  | ) SECP256K1_WARN_UNUSED_RESULT; | 
					
						
							| 
									
										
										
										
											2013-04-14 22:44:45 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-11 14:06:54 -05:00
										 |  |  | /** Copies a secp256k1 context object.
 | 
					
						
							|  |  |  |  *  Returns: a newly created context object. | 
					
						
							|  |  |  |  *  In:      ctx: an existing context to copy | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | secp256k1_context_t* secp256k1_context_clone( | 
					
						
							|  |  |  |   const secp256k1_context_t* ctx | 
					
						
							|  |  |  | ) SECP256K1_WARN_UNUSED_RESULT; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  | /** Destroy a secp256k1 context object.
 | 
					
						
							|  |  |  |  *  The context pointer may not be used afterwards. | 
					
						
							| 
									
										
										
										
											2013-04-14 22:44:45 +02:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  | void secp256k1_context_destroy( | 
					
						
							|  |  |  |   secp256k1_context_t* ctx | 
					
						
							|  |  |  | ) SECP256K1_ARG_NONNULL(1); | 
					
						
							| 
									
										
										
										
											2013-04-14 22:44:45 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** Verify an ECDSA signature.
 | 
					
						
							|  |  |  |  *  Returns: 1: correct signature | 
					
						
							|  |  |  |  *           0: incorrect signature | 
					
						
							|  |  |  |  *          -1: invalid public key | 
					
						
							|  |  |  |  *          -2: invalid signature | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  |  * In:       ctx:       a secp256k1 context object, initialized for verification. | 
					
						
							|  |  |  |  *           msg32:     the 32-byte message hash being verified (cannot be NULL) | 
					
						
							| 
									
										
										
										
											2014-11-11 15:21:47 -08:00
										 |  |  |  *           sig:       the signature being verified (cannot be NULL) | 
					
						
							|  |  |  |  *           siglen:    the length of the signature | 
					
						
							|  |  |  |  *           pubkey:    the public key to verify with (cannot be NULL) | 
					
						
							|  |  |  |  *           pubkeylen: the length of pubkey | 
					
						
							| 
									
										
										
										
											2013-04-14 22:44:45 +02:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  | SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify( | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  |   const secp256k1_context_t* ctx, | 
					
						
							| 
									
										
										
										
											2014-12-09 12:50:47 +01:00
										 |  |  |   const unsigned char *msg32, | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  |   const unsigned char *sig, | 
					
						
							|  |  |  |   int siglen, | 
					
						
							|  |  |  |   const unsigned char *pubkey, | 
					
						
							|  |  |  |   int pubkeylen | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  | ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(5); | 
					
						
							| 
									
										
										
										
											2013-04-14 22:44:45 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-12 18:11:39 +01:00
										 |  |  | /** A pointer to a function to deterministically generate a nonce.
 | 
					
						
							| 
									
										
										
										
											2015-02-02 02:16:29 +00:00
										 |  |  |  * Returns: 1 if a nonce was successfully generated. 0 will cause signing to fail. | 
					
						
							| 
									
										
										
										
											2014-12-12 18:11:39 +01:00
										 |  |  |  * In:      msg32:     the 32-byte message hash being verified (will not be NULL) | 
					
						
							|  |  |  |  *          key32:     pointer to a 32-byte secret key (will not be NULL) | 
					
						
							|  |  |  |  *          attempt:   how many iterations we have tried to find a nonce. | 
					
						
							|  |  |  |  *                     This will almost always be 0, but different attempt values | 
					
						
							|  |  |  |  *                     are required to result in a different nonce. | 
					
						
							|  |  |  |  *          data:      Arbitrary data pointer that is passed through. | 
					
						
							|  |  |  |  * Out:     nonce32:   pointer to a 32-byte array to be filled by the function. | 
					
						
							|  |  |  |  * Except for test cases, this function should compute some cryptographic hash of | 
					
						
							| 
									
										
										
										
											2014-12-13 18:06:33 +01:00
										 |  |  |  * the message, the key and the attempt. | 
					
						
							| 
									
										
										
										
											2014-12-12 18:11:39 +01:00
										 |  |  |  */ | 
					
						
							|  |  |  | typedef int (*secp256k1_nonce_function_t)( | 
					
						
							|  |  |  |   unsigned char *nonce32, | 
					
						
							|  |  |  |   const unsigned char *msg32, | 
					
						
							|  |  |  |   const unsigned char *key32, | 
					
						
							|  |  |  |   unsigned int attempt, | 
					
						
							|  |  |  |   const void *data | 
					
						
							|  |  |  | ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-20 09:19:38 -07:00
										 |  |  | /** An implementation of RFC6979 (using HMAC-SHA256) as nonce generation function.
 | 
					
						
							|  |  |  |  * If a data pointer is passed, it is assumed to be a pointer to 32 bytes of | 
					
						
							|  |  |  |  * extra entropy. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2014-12-13 18:06:33 +01:00
										 |  |  | extern const secp256k1_nonce_function_t secp256k1_nonce_function_rfc6979; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** A default safe nonce generation function (currently equal to secp256k1_nonce_function_rfc6979). */ | 
					
						
							|  |  |  | extern const secp256k1_nonce_function_t secp256k1_nonce_function_default; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-05 00:49:30 +02:00
										 |  |  | /** Create an ECDSA signature.
 | 
					
						
							|  |  |  |  *  Returns: 1: signature created | 
					
						
							| 
									
										
										
										
											2015-02-12 18:00:50 -08:00
										 |  |  |  *           0: the nonce generation function failed, the private key was invalid, or there is not | 
					
						
							|  |  |  |  *              enough space in the signature (as indicated by siglen). | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  |  *  In:      ctx:    pointer to a context object, initialized for signing (cannot be NULL) | 
					
						
							|  |  |  |  *           msg32:  the 32-byte message hash being signed (cannot be NULL) | 
					
						
							| 
									
										
										
										
											2015-02-12 18:00:50 -08:00
										 |  |  |  *           seckey: pointer to a 32-byte secret key (cannot be NULL) | 
					
						
							| 
									
										
										
										
											2014-12-13 18:06:33 +01:00
										 |  |  |  *           noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used | 
					
						
							| 
									
										
										
										
											2014-12-12 18:11:39 +01:00
										 |  |  |  *           ndata:  pointer to arbitrary data used by the nonce generation function (can be NULL) | 
					
						
							| 
									
										
										
										
											2014-11-11 15:21:47 -08:00
										 |  |  |  *  Out:     sig:    pointer to an array where the signature will be placed (cannot be NULL) | 
					
						
							|  |  |  |  *  In/Out:  siglen: pointer to an int with the length of sig, which will be updated | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  |  *                   to contain the actual signature length (<=72). | 
					
						
							| 
									
										
										
										
											2015-02-02 02:16:29 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * The sig always has an s value in the lower half of the range (From 0x1 | 
					
						
							|  |  |  |  * to 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, | 
					
						
							|  |  |  |  * inclusive), unlike many other implementations. | 
					
						
							|  |  |  |  * With ECDSA a third-party can can forge a second distinct signature | 
					
						
							|  |  |  |  * of the same message given a single initial signature without knowing | 
					
						
							|  |  |  |  * the key by setting s to its additive inverse mod-order, 'flipping' the | 
					
						
							|  |  |  |  * sign of the random point R which is not included in the signature. | 
					
						
							|  |  |  |  * Since the forgery is of the same message this isn't universally | 
					
						
							|  |  |  |  * problematic, but in systems where message malleability or uniqueness | 
					
						
							|  |  |  |  * of signatures is important this can cause issues.  This forgery can be | 
					
						
							|  |  |  |  * blocked by all verifiers forcing signers to use a canonical form. The | 
					
						
							|  |  |  |  * lower-S form reduces the size of signatures slightly on average when | 
					
						
							|  |  |  |  * variable length encodings (such as DER) are used and is cheap to | 
					
						
							|  |  |  |  * verify, making it a good choice. Security of always using lower-S is | 
					
						
							|  |  |  |  * assured because anyone can trivially modify a signature after the | 
					
						
							|  |  |  |  * fact to enforce this property.  Adjusting it inside the signing | 
					
						
							|  |  |  |  * function avoids the need to re-serialize or have curve specific | 
					
						
							|  |  |  |  * constants outside of the library.  By always using a canonical form | 
					
						
							|  |  |  |  * even in applications where it isn't needed it becomes possible to | 
					
						
							|  |  |  |  * impose a requirement later if a need is discovered. | 
					
						
							|  |  |  |  * No other forms of ECDSA malleability are known and none seem likely, | 
					
						
							|  |  |  |  * but there is no formal proof that ECDSA, even with this additional | 
					
						
							|  |  |  |  * restriction, is free of other malleability.  Commonly used serialization | 
					
						
							|  |  |  |  * schemes will also accept various non-unique encodings, so care should | 
					
						
							|  |  |  |  * be taken when this property is required for an application. | 
					
						
							| 
									
										
										
										
											2013-05-05 00:49:30 +02:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2014-12-12 18:11:39 +01:00
										 |  |  | int secp256k1_ecdsa_sign( | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  |   const secp256k1_context_t* ctx, | 
					
						
							| 
									
										
										
										
											2014-12-09 12:50:47 +01:00
										 |  |  |   const unsigned char *msg32, | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  |   unsigned char *sig, | 
					
						
							|  |  |  |   int *siglen, | 
					
						
							|  |  |  |   const unsigned char *seckey, | 
					
						
							| 
									
										
										
										
											2014-12-12 18:11:39 +01:00
										 |  |  |   secp256k1_nonce_function_t noncefp, | 
					
						
							|  |  |  |   const void *ndata | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  | ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5); | 
					
						
							| 
									
										
										
										
											2013-05-05 00:21:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-05 02:46:07 +02:00
										 |  |  | /** Create a compact ECDSA signature (64 byte + recovery id).
 | 
					
						
							|  |  |  |  *  Returns: 1: signature created | 
					
						
							| 
									
										
										
										
											2015-02-12 18:00:50 -08:00
										 |  |  |  *           0: the nonce generation function failed, or the secret key was invalid. | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  |  *  In:      ctx:    pointer to a context object, initialized for signing (cannot be NULL) | 
					
						
							|  |  |  |  *           msg32:  the 32-byte message hash being signed (cannot be NULL) | 
					
						
							| 
									
										
										
										
											2015-02-12 18:00:50 -08:00
										 |  |  |  *           seckey: pointer to a 32-byte secret key (cannot be NULL) | 
					
						
							| 
									
										
										
										
											2014-12-13 18:06:33 +01:00
										 |  |  |  *           noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used | 
					
						
							| 
									
										
										
										
											2014-12-12 18:11:39 +01:00
										 |  |  |  *           ndata:  pointer to arbitrary data used by the nonce generation function (can be NULL) | 
					
						
							| 
									
										
										
										
											2014-11-11 15:21:47 -08:00
										 |  |  |  *  Out:     sig:    pointer to a 64-byte array where the signature will be placed (cannot be NULL) | 
					
						
							| 
									
										
										
										
											2015-02-12 18:00:50 -08:00
										 |  |  |  *                   In case 0 is returned, the returned signature length will be zero. | 
					
						
							| 
									
										
										
										
											2014-11-11 15:21:47 -08:00
										 |  |  |  *           recid:  pointer to an int, which will be updated to contain the recovery id (can be NULL) | 
					
						
							| 
									
										
										
										
											2013-05-05 02:46:07 +02:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2014-12-12 18:11:39 +01:00
										 |  |  | int secp256k1_ecdsa_sign_compact( | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  |   const secp256k1_context_t* ctx, | 
					
						
							| 
									
										
										
										
											2014-12-09 12:50:47 +01:00
										 |  |  |   const unsigned char *msg32, | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  |   unsigned char *sig64, | 
					
						
							|  |  |  |   const unsigned char *seckey, | 
					
						
							| 
									
										
										
										
											2014-12-12 18:11:39 +01:00
										 |  |  |   secp256k1_nonce_function_t noncefp, | 
					
						
							|  |  |  |   const void *ndata, | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  |   int *recid | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  | ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); | 
					
						
							| 
									
										
										
										
											2013-05-05 02:46:07 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 23:37:48 +02:00
										 |  |  | /** Recover an ECDSA public key from a compact signature.
 | 
					
						
							| 
									
										
										
										
											2014-11-11 15:21:47 -08:00
										 |  |  |  *  Returns: 1: public key successfully recovered (which guarantees a correct signature). | 
					
						
							| 
									
										
										
										
											2013-05-11 23:37:48 +02:00
										 |  |  |  *           0: otherwise. | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  |  *  In:      ctx:        pointer to a context object, initialized for verification (cannot be NULL) | 
					
						
							|  |  |  |  *           msg32:      the 32-byte message hash assumed to be signed (cannot be NULL) | 
					
						
							| 
									
										
										
										
											2014-11-11 15:21:47 -08:00
										 |  |  |  *           sig64:      signature as 64 byte array (cannot be NULL) | 
					
						
							| 
									
										
										
										
											2013-05-11 23:37:48 +02:00
										 |  |  |  *           compressed: whether to recover a compressed or uncompressed pubkey | 
					
						
							| 
									
										
										
										
											2014-11-11 15:21:47 -08:00
										 |  |  |  *           recid:      the recovery id (0-3, as returned by ecdsa_sign_compact) | 
					
						
							|  |  |  |  *  Out:     pubkey:     pointer to a 33 or 65 byte array to put the pubkey (cannot be NULL) | 
					
						
							|  |  |  |  *           pubkeylen:  pointer to an int that will contain the pubkey length (cannot be NULL) | 
					
						
							| 
									
										
										
										
											2013-05-11 23:37:48 +02:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  | SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_recover_compact( | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  |   const secp256k1_context_t* ctx, | 
					
						
							| 
									
										
										
										
											2014-12-09 12:50:47 +01:00
										 |  |  |   const unsigned char *msg32, | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  |   const unsigned char *sig64, | 
					
						
							|  |  |  |   unsigned char *pubkey, | 
					
						
							|  |  |  |   int *pubkeylen, | 
					
						
							|  |  |  |   int compressed, | 
					
						
							|  |  |  |   int recid | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  | ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5); | 
					
						
							| 
									
										
										
										
											2013-05-05 00:49:30 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** Verify an ECDSA secret key.
 | 
					
						
							|  |  |  |  *  Returns: 1: secret key is valid | 
					
						
							|  |  |  |  *           0: secret key is invalid | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  |  *  In:      ctx: pointer to a context object (cannot be NULL) | 
					
						
							|  |  |  |  *           seckey: pointer to a 32-byte secret key (cannot be NULL) | 
					
						
							| 
									
										
										
										
											2013-05-05 00:49:30 +02:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  | SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_verify( | 
					
						
							|  |  |  |   const secp256k1_context_t* ctx, | 
					
						
							|  |  |  |   const unsigned char *seckey | 
					
						
							|  |  |  | ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2); | 
					
						
							| 
									
										
										
										
											2013-05-05 00:21:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  | /** Just validate a public key.
 | 
					
						
							| 
									
										
										
										
											2015-04-10 16:33:33 +10:00
										 |  |  |  *  Returns: 1: public key is valid | 
					
						
							|  |  |  |  *           0: public key is invalid | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  |  *  In:      ctx:       pointer to a context object (cannot be NULL) | 
					
						
							|  |  |  |  *           pubkey:    pointer to a 33-byte or 65-byte public key (cannot be NULL). | 
					
						
							| 
									
										
										
										
											2014-11-11 15:21:47 -08:00
										 |  |  |  *           pubkeylen: length of pubkey | 
					
						
							| 
									
										
										
										
											2013-04-14 22:44:45 +02:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  | SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_verify( | 
					
						
							|  |  |  |   const secp256k1_context_t* ctx, | 
					
						
							|  |  |  |   const unsigned char *pubkey, | 
					
						
							|  |  |  |   int pubkeylen | 
					
						
							|  |  |  | ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2); | 
					
						
							| 
									
										
										
										
											2013-04-14 22:44:45 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** Compute the public key for a secret key.
 | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  |  *  In:     ctx:        pointer to a context object, initialized for signing (cannot be NULL) | 
					
						
							|  |  |  |  *          compressed: whether the computed public key should be compressed | 
					
						
							| 
									
										
										
										
											2014-11-11 15:21:47 -08:00
										 |  |  |  *          seckey:     pointer to a 32-byte private key (cannot be NULL) | 
					
						
							| 
									
										
										
										
											2013-04-14 22:44:45 +02:00
										 |  |  |  *  Out:    pubkey:     pointer to a 33-byte (if compressed) or 65-byte (if uncompressed) | 
					
						
							| 
									
										
										
										
											2014-11-11 15:21:47 -08:00
										 |  |  |  *                      area to store the public key (cannot be NULL) | 
					
						
							| 
									
										
										
										
											2013-05-05 00:21:03 +02:00
										 |  |  |  *          pubkeylen:  pointer to int that will be updated to contains the pubkey's | 
					
						
							| 
									
										
										
										
											2014-11-11 15:21:47 -08:00
										 |  |  |  *                      length (cannot be NULL) | 
					
						
							| 
									
										
										
										
											2013-04-14 22:44:45 +02:00
										 |  |  |  *  Returns: 1: secret was valid, public key stores | 
					
						
							| 
									
										
										
										
											2015-04-10 16:33:33 +10:00
										 |  |  |  *           0: secret was invalid, try again | 
					
						
							| 
									
										
										
										
											2013-04-14 22:44:45 +02:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  | SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_create( | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  |   const secp256k1_context_t* ctx, | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  |   unsigned char *pubkey, | 
					
						
							|  |  |  |   int *pubkeylen, | 
					
						
							|  |  |  |   const unsigned char *seckey, | 
					
						
							|  |  |  |   int compressed | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  | ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); | 
					
						
							| 
									
										
										
										
											2014-10-27 02:51:58 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** Decompress a public key.
 | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  |  * In:     ctx:       pointer to a context object (cannot be NULL) | 
					
						
							| 
									
										
										
										
											2014-10-27 02:51:58 -07:00
										 |  |  |  * In/Out: pubkey:    pointer to a 65-byte array to put the decompressed public key. | 
					
						
							| 
									
										
										
										
											2015-04-10 16:33:33 +10:00
										 |  |  |  *                    It must contain a 33-byte or 65-byte public key already (cannot be NULL) | 
					
						
							| 
									
										
										
										
											2014-11-11 15:21:47 -08:00
										 |  |  |  *         pubkeylen: pointer to the size of the public key pointed to by pubkey (cannot be NULL) | 
					
						
							| 
									
										
										
										
											2015-04-10 16:33:33 +10:00
										 |  |  |  *                    It will be updated to reflect the new size. | 
					
						
							|  |  |  |  * Returns: 0: pubkey was invalid | 
					
						
							|  |  |  |  *          1: pubkey was valid, and was replaced with its decompressed version | 
					
						
							| 
									
										
										
										
											2014-10-27 02:51:58 -07:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  | SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_decompress( | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  |   const secp256k1_context_t* ctx, | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  |   unsigned char *pubkey, | 
					
						
							|  |  |  |   int *pubkeylen | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  | ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); | 
					
						
							| 
									
										
										
										
											2014-10-27 02:51:58 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  | /** Export a private key in DER format.
 | 
					
						
							|  |  |  |  * In: ctx: pointer to a context object, initialized for signing (cannot be NULL) | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  | SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_export( | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  |   const secp256k1_context_t* ctx, | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  |   const unsigned char *seckey, | 
					
						
							|  |  |  |   unsigned char *privkey, | 
					
						
							|  |  |  |   int *privkeylen, | 
					
						
							|  |  |  |   int compressed | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  | ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); | 
					
						
							| 
									
										
										
										
											2013-05-05 00:21:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-27 02:51:58 -07:00
										 |  |  | /** Import a private key in DER format. */ | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  | SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_import( | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  |   const secp256k1_context_t* ctx, | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  |   unsigned char *seckey, | 
					
						
							|  |  |  |   const unsigned char *privkey, | 
					
						
							|  |  |  |   int privkeylen | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  | ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); | 
					
						
							| 
									
										
										
										
											2013-04-01 07:52:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-27 02:51:58 -07:00
										 |  |  | /** Tweak a private key by adding tweak to it. */ | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  | SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_add( | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  |   const secp256k1_context_t* ctx, | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  |   unsigned char *seckey, | 
					
						
							|  |  |  |   const unsigned char *tweak | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  | ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); | 
					
						
							| 
									
										
										
										
											2013-05-05 05:12:43 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-27 02:51:58 -07:00
										 |  |  | /** Tweak a public key by adding tweak times the generator to it.
 | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  |  * In: ctx: pointer to a context object, initialized for verification (cannot be NULL) | 
					
						
							| 
									
										
										
										
											2014-10-27 02:51:58 -07:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  | SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_add( | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  |   const secp256k1_context_t* ctx, | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  |   unsigned char *pubkey, | 
					
						
							|  |  |  |   int pubkeylen, | 
					
						
							|  |  |  |   const unsigned char *tweak | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  | ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(4); | 
					
						
							| 
									
										
										
										
											2013-05-05 05:12:43 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-27 02:51:58 -07:00
										 |  |  | /** Tweak a private key by multiplying it with tweak. */ | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  | SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_mul( | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  |   const secp256k1_context_t* ctx, | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  |   unsigned char *seckey, | 
					
						
							|  |  |  |   const unsigned char *tweak | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  | ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); | 
					
						
							| 
									
										
										
										
											2014-10-27 02:51:58 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** Tweak a public key by multiplying it with tweak.
 | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  |  * In: ctx: pointer to a context object, initialized for verification (cannot be NULL) | 
					
						
							| 
									
										
										
										
											2014-10-27 02:51:58 -07:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  | SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_mul( | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  |   const secp256k1_context_t* ctx, | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  |   unsigned char *pubkey, | 
					
						
							|  |  |  |   int pubkeylen, | 
					
						
							|  |  |  |   const unsigned char *tweak | 
					
						
							| 
									
										
										
										
											2015-02-03 17:27:00 -08:00
										 |  |  | ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(4); | 
					
						
							| 
									
										
										
										
											2013-05-11 23:37:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  | # ifdef __cplusplus
 | 
					
						
							| 
									
										
										
										
											2013-03-11 22:27:43 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-11-12 12:05:42 -08:00
										 |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2013-03-11 22:27:43 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #endif
 |