Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7042ebcbe0 | ||
|
|
3e90321ac7 | ||
|
|
8c4e668694 | ||
|
|
6018723c74 | ||
|
|
71ed71b4fa | ||
|
|
750a45fe5e | ||
|
|
36b172546b | ||
|
|
80ea76eb17 | ||
|
|
c17aa50fbd | ||
|
|
7cfb9161e8 | ||
|
|
b61b08db44 | ||
|
|
6c21748958 | ||
|
|
adef4cc1a8 | ||
|
|
a0819fbb02 | ||
|
|
42ee18b963 | ||
|
|
9e92970a1e | ||
|
|
c9da6b9a40 | ||
|
|
b35ab4fde0 | ||
|
|
bcb0f91bbc | ||
|
|
7eace71069 | ||
|
|
620dfbc770 | ||
|
|
82942cf1d8 | ||
|
|
0484c26df7 | ||
|
|
38ed1bc0ec | ||
|
|
38a0b5da75 | ||
|
|
bf5f14f545 | ||
|
|
b2d3a6a4b4 |
@@ -2,20 +2,17 @@
|
||||
|
||||
[](https://pkg.go.dev/golang.org/x/crypto)
|
||||
|
||||
This repository holds supplementary Go cryptography libraries.
|
||||
|
||||
## Download/Install
|
||||
|
||||
The easiest way to install is to run `go get -u golang.org/x/crypto/...`. You
|
||||
can also manually git clone the repository to `$GOPATH/src/golang.org/x/crypto`.
|
||||
This repository holds supplementary Go cryptography packages.
|
||||
|
||||
## Report Issues / Send Patches
|
||||
|
||||
This repository uses Gerrit for code changes. To learn how to submit changes to
|
||||
this repository, see https://golang.org/doc/contribute.html.
|
||||
this repository, see https://go.dev/doc/contribute.
|
||||
|
||||
The git repository is https://go.googlesource.com/crypto.
|
||||
|
||||
The main issue tracker for the crypto repository is located at
|
||||
https://github.com/golang/go/issues. Prefix your issue with "x/crypto:" in the
|
||||
https://go.dev/issues. Prefix your issue with "x/crypto:" in the
|
||||
subject line, so it is easy to find.
|
||||
|
||||
Note that contributions to the cryptography package receive additional scrutiny
|
||||
|
||||
@@ -308,7 +308,7 @@ func (ca *CAServer) handle(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
if err := decodePayload(&req, r.Body); err != nil {
|
||||
ca.httpErrorf(w, http.StatusBadRequest, err.Error())
|
||||
ca.httpErrorf(w, http.StatusBadRequest, "%v", err)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -328,7 +328,7 @@ func (ca *CAServer) handle(w http.ResponseWriter, r *http.Request) {
|
||||
Identifiers []struct{ Value string }
|
||||
}
|
||||
if err := decodePayload(&req, r.Body); err != nil {
|
||||
ca.httpErrorf(w, http.StatusBadRequest, err.Error())
|
||||
ca.httpErrorf(w, http.StatusBadRequest, "%v", err)
|
||||
return
|
||||
}
|
||||
ca.mu.Lock()
|
||||
@@ -352,7 +352,7 @@ func (ca *CAServer) handle(w http.ResponseWriter, r *http.Request) {
|
||||
defer ca.mu.Unlock()
|
||||
o, err := ca.storedOrder(strings.TrimPrefix(r.URL.Path, "/orders/"))
|
||||
if err != nil {
|
||||
ca.httpErrorf(w, http.StatusBadRequest, err.Error())
|
||||
ca.httpErrorf(w, http.StatusBadRequest, "%v", err)
|
||||
return
|
||||
}
|
||||
if err := json.NewEncoder(w).Encode(o); err != nil {
|
||||
@@ -412,7 +412,7 @@ func (ca *CAServer) handle(w http.ResponseWriter, r *http.Request) {
|
||||
orderID := strings.TrimPrefix(r.URL.Path, "/new-cert/")
|
||||
o, err := ca.storedOrder(orderID)
|
||||
if err != nil {
|
||||
ca.httpErrorf(w, http.StatusBadRequest, err.Error())
|
||||
ca.httpErrorf(w, http.StatusBadRequest, "%v", err)
|
||||
return
|
||||
}
|
||||
if o.Status != acme.StatusReady {
|
||||
@@ -427,7 +427,7 @@ func (ca *CAServer) handle(w http.ResponseWriter, r *http.Request) {
|
||||
b, _ := base64.RawURLEncoding.DecodeString(req.CSR)
|
||||
csr, err := x509.ParseCertificateRequest(b)
|
||||
if err != nil {
|
||||
ca.httpErrorf(w, http.StatusBadRequest, err.Error())
|
||||
ca.httpErrorf(w, http.StatusBadRequest, "%v", err)
|
||||
return
|
||||
}
|
||||
// Issue the certificate.
|
||||
@@ -449,7 +449,7 @@ func (ca *CAServer) handle(w http.ResponseWriter, r *http.Request) {
|
||||
defer ca.mu.Unlock()
|
||||
o, err := ca.storedOrder(strings.TrimPrefix(r.URL.Path, "/issued-cert/"))
|
||||
if err != nil {
|
||||
ca.httpErrorf(w, http.StatusBadRequest, err.Error())
|
||||
ca.httpErrorf(w, http.StatusBadRequest, "%v", err)
|
||||
return
|
||||
}
|
||||
if o.Status != acme.StatusValid {
|
||||
|
||||
@@ -0,0 +1,287 @@
|
||||
// Copyright 2024 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 (
|
||||
. "github.com/mmcloughlin/avo/build"
|
||||
. "github.com/mmcloughlin/avo/operand"
|
||||
. "github.com/mmcloughlin/avo/reg"
|
||||
_ "golang.org/x/crypto/argon2"
|
||||
)
|
||||
|
||||
//go:generate go run . -out ../blamka_amd64.s -pkg argon2
|
||||
|
||||
func main() {
|
||||
Package("golang.org/x/crypto/argon2")
|
||||
ConstraintExpr("amd64,gc,!purego")
|
||||
|
||||
blamkaSSE4()
|
||||
mixBlocksSSE2()
|
||||
xorBlocksSSE2()
|
||||
Generate()
|
||||
}
|
||||
|
||||
func blamkaSSE4() {
|
||||
Implement("blamkaSSE4")
|
||||
Attributes(NOSPLIT)
|
||||
AllocLocal(0)
|
||||
|
||||
Load(Param("b"), RAX)
|
||||
|
||||
c40 := c40_DATA()
|
||||
c48 := c48_DATA()
|
||||
|
||||
MOVOU(c40, X10)
|
||||
MOVOU(c48, X11)
|
||||
|
||||
BLAMKA_ROUND_0(AX, 0, X8, X9, X10, X11)
|
||||
BLAMKA_ROUND_0(AX, 16, X8, X9, X10, X11)
|
||||
BLAMKA_ROUND_0(AX, 32, X8, X9, X10, X11)
|
||||
BLAMKA_ROUND_0(AX, 48, X8, X9, X10, X11)
|
||||
BLAMKA_ROUND_0(AX, 64, X8, X9, X10, X11)
|
||||
BLAMKA_ROUND_0(AX, 80, X8, X9, X10, X11)
|
||||
BLAMKA_ROUND_0(AX, 96, X8, X9, X10, X11)
|
||||
BLAMKA_ROUND_0(AX, 112, X8, X9, X10, X11)
|
||||
|
||||
BLAMKA_ROUND_1(AX, 0, X8, X9, X10, X11)
|
||||
BLAMKA_ROUND_1(AX, 2, X8, X9, X10, X11)
|
||||
BLAMKA_ROUND_1(AX, 4, X8, X9, X10, X11)
|
||||
BLAMKA_ROUND_1(AX, 6, X8, X9, X10, X11)
|
||||
BLAMKA_ROUND_1(AX, 8, X8, X9, X10, X11)
|
||||
BLAMKA_ROUND_1(AX, 10, X8, X9, X10, X11)
|
||||
BLAMKA_ROUND_1(AX, 12, X8, X9, X10, X11)
|
||||
BLAMKA_ROUND_1(AX, 14, X8, X9, X10, X11)
|
||||
RET()
|
||||
}
|
||||
|
||||
func mixBlocksSSE2() {
|
||||
Implement("mixBlocksSSE2")
|
||||
Attributes(NOSPLIT)
|
||||
AllocLocal(0)
|
||||
|
||||
Load(Param("out"), RDX)
|
||||
Load(Param("a"), RAX)
|
||||
Load(Param("b"), RBX)
|
||||
Load(Param("c"), RCX)
|
||||
MOVQ(U32(128), RDI)
|
||||
|
||||
Label("loop")
|
||||
MOVOU(Mem{Base: AX}.Offset(0), X0)
|
||||
MOVOU(Mem{Base: BX}.Offset(0), X1)
|
||||
MOVOU(Mem{Base: CX}.Offset(0), X2)
|
||||
PXOR(X1, X0)
|
||||
PXOR(X2, X0)
|
||||
MOVOU(X0, Mem{Base: DX}.Offset(0))
|
||||
ADDQ(Imm(16), RAX)
|
||||
ADDQ(Imm(16), RBX)
|
||||
ADDQ(Imm(16), RCX)
|
||||
ADDQ(Imm(16), RDX)
|
||||
SUBQ(Imm(2), RDI)
|
||||
JA(LabelRef("loop"))
|
||||
RET()
|
||||
}
|
||||
|
||||
func xorBlocksSSE2() {
|
||||
Implement("xorBlocksSSE2")
|
||||
Attributes(NOSPLIT)
|
||||
AllocLocal(0)
|
||||
|
||||
Load(Param("out"), RDX)
|
||||
Load(Param("a"), RAX)
|
||||
Load(Param("b"), RBX)
|
||||
Load(Param("c"), RCX)
|
||||
MOVQ(U32(128), RDI)
|
||||
|
||||
Label("loop")
|
||||
MOVOU(Mem{Base: AX}.Offset(0), X0)
|
||||
MOVOU(Mem{Base: BX}.Offset(0), X1)
|
||||
MOVOU(Mem{Base: CX}.Offset(0), X2)
|
||||
MOVOU(Mem{Base: DX}.Offset(0), X3)
|
||||
PXOR(X1, X0)
|
||||
PXOR(X2, X0)
|
||||
PXOR(X3, X0)
|
||||
MOVOU(X0, Mem{Base: DX}.Offset(0))
|
||||
ADDQ(Imm(16), RAX)
|
||||
ADDQ(Imm(16), RBX)
|
||||
ADDQ(Imm(16), RCX)
|
||||
ADDQ(Imm(16), RDX)
|
||||
SUBQ(Imm(2), RDI)
|
||||
JA(LabelRef("loop"))
|
||||
RET()
|
||||
}
|
||||
|
||||
func SHUFFLE(v2, v3, v4, v5, v6, v7, t1, t2 VecPhysical) {
|
||||
MOVO(v4, t1)
|
||||
MOVO(v5, v4)
|
||||
MOVO(t1, v5)
|
||||
MOVO(v6, t1)
|
||||
PUNPCKLQDQ(v6, t2)
|
||||
PUNPCKHQDQ(v7, v6)
|
||||
PUNPCKHQDQ(t2, v6)
|
||||
PUNPCKLQDQ(v7, t2)
|
||||
MOVO(t1, v7)
|
||||
MOVO(v2, t1)
|
||||
PUNPCKHQDQ(t2, v7)
|
||||
PUNPCKLQDQ(v3, t2)
|
||||
PUNPCKHQDQ(t2, v2)
|
||||
PUNPCKLQDQ(t1, t2)
|
||||
PUNPCKHQDQ(t2, v3)
|
||||
}
|
||||
|
||||
func SHUFFLE_INV(v2, v3, v4, v5, v6, v7, t1, t2 VecPhysical) {
|
||||
MOVO(v4, t1)
|
||||
MOVO(v5, v4)
|
||||
MOVO(t1, v5)
|
||||
MOVO(v2, t1)
|
||||
PUNPCKLQDQ(v2, t2)
|
||||
PUNPCKHQDQ(v3, v2)
|
||||
PUNPCKHQDQ(t2, v2)
|
||||
PUNPCKLQDQ(v3, t2)
|
||||
MOVO(t1, v3)
|
||||
MOVO(v6, t1)
|
||||
PUNPCKHQDQ(t2, v3)
|
||||
PUNPCKLQDQ(v7, t2)
|
||||
PUNPCKHQDQ(t2, v6)
|
||||
PUNPCKLQDQ(t1, t2)
|
||||
PUNPCKHQDQ(t2, v7)
|
||||
}
|
||||
|
||||
func HALF_ROUND(v0, v1, v2, v3, v4, v5, v6, v7, t0, c40, c48 VecPhysical) {
|
||||
MOVO(v0, t0)
|
||||
PMULULQ(v2, t0)
|
||||
PADDQ(v2, v0)
|
||||
PADDQ(t0, v0)
|
||||
PADDQ(t0, v0)
|
||||
PXOR(v0, v6)
|
||||
PSHUFD(Imm(0xB1), v6, v6)
|
||||
MOVO(v4, t0)
|
||||
PMULULQ(v6, t0)
|
||||
PADDQ(v6, v4)
|
||||
PADDQ(t0, v4)
|
||||
PADDQ(t0, v4)
|
||||
PXOR(v4, v2)
|
||||
PSHUFB(c40, v2)
|
||||
MOVO(v0, t0)
|
||||
PMULULQ(v2, t0)
|
||||
PADDQ(v2, v0)
|
||||
PADDQ(t0, v0)
|
||||
PADDQ(t0, v0)
|
||||
PXOR(v0, v6)
|
||||
PSHUFB(c48, v6)
|
||||
MOVO(v4, t0)
|
||||
PMULULQ(v6, t0)
|
||||
PADDQ(v6, v4)
|
||||
PADDQ(t0, v4)
|
||||
PADDQ(t0, v4)
|
||||
PXOR(v4, v2)
|
||||
MOVO(v2, t0)
|
||||
PADDQ(v2, t0)
|
||||
PSRLQ(Imm(63), v2)
|
||||
PXOR(t0, v2)
|
||||
MOVO(v1, t0)
|
||||
PMULULQ(v3, t0)
|
||||
PADDQ(v3, v1)
|
||||
PADDQ(t0, v1)
|
||||
PADDQ(t0, v1)
|
||||
PXOR(v1, v7)
|
||||
PSHUFD(Imm(0xB1), v7, v7)
|
||||
MOVO(v5, t0)
|
||||
PMULULQ(v7, t0)
|
||||
PADDQ(v7, v5)
|
||||
PADDQ(t0, v5)
|
||||
PADDQ(t0, v5)
|
||||
PXOR(v5, v3)
|
||||
PSHUFB(c40, v3)
|
||||
MOVO(v1, t0)
|
||||
PMULULQ(v3, t0)
|
||||
PADDQ(v3, v1)
|
||||
PADDQ(t0, v1)
|
||||
PADDQ(t0, v1)
|
||||
PXOR(v1, v7)
|
||||
PSHUFB(c48, v7)
|
||||
MOVO(v5, t0)
|
||||
PMULULQ(v7, t0)
|
||||
PADDQ(v7, v5)
|
||||
PADDQ(t0, v5)
|
||||
PADDQ(t0, v5)
|
||||
PXOR(v5, v3)
|
||||
MOVO(v3, t0)
|
||||
PADDQ(v3, t0)
|
||||
PSRLQ(Imm(63), v3)
|
||||
PXOR(t0, v3)
|
||||
}
|
||||
|
||||
func LOAD_MSG_0(block GPPhysical, off int) {
|
||||
var registers = []VecPhysical{X0, X1, X2, X3, X4, X5, X6, X7}
|
||||
for i, r := range registers {
|
||||
MOVOU(Mem{Base: block}.Offset(8*(off+(i*2))), r)
|
||||
}
|
||||
}
|
||||
|
||||
func STORE_MSG_0(block GPPhysical, off int) {
|
||||
var registers = []VecPhysical{X0, X1, X2, X3, X4, X5, X6, X7}
|
||||
for i, r := range registers {
|
||||
MOVOU(r, Mem{Base: block}.Offset(8*(off+(i*2))))
|
||||
}
|
||||
}
|
||||
|
||||
func LOAD_MSG_1(block GPPhysical, off int) {
|
||||
var registers = []VecPhysical{X0, X1, X2, X3, X4, X5, X6, X7}
|
||||
for i, r := range registers {
|
||||
MOVOU(Mem{Base: block}.Offset(8*off+i*16*8), r)
|
||||
}
|
||||
}
|
||||
|
||||
func STORE_MSG_1(block GPPhysical, off int) {
|
||||
var registers = []VecPhysical{X0, X1, X2, X3, X4, X5, X6, X7}
|
||||
for i, r := range registers {
|
||||
MOVOU(r, Mem{Base: block}.Offset(8*off+i*16*8))
|
||||
}
|
||||
}
|
||||
|
||||
func BLAMKA_ROUND_0(block GPPhysical, off int, t0, t1, c40, c48 VecPhysical) {
|
||||
LOAD_MSG_0(block, off)
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, t0, c40, c48)
|
||||
SHUFFLE(X2, X3, X4, X5, X6, X7, t0, t1)
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, t0, c40, c48)
|
||||
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, t0, t1)
|
||||
STORE_MSG_0(block, off)
|
||||
}
|
||||
|
||||
func BLAMKA_ROUND_1(block GPPhysical, off int, t0, t1, c40, c48 VecPhysical) {
|
||||
LOAD_MSG_1(block, off)
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, t0, c40, c48)
|
||||
SHUFFLE(X2, X3, X4, X5, X6, X7, t0, t1)
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, t0, c40, c48)
|
||||
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, t0, t1)
|
||||
STORE_MSG_1(block, off)
|
||||
}
|
||||
|
||||
// ##------------------DATA SECTION-------------------##
|
||||
|
||||
var c40_DATA_ptr, c48_DATA_ptr *Mem
|
||||
|
||||
func c40_DATA() Mem {
|
||||
if c40_DATA_ptr != nil {
|
||||
return *c40_DATA_ptr
|
||||
}
|
||||
|
||||
c40_DATA := GLOBL("·c40", NOPTR|RODATA)
|
||||
c40_DATA_ptr = &c40_DATA
|
||||
DATA(0x00, U64(0x0201000706050403))
|
||||
DATA(0x08, U64(0x0a09080f0e0d0c0b))
|
||||
return c40_DATA
|
||||
}
|
||||
func c48_DATA() Mem {
|
||||
if c48_DATA_ptr != nil {
|
||||
return *c48_DATA_ptr
|
||||
}
|
||||
|
||||
c48_DATA := GLOBL("·c48", NOPTR|RODATA)
|
||||
c48_DATA_ptr = &c48_DATA
|
||||
DATA(0x00, U64(0x0100070605040302))
|
||||
DATA(0x08, U64(0x09080f0e0d0c0b0a))
|
||||
return c48_DATA
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
module argon2/_asm
|
||||
|
||||
go 1.23
|
||||
|
||||
require (
|
||||
github.com/mmcloughlin/avo v0.6.0
|
||||
golang.org/x/crypto v0.26.0
|
||||
)
|
||||
|
||||
require (
|
||||
golang.org/x/mod v0.20.0 // indirect
|
||||
golang.org/x/sync v0.8.0 // indirect
|
||||
golang.org/x/sys v0.24.0 // indirect
|
||||
golang.org/x/tools v0.24.0 // indirect
|
||||
)
|
||||
@@ -0,0 +1,12 @@
|
||||
github.com/mmcloughlin/avo v0.6.0 h1:QH6FU8SKoTLaVs80GA8TJuLNkUYl4VokHKlPhVDg4YY=
|
||||
github.com/mmcloughlin/avo v0.6.0/go.mod h1:8CoAGaCSYXtCPR+8y18Y9aB/kxb8JSS6FRI7mSkvD+8=
|
||||
golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
|
||||
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
|
||||
golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
|
||||
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
|
||||
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
|
||||
golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
|
||||
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
|
||||
+2761
-213
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,16 @@
|
||||
module blake2b/_asm/AVX2
|
||||
|
||||
go 1.23
|
||||
|
||||
require (
|
||||
github.com/mmcloughlin/avo v0.6.0
|
||||
golang.org/x/crypto v0.26.0
|
||||
|
||||
)
|
||||
|
||||
require (
|
||||
golang.org/x/mod v0.20.0 // indirect
|
||||
golang.org/x/sync v0.8.0 // indirect
|
||||
golang.org/x/sys v0.24.0 // indirect
|
||||
golang.org/x/tools v0.24.0 // indirect
|
||||
)
|
||||
@@ -0,0 +1,12 @@
|
||||
github.com/mmcloughlin/avo v0.6.0 h1:QH6FU8SKoTLaVs80GA8TJuLNkUYl4VokHKlPhVDg4YY=
|
||||
github.com/mmcloughlin/avo v0.6.0/go.mod h1:8CoAGaCSYXtCPR+8y18Y9aB/kxb8JSS6FRI7mSkvD+8=
|
||||
golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
|
||||
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
|
||||
golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
|
||||
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
|
||||
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
|
||||
golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
|
||||
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
|
||||
@@ -0,0 +1,361 @@
|
||||
// Copyright 2024 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 (
|
||||
. "github.com/mmcloughlin/avo/build"
|
||||
. "github.com/mmcloughlin/avo/operand"
|
||||
. "github.com/mmcloughlin/avo/reg"
|
||||
_ "golang.org/x/crypto/blake2b"
|
||||
)
|
||||
|
||||
//go:generate go run . -out ../../blake2b_amd64.s -pkg blake2b
|
||||
|
||||
const ThatPeskyUnicodeDot = "\u00b7"
|
||||
|
||||
var iv0_DATA_ptr, iv1_DATA_ptr, iv2_DATA_ptr, iv3_DATA_ptr, c40_DATA_ptr, c48_DATA_ptr *Mem
|
||||
|
||||
func main() {
|
||||
Package("golang.org/x/crypto/blake2b")
|
||||
ConstraintExpr("amd64,gc,!purego")
|
||||
hashBlocksSSE4()
|
||||
Generate()
|
||||
}
|
||||
|
||||
func SHUFFLE(v2, v3, v4, v5, v6, v7, t1, t2 VecPhysical) {
|
||||
MOVO(v4, t1)
|
||||
MOVO(v5, v4)
|
||||
MOVO(t1, v5)
|
||||
MOVO(v6, t1)
|
||||
PUNPCKLQDQ(v6, t2)
|
||||
PUNPCKHQDQ(v7, v6)
|
||||
PUNPCKHQDQ(t2, v6)
|
||||
PUNPCKLQDQ(v7, t2)
|
||||
MOVO(t1, v7)
|
||||
MOVO(v2, t1)
|
||||
PUNPCKHQDQ(t2, v7)
|
||||
PUNPCKLQDQ(v3, t2)
|
||||
PUNPCKHQDQ(t2, v2)
|
||||
PUNPCKLQDQ(t1, t2)
|
||||
PUNPCKHQDQ(t2, v3)
|
||||
}
|
||||
|
||||
func SHUFFLE_INV(v2, v3, v4, v5, v6, v7, t1, t2 VecPhysical) {
|
||||
MOVO(v4, t1)
|
||||
MOVO(v5, v4)
|
||||
MOVO(t1, v5)
|
||||
MOVO(v2, t1)
|
||||
PUNPCKLQDQ(v2, t2)
|
||||
PUNPCKHQDQ(v3, v2)
|
||||
PUNPCKHQDQ(t2, v2)
|
||||
PUNPCKLQDQ(v3, t2)
|
||||
MOVO(t1, v3)
|
||||
MOVO(v6, t1)
|
||||
PUNPCKHQDQ(t2, v3)
|
||||
PUNPCKLQDQ(v7, t2)
|
||||
PUNPCKHQDQ(t2, v6)
|
||||
PUNPCKLQDQ(t1, t2)
|
||||
PUNPCKHQDQ(t2, v7)
|
||||
}
|
||||
|
||||
func HALF_ROUND(v0, v1, v2, v3, v4, v5, v6, v7 VecPhysical, m0, m1, m2, m3 Op, t0, c40, c48 VecPhysical) {
|
||||
PADDQ(m0, v0)
|
||||
PADDQ(m1, v1)
|
||||
PADDQ(v2, v0)
|
||||
PADDQ(v3, v1)
|
||||
PXOR(v0, v6)
|
||||
PXOR(v1, v7)
|
||||
PSHUFD(Imm(0xB1), v6, v6)
|
||||
PSHUFD(Imm(0xB1), v7, v7)
|
||||
PADDQ(v6, v4)
|
||||
PADDQ(v7, v5)
|
||||
PXOR(v4, v2)
|
||||
PXOR(v5, v3)
|
||||
PSHUFB(c40, v2)
|
||||
PSHUFB(c40, v3)
|
||||
PADDQ(m2, v0)
|
||||
PADDQ(m3, v1)
|
||||
PADDQ(v2, v0)
|
||||
PADDQ(v3, v1)
|
||||
PXOR(v0, v6)
|
||||
PXOR(v1, v7)
|
||||
PSHUFB(c48, v6)
|
||||
PSHUFB(c48, v7)
|
||||
PADDQ(v6, v4)
|
||||
PADDQ(v7, v5)
|
||||
PXOR(v4, v2)
|
||||
PXOR(v5, v3)
|
||||
MOVOU(v2, t0)
|
||||
PADDQ(v2, t0)
|
||||
PSRLQ(Imm(63), v2)
|
||||
PXOR(t0, v2)
|
||||
MOVOU(v3, t0)
|
||||
PADDQ(v3, t0)
|
||||
PSRLQ(Imm(63), v3)
|
||||
PXOR(t0, v3)
|
||||
}
|
||||
|
||||
func LOAD_MSG(m0, m1, m2, m3 VecPhysical, src GPPhysical, i0, i1, i2, i3, i4, i5, i6, i7 int) {
|
||||
MOVQ(Mem{Base: src}.Offset(i0*8), m0)
|
||||
PINSRQ(Imm(1), Mem{Base: src}.Offset(i1*8), m0)
|
||||
MOVQ(Mem{Base: src}.Offset(i2*8), m1)
|
||||
PINSRQ(Imm(1), Mem{Base: src}.Offset(i3*8), m1)
|
||||
MOVQ(Mem{Base: src}.Offset(i4*8), m2)
|
||||
PINSRQ(Imm(1), Mem{Base: src}.Offset(i5*8), m2)
|
||||
MOVQ(Mem{Base: src}.Offset(i6*8), m3)
|
||||
PINSRQ(Imm(1), Mem{Base: src}.Offset(i7*8), m3)
|
||||
}
|
||||
|
||||
func hashBlocksSSE4() {
|
||||
Implement("hashBlocksSSE4")
|
||||
Attributes(4)
|
||||
AllocLocal(288) // frame size = 272 + 16 byte alignment
|
||||
|
||||
Load(Param("h"), RAX)
|
||||
Load(Param("c"), RBX)
|
||||
Load(Param("flag"), RCX)
|
||||
Load(Param("blocks").Base(), RSI)
|
||||
Load(Param("blocks").Len(), RDI)
|
||||
|
||||
MOVQ(RSP, R10)
|
||||
ADDQ(Imm(15), R10)
|
||||
ANDQ(I32(-16), R10)
|
||||
|
||||
iv3 := iv3_DATA()
|
||||
MOVOU(iv3, X0)
|
||||
MOVO(X0, Mem{Base: R10}.Offset(0))
|
||||
XORQ(RCX, Mem{Base: R10}.Offset(0)) // 0(R10) = ·iv3 ^ (CX || 0)
|
||||
|
||||
c40 := c40_DATA()
|
||||
c48 := c48_DATA()
|
||||
MOVOU(c40, X13)
|
||||
MOVOU(c48, X14)
|
||||
|
||||
MOVOU(Mem{Base: AX}.Offset(0), X12)
|
||||
MOVOU(Mem{Base: AX}.Offset(16), X15)
|
||||
|
||||
MOVQ(Mem{Base: BX}.Offset(0), R8)
|
||||
MOVQ(Mem{Base: BX}.Offset(8), R9)
|
||||
|
||||
Label("loop")
|
||||
ADDQ(Imm(128), R8)
|
||||
CMPQ(R8, Imm(128))
|
||||
JGE(LabelRef("noinc"))
|
||||
INCQ(R9)
|
||||
|
||||
Label("noinc")
|
||||
MOVQ(R8, X8)
|
||||
PINSRQ(Imm(1), R9, X8)
|
||||
|
||||
iv0 := iv0_DATA()
|
||||
iv1 := iv1_DATA()
|
||||
iv2 := iv2_DATA()
|
||||
|
||||
MOVO(X12, X0)
|
||||
MOVO(X15, X1)
|
||||
MOVOU(Mem{Base: AX}.Offset(32), X2)
|
||||
MOVOU(Mem{Base: AX}.Offset(48), X3)
|
||||
MOVOU(iv0, X4)
|
||||
MOVOU(iv1, X5)
|
||||
MOVOU(iv2, X6)
|
||||
|
||||
PXOR(X8, X6)
|
||||
MOVO(Mem{Base: R10}.Offset(0), X7)
|
||||
|
||||
LOAD_MSG(X8, X9, X10, X11, SI, 0, 2, 4, 6, 1, 3, 5, 7)
|
||||
MOVO(X8, Mem{Base: R10}.Offset(16))
|
||||
MOVO(X9, Mem{Base: R10}.Offset(32))
|
||||
MOVO(X10, Mem{Base: R10}.Offset(48))
|
||||
MOVO(X11, Mem{Base: R10}.Offset(64))
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||
SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||
LOAD_MSG(X8, X9, X10, X11, SI, 8, 10, 12, 14, 9, 11, 13, 15)
|
||||
MOVO(X8, Mem{Base: R10}.Offset(80))
|
||||
MOVO(X9, Mem{Base: R10}.Offset(96))
|
||||
MOVO(X10, Mem{Base: R10}.Offset(112))
|
||||
MOVO(X11, Mem{Base: R10}.Offset(128))
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||
|
||||
LOAD_MSG(X8, X9, X10, X11, SI, 14, 4, 9, 13, 10, 8, 15, 6)
|
||||
MOVO(X8, Mem{Base: R10}.Offset(144))
|
||||
MOVO(X9, Mem{Base: R10}.Offset(160))
|
||||
MOVO(X10, Mem{Base: R10}.Offset(176))
|
||||
MOVO(X11, Mem{Base: R10}.Offset(192))
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||
SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||
LOAD_MSG(X8, X9, X10, X11, SI, 1, 0, 11, 5, 12, 2, 7, 3)
|
||||
MOVO(X8, Mem{Base: R10}.Offset(208))
|
||||
MOVO(X9, Mem{Base: R10}.Offset(224))
|
||||
MOVO(X10, Mem{Base: R10}.Offset(240))
|
||||
MOVO(X11, Mem{Base: R10}.Offset(256))
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||
|
||||
LOAD_MSG(X8, X9, X10, X11, SI, 11, 12, 5, 15, 8, 0, 2, 13)
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||
SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||
LOAD_MSG(X8, X9, X10, X11, SI, 10, 3, 7, 9, 14, 6, 1, 4)
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||
|
||||
LOAD_MSG(X8, X9, X10, X11, SI, 7, 3, 13, 11, 9, 1, 12, 14)
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||
SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||
LOAD_MSG(X8, X9, X10, X11, SI, 2, 5, 4, 15, 6, 10, 0, 8)
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||
|
||||
LOAD_MSG(X8, X9, X10, X11, SI, 9, 5, 2, 10, 0, 7, 4, 15)
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||
SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||
LOAD_MSG(X8, X9, X10, X11, SI, 14, 11, 6, 3, 1, 12, 8, 13)
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||
|
||||
LOAD_MSG(X8, X9, X10, X11, SI, 2, 6, 0, 8, 12, 10, 11, 3)
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||
SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||
LOAD_MSG(X8, X9, X10, X11, SI, 4, 7, 15, 1, 13, 5, 14, 9)
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||
|
||||
LOAD_MSG(X8, X9, X10, X11, SI, 12, 1, 14, 4, 5, 15, 13, 10)
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||
SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||
LOAD_MSG(X8, X9, X10, X11, SI, 0, 6, 9, 8, 7, 3, 2, 11)
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||
|
||||
LOAD_MSG(X8, X9, X10, X11, SI, 13, 7, 12, 3, 11, 14, 1, 9)
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||
SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||
LOAD_MSG(X8, X9, X10, X11, SI, 5, 15, 8, 2, 0, 4, 6, 10)
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||
|
||||
LOAD_MSG(X8, X9, X10, X11, SI, 6, 14, 11, 0, 15, 9, 3, 8)
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||
SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||
LOAD_MSG(X8, X9, X10, X11, SI, 12, 13, 1, 10, 2, 7, 4, 5)
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||
|
||||
LOAD_MSG(X8, X9, X10, X11, SI, 10, 8, 7, 1, 2, 4, 6, 5)
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||
SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||
LOAD_MSG(X8, X9, X10, X11, SI, 15, 9, 3, 13, 11, 14, 12, 0)
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, Mem{Base: R10}.Offset(16), Mem{Base: R10}.Offset(32), Mem{Base: R10}.Offset(48), Mem{Base: R10}.Offset(64), X11, X13, X14)
|
||||
SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, Mem{Base: R10}.Offset(80), Mem{Base: R10}.Offset(96), Mem{Base: R10}.Offset(112), Mem{Base: R10}.Offset(128), X11, X13, X14)
|
||||
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, Mem{Base: R10}.Offset(144), Mem{Base: R10}.Offset(160), Mem{Base: R10}.Offset(176), Mem{Base: R10}.Offset(192), X11, X13, X14)
|
||||
SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, Mem{Base: R10}.Offset(208), Mem{Base: R10}.Offset(224), Mem{Base: R10}.Offset(240), Mem{Base: R10}.Offset(256), X11, X13, X14)
|
||||
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||
|
||||
MOVOU(Mem{Base: AX}.Offset(32), X10)
|
||||
MOVOU(Mem{Base: AX}.Offset(48), X11)
|
||||
PXOR(X0, X12)
|
||||
PXOR(X1, X15)
|
||||
PXOR(X2, X10)
|
||||
PXOR(X3, X11)
|
||||
PXOR(X4, X12)
|
||||
PXOR(X5, X15)
|
||||
PXOR(X6, X10)
|
||||
PXOR(X7, X11)
|
||||
MOVOU(X10, Mem{Base: AX}.Offset(32))
|
||||
MOVOU(X11, Mem{Base: AX}.Offset(48))
|
||||
|
||||
LEAQ(Mem{Base: SI}.Offset(128), RSI)
|
||||
SUBQ(Imm(128), RDI)
|
||||
JNE(LabelRef("loop"))
|
||||
|
||||
MOVOU(X12, Mem{Base: AX}.Offset(0))
|
||||
MOVOU(X15, Mem{Base: AX}.Offset(16))
|
||||
|
||||
MOVQ(R8, Mem{Base: BX}.Offset(0))
|
||||
MOVQ(R9, Mem{Base: BX}.Offset(8))
|
||||
|
||||
RET()
|
||||
}
|
||||
|
||||
// #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~DATA SECTION~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~##
|
||||
|
||||
func iv0_DATA() Mem {
|
||||
if iv0_DATA_ptr != nil {
|
||||
return *iv0_DATA_ptr
|
||||
}
|
||||
|
||||
iv0 := GLOBL(ThatPeskyUnicodeDot+"iv0", NOPTR|RODATA)
|
||||
iv0_DATA_ptr = &iv0
|
||||
DATA(0x00, U64(0x6a09e667f3bcc908))
|
||||
DATA(0x08, U64(0xbb67ae8584caa73b))
|
||||
return iv0
|
||||
}
|
||||
|
||||
func iv1_DATA() Mem {
|
||||
if iv1_DATA_ptr != nil {
|
||||
return *iv1_DATA_ptr
|
||||
}
|
||||
|
||||
iv1 := GLOBL(ThatPeskyUnicodeDot+"iv1", NOPTR|RODATA)
|
||||
iv1_DATA_ptr = &iv1
|
||||
DATA(0x00, U64(0x3c6ef372fe94f82b))
|
||||
DATA(0x08, U64(0xa54ff53a5f1d36f1))
|
||||
return iv1
|
||||
}
|
||||
|
||||
func iv2_DATA() Mem {
|
||||
if iv2_DATA_ptr != nil {
|
||||
return *iv2_DATA_ptr
|
||||
}
|
||||
|
||||
iv2 := GLOBL(ThatPeskyUnicodeDot+"iv2", NOPTR|RODATA)
|
||||
iv2_DATA_ptr = &iv2
|
||||
DATA(0x00, U64(0x510e527fade682d1))
|
||||
DATA(0x08, U64(0x9b05688c2b3e6c1f))
|
||||
return iv2
|
||||
}
|
||||
|
||||
func iv3_DATA() Mem {
|
||||
if iv3_DATA_ptr != nil {
|
||||
return *iv3_DATA_ptr
|
||||
}
|
||||
|
||||
iv3 := GLOBL(ThatPeskyUnicodeDot+"iv3", NOPTR|RODATA)
|
||||
iv3_DATA_ptr = &iv3
|
||||
DATA(0x00, U64(0x1f83d9abfb41bd6b))
|
||||
DATA(0x08, U64(0x5be0cd19137e2179))
|
||||
return iv3
|
||||
}
|
||||
|
||||
func c40_DATA() Mem {
|
||||
if c40_DATA_ptr != nil {
|
||||
return *c40_DATA_ptr
|
||||
}
|
||||
|
||||
c40 := GLOBL(ThatPeskyUnicodeDot+"c40", NOPTR|RODATA)
|
||||
c40_DATA_ptr = &c40
|
||||
DATA(0x00, U64(0x0201000706050403))
|
||||
DATA(0x08, U64(0x0a09080f0e0d0c0b))
|
||||
return c40
|
||||
}
|
||||
|
||||
func c48_DATA() Mem {
|
||||
if c48_DATA_ptr != nil {
|
||||
return *c48_DATA_ptr
|
||||
}
|
||||
|
||||
c48 := GLOBL(ThatPeskyUnicodeDot+"c48", NOPTR|RODATA)
|
||||
c48_DATA_ptr = &c48
|
||||
DATA(0x00, U64(0x0100070605040302))
|
||||
DATA(0x08, U64(0x09080f0e0d0c0b0a))
|
||||
return c48
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
module blake2b/_asm
|
||||
|
||||
go 1.23
|
||||
|
||||
require (
|
||||
github.com/mmcloughlin/avo v0.6.0
|
||||
golang.org/x/crypto v0.26.0
|
||||
)
|
||||
|
||||
require (
|
||||
golang.org/x/mod v0.20.0 // indirect
|
||||
golang.org/x/sync v0.8.0 // indirect
|
||||
golang.org/x/sys v0.24.0 // indirect
|
||||
golang.org/x/tools v0.24.0 // indirect
|
||||
)
|
||||
@@ -0,0 +1,12 @@
|
||||
github.com/mmcloughlin/avo v0.6.0 h1:QH6FU8SKoTLaVs80GA8TJuLNkUYl4VokHKlPhVDg4YY=
|
||||
github.com/mmcloughlin/avo v0.6.0/go.mod h1:8CoAGaCSYXtCPR+8y18Y9aB/kxb8JSS6FRI7mSkvD+8=
|
||||
golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
|
||||
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
|
||||
golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
|
||||
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
|
||||
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
|
||||
golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
|
||||
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
|
||||
+4492
-677
File diff suppressed because it is too large
Load Diff
+1427
-264
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,525 @@
|
||||
// Copyright 2024 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 (
|
||||
. "github.com/mmcloughlin/avo/build"
|
||||
"github.com/mmcloughlin/avo/ir"
|
||||
. "github.com/mmcloughlin/avo/operand"
|
||||
. "github.com/mmcloughlin/avo/reg"
|
||||
_ "golang.org/x/crypto/blake2s"
|
||||
)
|
||||
|
||||
//go:generate go run . -out ../blake2s_amd64.s -pkg blake2s
|
||||
|
||||
func main() {
|
||||
Package("golang.org/x/crypto/blake2s")
|
||||
ConstraintExpr("amd64,gc,!purego")
|
||||
hashBlocksSSE2()
|
||||
hashBlocksSSSE3()
|
||||
hashBlocksSSE4()
|
||||
Generate()
|
||||
}
|
||||
|
||||
func ROTL_SSE2(n uint64, t, v VecPhysical) {
|
||||
MOVO(v, t)
|
||||
PSLLL(Imm(n), t)
|
||||
PSRLL(Imm(32-n), v)
|
||||
PXOR(t, v)
|
||||
}
|
||||
|
||||
func ROTL_SSSE3(c, v VecPhysical) {
|
||||
PSHUFB(c, v)
|
||||
}
|
||||
|
||||
func ROUND_SSE2(v0, v1, v2, v3 VecPhysical, m0, m1, m2, m3 Mem, t VecPhysical) {
|
||||
PADDL(m0, v0)
|
||||
PADDL(v1, v0)
|
||||
PXOR(v0, v3)
|
||||
ROTL_SSE2(16, t, v3)
|
||||
PADDL(v3, v2)
|
||||
PXOR(v2, v1)
|
||||
ROTL_SSE2(20, t, v1)
|
||||
PADDL(m1, v0)
|
||||
PADDL(v1, v0)
|
||||
PXOR(v0, v3)
|
||||
ROTL_SSE2(24, t, v3)
|
||||
PADDL(v3, v2)
|
||||
PXOR(v2, v1)
|
||||
ROTL_SSE2(25, t, v1)
|
||||
PSHUFL(Imm(0x39), v1, v1)
|
||||
PSHUFL(Imm(0x4E), v2, v2)
|
||||
PSHUFL(Imm(0x93), v3, v3)
|
||||
PADDL(m2, v0)
|
||||
PADDL(v1, v0)
|
||||
PXOR(v0, v3)
|
||||
ROTL_SSE2(16, t, v3)
|
||||
PADDL(v3, v2)
|
||||
PXOR(v2, v1)
|
||||
ROTL_SSE2(20, t, v1)
|
||||
PADDL(m3, v0)
|
||||
PADDL(v1, v0)
|
||||
PXOR(v0, v3)
|
||||
ROTL_SSE2(24, t, v3)
|
||||
PADDL(v3, v2)
|
||||
PXOR(v2, v1)
|
||||
ROTL_SSE2(25, t, v1)
|
||||
PSHUFL(Imm(0x39), v3, v3)
|
||||
PSHUFL(Imm(0x4E), v2, v2)
|
||||
PSHUFL(Imm(0x93), v1, v1)
|
||||
}
|
||||
|
||||
func ROUND_SSSE3(v0, v1, v2, v3 VecPhysical, m0, m1, m2, m3 Op, t, c16, c8 VecPhysical) {
|
||||
PADDL(m0, v0)
|
||||
PADDL(v1, v0)
|
||||
PXOR(v0, v3)
|
||||
ROTL_SSSE3(c16, v3)
|
||||
PADDL(v3, v2)
|
||||
PXOR(v2, v1)
|
||||
ROTL_SSE2(20, t, v1)
|
||||
PADDL(m1, v0)
|
||||
PADDL(v1, v0)
|
||||
PXOR(v0, v3)
|
||||
ROTL_SSSE3(c8, v3)
|
||||
PADDL(v3, v2)
|
||||
PXOR(v2, v1)
|
||||
ROTL_SSE2(25, t, v1)
|
||||
PSHUFL(Imm(0x39), v1, v1)
|
||||
PSHUFL(Imm(0x4E), v2, v2)
|
||||
PSHUFL(Imm(0x93), v3, v3)
|
||||
PADDL(m2, v0)
|
||||
PADDL(v1, v0)
|
||||
PXOR(v0, v3)
|
||||
ROTL_SSSE3(c16, v3)
|
||||
PADDL(v3, v2)
|
||||
PXOR(v2, v1)
|
||||
ROTL_SSE2(20, t, v1)
|
||||
PADDL(m3, v0)
|
||||
PADDL(v1, v0)
|
||||
PXOR(v0, v3)
|
||||
ROTL_SSSE3(c8, v3)
|
||||
PADDL(v3, v2)
|
||||
PXOR(v2, v1)
|
||||
ROTL_SSE2(25, t, v1)
|
||||
PSHUFL(Imm(0x39), v3, v3)
|
||||
PSHUFL(Imm(0x4E), v2, v2)
|
||||
PSHUFL(Imm(0x93), v1, v1)
|
||||
}
|
||||
|
||||
func LOAD_MSG_SSE4(m0, m1, m2, m3 VecPhysical, src GPPhysical, i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15 int) {
|
||||
// Hack to get Avo to emit a MOVL instruction with a VecPhysical as the destination
|
||||
Instruction(&ir.Instruction{Opcode: "MOVL", Operands: []Op{Mem{Base: src}.Offset(i0 * 4), m0}})
|
||||
PINSRD(Imm(1), Mem{Base: src}.Offset(i1*4), m0)
|
||||
PINSRD(Imm(2), Mem{Base: src}.Offset(i2*4), m0)
|
||||
PINSRD(Imm(3), Mem{Base: src}.Offset(i3*4), m0)
|
||||
Instruction(&ir.Instruction{Opcode: "MOVL", Operands: []Op{Mem{Base: src}.Offset(i4 * 4), m1}})
|
||||
PINSRD(Imm(1), Mem{Base: src}.Offset(i5*4), m1)
|
||||
PINSRD(Imm(2), Mem{Base: src}.Offset(i6*4), m1)
|
||||
PINSRD(Imm(3), Mem{Base: src}.Offset(i7*4), m1)
|
||||
Instruction(&ir.Instruction{Opcode: "MOVL", Operands: []Op{Mem{Base: src}.Offset(i8 * 4), m2}})
|
||||
PINSRD(Imm(1), Mem{Base: src}.Offset(i9*4), m2)
|
||||
PINSRD(Imm(2), Mem{Base: src}.Offset(i10*4), m2)
|
||||
PINSRD(Imm(3), Mem{Base: src}.Offset(i11*4), m2)
|
||||
Instruction(&ir.Instruction{Opcode: "MOVL", Operands: []Op{Mem{Base: src}.Offset(i12 * 4), m3}})
|
||||
PINSRD(Imm(1), Mem{Base: src}.Offset(i13*4), m3)
|
||||
PINSRD(Imm(2), Mem{Base: src}.Offset(i14*4), m3)
|
||||
PINSRD(Imm(3), Mem{Base: src}.Offset(i15*4), m3)
|
||||
}
|
||||
|
||||
func PRECOMPUTE_MSG(dst GPPhysical, off int, src, R8, R9, R10, R11, R12, R13, R14, R15 GPPhysical) {
|
||||
MOVQ(Mem{Base: src}.Offset(0*4), R8)
|
||||
MOVQ(Mem{Base: src}.Offset(2*4), R9)
|
||||
MOVQ(Mem{Base: src}.Offset(4*4), R10)
|
||||
MOVQ(Mem{Base: src}.Offset(6*4), R11)
|
||||
MOVQ(Mem{Base: src}.Offset(8*4), R12)
|
||||
MOVQ(Mem{Base: src}.Offset(10*4), R13)
|
||||
MOVQ(Mem{Base: src}.Offset(12*4), R14)
|
||||
MOVQ(Mem{Base: src}.Offset(14*4), R15)
|
||||
|
||||
MOVL(R8L, Mem{Base: dst}.Offset(0*4+off+0))
|
||||
MOVL(R8L, Mem{Base: dst}.Offset(9*4+off+64))
|
||||
MOVL(R8L, Mem{Base: dst}.Offset(5*4+off+128))
|
||||
MOVL(R8L, Mem{Base: dst}.Offset(14*4+off+192))
|
||||
MOVL(R8L, Mem{Base: dst}.Offset(4*4+off+256))
|
||||
MOVL(R8L, Mem{Base: dst}.Offset(2*4+off+320))
|
||||
MOVL(R8L, Mem{Base: dst}.Offset(8*4+off+384))
|
||||
MOVL(R8L, Mem{Base: dst}.Offset(12*4+off+448))
|
||||
MOVL(R8L, Mem{Base: dst}.Offset(3*4+off+512))
|
||||
MOVL(R8L, Mem{Base: dst}.Offset(15*4+off+576))
|
||||
SHRQ(Imm(32), R8)
|
||||
MOVL(R8L, Mem{Base: dst}.Offset(4*4+off+0))
|
||||
MOVL(R8L, Mem{Base: dst}.Offset(8*4+off+64))
|
||||
MOVL(R8L, Mem{Base: dst}.Offset(14*4+off+128))
|
||||
MOVL(R8L, Mem{Base: dst}.Offset(5*4+off+192))
|
||||
MOVL(R8L, Mem{Base: dst}.Offset(12*4+off+256))
|
||||
MOVL(R8L, Mem{Base: dst}.Offset(11*4+off+320))
|
||||
MOVL(R8L, Mem{Base: dst}.Offset(1*4+off+384))
|
||||
MOVL(R8L, Mem{Base: dst}.Offset(6*4+off+448))
|
||||
MOVL(R8L, Mem{Base: dst}.Offset(10*4+off+512))
|
||||
MOVL(R8L, Mem{Base: dst}.Offset(3*4+off+576))
|
||||
|
||||
MOVL(R9L, Mem{Base: dst}.Offset(1*4+off+0))
|
||||
MOVL(R9L, Mem{Base: dst}.Offset(13*4+off+64))
|
||||
MOVL(R9L, Mem{Base: dst}.Offset(6*4+off+128))
|
||||
MOVL(R9L, Mem{Base: dst}.Offset(8*4+off+192))
|
||||
MOVL(R9L, Mem{Base: dst}.Offset(2*4+off+256))
|
||||
MOVL(R9L, Mem{Base: dst}.Offset(0*4+off+320))
|
||||
MOVL(R9L, Mem{Base: dst}.Offset(14*4+off+384))
|
||||
MOVL(R9L, Mem{Base: dst}.Offset(11*4+off+448))
|
||||
MOVL(R9L, Mem{Base: dst}.Offset(12*4+off+512))
|
||||
MOVL(R9L, Mem{Base: dst}.Offset(4*4+off+576))
|
||||
SHRQ(Imm(32), R9)
|
||||
MOVL(R9L, Mem{Base: dst}.Offset(5*4+off+0))
|
||||
MOVL(R9L, Mem{Base: dst}.Offset(15*4+off+64))
|
||||
MOVL(R9L, Mem{Base: dst}.Offset(9*4+off+128))
|
||||
MOVL(R9L, Mem{Base: dst}.Offset(1*4+off+192))
|
||||
MOVL(R9L, Mem{Base: dst}.Offset(11*4+off+256))
|
||||
MOVL(R9L, Mem{Base: dst}.Offset(7*4+off+320))
|
||||
MOVL(R9L, Mem{Base: dst}.Offset(13*4+off+384))
|
||||
MOVL(R9L, Mem{Base: dst}.Offset(3*4+off+448))
|
||||
MOVL(R9L, Mem{Base: dst}.Offset(6*4+off+512))
|
||||
MOVL(R9L, Mem{Base: dst}.Offset(10*4+off+576))
|
||||
|
||||
MOVL(R10L, Mem{Base: dst}.Offset(2*4+off+0))
|
||||
MOVL(R10L, Mem{Base: dst}.Offset(1*4+off+64))
|
||||
MOVL(R10L, Mem{Base: dst}.Offset(15*4+off+128))
|
||||
MOVL(R10L, Mem{Base: dst}.Offset(10*4+off+192))
|
||||
MOVL(R10L, Mem{Base: dst}.Offset(6*4+off+256))
|
||||
MOVL(R10L, Mem{Base: dst}.Offset(8*4+off+320))
|
||||
MOVL(R10L, Mem{Base: dst}.Offset(3*4+off+384))
|
||||
MOVL(R10L, Mem{Base: dst}.Offset(13*4+off+448))
|
||||
MOVL(R10L, Mem{Base: dst}.Offset(14*4+off+512))
|
||||
MOVL(R10L, Mem{Base: dst}.Offset(5*4+off+576))
|
||||
SHRQ(Imm(32), R10)
|
||||
MOVL(R10L, Mem{Base: dst}.Offset(6*4+off+0))
|
||||
MOVL(R10L, Mem{Base: dst}.Offset(11*4+off+64))
|
||||
MOVL(R10L, Mem{Base: dst}.Offset(2*4+off+128))
|
||||
MOVL(R10L, Mem{Base: dst}.Offset(9*4+off+192))
|
||||
MOVL(R10L, Mem{Base: dst}.Offset(1*4+off+256))
|
||||
MOVL(R10L, Mem{Base: dst}.Offset(13*4+off+320))
|
||||
MOVL(R10L, Mem{Base: dst}.Offset(4*4+off+384))
|
||||
MOVL(R10L, Mem{Base: dst}.Offset(8*4+off+448))
|
||||
MOVL(R10L, Mem{Base: dst}.Offset(15*4+off+512))
|
||||
MOVL(R10L, Mem{Base: dst}.Offset(7*4+off+576))
|
||||
|
||||
MOVL(R11L, Mem{Base: dst}.Offset(3*4+off+0))
|
||||
MOVL(R11L, Mem{Base: dst}.Offset(7*4+off+64))
|
||||
MOVL(R11L, Mem{Base: dst}.Offset(13*4+off+128))
|
||||
MOVL(R11L, Mem{Base: dst}.Offset(12*4+off+192))
|
||||
MOVL(R11L, Mem{Base: dst}.Offset(10*4+off+256))
|
||||
MOVL(R11L, Mem{Base: dst}.Offset(1*4+off+320))
|
||||
MOVL(R11L, Mem{Base: dst}.Offset(9*4+off+384))
|
||||
MOVL(R11L, Mem{Base: dst}.Offset(14*4+off+448))
|
||||
MOVL(R11L, Mem{Base: dst}.Offset(0*4+off+512))
|
||||
MOVL(R11L, Mem{Base: dst}.Offset(6*4+off+576))
|
||||
SHRQ(Imm(32), R11)
|
||||
MOVL(R11L, Mem{Base: dst}.Offset(7*4+off+0))
|
||||
MOVL(R11L, Mem{Base: dst}.Offset(14*4+off+64))
|
||||
MOVL(R11L, Mem{Base: dst}.Offset(10*4+off+128))
|
||||
MOVL(R11L, Mem{Base: dst}.Offset(0*4+off+192))
|
||||
MOVL(R11L, Mem{Base: dst}.Offset(5*4+off+256))
|
||||
MOVL(R11L, Mem{Base: dst}.Offset(9*4+off+320))
|
||||
MOVL(R11L, Mem{Base: dst}.Offset(12*4+off+384))
|
||||
MOVL(R11L, Mem{Base: dst}.Offset(1*4+off+448))
|
||||
MOVL(R11L, Mem{Base: dst}.Offset(13*4+off+512))
|
||||
MOVL(R11L, Mem{Base: dst}.Offset(2*4+off+576))
|
||||
|
||||
MOVL(R12L, Mem{Base: dst}.Offset(8*4+off+0))
|
||||
MOVL(R12L, Mem{Base: dst}.Offset(5*4+off+64))
|
||||
MOVL(R12L, Mem{Base: dst}.Offset(4*4+off+128))
|
||||
MOVL(R12L, Mem{Base: dst}.Offset(15*4+off+192))
|
||||
MOVL(R12L, Mem{Base: dst}.Offset(14*4+off+256))
|
||||
MOVL(R12L, Mem{Base: dst}.Offset(3*4+off+320))
|
||||
MOVL(R12L, Mem{Base: dst}.Offset(11*4+off+384))
|
||||
MOVL(R12L, Mem{Base: dst}.Offset(10*4+off+448))
|
||||
MOVL(R12L, Mem{Base: dst}.Offset(7*4+off+512))
|
||||
MOVL(R12L, Mem{Base: dst}.Offset(1*4+off+576))
|
||||
SHRQ(Imm(32), R12)
|
||||
MOVL(R12L, Mem{Base: dst}.Offset(12*4+off+0))
|
||||
MOVL(R12L, Mem{Base: dst}.Offset(2*4+off+64))
|
||||
MOVL(R12L, Mem{Base: dst}.Offset(11*4+off+128))
|
||||
MOVL(R12L, Mem{Base: dst}.Offset(4*4+off+192))
|
||||
MOVL(R12L, Mem{Base: dst}.Offset(0*4+off+256))
|
||||
MOVL(R12L, Mem{Base: dst}.Offset(15*4+off+320))
|
||||
MOVL(R12L, Mem{Base: dst}.Offset(10*4+off+384))
|
||||
MOVL(R12L, Mem{Base: dst}.Offset(7*4+off+448))
|
||||
MOVL(R12L, Mem{Base: dst}.Offset(5*4+off+512))
|
||||
MOVL(R12L, Mem{Base: dst}.Offset(9*4+off+576))
|
||||
|
||||
MOVL(R13L, Mem{Base: dst}.Offset(9*4+off+0))
|
||||
MOVL(R13L, Mem{Base: dst}.Offset(4*4+off+64))
|
||||
MOVL(R13L, Mem{Base: dst}.Offset(8*4+off+128))
|
||||
MOVL(R13L, Mem{Base: dst}.Offset(13*4+off+192))
|
||||
MOVL(R13L, Mem{Base: dst}.Offset(3*4+off+256))
|
||||
MOVL(R13L, Mem{Base: dst}.Offset(5*4+off+320))
|
||||
MOVL(R13L, Mem{Base: dst}.Offset(7*4+off+384))
|
||||
MOVL(R13L, Mem{Base: dst}.Offset(15*4+off+448))
|
||||
MOVL(R13L, Mem{Base: dst}.Offset(11*4+off+512))
|
||||
MOVL(R13L, Mem{Base: dst}.Offset(0*4+off+576))
|
||||
SHRQ(Imm(32), R13)
|
||||
MOVL(R13L, Mem{Base: dst}.Offset(13*4+off+0))
|
||||
MOVL(R13L, Mem{Base: dst}.Offset(10*4+off+64))
|
||||
MOVL(R13L, Mem{Base: dst}.Offset(0*4+off+128))
|
||||
MOVL(R13L, Mem{Base: dst}.Offset(3*4+off+192))
|
||||
MOVL(R13L, Mem{Base: dst}.Offset(9*4+off+256))
|
||||
MOVL(R13L, Mem{Base: dst}.Offset(6*4+off+320))
|
||||
MOVL(R13L, Mem{Base: dst}.Offset(15*4+off+384))
|
||||
MOVL(R13L, Mem{Base: dst}.Offset(4*4+off+448))
|
||||
MOVL(R13L, Mem{Base: dst}.Offset(2*4+off+512))
|
||||
MOVL(R13L, Mem{Base: dst}.Offset(12*4+off+576))
|
||||
|
||||
MOVL(R14L, Mem{Base: dst}.Offset(10*4+off+0))
|
||||
MOVL(R14L, Mem{Base: dst}.Offset(12*4+off+64))
|
||||
MOVL(R14L, Mem{Base: dst}.Offset(1*4+off+128))
|
||||
MOVL(R14L, Mem{Base: dst}.Offset(6*4+off+192))
|
||||
MOVL(R14L, Mem{Base: dst}.Offset(13*4+off+256))
|
||||
MOVL(R14L, Mem{Base: dst}.Offset(4*4+off+320))
|
||||
MOVL(R14L, Mem{Base: dst}.Offset(0*4+off+384))
|
||||
MOVL(R14L, Mem{Base: dst}.Offset(2*4+off+448))
|
||||
MOVL(R14L, Mem{Base: dst}.Offset(8*4+off+512))
|
||||
MOVL(R14L, Mem{Base: dst}.Offset(14*4+off+576))
|
||||
SHRQ(Imm(32), R14)
|
||||
MOVL(R14L, Mem{Base: dst}.Offset(14*4+off+0))
|
||||
MOVL(R14L, Mem{Base: dst}.Offset(3*4+off+64))
|
||||
MOVL(R14L, Mem{Base: dst}.Offset(7*4+off+128))
|
||||
MOVL(R14L, Mem{Base: dst}.Offset(2*4+off+192))
|
||||
MOVL(R14L, Mem{Base: dst}.Offset(15*4+off+256))
|
||||
MOVL(R14L, Mem{Base: dst}.Offset(12*4+off+320))
|
||||
MOVL(R14L, Mem{Base: dst}.Offset(6*4+off+384))
|
||||
MOVL(R14L, Mem{Base: dst}.Offset(0*4+off+448))
|
||||
MOVL(R14L, Mem{Base: dst}.Offset(9*4+off+512))
|
||||
MOVL(R14L, Mem{Base: dst}.Offset(11*4+off+576))
|
||||
|
||||
MOVL(R15L, Mem{Base: dst}.Offset(11*4+off+0))
|
||||
MOVL(R15L, Mem{Base: dst}.Offset(0*4+off+64))
|
||||
MOVL(R15L, Mem{Base: dst}.Offset(12*4+off+128))
|
||||
MOVL(R15L, Mem{Base: dst}.Offset(7*4+off+192))
|
||||
MOVL(R15L, Mem{Base: dst}.Offset(8*4+off+256))
|
||||
MOVL(R15L, Mem{Base: dst}.Offset(14*4+off+320))
|
||||
MOVL(R15L, Mem{Base: dst}.Offset(2*4+off+384))
|
||||
MOVL(R15L, Mem{Base: dst}.Offset(5*4+off+448))
|
||||
MOVL(R15L, Mem{Base: dst}.Offset(1*4+off+512))
|
||||
MOVL(R15L, Mem{Base: dst}.Offset(13*4+off+576))
|
||||
SHRQ(Imm(32), R15)
|
||||
MOVL(R15L, Mem{Base: dst}.Offset(15*4+off+0))
|
||||
MOVL(R15L, Mem{Base: dst}.Offset(6*4+off+64))
|
||||
MOVL(R15L, Mem{Base: dst}.Offset(3*4+off+128))
|
||||
MOVL(R15L, Mem{Base: dst}.Offset(11*4+off+192))
|
||||
MOVL(R15L, Mem{Base: dst}.Offset(7*4+off+256))
|
||||
MOVL(R15L, Mem{Base: dst}.Offset(10*4+off+320))
|
||||
MOVL(R15L, Mem{Base: dst}.Offset(5*4+off+384))
|
||||
MOVL(R15L, Mem{Base: dst}.Offset(9*4+off+448))
|
||||
MOVL(R15L, Mem{Base: dst}.Offset(4*4+off+512))
|
||||
MOVL(R15L, Mem{Base: dst}.Offset(8*4+off+576))
|
||||
}
|
||||
|
||||
func BLAKE2s_SSE2() {
|
||||
PRECOMPUTE_MSG(BP, 16, SI, R8, R9, R10, R11, R12, R13, R14, R15)
|
||||
for i := 0; i < 10; i++ {
|
||||
ROUND_SSE2(X4, X5, X6, X7, Mem{Base: BP}.Offset(16+64*i), Mem{Base: BP}.Offset(32+64*i), Mem{Base: BP}.Offset(48+64*i), Mem{Base: BP}.Offset(64+64*i), X8)
|
||||
}
|
||||
}
|
||||
|
||||
func BLAKE2s_SSSE3() {
|
||||
PRECOMPUTE_MSG(BP, 16, SI, R8, R9, R10, R11, R12, R13, R14, R15)
|
||||
for i := 0; i < 10; i++ {
|
||||
ROUND_SSSE3(X4, X5, X6, X7, Mem{Base: BP}.Offset(16+64*i), Mem{Base: BP}.Offset(32+64*i), Mem{Base: BP}.Offset(48+64*i), Mem{Base: BP}.Offset(64+64*i), X8, X13, X14)
|
||||
}
|
||||
}
|
||||
|
||||
func BLAKE2s_SSE4() {
|
||||
LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 0, 2, 4, 6, 1, 3, 5, 7, 8, 10, 12, 14, 9, 11, 13, 15)
|
||||
ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14)
|
||||
LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 14, 4, 9, 13, 10, 8, 15, 6, 1, 0, 11, 5, 12, 2, 7, 3)
|
||||
ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14)
|
||||
LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 11, 12, 5, 15, 8, 0, 2, 13, 10, 3, 7, 9, 14, 6, 1, 4)
|
||||
ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14)
|
||||
LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 7, 3, 13, 11, 9, 1, 12, 14, 2, 5, 4, 15, 6, 10, 0, 8)
|
||||
ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14)
|
||||
LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 9, 5, 2, 10, 0, 7, 4, 15, 14, 11, 6, 3, 1, 12, 8, 13)
|
||||
ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14)
|
||||
LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 2, 6, 0, 8, 12, 10, 11, 3, 4, 7, 15, 1, 13, 5, 14, 9)
|
||||
ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14)
|
||||
LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 12, 1, 14, 4, 5, 15, 13, 10, 0, 6, 9, 8, 7, 3, 2, 11)
|
||||
ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14)
|
||||
LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 13, 7, 12, 3, 11, 14, 1, 9, 5, 15, 8, 2, 0, 4, 6, 10)
|
||||
ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14)
|
||||
LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 6, 14, 11, 0, 15, 9, 3, 8, 12, 13, 1, 10, 2, 7, 4, 5)
|
||||
ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14)
|
||||
LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 10, 8, 7, 1, 2, 4, 6, 5, 15, 9, 3, 13, 11, 14, 12, 0)
|
||||
ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14)
|
||||
}
|
||||
|
||||
func HASH_BLOCKS(h, c, flag, blocks_base, blocks_len Mem, BLAKE2s_FUNC func()) {
|
||||
MOVQ(h, RAX)
|
||||
MOVQ(c, RBX)
|
||||
MOVL(flag, ECX)
|
||||
MOVQ(blocks_base, RSI)
|
||||
MOVQ(blocks_len, RDX)
|
||||
|
||||
MOVQ(RSP, RBP)
|
||||
ADDQ(Imm(15), RBP)
|
||||
ANDQ(I32(^15), RBP)
|
||||
|
||||
MOVQ(Mem{Base: BX}.Offset(0), R9)
|
||||
MOVQ(R9, Mem{Base: BP}.Offset(0))
|
||||
MOVQ(RCX, Mem{Base: BP}.Offset(8))
|
||||
|
||||
MOVOU(Mem{Base: AX}.Offset(0), X0)
|
||||
MOVOU(Mem{Base: AX}.Offset(16), X1)
|
||||
|
||||
iv0 := iv0_DATA()
|
||||
iv1 := iv1_DATA()
|
||||
MOVOU(iv0, X2)
|
||||
MOVOU(iv1, X3)
|
||||
|
||||
counter := counter_DATA()
|
||||
rol16 := rol16_DATA()
|
||||
rol8 := rol8_DATA()
|
||||
MOVOU(counter, X12)
|
||||
MOVOU(rol16, X13)
|
||||
MOVOU(rol8, X14)
|
||||
MOVO(Mem{Base: BP}.Offset(0), X15)
|
||||
|
||||
Label("loop")
|
||||
MOVO(X0, X4)
|
||||
MOVO(X1, X5)
|
||||
MOVO(X2, X6)
|
||||
MOVO(X3, X7)
|
||||
|
||||
PADDQ(X12, X15)
|
||||
PXOR(X15, X7)
|
||||
|
||||
BLAKE2s_FUNC()
|
||||
|
||||
PXOR(X4, X0)
|
||||
PXOR(X5, X1)
|
||||
PXOR(X6, X0)
|
||||
PXOR(X7, X1)
|
||||
|
||||
LEAQ(Mem{Base: SI}.Offset(64), RSI)
|
||||
SUBQ(Imm(64), RDX)
|
||||
JNE(LabelRef("loop"))
|
||||
|
||||
MOVO(X15, Mem{Base: BP}.Offset(0))
|
||||
MOVQ(Mem{Base: BP}.Offset(0), R9)
|
||||
MOVQ(R9, Mem{Base: BX}.Offset(0))
|
||||
|
||||
MOVOU(X0, Mem{Base: AX}.Offset(0))
|
||||
MOVOU(X1, Mem{Base: AX}.Offset(16))
|
||||
}
|
||||
|
||||
func hashBlocksSSE2() {
|
||||
Implement("hashBlocksSSE2")
|
||||
Attributes(0)
|
||||
AllocLocal(672) // frame = 656 + 16 byte alignment
|
||||
|
||||
h := NewParamAddr("h", 0)
|
||||
c := NewParamAddr("c", 8)
|
||||
flag := NewParamAddr("flag", 16)
|
||||
blocks_base := NewParamAddr("blocks_base", 24)
|
||||
blocks_len := NewParamAddr("blocks_len", 32)
|
||||
|
||||
HASH_BLOCKS(h, c, flag, blocks_base, blocks_len, BLAKE2s_SSE2)
|
||||
RET()
|
||||
}
|
||||
|
||||
func hashBlocksSSSE3() {
|
||||
Implement("hashBlocksSSSE3")
|
||||
Attributes(0)
|
||||
AllocLocal(672) // frame = 656 + 16 byte alignment
|
||||
|
||||
h := NewParamAddr("h", 0)
|
||||
c := NewParamAddr("c", 8)
|
||||
flag := NewParamAddr("flag", 16)
|
||||
blocks_base := NewParamAddr("blocks_base", 24)
|
||||
blocks_len := NewParamAddr("blocks_len", 32)
|
||||
|
||||
HASH_BLOCKS(h, c, flag, blocks_base, blocks_len, BLAKE2s_SSSE3)
|
||||
RET()
|
||||
}
|
||||
|
||||
func hashBlocksSSE4() {
|
||||
Implement("hashBlocksSSE4")
|
||||
Attributes(0)
|
||||
AllocLocal(32) // frame = 16 + 16 byte alignment
|
||||
|
||||
h := NewParamAddr("h", 0)
|
||||
c := NewParamAddr("c", 8)
|
||||
flag := NewParamAddr("flag", 16)
|
||||
blocks_base := NewParamAddr("blocks_base", 24)
|
||||
blocks_len := NewParamAddr("blocks_len", 32)
|
||||
|
||||
HASH_BLOCKS(h, c, flag, blocks_base, blocks_len, BLAKE2s_SSE4)
|
||||
RET()
|
||||
}
|
||||
|
||||
// ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~DATA SECTION~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~##
|
||||
|
||||
var iv0_DATA_ptr, iv1_DATA_ptr, rol16_DATA_ptr, rol8_DATA_ptr, counter_DATA_ptr *Mem
|
||||
|
||||
func iv0_DATA() Mem {
|
||||
if iv0_DATA_ptr != nil {
|
||||
return *iv0_DATA_ptr
|
||||
}
|
||||
|
||||
iv0_DATA := GLOBL("iv0", NOPTR|RODATA)
|
||||
iv0_DATA_ptr = &iv0_DATA
|
||||
DATA(0x00, U32(0x6a09e667))
|
||||
DATA(0x04, U32(0xbb67ae85))
|
||||
DATA(0x08, U32(0x3c6ef372))
|
||||
DATA(0x0c, U32(0xa54ff53a))
|
||||
return iv0_DATA
|
||||
}
|
||||
|
||||
func iv1_DATA() Mem {
|
||||
if iv1_DATA_ptr != nil {
|
||||
return *iv1_DATA_ptr
|
||||
}
|
||||
|
||||
iv1_DATA := GLOBL("iv1", NOPTR|RODATA)
|
||||
iv1_DATA_ptr = &iv1_DATA
|
||||
DATA(0x00, U32(0x510e527f))
|
||||
DATA(0x04, U32(0x9b05688c))
|
||||
DATA(0x08, U32(0x1f83d9ab))
|
||||
DATA(0x0c, U32(0x5be0cd19))
|
||||
return iv1_DATA
|
||||
}
|
||||
|
||||
func rol16_DATA() Mem {
|
||||
if rol16_DATA_ptr != nil {
|
||||
return *rol16_DATA_ptr
|
||||
}
|
||||
|
||||
rol16_DATA := GLOBL("rol16", NOPTR|RODATA)
|
||||
rol16_DATA_ptr = &rol16_DATA
|
||||
DATA(0x00, U64(0x0504070601000302))
|
||||
DATA(0x08, U64(0x0D0C0F0E09080B0A))
|
||||
return rol16_DATA
|
||||
}
|
||||
|
||||
func rol8_DATA() Mem {
|
||||
if rol8_DATA_ptr != nil {
|
||||
return *rol8_DATA_ptr
|
||||
}
|
||||
|
||||
rol8_DATA := GLOBL("rol8", NOPTR|RODATA)
|
||||
rol8_DATA_ptr = &rol8_DATA
|
||||
DATA(0x00, U64(0x0407060500030201))
|
||||
DATA(0x08, U64(0x0C0F0E0D080B0A09))
|
||||
return rol8_DATA
|
||||
}
|
||||
|
||||
func counter_DATA() Mem {
|
||||
if counter_DATA_ptr != nil {
|
||||
return *counter_DATA_ptr
|
||||
}
|
||||
|
||||
counter_DATA := GLOBL("counter", NOPTR|RODATA)
|
||||
counter_DATA_ptr = &counter_DATA
|
||||
DATA(0x00, U64(0x0000000000000040))
|
||||
DATA(0x08, U64(0x0000000000000000))
|
||||
return counter_DATA
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
module blake2s/_asm
|
||||
|
||||
go 1.23
|
||||
|
||||
require (
|
||||
github.com/mmcloughlin/avo v0.6.0
|
||||
golang.org/x/crypto v0.26.0
|
||||
)
|
||||
|
||||
require (
|
||||
golang.org/x/mod v0.20.0 // indirect
|
||||
golang.org/x/sync v0.8.0 // indirect
|
||||
golang.org/x/sys v0.24.0 // indirect
|
||||
golang.org/x/tools v0.24.0 // indirect
|
||||
)
|
||||
@@ -0,0 +1,12 @@
|
||||
github.com/mmcloughlin/avo v0.6.0 h1:QH6FU8SKoTLaVs80GA8TJuLNkUYl4VokHKlPhVDg4YY=
|
||||
github.com/mmcloughlin/avo v0.6.0/go.mod h1:8CoAGaCSYXtCPR+8y18Y9aB/kxb8JSS6FRI7mSkvD+8=
|
||||
golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
|
||||
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
|
||||
golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
|
||||
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
|
||||
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
|
||||
golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
|
||||
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
|
||||
+2160
-419
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -5,7 +5,7 @@
|
||||
package bn256
|
||||
|
||||
// For details of the algorithms used, see "Multiplication and Squaring on
|
||||
// Pairing-Friendly Fields, Devegili et al.
|
||||
// Pairing-Friendly Fields", Devegili et al.
|
||||
// http://eprint.iacr.org/2006/471.pdf.
|
||||
|
||||
import (
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
package bn256
|
||||
|
||||
// For details of the algorithms used, see "Multiplication and Squaring on
|
||||
// Pairing-Friendly Fields, Devegili et al.
|
||||
// Pairing-Friendly Fields", Devegili et al.
|
||||
// http://eprint.iacr.org/2006/471.pdf.
|
||||
|
||||
import (
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
package bn256
|
||||
|
||||
// For details of the algorithms used, see "Multiplication and Squaring on
|
||||
// Pairing-Friendly Fields, Devegili et al.
|
||||
// Pairing-Friendly Fields", Devegili et al.
|
||||
// http://eprint.iacr.org/2006/471.pdf.
|
||||
|
||||
import (
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
//go:build (!arm64 && !s390x && !ppc64le) || !gc || purego
|
||||
//go:build (!arm64 && !s390x && !ppc64 && !ppc64le) || !gc || purego
|
||||
|
||||
package chacha20
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
//go:build gc && !purego
|
||||
//go:build gc && !purego && (ppc64 || ppc64le)
|
||||
|
||||
package chacha20
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
// The differences in this and the original implementation are
|
||||
// due to the calling conventions and initialization of constants.
|
||||
|
||||
//go:build gc && !purego
|
||||
//go:build gc && !purego && (ppc64 || ppc64le)
|
||||
|
||||
#include "textflag.h"
|
||||
|
||||
@@ -36,32 +36,68 @@
|
||||
// for VPERMXOR
|
||||
#define MASK R18
|
||||
|
||||
DATA consts<>+0x00(SB)/8, $0x3320646e61707865
|
||||
DATA consts<>+0x08(SB)/8, $0x6b20657479622d32
|
||||
DATA consts<>+0x10(SB)/8, $0x0000000000000001
|
||||
DATA consts<>+0x18(SB)/8, $0x0000000000000000
|
||||
DATA consts<>+0x20(SB)/8, $0x0000000000000004
|
||||
DATA consts<>+0x28(SB)/8, $0x0000000000000000
|
||||
DATA consts<>+0x30(SB)/8, $0x0a0b08090e0f0c0d
|
||||
DATA consts<>+0x38(SB)/8, $0x0203000106070405
|
||||
DATA consts<>+0x40(SB)/8, $0x090a0b080d0e0f0c
|
||||
DATA consts<>+0x48(SB)/8, $0x0102030005060704
|
||||
DATA consts<>+0x50(SB)/8, $0x6170786561707865
|
||||
DATA consts<>+0x58(SB)/8, $0x6170786561707865
|
||||
DATA consts<>+0x60(SB)/8, $0x3320646e3320646e
|
||||
DATA consts<>+0x68(SB)/8, $0x3320646e3320646e
|
||||
DATA consts<>+0x70(SB)/8, $0x79622d3279622d32
|
||||
DATA consts<>+0x78(SB)/8, $0x79622d3279622d32
|
||||
DATA consts<>+0x80(SB)/8, $0x6b2065746b206574
|
||||
DATA consts<>+0x88(SB)/8, $0x6b2065746b206574
|
||||
DATA consts<>+0x90(SB)/8, $0x0000000100000000
|
||||
DATA consts<>+0x98(SB)/8, $0x0000000300000002
|
||||
DATA consts<>+0xa0(SB)/8, $0x5566774411223300
|
||||
DATA consts<>+0xa8(SB)/8, $0xddeeffcc99aabb88
|
||||
DATA consts<>+0xb0(SB)/8, $0x6677445522330011
|
||||
DATA consts<>+0xb8(SB)/8, $0xeeffccddaabb8899
|
||||
DATA consts<>+0x00(SB)/4, $0x61707865
|
||||
DATA consts<>+0x04(SB)/4, $0x3320646e
|
||||
DATA consts<>+0x08(SB)/4, $0x79622d32
|
||||
DATA consts<>+0x0c(SB)/4, $0x6b206574
|
||||
DATA consts<>+0x10(SB)/4, $0x00000001
|
||||
DATA consts<>+0x14(SB)/4, $0x00000000
|
||||
DATA consts<>+0x18(SB)/4, $0x00000000
|
||||
DATA consts<>+0x1c(SB)/4, $0x00000000
|
||||
DATA consts<>+0x20(SB)/4, $0x00000004
|
||||
DATA consts<>+0x24(SB)/4, $0x00000000
|
||||
DATA consts<>+0x28(SB)/4, $0x00000000
|
||||
DATA consts<>+0x2c(SB)/4, $0x00000000
|
||||
DATA consts<>+0x30(SB)/4, $0x0e0f0c0d
|
||||
DATA consts<>+0x34(SB)/4, $0x0a0b0809
|
||||
DATA consts<>+0x38(SB)/4, $0x06070405
|
||||
DATA consts<>+0x3c(SB)/4, $0x02030001
|
||||
DATA consts<>+0x40(SB)/4, $0x0d0e0f0c
|
||||
DATA consts<>+0x44(SB)/4, $0x090a0b08
|
||||
DATA consts<>+0x48(SB)/4, $0x05060704
|
||||
DATA consts<>+0x4c(SB)/4, $0x01020300
|
||||
DATA consts<>+0x50(SB)/4, $0x61707865
|
||||
DATA consts<>+0x54(SB)/4, $0x61707865
|
||||
DATA consts<>+0x58(SB)/4, $0x61707865
|
||||
DATA consts<>+0x5c(SB)/4, $0x61707865
|
||||
DATA consts<>+0x60(SB)/4, $0x3320646e
|
||||
DATA consts<>+0x64(SB)/4, $0x3320646e
|
||||
DATA consts<>+0x68(SB)/4, $0x3320646e
|
||||
DATA consts<>+0x6c(SB)/4, $0x3320646e
|
||||
DATA consts<>+0x70(SB)/4, $0x79622d32
|
||||
DATA consts<>+0x74(SB)/4, $0x79622d32
|
||||
DATA consts<>+0x78(SB)/4, $0x79622d32
|
||||
DATA consts<>+0x7c(SB)/4, $0x79622d32
|
||||
DATA consts<>+0x80(SB)/4, $0x6b206574
|
||||
DATA consts<>+0x84(SB)/4, $0x6b206574
|
||||
DATA consts<>+0x88(SB)/4, $0x6b206574
|
||||
DATA consts<>+0x8c(SB)/4, $0x6b206574
|
||||
DATA consts<>+0x90(SB)/4, $0x00000000
|
||||
DATA consts<>+0x94(SB)/4, $0x00000001
|
||||
DATA consts<>+0x98(SB)/4, $0x00000002
|
||||
DATA consts<>+0x9c(SB)/4, $0x00000003
|
||||
DATA consts<>+0xa0(SB)/4, $0x11223300
|
||||
DATA consts<>+0xa4(SB)/4, $0x55667744
|
||||
DATA consts<>+0xa8(SB)/4, $0x99aabb88
|
||||
DATA consts<>+0xac(SB)/4, $0xddeeffcc
|
||||
DATA consts<>+0xb0(SB)/4, $0x22330011
|
||||
DATA consts<>+0xb4(SB)/4, $0x66774455
|
||||
DATA consts<>+0xb8(SB)/4, $0xaabb8899
|
||||
DATA consts<>+0xbc(SB)/4, $0xeeffccdd
|
||||
GLOBL consts<>(SB), RODATA, $0xc0
|
||||
|
||||
#ifdef GOARCH_ppc64
|
||||
#define BE_XXBRW_INIT() \
|
||||
LVSL (R0)(R0), V24 \
|
||||
VSPLTISB $3, V25 \
|
||||
VXOR V24, V25, V24 \
|
||||
|
||||
#define BE_XXBRW(vr) VPERM vr, vr, V24, vr
|
||||
#else
|
||||
#define BE_XXBRW_INIT()
|
||||
#define BE_XXBRW(vr)
|
||||
#endif
|
||||
|
||||
//func chaCha20_ctr32_vsx(out, inp *byte, len int, key *[8]uint32, counter *uint32)
|
||||
TEXT ·chaCha20_ctr32_vsx(SB),NOSPLIT,$64-40
|
||||
MOVD out+0(FP), OUT
|
||||
@@ -94,6 +130,8 @@ TEXT ·chaCha20_ctr32_vsx(SB),NOSPLIT,$64-40
|
||||
// Clear V27
|
||||
VXOR V27, V27, V27
|
||||
|
||||
BE_XXBRW_INIT()
|
||||
|
||||
// V28
|
||||
LXVW4X (CONSTBASE)(R11), VS60
|
||||
|
||||
@@ -299,6 +337,11 @@ loop_vsx:
|
||||
VADDUWM V8, V18, V8
|
||||
VADDUWM V12, V19, V12
|
||||
|
||||
BE_XXBRW(V0)
|
||||
BE_XXBRW(V4)
|
||||
BE_XXBRW(V8)
|
||||
BE_XXBRW(V12)
|
||||
|
||||
CMPU LEN, $64
|
||||
BLT tail_vsx
|
||||
|
||||
@@ -327,6 +370,11 @@ loop_vsx:
|
||||
VADDUWM V9, V18, V8
|
||||
VADDUWM V13, V19, V12
|
||||
|
||||
BE_XXBRW(V0)
|
||||
BE_XXBRW(V4)
|
||||
BE_XXBRW(V8)
|
||||
BE_XXBRW(V12)
|
||||
|
||||
CMPU LEN, $64
|
||||
BLT tail_vsx
|
||||
|
||||
@@ -334,8 +382,8 @@ loop_vsx:
|
||||
LXVW4X (INP)(R8), VS60
|
||||
LXVW4X (INP)(R9), VS61
|
||||
LXVW4X (INP)(R10), VS62
|
||||
VXOR V27, V0, V27
|
||||
|
||||
VXOR V27, V0, V27
|
||||
VXOR V28, V4, V28
|
||||
VXOR V29, V8, V29
|
||||
VXOR V30, V12, V30
|
||||
@@ -354,6 +402,11 @@ loop_vsx:
|
||||
VADDUWM V10, V18, V8
|
||||
VADDUWM V14, V19, V12
|
||||
|
||||
BE_XXBRW(V0)
|
||||
BE_XXBRW(V4)
|
||||
BE_XXBRW(V8)
|
||||
BE_XXBRW(V12)
|
||||
|
||||
CMPU LEN, $64
|
||||
BLT tail_vsx
|
||||
|
||||
@@ -381,6 +434,11 @@ loop_vsx:
|
||||
VADDUWM V11, V18, V8
|
||||
VADDUWM V15, V19, V12
|
||||
|
||||
BE_XXBRW(V0)
|
||||
BE_XXBRW(V4)
|
||||
BE_XXBRW(V8)
|
||||
BE_XXBRW(V12)
|
||||
|
||||
CMPU LEN, $64
|
||||
BLT tail_vsx
|
||||
|
||||
@@ -408,9 +466,9 @@ loop_vsx:
|
||||
|
||||
done_vsx:
|
||||
// Increment counter by number of 64 byte blocks
|
||||
MOVD (CNT), R14
|
||||
MOVWZ (CNT), R14
|
||||
ADD BLOCKS, R14
|
||||
MOVD R14, (CNT)
|
||||
MOVWZ R14, (CNT)
|
||||
RET
|
||||
|
||||
tail_vsx:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,15 @@
|
||||
module chacha20poly1305/_asm
|
||||
|
||||
go 1.23
|
||||
|
||||
require (
|
||||
github.com/mmcloughlin/avo v0.6.0
|
||||
golang.org/x/crypto v0.26.0
|
||||
)
|
||||
|
||||
require (
|
||||
golang.org/x/mod v0.20.0 // indirect
|
||||
golang.org/x/sync v0.8.0 // indirect
|
||||
golang.org/x/sys v0.24.0 // indirect
|
||||
golang.org/x/tools v0.24.0 // indirect
|
||||
)
|
||||
@@ -0,0 +1,12 @@
|
||||
github.com/mmcloughlin/avo v0.6.0 h1:QH6FU8SKoTLaVs80GA8TJuLNkUYl4VokHKlPhVDg4YY=
|
||||
github.com/mmcloughlin/avo v0.6.0/go.mod h1:8CoAGaCSYXtCPR+8y18Y9aB/kxb8JSS6FRI7mSkvD+8=
|
||||
golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
|
||||
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
|
||||
golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
|
||||
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
|
||||
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
|
||||
golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
|
||||
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
|
||||
+9270
-2223
File diff suppressed because it is too large
Load Diff
@@ -4,8 +4,8 @@ go 1.20
|
||||
|
||||
require (
|
||||
golang.org/x/net v0.21.0 // tagx:ignore
|
||||
golang.org/x/sys v0.23.0
|
||||
golang.org/x/term v0.23.0
|
||||
golang.org/x/sys v0.28.0
|
||||
golang.org/x/term v0.27.0
|
||||
)
|
||||
|
||||
require golang.org/x/text v0.17.0 // indirect
|
||||
require golang.org/x/text v0.21.0 // indirect
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
|
||||
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
|
||||
golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM=
|
||||
golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU=
|
||||
golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk=
|
||||
golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
|
||||
golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
|
||||
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
|
||||
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
|
||||
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
|
||||
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
|
||||
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
module internal/poly1305/_asm
|
||||
|
||||
go 1.23
|
||||
|
||||
require (
|
||||
github.com/mmcloughlin/avo v0.6.0
|
||||
golang.org/x/crypto v0.26.0
|
||||
)
|
||||
|
||||
require (
|
||||
golang.org/x/mod v0.20.0 // indirect
|
||||
golang.org/x/sync v0.8.0 // indirect
|
||||
golang.org/x/sys v0.24.0 // indirect
|
||||
golang.org/x/tools v0.24.0 // indirect
|
||||
)
|
||||
@@ -0,0 +1,12 @@
|
||||
github.com/mmcloughlin/avo v0.6.0 h1:QH6FU8SKoTLaVs80GA8TJuLNkUYl4VokHKlPhVDg4YY=
|
||||
github.com/mmcloughlin/avo v0.6.0/go.mod h1:8CoAGaCSYXtCPR+8y18Y9aB/kxb8JSS6FRI7mSkvD+8=
|
||||
golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
|
||||
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
|
||||
golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
|
||||
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
|
||||
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
|
||||
golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
|
||||
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
|
||||
@@ -0,0 +1,126 @@
|
||||
// Copyright 2024 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 (
|
||||
. "github.com/mmcloughlin/avo/build"
|
||||
. "github.com/mmcloughlin/avo/operand"
|
||||
. "github.com/mmcloughlin/avo/reg"
|
||||
_ "golang.org/x/crypto/sha3"
|
||||
)
|
||||
|
||||
//go:generate go run . -out ../sum_amd64.s -pkg poly1305
|
||||
|
||||
func main() {
|
||||
Package("golang.org/x/crypto/internal/poly1305")
|
||||
ConstraintExpr("gc,!purego")
|
||||
update()
|
||||
Generate()
|
||||
}
|
||||
|
||||
func update() {
|
||||
Implement("update")
|
||||
|
||||
Load(Param("state"), RDI)
|
||||
MOVQ(NewParamAddr("msg_base", 8), RSI)
|
||||
MOVQ(NewParamAddr("msg_len", 16), R15)
|
||||
|
||||
MOVQ(Mem{Base: DI}.Offset(0), R8) // h0
|
||||
MOVQ(Mem{Base: DI}.Offset(8), R9) // h1
|
||||
MOVQ(Mem{Base: DI}.Offset(16), R10) // h2
|
||||
MOVQ(Mem{Base: DI}.Offset(24), R11) // r0
|
||||
MOVQ(Mem{Base: DI}.Offset(32), R12) // r1
|
||||
|
||||
CMPQ(R15, Imm(16))
|
||||
JB(LabelRef("bytes_between_0_and_15"))
|
||||
|
||||
Label("loop")
|
||||
POLY1305_ADD(RSI, R8, R9, R10)
|
||||
|
||||
Label("multiply")
|
||||
POLY1305_MUL(R8, R9, R10, R11, R12, RBX, RCX, R13, R14)
|
||||
SUBQ(Imm(16), R15)
|
||||
CMPQ(R15, Imm(16))
|
||||
JAE(LabelRef("loop"))
|
||||
|
||||
Label("bytes_between_0_and_15")
|
||||
TESTQ(R15, R15)
|
||||
JZ(LabelRef("done"))
|
||||
MOVQ(U32(1), RBX)
|
||||
XORQ(RCX, RCX)
|
||||
XORQ(R13, R13)
|
||||
ADDQ(R15, RSI)
|
||||
|
||||
Label("flush_buffer")
|
||||
SHLQ(Imm(8), RBX, RCX)
|
||||
SHLQ(Imm(8), RBX)
|
||||
MOVB(Mem{Base: SI}.Offset(-1), R13B)
|
||||
XORQ(R13, RBX)
|
||||
DECQ(RSI)
|
||||
DECQ(R15)
|
||||
JNZ(LabelRef("flush_buffer"))
|
||||
|
||||
ADDQ(RBX, R8)
|
||||
ADCQ(RCX, R9)
|
||||
ADCQ(Imm(0), R10)
|
||||
MOVQ(U32(16), R15)
|
||||
JMP(LabelRef("multiply"))
|
||||
|
||||
Label("done")
|
||||
MOVQ(R8, Mem{Base: DI}.Offset(0))
|
||||
MOVQ(R9, Mem{Base: DI}.Offset(8))
|
||||
MOVQ(R10, Mem{Base: DI}.Offset(16))
|
||||
RET()
|
||||
}
|
||||
|
||||
func POLY1305_ADD(msg, h0, h1, h2 GPPhysical) {
|
||||
ADDQ(Mem{Base: msg}.Offset(0), h0)
|
||||
ADCQ(Mem{Base: msg}.Offset(8), h1)
|
||||
ADCQ(Imm(1), h2)
|
||||
LEAQ(Mem{Base: msg}.Offset(16), msg)
|
||||
}
|
||||
|
||||
func POLY1305_MUL(h0, h1, h2, r0, r1, t0, t1, t2, t3 GPPhysical) {
|
||||
MOVQ(r0, RAX)
|
||||
MULQ(h0)
|
||||
MOVQ(RAX, t0)
|
||||
MOVQ(RDX, t1)
|
||||
MOVQ(r0, RAX)
|
||||
MULQ(h1)
|
||||
ADDQ(RAX, t1)
|
||||
ADCQ(Imm(0), RDX)
|
||||
MOVQ(r0, t2)
|
||||
IMULQ(h2, t2)
|
||||
ADDQ(RDX, t2)
|
||||
|
||||
MOVQ(r1, RAX)
|
||||
MULQ(h0)
|
||||
ADDQ(RAX, t1)
|
||||
ADCQ(Imm(0), RDX)
|
||||
MOVQ(RDX, h0)
|
||||
MOVQ(r1, t3)
|
||||
IMULQ(h2, t3)
|
||||
MOVQ(r1, RAX)
|
||||
MULQ(h1)
|
||||
ADDQ(RAX, t2)
|
||||
ADCQ(RDX, t3)
|
||||
ADDQ(h0, t2)
|
||||
ADCQ(Imm(0), t3)
|
||||
|
||||
MOVQ(t0, h0)
|
||||
MOVQ(t1, h1)
|
||||
MOVQ(t2, h2)
|
||||
ANDQ(Imm(3), h2)
|
||||
MOVQ(t2, t0)
|
||||
ANDQ(I32(-4), t0)
|
||||
ADDQ(t0, h0)
|
||||
ADCQ(t3, h1)
|
||||
ADCQ(Imm(0), h2)
|
||||
SHRQ(Imm(2), t3, t2)
|
||||
SHRQ(Imm(2), t3)
|
||||
ADDQ(t2, h0)
|
||||
ADCQ(t3, h1)
|
||||
ADCQ(Imm(0), h2)
|
||||
}
|
||||
@@ -2,7 +2,7 @@
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
//go:build (!amd64 && !ppc64le && !s390x) || !gc || purego
|
||||
//go:build (!amd64 && !ppc64le && !ppc64 && !s390x) || !gc || purego
|
||||
|
||||
package poly1305
|
||||
|
||||
|
||||
@@ -1,108 +1,93 @@
|
||||
// Copyright 2012 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.
|
||||
// Code generated by command: go run sum_amd64_asm.go -out ../sum_amd64.s -pkg poly1305. DO NOT EDIT.
|
||||
|
||||
//go:build gc && !purego
|
||||
|
||||
#include "textflag.h"
|
||||
|
||||
#define POLY1305_ADD(msg, h0, h1, h2) \
|
||||
ADDQ 0(msg), h0; \
|
||||
ADCQ 8(msg), h1; \
|
||||
ADCQ $1, h2; \
|
||||
LEAQ 16(msg), msg
|
||||
|
||||
#define POLY1305_MUL(h0, h1, h2, r0, r1, t0, t1, t2, t3) \
|
||||
MOVQ r0, AX; \
|
||||
MULQ h0; \
|
||||
MOVQ AX, t0; \
|
||||
MOVQ DX, t1; \
|
||||
MOVQ r0, AX; \
|
||||
MULQ h1; \
|
||||
ADDQ AX, t1; \
|
||||
ADCQ $0, DX; \
|
||||
MOVQ r0, t2; \
|
||||
IMULQ h2, t2; \
|
||||
ADDQ DX, t2; \
|
||||
\
|
||||
MOVQ r1, AX; \
|
||||
MULQ h0; \
|
||||
ADDQ AX, t1; \
|
||||
ADCQ $0, DX; \
|
||||
MOVQ DX, h0; \
|
||||
MOVQ r1, t3; \
|
||||
IMULQ h2, t3; \
|
||||
MOVQ r1, AX; \
|
||||
MULQ h1; \
|
||||
ADDQ AX, t2; \
|
||||
ADCQ DX, t3; \
|
||||
ADDQ h0, t2; \
|
||||
ADCQ $0, t3; \
|
||||
\
|
||||
MOVQ t0, h0; \
|
||||
MOVQ t1, h1; \
|
||||
MOVQ t2, h2; \
|
||||
ANDQ $3, h2; \
|
||||
MOVQ t2, t0; \
|
||||
ANDQ $0xFFFFFFFFFFFFFFFC, t0; \
|
||||
ADDQ t0, h0; \
|
||||
ADCQ t3, h1; \
|
||||
ADCQ $0, h2; \
|
||||
SHRQ $2, t3, t2; \
|
||||
SHRQ $2, t3; \
|
||||
ADDQ t2, h0; \
|
||||
ADCQ t3, h1; \
|
||||
ADCQ $0, h2
|
||||
|
||||
// func update(state *[7]uint64, msg []byte)
|
||||
// func update(state *macState, msg []byte)
|
||||
TEXT ·update(SB), $0-32
|
||||
MOVQ state+0(FP), DI
|
||||
MOVQ msg_base+8(FP), SI
|
||||
MOVQ msg_len+16(FP), R15
|
||||
|
||||
MOVQ 0(DI), R8 // h0
|
||||
MOVQ 8(DI), R9 // h1
|
||||
MOVQ 16(DI), R10 // h2
|
||||
MOVQ 24(DI), R11 // r0
|
||||
MOVQ 32(DI), R12 // r1
|
||||
|
||||
CMPQ R15, $16
|
||||
MOVQ (DI), R8
|
||||
MOVQ 8(DI), R9
|
||||
MOVQ 16(DI), R10
|
||||
MOVQ 24(DI), R11
|
||||
MOVQ 32(DI), R12
|
||||
CMPQ R15, $0x10
|
||||
JB bytes_between_0_and_15
|
||||
|
||||
loop:
|
||||
POLY1305_ADD(SI, R8, R9, R10)
|
||||
ADDQ (SI), R8
|
||||
ADCQ 8(SI), R9
|
||||
ADCQ $0x01, R10
|
||||
LEAQ 16(SI), SI
|
||||
|
||||
multiply:
|
||||
POLY1305_MUL(R8, R9, R10, R11, R12, BX, CX, R13, R14)
|
||||
SUBQ $16, R15
|
||||
CMPQ R15, $16
|
||||
JAE loop
|
||||
MOVQ R11, AX
|
||||
MULQ R8
|
||||
MOVQ AX, BX
|
||||
MOVQ DX, CX
|
||||
MOVQ R11, AX
|
||||
MULQ R9
|
||||
ADDQ AX, CX
|
||||
ADCQ $0x00, DX
|
||||
MOVQ R11, R13
|
||||
IMULQ R10, R13
|
||||
ADDQ DX, R13
|
||||
MOVQ R12, AX
|
||||
MULQ R8
|
||||
ADDQ AX, CX
|
||||
ADCQ $0x00, DX
|
||||
MOVQ DX, R8
|
||||
MOVQ R12, R14
|
||||
IMULQ R10, R14
|
||||
MOVQ R12, AX
|
||||
MULQ R9
|
||||
ADDQ AX, R13
|
||||
ADCQ DX, R14
|
||||
ADDQ R8, R13
|
||||
ADCQ $0x00, R14
|
||||
MOVQ BX, R8
|
||||
MOVQ CX, R9
|
||||
MOVQ R13, R10
|
||||
ANDQ $0x03, R10
|
||||
MOVQ R13, BX
|
||||
ANDQ $-4, BX
|
||||
ADDQ BX, R8
|
||||
ADCQ R14, R9
|
||||
ADCQ $0x00, R10
|
||||
SHRQ $0x02, R14, R13
|
||||
SHRQ $0x02, R14
|
||||
ADDQ R13, R8
|
||||
ADCQ R14, R9
|
||||
ADCQ $0x00, R10
|
||||
SUBQ $0x10, R15
|
||||
CMPQ R15, $0x10
|
||||
JAE loop
|
||||
|
||||
bytes_between_0_and_15:
|
||||
TESTQ R15, R15
|
||||
JZ done
|
||||
MOVQ $1, BX
|
||||
MOVQ $0x00000001, BX
|
||||
XORQ CX, CX
|
||||
XORQ R13, R13
|
||||
ADDQ R15, SI
|
||||
|
||||
flush_buffer:
|
||||
SHLQ $8, BX, CX
|
||||
SHLQ $8, BX
|
||||
SHLQ $0x08, BX, CX
|
||||
SHLQ $0x08, BX
|
||||
MOVB -1(SI), R13
|
||||
XORQ R13, BX
|
||||
DECQ SI
|
||||
DECQ R15
|
||||
JNZ flush_buffer
|
||||
|
||||
ADDQ BX, R8
|
||||
ADCQ CX, R9
|
||||
ADCQ $0, R10
|
||||
MOVQ $16, R15
|
||||
ADCQ $0x00, R10
|
||||
MOVQ $0x00000010, R15
|
||||
JMP multiply
|
||||
|
||||
done:
|
||||
MOVQ R8, 0(DI)
|
||||
MOVQ R8, (DI)
|
||||
MOVQ R9, 8(DI)
|
||||
MOVQ R10, 16(DI)
|
||||
RET
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
//go:build gc && !purego
|
||||
//go:build gc && !purego && (ppc64 || ppc64le)
|
||||
|
||||
package poly1305
|
||||
|
||||
@@ -2,15 +2,25 @@
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
//go:build gc && !purego
|
||||
//go:build gc && !purego && (ppc64 || ppc64le)
|
||||
|
||||
#include "textflag.h"
|
||||
|
||||
// This was ported from the amd64 implementation.
|
||||
|
||||
#ifdef GOARCH_ppc64le
|
||||
#define LE_MOVD MOVD
|
||||
#define LE_MOVWZ MOVWZ
|
||||
#define LE_MOVHZ MOVHZ
|
||||
#else
|
||||
#define LE_MOVD MOVDBR
|
||||
#define LE_MOVWZ MOVWBR
|
||||
#define LE_MOVHZ MOVHBR
|
||||
#endif
|
||||
|
||||
#define POLY1305_ADD(msg, h0, h1, h2, t0, t1, t2) \
|
||||
MOVD (msg), t0; \
|
||||
MOVD 8(msg), t1; \
|
||||
LE_MOVD (msg)( R0), t0; \
|
||||
LE_MOVD (msg)(R24), t1; \
|
||||
MOVD $1, t2; \
|
||||
ADDC t0, h0, h0; \
|
||||
ADDE t1, h1, h1; \
|
||||
@@ -50,10 +60,6 @@
|
||||
ADDE t3, h1, h1; \
|
||||
ADDZE h2
|
||||
|
||||
DATA ·poly1305Mask<>+0x00(SB)/8, $0x0FFFFFFC0FFFFFFF
|
||||
DATA ·poly1305Mask<>+0x08(SB)/8, $0x0FFFFFFC0FFFFFFC
|
||||
GLOBL ·poly1305Mask<>(SB), RODATA, $16
|
||||
|
||||
// func update(state *[7]uint64, msg []byte)
|
||||
TEXT ·update(SB), $0-32
|
||||
MOVD state+0(FP), R3
|
||||
@@ -66,6 +72,8 @@ TEXT ·update(SB), $0-32
|
||||
MOVD 24(R3), R11 // r0
|
||||
MOVD 32(R3), R12 // r1
|
||||
|
||||
MOVD $8, R24
|
||||
|
||||
CMP R5, $16
|
||||
BLT bytes_between_0_and_15
|
||||
|
||||
@@ -94,7 +102,7 @@ flush_buffer:
|
||||
|
||||
// Greater than 8 -- load the rightmost remaining bytes in msg
|
||||
// and put into R17 (h1)
|
||||
MOVD (R4)(R21), R17
|
||||
LE_MOVD (R4)(R21), R17
|
||||
MOVD $16, R22
|
||||
|
||||
// Find the offset to those bytes
|
||||
@@ -118,7 +126,7 @@ just1:
|
||||
BLT less8
|
||||
|
||||
// Exactly 8
|
||||
MOVD (R4), R16
|
||||
LE_MOVD (R4), R16
|
||||
|
||||
CMP R17, $0
|
||||
|
||||
@@ -133,7 +141,7 @@ less8:
|
||||
MOVD $0, R22 // shift count
|
||||
CMP R5, $4
|
||||
BLT less4
|
||||
MOVWZ (R4), R16
|
||||
LE_MOVWZ (R4), R16
|
||||
ADD $4, R4
|
||||
ADD $-4, R5
|
||||
MOVD $32, R22
|
||||
@@ -141,7 +149,7 @@ less8:
|
||||
less4:
|
||||
CMP R5, $2
|
||||
BLT less2
|
||||
MOVHZ (R4), R21
|
||||
LE_MOVHZ (R4), R21
|
||||
SLD R22, R21, R21
|
||||
OR R16, R21, R16
|
||||
ADD $16, R22
|
||||
@@ -123,24 +123,12 @@ func TestSigning(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// We use this to make test keys, so that they aren't all the same.
|
||||
type quickRand byte
|
||||
|
||||
func (qr *quickRand) Read(p []byte) (int, error) {
|
||||
for i := range p {
|
||||
p[i] = byte(*qr)
|
||||
}
|
||||
*qr++
|
||||
return len(p), nil
|
||||
}
|
||||
|
||||
func TestMultiSign(t *testing.T) {
|
||||
if testing.Short() {
|
||||
t.Skip("skipping long test in -short mode")
|
||||
}
|
||||
|
||||
zero := quickRand(0)
|
||||
config := packet.Config{Rand: &zero}
|
||||
var config packet.Config
|
||||
|
||||
for nKeys := 0; nKeys < 4; nKeys++ {
|
||||
nextTest:
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
module salsa20/salsa/_asm
|
||||
|
||||
go 1.23
|
||||
|
||||
require (
|
||||
github.com/mmcloughlin/avo v0.6.0
|
||||
golang.org/x/crypto v0.26.0
|
||||
)
|
||||
|
||||
require (
|
||||
golang.org/x/mod v0.20.0 // indirect
|
||||
golang.org/x/sync v0.8.0 // indirect
|
||||
golang.org/x/tools v0.24.0 // indirect
|
||||
)
|
||||
@@ -0,0 +1,10 @@
|
||||
github.com/mmcloughlin/avo v0.6.0 h1:QH6FU8SKoTLaVs80GA8TJuLNkUYl4VokHKlPhVDg4YY=
|
||||
github.com/mmcloughlin/avo v0.6.0/go.mod h1:8CoAGaCSYXtCPR+8y18Y9aB/kxb8JSS6FRI7mSkvD+8=
|
||||
golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
|
||||
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
|
||||
golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
|
||||
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
|
||||
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
|
||||
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
|
||||
@@ -0,0 +1,932 @@
|
||||
// Copyright 2024 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.
|
||||
|
||||
// This code was translated into a form compatible with 6a from the public
|
||||
// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
. "github.com/mmcloughlin/avo/build"
|
||||
"github.com/mmcloughlin/avo/ir"
|
||||
. "github.com/mmcloughlin/avo/operand"
|
||||
. "github.com/mmcloughlin/avo/reg"
|
||||
_ "golang.org/x/crypto/salsa20/salsa"
|
||||
)
|
||||
|
||||
//go:generate go run . -out ../salsa20_amd64.s -pkg salsa
|
||||
|
||||
func main() {
|
||||
Package("golang.org/x/crypto/salsa20/salsa")
|
||||
ConstraintExpr("amd64,!purego,gc")
|
||||
salsa2020XORKeyStream()
|
||||
Generate()
|
||||
}
|
||||
|
||||
func salsa2020XORKeyStream() {
|
||||
Implement("salsa2020XORKeyStream")
|
||||
Attributes(0)
|
||||
AllocLocal(456) // frame = 424 + 32 byte alignment
|
||||
Comment("This needs up to 64 bytes at 360(R12); hence the non-obvious frame size.")
|
||||
|
||||
Load(Param("out"), RDI)
|
||||
Load(Param("in"), RSI)
|
||||
Load(Param("n"), RDX)
|
||||
Load(Param("nonce"), RCX)
|
||||
Load(Param("key"), R8)
|
||||
|
||||
MOVQ(RSP, R12)
|
||||
ADDQ(Imm(31), R12)
|
||||
ANDQ(I32(^31), R12)
|
||||
|
||||
MOVQ(RDX, R9)
|
||||
MOVQ(RCX, RDX)
|
||||
MOVQ(R8, R10)
|
||||
CMPQ(R9, Imm(0))
|
||||
JBE(LabelRef("DONE"))
|
||||
|
||||
START()
|
||||
BYTESATLEAST256()
|
||||
MAINLOOP1()
|
||||
BYTESBETWEEN1AND255()
|
||||
NOCOPY()
|
||||
MAINLOOP2()
|
||||
|
||||
Label("BYTESATLEAST64")
|
||||
Label("DONE")
|
||||
RET()
|
||||
Label("BYTESATLEAST65")
|
||||
SUBQ(Imm(64), R9)
|
||||
ADDQ(Imm(64), RDI)
|
||||
ADDQ(Imm(64), RSI)
|
||||
JMP(LabelRef("BYTESBETWEEN1AND255"))
|
||||
}
|
||||
|
||||
func START() {
|
||||
Label("START")
|
||||
MOVL(Mem{Base: R10}.Offset(20), ECX)
|
||||
MOVL(Mem{Base: R10}.Offset(0), R8L)
|
||||
MOVL(Mem{Base: EDX}.Offset(0), EAX)
|
||||
MOVL(Mem{Base: R10}.Offset(16), R11L)
|
||||
MOVL(ECX, Mem{Base: R12}.Offset(0))
|
||||
MOVL(R8L, Mem{Base: R12}.Offset(4))
|
||||
MOVL(EAX, Mem{Base: R12}.Offset(8))
|
||||
MOVL(R11L, Mem{Base: R12}.Offset(12))
|
||||
MOVL(Mem{Base: EDX}.Offset(8), ECX)
|
||||
MOVL(Mem{Base: R10}.Offset(24), R8L)
|
||||
MOVL(Mem{Base: R10}.Offset(4), EAX)
|
||||
MOVL(Mem{Base: EDX}.Offset(4), R11L)
|
||||
MOVL(ECX, Mem{Base: R12}.Offset(16))
|
||||
MOVL(R8L, Mem{Base: R12}.Offset(20))
|
||||
MOVL(EAX, Mem{Base: R12}.Offset(24))
|
||||
MOVL(R11L, Mem{Base: R12}.Offset(28))
|
||||
MOVL(Mem{Base: EDX}.Offset(12), ECX)
|
||||
MOVL(Mem{Base: R10}.Offset(12), EDX)
|
||||
MOVL(Mem{Base: R10}.Offset(28), R8L)
|
||||
MOVL(Mem{Base: R10}.Offset(8), EAX)
|
||||
MOVL(EDX, Mem{Base: R12}.Offset(32))
|
||||
MOVL(ECX, Mem{Base: R12}.Offset(36))
|
||||
MOVL(R8L, Mem{Base: R12}.Offset(40))
|
||||
MOVL(EAX, Mem{Base: R12}.Offset(44))
|
||||
MOVQ(Imm(1634760805), RDX)
|
||||
MOVQ(Imm(857760878), RCX)
|
||||
MOVQ(Imm(2036477234), R8)
|
||||
MOVQ(Imm(1797285236), RAX)
|
||||
MOVL(EDX, Mem{Base: R12}.Offset(48))
|
||||
MOVL(ECX, Mem{Base: R12}.Offset(52))
|
||||
MOVL(R8L, Mem{Base: R12}.Offset(56))
|
||||
MOVL(EAX, Mem{Base: R12}.Offset(60))
|
||||
CMPQ(R9, U32(256))
|
||||
JB(LabelRef("BYTESBETWEEN1AND255"))
|
||||
MOVOA(Mem{Base: R12}.Offset(48), X0)
|
||||
PSHUFL(Imm(0x55), X0, X1)
|
||||
PSHUFL(Imm(0xAA), X0, X2)
|
||||
PSHUFL(Imm(0xFF), X0, X3)
|
||||
PSHUFL(Imm(0x00), X0, X0)
|
||||
MOVOA(X1, Mem{Base: R12}.Offset(64))
|
||||
MOVOA(X2, Mem{Base: R12}.Offset(80))
|
||||
MOVOA(X3, Mem{Base: R12}.Offset(96))
|
||||
MOVOA(X0, Mem{Base: R12}.Offset(112))
|
||||
MOVOA(Mem{Base: R12}.Offset(0), X0)
|
||||
PSHUFL(Imm(0xAA), X0, X1)
|
||||
PSHUFL(Imm(0xFF), X0, X2)
|
||||
PSHUFL(Imm(0x00), X0, X3)
|
||||
PSHUFL(Imm(0x55), X0, X0)
|
||||
MOVOA(X1, Mem{Base: R12}.Offset(128))
|
||||
MOVOA(X2, Mem{Base: R12}.Offset(144))
|
||||
MOVOA(X3, Mem{Base: R12}.Offset(160))
|
||||
MOVOA(X0, Mem{Base: R12}.Offset(176))
|
||||
MOVOA(Mem{Base: R12}.Offset(16), X0)
|
||||
PSHUFL(Imm(0xFF), X0, X1)
|
||||
PSHUFL(Imm(0x55), X0, X2)
|
||||
PSHUFL(Imm(0xAA), X0, X0)
|
||||
MOVOA(X1, Mem{Base: R12}.Offset(192))
|
||||
MOVOA(X2, Mem{Base: R12}.Offset(208))
|
||||
MOVOA(X0, Mem{Base: R12}.Offset(224))
|
||||
MOVOA(Mem{Base: R12}.Offset(32), X0)
|
||||
PSHUFL(Imm(0x00), X0, X1)
|
||||
PSHUFL(Imm(0xAA), X0, X2)
|
||||
PSHUFL(Imm(0xFF), X0, X0)
|
||||
MOVOA(X1, Mem{Base: R12}.Offset(240))
|
||||
MOVOA(X2, Mem{Base: R12}.Offset(256))
|
||||
MOVOA(X0, Mem{Base: R12}.Offset(272))
|
||||
|
||||
}
|
||||
|
||||
func BYTESATLEAST256() {
|
||||
Label("BYTESATLEAST256")
|
||||
MOVL(Mem{Base: R12}.Offset(16), EDX)
|
||||
MOVL(Mem{Base: R12}.Offset(36), ECX)
|
||||
MOVL(EDX, Mem{Base: R12}.Offset(288))
|
||||
MOVL(ECX, Mem{Base: R12}.Offset(304))
|
||||
SHLQ(Imm(32), RCX)
|
||||
ADDQ(RCX, RDX)
|
||||
ADDQ(Imm(1), RDX)
|
||||
MOVQ(RDX, RCX)
|
||||
SHRQ(Imm(32), RCX)
|
||||
MOVL(EDX, Mem{Base: R12}.Offset(292))
|
||||
MOVL(ECX, Mem{Base: R12}.Offset(308))
|
||||
ADDQ(Imm(1), RDX)
|
||||
MOVQ(RDX, RCX)
|
||||
SHRQ(Imm(32), RCX)
|
||||
MOVL(EDX, Mem{Base: R12}.Offset(296))
|
||||
MOVL(ECX, Mem{Base: R12}.Offset(312))
|
||||
ADDQ(Imm(1), RDX)
|
||||
MOVQ(RDX, RCX)
|
||||
SHRQ(Imm(32), RCX)
|
||||
MOVL(EDX, Mem{Base: R12}.Offset(300))
|
||||
MOVL(ECX, Mem{Base: R12}.Offset(316))
|
||||
ADDQ(Imm(1), RDX)
|
||||
MOVQ(RDX, RCX)
|
||||
SHRQ(Imm(32), RCX)
|
||||
MOVL(EDX, Mem{Base: R12}.Offset(16))
|
||||
MOVL(ECX, Mem{Base: R12}.Offset(36))
|
||||
MOVQ(R9, Mem{Base: R12}.Offset(352))
|
||||
MOVQ(U32(20), RDX)
|
||||
MOVOA(Mem{Base: R12}.Offset(64), X0)
|
||||
MOVOA(Mem{Base: R12}.Offset(80), X1)
|
||||
MOVOA(Mem{Base: R12}.Offset(96), X2)
|
||||
MOVOA(Mem{Base: R12}.Offset(256), X3)
|
||||
MOVOA(Mem{Base: R12}.Offset(272), X4)
|
||||
MOVOA(Mem{Base: R12}.Offset(128), X5)
|
||||
MOVOA(Mem{Base: R12}.Offset(144), X6)
|
||||
MOVOA(Mem{Base: R12}.Offset(176), X7)
|
||||
MOVOA(Mem{Base: R12}.Offset(192), X8)
|
||||
MOVOA(Mem{Base: R12}.Offset(208), X9)
|
||||
MOVOA(Mem{Base: R12}.Offset(224), X10)
|
||||
MOVOA(Mem{Base: R12}.Offset(304), X11)
|
||||
MOVOA(Mem{Base: R12}.Offset(112), X12)
|
||||
MOVOA(Mem{Base: R12}.Offset(160), X13)
|
||||
MOVOA(Mem{Base: R12}.Offset(240), X14)
|
||||
MOVOA(Mem{Base: R12}.Offset(288), X15)
|
||||
}
|
||||
|
||||
func MAINLOOP1() {
|
||||
Label("MAINLOOP1")
|
||||
MOVOA(X1, Mem{Base: R12}.Offset(320))
|
||||
MOVOA(X2, Mem{Base: R12}.Offset(336))
|
||||
MOVOA(X13, X1)
|
||||
PADDL(X12, X1)
|
||||
MOVOA(X1, X2)
|
||||
PSLLL(Imm(7), X1)
|
||||
PXOR(X1, X14)
|
||||
PSRLL(Imm(25), X2)
|
||||
PXOR(X2, X14)
|
||||
MOVOA(X7, X1)
|
||||
PADDL(X0, X1)
|
||||
MOVOA(X1, X2)
|
||||
PSLLL(Imm(7), X1)
|
||||
PXOR(X1, X11)
|
||||
PSRLL(Imm(25), X2)
|
||||
PXOR(X2, X11)
|
||||
MOVOA(X12, X1)
|
||||
PADDL(X14, X1)
|
||||
MOVOA(X1, X2)
|
||||
PSLLL(Imm(9), X1)
|
||||
PXOR(X1, X15)
|
||||
PSRLL(Imm(23), X2)
|
||||
PXOR(X2, X15)
|
||||
MOVOA(X0, X1)
|
||||
PADDL(X11, X1)
|
||||
MOVOA(X1, X2)
|
||||
PSLLL(Imm(9), X1)
|
||||
PXOR(X1, X9)
|
||||
PSRLL(Imm(23), X2)
|
||||
PXOR(X2, X9)
|
||||
MOVOA(X14, X1)
|
||||
PADDL(X15, X1)
|
||||
MOVOA(X1, X2)
|
||||
PSLLL(Imm(13), X1)
|
||||
PXOR(X1, X13)
|
||||
PSRLL(Imm(19), X2)
|
||||
PXOR(X2, X13)
|
||||
MOVOA(X11, X1)
|
||||
PADDL(X9, X1)
|
||||
MOVOA(X1, X2)
|
||||
PSLLL(Imm(13), X1)
|
||||
PXOR(X1, X7)
|
||||
PSRLL(Imm(19), X2)
|
||||
PXOR(X2, X7)
|
||||
MOVOA(X15, X1)
|
||||
PADDL(X13, X1)
|
||||
MOVOA(X1, X2)
|
||||
PSLLL(Imm(18), X1)
|
||||
PXOR(X1, X12)
|
||||
PSRLL(Imm(14), X2)
|
||||
PXOR(X2, X12)
|
||||
MOVOA(Mem{Base: R12}.Offset(320), X1)
|
||||
MOVOA(X12, Mem{Base: R12}.Offset(320))
|
||||
MOVOA(X9, X2)
|
||||
PADDL(X7, X2)
|
||||
MOVOA(X2, X12)
|
||||
PSLLL(Imm(18), X2)
|
||||
PXOR(X2, X0)
|
||||
PSRLL(Imm(14), X12)
|
||||
PXOR(X12, X0)
|
||||
MOVOA(X5, X2)
|
||||
PADDL(X1, X2)
|
||||
MOVOA(X2, X12)
|
||||
PSLLL(Imm(7), X2)
|
||||
PXOR(X2, X3)
|
||||
PSRLL(Imm(25), X12)
|
||||
PXOR(X12, X3)
|
||||
MOVOA(Mem{Base: R12}.Offset(336), X2)
|
||||
MOVOA(X0, Mem{Base: R12}.Offset(336))
|
||||
MOVOA(X6, X0)
|
||||
PADDL(X2, X0)
|
||||
MOVOA(X0, X12)
|
||||
PSLLL(Imm(7), X0)
|
||||
PXOR(X0, X4)
|
||||
PSRLL(Imm(25), X12)
|
||||
PXOR(X12, X4)
|
||||
MOVOA(X1, X0)
|
||||
PADDL(X3, X0)
|
||||
MOVOA(X0, X12)
|
||||
PSLLL(Imm(9), X0)
|
||||
PXOR(X0, X10)
|
||||
PSRLL(Imm(23), X12)
|
||||
PXOR(X12, X10)
|
||||
MOVOA(X2, X0)
|
||||
PADDL(X4, X0)
|
||||
MOVOA(X0, X12)
|
||||
PSLLL(Imm(9), X0)
|
||||
PXOR(X0, X8)
|
||||
PSRLL(Imm(23), X12)
|
||||
PXOR(X12, X8)
|
||||
MOVOA(X3, X0)
|
||||
PADDL(X10, X0)
|
||||
MOVOA(X0, X12)
|
||||
PSLLL(Imm(13), X0)
|
||||
PXOR(X0, X5)
|
||||
PSRLL(Imm(19), X12)
|
||||
PXOR(X12, X5)
|
||||
MOVOA(X4, X0)
|
||||
PADDL(X8, X0)
|
||||
MOVOA(X0, X12)
|
||||
PSLLL(Imm(13), X0)
|
||||
PXOR(X0, X6)
|
||||
PSRLL(Imm(19), X12)
|
||||
PXOR(X12, X6)
|
||||
MOVOA(X10, X0)
|
||||
PADDL(X5, X0)
|
||||
MOVOA(X0, X12)
|
||||
PSLLL(Imm(18), X0)
|
||||
PXOR(X0, X1)
|
||||
PSRLL(Imm(14), X12)
|
||||
PXOR(X12, X1)
|
||||
MOVOA(Mem{Base: R12}.Offset(320), X0)
|
||||
MOVOA(X1, Mem{Base: R12}.Offset(320))
|
||||
MOVOA(X4, X1)
|
||||
PADDL(X0, X1)
|
||||
MOVOA(X1, X12)
|
||||
PSLLL(Imm(7), X1)
|
||||
PXOR(X1, X7)
|
||||
PSRLL(Imm(25), X12)
|
||||
PXOR(X12, X7)
|
||||
MOVOA(X8, X1)
|
||||
PADDL(X6, X1)
|
||||
MOVOA(X1, X12)
|
||||
PSLLL(Imm(18), X1)
|
||||
PXOR(X1, X2)
|
||||
PSRLL(Imm(14), X12)
|
||||
PXOR(X12, X2)
|
||||
MOVOA(Mem{Base: R12}.Offset(336), X12)
|
||||
MOVOA(X2, Mem{Base: R12}.Offset(336))
|
||||
MOVOA(X14, X1)
|
||||
PADDL(X12, X1)
|
||||
MOVOA(X1, X2)
|
||||
PSLLL(Imm(7), X1)
|
||||
PXOR(X1, X5)
|
||||
PSRLL(Imm(25), X2)
|
||||
PXOR(X2, X5)
|
||||
MOVOA(X0, X1)
|
||||
PADDL(X7, X1)
|
||||
MOVOA(X1, X2)
|
||||
PSLLL(Imm(9), X1)
|
||||
PXOR(X1, X10)
|
||||
PSRLL(Imm(23), X2)
|
||||
PXOR(X2, X10)
|
||||
MOVOA(X12, X1)
|
||||
PADDL(X5, X1)
|
||||
MOVOA(X1, X2)
|
||||
PSLLL(Imm(9), X1)
|
||||
PXOR(X1, X8)
|
||||
PSRLL(Imm(23), X2)
|
||||
PXOR(X2, X8)
|
||||
MOVOA(X7, X1)
|
||||
PADDL(X10, X1)
|
||||
MOVOA(X1, X2)
|
||||
PSLLL(Imm(13), X1)
|
||||
PXOR(X1, X4)
|
||||
PSRLL(Imm(19), X2)
|
||||
PXOR(X2, X4)
|
||||
MOVOA(X5, X1)
|
||||
PADDL(X8, X1)
|
||||
MOVOA(X1, X2)
|
||||
PSLLL(Imm(13), X1)
|
||||
PXOR(X1, X14)
|
||||
PSRLL(Imm(19), X2)
|
||||
PXOR(X2, X14)
|
||||
MOVOA(X10, X1)
|
||||
PADDL(X4, X1)
|
||||
MOVOA(X1, X2)
|
||||
PSLLL(Imm(18), X1)
|
||||
PXOR(X1, X0)
|
||||
PSRLL(Imm(14), X2)
|
||||
PXOR(X2, X0)
|
||||
MOVOA(Mem{Base: R12}.Offset(320), X1)
|
||||
MOVOA(X0, Mem{Base: R12}.Offset(320))
|
||||
MOVOA(X8, X0)
|
||||
PADDL(X14, X0)
|
||||
MOVOA(X0, X2)
|
||||
PSLLL(Imm(18), X0)
|
||||
PXOR(X0, X12)
|
||||
PSRLL(Imm(14), X2)
|
||||
PXOR(X2, X12)
|
||||
MOVOA(X11, X0)
|
||||
PADDL(X1, X0)
|
||||
MOVOA(X0, X2)
|
||||
PSLLL(Imm(7), X0)
|
||||
PXOR(X0, X6)
|
||||
PSRLL(Imm(25), X2)
|
||||
PXOR(X2, X6)
|
||||
MOVOA(Mem{Base: R12}.Offset(336), X2)
|
||||
MOVOA(X12, Mem{Base: R12}.Offset(336))
|
||||
MOVOA(X3, X0)
|
||||
PADDL(X2, X0)
|
||||
MOVOA(X0, X12)
|
||||
PSLLL(Imm(7), X0)
|
||||
PXOR(X0, X13)
|
||||
PSRLL(Imm(25), X12)
|
||||
PXOR(X12, X13)
|
||||
MOVOA(X1, X0)
|
||||
PADDL(X6, X0)
|
||||
MOVOA(X0, X12)
|
||||
PSLLL(Imm(9), X0)
|
||||
PXOR(X0, X15)
|
||||
PSRLL(Imm(23), X12)
|
||||
PXOR(X12, X15)
|
||||
MOVOA(X2, X0)
|
||||
PADDL(X13, X0)
|
||||
MOVOA(X0, X12)
|
||||
PSLLL(Imm(9), X0)
|
||||
PXOR(X0, X9)
|
||||
PSRLL(Imm(23), X12)
|
||||
PXOR(X12, X9)
|
||||
MOVOA(X6, X0)
|
||||
PADDL(X15, X0)
|
||||
MOVOA(X0, X12)
|
||||
PSLLL(Imm(13), X0)
|
||||
PXOR(X0, X11)
|
||||
PSRLL(Imm(19), X12)
|
||||
PXOR(X12, X11)
|
||||
MOVOA(X13, X0)
|
||||
PADDL(X9, X0)
|
||||
MOVOA(X0, X12)
|
||||
PSLLL(Imm(13), X0)
|
||||
PXOR(X0, X3)
|
||||
PSRLL(Imm(19), X12)
|
||||
PXOR(X12, X3)
|
||||
MOVOA(X15, X0)
|
||||
PADDL(X11, X0)
|
||||
MOVOA(X0, X12)
|
||||
PSLLL(Imm(18), X0)
|
||||
PXOR(X0, X1)
|
||||
PSRLL(Imm(14), X12)
|
||||
PXOR(X12, X1)
|
||||
MOVOA(X9, X0)
|
||||
PADDL(X3, X0)
|
||||
MOVOA(X0, X12)
|
||||
PSLLL(Imm(18), X0)
|
||||
PXOR(X0, X2)
|
||||
PSRLL(Imm(14), X12)
|
||||
PXOR(X12, X2)
|
||||
MOVOA(Mem{Base: R12}.Offset(320), X12)
|
||||
MOVOA(Mem{Base: R12}.Offset(336), X0)
|
||||
SUBQ(Imm(2), RDX)
|
||||
JA(LabelRef("MAINLOOP1"))
|
||||
PADDL(Mem{Base: R12}.Offset(112), X12)
|
||||
PADDL(Mem{Base: R12}.Offset(176), X7)
|
||||
PADDL(Mem{Base: R12}.Offset(224), X10)
|
||||
PADDL(Mem{Base: R12}.Offset(272), X4)
|
||||
MOVD(X12, EDX)
|
||||
MOVD(X7, ECX)
|
||||
MOVD(X10, R8)
|
||||
MOVD(X4, R9)
|
||||
PSHUFL(Imm(0x39), X12, X12)
|
||||
PSHUFL(Imm(0x39), X7, X7)
|
||||
PSHUFL(Imm(0x39), X10, X10)
|
||||
PSHUFL(Imm(0x39), X4, X4)
|
||||
XORL(Mem{Base: SI}.Offset(0), EDX)
|
||||
XORL(Mem{Base: SI}.Offset(4), ECX)
|
||||
XORL(Mem{Base: SI}.Offset(8), R8L)
|
||||
XORL(Mem{Base: SI}.Offset(12), R9L)
|
||||
MOVL(EDX, Mem{Base: DI}.Offset(0))
|
||||
MOVL(ECX, Mem{Base: DI}.Offset(4))
|
||||
MOVL(R8L, Mem{Base: DI}.Offset(8))
|
||||
MOVL(R9L, Mem{Base: DI}.Offset(12))
|
||||
MOVD(X12, EDX)
|
||||
MOVD(X7, ECX)
|
||||
MOVD(X10, R8)
|
||||
MOVD(X4, R9)
|
||||
PSHUFL(Imm(0x39), X12, X12)
|
||||
PSHUFL(Imm(0x39), X7, X7)
|
||||
PSHUFL(Imm(0x39), X10, X10)
|
||||
PSHUFL(Imm(0x39), X4, X4)
|
||||
XORL(Mem{Base: SI}.Offset(64), EDX)
|
||||
XORL(Mem{Base: SI}.Offset(68), ECX)
|
||||
XORL(Mem{Base: SI}.Offset(72), R8L)
|
||||
XORL(Mem{Base: SI}.Offset(76), R9L)
|
||||
MOVL(EDX, Mem{Base: DI}.Offset(64))
|
||||
MOVL(ECX, Mem{Base: DI}.Offset(68))
|
||||
MOVL(R8L, Mem{Base: DI}.Offset(72))
|
||||
MOVL(R9L, Mem{Base: DI}.Offset(76))
|
||||
MOVD(X12, EDX)
|
||||
MOVD(X7, ECX)
|
||||
MOVD(X10, R8)
|
||||
MOVD(X4, R9)
|
||||
PSHUFL(Imm(0x39), X12, X12)
|
||||
PSHUFL(Imm(0x39), X7, X7)
|
||||
PSHUFL(Imm(0x39), X10, X10)
|
||||
PSHUFL(Imm(0x39), X4, X4)
|
||||
XORL(Mem{Base: SI}.Offset(128), EDX)
|
||||
XORL(Mem{Base: SI}.Offset(132), ECX)
|
||||
XORL(Mem{Base: SI}.Offset(136), R8L)
|
||||
XORL(Mem{Base: SI}.Offset(140), R9L)
|
||||
MOVL(EDX, Mem{Base: DI}.Offset(128))
|
||||
MOVL(ECX, Mem{Base: DI}.Offset(132))
|
||||
MOVL(R8L, Mem{Base: DI}.Offset(136))
|
||||
MOVL(R9L, Mem{Base: DI}.Offset(140))
|
||||
MOVD(X12, EDX)
|
||||
MOVD(X7, ECX)
|
||||
MOVD(X10, R8)
|
||||
MOVD(X4, R9)
|
||||
XORL(Mem{Base: SI}.Offset(192), EDX)
|
||||
XORL(Mem{Base: SI}.Offset(196), ECX)
|
||||
XORL(Mem{Base: SI}.Offset(200), R8L)
|
||||
XORL(Mem{Base: SI}.Offset(204), R9L)
|
||||
MOVL(EDX, Mem{Base: DI}.Offset(192))
|
||||
MOVL(ECX, Mem{Base: DI}.Offset(196))
|
||||
MOVL(R8L, Mem{Base: DI}.Offset(200))
|
||||
MOVL(R9L, Mem{Base: DI}.Offset(204))
|
||||
PADDL(Mem{Base: R12}.Offset(240), X14)
|
||||
PADDL(Mem{Base: R12}.Offset(64), X0)
|
||||
PADDL(Mem{Base: R12}.Offset(128), X5)
|
||||
PADDL(Mem{Base: R12}.Offset(192), X8)
|
||||
MOVD(X14, EDX)
|
||||
MOVD(X0, ECX)
|
||||
MOVD(X5, R8)
|
||||
MOVD(X8, R9)
|
||||
PSHUFL(Imm(0x39), X14, X14)
|
||||
PSHUFL(Imm(0x39), X0, X0)
|
||||
PSHUFL(Imm(0x39), X5, X5)
|
||||
PSHUFL(Imm(0x39), X8, X8)
|
||||
XORL(Mem{Base: SI}.Offset(16), EDX)
|
||||
XORL(Mem{Base: SI}.Offset(20), ECX)
|
||||
XORL(Mem{Base: SI}.Offset(24), R8L)
|
||||
XORL(Mem{Base: SI}.Offset(28), R9L)
|
||||
MOVL(EDX, Mem{Base: DI}.Offset(16))
|
||||
MOVL(ECX, Mem{Base: DI}.Offset(20))
|
||||
MOVL(R8L, Mem{Base: DI}.Offset(24))
|
||||
MOVL(R9L, Mem{Base: DI}.Offset(28))
|
||||
MOVD(X14, EDX)
|
||||
MOVD(X0, ECX)
|
||||
MOVD(X5, R8)
|
||||
MOVD(X8, R9)
|
||||
PSHUFL(Imm(0x39), X14, X14)
|
||||
PSHUFL(Imm(0x39), X0, X0)
|
||||
PSHUFL(Imm(0x39), X5, X5)
|
||||
PSHUFL(Imm(0x39), X8, X8)
|
||||
XORL(Mem{Base: SI}.Offset(80), EDX)
|
||||
XORL(Mem{Base: SI}.Offset(84), ECX)
|
||||
XORL(Mem{Base: SI}.Offset(88), R8L)
|
||||
XORL(Mem{Base: SI}.Offset(92), R9L)
|
||||
MOVL(EDX, Mem{Base: DI}.Offset(80))
|
||||
MOVL(ECX, Mem{Base: DI}.Offset(84))
|
||||
MOVL(R8L, Mem{Base: DI}.Offset(88))
|
||||
MOVL(R9L, Mem{Base: DI}.Offset(92))
|
||||
MOVD(X14, EDX)
|
||||
MOVD(X0, ECX)
|
||||
MOVD(X5, R8)
|
||||
MOVD(X8, R9)
|
||||
PSHUFL(Imm(0x39), X14, X14)
|
||||
PSHUFL(Imm(0x39), X0, X0)
|
||||
PSHUFL(Imm(0x39), X5, X5)
|
||||
PSHUFL(Imm(0x39), X8, X8)
|
||||
XORL(Mem{Base: SI}.Offset(144), EDX)
|
||||
XORL(Mem{Base: SI}.Offset(148), ECX)
|
||||
XORL(Mem{Base: SI}.Offset(152), R8L)
|
||||
XORL(Mem{Base: SI}.Offset(156), R9L)
|
||||
MOVL(EDX, Mem{Base: DI}.Offset(144))
|
||||
MOVL(ECX, Mem{Base: DI}.Offset(148))
|
||||
MOVL(R8L, Mem{Base: DI}.Offset(152))
|
||||
MOVL(R9L, Mem{Base: DI}.Offset(156))
|
||||
MOVD(X14, EDX)
|
||||
MOVD(X0, ECX)
|
||||
MOVD(X5, R8)
|
||||
MOVD(X8, R9)
|
||||
XORL(Mem{Base: SI}.Offset(208), EDX)
|
||||
XORL(Mem{Base: SI}.Offset(212), ECX)
|
||||
XORL(Mem{Base: SI}.Offset(216), R8L)
|
||||
XORL(Mem{Base: SI}.Offset(220), R9L)
|
||||
MOVL(EDX, Mem{Base: DI}.Offset(208))
|
||||
MOVL(ECX, Mem{Base: DI}.Offset(212))
|
||||
MOVL(R8L, Mem{Base: DI}.Offset(216))
|
||||
MOVL(R9L, Mem{Base: DI}.Offset(220))
|
||||
PADDL(Mem{Base: R12}.Offset(288), X15)
|
||||
PADDL(Mem{Base: R12}.Offset(304), X11)
|
||||
PADDL(Mem{Base: R12}.Offset(80), X1)
|
||||
PADDL(Mem{Base: R12}.Offset(144), X6)
|
||||
MOVD(X15, EDX)
|
||||
MOVD(X11, ECX)
|
||||
MOVD(X1, R8)
|
||||
MOVD(X6, R9)
|
||||
PSHUFL(Imm(0x39), X15, X15)
|
||||
PSHUFL(Imm(0x39), X11, X11)
|
||||
PSHUFL(Imm(0x39), X1, X1)
|
||||
PSHUFL(Imm(0x39), X6, X6)
|
||||
XORL(Mem{Base: SI}.Offset(32), EDX)
|
||||
XORL(Mem{Base: SI}.Offset(36), ECX)
|
||||
XORL(Mem{Base: SI}.Offset(40), R8L)
|
||||
XORL(Mem{Base: SI}.Offset(44), R9L)
|
||||
MOVL(EDX, Mem{Base: DI}.Offset(32))
|
||||
MOVL(ECX, Mem{Base: DI}.Offset(36))
|
||||
MOVL(R8L, Mem{Base: DI}.Offset(40))
|
||||
MOVL(R9L, Mem{Base: DI}.Offset(44))
|
||||
MOVD(X15, EDX)
|
||||
MOVD(X11, ECX)
|
||||
MOVD(X1, R8)
|
||||
MOVD(X6, R9)
|
||||
PSHUFL(Imm(0x39), X15, X15)
|
||||
PSHUFL(Imm(0x39), X11, X11)
|
||||
PSHUFL(Imm(0x39), X1, X1)
|
||||
PSHUFL(Imm(0x39), X6, X6)
|
||||
XORL(Mem{Base: SI}.Offset(96), EDX)
|
||||
XORL(Mem{Base: SI}.Offset(100), ECX)
|
||||
XORL(Mem{Base: SI}.Offset(104), R8L)
|
||||
XORL(Mem{Base: SI}.Offset(108), R9L)
|
||||
MOVL(EDX, Mem{Base: DI}.Offset(96))
|
||||
MOVL(ECX, Mem{Base: DI}.Offset(100))
|
||||
MOVL(R8L, Mem{Base: DI}.Offset(104))
|
||||
MOVL(R9L, Mem{Base: DI}.Offset(108))
|
||||
MOVD(X15, EDX)
|
||||
MOVD(X11, ECX)
|
||||
MOVD(X1, R8)
|
||||
MOVD(X6, R9)
|
||||
PSHUFL(Imm(0x39), X15, X15)
|
||||
PSHUFL(Imm(0x39), X11, X11)
|
||||
PSHUFL(Imm(0x39), X1, X1)
|
||||
PSHUFL(Imm(0x39), X6, X6)
|
||||
XORL(Mem{Base: SI}.Offset(160), EDX)
|
||||
XORL(Mem{Base: SI}.Offset(164), ECX)
|
||||
XORL(Mem{Base: SI}.Offset(168), R8L)
|
||||
XORL(Mem{Base: SI}.Offset(172), R9L)
|
||||
MOVL(EDX, Mem{Base: DI}.Offset(160))
|
||||
MOVL(ECX, Mem{Base: DI}.Offset(164))
|
||||
MOVL(R8L, Mem{Base: DI}.Offset(168))
|
||||
MOVL(R9L, Mem{Base: DI}.Offset(172))
|
||||
MOVD(X15, EDX)
|
||||
MOVD(X11, ECX)
|
||||
MOVD(X1, R8)
|
||||
MOVD(X6, R9)
|
||||
XORL(Mem{Base: SI}.Offset(224), EDX)
|
||||
XORL(Mem{Base: SI}.Offset(228), ECX)
|
||||
XORL(Mem{Base: SI}.Offset(232), R8L)
|
||||
XORL(Mem{Base: SI}.Offset(236), R9L)
|
||||
MOVL(EDX, Mem{Base: DI}.Offset(224))
|
||||
MOVL(ECX, Mem{Base: DI}.Offset(228))
|
||||
MOVL(R8L, Mem{Base: DI}.Offset(232))
|
||||
MOVL(R9L, Mem{Base: DI}.Offset(236))
|
||||
PADDL(Mem{Base: R12}.Offset(160), X13)
|
||||
PADDL(Mem{Base: R12}.Offset(208), X9)
|
||||
PADDL(Mem{Base: R12}.Offset(256), X3)
|
||||
PADDL(Mem{Base: R12}.Offset(96), X2)
|
||||
MOVD(X13, EDX)
|
||||
MOVD(X9, ECX)
|
||||
MOVD(X3, R8)
|
||||
MOVD(X2, R9)
|
||||
PSHUFL(Imm(0x39), X13, X13)
|
||||
PSHUFL(Imm(0x39), X9, X9)
|
||||
PSHUFL(Imm(0x39), X3, X3)
|
||||
PSHUFL(Imm(0x39), X2, X2)
|
||||
XORL(Mem{Base: SI}.Offset(48), EDX)
|
||||
XORL(Mem{Base: SI}.Offset(52), ECX)
|
||||
XORL(Mem{Base: SI}.Offset(56), R8L)
|
||||
XORL(Mem{Base: SI}.Offset(60), R9L)
|
||||
MOVL(EDX, Mem{Base: DI}.Offset(48))
|
||||
MOVL(ECX, Mem{Base: DI}.Offset(52))
|
||||
MOVL(R8L, Mem{Base: DI}.Offset(56))
|
||||
MOVL(R9L, Mem{Base: DI}.Offset(60))
|
||||
MOVD(X13, EDX)
|
||||
MOVD(X9, ECX)
|
||||
MOVD(X3, R8)
|
||||
MOVD(X2, R9)
|
||||
PSHUFL(Imm(0x39), X13, X13)
|
||||
PSHUFL(Imm(0x39), X9, X9)
|
||||
PSHUFL(Imm(0x39), X3, X3)
|
||||
PSHUFL(Imm(0x39), X2, X2)
|
||||
XORL(Mem{Base: SI}.Offset(112), EDX)
|
||||
XORL(Mem{Base: SI}.Offset(116), ECX)
|
||||
XORL(Mem{Base: SI}.Offset(120), R8L)
|
||||
XORL(Mem{Base: SI}.Offset(124), R9L)
|
||||
MOVL(EDX, Mem{Base: DI}.Offset(112))
|
||||
MOVL(ECX, Mem{Base: DI}.Offset(116))
|
||||
MOVL(R8L, Mem{Base: DI}.Offset(120))
|
||||
MOVL(R9L, Mem{Base: DI}.Offset(124))
|
||||
MOVD(X13, EDX)
|
||||
MOVD(X9, ECX)
|
||||
MOVD(X3, R8)
|
||||
MOVD(X2, R9)
|
||||
PSHUFL(Imm(0x39), X13, X13)
|
||||
PSHUFL(Imm(0x39), X9, X9)
|
||||
PSHUFL(Imm(0x39), X3, X3)
|
||||
PSHUFL(Imm(0x39), X2, X2)
|
||||
XORL(Mem{Base: SI}.Offset(176), EDX)
|
||||
XORL(Mem{Base: SI}.Offset(180), ECX)
|
||||
XORL(Mem{Base: SI}.Offset(184), R8L)
|
||||
XORL(Mem{Base: SI}.Offset(188), R9L)
|
||||
MOVL(EDX, Mem{Base: DI}.Offset(176))
|
||||
MOVL(ECX, Mem{Base: DI}.Offset(180))
|
||||
MOVL(R8L, Mem{Base: DI}.Offset(184))
|
||||
MOVL(R9L, Mem{Base: DI}.Offset(188))
|
||||
MOVD(X13, EDX)
|
||||
MOVD(X9, ECX)
|
||||
MOVD(X3, R8)
|
||||
MOVD(X2, R9)
|
||||
XORL(Mem{Base: SI}.Offset(240), EDX)
|
||||
XORL(Mem{Base: SI}.Offset(244), ECX)
|
||||
XORL(Mem{Base: SI}.Offset(248), R8L)
|
||||
XORL(Mem{Base: SI}.Offset(252), R9L)
|
||||
MOVL(EDX, Mem{Base: DI}.Offset(240))
|
||||
MOVL(ECX, Mem{Base: DI}.Offset(244))
|
||||
MOVL(R8L, Mem{Base: DI}.Offset(248))
|
||||
MOVL(R9L, Mem{Base: DI}.Offset(252))
|
||||
MOVQ(Mem{Base: R12}.Offset(352), R9)
|
||||
SUBQ(U32(256), R9)
|
||||
ADDQ(U32(256), RSI)
|
||||
ADDQ(U32(256), RDI)
|
||||
CMPQ(R9, U32(256))
|
||||
JAE(LabelRef("BYTESATLEAST256"))
|
||||
CMPQ(R9, Imm(0))
|
||||
JBE(LabelRef("DONE"))
|
||||
}
|
||||
|
||||
func BYTESBETWEEN1AND255() {
|
||||
Label("BYTESBETWEEN1AND255")
|
||||
CMPQ(R9, Imm(64))
|
||||
JAE(LabelRef("NOCOPY"))
|
||||
MOVQ(RDI, RDX)
|
||||
LEAQ(Mem{Base: R12}.Offset(360), RDI)
|
||||
MOVQ(R9, RCX)
|
||||
// Hack to get Avo to emit:
|
||||
// REP; MOVSB
|
||||
Instruction(&ir.Instruction{Opcode: "REP; MOVSB"})
|
||||
LEAQ(Mem{Base: R12}.Offset(360), RDI)
|
||||
LEAQ(Mem{Base: R12}.Offset(360), RSI)
|
||||
}
|
||||
|
||||
func NOCOPY() {
|
||||
Label("NOCOPY")
|
||||
MOVQ(R9, Mem{Base: R12}.Offset(352))
|
||||
MOVOA(Mem{Base: R12}.Offset(48), X0)
|
||||
MOVOA(Mem{Base: R12}.Offset(0), X1)
|
||||
MOVOA(Mem{Base: R12}.Offset(16), X2)
|
||||
MOVOA(Mem{Base: R12}.Offset(32), X3)
|
||||
MOVOA(X1, X4)
|
||||
MOVQ(U32(20), RCX)
|
||||
}
|
||||
|
||||
func MAINLOOP2() {
|
||||
Label("MAINLOOP2")
|
||||
PADDL(X0, X4)
|
||||
MOVOA(X0, X5)
|
||||
MOVOA(X4, X6)
|
||||
PSLLL(Imm(7), X4)
|
||||
PSRLL(Imm(25), X6)
|
||||
PXOR(X4, X3)
|
||||
PXOR(X6, X3)
|
||||
PADDL(X3, X5)
|
||||
MOVOA(X3, X4)
|
||||
MOVOA(X5, X6)
|
||||
PSLLL(Imm(9), X5)
|
||||
PSRLL(Imm(23), X6)
|
||||
PXOR(X5, X2)
|
||||
PSHUFL(Imm(0x93), X3, X3)
|
||||
PXOR(X6, X2)
|
||||
PADDL(X2, X4)
|
||||
MOVOA(X2, X5)
|
||||
MOVOA(X4, X6)
|
||||
PSLLL(Imm(13), X4)
|
||||
PSRLL(Imm(19), X6)
|
||||
PXOR(X4, X1)
|
||||
PSHUFL(Imm(0x4E), X2, X2)
|
||||
PXOR(X6, X1)
|
||||
PADDL(X1, X5)
|
||||
MOVOA(X3, X4)
|
||||
MOVOA(X5, X6)
|
||||
PSLLL(Imm(18), X5)
|
||||
PSRLL(Imm(14), X6)
|
||||
PXOR(X5, X0)
|
||||
PSHUFL(Imm(0x39), X1, X1)
|
||||
PXOR(X6, X0)
|
||||
PADDL(X0, X4)
|
||||
MOVOA(X0, X5)
|
||||
MOVOA(X4, X6)
|
||||
PSLLL(Imm(7), X4)
|
||||
PSRLL(Imm(25), X6)
|
||||
PXOR(X4, X1)
|
||||
PXOR(X6, X1)
|
||||
PADDL(X1, X5)
|
||||
MOVOA(X1, X4)
|
||||
MOVOA(X5, X6)
|
||||
PSLLL(Imm(9), X5)
|
||||
PSRLL(Imm(23), X6)
|
||||
PXOR(X5, X2)
|
||||
PSHUFL(Imm(0x93), X1, X1)
|
||||
PXOR(X6, X2)
|
||||
PADDL(X2, X4)
|
||||
MOVOA(X2, X5)
|
||||
MOVOA(X4, X6)
|
||||
PSLLL(Imm(13), X4)
|
||||
PSRLL(Imm(19), X6)
|
||||
PXOR(X4, X3)
|
||||
PSHUFL(Imm(0x4E), X2, X2)
|
||||
PXOR(X6, X3)
|
||||
PADDL(X3, X5)
|
||||
MOVOA(X1, X4)
|
||||
MOVOA(X5, X6)
|
||||
PSLLL(Imm(18), X5)
|
||||
PSRLL(Imm(14), X6)
|
||||
PXOR(X5, X0)
|
||||
PSHUFL(Imm(0x39), X3, X3)
|
||||
PXOR(X6, X0)
|
||||
PADDL(X0, X4)
|
||||
MOVOA(X0, X5)
|
||||
MOVOA(X4, X6)
|
||||
PSLLL(Imm(7), X4)
|
||||
PSRLL(Imm(25), X6)
|
||||
PXOR(X4, X3)
|
||||
PXOR(X6, X3)
|
||||
PADDL(X3, X5)
|
||||
MOVOA(X3, X4)
|
||||
MOVOA(X5, X6)
|
||||
PSLLL(Imm(9), X5)
|
||||
PSRLL(Imm(23), X6)
|
||||
PXOR(X5, X2)
|
||||
PSHUFL(Imm(0x93), X3, X3)
|
||||
PXOR(X6, X2)
|
||||
PADDL(X2, X4)
|
||||
MOVOA(X2, X5)
|
||||
MOVOA(X4, X6)
|
||||
PSLLL(Imm(13), X4)
|
||||
PSRLL(Imm(19), X6)
|
||||
PXOR(X4, X1)
|
||||
PSHUFL(Imm(0x4E), X2, X2)
|
||||
PXOR(X6, X1)
|
||||
PADDL(X1, X5)
|
||||
MOVOA(X3, X4)
|
||||
MOVOA(X5, X6)
|
||||
PSLLL(Imm(18), X5)
|
||||
PSRLL(Imm(14), X6)
|
||||
PXOR(X5, X0)
|
||||
PSHUFL(Imm(0x39), X1, X1)
|
||||
PXOR(X6, X0)
|
||||
PADDL(X0, X4)
|
||||
MOVOA(X0, X5)
|
||||
MOVOA(X4, X6)
|
||||
PSLLL(Imm(7), X4)
|
||||
PSRLL(Imm(25), X6)
|
||||
PXOR(X4, X1)
|
||||
PXOR(X6, X1)
|
||||
PADDL(X1, X5)
|
||||
MOVOA(X1, X4)
|
||||
MOVOA(X5, X6)
|
||||
PSLLL(Imm(9), X5)
|
||||
PSRLL(Imm(23), X6)
|
||||
PXOR(X5, X2)
|
||||
PSHUFL(Imm(0x93), X1, X1)
|
||||
PXOR(X6, X2)
|
||||
PADDL(X2, X4)
|
||||
MOVOA(X2, X5)
|
||||
MOVOA(X4, X6)
|
||||
PSLLL(Imm(13), X4)
|
||||
PSRLL(Imm(19), X6)
|
||||
PXOR(X4, X3)
|
||||
PSHUFL(Imm(0x4E), X2, X2)
|
||||
PXOR(X6, X3)
|
||||
SUBQ(Imm(4), RCX)
|
||||
PADDL(X3, X5)
|
||||
MOVOA(X1, X4)
|
||||
MOVOA(X5, X6)
|
||||
PSLLL(Imm(18), X5)
|
||||
PXOR(X7, X7)
|
||||
PSRLL(Imm(14), X6)
|
||||
PXOR(X5, X0)
|
||||
PSHUFL(Imm(0x39), X3, X3)
|
||||
PXOR(X6, X0)
|
||||
JA(LabelRef("MAINLOOP2"))
|
||||
PADDL(Mem{Base: R12}.Offset(48), X0)
|
||||
PADDL(Mem{Base: R12}.Offset(0), X1)
|
||||
PADDL(Mem{Base: R12}.Offset(16), X2)
|
||||
PADDL(Mem{Base: R12}.Offset(32), X3)
|
||||
MOVD(X0, ECX)
|
||||
MOVD(X1, R8)
|
||||
MOVD(X2, R9)
|
||||
MOVD(X3, EAX)
|
||||
PSHUFL(Imm(0x39), X0, X0)
|
||||
PSHUFL(Imm(0x39), X1, X1)
|
||||
PSHUFL(Imm(0x39), X2, X2)
|
||||
PSHUFL(Imm(0x39), X3, X3)
|
||||
XORL(Mem{Base: SI}.Offset(0), ECX)
|
||||
XORL(Mem{Base: SI}.Offset(48), R8L)
|
||||
XORL(Mem{Base: SI}.Offset(32), R9L)
|
||||
XORL(Mem{Base: SI}.Offset(16), EAX)
|
||||
MOVL(ECX, Mem{Base: DI}.Offset(0))
|
||||
MOVL(R8L, Mem{Base: DI}.Offset(48))
|
||||
MOVL(R9L, Mem{Base: DI}.Offset(32))
|
||||
MOVL(EAX, Mem{Base: DI}.Offset(16))
|
||||
MOVD(X0, ECX)
|
||||
MOVD(X1, R8)
|
||||
MOVD(X2, R9)
|
||||
MOVD(X3, EAX)
|
||||
PSHUFL(Imm(0x39), X0, X0)
|
||||
PSHUFL(Imm(0x39), X1, X1)
|
||||
PSHUFL(Imm(0x39), X2, X2)
|
||||
PSHUFL(Imm(0x39), X3, X3)
|
||||
XORL(Mem{Base: SI}.Offset(20), ECX)
|
||||
XORL(Mem{Base: SI}.Offset(4), R8L)
|
||||
XORL(Mem{Base: SI}.Offset(52), R9L)
|
||||
XORL(Mem{Base: SI}.Offset(36), EAX)
|
||||
MOVL(ECX, Mem{Base: DI}.Offset(20))
|
||||
MOVL(R8L, Mem{Base: DI}.Offset(4))
|
||||
MOVL(R9L, Mem{Base: DI}.Offset(52))
|
||||
MOVL(EAX, Mem{Base: DI}.Offset(36))
|
||||
MOVD(X0, ECX)
|
||||
MOVD(X1, R8)
|
||||
MOVD(X2, R9)
|
||||
MOVD(X3, EAX)
|
||||
PSHUFL(Imm(0x39), X0, X0)
|
||||
PSHUFL(Imm(0x39), X1, X1)
|
||||
PSHUFL(Imm(0x39), X2, X2)
|
||||
PSHUFL(Imm(0x39), X3, X3)
|
||||
XORL(Mem{Base: SI}.Offset(40), ECX)
|
||||
XORL(Mem{Base: SI}.Offset(24), R8L)
|
||||
XORL(Mem{Base: SI}.Offset(8), R9L)
|
||||
XORL(Mem{Base: SI}.Offset(56), EAX)
|
||||
MOVL(ECX, Mem{Base: DI}.Offset(40))
|
||||
MOVL(R8L, Mem{Base: DI}.Offset(24))
|
||||
MOVL(R9L, Mem{Base: DI}.Offset(8))
|
||||
MOVL(EAX, Mem{Base: DI}.Offset(56))
|
||||
MOVD(X0, ECX)
|
||||
MOVD(X1, R8)
|
||||
MOVD(X2, R9)
|
||||
MOVD(X3, EAX)
|
||||
XORL(Mem{Base: SI}.Offset(60), ECX)
|
||||
XORL(Mem{Base: SI}.Offset(44), R8L)
|
||||
XORL(Mem{Base: SI}.Offset(28), R9L)
|
||||
XORL(Mem{Base: SI}.Offset(12), EAX)
|
||||
MOVL(ECX, Mem{Base: DI}.Offset(60))
|
||||
MOVL(R8L, Mem{Base: DI}.Offset(44))
|
||||
MOVL(R9L, Mem{Base: DI}.Offset(28))
|
||||
MOVL(EAX, Mem{Base: DI}.Offset(12))
|
||||
MOVQ(Mem{Base: R12}.Offset(352), R9)
|
||||
MOVL(Mem{Base: R12}.Offset(16), ECX)
|
||||
MOVL(Mem{Base: R12}.Offset(36), R8L)
|
||||
ADDQ(Imm(1), RCX)
|
||||
SHLQ(Imm(32), R8)
|
||||
ADDQ(R8, RCX)
|
||||
MOVQ(RCX, R8)
|
||||
SHRQ(Imm(32), R8)
|
||||
MOVL(ECX, Mem{Base: R12}.Offset(16))
|
||||
MOVL(R8L, Mem{Base: R12}.Offset(36))
|
||||
CMPQ(R9, Imm(64))
|
||||
JA(LabelRef("BYTESATLEAST65"))
|
||||
JAE(LabelRef("BYTESATLEAST64"))
|
||||
MOVQ(RDI, RSI)
|
||||
MOVQ(RDX, RDI)
|
||||
MOVQ(R9, RCX)
|
||||
// Hack to get Avo to emit:
|
||||
// REP; MOVSB
|
||||
Instruction(&ir.Instruction{Opcode: "REP; MOVSB"})
|
||||
}
|
||||
+871
-871
File diff suppressed because it is too large
Load Diff
@@ -5,6 +5,10 @@
|
||||
// Package sha3 implements the SHA-3 fixed-output-length hash functions and
|
||||
// the SHAKE variable-output-length hash functions defined by FIPS-202.
|
||||
//
|
||||
// All types in this package also implement [encoding.BinaryMarshaler],
|
||||
// [encoding.BinaryAppender] and [encoding.BinaryUnmarshaler] to marshal and
|
||||
// unmarshal the internal state of the hash.
|
||||
//
|
||||
// Both types of hash function use the "sponge" construction and the Keccak
|
||||
// permutation. For a detailed specification see http://keccak.noekeon.org/
|
||||
//
|
||||
|
||||
+25
-6
@@ -48,33 +48,52 @@ func init() {
|
||||
crypto.RegisterHash(crypto.SHA3_512, New512)
|
||||
}
|
||||
|
||||
const (
|
||||
dsbyteSHA3 = 0b00000110
|
||||
dsbyteKeccak = 0b00000001
|
||||
dsbyteShake = 0b00011111
|
||||
dsbyteCShake = 0b00000100
|
||||
|
||||
// rateK[c] is the rate in bytes for Keccak[c] where c is the capacity in
|
||||
// bits. Given the sponge size is 1600 bits, the rate is 1600 - c bits.
|
||||
rateK256 = (1600 - 256) / 8
|
||||
rateK448 = (1600 - 448) / 8
|
||||
rateK512 = (1600 - 512) / 8
|
||||
rateK768 = (1600 - 768) / 8
|
||||
rateK1024 = (1600 - 1024) / 8
|
||||
)
|
||||
|
||||
func new224Generic() *state {
|
||||
return &state{rate: 144, outputLen: 28, dsbyte: 0x06}
|
||||
return &state{rate: rateK448, outputLen: 28, dsbyte: dsbyteSHA3}
|
||||
}
|
||||
|
||||
func new256Generic() *state {
|
||||
return &state{rate: 136, outputLen: 32, dsbyte: 0x06}
|
||||
return &state{rate: rateK512, outputLen: 32, dsbyte: dsbyteSHA3}
|
||||
}
|
||||
|
||||
func new384Generic() *state {
|
||||
return &state{rate: 104, outputLen: 48, dsbyte: 0x06}
|
||||
return &state{rate: rateK768, outputLen: 48, dsbyte: dsbyteSHA3}
|
||||
}
|
||||
|
||||
func new512Generic() *state {
|
||||
return &state{rate: 72, outputLen: 64, dsbyte: 0x06}
|
||||
return &state{rate: rateK1024, outputLen: 64, dsbyte: dsbyteSHA3}
|
||||
}
|
||||
|
||||
// NewLegacyKeccak256 creates a new Keccak-256 hash.
|
||||
//
|
||||
// Only use this function if you require compatibility with an existing cryptosystem
|
||||
// that uses non-standard padding. All other users should use New256 instead.
|
||||
func NewLegacyKeccak256() hash.Hash { return &state{rate: 136, outputLen: 32, dsbyte: 0x01} }
|
||||
func NewLegacyKeccak256() hash.Hash {
|
||||
return &state{rate: rateK512, outputLen: 32, dsbyte: dsbyteKeccak}
|
||||
}
|
||||
|
||||
// NewLegacyKeccak512 creates a new Keccak-512 hash.
|
||||
//
|
||||
// Only use this function if you require compatibility with an existing cryptosystem
|
||||
// that uses non-standard padding. All other users should use New512 instead.
|
||||
func NewLegacyKeccak512() hash.Hash { return &state{rate: 72, outputLen: 64, dsbyte: 0x01} }
|
||||
func NewLegacyKeccak512() hash.Hash {
|
||||
return &state{rate: rateK1024, outputLen: 64, dsbyte: dsbyteKeccak}
|
||||
}
|
||||
|
||||
// Sum224 returns the SHA3-224 digest of the data.
|
||||
func Sum224(data []byte) (digest [28]byte) {
|
||||
|
||||
+122
-63
@@ -4,6 +4,15 @@
|
||||
|
||||
package sha3
|
||||
|
||||
import (
|
||||
"crypto/subtle"
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"unsafe"
|
||||
|
||||
"golang.org/x/sys/cpu"
|
||||
)
|
||||
|
||||
// spongeDirection indicates the direction bytes are flowing through the sponge.
|
||||
type spongeDirection int
|
||||
|
||||
@@ -14,16 +23,13 @@ const (
|
||||
spongeSqueezing
|
||||
)
|
||||
|
||||
const (
|
||||
// maxRate is the maximum size of the internal buffer. SHAKE-256
|
||||
// currently needs the largest buffer.
|
||||
maxRate = 168
|
||||
)
|
||||
|
||||
type state struct {
|
||||
// Generic sponge components.
|
||||
a [25]uint64 // main state of the hash
|
||||
rate int // the number of bytes of state to use
|
||||
a [1600 / 8]byte // main state of the hash
|
||||
|
||||
// a[n:rate] is the buffer. If absorbing, it's the remaining space to XOR
|
||||
// into before running the permutation. If squeezing, it's the remaining
|
||||
// output to produce before running the permutation.
|
||||
n, rate int
|
||||
|
||||
// dsbyte contains the "domain separation" bits and the first bit of
|
||||
// the padding. Sections 6.1 and 6.2 of [1] separate the outputs of the
|
||||
@@ -39,10 +45,6 @@ type state struct {
|
||||
// Extendable-Output Functions (May 2014)"
|
||||
dsbyte byte
|
||||
|
||||
i, n int // storage[i:n] is the buffer, i is only used while squeezing
|
||||
storage [maxRate]byte
|
||||
|
||||
// Specific to SHA-3 and SHAKE.
|
||||
outputLen int // the default output size in bytes
|
||||
state spongeDirection // whether the sponge is absorbing or squeezing
|
||||
}
|
||||
@@ -61,7 +63,7 @@ func (d *state) Reset() {
|
||||
d.a[i] = 0
|
||||
}
|
||||
d.state = spongeAbsorbing
|
||||
d.i, d.n = 0, 0
|
||||
d.n = 0
|
||||
}
|
||||
|
||||
func (d *state) clone() *state {
|
||||
@@ -69,22 +71,25 @@ func (d *state) clone() *state {
|
||||
return &ret
|
||||
}
|
||||
|
||||
// permute applies the KeccakF-1600 permutation. It handles
|
||||
// any input-output buffering.
|
||||
// permute applies the KeccakF-1600 permutation.
|
||||
func (d *state) permute() {
|
||||
switch d.state {
|
||||
case spongeAbsorbing:
|
||||
// If we're absorbing, we need to xor the input into the state
|
||||
// before applying the permutation.
|
||||
xorIn(d, d.storage[:d.rate])
|
||||
d.n = 0
|
||||
keccakF1600(&d.a)
|
||||
case spongeSqueezing:
|
||||
// If we're squeezing, we need to apply the permutation before
|
||||
// copying more output.
|
||||
keccakF1600(&d.a)
|
||||
d.i = 0
|
||||
copyOut(d, d.storage[:d.rate])
|
||||
var a *[25]uint64
|
||||
if cpu.IsBigEndian {
|
||||
a = new([25]uint64)
|
||||
for i := range a {
|
||||
a[i] = binary.LittleEndian.Uint64(d.a[i*8:])
|
||||
}
|
||||
} else {
|
||||
a = (*[25]uint64)(unsafe.Pointer(&d.a))
|
||||
}
|
||||
|
||||
keccakF1600(a)
|
||||
d.n = 0
|
||||
|
||||
if cpu.IsBigEndian {
|
||||
for i := range a {
|
||||
binary.LittleEndian.PutUint64(d.a[i*8:], a[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,53 +97,36 @@ func (d *state) permute() {
|
||||
// the multi-bitrate 10..1 padding rule, and permutes the state.
|
||||
func (d *state) padAndPermute() {
|
||||
// Pad with this instance's domain-separator bits. We know that there's
|
||||
// at least one byte of space in d.buf because, if it were full,
|
||||
// at least one byte of space in the sponge because, if it were full,
|
||||
// permute would have been called to empty it. dsbyte also contains the
|
||||
// first one bit for the padding. See the comment in the state struct.
|
||||
d.storage[d.n] = d.dsbyte
|
||||
d.n++
|
||||
for d.n < d.rate {
|
||||
d.storage[d.n] = 0
|
||||
d.n++
|
||||
}
|
||||
d.a[d.n] ^= d.dsbyte
|
||||
// This adds the final one bit for the padding. Because of the way that
|
||||
// bits are numbered from the LSB upwards, the final bit is the MSB of
|
||||
// the last byte.
|
||||
d.storage[d.rate-1] ^= 0x80
|
||||
d.a[d.rate-1] ^= 0x80
|
||||
// Apply the permutation
|
||||
d.permute()
|
||||
d.state = spongeSqueezing
|
||||
d.n = d.rate
|
||||
copyOut(d, d.storage[:d.rate])
|
||||
}
|
||||
|
||||
// Write absorbs more data into the hash's state. It panics if any
|
||||
// output has already been read.
|
||||
func (d *state) Write(p []byte) (written int, err error) {
|
||||
func (d *state) Write(p []byte) (n int, err error) {
|
||||
if d.state != spongeAbsorbing {
|
||||
panic("sha3: Write after Read")
|
||||
}
|
||||
written = len(p)
|
||||
|
||||
n = len(p)
|
||||
|
||||
for len(p) > 0 {
|
||||
if d.n == 0 && len(p) >= d.rate {
|
||||
// The fast path; absorb a full "rate" bytes of input and apply the permutation.
|
||||
xorIn(d, p[:d.rate])
|
||||
p = p[d.rate:]
|
||||
keccakF1600(&d.a)
|
||||
} else {
|
||||
// The slow path; buffer the input until we can fill the sponge, and then xor it in.
|
||||
todo := d.rate - d.n
|
||||
if todo > len(p) {
|
||||
todo = len(p)
|
||||
}
|
||||
d.n += copy(d.storage[d.n:], p[:todo])
|
||||
p = p[todo:]
|
||||
x := subtle.XORBytes(d.a[d.n:d.rate], d.a[d.n:d.rate], p)
|
||||
d.n += x
|
||||
p = p[x:]
|
||||
|
||||
// If the sponge is full, apply the permutation.
|
||||
if d.n == d.rate {
|
||||
d.permute()
|
||||
}
|
||||
// If the sponge is full, apply the permutation.
|
||||
if d.n == d.rate {
|
||||
d.permute()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -156,14 +144,14 @@ func (d *state) Read(out []byte) (n int, err error) {
|
||||
|
||||
// Now, do the squeezing.
|
||||
for len(out) > 0 {
|
||||
n := copy(out, d.storage[d.i:d.n])
|
||||
d.i += n
|
||||
out = out[n:]
|
||||
|
||||
// Apply the permutation if we've squeezed the sponge dry.
|
||||
if d.i == d.rate {
|
||||
if d.n == d.rate {
|
||||
d.permute()
|
||||
}
|
||||
|
||||
x := copy(out, d.a[d.n:d.rate])
|
||||
d.n += x
|
||||
out = out[x:]
|
||||
}
|
||||
|
||||
return
|
||||
@@ -183,3 +171,74 @@ func (d *state) Sum(in []byte) []byte {
|
||||
dup.Read(hash)
|
||||
return append(in, hash...)
|
||||
}
|
||||
|
||||
const (
|
||||
magicSHA3 = "sha\x08"
|
||||
magicShake = "sha\x09"
|
||||
magicCShake = "sha\x0a"
|
||||
magicKeccak = "sha\x0b"
|
||||
// magic || rate || main state || n || sponge direction
|
||||
marshaledSize = len(magicSHA3) + 1 + 200 + 1 + 1
|
||||
)
|
||||
|
||||
func (d *state) MarshalBinary() ([]byte, error) {
|
||||
return d.AppendBinary(make([]byte, 0, marshaledSize))
|
||||
}
|
||||
|
||||
func (d *state) AppendBinary(b []byte) ([]byte, error) {
|
||||
switch d.dsbyte {
|
||||
case dsbyteSHA3:
|
||||
b = append(b, magicSHA3...)
|
||||
case dsbyteShake:
|
||||
b = append(b, magicShake...)
|
||||
case dsbyteCShake:
|
||||
b = append(b, magicCShake...)
|
||||
case dsbyteKeccak:
|
||||
b = append(b, magicKeccak...)
|
||||
default:
|
||||
panic("unknown dsbyte")
|
||||
}
|
||||
// rate is at most 168, and n is at most rate.
|
||||
b = append(b, byte(d.rate))
|
||||
b = append(b, d.a[:]...)
|
||||
b = append(b, byte(d.n), byte(d.state))
|
||||
return b, nil
|
||||
}
|
||||
|
||||
func (d *state) UnmarshalBinary(b []byte) error {
|
||||
if len(b) != marshaledSize {
|
||||
return errors.New("sha3: invalid hash state")
|
||||
}
|
||||
|
||||
magic := string(b[:len(magicSHA3)])
|
||||
b = b[len(magicSHA3):]
|
||||
switch {
|
||||
case magic == magicSHA3 && d.dsbyte == dsbyteSHA3:
|
||||
case magic == magicShake && d.dsbyte == dsbyteShake:
|
||||
case magic == magicCShake && d.dsbyte == dsbyteCShake:
|
||||
case magic == magicKeccak && d.dsbyte == dsbyteKeccak:
|
||||
default:
|
||||
return errors.New("sha3: invalid hash state identifier")
|
||||
}
|
||||
|
||||
rate := int(b[0])
|
||||
b = b[1:]
|
||||
if rate != d.rate {
|
||||
return errors.New("sha3: invalid hash state function")
|
||||
}
|
||||
|
||||
copy(d.a[:], b)
|
||||
b = b[len(d.a):]
|
||||
|
||||
n, state := int(b[0]), spongeDirection(b[1])
|
||||
if n > d.rate {
|
||||
return errors.New("sha3: invalid hash state")
|
||||
}
|
||||
d.n = n
|
||||
if state != spongeAbsorbing && state != spongeSqueezing {
|
||||
return errors.New("sha3: invalid hash state")
|
||||
}
|
||||
d.state = state
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -13,10 +13,12 @@ package sha3
|
||||
import (
|
||||
"bytes"
|
||||
"compress/flate"
|
||||
"encoding"
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"hash"
|
||||
"io"
|
||||
"math/rand"
|
||||
"os"
|
||||
"strings"
|
||||
@@ -375,6 +377,153 @@ func TestClone(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestCSHAKEAccumulated(t *testing.T) {
|
||||
// Generated with pycryptodome@3.20.0
|
||||
//
|
||||
// from Crypto.Hash import cSHAKE128
|
||||
// rng = cSHAKE128.new()
|
||||
// acc = cSHAKE128.new()
|
||||
// for n in range(200):
|
||||
// N = rng.read(n)
|
||||
// for s in range(200):
|
||||
// S = rng.read(s)
|
||||
// c = cSHAKE128.cSHAKE_XOF(data=None, custom=S, capacity=256, function=N)
|
||||
// c.update(rng.read(100))
|
||||
// acc.update(c.read(200))
|
||||
// c = cSHAKE128.cSHAKE_XOF(data=None, custom=S, capacity=256, function=N)
|
||||
// c.update(rng.read(168))
|
||||
// acc.update(c.read(200))
|
||||
// c = cSHAKE128.cSHAKE_XOF(data=None, custom=S, capacity=256, function=N)
|
||||
// c.update(rng.read(200))
|
||||
// acc.update(c.read(200))
|
||||
// print(acc.read(32).hex())
|
||||
//
|
||||
// and with @noble/hashes@v1.5.0
|
||||
//
|
||||
// import { bytesToHex } from "@noble/hashes/utils";
|
||||
// import { cshake128 } from "@noble/hashes/sha3-addons";
|
||||
// const rng = cshake128.create();
|
||||
// const acc = cshake128.create();
|
||||
// for (let n = 0; n < 200; n++) {
|
||||
// const N = rng.xof(n);
|
||||
// for (let s = 0; s < 200; s++) {
|
||||
// const S = rng.xof(s);
|
||||
// let c = cshake128.create({ NISTfn: N, personalization: S });
|
||||
// c.update(rng.xof(100));
|
||||
// acc.update(c.xof(200));
|
||||
// c = cshake128.create({ NISTfn: N, personalization: S });
|
||||
// c.update(rng.xof(168));
|
||||
// acc.update(c.xof(200));
|
||||
// c = cshake128.create({ NISTfn: N, personalization: S });
|
||||
// c.update(rng.xof(200));
|
||||
// acc.update(c.xof(200));
|
||||
// }
|
||||
// }
|
||||
// console.log(bytesToHex(acc.xof(32)));
|
||||
//
|
||||
t.Run("cSHAKE128", func(t *testing.T) {
|
||||
testCSHAKEAccumulated(t, NewCShake128, rateK256,
|
||||
"bb14f8657c6ec5403d0b0e2ef3d3393497e9d3b1a9a9e8e6c81dbaa5fd809252")
|
||||
})
|
||||
t.Run("cSHAKE256", func(t *testing.T) {
|
||||
testCSHAKEAccumulated(t, NewCShake256, rateK512,
|
||||
"0baaf9250c6e25f0c14ea5c7f9bfde54c8a922c8276437db28f3895bdf6eeeef")
|
||||
})
|
||||
}
|
||||
|
||||
func testCSHAKEAccumulated(t *testing.T, newCShake func(N, S []byte) ShakeHash, rate int64, exp string) {
|
||||
rnd := newCShake(nil, nil)
|
||||
acc := newCShake(nil, nil)
|
||||
for n := 0; n < 200; n++ {
|
||||
N := make([]byte, n)
|
||||
rnd.Read(N)
|
||||
for s := 0; s < 200; s++ {
|
||||
S := make([]byte, s)
|
||||
rnd.Read(S)
|
||||
|
||||
c := newCShake(N, S)
|
||||
io.CopyN(c, rnd, 100 /* < rate */)
|
||||
io.CopyN(acc, c, 200)
|
||||
|
||||
c.Reset()
|
||||
io.CopyN(c, rnd, rate)
|
||||
io.CopyN(acc, c, 200)
|
||||
|
||||
c.Reset()
|
||||
io.CopyN(c, rnd, 200 /* > rate */)
|
||||
io.CopyN(acc, c, 200)
|
||||
}
|
||||
}
|
||||
if got := hex.EncodeToString(acc.Sum(nil)[:32]); got != exp {
|
||||
t.Errorf("got %s, want %s", got, exp)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCSHAKELargeS(t *testing.T) {
|
||||
if testing.Short() {
|
||||
t.Skip("skipping test in short mode.")
|
||||
}
|
||||
|
||||
// See https://go.dev/issue/66232.
|
||||
const s = (1<<32)/8 + 1000 // s * 8 > 2^32
|
||||
S := make([]byte, s)
|
||||
rnd := NewShake128()
|
||||
rnd.Read(S)
|
||||
c := NewCShake128(nil, S)
|
||||
io.CopyN(c, rnd, 1000)
|
||||
|
||||
// Generated with pycryptodome@3.20.0
|
||||
//
|
||||
// from Crypto.Hash import cSHAKE128
|
||||
// rng = cSHAKE128.new()
|
||||
// S = rng.read(536871912)
|
||||
// c = cSHAKE128.new(custom=S)
|
||||
// c.update(rng.read(1000))
|
||||
// print(c.read(32).hex())
|
||||
//
|
||||
exp := "2cb9f237767e98f2614b8779cf096a52da9b3a849280bbddec820771ae529cf0"
|
||||
if got := hex.EncodeToString(c.Sum(nil)); got != exp {
|
||||
t.Errorf("got %s, want %s", got, exp)
|
||||
}
|
||||
}
|
||||
|
||||
func TestMarshalUnmarshal(t *testing.T) {
|
||||
t.Run("SHA3-224", func(t *testing.T) { testMarshalUnmarshal(t, New224()) })
|
||||
t.Run("SHA3-256", func(t *testing.T) { testMarshalUnmarshal(t, New256()) })
|
||||
t.Run("SHA3-384", func(t *testing.T) { testMarshalUnmarshal(t, New384()) })
|
||||
t.Run("SHA3-512", func(t *testing.T) { testMarshalUnmarshal(t, New512()) })
|
||||
t.Run("SHAKE128", func(t *testing.T) { testMarshalUnmarshal(t, NewShake128()) })
|
||||
t.Run("SHAKE256", func(t *testing.T) { testMarshalUnmarshal(t, NewShake256()) })
|
||||
t.Run("cSHAKE128", func(t *testing.T) { testMarshalUnmarshal(t, NewCShake128([]byte("N"), []byte("S"))) })
|
||||
t.Run("cSHAKE256", func(t *testing.T) { testMarshalUnmarshal(t, NewCShake256([]byte("N"), []byte("S"))) })
|
||||
t.Run("Keccak-256", func(t *testing.T) { testMarshalUnmarshal(t, NewLegacyKeccak256()) })
|
||||
t.Run("Keccak-512", func(t *testing.T) { testMarshalUnmarshal(t, NewLegacyKeccak512()) })
|
||||
}
|
||||
|
||||
// TODO(filippo): move this to crypto/internal/cryptotest.
|
||||
func testMarshalUnmarshal(t *testing.T, h hash.Hash) {
|
||||
buf := make([]byte, 200)
|
||||
rand.Read(buf)
|
||||
n := rand.Intn(200)
|
||||
h.Write(buf)
|
||||
want := h.Sum(nil)
|
||||
h.Reset()
|
||||
h.Write(buf[:n])
|
||||
b, err := h.(encoding.BinaryMarshaler).MarshalBinary()
|
||||
if err != nil {
|
||||
t.Errorf("MarshalBinary: %v", err)
|
||||
}
|
||||
h.Write(bytes.Repeat([]byte{0}, 200))
|
||||
if err := h.(encoding.BinaryUnmarshaler).UnmarshalBinary(b); err != nil {
|
||||
t.Errorf("UnmarshalBinary: %v", err)
|
||||
}
|
||||
h.Write(buf[n:])
|
||||
got := h.Sum(nil)
|
||||
if !bytes.Equal(got, want) {
|
||||
t.Errorf("got %x, want %x", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
// BenchmarkPermutationFunction measures the speed of the permutation function
|
||||
// with no input data.
|
||||
func BenchmarkPermutationFunction(b *testing.B) {
|
||||
|
||||
+53
-34
@@ -16,9 +16,12 @@ package sha3
|
||||
// [2] https://doi.org/10.6028/NIST.SP.800-185
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"hash"
|
||||
"io"
|
||||
"math/bits"
|
||||
)
|
||||
|
||||
// ShakeHash defines the interface to hash functions that support
|
||||
@@ -50,44 +53,36 @@ type cshakeState struct {
|
||||
initBlock []byte
|
||||
}
|
||||
|
||||
// Consts for configuring initial SHA-3 state
|
||||
const (
|
||||
dsbyteShake = 0x1f
|
||||
dsbyteCShake = 0x04
|
||||
rate128 = 168
|
||||
rate256 = 136
|
||||
)
|
||||
|
||||
func bytepad(input []byte, w int) []byte {
|
||||
// leftEncode always returns max 9 bytes
|
||||
buf := make([]byte, 0, 9+len(input)+w)
|
||||
buf = append(buf, leftEncode(uint64(w))...)
|
||||
buf = append(buf, input...)
|
||||
padlen := w - (len(buf) % w)
|
||||
return append(buf, make([]byte, padlen)...)
|
||||
func bytepad(data []byte, rate int) []byte {
|
||||
out := make([]byte, 0, 9+len(data)+rate-1)
|
||||
out = append(out, leftEncode(uint64(rate))...)
|
||||
out = append(out, data...)
|
||||
if padlen := rate - len(out)%rate; padlen < rate {
|
||||
out = append(out, make([]byte, padlen)...)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
func leftEncode(value uint64) []byte {
|
||||
var b [9]byte
|
||||
binary.BigEndian.PutUint64(b[1:], value)
|
||||
// Trim all but last leading zero bytes
|
||||
i := byte(1)
|
||||
for i < 8 && b[i] == 0 {
|
||||
i++
|
||||
func leftEncode(x uint64) []byte {
|
||||
// Let n be the smallest positive integer for which 2^(8n) > x.
|
||||
n := (bits.Len64(x) + 7) / 8
|
||||
if n == 0 {
|
||||
n = 1
|
||||
}
|
||||
// Prepend number of encoded bytes
|
||||
b[i-1] = 9 - i
|
||||
return b[i-1:]
|
||||
// Return n || x with n as a byte and x an n bytes in big-endian order.
|
||||
b := make([]byte, 9)
|
||||
binary.BigEndian.PutUint64(b[1:], x)
|
||||
b = b[9-n-1:]
|
||||
b[0] = byte(n)
|
||||
return b
|
||||
}
|
||||
|
||||
func newCShake(N, S []byte, rate, outputLen int, dsbyte byte) ShakeHash {
|
||||
c := cshakeState{state: &state{rate: rate, outputLen: outputLen, dsbyte: dsbyte}}
|
||||
|
||||
// leftEncode returns max 9 bytes
|
||||
c.initBlock = make([]byte, 0, 9*2+len(N)+len(S))
|
||||
c.initBlock = append(c.initBlock, leftEncode(uint64(len(N)*8))...)
|
||||
c.initBlock = make([]byte, 0, 9+len(N)+9+len(S)) // leftEncode returns max 9 bytes
|
||||
c.initBlock = append(c.initBlock, leftEncode(uint64(len(N))*8)...)
|
||||
c.initBlock = append(c.initBlock, N...)
|
||||
c.initBlock = append(c.initBlock, leftEncode(uint64(len(S)*8))...)
|
||||
c.initBlock = append(c.initBlock, leftEncode(uint64(len(S))*8)...)
|
||||
c.initBlock = append(c.initBlock, S...)
|
||||
c.Write(bytepad(c.initBlock, c.rate))
|
||||
return &c
|
||||
@@ -111,6 +106,30 @@ func (c *state) Clone() ShakeHash {
|
||||
return c.clone()
|
||||
}
|
||||
|
||||
func (c *cshakeState) MarshalBinary() ([]byte, error) {
|
||||
return c.AppendBinary(make([]byte, 0, marshaledSize+len(c.initBlock)))
|
||||
}
|
||||
|
||||
func (c *cshakeState) AppendBinary(b []byte) ([]byte, error) {
|
||||
b, err := c.state.AppendBinary(b)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
b = append(b, c.initBlock...)
|
||||
return b, nil
|
||||
}
|
||||
|
||||
func (c *cshakeState) UnmarshalBinary(b []byte) error {
|
||||
if len(b) <= marshaledSize {
|
||||
return errors.New("sha3: invalid hash state")
|
||||
}
|
||||
if err := c.state.UnmarshalBinary(b[:marshaledSize]); err != nil {
|
||||
return err
|
||||
}
|
||||
c.initBlock = bytes.Clone(b[marshaledSize:])
|
||||
return nil
|
||||
}
|
||||
|
||||
// NewShake128 creates a new SHAKE128 variable-output-length ShakeHash.
|
||||
// Its generic security strength is 128 bits against all attacks if at
|
||||
// least 32 bytes of its output are used.
|
||||
@@ -126,11 +145,11 @@ func NewShake256() ShakeHash {
|
||||
}
|
||||
|
||||
func newShake128Generic() *state {
|
||||
return &state{rate: rate128, outputLen: 32, dsbyte: dsbyteShake}
|
||||
return &state{rate: rateK256, outputLen: 32, dsbyte: dsbyteShake}
|
||||
}
|
||||
|
||||
func newShake256Generic() *state {
|
||||
return &state{rate: rate256, outputLen: 64, dsbyte: dsbyteShake}
|
||||
return &state{rate: rateK512, outputLen: 64, dsbyte: dsbyteShake}
|
||||
}
|
||||
|
||||
// NewCShake128 creates a new instance of cSHAKE128 variable-output-length ShakeHash,
|
||||
@@ -143,7 +162,7 @@ func NewCShake128(N, S []byte) ShakeHash {
|
||||
if len(N) == 0 && len(S) == 0 {
|
||||
return NewShake128()
|
||||
}
|
||||
return newCShake(N, S, rate128, 32, dsbyteCShake)
|
||||
return newCShake(N, S, rateK256, 32, dsbyteCShake)
|
||||
}
|
||||
|
||||
// NewCShake256 creates a new instance of cSHAKE256 variable-output-length ShakeHash,
|
||||
@@ -156,7 +175,7 @@ func NewCShake256(N, S []byte) ShakeHash {
|
||||
if len(N) == 0 && len(S) == 0 {
|
||||
return NewShake256()
|
||||
}
|
||||
return newCShake(N, S, rate256, 64, dsbyteCShake)
|
||||
return newCShake(N, S, rateK512, 64, dsbyteCShake)
|
||||
}
|
||||
|
||||
// ShakeSum128 writes an arbitrary-length digest of data into hash.
|
||||
|
||||
-40
@@ -1,40 +0,0 @@
|
||||
// Copyright 2015 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 sha3
|
||||
|
||||
import (
|
||||
"crypto/subtle"
|
||||
"encoding/binary"
|
||||
"unsafe"
|
||||
|
||||
"golang.org/x/sys/cpu"
|
||||
)
|
||||
|
||||
// xorIn xors the bytes in buf into the state.
|
||||
func xorIn(d *state, buf []byte) {
|
||||
if cpu.IsBigEndian {
|
||||
for i := 0; len(buf) >= 8; i++ {
|
||||
a := binary.LittleEndian.Uint64(buf)
|
||||
d.a[i] ^= a
|
||||
buf = buf[8:]
|
||||
}
|
||||
} else {
|
||||
ab := (*[25 * 64 / 8]byte)(unsafe.Pointer(&d.a))
|
||||
subtle.XORBytes(ab[:], ab[:], buf)
|
||||
}
|
||||
}
|
||||
|
||||
// copyOut copies uint64s to a byte buffer.
|
||||
func copyOut(d *state, b []byte) {
|
||||
if cpu.IsBigEndian {
|
||||
for i := 0; len(b) >= 8; i++ {
|
||||
binary.LittleEndian.PutUint64(b, d.a[i])
|
||||
b = b[8:]
|
||||
}
|
||||
} else {
|
||||
ab := (*[25 * 64 / 8]byte)(unsafe.Pointer(&d.a))
|
||||
copy(b, ab[:])
|
||||
}
|
||||
}
|
||||
@@ -175,6 +175,15 @@ func (r *keyring) Add(key AddedKey) error {
|
||||
p.expire = &t
|
||||
}
|
||||
|
||||
// If we already have a Signer with the same public key, replace it with the
|
||||
// new one.
|
||||
for idx, k := range r.keys {
|
||||
if bytes.Equal(k.signer.PublicKey().Marshal(), p.signer.PublicKey().Marshal()) {
|
||||
r.keys[idx] = p
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
r.keys = append(r.keys, p)
|
||||
|
||||
return nil
|
||||
|
||||
@@ -29,6 +29,10 @@ func validateListedKeys(t *testing.T, a Agent, expectedKeys []string) {
|
||||
t.Fatalf("failed to list keys: %v", err)
|
||||
return
|
||||
}
|
||||
if len(listedKeys) != len(expectedKeys) {
|
||||
t.Fatalf("expeted %d key, got %d", len(expectedKeys), len(listedKeys))
|
||||
return
|
||||
}
|
||||
actualKeys := make(map[string]bool)
|
||||
for _, key := range listedKeys {
|
||||
actualKeys[key.Comment] = true
|
||||
@@ -74,3 +78,45 @@ func TestKeyringAddingAndRemoving(t *testing.T) {
|
||||
}
|
||||
validateListedKeys(t, k, []string{})
|
||||
}
|
||||
|
||||
func TestAddDuplicateKey(t *testing.T) {
|
||||
keyNames := []string{"rsa", "user"}
|
||||
|
||||
k := NewKeyring()
|
||||
for _, keyName := range keyNames {
|
||||
addTestKey(t, k, keyName)
|
||||
}
|
||||
validateListedKeys(t, k, keyNames)
|
||||
// Add the keys again.
|
||||
for _, keyName := range keyNames {
|
||||
addTestKey(t, k, keyName)
|
||||
}
|
||||
validateListedKeys(t, k, keyNames)
|
||||
// Add an existing key with an updated comment.
|
||||
keyName := keyNames[0]
|
||||
addedKey := AddedKey{
|
||||
PrivateKey: testPrivateKeys[keyName],
|
||||
Comment: "comment updated",
|
||||
}
|
||||
err := k.Add(addedKey)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to add key %q: %v", keyName, err)
|
||||
}
|
||||
// Check the that key is found and the comment was updated.
|
||||
keys, err := k.List()
|
||||
if err != nil {
|
||||
t.Fatalf("failed to list keys: %v", err)
|
||||
}
|
||||
if len(keys) != len(keyNames) {
|
||||
t.Fatalf("expected %d keys, got %d", len(keyNames), len(keys))
|
||||
}
|
||||
isFound := false
|
||||
for _, key := range keys {
|
||||
if key.Comment == addedKey.Comment {
|
||||
isFound = true
|
||||
}
|
||||
}
|
||||
if !isFound {
|
||||
t.Fatal("key with the updated comment not found")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -555,6 +555,7 @@ func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packe
|
||||
}
|
||||
|
||||
gotMsgExtInfo := false
|
||||
gotUserAuthInfoRequest := false
|
||||
for {
|
||||
packet, err := c.readPacket()
|
||||
if err != nil {
|
||||
@@ -585,6 +586,9 @@ func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packe
|
||||
if msg.PartialSuccess {
|
||||
return authPartialSuccess, msg.Methods, nil
|
||||
}
|
||||
if !gotUserAuthInfoRequest {
|
||||
return authFailure, msg.Methods, unexpectedMessageError(msgUserAuthInfoRequest, packet[0])
|
||||
}
|
||||
return authFailure, msg.Methods, nil
|
||||
case msgUserAuthSuccess:
|
||||
return authSuccess, nil, nil
|
||||
@@ -596,6 +600,7 @@ func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packe
|
||||
if err := Unmarshal(packet, &msg); err != nil {
|
||||
return authFailure, nil, err
|
||||
}
|
||||
gotUserAuthInfoRequest = true
|
||||
|
||||
// Manually unpack the prompt/echo pairs.
|
||||
rest := msg.Prompts
|
||||
|
||||
+107
-7
@@ -641,17 +641,28 @@ func TestClientAuthMaxAuthTries(t *testing.T) {
|
||||
defer c1.Close()
|
||||
defer c2.Close()
|
||||
|
||||
go newServer(c1, serverConfig)
|
||||
_, _, _, err = NewClientConn(c2, "", clientConfig)
|
||||
if tries > 2 {
|
||||
if err == nil {
|
||||
errCh := make(chan error, 1)
|
||||
|
||||
go func() {
|
||||
_, err := newServer(c1, serverConfig)
|
||||
errCh <- err
|
||||
}()
|
||||
_, _, _, cliErr := NewClientConn(c2, "", clientConfig)
|
||||
srvErr := <-errCh
|
||||
|
||||
if tries > serverConfig.MaxAuthTries {
|
||||
if cliErr == nil {
|
||||
t.Fatalf("client: got no error, want %s", expectedErr)
|
||||
} else if err.Error() != expectedErr.Error() {
|
||||
} else if cliErr.Error() != expectedErr.Error() {
|
||||
t.Fatalf("client: got %s, want %s", err, expectedErr)
|
||||
}
|
||||
var authErr *ServerAuthError
|
||||
if !errors.As(srvErr, &authErr) {
|
||||
t.Errorf("expected ServerAuthError, got: %v", srvErr)
|
||||
}
|
||||
} else {
|
||||
if err != nil {
|
||||
t.Fatalf("client: got %s, want no error", err)
|
||||
if cliErr != nil {
|
||||
t.Fatalf("client: got %s, want no error", cliErr)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1282,3 +1293,92 @@ func TestCertAuthOpenSSHCompat(t *testing.T) {
|
||||
t.Fatalf("unable to dial remote side: %s", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestKeyboardInteractiveAuthEarlyFail(t *testing.T) {
|
||||
const maxAuthTries = 2
|
||||
|
||||
c1, c2, err := netPipe()
|
||||
if err != nil {
|
||||
t.Fatalf("netPipe: %v", err)
|
||||
}
|
||||
defer c1.Close()
|
||||
defer c2.Close()
|
||||
|
||||
// Start testserver
|
||||
serverConfig := &ServerConfig{
|
||||
MaxAuthTries: maxAuthTries,
|
||||
KeyboardInteractiveCallback: func(c ConnMetadata,
|
||||
client KeyboardInteractiveChallenge) (*Permissions, error) {
|
||||
// Fail keyboard-interactive authentication early before
|
||||
// any prompt is sent to client.
|
||||
return nil, errors.New("keyboard-interactive auth failed")
|
||||
},
|
||||
PasswordCallback: func(c ConnMetadata,
|
||||
pass []byte) (*Permissions, error) {
|
||||
if string(pass) == clientPassword {
|
||||
return nil, nil
|
||||
}
|
||||
return nil, errors.New("password auth failed")
|
||||
},
|
||||
}
|
||||
serverConfig.AddHostKey(testSigners["rsa"])
|
||||
|
||||
serverDone := make(chan struct{})
|
||||
go func() {
|
||||
defer func() { serverDone <- struct{}{} }()
|
||||
conn, chans, reqs, err := NewServerConn(c2, serverConfig)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
_ = conn.Close()
|
||||
|
||||
discarderDone := make(chan struct{})
|
||||
go func() {
|
||||
defer func() { discarderDone <- struct{}{} }()
|
||||
DiscardRequests(reqs)
|
||||
}()
|
||||
for newChannel := range chans {
|
||||
newChannel.Reject(Prohibited,
|
||||
"testserver not accepting requests")
|
||||
}
|
||||
|
||||
<-discarderDone
|
||||
}()
|
||||
|
||||
// Connect to testserver, expect KeyboardInteractive() to be not called,
|
||||
// PasswordCallback() to be called and connection to succeed.
|
||||
passwordCallbackCalled := false
|
||||
clientConfig := &ClientConfig{
|
||||
User: "testuser",
|
||||
Auth: []AuthMethod{
|
||||
RetryableAuthMethod(KeyboardInteractive(func(name,
|
||||
instruction string, questions []string,
|
||||
echos []bool) ([]string, error) {
|
||||
t.Errorf("unexpected call to KeyboardInteractive()")
|
||||
return []string{clientPassword}, nil
|
||||
}), maxAuthTries),
|
||||
RetryableAuthMethod(PasswordCallback(func() (secret string,
|
||||
err error) {
|
||||
t.Logf("PasswordCallback()")
|
||||
passwordCallbackCalled = true
|
||||
return clientPassword, nil
|
||||
}), maxAuthTries),
|
||||
},
|
||||
HostKeyCallback: InsecureIgnoreHostKey(),
|
||||
}
|
||||
|
||||
conn, _, _, err := NewClientConn(c1, "", clientConfig)
|
||||
if err != nil {
|
||||
t.Errorf("unexpected NewClientConn() error: %v", err)
|
||||
}
|
||||
if conn != nil {
|
||||
conn.Close()
|
||||
}
|
||||
|
||||
// Wait for server to finish.
|
||||
<-serverDone
|
||||
|
||||
if !passwordCallbackCalled {
|
||||
t.Errorf("expected PasswordCallback() to be called")
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -510,8 +510,8 @@ userAuthLoop:
|
||||
if err := s.transport.writePacket(Marshal(discMsg)); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return nil, discMsg
|
||||
authErrs = append(authErrs, discMsg)
|
||||
return nil, &ServerAuthError{Errors: authErrs}
|
||||
}
|
||||
|
||||
var userAuthReq userAuthRequestMsg
|
||||
|
||||
+105
-288
@@ -161,98 +161,6 @@ ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU
|
||||
LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT
|
||||
LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
|
||||
-----END CERTIFICATE-----
|
||||
# CN=AffirmTrust Commercial,O=AffirmTrust,C=US
|
||||
# 0376ab1d54c5f9803ce4b2e201a0ee7eef7b57b636e8a93c9b8d4860c96f5fa7
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE
|
||||
BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
|
||||
dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL
|
||||
MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
|
||||
cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
|
||||
AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP
|
||||
Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr
|
||||
ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL
|
||||
MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1
|
||||
yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr
|
||||
VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/
|
||||
nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
|
||||
KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG
|
||||
XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj
|
||||
vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt
|
||||
Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g
|
||||
N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC
|
||||
nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
|
||||
-----END CERTIFICATE-----
|
||||
# CN=AffirmTrust Networking,O=AffirmTrust,C=US
|
||||
# 0a81ec5a929777f145904af38d5d509f66b5e2c58fcdb531058b0e17f3f0b41b
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE
|
||||
BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
|
||||
dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL
|
||||
MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
|
||||
cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
|
||||
AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y
|
||||
YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua
|
||||
kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL
|
||||
QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp
|
||||
6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG
|
||||
yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i
|
||||
QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
|
||||
KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO
|
||||
tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu
|
||||
QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ
|
||||
Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u
|
||||
olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48
|
||||
x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
|
||||
-----END CERTIFICATE-----
|
||||
# CN=AffirmTrust Premium ECC,O=AffirmTrust,C=US
|
||||
# bd71fdf6da97e4cf62d1647add2581b07d79adf8397eb4ecba9c5e8488821423
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC
|
||||
VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ
|
||||
cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ
|
||||
BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt
|
||||
VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D
|
||||
0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9
|
||||
ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G
|
||||
A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G
|
||||
A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs
|
||||
aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I
|
||||
flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==
|
||||
-----END CERTIFICATE-----
|
||||
# CN=AffirmTrust Premium,O=AffirmTrust,C=US
|
||||
# 70a73f7f376b60074248904534b11482d5bf0e698ecc498df52577ebf2e93b9a
|
||||
-----BEGIN CERTIFICATE-----
|
||||
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
|
||||
KeC2uAloGRwYQw==
|
||||
-----END CERTIFICATE-----
|
||||
# CN=Amazon Root CA 1,O=Amazon,C=US
|
||||
# 8ecde6884f3d87b1125ba31ac3fcb13d7016de7f57cc904fe1cb97c6ae98196e
|
||||
-----BEGIN CERTIFICATE-----
|
||||
@@ -1385,147 +1293,6 @@ r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1
|
||||
/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm
|
||||
gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+
|
||||
-----END CERTIFICATE-----
|
||||
# CN=Entrust Root Certification Authority - EC1,OU=See www.entrust.net/legal-terms+OU=(c) 2012 Entrust\, Inc. - for authorized use only,O=Entrust\, Inc.,C=US
|
||||
# 02ed0eb28c14da45165c566791700d6451d7fb56f0b2ab1d3b8eb070e56edff5
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG
|
||||
A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3
|
||||
d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu
|
||||
dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq
|
||||
RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy
|
||||
MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD
|
||||
VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0
|
||||
L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g
|
||||
Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD
|
||||
ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi
|
||||
A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt
|
||||
ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH
|
||||
Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
|
||||
BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC
|
||||
R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX
|
||||
hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
|
||||
-----END CERTIFICATE-----
|
||||
# CN=Entrust Root Certification Authority - G2,OU=See www.entrust.net/legal-terms+OU=(c) 2009 Entrust\, Inc. - for authorized use only,O=Entrust\, Inc.,C=US
|
||||
# 43df5774b03e7fef5fe40d931a7bedf1bb2e6b42738c4e6d3841103d3aa7f339
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC
|
||||
VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50
|
||||
cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs
|
||||
IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz
|
||||
dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy
|
||||
NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu
|
||||
dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt
|
||||
dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0
|
||||
aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj
|
||||
YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
|
||||
AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T
|
||||
RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN
|
||||
cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW
|
||||
wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1
|
||||
U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0
|
||||
jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP
|
||||
BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN
|
||||
BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/
|
||||
jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
|
||||
Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v
|
||||
1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R
|
||||
nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH
|
||||
VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g==
|
||||
-----END CERTIFICATE-----
|
||||
# CN=Entrust Root Certification Authority - G4,OU=See www.entrust.net/legal-terms+OU=(c) 2015 Entrust\, Inc. - for authorized use only,O=Entrust\, Inc.,C=US
|
||||
# db3517d1f6732a2d5ab97c533ec70779ee3270a62fb4ac4238372460e6f01e88
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAw
|
||||
gb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL
|
||||
Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg
|
||||
MjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAw
|
||||
BgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0
|
||||
MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYTAlVT
|
||||
MRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1
|
||||
c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJ
|
||||
bmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3Qg
|
||||
Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0MIICIjANBgkqhkiG9w0B
|
||||
AQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3DumSXbcr3DbVZwbPLqGgZ
|
||||
2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV3imz/f3E
|
||||
T+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j
|
||||
5pds8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAM
|
||||
C1rlLAHGVK/XqsEQe9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73T
|
||||
DtTUXm6Hnmo9RR3RXRv06QqsYJn7ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNX
|
||||
wbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5XxNMhIWNlUpEbsZmOeX7m640A
|
||||
2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV7rtNOzK+mndm
|
||||
nqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8
|
||||
dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwl
|
||||
N4y6mACXi0mWHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNj
|
||||
c0kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
|
||||
VR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9nMA0GCSqGSIb3DQEBCwUAA4ICAQAS
|
||||
5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4QjbRaZIxowLByQzTS
|
||||
Gwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht7LGr
|
||||
hFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/
|
||||
B7NTeLUKYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uI
|
||||
AeV8KEsD+UmDfLJ/fOPtjqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbw
|
||||
H5Lk6rWS02FREAutp9lfx1/cH6NcjKF+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+
|
||||
b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKWRGhXxNUzzxkvFMSUHHuk
|
||||
2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjAJOgc47Ol
|
||||
IQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk
|
||||
5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY
|
||||
n/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw==
|
||||
-----END CERTIFICATE-----
|
||||
# CN=Entrust Root Certification Authority,OU=www.entrust.net/CPS is incorporated by reference+OU=(c) 2006 Entrust\, Inc.,O=Entrust\, Inc.,C=US
|
||||
# 73c176434f1bc6d5adf45b0e76e727287c8de57616c1e6e6141a2b2cbc7d8e4c
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
|
||||
VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
|
||||
Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
|
||||
KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
|
||||
cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
|
||||
NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
|
||||
NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
|
||||
ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
|
||||
BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
|
||||
KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
|
||||
Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
|
||||
4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
|
||||
KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
|
||||
rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
|
||||
94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
|
||||
sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
|
||||
gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
|
||||
kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
|
||||
vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
|
||||
A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
|
||||
O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
|
||||
AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
|
||||
9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
|
||||
eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
|
||||
0vdXcDazv/wor3ElhVsT/h5/WrQ8
|
||||
-----END CERTIFICATE-----
|
||||
# CN=Entrust.net Certification Authority (2048),OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)+OU=(c) 1999 Entrust.net Limited,O=Entrust.net
|
||||
# 6dc47172e01cbcb0bf62580d895fe2b8ac9ad4f873801e0c10b9c837d21eb177
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
|
||||
RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
|
||||
bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
|
||||
IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
|
||||
ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3
|
||||
MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
|
||||
LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
|
||||
YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
|
||||
A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
|
||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
|
||||
K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
|
||||
sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
|
||||
MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
|
||||
XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
|
||||
HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
|
||||
4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
|
||||
HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub
|
||||
j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo
|
||||
U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
|
||||
zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b
|
||||
u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+
|
||||
bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er
|
||||
fF6adulZkMV8gzURZVE=
|
||||
-----END CERTIFICATE-----
|
||||
# CN=FIRMAPROFESIONAL CA ROOT-A WEB,O=Firmaprofesional SA,C=ES,2.5.4.97=#130f56415445532d413632363334303638
|
||||
# bef256daf26e9c69bdec1602359798f3caf71821a03e018257c53c65617f3d4a
|
||||
-----BEGIN CERTIFICATE-----
|
||||
@@ -2794,28 +2561,78 @@ I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY
|
||||
iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
|
||||
f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
|
||||
-----END CERTIFICATE-----
|
||||
# CN=SecureSign RootCA11,O=Japan Certification Services\, Inc.,C=JP
|
||||
# bf0feefb9e3a581ad5f9e9db7589985743d261085c4d314f6f5d7259aa421612
|
||||
# CN=SecureSign Root CA12,O=Cybertrust Japan Co.\, Ltd.,C=JP
|
||||
# 3f034bb5704d44b2d08545a02057de93ebf3905fce721acbc730c06ddaee904e
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr
|
||||
MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG
|
||||
A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0
|
||||
MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp
|
||||
Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD
|
||||
QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz
|
||||
i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8
|
||||
h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV
|
||||
MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9
|
||||
UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni
|
||||
8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC
|
||||
h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD
|
||||
VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB
|
||||
AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm
|
||||
KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ
|
||||
X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr
|
||||
QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5
|
||||
pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN
|
||||
QSdJQO7e5iNEOdyhIta6A/I=
|
||||
MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQEL
|
||||
BQAwUTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28u
|
||||
LCBMdGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgw
|
||||
NTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpD
|
||||
eWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBS
|
||||
b290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3emhF
|
||||
KxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mt
|
||||
p7JIKwccJ/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zd
|
||||
J1M3s6oYwlkm7Fsf0uZlfO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gur
|
||||
FzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBFEaCeVESE99g2zvVQR9wsMJvuwPWW0v4J
|
||||
hscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1UefNzFJM3IFTQy2VYzxV4+K
|
||||
h9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
|
||||
AgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsF
|
||||
AAOCAQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6Ld
|
||||
mmQOmFxv3Y67ilQiLUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJ
|
||||
mBClnW8Zt7vPemVV2zfrPIpyMpcemik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA
|
||||
8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPSvWKErI4cqc1avTc7bgoitPQV
|
||||
55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhgaaaI5gdka9at/
|
||||
yOPiZwud9AzqVN/Ssq+xIvEg37xEHA==
|
||||
-----END CERTIFICATE-----
|
||||
# CN=SecureSign Root CA14,O=Cybertrust Japan Co.\, Ltd.,C=JP
|
||||
# 4b009c1034494f9ab56bba3ba1d62731fc4d20d8955adcec10a925607261e338
|
||||
-----BEGIN CERTIFICATE-----
|
||||
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
|
||||
JRNItX+S
|
||||
-----END CERTIFICATE-----
|
||||
# CN=SecureSign Root CA15,O=Cybertrust Japan Co.\, Ltd.,C=JP
|
||||
# e778f0f095fe843729cd1a0082179e5314a9c291442805e1fb1d8fb6b8886c3a
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMw
|
||||
UTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBM
|
||||
dGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMy
|
||||
NTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpDeWJl
|
||||
cnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBSb290
|
||||
IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5GdCx4
|
||||
wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSR
|
||||
ZHX+AezB2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMB
|
||||
Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT
|
||||
9DAKBggqhkjOPQQDAwNoADBlAjEA2S6Jfl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp
|
||||
4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJSwdLZrWeqrqgHkHZAXQ6
|
||||
bkU6iYAZezKYVWOr62Nuk22rGwlgMU4=
|
||||
-----END CERTIFICATE-----
|
||||
# CN=SecureTrust CA,O=SecureTrust Corporation,C=US
|
||||
# f1c1b50ae5a20dd8030ec9f6bc24823dd367b5255759b4e71b61fce9f7375d73
|
||||
@@ -2857,40 +2674,6 @@ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu
|
||||
9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3LsnNdo4gIxwwCMQDAqy0O
|
||||
be0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70eN9k=
|
||||
-----END CERTIFICATE-----
|
||||
# CN=Security Communication RootCA3,O=SECOM Trust Systems CO.\,LTD.,C=JP
|
||||
# 24a55c2ab051442d0617766541239a4ad032d7c55175aa34ffde2fbc4f5c5294
|
||||
-----BEGIN CERTIFICATE-----
|
||||
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
|
||||
TdJ0MN1kURXbg4NR16/9M51NZg==
|
||||
-----END CERTIFICATE-----
|
||||
# CN=Starfield Root Certificate Authority - G2,O=Starfield Technologies\, Inc.,L=Scottsdale,ST=Arizona,C=US
|
||||
# 2ce1cb0bf9d2f9e102993fbe215152c3b2dd0cabde1c68e5319b839154dbb7f5
|
||||
-----BEGIN CERTIFICATE-----
|
||||
@@ -3062,6 +2845,40 @@ WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ
|
||||
e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p
|
||||
TpPDpFQUWw==
|
||||
-----END CERTIFICATE-----
|
||||
# CN=TWCA CYBER Root CA,OU=Root CA,O=TAIWAN-CA,C=TW
|
||||
# 3f63bb2814be174ec8b6439cf08d6d56f0b7c405883a5648a334424d6b3ec558
|
||||
-----BEGIN CERTIFICATE-----
|
||||
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
|
||||
-----END CERTIFICATE-----
|
||||
# CN=TWCA Global Root CA,OU=Root CA,O=TAIWAN-CA,C=TW
|
||||
# 59769007f7685d0fcd50872f9f95d5755a5b2b457d81f3692b610a98672f0e1b
|
||||
-----BEGIN CERTIFICATE-----
|
||||
|
||||
Reference in New Issue
Block a user