Daniel Axtens <dja@xxxxxxxxxx> writes: > The kernel self-tests picked up an issue with CTR mode: > alg: skcipher: p8_aes_ctr encryption test failed (wrong result) on test vector 3, cfg="uneven misaligned splits, may sleep" > > Test vector 3 has an IV of FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD, so > after 3 increments it should wrap around to 0. > > In the aesp8-ppc code from OpenSSL, there are two paths that > increment IVs: the bulk (8 at a time) path, and the individual > path which is used when there are fewer than 8 AES blocks to > process. > > In the bulk path, the IV is incremented with vadduqm: "Vector > Add Unsigned Quadword Modulo", which does 128-bit addition. > > In the individual path, however, the IV is incremented with > vadduwm: "Vector Add Unsigned Word Modulo", which instead > does 4 32-bit additions. Thus the IV would instead become > FFFFFFFFFFFFFFFFFFFFFFFF00000000, throwing off the result. > > Use vadduqm. > > This was probably a typo originally, what with q and w being > adjacent. It is a pretty narrow edge case: I am really > impressed by the quality of the kernel self-tests! > > Fixes: 5c380d623ed3 ("crypto: vmx - Add support for VMS instructions by ASM") > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Daniel Axtens <dja@xxxxxxxxxx> > > --- > > I'll pass this along internally to get it into OpenSSL as well. I passed this along to OpenSSL and got pretty comprehensively schooled: https://github.com/openssl/openssl/pull/8942 It seems we tweak the openssl code to use a 128-bit counter, whereas the original code was in fact designed for a 32-bit counter. We must have changed the vaddu instruction in the bulk path but not in the individual path, as they're both vadduwm (4x32-bit) upstream. I think this change is still correct with regards to the kernel, but I guess it's probably something where I should have done a more thorough read of the documentation before diving in to the code, and perhaps we should note it in the code somewhere too. Ah well. Regards, Daniel > --- > drivers/crypto/vmx/aesp8-ppc.pl | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/crypto/vmx/aesp8-ppc.pl b/drivers/crypto/vmx/aesp8-ppc.pl > index de78282b8f44..9c6b5c1d6a1a 100644 > --- a/drivers/crypto/vmx/aesp8-ppc.pl > +++ b/drivers/crypto/vmx/aesp8-ppc.pl > @@ -1357,7 +1357,7 @@ Loop_ctr32_enc: > addi $idx,$idx,16 > bdnz Loop_ctr32_enc > > - vadduwm $ivec,$ivec,$one > + vadduqm $ivec,$ivec,$one > vmr $dat,$inptail > lvx $inptail,0,$inp > addi $inp,$inp,16 > -- > 2.19.1