More public implementations
[secp256k1.git] / src / secp256k1.c
CommitLineData
7a4b7691
PW
1#include "impl/num.h"
2#include "impl/field.h"
3#include "impl/group.h"
4#include "impl/ecmult.h"
5#include "impl/ecdsa.h"
254327e4 6
d41e93a5 7void secp256k1_start(void) {
254327e4 8 secp256k1_fe_start();
f11ff5be 9 secp256k1_ge_start();
b1483f87 10 secp256k1_ecmult_start();
254327e4
PW
11}
12
d41e93a5 13void secp256k1_stop(void) {
b1483f87 14 secp256k1_ecmult_stop();
f11ff5be 15 secp256k1_ge_stop();
254327e4 16 secp256k1_fe_stop();
254327e4
PW
17}
18
d41e93a5 19int secp256k1_ecdsa_verify(const unsigned char *msg, int msglen, const unsigned char *sig, int siglen, const unsigned char *pubkey, int pubkeylen) {
4adf6b2a
PW
20 int ret = -3;
21 secp256k1_num_t m;
22 secp256k1_num_init(&m);
d41e93a5
PW
23 secp256k1_ecdsa_sig_t s;
24 secp256k1_ecdsa_sig_init(&s);
f11ff5be 25 secp256k1_gej_t q;
4adf6b2a 26 secp256k1_num_set_bin(&m, msg, msglen);
d41e93a5
PW
27
28 if (!secp256k1_ecdsa_pubkey_parse(&q, pubkey, pubkeylen)) {
4adf6b2a
PW
29 ret = -1;
30 goto end;
31 }
d41e93a5 32 if (!secp256k1_ecdsa_sig_parse(&s, sig, siglen)) {
4adf6b2a
PW
33 ret = -2;
34 goto end;
35 }
d41e93a5 36 if (!secp256k1_ecdsa_sig_verify(&s, &q, &m)) {
4adf6b2a
PW
37 ret = 0;
38 goto end;
607884fc 39 }
4adf6b2a
PW
40 ret = 1;
41end:
d41e93a5 42 secp256k1_ecdsa_sig_free(&s);
4adf6b2a
PW
43 secp256k1_num_free(&m);
44 return ret;
607884fc
PW
45}
46
78239167
PW
47int secp256k1_ecdsa_sign(const unsigned char *message, int messagelen, unsigned char *signature, int *signaturelen, const unsigned char *seckey, const unsigned char *nonce) {
48 secp256k1_num_t sec, non, msg;
49 secp256k1_num_init(&sec);
50 secp256k1_num_init(&non);
51 secp256k1_num_init(&msg);
52 secp256k1_num_set_bin(&sec, seckey, 32);
53 secp256k1_num_set_bin(&non, nonce, 32);
54 secp256k1_num_set_bin(&msg, message, messagelen);
55 secp256k1_ecdsa_sig_t sig;
56 secp256k1_ecdsa_sig_init(&sig);
57 int ret = secp256k1_ecdsa_sig_sign(&sig, &sec, &msg, &non);
58 if (ret) {
59 secp256k1_ecdsa_sig_serialize(signature, signaturelen, &sig);
60 }
61 secp256k1_ecdsa_sig_free(&sig);
62 secp256k1_num_free(&msg);
63 secp256k1_num_free(&non);
64 secp256k1_num_free(&sec);
65 return ret;
66}
42cccdaf
PW
67
68int secp256k1_ecdsa_seckey_verify(const unsigned char *seckey) {
69 secp256k1_num_t sec;
70 secp256k1_num_init(&sec);
71 secp256k1_num_set_bin(&sec, seckey, 32);
72 int ret = secp256k1_num_is_zero(&sec) ||
73 (secp256k1_num_cmp(&sec, &secp256k1_ge_consts->order) >= 0);
74 secp256k1_num_free(&sec);
75 return ret;
76}
77
78int secp256k1_ecdsa_pubkey_verify(const unsigned char *pubkey, int pubkeylen) {
79 secp256k1_gej_t q;
80 return secp256k1_ecdsa_pubkey_parse(&q, pubkey, pubkeylen);
81}
82
83int secp256k1_ecdsa_pubkey_create(unsigned char *pubkey, int *pubkeylen, const unsigned char *seckey, int compressed) {
84 secp256k1_num_t sec;
85 secp256k1_num_init(&sec);
86 secp256k1_num_set_bin(&sec, seckey, 32);
87 secp256k1_gej_t pj;
88 secp256k1_ecmult_gen(&pj, &sec);
89 secp256k1_ge_t p;
90 secp256k1_ge_set_gej(&p, &pj);
91 secp256k1_ecdsa_pubkey_serialize(&p, pubkey, pubkeylen, compressed);
92 return 1;
93}
94
95int secp256k1_ecdsa_pubkey_decompress(unsigned char *pubkey, int *pubkeylen) {
96 secp256k1_gej_t pj;
97 if (!secp256k1_ecdsa_pubkey_parse(&pj, pubkey, *pubkeylen))
98 return 0;
99 secp256k1_ge_t p;
100 secp256k1_ge_set_gej(&p, &pj);
101 secp256k1_ecdsa_pubkey_serialize(&p, pubkey, pubkeylen, 0);
102 return 1;
103}
This page took 0.035179 seconds and 4 git commands to generate.