xref: /openbmc/qemu/crypto/cipher-nettle.c.inc (revision ea2fde5b)
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(QCryptoCipherAlgorithm alg,
458                             QCryptoCipherMode mode)
459{
460    switch (alg) {
461    case QCRYPTO_CIPHER_ALG_DES:
462    case QCRYPTO_CIPHER_ALG_3DES:
463    case QCRYPTO_CIPHER_ALG_AES_128:
464    case QCRYPTO_CIPHER_ALG_AES_192:
465    case QCRYPTO_CIPHER_ALG_AES_256:
466    case QCRYPTO_CIPHER_ALG_CAST5_128:
467    case QCRYPTO_CIPHER_ALG_SERPENT_128:
468    case QCRYPTO_CIPHER_ALG_SERPENT_192:
469    case QCRYPTO_CIPHER_ALG_SERPENT_256:
470    case QCRYPTO_CIPHER_ALG_TWOFISH_128:
471    case QCRYPTO_CIPHER_ALG_TWOFISH_192:
472    case QCRYPTO_CIPHER_ALG_TWOFISH_256:
473#ifdef CONFIG_CRYPTO_SM4
474    case QCRYPTO_CIPHER_ALG_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(QCryptoCipherAlgorithm 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_ALG_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            default:
529                goto bad_cipher_mode;
530            }
531
532            ctx = g_new0(QCryptoNettleDES, 1);
533            ctx->base.driver = drv;
534            des_set_key(&ctx->key, key);
535
536            return &ctx->base;
537        }
538
539    case QCRYPTO_CIPHER_ALG_3DES:
540        {
541            QCryptoNettleDES3 *ctx;
542            const QCryptoCipherDriver *drv;
543
544            switch (mode) {
545            case QCRYPTO_CIPHER_MODE_ECB:
546                drv = &qcrypto_nettle_des3_driver_ecb;
547                break;
548            case QCRYPTO_CIPHER_MODE_CBC:
549                drv = &qcrypto_nettle_des3_driver_cbc;
550                break;
551            case QCRYPTO_CIPHER_MODE_CTR:
552                drv = &qcrypto_nettle_des3_driver_ctr;
553                break;
554            default:
555                goto bad_cipher_mode;
556            }
557
558            ctx = g_new0(QCryptoNettleDES3, 1);
559            ctx->base.driver = drv;
560            des3_set_key(&ctx->key, key);
561            return &ctx->base;
562        }
563
564    case QCRYPTO_CIPHER_ALG_AES_128:
565        {
566            QCryptoNettleAES128 *ctx = g_new0(QCryptoNettleAES128, 1);
567
568            switch (mode) {
569            case QCRYPTO_CIPHER_MODE_ECB:
570                ctx->base.driver = &qcrypto_nettle_aes128_driver_ecb;
571                break;
572            case QCRYPTO_CIPHER_MODE_CBC:
573                ctx->base.driver = &qcrypto_nettle_aes128_driver_cbc;
574                break;
575            case QCRYPTO_CIPHER_MODE_CTR:
576                ctx->base.driver = &qcrypto_nettle_aes128_driver_ctr;
577                break;
578            case QCRYPTO_CIPHER_MODE_XTS:
579                ctx->base.driver = &qcrypto_nettle_aes128_driver_xts;
580                nkey /= 2;
581                aes128_set_encrypt_key(&ctx->key_xts[0], key + nkey);
582                aes128_set_decrypt_key(&ctx->key_xts[1], key + nkey);
583                break;
584            default:
585                g_assert_not_reached();
586            }
587            aes128_set_encrypt_key(&ctx->key[0], key);
588            aes128_set_decrypt_key(&ctx->key[1], key);
589
590            return &ctx->base;
591        }
592
593    case QCRYPTO_CIPHER_ALG_AES_192:
594        {
595            QCryptoNettleAES192 *ctx = g_new0(QCryptoNettleAES192, 1);
596
597            switch (mode) {
598            case QCRYPTO_CIPHER_MODE_ECB:
599                ctx->base.driver = &qcrypto_nettle_aes192_driver_ecb;
600                break;
601            case QCRYPTO_CIPHER_MODE_CBC:
602                ctx->base.driver = &qcrypto_nettle_aes192_driver_cbc;
603                break;
604            case QCRYPTO_CIPHER_MODE_CTR:
605                ctx->base.driver = &qcrypto_nettle_aes192_driver_ctr;
606                break;
607            case QCRYPTO_CIPHER_MODE_XTS:
608                ctx->base.driver = &qcrypto_nettle_aes192_driver_xts;
609                nkey /= 2;
610                aes192_set_encrypt_key(&ctx->key_xts[0], key + nkey);
611                aes192_set_decrypt_key(&ctx->key_xts[1], key + nkey);
612                break;
613            default:
614                g_assert_not_reached();
615            }
616            aes192_set_encrypt_key(&ctx->key[0], key);
617            aes192_set_decrypt_key(&ctx->key[1], key);
618
619            return &ctx->base;
620        }
621
622    case QCRYPTO_CIPHER_ALG_AES_256:
623        {
624            QCryptoNettleAES256 *ctx = g_new0(QCryptoNettleAES256, 1);
625
626            switch (mode) {
627            case QCRYPTO_CIPHER_MODE_ECB:
628                ctx->base.driver = &qcrypto_nettle_aes256_driver_ecb;
629                break;
630            case QCRYPTO_CIPHER_MODE_CBC:
631                ctx->base.driver = &qcrypto_nettle_aes256_driver_cbc;
632                break;
633            case QCRYPTO_CIPHER_MODE_CTR:
634                ctx->base.driver = &qcrypto_nettle_aes256_driver_ctr;
635                break;
636            case QCRYPTO_CIPHER_MODE_XTS:
637                ctx->base.driver = &qcrypto_nettle_aes256_driver_xts;
638                nkey /= 2;
639                aes256_set_encrypt_key(&ctx->key_xts[0], key + nkey);
640                aes256_set_decrypt_key(&ctx->key_xts[1], key + nkey);
641                break;
642            default:
643                g_assert_not_reached();
644            }
645            aes256_set_encrypt_key(&ctx->key[0], key);
646            aes256_set_decrypt_key(&ctx->key[1], key);
647
648            return &ctx->base;
649        }
650
651    case QCRYPTO_CIPHER_ALG_CAST5_128:
652        {
653            QCryptoNettleCAST128 *ctx;
654            const QCryptoCipherDriver *drv;
655
656            switch (mode) {
657            case QCRYPTO_CIPHER_MODE_ECB:
658                drv = &qcrypto_nettle_cast128_driver_ecb;
659                break;
660            case QCRYPTO_CIPHER_MODE_CBC:
661                drv = &qcrypto_nettle_cast128_driver_cbc;
662                break;
663            case QCRYPTO_CIPHER_MODE_CTR:
664                drv = &qcrypto_nettle_cast128_driver_ctr;
665                break;
666            default:
667                goto bad_cipher_mode;
668            }
669
670            ctx = g_new0(QCryptoNettleCAST128, 1);
671            ctx->base.driver = drv;
672            cast5_set_key(&ctx->key, nkey, key);
673
674            return &ctx->base;
675        }
676
677    case QCRYPTO_CIPHER_ALG_SERPENT_128:
678    case QCRYPTO_CIPHER_ALG_SERPENT_192:
679    case QCRYPTO_CIPHER_ALG_SERPENT_256:
680        {
681            QCryptoNettleSerpent *ctx = g_new0(QCryptoNettleSerpent, 1);
682
683            switch (mode) {
684            case QCRYPTO_CIPHER_MODE_ECB:
685                ctx->base.driver = &qcrypto_nettle_serpent_driver_ecb;
686                break;
687            case QCRYPTO_CIPHER_MODE_CBC:
688                ctx->base.driver = &qcrypto_nettle_serpent_driver_cbc;
689                break;
690            case QCRYPTO_CIPHER_MODE_CTR:
691                ctx->base.driver = &qcrypto_nettle_serpent_driver_ctr;
692                break;
693            case QCRYPTO_CIPHER_MODE_XTS:
694                ctx->base.driver = &qcrypto_nettle_serpent_driver_xts;
695                nkey /= 2;
696                serpent_set_key(&ctx->key_xts, nkey, key + nkey);
697                break;
698            default:
699                g_assert_not_reached();
700            }
701            serpent_set_key(&ctx->key, nkey, key);
702
703            return &ctx->base;
704        }
705
706    case QCRYPTO_CIPHER_ALG_TWOFISH_128:
707    case QCRYPTO_CIPHER_ALG_TWOFISH_192:
708    case QCRYPTO_CIPHER_ALG_TWOFISH_256:
709        {
710            QCryptoNettleTwofish *ctx = g_new0(QCryptoNettleTwofish, 1);
711
712            switch (mode) {
713            case QCRYPTO_CIPHER_MODE_ECB:
714                ctx->base.driver = &qcrypto_nettle_twofish_driver_ecb;
715                break;
716            case QCRYPTO_CIPHER_MODE_CBC:
717                ctx->base.driver = &qcrypto_nettle_twofish_driver_cbc;
718                break;
719            case QCRYPTO_CIPHER_MODE_CTR:
720                ctx->base.driver = &qcrypto_nettle_twofish_driver_ctr;
721                break;
722            case QCRYPTO_CIPHER_MODE_XTS:
723                ctx->base.driver = &qcrypto_nettle_twofish_driver_xts;
724                nkey /= 2;
725                twofish_set_key(&ctx->key_xts, nkey, key + nkey);
726                break;
727            default:
728                g_assert_not_reached();
729            }
730            twofish_set_key(&ctx->key, nkey, key);
731
732            return &ctx->base;
733        }
734#ifdef CONFIG_CRYPTO_SM4
735    case QCRYPTO_CIPHER_ALG_SM4:
736        {
737            QCryptoNettleSm4 *ctx = g_new0(QCryptoNettleSm4, 1);
738
739            switch (mode) {
740            case QCRYPTO_CIPHER_MODE_ECB:
741                ctx->base.driver = &qcrypto_nettle_sm4_driver_ecb;
742                break;
743            default:
744                goto bad_cipher_mode;
745            }
746
747            sm4_set_encrypt_key(&ctx->key[0], key);
748            sm4_set_decrypt_key(&ctx->key[1], key);
749
750            return &ctx->base;
751        }
752#endif
753
754    default:
755        error_setg(errp, "Unsupported cipher algorithm %s",
756                   QCryptoCipherAlgorithm_str(alg));
757        return NULL;
758    }
759
760 bad_cipher_mode:
761    error_setg(errp, "Unsupported cipher mode %s",
762               QCryptoCipherMode_str(mode));
763    return NULL;
764}
765