| // 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 | |
| } |