| // Copyright 2018 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. | |
| //go:build amd64 || arm64 || ppc64le | |
| // +build amd64 arm64 ppc64le | |
| package elliptic | |
| import ( | |
| "crypto/rand" | |
| "testing" | |
| "time" | |
| ) | |
| func TestFuzz(t *testing.T) { | |
| p256 := P256() | |
| p256Generic := p256.Params() | |
| var scalar1 [32]byte | |
| var scalar2 [32]byte | |
| var timeout *time.Timer | |
| if testing.Short() { | |
| timeout = time.NewTimer(10 * time.Millisecond) | |
| } else { | |
| timeout = time.NewTimer(2 * time.Second) | |
| } | |
| for { | |
| select { | |
| case <-timeout.C: | |
| return | |
| default: | |
| } | |
| rand.Read(scalar1[:]) | |
| rand.Read(scalar2[:]) | |
| x, y := p256.ScalarBaseMult(scalar1[:]) | |
| x2, y2 := p256Generic.ScalarBaseMult(scalar1[:]) | |
| xx, yy := p256.ScalarMult(x, y, scalar2[:]) | |
| xx2, yy2 := p256Generic.ScalarMult(x2, y2, scalar2[:]) | |
| if x.Cmp(x2) != 0 || y.Cmp(y2) != 0 { | |
| t.Fatalf("ScalarBaseMult does not match reference result with scalar: %x, please report this error to security@golang.org", scalar1) | |
| } | |
| if xx.Cmp(xx2) != 0 || yy.Cmp(yy2) != 0 { | |
| t.Fatalf("ScalarMult does not match reference result with scalars: %x and %x, please report this error to security@golang.org", scalar1, scalar2) | |
| } | |
| } | |
| } |