aria.c 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969
  1. /*
  2. * ARIA implementation
  3. *
  4. * Copyright The Mbed TLS Contributors
  5. * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
  6. */
  7. /*
  8. * This implementation is based on the following standards:
  9. * [1] http://210.104.33.10/ARIA/doc/ARIA-specification-e.pdf
  10. * [2] https://tools.ietf.org/html/rfc5794
  11. */
  12. #include "common.h"
  13. #if defined(MBEDTLS_ARIA_C)
  14. #include "mbedtls/aria.h"
  15. #include <string.h>
  16. #include "mbedtls/platform.h"
  17. #if !defined(MBEDTLS_ARIA_ALT)
  18. #include "mbedtls/platform_util.h"
  19. /*
  20. * modify byte order: ( A B C D ) -> ( B A D C ), i.e. swap pairs of bytes
  21. *
  22. * This is submatrix P1 in [1] Appendix B.1
  23. *
  24. * Common compilers fail to translate this to minimal number of instructions,
  25. * so let's provide asm versions for common platforms with C fallback.
  26. */
  27. #if defined(MBEDTLS_HAVE_ASM)
  28. #if defined(__arm__) /* rev16 available from v6 up */
  29. /* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */
  30. #if defined(__GNUC__) && \
  31. (!defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000) && \
  32. __ARM_ARCH >= 6
  33. static inline uint32_t aria_p1(uint32_t x)
  34. {
  35. uint32_t r;
  36. __asm("rev16 %0, %1" : "=l" (r) : "l" (x));
  37. return r;
  38. }
  39. #define ARIA_P1 aria_p1
  40. #elif defined(__ARMCC_VERSION) && __ARMCC_VERSION < 6000000 && \
  41. (__TARGET_ARCH_ARM >= 6 || __TARGET_ARCH_THUMB >= 3)
  42. static inline uint32_t aria_p1(uint32_t x)
  43. {
  44. uint32_t r;
  45. __asm("rev16 r, x");
  46. return r;
  47. }
  48. #define ARIA_P1 aria_p1
  49. #endif
  50. #endif /* arm */
  51. #if defined(__GNUC__) && \
  52. defined(__i386__) || defined(__amd64__) || defined(__x86_64__)
  53. /* I couldn't find an Intel equivalent of rev16, so two instructions */
  54. #define ARIA_P1(x) ARIA_P2(ARIA_P3(x))
  55. #endif /* x86 gnuc */
  56. #endif /* MBEDTLS_HAVE_ASM && GNUC */
  57. #if !defined(ARIA_P1)
  58. #define ARIA_P1(x) ((((x) >> 8) & 0x00FF00FF) ^ (((x) & 0x00FF00FF) << 8))
  59. #endif
  60. /*
  61. * modify byte order: ( A B C D ) -> ( C D A B ), i.e. rotate by 16 bits
  62. *
  63. * This is submatrix P2 in [1] Appendix B.1
  64. *
  65. * Common compilers will translate this to a single instruction.
  66. */
  67. #define ARIA_P2(x) (((x) >> 16) ^ ((x) << 16))
  68. /*
  69. * modify byte order: ( A B C D ) -> ( D C B A ), i.e. change endianness
  70. *
  71. * This is submatrix P3 in [1] Appendix B.1
  72. */
  73. #define ARIA_P3(x) MBEDTLS_BSWAP32(x)
  74. /*
  75. * ARIA Affine Transform
  76. * (a, b, c, d) = state in/out
  77. *
  78. * If we denote the first byte of input by 0, ..., the last byte by f,
  79. * then inputs are: a = 0123, b = 4567, c = 89ab, d = cdef.
  80. *
  81. * Reading [1] 2.4 or [2] 2.4.3 in columns and performing simple
  82. * rearrangements on adjacent pairs, output is:
  83. *
  84. * a = 3210 + 4545 + 6767 + 88aa + 99bb + dccd + effe
  85. * = 3210 + 4567 + 6745 + 89ab + 98ba + dcfe + efcd
  86. * b = 0101 + 2323 + 5476 + 8998 + baab + eecc + ffdd
  87. * = 0123 + 2301 + 5476 + 89ab + ba98 + efcd + fedc
  88. * c = 0022 + 1133 + 4554 + 7667 + ab89 + dcdc + fefe
  89. * = 0123 + 1032 + 4567 + 7654 + ab89 + dcfe + fedc
  90. * d = 1001 + 2332 + 6644 + 7755 + 9898 + baba + cdef
  91. * = 1032 + 2301 + 6745 + 7654 + 98ba + ba98 + cdef
  92. *
  93. * Note: another presentation of the A transform can be found as the first
  94. * half of App. B.1 in [1] in terms of 4-byte operators P1, P2, P3 and P4.
  95. * The implementation below uses only P1 and P2 as they are sufficient.
  96. */
  97. static inline void aria_a(uint32_t *a, uint32_t *b,
  98. uint32_t *c, uint32_t *d)
  99. {
  100. uint32_t ta, tb, tc;
  101. ta = *b; // 4567
  102. *b = *a; // 0123
  103. *a = ARIA_P2(ta); // 6745
  104. tb = ARIA_P2(*d); // efcd
  105. *d = ARIA_P1(*c); // 98ba
  106. *c = ARIA_P1(tb); // fedc
  107. ta ^= *d; // 4567+98ba
  108. tc = ARIA_P2(*b); // 2301
  109. ta = ARIA_P1(ta) ^ tc ^ *c; // 2301+5476+89ab+fedc
  110. tb ^= ARIA_P2(*d); // ba98+efcd
  111. tc ^= ARIA_P1(*a); // 2301+7654
  112. *b ^= ta ^ tb; // 0123+2301+5476+89ab+ba98+efcd+fedc OUT
  113. tb = ARIA_P2(tb) ^ ta; // 2301+5476+89ab+98ba+cdef+fedc
  114. *a ^= ARIA_P1(tb); // 3210+4567+6745+89ab+98ba+dcfe+efcd OUT
  115. ta = ARIA_P2(ta); // 0123+7654+ab89+dcfe
  116. *d ^= ARIA_P1(ta) ^ tc; // 1032+2301+6745+7654+98ba+ba98+cdef OUT
  117. tc = ARIA_P2(tc); // 0123+5476
  118. *c ^= ARIA_P1(tc) ^ ta; // 0123+1032+4567+7654+ab89+dcfe+fedc OUT
  119. }
  120. /*
  121. * ARIA Substitution Layer SL1 / SL2
  122. * (a, b, c, d) = state in/out
  123. * (sa, sb, sc, sd) = 256 8-bit S-Boxes (see below)
  124. *
  125. * By passing sb1, sb2, is1, is2 as S-Boxes you get SL1
  126. * By passing is1, is2, sb1, sb2 as S-Boxes you get SL2
  127. */
  128. static inline void aria_sl(uint32_t *a, uint32_t *b,
  129. uint32_t *c, uint32_t *d,
  130. const uint8_t sa[256], const uint8_t sb[256],
  131. const uint8_t sc[256], const uint8_t sd[256])
  132. {
  133. *a = ((uint32_t) sa[MBEDTLS_BYTE_0(*a)]) ^
  134. (((uint32_t) sb[MBEDTLS_BYTE_1(*a)]) << 8) ^
  135. (((uint32_t) sc[MBEDTLS_BYTE_2(*a)]) << 16) ^
  136. (((uint32_t) sd[MBEDTLS_BYTE_3(*a)]) << 24);
  137. *b = ((uint32_t) sa[MBEDTLS_BYTE_0(*b)]) ^
  138. (((uint32_t) sb[MBEDTLS_BYTE_1(*b)]) << 8) ^
  139. (((uint32_t) sc[MBEDTLS_BYTE_2(*b)]) << 16) ^
  140. (((uint32_t) sd[MBEDTLS_BYTE_3(*b)]) << 24);
  141. *c = ((uint32_t) sa[MBEDTLS_BYTE_0(*c)]) ^
  142. (((uint32_t) sb[MBEDTLS_BYTE_1(*c)]) << 8) ^
  143. (((uint32_t) sc[MBEDTLS_BYTE_2(*c)]) << 16) ^
  144. (((uint32_t) sd[MBEDTLS_BYTE_3(*c)]) << 24);
  145. *d = ((uint32_t) sa[MBEDTLS_BYTE_0(*d)]) ^
  146. (((uint32_t) sb[MBEDTLS_BYTE_1(*d)]) << 8) ^
  147. (((uint32_t) sc[MBEDTLS_BYTE_2(*d)]) << 16) ^
  148. (((uint32_t) sd[MBEDTLS_BYTE_3(*d)]) << 24);
  149. }
  150. /*
  151. * S-Boxes
  152. */
  153. static const uint8_t aria_sb1[256] =
  154. {
  155. 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B,
  156. 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
  157. 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26,
  158. 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
  159. 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2,
  160. 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
  161. 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED,
  162. 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
  163. 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F,
  164. 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
  165. 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC,
  166. 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
  167. 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14,
  168. 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
  169. 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D,
  170. 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
  171. 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F,
  172. 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
  173. 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11,
  174. 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
  175. 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F,
  176. 0xB0, 0x54, 0xBB, 0x16
  177. };
  178. static const uint8_t aria_sb2[256] =
  179. {
  180. 0xE2, 0x4E, 0x54, 0xFC, 0x94, 0xC2, 0x4A, 0xCC, 0x62, 0x0D, 0x6A, 0x46,
  181. 0x3C, 0x4D, 0x8B, 0xD1, 0x5E, 0xFA, 0x64, 0xCB, 0xB4, 0x97, 0xBE, 0x2B,
  182. 0xBC, 0x77, 0x2E, 0x03, 0xD3, 0x19, 0x59, 0xC1, 0x1D, 0x06, 0x41, 0x6B,
  183. 0x55, 0xF0, 0x99, 0x69, 0xEA, 0x9C, 0x18, 0xAE, 0x63, 0xDF, 0xE7, 0xBB,
  184. 0x00, 0x73, 0x66, 0xFB, 0x96, 0x4C, 0x85, 0xE4, 0x3A, 0x09, 0x45, 0xAA,
  185. 0x0F, 0xEE, 0x10, 0xEB, 0x2D, 0x7F, 0xF4, 0x29, 0xAC, 0xCF, 0xAD, 0x91,
  186. 0x8D, 0x78, 0xC8, 0x95, 0xF9, 0x2F, 0xCE, 0xCD, 0x08, 0x7A, 0x88, 0x38,
  187. 0x5C, 0x83, 0x2A, 0x28, 0x47, 0xDB, 0xB8, 0xC7, 0x93, 0xA4, 0x12, 0x53,
  188. 0xFF, 0x87, 0x0E, 0x31, 0x36, 0x21, 0x58, 0x48, 0x01, 0x8E, 0x37, 0x74,
  189. 0x32, 0xCA, 0xE9, 0xB1, 0xB7, 0xAB, 0x0C, 0xD7, 0xC4, 0x56, 0x42, 0x26,
  190. 0x07, 0x98, 0x60, 0xD9, 0xB6, 0xB9, 0x11, 0x40, 0xEC, 0x20, 0x8C, 0xBD,
  191. 0xA0, 0xC9, 0x84, 0x04, 0x49, 0x23, 0xF1, 0x4F, 0x50, 0x1F, 0x13, 0xDC,
  192. 0xD8, 0xC0, 0x9E, 0x57, 0xE3, 0xC3, 0x7B, 0x65, 0x3B, 0x02, 0x8F, 0x3E,
  193. 0xE8, 0x25, 0x92, 0xE5, 0x15, 0xDD, 0xFD, 0x17, 0xA9, 0xBF, 0xD4, 0x9A,
  194. 0x7E, 0xC5, 0x39, 0x67, 0xFE, 0x76, 0x9D, 0x43, 0xA7, 0xE1, 0xD0, 0xF5,
  195. 0x68, 0xF2, 0x1B, 0x34, 0x70, 0x05, 0xA3, 0x8A, 0xD5, 0x79, 0x86, 0xA8,
  196. 0x30, 0xC6, 0x51, 0x4B, 0x1E, 0xA6, 0x27, 0xF6, 0x35, 0xD2, 0x6E, 0x24,
  197. 0x16, 0x82, 0x5F, 0xDA, 0xE6, 0x75, 0xA2, 0xEF, 0x2C, 0xB2, 0x1C, 0x9F,
  198. 0x5D, 0x6F, 0x80, 0x0A, 0x72, 0x44, 0x9B, 0x6C, 0x90, 0x0B, 0x5B, 0x33,
  199. 0x7D, 0x5A, 0x52, 0xF3, 0x61, 0xA1, 0xF7, 0xB0, 0xD6, 0x3F, 0x7C, 0x6D,
  200. 0xED, 0x14, 0xE0, 0xA5, 0x3D, 0x22, 0xB3, 0xF8, 0x89, 0xDE, 0x71, 0x1A,
  201. 0xAF, 0xBA, 0xB5, 0x81
  202. };
  203. static const uint8_t aria_is1[256] =
  204. {
  205. 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E,
  206. 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
  207. 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32,
  208. 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
  209. 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49,
  210. 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
  211. 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50,
  212. 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
  213. 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05,
  214. 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
  215. 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41,
  216. 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
  217. 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8,
  218. 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
  219. 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B,
  220. 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
  221. 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59,
  222. 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
  223. 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D,
  224. 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
  225. 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63,
  226. 0x55, 0x21, 0x0C, 0x7D
  227. };
  228. static const uint8_t aria_is2[256] =
  229. {
  230. 0x30, 0x68, 0x99, 0x1B, 0x87, 0xB9, 0x21, 0x78, 0x50, 0x39, 0xDB, 0xE1,
  231. 0x72, 0x09, 0x62, 0x3C, 0x3E, 0x7E, 0x5E, 0x8E, 0xF1, 0xA0, 0xCC, 0xA3,
  232. 0x2A, 0x1D, 0xFB, 0xB6, 0xD6, 0x20, 0xC4, 0x8D, 0x81, 0x65, 0xF5, 0x89,
  233. 0xCB, 0x9D, 0x77, 0xC6, 0x57, 0x43, 0x56, 0x17, 0xD4, 0x40, 0x1A, 0x4D,
  234. 0xC0, 0x63, 0x6C, 0xE3, 0xB7, 0xC8, 0x64, 0x6A, 0x53, 0xAA, 0x38, 0x98,
  235. 0x0C, 0xF4, 0x9B, 0xED, 0x7F, 0x22, 0x76, 0xAF, 0xDD, 0x3A, 0x0B, 0x58,
  236. 0x67, 0x88, 0x06, 0xC3, 0x35, 0x0D, 0x01, 0x8B, 0x8C, 0xC2, 0xE6, 0x5F,
  237. 0x02, 0x24, 0x75, 0x93, 0x66, 0x1E, 0xE5, 0xE2, 0x54, 0xD8, 0x10, 0xCE,
  238. 0x7A, 0xE8, 0x08, 0x2C, 0x12, 0x97, 0x32, 0xAB, 0xB4, 0x27, 0x0A, 0x23,
  239. 0xDF, 0xEF, 0xCA, 0xD9, 0xB8, 0xFA, 0xDC, 0x31, 0x6B, 0xD1, 0xAD, 0x19,
  240. 0x49, 0xBD, 0x51, 0x96, 0xEE, 0xE4, 0xA8, 0x41, 0xDA, 0xFF, 0xCD, 0x55,
  241. 0x86, 0x36, 0xBE, 0x61, 0x52, 0xF8, 0xBB, 0x0E, 0x82, 0x48, 0x69, 0x9A,
  242. 0xE0, 0x47, 0x9E, 0x5C, 0x04, 0x4B, 0x34, 0x15, 0x79, 0x26, 0xA7, 0xDE,
  243. 0x29, 0xAE, 0x92, 0xD7, 0x84, 0xE9, 0xD2, 0xBA, 0x5D, 0xF3, 0xC5, 0xB0,
  244. 0xBF, 0xA4, 0x3B, 0x71, 0x44, 0x46, 0x2B, 0xFC, 0xEB, 0x6F, 0xD5, 0xF6,
  245. 0x14, 0xFE, 0x7C, 0x70, 0x5A, 0x7D, 0xFD, 0x2F, 0x18, 0x83, 0x16, 0xA5,
  246. 0x91, 0x1F, 0x05, 0x95, 0x74, 0xA9, 0xC1, 0x5B, 0x4A, 0x85, 0x6D, 0x13,
  247. 0x07, 0x4F, 0x4E, 0x45, 0xB2, 0x0F, 0xC9, 0x1C, 0xA6, 0xBC, 0xEC, 0x73,
  248. 0x90, 0x7B, 0xCF, 0x59, 0x8F, 0xA1, 0xF9, 0x2D, 0xF2, 0xB1, 0x00, 0x94,
  249. 0x37, 0x9F, 0xD0, 0x2E, 0x9C, 0x6E, 0x28, 0x3F, 0x80, 0xF0, 0x3D, 0xD3,
  250. 0x25, 0x8A, 0xB5, 0xE7, 0x42, 0xB3, 0xC7, 0xEA, 0xF7, 0x4C, 0x11, 0x33,
  251. 0x03, 0xA2, 0xAC, 0x60
  252. };
  253. /*
  254. * Helper for key schedule: r = FO( p, k ) ^ x
  255. */
  256. static void aria_fo_xor(uint32_t r[4], const uint32_t p[4],
  257. const uint32_t k[4], const uint32_t x[4])
  258. {
  259. uint32_t a, b, c, d;
  260. a = p[0] ^ k[0];
  261. b = p[1] ^ k[1];
  262. c = p[2] ^ k[2];
  263. d = p[3] ^ k[3];
  264. aria_sl(&a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2);
  265. aria_a(&a, &b, &c, &d);
  266. r[0] = a ^ x[0];
  267. r[1] = b ^ x[1];
  268. r[2] = c ^ x[2];
  269. r[3] = d ^ x[3];
  270. }
  271. /*
  272. * Helper for key schedule: r = FE( p, k ) ^ x
  273. */
  274. static void aria_fe_xor(uint32_t r[4], const uint32_t p[4],
  275. const uint32_t k[4], const uint32_t x[4])
  276. {
  277. uint32_t a, b, c, d;
  278. a = p[0] ^ k[0];
  279. b = p[1] ^ k[1];
  280. c = p[2] ^ k[2];
  281. d = p[3] ^ k[3];
  282. aria_sl(&a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2);
  283. aria_a(&a, &b, &c, &d);
  284. r[0] = a ^ x[0];
  285. r[1] = b ^ x[1];
  286. r[2] = c ^ x[2];
  287. r[3] = d ^ x[3];
  288. }
  289. /*
  290. * Big endian 128-bit rotation: r = a ^ (b <<< n), used only in key setup.
  291. *
  292. * We chose to store bytes into 32-bit words in little-endian format (see
  293. * MBEDTLS_GET_UINT32_LE / MBEDTLS_PUT_UINT32_LE ) so we need to reverse
  294. * bytes here.
  295. */
  296. static void aria_rot128(uint32_t r[4], const uint32_t a[4],
  297. const uint32_t b[4], uint8_t n)
  298. {
  299. uint8_t i, j;
  300. uint32_t t, u;
  301. const uint8_t n1 = n % 32; // bit offset
  302. const uint8_t n2 = n1 ? 32 - n1 : 0; // reverse bit offset
  303. j = (n / 32) % 4; // initial word offset
  304. t = ARIA_P3(b[j]); // big endian
  305. for (i = 0; i < 4; i++) {
  306. j = (j + 1) % 4; // get next word, big endian
  307. u = ARIA_P3(b[j]);
  308. t <<= n1; // rotate
  309. t |= u >> n2;
  310. t = ARIA_P3(t); // back to little endian
  311. r[i] = a[i] ^ t; // store
  312. t = u; // move to next word
  313. }
  314. }
  315. /*
  316. * Set encryption key
  317. */
  318. int mbedtls_aria_setkey_enc(mbedtls_aria_context *ctx,
  319. const unsigned char *key, unsigned int keybits)
  320. {
  321. /* round constant masks */
  322. const uint32_t rc[3][4] =
  323. {
  324. { 0xB7C17C51, 0x940A2227, 0xE8AB13FE, 0xE06E9AFA },
  325. { 0xCC4AB16D, 0x20C8219E, 0xD5B128FF, 0xB0E25DEF },
  326. { 0x1D3792DB, 0x70E92621, 0x75972403, 0x0EC9E804 }
  327. };
  328. int i;
  329. uint32_t w[4][4], *w2;
  330. if (keybits != 128 && keybits != 192 && keybits != 256) {
  331. return MBEDTLS_ERR_ARIA_BAD_INPUT_DATA;
  332. }
  333. /* Copy key to W0 (and potential remainder to W1) */
  334. w[0][0] = MBEDTLS_GET_UINT32_LE(key, 0);
  335. w[0][1] = MBEDTLS_GET_UINT32_LE(key, 4);
  336. w[0][2] = MBEDTLS_GET_UINT32_LE(key, 8);
  337. w[0][3] = MBEDTLS_GET_UINT32_LE(key, 12);
  338. memset(w[1], 0, 16);
  339. if (keybits >= 192) {
  340. w[1][0] = MBEDTLS_GET_UINT32_LE(key, 16); // 192 bit key
  341. w[1][1] = MBEDTLS_GET_UINT32_LE(key, 20);
  342. }
  343. if (keybits == 256) {
  344. w[1][2] = MBEDTLS_GET_UINT32_LE(key, 24); // 256 bit key
  345. w[1][3] = MBEDTLS_GET_UINT32_LE(key, 28);
  346. }
  347. i = (keybits - 128) >> 6; // index: 0, 1, 2
  348. ctx->nr = 12 + 2 * i; // no. rounds: 12, 14, 16
  349. aria_fo_xor(w[1], w[0], rc[i], w[1]); // W1 = FO(W0, CK1) ^ KR
  350. i = i < 2 ? i + 1 : 0;
  351. aria_fe_xor(w[2], w[1], rc[i], w[0]); // W2 = FE(W1, CK2) ^ W0
  352. i = i < 2 ? i + 1 : 0;
  353. aria_fo_xor(w[3], w[2], rc[i], w[1]); // W3 = FO(W2, CK3) ^ W1
  354. for (i = 0; i < 4; i++) { // create round keys
  355. w2 = w[(i + 1) & 3];
  356. aria_rot128(ctx->rk[i], w[i], w2, 128 - 19);
  357. aria_rot128(ctx->rk[i + 4], w[i], w2, 128 - 31);
  358. aria_rot128(ctx->rk[i + 8], w[i], w2, 61);
  359. aria_rot128(ctx->rk[i + 12], w[i], w2, 31);
  360. }
  361. aria_rot128(ctx->rk[16], w[0], w[1], 19);
  362. /* w holds enough info to reconstruct the round keys */
  363. mbedtls_platform_zeroize(w, sizeof(w));
  364. return 0;
  365. }
  366. /*
  367. * Set decryption key
  368. */
  369. #if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
  370. int mbedtls_aria_setkey_dec(mbedtls_aria_context *ctx,
  371. const unsigned char *key, unsigned int keybits)
  372. {
  373. int i, j, k, ret;
  374. ret = mbedtls_aria_setkey_enc(ctx, key, keybits);
  375. if (ret != 0) {
  376. return ret;
  377. }
  378. /* flip the order of round keys */
  379. for (i = 0, j = ctx->nr; i < j; i++, j--) {
  380. for (k = 0; k < 4; k++) {
  381. uint32_t t = ctx->rk[i][k];
  382. ctx->rk[i][k] = ctx->rk[j][k];
  383. ctx->rk[j][k] = t;
  384. }
  385. }
  386. /* apply affine transform to middle keys */
  387. for (i = 1; i < ctx->nr; i++) {
  388. aria_a(&ctx->rk[i][0], &ctx->rk[i][1],
  389. &ctx->rk[i][2], &ctx->rk[i][3]);
  390. }
  391. return 0;
  392. }
  393. #endif /* !MBEDTLS_BLOCK_CIPHER_NO_DECRYPT */
  394. /*
  395. * Encrypt a block
  396. */
  397. int mbedtls_aria_crypt_ecb(mbedtls_aria_context *ctx,
  398. const unsigned char input[MBEDTLS_ARIA_BLOCKSIZE],
  399. unsigned char output[MBEDTLS_ARIA_BLOCKSIZE])
  400. {
  401. int i;
  402. uint32_t a, b, c, d;
  403. a = MBEDTLS_GET_UINT32_LE(input, 0);
  404. b = MBEDTLS_GET_UINT32_LE(input, 4);
  405. c = MBEDTLS_GET_UINT32_LE(input, 8);
  406. d = MBEDTLS_GET_UINT32_LE(input, 12);
  407. i = 0;
  408. while (1) {
  409. a ^= ctx->rk[i][0];
  410. b ^= ctx->rk[i][1];
  411. c ^= ctx->rk[i][2];
  412. d ^= ctx->rk[i][3];
  413. i++;
  414. aria_sl(&a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2);
  415. aria_a(&a, &b, &c, &d);
  416. a ^= ctx->rk[i][0];
  417. b ^= ctx->rk[i][1];
  418. c ^= ctx->rk[i][2];
  419. d ^= ctx->rk[i][3];
  420. i++;
  421. aria_sl(&a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2);
  422. if (i >= ctx->nr) {
  423. break;
  424. }
  425. aria_a(&a, &b, &c, &d);
  426. }
  427. /* final key mixing */
  428. a ^= ctx->rk[i][0];
  429. b ^= ctx->rk[i][1];
  430. c ^= ctx->rk[i][2];
  431. d ^= ctx->rk[i][3];
  432. MBEDTLS_PUT_UINT32_LE(a, output, 0);
  433. MBEDTLS_PUT_UINT32_LE(b, output, 4);
  434. MBEDTLS_PUT_UINT32_LE(c, output, 8);
  435. MBEDTLS_PUT_UINT32_LE(d, output, 12);
  436. return 0;
  437. }
  438. /* Initialize context */
  439. void mbedtls_aria_init(mbedtls_aria_context *ctx)
  440. {
  441. memset(ctx, 0, sizeof(mbedtls_aria_context));
  442. }
  443. /* Clear context */
  444. void mbedtls_aria_free(mbedtls_aria_context *ctx)
  445. {
  446. if (ctx == NULL) {
  447. return;
  448. }
  449. mbedtls_platform_zeroize(ctx, sizeof(mbedtls_aria_context));
  450. }
  451. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  452. /*
  453. * ARIA-CBC buffer encryption/decryption
  454. */
  455. int mbedtls_aria_crypt_cbc(mbedtls_aria_context *ctx,
  456. int mode,
  457. size_t length,
  458. unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE],
  459. const unsigned char *input,
  460. unsigned char *output)
  461. {
  462. unsigned char temp[MBEDTLS_ARIA_BLOCKSIZE];
  463. if ((mode != MBEDTLS_ARIA_ENCRYPT) && (mode != MBEDTLS_ARIA_DECRYPT)) {
  464. return MBEDTLS_ERR_ARIA_BAD_INPUT_DATA;
  465. }
  466. if (length % MBEDTLS_ARIA_BLOCKSIZE) {
  467. return MBEDTLS_ERR_ARIA_INVALID_INPUT_LENGTH;
  468. }
  469. if (mode == MBEDTLS_ARIA_DECRYPT) {
  470. while (length > 0) {
  471. memcpy(temp, input, MBEDTLS_ARIA_BLOCKSIZE);
  472. mbedtls_aria_crypt_ecb(ctx, input, output);
  473. mbedtls_xor(output, output, iv, MBEDTLS_ARIA_BLOCKSIZE);
  474. memcpy(iv, temp, MBEDTLS_ARIA_BLOCKSIZE);
  475. input += MBEDTLS_ARIA_BLOCKSIZE;
  476. output += MBEDTLS_ARIA_BLOCKSIZE;
  477. length -= MBEDTLS_ARIA_BLOCKSIZE;
  478. }
  479. } else {
  480. while (length > 0) {
  481. mbedtls_xor(output, input, iv, MBEDTLS_ARIA_BLOCKSIZE);
  482. mbedtls_aria_crypt_ecb(ctx, output, output);
  483. memcpy(iv, output, MBEDTLS_ARIA_BLOCKSIZE);
  484. input += MBEDTLS_ARIA_BLOCKSIZE;
  485. output += MBEDTLS_ARIA_BLOCKSIZE;
  486. length -= MBEDTLS_ARIA_BLOCKSIZE;
  487. }
  488. }
  489. return 0;
  490. }
  491. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  492. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  493. /*
  494. * ARIA-CFB128 buffer encryption/decryption
  495. */
  496. int mbedtls_aria_crypt_cfb128(mbedtls_aria_context *ctx,
  497. int mode,
  498. size_t length,
  499. size_t *iv_off,
  500. unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE],
  501. const unsigned char *input,
  502. unsigned char *output)
  503. {
  504. unsigned char c;
  505. size_t n;
  506. if ((mode != MBEDTLS_ARIA_ENCRYPT) && (mode != MBEDTLS_ARIA_DECRYPT)) {
  507. return MBEDTLS_ERR_ARIA_BAD_INPUT_DATA;
  508. }
  509. n = *iv_off;
  510. /* An overly large value of n can lead to an unlimited
  511. * buffer overflow. */
  512. if (n >= MBEDTLS_ARIA_BLOCKSIZE) {
  513. return MBEDTLS_ERR_ARIA_BAD_INPUT_DATA;
  514. }
  515. if (mode == MBEDTLS_ARIA_DECRYPT) {
  516. while (length--) {
  517. if (n == 0) {
  518. mbedtls_aria_crypt_ecb(ctx, iv, iv);
  519. }
  520. c = *input++;
  521. *output++ = c ^ iv[n];
  522. iv[n] = c;
  523. n = (n + 1) & 0x0F;
  524. }
  525. } else {
  526. while (length--) {
  527. if (n == 0) {
  528. mbedtls_aria_crypt_ecb(ctx, iv, iv);
  529. }
  530. iv[n] = *output++ = (unsigned char) (iv[n] ^ *input++);
  531. n = (n + 1) & 0x0F;
  532. }
  533. }
  534. *iv_off = n;
  535. return 0;
  536. }
  537. #endif /* MBEDTLS_CIPHER_MODE_CFB */
  538. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  539. /*
  540. * ARIA-CTR buffer encryption/decryption
  541. */
  542. int mbedtls_aria_crypt_ctr(mbedtls_aria_context *ctx,
  543. size_t length,
  544. size_t *nc_off,
  545. unsigned char nonce_counter[MBEDTLS_ARIA_BLOCKSIZE],
  546. unsigned char stream_block[MBEDTLS_ARIA_BLOCKSIZE],
  547. const unsigned char *input,
  548. unsigned char *output)
  549. {
  550. int c, i;
  551. size_t n;
  552. n = *nc_off;
  553. /* An overly large value of n can lead to an unlimited
  554. * buffer overflow. */
  555. if (n >= MBEDTLS_ARIA_BLOCKSIZE) {
  556. return MBEDTLS_ERR_ARIA_BAD_INPUT_DATA;
  557. }
  558. while (length--) {
  559. if (n == 0) {
  560. mbedtls_aria_crypt_ecb(ctx, nonce_counter,
  561. stream_block);
  562. for (i = MBEDTLS_ARIA_BLOCKSIZE; i > 0; i--) {
  563. if (++nonce_counter[i - 1] != 0) {
  564. break;
  565. }
  566. }
  567. }
  568. c = *input++;
  569. *output++ = (unsigned char) (c ^ stream_block[n]);
  570. n = (n + 1) & 0x0F;
  571. }
  572. *nc_off = n;
  573. return 0;
  574. }
  575. #endif /* MBEDTLS_CIPHER_MODE_CTR */
  576. #endif /* !MBEDTLS_ARIA_ALT */
  577. #if defined(MBEDTLS_SELF_TEST)
  578. /*
  579. * Basic ARIA ECB test vectors from RFC 5794
  580. */
  581. static const uint8_t aria_test1_ecb_key[32] = // test key
  582. {
  583. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // 128 bit
  584. 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
  585. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // 192 bit
  586. 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F // 256 bit
  587. };
  588. static const uint8_t aria_test1_ecb_pt[MBEDTLS_ARIA_BLOCKSIZE] = // plaintext
  589. {
  590. 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // same for all
  591. 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF // key sizes
  592. };
  593. static const uint8_t aria_test1_ecb_ct[3][MBEDTLS_ARIA_BLOCKSIZE] = // ciphertext
  594. {
  595. { 0xD7, 0x18, 0xFB, 0xD6, 0xAB, 0x64, 0x4C, 0x73, // 128 bit
  596. 0x9D, 0xA9, 0x5F, 0x3B, 0xE6, 0x45, 0x17, 0x78 },
  597. { 0x26, 0x44, 0x9C, 0x18, 0x05, 0xDB, 0xE7, 0xAA, // 192 bit
  598. 0x25, 0xA4, 0x68, 0xCE, 0x26, 0x3A, 0x9E, 0x79 },
  599. { 0xF9, 0x2B, 0xD7, 0xC7, 0x9F, 0xB7, 0x2E, 0x2F, // 256 bit
  600. 0x2B, 0x8F, 0x80, 0xC1, 0x97, 0x2D, 0x24, 0xFC }
  601. };
  602. /*
  603. * Mode tests from "Test Vectors for ARIA" Version 1.0
  604. * http://210.104.33.10/ARIA/doc/ARIA-testvector-e.pdf
  605. */
  606. #if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
  607. defined(MBEDTLS_CIPHER_MODE_CTR))
  608. static const uint8_t aria_test2_key[32] =
  609. {
  610. 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 128 bit
  611. 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
  612. 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 192 bit
  613. 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff // 256 bit
  614. };
  615. static const uint8_t aria_test2_pt[48] =
  616. {
  617. 0x11, 0x11, 0x11, 0x11, 0xaa, 0xaa, 0xaa, 0xaa, // same for all
  618. 0x11, 0x11, 0x11, 0x11, 0xbb, 0xbb, 0xbb, 0xbb,
  619. 0x11, 0x11, 0x11, 0x11, 0xcc, 0xcc, 0xcc, 0xcc,
  620. 0x11, 0x11, 0x11, 0x11, 0xdd, 0xdd, 0xdd, 0xdd,
  621. 0x22, 0x22, 0x22, 0x22, 0xaa, 0xaa, 0xaa, 0xaa,
  622. 0x22, 0x22, 0x22, 0x22, 0xbb, 0xbb, 0xbb, 0xbb,
  623. };
  624. #endif
  625. #if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB))
  626. static const uint8_t aria_test2_iv[MBEDTLS_ARIA_BLOCKSIZE] =
  627. {
  628. 0x0f, 0x1e, 0x2d, 0x3c, 0x4b, 0x5a, 0x69, 0x78, // same for CBC, CFB
  629. 0x87, 0x96, 0xa5, 0xb4, 0xc3, 0xd2, 0xe1, 0xf0 // CTR has zero IV
  630. };
  631. #endif
  632. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  633. static const uint8_t aria_test2_cbc_ct[3][48] = // CBC ciphertext
  634. {
  635. { 0x49, 0xd6, 0x18, 0x60, 0xb1, 0x49, 0x09, 0x10, // 128-bit key
  636. 0x9c, 0xef, 0x0d, 0x22, 0xa9, 0x26, 0x81, 0x34,
  637. 0xfa, 0xdf, 0x9f, 0xb2, 0x31, 0x51, 0xe9, 0x64,
  638. 0x5f, 0xba, 0x75, 0x01, 0x8b, 0xdb, 0x15, 0x38,
  639. 0xb5, 0x33, 0x34, 0x63, 0x4b, 0xbf, 0x7d, 0x4c,
  640. 0xd4, 0xb5, 0x37, 0x70, 0x33, 0x06, 0x0c, 0x15 },
  641. { 0xaf, 0xe6, 0xcf, 0x23, 0x97, 0x4b, 0x53, 0x3c, // 192-bit key
  642. 0x67, 0x2a, 0x82, 0x62, 0x64, 0xea, 0x78, 0x5f,
  643. 0x4e, 0x4f, 0x7f, 0x78, 0x0d, 0xc7, 0xf3, 0xf1,
  644. 0xe0, 0x96, 0x2b, 0x80, 0x90, 0x23, 0x86, 0xd5,
  645. 0x14, 0xe9, 0xc3, 0xe7, 0x72, 0x59, 0xde, 0x92,
  646. 0xdd, 0x11, 0x02, 0xff, 0xab, 0x08, 0x6c, 0x1e },
  647. { 0x52, 0x3a, 0x8a, 0x80, 0x6a, 0xe6, 0x21, 0xf1, // 256-bit key
  648. 0x55, 0xfd, 0xd2, 0x8d, 0xbc, 0x34, 0xe1, 0xab,
  649. 0x7b, 0x9b, 0x42, 0x43, 0x2a, 0xd8, 0xb2, 0xef,
  650. 0xb9, 0x6e, 0x23, 0xb1, 0x3f, 0x0a, 0x6e, 0x52,
  651. 0xf3, 0x61, 0x85, 0xd5, 0x0a, 0xd0, 0x02, 0xc5,
  652. 0xf6, 0x01, 0xbe, 0xe5, 0x49, 0x3f, 0x11, 0x8b }
  653. };
  654. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  655. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  656. static const uint8_t aria_test2_cfb_ct[3][48] = // CFB ciphertext
  657. {
  658. { 0x37, 0x20, 0xe5, 0x3b, 0xa7, 0xd6, 0x15, 0x38, // 128-bit key
  659. 0x34, 0x06, 0xb0, 0x9f, 0x0a, 0x05, 0xa2, 0x00,
  660. 0xc0, 0x7c, 0x21, 0xe6, 0x37, 0x0f, 0x41, 0x3a,
  661. 0x5d, 0x13, 0x25, 0x00, 0xa6, 0x82, 0x85, 0x01,
  662. 0x7c, 0x61, 0xb4, 0x34, 0xc7, 0xb7, 0xca, 0x96,
  663. 0x85, 0xa5, 0x10, 0x71, 0x86, 0x1e, 0x4d, 0x4b },
  664. { 0x41, 0x71, 0xf7, 0x19, 0x2b, 0xf4, 0x49, 0x54, // 192-bit key
  665. 0x94, 0xd2, 0x73, 0x61, 0x29, 0x64, 0x0f, 0x5c,
  666. 0x4d, 0x87, 0xa9, 0xa2, 0x13, 0x66, 0x4c, 0x94,
  667. 0x48, 0x47, 0x7c, 0x6e, 0xcc, 0x20, 0x13, 0x59,
  668. 0x8d, 0x97, 0x66, 0x95, 0x2d, 0xd8, 0xc3, 0x86,
  669. 0x8f, 0x17, 0xe3, 0x6e, 0xf6, 0x6f, 0xd8, 0x4b },
  670. { 0x26, 0x83, 0x47, 0x05, 0xb0, 0xf2, 0xc0, 0xe2, // 256-bit key
  671. 0x58, 0x8d, 0x4a, 0x7f, 0x09, 0x00, 0x96, 0x35,
  672. 0xf2, 0x8b, 0xb9, 0x3d, 0x8c, 0x31, 0xf8, 0x70,
  673. 0xec, 0x1e, 0x0b, 0xdb, 0x08, 0x2b, 0x66, 0xfa,
  674. 0x40, 0x2d, 0xd9, 0xc2, 0x02, 0xbe, 0x30, 0x0c,
  675. 0x45, 0x17, 0xd1, 0x96, 0xb1, 0x4d, 0x4c, 0xe1 }
  676. };
  677. #endif /* MBEDTLS_CIPHER_MODE_CFB */
  678. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  679. static const uint8_t aria_test2_ctr_ct[3][48] = // CTR ciphertext
  680. {
  681. { 0xac, 0x5d, 0x7d, 0xe8, 0x05, 0xa0, 0xbf, 0x1c, // 128-bit key
  682. 0x57, 0xc8, 0x54, 0x50, 0x1a, 0xf6, 0x0f, 0xa1,
  683. 0x14, 0x97, 0xe2, 0xa3, 0x45, 0x19, 0xde, 0xa1,
  684. 0x56, 0x9e, 0x91, 0xe5, 0xb5, 0xcc, 0xae, 0x2f,
  685. 0xf3, 0xbf, 0xa1, 0xbf, 0x97, 0x5f, 0x45, 0x71,
  686. 0xf4, 0x8b, 0xe1, 0x91, 0x61, 0x35, 0x46, 0xc3 },
  687. { 0x08, 0x62, 0x5c, 0xa8, 0xfe, 0x56, 0x9c, 0x19, // 192-bit key
  688. 0xba, 0x7a, 0xf3, 0x76, 0x0a, 0x6e, 0xd1, 0xce,
  689. 0xf4, 0xd1, 0x99, 0x26, 0x3e, 0x99, 0x9d, 0xde,
  690. 0x14, 0x08, 0x2d, 0xbb, 0xa7, 0x56, 0x0b, 0x79,
  691. 0xa4, 0xc6, 0xb4, 0x56, 0xb8, 0x70, 0x7d, 0xce,
  692. 0x75, 0x1f, 0x98, 0x54, 0xf1, 0x88, 0x93, 0xdf },
  693. { 0x30, 0x02, 0x6c, 0x32, 0x96, 0x66, 0x14, 0x17, // 256-bit key
  694. 0x21, 0x17, 0x8b, 0x99, 0xc0, 0xa1, 0xf1, 0xb2,
  695. 0xf0, 0x69, 0x40, 0x25, 0x3f, 0x7b, 0x30, 0x89,
  696. 0xe2, 0xa3, 0x0e, 0xa8, 0x6a, 0xa3, 0xc8, 0x8f,
  697. 0x59, 0x40, 0xf0, 0x5a, 0xd7, 0xee, 0x41, 0xd7,
  698. 0x13, 0x47, 0xbb, 0x72, 0x61, 0xe3, 0x48, 0xf1 }
  699. };
  700. #endif /* MBEDTLS_CIPHER_MODE_CFB */
  701. #define ARIA_SELF_TEST_ASSERT(cond) \
  702. do { \
  703. if (cond) { \
  704. if (verbose) \
  705. mbedtls_printf("failed\n"); \
  706. goto exit; \
  707. } else { \
  708. if (verbose) \
  709. mbedtls_printf("passed\n"); \
  710. } \
  711. } while (0)
  712. /*
  713. * Checkup routine
  714. */
  715. int mbedtls_aria_self_test(int verbose)
  716. {
  717. int i;
  718. uint8_t blk[MBEDTLS_ARIA_BLOCKSIZE];
  719. mbedtls_aria_context ctx;
  720. int ret = 1;
  721. #if (defined(MBEDTLS_CIPHER_MODE_CFB) || defined(MBEDTLS_CIPHER_MODE_CTR))
  722. size_t j;
  723. #endif
  724. #if (defined(MBEDTLS_CIPHER_MODE_CBC) || \
  725. defined(MBEDTLS_CIPHER_MODE_CFB) || \
  726. defined(MBEDTLS_CIPHER_MODE_CTR))
  727. uint8_t buf[48], iv[MBEDTLS_ARIA_BLOCKSIZE];
  728. #endif
  729. mbedtls_aria_init(&ctx);
  730. /*
  731. * Test set 1
  732. */
  733. for (i = 0; i < 3; i++) {
  734. /* test ECB encryption */
  735. if (verbose) {
  736. mbedtls_printf(" ARIA-ECB-%d (enc): ", 128 + 64 * i);
  737. }
  738. mbedtls_aria_setkey_enc(&ctx, aria_test1_ecb_key, 128 + 64 * i);
  739. mbedtls_aria_crypt_ecb(&ctx, aria_test1_ecb_pt, blk);
  740. ARIA_SELF_TEST_ASSERT(
  741. memcmp(blk, aria_test1_ecb_ct[i], MBEDTLS_ARIA_BLOCKSIZE)
  742. != 0);
  743. /* test ECB decryption */
  744. if (verbose) {
  745. mbedtls_printf(" ARIA-ECB-%d (dec): ", 128 + 64 * i);
  746. #if defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
  747. mbedtls_printf("skipped\n");
  748. #endif
  749. }
  750. #if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
  751. mbedtls_aria_setkey_dec(&ctx, aria_test1_ecb_key, 128 + 64 * i);
  752. mbedtls_aria_crypt_ecb(&ctx, aria_test1_ecb_ct[i], blk);
  753. ARIA_SELF_TEST_ASSERT(
  754. memcmp(blk, aria_test1_ecb_pt, MBEDTLS_ARIA_BLOCKSIZE)
  755. != 0);
  756. #endif
  757. }
  758. if (verbose) {
  759. mbedtls_printf("\n");
  760. }
  761. /*
  762. * Test set 2
  763. */
  764. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  765. for (i = 0; i < 3; i++) {
  766. /* Test CBC encryption */
  767. if (verbose) {
  768. mbedtls_printf(" ARIA-CBC-%d (enc): ", 128 + 64 * i);
  769. }
  770. mbedtls_aria_setkey_enc(&ctx, aria_test2_key, 128 + 64 * i);
  771. memcpy(iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE);
  772. memset(buf, 0x55, sizeof(buf));
  773. mbedtls_aria_crypt_cbc(&ctx, MBEDTLS_ARIA_ENCRYPT, 48, iv,
  774. aria_test2_pt, buf);
  775. ARIA_SELF_TEST_ASSERT(memcmp(buf, aria_test2_cbc_ct[i], 48)
  776. != 0);
  777. /* Test CBC decryption */
  778. if (verbose) {
  779. mbedtls_printf(" ARIA-CBC-%d (dec): ", 128 + 64 * i);
  780. }
  781. mbedtls_aria_setkey_dec(&ctx, aria_test2_key, 128 + 64 * i);
  782. memcpy(iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE);
  783. memset(buf, 0xAA, sizeof(buf));
  784. mbedtls_aria_crypt_cbc(&ctx, MBEDTLS_ARIA_DECRYPT, 48, iv,
  785. aria_test2_cbc_ct[i], buf);
  786. ARIA_SELF_TEST_ASSERT(memcmp(buf, aria_test2_pt, 48) != 0);
  787. }
  788. if (verbose) {
  789. mbedtls_printf("\n");
  790. }
  791. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  792. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  793. for (i = 0; i < 3; i++) {
  794. /* Test CFB encryption */
  795. if (verbose) {
  796. mbedtls_printf(" ARIA-CFB-%d (enc): ", 128 + 64 * i);
  797. }
  798. mbedtls_aria_setkey_enc(&ctx, aria_test2_key, 128 + 64 * i);
  799. memcpy(iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE);
  800. memset(buf, 0x55, sizeof(buf));
  801. j = 0;
  802. mbedtls_aria_crypt_cfb128(&ctx, MBEDTLS_ARIA_ENCRYPT, 48, &j, iv,
  803. aria_test2_pt, buf);
  804. ARIA_SELF_TEST_ASSERT(memcmp(buf, aria_test2_cfb_ct[i], 48) != 0);
  805. /* Test CFB decryption */
  806. if (verbose) {
  807. mbedtls_printf(" ARIA-CFB-%d (dec): ", 128 + 64 * i);
  808. }
  809. mbedtls_aria_setkey_enc(&ctx, aria_test2_key, 128 + 64 * i);
  810. memcpy(iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE);
  811. memset(buf, 0xAA, sizeof(buf));
  812. j = 0;
  813. mbedtls_aria_crypt_cfb128(&ctx, MBEDTLS_ARIA_DECRYPT, 48, &j,
  814. iv, aria_test2_cfb_ct[i], buf);
  815. ARIA_SELF_TEST_ASSERT(memcmp(buf, aria_test2_pt, 48) != 0);
  816. }
  817. if (verbose) {
  818. mbedtls_printf("\n");
  819. }
  820. #endif /* MBEDTLS_CIPHER_MODE_CFB */
  821. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  822. for (i = 0; i < 3; i++) {
  823. /* Test CTR encryption */
  824. if (verbose) {
  825. mbedtls_printf(" ARIA-CTR-%d (enc): ", 128 + 64 * i);
  826. }
  827. mbedtls_aria_setkey_enc(&ctx, aria_test2_key, 128 + 64 * i);
  828. memset(iv, 0, MBEDTLS_ARIA_BLOCKSIZE); // IV = 0
  829. memset(buf, 0x55, sizeof(buf));
  830. j = 0;
  831. mbedtls_aria_crypt_ctr(&ctx, 48, &j, iv, blk,
  832. aria_test2_pt, buf);
  833. ARIA_SELF_TEST_ASSERT(memcmp(buf, aria_test2_ctr_ct[i], 48) != 0);
  834. /* Test CTR decryption */
  835. if (verbose) {
  836. mbedtls_printf(" ARIA-CTR-%d (dec): ", 128 + 64 * i);
  837. }
  838. mbedtls_aria_setkey_enc(&ctx, aria_test2_key, 128 + 64 * i);
  839. memset(iv, 0, MBEDTLS_ARIA_BLOCKSIZE); // IV = 0
  840. memset(buf, 0xAA, sizeof(buf));
  841. j = 0;
  842. mbedtls_aria_crypt_ctr(&ctx, 48, &j, iv, blk,
  843. aria_test2_ctr_ct[i], buf);
  844. ARIA_SELF_TEST_ASSERT(memcmp(buf, aria_test2_pt, 48) != 0);
  845. }
  846. if (verbose) {
  847. mbedtls_printf("\n");
  848. }
  849. #endif /* MBEDTLS_CIPHER_MODE_CTR */
  850. ret = 0;
  851. exit:
  852. mbedtls_aria_free(&ctx);
  853. return ret;
  854. }
  855. #endif /* MBEDTLS_SELF_TEST */
  856. #endif /* MBEDTLS_ARIA_C */