You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

473 lines
17KB

  1. /*
  2. * An implementation of the CAMELLIA algorithm as mentioned in RFC3713
  3. * Copyright (c) 2014 Supraja Meedinti
  4. *
  5. * This file is part of FFmpeg.
  6. *
  7. * FFmpeg is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * FFmpeg is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with FFmpeg; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. #include "camellia.h"
  22. #include "common.h"
  23. #include "intreadwrite.h"
  24. #include "attributes.h"
  25. #define LR32(x,c) ((x) << (c) | (x) >> (32 - (c)))
  26. #define RR32(x,c) ((x) >> (c) | (x) << (32 - (c)))
  27. #define MASK8 0xff
  28. #define MASK32 0xffffffff
  29. #define MASK64 0xffffffffffffffff
  30. #define Sigma1 0xA09E667F3BCC908B
  31. #define Sigma2 0xB67AE8584CAA73B2
  32. #define Sigma3 0xC6EF372FE94F82BE
  33. #define Sigma4 0x54FF53A5F1D36F1C
  34. #define Sigma5 0x10E527FADE682D1D
  35. #define Sigma6 0xB05688C2B3E6C1FD
  36. static uint64_t SP[8][256];
  37. typedef struct AVCAMELLIA {
  38. uint64_t Kw[4];
  39. uint64_t Ke[6];
  40. uint64_t K[24];
  41. int key_bits;
  42. } AVCAMELLIA;
  43. static const uint8_t SBOX1[256] = {
  44. 112, 130, 44, 236, 179, 39, 192, 229, 228, 133, 87, 53, 234, 12, 174, 65,
  45. 35, 239, 107, 147, 69, 25, 165, 33, 237, 14, 79, 78, 29, 101, 146, 189,
  46. 134, 184, 175, 143, 124, 235, 31, 206, 62, 48, 220, 95, 94, 197, 11, 26,
  47. 166, 225, 57, 202, 213, 71, 93, 61, 217, 1, 90, 214, 81, 86, 108, 77,
  48. 139, 13, 154, 102, 251, 204, 176, 45, 116, 18, 43, 32, 240, 177, 132, 153,
  49. 223, 76, 203, 194, 52, 126, 118, 5, 109, 183, 169, 49, 209, 23, 4, 215,
  50. 20, 88, 58, 97, 222, 27, 17, 28, 50, 15, 156, 22, 83, 24, 242, 34,
  51. 254, 68, 207, 178, 195, 181, 122, 145, 36, 8, 232, 168, 96, 252, 105, 80,
  52. 170, 208, 160, 125, 161, 137, 98, 151, 84, 91, 30, 149, 224, 255, 100, 210,
  53. 16, 196, 0, 72, 163, 247, 117, 219, 138, 3, 230, 218, 9, 63, 221, 148,
  54. 135, 92, 131, 2, 205, 74, 144, 51, 115, 103, 246, 243, 157, 127, 191, 226,
  55. 82, 155, 216, 38, 200, 55, 198, 59, 129, 150, 111, 75, 19, 190, 99, 46,
  56. 233, 121, 167, 140, 159, 110, 188, 142, 41, 245, 249, 182, 47, 253, 180, 89,
  57. 120, 152, 6, 106, 231, 70, 113, 186, 212, 37, 171, 66, 136, 162, 141, 250,
  58. 114, 7, 185, 85, 248, 238, 172, 10, 54, 73, 42, 104, 60, 56, 241, 164,
  59. 64, 40, 211, 123, 187, 201, 67, 193, 21, 227, 173, 244, 119, 199, 128, 158
  60. };
  61. static const uint8_t SBOX2[256] = {
  62. 224, 5, 88, 217, 103, 78, 129, 203, 201, 11, 174, 106, 213, 24, 93, 130,
  63. 70, 223, 214, 39, 138, 50, 75, 66, 219, 28, 158, 156, 58, 202, 37, 123,
  64. 13, 113, 95, 31, 248, 215, 62, 157, 124, 96, 185, 190, 188, 139, 22, 52,
  65. 77, 195, 114, 149, 171, 142, 186, 122, 179, 2, 180, 173, 162, 172, 216, 154,
  66. 23, 26, 53, 204, 247, 153, 97, 90, 232, 36, 86, 64, 225, 99, 9, 51,
  67. 191, 152, 151, 133, 104, 252, 236, 10, 218, 111, 83, 98, 163, 46, 8, 175,
  68. 40, 176, 116, 194, 189, 54, 34, 56, 100, 30, 57, 44, 166, 48, 229, 68,
  69. 253, 136, 159, 101, 135, 107, 244, 35, 72, 16, 209, 81, 192, 249, 210, 160,
  70. 85, 161, 65, 250, 67, 19, 196, 47, 168, 182, 60, 43, 193, 255, 200, 165,
  71. 32, 137, 0, 144, 71, 239, 234, 183, 21, 6, 205, 181, 18, 126, 187, 41,
  72. 15, 184, 7, 4, 155, 148, 33, 102, 230, 206, 237, 231, 59, 254, 127, 197,
  73. 164, 55, 177, 76, 145, 110, 141, 118, 3, 45, 222, 150, 38, 125, 198, 92,
  74. 211, 242, 79, 25, 63, 220, 121, 29, 82, 235, 243, 109, 94, 251, 105, 178,
  75. 240, 49, 12, 212, 207, 140, 226, 117, 169, 74, 87, 132, 17, 69, 27, 245,
  76. 228, 14, 115, 170, 241, 221, 89, 20, 108, 146, 84, 208, 120, 112, 227, 73,
  77. 128, 80, 167, 246, 119, 147, 134, 131, 42, 199, 91, 233, 238, 143, 1, 61
  78. };
  79. static const uint8_t SBOX3[256] = {
  80. 56, 65, 22, 118, 217, 147, 96, 242, 114, 194, 171, 154, 117, 6, 87, 160,
  81. 145, 247, 181, 201, 162, 140, 210, 144, 246, 7, 167, 39, 142, 178, 73, 222,
  82. 67, 92, 215, 199, 62, 245, 143, 103, 31, 24, 110, 175, 47, 226, 133, 13,
  83. 83, 240, 156, 101, 234, 163, 174, 158, 236, 128, 45, 107, 168, 43, 54, 166,
  84. 197, 134, 77, 51, 253, 102, 88, 150, 58, 9, 149, 16, 120, 216, 66, 204,
  85. 239, 38, 229, 97, 26, 63, 59, 130, 182, 219, 212, 152, 232, 139, 2, 235,
  86. 10, 44, 29, 176, 111, 141, 136, 14, 25, 135, 78, 11, 169, 12, 121, 17,
  87. 127, 34, 231, 89, 225, 218, 61, 200, 18, 4, 116, 84, 48, 126, 180, 40,
  88. 85, 104, 80, 190, 208, 196, 49, 203, 42, 173, 15, 202, 112, 255, 50, 105,
  89. 8, 98, 0, 36, 209, 251, 186, 237, 69, 129, 115, 109, 132, 159, 238, 74,
  90. 195, 46, 193, 1, 230, 37, 72, 153, 185, 179, 123, 249, 206, 191, 223, 113,
  91. 41, 205, 108, 19, 100, 155, 99, 157, 192, 75, 183, 165, 137, 95, 177, 23,
  92. 244, 188, 211, 70, 207, 55, 94, 71, 148, 250, 252, 91, 151, 254, 90, 172,
  93. 60, 76, 3, 53, 243, 35, 184, 93, 106, 146, 213, 33, 68, 81, 198, 125,
  94. 57, 131, 220, 170, 124, 119, 86, 5, 27, 164, 21, 52, 30, 28, 248, 82,
  95. 32, 20, 233, 189, 221, 228, 161, 224, 138, 241, 214, 122, 187, 227, 64, 79
  96. };
  97. static const uint8_t SBOX4[256] = {
  98. 112, 44, 179, 192, 228, 87, 234, 174, 35, 107, 69, 165, 237, 79, 29, 146,
  99. 134, 175, 124, 31, 62, 220, 94, 11, 166, 57, 213, 93, 217, 90, 81, 108,
  100. 139, 154, 251, 176, 116, 43, 240, 132, 223, 203, 52, 118, 109, 169, 209, 4,
  101. 20, 58, 222, 17, 50, 156, 83, 242, 254, 207, 195, 122, 36, 232, 96, 105,
  102. 170, 160, 161, 98, 84, 30, 224, 100, 16, 0, 163, 117, 138, 230, 9, 221,
  103. 135, 131, 205, 144, 115, 246, 157, 191, 82, 216, 200, 198, 129, 111, 19, 99,
  104. 233, 167, 159, 188, 41, 249, 47, 180, 120, 6, 231, 113, 212, 171, 136, 141,
  105. 114, 185, 248, 172, 54, 42, 60, 241, 64, 211, 187, 67, 21, 173, 119, 128,
  106. 130, 236, 39, 229, 133, 53, 12, 65, 239, 147, 25, 33, 14, 78, 101, 189,
  107. 184, 143, 235, 206, 48, 95, 197, 26, 225, 202, 71, 61, 1, 214, 86, 77,
  108. 13, 102, 204, 45, 18, 32, 177, 153, 76, 194, 126, 5, 183, 49, 23, 215,
  109. 88, 97, 27, 28, 15, 22, 24, 34, 68, 178, 181, 145, 8, 168, 252, 80,
  110. 208, 125, 137, 151, 91, 149, 255, 210, 196, 72, 247, 219, 3, 218, 63, 148,
  111. 92, 2, 74, 51, 103, 243, 127, 226, 155, 38, 55, 59, 150, 75, 190, 46,
  112. 121, 140, 110, 142, 245, 182, 253, 89, 152, 106, 70, 186, 37, 66, 162, 250,
  113. 7, 85, 238, 10, 73, 104, 56, 164, 40, 123, 201, 193, 227, 244, 199, 158
  114. };
  115. const int av_camellia_size = sizeof(AVCAMELLIA);
  116. static void LR128(uint64_t d[2], const uint64_t K[2], int x)
  117. {
  118. int i = 0;
  119. if (64 <= x && x < 128) {
  120. i = 1;
  121. x -= 64;
  122. }
  123. if (x <= 0 || x >= 128) {
  124. d[0] = K[i];
  125. d[1] = K[!i];
  126. return;
  127. }
  128. d[0] = (K[i] << x | K[!i] >> (64 - x));
  129. d[1] = (K[!i] << x | K[i] >> (64 - x));
  130. }
  131. static uint64_t F(uint64_t F_IN, uint64_t KE)
  132. {
  133. uint8_t y[8];
  134. KE ^= F_IN;
  135. AV_WB64(y,KE);
  136. KE=SP[0][y[0]] ^ SP[1][y[1]] ^ SP[2][y[2]] ^ SP[3][y[3]] ^ SP[4][y[4]] ^ SP[5][y[5]] ^ SP[6][y[6]] ^ SP[7][y[7]];
  137. return KE;
  138. }
  139. static uint64_t FL(uint64_t FL_IN, uint64_t KE)
  140. {
  141. uint32_t x1, x2, k1, k2;
  142. x1 = FL_IN >> 32;
  143. x2 = FL_IN & MASK32;
  144. k1 = KE >> 32;
  145. k2 = KE & MASK32;
  146. x2 = x2 ^ LR32((x1 & k1), 1);
  147. x1 = x1 ^ (x2 | k2);
  148. return ((uint64_t)x1 << 32) | (uint64_t)x2;
  149. }
  150. static uint64_t FLINV(uint64_t FLINV_IN, uint64_t KE)
  151. {
  152. uint32_t x1, x2, k1, k2;
  153. x1 = FLINV_IN >> 32;
  154. x2 = FLINV_IN & MASK32;
  155. k1 = KE >> 32;
  156. k2 = KE & MASK32;
  157. x1 = x1 ^ (x2 | k2);
  158. x2 = x2 ^ LR32((x1 & k1), 1);
  159. return ((uint64_t)x1 << 32) | (uint64_t)x2;
  160. }
  161. static const uint8_t shifts[2][12] = {
  162. {0, 15, 15, 45, 45, 60, 94, 94, 111},
  163. {0, 15, 15, 30, 45, 45, 60, 60, 77, 94, 94, 111}
  164. };
  165. static const uint8_t vars[2][12] = {
  166. {2, 0, 2, 0, 2, 2, 0, 2, 0},
  167. {3, 1, 2, 3, 0, 2, 1, 3, 0, 1, 2, 0}
  168. };
  169. static void generate_round_keys(AVCAMELLIA *cs, uint64_t Kl[2], uint64_t Kr[2], uint64_t Ka[2], uint64_t Kb[2])
  170. {
  171. int i;
  172. uint64_t *Kd[4], d[2];
  173. Kd[0] = Kl;
  174. Kd[1] = Kr;
  175. Kd[2] = Ka;
  176. Kd[3] = Kb;
  177. cs->Kw[0] = Kl[0];
  178. cs->Kw[1] = Kl[1];
  179. if (cs->key_bits == 128) {
  180. for (i = 0; i < 9; i++) {
  181. LR128(d, Kd[vars[0][i]], shifts[0][i]);
  182. cs->K[2*i] = d[0];
  183. cs->K[2*i+1] = d[1];
  184. }
  185. LR128(d, Kd[0], 60);
  186. cs->K[9] = d[1];
  187. LR128(d, Kd[2], 30);
  188. cs->Ke[0] = d[0];
  189. cs->Ke[1] = d[1];
  190. LR128(d, Kd[0], 77);
  191. cs->Ke[2] = d[0];
  192. cs->Ke[3] = d[1];
  193. LR128(d, Kd[2], 111);
  194. cs->Kw[2] = d[0];
  195. cs->Kw[3] = d[1];
  196. } else {
  197. for (i = 0; i < 12; i++) {
  198. LR128(d, Kd[vars[1][i]], shifts[1][i]);
  199. cs->K[2*i] = d[0];
  200. cs->K[2*i+1] = d[1];
  201. }
  202. LR128(d, Kd[1], 30);
  203. cs->Ke[0] = d[0];
  204. cs->Ke[1] = d[1];
  205. LR128(d, Kd[0], 60);
  206. cs->Ke[2] = d[0];
  207. cs->Ke[3] = d[1];
  208. LR128(d, Kd[2], 77);
  209. cs->Ke[4] = d[0];
  210. cs->Ke[5] = d[1];
  211. LR128(d, Kd[3], 111);
  212. cs->Kw[2] = d[0];
  213. cs->Kw[3] = d[1];
  214. }
  215. }
  216. static void camellia_encrypt(AVCAMELLIA *cs, uint8_t *dst, const uint8_t *src)
  217. {
  218. uint64_t D1, D2;
  219. D1 = AV_RB64(src);
  220. D2 = AV_RB64(src + 8);
  221. D1 ^= cs->Kw[0];
  222. D2 ^= cs->Kw[1];
  223. D2 ^= F(D1, cs->K[0]);
  224. D1 ^= F(D2, cs->K[1]);
  225. D2 ^= F(D1, cs->K[2]);
  226. D1 ^= F(D2, cs->K[3]);
  227. D2 ^= F(D1, cs->K[4]);
  228. D1 ^= F(D2, cs->K[5]);
  229. D1 = FL(D1, cs->Ke[0]);
  230. D2 = FLINV(D2, cs->Ke[1]);
  231. D2 ^= F(D1, cs->K[6]);
  232. D1 ^= F(D2, cs->K[7]);
  233. D2 ^= F(D1, cs->K[8]);
  234. D1 ^= F(D2, cs->K[9]);
  235. D2 ^= F(D1, cs->K[10]);
  236. D1 ^= F(D2, cs->K[11]);
  237. D1 = FL(D1, cs->Ke[2]);
  238. D2 = FLINV(D2, cs->Ke[3]);
  239. D2 ^= F(D1, cs->K[12]);
  240. D1 ^= F(D2, cs->K[13]);
  241. D2 ^= F(D1, cs->K[14]);
  242. D1 ^= F(D2, cs->K[15]);
  243. D2 ^= F(D1, cs->K[16]);
  244. D1 ^= F(D2, cs->K[17]);
  245. if (cs->key_bits != 128) {
  246. D1 = FL(D1, cs->Ke[4]);
  247. D2 = FLINV(D2, cs->Ke[5]);
  248. D2 ^= F(D1, cs->K[18]);
  249. D1 ^= F(D2, cs->K[19]);
  250. D2 ^= F(D1, cs->K[20]);
  251. D1 ^= F(D2, cs->K[21]);
  252. D2 ^= F(D1, cs->K[22]);
  253. D1 ^= F(D2, cs->K[23]);
  254. }
  255. D2 ^= cs->Kw[2];
  256. D1 ^= cs->Kw[3];
  257. AV_WB64(dst, D2);
  258. AV_WB64(dst + 8, D1);
  259. }
  260. static void camellia_decrypt(AVCAMELLIA *cs, uint8_t *dst, const uint8_t *src, uint8_t *iv)
  261. {
  262. uint64_t D1, D2;
  263. D1 = AV_RB64(src);
  264. D2 = AV_RB64(src + 8);
  265. D1 ^= cs->Kw[2];
  266. D2 ^= cs->Kw[3];
  267. if (cs->key_bits != 128) {
  268. D2 ^= F(D1, cs->K[23]);
  269. D1 ^= F(D2, cs->K[22]);
  270. D2 ^= F(D1, cs->K[21]);
  271. D1 ^= F(D2, cs->K[20]);
  272. D2 ^= F(D1, cs->K[19]);
  273. D1 ^= F(D2, cs->K[18]);
  274. D1 = FL(D1, cs->Ke[5]);
  275. D2 = FLINV(D2, cs->Ke[4]);
  276. }
  277. D2 ^= F(D1, cs->K[17]);
  278. D1 ^= F(D2, cs->K[16]);
  279. D2 ^= F(D1, cs->K[15]);
  280. D1 ^= F(D2, cs->K[14]);
  281. D2 ^= F(D1, cs->K[13]);
  282. D1 ^= F(D2, cs->K[12]);
  283. D1 = FL(D1, cs->Ke[3]);
  284. D2 = FLINV(D2, cs->Ke[2]);
  285. D2 ^= F(D1, cs->K[11]);
  286. D1 ^= F(D2, cs->K[10]);
  287. D2 ^= F(D1, cs->K[9]);
  288. D1 ^= F(D2, cs->K[8]);
  289. D2 ^= F(D1, cs->K[7]);
  290. D1 ^= F(D2, cs->K[6]);
  291. D1 = FL(D1, cs->Ke[1]);
  292. D2 = FLINV(D2, cs->Ke[0]);
  293. D2 ^= F(D1, cs->K[5]);
  294. D1 ^= F(D2, cs->K[4]);
  295. D2 ^= F(D1, cs->K[3]);
  296. D1 ^= F(D2, cs->K[2]);
  297. D2 ^= F(D1, cs->K[1]);
  298. D1 ^= F(D2, cs->K[0]);
  299. D2 ^= cs->Kw[0];
  300. D1 ^= cs->Kw[1];
  301. if (iv) {
  302. D2 ^= AV_RB64(iv);
  303. D1 ^= AV_RB64(iv + 8);
  304. memcpy(iv, src, 16);
  305. }
  306. AV_WB64(dst, D2);
  307. AV_WB64(dst + 8, D1);
  308. }
  309. static void computeSP(void)
  310. {
  311. uint64_t z;
  312. int i;
  313. for (i = 0; i < 256; i++) {
  314. z = (uint64_t)SBOX1[i];
  315. SP[0][i] = (z << 56) ^ (z << 48) ^ (z << 40) ^ (z << 24) ^ z;
  316. SP[7][i] = (z << 56) ^ (z << 48) ^ (z << 40) ^ (z << 24) ^ (z << 16) ^ (z << 8);
  317. z = (uint64_t)SBOX2[i];
  318. SP[1][i] = (z << 48) ^ (z << 40) ^ (z << 32) ^ (z << 24) ^ (z << 16);
  319. SP[4][i] = (z << 48) ^ (z << 40) ^ (z << 32) ^ (z << 16) ^ (z << 8) ^ z;
  320. z = (uint64_t)SBOX3[i];
  321. SP[2][i] = (z << 56) ^ (z << 40) ^ (z << 32) ^ (z << 16) ^ (z << 8);
  322. SP[5][i] = (z << 56) ^ (z << 40) ^ (z << 32) ^ (z << 24) ^ (z << 8) ^ z;
  323. z = (uint64_t)SBOX4[i];
  324. SP[3][i] = (z << 56) ^ (z << 48) ^ (z << 32) ^ (z << 8) ^ z;
  325. SP[6][i] = (z << 56) ^ (z << 48) ^ (z << 32) ^ (z << 24) ^ (z << 16) ^ z;
  326. }
  327. }
  328. struct AVCAMELLIA *av_camellia_alloc(void)
  329. {
  330. return av_mallocz(sizeof(struct AVCAMELLIA));
  331. }
  332. av_cold int av_camellia_init(AVCAMELLIA *cs, const uint8_t *key, int key_bits)
  333. {
  334. uint64_t Kl[2], Kr[2], Ka[2], Kb[2];
  335. uint64_t D1, D2;
  336. if (key_bits != 128 && key_bits != 192 && key_bits != 256)
  337. return -1;
  338. memset(Kb, 0, sizeof(Kb));
  339. memset(Kr, 0, sizeof(Kr));
  340. cs->key_bits = key_bits;
  341. Kl[0] = AV_RB64(key);
  342. Kl[1] = AV_RB64(key + 8);
  343. if (key_bits == 192) {
  344. Kr[0] = AV_RB64(key + 16);
  345. Kr[1] = ~Kr[0];
  346. } else if (key_bits == 256) {
  347. Kr[0] = AV_RB64(key + 16);
  348. Kr[1] = AV_RB64(key + 24);
  349. }
  350. computeSP();
  351. D1 = Kl[0] ^ Kr[0];
  352. D2 = Kl[1] ^ Kr[1];
  353. D2 ^= F(D1, Sigma1);
  354. D1 ^= F(D2, Sigma2);
  355. D1 ^= Kl[0];
  356. D2 ^= Kl[1];
  357. D2 ^= F(D1, Sigma3);
  358. D1 ^= F(D2, Sigma4);
  359. Ka[0] = D1;
  360. Ka[1] = D2;
  361. if (key_bits != 128) {
  362. D1 = Ka[0] ^ Kr[0];
  363. D2 = Ka[1] ^ Kr[1];
  364. D2 ^= F(D1, Sigma5);
  365. D1 ^= F(D2, Sigma6);
  366. Kb[0] = D1;
  367. Kb[1] = D2;
  368. }
  369. generate_round_keys(cs, Kl, Kr, Ka, Kb);
  370. return 0;
  371. }
  372. void av_camellia_crypt(AVCAMELLIA *cs, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt)
  373. {
  374. int i;
  375. while (count--) {
  376. if (decrypt) {
  377. camellia_decrypt(cs, dst, src, iv);
  378. } else {
  379. if (iv) {
  380. for (i = 0; i < 16; i++)
  381. dst[i] = src[i] ^ iv[i];
  382. camellia_encrypt(cs, dst, dst);
  383. memcpy(iv, dst, 16);
  384. } else {
  385. camellia_encrypt(cs, dst, src);
  386. }
  387. }
  388. src = src + 16;
  389. dst = dst + 16;
  390. }
  391. }
  392. #ifdef TEST
  393. #include<stdio.h>
  394. #include<stdlib.h>
  395. #include"log.h"
  396. int main(int argc, char *argv[])
  397. {
  398. const uint8_t Key[3][32] = {
  399. {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
  400. {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77},
  401. {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}
  402. };
  403. const uint8_t rct[3][16] = {
  404. {0x67, 0x67, 0x31, 0x38, 0x54, 0x96, 0x69, 0x73, 0x08, 0x57, 0x06, 0x56, 0x48, 0xea, 0xbe, 0x43},
  405. {0xb4, 0x99, 0x34, 0x01, 0xb3, 0xe9,0x96, 0xf8, 0x4e, 0xe5, 0xce, 0xe7, 0xd7, 0x9b, 0x09, 0xb9},
  406. {0x9a, 0xcc, 0x23, 0x7d, 0xff, 0x16, 0xd7, 0x6c, 0x20, 0xef, 0x7c, 0x91, 0x9e, 0x3a, 0x75, 0x09}
  407. };
  408. const uint8_t rpt[32] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10};
  409. const int kbits[3] = {128, 192, 256};
  410. int i, j, err = 0;
  411. uint8_t temp[32], iv[16];
  412. AVCAMELLIA *cs;
  413. cs = av_camellia_alloc();
  414. if (!cs)
  415. return 1;
  416. for (j = 0; j < 3; j++) {
  417. av_camellia_init(cs, Key[j], kbits[j]);
  418. av_camellia_crypt(cs, temp, rpt, 1, NULL, 0);
  419. for (i = 0; i < 16; i++) {
  420. if (rct[j][i] != temp[i]) {
  421. av_log(NULL, AV_LOG_ERROR, "%d %02x %02x\n", i, rct[j][i], temp[i]);
  422. err = 1;
  423. }
  424. }
  425. av_camellia_crypt(cs, temp, rct[j], 1, NULL, 1);
  426. for (i = 0; i < 16; i++) {
  427. if (rpt[i] != temp[i]) {
  428. av_log(NULL, AV_LOG_ERROR, "%d %02x %02x\n", i, rpt[i], temp[i]);
  429. err = 1;
  430. }
  431. }
  432. }
  433. av_camellia_init(cs, Key[0], 128);
  434. memcpy(iv, "HALLO123HALLO123", 16);
  435. av_camellia_crypt(cs, temp, rpt, 2, iv, 0);
  436. memcpy(iv, "HALLO123HALLO123", 16);
  437. av_camellia_crypt(cs, temp, temp, 2, iv, 1);
  438. for (i = 0; i < 32; i++) {
  439. if (rpt[i] != temp[i]) {
  440. av_log(NULL, AV_LOG_ERROR, "%d %02x %02x\n", i, rpt[i], temp[i]);
  441. err = 1;
  442. }
  443. }
  444. av_free(cs);
  445. return err;
  446. }
  447. #endif