v
Зеркало из https://github.com/vlang/v
1module edwards25519
2
3const dalek_scalar = Scalar{[u8(219), 106, 114, 9, 174, 249, 155, 89, 69, 203, 201, 93, 92, 116,
4234, 187, 78, 115, 103, 172, 182, 98, 62, 103, 187, 136, 13, 100, 248, 110, 12, 4]!}
5const dsc_basepoint = [u8(0xf4), 0xef, 0x7c, 0xa, 0x34, 0x55, 0x7b, 0x9f, 0x72, 0x3b, 0xb6, 0x1e,
60xf9, 0x46, 0x9, 0x91, 0x1c, 0xb9, 0xc0, 0x6c, 0x17, 0x28, 0x2d, 0x8b, 0x43, 0x2b, 0x5, 0x18,
70x6a, 0x54, 0x3e, 0x48]
8
9fn dalek_scalar_basepoint() Point {
10mut p := Point{}
11p.set_bytes(dsc_basepoint) or { panic(err) }
12return p
13}
14
15fn test_scalar_mult_small_scalars() {
16mut z := Scalar{}
17mut p := Point{}
18mut b := new_generator_point()
19mut i := new_identity_point()
20p.scalar_mult(mut z, b)
21
22assert i.equal(p) == 1
23assert check_on_curve(p) == true
24
25z = Scalar{[u8(1), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
260, 0, 0, 0, 0, 0, 0]!}
27p.scalar_mult(mut z, b)
28
29assert b.equal(p) == 1
30assert check_on_curve(p) == true
31}
32
33fn test_scalar_mult_vs_dalek() {
34mut p := Point{}
35mut b := new_generator_point()
36mut dsc := dalek_scalar
37p.scalar_mult(mut dsc, b)
38mut ds := dalek_scalar_basepoint()
39assert ds.equal(p) == 1
40
41assert check_on_curve(p) == true
42}
43
44fn test_scalar_base_mult_vs_dalek() {
45mut p := Point{}
46mut dsc := dalek_scalar
47p.scalar_base_mult(mut dsc)
48mut ds := dalek_scalar_basepoint()
49assert ds.equal(p) == 1
50
51assert check_on_curve(p)
52}
53
54fn test_vartime_double_basemult_vs_dalek() {
55mut p := Point{}
56mut z := Scalar{}
57b := new_generator_point()
58p.vartime_double_scalar_base_mult(dalek_scalar, b, z)
59
60mut ds := dalek_scalar_basepoint()
61assert ds.equal(p) == 1
62assert check_on_curve(p)
63
64p.vartime_double_scalar_base_mult(z, b, dalek_scalar)
65
66assert ds.equal(p) == 1
67assert check_on_curve(p)
68}
69
70fn test_scalar_mult_distributes_over_add() {
71mut x := generate_scalar(100) or { panic(err) }
72mut y := generate_scalar(100) or { panic(err) }
73mut z := Scalar{}
74
75z.add(x, y)
76
77mut p := Point{}
78mut q := Point{}
79mut r := Point{}
80mut check := Point{}
81mut b := new_generator_point()
82
83p.scalar_mult(mut x, b)
84q.scalar_mult(mut y, b)
85r.scalar_mult(mut z, b)
86check.add(p, q)
87
88assert check_on_curve(p, q, r, check) == true
89assert check.equal(r) == 1
90}
91
92fn test_scalarmult_non_identity_point() {
93// Check whether p.ScalarMult and q.ScalaBaseMult give the same,
94// when p and q are originally set to the base point.
95
96mut x := generate_scalar(5000)!
97
98mut p := Point{}
99mut q := Point{}
100mut b := new_generator_point()
101p.set(b)
102q.set(b)
103
104p.scalar_mult(mut x, b)
105q.scalar_base_mult(mut x)
106
107assert check_on_curve(p, q) == true
108
109assert p.equal(q) == 1
110}
111
112fn test_basepoint_table_generation() {
113// The basepoint table is 32 affineLookupTables,
114// corresponding to (16^2i)*B for table i.
115bptable := basepoint_table()
116b := new_generator_point()
117mut tmp1 := ProjectiveP1{}
118mut tmp2 := ProjectiveP2{}
119mut tmp3 := Point{}
120tmp3.set(b)
121mut table := []AffineLookupTable{len: 32}
122for i := 0; i < 32; i++ {
123// Build the table
124table[i].from_p3(tmp3)
125
126// Assert equality with the hardcoded one
127assert table[i] == bptable[i]
128
129// Set p = (16^2)*p = 256*p = 2^8*p
130tmp2.from_p3(tmp3)
131for j := 0; j < 7; j++ {
132tmp1.double(tmp2)
133tmp2.from_p1(tmp1)
134}
135tmp1.double(tmp2)
136tmp3.from_p1(tmp1)
137
138assert check_on_curve(tmp3) == true
139}
140}
141
142fn test_scalar_mult_matches_base_mult() {
143mut x := generate_scalar(100) or { panic(err) }
144b := new_generator_point()
145mut p := Point{}
146mut q := Point{}
147
148p.scalar_mult(mut x, b)
149q.scalar_base_mult(mut x)
150
151assert check_on_curve(p, q) == true
152assert p.equal(q) == 1
153}
154
155fn test_basepoint_naf_table_generation() {
156mut table := NafLookupTable8{}
157b := new_generator_point()
158
159table.from_p3(b)
160
161bnt := basepoint_naf_table()
162assert table == bnt
163}
164
165fn test_vartime_double_scalar_base_mult() {
166mut x := generate_scalar(100) or { panic(err) }
167mut y := generate_scalar(100) or { panic(err) }
168b := new_generator_point()
169
170mut p := Point{}
171mut q1 := Point{}
172mut q2 := Point{}
173mut check := Point{}
174
175p.vartime_double_scalar_base_mult(x, b, y)
176
177q1.scalar_base_mult(mut x)
178q2.scalar_base_mult(mut y)
179check.add(q1, q2)
180
181assert check_on_curve(p, check, q1, q2) == true
182assert p.equal(check) == 1
183}
184