aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilippo Valsorda <filippo@golang.org>2024-06-24 13:31:21 +0200
committerGopher Robot <gobot@golang.org>2024-06-26 15:12:35 +0000
commita6a393ffd658b286f64f141b06cbd94e516d3a64 (patch)
tree5f957e83a6b824e663b287ef1d27d5e3afc28148
parent1c7450041f58a5e714eb084ae0e670d3576ea9fb (diff)
downloadgo-x-crypto-a6a393ffd658b286f64f141b06cbd94e516d3a64.tar.xz
all: bump go.mod version and drop compatibility shims
Also, remove the legacy import annotations. Fixes golang/go#68147 Change-Id: Ibfcc9322f27224c0ba92ea42cd56912a7d8783fd Reviewed-on: https://go-review.googlesource.com/c/crypto/+/594256 Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> Auto-Submit: Filippo Valsorda <filippo@golang.org> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Roland Shoemaker <roland@golang.org>
-rw-r--r--acme/http.go21
-rw-r--r--acme/version_go112.go27
-rw-r--r--bcrypt/bcrypt.go2
-rw-r--r--blake2s/blake2s.go10
-rw-r--r--blake2s/register.go21
-rw-r--r--blowfish/cipher.go2
-rw-r--r--bn256/bn256.go2
-rw-r--r--cast5/cast5.go2
-rw-r--r--chacha20poly1305/chacha20poly1305.go2
-rw-r--r--cryptobyte/asn1/asn1.go2
-rw-r--r--cryptobyte/string.go2
-rw-r--r--curve25519/curve25519.go39
-rw-r--r--curve25519/curve25519_compat.go105
-rw-r--r--curve25519/curve25519_go120.go46
-rw-r--r--curve25519/internal/field/README7
-rw-r--r--curve25519/internal/field/_asm/fe_amd64_asm.go298
-rw-r--r--curve25519/internal/field/_asm/go.mod16
-rw-r--r--curve25519/internal/field/_asm/go.sum51
-rw-r--r--curve25519/internal/field/fe.go416
-rw-r--r--curve25519/internal/field/fe_alias_test.go126
-rw-r--r--curve25519/internal/field/fe_amd64.go15
-rw-r--r--curve25519/internal/field/fe_amd64.s378
-rw-r--r--curve25519/internal/field/fe_amd64_noasm.go11
-rw-r--r--curve25519/internal/field/fe_arm64.go15
-rw-r--r--curve25519/internal/field/fe_arm64.s42
-rw-r--r--curve25519/internal/field/fe_arm64_noasm.go11
-rw-r--r--curve25519/internal/field/fe_bench_test.go36
-rw-r--r--curve25519/internal/field/fe_generic.go264
-rw-r--r--curve25519/internal/field/fe_test.go558
-rw-r--r--curve25519/internal/field/sync.checkpoint1
-rwxr-xr-xcurve25519/internal/field/sync.sh19
-rw-r--r--ed25519/ed25519.go4
-rw-r--r--go.mod2
-rw-r--r--hkdf/hkdf.go2
-rw-r--r--internal/wycheproof/ecdh_stdlib_test.go2
-rw-r--r--internal/wycheproof/eddsa_test.go2
-rw-r--r--md4/md4.go2
-rw-r--r--nacl/box/box.go2
-rw-r--r--nacl/secretbox/secretbox.go2
-rw-r--r--ocsp/ocsp.go2
-rw-r--r--ocsp/ocsp_test.go2
-rw-r--r--openpgp/armor/armor.go5
-rw-r--r--openpgp/clearsign/clearsign.go2
-rw-r--r--openpgp/elgamal/elgamal.go2
-rw-r--r--openpgp/errors/errors.go2
-rw-r--r--openpgp/packet/packet.go2
-rw-r--r--openpgp/read.go2
-rw-r--r--openpgp/s2k/s2k.go2
-rw-r--r--otr/otr.go2
-rw-r--r--pbkdf2/pbkdf2.go2
-rw-r--r--poly1305/poly1305_compat.go2
-rw-r--r--ripemd160/ripemd160.go2
-rw-r--r--salsa20/salsa/hsalsa20.go2
-rw-r--r--salsa20/salsa20.go2
-rw-r--r--scrypt/scrypt.go2
-rw-r--r--sha3/doc.go2
-rw-r--r--sha3/hashes.go8
-rw-r--r--sha3/register.go18
-rw-r--r--ssh/agent/client.go2
-rw-r--r--ssh/doc.go2
-rw-r--r--ssh/test/doc.go2
-rw-r--r--ssh/testdata/doc.go2
-rw-r--r--twofish/twofish.go2
-rw-r--r--xtea/cipher.go2
-rw-r--r--xts/xts.go2
65 files changed, 110 insertions, 2532 deletions
diff --git a/acme/http.go b/acme/http.go
index 58836e5..d92ff23 100644
--- a/acme/http.go
+++ b/acme/http.go
@@ -15,6 +15,7 @@ import (
"io"
"math/big"
"net/http"
+ "runtime/debug"
"strconv"
"strings"
"time"
@@ -271,9 +272,27 @@ func (c *Client) httpClient() *http.Client {
}
// packageVersion is the version of the module that contains this package, for
-// sending as part of the User-Agent header. It's set in version_go112.go.
+// sending as part of the User-Agent header.
var packageVersion string
+func init() {
+ // Set packageVersion if the binary was built in modules mode and x/crypto
+ // was not replaced with a different module.
+ info, ok := debug.ReadBuildInfo()
+ if !ok {
+ return
+ }
+ for _, m := range info.Deps {
+ if m.Path != "golang.org/x/crypto" {
+ continue
+ }
+ if m.Replace == nil {
+ packageVersion = m.Version
+ }
+ break
+ }
+}
+
// userAgent returns the User-Agent header value. It includes the package name,
// the module version (if available), and the c.UserAgent value (if set).
func (c *Client) userAgent() string {
diff --git a/acme/version_go112.go b/acme/version_go112.go
deleted file mode 100644
index cc5fab6..0000000
--- a/acme/version_go112.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2019 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 go1.12
-
-package acme
-
-import "runtime/debug"
-
-func init() {
- // Set packageVersion if the binary was built in modules mode and x/crypto
- // was not replaced with a different module.
- info, ok := debug.ReadBuildInfo()
- if !ok {
- return
- }
- for _, m := range info.Deps {
- if m.Path != "golang.org/x/crypto" {
- continue
- }
- if m.Replace == nil {
- packageVersion = m.Version
- }
- break
- }
-}
diff --git a/bcrypt/bcrypt.go b/bcrypt/bcrypt.go
index 5577c0f..dc93118 100644
--- a/bcrypt/bcrypt.go
+++ b/bcrypt/bcrypt.go
@@ -4,7 +4,7 @@
// Package bcrypt implements Provos and Mazières's bcrypt adaptive hashing
// algorithm. See http://www.usenix.org/event/usenix99/provos/provos.pdf
-package bcrypt // import "golang.org/x/crypto/bcrypt"
+package bcrypt
// The code is a port of Provos and Mazières's C implementation.
import (
diff --git a/blake2s/blake2s.go b/blake2s/blake2s.go
index e3f46aa..c25d07d 100644
--- a/blake2s/blake2s.go
+++ b/blake2s/blake2s.go
@@ -16,9 +16,10 @@
//
// BLAKE2X is a construction to compute hash values larger than 32 bytes. It
// can produce hash values between 0 and 65535 bytes.
-package blake2s // import "golang.org/x/crypto/blake2s"
+package blake2s
import (
+ "crypto"
"encoding/binary"
"errors"
"hash"
@@ -55,6 +56,13 @@ func Sum256(data []byte) [Size]byte {
// and BinaryUnmarshaler for state (de)serialization as documented by hash.Hash.
func New256(key []byte) (hash.Hash, error) { return newDigest(Size, key) }
+func init() {
+ crypto.RegisterHash(crypto.BLAKE2s_256, func() hash.Hash {
+ h, _ := New256(nil)
+ return h
+ })
+}
+
// New128 returns a new hash.Hash computing the BLAKE2s-128 checksum given a
// non-empty key. Note that a 128-bit digest is too small to be secure as a
// cryptographic hash and should only be used as a MAC, thus the key argument
diff --git a/blake2s/register.go b/blake2s/register.go
deleted file mode 100644
index 3156148..0000000
--- a/blake2s/register.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2017 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 go1.9
-
-package blake2s
-
-import (
- "crypto"
- "hash"
-)
-
-func init() {
- newHash256 := func() hash.Hash {
- h, _ := New256(nil)
- return h
- }
-
- crypto.RegisterHash(crypto.BLAKE2s_256, newHash256)
-}
diff --git a/blowfish/cipher.go b/blowfish/cipher.go
index 213bf20..0898956 100644
--- a/blowfish/cipher.go
+++ b/blowfish/cipher.go
@@ -11,7 +11,7 @@
// Deprecated: any new system should use AES (from crypto/aes, if necessary in
// an AEAD mode like crypto/cipher.NewGCM) or XChaCha20-Poly1305 (from
// golang.org/x/crypto/chacha20poly1305).
-package blowfish // import "golang.org/x/crypto/blowfish"
+package blowfish
// The code is a port of Bruce Schneier's C implementation.
// See https://www.schneier.com/blowfish.html.
diff --git a/bn256/bn256.go b/bn256/bn256.go
index 5d6d198..6661687 100644
--- a/bn256/bn256.go
+++ b/bn256/bn256.go
@@ -23,7 +23,7 @@
// elliptic curve. This package is frozen, and not implemented in constant time.
// There is a more complete implementation at github.com/cloudflare/bn256, but
// note that it suffers from the same security issues of the underlying curve.
-package bn256 // import "golang.org/x/crypto/bn256"
+package bn256
import (
"crypto/rand"
diff --git a/cast5/cast5.go b/cast5/cast5.go
index 425e8ee..016e902 100644
--- a/cast5/cast5.go
+++ b/cast5/cast5.go
@@ -11,7 +11,7 @@
// Deprecated: any new system should use AES (from crypto/aes, if necessary in
// an AEAD mode like crypto/cipher.NewGCM) or XChaCha20-Poly1305 (from
// golang.org/x/crypto/chacha20poly1305).
-package cast5 // import "golang.org/x/crypto/cast5"
+package cast5
import (
"errors"
diff --git a/chacha20poly1305/chacha20poly1305.go b/chacha20poly1305/chacha20poly1305.go
index 93da732..8cf5d81 100644
--- a/chacha20poly1305/chacha20poly1305.go
+++ b/chacha20poly1305/chacha20poly1305.go
@@ -5,7 +5,7 @@
// Package chacha20poly1305 implements the ChaCha20-Poly1305 AEAD and its
// extended nonce variant XChaCha20-Poly1305, as specified in RFC 8439 and
// draft-irtf-cfrg-xchacha-01.
-package chacha20poly1305 // import "golang.org/x/crypto/chacha20poly1305"
+package chacha20poly1305
import (
"crypto/cipher"
diff --git a/cryptobyte/asn1/asn1.go b/cryptobyte/asn1/asn1.go
index cda8e3e..90ef6a2 100644
--- a/cryptobyte/asn1/asn1.go
+++ b/cryptobyte/asn1/asn1.go
@@ -4,7 +4,7 @@
// Package asn1 contains supporting types for parsing and building ASN.1
// messages with the cryptobyte package.
-package asn1 // import "golang.org/x/crypto/cryptobyte/asn1"
+package asn1
// Tag represents an ASN.1 identifier octet, consisting of a tag number
// (indicating a type) and class (such as context-specific or constructed).
diff --git a/cryptobyte/string.go b/cryptobyte/string.go
index 10692a8..4b0f809 100644
--- a/cryptobyte/string.go
+++ b/cryptobyte/string.go
@@ -15,7 +15,7 @@
//
// See the documentation and examples for the Builder and String types to get
// started.
-package cryptobyte // import "golang.org/x/crypto/cryptobyte"
+package cryptobyte
// String represents a string of bytes. It provides methods for parsing
// fixed-length and length-prefixed values from it.
diff --git a/curve25519/curve25519.go b/curve25519/curve25519.go
index 00f963e..21ca3b2 100644
--- a/curve25519/curve25519.go
+++ b/curve25519/curve25519.go
@@ -6,9 +6,11 @@
// performs scalar multiplication on the elliptic curve known as Curve25519.
// See RFC 7748.
//
-// Starting in Go 1.20, this package is a wrapper for the X25519 implementation
+// This package is a wrapper for the X25519 implementation
// in the crypto/ecdh package.
-package curve25519 // import "golang.org/x/crypto/curve25519"
+package curve25519
+
+import "crypto/ecdh"
// ScalarMult sets dst to the product scalar * point.
//
@@ -16,7 +18,13 @@ package curve25519 // import "golang.org/x/crypto/curve25519"
// zeroes, irrespective of the scalar. Instead, use the X25519 function, which
// will return an error.
func ScalarMult(dst, scalar, point *[32]byte) {
- scalarMult(dst, scalar, point)
+ if _, err := x25519(dst, scalar[:], point[:]); err != nil {
+ // The only error condition for x25519 when the inputs are 32 bytes long
+ // is if the output would have been the all-zero value.
+ for i := range dst {
+ dst[i] = 0
+ }
+ }
}
// ScalarBaseMult sets dst to the product scalar * base where base is the
@@ -25,7 +33,12 @@ func ScalarMult(dst, scalar, point *[32]byte) {
// It is recommended to use the X25519 function with Basepoint instead, as
// copying into fixed size arrays can lead to unexpected bugs.
func ScalarBaseMult(dst, scalar *[32]byte) {
- scalarBaseMult(dst, scalar)
+ curve := ecdh.X25519()
+ priv, err := curve.NewPrivateKey(scalar[:])
+ if err != nil {
+ panic("curve25519: internal error: scalarBaseMult was not 32 bytes")
+ }
+ copy(dst[:], priv.PublicKey().Bytes())
}
const (
@@ -57,3 +70,21 @@ func X25519(scalar, point []byte) ([]byte, error) {
var dst [32]byte
return x25519(&dst, scalar, point)
}
+
+func x25519(dst *[32]byte, scalar, point []byte) ([]byte, error) {
+ curve := ecdh.X25519()
+ pub, err := curve.NewPublicKey(point)
+ if err != nil {
+ return nil, err
+ }
+ priv, err := curve.NewPrivateKey(scalar)
+ if err != nil {
+ return nil, err
+ }
+ out, err := priv.ECDH(pub)
+ if err != nil {
+ return nil, err
+ }
+ copy(dst[:], out)
+ return dst[:], nil
+}
diff --git a/curve25519/curve25519_compat.go b/curve25519/curve25519_compat.go
deleted file mode 100644
index ba647e8..0000000
--- a/curve25519/curve25519_compat.go
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2019 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 !go1.20
-
-package curve25519
-
-import (
- "crypto/subtle"
- "errors"
- "strconv"
-
- "golang.org/x/crypto/curve25519/internal/field"
-)
-
-func scalarMult(dst, scalar, point *[32]byte) {
- var e [32]byte
-
- copy(e[:], scalar[:])
- e[0] &= 248
- e[31] &= 127
- e[31] |= 64
-
- var x1, x2, z2, x3, z3, tmp0, tmp1 field.Element
- x1.SetBytes(point[:])
- x2.One()
- x3.Set(&x1)
- z3.One()
-
- swap := 0
- for pos := 254; pos >= 0; pos-- {
- b := e[pos/8] >> uint(pos&7)
- b &= 1
- swap ^= int(b)
- x2.Swap(&x3, swap)
- z2.Swap(&z3, swap)
- swap = int(b)
-
- tmp0.Subtract(&x3, &z3)
- tmp1.Subtract(&x2, &z2)
- x2.Add(&x2, &z2)
- z2.Add(&x3, &z3)
- z3.Multiply(&tmp0, &x2)
- z2.Multiply(&z2, &tmp1)
- tmp0.Square(&tmp1)
- tmp1.Square(&x2)
- x3.Add(&z3, &z2)
- z2.Subtract(&z3, &z2)
- x2.Multiply(&tmp1, &tmp0)
- tmp1.Subtract(&tmp1, &tmp0)
- z2.Square(&z2)
-
- z3.Mult32(&tmp1, 121666)
- x3.Square(&x3)
- tmp0.Add(&tmp0, &z3)
- z3.Multiply(&x1, &z2)
- z2.Multiply(&tmp1, &tmp0)
- }
-
- x2.Swap(&x3, swap)
- z2.Swap(&z3, swap)
-
- z2.Invert(&z2)
- x2.Multiply(&x2, &z2)
- copy(dst[:], x2.Bytes())
-}
-
-func scalarBaseMult(dst, scalar *[32]byte) {
- checkBasepoint()
- scalarMult(dst, scalar, &basePoint)
-}
-
-func x25519(dst *[32]byte, scalar, point []byte) ([]byte, error) {
- var in [32]byte
- if l := len(scalar); l != 32 {
- return nil, errors.New("bad scalar length: " + strconv.Itoa(l) + ", expected 32")
- }
- if l := len(point); l != 32 {
- return nil, errors.New("bad point length: " + strconv.Itoa(l) + ", expected 32")
- }
- copy(in[:], scalar)
- if &point[0] == &Basepoint[0] {
- scalarBaseMult(dst, &in)
- } else {
- var base, zero [32]byte
- copy(base[:], point)
- scalarMult(dst, &in, &base)
- if subtle.ConstantTimeCompare(dst[:], zero[:]) == 1 {
- return nil, errors.New("bad input point: low order point")
- }
- }
- return dst[:], nil
-}
-
-func checkBasepoint() {
- if subtle.ConstantTimeCompare(Basepoint, []byte{
- 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- }) != 1 {
- panic("curve25519: global Basepoint value was modified")
- }
-}
diff --git a/curve25519/curve25519_go120.go b/curve25519/curve25519_go120.go
deleted file mode 100644
index 627df49..0000000
--- a/curve25519/curve25519_go120.go
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2022 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 go1.20
-
-package curve25519
-
-import "crypto/ecdh"
-
-func x25519(dst *[32]byte, scalar, point []byte) ([]byte, error) {
- curve := ecdh.X25519()
- pub, err := curve.NewPublicKey(point)
- if err != nil {
- return nil, err
- }
- priv, err := curve.NewPrivateKey(scalar)
- if err != nil {
- return nil, err
- }
- out, err := priv.ECDH(pub)
- if err != nil {
- return nil, err
- }
- copy(dst[:], out)
- return dst[:], nil
-}
-
-func scalarMult(dst, scalar, point *[32]byte) {
- if _, err := x25519(dst, scalar[:], point[:]); err != nil {
- // The only error condition for x25519 when the inputs are 32 bytes long
- // is if the output would have been the all-zero value.
- for i := range dst {
- dst[i] = 0
- }
- }
-}
-
-func scalarBaseMult(dst, scalar *[32]byte) {
- curve := ecdh.X25519()
- priv, err := curve.NewPrivateKey(scalar[:])
- if err != nil {
- panic("curve25519: internal error: scalarBaseMult was not 32 bytes")
- }
- copy(dst[:], priv.PublicKey().Bytes())
-}
diff --git a/curve25519/internal/field/README b/curve25519/internal/field/README
deleted file mode 100644
index e25bca7..0000000
--- a/curve25519/internal/field/README
+++ /dev/null
@@ -1,7 +0,0 @@
-This package is kept in sync with crypto/ed25519/internal/edwards25519/field in
-the standard library.
-
-If there are any changes in the standard library that need to be synced to this
-package, run sync.sh. It will not overwrite any local changes made since the
-previous sync, so it's ok to land changes in this package first, and then sync
-to the standard library later.
diff --git a/curve25519/internal/field/_asm/fe_amd64_asm.go b/curve25519/internal/field/_asm/fe_amd64_asm.go
deleted file mode 100644
index 1f36529..0000000
--- a/curve25519/internal/field/_asm/fe_amd64_asm.go
+++ /dev/null
@@ -1,298 +0,0 @@
-// Copyright (c) 2021 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 main
-
-import (
- "fmt"
-
- . "github.com/mmcloughlin/avo/build"
- . "github.com/mmcloughlin/avo/gotypes"
- . "github.com/mmcloughlin/avo/operand"
- . "github.com/mmcloughlin/avo/reg"
-
- // Ensure "go mod tidy" doesn't remove the golang.org/x/crypto module
- // dependency, which is necessary to access the field.Element type.
- _ "golang.org/x/crypto/curve25519"
-)
-
-//go:generate go run . -out ../fe_amd64.s -stubs ../fe_amd64.go -pkg field
-
-func main() {
- Package("golang.org/x/crypto/curve25519/internal/field")
- ConstraintExpr("amd64,gc,!purego")
- feMul()
- feSquare()
- Generate()
-}
-
-type namedComponent struct {
- Component
- name string
-}
-
-func (c namedComponent) String() string { return c.name }
-
-type uint128 struct {
- name string
- hi, lo GPVirtual
-}
-
-func (c uint128) String() string { return c.name }
-
-func feSquare() {
- TEXT("feSquare", NOSPLIT, "func(out, a *Element)")
- Doc("feSquare sets out = a * a. It works like feSquareGeneric.")
- Pragma("noescape")
-
- a := Dereference(Param("a"))
- l0 := namedComponent{a.Field("l0"), "l0"}
- l1 := namedComponent{a.Field("l1"), "l1"}
- l2 := namedComponent{a.Field("l2"), "l2"}
- l3 := namedComponent{a.Field("l3"), "l3"}
- l4 := namedComponent{a.Field("l4"), "l4"}
-
- // r0 = l0×l0 + 19×2×(l1×l4 + l2×l3)
- r0 := uint128{"r0", GP64(), GP64()}
- mul64(r0, 1, l0, l0)
- addMul64(r0, 38, l1, l4)
- addMul64(r0, 38, l2, l3)
-
- // r1 = 2×l0×l1 + 19×2×l2×l4 + 19×l3×l3
- r1 := uint128{"r1", GP64(), GP64()}
- mul64(r1, 2, l0, l1)
- addMul64(r1, 38, l2, l4)
- addMul64(r1, 19, l3, l3)
-
- // r2 = = 2×l0×l2 + l1×l1 + 19×2×l3×l4
- r2 := uint128{"r2", GP64(), GP64()}
- mul64(r2, 2, l0, l2)
- addMul64(r2, 1, l1, l1)
- addMul64(r2, 38, l3, l4)
-
- // r3 = = 2×l0×l3 + 2×l1×l2 + 19×l4×l4
- r3 := uint128{"r3", GP64(), GP64()}
- mul64(r3, 2, l0, l3)
- addMul64(r3, 2, l1, l2)
- addMul64(r3, 19, l4, l4)
-
- // r4 = = 2×l0×l4 + 2×l1×l3 + l2×l2
- r4 := uint128{"r4", GP64(), GP64()}
- mul64(r4, 2, l0, l4)
- addMul64(r4, 2, l1, l3)
- addMul64(r4, 1, l2, l2)
-
- Comment("First reduction chain")
- maskLow51Bits := GP64()
- MOVQ(Imm((1<<51)-1), maskLow51Bits)
- c0, r0lo := shiftRightBy51(&r0)
- c1, r1lo := shiftRightBy51(&r1)
- c2, r2lo := shiftRightBy51(&r2)
- c3, r3lo := shiftRightBy51(&r3)
- c4, r4lo := shiftRightBy51(&r4)
- maskAndAdd(r0lo, maskLow51Bits, c4, 19)
- maskAndAdd(r1lo, maskLow51Bits, c0, 1)
- maskAndAdd(r2lo, maskLow51Bits, c1, 1)
- maskAndAdd(r3lo, maskLow51Bits, c2, 1)
- maskAndAdd(r4lo, maskLow51Bits, c3, 1)
-
- Comment("Second reduction chain (carryPropagate)")
- // c0 = r0 >> 51
- MOVQ(r0lo, c0)
- SHRQ(Imm(51), c0)
- // c1 = r1 >> 51
- MOVQ(r1lo, c1)
- SHRQ(Imm(51), c1)
- // c2 = r2 >> 51
- MOVQ(r2lo, c2)
- SHRQ(Imm(51), c2)
- // c3 = r3 >> 51
- MOVQ(r3lo, c3)
- SHRQ(Imm(51), c3)
- // c4 = r4 >> 51
- MOVQ(r4lo, c4)
- SHRQ(Imm(51), c4)
- maskAndAdd(r0lo, maskLow51Bits, c4, 19)
- maskAndAdd(r1lo, maskLow51Bits, c0, 1)
- maskAndAdd(r2lo, maskLow51Bits, c1, 1)
- maskAndAdd(r3lo, maskLow51Bits, c2, 1)
- maskAndAdd(r4lo, maskLow51Bits, c3, 1)
-
- Comment("Store output")
- out := Dereference(Param("out"))
- Store(r0lo, out.Field("l0"))
- Store(r1lo, out.Field("l1"))
- Store(r2lo, out.Field("l2"))
- Store(r3lo, out.Field("l3"))
- Store(r4lo, out.Field("l4"))
-
- RET()
-}
-
-func feMul() {
- TEXT("feMul", NOSPLIT, "func(out, a, b *Element)")
- Doc("feMul sets out = a * b. It works like feMulGeneric.")
- Pragma("noescape")
-
- a := Dereference(Param("a"))
- a0 := namedComponent{a.Field("l0"), "a0"}
- a1 := namedComponent{a.Field("l1"), "a1"}
- a2 := namedComponent{a.Field("l2"), "a2"}
- a3 := namedComponent{a.Field("l3"), "a3"}
- a4 := namedComponent{a.Field("l4"), "a4"}
-
- b := Dereference(Param("b"))
- b0 := namedComponent{b.Field("l0"), "b0"}
- b1 := namedComponent{b.Field("l1"), "b1"}
- b2 := namedComponent{b.Field("l2"), "b2"}
- b3 := namedComponent{b.Field("l3"), "b3"}
- b4 := namedComponent{b.Field("l4"), "b4"}
-
- // r0 = a0×b0 + 19×(a1×b4 + a2×b3 + a3×b2 + a4×b1)
- r0 := uint128{"r0", GP64(), GP64()}
- mul64(r0, 1, a0, b0)
- addMul64(r0, 19, a1, b4)
- addMul64(r0, 19, a2, b3)
- addMul64(r0, 19, a3, b2)
- addMul64(r0, 19, a4, b1)
-
- // r1 = a0×b1 + a1×b0 + 19×(a2×b4 + a3×b3 + a4×b2)
- r1 := uint128{"r1", GP64(), GP64()}
- mul64(r1, 1, a0, b1)
- addMul64(r1, 1, a1, b0)
- addMul64(r1, 19, a2, b4)
- addMul64(r1, 19, a3, b3)
- addMul64(r1, 19, a4, b2)
-
- // r2 = a0×b2 + a1×b1 + a2×b0 + 19×(a3×b4 + a4×b3)
- r2 := uint128{"r2", GP64(), GP64()}
- mul64(r2, 1, a0, b2)
- addMul64(r2, 1, a1, b1)
- addMul64(r2, 1, a2, b0)
- addMul64(r2, 19, a3, b4)
- addMul64(r2, 19, a4, b3)
-
- // r3 = a0×b3 + a1×b2 + a2×b1 + a3×b0 + 19×a4×b4
- r3 := uint128{"r3", GP64(), GP64()}
- mul64(r3, 1, a0, b3)
- addMul64(r3, 1, a1, b2)
- addMul64(r3, 1, a2, b1)
- addMul64(r3, 1, a3, b0)
- addMul64(r3, 19, a4, b4)
-
- // r4 = a0×b4 + a1×b3 + a2×b2 + a3×b1 + a4×b0
- r4 := uint128{"r4", GP64(), GP64()}
- mul64(r4, 1, a0, b4)
- addMul64(r4, 1, a1, b3)
- addMul64(r4, 1, a2, b2)
- addMul64(r4, 1, a3, b1)
- addMul64(r4, 1, a4, b0)
-
- Comment("First reduction chain")
- maskLow51Bits := GP64()
- MOVQ(Imm((1<<51)-1), maskLow51Bits)
- c0, r0lo := shiftRightBy51(&r0)
- c1, r1lo := shiftRightBy51(&r1)
- c2, r2lo := shiftRightBy51(&r2)
- c3, r3lo := shiftRightBy51(&r3)
- c4, r4lo := shiftRightBy51(&r4)
- maskAndAdd(r0lo, maskLow51Bits, c4, 19)
- maskAndAdd(r1lo, maskLow51Bits, c0, 1)
- maskAndAdd(r2lo, maskLow51Bits, c1, 1)
- maskAndAdd(r3lo, maskLow51Bits, c2, 1)
- maskAndAdd(r4lo, maskLow51Bits, c3, 1)
-
- Comment("Second reduction chain (carryPropagate)")
- // c0 = r0 >> 51
- MOVQ(r0lo, c0)
- SHRQ(Imm(51), c0)
- // c1 = r1 >> 51
- MOVQ(r1lo, c1)
- SHRQ(Imm(51), c1)
- // c2 = r2 >> 51
- MOVQ(r2lo, c2)
- SHRQ(Imm(51), c2)
- // c3 = r3 >> 51
- MOVQ(r3lo, c3)
- SHRQ(Imm(51), c3)
- // c4 = r4 >> 51
- MOVQ(r4lo, c4)
- SHRQ(Imm(51), c4)
- maskAndAdd(r0lo, maskLow51Bits, c4, 19)
- maskAndAdd(r1lo, maskLow51Bits, c0, 1)
- maskAndAdd(r2lo, maskLow51Bits, c1, 1)
- maskAndAdd(r3lo, maskLow51Bits, c2, 1)
- maskAndAdd(r4lo, maskLow51Bits, c3, 1)
-
- Comment("Store output")
- out := Dereference(Param("out"))
- Store(r0lo, out.Field("l0"))
- Store(r1lo, out.Field("l1"))
- Store(r2lo, out.Field("l2"))
- Store(r3lo, out.Field("l3"))
- Store(r4lo, out.Field("l4"))
-
- RET()
-}
-
-// mul64 sets r to i * aX * bX.
-func mul64(r uint128, i int, aX, bX namedComponent) {
- switch i {
- case 1:
- Comment(fmt.Sprintf("%s = %s×%s", r, aX, bX))
- Load(aX, RAX)
- case 2:
- Comment(fmt.Sprintf("%s = 2×%s×%s", r, aX, bX))
- Load(aX, RAX)
- SHLQ(Imm(1), RAX)
- default:
- panic("unsupported i value")
- }
- MULQ(mustAddr(bX)) // RDX, RAX = RAX * bX
- MOVQ(RAX, r.lo)
- MOVQ(RDX, r.hi)
-}
-
-// addMul64 sets r to r + i * aX * bX.
-func addMul64(r uint128, i uint64, aX, bX namedComponent) {
- switch i {
- case 1:
- Comment(fmt.Sprintf("%s += %s×%s", r, aX, bX))
- Load(aX, RAX)
- default:
- Comment(fmt.Sprintf("%s += %d×%s×%s", r, i, aX, bX))
- IMUL3Q(Imm(i), Load(aX, GP64()), RAX)
- }
- MULQ(mustAddr(bX)) // RDX, RAX = RAX * bX
- ADDQ(RAX, r.lo)
- ADCQ(RDX, r.hi)
-}
-
-// shiftRightBy51 returns r >> 51 and r.lo.
-//
-// After this function is called, the uint128 may not be used anymore.
-func shiftRightBy51(r *uint128) (out, lo GPVirtual) {
- out = r.hi
- lo = r.lo
- SHLQ(Imm(64-51), r.lo, r.hi)
- r.lo, r.hi = nil, nil // make sure the uint128 is unusable
- return
-}
-
-// maskAndAdd sets r = r&mask + c*i.
-func maskAndAdd(r, mask, c GPVirtual, i uint64) {
- ANDQ(mask, r)
- if i != 1 {
- IMUL3Q(Imm(i), c, c)
- }
- ADDQ(c, r)
-}
-
-func mustAddr(c Component) Op {
- b, err := c.Resolve()
- if err != nil {
- panic(err)
- }
- return b.Addr
-}
diff --git a/curve25519/internal/field/_asm/go.mod b/curve25519/internal/field/_asm/go.mod
deleted file mode 100644
index f6902f4..0000000
--- a/curve25519/internal/field/_asm/go.mod
+++ /dev/null
@@ -1,16 +0,0 @@
-module asm
-
-go 1.18
-
-require (
- github.com/mmcloughlin/avo v0.5.0
- golang.org/x/crypto v0.1.0
-)
-
-require (
- golang.org/x/mod v0.8.0 // indirect
- golang.org/x/sys v0.14.0 // indirect
- golang.org/x/tools v0.6.0 // indirect
-)
-
-replace golang.org/x/crypto v0.1.0 => ../../../..
diff --git a/curve25519/internal/field/_asm/go.sum b/curve25519/internal/field/_asm/go.sum
deleted file mode 100644
index 96b7915..0000000
--- a/curve25519/internal/field/_asm/go.sum
+++ /dev/null
@@ -1,51 +0,0 @@
-github.com/mmcloughlin/avo v0.5.0 h1:nAco9/aI9Lg2kiuROBY6BhCI/z0t5jEvJfjWbL8qXLU=
-github.com/mmcloughlin/avo v0.5.0/go.mod h1:ChHFdoV7ql95Wi7vuq2YT1bwCJqiWdZrQ1im3VujLYM=
-github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
-golang.org/x/arch v0.1.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI=
-golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=
-golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
-golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
-golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
-golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q=
-golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
-golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
-golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
-golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
-golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA=
-golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=
-golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
diff --git a/curve25519/internal/field/fe.go b/curve25519/internal/field/fe.go
deleted file mode 100644
index ca841ad..0000000
--- a/curve25519/internal/field/fe.go
+++ /dev/null
@@ -1,416 +0,0 @@
-// Copyright (c) 2017 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 field implements fast arithmetic modulo 2^255-19.
-package field
-
-import (
- "crypto/subtle"
- "encoding/binary"
- "math/bits"
-)
-
-// Element represents an element of the field GF(2^255-19). Note that this
-// is not a cryptographically secure group, and should only be used to interact
-// with edwards25519.Point coordinates.
-//
-// This type works similarly to math/big.Int, and all arguments and receivers
-// are allowed to alias.
-//
-// The zero value is a valid zero element.
-type Element struct {
- // An element t represents the integer
- // t.l0 + t.l1*2^51 + t.l2*2^102 + t.l3*2^153 + t.l4*2^204
- //
- // Between operations, all limbs are expected to be lower than 2^52.
- l0 uint64
- l1 uint64
- l2 uint64
- l3 uint64
- l4 uint64
-}
-
-const maskLow51Bits uint64 = (1 << 51) - 1
-
-var feZero = &Element{0, 0, 0, 0, 0}
-
-// Zero sets v = 0, and returns v.
-func (v *Element) Zero() *Element {
- *v = *feZero
- return v
-}
-
-var feOne = &Element{1, 0, 0, 0, 0}
-
-// One sets v = 1, and returns v.
-func (v *Element) One() *Element {
- *v = *feOne
- return v
-}
-
-// reduce reduces v modulo 2^255 - 19 and returns it.
-func (v *Element) reduce() *Element {
- v.carryPropagate()
-
- // After the light reduction we now have a field element representation
- // v < 2^255 + 2^13 * 19, but need v < 2^255 - 19.
-
- // If v >= 2^255 - 19, then v + 19 >= 2^255, which would overflow 2^255 - 1,
- // generating a carry. That is, c will be 0 if v < 2^255 - 19, and 1 otherwise.
- c := (v.l0 + 19) >> 51
- c = (v.l1 + c) >> 51
- c = (v.l2 + c) >> 51
- c = (v.l3 + c) >> 51
- c = (v.l4 + c) >> 51
-
- // If v < 2^255 - 19 and c = 0, this will be a no-op. Otherwise, it's
- // effectively applying the reduction identity to the carry.
- v.l0 += 19 * c
-
- v.l1 += v.l0 >> 51
- v.l0 = v.l0 & maskLow51Bits
- v.l2 += v.l1 >> 51
- v.l1 = v.l1 & maskLow51Bits
- v.l3 += v.l2 >> 51
- v.l2 = v.l2 & maskLow51Bits
- v.l4 += v.l3 >> 51
- v.l3 = v.l3 & maskLow51Bits
- // no additional carry
- v.l4 = v.l4 & maskLow51Bits
-
- return v
-}
-
-// Add sets v = a + b, and returns v.
-func (v *Element) Add(a, b *Element) *Element {
- v.l0 = a.l0 + b.l0
- v.l1 = a.l1 + b.l1
- v.l2 = a.l2 + b.l2
- v.l3 = a.l3 + b.l3
- v.l4 = a.l4 + b.l4
- // Using the generic implementation here is actually faster than the
- // assembly. Probably because the body of this function is so simple that
- // the compiler can figure out better optimizations by inlining the carry
- // propagation. TODO
- return v.carryPropagateGeneric()
-}
-
-// Subtract sets v = a - b, and returns v.
-func (v *Element) Subtract(a, b *Element) *Element {
- // We first add 2 * p, to guarantee the subtraction won't underflow, and
- // then subtract b (which can be up to 2^255 + 2^13 * 19).
- v.l0 = (a.l0 + 0xFFFFFFFFFFFDA) - b.l0
- v.l1 = (a.l1 + 0xFFFFFFFFFFFFE) - b.l1
- v.l2 = (a.l2 + 0xFFFFFFFFFFFFE) - b.l2
- v.l3 = (a.l3 + 0xFFFFFFFFFFFFE) - b.l3
- v.l4 = (a.l4 + 0xFFFFFFFFFFFFE) - b.l4
- return v.carryPropagate()
-}
-
-// Negate sets v = -a, and returns v.
-func (v *Element) Negate(a *Element) *Element {
- return v.Subtract(feZero, a)
-}
-
-// Invert sets v = 1/z mod p, and returns v.
-//
-// If z == 0, Invert returns v = 0.
-func (v *Element) Invert(z *Element) *Element {
- // Inversion is implemented as exponentiation with exponent p − 2. It uses the
- // same sequence of 255 squarings and 11 multiplications as [Curve25519].
- var z2, z9, z11, z2_5_0, z2_10_0, z2_20_0, z2_50_0, z2_100_0, t Element
-
- z2.Square(z) // 2
- t.Square(&z2) // 4
- t.Square(&t) // 8
- z9.Multiply(&t, z) // 9
- z11.Multiply(&z9, &z2) // 11
- t.Square(&z11) // 22
- z2_5_0.Multiply(&t, &z9) // 31 = 2^5 - 2^0
-
- t.Square(&z2_5_0) // 2^6 - 2^1
- for i := 0; i < 4; i++ {
- t.Square(&t) // 2^10 - 2^5
- }
- z2_10_0.Multiply(&t, &z2_5_0) // 2^10 - 2^0
-
- t.Square(&z2_10_0) // 2^11 - 2^1
- for i := 0; i < 9; i++ {
- t.Square(&t) // 2^20 - 2^10
- }
- z2_20_0.Multiply(&t, &z2_10_0) // 2^20 - 2^0
-
- t.Square(&z2_20_0) // 2^21 - 2^1
- for i := 0; i < 19; i++ {
- t.Square(&t) // 2^40 - 2^20
- }
- t.Multiply(&t, &z2_20_0) // 2^40 - 2^0
-
- t.Square(&t) // 2^41 - 2^1
- for i := 0; i < 9; i++ {
- t.Square(&t) // 2^50 - 2^10
- }
- z2_50_0.Multiply(&t, &z2_10_0) // 2^50 - 2^0
-
- t.Square(&z2_50_0) // 2^51 - 2^1
- for i := 0; i < 49; i++ {
- t.Square(&t) // 2^100 - 2^50
- }
- z2_100_0.Multiply(&t, &z2_50_0) // 2^100 - 2^0
-
- t.Square(&z2_100_0) // 2^101 - 2^1
- for i := 0; i < 99; i++ {
- t.Square(&t) // 2^200 - 2^100
- }
- t.Multiply(&t, &z2_100_0) // 2^200 - 2^0
-
- t.Square(&t) // 2^201 - 2^1
- for i := 0; i < 49; i++ {
- t.Square(&t) // 2^250 - 2^50
- }
- t.Multiply(&t, &z2_50_0) // 2^250 - 2^0
-
- t.Square(&t) // 2^251 - 2^1
- t.Square(&t) // 2^252 - 2^2
- t.Square(&t) // 2^253 - 2^3
- t.Square(&t) // 2^254 - 2^4
- t.Square(&t) // 2^255 - 2^5
-
- return v.Multiply(&t, &z11) // 2^255 - 21
-}
-
-// Set sets v = a, and returns v.
-func (v *Element) Set(a *Element) *Element {
- *v = *a
- return v
-}
-
-// SetBytes sets v to x, which must be a 32-byte little-endian encoding.
-//
-// Consistent with RFC 7748, the most significant bit (the high bit of the
-// last byte) is ignored, and non-canonical values (2^255-19 through 2^255-1)
-// are accepted. Note that this is laxer than specified by RFC 8032.
-func (v *Element) SetBytes(x []byte) *Element {
- if len(x) != 32 {
- panic("edwards25519: invalid field element input size")
- }
-
- // Bits 0:51 (bytes 0:8, bits 0:64, shift 0, mask 51).
- v.l0 = binary.LittleEndian.Uint64(x[0:8])
- v.l0 &= maskLow51Bits
- // Bits 51:102 (bytes 6:14, bits 48:112, shift 3, mask 51).
- v.l1 = binary.LittleEndian.Uint64(x[6:14]) >> 3
- v.l1 &= maskLow51Bits
- // Bits 102:153 (bytes 12:20, bits 96:160, shift 6, mask 51).
- v.l2 = binary.LittleEndian.Uint64(x[12:20]) >> 6
- v.l2 &= maskLow51Bits
- // Bits 153:204 (bytes 19:27, bits 152:216, shift 1, mask 51).
- v.l3 = binary.LittleEndian.Uint64(x[19:27]) >> 1
- v.l3 &= maskLow51Bits
- // Bits 204:251 (bytes 24:32, bits 192:256, shift 12, mask 51).
- // Note: not bytes 25:33, shift 4, to avoid overread.
- v.l4 = binary.LittleEndian.Uint64(x[24:32]) >> 12
- v.l4 &= maskLow51Bits
-
- return v
-}
-
-// Bytes returns the canonical 32-byte little-endian encoding of v.
-func (v *Element) Bytes() []byte {
- // This function is outlined to make the allocations inline in the caller
- // rather than happen on the heap.
- var out [32]byte
- return v.bytes(&out)
-}
-
-func (v *Element) bytes(out *[32]byte) []byte {
- t := *v
- t.reduce()
-
- var buf [8]byte
- for i, l := range [5]uint64{t.l0, t.l1, t.l2, t.l3, t.l4} {
- bitsOffset := i * 51
- binary.LittleEndian.PutUint64(buf[:], l<<uint(bitsOffset%8))
- for i, bb := range buf {
- off := bitsOffset/8 + i
- if off >= len(out) {
- break
- }
- out[off] |= bb
- }
- }
-
- return out[:]
-}
-
-// Equal returns 1 if v and u are equal, and 0 otherwise.
-func (v *Element) Equal(u *Element) int {
- sa, sv := u.Bytes(), v.Bytes()
- return subtle.ConstantTimeCompare(sa, sv)
-}
-
-// mask64Bits returns 0xffffffff if cond is 1, and 0 otherwise.
-func mask64Bits(cond int) uint64 { return ^(uint64(cond) - 1) }
-
-// Select sets v to a if cond == 1, and to b if cond == 0.
-func (v *Element) Select(a, b *Element, cond int) *Element {
- m := mask64Bits(cond)
- v.l0 = (m & a.l0) | (^m & b.l0)
- v.l1 = (m & a.l1) | (^m & b.l1)
- v.l2 = (m & a.l2) | (^m & b.l2)
- v.l3 = (m & a.l3) | (^m & b.l3)
- v.l4 = (m & a.l4) | (^m & b.l4)
- return v
-}
-
-// Swap swaps v and u if cond == 1 or leaves them unchanged if cond == 0, and returns v.
-func (v *Element) Swap(u *Element, cond int) {
- m := mask64Bits(cond)
- t := m & (v.l0 ^ u.l0)
- v.l0 ^= t
- u.l0 ^= t
- t = m & (v.l1 ^ u.l1)
- v.l1 ^= t
- u.l1 ^= t
- t = m & (v.l2 ^ u.l2)
- v.l2 ^= t
- u.l2 ^= t
- t = m & (v.l3 ^ u.l3)
- v.l3 ^= t
- u.l3 ^= t
- t = m & (v.l4 ^ u.l4)
- v.l4 ^= t
- u.l4 ^= t
-}
-
-// IsNegative returns 1 if v is negative, and 0 otherwise.
-func (v *Element) IsNegative() int {
- return int(v.Bytes()[0] & 1)
-}
-
-// Absolute sets v to |u|, and returns v.
-func (v *Element) Absolute(u *Element) *Element {
- return v.Select(new(Element).Negate(u), u, u.IsNegative())
-}
-
-// Multiply sets v = x * y, and returns v.
-func (v *Element) Multiply(x, y *Element) *Element {
- feMul(v, x, y)
- return v
-}
-
-// Square sets v = x * x, and returns v.
-func (v *Element) Square(x *Element) *Element {
- feSquare(v, x)
- return v
-}
-
-// Mult32 sets v = x * y, and returns v.
-func (v *Element) Mult32(x *Element, y uint32) *Element {
- x0lo, x0hi := mul51(x.l0, y)
- x1lo, x1hi := mul51(x.l1, y)
- x2lo, x2hi := mul51(x.l2, y)
- x3lo, x3hi := mul51(x.l3, y)
- x4lo, x4hi := mul51(x.l4, y)
- v.l0 = x0lo + 19*x4hi // carried over per the reduction identity
- v.l1 = x1lo + x0hi
- v.l2 = x2lo + x1hi
- v.l3 = x3lo + x2hi
- v.l4 = x4lo + x3hi
- // The hi portions are going to be only 32 bits, plus any previous excess,
- // so we can skip the carry propagation.
- return v
-}
-
-// mul51 returns lo + hi * 2⁵¹ = a * b.
-func mul51(a uint64, b uint32) (lo uint64, hi uint64) {
- mh, ml := bits.Mul64(a, uint64(b))
- lo = ml & maskLow51Bits
- hi = (mh << 13) | (ml >> 51)
- return
-}
-
-// Pow22523 set v = x^((p-5)/8), and returns v. (p-5)/8 is 2^252-3.
-func (v *Element) Pow22523(x *Element) *Element {
- var t0, t1, t2 Element
-
- t0.Square(x) // x^2
- t1.Square(&t0) // x^4
- t1.Square(&t1) // x^8
- t1.Multiply(x, &t1) // x^9
- t0.Multiply(&t0, &t1) // x^11
- t0.Square(&t0) // x^22
- t0.Multiply(&t1, &t0) // x^31
- t1.Square(&t0) // x^62
- for i := 1; i < 5; i++ { // x^992
- t1.Square(&t1)
- }
- t0.Multiply(&t1, &t0) // x^1023 -> 1023 = 2^10 - 1
- t1.Square(&t0) // 2^11 - 2
- for i := 1; i < 10; i++ { // 2^20 - 2^10
- t1.Square(&t1)
- }
- t1.Multiply(&t1, &t0) // 2^20 - 1
- t2.Square(&t1) // 2^21 - 2
- for i := 1; i < 20; i++ { // 2^40 - 2^20
- t2.Square(&t2)
- }
- t1.Multiply(&t2, &t1) // 2^40 - 1
- t1.Square(&t1) // 2^41 - 2
- for i := 1; i < 10; i++ { // 2^50 - 2^10
- t1.Square(&t1)
- }
- t0.Multiply(&t1, &t0) // 2^50 - 1
- t1.Square(&t0) // 2^51 - 2
- for i := 1; i < 50; i++ { // 2^100 - 2^50
- t1.Square(&t1)
- }
- t1.Multiply(&t1, &t0) // 2^100 - 1
- t2.Square(&t1) // 2^101 - 2
- for i := 1; i < 100; i++ { // 2^200 - 2^100
- t2.Square(&t2)
- }
- t1.Multiply(&t2, &t1) // 2^200 - 1
- t1.Square(&t1) // 2^201 - 2
- for i := 1; i < 50; i++ { // 2^250 - 2^50
- t1.Square(&t1)
- }
- t0.Multiply(&t1, &t0) // 2^250 - 1
- t0.Square(&t0) // 2^251 - 2
- t0.Square(&t0) // 2^252 - 4
- return v.Multiply(&t0, x) // 2^252 - 3 -> x^(2^252-3)
-}
-
-// sqrtM1 is 2^((p-1)/4), which squared is equal to -1 by Euler's Criterion.
-var sqrtM1 = &Element{1718705420411056, 234908883556509,
- 2233514472574048, 2117202627021982, 765476049583133}
-
-// SqrtRatio sets r to the non-negative square root of the ratio of u and v.
-//
-// If u/v is square, SqrtRatio returns r and 1. If u/v is not square, SqrtRatio
-// sets r according to Section 4.3 of draft-irtf-cfrg-ristretto255-decaf448-00,
-// and returns r and 0.
-func (r *Element) SqrtRatio(u, v *Element) (rr *Element, wasSquare int) {
- var a, b Element
-
- // r = (u * v3) * (u * v7)^((p-5)/8)
- v2 := a.Square(v)
- uv3 := b.Multiply(u, b.Multiply(v2, v))
- uv7 := a.Multiply(uv3, a.Square(v2))
- r.Multiply(uv3, r.Pow22523(uv7))
-
- check := a.Multiply(v, a.Square(r)) // check = v * r^2
-
- uNeg := b.Negate(u)
- correctSignSqrt := check.Equal(u)
- flippedSignSqrt := check.Equal(uNeg)
- flippedSignSqrtI := check.Equal(uNeg.Multiply(uNeg, sqrtM1))
-
- rPrime := b.Multiply(r, sqrtM1) // r_prime = SQRT_M1 * r
- // r = CT_SELECT(r_prime IF flipped_sign_sqrt | flipped_sign_sqrt_i ELSE r)
- r.Select(rPrime, r, flippedSignSqrt|flippedSignSqrtI)
-
- r.Absolute(r) // Choose the nonnegative square root.
- return r, correctSignSqrt | flippedSignSqrt
-}
diff --git a/curve25519/internal/field/fe_alias_test.go b/curve25519/internal/field/fe_alias_test.go
deleted file mode 100644
index 64e57c4..0000000
--- a/curve25519/internal/field/fe_alias_test.go
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright (c) 2019 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 field
-
-import (
- "testing"
- "testing/quick"
-)
-
-func checkAliasingOneArg(f func(v, x *Element) *Element) func(v, x Element) bool {
- return func(v, x Element) bool {
- x1, v1 := x, x
-
- // Calculate a reference f(x) without aliasing.
- if out := f(&v, &x); out != &v && isInBounds(out) {
- return false
- }
-
- // Test aliasing the argument and the receiver.
- if out := f(&v1, &v1); out != &v1 || v1 != v {
- return false
- }
-
- // Ensure the arguments was not modified.
- return x == x1
- }
-}
-
-func checkAliasingTwoArgs(f func(v, x, y *Element) *Element) func(v, x, y Element) bool {
- return func(v, x, y Element) bool {
- x1, y1, v1 := x, y, Element{}
-
- // Calculate a reference f(x, y) without aliasing.
- if out := f(&v, &x, &y); out != &v && isInBounds(out) {
- return false
- }
-
- // Test aliasing the first argument and the receiver.
- v1 = x
- if out := f(&v1, &v1, &y); out != &v1 || v1 != v {
- return false
- }
- // Test aliasing the second argument and the receiver.
- v1 = y
- if out := f(&v1, &x, &v1); out != &v1 || v1 != v {
- return false
- }
-
- // Calculate a reference f(x, x) without aliasing.
- if out := f(&v, &x, &x); out != &v {
- return false
- }
-
- // Test aliasing the first argument and the receiver.
- v1 = x
- if out := f(&v1, &v1, &x); out != &v1 || v1 != v {
- return false
- }
- // Test aliasing the second argument and the receiver.
- v1 = x
- if out := f(&v1, &x, &v1); out != &v1 || v1 != v {
- return false
- }
- // Test aliasing both arguments and the receiver.
- v1 = x
- if out := f(&v1, &v1, &v1); out != &v1 || v1 != v {
- return false
- }
-
- // Ensure the arguments were not modified.
- return x == x1 && y == y1
- }
-}
-
-// TestAliasing checks that receivers and arguments can alias each other without
-// leading to incorrect results. That is, it ensures that it's safe to write
-//
-// v.Invert(v)
-//
-// or
-//
-// v.Add(v, v)
-//
-// without any of the inputs getting clobbered by the output being written.
-func TestAliasing(t *testing.T) {
- type target struct {
- name string
- oneArgF func(v, x *Element) *Element
- twoArgsF func(v, x, y *Element) *Element
- }
- for _, tt := range []target{
- {name: "Absolute", oneArgF: (*Element).Absolute},
- {name: "Invert", oneArgF: (*Element).Invert},
- {name: "Negate", oneArgF: (*Element).Negate},
- {name: "Set", oneArgF: (*Element).Set},
- {name: "Square", oneArgF: (*Element).Square},
- {name: "Multiply", twoArgsF: (*Element).Multiply},
- {name: "Add", twoArgsF: (*Element).Add},
- {name: "Subtract", twoArgsF: (*Element).Subtract},
- {
- name: "Select0",
- twoArgsF: func(v, x, y *Element) *Element {
- return (*Element).Select(v, x, y, 0)
- },
- },
- {
- name: "Select1",
- twoArgsF: func(v, x, y *Element) *Element {
- return (*Element).Select(v, x, y, 1)
- },
- },
- } {
- var err error
- switch {
- case tt.oneArgF != nil:
- err = quick.Check(checkAliasingOneArg(tt.oneArgF), &quick.Config{MaxCountScale: 1 << 8})
- case tt.twoArgsF != nil:
- err = quick.Check(checkAliasingTwoArgs(tt.twoArgsF), &quick.Config{MaxCountScale: 1 << 8})
- }
- if err != nil {
- t.Errorf("%v: %v", tt.name, err)
- }
- }
-}
diff --git a/curve25519/internal/field/fe_amd64.go b/curve25519/internal/field/fe_amd64.go
deleted file mode 100644
index 70c5416..0000000
--- a/curve25519/internal/field/fe_amd64.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Code generated by command: go run fe_amd64_asm.go -out ../fe_amd64.s -stubs ../fe_amd64.go -pkg field. DO NOT EDIT.
-
-//go:build amd64 && gc && !purego
-
-package field
-
-// feMul sets out = a * b. It works like feMulGeneric.
-//
-//go:noescape
-func feMul(out *Element, a *Element, b *Element)
-
-// feSquare sets out = a * a. It works like feSquareGeneric.
-//
-//go:noescape
-func feSquare(out *Element, a *Element)
diff --git a/curve25519/internal/field/fe_amd64.s b/curve25519/internal/field/fe_amd64.s
deleted file mode 100644
index 60817ac..0000000
--- a/curve25519/internal/field/fe_amd64.s
+++ /dev/null
@@ -1,378 +0,0 @@
-// Code generated by command: go run fe_amd64_asm.go -out ../fe_amd64.s -stubs ../fe_amd64.go -pkg field. DO NOT EDIT.
-
-//go:build amd64 && gc && !purego
-
-#include "textflag.h"
-
-// func feMul(out *Element, a *Element, b *Element)
-TEXT ·feMul(SB), NOSPLIT, $0-24
- MOVQ a+8(FP), CX
- MOVQ b+16(FP), BX
-
- // r0 = a0×b0
- MOVQ (CX), AX
- MULQ (BX)
- MOVQ AX, DI
- MOVQ DX, SI
-
- // r0 += 19×a1×b4
- MOVQ 8(CX), AX
- IMUL3Q $0x13, AX, AX
- MULQ 32(BX)
- ADDQ AX, DI
- ADCQ DX, SI
-
- // r0 += 19×a2×b3
- MOVQ 16(CX), AX
- IMUL3Q $0x13, AX, AX
- MULQ 24(BX)
- ADDQ AX, DI
- ADCQ DX, SI
-
- // r0 += 19×a3×b2
- MOVQ 24(CX), AX
- IMUL3Q $0x13, AX, AX
- MULQ 16(BX)
- ADDQ AX, DI
- ADCQ DX, SI
-
- // r0 += 19×a4×b1
- MOVQ 32(CX), AX
- IMUL3Q $0x13, AX, AX
- MULQ 8(BX)
- ADDQ AX, DI
- ADCQ DX, SI
-
- // r1 = a0×b1
- MOVQ (CX), AX
- MULQ 8(BX)
- MOVQ AX, R9
- MOVQ DX, R8
-
- // r1 += a1×b0
- MOVQ 8(CX), AX
- MULQ (BX)
- ADDQ AX, R9
- ADCQ DX, R8
-
- // r1 += 19×a2×b4
- MOVQ 16(CX), AX
- IMUL3Q $0x13, AX, AX
- MULQ 32(BX)
- ADDQ AX, R9
- ADCQ DX, R8
-
- // r1 += 19×a3×b3
- MOVQ 24(CX), AX
- IMUL3Q $0x13, AX, AX
- MULQ 24(BX)
- ADDQ AX, R9
- ADCQ DX, R8
-
- // r1 += 19×a4×b2
- MOVQ 32(CX), AX
- IMUL3Q $0x13, AX, AX
- MULQ 16(BX)
- ADDQ AX, R9
- ADCQ DX, R8
-
- // r2 = a0×b2
- MOVQ (CX), AX
- MULQ 16(BX)
- MOVQ AX, R11
- MOVQ DX, R10
-
- // r2 += a1×b1
- MOVQ 8(CX), AX
- MULQ 8(BX)
- ADDQ AX, R11
- ADCQ DX, R10
-
- // r2 += a2×b0
- MOVQ 16(CX), AX
- MULQ (BX)
- ADDQ AX, R11
- ADCQ DX, R10
-
- // r2 += 19×a3×b4
- MOVQ 24(CX), AX
- IMUL3Q $0x13, AX, AX
- MULQ 32(BX)
- ADDQ AX, R11
- ADCQ DX, R10
-
- // r2 += 19×a4×b3
- MOVQ 32(CX), AX
- IMUL3Q $0x13, AX, AX
- MULQ 24(BX)
- ADDQ AX, R11
- ADCQ DX, R10
-
- // r3 = a0×b3
- MOVQ (CX), AX
- MULQ 24(BX)
- MOVQ AX, R13
- MOVQ DX, R12
-
- // r3 += a1×b2
- MOVQ 8(CX), AX
- MULQ 16(BX)
- ADDQ AX, R13
- ADCQ DX, R12
-
- // r3 += a2×b1
- MOVQ 16(CX), AX
- MULQ 8(BX)
- ADDQ AX, R13
- ADCQ DX, R12
-
- // r3 += a3×b0
- MOVQ 24(CX), AX
- MULQ (BX)
- ADDQ AX, R13
- ADCQ DX, R12
-
- // r3 += 19×a4×b4
- MOVQ 32(CX), AX
- IMUL3Q $0x13, AX, AX
- MULQ 32(BX)
- ADDQ AX, R13
- ADCQ DX, R12
-
- // r4 = a0×b4
- MOVQ (CX), AX
- MULQ 32(BX)
- MOVQ AX, R15
- MOVQ DX, R14
-
- // r4 += a1×b3
- MOVQ 8(CX), AX
- MULQ 24(BX)
- ADDQ AX, R15
- ADCQ DX, R14
-
- // r4 += a2×b2
- MOVQ 16(CX), AX
- MULQ 16(BX)
- ADDQ AX, R15
- ADCQ DX, R14
-
- // r4 += a3×b1
- MOVQ 24(CX), AX
- MULQ 8(BX)
- ADDQ AX, R15
- ADCQ DX, R14
-
- // r4 += a4×b0
- MOVQ 32(CX), AX
- MULQ (BX)
- ADDQ AX, R15
- ADCQ DX, R14
-
- // First reduction chain
- MOVQ $0x0007ffffffffffff, AX
- SHLQ $0x0d, DI, SI
- SHLQ $0x0d, R9, R8
- SHLQ $0x0d, R11, R10
- SHLQ $0x0d, R13, R12
- SHLQ $0x0d, R15, R14
- ANDQ AX, DI
- IMUL3Q $0x13, R14, R14
- ADDQ R14, DI
- ANDQ AX, R9
- ADDQ SI, R9
- ANDQ AX, R11
- ADDQ R8, R11
- ANDQ AX, R13
- ADDQ R10, R13
- ANDQ AX, R15
- ADDQ R12, R15
-
- // Second reduction chain (carryPropagate)
- MOVQ DI, SI
- SHRQ $0x33, SI
- MOVQ R9, R8
- SHRQ $0x33, R8
- MOVQ R11, R10
- SHRQ $0x33, R10
- MOVQ R13, R12
- SHRQ $0x33, R12
- MOVQ R15, R14
- SHRQ $0x33, R14
- ANDQ AX, DI
- IMUL3Q $0x13, R14, R14
- ADDQ R14, DI
- ANDQ AX, R9
- ADDQ SI, R9
- ANDQ AX, R11
- ADDQ R8, R11
- ANDQ AX, R13
- ADDQ R10, R13
- ANDQ AX, R15
- ADDQ R12, R15
-
- // Store output
- MOVQ out+0(FP), AX
- MOVQ DI, (AX)
- MOVQ R9, 8(AX)
- MOVQ R11, 16(AX)
- MOVQ R13, 24(AX)
- MOVQ R15, 32(AX)
- RET
-
-// func feSquare(out *Element, a *Element)
-TEXT ·feSquare(SB), NOSPLIT, $0-16
- MOVQ a+8(FP), CX
-
- // r0 = l0×l0
- MOVQ (CX), AX
- MULQ (CX)
- MOVQ AX, SI
- MOVQ DX, BX
-
- // r0 += 38×l1×l4
- MOVQ 8(CX), AX
- IMUL3Q $0x26, AX, AX
- MULQ 32(CX)
- ADDQ AX, SI
- ADCQ DX, BX
-
- // r0 += 38×l2×l3
- MOVQ 16(CX), AX
- IMUL3Q $0x26, AX, AX
- MULQ 24(CX)
- ADDQ AX, SI
- ADCQ DX, BX
-
- // r1 = 2×l0×l1
- MOVQ (CX), AX
- SHLQ $0x01, AX
- MULQ 8(CX)
- MOVQ AX, R8
- MOVQ DX, DI
-
- // r1 += 38×l2×l4
- MOVQ 16(CX), AX
- IMUL3Q $0x26, AX, AX
- MULQ 32(CX)
- ADDQ AX, R8
- ADCQ DX, DI
-
- // r1 += 19×l3×l3
- MOVQ 24(CX), AX
- IMUL3Q $0x13, AX, AX
- MULQ 24(CX)
- ADDQ AX, R8
- ADCQ DX, DI
-
- // r2 = 2×l0×l2
- MOVQ (CX), AX
- SHLQ $0x01, AX
- MULQ 16(CX)
- MOVQ AX, R10
- MOVQ DX, R9
-
- // r2 += l1×l1
- MOVQ 8(CX), AX
- MULQ 8(CX)
- ADDQ AX, R10
- ADCQ DX, R9
-
- // r2 += 38×l3×l4
- MOVQ 24(CX), AX
- IMUL3Q $0x26, AX, AX
- MULQ 32(CX)
- ADDQ AX, R10
- ADCQ DX, R9
-
- // r3 = 2×l0×l3
- MOVQ (CX), AX
- SHLQ $0x01, AX
- MULQ 24(CX)
- MOVQ AX, R12
- MOVQ DX, R11
-
- // r3 += 2×l1×l2
- MOVQ 8(CX), AX
- IMUL3Q $0x02, AX, AX
- MULQ 16(CX)
- ADDQ AX, R12
- ADCQ DX, R11
-
- // r3 += 19×l4×l4
- MOVQ 32(CX), AX
- IMUL3Q $0x13, AX, AX
- MULQ 32(CX)
- ADDQ AX, R12
- ADCQ DX, R11
-
- // r4 = 2×l0×l4
- MOVQ (CX), AX
- SHLQ $0x01, AX
- MULQ 32(CX)
- MOVQ AX, R14
- MOVQ DX, R13
-
- // r4 += 2×l1×l3
- MOVQ 8(CX), AX
- IMUL3Q $0x02, AX, AX
- MULQ 24(CX)
- ADDQ AX, R14
- ADCQ DX, R13
-
- // r4 += l2×l2
- MOVQ 16(CX), AX
- MULQ 16(CX)
- ADDQ AX, R14
- ADCQ DX, R13
-
- // First reduction chain
- MOVQ $0x0007ffffffffffff, AX
- SHLQ $0x0d, SI, BX
- SHLQ $0x0d, R8, DI
- SHLQ $0x0d, R10, R9
- SHLQ $0x0d, R12, R11
- SHLQ $0x0d, R14, R13
- ANDQ AX, SI
- IMUL3Q $0x13, R13, R13
- ADDQ R13, SI
- ANDQ AX, R8
- ADDQ BX, R8
- ANDQ AX, R10
- ADDQ DI, R10
- ANDQ AX, R12
- ADDQ R9, R12
- ANDQ AX, R14
- ADDQ R11, R14
-
- // Second reduction chain (carryPropagate)
- MOVQ SI, BX
- SHRQ $0x33, BX
- MOVQ R8, DI
- SHRQ $0x33, DI
- MOVQ R10, R9
- SHRQ $0x33, R9
- MOVQ R12, R11
- SHRQ $0x33, R11
- MOVQ R14, R13
- SHRQ $0x33, R13
- ANDQ AX, SI
- IMUL3Q $0x13, R13, R13
- ADDQ R13, SI
- ANDQ AX, R8
- ADDQ BX, R8
- ANDQ AX, R10
- ADDQ DI, R10
- ANDQ AX, R12
- ADDQ R9, R12
- ANDQ AX, R14
- ADDQ R11, R14
-
- // Store output
- MOVQ out+0(FP), AX
- MOVQ SI, (AX)
- MOVQ R8, 8(AX)
- MOVQ R10, 16(AX)
- MOVQ R12, 24(AX)
- MOVQ R14, 32(AX)
- RET
diff --git a/curve25519/internal/field/fe_amd64_noasm.go b/curve25519/internal/field/fe_amd64_noasm.go
deleted file mode 100644
index 9da280d..0000000
--- a/curve25519/internal/field/fe_amd64_noasm.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2019 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 || !gc || purego
-
-package field
-
-func feMul(v, x, y *Element) { feMulGeneric(v, x, y) }
-
-func feSquare(v, x *Element) { feSquareGeneric(v, x) }
diff --git a/curve25519/internal/field/fe_arm64.go b/curve25519/internal/field/fe_arm64.go
deleted file mode 100644
index 075fe9b..0000000
--- a/curve25519/internal/field/fe_arm64.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (c) 2020 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 arm64 && gc && !purego
-
-package field
-
-//go:noescape
-func carryPropagate(v *Element)
-
-func (v *Element) carryPropagate() *Element {
- carryPropagate(v)
- return v
-}
diff --git a/curve25519/internal/field/fe_arm64.s b/curve25519/internal/field/fe_arm64.s
deleted file mode 100644
index 3126a43..0000000
--- a/curve25519/internal/field/fe_arm64.s
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (c) 2020 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 arm64 && gc && !purego
-
-#include "textflag.h"
-
-// carryPropagate works exactly like carryPropagateGeneric and uses the
-// same AND, ADD, and LSR+MADD instructions emitted by the compiler, but
-// avoids loading R0-R4 twice and uses LDP and STP.
-//
-// See https://golang.org/issues/43145 for the main compiler issue.
-//
-// func carryPropagate(v *Element)
-TEXT ·carryPropagate(SB),NOFRAME|NOSPLIT,$0-8
- MOVD v+0(FP), R20
-
- LDP 0(R20), (R0, R1)
- LDP 16(R20), (R2, R3)
- MOVD 32(R20), R4
-
- AND $0x7ffffffffffff, R0, R10
- AND $0x7ffffffffffff, R1, R11
- AND $0x7ffffffffffff, R2, R12
- AND $0x7ffffffffffff, R3, R13
- AND $0x7ffffffffffff, R4, R14
-
- ADD R0>>51, R11, R11
- ADD R1>>51, R12, R12
- ADD R2>>51, R13, R13
- ADD R3>>51, R14, R14
- // R4>>51 * 19 + R10 -> R10
- LSR $51, R4, R21
- MOVD $19, R22
- MADD R22, R10, R21, R10
-
- STP (R10, R11), 0(R20)
- STP (R12, R13), 16(R20)
- MOVD R14, 32(R20)
-
- RET
diff --git a/curve25519/internal/field/fe_arm64_noasm.go b/curve25519/internal/field/fe_arm64_noasm.go
deleted file mode 100644
index fc029ac..0000000
--- a/curve25519/internal/field/fe_arm64_noasm.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2021 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 !arm64 || !gc || purego
-
-package field
-
-func (v *Element) carryPropagate() *Element {
- return v.carryPropagateGeneric()
-}
diff --git a/curve25519/internal/field/fe_bench_test.go b/curve25519/internal/field/fe_bench_test.go
deleted file mode 100644
index 77dc06c..0000000
--- a/curve25519/internal/field/fe_bench_test.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) 2019 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 field
-
-import "testing"
-
-func BenchmarkAdd(b *testing.B) {
- var x, y Element
- x.One()
- y.Add(feOne, feOne)
- b.ResetTimer()
- for i := 0; i < b.N; i++ {
- x.Add(&x, &y)
- }
-}
-
-func BenchmarkMultiply(b *testing.B) {
- var x, y Element
- x.One()
- y.Add(feOne, feOne)
- b.ResetTimer()
- for i := 0; i < b.N; i++ {
- x.Multiply(&x, &y)
- }
-}
-
-func BenchmarkMult32(b *testing.B) {
- var x Element
- x.One()
- b.ResetTimer()
- for i := 0; i < b.N; i++ {
- x.Mult32(&x, 0xaa42aa42)
- }
-}
diff --git a/curve25519/internal/field/fe_generic.go b/curve25519/internal/field/fe_generic.go
deleted file mode 100644
index 2671217..0000000
--- a/curve25519/internal/field/fe_generic.go
+++ /dev/null
@@ -1,264 +0,0 @@
-// Copyright (c) 2017 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 field
-
-import "math/bits"
-
-// uint128 holds a 128-bit number as two 64-bit limbs, for use with the
-// bits.Mul64 and bits.Add64 intrinsics.
-type uint128 struct {
- lo, hi uint64
-}
-
-// mul64 returns a * b.
-func mul64(a, b uint64) uint128 {
- hi, lo := bits.Mul64(a, b)
- return uint128{lo, hi}
-}
-
-// addMul64 returns v + a * b.
-func addMul64(v uint128, a, b uint64) uint128 {
- hi, lo := bits.Mul64(a, b)
- lo, c := bits.Add64(lo, v.lo, 0)
- hi, _ = bits.Add64(hi, v.hi, c)
- return uint128{lo, hi}
-}
-
-// shiftRightBy51 returns a >> 51. a is assumed to be at most 115 bits.
-func shiftRightBy51(a uint128) uint64 {
- return (a.hi << (64 - 51)) | (a.lo >> 51)
-}
-
-func feMulGeneric(v, a, b *Element) {
- a0 := a.l0
- a1 := a.l1
- a2 := a.l2
- a3 := a.l3
- a4 := a.l4
-
- b0 := b.l0
- b1 := b.l1
- b2 := b.l2
- b3 := b.l3
- b4 := b.l4
-
- // Limb multiplication works like pen-and-paper columnar multiplication, but
- // with 51-bit limbs instead of digits.
- //
- // a4 a3 a2 a1 a0 x
- // b4 b3 b2 b1 b0 =
- // ------------------------
- // a4b0 a3b0 a2b0 a1b0 a0b0 +
- // a4b1 a3b1 a2b1 a1b1 a0b1 +
- // a4b2 a3b2 a2b2 a1b2 a0b2 +
- // a4b3 a3b3 a2b3 a1b3 a0b3 +
- // a4b4 a3b4 a2b4 a1b4 a0b4 =
- // ----------------------------------------------
- // r8 r7 r6 r5 r4 r3 r2 r1 r0
- //
- // We can then use the reduction identity (a * 2²⁵⁵ + b = a * 19 + b) to
- // reduce the limbs that would overflow 255 bits. r5 * 2²⁵⁵ becomes 19 * r5,
- // r6 * 2³⁰⁶ becomes 19 * r6 * 2⁵¹, etc.
- //
- // Reduction can be carried out simultaneously to multiplication. For
- // example, we do not compute r5: whenever the result of a multiplication
- // belongs to r5, like a1b4, we multiply it by 19 and add the result to r0.
- //
- // a4b0 a3b0 a2b0 a1b0 a0b0 +
- // a3b1 a2b1 a1b1 a0b1 19×a4b1 +
- // a2b2 a1b2 a0b2 19×a4b2 19×a3b2 +
- // a1b3 a0b3 19×a4b3 19×a3b3 19×a2b3 +
- // a0b4 19×a4b4 19×a3b4 19×a2b4 19×a1b4 =
- // --------------------------------------
- // r4 r3 r2 r1 r0
- //
- // Finally we add up the columns into wide, overlapping limbs.
-
- a1_19 := a1 * 19
- a2_19 := a2 * 19
- a3_19 := a3 * 19
- a4_19 := a4 * 19
-
- // r0 = a0×b0 + 19×(a1×b4 + a2×b3 + a3×b2 + a4×b1)
- r0 := mul64(a0, b0)
- r0 = addMul64(r0, a1_19, b4)
- r0 = addMul64(r0, a2_19, b3)
- r0 = addMul64(r0, a3_19, b2)
- r0 = addMul64(r0, a4_19, b1)
-
- // r1 = a0×b1 + a1×b0 + 19×(a2×b4 + a3×b3 + a4×b2)
- r1 := mul64(a0, b1)
- r1 = addMul64(r1, a1, b0)
- r1 = addMul64(r1, a2_19, b4)
- r1 = addMul64(r1, a3_19, b3)
- r1 = addMul64(r1, a4_19, b2)
-
- // r2 = a0×b2 + a1×b1 + a2×b0 + 19×(a3×b4 + a4×b3)
- r2 := mul64(a0, b2)
- r2 = addMul64(r2, a1, b1)
- r2 = addMul64(r2, a2, b0)
- r2 = addMul64(r2, a3_19, b4)
- r2 = addMul64(r2, a4_19, b3)
-
- // r3 = a0×b3 + a1×b2 + a2×b1 + a3×b0 + 19×a4×b4
- r3 := mul64(a0, b3)
- r3 = addMul64(r3, a1, b2)
- r3 = addMul64(r3, a2, b1)
- r3 = addMul64(r3, a3, b0)
- r3 = addMul64(r3, a4_19, b4)
-
- // r4 = a0×b4 + a1×b3 + a2×b2 + a3×b1 + a4×b0
- r4 := mul64(a0, b4)
- r4 = addMul64(r4, a1, b3)
- r4 = addMul64(r4, a2, b2)
- r4 = addMul64(r4, a3, b1)
- r4 = addMul64(r4, a4, b0)
-
- // After the multiplication, we need to reduce (carry) the five coefficients
- // to obtain a result with limbs that are at most slightly larger than 2⁵¹,
- // to respect the Element invariant.
- //
- // Overall, the reduction works the same as carryPropagate, except with
- // wider inputs: we take the carry for each coefficient by shifting it right
- // by 51, and add it to the limb above it. The top carry is multiplied by 19
- // according to the reduction identity and added to the lowest limb.
- //
- // The largest coefficient (r0) will be at most 111 bits, which guarantees
- // that all carries are at most 111 - 51 = 60 bits, which fits in a uint64.
- //
- // r0 = a0×b0 + 19×(a1×b4 + a2×b3 + a3×b2 + a4×b1)
- // r0 < 2⁵²×2⁵² + 19×(2⁵²×2⁵² + 2⁵²×2⁵² + 2⁵²×2⁵² + 2⁵²×2⁵²)
- // r0 < (1 + 19 × 4) × 2⁵² × 2⁵²
- // r0 < 2⁷ × 2⁵² × 2⁵²
- // r0 < 2¹¹¹
- //
- // Moreover, the top coefficient (r4) is at most 107 bits, so c4 is at most
- // 56 bits, and c4 * 19 is at most 61 bits, which again fits in a uint64 and
- // allows us to easily apply the reduction identity.
- //
- // r4 = a0×b4 + a1×b3 + a2×b2 + a3×b1 + a4×b0
- // r4 < 5 × 2⁵² × 2⁵²
- // r4 < 2¹⁰⁷
- //
-
- c0 := shiftRightBy51(r0)
- c1 := shiftRightBy51(r1)
- c2 := shiftRightBy51(r2)
- c3 := shiftRightBy51(r3)
- c4 := shiftRightBy51(r4)
-
- rr0 := r0.lo&maskLow51Bits + c4*19
- rr1 := r1.lo&maskLow51Bits + c0
- rr2 := r2.lo&maskLow51Bits + c1
- rr3 := r3.lo&maskLow51Bits + c2
- rr4 := r4.lo&maskLow51Bits + c3
-
- // Now all coefficients fit into 64-bit registers but are still too large to
- // be passed around as a Element. We therefore do one last carry chain,
- // where the carries will be small enough to fit in the wiggle room above 2⁵¹.
- *v = Element{rr0, rr1, rr2, rr3, rr4}
- v.carryPropagate()
-}
-
-func feSquareGeneric(v, a *Element) {
- l0 := a.l0
- l1 := a.l1
- l2 := a.l2
- l3 := a.l3
- l4 := a.l4
-
- // Squaring works precisely like multiplication above, but thanks to its
- // symmetry we get to group a few terms together.
- //
- // l4 l3 l2 l1 l0 x
- // l4 l3 l2 l1 l0 =
- // ------------------------
- // l4l0 l3l0 l2l0 l1l0 l0l0 +
- // l4l1 l3l1 l2l1 l1l1 l0l1 +
- // l4l2 l3l2 l2l2 l1l2 l0l2 +
- // l4l3 l3l3 l2l3 l1l3 l0l3 +
- // l4l4 l3l4 l2l4 l1l4 l0l4 =
- // ----------------------------------------------
- // r8 r7 r6 r5 r4 r3 r2 r1 r0
- //
- // l4l0 l3l0 l2l0 l1l0 l0l0 +
- // l3l1 l2l1 l1l1 l0l1 19×l4l1 +
- // l2l2 l1l2 l0l2 19×l4l2 19×l3l2 +
- // l1l3 l0l3 19×l4l3 19×l3l3 19×l2l3 +
- // l0l4 19×l4l4 19×l3l4 19×l2l4 19×l1l4 =
- // --------------------------------------
- // r4 r3 r2 r1 r0
- //
- // With precomputed 2×, 19×, and 2×19× terms, we can compute each limb with
- // only three Mul64 and four Add64, instead of five and eight.
-
- l0_2 := l0 * 2
- l1_2 := l1 * 2
-
- l1_38 := l1 * 38
- l2_38 := l2 * 38
- l3_38 := l3 * 38
-
- l3_19 := l3 * 19
- l4_19 := l4 * 19
-
- // r0 = l0×l0 + 19×(l1×l4 + l2×l3 + l3×l2 + l4×l1) = l0×l0 + 19×2×(l1×l4 + l2×l3)
- r0 := mul64(l0, l0)
- r0 = addMul64(r0, l1_38, l4)
- r0 = addMul64(r0, l2_38, l3)
-
- // r1 = l0×l1 + l1×l0 + 19×(l2×l4 + l3×l3 + l4×l2) = 2×l0×l1 + 19×2×l2×l4 + 19×l3×l3
- r1 := mul64(l0_2, l1)
- r1 = addMul64(r1, l2_38, l4)
- r1 = addMul64(r1, l3_19, l3)
-
- // r2 = l0×l2 + l1×l1 + l2×l0 + 19×(l3×l4 + l4×l3) = 2×l0×l2 + l1×l1 + 19×2×l3×l4
- r2 := mul64(l0_2, l2)
- r2 = addMul64(r2, l1, l1)
- r2 = addMul64(r2, l3_38, l4)
-
- // r3 = l0×l3 + l1×l2 + l2×l1 + l3×l0 + 19×l4×l4 = 2×l0×l3 + 2×l1×l2 + 19×l4×l4
- r3 := mul64(l0_2, l3)
- r3 = addMul64(r3, l1_2, l2)
- r3 = addMul64(r3, l4_19, l4)
-
- // r4 = l0×l4 + l1×l3 + l2×l2 + l3×l1 + l4×l0 = 2×l0×l4 + 2×l1×l3 + l2×l2
- r4 := mul64(l0_2, l4)
- r4 = addMul64(r4, l1_2, l3)
- r4 = addMul64(r4, l2, l2)
-
- c0 := shiftRightBy51(r0)
- c1 := shiftRightBy51(r1)
- c2 := shiftRightBy51(r2)
- c3 := shiftRightBy51(r3)
- c4 := shiftRightBy51(r4)
-
- rr0 := r0.lo&maskLow51Bits + c4*19
- rr1 := r1.lo&maskLow51Bits + c0
- rr2 := r2.lo&maskLow51Bits + c1
- rr3 := r3.lo&maskLow51Bits + c2
- rr4 := r4.lo&maskLow51Bits + c3
-
- *v = Element{rr0, rr1, rr2, rr3, rr4}
- v.carryPropagate()
-}
-
-// carryPropagateGeneric brings the limbs below 52 bits by applying the reduction
-// identity (a * 2²⁵⁵ + b = a * 19 + b) to the l4 carry. TODO inline
-func (v *Element) carryPropagateGeneric() *Element {
- c0 := v.l0 >> 51
- c1 := v.l1 >> 51
- c2 := v.l2 >> 51
- c3 := v.l3 >> 51
- c4 := v.l4 >> 51
-
- v.l0 = v.l0&maskLow51Bits + c4*19
- v.l1 = v.l1&maskLow51Bits + c0
- v.l2 = v.l2&maskLow51Bits + c1
- v.l3 = v.l3&maskLow51Bits + c2
- v.l4 = v.l4&maskLow51Bits + c3
-
- return v
-}
diff --git a/curve25519/internal/field/fe_test.go b/curve25519/internal/field/fe_test.go
deleted file mode 100644
index b484459..0000000
--- a/curve25519/internal/field/fe_test.go
+++ /dev/null
@@ -1,558 +0,0 @@
-// Copyright (c) 2017 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 field
-
-import (
- "bytes"
- "crypto/rand"
- "encoding/hex"
- "io"
- "math/big"
- "math/bits"
- mathrand "math/rand"
- "reflect"
- "testing"
- "testing/quick"
-)
-
-func (v Element) String() string {
- return hex.EncodeToString(v.Bytes())
-}
-
-// quickCheckConfig1024 will make each quickcheck test run (1024 * -quickchecks)
-// times. The default value of -quickchecks is 100.
-var quickCheckConfig1024 = &quick.Config{MaxCountScale: 1 << 10}
-
-func generateFieldElement(rand *mathrand.Rand) Element {
- const maskLow52Bits = (1 << 52) - 1
- return Element{
- rand.Uint64() & maskLow52Bits,
- rand.Uint64() & maskLow52Bits,
- rand.Uint64() & maskLow52Bits,
- rand.Uint64() & maskLow52Bits,
- rand.Uint64() & maskLow52Bits,
- }
-}
-
-// weirdLimbs can be combined to generate a range of edge-case field elements.
-// 0 and -1 are intentionally more weighted, as they combine well.
-var (
- weirdLimbs51 = []uint64{
- 0, 0, 0, 0,
- 1,
- 19 - 1,
- 19,
- 0x2aaaaaaaaaaaa,
- 0x5555555555555,
- (1 << 51) - 20,
- (1 << 51) - 19,
- (1 << 51) - 1, (1 << 51) - 1,
- (1 << 51) - 1, (1 << 51) - 1,
- }
- weirdLimbs52 = []uint64{
- 0, 0, 0, 0, 0, 0,
- 1,
- 19 - 1,
- 19,
- 0x2aaaaaaaaaaaa,
- 0x5555555555555,
- (1 << 51) - 20,
- (1 << 51) - 19,
- (1 << 51) - 1, (1 << 51) - 1,
- (1 << 51) - 1, (1 << 51) - 1,
- (1 << 51) - 1, (1 << 51) - 1,
- 1 << 51,
- (1 << 51) + 1,
- (1 << 52) - 19,
- (1 << 52) - 1,
- }
-)
-
-func generateWeirdFieldElement(rand *mathrand.Rand) Element {
- return Element{
- weirdLimbs52[rand.Intn(len(weirdLimbs52))],
- weirdLimbs51[rand.Intn(len(weirdLimbs51))],
- weirdLimbs51[rand.Intn(len(weirdLimbs51))],
- weirdLimbs51[rand.Intn(len(weirdLimbs51))],
- weirdLimbs51[rand.Intn(len(weirdLimbs51))],
- }
-}
-
-func (Element) Generate(rand *mathrand.Rand, size int) reflect.Value {
- if rand.Intn(2) == 0 {
- return reflect.ValueOf(generateWeirdFieldElement(rand))
- }
- return reflect.ValueOf(generateFieldElement(rand))
-}
-
-// isInBounds returns whether the element is within the expected bit size bounds
-// after a light reduction.
-func isInBounds(x *Element) bool {
- return bits.Len64(x.l0) <= 52 &&
- bits.Len64(x.l1) <= 52 &&
- bits.Len64(x.l2) <= 52 &&
- bits.Len64(x.l3) <= 52 &&
- bits.Len64(x.l4) <= 52
-}
-
-func TestMultiplyDistributesOverAdd(t *testing.T) {
- multiplyDistributesOverAdd := func(x, y, z Element) bool {
- // Compute t1 = (x+y)*z
- t1 := new(Element)
- t1.Add(&x, &y)
- t1.Multiply(t1, &z)
-
- // Compute t2 = x*z + y*z
- t2 := new(Element)
- t3 := new(Element)
- t2.Multiply(&x, &z)
- t3.Multiply(&y, &z)
- t2.Add(t2, t3)
-
- return t1.Equal(t2) == 1 && isInBounds(t1) && isInBounds(t2)
- }
-
- if err := quick.Check(multiplyDistributesOverAdd, quickCheckConfig1024); err != nil {
- t.Error(err)
- }
-}
-
-func TestMul64to128(t *testing.T) {
- a := uint64(5)
- b := uint64(5)
- r := mul64(a, b)
- if r.lo != 0x19 || r.hi != 0 {
- t.Errorf("lo-range wide mult failed, got %d + %d*(2**64)", r.lo, r.hi)
- }
-
- a = uint64(18014398509481983) // 2^54 - 1
- b = uint64(18014398509481983) // 2^54 - 1
- r = mul64(a, b)
- if r.lo != 0xff80000000000001 || r.hi != 0xfffffffffff {
- t.Errorf("hi-range wide mult failed, got %d + %d*(2**64)", r.lo, r.hi)
- }
-
- a = uint64(1125899906842661)
- b = uint64(2097155)
- r = mul64(a, b)
- r = addMul64(r, a, b)
- r = addMul64(r, a, b)
- r = addMul64(r, a, b)
- r = addMul64(r, a, b)
- if r.lo != 16888498990613035 || r.hi != 640 {
- t.Errorf("wrong answer: %d + %d*(2**64)", r.lo, r.hi)
- }
-}
-
-func TestSetBytesRoundTrip(t *testing.T) {
- f1 := func(in [32]byte, fe Element) bool {
- fe.SetBytes(in[:])
-
- // Mask the most significant bit as it's ignored by SetBytes. (Now
- // instead of earlier so we check the masking in SetBytes is working.)
- in[len(in)-1] &= (1 << 7) - 1
-
- return bytes.Equal(in[:], fe.Bytes()) && isInBounds(&fe)
- }
- if err := quick.Check(f1, nil); err != nil {
- t.Errorf("failed bytes->FE->bytes round-trip: %v", err)
- }
-
- f2 := func(fe, r Element) bool {
- r.SetBytes(fe.Bytes())
-
- // Intentionally not using Equal not to go through Bytes again.
- // Calling reduce because both Generate and SetBytes can produce
- // non-canonical representations.
- fe.reduce()
- r.reduce()
- return fe == r
- }
- if err := quick.Check(f2, nil); err != nil {
- t.Errorf("failed FE->bytes->FE round-trip: %v", err)
- }
-
- // Check some fixed vectors from dalek
- type feRTTest struct {
- fe Element
- b []byte
- }
- var tests = []feRTTest{
- {
- fe: Element{358744748052810, 1691584618240980, 977650209285361, 1429865912637724, 560044844278676},
- b: []byte{74, 209, 69, 197, 70, 70, 161, 222, 56, 226, 229, 19, 112, 60, 25, 92, 187, 74, 222, 56, 50, 153, 51, 233, 40, 74, 57, 6, 160, 185, 213, 31},
- },
- {
- fe: Element{84926274344903, 473620666599931, 365590438845504, 1028470286882429, 2146499180330972},
- b: []byte{199, 23, 106, 112, 61, 77, 216, 79, 186, 60, 11, 118, 13, 16, 103, 15, 42, 32, 83, 250, 44, 57, 204, 198, 78, 199, 253, 119, 146, 172, 3, 122},
- },
- }
-
- for _, tt := range tests {
- b := tt.fe.Bytes()
- if !bytes.Equal(b, tt.b) || new(Element).SetBytes(tt.b).Equal(&tt.fe) != 1 {
- t.Errorf("Failed fixed roundtrip: %v", tt)
- }
- }
-}
-
-func swapEndianness(buf []byte) []byte {
- for i := 0; i < len(buf)/2; i++ {
- buf[i], buf[len(buf)-i-1] = buf[len(buf)-i-1], buf[i]
- }
- return buf
-}
-
-func TestBytesBigEquivalence(t *testing.T) {
- f1 := func(in [32]byte, fe, fe1 Element) bool {
- fe.SetBytes(in[:])
-
- in[len(in)-1] &= (1 << 7) - 1 // mask the most significant bit
- b := new(big.Int).SetBytes(swapEndianness(in[:]))
- fe1.fromBig(b)
-
- if fe != fe1 {
- return false
- }
-
- buf := make([]byte, 32) // pad with zeroes
- copy(buf, swapEndianness(fe1.toBig().Bytes()))
-
- return bytes.Equal(fe.Bytes(), buf) && isInBounds(&fe) && isInBounds(&fe1)
- }
- if err := quick.Check(f1, nil); err != nil {
- t.Error(err)
- }
-}
-
-// fromBig sets v = n, and returns v. The bit length of n must not exceed 256.
-func (v *Element) fromBig(n *big.Int) *Element {
- if n.BitLen() > 32*8 {
- panic("edwards25519: invalid field element input size")
- }
-
- buf := make([]byte, 0, 32)
- for _, word := range n.Bits() {
- for i := 0; i < bits.UintSize; i += 8 {
- if len(buf) >= cap(buf) {
- break
- }
- buf = append(buf, byte(word))
- word >>= 8
- }
- }
-
- return v.SetBytes(buf[:32])
-}
-
-func (v *Element) fromDecimal(s string) *Element {
- n, ok := new(big.Int).SetString(s, 10)
- if !ok {
- panic("not a valid decimal: " + s)
- }
- return v.fromBig(n)
-}
-
-// toBig returns v as a big.Int.
-func (v *Element) toBig() *big.Int {
- buf := v.Bytes()
-
- words := make([]big.Word, 32*8/bits.UintSize)
- for n := range words {
- for i := 0; i < bits.UintSize; i += 8 {
- if len(buf) == 0 {
- break
- }
- words[n] |= big.Word(buf[0]) << big.Word(i)
- buf = buf[1:]
- }
- }
-
- return new(big.Int).SetBits(words)
-}
-
-func TestDecimalConstants(t *testing.T) {
- sqrtM1String := "19681161376707505956807079304988542015446066515923890162744021073123829784752"
- if exp := new(Element).fromDecimal(sqrtM1String); sqrtM1.Equal(exp) != 1 {
- t.Errorf("sqrtM1 is %v, expected %v", sqrtM1, exp)
- }
- // d is in the parent package, and we don't want to expose d or fromDecimal.
- // dString := "37095705934669439343138083508754565189542113879843219016388785533085940283555"
- // if exp := new(Element).fromDecimal(dString); d.Equal(exp) != 1 {
- // t.Errorf("d is %v, expected %v", d, exp)
- // }
-}
-
-func TestSetBytesRoundTripEdgeCases(t *testing.T) {
- // TODO: values close to 0, close to 2^255-19, between 2^255-19 and 2^255-1,
- // and between 2^255 and 2^256-1. Test both the documented SetBytes
- // behavior, and that Bytes reduces them.
-}
-
-// Tests self-consistency between Multiply and Square.
-func TestConsistency(t *testing.T) {
- var x Element
- var x2, x2sq Element
-
- x = Element{1, 1, 1, 1, 1}
- x2.Multiply(&x, &x)
- x2sq.Square(&x)
-
- if x2 != x2sq {
- t.Fatalf("all ones failed\nmul: %x\nsqr: %x\n", x2, x2sq)
- }
-
- var bytes [32]byte
-
- _, err := io.ReadFull(rand.Reader, bytes[:])
- if err != nil {
- t.Fatal(err)
- }
- x.SetBytes(bytes[:])
-
- x2.Multiply(&x, &x)
- x2sq.Square(&x)
-
- if x2 != x2sq {
- t.Fatalf("all ones failed\nmul: %x\nsqr: %x\n", x2, x2sq)
- }
-}
-
-func TestEqual(t *testing.T) {
- x := Element{1, 1, 1, 1, 1}
- y := Element{5, 4, 3, 2, 1}
-
- eq := x.Equal(&x)
- if eq != 1 {
- t.Errorf("wrong about equality")
- }
-
- eq = x.Equal(&y)
- if eq != 0 {
- t.Errorf("wrong about inequality")
- }
-}
-
-func TestInvert(t *testing.T) {
- x := Element{1, 1, 1, 1, 1}
- one := Element{1, 0, 0, 0, 0}
- var xinv, r Element
-
- xinv.Invert(&x)
- r.Multiply(&x, &xinv)
- r.reduce()
-
- if one != r {
- t.Errorf("inversion identity failed, got: %x", r)
- }
-
- var bytes [32]byte
-
- _, err := io.ReadFull(rand.Reader, bytes[:])
- if err != nil {
- t.Fatal(err)
- }
- x.SetBytes(bytes[:])
-
- xinv.Invert(&x)
- r.Multiply(&x, &xinv)
- r.reduce()
-
- if one != r {
- t.Errorf("random inversion identity failed, got: %x for field element %x", r, x)
- }
-
- zero := Element{}
- x.Set(&zero)
- if xx := xinv.Invert(&x); xx != &xinv {
- t.Errorf("inverting zero did not return the receiver")
- } else if xinv.Equal(&zero) != 1 {
- t.Errorf("inverting zero did not return zero")
- }
-}
-
-func TestSelectSwap(t *testing.T) {
- a := Element{358744748052810, 1691584618240980, 977650209285361, 1429865912637724, 560044844278676}
- b := Element{84926274344903, 473620666599931, 365590438845504, 1028470286882429, 2146499180330972}
-
- var c, d Element
-
- c.Select(&a, &b, 1)
- d.Select(&a, &b, 0)
-
- if c.Equal(&a) != 1 || d.Equal(&b) != 1 {
- t.Errorf("Select failed")
- }
-
- c.Swap(&d, 0)
-
- if c.Equal(&a) != 1 || d.Equal(&b) != 1 {
- t.Errorf("Swap failed")
- }
-
- c.Swap(&d, 1)
-
- if c.Equal(&b) != 1 || d.Equal(&a) != 1 {
- t.Errorf("Swap failed")
- }
-}
-
-func TestMult32(t *testing.T) {
- mult32EquivalentToMul := func(x Element, y uint32) bool {
- t1 := new(Element)
- for i := 0; i < 100; i++ {
- t1.Mult32(&x, y)
- }
-
- ty := new(Element)
- ty.l0 = uint64(y)
-
- t2 := new(Element)
- for i := 0; i < 100; i++ {
- t2.Multiply(&x, ty)
- }
-
- return t1.Equal(t2) == 1 && isInBounds(t1) && isInBounds(t2)
- }
-
- if err := quick.Check(mult32EquivalentToMul, quickCheckConfig1024); err != nil {
- t.Error(err)
- }
-}
-
-func TestSqrtRatio(t *testing.T) {
- // From draft-irtf-cfrg-ristretto255-decaf448-00, Appendix A.4.
- type test struct {
- u, v string
- wasSquare int
- r string
- }
- var tests = []test{
- // If u is 0, the function is defined to return (0, TRUE), even if v
- // is zero. Note that where used in this package, the denominator v
- // is never zero.
- {
- "0000000000000000000000000000000000000000000000000000000000000000",
- "0000000000000000000000000000000000000000000000000000000000000000",
- 1, "0000000000000000000000000000000000000000000000000000000000000000",
- },
- // 0/1 == 0²
- {
- "0000000000000000000000000000000000000000000000000000000000000000",
- "0100000000000000000000000000000000000000000000000000000000000000",
- 1, "0000000000000000000000000000000000000000000000000000000000000000",
- },
- // If u is non-zero and v is zero, defined to return (0, FALSE).
- {
- "0100000000000000000000000000000000000000000000000000000000000000",
- "0000000000000000000000000000000000000000000000000000000000000000",
- 0, "0000000000000000000000000000000000000000000000000000000000000000",
- },
- // 2/1 is not square in this field.
- {
- "0200000000000000000000000000000000000000000000000000000000000000",
- "0100000000000000000000000000000000000000000000000000000000000000",
- 0, "3c5ff1b5d8e4113b871bd052f9e7bcd0582804c266ffb2d4f4203eb07fdb7c54",
- },
- // 4/1 == 2²
- {
- "0400000000000000000000000000000000000000000000000000000000000000",
- "0100000000000000000000000000000000000000000000000000000000000000",
- 1, "0200000000000000000000000000000000000000000000000000000000000000",
- },
- // 1/4 == (2⁻¹)² == (2^(p-2))² per Euler's theorem
- {
- "0100000000000000000000000000000000000000000000000000000000000000",
- "0400000000000000000000000000000000000000000000000000000000000000",
- 1, "f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f",
- },
- }
-
- for i, tt := range tests {
- u := new(Element).SetBytes(decodeHex(tt.u))
- v := new(Element).SetBytes(decodeHex(tt.v))
- want := new(Element).SetBytes(decodeHex(tt.r))
- got, wasSquare := new(Element).SqrtRatio(u, v)
- if got.Equal(want) == 0 || wasSquare != tt.wasSquare {
- t.Errorf("%d: got (%v, %v), want (%v, %v)", i, got, wasSquare, want, tt.wasSquare)
- }
- }
-}
-
-func TestCarryPropagate(t *testing.T) {
- asmLikeGeneric := func(a [5]uint64) bool {
- t1 := &Element{a[0], a[1], a[2], a[3], a[4]}
- t2 := &Element{a[0], a[1], a[2], a[3], a[4]}
-
- t1.carryPropagate()
- t2.carryPropagateGeneric()
-
- if *t1 != *t2 {
- t.Logf("got: %#v,\nexpected: %#v", t1, t2)
- }
-
- return *t1 == *t2 && isInBounds(t2)
- }
-
- if err := quick.Check(asmLikeGeneric, quickCheckConfig1024); err != nil {
- t.Error(err)
- }
-
- if !asmLikeGeneric([5]uint64{0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff}) {
- t.Errorf("failed for {0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff}")
- }
-}
-
-func TestFeSquare(t *testing.T) {
- asmLikeGeneric := func(a Element) bool {
- t1 := a
- t2 := a
-
- feSquareGeneric(&t1, &t1)
- feSquare(&t2, &t2)
-
- if t1 != t2 {
- t.Logf("got: %#v,\nexpected: %#v", t1, t2)
- }
-
- return t1 == t2 && isInBounds(&t2)
- }
-
- if err := quick.Check(asmLikeGeneric, quickCheckConfig1024); err != nil {
- t.Error(err)
- }
-}
-
-func TestFeMul(t *testing.T) {
- asmLikeGeneric := func(a, b Element) bool {
- a1 := a
- a2 := a
- b1 := b
- b2 := b
-
- feMulGeneric(&a1, &a1, &b1)
- feMul(&a2, &a2, &b2)
-
- if a1 != a2 || b1 != b2 {
- t.Logf("got: %#v,\nexpected: %#v", a1, a2)
- t.Logf("got: %#v,\nexpected: %#v", b1, b2)
- }
-
- return a1 == a2 && isInBounds(&a2) &&
- b1 == b2 && isInBounds(&b2)
- }
-
- if err := quick.Check(asmLikeGeneric, quickCheckConfig1024); err != nil {
- t.Error(err)
- }
-}
-
-func decodeHex(s string) []byte {
- b, err := hex.DecodeString(s)
- if err != nil {
- panic(err)
- }
- return b
-}
diff --git a/curve25519/internal/field/sync.checkpoint b/curve25519/internal/field/sync.checkpoint
deleted file mode 100644
index e3685f9..0000000
--- a/curve25519/internal/field/sync.checkpoint
+++ /dev/null
@@ -1 +0,0 @@
-b0c49ae9f59d233526f8934262c5bbbe14d4358d
diff --git a/curve25519/internal/field/sync.sh b/curve25519/internal/field/sync.sh
deleted file mode 100755
index 1ba22a8..0000000
--- a/curve25519/internal/field/sync.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#! /bin/bash
-set -euo pipefail
-
-cd "$(git rev-parse --show-toplevel)"
-
-STD_PATH=src/crypto/ed25519/internal/edwards25519/field
-LOCAL_PATH=curve25519/internal/field
-LAST_SYNC_REF=$(cat $LOCAL_PATH/sync.checkpoint)
-
-git fetch https://go.googlesource.com/go master
-
-if git diff --quiet $LAST_SYNC_REF:$STD_PATH FETCH_HEAD:$STD_PATH; then
- echo "No changes."
-else
- NEW_REF=$(git rev-parse FETCH_HEAD | tee $LOCAL_PATH/sync.checkpoint)
- echo "Applying changes from $LAST_SYNC_REF to $NEW_REF..."
- git diff $LAST_SYNC_REF:$STD_PATH FETCH_HEAD:$STD_PATH | \
- git apply -3 --directory=$LOCAL_PATH
-fi
diff --git a/ed25519/ed25519.go b/ed25519/ed25519.go
index a782834..59b3a95 100644
--- a/ed25519/ed25519.go
+++ b/ed25519/ed25519.go
@@ -11,9 +11,7 @@
// operations with the same key more efficient. This package refers to the RFC
// 8032 private key as the “seed”.
//
-// Beginning with Go 1.13, the functionality of this package was moved to the
-// standard library as crypto/ed25519. This package only acts as a compatibility
-// wrapper.
+// This package is a wrapper around the standard library crypto/ed25519 package.
package ed25519
import (
diff --git a/go.mod b/go.mod
index cc1cf7e..bef246f 100644
--- a/go.mod
+++ b/go.mod
@@ -1,6 +1,6 @@
module golang.org/x/crypto
-go 1.18
+go 1.20
require (
golang.org/x/net v0.21.0 // tagx:ignore
diff --git a/hkdf/hkdf.go b/hkdf/hkdf.go
index f4ded5f..3bee662 100644
--- a/hkdf/hkdf.go
+++ b/hkdf/hkdf.go
@@ -8,7 +8,7 @@
// HKDF is a cryptographic key derivation function (KDF) with the goal of
// expanding limited input keying material into one or more cryptographically
// strong secret keys.
-package hkdf // import "golang.org/x/crypto/hkdf"
+package hkdf
import (
"crypto/hmac"
diff --git a/internal/wycheproof/ecdh_stdlib_test.go b/internal/wycheproof/ecdh_stdlib_test.go
index f7abd6b..24a83e2 100644
--- a/internal/wycheproof/ecdh_stdlib_test.go
+++ b/internal/wycheproof/ecdh_stdlib_test.go
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-//go:build go1.20
-
package wycheproof
import (
diff --git a/internal/wycheproof/eddsa_test.go b/internal/wycheproof/eddsa_test.go
index 9b97490..a74f343 100644
--- a/internal/wycheproof/eddsa_test.go
+++ b/internal/wycheproof/eddsa_test.go
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-//go:build go1.13
-
package wycheproof
import (
diff --git a/md4/md4.go b/md4/md4.go
index d1911c2..7d9281e 100644
--- a/md4/md4.go
+++ b/md4/md4.go
@@ -7,7 +7,7 @@
// Deprecated: MD4 is cryptographically broken and should only be used
// where compatibility with legacy systems, not security, is the goal. Instead,
// use a secure hash like SHA-256 (from crypto/sha256).
-package md4 // import "golang.org/x/crypto/md4"
+package md4
import (
"crypto"
diff --git a/nacl/box/box.go b/nacl/box/box.go
index 7f3b830..357bdc7 100644
--- a/nacl/box/box.go
+++ b/nacl/box/box.go
@@ -35,7 +35,7 @@ Anonymous sealing/opening is an extension of NaCl defined by and interoperable
with libsodium:
https://libsodium.gitbook.io/doc/public-key_cryptography/sealed_boxes.
*/
-package box // import "golang.org/x/crypto/nacl/box"
+package box
import (
cryptorand "crypto/rand"
diff --git a/nacl/secretbox/secretbox.go b/nacl/secretbox/secretbox.go
index f3c3242..1fe600a 100644
--- a/nacl/secretbox/secretbox.go
+++ b/nacl/secretbox/secretbox.go
@@ -32,7 +32,7 @@ chunk size.
This package is interoperable with NaCl: https://nacl.cr.yp.to/secretbox.html.
*/
-package secretbox // import "golang.org/x/crypto/nacl/secretbox"
+package secretbox
import (
"golang.org/x/crypto/internal/alias"
diff --git a/ocsp/ocsp.go b/ocsp/ocsp.go
index bf22595..e6c645e 100644
--- a/ocsp/ocsp.go
+++ b/ocsp/ocsp.go
@@ -5,7 +5,7 @@
// Package ocsp parses OCSP responses as specified in RFC 2560. OCSP responses
// are signed messages attesting to the validity of a certificate for a small
// period of time. This is used to manage revocation for X.509 certificates.
-package ocsp // import "golang.org/x/crypto/ocsp"
+package ocsp
import (
"crypto"
diff --git a/ocsp/ocsp_test.go b/ocsp/ocsp_test.go
index a23d29b..6dc273e 100644
--- a/ocsp/ocsp_test.go
+++ b/ocsp/ocsp_test.go
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-//go:build go1.7
-
package ocsp
import (
diff --git a/openpgp/armor/armor.go b/openpgp/armor/armor.go
index 8907183..e664d12 100644
--- a/openpgp/armor/armor.go
+++ b/openpgp/armor/armor.go
@@ -10,14 +10,15 @@
// for their specific task. If you are required to interoperate with OpenPGP
// systems and need a maintained package, consider a community fork.
// See https://golang.org/issue/44226.
-package armor // import "golang.org/x/crypto/openpgp/armor"
+package armor
import (
"bufio"
"bytes"
"encoding/base64"
- "golang.org/x/crypto/openpgp/errors"
"io"
+
+ "golang.org/x/crypto/openpgp/errors"
)
// A Block represents an OpenPGP armored structure.
diff --git a/openpgp/clearsign/clearsign.go b/openpgp/clearsign/clearsign.go
index 644b2e0..cea48ef 100644
--- a/openpgp/clearsign/clearsign.go
+++ b/openpgp/clearsign/clearsign.go
@@ -13,7 +13,7 @@
// for their specific task. If you are required to interoperate with OpenPGP
// systems and need a maintained package, consider a community fork.
// See https://golang.org/issue/44226.
-package clearsign // import "golang.org/x/crypto/openpgp/clearsign"
+package clearsign
import (
"bufio"
diff --git a/openpgp/elgamal/elgamal.go b/openpgp/elgamal/elgamal.go
index 743b35a..f922bdb 100644
--- a/openpgp/elgamal/elgamal.go
+++ b/openpgp/elgamal/elgamal.go
@@ -16,7 +16,7 @@
// https://golang.org/issue/44226), and ElGamal in the OpenPGP ecosystem has
// compatibility and security issues (see https://eprint.iacr.org/2021/923).
// Moreover, this package doesn't protect against side-channel attacks.
-package elgamal // import "golang.org/x/crypto/openpgp/elgamal"
+package elgamal
import (
"crypto/rand"
diff --git a/openpgp/errors/errors.go b/openpgp/errors/errors.go
index 1d7a0ea..a328749 100644
--- a/openpgp/errors/errors.go
+++ b/openpgp/errors/errors.go
@@ -9,7 +9,7 @@
// for their specific task. If you are required to interoperate with OpenPGP
// systems and need a maintained package, consider a community fork.
// See https://golang.org/issue/44226.
-package errors // import "golang.org/x/crypto/openpgp/errors"
+package errors
import (
"strconv"
diff --git a/openpgp/packet/packet.go b/openpgp/packet/packet.go
index 0a19794..a84a1a2 100644
--- a/openpgp/packet/packet.go
+++ b/openpgp/packet/packet.go
@@ -10,7 +10,7 @@
// for their specific task. If you are required to interoperate with OpenPGP
// systems and need a maintained package, consider a community fork.
// See https://golang.org/issue/44226.
-package packet // import "golang.org/x/crypto/openpgp/packet"
+package packet
import (
"bufio"
diff --git a/openpgp/read.go b/openpgp/read.go
index 48a8931..cff3db9 100644
--- a/openpgp/read.go
+++ b/openpgp/read.go
@@ -9,7 +9,7 @@
// for their specific task. If you are required to interoperate with OpenPGP
// systems and need a maintained package, consider a community fork.
// See https://golang.org/issue/44226.
-package openpgp // import "golang.org/x/crypto/openpgp"
+package openpgp
import (
"crypto"
diff --git a/openpgp/s2k/s2k.go b/openpgp/s2k/s2k.go
index f53244a..fa1a919 100644
--- a/openpgp/s2k/s2k.go
+++ b/openpgp/s2k/s2k.go
@@ -10,7 +10,7 @@
// for their specific task. If you are required to interoperate with OpenPGP
// systems and need a maintained package, consider a community fork.
// See https://golang.org/issue/44226.
-package s2k // import "golang.org/x/crypto/openpgp/s2k"
+package s2k
import (
"crypto"
diff --git a/otr/otr.go b/otr/otr.go
index 29121e9..6210c1a 100644
--- a/otr/otr.go
+++ b/otr/otr.go
@@ -8,7 +8,7 @@
// The version of OTR implemented by this package has been deprecated
// (https://bugs.otr.im/lib/libotr/issues/140). An implementation of OTRv3 is
// available at https://github.com/coyim/otr3.
-package otr // import "golang.org/x/crypto/otr"
+package otr
import (
"bytes"
diff --git a/pbkdf2/pbkdf2.go b/pbkdf2/pbkdf2.go
index 904b57e..28cd99c 100644
--- a/pbkdf2/pbkdf2.go
+++ b/pbkdf2/pbkdf2.go
@@ -16,7 +16,7 @@ Hash Functions SHA-1, SHA-224, SHA-256, SHA-384 and SHA-512 for HMAC. To
choose, you can pass the `New` functions from the different SHA packages to
pbkdf2.Key.
*/
-package pbkdf2 // import "golang.org/x/crypto/pbkdf2"
+package pbkdf2
import (
"crypto/hmac"
diff --git a/poly1305/poly1305_compat.go b/poly1305/poly1305_compat.go
index dd975a3..cb9207f 100644
--- a/poly1305/poly1305_compat.go
+++ b/poly1305/poly1305_compat.go
@@ -21,7 +21,7 @@
// For encryption, use the full ChaCha20-Poly1305 construction implemented by
// golang.org/x/crypto/chacha20poly1305. For authentication, use a general
// purpose MAC such as HMAC implemented by crypto/hmac.
-package poly1305 // import "golang.org/x/crypto/poly1305"
+package poly1305
import "golang.org/x/crypto/internal/poly1305"
diff --git a/ripemd160/ripemd160.go b/ripemd160/ripemd160.go
index cf3eeb1..b6d33ef 100644
--- a/ripemd160/ripemd160.go
+++ b/ripemd160/ripemd160.go
@@ -7,7 +7,7 @@
// Deprecated: RIPEMD-160 is a legacy hash and should not be used for new
// applications. Also, this package does not and will not provide an optimized
// implementation. Instead, use a modern hash like SHA-256 (from crypto/sha256).
-package ripemd160 // import "golang.org/x/crypto/ripemd160"
+package ripemd160
// RIPEMD-160 is designed by Hans Dobbertin, Antoon Bosselaers, and Bart
// Preneel with specifications available at:
diff --git a/salsa20/salsa/hsalsa20.go b/salsa20/salsa/hsalsa20.go
index 3fd05b2..3685b34 100644
--- a/salsa20/salsa/hsalsa20.go
+++ b/salsa20/salsa/hsalsa20.go
@@ -3,7 +3,7 @@
// license that can be found in the LICENSE file.
// Package salsa provides low-level access to functions in the Salsa family.
-package salsa // import "golang.org/x/crypto/salsa20/salsa"
+package salsa
import "math/bits"
diff --git a/salsa20/salsa20.go b/salsa20/salsa20.go
index 8f4f896..e75c934 100644
--- a/salsa20/salsa20.go
+++ b/salsa20/salsa20.go
@@ -19,7 +19,7 @@ This package also implements XSalsa20: a version of Salsa20 with a 24-byte
nonce as specified in https://cr.yp.to/snuffle/xsalsa-20081128.pdf. Simply
passing a 24-byte slice as the nonce triggers XSalsa20.
*/
-package salsa20 // import "golang.org/x/crypto/salsa20"
+package salsa20
// TODO(agl): implement XORKeyStream12 and XORKeyStream8 - the reduced round variants of Salsa20.
diff --git a/scrypt/scrypt.go b/scrypt/scrypt.go
index c971a99..76fa40f 100644
--- a/scrypt/scrypt.go
+++ b/scrypt/scrypt.go
@@ -5,7 +5,7 @@
// Package scrypt implements the scrypt key derivation function as defined in
// Colin Percival's paper "Stronger Key Derivation via Sequential Memory-Hard
// Functions" (https://www.tarsnap.com/scrypt/scrypt.pdf).
-package scrypt // import "golang.org/x/crypto/scrypt"
+package scrypt
import (
"crypto/sha256"
diff --git a/sha3/doc.go b/sha3/doc.go
index decd8cf..7e02309 100644
--- a/sha3/doc.go
+++ b/sha3/doc.go
@@ -59,4 +59,4 @@
// They produce output of the same length, with the same security strengths
// against all attacks. This means, in particular, that SHA3-256 only has
// 128-bit collision resistance, because its output length is 32 bytes.
-package sha3 // import "golang.org/x/crypto/sha3"
+package sha3
diff --git a/sha3/hashes.go b/sha3/hashes.go
index 5eae6cb..c544b29 100644
--- a/sha3/hashes.go
+++ b/sha3/hashes.go
@@ -9,6 +9,7 @@ package sha3
// bytes.
import (
+ "crypto"
"hash"
)
@@ -40,6 +41,13 @@ func New512() hash.Hash {
return new512()
}
+func init() {
+ crypto.RegisterHash(crypto.SHA3_224, New224)
+ crypto.RegisterHash(crypto.SHA3_256, New256)
+ crypto.RegisterHash(crypto.SHA3_384, New384)
+ crypto.RegisterHash(crypto.SHA3_512, New512)
+}
+
func new224Generic() *state {
return &state{rate: 144, outputLen: 28, dsbyte: 0x06}
}
diff --git a/sha3/register.go b/sha3/register.go
deleted file mode 100644
index addfd50..0000000
--- a/sha3/register.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2014 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 go1.4
-
-package sha3
-
-import (
- "crypto"
-)
-
-func init() {
- crypto.RegisterHash(crypto.SHA3_224, New224)
- crypto.RegisterHash(crypto.SHA3_256, New256)
- crypto.RegisterHash(crypto.SHA3_384, New384)
- crypto.RegisterHash(crypto.SHA3_512, New512)
-}
diff --git a/ssh/agent/client.go b/ssh/agent/client.go
index fecba8e..106708d 100644
--- a/ssh/agent/client.go
+++ b/ssh/agent/client.go
@@ -10,7 +10,7 @@
// References:
//
// [PROTOCOL.agent]: https://tools.ietf.org/html/draft-miller-ssh-agent-00
-package agent // import "golang.org/x/crypto/ssh/agent"
+package agent
import (
"bytes"
diff --git a/ssh/doc.go b/ssh/doc.go
index edbe633..f5d352f 100644
--- a/ssh/doc.go
+++ b/ssh/doc.go
@@ -20,4 +20,4 @@ References:
This package does not fall under the stability promise of the Go language itself,
so its API may be changed when pressing needs arise.
*/
-package ssh // import "golang.org/x/crypto/ssh"
+package ssh
diff --git a/ssh/test/doc.go b/ssh/test/doc.go
index 198f0ca..444b299 100644
--- a/ssh/test/doc.go
+++ b/ssh/test/doc.go
@@ -4,4 +4,4 @@
// Package test contains integration tests for the
// golang.org/x/crypto/ssh package.
-package test // import "golang.org/x/crypto/ssh/test"
+package test
diff --git a/ssh/testdata/doc.go b/ssh/testdata/doc.go
index fcae47c..ae7bd8b 100644
--- a/ssh/testdata/doc.go
+++ b/ssh/testdata/doc.go
@@ -5,4 +5,4 @@
// This package contains test data shared between the various subpackages of
// the golang.org/x/crypto/ssh package. Under no circumstance should
// this data be used for production code.
-package testdata // import "golang.org/x/crypto/ssh/testdata"
+package testdata
diff --git a/twofish/twofish.go b/twofish/twofish.go
index e4eeae1..6d0a302 100644
--- a/twofish/twofish.go
+++ b/twofish/twofish.go
@@ -9,7 +9,7 @@
// implementation. Instead, use AES (from crypto/aes, if necessary in an AEAD
// mode like crypto/cipher.NewGCM) or XChaCha20-Poly1305 (from
// golang.org/x/crypto/chacha20poly1305).
-package twofish // import "golang.org/x/crypto/twofish"
+package twofish
// Twofish is defined in https://www.schneier.com/paper-twofish-paper.pdf [TWOFISH]
diff --git a/xtea/cipher.go b/xtea/cipher.go
index a4c2fd0..7b4f8aa 100644
--- a/xtea/cipher.go
+++ b/xtea/cipher.go
@@ -12,7 +12,7 @@
// Deprecated: any new system should use AES (from crypto/aes, if necessary in
// an AEAD mode like crypto/cipher.NewGCM) or XChaCha20-Poly1305 (from
// golang.org/x/crypto/chacha20poly1305).
-package xtea // import "golang.org/x/crypto/xtea"
+package xtea
// For details, see http://www.cix.co.uk/~klockstone/xtea.pdf
diff --git a/xts/xts.go b/xts/xts.go
index 8c16a83..d64f536 100644
--- a/xts/xts.go
+++ b/xts/xts.go
@@ -21,7 +21,7 @@
//
// Note that XTS is usually not appropriate for any use besides disk encryption.
// Most users should use an AEAD mode like GCM (from crypto/cipher.NewGCM) instead.
-package xts // import "golang.org/x/crypto/xts"
+package xts
import (
"crypto/cipher"