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 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..5e3fdda --- /dev/null +++ b/asm/go.mod @@ -0,0 +1,15 @@ +module github.com/pjbgf/sha1cd/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.14.0 // indirect + golang.org/x/tools v0.16.1 // indirect +) + +replace github.com/pjbgf/sha1cd => .. 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..509569f 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 -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 86f9821..e5e213a 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 sha1cd. DO NOT EDIT. //go:build !noasm && gc && amd64 -// +build !noasm,gc,amd64 #include "textflag.h" 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"