X-Git-Url: http://git.bitcoin.ninja/index.cgi?p=shamirs;a=blobdiff_plain;f=shamirssecret.c;h=e3bbe49eb1cbc0ccbd563656b0893c4d3949fb80;hp=c7409e78a689726dc15a77c95551e9ee58b31850;hb=9ee05d19836c8700609c255218708f354c28041d;hpb=34739a8b62a61a62bc57ba87c1148bfbe466580a diff --git a/shamirssecret.c b/shamirssecret.c index c7409e7..e3bbe49 100644 --- a/shamirssecret.c +++ b/shamirssecret.c @@ -17,8 +17,6 @@ * Place - Suite 330, Boston, MA 02111-1307 USA. */ -#include - #ifndef IN_KERNEL #include #define CHECKSTATE(x) assert(x) @@ -29,6 +27,10 @@ #include "shamirssecret.h" +#ifndef noinline +#define noinline __attribute__((noinline)) +#endif + /* * Calculations across the finite field GF(2^8) */ @@ -87,7 +89,7 @@ static const uint8_t log[P] = { 0x4a, 0xed, 0xde, 0xc5, 0x31, 0xfe, 0x18, 0x0d, 0x63, 0x8c, 0x80, 0xc0, 0xf7, 0x70, 0x07}; // We disable lots of optimizations that result in non-constant runtime (+/- branch delays) -static uint8_t field_mul_ret(uint8_t calc, uint8_t a, uint8_t b) __attribute__((optimize("-O0"))) __attribute__((noinline)); +static uint8_t field_mul_ret(uint8_t calc, uint8_t a, uint8_t b) __attribute__((optimize("-O0"))) noinline; static uint8_t field_mul_ret(uint8_t calc, uint8_t a, uint8_t b) { uint8_t ret, ret2; if (a == 0) @@ -110,7 +112,7 @@ static uint8_t field_invert(uint8_t a) { } // We disable lots of optimizations that result in non-constant runtime (+/- branch delays) -static uint8_t field_pow_ret(uint8_t calc, uint8_t a, uint8_t e) __attribute__((optimize("-O0"))) __attribute__((noinline)); +static uint8_t field_pow_ret(uint8_t calc, uint8_t a, uint8_t e) __attribute__((optimize("-O0"))) noinline; static uint8_t field_pow_ret(uint8_t calc, uint8_t a, uint8_t e) { uint8_t ret, ret2; if (a == 0) @@ -185,9 +187,9 @@ int main() { * coefficients[0] == secret, the rest are random values */ uint8_t calculateQ(uint8_t coefficients[], uint8_t shares_required, uint8_t x) { + uint8_t ret = coefficients[0], i; CHECKSTATE(x != 0); // q(0) == secret, though so does a[0] - uint8_t ret = coefficients[0]; - for (uint8_t i = 1; i < shares_required; i++) { + for (i = 1; i < shares_required; i++) { ret = field_add(ret, field_mul(coefficients[i], field_pow(x, i))); } return ret; @@ -199,10 +201,10 @@ uint8_t calculateQ(uint8_t coefficients[], uint8_t shares_required, uint8_t x) { uint8_t calculateSecret(uint8_t x[], uint8_t q[], uint8_t shares_required) { // Calculate the x^0 term using a derivation of the forumula at // http://en.wikipedia.org/wiki/Lagrange_polynomial#Example_2 - uint8_t ret = 0; - for (uint8_t i = 0; i < shares_required; i++) { + uint8_t ret = 0, i, j; + for (i = 0; i < shares_required; i++) { uint8_t temp = q[i]; - for (uint8_t j = 0; j < shares_required; j++) { + for (j = 0; j < shares_required; j++) { if (i == j) continue; temp = field_mul(temp, field_neg(x[j]));