From 78239167812194b3fd71e4179fa3e7ae6f264c45 Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Sun, 5 May 2013 00:21:03 +0200 Subject: [PATCH] Add signing to public interface --- include/secp256k1.h | 13 ++++++++++++- src/bench.c | 4 ++++ src/secp256k1.c | 20 ++++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/include/secp256k1.h b/include/secp256k1.h index ea78a0d693..e9944e5a6c 100644 --- a/include/secp256k1.h +++ b/include/secp256k1.h @@ -27,6 +27,13 @@ int secp256k1_ecdsa_verify(const unsigned char *msg, int msglen, const unsigned char *sig, int siglen, const unsigned char *pubkey, int pubkeylen); +int secp256k1_ecdsa_sign(const unsigned char *msg, int msglen, + unsigned char *sig, int* siglen, + const unsigned char *seckey, + const unsigned char *nonce); + +int secp256j1_ecdsa_seckey_verify(const unsigned char *seckey); + /** Just validate a public key. * Returns: 1: valid public key * 0: invalid public key @@ -39,11 +46,15 @@ int secp256k1_ecdsa_pubkey_verify(const unsigned char *pubkey, int pubkeylen); * seckey: pointer to a 32-byte private key. * Out: pubkey: pointer to a 33-byte (if compressed) or 65-byte (if uncompressed) * area to store the public key. + * pubkeylen: pointer to int that will be updated to contains the pubkey's + * length. * Returns: 1: secret was valid, public key stores * 0: secret was invalid, try again. */ /* NOT YET IMPLEMENTED */ -int secp256k1_ecdsa_pubkey_create(unsigned char *pubkey, int compressed, const unsigned char *seckey) +int secp256k1_ecdsa_pubkey_create(unsigned char *pubkey, int *pubkeylen, const unsigned char *seckey, int compressed) + +int secp256k1_ecdsa_pubkey_decompress(unsigned char *pubkey, int *pubkeylen); #ifdef __cplusplus } diff --git a/src/bench.c b/src/bench.c index be5f40a839..468a454e01 100644 --- a/src/bench.c +++ b/src/bench.c @@ -1,3 +1,7 @@ +// Copyright (c) 2013 Pieter Wuille +// Distributed under the MIT/X11 software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + #include #include "impl/num.h" diff --git a/src/secp256k1.c b/src/secp256k1.c index 4d7929a448..abe1df427e 100644 --- a/src/secp256k1.c +++ b/src/secp256k1.c @@ -44,3 +44,23 @@ end: return ret; } +int secp256k1_ecdsa_sign(const unsigned char *message, int messagelen, unsigned char *signature, int *signaturelen, const unsigned char *seckey, const unsigned char *nonce) { + secp256k1_num_t sec, non, msg; + secp256k1_num_init(&sec); + secp256k1_num_init(&non); + secp256k1_num_init(&msg); + secp256k1_num_set_bin(&sec, seckey, 32); + secp256k1_num_set_bin(&non, nonce, 32); + secp256k1_num_set_bin(&msg, message, messagelen); + secp256k1_ecdsa_sig_t sig; + secp256k1_ecdsa_sig_init(&sig); + int ret = secp256k1_ecdsa_sig_sign(&sig, &sec, &msg, &non); + if (ret) { + secp256k1_ecdsa_sig_serialize(signature, signaturelen, &sig); + } + secp256k1_ecdsa_sig_free(&sig); + secp256k1_num_free(&msg); + secp256k1_num_free(&non); + secp256k1_num_free(&sec); + return ret; +}