Skip to content

Instantly share code, notes, and snippets.

@nanvel
Created October 3, 2016 05:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nanvel/f41ea833ec1e9d1add8e9ffe2580e298 to your computer and use it in GitHub Desktop.
Save nanvel/f41ea833ec1e9d1add8e9ffe2580e298 to your computer and use it in GitHub Desktop.
Bitcoin SHA-256, iteration 3, line by line implementation
w0 = 0x5d218b61
w1 = 0x9ee563e9
w2 = 0x6e3c750e
w3 = 0xbc44ad0e
w4 = 0xcccb8798
w5 = 0x18dcead4
w6 = 0x7dc014d9
w7 = 0xf3ffe957
def rrot(v, shift):
return ((v >> shift) | (v << (32-shift))) & 0xffffffff
def ch(a, b, c):
return (a & b) ^ ((~a) & c)
def maj(a, b, c):
return (a & b) ^ (a & c) ^ (b & c)
def xch(a, b, c):
return ch(a, b, c) + (rrot(a, 6) ^ rrot(a, 11) ^ rrot(a, 25))
def xor7183(a):
return rrot(a, 7) ^ rrot(a, 18) ^ (a >> 3)
def xor171910(a):
return rrot(a, 17) ^ rrot(a, 19) ^ (a >> 10)
def rrot2maj(a, b, c):
return (rrot(a, 2) ^ rrot(a, 13) ^ rrot(a, 22)) + maj(a, b, c)
e0 = (0x98c7e2a2 + w0) & 0xffffffff
a0 = (0x6340a5ab + e0) & 0xffffffff
e1 = (0xcd2a11ae + w1 + xch(e0, 0x510e527f, 0x9b05688c)) & 0xffffffff
a1 = (0xc3910c8e + e1 + rrot2maj(a0, 0x6a09e667, 0xbb67ae85)) & 0xffffffff
e2 = (0x0c2e12e0 + w2 + xch(e1, e0, 0x510e527f)) & 0xffffffff
a2 = (0x4498517b + e2 + rrot2maj(a1, a0, 0x6a09e667)) & 0xffffffff
e3 = (0xa4ce148b + w3 + xch(e2, e1, e0)) & 0xffffffff
a3 = (0x95f61999 + e3 + rrot2maj(a2, a1, a0)) & 0xffffffff
a4 = (0xd21ea4fd + w0 + w4 + rrot2maj(a3, a2, a1) + xch(e3, e2, e1)) & 0xffffffff
e4 = (0xce272d4a + 2 * w0 + w4 + xch(e3, e2, e1)) & 0xffffffff
a5 = (0x271b239f + w1 + w5 + rrot2maj(a4, a3, a2) + xch(e0, 0x510e527f, 0x9b05688c) + xch(e4, e3, e2)) & 0xffffffff
e5 = (0xb7d641db + 2 * w1 + w5 + rrot2maj(a0, 0x6a09e667, 0xbb67ae85) + 2 * xch(e0, 0x510e527f, 0x9b05688c) + xch(e4, e3, e2)) & 0xffffffff
a6 = (0x9e6d9584 + w2 + w6 + rrot2maj(a5, a4, a3) + xch(e1, e0, 0x510e527f) + xch(e5, e4, e3)) & 0xffffffff
e6 = (0xef33f9df + 2 * w2 + w6 + 2 * xch(e1, e0, 0x510e527f) + rrot2maj(a1, a0, 0x6a09e667) + xch(e5, e4, e3)) & 0xffffffff
a7 = (0x4fea7360 + w3 + w7 + rrot2maj(a6, a5, a4) + xch(e2, e1, e0) + xch(e6, e5, e4)) & 0xffffffff
e7 = (0x8aaea184 + 2 * w3 + w7 + 2 * xch(e2, e1, e0) + rrot2maj(a2, a1, a0) + xch(e6, e5, e4)) & 0xffffffff
a8 = (0x262ed7e2 + 2 * w0 + w4 + rrot2maj(a7, a6, a5) + xch(e3, e2, e1) + xch(e7, e6, e5)) & 0xffffffff
e8 = (0xf84d7cdf + 3 * w0 + 2 * w4 + rrot2maj(a3, a2, a1) + 2 * xch(e3, e2, e1) + xch(e7, e6, e5)) & 0xffffffff
a9 = (0xca599cdc + 2 * w1 + w5 + rrot2maj(a8, a7, a6) + rrot2maj(a0, 0x6a09e667, 0xbb67ae85) + 2 * xch(e0, 0x510e527f, 0x9b05688c) + xch(e4, e3, e2) + xch(e8, e7, e6)) & 0xffffffff
e9 = (0xf174c07b + 3 * w1 + 2 * w5 + rrot2maj(a4, a3, a2) + 2 * xch(e4, e3, e2) + rrot2maj(a0, 0x6a09e667, 0xbb67ae85) + 3 * xch(e0, 0x510e527f, 0x9b05688c) + xch(e8, e7, e6)) & 0xffffffff
a10 = (0x13657f9d + 2 * w2 + w6 + rrot2maj(a9, a8, a7) + 2 * xch(e1, e0, 0x510e527f) + rrot2maj(a1, a0, 0x6a09e667) + xch(e5, e4, e3) + xch(e9, e8, e7)) & 0xffffffff
e10 = (0xb1d31521 + 3 * w2 + 2 * w6 + rrot2maj(a5, a4, a3) + 2 * xch(e5, e4, e3) + 3 * xch(e1, e0, 0x510e527f) + rrot2maj(a1, a0, 0x6a09e667) + xch(e9, e8, e7)) & 0xffffffff
a11 = (0xdfbb1f47 + 2 * w3 + w7 + rrot2maj(a10, a9, a8) + 2 * xch(e2, e1, e0) + rrot2maj(a2, a1, a0) + xch(e6, e5, e4) + xch(e10, e9, e8)) & 0xffffffff
e11 = (0x2fa592a7 + 3 * w3 + 2 * w7 + rrot2maj(a6, a5, a4) + 2 * xch(e6, e5, e4) + 3 * xch(e2, e1, e0) + rrot2maj(a2, a1, a0) + xch(e10, e9, e8)) & 0xffffffff
a12 = (0x6b0bda53 + 3 * w0 + 2 * w4 + rrot2maj(a11, a10, a9) + rrot2maj(a3, a2, a1) + 2 * xch(e3, e2, e1) + xch(e7, e6, e5) + xch(e11, e10, e9)) & 0xffffffff
e12 = (0x913ab235 + 5 * w0 + 3 * w4 + rrot2maj(a7, a6, a5) + 3 * xch(e3, e2, e1) + 2 * xch(e7, e6, e5) + rrot2maj(a3, a2, a1) + xch(e11, e10, e9)) & 0xffffffff
a13 = (0x72537279 + 3 * w1 + 2 * w5 + rrot2maj(a12, a11, a10) + rrot2maj(a4, a3, a2) + 2 * xch(e4, e3, e2) + rrot2maj(a0, 0x6a09e667, 0xbb67ae85) + 3 * xch(e0, 0x510e527f, 0x9b05688c) + xch(e8, e7, e6) + xch(e12, e11, e10)) & 0xffffffff
e13 = (0x3cad0f55 + 5 * w1 + 3 * w5 + rrot2maj(a8, a7, a6) + rrot2maj(a0, 0x6a09e667, 0xbb67ae85) + 5 * xch(e0, 0x510e527f, 0x9b05688c) + 3 * xch(e4, e3, e2) + 2 * xch(e8, e7, e6) + rrot2maj(a4, a3, a2) + rrot2maj(a0, 0x6a09e667, 0xbb67ae85) + xch(e12, e11, e10)) & 0xffffffff
a14 = (0x4daf1bc8 + 3 * w2 + 2 * w6 + rrot2maj(a13, a12, a11) + rrot2maj(a5, a4, a3) + 2 * xch(e5, e4, e3) + 3 * xch(e1, e0, 0x510e527f) + rrot2maj(a1, a0, 0x6a09e667) + xch(e9, e8, e7) + xch(e13, e12, e11)) & 0xffffffff
e14 = (0x61149b65 + 5 * w2 + 3 * w6 + rrot2maj(a9, a8, a7) + 5 * xch(e1, e0, 0x510e527f) + rrot2maj(a1, a0, 0x6a09e667) + 3 * xch(e5, e4, e3) + 2 * xch(e9, e8, e7) + rrot2maj(a5, a4, a3) + rrot2maj(a1, a0, 0x6a09e667) + xch(e13, e12, e11)) & 0xffffffff
a15 = (0xf141851b + 3 * w3 + 2 * w7 + rrot2maj(a14, a13, a12) + rrot2maj(a6, a5, a4) + 2 * xch(e6, e5, e4) + 3 * xch(e2, e1, e0) + rrot2maj(a2, a1, a0) + xch(e10, e9, e8) + xch(e14, e13, e12)) & 0xffffffff
e15 = (0xd0fca462 + 5 * w3 + 3 * w7 + rrot2maj(a10, a9, a8) + 5 * xch(e2, e1, e0) + rrot2maj(a2, a1, a0) + 3 * xch(e6, e5, e4) + 2 * xch(e10, e9, e8) + rrot2maj(a6, a5, a4) + rrot2maj(a2, a1, a0) + xch(e14, e13, e12)) & 0xffffffff
w16 = (w0 + xor7183(w1)) & 0xffffffff
s16 = w16 + 0xe49b69c1 + e12 + xch(e15, e14, e13)
a16 = (rrot2maj(a15, a14, a13) + s16) & 0xffffffff
e16 = (a12 + s16) & 0xffffffff
w17 = (w1 + xor7183(w2) + 0xa00000) & 0xffffffff
s17 = w17 + 0xefbe4786 + e13 + xch(e16, e15, e14)
a17 = (rrot2maj(a16, a15, a14) + s17) & 0xffffffff
e17 = (a13 + s17) & 0xffffffff
w18 = (w2 + xor7183(w3) + xor171910(w16)) & 0xffffffff
s18 = w18 + 0x0fc19dc6 + e14 + xch(e17, e16, e15)
a18 = (rrot2maj(a17, a16, a15) + s18) & 0xffffffff
e18 = (a14 + s18) & 0xffffffff
w19 = (w3 + xor7183(w4) + xor171910(w17)) & 0xffffffff
s19 = w19 + 0x240ca1cc + e15 + xch(e18, e17, e16)
a19 = (rrot2maj(a18, a17, a16) + s19) & 0xffffffff
e19 = (a15 + s19) & 0xffffffff
w20 = (w4 + xor7183(w5) + xor171910(w18)) & 0xffffffff
s20 = w20 + 0x2de92c6f + e16 + xch(e19, e18, e17)
a20 = (rrot2maj(a19, a18, a17) + s20) & 0xffffffff
e20 = (a16 + s20) & 0xffffffff
w21 = (w5 + xor7183(w6) + xor171910(w19)) & 0xffffffff
s21 = w21 + 0x4a7484aa + e17 + xch(e20, e19, e18)
a21 = (rrot2maj(a20, a19, a18) + s21) & 0xffffffff
e21 = (a17 + s21) & 0xffffffff
w22 = (0x100 + w6 + xor7183(w7) + xor171910(w20)) & 0xffffffff
s22 = w22 + 0x5cb0a9dc + e18 + xch(e21, e20, e19)
a22 = (rrot2maj(a21, a20, a19) + s22) & 0xffffffff
e22 = (a18 + s22) & 0xffffffff
w23 = (w7 + w16 + 0x11002000 + xor171910(w21)) & 0xffffffff
s23 = w23 + 0x76f988da + e19 + xch(e22, e21, e20)
a23 = (rrot2maj(a22, a21, a20) + s23) & 0xffffffff
e23 = (a19 + s23) & 0xffffffff
w24 = (0x80000000 + w17 + xor171910(w22)) & 0xffffffff
s24 = w24 + 0x983e5152 + e20 + xch(e23, e22, e21)
a24 = (rrot2maj(a23, a22, a21) + s24) & 0xffffffff
e24 = (a20 + s24) & 0xffffffff
w25 = (w18 + xor171910(w23)) & 0xffffffff
s25 = w25 + 0xa831c66d + e21 + xch(e24, e23, e22)
a25 = (rrot2maj(a24, a23, a22) + s25) & 0xffffffff
e25 = (a21 + s25) & 0xffffffff
w26 = (w19 + xor171910(w24)) & 0xffffffff
s26 = w26 + 0xb00327c8 + e22 + xch(e25, e24, e23)
a26 = (rrot2maj(a25, a24, a23) + s26) & 0xffffffff
e26 = (a22 + s26) & 0xffffffff
w27 = (w20 + xor171910(w25)) & 0xffffffff
s27 = w27 + 0xbf597fc7 + e23 + xch(e26, e25, e24)
a27 = (rrot2maj(a26, a25, a24) + s27) & 0xffffffff
e27 = (a23 + s27) & 0xffffffff
w28 = (w21 + xor171910(w26)) & 0xffffffff
s28 = w28 + 0xc6e00bf3 + e24 + xch(e27, e26, e25)
a28 = (rrot2maj(a27, a26, a25) + s28) & 0xffffffff
e28 = (a24 + s28) & 0xffffffff
w29 = (w22 + xor171910(w27)) & 0xffffffff
s29 = w29 + 0xd5a79147 + e25 + xch(e28, e27, e26)
a29 = (rrot2maj(a28, a27, a26) + s29) & 0xffffffff
e29 = (a25 + s29) & 0xffffffff
w30 = (0x400022 + w23 + xor171910(w28)) & 0xffffffff
s30 = w30 + 0x06ca6351 + e26 + xch(e29, e28, e27)
a30 = (rrot2maj(a29, a28, a27) + s30) & 0xffffffff
e30 = (a26 + s30) & 0xffffffff
w31 = (0x100 + w24 + xor7183(w16) + xor171910(w29)) & 0xffffffff
s31 = w31 + 0x14292967 + e27 + xch(e30, e29, e28)
a31 = (rrot2maj(a30, a29, a28) + s31) & 0xffffffff
e31 = (a27 + s31) & 0xffffffff
w32 = (w16 + w25 + xor7183(w17) + xor171910(w30)) & 0xffffffff
s32 = w32 + 0x27b70a85 + e28 + xch(e31, e30, e29)
a32 = (rrot2maj(a31, a30, a29) + s32) & 0xffffffff
e32 = (a28 + s32) & 0xffffffff
w33 = (w17 + w26 + xor7183(w18) + xor171910(w31)) & 0xffffffff
s33 = w33 + 0x2e1b2138 + e29 + xch(e32, e31, e30)
a33 = (rrot2maj(a32, a31, a30) + s33) & 0xffffffff
e33 = (a29 + s33) & 0xffffffff
w34 = (w18 + w27 + xor7183(w19) + xor171910(w32)) & 0xffffffff
s34 = w34 + 0x4d2c6dfc + e30 + xch(e33, e32, e31)
a34 = (rrot2maj(a33, a32, a31) + s34) & 0xffffffff
e34 = (a30 + s34) & 0xffffffff
w35 = (w19 + w28 + xor7183(w20) + xor171910(w33)) & 0xffffffff
s35 = w35 + 0x53380d13 + e31 + xch(e34, e33, e32)
a35 = (rrot2maj(a34, a33, a32) + s35) & 0xffffffff
e35 = (a31 + s35) & 0xffffffff
w36 = (w20 + w29 + xor7183(w21) + xor171910(w34)) & 0xffffffff
s36 = w36 + 0x650a7354 + e32 + xch(e35, e34, e33)
a36 = (rrot2maj(a35, a34, a33) + s36) & 0xffffffff
e36 = (a32 + s36) & 0xffffffff
w37 = (w21 + w30 + xor7183(w22) + xor171910(w35)) & 0xffffffff
s37 = w37 + 0x766a0abb + e33 + xch(e36, e35, e34)
a37 = (rrot2maj(a36, a35, a34) + s37) & 0xffffffff
e37 = (a33 + s37) & 0xffffffff
w38 = (w22 + w31 + xor7183(w23) + xor171910(w36)) & 0xffffffff
s38 = w38 + 0x81c2c92e + e34 + xch(e37, e36, e35)
a38 = (rrot2maj(a37, a36, a35) + s38) & 0xffffffff
e38 = (a34 + s38) & 0xffffffff
w39 = (w23 + w32 + xor7183(w24) + xor171910(w37)) & 0xffffffff
s39 = w39 + 0x92722c85 + e35 + xch(e38, e37, e36)
a39 = (rrot2maj(a38, a37, a36) + s39) & 0xffffffff
e39 = (a35 + s39) & 0xffffffff
w40 = (w24 + w33 + xor7183(w25) + xor171910(w38)) & 0xffffffff
s40 = w40 + 0xa2bfe8a1 + e36 + xch(e39, e38, e37)
a40 = (rrot2maj(a39, a38, a37) + s40) & 0xffffffff
e40 = (a36 + s40) & 0xffffffff
w41 = (w25 + w34 + xor7183(w26) + xor171910(w39)) & 0xffffffff
s41 = w41 + 0xa81a664b + e37 + xch(e40, e39, e38)
a41 = (rrot2maj(a40, a39, a38) + s41) & 0xffffffff
e41 = (a37 + s41) & 0xffffffff
w42 = (w26 + w35 + xor7183(w27) + xor171910(w40)) & 0xffffffff
s42 = w42 + 0xc24b8b70 + e38 + xch(e41, e40, e39)
a42 = (rrot2maj(a41, a40, a39) + s42) & 0xffffffff
e42 = (a38 + s42) & 0xffffffff
w43 = (w27 + w36 + xor7183(w28) + xor171910(w41)) & 0xffffffff
s43 = w43 + 0xc76c51a3 + e39 + xch(e42, e41, e40)
a43 = (rrot2maj(a42, a41, a40) + s43) & 0xffffffff
e43 = (a39 + s43) & 0xffffffff
w44 = (w28 + w37 + xor7183(w29) + xor171910(w42)) & 0xffffffff
s44 = w44 + 0xd192e819 + e40 + xch(e43, e42, e41)
a44 = (rrot2maj(a43, a42, a41) + s44) & 0xffffffff
e44 = (a40 + s44) & 0xffffffff
w45 = (w29 + w38 + xor7183(w30) + xor171910(w43)) & 0xffffffff
s45 = w45 + 0xd6990624 + e41 + xch(e44, e43, e42)
a45 = (rrot2maj(a44, a43, a42) + s45) & 0xffffffff
e45 = (a41 + s45) & 0xffffffff
w46 = (w30 + w39 + xor7183(w31) + xor171910(w44)) & 0xffffffff
s46 = w46 + 0xf40e3585 + e42 + xch(e45, e44, e43)
a46 = (rrot2maj(a45, a44, a43) + s46) & 0xffffffff
e46 = (a42 + s46) & 0xffffffff
w47 = (w31 + w40 + xor7183(w32) + xor171910(w45)) & 0xffffffff
s47 = w47 + 0x106aa070 + e43 + xch(e46, e45, e44)
a47 = (rrot2maj(a46, a45, a44) + s47) & 0xffffffff
e47 = (a43 + s47) & 0xffffffff
w48 = (w32 + w41 + xor7183(w33) + xor171910(w46)) & 0xffffffff
s48 = w48 + 0x19a4c116 + e44 + xch(e47, e46, e45)
a48 = (rrot2maj(a47, a46, a45) + s48) & 0xffffffff
e48 = (a44 + s48) & 0xffffffff
w49 = (w33 + w42 + xor7183(w34) + xor171910(w47)) & 0xffffffff
s49 = w49 + 0x1e376c08 + e45 + xch(e48, e47, e46)
a49 = (rrot2maj(a48, a47, a46) + s49) & 0xffffffff
e49 = (a45 + s49) & 0xffffffff
w50 = (w34 + w43 + xor7183(w35) + xor171910(w48)) & 0xffffffff
s50 = w50 + 0x2748774c + e46 + xch(e49, e48, e47)
a50 = (rrot2maj(a49, a48, a47) + s50) & 0xffffffff
e50 = (a46 + s50) & 0xffffffff
w51 = (w35 + w44 + xor7183(w36) + xor171910(w49)) & 0xffffffff
s51 = w51 + 0x34b0bcb5 + e47 + xch(e50, e49, e48)
a51 = (rrot2maj(a50, a49, a48) + s51) & 0xffffffff
e51 = (a47 + s51) & 0xffffffff
w52 = (w36 + w45 + xor7183(w37) + xor171910(w50)) & 0xffffffff
s52 = w52 + 0x391c0cb3 + e48 + xch(e51, e50, e49)
a52 = (rrot2maj(a51, a50, a49) + s52) & 0xffffffff
e52 = (a48 + s52) & 0xffffffff
w53 = (w37 + w46 + xor7183(w38) + xor171910(w51)) & 0xffffffff
s53 = w53 + 0x4ed8aa4a + e49 + xch(e52, e51, e50)
a53 = (rrot2maj(a52, a51, a50) + s53) & 0xffffffff
e53 = (a49 + s53) & 0xffffffff
w54 = (w38 + w47 + xor7183(w39) + xor171910(w52)) & 0xffffffff
s54 = w54 + 0x5b9cca4f + e50 + xch(e53, e52, e51)
a54 = (rrot2maj(a53, a52, a51) + s54) & 0xffffffff
e54 = (a50 + s54) & 0xffffffff
w55 = (w39 + w48 + xor7183(w40) + xor171910(w53)) & 0xffffffff
s55 = w55 + 0x682e6ff3 + e51 + xch(e54, e53, e52)
a55 = (rrot2maj(a54, a53, a52) + s55) & 0xffffffff
e55 = (a51 + s55) & 0xffffffff
w56 = (w40 + w49 + xor7183(w41) + xor171910(w54)) & 0xffffffff
s56 = w56 + 0x748f82ee + e52 + xch(e55, e54, e53)
a56 = (rrot2maj(a55, a54, a53) + s56) & 0xffffffff
e56 = (a52 + s56) & 0xffffffff
w57 = (w41 + w50 + xor7183(w42) + xor171910(w55)) & 0xffffffff
e57 = (a53 + w57 + 0x78a5636f + e53 + xch(e56, e55, e54)) & 0xffffffff
w58 = (w42 + w51 + xor7183(w43) + xor171910(w56)) & 0xffffffff
e58 = (0x84c87814 + a54 + e54 + w58 + xch(e57, e56, e55)) & 0xffffffff
e59 = (0x8cc70208 + w43 + w52 + xor7183(w44) + xor171910(w57) + a55 + e55 + xch(e58, e57, e56)) & 0xffffffff
assert ((
w44 + w53 +
xor7183(w45) + xor171910(w58) +
a56 + e56 +
xch(e59, e58, e57)
) & 0xffffffff) == 0x136032ed
assert ((
w45 + w54 + w57 +
xor7183(w46) + xor171910((w43 + w52 + xor7183(w44) + xor171910(w57)) & 0xffffffff) +
e53 + e57 + xch(e56, e55, e54) +
rrot2maj(a56, a55, a54) +
ch(0xa41f32e7, e59, e58)
) & 0xffffffff) == 0xf588c8fc
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment