It is based on the official RFC memorandum (https://tools.ietf.org/html/rfc6234) and some others C and BASIC examples around the net
Code: Select all
'SHA-256
OPTION EXPLICIT
FUNCTION SHL(x, n)
SHL = x * 2 ^ n
END FUNCTION
FUNCTION SHR(x, n)
SHR = x \ 2 ^ n
END FUNCTION
FUNCTION ROTL(x, n)
ROTL = SHL(x, n) OR SHR(x, 32 - n)
END FUNCTION
FUNCTION ROTR(x, n)
ROTR = SHR(x, n) OR SHL(x, 32 - n)
END FUNCTION
FUNCTION CH(x, y, z)
'CH = (x AND y) XOR ((NOT x) AND z)
'CH = ((X And Y) Xor ((Not(X)) And z))
CH = x AND y XOR NOT x AND z
END FUNCTION
FUNCTION MAJ(x, y, z)
'MAJ = (x AND y) XOR (x AND z) XOR (y AND z)
'MAJ = ((X And Y) Xor (X And z) Xor (Y And z))
MAJ = x AND y XOR x AND z XOR y AND z
END FUNCTION
FUNCTION BSIG0(x)
BSIG0 = ROTR(x, 2) XOR ROTR(x, 13) XOR ROTR(x, 22)
END FUNCTION
FUNCTION BSIG1(x)
BSIG1 = ROTR(x, 6) XOR ROTR(x, 11) XOR ROTR(x, 25)
END FUNCTION
FUNCTION SSIG0(x)
SSIG0 = ROTR(x, 7) XOR ROTR(x, 18) XOR SHR(x, 3)
END FUNCTION
FUNCTION SSIG1(x)
SSIG1 = ROTR(x, 17) XOR ROTR(x, 19) XOR SHR(x, 10)
END FUNCTION
SUB CONSTSINIT(K())
K(0) = &H428A2F98 : K(1) = &H71374491 : K(2) = &HB5C0FBCF : K(3) = &HE9B5DBA5
K(4) = &H3956C25B : K(5) = &H59F111F1 : K(6) = &H923F82A4 : K(7) = &HAB1C5ED5
K(8) = &HD807AA98 : K(9) = &H12835B01 : K(10) = &H243185BE : K(11) = &H550C7DC3
K(12) = &H72BE5D74 : K(13) = &H80DEB1FE : K(14) = &H9BDC06A7 : K(15) = &HC19BF174
K(16) = &HE49B69C1 : K(17) = &HEFBE4786 : K(18) = &HFC19DC6 : K(19) = &H240CA1CC
K(20) = &H2DE92C6F : K(21) = &H4A7484AA : K(22) = &H5CB0A9DC : K(23) = &H76F988DA
K(24) = &H983E5152 : K(25) = &HA831C66D : K(26) = &HB00327C8 : K(27) = &HBF597FC7
K(28) = &HC6E00BF3 : K(29) = &HD5A79147 : K(30) = &H6CA6351 : K(31) = &H14292967
K(32) = &H27B70A85 : K(33) = &H2E1B2138 : K(34) = &H4D2C6DFC : K(35) = &H53380D13
K(36) = &H650A7354 : K(37) = &H766A0ABB : K(38) = &H81C2C92E : K(39) = &H92722C85
K(40) = &HA2BFE8A1 : K(41) = &HA81A664B : K(42) = &HC24B8B70 : K(43) = &HC76C51A3
K(44) = &HD192E819 : K(45) = &HD6990624 : K(46) = &HF40E3585 : K(47) = &H106AA070
K(48) = &H19A4C116 : K(49) = &H1E376C08 : K(50) = &H2748774C : K(51) = &H34B0BCB5
K(52) = &H391C0CB3 : K(53) = &H4ED8AA4A : K(54) = &H5B9CCA4F : K(55) = &H682E6FF3
K(56) = &H748F82EE : K(57) = &H78A5636F : K(58) = &H84C87814 : K(59) = &H8CC70208
K(60) = &H90BEFFFA : K(61) = &HA4506CEB : K(62) = &HBEF9A3F7 : K(63) = &HC67178F2
END SUB
FUNCTION SHA256$(Message$)
'Hash values
DIM h0, h1, h2, h3, h4, h5, h6, h7
DIM a, b, c, d, e, f, g, h, t1, t2
'Hash constants
DIM K(64)
'32 bit words array
DIM W(64)
DIM DataBuffer()
DIM MessageLen, i, t, Result$
'Save message length before padding
MessageLen = LEN(Message$)
'Add bit 1 to right padding
Message$ = Message$ + CHR$(VAL("&H80"))
'Add padding zeroes
WHILE(LEN(Message$) MOD 64) <> 56
Message$ = Message$ + CHR$(0)
WEND
'Add message length to final right padding
FOR i = 56 TO 0 STEP -8
Message$ = Message$ + CHR$(SHR(MessageLen * 8, i))
NEXT i
CONSTSINIT(K())
h0 = &H6A09E667 : h1 = &HBB67AE85 : h2 = &H3C6EF372 : h3 = &HA54FF53A
h4 = &H510E527F : h5 = &H9B05688C : h6 = &H1F83D9AB : h7 = &H5BE0CD19
'Fill the data buffer with message chars
REDIM DataBuffer(LEN(Message$))
FOR i = 1 TO LEN(Message$)
DataBuffer(i) = ASC(MID$(Message$, i, 1))
NEXT i
FOR i = 0 TO LEN(Message$) \ 64 - 1
FOR t = 0 TO 15
W(t) = SHL(DataBuffer(t * 4), 24) OR SHL(DataBuffer((t * 4) + 1), 16) OR SHL(DataBuffer((t * 4) + 2), 8) OR DataBuffer((t * 4) +3)
NEXT t
FOR t = 16 TO 63
W(t) = SSIG1(W(t - 2)) + W(t - 7) + SSIG0(W(t - 15)) + W(t - 16)
NEXT t
a = h0 : b = h1 : c = h2 : d = h3 : e = h4 : f = h5 : g = h6 : h = h7
FOR t = 0 TO 63
t1 = h + BSIG1(e) + CH(e,f,g) + K(t) + W(t)
t2 = BSIG0(a) + MAJ(a,b,c)
h = g
g = f
f = e
e = d + t1
d = c
c = b
b = a
a = t1 + t2
NEXT t
h0 = h0 + a
h1 = h1 + b
h2 = h2 + c
h3 = h3 + d
h4 = h4 + e
h5 = h5 + f
h6 = h6 + g
h7 = h7 + h
NEXT i
Result$ = RIGHT$("0000000" + HEX$(h0), 8) + RIGHT$("0000000" + HEX$(h1), 8) + _
RIGHT$("0000000" + HEX$(h2), 8) + RIGHT$("0000000" + HEX$(h3), 8) + _
RIGHT$("0000000" + HEX$(h4), 8) + RIGHT$("0000000" + HEX$(h5), 8) + _
RIGHT$("0000000" + HEX$(h6), 8) + RIGHT$("0000000" + HEX$(h7), 8)
SHA256$ = LCASE$(Result$)
END FUNCTION
PRINT SHA256("abcde")
36bbe50ed96841d10443bcb670d6554f0a34b761be67ec9c4a8ad2c0c44ca42c but instead the response is 073000008e400000c9a6000032300000c50000009b20000092000000cf600000
I made this the closests way to official specs, but I don't know where I failed.
So please give me bit of help with this
Thanks