Version 2 (modified by 5 years ago) ( diff ) | ,
---|
OcteonTX Encryption
Compression / Decompression hardware engine (ZIP)
The ThunderX SoC's contains 2x compression/decompression hardware engines (ZIP unit)
The ZIP engine supports hardware accelerated compression and decompression. It includes 2 independent ZIP cores and supports:
- DEFLATE compression and decompression (RFC 1951)
- LZS compression and decompression (RFC 2395 and ANSI X3.241-1994)
- ADLER32 and CRC32 checksums for ZLIB (RFC 1950) and GZIP (RFC 1952)
- The ZIP engine is presented as a PCI device. It supports DMA and scatter-gather.
Cryptographic Accelerator Unit (CPT)
The ThunderX SoC's contain a Cryptographic Accelerator Unit (CPT) featuring:
- Symmetric CPT unit
- 16 SR-IOV compatible virtual functions (VFs) and related queues (VQs) shared with asymmetric
- 8 engine-groups
- 10 GigaCypher Symmetric Cryptographic Engines (SEs)
- AES256 (XCBC, CCM, CTR, ECB, CBC, GCM, OFM, CFB, XTS)
- AES512
- 3DES
- CRC
- Hashes: SHA1, SHA2 (SHA224, SHA384, SHA512), SHA3, MD5
- Up to 16 Gbit/sec/coprocessor-GHz aggregate bulk crypto (AES128 at IMIX sizes) encryption/decryption
- Up to 8 Gbit/sec/coprocessor-GHz aggregate inline IPSEC large packet encryption/decryption
- Up to 5 (TBD) Gbit/sec/coprocessor-GHz inline SSL large record encryption/decryption
- Asymmetric CPT unit
- 16 SR-IOV compatible virtual functions (VFs) and related queues (VQs) shared with symmetric
- 8 engine-groups
- 6 GigaCypher Asymmetric Cryptographic Engines (AEs)
- Modular exponentiation up to 8 Kbit (RSA 2048, RSA 4096, RSA 8192, DH)
- RSA encrypt/decrypt – up to 8192 bits
- Prime-field Elliptic Curve (ECC) point multiplication
- P256, P384, P521
- Known-point optimization (50%+ of point multiplies are known point)
- Up to 16K P256 ECC fixed-point multiplies/sec/coprocessor-GHz
- Up to 7.1K P256 ECC unknown-point multiplies/sec/coprocessor-GHz Cavium Confidential For Up to 5.4K 2048-bit RSA operations/sec/coprocessor-GHz
Linux Drivers
The Compression / Decompression hardware engine (ZIP) is supported by a Linux driver since v4.12 in drivers/crypto/cavium/zip
enabled via CONFIG_CRYPTO_DEV_CAVIUM_ZIP
. This driver registers 'deflate' and 'lzs' algorithms with the Linux crypto subsystem via crypto_register_alg
and crypto_register_scomp
calls.
The Cryptographic Accelerator Unit (CPT) is supported by a Linux driver since v4.11 in drivers/crpyto/cavium/cpt
enabled via CONFIG_CAVIUM_CPT
. This driver registers 'xts(aes), 'cbc(aes)',
'ecb(aes)', 'cfb(aes)', and 'cbc(des3_ede)' algorithms with the Linux crypto subsystem via crypto_register_algs
call.
The CPT driver requires binary firmware be installed in /lib/firmware
:
cd /lib/firmware
wget http://dev.gateworks.com/images/cpt8x-mc-ae.out
wget http://dev.gateworks.com/images/cpt8x-mc-se.out
Once enabled and firmware loaded, /proc/crypto
will list out the system cipher and algorithm support:
# cat /proc/crypto name : ecb(des3_ede) driver : cavium-ecb-des3_ede module : cptvf priority : 4001 refcnt : 1 selftest : passed internal : no type : ablkcipher async : yes blocksize : 8 min keysize : 24 max keysize : 24 ivsize : 8 geniv : <default> name : cbc(des3_ede) driver : cavium-cbc-des3_ede module : cptvf priority : 4001 refcnt : 1 selftest : passed internal : no type : ablkcipher async : yes blocksize : 8 min keysize : 24 max keysize : 24 ivsize : 8 geniv : <default> name : cfb(aes) driver : cavium-cfb-aes module : cptvf priority : 4001 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 : cavium-ecb-aes module : cptvf priority : 4001 refcnt : 1 selftest : passed internal : no type : ablkcipher async : yes blocksize : 16 min keysize : 16 max keysize : 32 ivsize : 16 geniv : <default> name : cbc(aes) driver : cavium-cbc-aes module : cptvf priority : 4001 refcnt : 1 selftest : passed internal : no type : ablkcipher async : yes blocksize : 16 min keysize : 16 max keysize : 32 ivsize : 16 geniv : <default> name : xts(aes) driver : cavium-xts-aes module : cptvf priority : 4001 refcnt : 1 selftest : passed internal : no type : ablkcipher async : yes blocksize : 16 min keysize : 32 max keysize : 64 ivsize : 16 geniv : <default> name : crc32c driver : crc32c-arm64-ce module : crc32_ce priority : 200 refcnt : 1 selftest : passed internal : no type : shash blocksize : 1 digestsize : 4 name : crc32 driver : crc32-arm64-ce module : crc32_ce priority : 200 refcnt : 1 selftest : passed internal : no type : shash blocksize : 1 digestsize : 4 name : crct10dif driver : crct10dif-arm64-ce module : crct10dif_ce priority : 200 refcnt : 1 selftest : passed internal : no type : shash blocksize : 1 digestsize : 2 name : lzs driver : lzs-scomp module : kernel priority : 300 refcnt : 1 selftest : passed internal : no type : scomp name : deflate driver : deflate-scomp module : kernel priority : 300 refcnt : 1 selftest : passed internal : no type : scomp name : lzs driver : lzs-generic module : kernel priority : 300 refcnt : 1 selftest : passed internal : no type : compression name : deflate driver : deflate-generic module : kernel priority : 300 refcnt : 1 selftest : passed internal : no type : compression 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 : crct10dif driver : crct10dif-generic module : kernel priority : 100 refcnt : 2 selftest : passed internal : no type : shash blocksize : 1 digestsize : 2 name : crc32 driver : crc32-generic module : kernel priority : 100 refcnt : 1 selftest : passed internal : no type : shash blocksize : 1 digestsize : 4 name : crc32c driver : crc32c-generic module : kernel priority : 100 refcnt : 2 selftest : passed internal : no type : shash blocksize : 1 digestsize : 4 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 : 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 : aes driver : aes-arm64 module : kernel priority : 200 refcnt : 1 selftest : passed internal : no type : cipher blocksize : 16 min keysize : 16 max keysize : 32 name : sha224 driver : sha224-arm64-neon module : kernel priority : 150 refcnt : 1 selftest : passed internal : no type : shash blocksize : 64 digestsize : 28 name : sha256 driver : sha256-arm64-neon module : kernel priority : 150 refcnt : 1 selftest : passed internal : no type : shash blocksize : 64 digestsize : 32 name : sha224 driver : sha224-arm64 module : kernel priority : 100 refcnt : 1 selftest : passed internal : no type : shash blocksize : 64 digestsize : 28 name : sha256 driver : sha256-arm64 module : kernel priority : 100 refcnt : 1 selftest : passed internal : no type : shash blocksize : 64 digestsize : 32 name : xts(aes) driver : xts-aes-ce module : kernel priority : 300 refcnt : 1 selftest : passed internal : no type : skcipher async : yes blocksize : 16 min keysize : 32 max keysize : 64 ivsize : 16 chunksize : 16 walksize : 16 name : ctr(aes) driver : ctr-aes-ce module : kernel priority : 300 refcnt : 1 selftest : passed internal : no type : skcipher async : yes blocksize : 1 min keysize : 16 max keysize : 32 ivsize : 16 chunksize : 16 walksize : 16 name : cbc(aes) driver : cbc-aes-ce module : kernel priority : 300 refcnt : 1 selftest : passed internal : no type : skcipher async : yes blocksize : 16 min keysize : 16 max keysize : 32 ivsize : 16 chunksize : 16 walksize : 16 name : ecb(aes) driver : ecb-aes-ce module : kernel priority : 300 refcnt : 1 selftest : passed internal : no type : skcipher async : yes blocksize : 16 min keysize : 16 max keysize : 32 ivsize : 0 chunksize : 16 walksize : 16 name : cbcmac(aes) driver : cbcmac-aes-ce module : kernel priority : 300 refcnt : 1 selftest : passed internal : no type : shash blocksize : 1 digestsize : 16 name : xcbc(aes) driver : xcbc-aes-ce module : kernel priority : 300 refcnt : 1 selftest : passed internal : no type : shash blocksize : 16 digestsize : 16 name : cmac(aes) driver : cmac-aes-ce module : kernel priority : 300 refcnt : 1 selftest : passed internal : no type : shash blocksize : 16 digestsize : 16 name : __xts(aes) driver : __xts-aes-ce module : kernel priority : 300 refcnt : 1 selftest : passed internal : yes type : skcipher async : no blocksize : 16 min keysize : 32 max keysize : 64 ivsize : 16 chunksize : 16 walksize : 16 name : ctr(aes) driver : ctr-aes-ce module : kernel priority : 299 refcnt : 1 selftest : passed internal : no type : skcipher async : no blocksize : 1 min keysize : 16 max keysize : 32 ivsize : 16 chunksize : 16 walksize : 16 name : __ctr(aes) driver : __ctr-aes-ce module : kernel priority : 300 refcnt : 1 selftest : passed internal : yes type : skcipher async : no blocksize : 1 min keysize : 16 max keysize : 32 ivsize : 16 chunksize : 16 walksize : 16 name : __cbc(aes) driver : __cbc-aes-ce module : kernel priority : 300 refcnt : 1 selftest : passed internal : yes type : skcipher async : no blocksize : 16 min keysize : 16 max keysize : 32 ivsize : 16 chunksize : 16 walksize : 16 name : __ecb(aes) driver : __ecb-aes-ce module : kernel priority : 300 refcnt : 1 selftest : passed internal : yes type : skcipher async : no blocksize : 16 min keysize : 16 max keysize : 32 ivsize : 0 chunksize : 16 walksize : 16 name : ccm(aes) driver : ccm-aes-ce module : kernel priority : 300 refcnt : 1 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 : 1 selftest : passed internal : no type : cipher blocksize : 16 min keysize : 16 max keysize : 32 name : gcm(aes) driver : gcm-aes-ce module : kernel priority : 300 refcnt : 1 selftest : passed internal : no type : aead async : no blocksize : 1 ivsize : 12 maxauthsize : 16 geniv : <none> 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
For information on how to use the Linux Kernel Crypto API consult the kernel documentation:
For more information on Linux Kernel Crypto API and how to use in Userspace see: