7 #define SECP256K1_BUILD (1)
24 secp256k1_scalar_start();
25 secp256k1_ecdsa_start();
27 secp256k1_ecmult_gen_start();
30 secp256k1_ecmult_start();
35 secp256k1_ecmult_stop();
36 secp256k1_ecmult_gen_stop();
37 secp256k1_ecdsa_stop();
38 secp256k1_scalar_stop();
43 int secp256k1_ecdsa_verify(
const unsigned char *msg,
int msglen,
const unsigned char *sig,
int siglen,
const unsigned char *pubkey,
int pubkeylen) {
50 unsigned char msg32[32] = {0};
51 memcpy(msg32 + 32 - msglen, msg, msglen);
56 secp256k1_scalar_set_b32(&m, msg32, NULL);
58 if (!secp256k1_eckey_pubkey_parse(&q, pubkey, pubkeylen)) {
62 if (!secp256k1_ecdsa_sig_parse(&s, sig, siglen)) {
66 if (!secp256k1_ecdsa_sig_verify(&s, &q, &m)) {
75 int secp256k1_ecdsa_sign(
const unsigned char *message,
int messagelen,
unsigned char *signature,
int *signaturelen,
const unsigned char *seckey,
const unsigned char *nonce) {
85 secp256k1_scalar_set_b32(&sec, seckey, NULL);
87 secp256k1_scalar_set_b32(&non, nonce, &overflow);
89 unsigned char c[32] = {0};
90 memcpy(c + 32 - messagelen, message, messagelen);
91 secp256k1_scalar_set_b32(&msg, c, NULL);
94 int ret = !secp256k1_scalar_is_zero(&non) && !overflow;
97 ret = secp256k1_ecdsa_sig_sign(&sig, &sec, &msg, &non, NULL);
100 secp256k1_ecdsa_sig_serialize(signature, signaturelen, &sig);
102 secp256k1_scalar_clear(&msg);
103 secp256k1_scalar_clear(&non);
104 secp256k1_scalar_clear(&sec);
108 int secp256k1_ecdsa_sign_compact(
const unsigned char *message,
int messagelen,
unsigned char *sig64,
const unsigned char *seckey,
const unsigned char *nonce,
int *recid) {
117 secp256k1_scalar_set_b32(&sec, seckey, NULL);
119 secp256k1_scalar_set_b32(&non, nonce, &overflow);
121 unsigned char c[32] = {0};
122 memcpy(c + 32 - messagelen, message, messagelen);
123 secp256k1_scalar_set_b32(&msg, c, NULL);
126 int ret = !secp256k1_scalar_is_zero(&non) && !overflow;
129 ret = secp256k1_ecdsa_sig_sign(&sig, &sec, &msg, &non, recid);
132 secp256k1_scalar_get_b32(sig64, &sig.
r);
133 secp256k1_scalar_get_b32(sig64 + 32, &sig.
s);
135 secp256k1_scalar_clear(&msg);
136 secp256k1_scalar_clear(&non);
137 secp256k1_scalar_clear(&sec);
141 int secp256k1_ecdsa_recover_compact(
const unsigned char *msg,
int msglen,
const unsigned char *sig64,
unsigned char *pubkey,
int *pubkeylen,
int compressed,
int recid) {
151 unsigned char msg32[32] = {0};
152 memcpy(msg32 + 32 - msglen, msg, msglen);
156 secp256k1_scalar_set_b32(&sig.
r, sig64, &overflow);
160 secp256k1_scalar_set_b32(&sig.
s, sig64 + 32, &overflow);
164 secp256k1_scalar_set_b32(&m, msg32, NULL);
167 if (secp256k1_ecdsa_sig_recover(&sig, &q, &m, recid)) {
168 ret = secp256k1_eckey_pubkey_serialize(&q, pubkey, pubkeylen, compressed);
178 secp256k1_scalar_set_b32(&sec, seckey, &overflow);
179 int ret = !secp256k1_scalar_is_zero(&sec) && !overflow;
180 secp256k1_scalar_clear(&sec);
188 return secp256k1_eckey_pubkey_parse(&q, pubkey, pubkeylen);
198 secp256k1_scalar_set_b32(&sec, seckey, NULL);
200 secp256k1_ecmult_gen(&pj, &sec);
201 secp256k1_scalar_clear(&sec);
203 secp256k1_ge_set_gej(&p, &pj);
204 return secp256k1_eckey_pubkey_serialize(&p, pubkey, pubkeylen, compressed);
212 if (!secp256k1_eckey_pubkey_parse(&p, pubkey, *pubkeylen))
214 return secp256k1_eckey_pubkey_serialize(&p, pubkey, pubkeylen, 0);
223 secp256k1_scalar_set_b32(&term, tweak, &overflow);
225 secp256k1_scalar_set_b32(&sec, seckey, NULL);
227 int ret = secp256k1_eckey_privkey_tweak_add(&sec, &term) && !overflow;
229 secp256k1_scalar_get_b32(seckey, &sec);
232 secp256k1_scalar_clear(&sec);
233 secp256k1_scalar_clear(&term);
244 secp256k1_scalar_set_b32(&term, tweak, &overflow);
249 int ret = secp256k1_eckey_pubkey_parse(&p, pubkey, pubkeylen);
251 ret = secp256k1_eckey_pubkey_tweak_add(&p, &term);
254 int oldlen = pubkeylen;
255 ret = secp256k1_eckey_pubkey_serialize(&p, pubkey, &pubkeylen, oldlen <= 33);
268 secp256k1_scalar_set_b32(&factor, tweak, &overflow);
270 secp256k1_scalar_set_b32(&sec, seckey, NULL);
271 int ret = secp256k1_eckey_privkey_tweak_mul(&sec, &factor) && !overflow;
273 secp256k1_scalar_get_b32(seckey, &sec);
276 secp256k1_scalar_clear(&sec);
277 secp256k1_scalar_clear(&factor);
288 secp256k1_scalar_set_b32(&factor, tweak, &overflow);
293 int ret = secp256k1_eckey_pubkey_parse(&p, pubkey, pubkeylen);
295 ret = secp256k1_eckey_pubkey_tweak_mul(&p, &factor);
298 int oldlen = pubkeylen;
299 ret = secp256k1_eckey_pubkey_serialize(&p, pubkey, &pubkeylen, oldlen <= 33);
312 secp256k1_scalar_set_b32(&
key, seckey, NULL);
313 int ret = secp256k1_eckey_privkey_serialize(privkey, privkeylen, &
key, compressed);
314 secp256k1_scalar_clear(&
key);
323 int ret = secp256k1_eckey_privkey_parse(&
key, privkey, privkeylen);
325 secp256k1_scalar_get_b32(seckey, &
key);
326 secp256k1_scalar_clear(&
key);