1045 lines
28 KiB
Go
1045 lines
28 KiB
Go
// 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
|
|
}
|
|
|
|
}
|