#version 300 es precision highp int; precision highp float; uniform uint in_w5; uniform uint in_step; out uvec4 out_v; // SHA256 utils #define Ch(x, y, z) ((x & (y ^ z)) ^ z) #define Maj(x, y, z) ((x & (y | z)) | (y & z)) #define SHR(x, n) (x >> n) #define ROTR(x, n) ((x >> n) | (x << (32 - n))) #define S0(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22)) #define S1(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25)) #define s0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3)) #define s1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10)) /* SHA256 round function */ #define RND(a, b, c, d, e, f, g, h, k) \ t0 = h + S1(e) + Ch(e, f, g) + k; \ t1 = S0(a) + Maj(a, b, c); \ d += t0; \ h = t0 + t1; const uint K[64] = uint[64] ( 0x428A2F98u, 0x71374491u, 0xB5C0FBCFu, 0xE9B5DBA5u, 0x3956C25Bu, 0x59F111F1u, 0x923F82A4u, 0xAB1C5ED5u, 0xD807AA98u, 0x12835B01u, 0x243185BEu, 0x550C7DC3u, 0x72BE5D74u, 0x80DEB1FEu, 0x9BDC06A7u, 0xC19BF174u, 0xE49B69C1u, 0xEFBE4786u, 0x0FC19DC6u, 0x240CA1CCu, 0x2DE92C6Fu, 0x4A7484AAu, 0x5CB0A9DCu, 0x76F988DAu, 0x983E5152u, 0xA831C66Du, 0xB00327C8u, 0xBF597FC7u, 0xC6E00BF3u, 0xD5A79147u, 0x06CA6351u, 0x14292967u, 0x27B70A85u, 0x2E1B2138u, 0x4D2C6DFCu, 0x53380D13u, 0x650A7354u, 0x766A0ABBu, 0x81C2C92Eu, 0x92722C85u, 0xA2BFE8A1u, 0xA81A664Bu, 0xC24B8B70u, 0xC76C51A3u, 0xD192E819u, 0xD6990624u, 0xF40E3585u, 0x106AA070u, 0x19A4C116u, 0x1E376C08u, 0x2748774Cu, 0x34B0BCB5u, 0x391C0CB3u, 0x4ED8AA4Au, 0x5B9CCA4Fu, 0x682E6FF3u, 0x748F82EEu, 0x78A5636Fu, 0x84C87814u, 0x8CC70208u, 0x90BEFFFAu, 0xA4506CEBu, 0xBEF9A3F7u, 0xC67178F2u ); void main() { uint x = uint(gl_FragCoord.x); uint y = uint(gl_FragCoord.y); uint thread_id = y * __TEX_W__u + x; uint W[16], S[8]; uint t0, t1; for (uint i = in_step; i > 0u; i--) { S[0] = 0x6A09E667u; S[1] = 0xBB67AE85u; S[2] = 0x3C6EF372u; S[3] = 0xA54FF53Au; S[4] = 0x510E527Fu; S[5] = 0x9B05688Cu; S[6] = 0x1F83D9ABu; S[7] = 0x5BE0CD19u; // challenge W[0] = __W0__u; W[1] = __W1__u; W[2] = __W2__u; W[3] = __W3__u; // nonce W[4] = __W4__u; W[5] = in_w5; W[6] = thread_id; W[7] = i; // padding W[8] = 0x80000000u; // 1 << 31 W[9] = 0u; W[10] = 0u; W[11] = 0u; W[12] = 0u; W[13] = 0u; W[14] = 0u; W[15] = 256u; // input bit len RND(S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7], W[ 0] + K[0]) RND(S[7], S[0], S[1], S[2], S[3], S[4], S[5], S[6], W[ 1] + K[1]) RND(S[6], S[7], S[0], S[1], S[2], S[3], S[4], S[5], W[ 2] + K[2]) RND(S[5], S[6], S[7], S[0], S[1], S[2], S[3], S[4], W[ 3] + K[3]) RND(S[4], S[5], S[6], S[7], S[0], S[1], S[2], S[3], W[ 4] + K[4]) RND(S[3], S[4], S[5], S[6], S[7], S[0], S[1], S[2], W[ 5] + K[5]) RND(S[2], S[3], S[4], S[5], S[6], S[7], S[0], S[1], W[ 6] + K[6]) RND(S[1], S[2], S[3], S[4], S[5], S[6], S[7], S[0], W[ 7] + K[7]) RND(S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7], W[ 8] + K[8]) RND(S[7], S[0], S[1], S[2], S[3], S[4], S[5], S[6], W[ 9] + K[9]) RND(S[6], S[7], S[0], S[1], S[2], S[3], S[4], S[5], W[10] + K[10]) RND(S[5], S[6], S[7], S[0], S[1], S[2], S[3], S[4], W[11] + K[11]) RND(S[4], S[5], S[6], S[7], S[0], S[1], S[2], S[3], W[12] + K[12]) RND(S[3], S[4], S[5], S[6], S[7], S[0], S[1], S[2], W[13] + K[13]) RND(S[2], S[3], S[4], S[5], S[6], S[7], S[0], S[1], W[14] + K[14]) RND(S[1], S[2], S[3], S[4], S[5], S[6], S[7], S[0], W[15] + K[15]) W[ 0] += s1(W[14]) + W[ 9] + s0(W[ 1]); W[ 1] += s1(W[15]) + W[10] + s0(W[ 2]); W[ 2] += s1(W[ 0]) + W[11] + s0(W[ 3]); W[ 3] += s1(W[ 1]) + W[12] + s0(W[ 4]); W[ 4] += s1(W[ 2]) + W[13] + s0(W[ 5]); W[ 5] += s1(W[ 3]) + W[14] + s0(W[ 6]); W[ 6] += s1(W[ 4]) + W[15] + s0(W[ 7]); W[ 7] += s1(W[ 5]) + W[ 0] + s0(W[ 8]); W[ 8] += s1(W[ 6]) + W[ 1] + s0(W[ 9]); W[ 9] += s1(W[ 7]) + W[ 2] + s0(W[10]); W[10] += s1(W[ 8]) + W[ 3] + s0(W[11]); W[11] += s1(W[ 9]) + W[ 4] + s0(W[12]); W[12] += s1(W[10]) + W[ 5] + s0(W[13]); W[13] += s1(W[11]) + W[ 6] + s0(W[14]); W[14] += s1(W[12]) + W[ 7] + s0(W[15]); W[15] += s1(W[13]) + W[ 8] + s0(W[ 0]); RND(S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7], W[ 0] + K[16]) RND(S[7], S[0], S[1], S[2], S[3], S[4], S[5], S[6], W[ 1] + K[17]) RND(S[6], S[7], S[0], S[1], S[2], S[3], S[4], S[5], W[ 2] + K[18]) RND(S[5], S[6], S[7], S[0], S[1], S[2], S[3], S[4], W[ 3] + K[19]) RND(S[4], S[5], S[6], S[7], S[0], S[1], S[2], S[3], W[ 4] + K[20]) RND(S[3], S[4], S[5], S[6], S[7], S[0], S[1], S[2], W[ 5] + K[21]) RND(S[2], S[3], S[4], S[5], S[6], S[7], S[0], S[1], W[ 6] + K[22]) RND(S[1], S[2], S[3], S[4], S[5], S[6], S[7], S[0], W[ 7] + K[23]) RND(S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7], W[ 8] + K[24]) RND(S[7], S[0], S[1], S[2], S[3], S[4], S[5], S[6], W[ 9] + K[25]) RND(S[6], S[7], S[0], S[1], S[2], S[3], S[4], S[5], W[10] + K[26]) RND(S[5], S[6], S[7], S[0], S[1], S[2], S[3], S[4], W[11] + K[27]) RND(S[4], S[5], S[6], S[7], S[0], S[1], S[2], S[3], W[12] + K[28]) RND(S[3], S[4], S[5], S[6], S[7], S[0], S[1], S[2], W[13] + K[29]) RND(S[2], S[3], S[4], S[5], S[6], S[7], S[0], S[1], W[14] + K[30]) RND(S[1], S[2], S[3], S[4], S[5], S[6], S[7], S[0], W[15] + K[31]) W[ 0] += s1(W[14]) + W[ 9] + s0(W[ 1]); W[ 1] += s1(W[15]) + W[10] + s0(W[ 2]); W[ 2] += s1(W[ 0]) + W[11] + s0(W[ 3]); W[ 3] += s1(W[ 1]) + W[12] + s0(W[ 4]); W[ 4] += s1(W[ 2]) + W[13] + s0(W[ 5]); W[ 5] += s1(W[ 3]) + W[14] + s0(W[ 6]); W[ 6] += s1(W[ 4]) + W[15] + s0(W[ 7]); W[ 7] += s1(W[ 5]) + W[ 0] + s0(W[ 8]); W[ 8] += s1(W[ 6]) + W[ 1] + s0(W[ 9]); W[ 9] += s1(W[ 7]) + W[ 2] + s0(W[10]); W[10] += s1(W[ 8]) + W[ 3] + s0(W[11]); W[11] += s1(W[ 9]) + W[ 4] + s0(W[12]); W[12] += s1(W[10]) + W[ 5] + s0(W[13]); W[13] += s1(W[11]) + W[ 6] + s0(W[14]); W[14] += s1(W[12]) + W[ 7] + s0(W[15]); W[15] += s1(W[13]) + W[ 8] + s0(W[ 0]); RND(S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7], W[ 0] + K[32]) RND(S[7], S[0], S[1], S[2], S[3], S[4], S[5], S[6], W[ 1] + K[33]) RND(S[6], S[7], S[0], S[1], S[2], S[3], S[4], S[5], W[ 2] + K[34]) RND(S[5], S[6], S[7], S[0], S[1], S[2], S[3], S[4], W[ 3] + K[35]) RND(S[4], S[5], S[6], S[7], S[0], S[1], S[2], S[3], W[ 4] + K[36]) RND(S[3], S[4], S[5], S[6], S[7], S[0], S[1], S[2], W[ 5] + K[37]) RND(S[2], S[3], S[4], S[5], S[6], S[7], S[0], S[1], W[ 6] + K[38]) RND(S[1], S[2], S[3], S[4], S[5], S[6], S[7], S[0], W[ 7] + K[39]) RND(S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7], W[ 8] + K[40]) RND(S[7], S[0], S[1], S[2], S[3], S[4], S[5], S[6], W[ 9] + K[41]) RND(S[6], S[7], S[0], S[1], S[2], S[3], S[4], S[5], W[10] + K[42]) RND(S[5], S[6], S[7], S[0], S[1], S[2], S[3], S[4], W[11] + K[43]) RND(S[4], S[5], S[6], S[7], S[0], S[1], S[2], S[3], W[12] + K[44]) RND(S[3], S[4], S[5], S[6], S[7], S[0], S[1], S[2], W[13] + K[45]) RND(S[2], S[3], S[4], S[5], S[6], S[7], S[0], S[1], W[14] + K[46]) RND(S[1], S[2], S[3], S[4], S[5], S[6], S[7], S[0], W[15] + K[47]) W[ 0] += s1(W[14]) + W[ 9] + s0(W[ 1]); W[ 1] += s1(W[15]) + W[10] + s0(W[ 2]); W[ 2] += s1(W[ 0]) + W[11] + s0(W[ 3]); W[ 3] += s1(W[ 1]) + W[12] + s0(W[ 4]); W[ 4] += s1(W[ 2]) + W[13] + s0(W[ 5]); W[ 5] += s1(W[ 3]) + W[14] + s0(W[ 6]); W[ 6] += s1(W[ 4]) + W[15] + s0(W[ 7]); W[ 7] += s1(W[ 5]) + W[ 0] + s0(W[ 8]); W[ 8] += s1(W[ 6]) + W[ 1] + s0(W[ 9]); W[ 9] += s1(W[ 7]) + W[ 2] + s0(W[10]); W[10] += s1(W[ 8]) + W[ 3] + s0(W[11]); W[11] += s1(W[ 9]) + W[ 4] + s0(W[12]); W[12] += s1(W[10]) + W[ 5] + s0(W[13]); W[13] += s1(W[11]) + W[ 6] + s0(W[14]); W[14] += s1(W[12]) + W[ 7] + s0(W[15]); W[15] += s1(W[13]) + W[ 8] + s0(W[ 0]); RND(S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7], W[ 0] + K[48]) RND(S[7], S[0], S[1], S[2], S[3], S[4], S[5], S[6], W[ 1] + K[49]) RND(S[6], S[7], S[0], S[1], S[2], S[3], S[4], S[5], W[ 2] + K[50]) RND(S[5], S[6], S[7], S[0], S[1], S[2], S[3], S[4], W[ 3] + K[51]) RND(S[4], S[5], S[6], S[7], S[0], S[1], S[2], S[3], W[ 4] + K[52]) RND(S[3], S[4], S[5], S[6], S[7], S[0], S[1], S[2], W[ 5] + K[53]) RND(S[2], S[3], S[4], S[5], S[6], S[7], S[0], S[1], W[ 6] + K[54]) RND(S[1], S[2], S[3], S[4], S[5], S[6], S[7], S[0], W[ 7] + K[55]) RND(S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7], W[ 8] + K[56]) RND(S[7], S[0], S[1], S[2], S[3], S[4], S[5], S[6], W[ 9] + K[57]) RND(S[6], S[7], S[0], S[1], S[2], S[3], S[4], S[5], W[10] + K[58]) RND(S[5], S[6], S[7], S[0], S[1], S[2], S[3], S[4], W[11] + K[59]) RND(S[4], S[5], S[6], S[7], S[0], S[1], S[2], S[3], W[12] + K[60]) RND(S[3], S[4], S[5], S[6], S[7], S[0], S[1], S[2], W[13] + K[61]) RND(S[2], S[3], S[4], S[5], S[6], S[7], S[0], S[1], W[14] + K[62]) RND(S[1], S[2], S[3], S[4], S[5], S[6], S[7], S[0], W[15] + K[63]) if (0u == ((S[0] + 0x6A09E667u) & __MASK0__u) && 0u == ((S[1] + 0xBB67AE85u) & __MASK1__u) ) { out_v = uvec4(0u, __MAGIC_CODE__u, thread_id, i); return; } } discard; }