...
Source file
src/crypto/subtle/constant_time.go
1
2
3
4
5
6
7 package subtle
8
9
10
11
12 func ConstantTimeCompare(x, y []byte) int {
13 if len(x) != len(y) {
14 return 0
15 }
16
17 var v byte
18
19 for i := 0; i < len(x); i++ {
20 v |= x[i] ^ y[i]
21 }
22
23 return ConstantTimeByteEq(v, 0)
24 }
25
26
27
28 func ConstantTimeSelect(v, x, y int) int { return ^(v-1)&x | (v-1)&y }
29
30
31 func ConstantTimeByteEq(x, y uint8) int {
32 return int((uint32(x^y) - 1) >> 31)
33 }
34
35
36 func ConstantTimeEq(x, y int32) int {
37 return int((uint64(uint32(x^y)) - 1) >> 63)
38 }
39
40
41
42
43 func ConstantTimeCopy(v int, x, y []byte) {
44 if len(x) != len(y) {
45 panic("subtle: slices have different lengths")
46 }
47
48 xmask := byte(v - 1)
49 ymask := byte(^(v - 1))
50 for i := 0; i < len(x); i++ {
51 x[i] = x[i]&xmask | y[i]&ymask
52 }
53 }
54
55
56
57 func ConstantTimeLessOrEq(x, y int) int {
58 x32 := int32(x)
59 y32 := int32(y)
60 return int(((x32 - y32 - 1) >> 31) & 1)
61 }
62
View as plain text