qemu/crypto/cipher-nettle.c.inc
<<
>>
Prefs
   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}
 716