#include"auxFormat.h" void unpackU96FormatToThreePacket(u8 *out, u32 *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)); } void packU48FormatToThreePacket(u32 *out, u8 *in) { u32 t0 = U32BIG(*(u32* )(in)), t1 = (u32) U16BIG(*(u16* )(in + 4)); puckU32ToThree_3(t0); puckU32ToThree_3(t1); out[0] = (((t1 & 0x40000000) >> 10) | ((t1 & 0x03000000) >> 6) | ((t1 & 0x000000ff) << 10)) | ((((t0 & 0x30000000) >> 20) | ((t0 & 0xff0000) >> 16))); out[1] = ((((t1 & 0x30000000) >> 9) | ((t1 & 0xff0000) >> 5)) | (((t0 & 0x80000000) >> 21) | ((t0 & 0xc000000) >> 18) | ((t0 & 0xff00) >> 8))); out[2] = (((t1 & 0x80000000) >> 10) | ((t1 & 0xc000000) >> 7) | ((t1 & 0xff00) << 3)) | (((t0 & 0x40000000) >> 20) | ((t0 & 0x03000000) >> 16) | (t0 & 0x000000ff)); } unsigned char constant7Format[104] = { /*constant7Format[127]: 12*9=108*/ 0x01, 0x08, 0x40, 0x02, 0x10, 0x80, 0x05, 0x09, 0x48, 0x42, 0x12, 0x90, 0x85, 0x0c, 0x41, 0x0a, 0x50, 0x82, 0x15, 0x89, 0x4d, 0x4b, 0x5a, 0xd2, 0x97, 0x9c, 0xc4, 0x06, 0x11, 0x88, 0x45, 0x0b, 0x58, 0xc2, 0x17, 0x99, 0xcd, 0x4e, 0x53, 0x9a, 0xd5, 0x8e, 0x54, 0x83, 0x1d, 0xc9, 0x4f, 0x5b, 0xda, 0xd7, 0x9e, 0xd4, 0x86, 0x14, 0x81, 0x0d, 0x49, 0x4a, 0x52, 0x92, 0x95, 0x8c, 0x44, 0x03, 0x18, 0xc0, 0x07, 0x19, 0xc8, 0x47, 0x1b, 0xd8, 0xc7, 0x1e, 0xd1, 0x8f, 0x5c, 0xc3, 0x1f, 0xd9, 0xcf, 0x5e, 0xd3, 0x9f, 0xdc, 0xc6, 0x16, 0x91, 0x8d, 0x4c, 0x43, 0x1a, 0xd0, 0x87, 0x1c, 0xc1, 0x0f, 0x59, 0xca, 0x57, 0x9b, 0xdd, 0xce, 0x56, }; void ROUND384_Three(unsigned int *s, unsigned char *c, int lunnum) { unsigned int t, t1, t2; u32 rci, temp; rci = c[0]; ARC(rci); SBOX(s[0], s[3], s[6], s[9]); SBOX(s[1], s[4], s[7], s[10]); SBOX(s[2], s[5], s[8], s[11]); t = 1; while (lunnum--) { temp = ((u32*) (c + t))[0]; rci = temp & 0xff; ARC(rci); SBOX1_ROR(s[0], s[4], s[8], s[10]); SBOX2_ROR(s[1], s[5], s[6], s[11]); SBOX3_ROR(s[2], s[3], s[7], s[9]); rci = (temp & 0xff00) >> 8; ARC(rci); SBOX1_ROR(s[0], s[5], s[7], s[11]); SBOX2_ROR(s[1], s[3], s[8], s[9]); SBOX3_ROR(s[2], s[4], s[6], s[10]); rci = (temp & 0xff0000) >> 16; ARC(rci); SBOX1_ROR(s[0], s[3], s[6], s[9]); SBOX2_ROR(s[1], s[4], s[7], s[10]); SBOX3_ROR(s[2], s[5], s[8], s[11]); t += 3; } }