diff options
author | Jeffrey Wilcke <jeffrey@ethereum.org> | 2015-10-16 01:46:57 +0800 |
---|---|---|
committer | Jeffrey Wilcke <jeffrey@ethereum.org> | 2015-10-16 01:46:57 +0800 |
commit | f466243417f60531998e8b500f2bb043af5b3d2a (patch) | |
tree | 9f8387b65d2a9d54a94ed26bc6a57ecfde3489f6 /crypto/secp256k1/libsecp256k1/src/ecmult_gen.h | |
parent | cefe5c80b1cdcab606a169c0be65d9d2ba9bc941 (diff) | |
parent | f32fa075f14d2b3a1213098274e0ba88c7761283 (diff) | |
download | go-tangerine-f466243417f60531998e8b500f2bb043af5b3d2a.tar go-tangerine-f466243417f60531998e8b500f2bb043af5b3d2a.tar.gz go-tangerine-f466243417f60531998e8b500f2bb043af5b3d2a.tar.bz2 go-tangerine-f466243417f60531998e8b500f2bb043af5b3d2a.tar.lz go-tangerine-f466243417f60531998e8b500f2bb043af5b3d2a.tar.xz go-tangerine-f466243417f60531998e8b500f2bb043af5b3d2a.tar.zst go-tangerine-f466243417f60531998e8b500f2bb043af5b3d2a.zip |
Merge pull request #1853 from Gustav-Simonsson/libsecp256k1_update
Update libsecp256k1, Go wrapper and tests
Diffstat (limited to 'crypto/secp256k1/libsecp256k1/src/ecmult_gen.h')
-rw-r--r-- | crypto/secp256k1/libsecp256k1/src/ecmult_gen.h | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/crypto/secp256k1/libsecp256k1/src/ecmult_gen.h b/crypto/secp256k1/libsecp256k1/src/ecmult_gen.h new file mode 100644 index 000000000..eb2cc9ead --- /dev/null +++ b/crypto/secp256k1/libsecp256k1/src/ecmult_gen.h @@ -0,0 +1,43 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_ECMULT_GEN_ +#define _SECP256K1_ECMULT_GEN_ + +#include "scalar.h" +#include "group.h" + +typedef struct { + /* For accelerating the computation of a*G: + * To harden against timing attacks, use the following mechanism: + * * Break up the multiplicand into groups of 4 bits, called n_0, n_1, n_2, ..., n_63. + * * Compute sum(n_i * 16^i * G + U_i, i=0..63), where: + * * U_i = U * 2^i (for i=0..62) + * * U_i = U * (1-2^63) (for i=63) + * where U is a point with no known corresponding scalar. Note that sum(U_i, i=0..63) = 0. + * For each i, and each of the 16 possible values of n_i, (n_i * 16^i * G + U_i) is + * precomputed (call it prec(i, n_i)). The formula now becomes sum(prec(i, n_i), i=0..63). + * None of the resulting prec group elements have a known scalar, and neither do any of + * the intermediate sums while computing a*G. + */ + secp256k1_ge_storage (*prec)[64][16]; /* prec[j][i] = 16^j * i * G + U_i */ + secp256k1_scalar blind; + secp256k1_gej initial; +} secp256k1_ecmult_gen_context; + +static void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context* ctx); +static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context* ctx, const secp256k1_callback* cb); +static void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context *dst, + const secp256k1_ecmult_gen_context* src, const secp256k1_callback* cb); +static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context* ctx); +static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context* ctx); + +/** Multiply with the generator: R = a*G */ +static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context* ctx, secp256k1_gej *r, const secp256k1_scalar *a); + +static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context *ctx, const unsigned char *seed32); + +#endif |