В продолжение темы OS Systemicus (т.к. там используется этот алгоритм) привожу полный код реализации ГОСТ 34.11-2012 на ассемблере. Эта же «библиотека» используется и в данной программе — http://omegicus.com/gost_34.11-2012_stribog
Не буду ничего описывать — написано уже достаточно, просто выложу код. Кого интересует не код, а подробности алгоритма — просьба не читать и не минусовать…
Сразу предупреждаю, код не оптимизирован. Отдаю код целиком в добрые руки оптимизаторов) Если у кого получится ускорить ее — выкладывайте тоже.
Как использовать:
mov ebx, 512 ; 512 bit version mov esi, buff mov edi, MH mov ecx, dword[m_sz] call GOST_3411_2012 ; mov ebx, 256 ; 512 bit version mov esi, buff mov edi, MH mov ecx, dword[m_sz] call GOST_3411_2012
В первом случае используется 512-битная версия, исходник в ^buff, результат в ^MH, длина исходных данных в ^m_sz.
Во втором случае всё аналогично, но используется 256-битная версия алгоритма.
Итак, секция кода:
align 4 GOST_3411_2012: ;( EBX variant, ESI const unsigned char *message, ECX length, EDI unsigned char *out) ; *hash = IV shl ecx, 0x00000003 ; convert bytes to bits pushad mov edi, G12_VARS mov ecx, G12_VARS_SZ / 4 xor eax, eax cld rep stosd ; mov eax, 0x00000000 cmp ebx, 256 jne .h512 mov eax, 0x01010101 .h512: mov edi, gosth_hash mov ecx, 64/4 cld rep stosd ; mov byte[hash_X_v512 + 62], 0x02 ; init hash_X_v512 popad ; ; Stage 2 ;; while (len >= 512) ;; { ;; memcpy(m, message + len/8 - 63 - ( (len & 0x7) == 0 ), 64); ;; g_N(N,hash,m); ;; AddModulo512(N,v512,N); ;; AddModulo512(hash_X_Sigma,m,hash_X_Sigma); ;; len -= 512; ;; } align 4 .stage_2: cmp ecx, 512 jb .stage_25 ; push ecx esi edi mov edi, g12_X_m push ecx shr ecx, 0x00000003 add esi, ecx sub esi, 64 pop ecx mov ecx, 64/4 cld rep movsd pop edi esi ecx ; g_N(N,hash,m) push edx esi edi mov edi, hash_X_N mov esi, gosth_hash mov edx, g12_X_m call fn_g_N ; EDI *N, ESI *h, EDX *m ; +++++ pop edi esi edx ; AddModulo512(N,v512,N) push eax esi edi mov eax, hash_X_N mov esi, hash_X_v512 mov edi, hash_X_N call AddModulo512 ; eax *a esi *b edi *c pop edi esi eax ; AddModulo512(hash_X_Sigma,m,hash_X_Sigma) push eax esi edi mov eax, hash_X_Sigma mov esi, g12_X_m mov edi, hash_X_Sigma call AddModulo512 ; eax *a esi *b edi *c pop edi esi eax ; len -= 512; sub ecx, 512 cmp ecx, 512 jae .stage_2 ; } .stage_25: ; +OK memset(m,0,64) push edi ecx eax mov edi, g12_X_m xor eax, eax mov ecx, 64/4 cld rep stosd pop eax ecx edi ; +OK memcpy(m + 63 - len/8 + ( (len & 0x7) == 0 ), message, len/8 + 1 - ( (len & 0x7) == 0 )) push eax ecx esi edi mov eax, 64 shr ecx, 0x00000003 sub eax, ecx mov edi, g12_X_m add edi, eax cld rep movsb pop edi esi ecx eax ; ; ; Stage 3 ; m[ 63 - len/8 ] |= (1 << (len & 0x7)) push ebx ecx edx push ecx and ecx, 0x00000007 mov ebx, 0x00000001 shl ebx, cl pop ecx push ecx shr ecx, 0x00000003 mov edx, 63 sub edx, ecx pop ecx add edx, g12_X_m or byte[edx], bl pop edx ecx ebx ; g_N(N,hash,m); push edx esi edi mov edi, hash_X_N mov esi, gosth_hash mov edx, g12_X_m call fn_g_N ; EDI *N, ESI *h, EDX *m pop edi esi edx ; v512[63] = len & 0xFF; ; push ecx ; and ecx, 0x000000FF mov byte[hash_X_v512 + 63], cl ; pop ecx ; v512[62] = len >> 8; push ecx shr ecx, 0x00000008 mov byte[hash_X_v512 + 62], cl pop ecx ; AddModulo512(N,v512,N); push esi edi mov eax, hash_X_N mov esi, hash_X_v512 mov edi, hash_X_N call AddModulo512 ; eax *a esi *b edi *c pop edi esi ; AddModulo512(hash_X_Sigma, m, hash_X_Sigma) push esi edi mov eax, hash_X_Sigma mov esi, g12_X_m mov edi, hash_X_Sigma call AddModulo512 ; eax *a esi *b edi *c pop edi esi ; g_N(v0,hash,N); push esi edi mov edi, hash_X_v0 mov esi, gosth_hash mov edx, hash_X_N call fn_g_N ; EDI *N, ESI *h, EDX *m ; g_N(v0,hash,hash_X_Sigma); mov edi, hash_X_v0 mov esi, gosth_hash mov edx, hash_X_Sigma call fn_g_N ; EDI *N, ESI *h, EDX *m pop edi esi ; memcpy(out, hash, 64) push ecx esi edi mov esi, gosth_hash mov ecx, 64/4 cmp ebx, 256 jne .h512c mov ecx, 32/4 .h512c: cld rep movsd pop edi esi ecx ret ALIGN 4 HEX2STR_256_BIT: ; ^ESI->, ^EDI<- PUSHAD XOR ECX, ECX ; @@: INC ECX CMP ECX, 32 JA .END LODSB PUSH ECX MOV DL, AL MOV ECX, 0x02 .L1: ROL DL, 0x04 MOV EAX, 0x300F AND AL, DL AAA AAD 0x11 STOSB LOOP .L1 POP ECX JMP @B .END: XOR EAX, EAX STOSB POPAD RETD ALIGN 4 HEX2STR_512_BIT: ; ^ESI->, ^EDI<- PUSHAD XOR ECX, ECX ; @@: INC ECX CMP ECX, 64 JA .END LODSB PUSH ECX MOV DL, AL MOV ECX, 0x02 .L1: ROL DL, 0x04 MOV EAX, 0x300F AND AL, DL AAA AAD 0x11 STOSB LOOP .L1 POP ECX JMP @B .END: XOR EAX, EAX STOSB POPAD RETD ; Created on: May 5, 2012 ; Author: Oleksandr Kazymyrov ; Acknowledgments: Oleksii Shevchuk ; ; FASM x86: Vladislav Kabak ;include 'lib_gost_data.inc' align 4 KeySchedule: ; unsigned char *K EAX, int i ECX ; +OK push eax ebx ecx esi ; K = K xor C[i] push eax mov ebx, eax mov esi, eax mov eax, ecx shl eax, 0x06 ; *64 (get block # by index) add eax, const_C ; point to C-table call AddXor512 ; ebx eax esi ; AddXor512(K,C[i],K) pop esi ; call fn_S ; K = S(K) call fn_P ; K = P(K) call fn_L ; K = L(K) ; pop esi ecx ebx eax ret align 4 fn_S: ; SubBytes S function. unsigned char *state [esi] ; +OK push eax ebx ecx edx xor ecx, ecx ; int i = 0 mov ebx, G12_Sbox ; S-Box xor edx, edx align 4 ; for(i=0;i<64;i++) state[i] = Sbox[state[i]] @@: mov dl, byte[esi + ecx] ; edx = state[i] mov al, byte[G12_Sbox + edx] ; al = Sbox[state[i]] mov byte[esi + ecx], al ; state[i] = Sbox[state[i]] inc ecx cmp ecx, 64 jne @b pop edx ecx ebx eax ret align 4 fn_P: ; Transposition P function. unsigned char *state in ESI ; +OK pushad xor ecx, ecx ; int i = 0 xor edx, edx align 4 @@: mov dl, byte [Tau + ecx] ; edx = Tau[i] mov al, byte [esi + edx] ; eax = state[Tau[i]] mov byte[fn_P_t + ecx], al ; t[i] = state[Tau[i]] inc ecx ; for(i=0;i<64;i++) cmp ecx, 64 jne @b ; memcpy(state,t,64) mov ecx, 64/4 mov edi, esi mov esi, fn_P_t cld rep movsd popad ret align 4 fn_E: ; eax: ^K, ebx: *m, esi: *state ; +OK ; unsigned char *K, const unsigned char *m, unsigned char *state push ebx ecx ; AddXor512(m,K,state) call AddXor512 ; m=ebx, K=eax, state=esi, safe needed xor ecx, ecx ; int i = 0 align 4 ; for(i=0;i<12;i++) { @@: call fn_S ; state = S(state) call fn_P ; state = P(state) call fn_L ; state = L(state) ; K = KeySchedule(K, i) call KeySchedule ; eax=K, i=ecx, safe needed ; AddXor512(state,K,state) mov ebx, esi call AddXor512 ; (state, K, state) inc ecx cmp ecx, 12 jne @b ; } pop ecx ebx ret align 4 AddXor512: ; AddRoundKey X-function. XOR 512-bytes ; +OK EBX EAX ESI push ecx edx xor ecx, ecx align 4 @@: mov edx, dword[ebx + ecx] xor edx, dword[eax + ecx] mov dword[esi + ecx], edx add ecx, 4 cmp ecx, 64 jne @b pop edx ecx ret ; g (N,m,H) align 4 fn_g_N: ; EDI *N, ESI *h, EDX *m ; +OK ; const unsigned char *N,unsigned char *h,const unsigned char *m pushad push esi ; AddXor512(N,h,K) mov ebx, edi ; N mov eax, esi ; h mov esi, fn_g_N_K call AddXor512 ; ebx eax esi mov esi, fn_g_N_K ; call fn_S ; K = S(K) call fn_P ; K = P(K) call fn_L ; K = L(K) ; E(K,m,t) ; t = E(K, m) mov eax, fn_g_N_K ; K mov ebx, edx ; m mov esi, fn_g_N_t ; =t call fn_E ; eax, ebx, esi ; pop esi ; h push esi ; h ; AddXor512(t,h,t) ; t = h xor t mov ebx, fn_g_N_t ; t mov eax, esi ; h mov esi, fn_g_N_t ; t call AddXor512 ; ebx eax esi pop esi ; h ; AddXor512(t,m,h) ; G = t xor m mov ebx, fn_g_N_t ; t mov eax, edx ; m call AddXor512 ; ebx eax esi popad ret ; result = G align 4 AddModulo512: ; eax *a esi *b edi *c ; +OK ; const unsigned char *a,const unsigned char *b,unsigned char *c push ebx ecx edx ; mov ecx, 64 ; int i = 63 xor ebx, ebx ; int t = 0 ; for(i=63;i>=0;i--) ; { align 4 @@: sar ebx, 0x00000008 ; t := t >> 8 movzx edx, byte[eax + ecx -1] ; edx = a[i] add ebx, edx ; t := (t>>8) + a[i] movzx edx, byte[esi + ecx -1] ; edx = b[i] add ebx, edx ; t := (t>>8) + +a[i] + b[i] mov byte[edi + ecx -1], bl ; c[i] = t & 0xFF ; dec ecx or ecx, ecx jnz @b ; } pop edx ecx ebx ret ; L: umnozhenie 64bit vectora vhodnogo na matritsu A(64x64) ; unsigned long long v = 0; ; int i = 0, j = 0, k = 0; ; for(i=0;i<8;i++) { ; v=0; ; for(k=0;k<8;k++) { ; for(j=0;j<8;j++) { ; if ((state[i*8+k] & (1<<(7-j))) != 0) ; v ^= A[k*8+j] ; } ; } ; for(k=0;k<8;k++) ; { ; state[i*8+k] = (v & ((unsigned long long)0xFF << (7-k)*8)) >> (7-k)*8; ; } ;} align 4 fn_L: ; unsigned char *state in ESI ; pushad ; xor ecx, ecx ; int i = 0 xor ebx, ebx ; int j = 0 xor edx, edx ; int k = 0 pxor mm0, mm0 ; ; for(i=0;i<8;i++) { align 4 .next_i: pxor mm0, mm0 ; v = 0 ; ; for(k=0;k<8;k++) { xor edx, edx ; k = 0 align 4 .next_k: ; for(j=0;j<8;j++) { ; if ((state[i*8+k] & (1<<(7-j))) != 0) v ^= A[k*8+j] ; } xor ebx, ebx ; j = 0 align 4 .next_j: mov eax, 0x00000007 ; 7 sub eax, ebx ; 7-j mov edi, 0x00000001 ; 1 ; push ecx mov ecx, eax shl edi, cl ; (1<<(7-j)) == EDI pop ecx ; mov eax, ecx ; i shl eax, 0x00000003 ; i*8 add eax, edx ; (i*8+k) movzx eax, byte[esi + eax] ; state[i*8+k] and eax, edi ; ( state[i*8+k] & (1<<(7-j) ) cmp eax, 0 ; if ((state[i*8+k] & (1<<(7-j))) != 0) v ^= A[k*8+j] ??? jz .next_ji ; == 0 ; v ^= A[k*8+j] ; != 0 mov eax, edx ; k shl eax, 0x00000003 ; k*8 add eax, ebx ; k*8+j shl eax, 0x00000003 ; *8 (point from index to 64bit value (8bytes per value)) add eax, matrix_A ; ^A[k*8+j] movq mm1, qword[eax] ; A[k*8+j] pxor mm0, mm1 ; v ^= A[k*8+j] jmp .next_ji ; } jmp .next_ki ; } .next_k2start: xor edx, edx align 4 .next_k2: mov eax, 0x00000007 ; 7 sub eax, edx ; (7-k) shl eax, 0x00000003 ; (7-k)*8 mov edi, 0x000000FF pxor mm2, mm2 movd mm2, edi ; (unsigned long long)0xFF pxor mm4, mm4 movd mm4, eax psllq mm2, mm4 ; (unsigned long long)0xFF << (7-k)*8 movq mm3, mm0 ; v pand mm3, mm2 ; (v & ((unsigned long long)0xFF << (7-k)*8)) psrlq mm3, mm4 ; (v & ((unsigned long long)0xFF << (7-k)*8)) >> (7-k)*8 movd eax, mm3 mov edi, ecx ; i shl edi, 0x00000003 ; i*8 add edi, edx ; i*8+k add edi, esi ; ^state[i*8+k] mov byte[edi], al ; state[i*8+k] = (v & ((unsigned long long)0xFF << (7-k)*8)) >> (7-k)*8; jmp .next_k2i align 4 .next_ji: inc ebx cmp ebx, 8 jb .next_j jmp .next_ki align 4 .next_ki: inc edx cmp edx, 8 jb .next_k jmp .next_k2start align 4 .next_k2i: inc edx cmp edx, 8 jb .next_k2 jmp .next_ii align 4 .next_ii: inc ecx cmp ecx, 8 jb .next_i jmp .end .end: ; emms popad ret
А вот и данные для кода:
;--------------- GOST 34.11-2012 -----------------------------------------------------------------; ; Matrix A for MixColumns (L) function align 32 matrix_A: dq 0x8e20faa72ba0b470, 0x47107ddd9b505a38, 0xad08b0e0c3282d1c, 0xd8045870ef14980e dq 0x6c022c38f90a4c07, 0x3601161cf205268d, 0x1b8e0b0e798c13c8, 0x83478b07b2468764 ; dq 0xa011d380818e8f40, 0x5086e740ce47c920, 0x2843fd2067adea10, 0x14aff010bdd87508 dq 0x0ad97808d06cb404, 0x05e23c0468365a02, 0x8c711e02341b2d01, 0x46b60f011a83988e ; dq 0x90dab52a387ae76f, 0x486dd4151c3dfdb9, 0x24b86a840e90f0d2, 0x125c354207487869 dq 0x092e94218d243cba, 0x8a174a9ec8121e5d, 0x4585254f64090fa0, 0xaccc9ca9328a8950 ; dq 0x9d4df05d5f661451, 0xc0a878a0a1330aa6, 0x60543c50de970553, 0x302a1e286fc58ca7 dq 0x18150f14b9ec46dd, 0x0c84890ad27623e0, 0x0642ca05693b9f70, 0x0321658cba93c138 ; dq 0x86275df09ce8aaa8, 0x439da0784e745554, 0xafc0503c273aa42a, 0xd960281e9d1d5215 dq 0xe230140fc0802984, 0x71180a8960409a42, 0xb60c05ca30204d21, 0x5b068c651810a89e ; dq 0x456c34887a3805b9, 0xac361a443d1c8cd2, 0x561b0d22900e4669, 0x2b838811480723ba dq 0x9bcf4486248d9f5d, 0xc3e9224312c8c1a0, 0xeffa11af0964ee50, 0xf97d86d98a327728 ; dq 0xe4fa2054a80b329c, 0x727d102a548b194e, 0x39b008152acb8227, 0x9258048415eb419d dq 0x492c024284fbaec0, 0xaa16012142f35760, 0x550b8e9e21f7a530, 0xa48b474f9ef5dc18 ; dq 0x70a6a56e2440598e, 0x3853dc371220a247, 0x1ca76e95091051ad, 0x0edd37c48a08a6d8 dq 0x07e095624504536c, 0x8d70c431ac02a736, 0xc83862965601dd1b, 0x641c314b2b8ee083 ; Substitution for SubBytes function align 32 G12_Sbox: db 0xFC, 0xEE, 0xDD, 0x11, 0xCF, 0x6E, 0x31, 0x16, 0xFB, 0xC4, 0xFA, 0xDA, 0x23, 0xC5, 0x04, 0x4D db 0xE9, 0x77, 0xF0, 0xDB, 0x93, 0x2E, 0x99, 0xBA, 0x17, 0x36, 0xF1, 0xBB, 0x14, 0xCD, 0x5F, 0xC1 db 0xF9, 0x18, 0x65, 0x5A, 0xE2, 0x5C, 0xEF, 0x21, 0x81, 0x1C, 0x3C, 0x42, 0x8B, 0x01, 0x8E, 0x4F db 0x05, 0x84, 0x02, 0xAE, 0xE3, 0x6A, 0x8F, 0xA0, 0x06, 0x0B, 0xED, 0x98, 0x7F, 0xD4, 0xD3, 0x1F db 0xEB, 0x34, 0x2C, 0x51, 0xEA, 0xC8, 0x48, 0xAB, 0xF2, 0x2A, 0x68, 0xA2, 0xFD, 0x3A, 0xCE, 0xCC db 0xB5, 0x70, 0x0E, 0x56, 0x08, 0x0C, 0x76, 0x12, 0xBF, 0x72, 0x13, 0x47, 0x9C, 0xB7, 0x5D, 0x87 db 0x15, 0xA1, 0x96, 0x29, 0x10, 0x7B, 0x9A, 0xC7, 0xF3, 0x91, 0x78, 0x6F, 0x9D, 0x9E, 0xB2, 0xB1 db 0x32, 0x75, 0x19, 0x3D, 0xFF, 0x35, 0x8A, 0x7E, 0x6D, 0x54, 0xC6, 0x80, 0xC3, 0xBD, 0x0D, 0x57 db 0xDF, 0xF5, 0x24, 0xA9, 0x3E, 0xA8, 0x43, 0xC9, 0xD7, 0x79, 0xD6, 0xF6, 0x7C, 0x22, 0xB9, 0x03 db 0xE0, 0x0F, 0xEC, 0xDE, 0x7A, 0x94, 0xB0, 0xBC, 0xDC, 0xE8, 0x28, 0x50, 0x4E, 0x33, 0x0A, 0x4A db 0xA7, 0x97, 0x60, 0x73, 0x1E, 0x00, 0x62, 0x44, 0x1A, 0xB8, 0x38, 0x82, 0x64, 0x9F, 0x26, 0x41 db 0xAD, 0x45, 0x46, 0x92, 0x27, 0x5E, 0x55, 0x2F, 0x8C, 0xA3, 0xA5, 0x7D, 0x69, 0xD5, 0x95, 0x3B db 0x07, 0x58, 0xB3, 0x40, 0x86, 0xAC, 0x1D, 0xF7, 0x30, 0x37, 0x6B, 0xE4, 0x88, 0xD9, 0xE7, 0x89 db 0xE1, 0x1B, 0x83, 0x49, 0x4C, 0x3F, 0xF8, 0xFE, 0x8D, 0x53, 0xAA, 0x90, 0xCA, 0xD8, 0x85, 0x61 db 0x20, 0x71, 0x67, 0xA4, 0x2D, 0x2B, 0x09, 0x5B, 0xCB, 0x9B, 0x25, 0xD0, 0xBE, 0xE5, 0x6C, 0x52 db 0x59, 0xA6, 0x74, 0xD2, 0xE6, 0xF4, 0xB4, 0xC0, 0xD1, 0x66, 0xAF, 0xC2, 0x39, 0x4B, 0x63, 0xB6 ; Substitution for Transposition (P) function align 32 Tau: db 0, 8, 16, 24, 32, 40, 48, 56 db 1, 9, 17, 25, 33, 41, 49, 57 db 2, 10, 18, 26, 34, 42, 50, 58 db 3, 11, 19, 27, 35, 43, 51, 59 db 4, 12, 20, 28, 36, 44, 52, 60 db 5, 13, 21, 29, 37, 45, 53, 61 db 6, 14, 22, 30, 38, 46, 54, 62 db 7, 15, 23, 31, 39, 47, 55, 63 ; Constant values for KeySchedule function [12][64] align 32 const_C: db 0xb1,0x08,0x5b,0xda,0x1e,0xca,0xda,0xe9,0xeb,0xcb,0x2f,0x81,0xc0,0x65,0x7c,0x1f db 0x2f,0x6a,0x76,0x43,0x2e,0x45,0xd0,0x16,0x71,0x4e,0xb8,0x8d,0x75,0x85,0xc4,0xfc db 0x4b,0x7c,0xe0,0x91,0x92,0x67,0x69,0x01,0xa2,0x42,0x2a,0x08,0xa4,0x60,0xd3,0x15 db 0x05,0x76,0x74,0x36,0xcc,0x74,0x4d,0x23,0xdd,0x80,0x65,0x59,0xf2,0xa6,0x45,0x07 ; db 0x6f,0xa3,0xb5,0x8a,0xa9,0x9d,0x2f,0x1a,0x4f,0xe3,0x9d,0x46,0x0f,0x70,0xb5,0xd7 db 0xf3,0xfe,0xea,0x72,0x0a,0x23,0x2b,0x98,0x61,0xd5,0x5e,0x0f,0x16,0xb5,0x01,0x31 db 0x9a,0xb5,0x17,0x6b,0x12,0xd6,0x99,0x58,0x5c,0xb5,0x61,0xc2,0xdb,0x0a,0xa7,0xca db 0x55,0xdd,0xa2,0x1b,0xd7,0xcb,0xcd,0x56,0xe6,0x79,0x04,0x70,0x21,0xb1,0x9b,0xb7 ; db 0xf5,0x74,0xdc,0xac,0x2b,0xce,0x2f,0xc7,0x0a,0x39,0xfc,0x28,0x6a,0x3d,0x84,0x35 db 0x06,0xf1,0x5e,0x5f,0x52,0x9c,0x1f,0x8b,0xf2,0xea,0x75,0x14,0xb1,0x29,0x7b,0x7b db 0xd3,0xe2,0x0f,0xe4,0x90,0x35,0x9e,0xb1,0xc1,0xc9,0x3a,0x37,0x60,0x62,0xdb,0x09 db 0xc2,0xb6,0xf4,0x43,0x86,0x7a,0xdb,0x31,0x99,0x1e,0x96,0xf5,0x0a,0xba,0x0a,0xb2 ; db 0xef,0x1f,0xdf,0xb3,0xe8,0x15,0x66,0xd2,0xf9,0x48,0xe1,0xa0,0x5d,0x71,0xe4,0xdd db 0x48,0x8e,0x85,0x7e,0x33,0x5c,0x3c,0x7d,0x9d,0x72,0x1c,0xad,0x68,0x5e,0x35,0x3f db 0xa9,0xd7,0x2c,0x82,0xed,0x03,0xd6,0x75,0xd8,0xb7,0x13,0x33,0x93,0x52,0x03,0xbe db 0x34,0x53,0xea,0xa1,0x93,0xe8,0x37,0xf1,0x22,0x0c,0xbe,0xbc,0x84,0xe3,0xd1,0x2e ; db 0x4b,0xea,0x6b,0xac,0xad,0x47,0x47,0x99,0x9a,0x3f,0x41,0x0c,0x6c,0xa9,0x23,0x63 db 0x7f,0x15,0x1c,0x1f,0x16,0x86,0x10,0x4a,0x35,0x9e,0x35,0xd7,0x80,0x0f,0xff,0xbd db 0xbf,0xcd,0x17,0x47,0x25,0x3a,0xf5,0xa3,0xdf,0xff,0x00,0xb7,0x23,0x27,0x1a,0x16 db 0x7a,0x56,0xa2,0x7e,0xa9,0xea,0x63,0xf5,0x60,0x17,0x58,0xfd,0x7c,0x6c,0xfe,0x57 ; db 0xae,0x4f,0xae,0xae,0x1d,0x3a,0xd3,0xd9,0x6f,0xa4,0xc3,0x3b,0x7a,0x30,0x39,0xc0 db 0x2d,0x66,0xc4,0xf9,0x51,0x42,0xa4,0x6c,0x18,0x7f,0x9a,0xb4,0x9a,0xf0,0x8e,0xc6 db 0xcf,0xfa,0xa6,0xb7,0x1c,0x9a,0xb7,0xb4,0x0a,0xf2,0x1f,0x66,0xc2,0xbe,0xc6,0xb6 db 0xbf,0x71,0xc5,0x72,0x36,0x90,0x4f,0x35,0xfa,0x68,0x40,0x7a,0x46,0x64,0x7d,0x6e ; db 0xf4,0xc7,0x0e,0x16,0xee,0xaa,0xc5,0xec,0x51,0xac,0x86,0xfe,0xbf,0x24,0x09,0x54 db 0x39,0x9e,0xc6,0xc7,0xe6,0xbf,0x87,0xc9,0xd3,0x47,0x3e,0x33,0x19,0x7a,0x93,0xc9 db 0x09,0x92,0xab,0xc5,0x2d,0x82,0x2c,0x37,0x06,0x47,0x69,0x83,0x28,0x4a,0x05,0x04 db 0x35,0x17,0x45,0x4c,0xa2,0x3c,0x4a,0xf3,0x88,0x86,0x56,0x4d,0x3a,0x14,0xd4,0x93 ; db 0x9b,0x1f,0x5b,0x42,0x4d,0x93,0xc9,0xa7,0x03,0xe7,0xaa,0x02,0x0c,0x6e,0x41,0x41 db 0x4e,0xb7,0xf8,0x71,0x9c,0x36,0xde,0x1e,0x89,0xb4,0x44,0x3b,0x4d,0xdb,0xc4,0x9a db 0xf4,0x89,0x2b,0xcb,0x92,0x9b,0x06,0x90,0x69,0xd1,0x8d,0x2b,0xd1,0xa5,0xc4,0x2f db 0x36,0xac,0xc2,0x35,0x59,0x51,0xa8,0xd9,0xa4,0x7f,0x0d,0xd4,0xbf,0x02,0xe7,0x1e ; db 0x37,0x8f,0x5a,0x54,0x16,0x31,0x22,0x9b,0x94,0x4c,0x9a,0xd8,0xec,0x16,0x5f,0xde db 0x3a,0x7d,0x3a,0x1b,0x25,0x89,0x42,0x24,0x3c,0xd9,0x55,0xb7,0xe0,0x0d,0x09,0x84 db 0x80,0x0a,0x44,0x0b,0xdb,0xb2,0xce,0xb1,0x7b,0x2b,0x8a,0x9a,0xa6,0x07,0x9c,0x54 db 0x0e,0x38,0xdc,0x92,0xcb,0x1f,0x2a,0x60,0x72,0x61,0x44,0x51,0x83,0x23,0x5a,0xdb ; db 0xab,0xbe,0xde,0xa6,0x80,0x05,0x6f,0x52,0x38,0x2a,0xe5,0x48,0xb2,0xe4,0xf3,0xf3 db 0x89,0x41,0xe7,0x1c,0xff,0x8a,0x78,0xdb,0x1f,0xff,0xe1,0x8a,0x1b,0x33,0x61,0x03 db 0x9f,0xe7,0x67,0x02,0xaf,0x69,0x33,0x4b,0x7a,0x1e,0x6c,0x30,0x3b,0x76,0x52,0xf4 db 0x36,0x98,0xfa,0xd1,0x15,0x3b,0xb6,0xc3,0x74,0xb4,0xc7,0xfb,0x98,0x45,0x9c,0xed ; db 0x7b,0xcd,0x9e,0xd0,0xef,0xc8,0x89,0xfb,0x30,0x02,0xc6,0xcd,0x63,0x5a,0xfe,0x94 db 0xd8,0xfa,0x6b,0xbb,0xeb,0xab,0x07,0x61,0x20,0x01,0x80,0x21,0x14,0x84,0x66,0x79 db 0x8a,0x1d,0x71,0xef,0xea,0x48,0xb9,0xca,0xef,0xba,0xcd,0x1d,0x7d,0x47,0x6e,0x98 db 0xde,0xa2,0x59,0x4a,0xc0,0x6f,0xd8,0x5d,0x6b,0xca,0xa4,0xcd,0x81,0xf3,0x2d,0x1b ; db 0x37,0x8e,0xe7,0x67,0xf1,0x16,0x31,0xba,0xd2,0x13,0x80,0xb0,0x04,0x49,0xb1,0x7a db 0xcd,0xa4,0x3c,0x32,0xbc,0xdf,0x1d,0x77,0xf8,0x20,0x12,0xd4,0x30,0x21,0x9f,0x9b db 0x5d,0x80,0xef,0x9d,0x18,0x91,0xcc,0x86,0xe7,0x1d,0xa4,0xaa,0x88,0xe1,0x28,0x52 db 0xfa,0xf4,0x17,0xd5,0xd9,0xb2,0x1b,0x99,0x48,0xbc,0x92,0x4a,0xf1,0x1b,0xd7,0x20 ; ; ; align 32 G12_VARS: fn_P_t db 64 dup 0 fn_g_N_t db 64 dup 0 fn_g_N_K db 64 dup 0 g12_X_m db 64 dup 0 gosth_hash db 64 dup 0 hash_X_v512: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00 hash_X_v0: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 hash_X_Sigma: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 hash_X_N: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 G12_VARS_SZ = $ - G12_VARS ;--------------- end of GOST 34.11-2012 ------------------------------------------------------------;
Автор: omegicus