-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Allow sign-to-contract commitments in schnorrsigs [̶a̶l̶t̶e̶r̶n̶a̶t̶i̶v̶e̶]̶ #589
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Closed
Closed
Changes from all commits
Commits
Show all changes
7 commits
Select commit
Hold shift + click to select a range
2f40e1e
add chacha20 function
apoelstra 8264572
Add schnorrsig module which implements BIP-schnorr [0] compatible sig…
apoelstra 0b4bef4
Add ec_commitments which are essentially the pay-to-contract-style tw…
jonasnick 854c1c4
Add and expose sign-to-contract opening with parse and serialize func…
jonasnick 9037bcf
Allow creating and verifying Schnorr sign-to-contract commitments
jonasnick 031ca34
f Add ec_commitments
jonasnick b631248
f serialize s2c_opening as 33 bytes instead of 34
jonasnick File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or 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 hidden or 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 hidden or 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 hidden or 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 hidden or 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 hidden or 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,151 @@ | ||
#ifndef SECP256K1_SCHNORRSIG_H | ||
#define SECP256K1_SCHNORRSIG_H | ||
|
||
#include "secp256k1.h" | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
/** This module implements a variant of Schnorr signatures compliant with | ||
* BIP-schnorr | ||
* (https://github.com/sipa/bips/blob/bip-schnorr/bip-schnorr.mediawiki). | ||
*/ | ||
|
||
/** Opaque data structure that holds a parsed Schnorr signature. | ||
* | ||
* 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 64 bytes in size, and can be safely copied/moved. | ||
* If you need to convert to a format suitable for storage, transmission, or | ||
* comparison, use the `secp256k1_schnorrsig_serialize` and | ||
* `secp256k1_schnorrsig_parse` functions. | ||
*/ | ||
typedef struct { | ||
unsigned char data[64]; | ||
} secp256k1_schnorrsig; | ||
|
||
/** Serialize a Schnorr signature. | ||
* | ||
* Returns: 1 | ||
* Args: ctx: a secp256k1 context object | ||
* Out: out64: pointer to a 64-byte array to store the serialized signature | ||
* In: sig: pointer to the signature | ||
* | ||
* See secp256k1_schnorrsig_parse for details about the encoding. | ||
*/ | ||
SECP256K1_API int secp256k1_schnorrsig_serialize( | ||
const secp256k1_context* ctx, | ||
unsigned char *out64, | ||
const secp256k1_schnorrsig* sig | ||
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); | ||
|
||
/** Parse a Schnorr signature. | ||
* | ||
* Returns: 1 when the signature could be parsed, 0 otherwise. | ||
* Args: ctx: a secp256k1 context object | ||
* Out: sig: pointer to a signature object | ||
* In: in64: pointer to the 64-byte signature to be parsed | ||
* | ||
* The signature is serialized in the form R||s, where R is a 32-byte public | ||
* key (x-coordinate only; the y-coordinate is considered to be the unique | ||
* y-coordinate satisfying the curve equation that is a quadratic residue) | ||
* and s is a 32-byte big-endian scalar. | ||
* | ||
* After the call, sig will always be initialized. If parsing failed or the | ||
* encoded numbers are out of range, signature validation with it is | ||
* guaranteed to fail for every message and public key. | ||
*/ | ||
SECP256K1_API int secp256k1_schnorrsig_parse( | ||
const secp256k1_context* ctx, | ||
secp256k1_schnorrsig* sig, | ||
const unsigned char *in64 | ||
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); | ||
|
||
/** Create a Schnorr signature. | ||
* | ||
* Returns 1 on success, 0 on failure. | ||
* Args: ctx: pointer to a context object, initialized for signing (cannot be NULL) | ||
* Out: sig: pointer to the returned signature (cannot be NULL) | ||
* s2c_opening: pointer to an secp256k1_s2c_opening structure which can be | ||
* NULL but is required to be not NULL if this signature creates | ||
* a sign-to-contract commitment (i.e. the `s2c_data` argument | ||
* is not NULL). | ||
* In: msg32: the 32-byte message hash being signed (cannot be NULL) | ||
* seckey: pointer to a 32-byte secret key (cannot be NULL) | ||
* s2c_data32: pointer to a 32-byte data to create an optional | ||
* sign-to-contract commitment to if not NULL (can be NULL). | ||
* noncefp: pointer to a nonce generation function. If NULL, secp256k1_nonce_function_bipschnorr is used | ||
* ndata: pointer to arbitrary data used by the nonce generation function. If s2c_data is not NULL, | ||
* nust be NULL or `secp256k1_nonce_function_bipschnorr` (can be NULL) | ||
*/ | ||
SECP256K1_API int secp256k1_schnorrsig_sign( | ||
const secp256k1_context* ctx, | ||
secp256k1_schnorrsig *sig, | ||
secp256k1_s2c_opening *s2c_opening, | ||
const unsigned char *msg32, | ||
const unsigned char *seckey, | ||
const unsigned char *s2c_data32, | ||
secp256k1_nonce_function noncefp, | ||
void *ndata | ||
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5); | ||
|
||
/** Verify a Schnorr signature. | ||
* | ||
* Returns: 1: correct signature | ||
* 0: incorrect or unparseable signature | ||
* Args: ctx: a secp256k1 context object, initialized for verification. | ||
* In: sig: the signature being verified (cannot be NULL) | ||
* msg32: the 32-byte message being verified (cannot be NULL) | ||
* pubkey: pointer to a public key to verify with (cannot be NULL) | ||
*/ | ||
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_schnorrsig_verify( | ||
const secp256k1_context* ctx, | ||
const secp256k1_schnorrsig *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); | ||
|
||
/** Verifies a set of Schnorr signatures. | ||
* | ||
* Returns 1 if all succeeded, 0 otherwise. In particular, returns 1 if n_sigs is 0. | ||
* | ||
* Args: ctx: a secp256k1 context object, initialized for verification. | ||
* scratch: scratch space used for the multiexponentiation | ||
* In: sig: array of signatures, or NULL if there are no signatures | ||
* msg32: array of messages, or NULL if there are no signatures | ||
* pk: array of public keys, or NULL if there are no signatures | ||
* n_sigs: number of signatures in above arrays. Must be smaller than | ||
* 2^31 and smaller than half the maximum size_t value. Must be 0 | ||
* if above arrays are NULL. | ||
*/ | ||
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_schnorrsig_verify_batch( | ||
const secp256k1_context* ctx, | ||
secp256k1_scratch_space *scratch, | ||
const secp256k1_schnorrsig *const *sig, | ||
const unsigned char *const *msg32, | ||
const secp256k1_pubkey *const *pk, | ||
size_t n_sigs | ||
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2); | ||
|
||
/** Verify a sign-to-contract commitment. | ||
* | ||
* Returns: 1: the signature contains a commitment to data32 | ||
* 0: incorrect opening | ||
* Args: ctx: a secp256k1 context object, initialized for verification. | ||
* In: sig: the signature containing the sign-to-contract commitment (cannot be NULL) | ||
* data32: the 32-byte data that was committed to (cannot be NULL) | ||
* opening: pointer to the opening created during signing (cannot be NULL) | ||
*/ | ||
SECP256K1_API int secp256k1_schnorrsig_verify_s2c_commit( | ||
const secp256k1_context* ctx, | ||
const secp256k1_schnorrsig *sig, | ||
const unsigned char *data32, | ||
const secp256k1_s2c_opening *opening | ||
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif /* SECP256K1_SCHNORRSIG_H */ |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.