| // 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. | 
 |  | 
 | // SHA256 block step. | 
 | // In its own file so that a faster assembly or C version | 
 | // can be substituted easily. | 
 |  | 
 | package sha256 | 
 |  | 
 | import "math/bits" | 
 |  | 
 | var _K = []uint32{ | 
 | 	0x428a2f98, | 
 | 	0x71374491, | 
 | 	0xb5c0fbcf, | 
 | 	0xe9b5dba5, | 
 | 	0x3956c25b, | 
 | 	0x59f111f1, | 
 | 	0x923f82a4, | 
 | 	0xab1c5ed5, | 
 | 	0xd807aa98, | 
 | 	0x12835b01, | 
 | 	0x243185be, | 
 | 	0x550c7dc3, | 
 | 	0x72be5d74, | 
 | 	0x80deb1fe, | 
 | 	0x9bdc06a7, | 
 | 	0xc19bf174, | 
 | 	0xe49b69c1, | 
 | 	0xefbe4786, | 
 | 	0x0fc19dc6, | 
 | 	0x240ca1cc, | 
 | 	0x2de92c6f, | 
 | 	0x4a7484aa, | 
 | 	0x5cb0a9dc, | 
 | 	0x76f988da, | 
 | 	0x983e5152, | 
 | 	0xa831c66d, | 
 | 	0xb00327c8, | 
 | 	0xbf597fc7, | 
 | 	0xc6e00bf3, | 
 | 	0xd5a79147, | 
 | 	0x06ca6351, | 
 | 	0x14292967, | 
 | 	0x27b70a85, | 
 | 	0x2e1b2138, | 
 | 	0x4d2c6dfc, | 
 | 	0x53380d13, | 
 | 	0x650a7354, | 
 | 	0x766a0abb, | 
 | 	0x81c2c92e, | 
 | 	0x92722c85, | 
 | 	0xa2bfe8a1, | 
 | 	0xa81a664b, | 
 | 	0xc24b8b70, | 
 | 	0xc76c51a3, | 
 | 	0xd192e819, | 
 | 	0xd6990624, | 
 | 	0xf40e3585, | 
 | 	0x106aa070, | 
 | 	0x19a4c116, | 
 | 	0x1e376c08, | 
 | 	0x2748774c, | 
 | 	0x34b0bcb5, | 
 | 	0x391c0cb3, | 
 | 	0x4ed8aa4a, | 
 | 	0x5b9cca4f, | 
 | 	0x682e6ff3, | 
 | 	0x748f82ee, | 
 | 	0x78a5636f, | 
 | 	0x84c87814, | 
 | 	0x8cc70208, | 
 | 	0x90befffa, | 
 | 	0xa4506ceb, | 
 | 	0xbef9a3f7, | 
 | 	0xc67178f2, | 
 | } | 
 |  | 
 | func blockGeneric(dig *digest, p []byte) { | 
 | 	var w [64]uint32 | 
 | 	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 { | 
 | 		// 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 < 64; i++ { | 
 | 			v1 := w[i-2] | 
 | 			t1 := (bits.RotateLeft32(v1, -17)) ^ (bits.RotateLeft32(v1, -19)) ^ (v1 >> 10) | 
 | 			v2 := w[i-15] | 
 | 			t2 := (bits.RotateLeft32(v2, -7)) ^ (bits.RotateLeft32(v2, -18)) ^ (v2 >> 3) | 
 | 			w[i] = t1 + w[i-7] + t2 + w[i-16] | 
 | 		} | 
 |  | 
 | 		a, b, c, d, e, f, g, h := h0, h1, h2, h3, h4, h5, h6, h7 | 
 |  | 
 | 		for i := 0; i < 64; i++ { | 
 | 			t1 := h + ((bits.RotateLeft32(e, -6)) ^ (bits.RotateLeft32(e, -11)) ^ (bits.RotateLeft32(e, -25))) + ((e & f) ^ (^e & g)) + _K[i] + w[i] | 
 |  | 
 | 			t2 := ((bits.RotateLeft32(a, -2)) ^ (bits.RotateLeft32(a, -13)) ^ (bits.RotateLeft32(a, -22))) + ((a & b) ^ (a & c) ^ (b & c)) | 
 |  | 
 | 			h = g | 
 | 			g = f | 
 | 			f = e | 
 | 			e = d + t1 | 
 | 			d = c | 
 | 			c = b | 
 | 			b = a | 
 | 			a = t1 + t2 | 
 | 		} | 
 |  | 
 | 		h0 += a | 
 | 		h1 += b | 
 | 		h2 += c | 
 | 		h3 += d | 
 | 		h4 += e | 
 | 		h5 += f | 
 | 		h6 += g | 
 | 		h7 += h | 
 |  | 
 | 		p = p[chunk:] | 
 | 	} | 
 |  | 
 | 	dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4], dig.h[5], dig.h[6], dig.h[7] = h0, h1, h2, h3, h4, h5, h6, h7 | 
 | } |