]> Cypherpunks repositories - gostls13.git/commitdiff
crypto/sha256: provide top-level Sum and Sum224 functions
authorRob Pike <r@golang.org>
Wed, 26 Jun 2013 18:36:18 +0000 (11:36 -0700)
committerRob Pike <r@golang.org>
Wed, 26 Jun 2013 18:36:18 +0000 (11:36 -0700)
Makes it easy to ask the simple question, what is the hash of this data?

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/10629043

src/pkg/crypto/sha256/sha256.go
src/pkg/crypto/sha256/sha256_test.go

index dc0e18f50df2d4567b97211c6bff2f82c81beb57..90e71cd61beb2856fa858fef904bbb5769b1391f 100644 (file)
@@ -134,9 +134,16 @@ func (d *digest) Write(p []byte) (nn int, err error) {
 func (d0 *digest) Sum(in []byte) []byte {
        // Make a copy of d0 so that caller can keep writing and summing.
        d := *d0
+       hash := d.checkSum()
+       if d.is224 {
+               return append(in, hash[:Size224]...)
+       }
+       return append(in, hash[:]...)
+}
 
-       // Padding.  Add a 1 bit and 0 bits until 56 bytes mod 64.
+func (d *digest) checkSum() [Size]byte {
        len := d.len
+       // Padding.  Add a 1 bit and 0 bits until 56 bytes mod 64.
        var tmp [64]byte
        tmp[0] = 0x80
        if len%64 < 56 {
@@ -157,10 +164,8 @@ func (d0 *digest) Sum(in []byte) []byte {
        }
 
        h := d.h[:]
-       size := Size
        if d.is224 {
                h = d.h[:7]
-               size = Size224
        }
 
        var digest [Size]byte
@@ -171,5 +176,24 @@ func (d0 *digest) Sum(in []byte) []byte {
                digest[i*4+3] = byte(s)
        }
 
-       return append(in, digest[:size]...)
+       return digest
+}
+
+// Sum returns the SHA256 checksum of the data.
+func Sum256(data []byte) [Size]byte {
+       var d digest
+       d.Reset()
+       d.Write(data)
+       return d.checkSum()
+}
+
+// Sum224 returns the SHA224 checksum of the data.
+func Sum224(data []byte) (sum224 [Size224]byte) {
+       var d digest
+       d.is224 = true
+       d.Reset()
+       d.Write(data)
+       sum := d.checkSum()
+       copy(sum224[:], sum[:Size224])
+       return
 }
index 29bf1619aeb81ade899f9eb1e75be705e23522cb..0dc888625253406ddf364fcdaf1be4023a144bfe 100644 (file)
@@ -88,6 +88,10 @@ var golden224 = []sha256Test{
 func TestGolden(t *testing.T) {
        for i := 0; i < len(golden); i++ {
                g := golden[i]
+               s := fmt.Sprintf("%x", Sum256([]byte(g.in)))
+               if s != g.out {
+                       t.Fatalf("Sum function: sha256(%s) = %s want %s", g.in, s, g.out)
+               }
                c := New()
                for j := 0; j < 3; j++ {
                        if j < 2 {
@@ -106,6 +110,10 @@ func TestGolden(t *testing.T) {
        }
        for i := 0; i < len(golden224); i++ {
                g := golden224[i]
+               s := fmt.Sprintf("%x", Sum224([]byte(g.in)))
+               if s != g.out {
+                       t.Fatalf("Sum224 function: sha224(%s) = %s want %s", g.in, s, g.out)
+               }
                c := New224()
                for j := 0; j < 3; j++ {
                        if j < 2 {