]> Cypherpunks repositories - gostls13.git/commitdiff
Revert "crypto/sha512: add WriteString and WriteByte method"
authorIan Lance Taylor <iant@golang.org>
Wed, 3 May 2023 20:59:12 +0000 (20:59 +0000)
committerGopher Robot <gobot@golang.org>
Wed, 3 May 2023 21:17:08 +0000 (21:17 +0000)
This reverts CL 483816

Reason for revert: can cause cgo errors when using boringcrypto.  See #59954.

For #38776
For #59954

Change-Id: I23a2a1f0aed2a08b73855b5038ccb24a4d0a02c0
Reviewed-on: https://go-review.googlesource.com/c/go/+/492355
Run-TryBot: Ian Lance Taylor <iant@google.com>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>
Reviewed-by: Bryan Mills <bcmills@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>

13 files changed:
src/crypto/internal/boring/sha.go
src/crypto/sha512/sha512.go
src/crypto/sha512/sha512_test.go
src/crypto/sha512/sha512block.go
src/crypto/sha512/sha512block_amd64.go
src/crypto/sha512/sha512block_amd64.s
src/crypto/sha512/sha512block_arm64.go
src/crypto/sha512/sha512block_arm64.s
src/crypto/sha512/sha512block_decl.go
src/crypto/sha512/sha512block_generic.go
src/crypto/sha512/sha512block_ppc64x.s
src/crypto/sha512/sha512block_s390x.go
src/crypto/sha512/sha512block_s390x.s

index 702c68759a5345a73834dadea60d0cc6b0f36e24..c9772aa6f1cf214ac4fa103e426b386f940670df 100644 (file)
@@ -428,20 +428,6 @@ func (h *sha384Hash) Write(p []byte) (int, error) {
        return len(p), nil
 }
 
