hash writers: adler32, crc32, md5, sha1.
all could probably be made faster.

R=r
DELTA=929  (929 added, 0 deleted, 0 changed)
OCL=19879
CL=19911
diff --git a/src/lib/hash/sha1block.go b/src/lib/hash/sha1block.go
new file mode 100644
index 0000000..a81dceb
--- /dev/null
+++ b/src/lib/hash/sha1block.go
@@ -0,0 +1,86 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// SHA1 block step.
+// In its own file so that a faster assembly or C version
+// can be substituted easily.
+
+package sha1
+
+import "sha1"
+
+const (
+	K0 = 0x5A827999;
+	K1 = 0x6ED9EBA1;
+	K2 = 0x8F1BBCDC;
+	K3 = 0xCA62C1D6;
+)
+
+package func Block(dig *Digest, p *[]byte) int {
+	var w [80]uint32;
+
+	n := 0;
+	h0, h1, h2, h3, h4 := dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4];
+	for len(p) >= Chunk {
+		// Can interlace the computation of w with the
+		// rounds below if needed for speed.
+		for i := 0; i < 16; i++ {
+			j := i*4;
+			w[i] = uint32(p[j])<<24 |
+				uint32(p[j+1])<<16 |
+				uint32(p[j+2])<<8 |
+				uint32(p[j+3]);
+		}
+		for i := 16; i < 80; i++ {
+			tmp := w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16];
+			w[i] = tmp<<1 | tmp>>(32-1);
+		}
+
+		a, b, c, d, e := h0, h1, h2, h3, h4;
+
+		// Each of the four 20-iteration rounds
+		// differs only in the computation of f and
+		// the choice of K (K0, K1, etc).
+		for i := 0; i < 20; i++ {
+			f := b&c | (^b)&d;
+			a5 := a<<5 | a>>(32-5);
+			b30 := b<<30 | b>>(32-30);
+			t := a5 + f + e + w[i] + K0;
+			a, b, c, d, e = t, a, b30, c, d;
+		}
+		for i := 20; i < 40; i++ {
+			f := b ^ c ^ d;
+			a5 := a<<5 | a>>(32-5);
+			b30 := b<<30 | b>>(32-30);
+			t := a5 + f + e + w[i] + K1;
+			a, b, c, d, e = t, a, b30, c, d;
+		}
+		for i := 40; i < 60; i++ {
+			f := b&c | b&d | c&d;
+			a5 := a<<5 | a>>(32-5);
+			b30 := b<<30 | b>>(32-30);
+			t := a5 + f + e + w[i] + K2;
+			a, b, c, d, e = t, a, b30, c, d;
+		}
+		for i := 60; i < 80; i++ {
+			f := b ^ c ^ d;
+			a5 := a<<5 | a>>(32-5);
+			b30 := b<<30 | b>>(32-30);
+			t := a5 + f + e + w[i] + K3;
+			a, b, c, d, e = t, a, b30, c, d;
+		}
+
+		h0 += a;
+		h1 += b;
+		h2 += c;
+		h3 += d;
+		h4 += e;
+
+		p = p[Chunk:len(p)];
+		n += Chunk;
+	}
+
+	dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4] = h0, h1, h2, h3, h4;
+	return n;
+}