File: elligator2.mpc

package info (click to toggle)
drawterm-9front 0~git20220608.bee4db6-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 3,256 kB
  • sloc: ansic: 57,635; makefile: 607; java: 492; objc: 436; xml: 174; asm: 19
file content (129 lines) | stat: -rw-r--r-- 2,908 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
void elligator2(mpint *p, mpint *a, mpint *d, mpint *n, mpint *r0, mpint *X, mpint *Y, mpint *Z, mpint *T){
	mpint *t = mpnew(0);
	mpint *s = mpnew(0);
	mpint *e = mpnew(0);
	mpint *c = mpnew(0);
	mpint *ND = mpnew(0);
	mpint *N = mpnew(0);
	mpint *D = mpnew(0);
	mpint *r = mpnew(0);
	mpint *tmp1 = mpnew(0);
	mpmodmul(n, r0, p, tmp1);
	mpmodmul(tmp1, r0, p, r);
	mpfree(tmp1);
	tmp1 = mpnew(0);
	mpmodmul(d, r, p, tmp1);
	mpmodadd(tmp1, a, p, tmp1);
	mpmodsub(tmp1, d, p, tmp1);
	mpint *tmp2 = mpnew(0);
	mpmodmul(d, r, p, tmp2);
	mpint *tmp3 = mpnew(0);
	mpmodmul(a, r, p, tmp3);
	mpmodsub(tmp2, tmp3, p, tmp2);
	mpfree(tmp3);
	mpmodsub(tmp2, d, p, tmp2);
	mpmodmul(tmp1, tmp2, p, D);
	mpfree(tmp1);
	mpfree(tmp2);
	tmp2 = mpnew(0);
	mpmodadd(r, mpone, p, tmp2);
	tmp1 = mpnew(0);
	mpmodadd(d, d, p, tmp1); // 2*d
	mpmodsub(a, tmp1, p, tmp1);
	mpmodmul(tmp2, tmp1, p, N);
	mpfree(tmp2);
	mpfree(tmp1);
	mpmodmul(N, D, p, ND);
	if(mpcmp(ND, mpzero) == 0){
		mpassign(mpone, c);
		mpassign(mpzero, e);
		}else{
		msqrt(ND, p, e);
		if(mpcmp(e, mpzero) != 0){
			mpassign(mpone, c);
			mpinvert(e, p, e);
			}else{
			mpmodsub(mpzero, mpone, p, c);
			mpint *tmp4 = mpnew(0);
			mpmodmul(n, r0, p, tmp4);
			mpint *tmp5 = mpnew(0);
			mpint *tmp6 = mpnew(0);
			mpmodmul(n, ND, p, tmp6);
			misqrt(tmp6, p, tmp5);
			mpfree(tmp6);
			mpmodmul(tmp4, tmp5, p, e);
			mpfree(tmp4);
			mpfree(tmp5);
			}
		}
	tmp1 = mpnew(0);
	mpmodmul(c, N, p, tmp1);
	mpmodmul(tmp1, e, p, s);
	mpfree(tmp1);
	tmp1 = mpnew(0);
	tmp2 = mpnew(0);
	mpmodmul(c, N, p, tmp2);
	tmp3 = mpnew(0);
	mpmodsub(r, mpone, p, tmp3);
	mpmodmul(tmp2, tmp3, p, tmp1);
	mpfree(tmp2);
	mpfree(tmp3);
	tmp3 = mpnew(0);
	tmp2 = mpnew(0);
	mpmodadd(d, d, p, tmp2); // 2*d
	mpmodsub(a, tmp2, p, tmp2);
	mpmodmul(tmp2, e, p, tmp3);
	mpfree(tmp2);
	mpmodmul(tmp3, tmp3, p, tmp3);
	mpmodmul(tmp1, tmp3, p, t);
	mpfree(tmp1);
	mpfree(tmp3);
	mpmodsub(mpzero, t, p, t);
	mpmodsub(t, mpone, p, t);
	tmp3 = mpnew(0);
	mpmodadd(s, s, p, tmp3); // 2*s
	mpmodmul(tmp3, t, p, X);
	mpfree(tmp3);
	tmp3 = mpnew(0);
	tmp1 = mpnew(0);
	mpmodmul(a, s, p, tmp1);
	mpmodmul(tmp1, s, p, tmp3);
	mpfree(tmp1);
	mpmodsub(mpone, tmp3, p, tmp3);
	tmp1 = mpnew(0);
	tmp2 = mpnew(0);
	mpmodmul(a, s, p, tmp2);
	mpmodmul(tmp2, s, p, tmp1);
	mpfree(tmp2);
	mpmodadd(mpone, tmp1, p, tmp1);
	mpmodmul(tmp3, tmp1, p, Y);
	mpfree(tmp3);
	mpfree(tmp1);
	tmp1 = mpnew(0);
	tmp3 = mpnew(0);
	mpmodmul(a, s, p, tmp3);
	mpmodmul(tmp3, s, p, tmp1);
	mpfree(tmp3);
	mpmodadd(mpone, tmp1, p, tmp1);
	mpmodmul(tmp1, t, p, Z);
	mpfree(tmp1);
	tmp1 = mpnew(0);
	mpmodadd(s, s, p, tmp1); // 2*s
	tmp3 = mpnew(0);
	tmp2 = mpnew(0);
	mpmodmul(a, s, p, tmp2);
	mpmodmul(tmp2, s, p, tmp3);
	mpfree(tmp2);
	mpmodsub(mpone, tmp3, p, tmp3);
	mpmodmul(tmp1, tmp3, p, T);
	mpfree(tmp1);
	mpfree(tmp3);
	mpfree(t);
	mpfree(s);
	mpfree(e);
	mpfree(c);
	mpfree(ND);
	mpfree(N);
	mpfree(D);
	mpfree(r);
	}