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