| // 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) |
| } |
| } |
| } |