Home | History | Annotate | Download | only in sha512
      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 // +build !amd64
      6 
      7 // SHA512 block step.
      8 // In its own file so that a faster assembly or C version
      9 // can be substituted easily.
     10 
     11 package sha512
     12 
     13 var _K = []uint64{
     14 	0x428a2f98d728ae22,
     15 	0x7137449123ef65cd,
     16 	0xb5c0fbcfec4d3b2f,
     17 	0xe9b5dba58189dbbc,
     18 	0x3956c25bf348b538,
     19 	0x59f111f1b605d019,
     20 	0x923f82a4af194f9b,
     21 	0xab1c5ed5da6d8118,
     22 	0xd807aa98a3030242,
     23 	0x12835b0145706fbe,
     24 	0x243185be4ee4b28c,
     25 	0x550c7dc3d5ffb4e2,
     26 	0x72be5d74f27b896f,
     27 	0x80deb1fe3b1696b1,
     28 	0x9bdc06a725c71235,
     29 	0xc19bf174cf692694,
     30 	0xe49b69c19ef14ad2,
     31 	0xefbe4786384f25e3,
     32 	0x0fc19dc68b8cd5b5,
     33 	0x240ca1cc77ac9c65,
     34 	0x2de92c6f592b0275,
     35 	0x4a7484aa6ea6e483,
     36 	0x5cb0a9dcbd41fbd4,
     37 	0x76f988da831153b5,
     38 	0x983e5152ee66dfab,
     39 	0xa831c66d2db43210,
     40 	0xb00327c898fb213f,
     41 	0xbf597fc7beef0ee4,
     42 	0xc6e00bf33da88fc2,
     43 	0xd5a79147930aa725,
     44 	0x06ca6351e003826f,
     45 	0x142929670a0e6e70,
     46 	0x27b70a8546d22ffc,
     47 	0x2e1b21385c26c926,
     48 	0x4d2c6dfc5ac42aed,
     49 	0x53380d139d95b3df,
     50 	0x650a73548baf63de,
     51 	0x766a0abb3c77b2a8,
     52 	0x81c2c92e47edaee6,
     53 	0x92722c851482353b,
     54 	0xa2bfe8a14cf10364,
     55 	0xa81a664bbc423001,
     56 	0xc24b8b70d0f89791,
     57 	0xc76c51a30654be30,
     58 	0xd192e819d6ef5218,
     59 	0xd69906245565a910,
     60 	0xf40e35855771202a,
     61 	0x106aa07032bbd1b8,
     62 	0x19a4c116b8d2d0c8,
     63 	0x1e376c085141ab53,
     64 	0x2748774cdf8eeb99,
     65 	0x34b0bcb5e19b48a8,
     66 	0x391c0cb3c5c95a63,
     67 	0x4ed8aa4ae3418acb,
     68 	0x5b9cca4f7763e373,
     69 	0x682e6ff3d6b2b8a3,
     70 	0x748f82ee5defb2fc,
     71 	0x78a5636f43172f60,
     72 	0x84c87814a1f0ab72,
     73 	0x8cc702081a6439ec,
     74 	0x90befffa23631e28,
     75 	0xa4506cebde82bde9,
     76 	0xbef9a3f7b2c67915,
     77 	0xc67178f2e372532b,
     78 	0xca273eceea26619c,
     79 	0xd186b8c721c0c207,
     80 	0xeada7dd6cde0eb1e,
     81 	0xf57d4f7fee6ed178,
     82 	0x06f067aa72176fba,
     83 	0x0a637dc5a2c898a6,
     84 	0x113f9804bef90dae,
     85 	0x1b710b35131c471b,
     86 	0x28db77f523047d84,
     87 	0x32caab7b40c72493,
     88 	0x3c9ebe0a15c9bebc,
     89 	0x431d67c49c100d4c,
     90 	0x4cc5d4becb3e42b6,
     91 	0x597f299cfc657e2a,
     92 	0x5fcb6fab3ad6faec,
     93 	0x6c44198c4a475817,
     94 }
     95 
     96 func block(dig *digest, p []byte) {
     97 	var w [80]uint64
     98 	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]
     99 	for len(p) >= chunk {
    100 		for i := 0; i < 16; i++ {
    101 			j := i * 8
    102 			w[i] = uint64(p[j])<<56 | uint64(p[j+1])<<48 | uint64(p[j+2])<<40 | uint64(p[j+3])<<32 |
    103 				uint64(p[j+4])<<24 | uint64(p[j+5])<<16 | uint64(p[j+6])<<8 | uint64(p[j+7])
    104 		}
    105 		for i := 16; i < 80; i++ {
    106 			v1 := w[i-2]
    107 			t1 := (v1>>19 | v1<<(64-19)) ^ (v1>>61 | v1<<(64-61)) ^ (v1 >> 6)
    108 			v2 := w[i-15]
    109 			t2 := (v2>>1 | v2<<(64-1)) ^ (v2>>8 | v2<<(64-8)) ^ (v2 >> 7)
    110 
    111 			w[i] = t1 + w[i-7] + t2 + w[i-16]
    112 		}
    113 
    114 		a, b, c, d, e, f, g, h := h0, h1, h2, h3, h4, h5, h6, h7
    115 
    116 		for i := 0; i < 80; i++ {
    117 			t1 := h + ((e>>14 | e<<(64-14)) ^ (e>>18 | e<<(64-18)) ^ (e>>41 | e<<(64-41))) + ((e & f) ^ (^e & g)) + _K[i] + w[i]
    118 
    119 			t2 := ((a>>28 | a<<(64-28)) ^ (a>>34 | a<<(64-34)) ^ (a>>39 | a<<(64-39))) + ((a & b) ^ (a & c) ^ (b & c))
    120 
    121 			h = g
    122 			g = f
    123 			f = e
    124 			e = d + t1
    125 			d = c
    126 			c = b
    127 			b = a
    128 			a = t1 + t2
    129 		}
    130 
    131 		h0 += a
    132 		h1 += b
    133 		h2 += c
    134 		h3 += d
    135 		h4 += e
    136 		h5 += f
    137 		h6 += g
    138 		h7 += h
    139 
    140 		p = p[chunk:]
    141 	}
    142 
    143 	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
    144 }
    145