-func (h *sha384Hash) WriteString(s string) (int, error) {
-       if len(s) > 0 && C._goboringcrypto_SHA384_Update(h.noescapeCtx(), unsafe.Pointer(unsafe.StringData(s)), C.size_t(len(s))) == 0 {
-               panic("boringcrypto: SHA384_Update failed")
-       }
-       return len(s), nil
-}
-
-func (h *sha384Hash) WriteByte(c byte) error {
-       if C._goboringcrypto_SHA384_Update(h.noescapeCtx(), unsafe.Pointer(&c), 1) == 0 {
-               panic("boringcrypto: SHA384_Update failed")
-       }
-       return nil
-}
-
 func (h0 *sha384Hash) sum(dst []byte) []byte {
        h := *h0 // make copy so future Write+Sum is valid
        if C._goboringcrypto_SHA384_Final((*C.uint8_t)(noescape(unsafe.Pointer(&h.out[0]))), h.noescapeCtx()) == 0 {
@@ -480,20 +466,6 @@ func (h *sha512Hash) Write(p []byte) (int, error) {
        return len(p), nil
 }
 
-func (h *sha512Hash) WriteString(s string) (int, error) {
-       if len(s) > 0 && C._goboringcrypto_SHA512_Update(h.noescapeCtx(), unsafe.Pointer(unsafe.StringData(s)), C.size_t(len(s))) == 0 {
-               panic("boringcrypto: SHA512_Update failed")
-       }
-       return len(s), nil
-}
-
-func (h *sha512Hash) WriteByte(c byte) error {
-       if C._goboringcrypto_SHA512_Update(h.noescapeCtx(), unsafe.Pointer(&c), 1) == 0 {
-               panic("boringcrypto: SHA512_Update failed")
-       }
-       return nil
-}
-
 func (h0 *sha512Hash) sum(dst []byte) []byte {
        h := *h0 // make copy so future Write+Sum is valid
        if C._goboringcrypto_SHA512_Final((*C.uint8_t)(noescape(unsafe.Pointer(&h.out[0]))), h.noescapeCtx()) == 0 {
index b22c50be6ca55a76e83dd95c187599e93b42cb4a..9ae1b3aae2f013da4942957da2edd137d0254081 100644 (file)
@@ -254,10 +254,20 @@ func (d *digest) Size() int {
 func (d *digest) BlockSize() int { return BlockSize }
 
 func (d *digest) Write(p []byte) (nn int, err error) {
+       if d.function != crypto.SHA512_224 && d.function != crypto.SHA512_256 {
+               boring.Unreachable()
+       }
        nn = len(p)
        d.len += uint64(nn)
-       n := fillChunk(d, p)
-       p = p[n:]
+       if d.nx > 0 {
+               n := copy(d.x[d.nx:], p)
+               d.nx += n
+               if d.nx == chunk {
+                       block(d, d.x[:])
+                       d.nx = 0
+               }
+               p = p[n:]
+       }
        if len(p) >= chunk {
                n := len(p) &^ (chunk - 1)
                block(d, p[:n])
@@ -269,59 +279,6 @@ func (d *digest) Write(p []byte) (nn int, err error) {
        return
 }
 
-func (d *digest) WriteString(s string) (nn int, err error) {
-       nn = len(s)
-       d.len += uint64(nn)
-       n := fillChunk(d, s)
-
-       // This duplicates the code in Write, except that it calls
-       // blockString rather than block. It would be nicer to pass
-       // in a func, but as of this writing (Go 1.20) that causes
-       // memory allocations that we want to avoid.
-
-       s = s[n:]
-       if len(s) >= chunk {
-               n := len(s) &^ (chunk - 1)
-               blockString(d, s[:n])
-               s = s[n:]
-       }
-       if len(s) > 0 {
-               d.nx = copy(d.x[:], s)
-       }
-       return
-}
-
-// fillChunk fills the remainder of the current chunk, if any.
-func fillChunk[S []byte | string](d *digest, p S) int {
-       if d.function != crypto.SHA512_224 && d.function != crypto.SHA512_256 {
-               boring.Unreachable()
-       }
-       if d.nx == 0 {
-               return 0
-       }
-       n := copy(d.x[d.nx:], p)
-       d.nx += n
-       if d.nx == chunk {
-               block(d, d.x[:])
-               d.nx = 0
-       }
-       return n
-}
-
-func (d *digest) WriteByte(c byte) error {
-       if d.function != crypto.SHA512_224 && d.function != crypto.SHA512_256 {
-               boring.Unreachable()
-       }
-       d.len++
-       d.x[d.nx] = c
-       d.nx++
-       if d.nx == chunk {
-               block(d, d.x[:])
-               d.nx = 0
-       }
-       return nil
-}
-
 func (d *digest) Sum(in []byte) []byte {
        if d.function != crypto.SHA512_224 && d.function != crypto.SHA512_256 {
                boring.Unreachable()
index cbe195e338445deacd8b18ceeb1d725b9128aec3..921cdbb7bbd477952f83de91432df7c62ac7119c 100644 (file)
@@ -676,15 +676,6 @@ func testHash(t *testing.T, name, in, outHex string, oneShotResult []byte, diges
                }
                digestFunc.Reset()
        }
-
-       bw := digestFunc.(io.ByteWriter)
-       for i := 0; i < len(in); i++ {
-               bw.WriteByte(in[i])
-       }
-       if calculated := hex.EncodeToString(digestFunc.Sum(nil)); calculated != outHex {
-               t.Errorf("%s(%q) = %q using WriteByte but expected %q", name, in, calculated, outHex)
-       }
-       digestFunc.Reset()
 }
 
 func TestGolden(t *testing.T) {
@@ -905,8 +896,7 @@ func TestAllocations(t *testing.T) {
        if boring.Enabled {
                t.Skip("BoringCrypto doesn't allocate the same way as stdlib")
        }
-       const ins = "hello, world!"
-       in := []byte(ins)
+       in := []byte("hello, world!")
        out := make([]byte, 0, Size)
        h := New()
        n := int(testing.AllocsPerRun(10, func() {
@@ -917,28 +907,6 @@ func TestAllocations(t *testing.T) {
        if n > 0 {
                t.Errorf("allocs = %d, want 0", n)
        }
-
-       sw := h.(io.StringWriter)
-       n = int(testing.AllocsPerRun(10, func() {
-               h.Reset()
-               sw.WriteString(ins)
-               out = h.Sum(out[:0])
-       }))
-       if n > 0 {
-               t.Errorf("string allocs = %d, want 0", n)
-       }
-
-       bw := h.(io.ByteWriter)
-       n = int(testing.AllocsPerRun(10, func() {
-               h.Reset()
-               for _, b := range in {
-                       bw.WriteByte(b)
-               }
-               out = h.Sum(out[:0])
-       }))
-       if n > 0 {
-               t.Errorf("byte allocs = %d, want 0", n)
-       }
 }
 
 var bench = New()
index b0dcf27d95049f105d893a3e51a2ae2ac9031411..81569c5f84e8964e955b5b5aa24e9f6e696c923d 100644 (file)
@@ -93,7 +93,7 @@ var _K = []uint64{
        0x6c44198c4a475817,
 }
 
-func blockGeneric[S []byte | string](dig *digest, p S) {
+func blockGeneric(dig *digest, p []byte) {
        var w [80]uint64
        h0, h1, h2, h3, h4, h5, h6, h7 := dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4], dig.h[5], dig.h[6], dig.h[7]
        for len(p) >= chunk {
index 4d9ec5ac1c9cb597ee5c974caefa087df1ce801e..8da3e1473f6c45289a690dd6af8783c85d63beab 100644 (file)
@@ -6,31 +6,20 @@
 
 package sha512
 
-import (
-       "internal/cpu"
-       "unsafe"
-)
+import "internal/cpu"
 
 //go:noescape
-func blockAVX2(dig *digest, p *byte, n int)
+func blockAVX2(dig *digest, p []byte)
 
 //go:noescape
-func blockAMD64(dig *digest, p *byte, n int)
+func blockAMD64(dig *digest, p []byte)
 
 var useAVX2 = cpu.X86.HasAVX2 && cpu.X86.HasBMI1 && cpu.X86.HasBMI2
 
 func block(dig *digest, p []byte) {
        if useAVX2 {
-               blockAVX2(dig, unsafe.SliceData(p), len(p))
+               blockAVX2(dig, p)
        } else {
-               blockAMD64(dig, unsafe.SliceData(p), len(p))
-       }
-}
-
-func blockString(dig *digest, s string) {
-       if useAVX2 {
-               blockAVX2(dig, unsafe.StringData(s), len(s))
-       } else {
-               blockAMD64(dig, unsafe.StringData(s), len(s))
+               blockAMD64(dig, p)
        }
 }
index e8a89e31fa7e9cee2fa75a1c23667840f58bb37e..0fa0df2f60e8b733f1875d754643e60945a2a876 100644 (file)
        MSGSCHEDULE1(index); \
        SHA512ROUND(index, const, a, b, c, d, e, f, g, h)
 
-TEXT ·blockAMD64(SB),0,$648-24
-       MOVQ    p+8(FP), SI
-       MOVQ    n+16(FP), DX
+TEXT ·blockAMD64(SB),0,$648-32
+       MOVQ    p_base+8(FP), SI
+       MOVQ    p_len+16(FP), DX
        SHRQ    $7, DX
        SHLQ    $7, DX
 
@@ -319,10 +319,10 @@ DATA MASK_YMM_LO<>+0x18(SB)/8, $0xFFFFFFFFFFFFFFFF
 
 GLOBL MASK_YMM_LO<>(SB), (NOPTR+RODATA), $32
 
-TEXT ·blockAVX2(SB), NOSPLIT, $56-24
+TEXT ·blockAVX2(SB), NOSPLIT, $56-32
        MOVQ dig+0(FP), SI
-       MOVQ p+8(FP), DI
-       MOVQ n+16(FP), DX
+       MOVQ p_base+8(FP), DI
+       MOVQ p_len+16(FP), DX
 
        SHRQ $7, DX
        SHLQ $7, DX
index a916a0a98e275989b39bbe27e8ddec7c84907e14..243eb5c1d63b6f085bd484992858003f58fdff01 100644 (file)
@@ -4,26 +4,15 @@
 
 package sha512
 
-import (
-       "internal/cpu"
-       "unsafe"
-)
+import "internal/cpu"
 
 func block(dig *digest, p []byte) {
        if cpu.ARM64.HasSHA512 {
-               blockAsm(dig, unsafe.SliceData(p), len(p))
+               blockAsm(dig, p)
                return
        }
        blockGeneric(dig, p)
 }
 
-func blockString(dig *digest, s string) {
-       if cpu.ARM64.HasSHA512 {
-               blockAsm(dig, unsafe.StringData(s), len(s))
-               return
-       }
-       blockGeneric(dig, s)
-}
-
 //go:noescape
-func blockAsm(dig *digest, p *byte, n int)
+func blockAsm(dig *digest, p []byte)
index 647ee6273f20fd90508b175c97e2916a57709fb2..dfc35d69c3880256163f02971ef9ecf8050735cb 100644 (file)
        VADD    i3.D2, i1.D2, i4.D2 \
        SHA512H2        i0.D2, i1, i3
 
-// func blockAsm(dig *digest, p *byte, n int)
+// func blockAsm(dig *digest, p []byte)
 TEXT ·blockAsm(SB),NOSPLIT,$0
        MOVD    dig+0(FP), R0
-       MOVD    p+8(FP), R1
-       MOVD    n+16(FP), R2
+       MOVD    p_base+8(FP), R1
+       MOVD    p_len+16(FP), R2
        MOVD    ·_K+0(SB), R3
 
        // long enough to prefetch
index 399f13caf7446f9ee71fab9956878c77667d8e01..4ad4418bc071e34ac1b4c8cc190ad99043123f78 100644 (file)
@@ -6,15 +6,5 @@
 
 package sha512
 
-import "unsafe"
-
 //go:noescape
-func doBlock(dig *digest, p *byte, n int)
-
-func block(dig *digest, p []byte) {
-       doBlock(dig, unsafe.SliceData(p), len(p))
-}
-
-func blockString(dig *digest, s string) {
-       doBlock(dig, unsafe.StringData(s), len(s))
-}
+func block(dig *digest, p []byte)
index 116d6c8c52515a3df5e19fbe4480136f24aa5e0c..02ecc2c794b28f538f1510cb3a5e22529534fec6 100644 (file)
@@ -9,7 +9,3 @@ package sha512
 func block(dig *digest, p []byte) {
        blockGeneric(dig, p)
 }
-
-func blockString(dig *digest, s string) {
-       blockGeneric(dig, s)
-}
index df9a7bbaf8d82637ab2dc1be3f2420fc12c9cae7..90dbf0f02b64bf7593edbab2e1e805fd11005870 100644 (file)
@@ -304,11 +304,11 @@ GLOBL ·kcon(SB), RODATA, $1312
        VADDUDM         S0, h, h; \
        VADDUDM         s1, xj, xj
 
-// func doBlock(dig *digest, p *byte, b int)
-TEXT ·doBlock(SB),0,$0-24
+// func block(dig *digest, p []byte)
+TEXT ·block(SB),0,$0-32
        MOVD    dig+0(FP), CTX
-       MOVD    p+8(FP), INP
-       MOVD    n+16(FP), LEN
+       MOVD    p_base+8(FP), INP
+       MOVD    p_len+16(FP), LEN
 
        SRD     $6, LEN
        SLD     $6, LEN
index d7412ee8bf4e23c2b62484ff3b87d4ad9911cb2d..7df29fd29828c4461a4709e3fe9d8daba677f65d 100644 (file)
@@ -4,13 +4,6 @@
 
 package sha512
 
-import (
-       "internal/cpu"
-       "unsafe"
-)
+import "internal/cpu"
 
 var useAsm = cpu.S390X.HasSHA512
-
-func doBlockGeneric(dig *digest, p *byte, n int) {
-       blockGeneric(dig, unsafe.String(p, n))
-}
index 3879bf8d9030bd98f3f16ad64583301ac924a364..f221bd1399c9347213808b2ff882939502952e0a 100644 (file)
@@ -4,8 +4,8 @@
 
 #include "textflag.h"
 
-// func doBlock(dig *digest, p *byte, n int)
-TEXT ·doBlock(SB), NOSPLIT|NOFRAME, $0-24
+// func block(dig *digest, p []byte)
+TEXT ·block(SB), NOSPLIT|NOFRAME, $0-32
        MOVBZ  ·useAsm(SB), R4
        LMG    dig+0(FP), R1, R3            // R2 = &p[0], R3 = len(p)
        MOVBZ  $3, R0                       // SHA-512 function code
@@ -17,4 +17,4 @@ loop:
        RET
 
 generic:
-       BR ·doBlockGeneric(SB)
+       BR ·blockGeneric(SB)