gcc/libgo/go/crypto/subtle/constant_time_test.go
Ian Lance Taylor 1a2f01efa6 libgo: update to Go1.10beta1
Update the Go library to the 1.10beta1 release.
    
    Requires a few changes to the compiler for modifications to the map
    runtime code, and to handle some nowritebarrier cases in the runtime.
    
    Reviewed-on: https://go-review.googlesource.com/86455

gotools/:
	* Makefile.am (go_cmd_vet_files): New variable.
	(go_cmd_buildid_files, go_cmd_test2json_files): New variables.
	(s-zdefaultcc): Change from constants to functions.
	(noinst_PROGRAMS): Add vet, buildid, and test2json.
	(cgo$(EXEEXT)): Link against $(LIBGOTOOL).
	(vet$(EXEEXT)): New target.
	(buildid$(EXEEXT)): New target.
	(test2json$(EXEEXT)): New target.
	(install-exec-local): Install all $(noinst_PROGRAMS).
	(uninstall-local): Uninstasll all $(noinst_PROGRAMS).
	(check-go-tool): Depend on $(noinst_PROGRAMS).  Copy down
	objabi.go.
	(check-runtime): Depend on $(noinst_PROGRAMS).
	(check-cgo-test, check-carchive-test): Likewise.
	(check-vet): New target.
	(check): Depend on check-vet.  Look at cmd_vet-testlog.
	(.PHONY): Add check-vet.
	* Makefile.in: Rebuild.

From-SVN: r256365
2018-01-09 01:23:08 +00:00

160 lines
2.9 KiB
Go

// 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)
}
}
}
var benchmarkGlobal uint8
func BenchmarkConstantTimeByteEq(b *testing.B) {
var x, y uint8
for i := 0; i < b.N; i++ {
x, y = uint8(ConstantTimeByteEq(x, y)), x
}
benchmarkGlobal = x
}
func BenchmarkConstantTimeEq(b *testing.B) {
var x, y int
for i := 0; i < b.N; i++ {
x, y = ConstantTimeEq(int32(x), int32(y)), x
}
benchmarkGlobal = uint8(x)
}
func BenchmarkConstantTimeLessOrEq(b *testing.B) {
var x, y int
for i := 0; i < b.N; i++ {
x, y = ConstantTimeLessOrEq(x, y), x
}
benchmarkGlobal = uint8(x)
}