aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2025-01-07 11:20:07 -0500
committerGopher Robot <gobot@golang.org>2025-01-07 10:59:33 -0800
commitb2aa18b96cefb48641ec69a79bc67d030b93f093 (patch)
tree266af439e679d76461c1d209fbc0a031607333a5 /src/cmd/internal
parentd93b549f0502ad9f44b7eacc282c304b22d2603b (diff)
downloadgo-b2aa18b96cefb48641ec69a79bc67d030b93f093.tar.xz
cmd/internal/hash: stop using md5, sha1
These break if the tools are run with GODEBUG=fips140=only, which happens if someone sets that during 'go test' (and a test binary must be built). The easiest fix is to make the tools compatible with this GODEBUG by just using sha256 as the underlying hash always. Just in case, I made the wrappers select different sections of the hash, but none of the call sites really care. This CL is for the Go 1.24 release, but a follow-up during the Go 1.25 dev cycle could change all the usage sites to only use Sum32/New32. For #70514 Fixes #70878 Change-Id: Id5fea779c83df51d1680dbe561e0949c56e8d1e5 Reviewed-on: https://go-review.googlesource.com/c/go/+/641096 Reviewed-by: Keith Randall <khr@golang.org> Auto-Submit: Russ Cox <rsc@golang.org> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Keith Randall <khr@google.com>
Diffstat (limited to 'src/cmd/internal')
-rw-r--r--src/cmd/internal/hash/hash.go41
1 files changed, 29 insertions, 12 deletions
diff --git a/src/cmd/internal/hash/hash.go b/src/cmd/internal/hash/hash.go
index 20edc72c20..a37368f50e 100644
--- a/src/cmd/internal/hash/hash.go
+++ b/src/cmd/internal/hash/hash.go
@@ -5,22 +5,33 @@
// Package hash implements hash functions used in the compiler toolchain.
package hash
+// TODO(rsc): Delete the 16 and 20 forms and use 32 at all call sites.
+
import (
- "crypto/md5"
- "crypto/sha1"
"crypto/sha256"
"hash"
)
const (
- // Size32 is the size of 32 bytes hash checksum.
- Size32 = sha256.Size
- // Size20 is the size of 20 bytes hash checksum.
- Size20 = sha1.Size
- // Size16 is the size of 16 bytes hash checksum.
- Size16 = md5.Size
+ // Size32 is the size of the 32-byte hash checksum.
+ Size32 = 32
+ // Size20 is the size of the 20-byte hash checksum.
+ Size20 = 20
+ // Size16 is the size of the 16-byte hash checksum.
+ Size16 = 16
)
+type shortHash struct {
+ hash.Hash
+ n int
+}
+
+func (h *shortHash) Sum(b []byte) []byte {
+ old := b
+ sum := h.Hash.Sum(b)
+ return sum[:len(old)+h.n]
+}
+
// New32 returns a new [hash.Hash] computing the 32 bytes hash checksum.
func New32() hash.Hash {
h := sha256.New()
@@ -30,12 +41,12 @@ func New32() hash.Hash {
// New20 returns a new [hash.Hash] computing the 20 bytes hash checksum.
func New20() hash.Hash {
- return sha1.New()
+ return &shortHash{New32(), 20}
}
// New16 returns a new [hash.Hash] computing the 16 bytes hash checksum.
func New16() hash.Hash {
- return md5.New()
+ return &shortHash{New32(), 16}
}
// Sum32 returns the 32 bytes checksum of the data.
@@ -47,10 +58,16 @@ func Sum32(data []byte) [Size32]byte {
// Sum20 returns the 20 bytes checksum of the data.
func Sum20(data []byte) [Size20]byte {
- return sha1.Sum(data)
+ sum := Sum32(data)
+ var short [Size20]byte
+ copy(short[:], sum[4:])
+ return short
}
// Sum16 returns the 16 bytes checksum of the data.
func Sum16(data []byte) [Size16]byte {
- return md5.Sum(data)
+ sum := Sum32(data)
+ var short [Size16]byte
+ copy(short[:], sum[8:])
+ return short
}