Full disk encryption hardware acceleration?

Now I enabled the full disk encryption mode on TX2 NX for an external NVME device.
But I found it is much slower than un-encrypted version.
I am using default one, which is

  cipher:  aes-cbc-essiv:sha256
  keysize: 128 bits

may I know if this default algorithm uses the hardware decryption acceleration?
any idea can make it faster?

my /proc/crypto looks like:

cat  /proc/crypto
name         : eddsa
driver       : eddsa-tegra
module       : kernel
priority     : 300
refcnt       : 1
selftest     : passed
internal     : no
type         : akcipher

name         : ecdsa
driver       : ecdsa-tegra
module       : kernel
priority     : 300
refcnt       : 1
selftest     : passed
internal     : no
type         : akcipher

name         : rng1_elp
driver       : rng1-elp-tegra
module       : kernel
priority     : 300
refcnt       : 1
selftest     : passed
internal     : no
type         : rng
seedsize     : 0

name         : trng_elp
driver       : trng_elp-tegra
module       : kernel
priority     : 300
refcnt       : 1
selftest     : passed
internal     : no
type         : rng
seedsize     : 0

name         : rsa-pka1
driver       : tegra-se-pka1-rsa
module       : kernel
priority     : 300
refcnt       : 1
selftest     : passed
internal     : no
type         : akcipher

name         : ecdh
driver       : tegra-se-ecdh
module       : kernel
priority     : 300
refcnt       : 1
selftest     : passed
internal     : no
type         : kpp

name         : sha512
driver       : tegra-se-sha512
module       : kernel
priority     : 300
refcnt       : 1
selftest     : passed
internal     : no
type         : ahash
async        : no
blocksize    : 128
digestsize   : 64

name         : sha384
driver       : tegra-se-sha384
module       : kernel
priority     : 300
refcnt       : 1
selftest     : passed
internal     : no
type         : ahash
async        : no
blocksize    : 128
digestsize   : 48

name         : sha256
driver       : tegra-se-sha256
module       : kernel
priority     : 300
refcnt       : 4
selftest     : passed
internal     : no
type         : ahash
async        : no
blocksize    : 64
digestsize   : 32

name         : sha224
driver       : tegra-se-sha224
module       : kernel
priority     : 300
refcnt       : 1
selftest     : passed
internal     : no
type         : ahash
async        : no
blocksize    : 64
digestsize   : 28

name         : sha1
driver       : tegra-se-sha1
module       : kernel
priority     : 300
refcnt       : 1
selftest     : passed
internal     : no
type         : ahash
async        : no
blocksize    : 64
digestsize   : 20

name         : dh
driver       : tegra-se-dh
module       : kernel
priority     : 300
refcnt       : 1
selftest     : passed
internal     : no
type         : kpp

name         : rsa-pka0
driver       : tegra-se-pka0-rsa
module       : kernel
priority     : 300
refcnt       : 1
selftest     : passed
internal     : no
type         : akcipher

name         : cmac(aes)
driver       : tegra-se-cmac(aes)
module       : kernel
priority     : 300
refcnt       : 1
selftest     : passed
internal     : no
type         : ahash
async        : no
blocksize    : 16
digestsize   : 16

name         : ofb(aes)
driver       : ofb-aes-tegra
module       : kernel
priority     : 300
refcnt       : 1
selftest     : passed
internal     : no
type         : ablkcipher
async        : yes
blocksize    : 16
min keysize  : 16
max keysize  : 64
ivsize       : 16
geniv        : eseqiv

name         : ctr(aes)
driver       : ctr-aes-tegra
module       : kernel
priority     : 300
refcnt       : 1
selftest     : passed
internal     : no
type         : ablkcipher
async        : yes
blocksize    : 16
min keysize  : 16
max keysize  : 64
ivsize       : 16
geniv        : eseqiv

name         : ecb(aes)
driver       : ecb-aes-tegra
module       : kernel
priority     : 300
refcnt       : 1
selftest     : passed
internal     : no
type         : ablkcipher
async        : yes
blocksize    : 16
min keysize  : 16
max keysize  : 64
ivsize       : 16
geniv        : <default>

