107 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			V
		
	
	
| module edwards25519
 | |
| 
 | |
| fn check_aliasing_onearg(f fn (mut v Scalar, x Scalar) Scalar, mut v Scalar, x Scalar) bool {
 | |
| 	x1, mut v1 := x, x
 | |
| 
 | |
| 	// Calculate a reference f(x) without aliasing.
 | |
| 	mut out := f(mut v, x)
 | |
| 	if out != v || !is_reduced(out) {
 | |
| 		return false
 | |
| 	}
 | |
| 
 | |
| 	// Test aliasing the argument and the receiver.
 | |
| 	out2 := f(mut v1, v1)
 | |
| 	if out2 != v1 || v1 != v || !is_reduced(out2) {
 | |
| 		return false
 | |
| 	}
 | |
| 
 | |
| 	// Ensure the arguments was not modified.
 | |
| 	return x == x1
 | |
| }
 | |
| 
 | |
| fn negate_aliasing(mut v Scalar, x Scalar) Scalar {
 | |
| 	// mut t := v
 | |
| 	return v.negate(x)
 | |
| }
 | |
| 
 | |
| fn test_check_aliasing_oneargs() ? {
 | |
| 	x := generate_notzero_scalar(10) ?
 | |
| 	mut v := generate_notzero_scalar(10) ?
 | |
| 	out := check_aliasing_onearg(negate_aliasing, mut v, x)
 | |
| 	assert out == true
 | |
| }
 | |
| 
 | |
| fn multiply_aliasing(mut v Scalar, x Scalar, y Scalar) Scalar {
 | |
| 	return v.multiply(x, y)
 | |
| }
 | |
| 
 | |
| fn add_aliasing(mut v Scalar, x Scalar, y Scalar) Scalar {
 | |
| 	return v.add(x, y)
 | |
| }
 | |
| 
 | |
| fn subtract_aliasing(mut v Scalar, x Scalar, y Scalar) Scalar {
 | |
| 	return v.subtract(x, y)
 | |
| }
 | |
| 
 | |
| fn test_check_aliasing_twoargs() ? {
 | |
| 	fn_with_twoargs := [add_aliasing, multiply_aliasing, subtract_aliasing]
 | |
| 	for f in fn_with_twoargs {
 | |
| 		mut v := generate_notzero_scalar(10) ?
 | |
| 		x := generate_notzero_scalar(10) ?
 | |
| 		y := generate_notzero_scalar(10) ?
 | |
| 		out := check_aliasing_twoargs(f, mut v, x, y)
 | |
| 		assert out == true
 | |
| 	}
 | |
| }
 | |
| 
 | |
| fn check_aliasing_twoargs(f fn (mut v Scalar, x Scalar, y Scalar) Scalar, mut v Scalar, x Scalar, y Scalar) bool {
 | |
| 	x1, y1, mut v1 := x, y, Scalar{}
 | |
| 
 | |
| 	// Calculate a reference f(x, y) without aliasing.
 | |
| 	mut out := f(mut v, x, y)
 | |
| 	if out != v || !is_reduced(out) {
 | |
| 		return false
 | |
| 	}
 | |
| 
 | |
| 	// Test aliasing the first argument and the receiver.
 | |
| 	v1 = x
 | |
| 	out2 := f(mut v1, v1, y)
 | |
| 	if out2 != v1 || v1 != v || !is_reduced(out2) {
 | |
| 		return false
 | |
| 	}
 | |
| 	// Test aliasing the second argument and the receiver.
 | |
| 	v1 = y
 | |
| 	out3 := f(mut v1, x, v1)
 | |
| 	if out3 != v1 || v1 != v || !is_reduced(out3) {
 | |
| 		return false
 | |
| 	}
 | |
| 
 | |
| 	// Calculate a reference f(x, x) without aliasing.
 | |
| 	out4 := f(mut v, x, x)
 | |
| 	if out4 != v || !is_reduced(out4) {
 | |
| 		return false
 | |
| 	}
 | |
| 
 | |
| 	// Test aliasing the first argument and the receiver.
 | |
| 	v1 = x
 | |
| 	out5 := f(mut v1, v1, x)
 | |
| 	if out5 != v1 || v1 != v || !is_reduced(out5) {
 | |
| 		return false
 | |
| 	}
 | |
| 	// Test aliasing the second argument and the receiver.
 | |
| 	v1 = x
 | |
| 	out6 := f(mut v1, x, v1)
 | |
| 	if out6 != v1 || v1 != v || !is_reduced(out6) {
 | |
| 		return false
 | |
| 	}
 | |
| 	// Test aliasing both arguments and the receiver.
 | |
| 	v1 = x
 | |
| 	out7 := f(mut v1, v1, v1)
 | |
| 	if out7 != v1 || v1 != v || !is_reduced(out7) {
 | |
| 		return false
 | |
| 	}
 | |
| 
 | |
| 	// Ensure the arguments were not modified.
 | |
| 	return x == x1 && y == y1
 | |
| }
 |