| @@ -16,7 +16,7 @@ LD = $(CC) | |||||
| LDXX = $(CXX) | LDXX = $(CXX) | ||||
| ASM ?= $(CC) | ASM ?= $(CC) | ||||
| DECAF ?= decaf | |||||
| DECAF ?= decaf_fast | |||||
| ifneq (,$(findstring x86_64,$(MACHINE))) | ifneq (,$(findstring x86_64,$(MACHINE))) | ||||
| ARCH ?= arch_x86_64 | ARCH ?= arch_x86_64 | ||||
| @@ -96,11 +96,6 @@ static const decaf_bool_t DECAF_TRUE = -(decaf_bool_t)1, DECAF_FALSE = 0; | |||||
| static const decaf_bool_t DECAF_SUCCESS = -(decaf_bool_t)1 /*DECAF_TRUE*/, | static const decaf_bool_t DECAF_SUCCESS = -(decaf_bool_t)1 /*DECAF_TRUE*/, | ||||
| DECAF_FAILURE = 0 /*DECAF_FALSE*/; | DECAF_FAILURE = 0 /*DECAF_FALSE*/; | ||||
| /** The prime p, for debugging purposes. | |||||
| * TODO: prevent this scalar from actually being used for non-debugging purposes? | |||||
| */ | |||||
| extern const decaf_448_scalar_t decaf_448_scalar_p API_VIS; | |||||
| /** A scalar equal to 1. */ | /** A scalar equal to 1. */ | ||||
| extern const decaf_448_scalar_t decaf_448_scalar_one API_VIS; | extern const decaf_448_scalar_t decaf_448_scalar_one API_VIS; | ||||
| @@ -12,26 +12,29 @@ | |||||
| #include <stdio.h> | #include <stdio.h> | ||||
| #include <stdlib.h> | #include <stdlib.h> | ||||
| #include "decaf.h" | #include "decaf.h" | ||||
| #include "decaf_448_config.h" | |||||
| #include "decaf_448_config.h" /* MAGIC */ | |||||
| #define API_NS(_id) decaf_448_##_id | |||||
| #define API_NS2(_pref,_id) _pref##_decaf_448_##_id | |||||
| /* To satisfy linker. */ | /* To satisfy linker. */ | ||||
| const decaf_word_t decaf_448_precomputed_base_as_words[1]; | |||||
| const decaf_448_scalar_t decaf_448_precomputed_scalarmul_adjustment; | |||||
| const decaf_448_scalar_t decaf_448_point_scalarmul_adjustment; | |||||
| const decaf_word_t API_NS(precomputed_base_as_words)[1]; | |||||
| const API_NS(scalar_t) API_NS(precomputed_scalarmul_adjustment); | |||||
| const API_NS(scalar_t) API_NS(point_scalarmul_adjustment); | |||||
| struct niels_s; | struct niels_s; | ||||
| const decaf_word_t *decaf_448_precomputed_wnaf_as_words; | |||||
| extern const size_t sizeof_decaf_448_precomputed_wnafs; | |||||
| const decaf_word_t *API_NS(precomputed_wnaf_as_words); | |||||
| extern const size_t API_NS2(sizeof,precomputed_wnafs); | |||||
| void decaf_448_precompute_wnafs ( | |||||
| void API_NS(precompute_wnafs) ( | |||||
| struct niels_s *out, | struct niels_s *out, | ||||
| const decaf_448_point_t base | |||||
| const API_NS(point_t) base | |||||
| ); | ); | ||||
| static void scalar_print(const char *name, const decaf_448_scalar_t sc) { | |||||
| printf("const decaf_448_scalar_t %s = {{{\n", name); | |||||
| static void scalar_print(const char *name, const API_NS(scalar_t) sc) { | |||||
| printf("const API_NS(scalar_t) %s = {{{\n", name); | |||||
| unsigned i; | unsigned i; | ||||
| for (i=0; i<sizeof(decaf_448_scalar_t)/sizeof(decaf_word_t); i++) { | |||||
| for (i=0; i<sizeof(API_NS(scalar_t))/sizeof(decaf_word_t); i++) { | |||||
| if (i) printf(", "); | if (i) printf(", "); | ||||
| printf("0x%0*llxull", (int)sizeof(decaf_word_t)*2, (unsigned long long)sc->limb[i] ); | printf("0x%0*llxull", (int)sizeof(decaf_word_t)*2, (unsigned long long)sc->limb[i] ); | ||||
| } | } | ||||
| @@ -41,26 +44,28 @@ static void scalar_print(const char *name, const decaf_448_scalar_t sc) { | |||||
| int main(int argc, char **argv) { | int main(int argc, char **argv) { | ||||
| (void)argc; (void)argv; | (void)argc; (void)argv; | ||||
| decaf_448_precomputed_s *pre; | |||||
| int ret = posix_memalign((void**)&pre, alignof_decaf_448_precomputed_s, sizeof_decaf_448_precomputed_s); | |||||
| API_NS(precomputed_s) *pre; | |||||
| int ret = posix_memalign((void**)&pre, API_NS2(alignof,precomputed_s), API_NS2(sizeof,precomputed_s)); | |||||
| if (ret || !pre) return 1; | if (ret || !pre) return 1; | ||||
| decaf_448_precompute(pre, decaf_448_point_base); | |||||
| API_NS(precompute)(pre, API_NS(point_base)); | |||||
| struct niels_s *preWnaf; | struct niels_s *preWnaf; | ||||
| ret = posix_memalign((void**)&preWnaf, alignof_decaf_448_precomputed_s, sizeof_decaf_448_precomputed_wnafs); | |||||
| ret = posix_memalign((void**)&preWnaf, API_NS2(alignof,precomputed_s), API_NS2(sizeof,precomputed_wnafs)); | |||||
| if (ret || !preWnaf) return 1; | if (ret || !preWnaf) return 1; | ||||
| decaf_448_precompute_wnafs(preWnaf, decaf_448_point_base); | |||||
| API_NS(precompute_wnafs)(preWnaf, API_NS(point_base)); | |||||
| const decaf_word_t *output = (const decaf_word_t *)pre; | const decaf_word_t *output = (const decaf_word_t *)pre; | ||||
| unsigned i; | unsigned i; | ||||
| printf("/** @warning: this file was automatically generated. */\n"); | printf("/** @warning: this file was automatically generated. */\n"); | ||||
| printf("#include \"decaf.h\"\n\n"); | printf("#include \"decaf.h\"\n\n"); | ||||
| printf("const decaf_word_t decaf_448_precomputed_base_as_words[%d]\n", | |||||
| (int)(sizeof_decaf_448_precomputed_s / sizeof(decaf_word_t))); | |||||
| printf("__attribute__((aligned(%d),visibility(\"hidden\"))) = {\n ", (int)alignof_decaf_448_precomputed_s); | |||||
| printf("#define API_NS(_id) decaf_448_##_id\n"); | |||||
| printf("#define API_NS2(_pref,_id) _pref##_decaf_448_##_id\n"); | |||||
| printf("const decaf_word_t API_NS(precomputed_base_as_words)[%d]\n", | |||||
| (int)(API_NS2(sizeof,precomputed_s) / sizeof(decaf_word_t))); | |||||
| printf("__attribute__((aligned(%d),visibility(\"hidden\"))) = {\n ", (int)API_NS2(alignof,precomputed_s)); | |||||
| for (i=0; i < sizeof_decaf_448_precomputed_s; i+=sizeof(decaf_word_t)) { | |||||
| for (i=0; i < API_NS2(sizeof,precomputed_s); i+=sizeof(decaf_word_t)) { | |||||
| if (i && (i%8==0)) printf(",\n "); | if (i && (i%8==0)) printf(",\n "); | ||||
| else if (i) printf(", "); | else if (i) printf(", "); | ||||
| printf("0x%0*llxull", (int)sizeof(decaf_word_t)*2, (unsigned long long)*output ); | printf("0x%0*llxull", (int)sizeof(decaf_word_t)*2, (unsigned long long)*output ); | ||||
| @@ -69,10 +74,10 @@ int main(int argc, char **argv) { | |||||
| printf("\n};\n"); | printf("\n};\n"); | ||||
| output = (const decaf_word_t *)preWnaf; | output = (const decaf_word_t *)preWnaf; | ||||
| printf("const decaf_word_t decaf_448_precomputed_wnaf_as_words[%d]\n", | |||||
| (int)(sizeof_decaf_448_precomputed_wnafs / sizeof(decaf_word_t))); | |||||
| printf("__attribute__((aligned(%d),visibility(\"hidden\"))) = {\n ", (int)alignof_decaf_448_precomputed_s); | |||||
| for (i=0; i < sizeof_decaf_448_precomputed_wnafs; i+=sizeof(decaf_word_t)) { | |||||
| printf("const decaf_word_t API_NS(precomputed_wnaf_as_words)[%d]\n", | |||||
| (int)(API_NS2(sizeof,precomputed_wnafs) / sizeof(decaf_word_t))); | |||||
| printf("__attribute__((aligned(%d),visibility(\"hidden\"))) = {\n ", (int)API_NS2(alignof,precomputed_s)); | |||||
| for (i=0; i < API_NS2(sizeof,precomputed_wnafs); i+=sizeof(decaf_word_t)) { | |||||
| if (i && (i%8==0)) printf(",\n "); | if (i && (i%8==0)) printf(",\n "); | ||||
| else if (i) printf(", "); | else if (i) printf(", "); | ||||
| printf("0x%0*llxull", (int)sizeof(decaf_word_t)*2, (unsigned long long)*output ); | printf("0x%0*llxull", (int)sizeof(decaf_word_t)*2, (unsigned long long)*output ); | ||||
| @@ -80,22 +85,22 @@ int main(int argc, char **argv) { | |||||
| } | } | ||||
| printf("\n};\n"); | printf("\n};\n"); | ||||
| decaf_448_scalar_t smadj; | |||||
| decaf_448_scalar_copy(smadj,decaf_448_scalar_one); | |||||
| API_NS(scalar_t) smadj; | |||||
| API_NS(scalar_copy)(smadj,API_NS(scalar_one)); | |||||
| for (i=0; i<DECAF_COMBS_N*DECAF_COMBS_T*DECAF_COMBS_S; i++) { | for (i=0; i<DECAF_COMBS_N*DECAF_COMBS_T*DECAF_COMBS_S; i++) { | ||||
| decaf_448_scalar_add(smadj,smadj,smadj); | |||||
| API_NS(scalar_add)(smadj,smadj,smadj); | |||||
| } | } | ||||
| decaf_448_scalar_sub(smadj, smadj, decaf_448_scalar_one); | |||||
| scalar_print("decaf_448_precomputed_scalarmul_adjustment", smadj); | |||||
| API_NS(scalar_sub)(smadj, smadj, API_NS(scalar_one)); | |||||
| scalar_print("API_NS(precomputed_scalarmul_adjustment)", smadj); | |||||
| decaf_448_scalar_copy(smadj,decaf_448_scalar_one); | |||||
| API_NS(scalar_copy)(smadj,API_NS(scalar_one)); | |||||
| for (i=0; i<DECAF_448_SCALAR_BITS-1 + DECAF_WINDOW_BITS | for (i=0; i<DECAF_448_SCALAR_BITS-1 + DECAF_WINDOW_BITS | ||||
| - ((DECAF_448_SCALAR_BITS-1)%DECAF_WINDOW_BITS); i++) { | - ((DECAF_448_SCALAR_BITS-1)%DECAF_WINDOW_BITS); i++) { | ||||
| decaf_448_scalar_add(smadj,smadj,smadj); | |||||
| API_NS(scalar_add)(smadj,smadj,smadj); | |||||
| } | } | ||||
| decaf_448_scalar_sub(smadj, smadj, decaf_448_scalar_one); | |||||
| scalar_print("decaf_448_point_scalarmul_adjustment", smadj); | |||||
| API_NS(scalar_sub)(smadj, smadj, API_NS(scalar_one)); | |||||
| scalar_print("API_NS(point_scalarmul_adjustment)", smadj); | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -113,18 +113,19 @@ public: | |||||
| double Benchmark::totalCy = 0, Benchmark::totalS = 0; | double Benchmark::totalCy = 0, Benchmark::totalS = 0; | ||||
| static void tdh ( | static void tdh ( | ||||
| SpongeRng &rng, | |||||
| SpongeRng &clientRng, | |||||
| SpongeRng &serverRng, | |||||
| Scalar x, const Block &gx, | Scalar x, const Block &gx, | ||||
| Scalar y, const Block &gy | Scalar y, const Block &gy | ||||
| ) { | ) { | ||||
| Strobe client(Strobe::CLIENT), server(Strobe::SERVER); | Strobe client(Strobe::CLIENT), server(Strobe::SERVER); | ||||
| Scalar xe(rng); | |||||
| Scalar xe(clientRng); | |||||
| SecureBuffer gxe = Precomputed::base() * xe; | SecureBuffer gxe = Precomputed::base() * xe; | ||||
| client.send_plaintext(gxe); | client.send_plaintext(gxe); | ||||
| server.recv_plaintext(gxe); | server.recv_plaintext(gxe); | ||||
| Scalar ye(rng); | |||||
| Scalar ye(serverRng); | |||||
| SecureBuffer gye = Precomputed::base() * ye; | SecureBuffer gye = Precomputed::base() * ye; | ||||
| server.send_plaintext(gye); | server.send_plaintext(gye); | ||||
| client.recv_plaintext(gye); | client.recv_plaintext(gye); | ||||
| @@ -152,21 +153,22 @@ static void tdh ( | |||||
| } | } | ||||
| static void fhmqv ( | static void fhmqv ( | ||||
| SpongeRng &rng, | |||||
| SpongeRng &clientRng, | |||||
| SpongeRng &serverRng, | |||||
| Scalar x, const Block &gx, | Scalar x, const Block &gx, | ||||
| Scalar y, const Block &gy | Scalar y, const Block &gy | ||||
| ) { | ) { | ||||
| /* Don't use this, it's probably patented */ | /* Don't use this, it's probably patented */ | ||||
| Strobe client(Strobe::CLIENT), server(Strobe::SERVER); | Strobe client(Strobe::CLIENT), server(Strobe::SERVER); | ||||
| Scalar xe(rng); | |||||
| Scalar xe(clientRng); | |||||
| client.send_plaintext(gx); | client.send_plaintext(gx); | ||||
| server.recv_plaintext(gx); | server.recv_plaintext(gx); | ||||
| SecureBuffer gxe = Precomputed::base() * xe; | SecureBuffer gxe = Precomputed::base() * xe; | ||||
| server.send_plaintext(gxe); | server.send_plaintext(gxe); | ||||
| client.recv_plaintext(gxe); | client.recv_plaintext(gxe); | ||||
| Scalar ye(rng); | |||||
| Scalar ye(serverRng); | |||||
| server.send_plaintext(gy); | server.send_plaintext(gy); | ||||
| client.recv_plaintext(gy); | client.recv_plaintext(gy); | ||||
| SecureBuffer gye = Precomputed::base() * ye; | SecureBuffer gye = Precomputed::base() * ye; | ||||
| @@ -191,10 +193,15 @@ static void fhmqv ( | |||||
| server.respec(STROBE_KEYED_128); | server.respec(STROBE_KEYED_128); | ||||
| } | } | ||||
| static void spake2ee(const Block &hashed_password, SpongeRng &rng, bool aug) { | |||||
| static void spake2ee( | |||||
| SpongeRng &clientRng, | |||||
| SpongeRng &serverRng, | |||||
| const Block &hashed_password, | |||||
| bool aug | |||||
| ) { | |||||
| Strobe client(Strobe::CLIENT), server(Strobe::SERVER); | Strobe client(Strobe::CLIENT), server(Strobe::SERVER); | ||||
| Scalar x(rng); | |||||
| Scalar x(clientRng); | |||||
| SHAKE<256> shake; | SHAKE<256> shake; | ||||
| shake.update(hashed_password); | shake.update(hashed_password); | ||||
| @@ -212,7 +219,7 @@ static void spake2ee(const Block &hashed_password, SpongeRng &rng, bool aug) { | |||||
| client.send_plaintext(gx); | client.send_plaintext(gx); | ||||
| server.recv_plaintext(gx); | server.recv_plaintext(gx); | ||||
| Scalar y(rng); | |||||
| Scalar y(serverRng); | |||||
| SecureBuffer gy(Precomputed::base() * y + hs); | SecureBuffer gy(Precomputed::base() * y + hs); | ||||
| server.send_plaintext(gy); | server.send_plaintext(gy); | ||||
| client.recv_plaintext(gy); | client.recv_plaintext(gy); | ||||
| @@ -332,27 +339,28 @@ int main(int argc, char **argv) { | |||||
| } | } | ||||
| printf("\nProtocol benchmarks:\n"); | printf("\nProtocol benchmarks:\n"); | ||||
| SpongeRng rng(Block("my rng seed")); | |||||
| SpongeRng clientRng(Block("client rng seed")); | |||||
| SpongeRng serverRng(Block("server rng seed")); | |||||
| SecureBuffer hashedPassword("hello world"); | SecureBuffer hashedPassword("hello world"); | ||||
| for (Benchmark b("Spake2ee c+s",0.1); b.iter(); ) { | for (Benchmark b("Spake2ee c+s",0.1); b.iter(); ) { | ||||
| spake2ee(hashedPassword,rng,false); | |||||
| spake2ee(clientRng, serverRng, hashedPassword,false); | |||||
| } | } | ||||
| for (Benchmark b("Spake2ee c+s aug",0.1); b.iter(); ) { | for (Benchmark b("Spake2ee c+s aug",0.1); b.iter(); ) { | ||||
| spake2ee(hashedPassword,rng,true); | |||||
| spake2ee(clientRng, serverRng, hashedPassword,true); | |||||
| } | } | ||||
| Scalar x(rng); | |||||
| Scalar x(clientRng); | |||||
| SecureBuffer gx(Precomputed::base() * x); | SecureBuffer gx(Precomputed::base() * x); | ||||
| Scalar y(rng); | |||||
| Scalar y(serverRng); | |||||
| SecureBuffer gy(Precomputed::base() * y); | SecureBuffer gy(Precomputed::base() * y); | ||||
| for (Benchmark b("FHMQV c+s",0.1); b.iter(); ) { | for (Benchmark b("FHMQV c+s",0.1); b.iter(); ) { | ||||
| fhmqv(rng,x,gx,y,gy); | |||||
| fhmqv(clientRng, serverRng,x,gx,y,gy); | |||||
| } | } | ||||
| for (Benchmark b("TripleDH anon c+s",0.1); b.iter(); ) { | for (Benchmark b("TripleDH anon c+s",0.1); b.iter(); ) { | ||||
| tdh(rng,x,gx,y,gy); | |||||
| tdh(clientRng, serverRng, x,gx,y,gy); | |||||
| } | } | ||||
| printf("\n"); | printf("\n"); | ||||
| @@ -13,33 +13,9 @@ | |||||
| #include "shake.hxx" | #include "shake.hxx" | ||||
| #include <stdio.h> | #include <stdio.h> | ||||
| typedef decaf::decaf<448>::Scalar Scalar; | |||||
| typedef decaf::decaf<448>::Point Point; | |||||
| typedef decaf::decaf<448>::Precomputed Precomputed; | |||||
| static const long NTESTS = 10000; | |||||
| static void print(const char *name, const Scalar &x) { | |||||
| unsigned char buffer[DECAF_448_SCALAR_BYTES]; | |||||
| x.encode(buffer); | |||||
| printf(" %s = 0x", name); | |||||
| for (int i=sizeof(buffer)-1; i>=0; i--) { | |||||
| printf("%02x", buffer[i]); | |||||
| } | |||||
| printf("\n"); | |||||
| } | |||||
| static void print(const char *name, const Point &x) { | |||||
| unsigned char buffer[DECAF_448_SER_BYTES]; | |||||
| x.encode(buffer); | |||||
| printf(" %s = 0x", name); | |||||
| for (int i=sizeof(buffer)-1; i>=0; i--) { | |||||
| printf("%02x", buffer[i]); | |||||
| } | |||||
| printf("\n"); | |||||
| } | |||||
| static bool passing = true; | static bool passing = true; | ||||
| static const long NTESTS = 10000; | |||||
| class Test { | class Test { | ||||
| public: | public: | ||||
| @@ -64,6 +40,32 @@ public: | |||||
| } | } | ||||
| }; | }; | ||||
| template<decaf::GroupId GROUP> struct Tests { | |||||
| typedef typename decaf::decaf<GROUP>::Scalar Scalar; | |||||
| typedef typename decaf::decaf<GROUP>::Point Point; | |||||
| typedef typename decaf::decaf<GROUP>::Precomputed Precomputed; | |||||
| static void print(const char *name, const Scalar &x) { | |||||
| unsigned char buffer[DECAF_448_SCALAR_BYTES]; | |||||
| x.encode(buffer); | |||||
| printf(" %s = 0x", name); | |||||
| for (int i=sizeof(buffer)-1; i>=0; i--) { | |||||
| printf("%02x", buffer[i]); | |||||
| } | |||||
| printf("\n"); | |||||
| } | |||||
| static void print(const char *name, const Point &x) { | |||||
| unsigned char buffer[DECAF_448_SER_BYTES]; | |||||
| x.encode(buffer); | |||||
| printf(" %s = 0x", name); | |||||
| for (int i=sizeof(buffer)-1; i>=0; i--) { | |||||
| printf("%02x", buffer[i]); | |||||
| } | |||||
| printf("\n"); | |||||
| } | |||||
| static bool arith_check( | static bool arith_check( | ||||
| Test &test, | Test &test, | ||||
| const Scalar &x, | const Scalar &x, | ||||
| @@ -191,11 +193,13 @@ static void test_ec() { | |||||
| } | } | ||||
| } | } | ||||
| }; // template<decaf::GroupId GROUP> | |||||
| int main(int argc, char **argv) { | int main(int argc, char **argv) { | ||||
| (void) argc; (void) argv; | (void) argc; (void) argv; | ||||
| test_arithmetic(); | |||||
| test_ec(); | |||||
| Tests<448>::test_arithmetic(); | |||||
| Tests<448>::test_ec(); | |||||
| if (passing) printf("Passed all tests.\n"); | if (passing) printf("Passed all tests.\n"); | ||||