name         : cbc(aes)
driver       : cbc-aes-tegra
module       : kernel
priority     : 300
refcnt       : 7
selftest     : passed
internal     : no
type         : ablkcipher
async        : yes
blocksize    : 16
min keysize  : 16
max keysize  : 64
ivsize       : 16
geniv        : <default>

name         : rng_drbg
driver       : rng_drbg-aes-tegra
module       : kernel
priority     : 100
refcnt       : 1
selftest     : passed
internal     : no
type         : rng
seedsize     : 48

name         : ghash
driver       : ghash-generic
module       : kernel
priority     : 100
refcnt       : 1
selftest     : passed
internal     : no
type         : shash
blocksize    : 16
digestsize   : 16

name         : jitterentropy_rng
driver       : jitterentropy_rng
module       : kernel
priority     : 100
refcnt       : 1
selftest     : passed
internal     : no
type         : rng
seedsize     : 0

name         : stdrng
driver       : drbg_nopr_hmac_sha256
module       : kernel
priority     : 207
refcnt       : 1
selftest     : passed
internal     : no
type         : rng
seedsize     : 0

name         : stdrng
driver       : drbg_nopr_hmac_sha512
module       : kernel
priority     : 206
refcnt       : 1
selftest     : passed
internal     : no
type         : rng
seedsize     : 0

name         : stdrng
driver       : drbg_nopr_hmac_sha384
module       : kernel
priority     : 205
refcnt       : 1
selftest     : passed
internal     : no
type         : rng
seedsize     : 0

name         : stdrng
driver       : drbg_nopr_hmac_sha1
module       : kernel
priority     : 204
refcnt       : 1
selftest     : passed
internal     : no
type         : rng
seedsize     : 0

name         : stdrng
driver       : drbg_pr_hmac_sha256
module       : kernel
priority     : 203
refcnt       : 1
selftest     : passed
internal     : no
type         : rng
seedsize     : 0

name         : stdrng
driver       : drbg_pr_hmac_sha512
module       : kernel
priority     : 202
refcnt       : 1
selftest     : passed
internal     : no
type         : rng
seedsize     : 0

name         : stdrng
driver       : drbg_pr_hmac_sha384
module       : kernel
priority     : 201
refcnt       : 1
selftest     : passed
internal     : no
type         : rng
seedsize     : 0

name         : stdrng
driver       : drbg_pr_hmac_sha1
module       : kernel
priority     : 200
refcnt       : 1
selftest     : passed
internal     : no
type         : rng
seedsize     : 0

name         : stdrng
driver       : ansi_cprng
module       : kernel
priority     : 100
refcnt       : 1
selftest     : passed
internal     : no
type         : rng
seedsize     : 48

name         : lzo
driver       : lzo-generic
module       : kernel
priority     : 0
refcnt       : 17
selftest     : passed
internal     : no
type         : compression

name         : crct10dif
driver       : crct10dif-generic
module       : kernel
priority     : 100
refcnt       : 2
selftest     : passed
internal     : no
type         : shash
blocksize    : 1
digestsize   : 2

name         : crc32c
driver       : crc32c-generic
module       : kernel
priority     : 100
refcnt       : 9
selftest     : passed
internal     : no
type         : shash
blocksize    : 1
digestsize   : 4

name         : ecb(arc4)
driver       : ecb(arc4)-generic
module       : kernel
priority     : 100
refcnt       : 1
selftest     : passed
internal     : no
type         : blkcipher
blocksize    : 1
min keysize  : 1
max keysize  : 256
ivsize       : 0
geniv        : <default>

name         : arc4
driver       : arc4-generic
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
internal     : no
type         : cipher
blocksize    : 1
min keysize  : 1
max keysize  : 256

name         : aes
driver       : aes-generic
module       : kernel
priority     : 100
refcnt       : 1
selftest     : passed
internal     : no
type         : cipher
blocksize    : 16
min keysize  : 16
max keysize  : 32

name         : twofish
driver       : twofish-generic
module       : kernel
priority     : 100
refcnt       : 1
selftest     : passed
internal     : no
type         : cipher
blocksize    : 16
min keysize  : 16
max keysize  : 32

name         : sha224
driver       : sha224-generic
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
internal     : no
type         : shash
blocksize    : 64
digestsize   : 28

