0
0
Fork 0
mirror of https://github.com/bitcoin/bitcoin.git synced 2025-02-09 10:43:19 -05:00
bitcoin-bitcoin-core/src/secp256k1.c

67 lines
1.9 KiB
C
Raw Normal View History

#include "impl/num.h"
#include "impl/field.h"
#include "impl/group.h"
#include "impl/ecmult.h"
#include "impl/ecdsa.h"
2013-03-31 06:34:15 +02:00
2013-04-01 07:21:05 +02:00
void secp256k1_start(void) {
2013-03-31 06:34:15 +02:00
secp256k1_fe_start();
2013-03-31 17:02:52 +02:00
secp256k1_ge_start();
2013-04-01 06:29:30 +02:00
secp256k1_ecmult_start();
2013-03-31 06:34:15 +02:00
}
2013-04-01 07:21:05 +02:00
void secp256k1_stop(void) {
2013-04-01 06:29:30 +02:00
secp256k1_ecmult_stop();
2013-03-31 17:02:52 +02:00
secp256k1_ge_stop();
2013-03-31 06:34:15 +02:00
secp256k1_fe_stop();
}
2013-04-01 07:21:05 +02:00
int secp256k1_ecdsa_verify(const unsigned char *msg, int msglen, const unsigned char *sig, int siglen, const unsigned char *pubkey, int pubkeylen) {
2013-03-24 10:38:35 +01:00
int ret = -3;
secp256k1_num_t m;
secp256k1_num_init(&m);
2013-04-01 07:21:05 +02:00
secp256k1_ecdsa_sig_t s;
secp256k1_ecdsa_sig_init(&s);
2013-03-31 17:02:52 +02:00
secp256k1_gej_t q;
2013-03-24 10:38:35 +01:00
secp256k1_num_set_bin(&m, msg, msglen);
2013-04-01 07:21:05 +02:00
if (!secp256k1_ecdsa_pubkey_parse(&q, pubkey, pubkeylen)) {
2013-03-24 10:38:35 +01:00
ret = -1;
goto end;
}
2013-04-01 07:21:05 +02:00
if (!secp256k1_ecdsa_sig_parse(&s, sig, siglen)) {
2013-03-24 10:38:35 +01:00
ret = -2;
goto end;
}
2013-04-01 07:21:05 +02:00
if (!secp256k1_ecdsa_sig_verify(&s, &q, &m)) {
2013-03-24 10:38:35 +01:00
ret = 0;
goto end;
2013-03-16 15:51:55 +01:00
}
2013-03-24 10:38:35 +01:00
ret = 1;
end:
2013-04-01 07:21:05 +02:00
secp256k1_ecdsa_sig_free(&s);
2013-03-24 10:38:35 +01:00
secp256k1_num_free(&m);
return ret;
2013-03-16 15:51:55 +01:00
}
2013-05-05 00:21:03 +02:00
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;
}