/* * BitCracker: BitLocker password cracking tool, CUDA version. * Copyright (C) 2013-2017 Elena Ago * Massimo Bernaschi * * This file is part of the BitCracker project: https://github.com/e-ago/bitcracker * * BitCracker is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * BitCracker is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with BitCracker. If not, see . */ #include "bitcracker.h" texture w_texture; texture w_password; int *deviceFound, *hostFound; char *hostPassword; uint32_t *hostPasswordInt, *devicePasswordInt; unsigned char outPsw[MAX_INPUT_PASSWORD_LEN+1]; int outIndexPsw=0; static int check_match() { int i=0; if (hostFound[0] >= 0){ outIndexPsw=(hostFound[0]); snprintf((char*)outPsw, PSW_CHAR_SIZE, "%s", (char *)(hostPassword+(outIndexPsw*PSW_CHAR_SIZE))); for(i=0; i>>( numReadPassword, deviceFound, d_vmk, d_vmkIV, d_mac, d_macIV, d_computeMacIV, w_blocks_h[0], w_blocks_h[1], w_blocks_h[2], w_blocks_h[3], s0, s1, s2, s3, attack_mode ); } else { //Faster attack decrypt_vmk<<>>( numReadPassword, deviceFound, d_vmk, d_vmkIV, strict_check, w_blocks_h[0], w_blocks_h[1], w_blocks_h[2], w_blocks_h[3], s0, s1, s2, s3, attack_mode); } BITCRACKER_CUDA_CHECK_LAST_ERROR(); BITCRACKER_CUDA_CHECK( cudaEventRecord(stop, stream) ); BITCRACKER_CUDA_CHECK( cudaMemcpyAsync(hostFound, deviceFound, sizeof(unsigned int), cudaMemcpyDeviceToHost, stream) ); BITCRACKER_CUDA_CHECK( cudaStreamSynchronize(stream) ); totReadPsw += numReadPassword; BITCRACKER_CUDA_CHECK( cudaEventElapsedTime(&elapsedTime, start, stop) ); printf("CUDA Kernel execution:\n\tEffective passwords: %d\n\tPasswords Range:\n\t\t%s\n\t\t.....\n\t\t%s\n\tTime: %f sec\n\tPasswords x second: %8.2f pw/sec\n", numReadPassword, (char *)hostPassword, (char *)(hostPassword+((numReadPassword-1)*PSW_CHAR_SIZE)), (elapsedTime/1000.0), numReadPassword/(elapsedTime/1000.0)); match=check_match(); if(match) done=1; if(feof(fp)) done=1; } if (fp != stdin) fclose(fp); if(match==1) printf("\n\n================================================\nCUDA attack completed\nPasswords evaluated: %lld\nPassword found: %s\n================================================\n\n", totReadPsw, outPsw); else printf("\n\n================================================\nCUDA attack completed\nPasswords evaluated: %lld\nPassword not found!\n================================================\n\n", totReadPsw); BITCRACKER_CUDA_CHECK( cudaUnbindTexture(&w_password) ); BITCRACKER_CUDA_CHECK( cudaFreeHost(hostPassword) ); BITCRACKER_CUDA_CHECK( cudaFree(devicePasswordInt) ); BITCRACKER_CUDA_CHECK( cudaFree(deviceFound) ); BITCRACKER_CUDA_CHECK( cudaStreamDestroy(stream) ); BITCRACKER_CUDA_CHECK( cudaUnbindTexture(&w_texture) ); return NULL; } #define END_STRING 0x80 //0xFF __global__ void decrypt_vmk(int tot_psw_kernel, int *found, unsigned char * vmkKey, unsigned char * IV, int strict_check, int v0, int v1, int v2, int v3, uint32_t s0, uint32_t s1, uint32_t s2, uint32_t s3, int method ) { uint32_t schedule0, schedule1, schedule2, schedule3, schedule4, schedule5, schedule6, schedule7, schedule8, schedule9; uint32_t schedule10, schedule11, schedule12, schedule13, schedule14, schedule15, schedule16, schedule17, schedule18, schedule19; uint32_t schedule20, schedule21, schedule22, schedule23, schedule24, schedule25, schedule26, schedule27, schedule28, schedule29; uint32_t schedule30, schedule31; uint32_t first_hash0, first_hash1, first_hash2, first_hash3, first_hash4, first_hash5, first_hash6, first_hash7; uint32_t hash0, hash1, hash2, hash3, hash4, hash5, hash6, hash7; uint32_t a, b, c, d, e, f, g, h; int gIndex = (threadIdx.x+blockIdx.x*blockDim.x); int index_generic; int indexW=(gIndex*PSW_INT_SIZE); int8_t redo=0; while(gIndex < tot_psw_kernel) { first_hash0 = UINT32_C(0x6A09E667); first_hash1 = UINT32_C(0xBB67AE85); first_hash2 = UINT32_C(0x3C6EF372); first_hash3 = UINT32_C(0xA54FF53A); first_hash4 = UINT32_C(0x510E527F); first_hash5 = UINT32_C(0x9B05688C); first_hash6 = UINT32_C(0x1F83D9AB); first_hash7 = UINT32_C(0x5BE0CD19); a = UINT32_C(0x6A09E667); b = UINT32_C(0xBB67AE85); c = UINT32_C(0x3C6EF372); d = UINT32_C(0xA54FF53A); e = UINT32_C(0x510E527F); f = UINT32_C(0x9B05688C); g = UINT32_C(0x1F83D9AB); h = UINT32_C(0x5BE0CD19); //----------------------------------------------------- FIRST HASH ------------------------------------------------ indexW=(gIndex*PSW_INT_SIZE); redo=0; schedule0 = (uint32_t) (tex1Dfetch(w_password, (indexW+0))); schedule1 = (uint32_t) (tex1Dfetch(w_password, (indexW+1))); schedule2 = (uint32_t) (tex1Dfetch(w_password, (indexW+2))); schedule3 = (uint32_t) (tex1Dfetch(w_password, (indexW+3))); schedule4 = (uint32_t) (tex1Dfetch(w_password, (indexW+4))); schedule5 = (uint32_t) (tex1Dfetch(w_password, (indexW+5))); schedule6 = (uint32_t) (tex1Dfetch(w_password, (indexW+6))); schedule7 = (uint32_t) (tex1Dfetch(w_password, (indexW+7))); schedule8 = (uint32_t) (tex1Dfetch(w_password, (indexW+8))); schedule9 = (uint32_t) (tex1Dfetch(w_password, (indexW+9))); schedule10 = (uint32_t) (tex1Dfetch(w_password, (indexW+10))); schedule11 = (uint32_t) (tex1Dfetch(w_password, (indexW+11))); schedule12 = (uint32_t) (tex1Dfetch(w_password, (indexW+12))); schedule13 = (uint32_t) (tex1Dfetch(w_password, (indexW+13))); schedule14 = (uint32_t) (tex1Dfetch(w_password, (indexW+14))); //Input password is shorter than FIRST_LENGHT if(schedule14 == 0xFFFFFFFF) schedule14=0; else if(method == MODE_USER_PASS) redo=1; schedule15 = (uint32_t) (tex1Dfetch(w_password, (indexW+15))); ALL_SCHEDULE_LAST16() ALL_ROUND_B1_1() ALL_SCHEDULE32() ALL_ROUND_B1_2() first_hash0 += a; first_hash1 += b; first_hash2 += c; first_hash3 += d; first_hash4 += e; first_hash5 += f; first_hash6 += g; first_hash7 += h; //User password only if(method == MODE_USER_PASS) { if(redo == 1) { schedule0 = (uint32_t) (tex1Dfetch(w_password, (indexW+16))); schedule1 = (uint32_t) (tex1Dfetch(w_password, (indexW+17))); schedule2 = (uint32_t) (tex1Dfetch(w_password, (indexW+18))); schedule3 = (uint32_t) (tex1Dfetch(w_password, (indexW+19))); schedule4 = (uint32_t) (tex1Dfetch(w_password, (indexW+20))); schedule5 = (uint32_t) (tex1Dfetch(w_password, (indexW+21))); schedule6 = (uint32_t) (tex1Dfetch(w_password, (indexW+22))); schedule7 = (uint32_t) (tex1Dfetch(w_password, (indexW+23))); schedule8 = (uint32_t) (tex1Dfetch(w_password, (indexW+24))); schedule9 = (uint32_t) (tex1Dfetch(w_password, (indexW+25))); schedule10 = (uint32_t) (tex1Dfetch(w_password, (indexW+26))); schedule11 = (uint32_t) (tex1Dfetch(w_password, (indexW+27))); schedule12 = (uint32_t) (tex1Dfetch(w_password, (indexW+28))); schedule13 = (uint32_t) (tex1Dfetch(w_password, (indexW+29))); schedule14 = (uint32_t) (tex1Dfetch(w_password, (indexW+30))); schedule15 = (uint32_t) (tex1Dfetch(w_password, (indexW+31))); a = first_hash0; b = first_hash1; c = first_hash2; d = first_hash3; e = first_hash4; f = first_hash5; g = first_hash6; h = first_hash7; ALL_SCHEDULE_LAST16() ALL_ROUND_B1_1() ALL_SCHEDULE32() ALL_ROUND_B1_2() first_hash0 += a; first_hash1 += b; first_hash2 += c; first_hash3 += d; first_hash4 += e; first_hash5 += f; first_hash6 += g; first_hash7 += h; } //----------------------------------------------------- SECOND HASH ------------------------------------------------ schedule0 = first_hash0; schedule1 = first_hash1; schedule2 = first_hash2; schedule3 = first_hash3; schedule4 = first_hash4; schedule5 = first_hash5; schedule6 = first_hash6; schedule7 = first_hash7; schedule8 = 0x80000000; schedule9 = 0; schedule10 = 0; schedule11 = 0; schedule12 = 0; schedule13 = 0; schedule14 = 0; schedule15 = 0x100; first_hash0 = UINT32_C(0x6A09E667); first_hash1 = UINT32_C(0xBB67AE85); first_hash2 = UINT32_C(0x3C6EF372); first_hash3 = UINT32_C(0xA54FF53A); first_hash4 = UINT32_C(0x510E527F); first_hash5 = UINT32_C(0x9B05688C); first_hash6 = UINT32_C(0x1F83D9AB); first_hash7 = UINT32_C(0x5BE0CD19); a = first_hash0; b = first_hash1; c = first_hash2; d = first_hash3; e = first_hash4; f = first_hash5; g = first_hash6; h = first_hash7; ALL_SCHEDULE_LAST16() ALL_ROUND_B1_1() ALL_SCHEDULE32() ALL_ROUND_B1_2() first_hash0 += a; first_hash1 += b; first_hash2 += c; first_hash3 += d; first_hash4 += e; first_hash5 += f; first_hash6 += g; first_hash7 += h; } //----------------------------------------------------- LOOP HASH ------------------------------------------------ hash0=0; hash1=0; hash2=0; hash3=0; hash4=0; hash5=0; hash6=0; hash7=0; indexW=0; for(index_generic=0; index_generic < ITERATION_NUMBER/2; index_generic++) { a = UINT32_C(0x6A09E667); b = UINT32_C(0xBB67AE85); c = UINT32_C(0x3C6EF372); d = UINT32_C(0xA54FF53A); e = UINT32_C(0x510E527F); f = UINT32_C(0x9B05688C); g = UINT32_C(0x1F83D9AB); h = UINT32_C(0x5BE0CD19); schedule0 = hash0; schedule1 = hash1; schedule2 = hash2; schedule3 = hash3; schedule4 = hash4; schedule5 = hash5; schedule6 = hash6; schedule7 = hash7; schedule8 = first_hash0; schedule9 = first_hash1; schedule10 = first_hash2; schedule11 = first_hash3; schedule12 = first_hash4; schedule13 = first_hash5; schedule14 = first_hash6; schedule15 = first_hash7; ALL_SCHEDULE_LAST16() ALL_ROUND_B1_1() ALL_SCHEDULE32() ALL_ROUND_B1_2() hash0 = UINT32_C(0x6A09E667) + a; hash1 = UINT32_C(0xBB67AE85) + b; hash2 = UINT32_C(0x3C6EF372) + c; hash3 = UINT32_C(0xA54FF53A) + d; hash4 = UINT32_C(0x510E527F) + e; hash5 = UINT32_C(0x9B05688C) + f; hash6 = UINT32_C(0x1F83D9AB) + g; hash7 = UINT32_C(0x5BE0CD19) + h; a = hash0; b = hash1; c = hash2; d = hash3; e = hash4; f = hash5; g = hash6; h = hash7; ROUND_SECOND_BLOCK_CONST(a, b, c, d, e, f, g, h, 0, 0x428A2F98, v0) ROUND_SECOND_BLOCK_CONST(h, a, b, c, d, e, f, g, 1, 0x71374491, v1) ROUND_SECOND_BLOCK_CONST(g, h, a, b, c, d, e, f, 2, 0xB5C0FBCF, v2) ROUND_SECOND_BLOCK_CONST(f, g, h, a, b, c, d, e, 3, 0xE9B5DBA5, v3) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 4, 0x3956C25B, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 5, 0x59F111F1, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 6, 0x923F82A4, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 7, 0xAB1C5ED5, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 8, 0xD807AA98, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 9, 0x12835B01, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 10, 0x243185BE, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 11, 0x550C7DC3, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 12, 0x72BE5D74, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 13, 0x80DEB1FE, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 14, 0x9BDC06A7, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 15, 0xC19BF174, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 16, 0xE49B69C1, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 17, 0xEFBE4786, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 18, 0x0FC19DC6, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 19, 0x240CA1CC, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 20, 0x2DE92C6F, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 21, 0x4A7484AA, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 22, 0x5CB0A9DC, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 23, 0x76F988DA, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 24, 0x983E5152, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 25, 0xA831C66D, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 26, 0xB00327C8, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 27, 0xBF597FC7, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 28, 0xC6E00BF3, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 29, 0xD5A79147, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 30, 0x06CA6351, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 31, 0x14292967, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 32, 0x27B70A85, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 33, 0x2E1B2138, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 34, 0x4D2C6DFC, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 35, 0x53380D13, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 36, 0x650A7354, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 37, 0x766A0ABB, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 38, 0x81C2C92E, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 39, 0x92722C85, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 40, 0xA2BFE8A1, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 41, 0xA81A664B, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 42, 0xC24B8B70, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 43, 0xC76C51A3, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 44, 0xD192E819, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 45, 0xD6990624, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 46, 0xF40E3585, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 47, 0x106AA070, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 48, 0x19A4C116, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 49, 0x1E376C08, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 50, 0x2748774C, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 51, 0x34B0BCB5, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 52, 0x391C0CB3, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 53, 0x4ED8AA4A, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 54, 0x5B9CCA4F, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 55, 0x682E6FF3, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 56, 0x748F82EE, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 57, 0x78A5636F, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 58, 0x84C87814, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 59, 0x8CC70208, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 60, 0x90BEFFFA, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 61, 0xA4506CEB, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 62, 0xBEF9A3F7, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 63, 0xC67178F2, indexW) hash0 += a; hash1 += b; hash2 += c; hash3 += d; hash4 += e; hash5 += f; hash6 += g; hash7 += h; indexW += SINGLE_BLOCK_W_SIZE; } for(index_generic=ITERATION_NUMBER/2; index_generic < ITERATION_NUMBER; index_generic++) { a = UINT32_C(0x6A09E667); b = UINT32_C(0xBB67AE85); c = UINT32_C(0x3C6EF372); d = UINT32_C(0xA54FF53A); e = UINT32_C(0x510E527F); f = UINT32_C(0x9B05688C); g = UINT32_C(0x1F83D9AB); h = UINT32_C(0x5BE0CD19); schedule0 = hash0; schedule1 = hash1; schedule2 = hash2; schedule3 = hash3; schedule4 = hash4; schedule5 = hash5; schedule6 = hash6; schedule7 = hash7; schedule8 = first_hash0; schedule9 = first_hash1; schedule10 = first_hash2; schedule11 = first_hash3; schedule12 = first_hash4; schedule13 = first_hash5; schedule14 = first_hash6; schedule15 = first_hash7; ALL_SCHEDULE_LAST16() ALL_ROUND_B1_1() ALL_SCHEDULE32() ALL_ROUND_B1_2() hash0 = UINT32_C(0x6A09E667) + a; hash1 = UINT32_C(0xBB67AE85) + b; hash2 = UINT32_C(0x3C6EF372) + c; hash3 = UINT32_C(0xA54FF53A) + d; hash4 = UINT32_C(0x510E527F) + e; hash5 = UINT32_C(0x9B05688C) + f; hash6 = UINT32_C(0x1F83D9AB) + g; hash7 = UINT32_C(0x5BE0CD19) + h; a = hash0; b = hash1; c = hash2; d = hash3; e = hash4; f = hash5; g = hash6; h = hash7; ROUND_SECOND_BLOCK_CONST(a, b, c, d, e, f, g, h, 0, 0x428A2F98, v0) ROUND_SECOND_BLOCK_CONST(h, a, b, c, d, e, f, g, 1, 0x71374491, v1) ROUND_SECOND_BLOCK_CONST(g, h, a, b, c, d, e, f, 2, 0xB5C0FBCF, v2) ROUND_SECOND_BLOCK_CONST(f, g, h, a, b, c, d, e, 3, 0xE9B5DBA5, v3) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 4, 0x3956C25B, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 5, 0x59F111F1, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 6, 0x923F82A4, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 7, 0xAB1C5ED5, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 8, 0xD807AA98, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 9, 0x12835B01, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 10, 0x243185BE, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 11, 0x550C7DC3, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 12, 0x72BE5D74, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 13, 0x80DEB1FE, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 14, 0x9BDC06A7, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 15, 0xC19BF174, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 16, 0xE49B69C1, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 17, 0xEFBE4786, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 18, 0x0FC19DC6, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 19, 0x240CA1CC, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 20, 0x2DE92C6F, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 21, 0x4A7484AA, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 22, 0x5CB0A9DC, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 23, 0x76F988DA, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 24, 0x983E5152, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 25, 0xA831C66D, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 26, 0xB00327C8, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 27, 0xBF597FC7, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 28, 0xC6E00BF3, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 29, 0xD5A79147, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 30, 0x06CA6351, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 31, 0x14292967, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 32, 0x27B70A85, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 33, 0x2E1B2138, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 34, 0x4D2C6DFC, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 35, 0x53380D13, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 36, 0x650A7354, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 37, 0x766A0ABB, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 38, 0x81C2C92E, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 39, 0x92722C85, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 40, 0xA2BFE8A1, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 41, 0xA81A664B, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 42, 0xC24B8B70, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 43, 0xC76C51A3, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 44, 0xD192E819, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 45, 0xD6990624, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 46, 0xF40E3585, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 47, 0x106AA070, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 48, 0x19A4C116, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 49, 0x1E376C08, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 50, 0x2748774C, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 51, 0x34B0BCB5, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 52, 0x391C0CB3, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 53, 0x4ED8AA4A, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 54, 0x5B9CCA4F, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 55, 0x682E6FF3, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 56, 0x748F82EE, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 57, 0x78A5636F, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 58, 0x84C87814, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 59, 0x8CC70208, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 60, 0x90BEFFFA, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 61, 0xA4506CEB, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 62, 0xBEF9A3F7, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 63, 0xC67178F2, indexW) hash0 += a; hash1 += b; hash2 += c; hash3 += d; hash4 += e; hash5 += f; hash6 += g; hash7 += h; indexW += SINGLE_BLOCK_W_SIZE; } //----------------------------------------------------- FINAL CHECK ------------------------------------------------ schedule0 = __byte_perm(((uint32_t *)(IV))[0], 0, 0x0123) ^ hash0; schedule1 = __byte_perm(((uint32_t *)(IV+4))[0], 0, 0x0123) ^ hash1; schedule2 = __byte_perm(((uint32_t *)(IV+8))[0], 0, 0x0123) ^ hash2; schedule3 = __byte_perm(((uint32_t *)(IV+12))[0], 0, 0x0123) ^ hash3; schedule4 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule0 >> 24], TS1[(schedule1 >> 16) & 0xFF], TS2[(schedule2 >> 8) & 0xFF]) , TS3[schedule3 & 0xFF] , hash4); schedule5 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule1 >> 24], TS1[(schedule2 >> 16) & 0xFF], TS2[(schedule3 >> 8) & 0xFF]) , TS3[schedule0 & 0xFF] , hash5); schedule6 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule2 >> 24], TS1[(schedule3 >> 16) & 0xFF], TS2[(schedule0 >> 8) & 0xFF]) , TS3[schedule1 & 0xFF] , hash6); schedule7 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule3 >> 24], TS1[(schedule0 >> 16) & 0xFF], TS2[(schedule1 >> 8) & 0xFF]) , TS3[schedule2 & 0xFF] , hash7); hash0 ^= LOP3LUT_XOR( LOP3LUT_XOR( (TS2[(hash7 >> 24) ] & 0x000000FF), (TS3[(hash7 >> 16) & 0xFF] & 0xFF000000), (TS0[(hash7 >> 8) & 0xFF] & 0x00FF0000)), (TS1[(hash7 ) & 0xFF] & 0x0000FF00), 0x01000000 ); //RCON[0]; hash1 ^= hash0; hash2 ^= hash1; hash3 ^= hash2; schedule0 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule4 >> 24], TS1[(schedule5 >> 16) & 0xFF], TS2[(schedule6 >> 8) & 0xFF]) , TS3[schedule7 & 0xFF] , hash0); schedule1 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule5 >> 24], TS1[(schedule6 >> 16) & 0xFF], TS2[(schedule7 >> 8) & 0xFF]) , TS3[schedule4 & 0xFF] , hash1); schedule2 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule6 >> 24], TS1[(schedule7 >> 16) & 0xFF], TS2[(schedule4 >> 8) & 0xFF]) , TS3[schedule5 & 0xFF] , hash2); schedule3 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule7 >> 24], TS1[(schedule4 >> 16) & 0xFF], TS2[(schedule5 >> 8) & 0xFF]) , TS3[schedule6 & 0xFF] , hash3); hash4 ^= (TS3[(hash3 >> 24) ] & 0xFF000000) ^ (TS0[(hash3 >> 16) & 0xFF] & 0x00FF0000) ^ (TS1[(hash3 >> 8) & 0xFF] & 0x0000FF00) ^ (TS2[(hash3 ) & 0xFF] & 0x000000FF); hash5 ^= hash4; hash6 ^= hash5; hash7 ^= hash6; schedule4 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule0 >> 24], TS1[(schedule1 >> 16) & 0xFF], TS2[(schedule2 >> 8) & 0xFF]) , TS3[schedule3 & 0xFF] , hash4); schedule5 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule1 >> 24], TS1[(schedule2 >> 16) & 0xFF], TS2[(schedule3 >> 8) & 0xFF]) , TS3[schedule0 & 0xFF] , hash5); schedule6 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule2 >> 24], TS1[(schedule3 >> 16) & 0xFF], TS2[(schedule0 >> 8) & 0xFF]) , TS3[schedule1 & 0xFF] , hash6); schedule7 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule3 >> 24], TS1[(schedule0 >> 16) & 0xFF], TS2[(schedule1 >> 8) & 0xFF]) , TS3[schedule2 & 0xFF] , hash7); hash0 ^= (TS2[(hash7 >> 24) ] & 0x000000FF) ^ (TS3[(hash7 >> 16) & 0xFF] & 0xFF000000) ^ (TS0[(hash7 >> 8) & 0xFF] & 0x00FF0000) ^ (TS1[(hash7 ) & 0xFF] & 0x0000FF00) ^ 0x02000000; //RCON[1]; hash1 ^= hash0; hash2 ^= hash1; hash3 ^= hash2; schedule0 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule4 >> 24], TS1[(schedule5 >> 16) & 0xFF], TS2[(schedule6 >> 8) & 0xFF]) , TS3[schedule7 & 0xFF] , hash0); schedule1 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule5 >> 24], TS1[(schedule6 >> 16) & 0xFF], TS2[(schedule7 >> 8) & 0xFF]) , TS3[schedule4 & 0xFF] , hash1); schedule2 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule6 >> 24], TS1[(schedule7 >> 16) & 0xFF], TS2[(schedule4 >> 8) & 0xFF]) , TS3[schedule5 & 0xFF] , hash2); schedule3 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule7 >> 24], TS1[(schedule4 >> 16) & 0xFF], TS2[(schedule5 >> 8) & 0xFF]) , TS3[schedule6 & 0xFF] , hash3); hash4 ^= (TS3[(hash3 >> 24) ] & 0xFF000000) ^ (TS0[(hash3 >> 16) & 0xFF] & 0x00FF0000) ^ (TS1[(hash3 >> 8) & 0xFF] & 0x0000FF00) ^ (TS2[(hash3 ) & 0xFF] & 0x000000FF); hash5 ^= hash4; hash6 ^= hash5; hash7 ^= hash6; schedule4 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule0 >> 24], TS1[(schedule1 >> 16) & 0xFF], TS2[(schedule2 >> 8) & 0xFF]) , TS3[schedule3 & 0xFF] , hash4); schedule5 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule1 >> 24], TS1[(schedule2 >> 16) & 0xFF], TS2[(schedule3 >> 8) & 0xFF]) , TS3[schedule0 & 0xFF] , hash5); schedule6 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule2 >> 24], TS1[(schedule3 >> 16) & 0xFF], TS2[(schedule0 >> 8) & 0xFF]) , TS3[schedule1 & 0xFF] , hash6); schedule7 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule3 >> 24], TS1[(schedule0 >> 16) & 0xFF], TS2[(schedule1 >> 8) & 0xFF]) , TS3[schedule2 & 0xFF] , hash7); hash0 ^= (TS2[(hash7 >> 24) ] & 0x000000FF) ^ (TS3[(hash7 >> 16) & 0xFF] & 0xFF000000) ^ (TS0[(hash7 >> 8) & 0xFF] & 0x00FF0000) ^ (TS1[(hash7 ) & 0xFF] & 0x0000FF00) ^ 0x04000000; //RCON[2]; hash1 ^= hash0; hash2 ^= hash1; hash3 ^= hash2; schedule0 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule4 >> 24], TS1[(schedule5 >> 16) & 0xFF], TS2[(schedule6 >> 8) & 0xFF]) , TS3[schedule7 & 0xFF] , hash0); schedule1 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule5 >> 24], TS1[(schedule6 >> 16) & 0xFF], TS2[(schedule7 >> 8) & 0xFF]) , TS3[schedule4 & 0xFF] , hash1); schedule2 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule6 >> 24], TS1[(schedule7 >> 16) & 0xFF], TS2[(schedule4 >> 8) & 0xFF]) , TS3[schedule5 & 0xFF] , hash2); schedule3 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule7 >> 24], TS1[(schedule4 >> 16) & 0xFF], TS2[(schedule5 >> 8) & 0xFF]) , TS3[schedule6 & 0xFF] , hash3); hash4 ^= (TS3[(hash3 >> 24) ] & 0xFF000000) ^ (TS0[(hash3 >> 16) & 0xFF] & 0x00FF0000) ^ (TS1[(hash3 >> 8) & 0xFF] & 0x0000FF00) ^ (TS2[(hash3 ) & 0xFF] & 0x000000FF); hash5 ^= hash4; hash6 ^= hash5; hash7 ^= hash6; schedule4 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule0 >> 24], TS1[(schedule1 >> 16) & 0xFF], TS2[(schedule2 >> 8) & 0xFF]) , TS3[schedule3 & 0xFF] , hash4); schedule5 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule1 >> 24], TS1[(schedule2 >> 16) & 0xFF], TS2[(schedule3 >> 8) & 0xFF]) , TS3[schedule0 & 0xFF] , hash5); schedule6 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule2 >> 24], TS1[(schedule3 >> 16) & 0xFF], TS2[(schedule0 >> 8) & 0xFF]) , TS3[schedule1 & 0xFF] , hash6); schedule7 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule3 >> 24], TS1[(schedule0 >> 16) & 0xFF], TS2[(schedule1 >> 8) & 0xFF]) , TS3[schedule2 & 0xFF] , hash7); hash0 ^= (TS2[(hash7 >> 24) ] & 0x000000FF) ^ (TS3[(hash7 >> 16) & 0xFF] & 0xFF000000) ^ (TS0[(hash7 >> 8) & 0xFF] & 0x00FF0000) ^ (TS1[(hash7 ) & 0xFF] & 0x0000FF00) ^ 0x08000000; //RCON[3]; hash1 ^= hash0; hash2 ^= hash1; hash3 ^= hash2; schedule0 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule4 >> 24], TS1[(schedule5 >> 16) & 0xFF], TS2[(schedule6 >> 8) & 0xFF]) , TS3[schedule7 & 0xFF] , hash0); schedule1 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule5 >> 24], TS1[(schedule6 >> 16) & 0xFF], TS2[(schedule7 >> 8) & 0xFF]) , TS3[schedule4 & 0xFF] , hash1); schedule2 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule6 >> 24], TS1[(schedule7 >> 16) & 0xFF], TS2[(schedule4 >> 8) & 0xFF]) , TS3[schedule5 & 0xFF] , hash2); schedule3 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule7 >> 24], TS1[(schedule4 >> 16) & 0xFF], TS2[(schedule5 >> 8) & 0xFF]) , TS3[schedule6 & 0xFF] , hash3); hash4 ^= (TS3[(hash3 >> 24) ] & 0xFF000000) ^ (TS0[(hash3 >> 16) & 0xFF] & 0x00FF0000) ^ (TS1[(hash3 >> 8) & 0xFF] & 0x0000FF00) ^ (TS2[(hash3 ) & 0xFF] & 0x000000FF); hash5 ^= hash4; hash6 ^= hash5; hash7 ^= hash6; schedule4 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule0 >> 24], TS1[(schedule1 >> 16) & 0xFF], TS2[(schedule2 >> 8) & 0xFF]) , TS3[schedule3 & 0xFF] , hash4); schedule5 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule1 >> 24], TS1[(schedule2 >> 16) & 0xFF], TS2[(schedule3 >> 8) & 0xFF]) , TS3[schedule0 & 0xFF] , hash5); schedule6 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule2 >> 24], TS1[(schedule3 >> 16) & 0xFF], TS2[(schedule0 >> 8) & 0xFF]) , TS3[schedule1 & 0xFF] , hash6); schedule7 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule3 >> 24], TS1[(schedule0 >> 16) & 0xFF], TS2[(schedule1 >> 8) & 0xFF]) , TS3[schedule2 & 0xFF] , hash7); hash0 ^= (TS2[(hash7 >> 24) ] & 0x000000FF) ^ (TS3[(hash7 >> 16) & 0xFF] & 0xFF000000) ^ (TS0[(hash7 >> 8) & 0xFF] & 0x00FF0000) ^ (TS1[(hash7 ) & 0xFF] & 0x0000FF00) ^ 0x10000000; //RCON[4]; hash1 ^= hash0; hash2 ^= hash1; hash3 ^= hash2; schedule0 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule4 >> 24], TS1[(schedule5 >> 16) & 0xFF], TS2[(schedule6 >> 8) & 0xFF]) , TS3[schedule7 & 0xFF] , hash0); schedule1 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule5 >> 24], TS1[(schedule6 >> 16) & 0xFF], TS2[(schedule7 >> 8) & 0xFF]) , TS3[schedule4 & 0xFF] , hash1); schedule2 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule6 >> 24], TS1[(schedule7 >> 16) & 0xFF], TS2[(schedule4 >> 8) & 0xFF]) , TS3[schedule5 & 0xFF] , hash2); schedule3 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule7 >> 24], TS1[(schedule4 >> 16) & 0xFF], TS2[(schedule5 >> 8) & 0xFF]) , TS3[schedule6 & 0xFF] , hash3); hash4 ^= (TS3[(hash3 >> 24) ] & 0xFF000000) ^ (TS0[(hash3 >> 16) & 0xFF] & 0x00FF0000) ^ (TS1[(hash3 >> 8) & 0xFF] & 0x0000FF00) ^ (TS2[(hash3 ) & 0xFF] & 0x000000FF); hash5 ^= hash4; hash6 ^= hash5; hash7 ^= hash6; schedule4 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule0 >> 24], TS1[(schedule1 >> 16) & 0xFF], TS2[(schedule2 >> 8) & 0xFF]) , TS3[schedule3 & 0xFF] , hash4); schedule5 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule1 >> 24], TS1[(schedule2 >> 16) & 0xFF], TS2[(schedule3 >> 8) & 0xFF]) , TS3[schedule0 & 0xFF] , hash5); schedule6 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule2 >> 24], TS1[(schedule3 >> 16) & 0xFF], TS2[(schedule0 >> 8) & 0xFF]) , TS3[schedule1 & 0xFF] , hash6); schedule7 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule3 >> 24], TS1[(schedule0 >> 16) & 0xFF], TS2[(schedule1 >> 8) & 0xFF]) , TS3[schedule2 & 0xFF] , hash7); hash0 ^= (TS2[(hash7 >> 24) ] & 0x000000FF) ^ (TS3[(hash7 >> 16) & 0xFF] & 0xFF000000) ^ (TS0[(hash7 >> 8) & 0xFF] & 0x00FF0000) ^ (TS1[(hash7 ) & 0xFF] & 0x0000FF00) ^ 0x20000000; //RCON[5]; hash1 ^= hash0; hash2 ^= hash1; hash3 ^= hash2; schedule0 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule4 >> 24], TS1[(schedule5 >> 16) & 0xFF], TS2[(schedule6 >> 8) & 0xFF]) , TS3[schedule7 & 0xFF] , hash0); schedule1 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule5 >> 24], TS1[(schedule6 >> 16) & 0xFF], TS2[(schedule7 >> 8) & 0xFF]) , TS3[schedule4 & 0xFF] , hash1); schedule2 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule6 >> 24], TS1[(schedule7 >> 16) & 0xFF], TS2[(schedule4 >> 8) & 0xFF]) , TS3[schedule5 & 0xFF] , hash2); schedule3 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule7 >> 24], TS1[(schedule4 >> 16) & 0xFF], TS2[(schedule5 >> 8) & 0xFF]) , TS3[schedule6 & 0xFF] , hash3); hash4 ^= (TS3[(hash3 >> 24) ] & 0xFF000000) ^ (TS0[(hash3 >> 16) & 0xFF] & 0x00FF0000) ^ (TS1[(hash3 >> 8) & 0xFF] & 0x0000FF00) ^ (TS2[(hash3 ) & 0xFF] & 0x000000FF); hash5 ^= hash4; hash6 ^= hash5; hash7 ^= hash6; schedule4 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule0 >> 24], TS1[(schedule1 >> 16) & 0xFF], TS2[(schedule2 >> 8) & 0xFF]) , TS3[schedule3 & 0xFF] , hash4); schedule5 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule1 >> 24], TS1[(schedule2 >> 16) & 0xFF], TS2[(schedule3 >> 8) & 0xFF]) , TS3[schedule0 & 0xFF] , hash5); schedule6 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule2 >> 24], TS1[(schedule3 >> 16) & 0xFF], TS2[(schedule0 >> 8) & 0xFF]) , TS3[schedule1 & 0xFF] , hash6); schedule7 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[schedule3 >> 24], TS1[(schedule0 >> 16) & 0xFF], TS2[(schedule1 >> 8) & 0xFF]) , TS3[schedule2 & 0xFF] , hash7); hash0 ^= (TS2[(hash7 >> 24) ] & 0x000000FF) ^ (TS3[(hash7 >> 16) & 0xFF] & 0xFF000000) ^ (TS0[(hash7 >> 8) & 0xFF] & 0x00FF0000) ^ (TS1[(hash7 ) & 0xFF] & 0x0000FF00) ^ 0x40000000; //RCON[6]; hash1 ^= hash0; hash2 ^= hash1; hash3 ^= hash2; schedule0 = (TS2[(schedule4 >> 24) ] & 0xFF000000) ^ (TS3[(schedule5 >> 16) & 0xFF] & 0x00FF0000) ^ (TS0[(schedule6 >> 8) & 0xFF] & 0x0000FF00) ^ (TS1[(schedule7 ) & 0xFF] & 0x000000FF) ^ hash0; schedule1 = (TS2[(schedule5 >> 24) ] & 0xFF000000) ^ (TS3[(schedule6 >> 16) & 0xFF] & 0x00FF0000) ^ (TS0[(schedule7 >> 8) & 0xFF] & 0x0000FF00) ^ (TS1[(schedule4 ) & 0xFF] & 0x000000FF) ^ hash1; schedule2 = (TS2[(schedule6 >> 24) ] & 0xFF000000) ^ (TS3[(schedule7 >> 16) & 0xFF] & 0x00FF0000) ^ (TS0[(schedule4 >> 8) & 0xFF] & 0x0000FF00) ^ (TS1[(schedule5 ) & 0xFF] & 0x000000FF) ^ hash2; schedule3 = (TS2[(schedule7 >> 24) ] & 0xFF000000) ^ (TS3[(schedule4 >> 16) & 0xFF] & 0x00FF0000) ^ (TS0[(schedule5 >> 8) & 0xFF] & 0x0000FF00) ^ (TS1[(schedule6 ) & 0xFF] & 0x000000FF) ^ hash3; schedule4 = __byte_perm(schedule0, 0, 0x0123); schedule5 = __byte_perm(schedule1, 0, 0x0123); schedule6 = __byte_perm(schedule2, 0, 0x0123); schedule7 = __byte_perm(schedule3, 0, 0x0123); if ( ((vmkKey[0] ^ ((uint8_t) schedule4)) == 0x2c) && ((vmkKey[1] ^ ((uint8_t) (schedule4 >> 8))) == 0x00) && ((vmkKey[4] ^ ((uint8_t) schedule5)) == 0x01) && ((vmkKey[5] ^ ((uint8_t) (schedule5 >> 8))) == 0x00) && ((vmkKey[9] ^ ((uint8_t) (schedule6 >> 8))) == 0x20) ) { if( (strict_check == 0 && ((vmkKey[8] ^ ((uint8_t) schedule6)) <= 0x05)) || (strict_check == 1 && ((vmkKey[8] ^ ((uint8_t) schedule6)) == 0x03)) ) { *found = gIndex; break; } } gIndex += (blockDim.x * gridDim.x); } return; } __device__ void encrypt( uint32_t k0, uint32_t k1, uint32_t k2, uint32_t k3, uint32_t k4, uint32_t k5, uint32_t k6, uint32_t k7, uint32_t m0, uint32_t m1, uint32_t m2, uint32_t m3, uint32_t * output0, uint32_t * output1, uint32_t * output2, uint32_t * output3 ) { uint32_t enc_schedule0, enc_schedule1, enc_schedule2, enc_schedule3, enc_schedule4, enc_schedule5, enc_schedule6, enc_schedule7; uint32_t local_key0, local_key1, local_key2, local_key3, local_key4, local_key5, local_key6, local_key7; local_key0=k0; local_key1=k1; local_key2=k2; local_key3=k3; local_key4=k4; local_key5=k5; local_key6=k6; local_key7=k7; enc_schedule0 = __byte_perm(m0, 0, 0x0123) ^ local_key0; enc_schedule1 = __byte_perm(m1, 0, 0x0123) ^ local_key1; enc_schedule2 = __byte_perm(m2, 0, 0x0123) ^ local_key2; enc_schedule3 = __byte_perm(m3, 0, 0x0123) ^ local_key3; enc_schedule4 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule0 >> 24], TS1[(enc_schedule1 >> 16) & 0xFF], TS2[(enc_schedule2 >> 8) & 0xFF]) , TS3[enc_schedule3 & 0xFF] , local_key4); enc_schedule5 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule1 >> 24], TS1[(enc_schedule2 >> 16) & 0xFF], TS2[(enc_schedule3 >> 8) & 0xFF]) , TS3[enc_schedule0 & 0xFF] , local_key5); enc_schedule6 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule2 >> 24], TS1[(enc_schedule3 >> 16) & 0xFF], TS2[(enc_schedule0 >> 8) & 0xFF]) , TS3[enc_schedule1 & 0xFF] , local_key6); enc_schedule7 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule3 >> 24], TS1[(enc_schedule0 >> 16) & 0xFF], TS2[(enc_schedule1 >> 8) & 0xFF]) , TS3[enc_schedule2 & 0xFF] , local_key7); local_key0 ^= LOP3LUT_XOR( LOP3LUT_XOR( (TS2[(local_key7 >> 24) ] & 0x000000FF), (TS3[(local_key7 >> 16) & 0xFF] & 0xFF000000), (TS0[(local_key7 >> 8) & 0xFF] & 0x00FF0000)), (TS1[(local_key7 ) & 0xFF] & 0x0000FF00), 0x01000000 ); //RCON[0]; local_key1 ^= local_key0; local_key2 ^= local_key1; local_key3 ^= local_key2; enc_schedule0 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule4 >> 24], TS1[(enc_schedule5 >> 16) & 0xFF], TS2[(enc_schedule6 >> 8) & 0xFF]) , TS3[enc_schedule7 & 0xFF] , local_key0); enc_schedule1 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule5 >> 24], TS1[(enc_schedule6 >> 16) & 0xFF], TS2[(enc_schedule7 >> 8) & 0xFF]) , TS3[enc_schedule4 & 0xFF] , local_key1); enc_schedule2 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule6 >> 24], TS1[(enc_schedule7 >> 16) & 0xFF], TS2[(enc_schedule4 >> 8) & 0xFF]) , TS3[enc_schedule5 & 0xFF] , local_key2); enc_schedule3 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule7 >> 24], TS1[(enc_schedule4 >> 16) & 0xFF], TS2[(enc_schedule5 >> 8) & 0xFF]) , TS3[enc_schedule6 & 0xFF] , local_key3); local_key4 ^= (TS3[(local_key3 >> 24) ] & 0xFF000000) ^ (TS0[(local_key3 >> 16) & 0xFF] & 0x00FF0000) ^ (TS1[(local_key3 >> 8) & 0xFF] & 0x0000FF00) ^ (TS2[(local_key3 ) & 0xFF] & 0x000000FF); local_key5 ^= local_key4; local_key6 ^= local_key5; local_key7 ^= local_key6; enc_schedule4 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule0 >> 24], TS1[(enc_schedule1 >> 16) & 0xFF], TS2[(enc_schedule2 >> 8) & 0xFF]) , TS3[enc_schedule3 & 0xFF] , local_key4); enc_schedule5 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule1 >> 24], TS1[(enc_schedule2 >> 16) & 0xFF], TS2[(enc_schedule3 >> 8) & 0xFF]) , TS3[enc_schedule0 & 0xFF] , local_key5); enc_schedule6 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule2 >> 24], TS1[(enc_schedule3 >> 16) & 0xFF], TS2[(enc_schedule0 >> 8) & 0xFF]) , TS3[enc_schedule1 & 0xFF] , local_key6); enc_schedule7 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule3 >> 24], TS1[(enc_schedule0 >> 16) & 0xFF], TS2[(enc_schedule1 >> 8) & 0xFF]) , TS3[enc_schedule2 & 0xFF] , local_key7); local_key0 ^= (TS2[(local_key7 >> 24) ] & 0x000000FF) ^ (TS3[(local_key7 >> 16) & 0xFF] & 0xFF000000) ^ (TS0[(local_key7 >> 8) & 0xFF] & 0x00FF0000) ^ (TS1[(local_key7 ) & 0xFF] & 0x0000FF00) ^ 0x02000000; //RCON[1]; local_key1 ^= local_key0; local_key2 ^= local_key1; local_key3 ^= local_key2; enc_schedule0 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule4 >> 24], TS1[(enc_schedule5 >> 16) & 0xFF], TS2[(enc_schedule6 >> 8) & 0xFF]) , TS3[enc_schedule7 & 0xFF] , local_key0); enc_schedule1 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule5 >> 24], TS1[(enc_schedule6 >> 16) & 0xFF], TS2[(enc_schedule7 >> 8) & 0xFF]) , TS3[enc_schedule4 & 0xFF] , local_key1); enc_schedule2 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule6 >> 24], TS1[(enc_schedule7 >> 16) & 0xFF], TS2[(enc_schedule4 >> 8) & 0xFF]) , TS3[enc_schedule5 & 0xFF] , local_key2); enc_schedule3 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule7 >> 24], TS1[(enc_schedule4 >> 16) & 0xFF], TS2[(enc_schedule5 >> 8) & 0xFF]) , TS3[enc_schedule6 & 0xFF] , local_key3); local_key4 ^= (TS3[(local_key3 >> 24) ] & 0xFF000000) ^ (TS0[(local_key3 >> 16) & 0xFF] & 0x00FF0000) ^ (TS1[(local_key3 >> 8) & 0xFF] & 0x0000FF00) ^ (TS2[(local_key3 ) & 0xFF] & 0x000000FF); local_key5 ^= local_key4; local_key6 ^= local_key5; local_key7 ^= local_key6; enc_schedule4 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule0 >> 24], TS1[(enc_schedule1 >> 16) & 0xFF], TS2[(enc_schedule2 >> 8) & 0xFF]) , TS3[enc_schedule3 & 0xFF] , local_key4); enc_schedule5 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule1 >> 24], TS1[(enc_schedule2 >> 16) & 0xFF], TS2[(enc_schedule3 >> 8) & 0xFF]) , TS3[enc_schedule0 & 0xFF] , local_key5); enc_schedule6 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule2 >> 24], TS1[(enc_schedule3 >> 16) & 0xFF], TS2[(enc_schedule0 >> 8) & 0xFF]) , TS3[enc_schedule1 & 0xFF] , local_key6); enc_schedule7 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule3 >> 24], TS1[(enc_schedule0 >> 16) & 0xFF], TS2[(enc_schedule1 >> 8) & 0xFF]) , TS3[enc_schedule2 & 0xFF] , local_key7); local_key0 ^= (TS2[(local_key7 >> 24) ] & 0x000000FF) ^ (TS3[(local_key7 >> 16) & 0xFF] & 0xFF000000) ^ (TS0[(local_key7 >> 8) & 0xFF] & 0x00FF0000) ^ (TS1[(local_key7 ) & 0xFF] & 0x0000FF00) ^ 0x04000000; //RCON[2]; local_key1 ^= local_key0; local_key2 ^= local_key1; local_key3 ^= local_key2; enc_schedule0 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule4 >> 24], TS1[(enc_schedule5 >> 16) & 0xFF], TS2[(enc_schedule6 >> 8) & 0xFF]) , TS3[enc_schedule7 & 0xFF] , local_key0); enc_schedule1 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule5 >> 24], TS1[(enc_schedule6 >> 16) & 0xFF], TS2[(enc_schedule7 >> 8) & 0xFF]) , TS3[enc_schedule4 & 0xFF] , local_key1); enc_schedule2 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule6 >> 24], TS1[(enc_schedule7 >> 16) & 0xFF], TS2[(enc_schedule4 >> 8) & 0xFF]) , TS3[enc_schedule5 & 0xFF] , local_key2); enc_schedule3 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule7 >> 24], TS1[(enc_schedule4 >> 16) & 0xFF], TS2[(enc_schedule5 >> 8) & 0xFF]) , TS3[enc_schedule6 & 0xFF] , local_key3); local_key4 ^= (TS3[(local_key3 >> 24) ] & 0xFF000000) ^ (TS0[(local_key3 >> 16) & 0xFF] & 0x00FF0000) ^ (TS1[(local_key3 >> 8) & 0xFF] & 0x0000FF00) ^ (TS2[(local_key3 ) & 0xFF] & 0x000000FF); local_key5 ^= local_key4; local_key6 ^= local_key5; local_key7 ^= local_key6; enc_schedule4 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule0 >> 24], TS1[(enc_schedule1 >> 16) & 0xFF], TS2[(enc_schedule2 >> 8) & 0xFF]) , TS3[enc_schedule3 & 0xFF] , local_key4); enc_schedule5 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule1 >> 24], TS1[(enc_schedule2 >> 16) & 0xFF], TS2[(enc_schedule3 >> 8) & 0xFF]) , TS3[enc_schedule0 & 0xFF] , local_key5); enc_schedule6 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule2 >> 24], TS1[(enc_schedule3 >> 16) & 0xFF], TS2[(enc_schedule0 >> 8) & 0xFF]) , TS3[enc_schedule1 & 0xFF] , local_key6); enc_schedule7 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule3 >> 24], TS1[(enc_schedule0 >> 16) & 0xFF], TS2[(enc_schedule1 >> 8) & 0xFF]) , TS3[enc_schedule2 & 0xFF] , local_key7); local_key0 ^= (TS2[(local_key7 >> 24) ] & 0x000000FF) ^ (TS3[(local_key7 >> 16) & 0xFF] & 0xFF000000) ^ (TS0[(local_key7 >> 8) & 0xFF] & 0x00FF0000) ^ (TS1[(local_key7 ) & 0xFF] & 0x0000FF00) ^ 0x08000000; //RCON[3]; local_key1 ^= local_key0; local_key2 ^= local_key1; local_key3 ^= local_key2; enc_schedule0 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule4 >> 24], TS1[(enc_schedule5 >> 16) & 0xFF], TS2[(enc_schedule6 >> 8) & 0xFF]) , TS3[enc_schedule7 & 0xFF] , local_key0); enc_schedule1 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule5 >> 24], TS1[(enc_schedule6 >> 16) & 0xFF], TS2[(enc_schedule7 >> 8) & 0xFF]) , TS3[enc_schedule4 & 0xFF] , local_key1); enc_schedule2 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule6 >> 24], TS1[(enc_schedule7 >> 16) & 0xFF], TS2[(enc_schedule4 >> 8) & 0xFF]) , TS3[enc_schedule5 & 0xFF] , local_key2); enc_schedule3 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule7 >> 24], TS1[(enc_schedule4 >> 16) & 0xFF], TS2[(enc_schedule5 >> 8) & 0xFF]) , TS3[enc_schedule6 & 0xFF] , local_key3); local_key4 ^= (TS3[(local_key3 >> 24) ] & 0xFF000000) ^ (TS0[(local_key3 >> 16) & 0xFF] & 0x00FF0000) ^ (TS1[(local_key3 >> 8) & 0xFF] & 0x0000FF00) ^ (TS2[(local_key3 ) & 0xFF] & 0x000000FF); local_key5 ^= local_key4; local_key6 ^= local_key5; local_key7 ^= local_key6; enc_schedule4 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule0 >> 24], TS1[(enc_schedule1 >> 16) & 0xFF], TS2[(enc_schedule2 >> 8) & 0xFF]) , TS3[enc_schedule3 & 0xFF] , local_key4); enc_schedule5 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule1 >> 24], TS1[(enc_schedule2 >> 16) & 0xFF], TS2[(enc_schedule3 >> 8) & 0xFF]) , TS3[enc_schedule0 & 0xFF] , local_key5); enc_schedule6 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule2 >> 24], TS1[(enc_schedule3 >> 16) & 0xFF], TS2[(enc_schedule0 >> 8) & 0xFF]) , TS3[enc_schedule1 & 0xFF] , local_key6); enc_schedule7 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule3 >> 24], TS1[(enc_schedule0 >> 16) & 0xFF], TS2[(enc_schedule1 >> 8) & 0xFF]) , TS3[enc_schedule2 & 0xFF] , local_key7); local_key0 ^= (TS2[(local_key7 >> 24) ] & 0x000000FF) ^ (TS3[(local_key7 >> 16) & 0xFF] & 0xFF000000) ^ (TS0[(local_key7 >> 8) & 0xFF] & 0x00FF0000) ^ (TS1[(local_key7 ) & 0xFF] & 0x0000FF00) ^ 0x10000000; //RCON[4]; local_key1 ^= local_key0; local_key2 ^= local_key1; local_key3 ^= local_key2; enc_schedule0 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule4 >> 24], TS1[(enc_schedule5 >> 16) & 0xFF], TS2[(enc_schedule6 >> 8) & 0xFF]) , TS3[enc_schedule7 & 0xFF] , local_key0); enc_schedule1 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule5 >> 24], TS1[(enc_schedule6 >> 16) & 0xFF], TS2[(enc_schedule7 >> 8) & 0xFF]) , TS3[enc_schedule4 & 0xFF] , local_key1); enc_schedule2 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule6 >> 24], TS1[(enc_schedule7 >> 16) & 0xFF], TS2[(enc_schedule4 >> 8) & 0xFF]) , TS3[enc_schedule5 & 0xFF] , local_key2); enc_schedule3 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule7 >> 24], TS1[(enc_schedule4 >> 16) & 0xFF], TS2[(enc_schedule5 >> 8) & 0xFF]) , TS3[enc_schedule6 & 0xFF] , local_key3); local_key4 ^= (TS3[(local_key3 >> 24) ] & 0xFF000000) ^ (TS0[(local_key3 >> 16) & 0xFF] & 0x00FF0000) ^ (TS1[(local_key3 >> 8) & 0xFF] & 0x0000FF00) ^ (TS2[(local_key3 ) & 0xFF] & 0x000000FF); local_key5 ^= local_key4; local_key6 ^= local_key5; local_key7 ^= local_key6; enc_schedule4 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule0 >> 24], TS1[(enc_schedule1 >> 16) & 0xFF], TS2[(enc_schedule2 >> 8) & 0xFF]) , TS3[enc_schedule3 & 0xFF] , local_key4); enc_schedule5 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule1 >> 24], TS1[(enc_schedule2 >> 16) & 0xFF], TS2[(enc_schedule3 >> 8) & 0xFF]) , TS3[enc_schedule0 & 0xFF] , local_key5); enc_schedule6 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule2 >> 24], TS1[(enc_schedule3 >> 16) & 0xFF], TS2[(enc_schedule0 >> 8) & 0xFF]) , TS3[enc_schedule1 & 0xFF] , local_key6); enc_schedule7 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule3 >> 24], TS1[(enc_schedule0 >> 16) & 0xFF], TS2[(enc_schedule1 >> 8) & 0xFF]) , TS3[enc_schedule2 & 0xFF] , local_key7); local_key0 ^= (TS2[(local_key7 >> 24) ] & 0x000000FF) ^ (TS3[(local_key7 >> 16) & 0xFF] & 0xFF000000) ^ (TS0[(local_key7 >> 8) & 0xFF] & 0x00FF0000) ^ (TS1[(local_key7 ) & 0xFF] & 0x0000FF00) ^ 0x20000000; //RCON[5]; local_key1 ^= local_key0; local_key2 ^= local_key1; local_key3 ^= local_key2; enc_schedule0 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule4 >> 24], TS1[(enc_schedule5 >> 16) & 0xFF], TS2[(enc_schedule6 >> 8) & 0xFF]) , TS3[enc_schedule7 & 0xFF] , local_key0); enc_schedule1 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule5 >> 24], TS1[(enc_schedule6 >> 16) & 0xFF], TS2[(enc_schedule7 >> 8) & 0xFF]) , TS3[enc_schedule4 & 0xFF] , local_key1); enc_schedule2 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule6 >> 24], TS1[(enc_schedule7 >> 16) & 0xFF], TS2[(enc_schedule4 >> 8) & 0xFF]) , TS3[enc_schedule5 & 0xFF] , local_key2); enc_schedule3 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule7 >> 24], TS1[(enc_schedule4 >> 16) & 0xFF], TS2[(enc_schedule5 >> 8) & 0xFF]) , TS3[enc_schedule6 & 0xFF] , local_key3); local_key4 ^= (TS3[(local_key3 >> 24)] & 0xFF000000) ^ (TS0[(local_key3 >> 16) & 0xFF] & 0x00FF0000) ^ (TS1[(local_key3 >> 8) & 0xFF] & 0x0000FF00) ^ (TS2[(local_key3 ) & 0xFF] & 0x000000FF); local_key5 ^= local_key4; local_key6 ^= local_key5; local_key7 ^= local_key6; enc_schedule4 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule0 >> 24], TS1[(enc_schedule1 >> 16) & 0xFF], TS2[(enc_schedule2 >> 8) & 0xFF]) , TS3[enc_schedule3 & 0xFF] , local_key4); enc_schedule5 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule1 >> 24], TS1[(enc_schedule2 >> 16) & 0xFF], TS2[(enc_schedule3 >> 8) & 0xFF]) , TS3[enc_schedule0 & 0xFF] , local_key5); enc_schedule6 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule2 >> 24], TS1[(enc_schedule3 >> 16) & 0xFF], TS2[(enc_schedule0 >> 8) & 0xFF]) , TS3[enc_schedule1 & 0xFF] , local_key6); enc_schedule7 = LOP3LUT_XOR(LOP3LUT_XOR(TS0[enc_schedule3 >> 24], TS1[(enc_schedule0 >> 16) & 0xFF], TS2[(enc_schedule1 >> 8) & 0xFF]) , TS3[enc_schedule2 & 0xFF] , local_key7); local_key0 ^= (TS2[(local_key7 >> 24)] & 0x000000FF) ^ (TS3[(local_key7 >> 16) & 0xFF] & 0xFF000000) ^ (TS0[(local_key7 >> 8) & 0xFF] & 0x00FF0000) ^ (TS1[(local_key7 ) & 0xFF] & 0x0000FF00) ^ 0x40000000; //RCON[6]; local_key1 ^= local_key0; local_key2 ^= local_key1; local_key3 ^= local_key2; enc_schedule0 = (TS2[(enc_schedule4 >> 24) ] & 0xFF000000) ^ (TS3[(enc_schedule5 >> 16) & 0xFF] & 0x00FF0000) ^ (TS0[(enc_schedule6 >> 8) & 0xFF] & 0x0000FF00) ^ (TS1[(enc_schedule7 ) & 0xFF] & 0x000000FF) ^ local_key0; enc_schedule1 = (TS2[(enc_schedule5 >> 24) ] & 0xFF000000) ^ (TS3[(enc_schedule6 >> 16) & 0xFF] & 0x00FF0000) ^ (TS0[(enc_schedule7 >> 8) & 0xFF] & 0x0000FF00) ^ (TS1[(enc_schedule4 ) & 0xFF] & 0x000000FF) ^ local_key1; enc_schedule2 = (TS2[(enc_schedule6 >> 24) ] & 0xFF000000) ^ (TS3[(enc_schedule7 >> 16) & 0xFF] & 0x00FF0000) ^ (TS0[(enc_schedule4 >> 8) & 0xFF] & 0x0000FF00) ^ (TS1[(enc_schedule5 ) & 0xFF] & 0x000000FF) ^ local_key2; enc_schedule3 = (TS2[(enc_schedule7 >> 24) ] & 0xFF000000) ^ (TS3[(enc_schedule4 >> 16) & 0xFF] & 0x00FF0000) ^ (TS0[(enc_schedule5 >> 8) & 0xFF] & 0x0000FF00) ^ (TS1[(enc_schedule6 ) & 0xFF] & 0x000000FF) ^ local_key3; output0[0] = __byte_perm(enc_schedule0, 0, 0x0123); output1[0] = __byte_perm(enc_schedule1, 0, 0x0123); output2[0] = __byte_perm(enc_schedule2, 0, 0x0123); output3[0] = __byte_perm(enc_schedule3, 0, 0x0123); } __global__ void decrypt_vmk_with_mac( int tot_psw_kernel, int *found, unsigned char * vmkKey, unsigned char * vmkIV, unsigned char * mac, unsigned char * macIV, unsigned char * computeMacIV, int v0, int v1, int v2, int v3, uint32_t s0, uint32_t s1, uint32_t s2, uint32_t s3, int method ) { uint32_t schedule0, schedule1, schedule2, schedule3, schedule4, schedule5, schedule6, schedule7, schedule8, schedule9; uint32_t schedule10, schedule11, schedule12, schedule13, schedule14, schedule15, schedule16, schedule17, schedule18, schedule19; uint32_t schedule20, schedule21, schedule22, schedule23, schedule24, schedule25, schedule26, schedule27, schedule28, schedule29; uint32_t schedule30, schedule31; uint32_t first_hash0, first_hash1, first_hash2, first_hash3, first_hash4, first_hash5, first_hash6, first_hash7; uint32_t hash0, hash1, hash2, hash3, hash4, hash5, hash6, hash7; uint32_t a, b, c, d, e, f, g, h; int gIndex = (threadIdx.x+blockIdx.x*blockDim.x); int index_generic; int indexW=(gIndex*PSW_INT_SIZE); int8_t redo=0; while(gIndex < tot_psw_kernel) { first_hash0 = UINT32_C(0x6A09E667); first_hash1 = UINT32_C(0xBB67AE85); first_hash2 = UINT32_C(0x3C6EF372); first_hash3 = UINT32_C(0xA54FF53A); first_hash4 = UINT32_C(0x510E527F); first_hash5 = UINT32_C(0x9B05688C); first_hash6 = UINT32_C(0x1F83D9AB); first_hash7 = UINT32_C(0x5BE0CD19); a = UINT32_C(0x6A09E667); b = UINT32_C(0xBB67AE85); c = UINT32_C(0x3C6EF372); d = UINT32_C(0xA54FF53A); e = UINT32_C(0x510E527F); f = UINT32_C(0x9B05688C); g = UINT32_C(0x1F83D9AB); h = UINT32_C(0x5BE0CD19); //----------------------------------------------------- FIRST HASH ------------------------------------------------ indexW=(gIndex*PSW_INT_SIZE); redo=0; schedule0 = (uint32_t) (tex1Dfetch(w_password, (indexW+0))); schedule1 = (uint32_t) (tex1Dfetch(w_password, (indexW+1))); schedule2 = (uint32_t) (tex1Dfetch(w_password, (indexW+2))); schedule3 = (uint32_t) (tex1Dfetch(w_password, (indexW+3))); schedule4 = (uint32_t) (tex1Dfetch(w_password, (indexW+4))); schedule5 = (uint32_t) (tex1Dfetch(w_password, (indexW+5))); schedule6 = (uint32_t) (tex1Dfetch(w_password, (indexW+6))); schedule7 = (uint32_t) (tex1Dfetch(w_password, (indexW+7))); schedule8 = (uint32_t) (tex1Dfetch(w_password, (indexW+8))); schedule9 = (uint32_t) (tex1Dfetch(w_password, (indexW+9))); schedule10 = (uint32_t) (tex1Dfetch(w_password, (indexW+10))); schedule11 = (uint32_t) (tex1Dfetch(w_password, (indexW+11))); schedule12 = (uint32_t) (tex1Dfetch(w_password, (indexW+12))); schedule13 = (uint32_t) (tex1Dfetch(w_password, (indexW+13))); schedule14 = (uint32_t) (tex1Dfetch(w_password, (indexW+14))); //Input password is shorter than FIRST_LENGHT if(schedule14 == 0xFFFFFFFF) schedule14=0; else if(method == MODE_USER_PASS) redo=1; schedule15 = (uint32_t) (tex1Dfetch(w_password, (indexW+15))); ALL_SCHEDULE_LAST16() ALL_ROUND_B1_1() ALL_SCHEDULE32() ALL_ROUND_B1_2() first_hash0 += a; first_hash1 += b; first_hash2 += c; first_hash3 += d; first_hash4 += e; first_hash5 += f; first_hash6 += g; first_hash7 += h; //User password only if(method == MODE_USER_PASS) { if(redo == 1) { schedule0 = (uint32_t) (tex1Dfetch(w_password, (indexW+16))); schedule1 = (uint32_t) (tex1Dfetch(w_password, (indexW+17))); schedule2 = (uint32_t) (tex1Dfetch(w_password, (indexW+18))); schedule3 = (uint32_t) (tex1Dfetch(w_password, (indexW+19))); schedule4 = (uint32_t) (tex1Dfetch(w_password, (indexW+20))); schedule5 = (uint32_t) (tex1Dfetch(w_password, (indexW+21))); schedule6 = (uint32_t) (tex1Dfetch(w_password, (indexW+22))); schedule7 = (uint32_t) (tex1Dfetch(w_password, (indexW+23))); schedule8 = (uint32_t) (tex1Dfetch(w_password, (indexW+24))); schedule9 = (uint32_t) (tex1Dfetch(w_password, (indexW+25))); schedule10 = (uint32_t) (tex1Dfetch(w_password, (indexW+26))); schedule11 = (uint32_t) (tex1Dfetch(w_password, (indexW+27))); schedule12 = (uint32_t) (tex1Dfetch(w_password, (indexW+28))); schedule13 = (uint32_t) (tex1Dfetch(w_password, (indexW+29))); schedule14 = (uint32_t) (tex1Dfetch(w_password, (indexW+30))); schedule15 = (uint32_t) (tex1Dfetch(w_password, (indexW+31))); a = first_hash0; b = first_hash1; c = first_hash2; d = first_hash3; e = first_hash4; f = first_hash5; g = first_hash6; h = first_hash7; ALL_SCHEDULE_LAST16() ALL_ROUND_B1_1() ALL_SCHEDULE32() ALL_ROUND_B1_2() first_hash0 += a; first_hash1 += b; first_hash2 += c; first_hash3 += d; first_hash4 += e; first_hash5 += f; first_hash6 += g; first_hash7 += h; } //----------------------------------------------------- SECOND HASH ------------------------------------------------ schedule0 = first_hash0; schedule1 = first_hash1; schedule2 = first_hash2; schedule3 = first_hash3; schedule4 = first_hash4; schedule5 = first_hash5; schedule6 = first_hash6; schedule7 = first_hash7; schedule8 = 0x80000000; schedule9 = 0; schedule10 = 0; schedule11 = 0; schedule12 = 0; schedule13 = 0; schedule14 = 0; schedule15 = 0x100; first_hash0 = UINT32_C(0x6A09E667); first_hash1 = UINT32_C(0xBB67AE85); first_hash2 = UINT32_C(0x3C6EF372); first_hash3 = UINT32_C(0xA54FF53A); first_hash4 = UINT32_C(0x510E527F); first_hash5 = UINT32_C(0x9B05688C); first_hash6 = UINT32_C(0x1F83D9AB); first_hash7 = UINT32_C(0x5BE0CD19); a = first_hash0; b = first_hash1; c = first_hash2; d = first_hash3; e = first_hash4; f = first_hash5; g = first_hash6; h = first_hash7; ALL_SCHEDULE_LAST16() ALL_ROUND_B1_1() ALL_SCHEDULE32() ALL_ROUND_B1_2() first_hash0 += a; first_hash1 += b; first_hash2 += c; first_hash3 += d; first_hash4 += e; first_hash5 += f; first_hash6 += g; first_hash7 += h; } //----------------------------------------------------- LOOP HASH ------------------------------------------------ hash0=0; hash1=0; hash2=0; hash3=0; hash4=0; hash5=0; hash6=0; hash7=0; indexW=0; for(index_generic=0; index_generic < ITERATION_NUMBER/2; index_generic++) { a = UINT32_C(0x6A09E667); b = UINT32_C(0xBB67AE85); c = UINT32_C(0x3C6EF372); d = UINT32_C(0xA54FF53A); e = UINT32_C(0x510E527F); f = UINT32_C(0x9B05688C); g = UINT32_C(0x1F83D9AB); h = UINT32_C(0x5BE0CD19); schedule0 = hash0; schedule1 = hash1; schedule2 = hash2; schedule3 = hash3; schedule4 = hash4; schedule5 = hash5; schedule6 = hash6; schedule7 = hash7; schedule8 = first_hash0; schedule9 = first_hash1; schedule10 = first_hash2; schedule11 = first_hash3; schedule12 = first_hash4; schedule13 = first_hash5; schedule14 = first_hash6; schedule15 = first_hash7; ALL_SCHEDULE_LAST16() ALL_ROUND_B1_1() ALL_SCHEDULE32() ALL_ROUND_B1_2() hash0 = UINT32_C(0x6A09E667) + a; hash1 = UINT32_C(0xBB67AE85) + b; hash2 = UINT32_C(0x3C6EF372) + c; hash3 = UINT32_C(0xA54FF53A) + d; hash4 = UINT32_C(0x510E527F) + e; hash5 = UINT32_C(0x9B05688C) + f; hash6 = UINT32_C(0x1F83D9AB) + g; hash7 = UINT32_C(0x5BE0CD19) + h; a = hash0; b = hash1; c = hash2; d = hash3; e = hash4; f = hash5; g = hash6; h = hash7; ROUND_SECOND_BLOCK_CONST(a, b, c, d, e, f, g, h, 0, 0x428A2F98, v0) ROUND_SECOND_BLOCK_CONST(h, a, b, c, d, e, f, g, 1, 0x71374491, v1) ROUND_SECOND_BLOCK_CONST(g, h, a, b, c, d, e, f, 2, 0xB5C0FBCF, v2) ROUND_SECOND_BLOCK_CONST(f, g, h, a, b, c, d, e, 3, 0xE9B5DBA5, v3) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 4, 0x3956C25B, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 5, 0x59F111F1, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 6, 0x923F82A4, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 7, 0xAB1C5ED5, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 8, 0xD807AA98, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 9, 0x12835B01, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 10, 0x243185BE, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 11, 0x550C7DC3, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 12, 0x72BE5D74, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 13, 0x80DEB1FE, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 14, 0x9BDC06A7, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 15, 0xC19BF174, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 16, 0xE49B69C1, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 17, 0xEFBE4786, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 18, 0x0FC19DC6, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 19, 0x240CA1CC, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 20, 0x2DE92C6F, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 21, 0x4A7484AA, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 22, 0x5CB0A9DC, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 23, 0x76F988DA, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 24, 0x983E5152, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 25, 0xA831C66D, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 26, 0xB00327C8, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 27, 0xBF597FC7, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 28, 0xC6E00BF3, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 29, 0xD5A79147, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 30, 0x06CA6351, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 31, 0x14292967, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 32, 0x27B70A85, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 33, 0x2E1B2138, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 34, 0x4D2C6DFC, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 35, 0x53380D13, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 36, 0x650A7354, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 37, 0x766A0ABB, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 38, 0x81C2C92E, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 39, 0x92722C85, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 40, 0xA2BFE8A1, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 41, 0xA81A664B, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 42, 0xC24B8B70, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 43, 0xC76C51A3, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 44, 0xD192E819, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 45, 0xD6990624, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 46, 0xF40E3585, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 47, 0x106AA070, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 48, 0x19A4C116, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 49, 0x1E376C08, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 50, 0x2748774C, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 51, 0x34B0BCB5, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 52, 0x391C0CB3, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 53, 0x4ED8AA4A, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 54, 0x5B9CCA4F, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 55, 0x682E6FF3, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 56, 0x748F82EE, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 57, 0x78A5636F, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 58, 0x84C87814, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 59, 0x8CC70208, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 60, 0x90BEFFFA, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 61, 0xA4506CEB, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 62, 0xBEF9A3F7, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 63, 0xC67178F2, indexW) hash0 += a; hash1 += b; hash2 += c; hash3 += d; hash4 += e; hash5 += f; hash6 += g; hash7 += h; indexW += SINGLE_BLOCK_W_SIZE; } for(index_generic=ITERATION_NUMBER/2; index_generic < ITERATION_NUMBER; index_generic++) { a = UINT32_C(0x6A09E667); b = UINT32_C(0xBB67AE85); c = UINT32_C(0x3C6EF372); d = UINT32_C(0xA54FF53A); e = UINT32_C(0x510E527F); f = UINT32_C(0x9B05688C); g = UINT32_C(0x1F83D9AB); h = UINT32_C(0x5BE0CD19); schedule0 = hash0; schedule1 = hash1; schedule2 = hash2; schedule3 = hash3; schedule4 = hash4; schedule5 = hash5; schedule6 = hash6; schedule7 = hash7; schedule8 = first_hash0; schedule9 = first_hash1; schedule10 = first_hash2; schedule11 = first_hash3; schedule12 = first_hash4; schedule13 = first_hash5; schedule14 = first_hash6; schedule15 = first_hash7; ALL_SCHEDULE_LAST16() ALL_ROUND_B1_1() ALL_SCHEDULE32() ALL_ROUND_B1_2() hash0 = UINT32_C(0x6A09E667) + a; hash1 = UINT32_C(0xBB67AE85) + b; hash2 = UINT32_C(0x3C6EF372) + c; hash3 = UINT32_C(0xA54FF53A) + d; hash4 = UINT32_C(0x510E527F) + e; hash5 = UINT32_C(0x9B05688C) + f; hash6 = UINT32_C(0x1F83D9AB) + g; hash7 = UINT32_C(0x5BE0CD19) + h; a = hash0; b = hash1; c = hash2; d = hash3; e = hash4; f = hash5; g = hash6; h = hash7; ROUND_SECOND_BLOCK_CONST(a, b, c, d, e, f, g, h, 0, 0x428A2F98, v0) ROUND_SECOND_BLOCK_CONST(h, a, b, c, d, e, f, g, 1, 0x71374491, v1) ROUND_SECOND_BLOCK_CONST(g, h, a, b, c, d, e, f, 2, 0xB5C0FBCF, v2) ROUND_SECOND_BLOCK_CONST(f, g, h, a, b, c, d, e, 3, 0xE9B5DBA5, v3) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 4, 0x3956C25B, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 5, 0x59F111F1, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 6, 0x923F82A4, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 7, 0xAB1C5ED5, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 8, 0xD807AA98, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 9, 0x12835B01, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 10, 0x243185BE, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 11, 0x550C7DC3, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 12, 0x72BE5D74, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 13, 0x80DEB1FE, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 14, 0x9BDC06A7, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 15, 0xC19BF174, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 16, 0xE49B69C1, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 17, 0xEFBE4786, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 18, 0x0FC19DC6, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 19, 0x240CA1CC, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 20, 0x2DE92C6F, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 21, 0x4A7484AA, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 22, 0x5CB0A9DC, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 23, 0x76F988DA, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 24, 0x983E5152, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 25, 0xA831C66D, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 26, 0xB00327C8, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 27, 0xBF597FC7, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 28, 0xC6E00BF3, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 29, 0xD5A79147, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 30, 0x06CA6351, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 31, 0x14292967, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 32, 0x27B70A85, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 33, 0x2E1B2138, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 34, 0x4D2C6DFC, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 35, 0x53380D13, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 36, 0x650A7354, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 37, 0x766A0ABB, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 38, 0x81C2C92E, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 39, 0x92722C85, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 40, 0xA2BFE8A1, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 41, 0xA81A664B, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 42, 0xC24B8B70, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 43, 0xC76C51A3, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 44, 0xD192E819, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 45, 0xD6990624, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 46, 0xF40E3585, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 47, 0x106AA070, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 48, 0x19A4C116, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 49, 0x1E376C08, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 50, 0x2748774C, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 51, 0x34B0BCB5, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 52, 0x391C0CB3, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 53, 0x4ED8AA4A, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 54, 0x5B9CCA4F, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 55, 0x682E6FF3, indexW) ROUND_SECOND_BLOCK(a, b, c, d, e, f, g, h, 56, 0x748F82EE, indexW) ROUND_SECOND_BLOCK(h, a, b, c, d, e, f, g, 57, 0x78A5636F, indexW) ROUND_SECOND_BLOCK(g, h, a, b, c, d, e, f, 58, 0x84C87814, indexW) ROUND_SECOND_BLOCK(f, g, h, a, b, c, d, e, 59, 0x8CC70208, indexW) ROUND_SECOND_BLOCK(e, f, g, h, a, b, c, d, 60, 0x90BEFFFA, indexW) ROUND_SECOND_BLOCK(d, e, f, g, h, a, b, c, 61, 0xA4506CEB, indexW) ROUND_SECOND_BLOCK(c, d, e, f, g, h, a, b, 62, 0xBEF9A3F7, indexW) ROUND_SECOND_BLOCK(b, c, d, e, f, g, h, a, 63, 0xC67178F2, indexW) hash0 += a; hash1 += b; hash2 += c; hash3 += d; hash4 += e; hash5 += f; hash6 += g; hash7 += h; indexW += SINGLE_BLOCK_W_SIZE; } //----------------------------------------------------- MAC COMPARISON ------------------------------------------------ a = ((uint32_t *)(vmkIV))[0]; b = ((uint32_t *)(vmkIV+4))[0]; c = ((uint32_t *)(vmkIV+8))[0]; d = ((uint32_t *)(vmkIV+12))[0]; encrypt( hash0, hash1, hash2, hash3, hash4, hash5, hash6, hash7, a, b, c, d, &(schedule0), &(schedule1), &(schedule2), &(schedule3) ); schedule0= (((uint32_t)(vmkKey[3] ^ ((uint8_t) (schedule0 >> 24) ))) << 24) | (((uint32_t)(vmkKey[2] ^ ((uint8_t) (schedule0 >> 16) ))) << 16) | (((uint32_t)(vmkKey[1] ^ ((uint8_t) (schedule0 >> 8) ))) << 8) | (((uint32_t)(vmkKey[0] ^ ((uint8_t) (schedule0)))) << 0); schedule1= (((uint32_t)(vmkKey[7] ^ ((uint8_t) (schedule1 >> 24) ))) << 24) | (((uint32_t)(vmkKey[6] ^ ((uint8_t) (schedule1 >> 16) ))) << 16) | (((uint32_t)(vmkKey[5] ^ ((uint8_t) (schedule1 >> 8) ))) << 8) | (((uint32_t)(vmkKey[4] ^ ((uint8_t) (schedule1)))) << 0); schedule2= (((uint32_t)(vmkKey[11] ^ ((uint8_t) (schedule2 >> 24) ))) << 24) | (((uint32_t)(vmkKey[10] ^ ((uint8_t) (schedule2 >> 16) ))) << 16) | (((uint32_t)(vmkKey[9] ^ ((uint8_t) (schedule2 >> 8) ))) << 8) | (((uint32_t)(vmkKey[8] ^ ((uint8_t) (schedule2)))) << 0); schedule3= (((uint32_t)(vmkKey[15] ^ ((uint8_t) (schedule3 >> 24) ))) << 24) | (((uint32_t)(vmkKey[14] ^ ((uint8_t) (schedule3 >> 16) ))) << 16) | (((uint32_t)(vmkKey[13] ^ ((uint8_t) (schedule3 >> 8) ))) << 8) | (((uint32_t)(vmkKey[12] ^ ((uint8_t) (schedule3)))) << 0); d += 0x01000000; encrypt( hash0, hash1, hash2, hash3, hash4, hash5, hash6, hash7, a, b, c, d, &(schedule4), &(schedule5), &(schedule6), &(schedule7) ); schedule4= (((uint32_t)(vmkKey[19] ^ ((uint8_t) (schedule4 >> 24) ))) << 24) | (((uint32_t)(vmkKey[18] ^ ((uint8_t) (schedule4 >> 16) ))) << 16) | (((uint32_t)(vmkKey[17] ^ ((uint8_t) (schedule4 >> 8) ))) << 8) | (((uint32_t)(vmkKey[16] ^ ((uint8_t) (schedule4)))) << 0); schedule5= (((uint32_t)(vmkKey[23] ^ ((uint8_t) (schedule5 >> 24) ))) << 24) | (((uint32_t)(vmkKey[22] ^ ((uint8_t) (schedule5 >> 16) ))) << 16) | (((uint32_t)(vmkKey[21] ^ ((uint8_t) (schedule5 >> 8) ))) << 8) | (((uint32_t)(vmkKey[20] ^ ((uint8_t) (schedule5)))) << 0); schedule6= (((uint32_t)(vmkKey[27] ^ ((uint8_t) (schedule6 >> 24) ))) << 24) | (((uint32_t)(vmkKey[26] ^ ((uint8_t) (schedule6 >> 16) ))) << 16) | (((uint32_t)(vmkKey[25] ^ ((uint8_t) (schedule6 >> 8) ))) << 8) | (((uint32_t)(vmkKey[24] ^ ((uint8_t) (schedule6)))) << 0); schedule7= (((uint32_t)(vmkKey[31] ^ ((uint8_t) (schedule7 >> 24) ))) << 24) | (((uint32_t)(vmkKey[30] ^ ((uint8_t) (schedule7 >> 16) ))) << 16) | (((uint32_t)(vmkKey[29] ^ ((uint8_t) (schedule7 >> 8) ))) << 8) | (((uint32_t)(vmkKey[28] ^ ((uint8_t) (schedule7)))) << 0); d += 0x01000000; encrypt( hash0, hash1, hash2, hash3, hash4, hash5, hash6, hash7, a, b, c, d, &(schedule8), &(schedule9), &(schedule10), &(schedule11) ); schedule8= (((uint32_t)(vmkKey[35] ^ ((uint8_t) (schedule8 >> 24) ))) << 24) | (((uint32_t)(vmkKey[34] ^ ((uint8_t) (schedule8 >> 16) ))) << 16) | (((uint32_t)(vmkKey[33] ^ ((uint8_t) (schedule8 >> 8) ))) << 8) | (((uint32_t)(vmkKey[32] ^ ((uint8_t) (schedule8)))) << 0); schedule9= (((uint32_t)(vmkKey[39] ^ ((uint8_t) (schedule9 >> 24) ))) << 24) | (((uint32_t)(vmkKey[38] ^ ((uint8_t) (schedule9 >> 16) ))) << 16) | (((uint32_t)(vmkKey[37] ^ ((uint8_t) (schedule9 >> 8) ))) << 8) | (((uint32_t)(vmkKey[36] ^ ((uint8_t) (schedule9)))) << 0); schedule10= (((uint32_t)(vmkKey[43] ^ ((uint8_t) (schedule10 >> 24) ))) << 24) | (((uint32_t)(vmkKey[42] ^ ((uint8_t) (schedule10 >> 16) ))) << 16) | (((uint32_t)(vmkKey[41] ^ ((uint8_t) (schedule10 >> 8) ))) << 8) | (((uint32_t)(vmkKey[40] ^ ((uint8_t) (schedule10)))) << 0); encrypt( hash0, hash1, hash2, hash3, hash4, hash5, hash6, hash7, ((uint32_t *)(macIV))[0], ((uint32_t *)(macIV+4))[0], ((uint32_t *)(macIV+8))[0], ((uint32_t *)(macIV+12))[0], &(schedule16), &(schedule17), &(schedule18), &(schedule19) ); encrypt( hash0, hash1, hash2, hash3, hash4, hash5, hash6, hash7, ((uint32_t *)(computeMacIV))[0], ((uint32_t *)(computeMacIV+4))[0], ((uint32_t *)(computeMacIV+8))[0], ((uint32_t *)(computeMacIV+12))[0], &(schedule12), &(schedule13), &(schedule14), &(schedule15) ); schedule28 = schedule0 ^ schedule12; schedule29 = schedule1 ^ schedule13; schedule30 = schedule2 ^ schedule14; schedule31 = schedule3 ^ schedule15; encrypt( hash0, hash1, hash2, hash3, hash4, hash5, hash6, hash7, schedule28, schedule29, schedule30, schedule31, &(schedule12), &(schedule13), &(schedule14), &(schedule15) ); schedule28 = schedule4 ^ schedule12; schedule29 = schedule5 ^ schedule13; schedule30 = schedule6 ^ schedule14; schedule31 = schedule7 ^ schedule15; encrypt( hash0, hash1, hash2, hash3, hash4, hash5, hash6, hash7, schedule28, schedule29, schedule30, schedule31, &(schedule12), &(schedule13), &(schedule14), &(schedule15) ); schedule28 = schedule8 ^ schedule12; schedule29 = schedule9 ^ schedule13; schedule30 = schedule10 ^ schedule14; schedule31 = schedule15; encrypt( hash0, hash1, hash2, hash3, hash4, hash5, hash6, hash7, schedule28, schedule29, schedule30, schedule31, &(schedule12), &(schedule13), &(schedule14), &(schedule15) ); if ( ( schedule12 == ( (uint32_t) (((uint32_t)(mac[3] ^ ((uint8_t) (schedule16 >> 24) ))) << 24) | (((uint32_t)(mac[2] ^ ((uint8_t) (schedule16 >> 16) ))) << 16) | (((uint32_t)(mac[1] ^ ((uint8_t) (schedule16 >> 8) ))) << 8) | (((uint32_t)(mac[0] ^ ((uint8_t) (schedule16)))) << 0) ) ) && ( schedule13 == ( (uint32_t) (((uint32_t)(mac[7] ^ ((uint8_t) (schedule17 >> 24) ))) << 24) | (((uint32_t)(mac[6] ^ ((uint8_t) (schedule17 >> 16) ))) << 16) | (((uint32_t)(mac[5] ^ ((uint8_t) (schedule17 >> 8) ))) << 8) | (((uint32_t)(mac[4] ^ ((uint8_t) (schedule17)))) << 0) ) ) && ( schedule14 == ( (uint32_t) (((uint32_t)(mac[11] ^ ((uint8_t) (schedule18 >> 24) ))) << 24) | (((uint32_t)(mac[10] ^ ((uint8_t) (schedule18 >> 16) ))) << 16) | (((uint32_t)(mac[9] ^ ((uint8_t) (schedule18 >> 8) ))) << 8) | (((uint32_t)(mac[8] ^ ((uint8_t) (schedule18)))) << 0) ) ) && ( schedule15 == ( (uint32_t) (((uint32_t)(mac[15] ^ ((uint8_t) (schedule19 >> 24) ))) << 24) | (((uint32_t)(mac[14] ^ ((uint8_t) (schedule19 >> 16) ))) << 16) | (((uint32_t)(mac[13] ^ ((uint8_t) (schedule19 >> 8) ))) << 8) | (((uint32_t)(mac[12] ^ ((uint8_t) (schedule19)))) << 0) ) ) ) { *found = gIndex; break; } gIndex += (blockDim.x * gridDim.x); } return; }