From 254327e49a12efe2117eb229198d46af65f19b3c Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Sun, 31 Mar 2013 06:34:15 +0200 Subject: [PATCH] Begin group C interface + start/stop --- include/secp256k1.h | 6 ++++-- src/group.h | 49 +++++++++++++++++++++++++++++++++++++++++++++ src/num.h | 1 + src/num_gmp.cpp | 7 +++++++ src/num_openssl.cpp | 4 ++++ src/secp256k1.cpp | 17 ++++++++++++++-- 6 files changed, 80 insertions(+), 4 deletions(-) diff --git a/include/secp256k1.h b/include/secp256k1.h index 806af8b1dc7..a5b4252aebd 100644 --- a/include/secp256k1.h +++ b/include/secp256k1.h @@ -1,8 +1,10 @@ #ifndef _SECP256K1_ #define _SECP256K1_ -namespace secp256k1 { -int VerifyECDSA(const unsigned char *msg, int msglen, const unsigned char *sig, int siglen, const unsigned char *pubkey, int pubkeylen); +extern "C" { +void secp256k1_start(void); +void secp256k1_stop(void); +int secp256k1_ecdsa_verify(const unsigned char *msg, int msglen, const unsigned char *sig, int siglen, const unsigned char *pubkey, int pubkeylen); } #endif diff --git a/src/group.h b/src/group.h index 0a46208ef76..34b645a5f52 100644 --- a/src/group.h +++ b/src/group.h @@ -6,6 +6,55 @@ #include "num.h" #include "field.h" +extern "C" { + +typedef struct { + secp256k1_fe_t x; + secp256k1_fe_t y; + int infinity; +} secp256k1_ge_t; + +typedef struct { + secp256k1_fe_t x; + secp256k1_fe_t y; + secp256k1_fe_t z; + int infinity; +} secp256k1_gej_t; + +typedef struct { + secp256k1_num_t order; + secp256k1_ge_t g; + secp256k1_fe_t beta; + secp256k1_num_t lambda, a1b2, b1, a2; +} secp256k1_ge_consts_t; + +static secp256k1_ge_consts_t *secp256k1_ge_consts = NULL; + +void static secp256k1_ge_start(void); +void static secp256k1_ge_stop(void); +void static secp256k1_ge_set_infinity(secp256k1_ge_t *r); +void static secp256k1_ge_set_xy(secp256k1_ge_t *r, const secp256k1_fe_t *x, const secp256k1_fe_t *y); +int static secp256k1_ge_is_infinity(const secp256k1_ge_t *a); +void static secp256k1_ge_neg(secp256k1_ge_t *r, const secp256k1_ge_t *a); +void static secp256k1_ge_get_hex(char *r, int *rlen, const secp256k1_ge_t *a); +void static secp256k1_ge_set_gej(secp256k1_ge_t *r, const secp256k1_gej_t *a); + +void static secp256k1_gej_set_infinity(secp256k1_gej_t *r); +void static secp256k1_gej_set_xy(secp256k1_gej_t *r, const secp256k1_fe_t *x, const secp256k1_fe_t *y); +void static secp256k1_gej_set_xo(secp256k1_gej_t *r, const secp256k1_fe_t *x, int compressed); +void static secp256k1_gej_set_ge(secp256k1_gej_t *r, const secp256k1_ge_t *a); +void static secp256k1_gej_get_x(secp256k1_fe_t *r, const secp256k1_gej_t *a); +void static secp256k1_gej_neg(secp256k1_gej_t *r, const secp256k1_gej_t *a); +int static secp256k1_gej_is_infinity(const secp256k1_gej_t *a); +void static secp256k1_gej_double(secp256k1_gej_t *r, const secp256k1_gej_t *a); +void static secp256k1_gej_add(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_gej_t *b); +void static secp256k1_gej_add_ge(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_ge_t *b); +void static secp256k1_gej_get_hex(char *r, int *rlen, const secp256k1_gej_t *a); +void static secp256k1_gej_mul_lambda(secp256k1_gej_t *r, const secp256k1_gej_t *a); +void static secp256k1_gej_split_exp(secp256k1_num_t *r1, secp256k1_num_t *r2, const secp256k1_num_t *a); + +} + namespace secp256k1 { class GroupElemJac; diff --git a/src/num.h b/src/num.h index fe600db6275..2c2579af8cc 100644 --- a/src/num.h +++ b/src/num.h @@ -12,6 +12,7 @@ extern "C" { void static secp256k1_num_start(void); +void static secp256k1_num_stop(void); void static secp256k1_num_init(secp256k1_num_t *r); void static secp256k1_num_free(secp256k1_num_t *r); void static secp256k1_num_copy(secp256k1_num_t *r, const secp256k1_num_t *a); diff --git a/src/num_gmp.cpp b/src/num_gmp.cpp index e89e1b0a07e..85bb79871f4 100644 --- a/src/num_gmp.cpp +++ b/src/num_gmp.cpp @@ -21,6 +21,13 @@ void static secp256k1_num_start(void) { gmp_randinit_default(secp256k1_num_state.rng); } +void static secp256k1_num_stop(void) { + if (!secp256k1_num_state.initialized) + return; + secp256k1_num_state.initialized = 0; + gmp_randclear(secp256k1_num_state.rng); +} + void static secp256k1_num_init(secp256k1_num_t *r) { mpz_init(r->bn); } diff --git a/src/num_openssl.cpp b/src/num_openssl.cpp index 50c4f6c9abf..5b88d98bacb 100644 --- a/src/num_openssl.cpp +++ b/src/num_openssl.cpp @@ -9,6 +9,10 @@ void static secp256k1_num_start() { } +void static secp256k1_num_stop() { +} + + void static secp256k1_num_init(secp256k1_num_t *r) { BN_init(&r->bn); } diff --git a/src/secp256k1.cpp b/src/secp256k1.cpp index 5cdadae1a52..bbbf03ba73b 100644 --- a/src/secp256k1.cpp +++ b/src/secp256k1.cpp @@ -4,9 +4,22 @@ #include "ecmult.cpp" #include "ecdsa.cpp" + namespace secp256k1 { -int VerifyECDSA(const unsigned char *msg, int msglen, const unsigned char *sig, int siglen, const unsigned char *pubkey, int pubkeylen) { +extern "C" void secp256k1_start(void) { + secp256k1_num_start(); + secp256k1_fe_start(); + GetGroupConst(); + GetECMultConsts(); +} + +extern "C" void secp256k1_stop(void) { + secp256k1_fe_stop(); + secp256k1_num_stop(); +} + +extern "C" int secp256k1_ecdsa_verify(const unsigned char *msg, int msglen, const unsigned char *sig, int siglen, const unsigned char *pubkey, int pubkeylen) { int ret = -3; secp256k1_num_t m; secp256k1_num_init(&m); @@ -34,5 +47,5 @@ end: return ret; } - } +