v
Зеркало из https://github.com/vlang/v
1module edwards25519
2
3fn check_aliasing_onearg(f fn (mut v Scalar, x Scalar) Scalar, mut v Scalar, x Scalar) bool {
4x1, mut v1 := x, x
5
6// Calculate a reference f(x) without aliasing.
7mut out := f(mut v, x)
8if out != v || !is_reduced(out) {
9return false
10}
11
12// Test aliasing the argument and the receiver.
13out2 := f(mut v1, v1)
14if out2 != v1 || v1 != v || !is_reduced(out2) {
15return false
16}
17
18// Ensure the arguments was not modified.
19return x == x1
20}
21
22fn negate_aliasing(mut v Scalar, x Scalar) Scalar {
23// mut t := v
24return v.negate(x)
25}
26
27fn test_check_aliasing_oneargs() {
28x := generate_notzero_scalar(10)!
29mut v := generate_notzero_scalar(10)!
30out := check_aliasing_onearg(negate_aliasing, mut v, x)
31assert out == true
32}
33
34fn multiply_aliasing(mut v Scalar, x Scalar, y Scalar) Scalar {
35return v.multiply(x, y)
36}
37
38fn add_aliasing(mut v Scalar, x Scalar, y Scalar) Scalar {
39return v.add(x, y)
40}
41
42fn subtract_aliasing(mut v Scalar, x Scalar, y Scalar) Scalar {
43return v.subtract(x, y)
44}
45
46fn test_check_aliasing_twoargs() {
47fn_with_twoargs := [add_aliasing, multiply_aliasing, subtract_aliasing]
48for f in fn_with_twoargs {
49mut v := generate_notzero_scalar(10)!
50x := generate_notzero_scalar(10)!
51y := generate_notzero_scalar(10)!
52out := check_aliasing_twoargs(f, mut v, x, y)
53assert out == true
54}
55}
56
57fn check_aliasing_twoargs(f fn (mut v Scalar, x Scalar, y Scalar) Scalar, mut v Scalar, x Scalar, y Scalar) bool {
58x1, y1, mut v1 := x, y, Scalar{}
59
60// Calculate a reference f(x, y) without aliasing.
61mut out := f(mut v, x, y)
62if out != v || !is_reduced(out) {
63return false
64}
65
66// Test aliasing the first argument and the receiver.
67v1 = x
68out2 := f(mut v1, v1, y)
69if out2 != v1 || v1 != v || !is_reduced(out2) {
70return false
71}
72// Test aliasing the second argument and the receiver.
73v1 = y
74out3 := f(mut v1, x, v1)
75if out3 != v1 || v1 != v || !is_reduced(out3) {
76return false
77}
78
79// Calculate a reference f(x, x) without aliasing.
80out4 := f(mut v, x, x)
81if out4 != v || !is_reduced(out4) {
82return false
83}
84
85// Test aliasing the first argument and the receiver.
86v1 = x
87out5 := f(mut v1, v1, x)
88if out5 != v1 || v1 != v || !is_reduced(out5) {
89return false
90}
91// Test aliasing the second argument and the receiver.
92v1 = x
93out6 := f(mut v1, x, v1)
94if out6 != v1 || v1 != v || !is_reduced(out6) {
95return false
96}
97// Test aliasing both arguments and the receiver.
98v1 = x
99out7 := f(mut v1, v1, v1)
100if out7 != v1 || v1 != v || !is_reduced(out7) {
101return false
102}
103
104// Ensure the arguments were not modified.
105return x == x1 && y == y1
106}
107