mirror of https://github.com/hashcat/hashcat.git
* https://github.com/hashcat/hashcat/pull/485 * https://github.com/hashcat/hashcat/pull/486pull/488/head
parent
ff376ce112
commit
4b79ccd416
File diff suppressed because it is too large
Load Diff
@ -1,27 +0,0 @@
|
||||
/**
|
||||
* Author......: Jens Steube <jens.steube@gmail.com>
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#ifndef AES_H
|
||||
#define AES_H
|
||||
|
||||
/* AES context. */
|
||||
typedef struct aes_context
|
||||
{
|
||||
u32 bits;
|
||||
|
||||
u32 rek[60];
|
||||
u32 rdk[60];
|
||||
|
||||
} aes_context_t;
|
||||
|
||||
typedef aes_context_t aes_ctx;
|
||||
|
||||
#define AES_KEY aes_ctx
|
||||
void AES_set_encrypt_key (const u8 *key, int keysize, AES_KEY *aes_key);
|
||||
void AES_set_decrypt_key (const u8 *key, int keysize, AES_KEY *aes_key);
|
||||
void AES_encrypt (AES_KEY *aes_key, const u8 *input, u8 *output);
|
||||
void AES_decrypt (AES_KEY *aes_key, const u8 *input, u8 *output);
|
||||
|
||||
#endif
|
@ -1,2 +0,0 @@
|
||||
void _des_keysetup (u32 data[2], u32 Kc[16], u32 Kd[16], const u32 s_skb[8][64]);
|
||||
void _des_encrypt (u32 data[2], u32 Kc[16], u32 Kd[16], const u32 s_SPtrans[8][64]);
|
@ -1,285 +0,0 @@
|
||||
#define MAGIC_A 0x67452301
|
||||
#define MAGIC_B 0xefcdab89
|
||||
#define MAGIC_C 0x98badcfe
|
||||
#define MAGIC_D 0x10325476
|
||||
|
||||
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
|
||||
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
|
||||
#define H(x, y, z) ((x) ^ (y) ^ (z))
|
||||
#define I(x, y, z) ((y) ^ ((x) | (~z)))
|
||||
|
||||
#define FF(a, b, c, d, x, s, ac) \
|
||||
{(a) += F ((b), (c), (d)) + (x) + (ac); \
|
||||
(a) = rotl32 ((a), (s)); \
|
||||
(a) += (b); \
|
||||
}
|
||||
#define GG(a, b, c, d, x, s, ac) \
|
||||
{(a) += G ((b), (c), (d)) + (x) + (ac); \
|
||||
(a) = rotl32 ((a), (s)); \
|
||||
(a) += (b); \
|
||||
}
|
||||
#define HH(a, b, c, d, x, s, ac) \
|
||||
{(a) += H ((b), (c), (d)) + (x) + (ac); \
|
||||
(a) = rotl32 ((a), (s)); \
|
||||
(a) += (b); \
|
||||
}
|
||||
#define II(a, b, c, d, x, s, ac) \
|
||||
{(a) += I ((b), (c), (d)) + (x) + (ac); \
|
||||
(a) = rotl32 ((a), (s)); \
|
||||
(a) += (b); \
|
||||
}
|
||||
|
||||
#define S11 7
|
||||
#define S12 12
|
||||
#define S13 17
|
||||
#define S14 22
|
||||
#define S21 5
|
||||
#define S22 9
|
||||
#define S23 14
|
||||
#define S24 20
|
||||
#define S31 4
|
||||
#define S32 11
|
||||
#define S33 16
|
||||
#define S34 23
|
||||
#define S41 6
|
||||
#define S42 10
|
||||
#define S43 15
|
||||
#define S44 21
|
||||
|
||||
void md5_64 (uint block[16], uint digest[4])
|
||||
{
|
||||
uint a = digest[0];
|
||||
uint b = digest[1];
|
||||
uint c = digest[2];
|
||||
uint d = digest[3];
|
||||
|
||||
FF ( a, b, c, d, block[ 0], S11, 0xd76aa478);
|
||||
FF ( d, a, b, c, block[ 1], S12, 0xe8c7b756);
|
||||
FF ( c, d, a, b, block[ 2], S13, 0x242070db);
|
||||
FF ( b, c, d, a, block[ 3], S14, 0xc1bdceee);
|
||||
FF ( a, b, c, d, block[ 4], S11, 0xf57c0faf);
|
||||
FF ( d, a, b, c, block[ 5], S12, 0x4787c62a);
|
||||
FF ( c, d, a, b, block[ 6], S13, 0xa8304613);
|
||||
FF ( b, c, d, a, block[ 7], S14, 0xfd469501);
|
||||
FF ( a, b, c, d, block[ 8], S11, 0x698098d8);
|
||||
FF ( d, a, b, c, block[ 9], S12, 0x8b44f7af);
|
||||
FF ( c, d, a, b, block[10], S13, 0xffff5bb1);
|
||||
FF ( b, c, d, a, block[11], S14, 0x895cd7be);
|
||||
FF ( a, b, c, d, block[12], S11, 0x6b901122);
|
||||
FF ( d, a, b, c, block[13], S12, 0xfd987193);
|
||||
FF ( c, d, a, b, block[14], S13, 0xa679438e);
|
||||
FF ( b, c, d, a, block[15], S14, 0x49b40821);
|
||||
|
||||
GG ( a, b, c, d, block[ 1], S21, 0xf61e2562);
|
||||
GG ( d, a, b, c, block[ 6], S22, 0xc040b340);
|
||||
GG ( c, d, a, b, block[11], S23, 0x265e5a51);
|
||||
GG ( b, c, d, a, block[ 0], S24, 0xe9b6c7aa);
|
||||
GG ( a, b, c, d, block[ 5], S21, 0xd62f105d);
|
||||
GG ( d, a, b, c, block[10], S22, 0x02441453);
|
||||
GG ( c, d, a, b, block[15], S23, 0xd8a1e681);
|
||||
GG ( b, c, d, a, block[ 4], S24, 0xe7d3fbc8);
|
||||
GG ( a, b, c, d, block[ 9], S21, 0x21e1cde6);
|
||||
GG ( d, a, b, c, block[14], S22, 0xc33707d6);
|
||||
GG ( c, d, a, b, block[ 3], S23, 0xf4d50d87);
|
||||
GG ( b, c, d, a, block[ 8], S24, 0x455a14ed);
|
||||
GG ( a, b, c, d, block[13], S21, 0xa9e3e905);
|
||||
GG ( d, a, b, c, block[ 2], S22, 0xfcefa3f8);
|
||||
GG ( c, d, a, b, block[ 7], S23, 0x676f02d9);
|
||||
GG ( b, c, d, a, block[12], S24, 0x8d2a4c8a);
|
||||
|
||||
HH ( a, b, c, d, block[ 5], S31, 0xfffa3942);
|
||||
HH ( d, a, b, c, block[ 8], S32, 0x8771f681);
|
||||
HH ( c, d, a, b, block[11], S33, 0x6d9d6122);
|
||||
HH ( b, c, d, a, block[14], S34, 0xfde5380c);
|
||||
HH ( a, b, c, d, block[ 1], S31, 0xa4beea44);
|
||||
HH ( d, a, b, c, block[ 4], S32, 0x4bdecfa9);
|
||||
HH ( c, d, a, b, block[ 7], S33, 0xf6bb4b60);
|
||||
HH ( b, c, d, a, block[10], S34, 0xbebfbc70);
|
||||
HH ( a, b, c, d, block[13], S31, 0x289b7ec6);
|
||||
HH ( d, a, b, c, block[ 0], S32, 0xeaa127fa);
|
||||
HH ( c, d, a, b, block[ 3], S33, 0xd4ef3085);
|
||||
HH ( b, c, d, a, block[ 6], S34, 0x04881d05);
|
||||
HH ( a, b, c, d, block[ 9], S31, 0xd9d4d039);
|
||||
HH ( d, a, b, c, block[12], S32, 0xe6db99e5);
|
||||
HH ( c, d, a, b, block[15], S33, 0x1fa27cf8);
|
||||
HH ( b, c, d, a, block[ 2], S34, 0xc4ac5665);
|
||||
|
||||
II ( a, b, c, d, block[ 0], S41, 0xf4292244);
|
||||
II ( d, a, b, c, block[ 7], S42, 0x432aff97);
|
||||
II ( c, d, a, b, block[14], S43, 0xab9423a7);
|
||||
II ( b, c, d, a, block[ 5], S44, 0xfc93a039);
|
||||
II ( a, b, c, d, block[12], S41, 0x655b59c3);
|
||||
II ( d, a, b, c, block[ 3], S42, 0x8f0ccc92);
|
||||
II ( c, d, a, b, block[10], S43, 0xffeff47d);
|
||||
II ( b, c, d, a, block[ 1], S44, 0x85845dd1);
|
||||
II ( a, b, c, d, block[ 8], S41, 0x6fa87e4f);
|
||||
II ( d, a, b, c, block[15], S42, 0xfe2ce6e0);
|
||||
II ( c, d, a, b, block[ 6], S43, 0xa3014314);
|
||||
II ( b, c, d, a, block[13], S44, 0x4e0811a1);
|
||||
II ( a, b, c, d, block[ 4], S41, 0xf7537e82);
|
||||
II ( d, a, b, c, block[11], S42, 0xbd3af235);
|
||||
II ( c, d, a, b, block[ 2], S43, 0x2ad7d2bb);
|
||||
II ( b, c, d, a, block[ 9], S44, 0xeb86d391);
|
||||
|
||||
digest[0] += a;
|
||||
digest[1] += b;
|
||||
digest[2] += c;
|
||||
digest[3] += d;
|
||||
}
|
||||
|
||||
// only use this when really, really needed, SLOW
|
||||
|
||||
void md5_complete_no_limit (uint digest[4], uint *plain, uint plain_len)
|
||||
{
|
||||
uint a = MAGIC_A;
|
||||
uint b = MAGIC_B;
|
||||
uint c = MAGIC_C;
|
||||
uint d = MAGIC_D;
|
||||
|
||||
digest[0] = a;
|
||||
digest[1] = b;
|
||||
digest[2] = c;
|
||||
digest[3] = d;
|
||||
|
||||
uint r_a = digest[0];
|
||||
uint r_b = digest[1];
|
||||
uint r_c = digest[2];
|
||||
uint r_d = digest[3];
|
||||
|
||||
uint block[16];
|
||||
int block_total_len = 16 * 4; // sizeof (block)
|
||||
|
||||
char *block_ptr = (char *) block;
|
||||
char *plain_ptr = (char *) plain;
|
||||
|
||||
// init
|
||||
|
||||
int remaining_len = plain_len;
|
||||
|
||||
// loop
|
||||
|
||||
uint loop = 1;
|
||||
|
||||
while (loop)
|
||||
{
|
||||
loop = (remaining_len > 55);
|
||||
|
||||
int cur_len = MIN (block_total_len, remaining_len);
|
||||
int copy_len = MAX (cur_len, 0); // should never be negative of course
|
||||
|
||||
memcpy (block_ptr, plain_ptr, copy_len);
|
||||
|
||||
// clear the remaining bytes of the block
|
||||
|
||||
memset (block_ptr + copy_len, 0, block_total_len - copy_len);
|
||||
|
||||
/*
|
||||
* final block
|
||||
*/
|
||||
|
||||
// set 0x80 if neeeded
|
||||
|
||||
if (cur_len >= 0)
|
||||
{
|
||||
if (cur_len != block_total_len)
|
||||
{
|
||||
block_ptr[copy_len] = 0x80;
|
||||
}
|
||||
}
|
||||
|
||||
// set block[14] set to total_len
|
||||
|
||||
if (! loop) block[14] = plain_len * 8;
|
||||
|
||||
/*
|
||||
* md5 ()
|
||||
*/
|
||||
|
||||
FF ( a, b, c, d, block[ 0], S11, 0xd76aa478);
|
||||
FF ( d, a, b, c, block[ 1], S12, 0xe8c7b756);
|
||||
FF ( c, d, a, b, block[ 2], S13, 0x242070db);
|
||||
FF ( b, c, d, a, block[ 3], S14, 0xc1bdceee);
|
||||
FF ( a, b, c, d, block[ 4], S11, 0xf57c0faf);
|
||||
FF ( d, a, b, c, block[ 5], S12, 0x4787c62a);
|
||||
FF ( c, d, a, b, block[ 6], S13, 0xa8304613);
|
||||
FF ( b, c, d, a, block[ 7], S14, 0xfd469501);
|
||||
FF ( a, b, c, d, block[ 8], S11, 0x698098d8);
|
||||
FF ( d, a, b, c, block[ 9], S12, 0x8b44f7af);
|
||||
FF ( c, d, a, b, block[10], S13, 0xffff5bb1);
|
||||
FF ( b, c, d, a, block[11], S14, 0x895cd7be);
|
||||
FF ( a, b, c, d, block[12], S11, 0x6b901122);
|
||||
FF ( d, a, b, c, block[13], S12, 0xfd987193);
|
||||
FF ( c, d, a, b, block[14], S13, 0xa679438e);
|
||||
FF ( b, c, d, a, block[15], S14, 0x49b40821);
|
||||
|
||||
GG ( a, b, c, d, block[ 1], S21, 0xf61e2562);
|
||||
GG ( d, a, b, c, block[ 6], S22, 0xc040b340);
|
||||
GG ( c, d, a, b, block[11], S23, 0x265e5a51);
|
||||
GG ( b, c, d, a, block[ 0], S24, 0xe9b6c7aa);
|
||||
GG ( a, b, c, d, block[ 5], S21, 0xd62f105d);
|
||||
GG ( d, a, b, c, block[10], S22, 0x02441453);
|
||||
GG ( c, d, a, b, block[15], S23, 0xd8a1e681);
|
||||
GG ( b, c, d, a, block[ 4], S24, 0xe7d3fbc8);
|
||||
GG ( a, b, c, d, block[ 9], S21, 0x21e1cde6);
|
||||
GG ( d, a, b, c, block[14], S22, 0xc33707d6);
|
||||
GG ( c, d, a, b, block[ 3], S23, 0xf4d50d87);
|
||||
GG ( b, c, d, a, block[ 8], S24, 0x455a14ed);
|
||||
GG ( a, b, c, d, block[13], S21, 0xa9e3e905);
|
||||
GG ( d, a, b, c, block[ 2], S22, 0xfcefa3f8);
|
||||
GG ( c, d, a, b, block[ 7], S23, 0x676f02d9);
|
||||
GG ( b, c, d, a, block[12], S24, 0x8d2a4c8a);
|
||||
|
||||
HH ( a, b, c, d, block[ 5], S31, 0xfffa3942);
|
||||
HH ( d, a, b, c, block[ 8], S32, 0x8771f681);
|
||||
HH ( c, d, a, b, block[11], S33, 0x6d9d6122);
|
||||
HH ( b, c, d, a, block[14], S34, 0xfde5380c);
|
||||
HH ( a, b, c, d, block[ 1], S31, 0xa4beea44);
|
||||
HH ( d, a, b, c, block[ 4], S32, 0x4bdecfa9);
|
||||
HH ( c, d, a, b, block[ 7], S33, 0xf6bb4b60);
|
||||
HH ( b, c, d, a, block[10], S34, 0xbebfbc70);
|
||||
HH ( a, b, c, d, block[13], S31, 0x289b7ec6);
|
||||
HH ( d, a, b, c, block[ 0], S32, 0xeaa127fa);
|
||||
HH ( c, d, a, b, block[ 3], S33, 0xd4ef3085);
|
||||
HH ( b, c, d, a, block[ 6], S34, 0x04881d05);
|
||||
HH ( a, b, c, d, block[ 9], S31, 0xd9d4d039);
|
||||
HH ( d, a, b, c, block[12], S32, 0xe6db99e5);
|
||||
HH ( c, d, a, b, block[15], S33, 0x1fa27cf8);
|
||||
HH ( b, c, d, a, block[ 2], S34, 0xc4ac5665);
|
||||
|
||||
II ( a, b, c, d, block[ 0], S41, 0xf4292244);
|
||||
II ( d, a, b, c, block[ 7], S42, 0x432aff97);
|
||||
II ( c, d, a, b, block[14], S43, 0xab9423a7);
|
||||
II ( b, c, d, a, block[ 5], S44, 0xfc93a039);
|
||||
II ( a, b, c, d, block[12], S41, 0x655b59c3);
|
||||
II ( d, a, b, c, block[ 3], S42, 0x8f0ccc92);
|
||||
II ( c, d, a, b, block[10], S43, 0xffeff47d);
|
||||
II ( b, c, d, a, block[ 1], S44, 0x85845dd1);
|
||||
II ( a, b, c, d, block[ 8], S41, 0x6fa87e4f);
|
||||
II ( d, a, b, c, block[15], S42, 0xfe2ce6e0);
|
||||
II ( c, d, a, b, block[ 6], S43, 0xa3014314);
|
||||
II ( b, c, d, a, block[13], S44, 0x4e0811a1);
|
||||
II ( a, b, c, d, block[ 4], S41, 0xf7537e82);
|
||||
II ( d, a, b, c, block[11], S42, 0xbd3af235);
|
||||
II ( c, d, a, b, block[ 2], S43, 0x2ad7d2bb);
|
||||
II ( b, c, d, a, block[ 9], S44, 0xeb86d391);
|
||||
|
||||
remaining_len -= block_total_len;
|
||||
|
||||
plain_ptr += 64;
|
||||
|
||||
a += r_a;
|
||||
b += r_b;
|
||||
c += r_c;
|
||||
d += r_d;
|
||||
|
||||
digest[0] = a;
|
||||
digest[1] = b;
|
||||
digest[2] = c;
|
||||
digest[3] = d;
|
||||
|
||||
r_a = digest[0];
|
||||
r_b = digest[1];
|
||||
r_c = digest[2];
|
||||
r_d = digest[3];
|
||||
}
|
||||
}
|
@ -1 +0,0 @@
|
||||
void sha1_64 (uint block[16], uint digest[5]);
|
@ -1 +0,0 @@
|
||||
void sha256_64 (uint block[16], uint digest[8]);
|
@ -1,2 +1,9 @@
|
||||
/**
|
||||
* Author......: Jens Steube <jens.steube@gmail.com>
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
void md5_64 (uint block[16], uint digest[4]);
|
||||
void md5_complete_no_limit (uint digest[4], uint *plain, uint plain_len);
|
@ -0,0 +1,8 @@
|
||||
/**
|
||||
* Author......: Jens Steube <jens.steube@gmail.com>
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
void sha1_64 (uint block[16], uint digest[5]);
|
@ -0,0 +1,8 @@
|
||||
/**
|
||||
* Author......: Jens Steube <jens.steube@gmail.com>
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
void sha256_64 (uint block[16], uint digest[8]);
|
@ -0,0 +1,69 @@
|
||||
/**
|
||||
* Author......: Jens Steube <jens.steube@gmail.com>
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef _POSIX
|
||||
#include <dlfcn.h>
|
||||
#ifdef __APPLE__
|
||||
#include <mach-o/dyld.h>
|
||||
#endif // __APPLE__
|
||||
#endif // _POSIX
|
||||
|
||||
#ifdef _WIN
|
||||
#include <windows.h>
|
||||
#endif // _WIN
|
||||
|
||||
#ifdef _WIN
|
||||
#define hc_dlopen LoadLibrary
|
||||
#define hc_dlclose FreeLibrary
|
||||
#define hc_dlsym GetProcAddress
|
||||
#else
|
||||
#define hc_dlopen dlopen
|
||||
#define hc_dlclose dlclose
|
||||
#define hc_dlsym dlsym
|
||||
#endif
|
||||
|
||||
#define HC_LOAD_FUNC2(ptr,name,type,var,libname,noerr) \
|
||||
ptr->name = (type) hc_dlsym (ptr->var, #name); \
|
||||
if (noerr != -1) { \
|
||||
if (!ptr->name) { \
|
||||
if (noerr == 1) { \
|
||||
log_error ("ERROR: %s is missing from %s shared library.", #name, #libname); \
|
||||
exit (-1); \
|
||||
} else { \
|
||||
log_info ("WARNING: %s is missing from %s shared library.", #name, #libname); \
|
||||
return -1; \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
||||
#define HC_LOAD_FUNC(ptr,name,type,libname,noerr) \
|
||||
ptr->name = (type) hc_dlsym (ptr->lib, #name); \
|
||||
if (noerr != -1) { \
|
||||
if (!ptr->name) { \
|
||||
if (noerr == 1) { \
|
||||
log_error ("ERROR: %s is missing from %s shared library.", #name, #libname); \
|
||||
exit (-1); \
|
||||
} else { \
|
||||
log_info ("WARNING: %s is missing from %s shared library.", #name, #libname); \
|
||||
return -1; \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
||||
#define HC_LOAD_ADDR(ptr,name,type,func,addr,libname,noerr) \
|
||||
ptr->name = (type) (*ptr->func) (addr); \
|
||||
if (!ptr->name) { \
|
||||
if (noerr == 1) { \
|
||||
log_error ("ERROR: %s at address %08x is missing from %s shared library.", #name, addr, #libname); \
|
||||
exit (-1); \
|
||||
} else { \
|
||||
log_error ("WARNING: %s at address %08x is missing from %s shared library.", #name, addr, #libname); \
|
||||
return -1; \
|
||||
} \
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Author......: Jens Steube <jens.steube@gmail.com>
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
int log_out_nn (FILE *fp, const char *fmt, ...);
|
||||
int log_info_nn (const char *fmt, ...);
|
||||
int log_error_nn (const char *fmt, ...);
|
||||
|
||||
int log_out (FILE *fp, const char *fmt, ...);
|
||||
int log_info (const char *fmt, ...);
|
||||
int log_error (const char *fmt, ...);
|
@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Author......: Jens Steube <jens.steube@gmail.com>
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define MSG_ENOMEM "Insufficient memory available"
|
||||
|
||||
void *mycalloc (size_t nmemb, size_t size);
|
||||
void myfree (void *ptr);
|
||||
void *mymalloc (size_t size);
|
||||
void *myrealloc (void *ptr, size_t oldsz, size_t add);
|
||||
char *mystrdup (const char *s);
|
@ -0,0 +1,46 @@
|
||||
/**
|
||||
* Authors.....: Jens Steube <jens.steube@gmail.com>
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifdef _POSIX
|
||||
#include <pthread.h>
|
||||
#include <semaphore.h>
|
||||
#endif // _POSIX
|
||||
#ifdef _WIN
|
||||
#include <windows.h>
|
||||
#endif // _WIN
|
||||
|
||||
#ifdef _WIN
|
||||
typedef HANDLE hc_thread_t;
|
||||
typedef CRITICAL_SECTION hc_thread_mutex_t;
|
||||
#elif _POSIX
|
||||
typedef pthread_t hc_thread_t;
|
||||
typedef pthread_mutex_t hc_thread_mutex_t;
|
||||
#endif
|
||||
|
||||
#ifdef _WIN
|
||||
|
||||
#define hc_thread_create(t,f,a) t = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) &f, a, 0, NULL)
|
||||
#define hc_thread_wait(n,a) for (uint i = 0; i < n; i++) WaitForSingleObject ((a)[i], INFINITE)
|
||||
#define hc_thread_exit(t) ExitThread (t)
|
||||
|
||||
#define hc_thread_mutex_lock(m) EnterCriticalSection (&m)
|
||||
#define hc_thread_mutex_unlock(m) LeaveCriticalSection (&m)
|
||||
#define hc_thread_mutex_init(m) InitializeCriticalSection (&m)
|
||||
#define hc_thread_mutex_delete(m) DeleteCriticalSection (&m)
|
||||
|
||||
#elif _POSIX
|
||||
|
||||
#define hc_thread_create(t,f,a) pthread_create (&t, NULL, f, a)
|
||||
#define hc_thread_wait(n,a) for (uint i = 0; i < n; i++) pthread_join ((a)[i], NULL)
|
||||
#define hc_thread_exit(t) pthread_exit (&t)
|
||||
|
||||
#define hc_thread_mutex_lock(m) pthread_mutex_lock (&m)
|
||||
#define hc_thread_mutex_unlock(m) pthread_mutex_unlock (&m)
|
||||
#define hc_thread_mutex_init(m) pthread_mutex_init (&m, NULL)
|
||||
#define hc_thread_mutex_delete(m) pthread_mutex_destroy (&m)
|
||||
|
||||
#endif
|
@ -0,0 +1,29 @@
|
||||
/**
|
||||
* Authors.....: Jens Steube <jens.steube@gmail.com>
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifdef _POSIX
|
||||
#include <sys/time.h>
|
||||
#else
|
||||
#endif
|
||||
|
||||
#ifdef _WIN
|
||||
typedef LARGE_INTEGER hc_timer_t;
|
||||
#elif _POSIX
|
||||
typedef struct timeval hc_timer_t;
|
||||
#endif
|
||||
|
||||
#ifdef _WIN
|
||||
|
||||
#define hc_timer_get(a,r) { hc_timer_t hr_freq; QueryPerformanceFrequency (&hr_freq); hc_timer_t hr_tmp; hc_timer_set (&hr_tmp); (r) = (double) ((double) (hr_tmp.QuadPart - (a).QuadPart) / (double) (hr_freq.QuadPart / 1000)); }
|
||||
#define hc_timer_set(a) { QueryPerformanceCounter ((a)); }
|
||||
|
||||
#elif _POSIX
|
||||
|
||||
#define hc_timer_get(a,r) { hc_timer_t hr_tmp; hc_timer_set (&hr_tmp); (r) = (double) (((hr_tmp.tv_sec - (a).tv_sec) * 1000) + ((double) (hr_tmp.tv_usec - (a).tv_usec) / 1000)); }
|
||||
#define hc_timer_set(a) { gettimeofday ((a), NULL); }
|
||||
|
||||
#endif
|
@ -0,0 +1,31 @@
|
||||
/**
|
||||
* Authors.....: Jens Steube <jens.steube@gmail.com>
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifdef _WIN
|
||||
#include <windows.h>
|
||||
#ifdef _BASETSD_H
|
||||
#else
|
||||
typedef UINT8 uint8_t;
|
||||
typedef UINT16 uint16_t;
|
||||
typedef UINT32 uint32_t;
|
||||
typedef UINT64 uint64_t;
|
||||
typedef INT8 int8_t;
|
||||
typedef INT16 int16_t;
|
||||
typedef INT32 int32_t;
|
||||
typedef INT64 int64_t;
|
||||
#endif
|
||||
#endif // _WIN
|
||||
|
||||
typedef uint8_t u8;
|
||||
typedef uint16_t u16;
|
||||
typedef uint32_t u32;
|
||||
typedef uint64_t u64;
|
||||
|
||||
typedef uint32_t uint; // we need to get rid of this sooner or later, for consistency
|
@ -0,0 +1,631 @@
|
||||
/**
|
||||
* Author......: Jens Steube <jens.steube@gmail.com>
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#define IS_GENERIC
|
||||
|
||||
#include "common.h"
|
||||
#include "types_int.h"
|
||||
#include "bitops.h"
|
||||
#include "inc_hash_constants.h"
|
||||
#include "inc_hash_functions.cl"
|
||||
#include "cpu_aes.h"
|
||||
|
||||
// 128 bit
|
||||
|
||||
static void AES128_ExpandKey (const u32 *userkey, u32 *rek)
|
||||
{
|
||||
u32 userkey_s[4];
|
||||
|
||||
userkey_s[0] = byte_swap_32 (userkey[0]);
|
||||
userkey_s[1] = byte_swap_32 (userkey[1]);
|
||||
userkey_s[2] = byte_swap_32 (userkey[2]);
|
||||
userkey_s[3] = byte_swap_32 (userkey[3]);
|
||||
|
||||
rek[0] = userkey_s[0];
|
||||
rek[1] = userkey_s[1];
|
||||
rek[2] = userkey_s[2];
|
||||
rek[3] = userkey_s[3];
|
||||
|
||||
int i;
|
||||
int j;
|
||||
|
||||
for (i = 0, j = 0; i < 10; i += 1, j += 4)
|
||||
{
|
||||
u32 temp = rek[j + 3];
|
||||
|
||||
temp = (te2[(temp >> 16) & 0xff] & 0xff000000)
|
||||
^ (te3[(temp >> 8) & 0xff] & 0x00ff0000)
|
||||
^ (te0[(temp >> 0) & 0xff] & 0x0000ff00)
|
||||
^ (te1[(temp >> 24) & 0xff] & 0x000000ff);
|
||||
|
||||
rek[j + 4] = rek[j + 0]
|
||||
^ temp
|
||||
^ rcon[i];
|
||||
|
||||
rek[j + 5] = rek[j + 1] ^ rek[j + 4];
|
||||
rek[j + 6] = rek[j + 2] ^ rek[j + 5];
|
||||
rek[j + 7] = rek[j + 3] ^ rek[j + 6];
|
||||
}
|
||||
}
|
||||
|
||||
static void AES128_InvertKey (u32 *rdk)
|
||||
{
|
||||
int i;
|
||||
int j;
|
||||
|
||||
for (i = 0, j = 40; i < j; i += 4, j -= 4)
|
||||
{
|
||||
u32 temp;
|
||||
|
||||
temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp;
|
||||
temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp;
|
||||
temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp;
|
||||
temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp;
|
||||
}
|
||||
|
||||
for (i = 1, j = 4; i < 10; i += 1, j += 4)
|
||||
{
|
||||
rdk[j + 0] =
|
||||
td0[te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^
|
||||
td1[te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^
|
||||
td2[te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^
|
||||
td3[te1[(rdk[j + 0] >> 0) & 0xff] & 0xff];
|
||||
|
||||
rdk[j + 1] =
|
||||
td0[te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^
|
||||
td1[te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^
|
||||
td2[te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^
|
||||
td3[te1[(rdk[j + 1] >> 0) & 0xff] & 0xff];
|
||||
|
||||
rdk[j + 2] =
|
||||
td0[te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^
|
||||
td1[te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^
|
||||
td2[te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^
|
||||
td3[te1[(rdk[j + 2] >> 0) & 0xff] & 0xff];
|
||||
|
||||
rdk[j + 3] =
|
||||
td0[te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^
|
||||
td1[te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^
|
||||
td2[te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^
|
||||
td3[te1[(rdk[j + 3] >> 0) & 0xff] & 0xff];
|
||||
}
|
||||
}
|
||||
|
||||
static void AES128_encrypt (const u32 *in, u32 *out, const u32 *rek)
|
||||
{
|
||||
u32 in_s[4];
|
||||
|
||||
in_s[0] = byte_swap_32 (in[0]);
|
||||
in_s[1] = byte_swap_32 (in[1]);
|
||||
in_s[2] = byte_swap_32 (in[2]);
|
||||
in_s[3] = byte_swap_32 (in[3]);
|
||||
|
||||
u32 s0 = in_s[0] ^ rek[0];
|
||||
u32 s1 = in_s[1] ^ rek[1];
|
||||
u32 s2 = in_s[2] ^ rek[2];
|
||||
u32 s3 = in_s[3] ^ rek[3];
|
||||
|
||||
u32 t0;
|
||||
u32 t1;
|
||||
u32 t2;
|
||||
u32 t3;
|
||||
|
||||
t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ rek[ 4];
|
||||
t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ rek[ 5];
|
||||
t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ rek[ 6];
|
||||
t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ rek[ 7];
|
||||
s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ rek[ 8];
|
||||
s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ rek[ 9];
|
||||
s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ rek[10];
|
||||
s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ rek[11];
|
||||
t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ rek[12];
|
||||
t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ rek[13];
|
||||
t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ rek[14];
|
||||
t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ rek[15];
|
||||
s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ rek[16];
|
||||
s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ rek[17];
|
||||
s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ rek[18];
|
||||
s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ rek[19];
|
||||
t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ rek[20];
|
||||
t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ rek[21];
|
||||
t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ rek[22];
|
||||
t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ rek[23];
|
||||
s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ rek[24];
|
||||
s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ rek[25];
|
||||
s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ rek[26];
|
||||
s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ rek[27];
|
||||
t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ rek[28];
|
||||
t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ rek[29];
|
||||
t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ rek[30];
|
||||
t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ rek[31];
|
||||
s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ rek[32];
|
||||
s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ rek[33];
|
||||
s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ rek[34];
|
||||
s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ rek[35];
|
||||
t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ rek[36];
|
||||
t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ rek[37];
|
||||
t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ rek[38];
|
||||
t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ rek[39];
|
||||
|
||||
out[0] = (te4[(t0 >> 24) & 0xff] & 0xff000000)
|
||||
^ (te4[(t1 >> 16) & 0xff] & 0x00ff0000)
|
||||
^ (te4[(t2 >> 8) & 0xff] & 0x0000ff00)
|
||||
^ (te4[(t3 >> 0) & 0xff] & 0x000000ff)
|
||||
^ rek[40];
|
||||
|
||||
out[1] = (te4[(t1 >> 24) & 0xff] & 0xff000000)
|
||||
^ (te4[(t2 >> 16) & 0xff] & 0x00ff0000)
|
||||
^ (te4[(t3 >> 8) & 0xff] & 0x0000ff00)
|
||||
^ (te4[(t0 >> 0) & 0xff] & 0x000000ff)
|
||||
^ rek[41];
|
||||
|
||||
out[2] = (te4[(t2 >> 24) & 0xff] & 0xff000000)
|
||||
^ (te4[(t3 >> 16) & 0xff] & 0x00ff0000)
|
||||
^ (te4[(t0 >> 8) & 0xff] & 0x0000ff00)
|
||||
^ (te4[(t1 >> 0) & 0xff] & 0x000000ff)
|
||||
^ rek[42];
|
||||
|
||||
out[3] = (te4[(t3 >> 24) & 0xff] & 0xff000000)
|
||||
^ (te4[(t0 >> 16) & 0xff] & 0x00ff0000)
|
||||
^ (te4[(t1 >> 8) & 0xff] & 0x0000ff00)
|
||||
^ (te4[(t2 >> 0) & 0xff] & 0x000000ff)
|
||||
^ rek[43];
|
||||
|
||||
out[0] = byte_swap_32 (out[0]);
|
||||
out[1] = byte_swap_32 (out[1]);
|
||||
out[2] = byte_swap_32 (out[2]);
|
||||
out[3] = byte_swap_32 (out[3]);
|
||||
}
|
||||
|
||||
static void AES128_decrypt (const u32 *in, u32 *out, const u32 *rdk)
|
||||
{
|
||||
u32 in_s[4];
|
||||
|
||||
in_s[0] = byte_swap_32 (in[0]);
|
||||
in_s[1] = byte_swap_32 (in[1]);
|
||||
in_s[2] = byte_swap_32 (in[2]);
|
||||
in_s[3] = byte_swap_32 (in[3]);
|
||||
|
||||
u32 s0 = in_s[0] ^ rdk[0];
|
||||
u32 s1 = in_s[1] ^ rdk[1];
|
||||
u32 s2 = in_s[2] ^ rdk[2];
|
||||
u32 s3 = in_s[3] ^ rdk[3];
|
||||
|
||||
u32 t0;
|
||||
u32 t1;
|
||||
u32 t2;
|
||||
u32 t3;
|
||||
|
||||
t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ rdk[ 4];
|
||||
t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ rdk[ 5];
|
||||
t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ rdk[ 6];
|
||||
t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ rdk[ 7];
|
||||
s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ rdk[ 8];
|
||||
s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ rdk[ 9];
|
||||
s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ rdk[10];
|
||||
s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ rdk[11];
|
||||
t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ rdk[12];
|
||||
t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ rdk[13];
|
||||
t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ rdk[14];
|
||||
t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ rdk[15];
|
||||
s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ rdk[16];
|
||||
s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ rdk[17];
|
||||
s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ rdk[18];
|
||||
s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ rdk[19];
|
||||
t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ rdk[20];
|
||||
t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ rdk[21];
|
||||
t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ rdk[22];
|
||||
t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ rdk[23];
|
||||
s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ rdk[24];
|
||||
s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ rdk[25];
|
||||
s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ rdk[26];
|
||||
s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ rdk[27];
|
||||
t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ rdk[28];
|
||||
t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ rdk[29];
|
||||
t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ rdk[30];
|
||||
t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ rdk[31];
|
||||
s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ rdk[32];
|
||||
s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ rdk[33];
|
||||
s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ rdk[34];
|
||||
s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ rdk[35];
|
||||
t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ rdk[36];
|
||||
t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ rdk[37];
|
||||
t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ rdk[38];
|
||||
t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ rdk[39];
|
||||
|
||||
out[0] = (td4[(t0 >> 24) & 0xff] & 0xff000000)
|
||||
^ (td4[(t3 >> 16) & 0xff] & 0x00ff0000)
|
||||
^ (td4[(t2 >> 8) & 0xff] & 0x0000ff00)
|
||||
^ (td4[(t1 >> 0) & 0xff] & 0x000000ff)
|
||||
^ rdk[40];
|
||||
|
||||
out[1] = (td4[(t1 >> 24) & 0xff] & 0xff000000)
|
||||
^ (td4[(t0 >> 16) & 0xff] & 0x00ff0000)
|
||||
^ (td4[(t3 >> 8) & 0xff] & 0x0000ff00)
|
||||
^ (td4[(t2 >> 0) & 0xff] & 0x000000ff)
|
||||
^ rdk[41];
|
||||
|
||||
out[2] = (td4[(t2 >> 24) & 0xff] & 0xff000000)
|
||||
^ (td4[(t1 >> 16) & 0xff] & 0x00ff0000)
|
||||
^ (td4[(t0 >> 8) & 0xff] & 0x0000ff00)
|
||||
^ (td4[(t3 >> 0) & 0xff] & 0x000000ff)
|
||||
^ rdk[42];
|
||||
|
||||
out[3] = (td4[(t3 >> 24) & 0xff] & 0xff000000)
|
||||
^ (td4[(t2 >> 16) & 0xff] & 0x00ff0000)
|
||||
^ (td4[(t1 >> 8) & 0xff] & 0x0000ff00)
|
||||
^ (td4[(t0 >> 0) & 0xff] & 0x000000ff)
|
||||
^ rdk[43];
|
||||
|
||||
out[0] = byte_swap_32 (out[0]);
|
||||
out[1] = byte_swap_32 (out[1]);
|
||||
out[2] = byte_swap_32 (out[2]);
|
||||
out[3] = byte_swap_32 (out[3]);
|
||||
}
|
||||
|
||||
// 256 bit
|
||||
|
||||
static void AES256_ExpandKey (const u32 *userkey, u32 *rek)
|
||||
{
|
||||
u32 userkey_s[8];
|
||||
|
||||
userkey_s[0] = byte_swap_32 (userkey[0]);
|
||||
userkey_s[1] = byte_swap_32 (userkey[1]);
|
||||
userkey_s[2] = byte_swap_32 (userkey[2]);
|
||||
userkey_s[3] = byte_swap_32 (userkey[3]);
|
||||
userkey_s[4] = byte_swap_32 (userkey[4]);
|
||||
userkey_s[5] = byte_swap_32 (userkey[5]);
|
||||
userkey_s[6] = byte_swap_32 (userkey[6]);
|
||||
userkey_s[7] = byte_swap_32 (userkey[7]);
|
||||
|
||||
rek[0] = userkey_s[0];
|
||||
rek[1] = userkey_s[1];
|
||||
rek[2] = userkey_s[2];
|
||||
rek[3] = userkey_s[3];
|
||||
rek[4] = userkey_s[4];
|
||||
rek[5] = userkey_s[5];
|
||||
rek[6] = userkey_s[6];
|
||||
rek[7] = userkey_s[7];
|
||||
|
||||
int i;
|
||||
int j;
|
||||
|
||||
i = 0;
|
||||
j = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
u32 temp = rek[j + 7];
|
||||
|
||||
rek[j + 8] = rek[j + 0]
|
||||
^ (te2[(temp >> 16) & 0xff] & 0xff000000)
|
||||
^ (te3[(temp >> 8) & 0xff] & 0x00ff0000)
|
||||
^ (te0[(temp >> 0) & 0xff] & 0x0000ff00)
|
||||
^ (te1[(temp >> 24) & 0xff] & 0x000000ff)
|
||||
^ rcon[i];
|
||||
|
||||
rek[j + 9] = rek[j + 1] ^ rek[j + 8];
|
||||
rek[j + 10] = rek[j + 2] ^ rek[j + 9];
|
||||
rek[j + 11] = rek[j + 3] ^ rek[j + 10];
|
||||
|
||||
if (++i == 7) break;
|
||||
|
||||
temp = rek[j + 11];
|
||||
|
||||
rek[j + 12] = rek[j + 4]
|
||||
^ (te2[(temp >> 24) & 0xff] & 0xff000000)
|
||||
^ (te3[(temp >> 16) & 0xff] & 0x00ff0000)
|
||||
^ (te0[(temp >> 8) & 0xff] & 0x0000ff00)
|
||||
^ (te1[(temp >> 0) & 0xff] & 0x000000ff);
|
||||
|
||||
rek[j + 13] = rek[j + 5] ^ rek[j + 12];
|
||||
rek[j + 14] = rek[j + 6] ^ rek[j + 13];
|
||||
rek[j + 15] = rek[j + 7] ^ rek[j + 14];
|
||||
|
||||
j += 8;
|
||||
}
|
||||
}
|
||||
|
||||
static void AES256_InvertKey (u32 *rdk)
|
||||
{
|
||||
for (u32 i = 0, j = 56; i < j; i += 4, j -= 4)
|
||||
{
|
||||
u32 temp;
|
||||
|
||||
temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp;
|
||||
temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp;
|
||||
temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp;
|
||||
temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp;
|
||||
}
|
||||
|
||||
for (u32 i = 1, j = 4; i < 14; i += 1, j += 4)
|
||||
{
|
||||
rdk[j + 0] =
|
||||
td0[te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^
|
||||
td1[te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^
|
||||
td2[te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^
|
||||
td3[te1[(rdk[j + 0] >> 0) & 0xff] & 0xff];
|
||||
|
||||
rdk[j + 1] =
|
||||
td0[te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^
|
||||
td1[te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^
|
||||
td2[te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^
|
||||
td3[te1[(rdk[j + 1] >> 0) & 0xff] & 0xff];
|
||||
|
||||
rdk[j + 2] =
|
||||
td0[te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^
|
||||
td1[te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^
|
||||
td2[te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^
|
||||
td3[te1[(rdk[j + 2] >> 0) & 0xff] & 0xff];
|
||||
|
||||
rdk[j + 3] =
|
||||
td0[te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^
|
||||
td1[te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^
|
||||
td2[te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^
|
||||
td3[te1[(rdk[j + 3] >> 0) & 0xff] & 0xff];
|
||||
}
|
||||
}
|
||||
|
||||
static void AES256_encrypt (const u32 *in, u32 *out, const u32 *rek)
|
||||
{
|
||||
u32 in_s[4];
|
||||
|
||||
in_s[0] = byte_swap_32 (in[0]);
|
||||
in_s[1] = byte_swap_32 (in[1]);
|
||||
in_s[2] = byte_swap_32 (in[2]);
|
||||
in_s[3] = byte_swap_32 (in[3]);
|
||||
|
||||
u32 s0 = in_s[0] ^ rek[0];
|
||||
u32 s1 = in_s[1] ^ rek[1];
|
||||
u32 s2 = in_s[2] ^ rek[2];
|
||||
u32 s3 = in_s[3] ^ rek[3];
|
||||
|
||||
u32 t0;
|
||||
u32 t1;
|
||||
u32 t2;
|
||||
u32 t3;
|
||||
|
||||
t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ rek[ 4];
|
||||
t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ rek[ 5];
|
||||
t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ rek[ 6];
|
||||
t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ rek[ 7];
|
||||
s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ rek[ 8];
|
||||
s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ rek[ 9];
|
||||
s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ rek[10];
|
||||
s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ rek[11];
|
||||
t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ rek[12];
|
||||
t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ rek[13];
|
||||
t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ rek[14];
|
||||
t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ rek[15];
|
||||
s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ rek[16];
|
||||
s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ rek[17];
|
||||
s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ rek[18];
|
||||
s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ rek[19];
|
||||
t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ rek[20];
|
||||
t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ rek[21];
|
||||
t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ rek[22];
|
||||
t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ rek[23];
|
||||
s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ rek[24];
|
||||
s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ rek[25];
|
||||
s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ rek[26];
|
||||
s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ rek[27];
|
||||
t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ rek[28];
|
||||
t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ rek[29];
|
||||
t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ rek[30];
|
||||
t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ rek[31];
|
||||
s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ rek[32];
|
||||
s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ rek[33];
|
||||
s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ rek[34];
|
||||
s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ rek[35];
|
||||
t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ rek[36];
|
||||
t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ rek[37];
|
||||
t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ rek[38];
|
||||
t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ rek[39];
|
||||
s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ rek[40];
|
||||
s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ rek[41];
|
||||
s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ rek[42];
|
||||
s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ rek[43];
|
||||
t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ rek[44];
|
||||
t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ rek[45];
|
||||
t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ rek[46];
|
||||
t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ rek[47];
|
||||
s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ rek[48];
|
||||
s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ rek[49];
|
||||
s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ rek[50];
|
||||
s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ rek[51];
|
||||
t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ rek[52];
|
||||
t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ rek[53];
|
||||
t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ rek[54];
|
||||
t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ rek[55];
|
||||
|
||||
out[0] = (te4[(t0 >> 24) & 0xff] & 0xff000000)
|
||||
^ (te4[(t1 >> 16) & 0xff] & 0x00ff0000)
|
||||
^ (te4[(t2 >> 8) & 0xff] & 0x0000ff00)
|
||||
^ (te4[(t3 >> 0) & 0xff] & 0x000000ff)
|
||||
^ rek[56];
|
||||
|
||||
out[1] = (te4[(t1 >> 24) & 0xff] & 0xff000000)
|
||||
^ (te4[(t2 >> 16) & 0xff] & 0x00ff0000)
|
||||
^ (te4[(t3 >> 8) & 0xff] & 0x0000ff00)
|
||||
^ (te4[(t0 >> 0) & 0xff] & 0x000000ff)
|
||||
^ rek[57];
|
||||
|
||||
out[2] = (te4[(t2 >> 24) & 0xff] & 0xff000000)
|
||||
^ (te4[(t3 >> 16) & 0xff] & 0x00ff0000)
|
||||
^ (te4[(t0 >> 8) & 0xff] & 0x0000ff00)
|
||||
^ (te4[(t1 >> 0) & 0xff] & 0x000000ff)
|
||||
^ rek[58];
|
||||
|
||||
out[3] = (te4[(t3 >> 24) & 0xff] & 0xff000000)
|
||||
^ (te4[(t0 >> 16) & 0xff] & 0x00ff0000)
|
||||
^ (te4[(t1 >> 8) & 0xff] & 0x0000ff00)
|
||||
^ (te4[(t2 >> 0) & 0xff] & 0x000000ff)
|
||||
^ rek[59];
|
||||
|
||||
out[0] = byte_swap_32 (out[0]);
|
||||
out[1] = byte_swap_32 (out[1]);
|
||||
out[2] = byte_swap_32 (out[2]);
|
||||
out[3] = byte_swap_32 (out[3]);
|
||||
}
|
||||
|
||||
static void AES256_decrypt (const u32 *in, u32 *out, const u32 *rdk)
|
||||
{
|
||||
u32 in_s[4];
|
||||
|
||||
in_s[0] = byte_swap_32 (in[0]);
|
||||
in_s[1] = byte_swap_32 (in[1]);
|
||||
in_s[2] = byte_swap_32 (in[2]);
|
||||
in_s[3] = byte_swap_32 (in[3]);
|
||||
|
||||
u32 s0 = in_s[0] ^ rdk[0];
|
||||
u32 s1 = in_s[1] ^ rdk[1];
|
||||
u32 s2 = in_s[2] ^ rdk[2];
|
||||
u32 s3 = in_s[3] ^ rdk[3];
|
||||
|
||||
u32 t0;
|
||||
u32 t1;
|
||||
u32 t2;
|
||||
u32 t3;
|
||||
|
||||
t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ rdk[ 4];
|
||||
t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ rdk[ 5];
|
||||
t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ rdk[ 6];
|
||||
t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ rdk[ 7];
|
||||
s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ rdk[ 8];
|
||||
s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ rdk[ 9];
|
||||
s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ rdk[10];
|
||||
s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ rdk[11];
|
||||
t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ rdk[12];
|
||||
t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ rdk[13];
|
||||
t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ rdk[14];
|
||||
t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ rdk[15];
|
||||
s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ rdk[16];
|
||||
s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ rdk[17];
|
||||
s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ rdk[18];
|
||||
s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ rdk[19];
|
||||
t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ rdk[20];
|
||||
t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ rdk[21];
|
||||
t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ rdk[22];
|
||||
t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ rdk[23];
|
||||
s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ rdk[24];
|
||||
s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ rdk[25];
|
||||
s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ rdk[26];
|
||||
s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ rdk[27];
|
||||
t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ rdk[28];
|
||||
t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ rdk[29];
|
||||
t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ rdk[30];
|
||||
t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ rdk[31];
|
||||
s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ rdk[32];
|
||||
s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ rdk[33];
|
||||
s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ rdk[34];
|
||||
s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ rdk[35];
|
||||
t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ rdk[36];
|
||||
t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ rdk[37];
|
||||
t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ rdk[38];
|
||||
t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ rdk[39];
|
||||
s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ rdk[40];
|
||||
s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ rdk[41];
|
||||
s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ rdk[42];
|
||||
s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ rdk[43];
|
||||
t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ rdk[44];
|
||||
t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ rdk[45];
|
||||
t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ rdk[46];
|
||||
t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ rdk[47];
|
||||
s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ rdk[48];
|
||||
s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ rdk[49];
|
||||
s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ rdk[50];
|
||||
s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ rdk[51];
|
||||
t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ rdk[52];
|
||||
t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ rdk[53];
|
||||
t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ rdk[54];
|
||||
t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ rdk[55];
|
||||
|
||||
out[0] = (td4[(t0 >> 24) & 0xff] & 0xff000000)
|
||||
^ (td4[(t3 >> 16) & 0xff] & 0x00ff0000)
|
||||
^ (td4[(t2 >> 8) & 0xff] & 0x0000ff00)
|
||||
^ (td4[(t1 >> 0) & 0xff] & 0x000000ff)
|
||||
^ rdk[56];
|
||||
|
||||
out[1] = (td4[(t1 >> 24) & 0xff] & 0xff000000)
|
||||
^ (td4[(t0 >> 16) & 0xff] & 0x00ff0000)
|
||||
^ (td4[(t3 >> 8) & 0xff] & 0x0000ff00)
|
||||
^ (td4[(t2 >> 0) & 0xff] & 0x000000ff)
|
||||
^ rdk[57];
|
||||
|
||||
out[2] = (td4[(t2 >> 24) & 0xff] & 0xff000000)
|
||||
^ (td4[(t1 >> 16) & 0xff] & 0x00ff0000)
|
||||
^ (td4[(t0 >> 8) & 0xff] & 0x0000ff00)
|
||||
^ (td4[(t3 >> 0) & 0xff] & 0x000000ff)
|
||||
^ rdk[58];
|
||||
|
||||
out[3] = (td4[(t3 >> 24) & 0xff] & 0xff000000)
|
||||
^ (td4[(t2 >> 16) & 0xff] & 0x00ff0000)
|
||||
^ (td4[(t1 >> 8) & 0xff] & 0x0000ff00)
|
||||
^ (td4[(t0 >> 0) & 0xff] & 0x000000ff)
|
||||
^ rdk[59];
|
||||
|
||||
out[0] = byte_swap_32 (out[0]);
|
||||
out[1] = byte_swap_32 (out[1]);
|
||||
out[2] = byte_swap_32 (out[2]);
|
||||
out[3] = byte_swap_32 (out[3]);
|
||||
}
|
||||
|
||||
// wrappers
|
||||
|
||||
void AES_set_encrypt_key (const u8 *key, int keysize, AES_KEY *aes_key)
|
||||
{
|
||||
aes_key->bits = keysize;
|
||||
|
||||
if (aes_key->bits == 128)
|
||||
{
|
||||
AES128_ExpandKey ((const u32 *) key, aes_key->rek);
|
||||
}
|
||||
else if (aes_key->bits == 256)
|
||||
{
|
||||
AES256_ExpandKey ((const u32 *) key, aes_key->rek);
|
||||
}
|
||||
}
|
||||
|
||||
void AES_set_decrypt_key (const u8 *key, int keysize, AES_KEY *aes_key)
|
||||
{
|
||||
aes_key->bits = keysize;
|
||||
|
||||
if (aes_key->bits == 128)
|
||||
{
|
||||
AES128_ExpandKey ((const u32 *) key, aes_key->rdk);
|
||||
|
||||
AES128_InvertKey (aes_key->rdk);
|
||||
}
|
||||
else if (aes_key->bits == 256)
|
||||
{
|
||||
AES256_ExpandKey ((const u32 *) key, aes_key->rdk);
|
||||
|
||||
AES256_InvertKey (aes_key->rdk);
|
||||
}
|
||||
}
|
||||
|
||||
void AES_encrypt (AES_KEY *aes_key, const u8 *input, u8 *output)
|
||||
{
|
||||
if (aes_key->bits == 128)
|
||||
{
|
||||
AES128_encrypt ((const u32 *) input, (u32 *) output, aes_key->rek);
|
||||
}
|
||||
else if (aes_key->bits == 256)
|
||||
{
|
||||
AES256_encrypt ((const u32 *) input, (u32 *) output, aes_key->rek);
|
||||
}
|
||||
}
|
||||
|
||||
void AES_decrypt (AES_KEY *aes_key, const u8 *input, u8 *output)
|
||||
{
|
||||
if (aes_key->bits == 128)
|
||||
{
|
||||
AES128_decrypt ((const u32 *) input, (u32 *) output, aes_key->rdk);
|
||||
}
|
||||
else if (aes_key->bits == 256)
|
||||
{
|
||||
AES256_decrypt ((const u32 *) input, (u32 *) output, aes_key->rdk);
|
||||
}
|
||||
}
|
@ -0,0 +1,116 @@
|
||||
/**
|
||||
* Author......: Jens Steube <jens.steube@gmail.com>
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#define IS_GENERIC
|
||||
|
||||
#include "common.h"
|
||||
#include "types_int.h"
|
||||
#include "bitops.h"
|
||||
#include "inc_hash_constants.h"
|
||||
#include "inc_hash_functions.cl"
|
||||
#include "cpu_des.h"
|
||||
|
||||
#define BOX(v,i,S) (S)[(i)][(v)]
|
||||
|
||||
void _des_keysetup (u32 data[2], u32 Kc[16], u32 Kd[16], const u32 s_skb[8][64])
|
||||
{
|
||||
u32 c = data[0];
|
||||
u32 d = data[1];
|
||||
|
||||
u32 tt;
|
||||
|
||||
PERM_OP (d, c, tt, 4, 0x0f0f0f0f);
|
||||
HPERM_OP (c, tt, 2, 0xcccc0000);
|
||||
HPERM_OP (d, tt, 2, 0xcccc0000);
|
||||
PERM_OP (d, c, tt, 1, 0x55555555);
|
||||
PERM_OP (c, d, tt, 8, 0x00ff00ff);
|
||||
PERM_OP (d, c, tt, 1, 0x55555555);
|
||||
|
||||
d = ((d & 0x000000ff) << 16)
|
||||
| ((d & 0x0000ff00) << 0)
|
||||
| ((d & 0x00ff0000) >> 16)
|
||||
| ((c & 0xf0000000) >> 4);
|
||||
|
||||
c = c & 0x0fffffff;
|
||||
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
const u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 };
|
||||
const u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 };
|
||||
|
||||
c = c >> shifts3s0[i] | c << shifts3s1[i];
|
||||
d = d >> shifts3s0[i] | d << shifts3s1[i];
|
||||
|
||||
c = c & 0x0fffffff;
|
||||
d = d & 0x0fffffff;
|
||||
|
||||
u32 s = BOX ((( c >> 0) & 0x3f), 0, s_skb)
|
||||
| BOX ((((c >> 6) & 0x03)
|
||||
| ((c >> 7) & 0x3c)), 1, s_skb)
|
||||
| BOX ((((c >> 13) & 0x0f)
|
||||
| ((c >> 14) & 0x30)), 2, s_skb)
|
||||
| BOX ((((c >> 20) & 0x01)
|
||||
| ((c >> 21) & 0x06)
|
||||
| ((c >> 22) & 0x38)), 3, s_skb);
|
||||
|
||||
u32 t = BOX ((( d >> 0) & 0x3f), 4, s_skb)
|
||||
| BOX ((((d >> 7) & 0x03)
|
||||
| ((d >> 8) & 0x3c)), 5, s_skb)
|
||||
| BOX ((((d >> 15) & 0x3f)), 6, s_skb)
|
||||
| BOX ((((d >> 21) & 0x0f)
|
||||
| ((d >> 22) & 0x30)), 7, s_skb);
|
||||
|
||||
Kc[i] = ((t << 16) | (s & 0x0000ffff));
|
||||
Kd[i] = ((s >> 16) | (t & 0xffff0000));
|
||||
|
||||
Kc[i] = rotl32 (Kc[i], 2u);
|
||||
Kd[i] = rotl32 (Kd[i], 2u);
|
||||
}
|
||||
}
|
||||
|
||||
void _des_encrypt (u32 data[2], u32 Kc[16], u32 Kd[16], const u32 s_SPtrans[8][64])
|
||||
{
|
||||
u32 r = data[0];
|
||||
u32 l = data[1];
|
||||
|
||||
u32 tt;
|
||||
|
||||
IP (r, l, tt);
|
||||
|
||||
r = rotl32 (r, 3u);
|
||||
l = rotl32 (l, 3u);
|
||||
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
u32 u = Kc[i] ^ r;
|
||||
u32 t = Kd[i] ^ rotl32 (r, 28u);
|
||||
|
||||
l ^= BOX (((u >> 2) & 0x3f), 0, s_SPtrans)
|
||||
| BOX (((u >> 10) & 0x3f), 2, s_SPtrans)
|
||||
| BOX (((u >> 18) & 0x3f), 4, s_SPtrans)
|
||||
| BOX (((u >> 26) & 0x3f), 6, s_SPtrans)
|
||||
| BOX (((t >> 2) & 0x3f), 1, s_SPtrans)
|
||||
| BOX (((t >> 10) & 0x3f), 3, s_SPtrans)
|
||||
| BOX (((t >> 18) & 0x3f), 5, s_SPtrans)
|
||||
| BOX (((t >> 26) & 0x3f), 7, s_SPtrans);
|
||||
|
||||
tt = l;
|
||||
l = r;
|
||||
r = tt;
|
||||
}
|
||||
|
||||
l = rotl32 (l, 29u);
|
||||
r = rotl32 (r, 29u);
|
||||
|
||||
FP (r, l, tt);
|
||||
|
||||
data[0] = l;
|
||||
data[1] = r;
|
||||
}
|
||||
|
@ -0,0 +1,297 @@
|
||||
/**
|
||||
* Author......: Jens Steube <jens.steube@gmail.com>
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#define IS_GENERIC
|
||||
|
||||
#include "common.h"
|
||||
#include "types_int.h"
|
||||
#include "bitops.h"
|
||||
#include "inc_hash_constants.h"
|
||||
#include "inc_hash_functions.cl"
|
||||
#include "cpu_md5.h"
|
||||
|
||||
void md5_64 (u32 block[16], u32 digest[4])
|
||||
{
|
||||
u32 w0[4];
|
||||
u32 w1[4];
|
||||
u32 w2[4];
|
||||
u32 w3[4];
|
||||
|
||||
w0[0] = block[ 0];
|
||||
w0[1] = block[ 1];
|
||||
w0[2] = block[ 2];
|
||||
w0[3] = block[ 3];
|
||||
w1[0] = block[ 4];
|
||||
w1[1] = block[ 5];
|
||||
w1[2] = block[ 6];
|
||||
w1[3] = block[ 7];
|
||||
w2[0] = block[ 8];
|
||||
w2[1] = block[ 9];
|
||||
w2[2] = block[10];
|
||||
w2[3] = block[11];
|
||||
w3[0] = block[12];
|
||||
w3[1] = block[13];
|
||||
w3[2] = block[14];
|
||||
w3[3] = block[15];
|
||||
|
||||
u32 a = digest[0];
|
||||
u32 b = digest[1];
|
||||
u32 c = digest[2];
|
||||
u32 d = digest[3];
|
||||
|
||||
MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00);
|
||||
MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01);
|
||||
MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02);
|
||||
MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03);
|
||||
MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00);
|
||||
MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01);
|
||||
MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02);
|
||||
MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03);
|
||||
MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00);
|
||||
MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01);
|
||||
MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02);
|
||||
MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03);
|
||||
MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00);
|
||||
MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01);
|
||||
MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02);
|
||||
MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03);
|
||||
|
||||
MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10);
|
||||
MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11);
|
||||
MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12);
|
||||
MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13);
|
||||
MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10);
|
||||
MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11);
|
||||
MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12);
|
||||
MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13);
|
||||
MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10);
|
||||
MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11);
|
||||
MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12);
|
||||
MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13);
|
||||
MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10);
|
||||
MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11);
|
||||
MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12);
|
||||
MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13);
|
||||
|
||||
MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20);
|
||||
MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21);
|
||||
MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22);
|
||||
MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23);
|
||||
MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20);
|
||||
MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21);
|
||||
MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22);
|
||||
MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23);
|
||||
MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20);
|
||||
MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21);
|
||||
MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22);
|
||||
MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23);
|
||||
MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20);
|
||||
MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21);
|
||||
MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22);
|
||||
MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23);
|
||||
|
||||
MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30);
|
||||
MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31);
|
||||
MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32);
|
||||
MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33);
|
||||
MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30);
|
||||
MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31);
|
||||
MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32);
|
||||
MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33);
|
||||
MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30);
|
||||
MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31);
|
||||
MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32);
|
||||
MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33);
|
||||
MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30);
|
||||
MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31);
|
||||
MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32);
|
||||
MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33);
|
||||
|
||||
digest[0] += a;
|
||||
digest[1] += b;
|
||||
digest[2] += c;
|
||||
digest[3] += d;
|
||||
}
|
||||
|
||||
// only use this when really, really needed, SLOW
|
||||
|
||||
#include <string.h>
|
||||
|
||||
void md5_complete_no_limit (u32 digest[4], u32 *plain, u32 plain_len)
|
||||
{
|
||||
u32 a = MD5M_A;
|
||||
u32 b = MD5M_B;
|
||||
u32 c = MD5M_C;
|
||||
u32 d = MD5M_D;
|
||||
|
||||
digest[0] = a;
|
||||
digest[1] = b;
|
||||
digest[2] = c;
|
||||
digest[3] = d;
|
||||
|
||||
u32 r_a = digest[0];
|
||||
u32 r_b = digest[1];
|
||||
u32 r_c = digest[2];
|
||||
u32 r_d = digest[3];
|
||||
|
||||
u32 block[16];
|
||||
int block_total_len = 16 * 4; // sizeof (block)
|
||||
|
||||
char *block_ptr = (char *) block;
|
||||
char *plain_ptr = (char *) plain;
|
||||
|
||||
// init
|
||||
|
||||
int remaining_len = plain_len;
|
||||
|
||||
// loop
|
||||
|
||||
u32 loop = 1;
|
||||
|
||||
while (loop)
|
||||
{
|
||||
loop = (remaining_len > 55);
|
||||
|
||||
int cur_len = MIN (block_total_len, remaining_len);
|
||||
int copy_len = MAX (cur_len, 0); // should never be negative of course
|
||||
|
||||
memcpy (block_ptr, plain_ptr, copy_len);
|
||||
|
||||
// clear the remaining bytes of the block
|
||||
|
||||
memset (block_ptr + copy_len, 0, block_total_len - copy_len);
|
||||
|
||||
/*
|
||||
* final block
|
||||
*/
|
||||
|
||||
// set 0x80 if neeeded
|
||||
|
||||
if (cur_len >= 0)
|
||||
{
|
||||
if (cur_len != block_total_len)
|
||||
{
|
||||
block_ptr[copy_len] = 0x80;
|
||||
}
|
||||
}
|
||||
|
||||
// set block[14] set to total_len
|
||||
|
||||
if (! loop) block[14] = plain_len * 8;
|
||||
|
||||
/*
|
||||
* md5 ()
|
||||
*/
|
||||
|
||||
u32 w0[4];
|
||||
u32 w1[4];
|
||||
u32 w2[4];
|
||||
u32 w3[4];
|
||||
|
||||
w0[0] = block[ 0];
|
||||
w0[1] = block[ 1];
|
||||
w0[2] = block[ 2];
|
||||
w0[3] = block[ 3];
|
||||
w1[0] = block[ 4];
|
||||
w1[1] = block[ 5];
|
||||
w1[2] = block[ 6];
|
||||
w1[3] = block[ 7];
|
||||
w2[0] = block[ 8];
|
||||
w2[1] = block[ 9];
|
||||
w2[2] = block[10];
|
||||
w2[3] = block[11];
|
||||
w3[0] = block[12];
|
||||
w3[1] = block[13];
|
||||
w3[2] = block[14];
|
||||
w3[3] = block[15];
|
||||
|
||||
MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00);
|
||||
MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01);
|
||||
MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02);
|
||||
MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03);
|
||||
MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00);
|
||||
MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01);
|
||||
MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02);
|
||||
MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03);
|
||||
MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00);
|
||||
MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01);
|
||||
MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02);
|
||||
MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03);
|
||||
MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00);
|
||||
MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01);
|
||||
MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02);
|
||||
MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03);
|
||||
|
||||
MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10);
|
||||
MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11);
|
||||
MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12);
|
||||
MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13);
|
||||
MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10);
|
||||
MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11);
|
||||
MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12);
|
||||
MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13);
|
||||
MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10);
|
||||
MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11);
|
||||
MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12);
|
||||
MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13);
|
||||
MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10);
|
||||
MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11);
|
||||
MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12);
|
||||
MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13);
|
||||
|
||||
MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20);
|
||||
MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21);
|
||||
MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22);
|
||||
MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23);
|
||||
MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20);
|
||||
MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21);
|
||||
MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22);
|
||||
MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23);
|
||||
MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20);
|
||||
MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21);
|
||||
MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22);
|
||||
MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23);
|
||||
MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20);
|
||||
MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21);
|
||||
MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22);
|
||||
MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23);
|
||||
|
||||
MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30);
|
||||
MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31);
|
||||
MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32);
|
||||
MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33);
|
||||
MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30);
|
||||
MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31);
|
||||
MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32);
|
||||
MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33);
|
||||
MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30);
|
||||
MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31);
|
||||
MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32);
|
||||
MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33);
|
||||
MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30);
|
||||
MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31);
|
||||
MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32);
|
||||
MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33);
|
||||
|
||||
remaining_len -= block_total_len;
|
||||
|
||||
plain_ptr += 64;
|
||||
|
||||
a += r_a;
|
||||
b += r_b;
|
||||
c += r_c;
|
||||
d += r_d;
|
||||
|
||||
digest[0] = a;
|
||||
digest[1] = b;
|
||||
digest[2] = c;
|
||||
digest[3] = d;
|
||||
|
||||
r_a = digest[0];
|
||||
r_b = digest[1];
|
||||
r_c = digest[2];
|
||||
r_d = digest[3];
|
||||
}
|
||||
}
|
@ -0,0 +1,148 @@
|
||||
/**
|
||||
* Author......: Jens Steube <jens.steube@gmail.com>
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
#include "logging.h"
|
||||
|
||||
int SUPPRESS_OUTPUT = 0;
|
||||
|
||||
static int last_len = 0;
|
||||
|
||||
static int log_final (FILE *fp, const char *fmt, va_list ap)
|
||||
{
|
||||
if (last_len)
|
||||
{
|
||||
fputc ('\r', fp);
|
||||
|
||||
for (int i = 0; i < last_len; i++)
|
||||
{
|
||||
fputc (' ', fp);
|
||||
}
|
||||
|
||||
fputc ('\r', fp);
|
||||
}
|
||||
|
||||
char s[4096] = { 0 };
|
||||
|
||||
int max_len = (int) sizeof (s);
|
||||
|
||||
int len = vsnprintf (s, (size_t)max_len, fmt, ap);
|
||||
|
||||
if (len > max_len) len = max_len;
|
||||
|
||||
fwrite (s, len, 1, fp);
|
||||
|
||||
fflush (fp);
|
||||
|
||||
last_len = len;
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
int log_out_nn (FILE *fp, const char *fmt, ...)
|
||||
{
|
||||
if (SUPPRESS_OUTPUT) return 0;
|
||||
|
||||
va_list ap;
|
||||
|
||||
va_start (ap, fmt);
|
||||
|
||||
const int len = log_final (fp, fmt, ap);
|
||||
|
||||
va_end (ap);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
int log_info_nn (const char *fmt, ...)
|
||||
{
|
||||
if (SUPPRESS_OUTPUT) return 0;
|
||||
|
||||
va_list ap;
|
||||
|
||||
va_start (ap, fmt);
|
||||
|
||||
const int len = log_final (stdout, fmt, ap);
|
||||
|
||||
va_end (ap);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
int log_error_nn (const char *fmt, ...)
|
||||
{
|
||||
if (SUPPRESS_OUTPUT) return 0;
|
||||
|
||||
va_list ap;
|
||||
|
||||
va_start (ap, fmt);
|
||||
|
||||
const int len = log_final (stderr, fmt, ap);
|
||||
|
||||
va_end (ap);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
int log_out (FILE *fp, const char *fmt, ...)
|
||||
{
|
||||
if (SUPPRESS_OUTPUT) return 0;
|
||||
|
||||
va_list ap;
|
||||
|
||||
va_start (ap, fmt);
|
||||
|
||||
const int len = log_final (fp, fmt, ap);
|
||||
|
||||
va_end (ap);
|
||||
|
||||
fputc ('\n', fp);
|
||||
|
||||
last_len = 0;
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
int log_info (const char *fmt, ...)
|
||||
{
|
||||
if (SUPPRESS_OUTPUT) return 0;
|
||||
|
||||
va_list ap;
|
||||
|
||||
va_start (ap, fmt);
|
||||
|
||||
const int len = log_final (stdout, fmt, ap);
|
||||
|
||||
va_end (ap);
|
||||
|
||||
fputc ('\n', stdout);
|
||||
|
||||
last_len = 0;
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
int log_error (const char *fmt, ...)
|
||||
{
|
||||
if (SUPPRESS_OUTPUT) return 0;
|
||||
|
||||
fputc ('\n', stderr);
|
||||
fputc ('\n', stderr);
|
||||
|
||||
va_list ap;
|
||||
|
||||
va_start (ap, fmt);
|
||||
|
||||
const int len = log_final (stderr, fmt, ap);
|
||||
|
||||
va_end (ap);
|
||||
|
||||
fputc ('\n', stderr);
|
||||
fputc ('\n', stderr);
|
||||
|
||||
last_len = 0;
|
||||
|
||||
return len;
|
||||
}
|
@ -0,0 +1,72 @@
|
||||
/**
|
||||
* Author......: Jens Steube <jens.steube@gmail.com>
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
#include "logging.h"
|
||||
#include "memory.h"
|
||||
|
||||
void *mycalloc (size_t nmemb, size_t size)
|
||||
{
|
||||
void *p = calloc (nmemb, size);
|
||||
|
||||
if (p == NULL)
|
||||
{
|
||||
log_error ("ERROR: %s", MSG_ENOMEM);
|
||||
|
||||
exit (-1);
|
||||
}
|
||||
|
||||
return (p);
|
||||
}
|
||||
|
||||
void *mymalloc (size_t size)
|
||||
{
|
||||
void *p = malloc (size);
|
||||
|
||||
if (p == NULL)
|
||||
{
|
||||
log_error ("ERROR: %s", MSG_ENOMEM);
|
||||
|
||||
exit (-1);
|
||||
}
|
||||
|
||||
memset (p, 0, size);
|
||||
|
||||
return (p);
|
||||
}
|
||||
|
||||
void myfree (void *ptr)
|
||||
{
|
||||
if (ptr == NULL) return;
|
||||
|
||||
free (ptr);
|
||||
}
|
||||
|
||||
void *myrealloc (void *ptr, size_t oldsz, size_t add)
|
||||
{
|
||||
void *p = realloc (ptr, oldsz + add);
|
||||
|
||||
if (p == NULL)
|
||||
{
|
||||
log_error ("ERROR: %s", MSG_ENOMEM);
|
||||
|
||||
exit (-1);
|
||||
}
|
||||
|
||||
memset ((char *) p + oldsz, 0, add);
|
||||
|
||||
return (p);
|
||||
}
|
||||
|
||||
char *mystrdup (const char *s)
|
||||
{
|
||||
const size_t len = strlen (s);
|
||||
|
||||
char *b = (char *) mymalloc (len + 1);
|
||||
|
||||
memcpy (b, s, len);
|
||||
|
||||
return (b);
|
||||
}
|
Loading…
Reference in new issue