name         : sha256
driver       : sha256-generic
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
internal     : no
type         : shash
blocksize    : 64
digestsize   : 32

name         : sha1
driver       : sha1-generic
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
internal     : no
type         : shash
blocksize    : 64
digestsize   : 20

name         : digest_null
driver       : digest_null-generic
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
internal     : no
type         : shash
blocksize    : 1
digestsize   : 0

name         : compress_null
driver       : compress_null-generic
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
internal     : no
type         : compression

name         : ecb(cipher_null)
driver       : ecb-cipher_null
module       : kernel
priority     : 100
refcnt       : 1
selftest     : passed
internal     : no
type         : blkcipher
blocksize    : 1
min keysize  : 0
max keysize  : 0
ivsize       : 0
geniv        : <default>

name         : cipher_null
driver       : cipher_null-generic
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
internal     : no
type         : cipher
blocksize    : 1
min keysize  : 0
max keysize  : 0

name         : ecdsa
driver       : ecdsa-generic
module       : kernel
priority     : 100
refcnt       : 1
selftest     : passed
internal     : no
type         : akcipher

name         : ecdh
driver       : ecdh-generic
module       : kernel
priority     : 100
refcnt       : 1
selftest     : passed
internal     : no
type         : kpp

name         : dh
driver       : dh-generic
module       : kernel
priority     : 100
refcnt       : 1
selftest     : passed
internal     : no
type         : kpp

name         : xts(aes)
driver       : xts-aes-neon
module       : kernel
priority     : 200
refcnt       : 1
selftest     : passed
internal     : no
type         : ablkcipher
async        : yes
blocksize    : 16
min keysize  : 32
max keysize  : 64
ivsize       : 16
geniv        : <default>

name         : ctr(aes)
driver       : ctr-aes-neon
module       : kernel
priority     : 200
refcnt       : 1
selftest     : passed
internal     : no
type         : ablkcipher
async        : yes
blocksize    : 1
min keysize  : 16
max keysize  : 32
ivsize       : 16
geniv        : <default>

name         : cbc(aes)
driver       : cbc-aes-neon
module       : kernel
priority     : 200
refcnt       : 1
selftest     : passed
internal     : no
type         : ablkcipher
async        : yes
blocksize    : 16
min keysize  : 16
max keysize  : 32
ivsize       : 16
geniv        : <default>

name         : ecb(aes)
driver       : ecb-aes-neon
module       : kernel
priority     : 200
refcnt       : 1
selftest     : passed
internal     : no
type         : ablkcipher
async        : yes
blocksize    : 16
min keysize  : 16
max keysize  : 32
ivsize       : 0
geniv        : <default>

name         : __xts-aes-neon
driver       : __driver-xts-aes-neon
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
internal     : yes
type         : blkcipher
blocksize    : 16
min keysize  : 32
max keysize  : 64
ivsize       : 16
geniv        : <default>

name         : __ctr-aes-neon
driver       : __driver-ctr-aes-neon
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
internal     : yes
type         : blkcipher
blocksize    : 1
min keysize  : 16
max keysize  : 32
ivsize       : 16
geniv        : <default>

name         : __cbc-aes-neon
driver       : __driver-cbc-aes-neon
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
internal     : yes
type         : blkcipher
blocksize    : 16
min keysize  : 16
max keysize  : 32
ivsize       : 16
geniv        : <default>

name         : __ecb-aes-neon
driver       : __driver-ecb-aes-neon
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
internal     : yes
type         : blkcipher
blocksize    : 16
min keysize  : 16
max keysize  : 32
ivsize       : 0
geniv        : <default>

name         : xts(aes)
driver       : xts-aes-ce
module       : kernel
priority     : 300
refcnt       : 1
selftest     : passed
internal     : no
type         : ablkcipher
async        : yes
blocksize    : 16
min keysize  : 32
max keysize  : 64
ivsize       : 16
geniv        : <default>

name         : ctr(aes)
driver       : ctr-aes-ce
module       : kernel
priority     : 300
refcnt       : 1
selftest     : passed
internal     : no
type         : ablkcipher
async        : yes
blocksize    : 1
min keysize  : 16
max keysize  : 32
ivsize       : 16
geniv        : <default>

