2
2
* QEMU OpenTitan AES device
3
3
*
4
4
* Copyright (c) 2022-2024 Rivos, Inc.
5
+ * Copyright (c) 2025 lowRISC contributors.
5
6
*
6
7
* Author(s):
7
8
* Emmanuel Blot <eblot@rivosinc.com>
@@ -430,9 +431,11 @@ static void ot_aes_init_keyshare(OtAESState *s, bool randomize)
430
431
OtAESRegisters * r = s -> regs ;
431
432
OtAESContext * c = s -> ctx ;
432
433
433
- trace_ot_aes_init ("keyshare" );
434
434
if (randomize ) {
435
+ trace_ot_aes_init ("keyshare init (randomize data)" );
435
436
ot_aes_randomize (s , r -> keyshare , ARRAY_SIZE (r -> keyshare ));
437
+ } else {
438
+ trace_ot_aes_init ("keyshare init (data preserved)" );
436
439
}
437
440
bitmap_zero (r -> keyshare_bm , (int64_t )(PARAM_NUM_REGS_KEY * 2u ));
438
441
c -> key_ready = false;
@@ -443,9 +446,11 @@ static void ot_aes_init_iv(OtAESState *s, bool randomize)
443
446
OtAESRegisters * r = s -> regs ;
444
447
OtAESContext * c = s -> ctx ;
445
448
446
- trace_ot_aes_init ("iv" );
447
449
if (randomize ) {
450
+ trace_ot_aes_init ("iv init (randomize data)" );
448
451
ot_aes_randomize (s , r -> iv , ARRAY_SIZE (r -> iv ));
452
+ } else {
453
+ trace_ot_aes_init ("iv init (data preserved)" );
449
454
}
450
455
bitmap_zero (r -> iv_bm , PARAM_NUM_REGS_IV );
451
456
c -> iv_ready = false;
@@ -873,13 +878,18 @@ static void ot_aes_process(OtAESState *s)
873
878
c -> di_full = false;
874
879
875
880
if (rc == CRYPT_OK ) {
876
- /* IV registers are updated on each round */
881
+ /*
882
+ * IV registers are updated on each round. For details, see:
883
+ * https://opentitan.org/book/hw/ip/aes/doc/theory_of_operation.html
884
+ * https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation
885
+ */
877
886
switch (mode ) {
878
887
case AES_CBC :
879
888
memcpy (c -> iv , c -> cbc .IV , sizeof (c -> iv ));
880
889
break ;
881
890
case AES_CFB :
882
- memcpy (c -> iv , c -> cfb .IV , sizeof (c -> iv ));
891
+ /* In CFB mode the next IV register value is the ciphertext */
892
+ memcpy (c -> iv , encrypt ? c -> dst : c -> src , sizeof (c -> iv ));
883
893
break ;
884
894
case AES_OFB :
885
895
memcpy (c -> iv , c -> ofb .IV , sizeof (c -> iv ));
0 commit comments