cipher-nettle.c.inc 29 KB

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