crypto: vmx - Document CTR mode counter width quirks
The CTR code comes from OpenSSL, where it does a 32-bit counter. The kernel has a 128-bit counter. This difference has lead to issues. Document it. Signed-off-by: Daniel Axtens <dja@axtens.net> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
Родитель
334d37c9e2
Коммит
f651bd96b2
|
@ -1286,6 +1286,24 @@ ___
|
||||||
|
|
||||||
#########################################################################
|
#########################################################################
|
||||||
{{{ # CTR procedure[s] #
|
{{{ # CTR procedure[s] #
|
||||||
|
|
||||||
|
####################### WARNING: Here be dragons! #######################
|
||||||
|
#
|
||||||
|
# This code is written as 'ctr32', based on a 32-bit counter used
|
||||||
|
# upstream. The kernel does *not* use a 32-bit counter. The kernel uses
|
||||||
|
# a 128-bit counter.
|
||||||
|
#
|
||||||
|
# This leads to subtle changes from the upstream code: the counter
|
||||||
|
# is incremented with vaddu_q_m rather than vaddu_w_m. This occurs in
|
||||||
|
# both the bulk (8 blocks at a time) path, and in the individual block
|
||||||
|
# path. Be aware of this when doing updates.
|
||||||
|
#
|
||||||
|
# See:
|
||||||
|
# 1d4aa0b4c181 ("crypto: vmx - Fixing AES-CTR counter bug")
|
||||||
|
# 009b30ac7444 ("crypto: vmx - CTR: always increment IV as quadword")
|
||||||
|
# https://github.com/openssl/openssl/pull/8942
|
||||||
|
#
|
||||||
|
#########################################################################
|
||||||
my ($inp,$out,$len,$key,$ivp,$x10,$rounds,$idx)=map("r$_",(3..10));
|
my ($inp,$out,$len,$key,$ivp,$x10,$rounds,$idx)=map("r$_",(3..10));
|
||||||
my ($rndkey0,$rndkey1,$inout,$tmp)= map("v$_",(0..3));
|
my ($rndkey0,$rndkey1,$inout,$tmp)= map("v$_",(0..3));
|
||||||
my ($ivec,$inptail,$inpperm,$outhead,$outperm,$outmask,$keyperm,$one)=
|
my ($ivec,$inptail,$inpperm,$outhead,$outperm,$outmask,$keyperm,$one)=
|
||||||
|
@ -1357,7 +1375,7 @@ Loop_ctr32_enc:
|
||||||
addi $idx,$idx,16
|
addi $idx,$idx,16
|
||||||
bdnz Loop_ctr32_enc
|
bdnz Loop_ctr32_enc
|
||||||
|
|
||||||
vadduqm $ivec,$ivec,$one
|
vadduqm $ivec,$ivec,$one # Kernel change for 128-bit
|
||||||
vmr $dat,$inptail
|
vmr $dat,$inptail
|
||||||
lvx $inptail,0,$inp
|
lvx $inptail,0,$inp
|
||||||
addi $inp,$inp,16
|
addi $inp,$inp,16
|
||||||
|
@ -1501,7 +1519,7 @@ Load_ctr32_enc_key:
|
||||||
$SHL $len,$len,4
|
$SHL $len,$len,4
|
||||||
|
|
||||||
vadduqm $out1,$ivec,$one # counter values ...
|
vadduqm $out1,$ivec,$one # counter values ...
|
||||||
vadduqm $out2,$ivec,$two
|
vadduqm $out2,$ivec,$two # (do all ctr adds as 128-bit)
|
||||||
vxor $out0,$ivec,$rndkey0 # ... xored with rndkey[0]
|
vxor $out0,$ivec,$rndkey0 # ... xored with rndkey[0]
|
||||||
le?li $idx,8
|
le?li $idx,8
|
||||||
vadduqm $out3,$out1,$two
|
vadduqm $out3,$out1,$two
|
||||||
|
|
Загрузка…
Ссылка в новой задаче