Let us walk on the 3-isogeny graph
Loading...
Searching...
No Matches
csidh.c
Go to the documentation of this file.
1#undef NDEBUG
2#include<time.h>
3
4#include <secsidh/secsidh.h>
5#include "cycle.h"
6#include "fp-counters.h"
7#include "csidh.h"
8#include "csidh_api.h"
9#include <inttypes.h>
10#include <assert.h>
11#include <stdio.h>
12#include <string.h>
13
14#if GLOBAL_COUNTERS != 0
15#define cprintf(...) printf(__VA_ARGS__)
16#else
17#define cprintf(...)
18#endif
19
20#ifndef BITS
21#define BITS 2047d221
22#error BITS not defined
23#endif
24
25#define CPASTER(x, y) SECSIDH_CSIDH##x##_##y
26#define CEVALUATOR(x, y) CPASTER(x, y)
27#define CONSTNAMESPACE(name) CEVALUATOR(BITS, name)
28#define SK_SIZE CONSTNAMESPACE(SK_SIZE)
29#define PK_SIZE CONSTNAMESPACE(PK_SIZE)
30#define SS_SIZE CONSTNAMESPACE(SS_SIZE)
31
32#define FPASTER(x, y) secsidh_CSIDH##x##_##y
33#define FEVALUATOR(x, y) FPASTER(x, y)
34#define FNAMESPACE(name) FEVALUATOR(BITS, name)
35
36#define keygen FNAMESPACE(keygen)
37#define derive FNAMESPACE(derive)
38
39#define pk_size FNAMESPACE(pk_size)
40#define sk_size FNAMESPACE(sk_size)
41#define ss_size FNAMESPACE(ss_size)
42
43static void ss_print(const uint8_t* ss, char *c, size_t size)
44{
45 printf("%s := 0x", c);
46 int i;
47 for(i=size-1; i > -1; i--)
48 printf("%02" PRIX8 "", ss[i]);
49 printf(";\n");
50}
51
52static int dumb_fp_isequal(const uint8_t* a, const uint8_t* b, size_t size) {
53 return memcmp(a, b, size) == 0;
54}
55
56int main(void)
57{
58 ticks cc0, cc1; // for measuringthe clock cycles
59 printf("PK_SIZE = %d and pk_size = %d\n", (int) PK_SIZE, (int) pk_size);
60 printf("SK_SIZE = %d and sk_size = %d\n", (int) SK_SIZE, (int) sk_size);
61 printf("SS_SIZE = %d and ss_size = %d\n", (int) SS_SIZE, (int) ss_size);
65
66 //------------------------------------------------------
67 // Key generation
68 printf("\033[0;33m// --------------\033[0m\n");
69 printf("\033[0;33m// Key generation\033[0m\n");
70
71 // ----------
72 // Alice
73 printf("\n\033[0;35m// Alice\033[0m\n");
74 uint8_t a[SK_SIZE], A[PK_SIZE], ss_a[PK_SIZE];
75 cc0 = getticks();
76 keygen(A, a);
77 cc1 = getticks();
78 //ss_print(a, "sk_a", SK_SIZE);
79 ss_print(A, "pk_a", PK_SIZE);
80 cprintf("Running-time (millions): %2.03lfM + %2.03lfS + %2.03lfa = \033[1;35m%2.03lfM\033[0m\n", (1.0 * fpmul) / 1000000.0, (1.0 * fpsqr) / 1000000.0, (1.0 * fpadd) / 1000000.0, (1.0 * (fpmul + fpsqr)) / 1000000.0);
81 printf("Clock cycles (millions): \033[1;35m%7.03lf\033[0m\n", ( 1.0 * (cc1 - cc0)) / 1000000.0);
82
83 // ----------
84 // Bob
85 printf("\n\033[0;34m// Bob\033[0m\n");
86 uint8_t b[SK_SIZE], B[PK_SIZE], ss_b[SS_SIZE];
87 cc0 = getticks();
88 keygen(B, b);
89 cc1 = getticks();
90 //ss_print(b, "sk_b", SK_SIZE);
91 ss_print(B, "pk_b", PK_SIZE);
92 cprintf("Running-time (millions): %2.03lfM + %2.03lfS + %2.03lfa = \033[1;34m%2.03lfM\033[0m\n", (1.0 * fpmul) / 1000000.0, (1.0 * fpsqr) / 1000000.0, (1.0 * fpadd) / 1000000.0, (1.0 * (fpmul + fpsqr)) / 1000000.0);
93 printf("Clock cycles (millions): \033[1;34m%7.03lf\033[0m\n", ( 1.0 * (cc1 - cc0)) / 1000000.0);
94
95 //------------------------------------------------------
96 // Secret sharing derivation
97 printf("\n\033[0;33m// -------------------------\033[0m\n");
98 printf("\033[0;33m// Secret sharing generation\033[0m\n");
99
100 // ----------------
101 // Alice
102 printf("\n\033[0;35m// Alice\033[0m\n");
103 cc0 = getticks();
104 assert(derive(ss_a, B, a) == 0);
105 cc1 = getticks();
106 ss_print(ss_a, "ss_a", SS_SIZE);
107 cprintf("Running-time (millions) [without validation]: %2.03lfM + %2.03lfS + %2.03lfa = \033[1;35m%2.03lfM\033[0m\n",
108 (1.0 * fpmul) / 1000000.0, (1.0 * fpsqr) / 1000000.0, (1.0 * fpadd) / 1000000.0, (1.0 * (fpmul + fpsqr)) / 1000000.0);
109 printf("Clock cycles (millions) [including validation]: \033[1;35m%7.03lf\033[0m\n", ( 1.0 * (cc1 - cc0)) / 1000000.0);
110
111 // ----------------
112 // Bob
113 printf("\n\033[0;34m// Bob\033[0m\n");
114 cc0 = getticks();
115 assert(derive(ss_b, A, b) == 0);
116 cc1 = getticks();
117 ss_print(ss_b, "ss_b", SS_SIZE);
118 cprintf("Running-time (millions) [without validation]: %2.03lfM + %2.03lfS + %2.03lfa = \033[1;34m%2.03lfM\033[0m\n",
119 (1.0 * fpmul) / 1000000.0, (1.0 * fpsqr) / 1000000.0, (1.0 * fpadd) / 1000000.0, (1.0 * (fpmul + fpsqr)) / 1000000.0);
120 printf("Clock cycles (millions) [including validation]: \033[1;34m%7.03lf\033[0m\n", ( 1.0 * (cc1 - cc0)) / 1000000.0);
121
122 // =============================
123 // Verifying same secret sharing
124 assert( dumb_fp_isequal(ss_a, ss_b, SS_SIZE) );
125
126 //------------------------------------------------------
127 printf("\n\033[0;32m// Successfully secret sharing computation!\033[0m\n");
128 return 0;
129}
#define SK_SIZE
Definition checkct.c:24
#define PK_SIZE
Definition checkct.c:25
#define sk_size
Definition checkct.c:29
#define SS_SIZE
Definition checkct.c:26
#define pk_size
Definition checkct.c:28
#define ss_size
Definition checkct.c:30
#define derive
Definition csidh.c:37
#define keygen
Definition csidh.c:36
int main(void)
Definition csidh.c:56
#define cprintf(...)
Definition csidh.c:17
assert(var1 eq var2)
for i
f a
Definition to_model.m:12