cipher-nettle.c.inc 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715
  1. /*
  2. * QEMU Crypto cipher nettle algorithms
  3. *
  4. * Copyright (c) 2015 Red Hat, Inc.
  5. *
  6. * This library is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2.1 of the License, or (at your option) any later version.
  10. *
  11. * This library is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  18. *
  19. */
  20. #ifdef CONFIG_QEMU_PRIVATE_XTS
  21. #include "crypto/xts.h"
  22. #endif
  23. #include <nettle/nettle-types.h>
  24. #include <nettle/aes.h>
  25. #include <nettle/des.h>
  26. #include <nettle/cbc.h>
  27. #include <nettle/cast128.h>
  28. #include <nettle/serpent.h>
  29. #include <nettle/twofish.h>
  30. #include <nettle/ctr.h>
  31. #ifndef CONFIG_QEMU_PRIVATE_XTS
  32. #include <nettle/xts.h>
  33. #endif
  34. static inline bool qcrypto_length_check(size_t len, size_t blocksize,
  35. Error **errp)
  36. {
  37. if (unlikely(len & (blocksize - 1))) {
  38. error_setg(errp, "Length %zu must be a multiple of block size %zu",
  39. len, blocksize);
  40. return false;
  41. }
  42. return true;
  43. }
  44. static void qcrypto_cipher_ctx_free(QCryptoCipher *ctx)
  45. {
  46. g_free(ctx);
  47. }
  48. static int qcrypto_cipher_no_setiv(QCryptoCipher *cipher,
  49. const uint8_t *iv, size_t niv,
  50. Error **errp)
  51. {
  52. error_setg(errp, "Setting IV is not supported");
  53. return -1;
  54. }
  55. #define DEFINE_SETIV(NAME, TYPE, BLEN) \
  56. static int NAME##_setiv(QCryptoCipher *cipher, const uint8_t *iv, \
  57. size_t niv, Error **errp) \
  58. { \
  59. TYPE *ctx = container_of(cipher, TYPE, base); \
  60. if (niv != BLEN) { \
  61. error_setg(errp, "Expected IV size %d not %zu", BLEN, niv); \
  62. return -1; \
  63. } \
  64. memcpy(ctx->iv, iv, niv); \
  65. return 0; \
  66. }
  67. #define DEFINE_ECB(NAME, TYPE, BLEN, ENCRYPT, DECRYPT) \
  68. static int NAME##_encrypt_ecb(QCryptoCipher *cipher, const void *in, \
  69. void *out, size_t len, Error **errp) \
  70. { \
  71. TYPE *ctx = container_of(cipher, TYPE, base); \
  72. if (!qcrypto_length_check(len, BLEN, errp)) { \
  73. return -1; \
  74. } \
  75. ENCRYPT(&ctx->key, len, out, in); \
  76. return 0; \
  77. } \
  78. static int NAME##_decrypt_ecb(QCryptoCipher *cipher, const void *in, \
  79. void *out, size_t len, Error **errp) \
  80. { \
  81. TYPE *ctx = container_of(cipher, TYPE, base); \
  82. if (!qcrypto_length_check(len, BLEN, errp)) { \
  83. return -1; \
  84. } \
  85. DECRYPT(&ctx->key, len, out, in); \
  86. return 0; \
  87. } \
  88. static const struct QCryptoCipherDriver NAME##_driver_ecb = { \
  89. .cipher_encrypt = NAME##_encrypt_ecb, \
  90. .cipher_decrypt = NAME##_decrypt_ecb, \
  91. .cipher_setiv = qcrypto_cipher_no_setiv, \
  92. .cipher_free = qcrypto_cipher_ctx_free, \
  93. };
  94. #define DEFINE_CBC(NAME, TYPE, BLEN, ENCRYPT, DECRYPT) \
  95. static int NAME##_encrypt_cbc(QCryptoCipher *cipher, const void *in, \
  96. void *out, size_t len, Error **errp) \
  97. { \
  98. TYPE *ctx = container_of(cipher, TYPE, base); \
  99. if (!qcrypto_length_check(len, BLEN, errp)) { \
  100. return -1; \
  101. } \
  102. cbc_encrypt(&ctx->key, ENCRYPT, BLEN, ctx->iv, len, out, in); \
  103. return 0; \
  104. } \
  105. static int NAME##_decrypt_cbc(QCryptoCipher *cipher, const void *in, \
  106. void *out, size_t len, Error **errp) \
  107. { \
  108. TYPE *ctx = container_of(cipher, TYPE, base); \
  109. if (!qcrypto_length_check(len, BLEN, errp)) { \
  110. return -1; \
  111. } \
  112. cbc_decrypt(&ctx->key, DECRYPT, BLEN, ctx->iv, len, out, in); \
  113. return 0; \
  114. } \
  115. static const struct QCryptoCipherDriver NAME##_driver_cbc = { \
  116. .cipher_encrypt = NAME##_encrypt_cbc, \
  117. .cipher_decrypt = NAME##_decrypt_cbc, \
  118. .cipher_setiv = NAME##_setiv, \
  119. .cipher_free = qcrypto_cipher_ctx_free, \
  120. };
  121. #define DEFINE_CTR(NAME, TYPE, BLEN, ENCRYPT) \
  122. static int NAME##_encrypt_ctr(QCryptoCipher *cipher, const void *in, \
  123. void *out, size_t len, Error **errp) \
  124. { \
  125. TYPE *ctx = container_of(cipher, TYPE, base); \
  126. if (!qcrypto_length_check(len, BLEN, errp)) { \
  127. return -1; \
  128. } \
  129. ctr_crypt(&ctx->key, ENCRYPT, BLEN, ctx->iv, len, out, in); \
  130. return 0; \
  131. } \
  132. static const struct QCryptoCipherDriver NAME##_driver_ctr = { \
  133. .cipher_encrypt = NAME##_encrypt_ctr, \
  134. .cipher_decrypt = NAME##_encrypt_ctr, \
  135. .cipher_setiv = NAME##_setiv, \
  136. .cipher_free = qcrypto_cipher_ctx_free, \
  137. };
  138. #ifdef CONFIG_QEMU_PRIVATE_XTS
  139. #define DEFINE__XTS(NAME, TYPE, BLEN, ENCRYPT, DECRYPT) \
  140. static void NAME##_xts_wrape(const void *ctx, size_t length, \
  141. uint8_t *dst, const uint8_t *src) \
  142. { \
  143. ENCRYPT((const void *)ctx, length, dst, src); \
  144. } \
  145. static void NAME##_xts_wrapd(const void *ctx, size_t length, \
  146. uint8_t *dst, const uint8_t *src) \
  147. { \
  148. DECRYPT((const void *)ctx, length, dst, src); \
  149. } \
  150. static int NAME##_encrypt_xts(QCryptoCipher *cipher, const void *in, \
  151. void *out, size_t len, Error **errp) \
  152. { \
  153. TYPE *ctx = container_of(cipher, TYPE, base); \
  154. if (!qcrypto_length_check(len, BLEN, errp)) { \
  155. return -1; \
  156. } \
  157. xts_encrypt(&ctx->key, &ctx->key_xts, \
  158. NAME##_xts_wrape, NAME##_xts_wrapd, \
  159. ctx->iv, len, out, in); \
  160. return 0; \
  161. } \
  162. static int NAME##_decrypt_xts(QCryptoCipher *cipher, const void *in, \
  163. void *out, size_t len, Error **errp) \
  164. { \
  165. TYPE *ctx = container_of(cipher, TYPE, base); \
  166. if (!qcrypto_length_check(len, BLEN, errp)) { \
  167. return -1; \
  168. } \
  169. xts_decrypt(&ctx->key, &ctx->key_xts, \
  170. NAME##_xts_wrape, NAME##_xts_wrapd, \
  171. ctx->iv, len, out, in); \
  172. return 0; \
  173. }
  174. #else
  175. #define DEFINE__XTS(NAME, TYPE, BLEN, ENCRYPT, DECRYPT) \
  176. static int NAME##_encrypt_xts(QCryptoCipher *cipher, const void *in, \
  177. void *out, size_t len, Error **errp) \
  178. { \
  179. TYPE *ctx = container_of(cipher, TYPE, base); \
  180. if (!qcrypto_length_check(len, BLEN, errp)) { \
  181. return -1; \
  182. } \
  183. xts_encrypt_message(&ctx->key, &ctx->key_xts, ENCRYPT, \
  184. ctx->iv, len, out, in); \
  185. return 0; \
  186. } \
  187. static int NAME##_decrypt_xts(QCryptoCipher *cipher, const void *in, \
  188. void *out, size_t len, Error **errp) \
  189. { \
  190. TYPE *ctx = container_of(cipher, TYPE, base); \
  191. if (!qcrypto_length_check(len, BLEN, errp)) { \
  192. return -1; \
  193. } \
  194. xts_decrypt_message(&ctx->key, &ctx->key_xts, DECRYPT, ENCRYPT, \
  195. ctx->iv, len, out, in); \
  196. return 0; \
  197. }
  198. #endif
  199. #define DEFINE_XTS(NAME, TYPE, BLEN, ENCRYPT, DECRYPT) \
  200. QEMU_BUILD_BUG_ON(BLEN != XTS_BLOCK_SIZE); \
  201. DEFINE__XTS(NAME, TYPE, BLEN, ENCRYPT, DECRYPT) \
  202. static const struct QCryptoCipherDriver NAME##_driver_xts = { \
  203. .cipher_encrypt = NAME##_encrypt_xts, \
  204. .cipher_decrypt = NAME##_decrypt_xts, \
  205. .cipher_setiv = NAME##_setiv, \
  206. .cipher_free = qcrypto_cipher_ctx_free, \
  207. };
  208. #define DEFINE_ECB_CBC_CTR(NAME, TYPE, BLEN, ENCRYPT, DECRYPT) \
  209. DEFINE_SETIV(NAME, TYPE, BLEN) \
  210. DEFINE_ECB(NAME, TYPE, BLEN, ENCRYPT, DECRYPT) \
  211. DEFINE_CBC(NAME, TYPE, BLEN, ENCRYPT, DECRYPT) \
  212. DEFINE_CTR(NAME, TYPE, BLEN, ENCRYPT)
  213. #define DEFINE_ECB_CBC_CTR_XTS(NAME, TYPE, BLEN, ENCRYPT, DECRYPT) \
  214. DEFINE_ECB_CBC_CTR(NAME, TYPE, BLEN, ENCRYPT, DECRYPT) \
  215. DEFINE_XTS(NAME, TYPE, BLEN, ENCRYPT, DECRYPT)
  216. typedef struct QCryptoNettleDES {
  217. QCryptoCipher base;
  218. struct des_ctx key;
  219. uint8_t iv[DES_BLOCK_SIZE];
  220. } QCryptoNettleDES;
  221. static void des_encrypt_native(const void *ctx, size_t length,
  222. uint8_t *dst, const uint8_t *src)
  223. {
  224. des_encrypt(ctx, length, dst, src);
  225. }
  226. static void des_decrypt_native(const void *ctx, size_t length,
  227. uint8_t *dst, const uint8_t *src)
  228. {
  229. des_decrypt(ctx, length, dst, src);
  230. }
  231. DEFINE_ECB_CBC_CTR(qcrypto_nettle_des, QCryptoNettleDES,
  232. DES_BLOCK_SIZE, des_encrypt_native, des_decrypt_native)
  233. typedef struct QCryptoNettleDES3 {
  234. QCryptoCipher base;
  235. struct des3_ctx key;
  236. uint8_t iv[DES3_BLOCK_SIZE];
  237. } QCryptoNettleDES3;
  238. static void des3_encrypt_native(const void *ctx, size_t length,
  239. uint8_t *dst, const uint8_t *src)
  240. {
  241. des3_encrypt(ctx, length, dst, src);
  242. }
  243. static void des3_decrypt_native(const void *ctx, size_t length,
  244. uint8_t *dst, const uint8_t *src)
  245. {
  246. des3_decrypt(ctx, length, dst, src);
  247. }
  248. DEFINE_ECB_CBC_CTR(qcrypto_nettle_des3, QCryptoNettleDES3, DES3_BLOCK_SIZE,
  249. des3_encrypt_native, des3_decrypt_native)
  250. typedef struct QCryptoNettleAES128 {
  251. QCryptoCipher base;
  252. uint8_t iv[AES_BLOCK_SIZE];
  253. /* First key from pair is encode, second key is decode. */
  254. struct aes128_ctx key[2], key_xts[2];
  255. } QCryptoNettleAES128;
  256. static void aes128_encrypt_native(const void *ctx, size_t length,
  257. uint8_t *dst, const uint8_t *src)
  258. {
  259. const struct aes128_ctx *keys = ctx;
  260. aes128_encrypt(&keys[0], length, dst, src);
  261. }
  262. static void aes128_decrypt_native(const void *ctx, size_t length,
  263. uint8_t *dst, const uint8_t *src)
  264. {
  265. const struct aes128_ctx *keys = ctx;
  266. aes128_decrypt(&keys[1], length, dst, src);
  267. }
  268. DEFINE_ECB_CBC_CTR_XTS(qcrypto_nettle_aes128,
  269. QCryptoNettleAES128, AES_BLOCK_SIZE,
  270. aes128_encrypt_native, aes128_decrypt_native)
  271. typedef struct QCryptoNettleAES192 {
  272. QCryptoCipher base;
  273. uint8_t iv[AES_BLOCK_SIZE];
  274. /* First key from pair is encode, second key is decode. */
  275. struct aes192_ctx key[2], key_xts[2];
  276. } QCryptoNettleAES192;
  277. static void aes192_encrypt_native(const void *ctx, size_t length,
  278. uint8_t *dst, const uint8_t *src)
  279. {
  280. const struct aes192_ctx *keys = ctx;
  281. aes192_encrypt(&keys[0], length, dst, src);
  282. }
  283. static void aes192_decrypt_native(const void *ctx, size_t length,
  284. uint8_t *dst, const uint8_t *src)
  285. {
  286. const struct aes192_ctx *keys = ctx;
  287. aes192_decrypt(&keys[1], length, dst, src);
  288. }
  289. DEFINE_ECB_CBC_CTR_XTS(qcrypto_nettle_aes192,
  290. QCryptoNettleAES192, AES_BLOCK_SIZE,
  291. aes192_encrypt_native, aes192_decrypt_native)
  292. typedef struct QCryptoNettleAES256 {
  293. QCryptoCipher base;
  294. uint8_t iv[AES_BLOCK_SIZE];
  295. /* First key from pair is encode, second key is decode. */
  296. struct aes256_ctx key[2], key_xts[2];
  297. } QCryptoNettleAES256;
  298. static void aes256_encrypt_native(const void *ctx, size_t length,
  299. uint8_t *dst, const uint8_t *src)
  300. {
  301. const struct aes256_ctx *keys = ctx;
  302. aes256_encrypt(&keys[0], length, dst, src);
  303. }
  304. static void aes256_decrypt_native(const void *ctx, size_t length,
  305. uint8_t *dst, const uint8_t *src)
  306. {
  307. const struct aes256_ctx *keys = ctx;
  308. aes256_decrypt(&keys[1], length, dst, src);
  309. }
  310. DEFINE_ECB_CBC_CTR_XTS(qcrypto_nettle_aes256,
  311. QCryptoNettleAES256, AES_BLOCK_SIZE,
  312. aes256_encrypt_native, aes256_decrypt_native)
  313. typedef struct QCryptoNettleCAST128 {
  314. QCryptoCipher base;
  315. uint8_t iv[CAST128_BLOCK_SIZE];
  316. struct cast128_ctx key, key_xts;
  317. } QCryptoNettleCAST128;
  318. static void cast128_encrypt_native(const void *ctx, size_t length,
  319. uint8_t *dst, const uint8_t *src)
  320. {
  321. cast128_encrypt(ctx, length, dst, src);
  322. }
  323. static void cast128_decrypt_native(const void *ctx, size_t length,
  324. uint8_t *dst, const uint8_t *src)
  325. {
  326. cast128_decrypt(ctx, length, dst, src);
  327. }
  328. DEFINE_ECB_CBC_CTR(qcrypto_nettle_cast128,
  329. QCryptoNettleCAST128, CAST128_BLOCK_SIZE,
  330. cast128_encrypt_native, cast128_decrypt_native)
  331. typedef struct QCryptoNettleSerpent {
  332. QCryptoCipher base;
  333. uint8_t iv[SERPENT_BLOCK_SIZE];
  334. struct serpent_ctx key, key_xts;
  335. } QCryptoNettleSerpent;
  336. static void serpent_encrypt_native(const void *ctx, size_t length,
  337. uint8_t *dst, const uint8_t *src)
  338. {
  339. serpent_encrypt(ctx, length, dst, src);
  340. }
  341. static void serpent_decrypt_native(const void *ctx, size_t length,
  342. uint8_t *dst, const uint8_t *src)
  343. {
  344. serpent_decrypt(ctx, length, dst, src);
  345. }
  346. DEFINE_ECB_CBC_CTR_XTS(qcrypto_nettle_serpent,
  347. QCryptoNettleSerpent, SERPENT_BLOCK_SIZE,
  348. serpent_encrypt_native, serpent_decrypt_native)
  349. typedef struct QCryptoNettleTwofish {
  350. QCryptoCipher base;
  351. uint8_t iv[TWOFISH_BLOCK_SIZE];
  352. struct twofish_ctx key, key_xts;
  353. } QCryptoNettleTwofish;
  354. static void twofish_encrypt_native(const void *ctx, size_t length,
  355. uint8_t *dst, const uint8_t *src)
  356. {
  357. twofish_encrypt(ctx, length, dst, src);
  358. }
  359. static void twofish_decrypt_native(const void *ctx, size_t length,
  360. uint8_t *dst, const uint8_t *src)
  361. {
  362. twofish_decrypt(ctx, length, dst, src);
  363. }
  364. DEFINE_ECB_CBC_CTR_XTS(qcrypto_nettle_twofish,
  365. QCryptoNettleTwofish, TWOFISH_BLOCK_SIZE,
  366. twofish_encrypt_native, twofish_decrypt_native)
  367. bool qcrypto_cipher_supports(QCryptoCipherAlgorithm alg,
  368. QCryptoCipherMode mode)
  369. {
  370. switch (alg) {
  371. case QCRYPTO_CIPHER_ALG_DES:
  372. case QCRYPTO_CIPHER_ALG_3DES:
  373. case QCRYPTO_CIPHER_ALG_AES_128:
  374. case QCRYPTO_CIPHER_ALG_AES_192:
  375. case QCRYPTO_CIPHER_ALG_AES_256:
  376. case QCRYPTO_CIPHER_ALG_CAST5_128:
  377. case QCRYPTO_CIPHER_ALG_SERPENT_128:
  378. case QCRYPTO_CIPHER_ALG_SERPENT_192:
  379. case QCRYPTO_CIPHER_ALG_SERPENT_256:
  380. case QCRYPTO_CIPHER_ALG_TWOFISH_128:
  381. case QCRYPTO_CIPHER_ALG_TWOFISH_192:
  382. case QCRYPTO_CIPHER_ALG_TWOFISH_256:
  383. break;
  384. default:
  385. return false;
  386. }
  387. switch (mode) {
  388. case QCRYPTO_CIPHER_MODE_ECB:
  389. case QCRYPTO_CIPHER_MODE_CBC:
  390. case QCRYPTO_CIPHER_MODE_XTS:
  391. case QCRYPTO_CIPHER_MODE_CTR:
  392. return true;
  393. default:
  394. return false;
  395. }
  396. }
  397. static QCryptoCipher *qcrypto_cipher_ctx_new(QCryptoCipherAlgorithm alg,
  398. QCryptoCipherMode mode,
  399. const uint8_t *key,
  400. size_t nkey,
  401. Error **errp)
  402. {
  403. switch (mode) {
  404. case QCRYPTO_CIPHER_MODE_ECB:
  405. case QCRYPTO_CIPHER_MODE_CBC:
  406. case QCRYPTO_CIPHER_MODE_XTS:
  407. case QCRYPTO_CIPHER_MODE_CTR:
  408. break;
  409. default:
  410. goto bad_cipher_mode;
  411. }
  412. if (!qcrypto_cipher_validate_key_length(alg, mode, nkey, errp)) {
  413. return NULL;
  414. }
  415. switch (alg) {
  416. case QCRYPTO_CIPHER_ALG_DES:
  417. {
  418. QCryptoNettleDES *ctx;
  419. const QCryptoCipherDriver *drv;
  420. switch (mode) {
  421. case QCRYPTO_CIPHER_MODE_ECB:
  422. drv = &qcrypto_nettle_des_driver_ecb;
  423. break;
  424. case QCRYPTO_CIPHER_MODE_CBC:
  425. drv = &qcrypto_nettle_des_driver_cbc;
  426. break;
  427. case QCRYPTO_CIPHER_MODE_CTR:
  428. drv = &qcrypto_nettle_des_driver_ctr;
  429. break;
  430. default:
  431. goto bad_cipher_mode;
  432. }
  433. ctx = g_new0(QCryptoNettleDES, 1);
  434. ctx->base.driver = drv;
  435. des_set_key(&ctx->key, key);
  436. return &ctx->base;
  437. }
  438. case QCRYPTO_CIPHER_ALG_3DES:
  439. {
  440. QCryptoNettleDES3 *ctx;
  441. const QCryptoCipherDriver *drv;
  442. switch (mode) {
  443. case QCRYPTO_CIPHER_MODE_ECB:
  444. drv = &qcrypto_nettle_des3_driver_ecb;
  445. break;
  446. case QCRYPTO_CIPHER_MODE_CBC:
  447. drv = &qcrypto_nettle_des3_driver_cbc;
  448. break;
  449. case QCRYPTO_CIPHER_MODE_CTR:
  450. drv = &qcrypto_nettle_des3_driver_ctr;
  451. break;
  452. default:
  453. goto bad_cipher_mode;
  454. }
  455. ctx = g_new0(QCryptoNettleDES3, 1);
  456. ctx->base.driver = drv;
  457. des3_set_key(&ctx->key, key);
  458. return &ctx->base;
  459. }
  460. case QCRYPTO_CIPHER_ALG_AES_128:
  461. {
  462. QCryptoNettleAES128 *ctx = g_new0(QCryptoNettleAES128, 1);
  463. switch (mode) {
  464. case QCRYPTO_CIPHER_MODE_ECB:
  465. ctx->base.driver = &qcrypto_nettle_aes128_driver_ecb;
  466. break;
  467. case QCRYPTO_CIPHER_MODE_CBC:
  468. ctx->base.driver = &qcrypto_nettle_aes128_driver_cbc;
  469. break;
  470. case QCRYPTO_CIPHER_MODE_CTR:
  471. ctx->base.driver = &qcrypto_nettle_aes128_driver_ctr;
  472. break;
  473. case QCRYPTO_CIPHER_MODE_XTS:
  474. ctx->base.driver = &qcrypto_nettle_aes128_driver_xts;
  475. nkey /= 2;
  476. aes128_set_encrypt_key(&ctx->key_xts[0], key + nkey);
  477. aes128_set_decrypt_key(&ctx->key_xts[1], key + nkey);
  478. break;
  479. default:
  480. g_assert_not_reached();
  481. }
  482. aes128_set_encrypt_key(&ctx->key[0], key);
  483. aes128_set_decrypt_key(&ctx->key[1], key);
  484. return &ctx->base;
  485. }
  486. case QCRYPTO_CIPHER_ALG_AES_192:
  487. {
  488. QCryptoNettleAES192 *ctx = g_new0(QCryptoNettleAES192, 1);
  489. switch (mode) {
  490. case QCRYPTO_CIPHER_MODE_ECB:
  491. ctx->base.driver = &qcrypto_nettle_aes192_driver_ecb;
  492. break;
  493. case QCRYPTO_CIPHER_MODE_CBC:
  494. ctx->base.driver = &qcrypto_nettle_aes192_driver_cbc;
  495. break;
  496. case QCRYPTO_CIPHER_MODE_CTR:
  497. ctx->base.driver = &qcrypto_nettle_aes192_driver_ctr;
  498. break;
  499. case QCRYPTO_CIPHER_MODE_XTS:
  500. ctx->base.driver = &qcrypto_nettle_aes192_driver_xts;
  501. nkey /= 2;
  502. aes192_set_encrypt_key(&ctx->key_xts[0], key + nkey);
  503. aes192_set_decrypt_key(&ctx->key_xts[1], key + nkey);
  504. break;
  505. default:
  506. g_assert_not_reached();
  507. }
  508. aes192_set_encrypt_key(&ctx->key[0], key);
  509. aes192_set_decrypt_key(&ctx->key[1], key);
  510. return &ctx->base;
  511. }
  512. case QCRYPTO_CIPHER_ALG_AES_256:
  513. {
  514. QCryptoNettleAES256 *ctx = g_new0(QCryptoNettleAES256, 1);
  515. switch (mode) {
  516. case QCRYPTO_CIPHER_MODE_ECB:
  517. ctx->base.driver = &qcrypto_nettle_aes256_driver_ecb;
  518. break;
  519. case QCRYPTO_CIPHER_MODE_CBC:
  520. ctx->base.driver = &qcrypto_nettle_aes256_driver_cbc;
  521. break;
  522. case QCRYPTO_CIPHER_MODE_CTR:
  523. ctx->base.driver = &qcrypto_nettle_aes256_driver_ctr;
  524. break;
  525. case QCRYPTO_CIPHER_MODE_XTS:
  526. ctx->base.driver = &qcrypto_nettle_aes256_driver_xts;
  527. nkey /= 2;
  528. aes256_set_encrypt_key(&ctx->key_xts[0], key + nkey);
  529. aes256_set_decrypt_key(&ctx->key_xts[1], key + nkey);
  530. break;
  531. default:
  532. g_assert_not_reached();
  533. }
  534. aes256_set_encrypt_key(&ctx->key[0], key);
  535. aes256_set_decrypt_key(&ctx->key[1], key);
  536. return &ctx->base;
  537. }
  538. case QCRYPTO_CIPHER_ALG_CAST5_128:
  539. {
  540. QCryptoNettleCAST128 *ctx;
  541. const QCryptoCipherDriver *drv;
  542. switch (mode) {
  543. case QCRYPTO_CIPHER_MODE_ECB:
  544. drv = &qcrypto_nettle_cast128_driver_ecb;
  545. break;
  546. case QCRYPTO_CIPHER_MODE_CBC:
  547. drv = &qcrypto_nettle_cast128_driver_cbc;
  548. break;
  549. case QCRYPTO_CIPHER_MODE_CTR:
  550. drv = &qcrypto_nettle_cast128_driver_ctr;
  551. break;
  552. default:
  553. goto bad_cipher_mode;
  554. }
  555. ctx = g_new0(QCryptoNettleCAST128, 1);
  556. ctx->base.driver = drv;
  557. cast5_set_key(&ctx->key, nkey, key);
  558. return &ctx->base;
  559. }
  560. case QCRYPTO_CIPHER_ALG_SERPENT_128:
  561. case QCRYPTO_CIPHER_ALG_SERPENT_192:
  562. case QCRYPTO_CIPHER_ALG_SERPENT_256:
  563. {
  564. QCryptoNettleSerpent *ctx = g_new0(QCryptoNettleSerpent, 1);
  565. switch (mode) {
  566. case QCRYPTO_CIPHER_MODE_ECB:
  567. ctx->base.driver = &qcrypto_nettle_serpent_driver_ecb;
  568. break;
  569. case QCRYPTO_CIPHER_MODE_CBC:
  570. ctx->base.driver = &qcrypto_nettle_serpent_driver_cbc;
  571. break;
  572. case QCRYPTO_CIPHER_MODE_CTR:
  573. ctx->base.driver = &qcrypto_nettle_serpent_driver_ctr;
  574. break;
  575. case QCRYPTO_CIPHER_MODE_XTS:
  576. ctx->base.driver = &qcrypto_nettle_serpent_driver_xts;
  577. nkey /= 2;
  578. serpent_set_key(&ctx->key_xts, nkey, key + nkey);
  579. break;
  580. default:
  581. g_assert_not_reached();
  582. }
  583. serpent_set_key(&ctx->key, nkey, key);
  584. return &ctx->base;
  585. }
  586. case QCRYPTO_CIPHER_ALG_TWOFISH_128:
  587. case QCRYPTO_CIPHER_ALG_TWOFISH_192:
  588. case QCRYPTO_CIPHER_ALG_TWOFISH_256:
  589. {
  590. QCryptoNettleTwofish *ctx = g_new0(QCryptoNettleTwofish, 1);
  591. switch (mode) {
  592. case QCRYPTO_CIPHER_MODE_ECB:
  593. ctx->base.driver = &qcrypto_nettle_twofish_driver_ecb;
  594. break;
  595. case QCRYPTO_CIPHER_MODE_CBC:
  596. ctx->base.driver = &qcrypto_nettle_twofish_driver_cbc;
  597. break;
  598. case QCRYPTO_CIPHER_MODE_CTR:
  599. ctx->base.driver = &qcrypto_nettle_twofish_driver_ctr;
  600. break;
  601. case QCRYPTO_CIPHER_MODE_XTS:
  602. ctx->base.driver = &qcrypto_nettle_twofish_driver_xts;
  603. nkey /= 2;
  604. twofish_set_key(&ctx->key_xts, nkey, key + nkey);
  605. break;
  606. default:
  607. g_assert_not_reached();
  608. }
  609. twofish_set_key(&ctx->key, nkey, key);
  610. return &ctx->base;
  611. }
  612. default:
  613. error_setg(errp, "Unsupported cipher algorithm %s",
  614. QCryptoCipherAlgorithm_str(alg));
  615. return NULL;
  616. }
  617. bad_cipher_mode:
  618. error_setg(errp, "Unsupported cipher mode %s",
  619. QCryptoCipherMode_str(mode));
  620. return NULL;
  621. }