2 * QEMU Crypto cipher nettle algorithms
4 * Copyright (c) 2015 Red Hat, Inc.
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.
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.
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/>.
21 #include "qemu/osdep.h"
22 #include "crypto/xts.h"
23 #include "cipherpriv.h"
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>
34 typedef void (*QCryptoCipherNettleFuncWrapper
)(const void *ctx
,
39 #if CONFIG_NETTLE_VERSION_MAJOR < 3
40 typedef nettle_crypt_func
* QCryptoCipherNettleFuncNative
;
41 typedef void * cipher_ctx_t
;
42 typedef unsigned cipher_length_t
;
44 #define cast5_set_key cast128_set_key
46 #define aes128_ctx aes_ctx
47 #define aes192_ctx aes_ctx
48 #define aes256_ctx aes_ctx
49 #define aes128_set_encrypt_key(c, k) \
50 aes_set_encrypt_key(c, 16, k)
51 #define aes192_set_encrypt_key(c, k) \
52 aes_set_encrypt_key(c, 24, k)
53 #define aes256_set_encrypt_key(c, k) \
54 aes_set_encrypt_key(c, 32, k)
55 #define aes128_set_decrypt_key(c, k) \
56 aes_set_decrypt_key(c, 16, k)
57 #define aes192_set_decrypt_key(c, k) \
58 aes_set_decrypt_key(c, 24, k)
59 #define aes256_set_decrypt_key(c, k) \
60 aes_set_decrypt_key(c, 32, k)
61 #define aes128_encrypt aes_encrypt
62 #define aes192_encrypt aes_encrypt
63 #define aes256_encrypt aes_encrypt
64 #define aes128_decrypt aes_decrypt
65 #define aes192_decrypt aes_decrypt
66 #define aes256_decrypt aes_decrypt
68 typedef nettle_cipher_func
* QCryptoCipherNettleFuncNative
;
69 typedef const void * cipher_ctx_t
;
70 typedef size_t cipher_length_t
;
73 typedef struct QCryptoNettleAES128
{
74 struct aes128_ctx enc
;
75 struct aes128_ctx dec
;
76 } QCryptoNettleAES128
;
78 typedef struct QCryptoNettleAES192
{
79 struct aes192_ctx enc
;
80 struct aes192_ctx dec
;
81 } QCryptoNettleAES192
;
83 typedef struct QCryptoNettleAES256
{
84 struct aes256_ctx enc
;
85 struct aes256_ctx dec
;
86 } QCryptoNettleAES256
;
88 static void aes128_encrypt_native(cipher_ctx_t ctx
, cipher_length_t length
,
89 uint8_t *dst
, const uint8_t *src
)
91 const QCryptoNettleAES128
*aesctx
= ctx
;
92 aes128_encrypt(&aesctx
->enc
, length
, dst
, src
);
95 static void aes128_decrypt_native(cipher_ctx_t ctx
, cipher_length_t length
,
96 uint8_t *dst
, const uint8_t *src
)
98 const QCryptoNettleAES128
*aesctx
= ctx
;
99 aes128_decrypt(&aesctx
->dec
, length
, dst
, src
);
102 static void aes192_encrypt_native(cipher_ctx_t ctx
, cipher_length_t length
,
103 uint8_t *dst
, const uint8_t *src
)
105 const QCryptoNettleAES192
*aesctx
= ctx
;
106 aes192_encrypt(&aesctx
->enc
, length
, dst
, src
);
109 static void aes192_decrypt_native(cipher_ctx_t ctx
, cipher_length_t length
,
110 uint8_t *dst
, const uint8_t *src
)
112 const QCryptoNettleAES192
*aesctx
= ctx
;
113 aes192_decrypt(&aesctx
->dec
, length
, dst
, src
);
116 static void aes256_encrypt_native(cipher_ctx_t ctx
, cipher_length_t length
,
117 uint8_t *dst
, const uint8_t *src
)
119 const QCryptoNettleAES256
*aesctx
= ctx
;
120 aes256_encrypt(&aesctx
->enc
, length
, dst
, src
);
123 static void aes256_decrypt_native(cipher_ctx_t ctx
, cipher_length_t length
,
124 uint8_t *dst
, const uint8_t *src
)
126 const QCryptoNettleAES256
*aesctx
= ctx
;
127 aes256_decrypt(&aesctx
->dec
, length
, dst
, src
);
130 static void des_encrypt_native(cipher_ctx_t ctx
, cipher_length_t length
,
131 uint8_t *dst
, const uint8_t *src
)
133 des_encrypt(ctx
, length
, dst
, src
);
136 static void des_decrypt_native(cipher_ctx_t ctx
, cipher_length_t length
,
137 uint8_t *dst
, const uint8_t *src
)
139 des_decrypt(ctx
, length
, dst
, src
);
142 static void des3_encrypt_native(cipher_ctx_t ctx
, cipher_length_t length
,
143 uint8_t *dst
, const uint8_t *src
)
145 des3_encrypt(ctx
, length
, dst
, src
);
148 static void des3_decrypt_native(cipher_ctx_t ctx
, cipher_length_t length
,
149 uint8_t *dst
, const uint8_t *src
)
151 des3_decrypt(ctx
, length
, dst
, src
);
154 static void cast128_encrypt_native(cipher_ctx_t ctx
, cipher_length_t length
,
155 uint8_t *dst
, const uint8_t *src
)
157 cast128_encrypt(ctx
, length
, dst
, src
);
160 static void cast128_decrypt_native(cipher_ctx_t ctx
, cipher_length_t length
,
161 uint8_t *dst
, const uint8_t *src
)
163 cast128_decrypt(ctx
, length
, dst
, src
);
166 static void serpent_encrypt_native(cipher_ctx_t ctx
, cipher_length_t length
,
167 uint8_t *dst
, const uint8_t *src
)
169 serpent_encrypt(ctx
, length
, dst
, src
);
172 static void serpent_decrypt_native(cipher_ctx_t ctx
, cipher_length_t length
,
173 uint8_t *dst
, const uint8_t *src
)
175 serpent_decrypt(ctx
, length
, dst
, src
);
178 static void twofish_encrypt_native(cipher_ctx_t ctx
, cipher_length_t length
,
179 uint8_t *dst
, const uint8_t *src
)
181 twofish_encrypt(ctx
, length
, dst
, src
);
184 static void twofish_decrypt_native(cipher_ctx_t ctx
, cipher_length_t length
,
185 uint8_t *dst
, const uint8_t *src
)
187 twofish_decrypt(ctx
, length
, dst
, src
);
190 static void aes128_encrypt_wrapper(const void *ctx
, size_t length
,
191 uint8_t *dst
, const uint8_t *src
)
193 const QCryptoNettleAES128
*aesctx
= ctx
;
194 aes128_encrypt(&aesctx
->enc
, length
, dst
, src
);
197 static void aes128_decrypt_wrapper(const void *ctx
, size_t length
,
198 uint8_t *dst
, const uint8_t *src
)
200 const QCryptoNettleAES128
*aesctx
= ctx
;
201 aes128_decrypt(&aesctx
->dec
, length
, dst
, src
);
204 static void aes192_encrypt_wrapper(const void *ctx
, size_t length
,
205 uint8_t *dst
, const uint8_t *src
)
207 const QCryptoNettleAES192
*aesctx
= ctx
;
208 aes192_encrypt(&aesctx
->enc
, length
, dst
, src
);
211 static void aes192_decrypt_wrapper(const void *ctx
, size_t length
,
212 uint8_t *dst
, const uint8_t *src
)
214 const QCryptoNettleAES192
*aesctx
= ctx
;
215 aes192_decrypt(&aesctx
->dec
, length
, dst
, src
);
218 static void aes256_encrypt_wrapper(const void *ctx
, size_t length
,
219 uint8_t *dst
, const uint8_t *src
)
221 const QCryptoNettleAES256
*aesctx
= ctx
;
222 aes256_encrypt(&aesctx
->enc
, length
, dst
, src
);
225 static void aes256_decrypt_wrapper(const void *ctx
, size_t length
,
226 uint8_t *dst
, const uint8_t *src
)
228 const QCryptoNettleAES256
*aesctx
= ctx
;
229 aes256_decrypt(&aesctx
->dec
, length
, dst
, src
);
232 static void des_encrypt_wrapper(const void *ctx
, size_t length
,
233 uint8_t *dst
, const uint8_t *src
)
235 des_encrypt(ctx
, length
, dst
, src
);
238 static void des_decrypt_wrapper(const void *ctx
, size_t length
,
239 uint8_t *dst
, const uint8_t *src
)
241 des_decrypt(ctx
, length
, dst
, src
);
244 static void des3_encrypt_wrapper(const void *ctx
, size_t length
,
245 uint8_t *dst
, const uint8_t *src
)
247 des3_encrypt(ctx
, length
, dst
, src
);
250 static void des3_decrypt_wrapper(const void *ctx
, size_t length
,
251 uint8_t *dst
, const uint8_t *src
)
253 des3_decrypt(ctx
, length
, dst
, src
);
256 static void cast128_encrypt_wrapper(const void *ctx
, size_t length
,
257 uint8_t *dst
, const uint8_t *src
)
259 cast128_encrypt(ctx
, length
, dst
, src
);
262 static void cast128_decrypt_wrapper(const void *ctx
, size_t length
,
263 uint8_t *dst
, const uint8_t *src
)
265 cast128_decrypt(ctx
, length
, dst
, src
);
268 static void serpent_encrypt_wrapper(const void *ctx
, size_t length
,
269 uint8_t *dst
, const uint8_t *src
)
271 serpent_encrypt(ctx
, length
, dst
, src
);
274 static void serpent_decrypt_wrapper(const void *ctx
, size_t length
,
275 uint8_t *dst
, const uint8_t *src
)
277 serpent_decrypt(ctx
, length
, dst
, src
);
280 static void twofish_encrypt_wrapper(const void *ctx
, size_t length
,
281 uint8_t *dst
, const uint8_t *src
)
283 twofish_encrypt(ctx
, length
, dst
, src
);
286 static void twofish_decrypt_wrapper(const void *ctx
, size_t length
,
287 uint8_t *dst
, const uint8_t *src
)
289 twofish_decrypt(ctx
, length
, dst
, src
);
292 typedef struct QCryptoCipherNettle QCryptoCipherNettle
;
293 struct QCryptoCipherNettle
{
294 /* Primary cipher context for all modes */
296 /* Second cipher context for XTS mode only */
298 /* Cipher callbacks for both contexts */
299 QCryptoCipherNettleFuncNative alg_encrypt_native
;
300 QCryptoCipherNettleFuncNative alg_decrypt_native
;
301 QCryptoCipherNettleFuncWrapper alg_encrypt_wrapper
;
302 QCryptoCipherNettleFuncWrapper alg_decrypt_wrapper
;
303 /* Initialization vector or Counter */
308 bool qcrypto_cipher_supports(QCryptoCipherAlgorithm alg
,
309 QCryptoCipherMode mode
)
312 case QCRYPTO_CIPHER_ALG_DES_RFB
:
313 case QCRYPTO_CIPHER_ALG_3DES
:
314 case QCRYPTO_CIPHER_ALG_AES_128
:
315 case QCRYPTO_CIPHER_ALG_AES_192
:
316 case QCRYPTO_CIPHER_ALG_AES_256
:
317 case QCRYPTO_CIPHER_ALG_CAST5_128
:
318 case QCRYPTO_CIPHER_ALG_SERPENT_128
:
319 case QCRYPTO_CIPHER_ALG_SERPENT_192
:
320 case QCRYPTO_CIPHER_ALG_SERPENT_256
:
321 case QCRYPTO_CIPHER_ALG_TWOFISH_128
:
322 case QCRYPTO_CIPHER_ALG_TWOFISH_192
:
323 case QCRYPTO_CIPHER_ALG_TWOFISH_256
:
330 case QCRYPTO_CIPHER_MODE_ECB
:
331 case QCRYPTO_CIPHER_MODE_CBC
:
332 case QCRYPTO_CIPHER_MODE_XTS
:
333 case QCRYPTO_CIPHER_MODE_CTR
:
342 qcrypto_nettle_cipher_free_ctx(QCryptoCipherNettle
*ctx
)
350 g_free(ctx
->ctx_tweak
);
355 static QCryptoCipherNettle
*qcrypto_cipher_ctx_new(QCryptoCipherAlgorithm alg
,
356 QCryptoCipherMode mode
,
361 QCryptoCipherNettle
*ctx
;
365 case QCRYPTO_CIPHER_MODE_ECB
:
366 case QCRYPTO_CIPHER_MODE_CBC
:
367 case QCRYPTO_CIPHER_MODE_XTS
:
368 case QCRYPTO_CIPHER_MODE_CTR
:
371 error_setg(errp
, "Unsupported cipher mode %s",
372 QCryptoCipherMode_str(mode
));
376 if (!qcrypto_cipher_validate_key_length(alg
, mode
, nkey
, errp
)) {
380 ctx
= g_new0(QCryptoCipherNettle
, 1);
383 case QCRYPTO_CIPHER_ALG_DES_RFB
:
384 ctx
->ctx
= g_new0(struct des_ctx
, 1);
385 rfbkey
= qcrypto_cipher_munge_des_rfb_key(key
, nkey
);
386 des_set_key(ctx
->ctx
, rfbkey
);
389 ctx
->alg_encrypt_native
= des_encrypt_native
;
390 ctx
->alg_decrypt_native
= des_decrypt_native
;
391 ctx
->alg_encrypt_wrapper
= des_encrypt_wrapper
;
392 ctx
->alg_decrypt_wrapper
= des_decrypt_wrapper
;
394 ctx
->blocksize
= DES_BLOCK_SIZE
;
397 case QCRYPTO_CIPHER_ALG_3DES
:
398 ctx
->ctx
= g_new0(struct des3_ctx
, 1);
399 des3_set_key(ctx
->ctx
, key
);
401 ctx
->alg_encrypt_native
= des3_encrypt_native
;
402 ctx
->alg_decrypt_native
= des3_decrypt_native
;
403 ctx
->alg_encrypt_wrapper
= des3_encrypt_wrapper
;
404 ctx
->alg_decrypt_wrapper
= des3_decrypt_wrapper
;
406 ctx
->blocksize
= DES3_BLOCK_SIZE
;
409 case QCRYPTO_CIPHER_ALG_AES_128
:
410 ctx
->ctx
= g_new0(QCryptoNettleAES128
, 1);
412 if (mode
== QCRYPTO_CIPHER_MODE_XTS
) {
413 ctx
->ctx_tweak
= g_new0(QCryptoNettleAES128
, 1);
416 aes128_set_encrypt_key(&((QCryptoNettleAES128
*)ctx
->ctx
)->enc
,
418 aes128_set_decrypt_key(&((QCryptoNettleAES128
*)ctx
->ctx
)->dec
,
421 aes128_set_encrypt_key(&((QCryptoNettleAES128
*)ctx
->ctx_tweak
)->
423 aes128_set_decrypt_key(&((QCryptoNettleAES128
*)ctx
->ctx_tweak
)->
426 aes128_set_encrypt_key(&((QCryptoNettleAES128
*)ctx
->ctx
)->enc
,
428 aes128_set_decrypt_key(&((QCryptoNettleAES128
*)ctx
->ctx
)->dec
,
432 ctx
->alg_encrypt_native
= aes128_encrypt_native
;
433 ctx
->alg_decrypt_native
= aes128_decrypt_native
;
434 ctx
->alg_encrypt_wrapper
= aes128_encrypt_wrapper
;
435 ctx
->alg_decrypt_wrapper
= aes128_decrypt_wrapper
;
437 ctx
->blocksize
= AES_BLOCK_SIZE
;
440 case QCRYPTO_CIPHER_ALG_AES_192
:
441 ctx
->ctx
= g_new0(QCryptoNettleAES192
, 1);
443 if (mode
== QCRYPTO_CIPHER_MODE_XTS
) {
444 ctx
->ctx_tweak
= g_new0(QCryptoNettleAES192
, 1);
447 aes192_set_encrypt_key(&((QCryptoNettleAES192
*)ctx
->ctx
)->enc
,
449 aes192_set_decrypt_key(&((QCryptoNettleAES192
*)ctx
->ctx
)->dec
,
452 aes192_set_encrypt_key(&((QCryptoNettleAES192
*)ctx
->ctx_tweak
)->
454 aes192_set_decrypt_key(&((QCryptoNettleAES192
*)ctx
->ctx_tweak
)->
457 aes192_set_encrypt_key(&((QCryptoNettleAES192
*)ctx
->ctx
)->enc
,
459 aes192_set_decrypt_key(&((QCryptoNettleAES192
*)ctx
->ctx
)->dec
,
463 ctx
->alg_encrypt_native
= aes192_encrypt_native
;
464 ctx
->alg_decrypt_native
= aes192_decrypt_native
;
465 ctx
->alg_encrypt_wrapper
= aes192_encrypt_wrapper
;
466 ctx
->alg_decrypt_wrapper
= aes192_decrypt_wrapper
;
468 ctx
->blocksize
= AES_BLOCK_SIZE
;
471 case QCRYPTO_CIPHER_ALG_AES_256
:
472 ctx
->ctx
= g_new0(QCryptoNettleAES256
, 1);
474 if (mode
== QCRYPTO_CIPHER_MODE_XTS
) {
475 ctx
->ctx_tweak
= g_new0(QCryptoNettleAES256
, 1);
478 aes256_set_encrypt_key(&((QCryptoNettleAES256
*)ctx
->ctx
)->enc
,
480 aes256_set_decrypt_key(&((QCryptoNettleAES256
*)ctx
->ctx
)->dec
,
483 aes256_set_encrypt_key(&((QCryptoNettleAES256
*)ctx
->ctx_tweak
)->
485 aes256_set_decrypt_key(&((QCryptoNettleAES256
*)ctx
->ctx_tweak
)->
488 aes256_set_encrypt_key(&((QCryptoNettleAES256
*)ctx
->ctx
)->enc
,
490 aes256_set_decrypt_key(&((QCryptoNettleAES256
*)ctx
->ctx
)->dec
,
494 ctx
->alg_encrypt_native
= aes256_encrypt_native
;
495 ctx
->alg_decrypt_native
= aes256_decrypt_native
;
496 ctx
->alg_encrypt_wrapper
= aes256_encrypt_wrapper
;
497 ctx
->alg_decrypt_wrapper
= aes256_decrypt_wrapper
;
499 ctx
->blocksize
= AES_BLOCK_SIZE
;
502 case QCRYPTO_CIPHER_ALG_CAST5_128
:
503 ctx
->ctx
= g_new0(struct cast128_ctx
, 1);
505 if (mode
== QCRYPTO_CIPHER_MODE_XTS
) {
506 ctx
->ctx_tweak
= g_new0(struct cast128_ctx
, 1);
509 cast5_set_key(ctx
->ctx
, nkey
, key
);
510 cast5_set_key(ctx
->ctx_tweak
, nkey
, key
+ nkey
);
512 cast5_set_key(ctx
->ctx
, nkey
, key
);
515 ctx
->alg_encrypt_native
= cast128_encrypt_native
;
516 ctx
->alg_decrypt_native
= cast128_decrypt_native
;
517 ctx
->alg_encrypt_wrapper
= cast128_encrypt_wrapper
;
518 ctx
->alg_decrypt_wrapper
= cast128_decrypt_wrapper
;
520 ctx
->blocksize
= CAST128_BLOCK_SIZE
;
523 case QCRYPTO_CIPHER_ALG_SERPENT_128
:
524 case QCRYPTO_CIPHER_ALG_SERPENT_192
:
525 case QCRYPTO_CIPHER_ALG_SERPENT_256
:
526 ctx
->ctx
= g_new0(struct serpent_ctx
, 1);
528 if (mode
== QCRYPTO_CIPHER_MODE_XTS
) {
529 ctx
->ctx_tweak
= g_new0(struct serpent_ctx
, 1);
532 serpent_set_key(ctx
->ctx
, nkey
, key
);
533 serpent_set_key(ctx
->ctx_tweak
, nkey
, key
+ nkey
);
535 serpent_set_key(ctx
->ctx
, nkey
, key
);
538 ctx
->alg_encrypt_native
= serpent_encrypt_native
;
539 ctx
->alg_decrypt_native
= serpent_decrypt_native
;
540 ctx
->alg_encrypt_wrapper
= serpent_encrypt_wrapper
;
541 ctx
->alg_decrypt_wrapper
= serpent_decrypt_wrapper
;
543 ctx
->blocksize
= SERPENT_BLOCK_SIZE
;
546 case QCRYPTO_CIPHER_ALG_TWOFISH_128
:
547 case QCRYPTO_CIPHER_ALG_TWOFISH_192
:
548 case QCRYPTO_CIPHER_ALG_TWOFISH_256
:
549 ctx
->ctx
= g_new0(struct twofish_ctx
, 1);
551 if (mode
== QCRYPTO_CIPHER_MODE_XTS
) {
552 ctx
->ctx_tweak
= g_new0(struct twofish_ctx
, 1);
555 twofish_set_key(ctx
->ctx
, nkey
, key
);
556 twofish_set_key(ctx
->ctx_tweak
, nkey
, key
+ nkey
);
558 twofish_set_key(ctx
->ctx
, nkey
, key
);
561 ctx
->alg_encrypt_native
= twofish_encrypt_native
;
562 ctx
->alg_decrypt_native
= twofish_decrypt_native
;
563 ctx
->alg_encrypt_wrapper
= twofish_encrypt_wrapper
;
564 ctx
->alg_decrypt_wrapper
= twofish_decrypt_wrapper
;
566 ctx
->blocksize
= TWOFISH_BLOCK_SIZE
;
570 error_setg(errp
, "Unsupported cipher algorithm %s",
571 QCryptoCipherAlgorithm_str(alg
));
575 if (mode
== QCRYPTO_CIPHER_MODE_XTS
&&
576 ctx
->blocksize
!= XTS_BLOCK_SIZE
) {
577 error_setg(errp
, "Cipher block size %zu must equal XTS block size %d",
578 ctx
->blocksize
, XTS_BLOCK_SIZE
);
582 ctx
->iv
= g_new0(uint8_t, ctx
->blocksize
);
587 qcrypto_nettle_cipher_free_ctx(ctx
);
593 qcrypto_nettle_cipher_ctx_free(QCryptoCipher
*cipher
)
595 QCryptoCipherNettle
*ctx
;
597 ctx
= cipher
->opaque
;
598 qcrypto_nettle_cipher_free_ctx(ctx
);
603 qcrypto_nettle_cipher_encrypt(QCryptoCipher
*cipher
,
609 QCryptoCipherNettle
*ctx
= cipher
->opaque
;
611 if (len
% ctx
->blocksize
) {
612 error_setg(errp
, "Length %zu must be a multiple of block size %zu",
613 len
, ctx
->blocksize
);
617 switch (cipher
->mode
) {
618 case QCRYPTO_CIPHER_MODE_ECB
:
619 ctx
->alg_encrypt_wrapper(ctx
->ctx
, len
, out
, in
);
622 case QCRYPTO_CIPHER_MODE_CBC
:
623 cbc_encrypt(ctx
->ctx
, ctx
->alg_encrypt_native
,
624 ctx
->blocksize
, ctx
->iv
,
628 case QCRYPTO_CIPHER_MODE_XTS
:
629 xts_encrypt(ctx
->ctx
, ctx
->ctx_tweak
,
630 ctx
->alg_encrypt_wrapper
, ctx
->alg_encrypt_wrapper
,
631 ctx
->iv
, len
, out
, in
);
634 case QCRYPTO_CIPHER_MODE_CTR
:
635 ctr_crypt(ctx
->ctx
, ctx
->alg_encrypt_native
,
636 ctx
->blocksize
, ctx
->iv
,
641 error_setg(errp
, "Unsupported cipher mode %s",
642 QCryptoCipherMode_str(cipher
->mode
));
650 qcrypto_nettle_cipher_decrypt(QCryptoCipher
*cipher
,
656 QCryptoCipherNettle
*ctx
= cipher
->opaque
;
658 if (len
% ctx
->blocksize
) {
659 error_setg(errp
, "Length %zu must be a multiple of block size %zu",
660 len
, ctx
->blocksize
);
664 switch (cipher
->mode
) {
665 case QCRYPTO_CIPHER_MODE_ECB
:
666 ctx
->alg_decrypt_wrapper(ctx
->ctx
, len
, out
, in
);
669 case QCRYPTO_CIPHER_MODE_CBC
:
670 cbc_decrypt(ctx
->ctx
, ctx
->alg_decrypt_native
,
671 ctx
->blocksize
, ctx
->iv
,
675 case QCRYPTO_CIPHER_MODE_XTS
:
676 xts_decrypt(ctx
->ctx
, ctx
->ctx_tweak
,
677 ctx
->alg_encrypt_wrapper
, ctx
->alg_decrypt_wrapper
,
678 ctx
->iv
, len
, out
, in
);
680 case QCRYPTO_CIPHER_MODE_CTR
:
681 ctr_crypt(ctx
->ctx
, ctx
->alg_encrypt_native
,
682 ctx
->blocksize
, ctx
->iv
,
687 error_setg(errp
, "Unsupported cipher mode %s",
688 QCryptoCipherMode_str(cipher
->mode
));
695 qcrypto_nettle_cipher_setiv(QCryptoCipher
*cipher
,
696 const uint8_t *iv
, size_t niv
,
699 QCryptoCipherNettle
*ctx
= cipher
->opaque
;
700 if (niv
!= ctx
->blocksize
) {
701 error_setg(errp
, "Expected IV size %zu not %zu",
702 ctx
->blocksize
, niv
);
705 memcpy(ctx
->iv
, iv
, niv
);
710 static struct QCryptoCipherDriver qcrypto_cipher_lib_driver
= {
711 .cipher_encrypt
= qcrypto_nettle_cipher_encrypt
,
712 .cipher_decrypt
= qcrypto_nettle_cipher_decrypt
,
713 .cipher_setiv
= qcrypto_nettle_cipher_setiv
,
714 .cipher_free
= qcrypto_nettle_cipher_ctx_free
,