1 /* PR middle-end/55150 */ 2 /* { dg-do compile } */ 3 /* { dg-options "-Os -g" } */ 4 /* { dg-require-effective-target int32plus } */ 5 6 typedef unsigned int KEY_TABLE_TYPE[(272 / 4)]; 7 typedef unsigned int u32; 8 typedef unsigned char u8; 9 static const u32 Camellia_SBOX[][256] = { 10 }; 11 static const u32 SIGMA[] = { 12 0xa09e667f, 0x3bcc908b, 0xb67ae858, 0x4caa73b2, 0xc6ef372f, 0xe94f82be, 0x54ff53a5, 0xf1d36f1c, 0x10e527fa, 0xde682d1d, 0xb05688c2, 0xb3e6c1fd }; Camellia_Ekeygen(int keyBitLength,const u8 * rawKey,KEY_TABLE_TYPE k)13 int Camellia_Ekeygen (int keyBitLength, const u8 * rawKey, KEY_TABLE_TYPE k) { 14 register u32 s0, s1, s2, s3; 15 k[0] = s0 = ( { 16 u32 r = *(const u32 *) (rawKey); 17 r; 18 } 19 ); 20 k[2] = s2 = ( { 21 u32 r = *(const u32 *) (rawKey + 8); 22 r; 23 } 24 ); 25 k[3] = s3 = ( { 26 u32 r = *(const u32 *) (rawKey + 12); 27 r; 28 } 29 ); 30 if (keyBitLength != 128) { 31 k[8] = s0 = ( { 32 u32 r = *(const u32 *) (rawKey + 16); 33 r; 34 } 35 ); 36 if (keyBitLength == 192) { 37 k[10] = s2 = ~s0; 38 k[11] = s3 = ~s1; 39 } 40 } 41 s0 ^= k[0], s1 ^= k[1], s2 ^= k[2], s3 ^= k[3]; 42 if (keyBitLength == 128) { 43 k[4] = s0, k[5] = s1, k[6] = s2, k[7] = s3; 44 } 45 else { 46 k[12] = s0, k[13] = s1, k[14] = s2, k[15] = s3; 47 s0 ^= k[8], s1 ^= k[9], s2 ^= k[10], s3 ^= k[11]; 48 do { 49 register u32 _t0, _t1, _t2, _t3; 50 _t0 = s2 ^ ((SIGMA + 10))[0]; 51 _t3 ^= Camellia_SBOX[3][(_t0 >> 8) & 0xff]; 52 s1 ^= _t3; 53 } 54 while (0); 55 do { 56 u32 _t0 = s0 >> (32 - 30); 57 s2 = (s2 << 30) | (s3 >> (32 - 30)); 58 s3 = (s3 << 30) | _t0; 59 } 60 while (0); 61 k[40] = s0, k[41] = s1, k[42] = s2, k[43] = s3; 62 k[64] = s1, k[65] = s2, k[66] = s3, k[67] = s0; 63 s0 = k[8], s1 = k[9], s2 = k[10], s3 = k[11]; 64 k[36] = s0, k[37] = s1, k[38] = s2, k[39] = s3; 65 s0 = k[12], s1 = k[13], s2 = k[14], s3 = k[15]; 66 do { 67 s1 = (s1 << 15) | (s2 >> (32 - 15)); 68 } 69 while (0); 70 k[12] = s0, k[13] = s1, k[14] = s2, k[15] = s3; 71 k[44] = s1, k[45] = s2, k[46] = s3, k[47] = s0; 72 } 73 } 74