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