From 0f1180f29c721c71d2c020b0b9dc374865cd6403 Mon Sep 17 00:00:00 2001 From: Michael McLoughlin Date: Fri, 17 Jan 2025 11:32:45 -0500 Subject: [PATCH 1/5] migrate avo to asm module --- sha1cdblock_amd64_asm.go => asm/asm.go | 29 +++++++++++++++----------- asm/go.mod | 10 +++++++++ asm/go.sum | 8 +++++++ go.mod | 8 ------- go.sum | 13 ------------ sha1cd.go | 3 ++- sha1cdblock_amd64.s | 3 +-- 7 files changed, 38 insertions(+), 36 deletions(-) rename sha1cdblock_amd64_asm.go => asm/asm.go (93%) create mode 100644 asm/go.mod create mode 100644 asm/go.sum diff --git a/sha1cdblock_amd64_asm.go b/asm/asm.go similarity index 93% rename from sha1cdblock_amd64_asm.go rename to asm/asm.go index 9570273..45c5bf1 100644 --- a/sha1cdblock_amd64_asm.go +++ b/asm/asm.go @@ -1,6 +1,3 @@ -//go:build ignore -// +build ignore - package main import ( @@ -8,10 +5,18 @@ import ( "github.com/mmcloughlin/avo/buildtags" . "github.com/mmcloughlin/avo/operand" . "github.com/mmcloughlin/avo/reg" - shared "github.com/pjbgf/sha1cd/internal" ) -//go:generate go run sha1cdblock_amd64_asm.go -out sha1cdblock_amd64.s +const ( + // Constants for the SHA-1 hash function. + RoundConst0 = 0x5A827999 + RoundConst1 = 0x6ED9EBA1 + RoundConst2 = 0x8F1BBCDC + RoundConst3 = 0xCA62C1D6 + + // SHA1 processes the input data in chunks. Each chunk contains 64 bytes. + Chunk = 64 +) func main() { Constraint(buildtags.Not("noasm").ToConstraint()) @@ -61,7 +66,7 @@ func main() { } // Store message values on the stack. - w := AllocLocal(shared.Chunk) + w := AllocLocal(Chunk) W := func(r int) Mem { return w.Offset((r % 16) * 4) } Comment("len(p) >= chunk") @@ -161,7 +166,7 @@ func main() { Commentf("ROUND1(%d)", index) LOAD(index) FUNC1(a, b, c, d, e) - MIX(a, b, c, d, e, shared.K0) + MIX(a, b, c, d, e, RoundConst0) LOADM1(index) } @@ -169,7 +174,7 @@ func main() { Commentf("ROUND1x(%d)", index) SHUFFLE(index) FUNC1(a, b, c, d, e) - MIX(a, b, c, d, e, shared.K0) + MIX(a, b, c, d, e, RoundConst0) LOADM1(index) } @@ -177,7 +182,7 @@ func main() { Commentf("ROUND2(%d)", index) SHUFFLE(index) FUNC2(a, b, c, d, e) - MIX(a, b, c, d, e, shared.K1) + MIX(a, b, c, d, e, RoundConst1) LOADM1(index) } @@ -185,7 +190,7 @@ func main() { Commentf("ROUND3(%d)", index) SHUFFLE(index) FUNC3(a, b, c, d, e) - MIX(a, b, c, d, e, shared.K2) + MIX(a, b, c, d, e, RoundConst2) LOADM1(index) } @@ -193,7 +198,7 @@ func main() { Commentf("ROUND4(%d)", index) SHUFFLE(index) FUNC4(a, b, c, d, e) - MIX(a, b, c, d, e, shared.K3) + MIX(a, b, c, d, e, RoundConst3) LOADM1(index) } @@ -297,7 +302,7 @@ func main() { ADDL(r, hash[i]) } - ADDQ(I8(shared.Chunk), p_base) + ADDQ(I8(Chunk), p_base) CMPQ(p_base, di64) JB(LabelRef("loop")) diff --git a/asm/go.mod b/asm/go.mod new file mode 100644 index 0000000..a72d9ce --- /dev/null +++ b/asm/go.mod @@ -0,0 +1,10 @@ +module github.com/pjbgf/sha1cd/asm + +go 1.23.4 + +require github.com/mmcloughlin/avo v0.6.0 + +require ( + golang.org/x/mod v0.14.0 // indirect + golang.org/x/tools v0.16.1 // indirect +) diff --git a/asm/go.sum b/asm/go.sum new file mode 100644 index 0000000..483bba8 --- /dev/null +++ b/asm/go.sum @@ -0,0 +1,8 @@ +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/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= +golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= diff --git a/go.mod b/go.mod index fd5fb11..cd8d1f3 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,3 @@ module github.com/pjbgf/sha1cd go 1.21 - -require github.com/mmcloughlin/avo v0.6.0 - -require ( - golang.org/x/mod v0.17.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/tools v0.20.0 // indirect -) diff --git a/go.sum b/go.sum index 4dd7891..e69de29 100644 --- a/go.sum +++ b/go.sum @@ -1,13 +0,0 @@ -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/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= -golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= -golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= -golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= diff --git a/sha1cd.go b/sha1cd.go index 17f6f84..3e5c58b 100644 --- a/sha1cd.go +++ b/sha1cd.go @@ -17,10 +17,11 @@ import ( "errors" "hash" - _ "github.com/mmcloughlin/avo/build" shared "github.com/pjbgf/sha1cd/internal" ) +//go:generate go run -modfile=asm/go.mod asm/asm.go -out sha1cdblock_amd64.s -pkg $PKG + func init() { crypto.RegisterHash(crypto.SHA1, New) } diff --git a/sha1cdblock_amd64.s b/sha1cdblock_amd64.s index 86f9821..e4d357e 100644 --- a/sha1cdblock_amd64.s +++ b/sha1cdblock_amd64.s @@ -1,7 +1,6 @@ -// Code generated by command: go run sha1cdblock_amd64_asm.go -out sha1cdblock_amd64.s. DO NOT EDIT. +// Code generated by command: go run asm.go -out sha1cdblock_amd64.s -pkg . DO NOT EDIT. //go:build !noasm && gc && amd64 -// +build !noasm,gc,amd64 #include "textflag.h" From 2dc0fd6b501a50bc4afcba8facf8a42e036006dd Mon Sep 17 00:00:00 2001 From: Michael McLoughlin Date: Fri, 17 Jan 2025 11:36:08 -0500 Subject: [PATCH 2/5] reduce go version in asm go.mod --- asm/go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asm/go.mod b/asm/go.mod index a72d9ce..a60dad3 100644 --- a/asm/go.mod +++ b/asm/go.mod @@ -1,6 +1,6 @@ module github.com/pjbgf/sha1cd/asm -go 1.23.4 +go 1.21 require github.com/mmcloughlin/avo v0.6.0 From ff2b6bbb23992d0448da7f2777b2322fdee2b975 Mon Sep 17 00:00:00 2001 From: Michael McLoughlin Date: Sat, 18 Jan 2025 14:51:04 -0500 Subject: [PATCH 3/5] move ubc generator to sub-module --- ubc/{ubc_amd64_asm.go => asm/asm.go} | 5 ----- ubc/asm/go.mod | 16 ++++++++++++++++ ubc/asm/go.sum | 8 ++++++++ ubc/{doc.go => ubc.go} | 2 ++ ubc/ubc_amd64.s | 3 +-- 5 files changed, 27 insertions(+), 7 deletions(-) rename ubc/{ubc_amd64_asm.go => asm/asm.go} (99%) create mode 100644 ubc/asm/go.mod create mode 100644 ubc/asm/go.sum rename ubc/{doc.go => ubc.go} (68%) diff --git a/ubc/ubc_amd64_asm.go b/ubc/asm/asm.go similarity index 99% rename from ubc/ubc_amd64_asm.go rename to ubc/asm/asm.go index b2ba70c..c639c19 100644 --- a/ubc/ubc_amd64_asm.go +++ b/ubc/asm/asm.go @@ -1,6 +1,3 @@ -//go:build ignore -// +build ignore - package main import ( @@ -10,8 +7,6 @@ import ( "github.com/pjbgf/sha1cd/ubc" ) -//go:generate go run ubc_amd64_asm.go -out ubc_amd64.s - const ( DvTypeOffset = 0 DvKOffset = 4 diff --git a/ubc/asm/go.mod b/ubc/asm/go.mod new file mode 100644 index 0000000..cec3bb4 --- /dev/null +++ b/ubc/asm/go.mod @@ -0,0 +1,16 @@ +module github.com/pjbgf/sha1cd/ubc/asm + +go 1.21 + +require ( + github.com/mmcloughlin/avo v0.6.0 + github.com/pjbgf/sha1cd v0.0.0-local +) + +require ( + golang.org/x/mod v0.17.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/tools v0.20.0 // indirect +) + +replace github.com/pjbgf/sha1cd => ../.. diff --git a/ubc/asm/go.sum b/ubc/asm/go.sum new file mode 100644 index 0000000..487ec7d --- /dev/null +++ b/ubc/asm/go.sum @@ -0,0 +1,8 @@ +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/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= +golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= diff --git a/ubc/doc.go b/ubc/ubc.go similarity index 68% rename from ubc/doc.go rename to ubc/ubc.go index 0090e36..b0b4d76 100644 --- a/ubc/doc.go +++ b/ubc/ubc.go @@ -1,3 +1,5 @@ // ubc package provides ways for SHA1 blocks to be checked for // Unavoidable Bit Conditions that arise from crypto analysis attacks. package ubc + +//go:generate go run -C asm . -out ../ubc_amd64.s -pkg $GOPACKAGE diff --git a/ubc/ubc_amd64.s b/ubc/ubc_amd64.s index 0c0f4e4..c77ea77 100644 --- a/ubc/ubc_amd64.s +++ b/ubc/ubc_amd64.s @@ -1,7 +1,6 @@ -// Code generated by command: go run ubc_amd64_asm.go -out ubc_amd64.s. DO NOT EDIT. +// Code generated by command: go run asm.go -out ../ubc_amd64.s -pkg ubc. DO NOT EDIT. //go:build !noasm && gc && amd64 -// +build !noasm,gc,amd64 #include "textflag.h" From 6bf841ed50e3b6779e745538c94e28680715c68e Mon Sep 17 00:00:00 2001 From: Michael McLoughlin Date: Sat, 18 Jan 2025 14:53:49 -0500 Subject: [PATCH 4/5] update sha1cd generate line --- asm/go.mod | 7 ++++++- sha1cd.go | 2 +- sha1cdblock_amd64.s | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/asm/go.mod b/asm/go.mod index a60dad3..5e3fdda 100644 --- a/asm/go.mod +++ b/asm/go.mod @@ -2,9 +2,14 @@ module github.com/pjbgf/sha1cd/asm go 1.21 -require github.com/mmcloughlin/avo v0.6.0 +require ( + github.com/mmcloughlin/avo v0.6.0 + github.com/pjbgf/sha1cd v0.0.0-local +) require ( golang.org/x/mod v0.14.0 // indirect golang.org/x/tools v0.16.1 // indirect ) + +replace github.com/pjbgf/sha1cd => .. diff --git a/sha1cd.go b/sha1cd.go index 3e5c58b..509569f 100644 --- a/sha1cd.go +++ b/sha1cd.go @@ -20,7 +20,7 @@ import ( shared "github.com/pjbgf/sha1cd/internal" ) -//go:generate go run -modfile=asm/go.mod asm/asm.go -out sha1cdblock_amd64.s -pkg $PKG +//go:generate go run -C asm . -out ../sha1cdblock_amd64.s -pkg $GOPACKAGE func init() { crypto.RegisterHash(crypto.SHA1, New) diff --git a/sha1cdblock_amd64.s b/sha1cdblock_amd64.s index e4d357e..e5e213a 100644 --- a/sha1cdblock_amd64.s +++ b/sha1cdblock_amd64.s @@ -1,4 +1,4 @@ -// Code generated by command: go run asm.go -out sha1cdblock_amd64.s -pkg . DO NOT EDIT. +// Code generated by command: go run asm.go -out ../sha1cdblock_amd64.s -pkg sha1cd. DO NOT EDIT. //go:build !noasm && gc && amd64 From 2a026efd9656bd9b1d5debd9b9c400a1f40fd8ae Mon Sep 17 00:00:00 2001 From: Michael McLoughlin Date: Sat, 18 Jan 2025 14:55:34 -0500 Subject: [PATCH 5/5] update make generate --- Makefile | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Makefile b/Makefile index e591308..278a109 100644 --- a/Makefile +++ b/Makefile @@ -32,11 +32,7 @@ build-nocgo: cross-build: build-arm build-arm64 build-nocgo generate: - go run sha1cdblock_amd64_asm.go -out sha1cdblock_amd64.s - sed -i 's;&\samd64;&\n// +build !noasm,gc,amd64;g' sha1cdblock_amd64.s - - cd ubc && go run ubc_amd64_asm.go -out ubc_amd64.s - sed -i 's;&\samd64;&\n// +build !noasm,gc,amd64;g' ubc/ubc_amd64.s + go generate -x ./... verify: generate git diff --exit-code