Source file src/pkg/crypto/sha256/sha256block.go
1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // SHA256 block step. 6 // In its own file so that a faster assembly or C version 7 // can be substituted easily. 8 9 package sha256 10 11 var _K = []uint32{ 12 0x428a2f98, 13 0x71374491, 14 0xb5c0fbcf, 15 0xe9b5dba5, 16 0x3956c25b, 17 0x59f111f1, 18 0x923f82a4, 19 0xab1c5ed5, 20 0xd807aa98, 21 0x12835b01, 22 0x243185be, 23 0x550c7dc3, 24 0x72be5d74, 25 0x80deb1fe, 26 0x9bdc06a7, 27 0xc19bf174, 28 0xe49b69c1, 29 0xefbe4786, 30 0x0fc19dc6, 31 0x240ca1cc, 32 0x2de92c6f, 33 0x4a7484aa, 34 0x5cb0a9dc, 35 0x76f988da, 36 0x983e5152, 37 0xa831c66d, 38 0xb00327c8, 39 0xbf597fc7, 40 0xc6e00bf3, 41 0xd5a79147, 42 0x06ca6351, 43 0x14292967, 44 0x27b70a85, 45 0x2e1b2138, 46 0x4d2c6dfc, 47 0x53380d13, 48 0x650a7354, 49 0x766a0abb, 50 0x81c2c92e, 51 0x92722c85, 52 0xa2bfe8a1, 53 0xa81a664b, 54 0xc24b8b70, 55 0xc76c51a3, 56 0xd192e819, 57 0xd6990624, 58 0xf40e3585, 59 0x106aa070, 60 0x19a4c116, 61 0x1e376c08, 62 0x2748774c, 63 0x34b0bcb5, 64 0x391c0cb3, 65 0x4ed8aa4a, 66 0x5b9cca4f, 67 0x682e6ff3, 68 0x748f82ee, 69 0x78a5636f, 70 0x84c87814, 71 0x8cc70208, 72 0x90befffa, 73 0xa4506ceb, 74 0xbef9a3f7, 75 0xc67178f2, 76 } 77 78 func _Block(dig *digest, p []byte) int { 79 var w [64]uint32 80 n := 0 81 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] 82 for len(p) >= _Chunk { 83 // Can interlace the computation of w with the 84 // rounds below if needed for speed. 85 for i := 0; i < 16; i++ { 86 j := i * 4 87 w[i] = uint32(p[j])<<24 | uint32(p[j+1])<<16 | uint32(p[j+2])<<8 | uint32(p[j+3]) 88 } 89 for i := 16; i < 64; i++ { 90 t1 := (w[i-2]>>17 | w[i-2]<<(32-17)) ^ (w[i-2]>>19 | w[i-2]<<(32-19)) ^ (w[i-2] >> 10) 91 92 t2 := (w[i-15]>>7 | w[i-15]<<(32-7)) ^ (w[i-15]>>18 | w[i-15]<<(32-18)) ^ (w[i-15] >> 3) 93 94 w[i] = t1 + w[i-7] + t2 + w[i-16] 95 } 96 97 a, b, c, d, e, f, g, h := h0, h1, h2, h3, h4, h5, h6, h7 98 99 for i := 0; i < 64; i++ { 100 t1 := h + ((e>>6 | e<<(32-6)) ^ (e>>11 | e<<(32-11)) ^ (e>>25 | e<<(32-25))) + ((e & f) ^ (^e & g)) + _K[i] + w[i] 101 102 t2 := ((a>>2 | a<<(32-2)) ^ (a>>13 | a<<(32-13)) ^ (a>>22 | a<<(32-22))) + ((a & b) ^ (a & c) ^ (b & c)) 103 104 h = g 105 g = f 106 f = e 107 e = d + t1 108 d = c 109 c = b 110 b = a 111 a = t1 + t2 112 } 113 114 h0 += a 115 h1 += b 116 h2 += c 117 h3 += d 118 h4 += e 119 h5 += f 120 h6 += g 121 h7 += h 122 123 p = p[_Chunk:] 124 n += _Chunk 125 } 126 127 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 128 return n 129 }