-
Notifications
You must be signed in to change notification settings - Fork 1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
9f443be Move pubkey recovery code to separate module (Pieter Wuille) d49abbd Separate ECDSA recovery tests (Pieter Wuille) 439d34a Separate recoverable and normal signatures (Pieter Wuille)
- Loading branch information
Showing
12 changed files
with
580 additions
and
346 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,110 @@ | ||
#ifndef _SECP256K1_RECOVERY_ | ||
# define _SECP256K1_RECOVERY_ | ||
|
||
# include "secp256k1.h" | ||
|
||
# ifdef __cplusplus | ||
extern "C" { | ||
# endif | ||
|
||
/** Opaque data structured that holds a parsed ECDSA signature, | ||
* supporting pubkey recovery. | ||
* | ||
* The exact representation of data inside is implementation defined and not | ||
* guaranteed to be portable between different platforms or versions. It is | ||
* however guaranteed to be 65 bytes in size, and can be safely copied/moved. | ||
* If you need to convert to a format suitable for storage or transmission, use | ||
* the secp256k1_ecdsa_signature_serialize_* and | ||
* secp256k1_ecdsa_signature_serialize_* functions. | ||
* | ||
* Furthermore, it is guaranteed to identical signatures (including their | ||
* recoverability) will have identical representation, so they can be | ||
* memcmp'ed. | ||
*/ | ||
typedef struct { | ||
unsigned char data[65]; | ||
} secp256k1_ecdsa_recoverable_signature_t; | ||
|
||
/** Parse a compact ECDSA signature (64 bytes + recovery id). | ||
* | ||
* Returns: 1 when the signature could be parsed, 0 otherwise | ||
* In: ctx: a secp256k1 context object | ||
* input64: a pointer to a 64-byte compact signature | ||
* recid: the recovery id (0, 1, 2 or 3) | ||
* Out: sig: a pointer to a signature object | ||
*/ | ||
int secp256k1_ecdsa_recoverable_signature_parse_compact( | ||
const secp256k1_context_t* ctx, | ||
secp256k1_ecdsa_recoverable_signature_t* sig, | ||
const unsigned char *input64, | ||
int recid | ||
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); | ||
|
||
/** Convert a recoverable signature into a normal signature. | ||
* | ||
* Returns: 1 | ||
* In: sigin: a pointer to a recoverable signature (cannot be NULL). | ||
* Out: sig: a pointer to a normal signature (cannot be NULL). | ||
*/ | ||
int secp256k1_ecdsa_recoverable_signature_convert( | ||
const secp256k1_context_t* ctx, | ||
secp256k1_ecdsa_signature_t* sig, | ||
const secp256k1_ecdsa_recoverable_signature_t* sigin | ||
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); | ||
|
||
/** Serialize an ECDSA signature in compact format (64 bytes + recovery id). | ||
* | ||
* Returns: 1 | ||
* In: ctx: a secp256k1 context object | ||
* sig: a pointer to an initialized signature object (cannot be NULL) | ||
* Out: output64: a pointer to a 64-byte array of the compact signature (cannot be NULL) | ||
* recid: a pointer to an integer to hold the recovery id (can be NULL). | ||
*/ | ||
int secp256k1_ecdsa_recoverable_signature_serialize_compact( | ||
const secp256k1_context_t* ctx, | ||
unsigned char *output64, | ||
int *recid, | ||
const secp256k1_ecdsa_recoverable_signature_t* sig | ||
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(4); | ||
|
||
/** Create a recoverable ECDSA signature. | ||
* | ||
* Returns: 1: signature created | ||
* 0: the nonce generation function failed, or the private key was invalid. | ||
* In: ctx: pointer to a context object, initialized for signing (cannot be NULL) | ||
* msg32: the 32-byte message hash being signed (cannot be NULL) | ||
* seckey: pointer to a 32-byte secret key (cannot be NULL) | ||
* noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used | ||
* ndata: pointer to arbitrary data used by the nonce generation function (can be NULL) | ||
* Out: sig: pointer to an array where the signature will be placed (cannot be NULL) | ||
*/ | ||
int secp256k1_ecdsa_sign_recoverable( | ||
const secp256k1_context_t* ctx, | ||
const unsigned char *msg32, | ||
secp256k1_ecdsa_recoverable_signature_t *sig, | ||
const unsigned char *seckey, | ||
secp256k1_nonce_function_t noncefp, | ||
const void *ndata | ||
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); | ||
|
||
/** Recover an ECDSA public key from a signature. | ||
* | ||
* Returns: 1: public key successfully recovered (which guarantees a correct signature). | ||
* 0: otherwise. | ||
* 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) | ||
* sig: pointer to initialized signature that supports pubkey recovery (cannot be NULL) | ||
* Out: pubkey: pointer to the recoved public key (cannot be NULL) | ||
*/ | ||
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_recover( | ||
const secp256k1_context_t* ctx, | ||
const unsigned char *msg32, | ||
const secp256k1_ecdsa_recoverable_signature_t *sig, | ||
secp256k1_pubkey_t *pubkey | ||
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); | ||
|
||
# ifdef __cplusplus | ||
} | ||
# endif | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
include_HEADERS += include/secp256k1_recovery.h | ||
noinst_HEADERS += src/modules/recovery/main_impl.h | ||
noinst_HEADERS += src/modules/recovery/tests_impl.h | ||
if USE_BENCHMARK | ||
noinst_PROGRAMS += bench_recover | ||
bench_recover_SOURCES = src/bench_recover.c | ||
bench_recover_LDADD = libsecp256k1.la $(SECP_LIBS) | ||
bench_recover_LDFLAGS = -static | ||
endif |
Oops, something went wrong.