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