| @@ -1,3 +1,25 @@ | |||||
| April 23, 2015: | |||||
| Removed the original Goldilocks code; Decaf now stands on its own. | |||||
| This cuts the source code approximately in half, to a still-large | |||||
| 13.7k wc-lines. (Most of these lines are in the arch-specific | |||||
| field implementations.) | |||||
| Note that the decaf_crypto routines are not intended to set | |||||
| standards. They should be secure, but they're intended more as | |||||
| examples of how the core ECC library could be used. | |||||
| The SHAKE stuff is also mostly an experiment, particularly the | |||||
| STROBE protocol/mode stuff. This is all fine, because the ECC | |||||
| library itself is the core, and doesn't require the SHAKE stuff. | |||||
| (Except for the C++ header, which should probably also be factored | |||||
| so that it doesn't need the SHAKE stuff.) | |||||
| I've started work on making a Decaf BAT, but not done yet. | |||||
| I haven't ripped out all old multi-field code, because I intend | |||||
| to add support for other fields eventually. Maybe properly this | |||||
| time, instead of with a million compile flags like the original. | |||||
| March 23, 2015: | March 23, 2015: | ||||
| I've been fleshing out Decaf, and hopefully the API is somewhere | I've been fleshing out Decaf, and hopefully the API is somewhere | ||||
| near final. I will probably move a few things around and add a | near final. I will probably move a few things around and add a | ||||
| @@ -1,42 +1,24 @@ | |||||
| Ed448-Goldilocks | |||||
| Ed448-Goldilocks, Decaf version. | |||||
| This software is an experimental implementation of a new 448-bit elliptic | This software is an experimental implementation of a new 448-bit elliptic | ||||
| curve called Ed448-Goldilocks. The implementation itself is based on that of | |||||
| an earlier, unnamed 252-bit curve which should probably be referred to as | |||||
| Ed252-MontgomeryStation. See http://eprint.iacr.org/2012/309 for details of | |||||
| that implementation. | |||||
| curve called Ed448-Goldilocks, with "Decaf" cofactor removal. | |||||
| The source files here are all by Mike Hamburg. Most of them are (c) 2014 | |||||
| Cryptography Research, Inc (a division of Rambus). The cRandom | |||||
| implementation is the exception: these files are from the OpenConflict video | |||||
| game protection system out of Stanford, and are (c) 2011 Stanford | |||||
| University. All of these files are usable under the MIT license contained in | |||||
| LICENSE.txt. | |||||
| The source files here are all by Mike Hamburg. Most of them are (c) | |||||
| 2014-2015 Cryptography Research, Inc (a division of Rambus). All of these | |||||
| files are usable under the MIT license contained in LICENSE.txt. | |||||
| The Makefile is set for my 2013 MacBook Air. You can `make bench` to run | The Makefile is set for my 2013 MacBook Air. You can `make bench` to run | ||||
| a completely arbitrary set of benchmarks and tests, or `make | |||||
| build/goldilocks.so` to build a stripped-down version of the library. For | |||||
| non-Haswell platforms, you need to replace -mavx2 -mbmi2 by an appropriate | |||||
| vector declaration. For non-Mac platforms, you won't be able to build a | |||||
| library with this Makefile. This is fine, because you shouldn't be using | |||||
| this for much at this stage anyway. | |||||
| a completely arbitrary set of benchmarks and tests, or `make lib` to build | |||||
| a stripped-down version of the library. For non-Haswell platforms, you may | |||||
| need to replace -mavx2 -mbmi2 by an appropriate vector declaration. | |||||
| I've attempted to protect against timing attacks and invalid point attacks, | I've attempted to protect against timing attacks and invalid point attacks, | ||||
| but as of yet no attempt to protect against power analysis. This is an early | |||||
| revision, so I haven't done much analysis or correctness testing of | |||||
| corner-cases. | |||||
| The code in ec_point.c and ec_point.h was generated with the help of a tool | |||||
| written in SAGE. The field code in p448.h doesn't reduce after add/sub, and | |||||
| so it requires care to prevent overflow. The SAGE tool figures out where to | |||||
| put reductions and adjustments to prevent overflow. It also formally | |||||
| verifies that the formulas produce points on the curve. I'm planning to add | |||||
| more features to it eventually. That tool is even more experimental than | |||||
| this library, though, and so I won't be releasing it just yet. | |||||
| but as of yet no attempt to protect against power analysis. | |||||
| This software is incomplete, and lacks documentation. None of the APIs are | This software is incomplete, and lacks documentation. None of the APIs are | ||||
| stable. The software is probably not secure. Please consult TODO.txt for | |||||
| additional agenda items. Do not taunt happy fun ball. | |||||
| yet stable, though they may be getting there. The software is probably not | |||||
| secure. Please consult TODO.txt for additional agenda items. Do not taunt | |||||
| happy fun ball. | |||||
| Cheers, | Cheers, | ||||
| -- Mike Hamburg | -- Mike Hamburg | ||||
| @@ -1,16 +1,10 @@ | |||||
| Important work items for Ed448-Goldilocks: | |||||
| * Better architecture detection / factoring of arch-related headers. | |||||
| [PROGRESS] | |||||
| * Better factoring of high-level vs low-level library. | |||||
| Important work items for Ed448-Goldilocks / decaf: | |||||
| * Factor out hash, crandom from core library? | * Factor out hash, crandom from core library? | ||||
| [DONE, except for C++ headers] | |||||
| * Signed 32-bit NEON implementation to avoid bias/reduce after subtract | * Signed 32-bit NEON implementation to avoid bias/reduce after subtract | ||||
| * Documentation: write high-level API docs, and internal docs to help | * Documentation: write high-level API docs, and internal docs to help | ||||
| other implementors. | other implementors. | ||||
| * Partial progress on Doxygenating the code. | * Partial progress on Doxygenating the code. | ||||
| @@ -20,65 +14,27 @@ Important work items for Ed448-Goldilocks: | |||||
| * Cleanup: rename everything consistently. | * Cleanup: rename everything consistently. | ||||
| * namespace_op or op_namespace? namespace_op_type? | * namespace_op or op_namespace? namespace_op_type? | ||||
| * We don't have to be super-careful with the namespacing, because | * We don't have to be super-careful with the namespacing, because | ||||
| symbols will be scrubbed by exported.sym. | |||||
| * Cleanup: hard-coded tables (probably?) | |||||
| * This reduces the work required for goldilocks_init() at the expense | |||||
| of library size. | |||||
| * Makes error-handling and thread safety easier. | |||||
| * Use the SAGE tool? | |||||
| symbols will be scrubbed by visibility | |||||
| * Cleanup: unify intrinsics code | * Cleanup: unify intrinsics code | ||||
| * Word_t, mask_t, bigregister_t, etc. | * Word_t, mask_t, bigregister_t, etc. | ||||
| * Generate asm intrinsics with a script? | * Generate asm intrinsics with a script? | ||||
| * [DONE] Bugfix: make sure that init() and randomization are thread-safe. | |||||
| * [DONE] Security: check on deserialization that points are < p. | |||||
| * [NEEDS TESTING] Check also that they're nonzero or otherwise non-pathological? | |||||
| * Testing: | * Testing: | ||||
| * Corner-case testing | |||||
| * More bulk random testing | |||||
| * Negative testing. | |||||
| * SAGE-(auto?)-generated test vectors | |||||
| * Test the Barrett fields | |||||
| * More testing. Testing, testing and testing. | |||||
| * Test corner cases better. | |||||
| * Safety: add static analysis attributes for compilers that support them | * Safety: add static analysis attributes for compilers that support them | ||||
| * Most functions now have warn on ignored return. | * Most functions now have warn on ignored return. | ||||
| * [ MOSTLY DONE ] | |||||
| * Safety: | * Safety: | ||||
| * [DONE] Check for init() if it's still required once we've done the above | |||||
| * Decide what to do about RNG failures | * Decide what to do about RNG failures | ||||
| * abort | * abort | ||||
| * return error and zeroize | * return error and zeroize | ||||
| * return error but continue if RNG is kind of mostly OK | * return error but continue if RNG is kind of mostly OK | ||||
| * Flexibility: decide which API options are good. | |||||
| * [DONE?] Eg, should functions take nbits and table sizes? | |||||
| * [DONE] Remove hardcoded adjustments from comb control. | |||||
| * These adjustments make the output wrong when it's not 450 bits. | |||||
| * Other slow Barrett fields? Montgomery fields? | |||||
| * Mid-level API | |||||
| * Make it easier to work with untwisted Edwards objects. | |||||
| * Probably use extended or projective, not extensible coordinates. | |||||
| * Scalarmul with other cofactor modes. | |||||
| * High-level API: | |||||
| * SHA512 Elligator Edition? Maybe write a paper first. | |||||
| * Elligator. | |||||
| * Need to write Elligator inverse. Might not be Elligator-2S. | |||||
| * FHMQV? Is this patented? | |||||
| * What low-level APIs to expose? | |||||
| * Edwards points with add, sub, scalarmul, =, ==, ser/deser? | |||||
| * High-level API: [DONE] | |||||
| * Portability: test and make clean with other compilers | * Portability: test and make clean with other compilers | ||||
| * Using a fair amount of __attribute__ code. | * Using a fair amount of __attribute__ code. | ||||
| @@ -89,47 +45,14 @@ Important work items for Ed448-Goldilocks: | |||||
| * I can't get a simple for-loop to autovectorize :-/ | * I can't get a simple for-loop to autovectorize :-/ | ||||
| * SAGE tool? | * SAGE tool? | ||||
| * Portability: make the inner layers of the code 32-bit clean. | |||||
| * Write new versions of the field code. | |||||
| * [DONE] 28-bit limbs give less headroom for carries. | |||||
| * [DONE] Now have a vectorless ARM version; need NEON. | |||||
| * Improve speed of 32-bit field code. | |||||
| * [DONE] Run through the SAGE tool to generate new bias & bound. | |||||
| * [DONE] Portability: make the outer layers of the code 32-bit clean. | * [DONE] Portability: make the outer layers of the code 32-bit clean. | ||||
| * [DONE] Performance/flexibility: decide which parameters should be hard-coded. | * [DONE] Performance/flexibility: decide which parameters should be hard-coded. | ||||
| * Perhaps useful for comb precomputation. | * Perhaps useful for comb precomputation. | ||||
| * Performance: Improve SHA512. | |||||
| * [DONE?] Improve portability. | |||||
| * Improve speed. | |||||
| * Except not, because this adds too much code size. | |||||
| * Link OpenSSL if a fast SHA is desired. | |||||
| * Protocol: | |||||
| * Decide what things to stir into hashes for various functions. | |||||
| * Performance: improve the Barrett field code. | |||||
| * Support other primes? | |||||
| * Capture prime shape into a struct instead of passing 3 params. | |||||
| * [DONE] Make 32-bit clean. | |||||
| * Automation: | |||||
| * Improve the SAGE tool to cover more cases | |||||
| * Real SSA classes to cover branching and looping | |||||
| * Constant-time selection | |||||
| * Intrinsics code | |||||
| * Field code? | |||||
| * SAGE tool is impossibly slow on 32-bit | |||||
| * Currently stuck on Elligator after 19 hours. | |||||
| * [FIXED] at least for now. | |||||
| * Vector-mul-chains | |||||
| * Negation "bubble pushing" optimization | |||||
| * Performance: Improve SHAKE. | |||||
| * Improve speed. (Maybe) | |||||
| * Clear other TODO/FIXME/HACK/PERF items in the code | * Clear other TODO/FIXME/HACK/PERF items in the code | ||||
| * [DONE?] Submit to SUPERCOP | |||||
| * Submit Decaf to SUPERCOP | |||||
| @@ -4,7 +4,10 @@ | |||||
| * Copyright (c) 2015 Cryptography Research, Inc. \n | * Copyright (c) 2015 Cryptography Research, Inc. \n | ||||
| * Released under the MIT License. See LICENSE.txt for license information. | * Released under the MIT License. See LICENSE.txt for license information. | ||||
| * @author Mike Hamburg | * @author Mike Hamburg | ||||
| * @brief Decaf cyrpto routines. | |||||
| * @brief Example Decaf cyrpto routines. | |||||
| * @warning These are merely examples, though they ought to be secure. But real | |||||
| * protocols will decide differently on magic numbers, formats, which items to | |||||
| * hash, etc. | |||||
| * @warning Experimental! The names, parameter orders etc are likely to change. | * @warning Experimental! The names, parameter orders etc are likely to change. | ||||
| */ | */ | ||||
| @@ -5,7 +5,7 @@ | |||||
| * Copyright (c) 2015 Cryptography Research, Inc. \n | * Copyright (c) 2015 Cryptography Research, Inc. \n | ||||
| * Released under the MIT License. See LICENSE.txt for license information. | * Released under the MIT License. See LICENSE.txt for license information. | ||||
| * @author Mike Hamburg | * @author Mike Hamburg | ||||
| * @brief Decaf cyrpto routines. | |||||
| * @brief Example Decaf cyrpto routines. | |||||
| */ | */ | ||||
| #include "decaf_crypto.h" | #include "decaf_crypto.h" | ||||
| @@ -1106,12 +1106,6 @@ static void gf_batch_invert ( | |||||
| /* const */ gf *in, | /* const */ gf *in, | ||||
| unsigned int n | unsigned int n | ||||
| ) { | ) { | ||||
| // if (n==0) { | |||||
| // return; | |||||
| // } else if (n==1) { | |||||
| // field_inverse(out[0],in[0]); | |||||
| // return; | |||||
| // } | |||||
| assert(n>1); | assert(n>1); | ||||
| gf_cpy(out[1], in[0]); | gf_cpy(out[1], in[0]); | ||||
| @@ -1254,7 +1248,7 @@ void decaf_448_precomputed_scalarmul ( | |||||
| for (k=0; k<t; k++) { | for (k=0; k<t; k++) { | ||||
| unsigned int bit = i + s*(k + j*t); | unsigned int bit = i + s*(k + j*t); | ||||
| if (bit < SCALAR_WORDS * WBITS) { | |||||
| if (bit < DECAF_448_SCALAR_BITS) { | |||||
| tab |= (scalar1x->limb[bit/WBITS] >> (bit%WBITS) & 1) << k; | tab |= (scalar1x->limb[bit/WBITS] >> (bit%WBITS) & 1) << k; | ||||
| } | } | ||||
| } | } | ||||
| @@ -24,45 +24,6 @@ typedef struct field_t field_a_t[1]; | |||||
| #define IF32(s) | #define IF32(s) | ||||
| #endif | #endif | ||||
| /** @brief Bytes in a field element */ | |||||
| #define FIELD_BYTES (1+(FIELD_BITS-1)/8) | |||||
| /** @brief Words in a field element */ | |||||
| #define FIELD_WORDS (1+(FIELD_BITS-1)/sizeof(word_t)) | |||||
| /* TODO: standardize notation */ | |||||
| /** @brief The number of words in the Goldilocks field. */ | |||||
| #define GOLDI_FIELD_WORDS DIV_CEIL(FIELD_BITS,WORD_BITS) | |||||
| /** @brief The number of bits in the Goldilocks curve's cofactor (cofactor=4). */ | |||||
| #define COFACTOR_BITS 2 | |||||
| /** @brief The number of bits in a Goldilocks scalar. */ | |||||
| #define SCALAR_BITS (FIELD_BITS - COFACTOR_BITS) | |||||
| /** @brief The number of bytes in a Goldilocks scalar. */ | |||||
| #define SCALAR_BYTES (1+(SCALAR_BITS)/8) | |||||
| /** @brief The number of words in the Goldilocks field. */ | |||||
| #define SCALAR_WORDS WORDS_FOR_BITS(SCALAR_BITS) | |||||
| /** | |||||
| * @brief For GMP tests: little-endian representation of the field modulus. | |||||
| */ | |||||
| extern const uint8_t FIELD_MODULUS[FIELD_BYTES]; | |||||
| /** | |||||
| * Copy one field element to another. | |||||
| */ | |||||
| static inline void | |||||
| __attribute__((unused,always_inline)) | |||||
| field_copy ( | |||||
| field_a_restrict_t a, | |||||
| const field_a_restrict_t b | |||||
| ) { | |||||
| memcpy(a,b,sizeof(*a)); | |||||
| } | |||||
| /** | /** | ||||
| * Returns 1/sqrt(+- x). | * Returns 1/sqrt(+- x). | ||||
| * | * | ||||
| @@ -76,38 +37,21 @@ field_isr ( | |||||
| field_a_t a, | field_a_t a, | ||||
| const field_a_t x | const field_a_t x | ||||
| ); | ); | ||||
| /** | |||||
| * Batch inverts out[i] = 1/in[i] | |||||
| * | |||||
| * If any input is zero, all the outputs will be zero. | |||||
| */ | |||||
| void | |||||
| field_simultaneous_invert ( | |||||
| field_a_t *__restrict__ out, | |||||
| const field_a_t *in, | |||||
| unsigned int n | |||||
| ); | |||||
| /** | /** | ||||
| * Returns 1/x. | * Returns 1/x. | ||||
| * | * | ||||
| * If x=0, returns 0. | * If x=0, returns 0. | ||||
| * | |||||
| * TODO: this is currently unused in Decaf, but I've left a decl | |||||
| * for it because field_inverse is different (and simpler) than | |||||
| * field_isqrt for 5-mod-8 fields. | |||||
| */ | */ | ||||
| void | void | ||||
| field_inverse ( | field_inverse ( | ||||
| field_a_t a, | field_a_t a, | ||||
| const field_a_t x | const field_a_t x | ||||
| ); | ); | ||||
| /** | |||||
| * Returns -1 if a==b, 0 otherwise. | |||||
| */ | |||||
| mask_t | |||||
| field_eq ( | |||||
| const field_a_t a, | |||||
| const field_a_t b | |||||
| ); | |||||
| /** | /** | ||||
| * Square x, n times. | * Square x, n times. | ||||
| @@ -135,53 +79,6 @@ field_sqrn ( | |||||
| } | } | ||||
| } | } | ||||
| static __inline__ mask_t | |||||
| __attribute__((unused,always_inline)) | |||||
| field_high_bit (const field_a_t f) { | |||||
| field_a_t red; | |||||
| field_copy(red,f); | |||||
| field_weak_reduce(red); | |||||
| field_add_RAW(red,red,red); | |||||
| field_strong_reduce(red); | |||||
| return -(1&red->limb[0]); | |||||
| } | |||||
| static __inline__ mask_t | |||||
| __attribute__((unused,always_inline)) | |||||
| field_make_nonzero (field_a_t f) { | |||||
| mask_t z = field_is_zero(f); | |||||
| field_addw( f, -z ); | |||||
| return z; | |||||
| } | |||||
| /* Multiply by signed curve constant */ | |||||
| static __inline__ void | |||||
| field_mulw_scc ( | |||||
| field_a_restrict_t out, | |||||
| const field_a_t a, | |||||
| int64_t scc | |||||
| ) { | |||||
| if (scc >= 0) { | |||||
| field_mulw(out, a, scc); | |||||
| } else { | |||||
| field_mulw(out, a, -scc); | |||||
| field_neg_RAW(out,out); | |||||
| field_bias(out,2); | |||||
| } | |||||
| } | |||||
| /* Multiply by signed curve constant and weak reduce if biased */ | |||||
| static __inline__ void | |||||
| field_mulw_scc_wr ( | |||||
| field_a_restrict_t out, | |||||
| const field_a_t a, | |||||
| int64_t scc | |||||
| ) { | |||||
| field_mulw_scc(out, a, scc); | |||||
| if (scc < 0) | |||||
| field_weak_reduce(out); | |||||
| } | |||||
| static __inline__ void | static __inline__ void | ||||
| field_subx_RAW ( | field_subx_RAW ( | ||||
| field_a_t d, | field_a_t d, | ||||
| @@ -214,40 +111,6 @@ field_add ( | |||||
| field_weak_reduce ( d ); | field_weak_reduce ( d ); | ||||
| } | } | ||||
| static __inline__ void | |||||
| field_subw ( | |||||
| field_a_t d, | |||||
| word_t c | |||||
| ) { | |||||
| field_subw_RAW ( d, c ); | |||||
| field_bias( d, 1 ); | |||||
| field_weak_reduce ( d ); | |||||
| } | |||||
| static __inline__ void | |||||
| field_neg ( | |||||
| field_a_t d, | |||||
| const field_a_t a | |||||
| ) { | |||||
| field_neg_RAW ( d, a ); | |||||
| field_bias( d, 2 ); | |||||
| field_weak_reduce ( d ); | |||||
| } | |||||
| /** | |||||
| * Negate a in place if doNegate. | |||||
| */ | |||||
| static inline void | |||||
| __attribute__((unused,always_inline)) | |||||
| field_cond_neg ( | |||||
| field_a_t a, | |||||
| mask_t doNegate | |||||
| ) { | |||||
| field_a_t negated; | |||||
| field_neg(negated, a); | |||||
| constant_time_select(a, negated, a, sizeof(negated), doNegate); | |||||
| } | |||||
| /** Require the warning annotation on raw routines */ | /** Require the warning annotation on raw routines */ | ||||
| #define ANALYZE_THIS_ROUTINE_CAREFULLY const int ANNOTATE___ANALYZE_THIS_ROUTINE_CAREFULLY = 0; | #define ANALYZE_THIS_ROUTINE_CAREFULLY const int ANNOTATE___ANALYZE_THIS_ROUTINE_CAREFULLY = 0; | ||||
| #define MUST_BE_CAREFUL (void) ANNOTATE___ANALYZE_THIS_ROUTINE_CAREFULLY | #define MUST_BE_CAREFUL (void) ANNOTATE___ANALYZE_THIS_ROUTINE_CAREFULLY | ||||
| @@ -17,12 +17,6 @@ typedef struct p448_t { | |||||
| extern "C" { | extern "C" { | ||||
| #endif | #endif | ||||
| static __inline__ void | |||||
| p448_set_ui ( | |||||
| p448_t *out, | |||||
| uint64_t x | |||||
| ) __attribute__((unused,always_inline)); | |||||
| static __inline__ void | static __inline__ void | ||||
| p448_add_RAW ( | p448_add_RAW ( | ||||
| p448_t *out, | p448_t *out, | ||||
| @@ -37,24 +31,6 @@ p448_sub_RAW ( | |||||
| const p448_t *b | const p448_t *b | ||||
| ) __attribute__((unused,always_inline)); | ) __attribute__((unused,always_inline)); | ||||
| static __inline__ void | |||||
| p448_neg_RAW ( | |||||
| p448_t *out, | |||||
| const p448_t *a | |||||
| ) __attribute__((unused,always_inline)); | |||||
| static __inline__ void | |||||
| p448_addw ( | |||||
| p448_t *a, | |||||
| uint32_t x | |||||
| ) __attribute__((unused,always_inline)); | |||||
| static __inline__ void | |||||
| p448_subw ( | |||||
| p448_t *a, | |||||
| uint32_t x | |||||
| ) __attribute__((unused,always_inline)); | |||||
| static __inline__ void | static __inline__ void | ||||
| p448_copy ( | p448_copy ( | ||||
| p448_t *out, | p448_t *out, | ||||
| @@ -70,11 +46,6 @@ void | |||||
| p448_strong_reduce ( | p448_strong_reduce ( | ||||
| p448_t *inout | p448_t *inout | ||||
| ); | ); | ||||
| mask_t | |||||
| p448_is_zero ( | |||||
| const p448_t *in | |||||
| ); | |||||
| static __inline__ void | static __inline__ void | ||||
| p448_bias ( | p448_bias ( | ||||
| @@ -116,19 +87,6 @@ p448_deserialize ( | |||||
| /* -------------- Inline functions begin here -------------- */ | /* -------------- Inline functions begin here -------------- */ | ||||
| void | |||||
| p448_set_ui ( | |||||
| p448_t *out, | |||||
| uint64_t x | |||||
| ) { | |||||
| int i; | |||||
| out->limb[0] = x & ((1<<28)-1); | |||||
| out->limb[1] = x>>28; | |||||
| for (i=2; i<16; i++) { | |||||
| out->limb[i] = 0; | |||||
| } | |||||
| } | |||||
| void | void | ||||
| p448_add_RAW ( | p448_add_RAW ( | ||||
| p448_t *out, | p448_t *out, | ||||
| @@ -165,39 +123,6 @@ p448_sub_RAW ( | |||||
| */ | */ | ||||
| } | } | ||||
| void | |||||
| p448_neg_RAW ( | |||||
| p448_t *out, | |||||
| const p448_t *a | |||||
| ) { | |||||
| unsigned int i; | |||||
| for (i=0; i<sizeof(*out)/sizeof(uint32xn_t); i++) { | |||||
| ((uint32xn_t*)out)[i] = -((const uint32xn_t*)a)[i]; | |||||
| } | |||||
| /* | |||||
| unsigned int i; | |||||
| for (i=0; i<sizeof(*out)/sizeof(out->limb[0]); i++) { | |||||
| out->limb[i] = -a->limb[i]; | |||||
| } | |||||
| */ | |||||
| } | |||||
| void | |||||
| p448_addw ( | |||||
| p448_t *a, | |||||
| uint32_t x | |||||
| ) { | |||||
| a->limb[0] += x; | |||||
| } | |||||
| void | |||||
| p448_subw ( | |||||
| p448_t *a, | |||||
| uint32_t x | |||||
| ) { | |||||
| a->limb[0] -= x; | |||||
| } | |||||
| void | void | ||||
| p448_copy ( | p448_copy ( | ||||
| p448_t *out, | p448_t *out, | ||||
| @@ -17,12 +17,6 @@ typedef struct p448_t { | |||||
| extern "C" { | extern "C" { | ||||
| #endif | #endif | ||||
| static __inline__ void | |||||
| p448_set_ui ( | |||||
| p448_t *out, | |||||
| uint64_t x | |||||
| ) __attribute__((unused,always_inline)); | |||||
| static __inline__ void | static __inline__ void | ||||
| p448_add_RAW ( | p448_add_RAW ( | ||||
| p448_t *out, | p448_t *out, | ||||
| @@ -37,24 +31,6 @@ p448_sub_RAW ( | |||||
| const p448_t *b | const p448_t *b | ||||
| ) __attribute__((unused,always_inline)); | ) __attribute__((unused,always_inline)); | ||||
| static __inline__ void | |||||
| p448_neg_RAW ( | |||||
| p448_t *out, | |||||
| const p448_t *a | |||||
| ) __attribute__((unused,always_inline)); | |||||
| static __inline__ void | |||||
| p448_addw ( | |||||
| p448_t *a, | |||||
| uint32_t x | |||||
| ) __attribute__((unused,always_inline)); | |||||
| static __inline__ void | |||||
| p448_subw ( | |||||
| p448_t *a, | |||||
| uint32_t x | |||||
| ) __attribute__((unused,always_inline)); | |||||
| static __inline__ void | static __inline__ void | ||||
| p448_copy ( | p448_copy ( | ||||
| p448_t *out, | p448_t *out, | ||||
| @@ -70,11 +46,6 @@ void | |||||
| p448_strong_reduce ( | p448_strong_reduce ( | ||||
| p448_t *inout | p448_t *inout | ||||
| ); | ); | ||||
| mask_t | |||||
| p448_is_zero ( | |||||
| const p448_t *in | |||||
| ); | |||||
| static __inline__ void | static __inline__ void | ||||
| p448_bias ( | p448_bias ( | ||||
| @@ -116,19 +87,6 @@ p448_deserialize ( | |||||
| /* -------------- Inline functions begin here -------------- */ | /* -------------- Inline functions begin here -------------- */ | ||||
| void | |||||
| p448_set_ui ( | |||||
| p448_t *out, | |||||
| uint64_t x | |||||
| ) { | |||||
| int i; | |||||
| out->limb[0] = x & ((1<<28)-1); | |||||
| out->limb[1] = x>>28; | |||||
| for (i=2; i<16; i++) { | |||||
| out->limb[i] = 0; | |||||
| } | |||||
| } | |||||
| void | void | ||||
| p448_add_RAW ( | p448_add_RAW ( | ||||
| p448_t *out, | p448_t *out, | ||||
| @@ -165,39 +123,6 @@ p448_sub_RAW ( | |||||
| */ | */ | ||||
| } | } | ||||
| void | |||||
| p448_neg_RAW ( | |||||
| p448_t *out, | |||||
| const p448_t *a | |||||
| ) { | |||||
| unsigned int i; | |||||
| for (i=0; i<sizeof(*out)/sizeof(uint32xn_t); i++) { | |||||
| ((uint32xn_t*)out)[i] = -((const uint32xn_t*)a)[i]; | |||||
| } | |||||
| /* | |||||
| unsigned int i; | |||||
| for (i=0; i<sizeof(*out)/sizeof(out->limb[0]); i++) { | |||||
| out->limb[i] = -a->limb[i]; | |||||
| } | |||||
| */ | |||||
| } | |||||
| void | |||||
| p448_addw ( | |||||
| p448_t *a, | |||||
| uint32_t x | |||||
| ) { | |||||
| a->limb[0] += x; | |||||
| } | |||||
| void | |||||
| p448_subw ( | |||||
| p448_t *a, | |||||
| uint32_t x | |||||
| ) { | |||||
| a->limb[0] -= x; | |||||
| } | |||||
| void | void | ||||
| p448_copy ( | p448_copy ( | ||||
| p448_t *out, | p448_t *out, | ||||
| @@ -27,12 +27,6 @@ typedef struct p448_t { | |||||
| extern "C" { | extern "C" { | ||||
| #endif | #endif | ||||
| static __inline__ void | |||||
| p448_set_ui ( | |||||
| p448_t *out, | |||||
| uint64_t x | |||||
| ) __attribute__((unused,always_inline)); | |||||
| static __inline__ void | static __inline__ void | ||||
| p448_add_RAW ( | p448_add_RAW ( | ||||
| p448_t *out, | p448_t *out, | ||||
| @@ -47,24 +41,6 @@ p448_sub_RAW ( | |||||
| const p448_t *b | const p448_t *b | ||||
| ) __attribute__((unused,always_inline)); | ) __attribute__((unused,always_inline)); | ||||
| static __inline__ void | |||||
| p448_neg_RAW ( | |||||
| p448_t *out, | |||||
| const p448_t *a | |||||
| ) __attribute__((unused,always_inline)); | |||||
| static __inline__ void | |||||
| p448_addw ( | |||||
| p448_t *a, | |||||
| uint32_t x | |||||
| ) __attribute__((unused,always_inline)); | |||||
| static __inline__ void | |||||
| p448_subw ( | |||||
| p448_t *a, | |||||
| uint32_t x | |||||
| ) __attribute__((unused,always_inline)); | |||||
| static __inline__ void | static __inline__ void | ||||
| p448_copy ( | p448_copy ( | ||||
| p448_t *out, | p448_t *out, | ||||
| @@ -80,11 +56,6 @@ void | |||||
| p448_strong_reduce ( | p448_strong_reduce ( | ||||
| p448_t *inout | p448_t *inout | ||||
| ); | ); | ||||
| mask_t | |||||
| p448_is_zero ( | |||||
| const p448_t *in | |||||
| ); | |||||
| static __inline__ void | static __inline__ void | ||||
| p448_bias ( | p448_bias ( | ||||
| @@ -169,39 +140,6 @@ p448_sub_RAW ( | |||||
| */ | */ | ||||
| } | } | ||||
| void | |||||
| p448_neg_RAW ( | |||||
| p448_t *out, | |||||
| const p448_t *a | |||||
| ) { | |||||
| unsigned int i; | |||||
| for (i=0; i<sizeof(*out)/sizeof(uint32xn_t); i++) { | |||||
| ((uint32xn_t*)out)[i] = -((const uint32xn_t*)a)[i]; | |||||
| } | |||||
| /* | |||||
| unsigned int i; | |||||
| for (i=0; i<sizeof(*out)/sizeof(out->limb[0]); i++) { | |||||
| out->limb[i] = -a->limb[i]; | |||||
| } | |||||
| */ | |||||
| } | |||||
| void | |||||
| p448_addw ( | |||||
| p448_t *a, | |||||
| uint32_t x | |||||
| ) { | |||||
| a->limb[0] += x; | |||||
| } | |||||
| void | |||||
| p448_subw ( | |||||
| p448_t *a, | |||||
| uint32_t x | |||||
| ) { | |||||
| a->limb[0] -= x; | |||||
| } | |||||
| void | void | ||||
| p448_copy ( | p448_copy ( | ||||
| p448_t *out, | p448_t *out, | ||||
| @@ -18,12 +18,6 @@ typedef struct p448_t { | |||||
| extern "C" { | extern "C" { | ||||
| #endif | #endif | ||||
| static __inline__ void | |||||
| p448_set_ui ( | |||||
| p448_t *out, | |||||
| uint64_t x | |||||
| ) __attribute__((unused)); | |||||
| static __inline__ void | static __inline__ void | ||||
| p448_add_RAW ( | p448_add_RAW ( | ||||
| p448_t *out, | p448_t *out, | ||||
| @@ -38,24 +32,6 @@ p448_sub_RAW ( | |||||
| const p448_t *b | const p448_t *b | ||||
| ) __attribute__((unused)); | ) __attribute__((unused)); | ||||
| static __inline__ void | |||||
| p448_neg_RAW ( | |||||
| p448_t *out, | |||||
| const p448_t *a | |||||
| ) __attribute__((unused)); | |||||
| static __inline__ void | |||||
| p448_addw ( | |||||
| p448_t *a, | |||||
| uint64_t x | |||||
| ) __attribute__((unused)); | |||||
| static __inline__ void | |||||
| p448_subw ( | |||||
| p448_t *a, | |||||
| uint64_t x | |||||
| ) __attribute__((unused)); | |||||
| static __inline__ void | static __inline__ void | ||||
| p448_copy ( | p448_copy ( | ||||
| p448_t *out, | p448_t *out, | ||||
| @@ -72,22 +48,11 @@ p448_strong_reduce ( | |||||
| p448_t *inout | p448_t *inout | ||||
| ); | ); | ||||
| mask_t | |||||
| p448_is_zero ( | |||||
| const p448_t *in | |||||
| ); | |||||
| static __inline__ void | static __inline__ void | ||||
| p448_bias ( | p448_bias ( | ||||
| p448_t *inout, | p448_t *inout, | ||||
| int amount | int amount | ||||
| ) __attribute__((unused)); | ) __attribute__((unused)); | ||||
| static __inline__ void | |||||
| p448_really_bias ( | |||||
| p448_t *inout, | |||||
| int amount | |||||
| ) __attribute__((unused)); | |||||
| void | void | ||||
| p448_mul ( | p448_mul ( | ||||
| @@ -123,18 +88,6 @@ p448_deserialize ( | |||||
| /* -------------- Inline functions begin here -------------- */ | /* -------------- Inline functions begin here -------------- */ | ||||
| void | |||||
| p448_set_ui ( | |||||
| p448_t *out, | |||||
| uint64_t x | |||||
| ) { | |||||
| int i; | |||||
| out->limb[0] = x; | |||||
| for (i=1; i<8; i++) { | |||||
| out->limb[i] = 0; | |||||
| } | |||||
| } | |||||
| void | void | ||||
| p448_add_RAW ( | p448_add_RAW ( | ||||
| p448_t *out, | p448_t *out, | ||||
| @@ -162,39 +115,6 @@ p448_sub_RAW ( | |||||
| p448_weak_reduce(out); | p448_weak_reduce(out); | ||||
| } | } | ||||
| void | |||||
| p448_neg_RAW ( | |||||
| struct p448_t *out, | |||||
| const p448_t *a | |||||
| ) { | |||||
| unsigned int i; | |||||
| uint64_t co1 = ((1ull<<56)-1)*2, co2 = co1-2; | |||||
| for (i=0; i<8; i++) { | |||||
| out->limb[i] = ((i==4) ? co2 : co1) - a->limb[i]; | |||||
| } | |||||
| p448_weak_reduce(out); | |||||
| } | |||||
| void | |||||
| p448_addw ( | |||||
| p448_t *a, | |||||
| uint64_t x | |||||
| ) { | |||||
| a->limb[0] += x; | |||||
| a->limb[1] += a->limb[0]>>56; | |||||
| a->limb[0] &= (1ull<<56)-1; | |||||
| } | |||||
| void | |||||
| p448_subw ( | |||||
| p448_t *a, | |||||
| uint64_t x | |||||
| ) { | |||||
| a->limb[0] -= x; | |||||
| p448_really_bias(a, 1); | |||||
| p448_weak_reduce(a); | |||||
| } | |||||
| void | void | ||||
| p448_copy ( | p448_copy ( | ||||
| p448_t *out, | p448_t *out, | ||||
| @@ -203,18 +123,6 @@ p448_copy ( | |||||
| memcpy(out,a,sizeof(*a)); | memcpy(out,a,sizeof(*a)); | ||||
| } | } | ||||
| void | |||||
| p448_really_bias ( | |||||
| p448_t *a, | |||||
| int amt | |||||
| ) { | |||||
| uint64_t co1 = ((1ull<<56)-1)*amt, co2 = co1-amt; | |||||
| int i; | |||||
| for (i=0; i<8; i++) { | |||||
| a->limb[i] += (i==4) ? co2 : co1; | |||||
| } | |||||
| } | |||||
| void | void | ||||
| p448_bias ( | p448_bias ( | ||||
| p448_t *a, | p448_t *a, | ||||
| @@ -17,12 +17,6 @@ typedef struct p448_t { | |||||
| extern "C" { | extern "C" { | ||||
| #endif | #endif | ||||
| static __inline__ void | |||||
| p448_set_ui ( | |||||
| p448_t *out, | |||||
| uint64_t x | |||||
| ) __attribute__((unused,always_inline)); | |||||
| static __inline__ void | static __inline__ void | ||||
| p448_add_RAW ( | p448_add_RAW ( | ||||
| p448_t *out, | p448_t *out, | ||||
| @@ -37,24 +31,6 @@ p448_sub_RAW ( | |||||
| const p448_t *b | const p448_t *b | ||||
| ) __attribute__((unused,always_inline)); | ) __attribute__((unused,always_inline)); | ||||
| static __inline__ void | |||||
| p448_neg_RAW ( | |||||
| p448_t *out, | |||||
| const p448_t *a | |||||
| ) __attribute__((unused,always_inline)); | |||||
| static __inline__ void | |||||
| p448_addw ( | |||||
| p448_t *a, | |||||
| uint64_t x | |||||
| ) __attribute__((unused,always_inline)); | |||||
| static __inline__ void | |||||
| p448_subw ( | |||||
| p448_t *a, | |||||
| uint64_t x | |||||
| ) __attribute__((unused,always_inline)); | |||||
| static __inline__ void | static __inline__ void | ||||
| p448_copy ( | p448_copy ( | ||||
| p448_t *out, | p448_t *out, | ||||
| @@ -71,11 +47,6 @@ p448_strong_reduce ( | |||||
| p448_t *inout | p448_t *inout | ||||
| ); | ); | ||||
| mask_t | |||||
| p448_is_zero ( | |||||
| const p448_t *in | |||||
| ); | |||||
| static __inline__ void | static __inline__ void | ||||
| p448_bias ( | p448_bias ( | ||||
| p448_t *inout, | p448_t *inout, | ||||
| @@ -116,18 +87,6 @@ p448_deserialize ( | |||||
| /* -------------- Inline functions begin here -------------- */ | /* -------------- Inline functions begin here -------------- */ | ||||
| void | |||||
| p448_set_ui ( | |||||
| p448_t *out, | |||||
| uint64_t x | |||||
| ) { | |||||
| int i; | |||||
| out->limb[0] = x; | |||||
| for (i=1; i<8; i++) { | |||||
| out->limb[i] = 0; | |||||
| } | |||||
| } | |||||
| void | void | ||||
| p448_add_RAW ( | p448_add_RAW ( | ||||
| p448_t *out, | p448_t *out, | ||||
| @@ -164,39 +123,6 @@ p448_sub_RAW ( | |||||
| */ | */ | ||||
| } | } | ||||
| void | |||||
| p448_neg_RAW ( | |||||
| struct p448_t *out, | |||||
| const p448_t *a | |||||
| ) { | |||||
| unsigned int i; | |||||
| for (i=0; i<sizeof(*out)/sizeof(uint64xn_t); i++) { | |||||
| ((uint64xn_t*)out)[i] = -((const uint64xn_t*)a)[i]; | |||||
| } | |||||
| /* | |||||
| unsigned int i; | |||||
| for (i=0; i<sizeof(*out)/sizeof(out->limb[0]); i++) { | |||||
| out->limb[i] = -a->limb[i]; | |||||
| } | |||||
| */ | |||||
| } | |||||
| void | |||||
| p448_addw ( | |||||
| p448_t *a, | |||||
| uint64_t x | |||||
| ) { | |||||
| a->limb[0] += x; | |||||
| } | |||||
| void | |||||
| p448_subw ( | |||||
| p448_t *a, | |||||
| uint64_t x | |||||
| ) { | |||||
| a->limb[0] -= x; | |||||
| } | |||||
| void | void | ||||
| p448_copy ( | p448_copy ( | ||||
| p448_t *out, | p448_t *out, | ||||
| @@ -20,19 +20,12 @@ | |||||
| #define field_add_RAW p448_add_RAW | #define field_add_RAW p448_add_RAW | ||||
| #define field_sub_RAW p448_sub_RAW | #define field_sub_RAW p448_sub_RAW | ||||
| #define field_mulw p448_mulw | #define field_mulw p448_mulw | ||||
| #define field_addw p448_addw | |||||
| #define field_subw_RAW p448_subw | |||||
| #define field_neg_RAW p448_neg_RAW | |||||
| #define field_set_ui p448_set_ui | |||||
| #define field_bias p448_bias | #define field_bias p448_bias | ||||
| #define field_inverse p448_inverse | |||||
| #define field_eq p448_eq | |||||
| #define field_isr p448_isr | #define field_isr p448_isr | ||||
| #define field_simultaneous_invert p448_simultaneous_invert | |||||
| #define field_inverse p448_inverse | |||||
| #define field_weak_reduce p448_weak_reduce | #define field_weak_reduce p448_weak_reduce | ||||
| #define field_strong_reduce p448_strong_reduce | #define field_strong_reduce p448_strong_reduce | ||||
| #define field_serialize p448_serialize | #define field_serialize p448_serialize | ||||
| #define field_deserialize p448_deserialize | #define field_deserialize p448_deserialize | ||||
| #define field_is_zero p448_is_zero | |||||
| #endif /* __F_FIELD_H__ */ | #endif /* __F_FIELD_H__ */ | ||||
| @@ -17,12 +17,6 @@ typedef struct p480_t { | |||||
| extern "C" { | extern "C" { | ||||
| #endif | #endif | ||||
| static __inline__ void | |||||
| p480_set_ui ( | |||||
| p480_t *out, | |||||
| uint64_t x | |||||
| ) __attribute__((unused,always_inline)); | |||||
| static __inline__ void | static __inline__ void | ||||
| p480_add_RAW ( | p480_add_RAW ( | ||||
| p480_t *out, | p480_t *out, | ||||
| @@ -37,24 +31,6 @@ p480_sub_RAW ( | |||||
| const p480_t *b | const p480_t *b | ||||
| ) __attribute__((unused,always_inline)); | ) __attribute__((unused,always_inline)); | ||||
| static __inline__ void | |||||
| p480_neg_RAW ( | |||||
| p480_t *out, | |||||
| const p480_t *a | |||||
| ) __attribute__((unused,always_inline)); | |||||
| static __inline__ void | |||||
| p480_addw ( | |||||
| p480_t *a, | |||||
| uint64_t x | |||||
| ) __attribute__((unused,always_inline)); | |||||
| static __inline__ void | |||||
| p480_subw ( | |||||
| p480_t *a, | |||||
| uint64_t x | |||||
| ) __attribute__((unused,always_inline)); | |||||
| static __inline__ void | static __inline__ void | ||||
| p480_copy ( | p480_copy ( | ||||
| p480_t *out, | p480_t *out, | ||||
| @@ -70,11 +46,6 @@ void | |||||
| p480_strong_reduce ( | p480_strong_reduce ( | ||||
| p480_t *inout | p480_t *inout | ||||
| ); | ); | ||||
| mask_t | |||||
| p480_is_zero ( | |||||
| const p480_t *in | |||||
| ); | |||||
| static __inline__ void | static __inline__ void | ||||
| p480_bias ( | p480_bias ( | ||||
| @@ -116,18 +87,6 @@ p480_deserialize ( | |||||
| /* -------------- Inline functions begin here -------------- */ | /* -------------- Inline functions begin here -------------- */ | ||||
| void | |||||
| p480_set_ui ( | |||||
| p480_t *out, | |||||
| uint64_t x | |||||
| ) { | |||||
| int i; | |||||
| out->limb[0] = x; | |||||
| for (i=1; i<8; i++) { | |||||
| out->limb[i] = 0; | |||||
| } | |||||
| } | |||||
| void | void | ||||
| p480_add_RAW ( | p480_add_RAW ( | ||||
| p480_t *out, | p480_t *out, | ||||
| @@ -164,39 +123,6 @@ p480_sub_RAW ( | |||||
| */ | */ | ||||
| } | } | ||||
| void | |||||
| p480_neg_RAW ( | |||||
| struct p480_t *out, | |||||
| const p480_t *a | |||||
| ) { | |||||
| unsigned int i; | |||||
| for (i=0; i<sizeof(*out)/sizeof(uint64xn_t); i++) { | |||||
| ((uint64xn_t*)out)[i] = -((const uint64xn_t*)a)[i]; | |||||
| } | |||||
| /* | |||||
| unsigned int i; | |||||
| for (i=0; i<sizeof(*out)/sizeof(out->limb[0]); i++) { | |||||
| out->limb[i] = -a->limb[i]; | |||||
| } | |||||
| */ | |||||
| } | |||||
| void | |||||
| p480_addw ( | |||||
| p480_t *a, | |||||
| uint64_t x | |||||
| ) { | |||||
| a->limb[0] += x; | |||||
| } | |||||
| void | |||||
| p480_subw ( | |||||
| p480_t *a, | |||||
| uint64_t x | |||||
| ) { | |||||
| a->limb[0] -= x; | |||||
| } | |||||
| void | void | ||||
| p480_copy ( | p480_copy ( | ||||
| p480_t *out, | p480_t *out, | ||||
| @@ -20,19 +20,12 @@ | |||||
| #define field_add_RAW p480_add_RAW | #define field_add_RAW p480_add_RAW | ||||
| #define field_sub_RAW p480_sub_RAW | #define field_sub_RAW p480_sub_RAW | ||||
| #define field_mulw p480_mulw | #define field_mulw p480_mulw | ||||
| #define field_addw p480_addw | |||||
| #define field_subw_RAW p480_subw | |||||
| #define field_neg_RAW p480_neg_RAW | |||||
| #define field_set_ui p480_set_ui | |||||
| #define field_bias p480_bias | #define field_bias p480_bias | ||||
| #define field_inverse p480_inverse | |||||
| #define field_eq p480_eq | |||||
| #define field_isr p480_isr | #define field_isr p480_isr | ||||
| #define field_simultaneous_invert p480_simultaneous_invert | |||||
| #define field_inverse p480_inverse | |||||
| #define field_weak_reduce p480_weak_reduce | #define field_weak_reduce p480_weak_reduce | ||||
| #define field_strong_reduce p480_strong_reduce | #define field_strong_reduce p480_strong_reduce | ||||
| #define field_serialize p480_serialize | #define field_serialize p480_serialize | ||||
| #define field_deserialize p480_deserialize | #define field_deserialize p480_deserialize | ||||
| #define field_is_zero p480_is_zero | |||||
| #endif /* __F_FIELD_H__ */ | #endif /* __F_FIELD_H__ */ | ||||
| @@ -18,12 +18,6 @@ typedef struct p521_t { | |||||
| extern "C" { | extern "C" { | ||||
| #endif | #endif | ||||
| static __inline__ void | |||||
| p521_set_ui ( | |||||
| p521_t *out, | |||||
| uint64_t x | |||||
| ) __attribute__((unused)); | |||||
| static __inline__ void | static __inline__ void | ||||
| p521_add_RAW ( | p521_add_RAW ( | ||||
| p521_t *out, | p521_t *out, | ||||
| @@ -38,24 +32,6 @@ p521_sub_RAW ( | |||||
| const p521_t *b | const p521_t *b | ||||
| ) __attribute__((unused)); | ) __attribute__((unused)); | ||||
| static __inline__ void | |||||
| p521_neg_RAW ( | |||||
| p521_t *out, | |||||
| const p521_t *a | |||||
| ) __attribute__((unused)); | |||||
| static __inline__ void | |||||
| p521_addw ( | |||||
| p521_t *a, | |||||
| uint64_t x | |||||
| ) __attribute__((unused)); | |||||
| static __inline__ void | |||||
| p521_subw ( | |||||
| p521_t *a, | |||||
| uint64_t x | |||||
| ) __attribute__((unused)); | |||||
| static __inline__ void | static __inline__ void | ||||
| p521_copy ( | p521_copy ( | ||||
| p521_t *out, | p521_t *out, | ||||
| @@ -72,22 +48,11 @@ p521_strong_reduce ( | |||||
| p521_t *inout | p521_t *inout | ||||
| ); | ); | ||||
| mask_t | |||||
| p521_is_zero ( | |||||
| const p521_t *in | |||||
| ); | |||||
| static __inline__ void | static __inline__ void | ||||
| p521_bias ( | p521_bias ( | ||||
| p521_t *inout, | p521_t *inout, | ||||
| int amount | int amount | ||||
| ) __attribute__((unused)); | ) __attribute__((unused)); | ||||
| static __inline__ void | |||||
| p521_really_bias ( | |||||
| p521_t *inout, | |||||
| int amount | |||||
| ) __attribute__((unused)); | |||||
| void | void | ||||
| p521_mul ( | p521_mul ( | ||||
| @@ -123,18 +88,6 @@ p521_deserialize ( | |||||
| /* -------------- Inline functions begin here -------------- */ | /* -------------- Inline functions begin here -------------- */ | ||||
| void | |||||
| p521_set_ui ( | |||||
| p521_t *out, | |||||
| uint64_t x | |||||
| ) { | |||||
| int i; | |||||
| out->limb[0] = x; | |||||
| for (i=1; i<9; i++) { | |||||
| out->limb[i] = 0; | |||||
| } | |||||
| } | |||||
| void | void | ||||
| p521_add_RAW ( | p521_add_RAW ( | ||||
| p521_t *out, | p521_t *out, | ||||
| @@ -162,39 +115,6 @@ p521_sub_RAW ( | |||||
| p521_weak_reduce(out); | p521_weak_reduce(out); | ||||
| } | } | ||||
| void | |||||
| p521_neg_RAW ( | |||||
| struct p521_t *out, | |||||
| const p521_t *a | |||||
| ) { | |||||
| unsigned int i; | |||||
| uint64_t co1 = ((1ull<<58)-1)*4, co2 = ((1ull<<57)-1)*4; | |||||
| for (i=0; i<9; i++) { | |||||
| out->limb[i] = ((i==8) ? co2 : co1) - a->limb[i]; | |||||
| } | |||||
| p521_weak_reduce(out); | |||||
| } | |||||
| void | |||||
| p521_addw ( | |||||
| p521_t *a, | |||||
| uint64_t x | |||||
| ) { | |||||
| a->limb[0] += x; | |||||
| a->limb[1] += a->limb[0]>>58; | |||||
| a->limb[0] &= (1ull<<58)-1; | |||||
| } | |||||
| void | |||||
| p521_subw ( | |||||
| p521_t *a, | |||||
| uint64_t x | |||||
| ) { | |||||
| a->limb[0] -= x; | |||||
| p521_really_bias(a, 1); | |||||
| p521_weak_reduce(a); | |||||
| } | |||||
| void | void | ||||
| p521_copy ( | p521_copy ( | ||||
| p521_t *out, | p521_t *out, | ||||
| @@ -203,18 +123,6 @@ p521_copy ( | |||||
| memcpy(out,a,sizeof(*a)); | memcpy(out,a,sizeof(*a)); | ||||
| } | } | ||||
| void | |||||
| p521_really_bias ( | |||||
| p521_t *a, | |||||
| int amt | |||||
| ) { | |||||
| uint64_t co1 = ((1ull<<58)-1)*2*amt, co2 = ((1ull<<57)-1)*2*amt; | |||||
| int i; | |||||
| for (i=0; i<9; i++) { | |||||
| a->limb[i] += (i==8) ? co2 : co1; | |||||
| } | |||||
| } | |||||
| void | void | ||||
| p521_bias ( | p521_bias ( | ||||
| p521_t *a, | p521_t *a, | ||||
| @@ -22,12 +22,6 @@ typedef struct p521_t { | |||||
| extern "C" { | extern "C" { | ||||
| #endif | #endif | ||||
| static __inline__ void | |||||
| p521_set_ui ( | |||||
| p521_t *out, | |||||
| uint64_t x | |||||
| ) __attribute__((unused)); | |||||
| static __inline__ void | static __inline__ void | ||||
| p521_add_RAW ( | p521_add_RAW ( | ||||
| p521_t *out, | p521_t *out, | ||||
| @@ -42,24 +36,6 @@ p521_sub_RAW ( | |||||
| const p521_t *b | const p521_t *b | ||||
| ) __attribute__((unused)); | ) __attribute__((unused)); | ||||
| static __inline__ void | |||||
| p521_neg_RAW ( | |||||
| p521_t *out, | |||||
| const p521_t *a | |||||
| ) __attribute__((unused)); | |||||
| static __inline__ void | |||||
| p521_addw ( | |||||
| p521_t *a, | |||||
| uint64_t x | |||||
| ) __attribute__((unused)); | |||||
| static __inline__ void | |||||
| p521_subw ( | |||||
| p521_t *a, | |||||
| uint64_t x | |||||
| ) __attribute__((unused)); | |||||
| static __inline__ void | static __inline__ void | ||||
| p521_copy ( | p521_copy ( | ||||
| p521_t *out, | p521_t *out, | ||||
| @@ -76,11 +52,6 @@ p521_strong_reduce ( | |||||
| p521_t *inout | p521_t *inout | ||||
| ); | ); | ||||
| mask_t | |||||
| p521_is_zero ( | |||||
| const p521_t *in | |||||
| ); | |||||
| static __inline__ void | static __inline__ void | ||||
| p521_bias ( | p521_bias ( | ||||
| p521_t *inout, | p521_t *inout, | ||||
| @@ -134,18 +105,6 @@ timesW ( | |||||
| return u.zxyw + u.zwww; | return u.zxyw + u.zwww; | ||||
| } | } | ||||
| void | |||||
| p521_set_ui ( | |||||
| p521_t *out, | |||||
| uint64_t x | |||||
| ) { | |||||
| int i; | |||||
| out->limb[0] = x; | |||||
| for (i=1; i<12; i++) { | |||||
| out->limb[i] = 0; | |||||
| } | |||||
| } | |||||
| void | void | ||||
| p521_add_RAW ( | p521_add_RAW ( | ||||
| p521_t *out, | p521_t *out, | ||||
| @@ -170,33 +129,6 @@ p521_sub_RAW ( | |||||
| } | } | ||||
| } | } | ||||
| void | |||||
| p521_neg_RAW ( | |||||
| struct p521_t *out, | |||||
| const p521_t *a | |||||
| ) { | |||||
| unsigned int i; | |||||
| for (i=0; i<sizeof(*out)/sizeof(uint64xn_t); i++) { | |||||
| ((uint64xn_t*)out)[i] = -((const uint64xn_t*)a)[i]; | |||||
| } | |||||
| } | |||||
| void | |||||
| p521_addw ( | |||||
| p521_t *a, | |||||
| uint64_t x | |||||
| ) { | |||||
| a->limb[0] += x; | |||||
| } | |||||
| void | |||||
| p521_subw ( | |||||
| p521_t *a, | |||||
| uint64_t x | |||||
| ) { | |||||
| a->limb[0] -= x; | |||||
| } | |||||
| void | void | ||||
| p521_copy ( | p521_copy ( | ||||
| p521_t *out, | p521_t *out, | ||||
| @@ -20,19 +20,12 @@ | |||||
| #define field_add_RAW p521_add_RAW | #define field_add_RAW p521_add_RAW | ||||
| #define field_sub_RAW p521_sub_RAW | #define field_sub_RAW p521_sub_RAW | ||||
| #define field_mulw p521_mulw | #define field_mulw p521_mulw | ||||
| #define field_addw p521_addw | |||||
| #define field_subw_RAW p521_subw | |||||
| #define field_neg_RAW p521_neg_RAW | |||||
| #define field_set_ui p521_set_ui | |||||
| #define field_bias p521_bias | #define field_bias p521_bias | ||||
| #define field_inverse p521_inverse | |||||
| #define field_eq p521_eq | |||||
| #define field_isr p521_isr | #define field_isr p521_isr | ||||
| #define field_simultaneous_invert p521_simultaneous_invert | |||||
| #define field_inverse p521_inverse | |||||
| #define field_weak_reduce p521_weak_reduce | #define field_weak_reduce p521_weak_reduce | ||||
| #define field_strong_reduce p521_strong_reduce | #define field_strong_reduce p521_strong_reduce | ||||
| #define field_serialize p521_serialize | #define field_serialize p521_serialize | ||||
| #define field_deserialize p521_deserialize | #define field_deserialize p521_deserialize | ||||
| #define field_is_zero p521_is_zero | |||||
| #endif /* __F_FIELD_H__ */ | #endif /* __F_FIELD_H__ */ | ||||