File: constant_time_test.go

package info (click to toggle)
gcc-avr 1%3A5.4.0%2BAtmel3.6.1-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 589,832 kB
  • sloc: ansic: 2,775,567; ada: 756,757; cpp: 723,977; f90: 117,673; asm: 66,896; makefile: 62,755; xml: 44,466; sh: 29,549; exp: 23,315; objc: 15,216; fortran: 10,901; pascal: 4,185; python: 4,093; perl: 2,969; awk: 2,811; ml: 2,385; cs: 879; yacc: 316; lex: 198; haskell: 112; lisp: 8
file content (127 lines) | stat: -rw-r--r-- 2,432 bytes parent folder | download | duplicates (27)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package subtle

import (
	"testing"
	"testing/quick"
)

type TestConstantTimeCompareStruct struct {
	a, b []byte
	out  int
}

var testConstantTimeCompareData = []TestConstantTimeCompareStruct{
	{[]byte{}, []byte{}, 1},
	{[]byte{0x11}, []byte{0x11}, 1},
	{[]byte{0x12}, []byte{0x11}, 0},
	{[]byte{0x11}, []byte{0x11, 0x12}, 0},
	{[]byte{0x11, 0x12}, []byte{0x11}, 0},
}

func TestConstantTimeCompare(t *testing.T) {
	for i, test := range testConstantTimeCompareData {
		if r := ConstantTimeCompare(test.a, test.b); r != test.out {
			t.Errorf("#%d bad result (got %x, want %x)", i, r, test.out)
		}
	}
}

type TestConstantTimeByteEqStruct struct {
	a, b uint8
	out  int
}

var testConstandTimeByteEqData = []TestConstantTimeByteEqStruct{
	{0, 0, 1},
	{0, 1, 0},
	{1, 0, 0},
	{0xff, 0xff, 1},
	{0xff, 0xfe, 0},
}

func byteEq(a, b uint8) int {
	if a == b {
		return 1
	}
	return 0
}

func TestConstantTimeByteEq(t *testing.T) {
	for i, test := range testConstandTimeByteEqData {
		if r := ConstantTimeByteEq(test.a, test.b); r != test.out {
			t.Errorf("#%d bad result (got %x, want %x)", i, r, test.out)
		}
	}
	err := quick.CheckEqual(ConstantTimeByteEq, byteEq, nil)
	if err != nil {
		t.Error(err)
	}
}

func eq(a, b int32) int {
	if a == b {
		return 1
	}
	return 0
}

func TestConstantTimeEq(t *testing.T) {
	err := quick.CheckEqual(ConstantTimeEq, eq, nil)
	if err != nil {
		t.Error(err)
	}
}

func makeCopy(v int, x, y []byte) []byte {
	if len(x) > len(y) {
		x = x[0:len(y)]
	} else {
		y = y[0:len(x)]
	}
	if v == 1 {
		copy(x, y)
	}
	return x
}

func constantTimeCopyWrapper(v int, x, y []byte) []byte {
	if len(x) > len(y) {
		x = x[0:len(y)]
	} else {
		y = y[0:len(x)]
	}
	v &= 1
	ConstantTimeCopy(v, x, y)
	return x
}

func TestConstantTimeCopy(t *testing.T) {
	err := quick.CheckEqual(constantTimeCopyWrapper, makeCopy, nil)
	if err != nil {
		t.Error(err)
	}
}

var lessOrEqTests = []struct {
	x, y, result int
}{
	{0, 0, 1},
	{1, 0, 0},
	{0, 1, 1},
	{10, 20, 1},
	{20, 10, 0},
	{10, 10, 1},
}

func TestConstantTimeLessOrEq(t *testing.T) {
	for i, test := range lessOrEqTests {
		result := ConstantTimeLessOrEq(test.x, test.y)
		if result != test.result {
			t.Errorf("#%d: %d <= %d gave %d, expected %d", i, test.x, test.y, result, test.result)
		}
	}
}