// Copyright (c) 2022 xdx. All Rights Reserved. // // Written by xdx (xdx@xdx.jelly). package sm3 import ( "encoding/binary" ) // Size is the bytes of digest const Size = 32 // BlockSize is the bytes of each block const BlockSize = 64 const ( chunk = 64 init0 = 0x7380166f init1 = 0x4914b2b9 init2 = 0x172442d7 init3 = 0xda8a0600 init4 = 0xa96f30bc init5 = 0x163138aa init6 = 0xe38dee4d init7 = 0xb0fb0e4e ) const ( magic = "xdx-SM3\x00\x00\x00\x00\x00" marshaledSize = len(magic) + 4*8 + chunk + 8 ) func appendUint64(b []byte, x uint64) []byte { a := [8]byte{ byte(x >> 56), byte(x >> 48), byte(x >> 40), byte(x >> 32), byte(x >> 24), byte(x >> 16), byte(x >> 8), byte(x), } return append(b, a[:]...) } func appendUint32(b []byte, x uint32) []byte { a := [4]byte{ byte(x >> 24), byte(x >> 16), byte(x >> 8), byte(x), } return append(b, a[:]...) } func consumeUint64(b []byte) ([]byte, uint64) { _ = b[7] x := uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 | uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56 return b[8:], x } func consumeUint32(b []byte) ([]byte, uint32) { _ = b[3] x := uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24 return b[4:], x } func (d *digest) checkSum() [Size]byte { // Write will change d.len length := d.len << 3 var buf [chunk * 2]byte n := copy(buf[:], d.x[:d.nx]) buf[n] = 0x80 n++ nn := chunk if n > chunk-8 { nn += chunk } binary.BigEndian.PutUint64(buf[nn-8:nn], length) block(d, buf[:nn]) var result [Size]byte for i, s := range d.h { binary.BigEndian.PutUint32(result[i*4:], s) } return result } // Block functions func blockGeneric(dig *digest, p []byte) { var a, b, c, d, e, f, g, h uint32 var w00, w01, w02, w03, w04, w05, w06, w07, w08, w09, w10, w11, w12, w13, w14, w15 uint32 for len(p) >= chunk { a = dig.h[0] b = dig.h[1] c = dig.h[2] d = dig.h[3] e = dig.h[4] f = dig.h[5] g = dig.h[6] h = dig.h[7] w00 = uint32(p[3]) | uint32(p[2])<<8 | uint32(p[1])<<16 | uint32(p[0])<<24 w01 = uint32(p[7]) | uint32(p[6])<<8 | uint32(p[5])<<16 | uint32(p[4])<<24 w02 = uint32(p[11]) | uint32(p[10])<<8 | uint32(p[9])<<16 | uint32(p[8])<<24 w03 = uint32(p[15]) | uint32(p[14])<<8 | uint32(p[13])<<16 | uint32(p[12])<<24 w04 = uint32(p[19]) | uint32(p[18])<<8 | uint32(p[17])<<16 | uint32(p[16])<<24 w05 = uint32(p[23]) | uint32(p[22])<<8 | uint32(p[21])<<16 | uint32(p[20])<<24 w06 = uint32(p[27]) | uint32(p[26])<<8 | uint32(p[25])<<16 | uint32(p[24])<<24 w07 = uint32(p[31]) | uint32(p[30])<<8 | uint32(p[29])<<16 | uint32(p[28])<<24 w08 = uint32(p[35]) | uint32(p[34])<<8 | uint32(p[33])<<16 | uint32(p[32])<<24 w09 = uint32(p[39]) | uint32(p[38])<<8 | uint32(p[37])<<16 | uint32(p[36])<<24 w10 = uint32(p[43]) | uint32(p[42])<<8 | uint32(p[41])<<16 | uint32(p[40])<<24 w11 = uint32(p[47]) | uint32(p[46])<<8 | uint32(p[45])<<16 | uint32(p[44])<<24 w12 = uint32(p[51]) | uint32(p[50])<<8 | uint32(p[49])<<16 | uint32(p[48])<<24 w13 = uint32(p[55]) | uint32(p[54])<<8 | uint32(p[53])<<16 | uint32(p[52])<<24 w14 = uint32(p[59]) | uint32(p[58])<<8 | uint32(p[57])<<16 | uint32(p[56])<<24 w15 = uint32(p[63]) | uint32(p[62])<<8 | uint32(p[61])<<16 | uint32(p[60])<<24 { SS2 := a<<12 | a>>20 SS1 := SS2 + e + 0x79cc4519 SS1 = SS1<<7 | SS1>>25 TT1 := a ^ b ^ c + d + (SS2 ^ SS1) + (w00 ^ w04) TT2 := e ^ f ^ g + h + SS1 + w00 b = b<<9 | b>>23 d = TT1 f = f<<19 | f>>13 h = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w00 ^ w07 ^ (w13<<15 | w13>>17) w00 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w03<<7 | w03>>25) ^ w10 } { SS2 := d<<12 | d>>20 SS1 := SS2 + h + 0xf3988a32 SS1 = SS1<<7 | SS1>>25 TT1 := d ^ a ^ b + c + (SS2 ^ SS1) + (w01 ^ w05) TT2 := h ^ e ^ f + g + SS1 + w01 a = a<<9 | a>>23 c = TT1 e = e<<19 | e>>13 g = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w01 ^ w08 ^ (w14<<15 | w14>>17) w01 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w04<<7 | w04>>25) ^ w11 } { SS2 := c<<12 | c>>20 SS1 := SS2 + g + 0xe7311465 SS1 = SS1<<7 | SS1>>25 TT1 := c ^ d ^ a + b + (SS2 ^ SS1) + (w02 ^ w06) TT2 := g ^ h ^ e + f + SS1 + w02 d = d<<9 | d>>23 b = TT1 h = h<<19 | h>>13 f = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w02 ^ w09 ^ (w15<<15 | w15>>17) w02 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w05<<7 | w05>>25) ^ w12 } { SS2 := b<<12 | b>>20 SS1 := SS2 + f + 0xce6228cb SS1 = SS1<<7 | SS1>>25 TT1 := b ^ c ^ d + a + (SS2 ^ SS1) + (w03 ^ w07) TT2 := f ^ g ^ h + e + SS1 + w03 c = c<<9 | c>>23 a = TT1 g = g<<19 | g>>13 e = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w03 ^ w10 ^ (w00<<15 | w00>>17) w03 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w06<<7 | w06>>25) ^ w13 } { SS2 := a<<12 | a>>20 SS1 := SS2 + e + 0x9cc45197 SS1 = SS1<<7 | SS1>>25 TT1 := a ^ b ^ c + d + (SS2 ^ SS1) + (w04 ^ w08) TT2 := e ^ f ^ g + h + SS1 + w04 b = b<<9 | b>>23 d = TT1 f = f<<19 | f>>13 h = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w04 ^ w11 ^ (w01<<15 | w01>>17) w04 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w07<<7 | w07>>25) ^ w14 } { SS2 := d<<12 | d>>20 SS1 := SS2 + h + 0x3988a32f SS1 = SS1<<7 | SS1>>25 TT1 := d ^ a ^ b + c + (SS2 ^ SS1) + (w05 ^ w09) TT2 := h ^ e ^ f + g + SS1 + w05 a = a<<9 | a>>23 c = TT1 e = e<<19 | e>>13 g = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w05 ^ w12 ^ (w02<<15 | w02>>17) w05 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w08<<7 | w08>>25) ^ w15 } { SS2 := c<<12 | c>>20 SS1 := SS2 + g + 0x7311465e SS1 = SS1<<7 | SS1>>25 TT1 := c ^ d ^ a + b + (SS2 ^ SS1) + (w06 ^ w10) TT2 := g ^ h ^ e + f + SS1 + w06 d = d<<9 | d>>23 b = TT1 h = h<<19 | h>>13 f = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w06 ^ w13 ^ (w03<<15 | w03>>17) w06 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w09<<7 | w09>>25) ^ w00 } { SS2 := b<<12 | b>>20 SS1 := SS2 + f + 0xe6228cbc SS1 = SS1<<7 | SS1>>25 TT1 := b ^ c ^ d + a + (SS2 ^ SS1) + (w07 ^ w11) TT2 := f ^ g ^ h + e + SS1 + w07 c = c<<9 | c>>23 a = TT1 g = g<<19 | g>>13 e = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w07 ^ w14 ^ (w04<<15 | w04>>17) w07 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w10<<7 | w10>>25) ^ w01 } { SS2 := a<<12 | a>>20 SS1 := SS2 + e + 0xcc451979 SS1 = SS1<<7 | SS1>>25 TT1 := a ^ b ^ c + d + (SS2 ^ SS1) + (w08 ^ w12) TT2 := e ^ f ^ g + h + SS1 + w08 b = b<<9 | b>>23 d = TT1 f = f<<19 | f>>13 h = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w08 ^ w15 ^ (w05<<15 | w05>>17) w08 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w11<<7 | w11>>25) ^ w02 } { SS2 := d<<12 | d>>20 SS1 := SS2 + h + 0x988a32f3 SS1 = SS1<<7 | SS1>>25 TT1 := d ^ a ^ b + c + (SS2 ^ SS1) + (w09 ^ w13) TT2 := h ^ e ^ f + g + SS1 + w09 a = a<<9 | a>>23 c = TT1 e = e<<19 | e>>13 g = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w09 ^ w00 ^ (w06<<15 | w06>>17) w09 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w12<<7 | w12>>25) ^ w03 } { SS2 := c<<12 | c>>20 SS1 := SS2 + g + 0x311465e7 SS1 = SS1<<7 | SS1>>25 TT1 := c ^ d ^ a + b + (SS2 ^ SS1) + (w10 ^ w14) TT2 := g ^ h ^ e + f + SS1 + w10 d = d<<9 | d>>23 b = TT1 h = h<<19 | h>>13 f = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w10 ^ w01 ^ (w07<<15 | w07>>17) w10 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w13<<7 | w13>>25) ^ w04 } { SS2 := b<<12 | b>>20 SS1 := SS2 + f + 0x6228cbce SS1 = SS1<<7 | SS1>>25 TT1 := b ^ c ^ d + a + (SS2 ^ SS1) + (w11 ^ w15) TT2 := f ^ g ^ h + e + SS1 + w11 c = c<<9 | c>>23 a = TT1 g = g<<19 | g>>13 e = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w11 ^ w02 ^ (w08<<15 | w08>>17) w11 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w14<<7 | w14>>25) ^ w05 } { SS2 := a<<12 | a>>20 SS1 := SS2 + e + 0xc451979c SS1 = SS1<<7 | SS1>>25 TT1 := a ^ b ^ c + d + (SS2 ^ SS1) + (w12 ^ w00) TT2 := e ^ f ^ g + h + SS1 + w12 b = b<<9 | b>>23 d = TT1 f = f<<19 | f>>13 h = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w12 ^ w03 ^ (w09<<15 | w09>>17) w12 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w15<<7 | w15>>25) ^ w06 } { SS2 := d<<12 | d>>20 SS1 := SS2 + h + 0x88a32f39 SS1 = SS1<<7 | SS1>>25 TT1 := d ^ a ^ b + c + (SS2 ^ SS1) + (w13 ^ w01) TT2 := h ^ e ^ f + g + SS1 + w13 a = a<<9 | a>>23 c = TT1 e = e<<19 | e>>13 g = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w13 ^ w04 ^ (w10<<15 | w10>>17) w13 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w00<<7 | w00>>25) ^ w07 } { SS2 := c<<12 | c>>20 SS1 := SS2 + g + 0x11465e73 SS1 = SS1<<7 | SS1>>25 TT1 := c ^ d ^ a + b + (SS2 ^ SS1) + (w14 ^ w02) TT2 := g ^ h ^ e + f + SS1 + w14 d = d<<9 | d>>23 b = TT1 h = h<<19 | h>>13 f = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w14 ^ w05 ^ (w11<<15 | w11>>17) w14 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w01<<7 | w01>>25) ^ w08 } { SS2 := b<<12 | b>>20 SS1 := SS2 + f + 0x228cbce6 SS1 = SS1<<7 | SS1>>25 TT1 := b ^ c ^ d + a + (SS2 ^ SS1) + (w15 ^ w03) TT2 := f ^ g ^ h + e + SS1 + w15 c = c<<9 | c>>23 a = TT1 g = g<<19 | g>>13 e = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w15 ^ w06 ^ (w12<<15 | w12>>17) w15 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w02<<7 | w02>>25) ^ w09 } { SS2 := a<<12 | a>>20 SS1 := SS2 + e + 0x9d8a7a87 SS1 = SS1<<7 | SS1>>25 TT1 := ((a & b) | ((a | b) & c)) + d + (SS2 ^ SS1) + (w00 ^ w04) TT2 := (g ^ (e & (f ^ g))) + SS1 + h + w00 b = b<<9 | b>>23 d = TT1 f = f<<19 | f>>13 h = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w00 ^ w07 ^ (w13<<15 | w13>>17) w00 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w03<<7 | w03>>25) ^ w10 } { SS2 := d<<12 | d>>20 SS1 := SS2 + h + 0x3b14f50f SS1 = SS1<<7 | SS1>>25 TT1 := ((d & a) | ((d | a) & b)) + c + (SS2 ^ SS1) + (w01 ^ w05) TT2 := (f ^ (h & (e ^ f))) + SS1 + g + w01 a = a<<9 | a>>23 c = TT1 e = e<<19 | e>>13 g = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w01 ^ w08 ^ (w14<<15 | w14>>17) w01 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w04<<7 | w04>>25) ^ w11 } { SS2 := c<<12 | c>>20 SS1 := SS2 + g + 0x7629ea1e SS1 = SS1<<7 | SS1>>25 TT1 := ((c & d) | ((c | d) & a)) + b + (SS2 ^ SS1) + (w02 ^ w06) TT2 := (e ^ (g & (h ^ e))) + SS1 + f + w02 d = d<<9 | d>>23 b = TT1 h = h<<19 | h>>13 f = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w02 ^ w09 ^ (w15<<15 | w15>>17) w02 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w05<<7 | w05>>25) ^ w12 } { SS2 := b<<12 | b>>20 SS1 := SS2 + f + 0xec53d43c SS1 = SS1<<7 | SS1>>25 TT1 := ((b & c) | ((b | c) & d)) + a + (SS2 ^ SS1) + (w03 ^ w07) TT2 := (h ^ (f & (g ^ h))) + SS1 + e + w03 c = c<<9 | c>>23 a = TT1 g = g<<19 | g>>13 e = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w03 ^ w10 ^ (w00<<15 | w00>>17) w03 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w06<<7 | w06>>25) ^ w13 } { SS2 := a<<12 | a>>20 SS1 := SS2 + e + 0xd8a7a879 SS1 = SS1<<7 | SS1>>25 TT1 := ((a & b) | ((a | b) & c)) + d + (SS2 ^ SS1) + (w04 ^ w08) TT2 := (g ^ (e & (f ^ g))) + SS1 + h + w04 b = b<<9 | b>>23 d = TT1 f = f<<19 | f>>13 h = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w04 ^ w11 ^ (w01<<15 | w01>>17) w04 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w07<<7 | w07>>25) ^ w14 } { SS2 := d<<12 | d>>20 SS1 := SS2 + h + 0xb14f50f3 SS1 = SS1<<7 | SS1>>25 TT1 := ((d & a) | ((d | a) & b)) + c + (SS2 ^ SS1) + (w05 ^ w09) TT2 := (f ^ (h & (e ^ f))) + SS1 + g + w05 a = a<<9 | a>>23 c = TT1 e = e<<19 | e>>13 g = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w05 ^ w12 ^ (w02<<15 | w02>>17) w05 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w08<<7 | w08>>25) ^ w15 } { SS2 := c<<12 | c>>20 SS1 := SS2 + g + 0x629ea1e7 SS1 = SS1<<7 | SS1>>25 TT1 := ((c & d) | ((c | d) & a)) + b + (SS2 ^ SS1) + (w06 ^ w10) TT2 := (e ^ (g & (h ^ e))) + SS1 + f + w06 d = d<<9 | d>>23 b = TT1 h = h<<19 | h>>13 f = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w06 ^ w13 ^ (w03<<15 | w03>>17) w06 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w09<<7 | w09>>25) ^ w00 } { SS2 := b<<12 | b>>20 SS1 := SS2 + f + 0xc53d43ce SS1 = SS1<<7 | SS1>>25 TT1 := ((b & c) | ((b | c) & d)) + a + (SS2 ^ SS1) + (w07 ^ w11) TT2 := (h ^ (f & (g ^ h))) + SS1 + e + w07 c = c<<9 | c>>23 a = TT1 g = g<<19 | g>>13 e = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w07 ^ w14 ^ (w04<<15 | w04>>17) w07 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w10<<7 | w10>>25) ^ w01 } { SS2 := a<<12 | a>>20 SS1 := SS2 + e + 0x8a7a879d SS1 = SS1<<7 | SS1>>25 TT1 := ((a & b) | ((a | b) & c)) + d + (SS2 ^ SS1) + (w08 ^ w12) TT2 := (g ^ (e & (f ^ g))) + SS1 + h + w08 b = b<<9 | b>>23 d = TT1 f = f<<19 | f>>13 h = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w08 ^ w15 ^ (w05<<15 | w05>>17) w08 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w11<<7 | w11>>25) ^ w02 } { SS2 := d<<12 | d>>20 SS1 := SS2 + h + 0x14f50f3b SS1 = SS1<<7 | SS1>>25 TT1 := ((d & a) | ((d | a) & b)) + c + (SS2 ^ SS1) + (w09 ^ w13) TT2 := (f ^ (h & (e ^ f))) + SS1 + g + w09 a = a<<9 | a>>23 c = TT1 e = e<<19 | e>>13 g = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w09 ^ w00 ^ (w06<<15 | w06>>17) w09 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w12<<7 | w12>>25) ^ w03 } { SS2 := c<<12 | c>>20 SS1 := SS2 + g + 0x29ea1e76 SS1 = SS1<<7 | SS1>>25 TT1 := ((c & d) | ((c | d) & a)) + b + (SS2 ^ SS1) + (w10 ^ w14) TT2 := (e ^ (g & (h ^ e))) + SS1 + f + w10 d = d<<9 | d>>23 b = TT1 h = h<<19 | h>>13 f = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w10 ^ w01 ^ (w07<<15 | w07>>17) w10 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w13<<7 | w13>>25) ^ w04 } { SS2 := b<<12 | b>>20 SS1 := SS2 + f + 0x53d43cec SS1 = SS1<<7 | SS1>>25 TT1 := ((b & c) | ((b | c) & d)) + a + (SS2 ^ SS1) + (w11 ^ w15) TT2 := (h ^ (f & (g ^ h))) + SS1 + e + w11 c = c<<9 | c>>23 a = TT1 g = g<<19 | g>>13 e = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w11 ^ w02 ^ (w08<<15 | w08>>17) w11 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w14<<7 | w14>>25) ^ w05 } { SS2 := a<<12 | a>>20 SS1 := SS2 + e + 0xa7a879d8 SS1 = SS1<<7 | SS1>>25 TT1 := ((a & b) | ((a | b) & c)) + d + (SS2 ^ SS1) + (w12 ^ w00) TT2 := (g ^ (e & (f ^ g))) + SS1 + h + w12 b = b<<9 | b>>23 d = TT1 f = f<<19 | f>>13 h = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w12 ^ w03 ^ (w09<<15 | w09>>17) w12 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w15<<7 | w15>>25) ^ w06 } { SS2 := d<<12 | d>>20 SS1 := SS2 + h + 0x4f50f3b1 SS1 = SS1<<7 | SS1>>25 TT1 := ((d & a) | ((d | a) & b)) + c + (SS2 ^ SS1) + (w13 ^ w01) TT2 := (f ^ (h & (e ^ f))) + SS1 + g + w13 a = a<<9 | a>>23 c = TT1 e = e<<19 | e>>13 g = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w13 ^ w04 ^ (w10<<15 | w10>>17) w13 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w00<<7 | w00>>25) ^ w07 } { SS2 := c<<12 | c>>20 SS1 := SS2 + g + 0x9ea1e762 SS1 = SS1<<7 | SS1>>25 TT1 := ((c & d) | ((c | d) & a)) + b + (SS2 ^ SS1) + (w14 ^ w02) TT2 := (e ^ (g & (h ^ e))) + SS1 + f + w14 d = d<<9 | d>>23 b = TT1 h = h<<19 | h>>13 f = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w14 ^ w05 ^ (w11<<15 | w11>>17) w14 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w01<<7 | w01>>25) ^ w08 } { SS2 := b<<12 | b>>20 SS1 := SS2 + f + 0x3d43cec5 SS1 = SS1<<7 | SS1>>25 TT1 := ((b & c) | ((b | c) & d)) + a + (SS2 ^ SS1) + (w15 ^ w03) TT2 := (h ^ (f & (g ^ h))) + SS1 + e + w15 c = c<<9 | c>>23 a = TT1 g = g<<19 | g>>13 e = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w15 ^ w06 ^ (w12<<15 | w12>>17) w15 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w02<<7 | w02>>25) ^ w09 } { SS2 := a<<12 | a>>20 SS1 := SS2 + e + 0x7a879d8a SS1 = SS1<<7 | SS1>>25 TT1 := ((a & b) | ((a | b) & c)) + d + (SS2 ^ SS1) + (w00 ^ w04) TT2 := (g ^ (e & (f ^ g))) + SS1 + h + w00 b = b<<9 | b>>23 d = TT1 f = f<<19 | f>>13 h = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w00 ^ w07 ^ (w13<<15 | w13>>17) w00 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w03<<7 | w03>>25) ^ w10 } { SS2 := d<<12 | d>>20 SS1 := SS2 + h + 0xf50f3b14 SS1 = SS1<<7 | SS1>>25 TT1 := ((d & a) | ((d | a) & b)) + c + (SS2 ^ SS1) + (w01 ^ w05) TT2 := (f ^ (h & (e ^ f))) + SS1 + g + w01 a = a<<9 | a>>23 c = TT1 e = e<<19 | e>>13 g = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w01 ^ w08 ^ (w14<<15 | w14>>17) w01 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w04<<7 | w04>>25) ^ w11 } { SS2 := c<<12 | c>>20 SS1 := SS2 + g + 0xea1e7629 SS1 = SS1<<7 | SS1>>25 TT1 := ((c & d) | ((c | d) & a)) + b + (SS2 ^ SS1) + (w02 ^ w06) TT2 := (e ^ (g & (h ^ e))) + SS1 + f + w02 d = d<<9 | d>>23 b = TT1 h = h<<19 | h>>13 f = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w02 ^ w09 ^ (w15<<15 | w15>>17) w02 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w05<<7 | w05>>25) ^ w12 } { SS2 := b<<12 | b>>20 SS1 := SS2 + f + 0xd43cec53 SS1 = SS1<<7 | SS1>>25 TT1 := ((b & c) | ((b | c) & d)) + a + (SS2 ^ SS1) + (w03 ^ w07) TT2 := (h ^ (f & (g ^ h))) + SS1 + e + w03 c = c<<9 | c>>23 a = TT1 g = g<<19 | g>>13 e = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w03 ^ w10 ^ (w00<<15 | w00>>17) w03 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w06<<7 | w06>>25) ^ w13 } { SS2 := a<<12 | a>>20 SS1 := SS2 + e + 0xa879d8a7 SS1 = SS1<<7 | SS1>>25 TT1 := ((a & b) | ((a | b) & c)) + d + (SS2 ^ SS1) + (w04 ^ w08) TT2 := (g ^ (e & (f ^ g))) + SS1 + h + w04 b = b<<9 | b>>23 d = TT1 f = f<<19 | f>>13 h = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w04 ^ w11 ^ (w01<<15 | w01>>17) w04 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w07<<7 | w07>>25) ^ w14 } { SS2 := d<<12 | d>>20 SS1 := SS2 + h + 0x50f3b14f SS1 = SS1<<7 | SS1>>25 TT1 := ((d & a) | ((d | a) & b)) + c + (SS2 ^ SS1) + (w05 ^ w09) TT2 := (f ^ (h & (e ^ f))) + SS1 + g + w05 a = a<<9 | a>>23 c = TT1 e = e<<19 | e>>13 g = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w05 ^ w12 ^ (w02<<15 | w02>>17) w05 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w08<<7 | w08>>25) ^ w15 } { SS2 := c<<12 | c>>20 SS1 := SS2 + g + 0xa1e7629e SS1 = SS1<<7 | SS1>>25 TT1 := ((c & d) | ((c | d) & a)) + b + (SS2 ^ SS1) + (w06 ^ w10) TT2 := (e ^ (g & (h ^ e))) + SS1 + f + w06 d = d<<9 | d>>23 b = TT1 h = h<<19 | h>>13 f = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w06 ^ w13 ^ (w03<<15 | w03>>17) w06 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w09<<7 | w09>>25) ^ w00 } { SS2 := b<<12 | b>>20 SS1 := SS2 + f + 0x43cec53d SS1 = SS1<<7 | SS1>>25 TT1 := ((b & c) | ((b | c) & d)) + a + (SS2 ^ SS1) + (w07 ^ w11) TT2 := (h ^ (f & (g ^ h))) + SS1 + e + w07 c = c<<9 | c>>23 a = TT1 g = g<<19 | g>>13 e = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w07 ^ w14 ^ (w04<<15 | w04>>17) w07 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w10<<7 | w10>>25) ^ w01 } { SS2 := a<<12 | a>>20 SS1 := SS2 + e + 0x879d8a7a SS1 = SS1<<7 | SS1>>25 TT1 := ((a & b) | ((a | b) & c)) + d + (SS2 ^ SS1) + (w08 ^ w12) TT2 := (g ^ (e & (f ^ g))) + SS1 + h + w08 b = b<<9 | b>>23 d = TT1 f = f<<19 | f>>13 h = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w08 ^ w15 ^ (w05<<15 | w05>>17) w08 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w11<<7 | w11>>25) ^ w02 } { SS2 := d<<12 | d>>20 SS1 := SS2 + h + 0x0f3b14f5 SS1 = SS1<<7 | SS1>>25 TT1 := ((d & a) | ((d | a) & b)) + c + (SS2 ^ SS1) + (w09 ^ w13) TT2 := (f ^ (h & (e ^ f))) + SS1 + g + w09 a = a<<9 | a>>23 c = TT1 e = e<<19 | e>>13 g = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w09 ^ w00 ^ (w06<<15 | w06>>17) w09 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w12<<7 | w12>>25) ^ w03 } { SS2 := c<<12 | c>>20 SS1 := SS2 + g + 0x1e7629ea SS1 = SS1<<7 | SS1>>25 TT1 := ((c & d) | ((c | d) & a)) + b + (SS2 ^ SS1) + (w10 ^ w14) TT2 := (e ^ (g & (h ^ e))) + SS1 + f + w10 d = d<<9 | d>>23 b = TT1 h = h<<19 | h>>13 f = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w10 ^ w01 ^ (w07<<15 | w07>>17) w10 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w13<<7 | w13>>25) ^ w04 } { SS2 := b<<12 | b>>20 SS1 := SS2 + f + 0x3cec53d4 SS1 = SS1<<7 | SS1>>25 TT1 := ((b & c) | ((b | c) & d)) + a + (SS2 ^ SS1) + (w11 ^ w15) TT2 := (h ^ (f & (g ^ h))) + SS1 + e + w11 c = c<<9 | c>>23 a = TT1 g = g<<19 | g>>13 e = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w11 ^ w02 ^ (w08<<15 | w08>>17) w11 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w14<<7 | w14>>25) ^ w05 } { SS2 := a<<12 | a>>20 SS1 := SS2 + e + 0x79d8a7a8 SS1 = SS1<<7 | SS1>>25 TT1 := ((a & b) | ((a | b) & c)) + d + (SS2 ^ SS1) + (w12 ^ w00) TT2 := (g ^ (e & (f ^ g))) + SS1 + h + w12 b = b<<9 | b>>23 d = TT1 f = f<<19 | f>>13 h = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w12 ^ w03 ^ (w09<<15 | w09>>17) w12 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w15<<7 | w15>>25) ^ w06 } { SS2 := d<<12 | d>>20 SS1 := SS2 + h + 0xf3b14f50 SS1 = SS1<<7 | SS1>>25 TT1 := ((d & a) | ((d | a) & b)) + c + (SS2 ^ SS1) + (w13 ^ w01) TT2 := (f ^ (h & (e ^ f))) + SS1 + g + w13 a = a<<9 | a>>23 c = TT1 e = e<<19 | e>>13 g = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w13 ^ w04 ^ (w10<<15 | w10>>17) w13 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w00<<7 | w00>>25) ^ w07 } { SS2 := c<<12 | c>>20 SS1 := SS2 + g + 0xe7629ea1 SS1 = SS1<<7 | SS1>>25 TT1 := ((c & d) | ((c | d) & a)) + b + (SS2 ^ SS1) + (w14 ^ w02) TT2 := (e ^ (g & (h ^ e))) + SS1 + f + w14 d = d<<9 | d>>23 b = TT1 h = h<<19 | h>>13 f = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w14 ^ w05 ^ (w11<<15 | w11>>17) w14 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w01<<7 | w01>>25) ^ w08 } { SS2 := b<<12 | b>>20 SS1 := SS2 + f + 0xcec53d43 SS1 = SS1<<7 | SS1>>25 TT1 := ((b & c) | ((b | c) & d)) + a + (SS2 ^ SS1) + (w15 ^ w03) TT2 := (h ^ (f & (g ^ h))) + SS1 + e + w15 c = c<<9 | c>>23 a = TT1 g = g<<19 | g>>13 e = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w15 ^ w06 ^ (w12<<15 | w12>>17) w15 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w02<<7 | w02>>25) ^ w09 } { SS2 := a<<12 | a>>20 SS1 := SS2 + e + 0x9d8a7a87 SS1 = SS1<<7 | SS1>>25 TT1 := ((a & b) | ((a | b) & c)) + d + (SS2 ^ SS1) + (w00 ^ w04) TT2 := (g ^ (e & (f ^ g))) + SS1 + h + w00 b = b<<9 | b>>23 d = TT1 f = f<<19 | f>>13 h = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w00 ^ w07 ^ (w13<<15 | w13>>17) w00 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w03<<7 | w03>>25) ^ w10 } { SS2 := d<<12 | d>>20 SS1 := SS2 + h + 0x3b14f50f SS1 = SS1<<7 | SS1>>25 TT1 := ((d & a) | ((d | a) & b)) + c + (SS2 ^ SS1) + (w01 ^ w05) TT2 := (f ^ (h & (e ^ f))) + SS1 + g + w01 a = a<<9 | a>>23 c = TT1 e = e<<19 | e>>13 g = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w01 ^ w08 ^ (w14<<15 | w14>>17) w01 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w04<<7 | w04>>25) ^ w11 } { SS2 := c<<12 | c>>20 SS1 := SS2 + g + 0x7629ea1e SS1 = SS1<<7 | SS1>>25 TT1 := ((c & d) | ((c | d) & a)) + b + (SS2 ^ SS1) + (w02 ^ w06) TT2 := (e ^ (g & (h ^ e))) + SS1 + f + w02 d = d<<9 | d>>23 b = TT1 h = h<<19 | h>>13 f = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w02 ^ w09 ^ (w15<<15 | w15>>17) w02 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w05<<7 | w05>>25) ^ w12 } { SS2 := b<<12 | b>>20 SS1 := SS2 + f + 0xec53d43c SS1 = SS1<<7 | SS1>>25 TT1 := ((b & c) | ((b | c) & d)) + a + (SS2 ^ SS1) + (w03 ^ w07) TT2 := (h ^ (f & (g ^ h))) + SS1 + e + w03 c = c<<9 | c>>23 a = TT1 g = g<<19 | g>>13 e = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) tw := w03 ^ w10 ^ (w00<<15 | w00>>17) w03 = tw ^ (tw<<15 | tw>>17) ^ (tw<<23 | tw>>9) ^ (w06<<7 | w06>>25) ^ w13 } { SS2 := a<<12 | a>>20 SS1 := SS2 + e + 0xd8a7a879 SS1 = SS1<<7 | SS1>>25 TT1 := ((a & b) | ((a | b) & c)) + d + (SS2 ^ SS1) + (w04 ^ w08) TT2 := (g ^ (e & (f ^ g))) + SS1 + h + w04 b = b<<9 | b>>23 d = TT1 f = f<<19 | f>>13 h = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) } { SS2 := d<<12 | d>>20 SS1 := SS2 + h + 0xb14f50f3 SS1 = SS1<<7 | SS1>>25 TT1 := ((d & a) | ((d | a) & b)) + c + (SS2 ^ SS1) + (w05 ^ w09) TT2 := (f ^ (h & (e ^ f))) + SS1 + g + w05 a = a<<9 | a>>23 c = TT1 e = e<<19 | e>>13 g = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) } { SS2 := c<<12 | c>>20 SS1 := SS2 + g + 0x629ea1e7 SS1 = SS1<<7 | SS1>>25 TT1 := ((c & d) | ((c | d) & a)) + b + (SS2 ^ SS1) + (w06 ^ w10) TT2 := (e ^ (g & (h ^ e))) + SS1 + f + w06 d = d<<9 | d>>23 b = TT1 h = h<<19 | h>>13 f = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) } { SS2 := b<<12 | b>>20 SS1 := SS2 + f + 0xc53d43ce SS1 = SS1<<7 | SS1>>25 TT1 := ((b & c) | ((b | c) & d)) + a + (SS2 ^ SS1) + (w07 ^ w11) TT2 := (h ^ (f & (g ^ h))) + SS1 + e + w07 c = c<<9 | c>>23 a = TT1 g = g<<19 | g>>13 e = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) } { SS2 := a<<12 | a>>20 SS1 := SS2 + e + 0x8a7a879d SS1 = SS1<<7 | SS1>>25 TT1 := ((a & b) | ((a | b) & c)) + d + (SS2 ^ SS1) + (w08 ^ w12) TT2 := (g ^ (e & (f ^ g))) + SS1 + h + w08 b = b<<9 | b>>23 d = TT1 f = f<<19 | f>>13 h = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) } { SS2 := d<<12 | d>>20 SS1 := SS2 + h + 0x14f50f3b SS1 = SS1<<7 | SS1>>25 TT1 := ((d & a) | ((d | a) & b)) + c + (SS2 ^ SS1) + (w09 ^ w13) TT2 := (f ^ (h & (e ^ f))) + SS1 + g + w09 a = a<<9 | a>>23 c = TT1 e = e<<19 | e>>13 g = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) } { SS2 := c<<12 | c>>20 SS1 := SS2 + g + 0x29ea1e76 SS1 = SS1<<7 | SS1>>25 TT1 := ((c & d) | ((c | d) & a)) + b + (SS2 ^ SS1) + (w10 ^ w14) TT2 := (e ^ (g & (h ^ e))) + SS1 + f + w10 d = d<<9 | d>>23 b = TT1 h = h<<19 | h>>13 f = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) } { SS2 := b<<12 | b>>20 SS1 := SS2 + f + 0x53d43cec SS1 = SS1<<7 | SS1>>25 TT1 := ((b & c) | ((b | c) & d)) + a + (SS2 ^ SS1) + (w11 ^ w15) TT2 := (h ^ (f & (g ^ h))) + SS1 + e + w11 c = c<<9 | c>>23 a = TT1 g = g<<19 | g>>13 e = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) } { SS2 := a<<12 | a>>20 SS1 := SS2 + e + 0xa7a879d8 SS1 = SS1<<7 | SS1>>25 TT1 := ((a & b) | ((a | b) & c)) + d + (SS2 ^ SS1) + (w12 ^ w00) TT2 := (g ^ (e & (f ^ g))) + SS1 + h + w12 b = b<<9 | b>>23 d = TT1 f = f<<19 | f>>13 h = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) } { SS2 := d<<12 | d>>20 SS1 := SS2 + h + 0x4f50f3b1 SS1 = SS1<<7 | SS1>>25 TT1 := ((d & a) | ((d | a) & b)) + c + (SS2 ^ SS1) + (w13 ^ w01) TT2 := (f ^ (h & (e ^ f))) + SS1 + g + w13 a = a<<9 | a>>23 c = TT1 e = e<<19 | e>>13 g = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) } { SS2 := c<<12 | c>>20 SS1 := SS2 + g + 0x9ea1e762 SS1 = SS1<<7 | SS1>>25 TT1 := ((c & d) | ((c | d) & a)) + b + (SS2 ^ SS1) + (w14 ^ w02) TT2 := (e ^ (g & (h ^ e))) + SS1 + f + w14 d = d<<9 | d>>23 b = TT1 h = h<<19 | h>>13 f = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) } { SS2 := b<<12 | b>>20 SS1 := SS2 + f + 0x3d43cec5 SS1 = SS1<<7 | SS1>>25 TT1 := ((b & c) | ((b | c) & d)) + a + (SS2 ^ SS1) + (w15 ^ w03) TT2 := (h ^ (f & (g ^ h))) + SS1 + e + w15 c = c<<9 | c>>23 a = TT1 g = g<<19 | g>>13 e = TT2 ^ (TT2<<9 | TT2>>23) ^ (TT2<<17 | TT2>>15) } p = p[chunk:] dig.h[0] ^= a dig.h[1] ^= b dig.h[2] ^= c dig.h[3] ^= d dig.h[4] ^= e dig.h[5] ^= f dig.h[6] ^= g dig.h[7] ^= h } }