name         : cbc(aes)
driver       : cbc-aes-ce
module       : kernel
priority     : 300
refcnt       : 1
selftest     : passed
internal     : no
type         : ablkcipher
async        : yes
blocksize    : 16
min keysize  : 16
max keysize  : 32
ivsize       : 16
geniv        : <default>

name         : ecb(aes)
driver       : ecb-aes-ce
module       : kernel
priority     : 300
refcnt       : 1
selftest     : passed
internal     : no
type         : ablkcipher
async        : yes
blocksize    : 16
min keysize  : 16
max keysize  : 32
ivsize       : 0
geniv        : <default>

name         : __xts-aes-ce
driver       : __driver-xts-aes-ce
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
internal     : yes
type         : blkcipher
blocksize    : 16
min keysize  : 32
max keysize  : 64
ivsize       : 16
geniv        : <default>

name         : __ctr-aes-ce
driver       : __driver-ctr-aes-ce
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
internal     : yes
type         : blkcipher
blocksize    : 1
min keysize  : 16
max keysize  : 32
ivsize       : 16
geniv        : <default>

name         : __cbc-aes-ce
driver       : __driver-cbc-aes-ce
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
internal     : yes
type         : blkcipher
blocksize    : 16
min keysize  : 16
max keysize  : 32
ivsize       : 16
geniv        : <default>

name         : __ecb-aes-ce
driver       : __driver-ecb-aes-ce
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
internal     : yes
type         : blkcipher
blocksize    : 16
min keysize  : 16
max keysize  : 32
ivsize       : 0
geniv        : <default>

name         : ccm(aes)
driver       : ccm-aes-ce
module       : kernel
priority     : 300
refcnt       : 2
selftest     : passed
internal     : no
type         : aead
async        : no
blocksize    : 1
ivsize       : 16
maxauthsize  : 16
geniv        : <none>

name         : aes
driver       : aes-ce
module       : kernel
priority     : 250
refcnt       : 4
selftest     : passed
internal     : no
type         : cipher
blocksize    : 16
min keysize  : 16
max keysize  : 32

name         : ghash
driver       : ghash-ce
module       : kernel
priority     : 200
refcnt       : 1
selftest     : passed
internal     : no
type         : shash
blocksize    : 16
digestsize   : 16

name         : sha256
driver       : sha256-ce
module       : kernel
priority     : 200
refcnt       : 1
selftest     : passed
internal     : no
type         : shash
blocksize    : 64
digestsize   : 32

name         : sha224
driver       : sha224-ce
module       : kernel
priority     : 200
refcnt       : 1
selftest     : passed
internal     : no
type         : shash
blocksize    : 64
digestsize   : 28

name         : sha1
driver       : sha1-ce
module       : kernel
priority     : 200
refcnt       : 1
selftest     : passed
internal     : no
type         : shash
blocksize    : 64
digestsize   : 20

thanks

1 Like

Hi jiangpen,

What do you mean about “much slower”?
Could you share the steps how you measure the fast or slow?

Hi @KevinFFF ,
here is some read/write test on a NVME ssd:
with encrypted partition

time dd if=/dev/zero of=/data/videos/test bs=4M count=1000 oflag=direct status=progress
4152360960 bytes (4.2 GB, 3.9 GiB) copied, 47 s, 88.3 MB/s
1000+0 records in
1000+0 records out
4194304000 bytes (4.2 GB, 3.9 GiB) copied, 47.515 s, 88.3 MB/s

real    0m47.522s
user    0m0.004s
sys     0m1.536s

with a normal partition:

time dd if=/dev/zero of=/data/videos/test bs=4M count=1000 oflag=direct status=progress
4043309056 bytes (4.0 GB, 3.8 GiB) copied, 7 s, 577 MB/s
1000+0 records in
1000+0 records out
4194304000 bytes (4.2 GB, 3.9 GiB) copied, 7.26092 s, 578 MB/s

real	0m7.273s
user	0m0.008s
sys	0m3.084s

I do see encrypted partition writing is about 6x slower than normal one.
reading is better, but still about 3.5 times slower.
I want to know if decryption can use hardware acceleration , and if any approach can speed it up.
thanks

1 Like

Could you share the result of the following commands on your board?

$ lscpu | grep -i aes
$ grep -m1 -o aes /proc/cpuinfo

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.