#include"crypto_aead.h" #include"api.h" #include #include #include #define U32BIG(x) (x) typedef unsigned char u8; typedef unsigned int u32; typedef unsigned long long u64; #define ARR_SIZE(a) (sizeof((a))/sizeof((a[0]))) #define LOTR32(x,n) (((x)<<(n))|((x)>>(32-(n)))) #define sbox(a, b, c, d, f, g, h) \ { \ t1 = ~a; t2 = b & t1;t3 = c ^ t2; h = d ^ t3; t5 = b | c; t6 = d ^ t1; g = t5 ^ t6; t8 = b ^ d; t9 = t3 & t6; a = t8 ^ t9; t11 = g & t8; f = t3 ^ t11; \ } #define U96_BIT_LOTR32_8(t0,t1,t2,t3,t4,t5){\ t3= LOTR32(t2, 2);\ t4 =LOTR32(t0, 3);\ t5 = LOTR32(t1, 3); \ } #define U96_BIT_LOTR32_55(t0,t1,t2,t3,t4,t5){\ t3= LOTR32(t1, 18); \ t4 = LOTR32(t2, 18);\ t5 = LOTR32(t0, 19); \ } #define ROUND384(lunNum) {\ s[0] ^= (constant7Format[lunNum] >> 6) & 0x3;\ s[1] ^= (constant7Format[lunNum] >> 3) & 0x7;\ s[2] ^= constant7Format[lunNum] & 0x7;\ sbox(s[0], s[3], s[6], s[9] , s_temp[3], s_temp[6], s_temp[9]);\ sbox(s[1], s[4], s[7], s[10], s[3] , s_temp[7], s_temp[10]);\ sbox(s[2], s[5], s[8], s[11], s[4] , s_temp[8], s_temp[11]);\ s[5] = LOTR32(s_temp[3], 1); \ U96_BIT_LOTR32_8(s_temp[6], s_temp [7], s_temp[ 8], s[6], s[7], s[8]);\ U96_BIT_LOTR32_55(s_temp[9], s_temp[10], s_temp[11], s[9], s[10], s[11]);\ } //Processing_Data: #define Processing_Data(data) \ do { \ packU96FormatToThreePacket(dataFormat, data); \ s[0] ^= dataFormat[0]; \ s[1] ^= dataFormat[1]; \ s[2] ^= dataFormat[2]; \ packU96FormatToThreePacket((dataFormat + 3), (data + 12)); \ s[3] ^= dataFormat[3]; \ s[4] ^= dataFormat[4]; \ s[5] ^= dataFormat[5]; \ } while (0) #define puckU32ToThree_3(lo){\ u32 r0;\ r0 = (lo ^ (lo << 1)) & 0x14514514, lo ^= r0 ^ (r0 >> 1);\ r0 = (lo ^ (lo << 3)) & 0x10410410, lo ^= r0 ^ (r0 >> 3);\ r0 = (lo ^ (lo << 2)) & 0x00330330, lo ^= r0 ^ (r0 >> 2);\ r0 = (lo ^ (lo << 6)) & 0x00300300, lo ^= r0 ^ (r0 >> 6);\ r0 = (lo ^ (lo << 4)) & 0x000f0f00, lo ^= r0 ^ (r0 >> 4);\ r0 = (lo ^ (lo << 12)) & 0x000f0000, lo ^= r0 ^ (r0 >> 12);\ } #define unpuckU32ToThree_3(lo){\ u32 r0;\ r0 = (lo ^ (lo << 12)) & 0x000f0000, lo ^= r0 ^ (r0 >> 12);\ r0 = (lo ^ (lo << 4)) & 0x000f0f00, lo ^= r0 ^ (r0 >> 4);\ r0 = (lo ^ (lo << 6)) & 0x00300300, lo ^= r0 ^ (r0 >> 6);\ r0 = (lo ^ (lo << 2)) & 0x00330330, lo ^= r0 ^ (r0 >> 2);\ r0 = (lo ^ (lo << 3)) & 0x10410410, lo ^= r0 ^ (r0 >> 3);\ r0 = (lo ^ (lo << 1)) & 0x14514514, lo ^= r0 ^ (r0 >> 1);\ } #define packU96FormatToThreePacket( out, in) { \ u32 t0 = U32BIG(((u32*)in)[0]), t1 = U32BIG(((u32*)in)[1]), t2 = U32BIG(((u32*)in)[2]); \ puckU32ToThree_3(t0); \ puckU32ToThree_3(t1); \ puckU32ToThree_3(t2); \ out[0] = ((((t2 >> 21) & 0x400) | (((t2 >> 18) & 0x300)) | ((t2 & 0xff00) >> 8)) << 21) | \ ((((t1 >> 20) & 0x400) | ((t1 >> 16) & 0x300) | (t1 & 0xff)) << 10) | \ (((t0 >> 20) & 0x300) | ((t0 & 0xff0000) >> 16)); \ out[1] = ((((t2 >> 20) & 0x400) | ((t2 >> 16) & 0x300) | (t2 & 0xff)) << 21) | \ ((((t1 >> 20) & 0x300) | ((t1 & 0xff0000) >> 16)) << 11) | \ (((t0 >> 21) & 0x400) | ((t0 >> 18) & 0x300) | ((t0 & 0xff00) >> 8)); \ out[2] = ((((t2 >> 20) & 0x300) | ((t2 & 0xff0000) >> 16)) << 22) | \ ((((t1 >> 21) & 0x400) | ((t1 >> 18) & 0x300)|((t1 & 0xff00) >> 8)) << 11) | \ (((t0 >> 20) & 0x400) | ((t0 >> 16) & 0x300) | (t0 & 0xff)); \ } #define unpackU96FormatToThreePacket( out, in) {\ u32 t[3] = { 0 };\ u32 t0 = in[0], t1 = in[1], t2 = in[2]; \ t[0] = ((t1 & 0x400) << 21) | ((t2 & 0x400) << 20) | \ ((t0 & 0x300) << 20) | ((t1 & 0x300) << 18) | ((t2 & 0x300) << 16) | \ ((t0 & 0xff) << 16) | ((t1 & 0xff) << 8) | (t2 & 0xff); \ t[1] = ((t2 & 0x200000) << 10) | ((t0 & 0x100000) << 10) | ((t1 & 0x180000) << 9) | ((t2 & 0x180000) << 7) | \ ((t0 & 0xc0000) << 6) | ((t1 & 0x7f800) << 5) | ((t2 & 0x7f800) >> 3) | \ ((t0 & 0x3fc00) >> 10); \ t[2] = ((t0 & 0x80000000)) | ((t1 & 0x80000000) >> 1) | ((t2 & 0xc0000000) >> 2) | \ ((t0 & 0x60000000) >> 3) | ((t1 & 0x60000000) >> 5) | ((t2 & 0x3fc00000) >> 6) | \ ((t0 & 0x1fe00000) >> 13) | ((t1 & 0x1fe00000) >> 21); \ unpuckU32ToThree_3(t[0]); \ unpuckU32ToThree_3(t[1]); \ unpuckU32ToThree_3(t[2]); \ memcpy(out, t, 12 * sizeof(unsigned char)); \ }