Let us walk on the 3-isogeny graph
Loading...
Searching...
No Matches
validate.c File Reference
#include <string.h>
#include <assert.h>
#include "../CTIDH/ctidh.h"
#include "primes.h"
#include "mont.h"
#include "elligator.h"
Include dependency graph for validate.c:

Go to the source code of this file.

Functions

bool validate (public_key const *in)
void cofactor_multiples (proj P[], proj const A, size_t lower, size_t upper)

Function Documentation

◆ cofactor_multiples()

void cofactor_multiples ( proj P[],
proj const A,
size_t lower,
size_t upper )

Definition at line 77 of file validate.c.

78{
79 assert(lower < upper);
80 if (upper - lower == 1)
81 return;
82
83 int i;
84 size_t mid = lower + (upper - lower + 1) / 2;
85
86 // proj_copy(P[mid], (const fp*)P[lower]);
87 fp_copy(P[mid].x, P[lower].x);
88 fp_copy(P[mid].z, P[lower].z);
89
90 for (i = lower; i < (int)mid; i++)
91 xMUL_dac(&P[mid], &A, 1, &P[mid], primes_dac[i], primes_daclen[i], primes_daclen[i]);
92 // xmul(P[mid], i, (const fp*)P[mid], A);
93
94 for (i = (int)mid; i < (int)upper; i++)
95 xMUL_dac(&P[lower], &A, 1, &P[lower], primes_dac[i], primes_daclen[i], primes_daclen[i]);
96 // xmul(P[lower], i, (const fp*)P[lower], A);
97
98 cofactor_multiples(P, A, lower, mid);
99 cofactor_multiples(P, A, mid, upper);
100}
#define cofactor_multiples
Definition ctidh.h:55
#define fp_copy
Definition fp-gmp.h:79
assert(var1 eq var2)
#define xMUL_dac
Definition mont.h:21
for i
#define primes_dac
Definition primes.h:52
#define primes_daclen
Definition primes.h:53

References assert(), cofactor_multiples, fp_copy, i, primes_dac, primes_daclen, and xMUL_dac.

Here is the call graph for this function:

◆ validate()

bool validate ( public_key const * in)

Definition at line 22 of file validate.c.

22 {
23// #if !defined(_M1_) && !defined(_M2_) && !defined(_M3_) && !defined(_M4_) && !defined(_M5_)
24// printf("\nNOT using radical 3-isogenies.\n\n");
25// #else
26// printf("\nUsing 2^%ld radical 3-isogenies.\n\n", batch_start[0] - 1);
27// #endif
28 proj A, A24;
29 fp_copy(A.x, in->A);
30 fp_copy(A.z, fp_1);
31 xA24(&A24, &A);
32
33 proj Pp, Pm;
34
35#ifdef ENABLE_CT_TESTING
36 memset(&Pp, 0, sizeof(proj));
37 memset(&Pp.z, 0, sizeof(proj));
38 VALGRIND_MAKE_MEM_DEFINED(&Pp.z, sizeof(fp));
39 VALGRIND_MAKE_MEM_DEFINED(&Pp, sizeof(proj));
40 VALGRIND_MAKE_MEM_DEFINED(&A24, sizeof(proj));
41#endif
42
43 fp seed;
44 fp_set(seed, in->seed);
45 fp_enc(seed, seed);
46 elligator_seeded(&Pp, &Pm, &A24, (const fp *)seed);
47
48
49 for (int64_t j = 0; j < two_cofactor; j++)
50 {
51 xDBL(&Pp, &Pp, &A24, 0);
52 }
53 // clear ells replaced by radical 3-isogenies
54 for (int16_t j = 0; j < batch_start[0]; j++)
55 {
56 xMUL_dac(&Pp, &A24, 0, &Pp, primes_dac[j], primes_daclen[j], primes_daclen[j]);
57 }
58 // remove ells and check that we do not reach the point at infinity
59 for(int i = primes_num-1; i > batch_start[0]; i--)
60 {
61 xMUL_dac(&Pp, &A24, 0, &Pp, primes_dac[i], primes_daclen[i], primes_daclen[i]);
62 if(fp_iszero(Pp.z))
63 return false;
64 }
65
66 // after removing the last ell, now we should have the point at infinity
68 return fp_iszero(Pp.z);
69}
#define elligator_seeded
Definition elligator.h:8
uint64_t fp[NUMBER_OF_WORDS]
Definition fp-gmp.h:22
#define fp_1
Definition fp-gmp.h:48
#define fp_enc
Definition fp-gmp.h:55
#define xA24
Definition mont.h:17
#define xDBL
Definition mont.h:18
A
Definition tests.py:29
for j
#define batch_start
Definition primes.h:55
Definition proj.h:18
fp z
Definition proj.h:20

References public_key::A, batch_start, elligator_seeded, fp_1, fp_copy, fp_enc, i, j, primes_dac, primes_daclen, public_key::seed, xA24, xDBL, xMUL_dac, and proj::z.