[PATCH 0/2] crypto: Implement generic crypto statistics

From: Corentin Labbe
Date: Thu Jan 11 2018 - 15:01:09 EST


Hello

This patch is a try to implement a generic crypto driver statistics.
The goal is to have an "ifconfig" for crypto device.

Some driver tried to implement this via a debugfs interface.
This serie do it directly in the crypto API and give access to stats
via the crypto_user(netlink) API.
Then an userspace tool will collect information via netlink.
Note that this userspace tool is heavily copied from libkcapi and if
Stephan Mueller agree, I will made a PR for adding getstat to it.

Example of output:
gcc getstat.c -o getstat && ./getstat
authenc(hmac(sha512-generic),cbc-des3_ede-asm) AEAD
Encrypt: 6 bytes: 768
Decrypt: 0 bytes: 0
authenc(hmac(sha512-generic),cbc(des-generic)) AEAD
Encrypt: 8 bytes: 1024
Decrypt: 0 bytes: 0
authenc(hmac(sha384-generic),cbc-des3_ede-asm) AEAD
Encrypt: 6 bytes: 768
Decrypt: 0 bytes: 0
authenc(hmac(sha384-generic),cbc(des-generic)) AEAD
Encrypt: 8 bytes: 1024
Decrypt: 0 bytes: 0
authenc(hmac(sha256-generic),cbc-des3_ede-asm) AEAD
Encrypt: 6 bytes: 768
Decrypt: 0 bytes: 0
authenc(hmac(sha256-generic),cbc(des-generic)) AEAD
Encrypt: 8 bytes: 1024
Decrypt: 0 bytes: 0
authenc(hmac(sha224-generic),cbc-des3_ede-asm) AEAD
Encrypt: 6 bytes: 768
Decrypt: 0 bytes: 0
authenc(hmac(sha224-generic),cbc(des-generic)) AEAD
Encrypt: 8 bytes: 1024
Decrypt: 0 bytes: 0
authenc(hmac(sha1-generic),cbc-des3_ede-asm) AEAD
Encrypt: 6 bytes: 768
Decrypt: 0 bytes: 0
authenc(hmac(sha1-generic),cbc(des-generic)) AEAD
Encrypt: 8 bytes: 1024
Decrypt: 0 bytes: 0
authenc(hmac(sha1-generic),ecb-cipher_null) AEAD
Encrypt: 12 bytes: 366
Decrypt: 12 bytes: 606
authenc(hmac(md5-generic),ecb-cipher_null) AEAD
Encrypt: 12 bytes: 366
Decrypt: 12 bytes: 558
authenc(hmac(sha1-generic),virtio_crypto_aes_cbc) AEAD
Encrypt: 42 bytes: 2208
Decrypt: 0 bytes: 0
cmac(des3_ede-asm)
Hash: 32 bytes: 480
cmac(aes-asm)
Hash: 48 bytes: 1472
rfc4543(gcm_base(ctr(aes-asm),ghash-generic)) AEAD
Encrypt: 6 bytes: 312
Decrypt: 12 bytes: 816
rfc4106(gcm_base(ctr(aes-asm),ghash-generic)) AEAD
Encrypt: 138 bytes: 6864
Decrypt: 138 bytes: 9072
crc32-generic
Hash: 56 bytes: 10850
vmac(aes-asm)
Hash: 88 bytes: 8328
xcbc(aes-asm)
Hash: 64 bytes: 936
hmac(sha224-generic)
Hash: 46 bytes: 3868
hmac(sha512-generic)
Hash: 46 bytes: 3868
hmac(sha384-generic)
Hash: 46 bytes: 3868
hmac(sha1-generic)
Hash: 136 bytes: 7884
hmac(md5-generic)
Hash: 80 bytes: 2940
crct10dif-generic
Hash: 40 bytes: 4492
rfc4309(ccm_base(ctr(aes-asm),cbcmac(aes-asm))) AEAD
Encrypt: 138 bytes: 6864
Decrypt: 138 bytes: 9072
ccm_base(ctr(aes-asm),cbcmac(aes-asm)) AEAD
Encrypt: 222 bytes: 8946
Decrypt: 240 bytes: 12246
cbcmac(aes-asm)
Hash: 478 bytes: 21034
gcm_base(ctr(aes-asm),ghash-generic) AEAD
Encrypt: 196 bytes: 8424
Decrypt: 196 bytes: 12304
rfc3686(ctr(aes-asm)) Cipher
Encrypt: 40 bytes: 17264
Decrypt: 36 bytes: 864
ctr(aes-asm) Cipher
Encrypt: 924 bytes: 59560
Decrypt: 474 bytes: 36192
xts(ecb(aes-asm)) Cipher
Encrypt: 44 bytes: 11008
Decrypt: 44 bytes: 11008
lrw(ecb(aes-asm)) Cipher
Encrypt: 68 bytes: 7040
Decrypt: 68 bytes: 7040
ecb(aes-asm) Cipher
Encrypt: 140 bytes: 23296
Decrypt: 140 bytes: 23296
ctr(des-generic) Cipher
Encrypt: 24 bytes: 5940
Decrypt: 24 bytes: 5940
cbc(des-generic) Cipher
Encrypt: 88 bytes: 8576
Decrypt: 40 bytes: 3200
ecb(des-generic) Cipher
Encrypt: 64 bytes: 3744
Decrypt: 36 bytes: 3232
pkcs1pad(rsa-generic,sha1) Akcipher
Encrypt: 0 bytes: 0
Decrypt: 0 bytes: 0
Sign: 0
Verify: 13
virtio_crypto_aes_cbc Cipher
Encrypt: 82 bytes: 8320
Decrypt: 38 bytes: 6080
ecdh-generic KPP
Setsecret: 4
Generate public key: 3
Compute_shared_secret: 4
ghash-generic
Hash: 440 bytes: 10728
jitterentropy_rng RNG
Seed: 0
Generate: 0 bytes: 0
drbg_nopr_hmac_sha256 RNG
Seed: 5
Generate: 9 bytes: 1056
drbg_nopr_hmac_sha512 RNG
Seed: 0
Generate: 0 bytes: 0
drbg_nopr_hmac_sha384 RNG
Seed: 0
Generate: 0 bytes: 0
drbg_nopr_hmac_sha1 RNG
Seed: 0
Generate: 0 bytes: 0
hmac(sha256-generic)
Hash: 94 bytes: 5592
drbg_pr_hmac_sha256 RNG
Seed: 4
Generate: 8 bytes: 1024
drbg_pr_hmac_sha512 RNG
Seed: 0
Generate: 0 bytes: 0
drbg_pr_hmac_sha384 RNG
Seed: 0
Generate: 0 bytes: 0
drbg_pr_hmac_sha1 RNG
Seed: 0
Generate: 0 bytes: 0
lzo-scomp Compress
Compress: 2 bytes: 229
Decompress: 4 bytes: 367
lzo-generic Compress
Compress: 0 bytes: 0
Decompress: 0 bytes: 0
crc32c-generic
Hash: 176 bytes: 31652
zlib-deflate-scomp Compress
Compress: 2 bytes: 261
Decompress: 4 bytes: 345
deflate-scomp Compress
Compress: 2 bytes: 261
Decompress: 4 bytes: 320
deflate-generic Compress
Compress: 0 bytes: 0
Decompress: 0 bytes: 0
poly1305-generic
Hash: 66 bytes: 9294
chacha20-generic Cipher
Encrypt: 16 bytes: 8853
Decrypt: 16 bytes: 8853
ecb(arc4)-generic Cipher
Encrypt: 42 bytes: 540
Decrypt: 42 bytes: 540
arc4-generic cipher
Encrypt: 0 bytes: 0
Decrypt: 0 bytes: 0
aes-generic cipher
Encrypt: 0 bytes: 0
Decrypt: 0 bytes: 0
des3_ede-generic cipher
Encrypt: 0 bytes: 0
Decrypt: 0 bytes: 0
des-generic cipher
Encrypt: 0 bytes: 0
Decrypt: 0 bytes: 0
sha384-generic
Hash: 48 bytes: 10072
sha512-generic
Hash: 48 bytes: 10072
sha224-generic
Hash: 40 bytes: 9056
sha256-generic
Hash: 40 bytes: 9056
sha1-generic
Hash: 48 bytes: 9728
md5-generic
Hash: 56 bytes: 1436
md4-generic
Hash: 56 bytes: 1436
digest_null-generic
Hash: 0 bytes: 0
compress_null-generic Compress
Compress: 0 bytes: 0
Decompress: 0 bytes: 0
ecb-cipher_null Cipher
Encrypt: 130 bytes: 2828
Decrypt: 24 bytes: 732
cipher_null-generic cipher
Encrypt: 0 bytes: 0
Decrypt: 0 bytes: 0
rsa-generic Akcipher
Encrypt: 7 bytes: 232
Decrypt: 6 bytes: 1152
Sign: 0
Verify: 13
dh-generic KPP
Setsecret: 2
Generate public key: 2
Compute_shared_secret: 2
ctr-des3_ede-asm Cipher
Encrypt: 20 bytes: 9950
Decrypt: 20 bytes: 9950
cbc-des3_ede-asm Cipher
Encrypt: 46 bytes: 9568
Decrypt: 16 bytes: 5728
ecb-des3_ede-asm Cipher
Encrypt: 28 bytes: 5104
Decrypt: 28 bytes: 5104
des3_ede-asm cipher
Encrypt: 0 bytes: 0
Decrypt: 0 bytes: 0
aes-asm cipher
Encrypt: 0 bytes: 0
Decrypt: 0 bytes: 0

Futur possible additions:
- Add a "number of needed fallback" statistics.
- maximum request size

Regards

Changes since RFC:
- Use cryptouser(netlink) instead of /sys
- Use atomic_t instead of unsigned long
- moved stat code into dedicated inline function
- spelling fixes

Corentin Labbe (2):
crypto: Implement a generic crypto statistics
crypto: tools: Add cryptostat userspace

crypto/Kconfig | 11 ++
crypto/ablkcipher.c | 9 ++
crypto/acompress.c | 9 ++
crypto/aead.c | 10 ++
crypto/ahash.c | 8 ++
crypto/akcipher.c | 13 ++
crypto/algapi.c | 6 +
crypto/blkcipher.c | 9 ++
crypto/crypto_user.c | 28 ++++
crypto/kpp.c | 7 +
crypto/rng.c | 8 ++
crypto/scompress.c | 9 ++
crypto/shash.c | 5 +
crypto/skcipher.c | 9 ++
include/crypto/acompress.h | 22 ++++
include/crypto/aead.h | 10 ++
include/crypto/akcipher.h | 42 ++++++
include/crypto/hash.h | 10 ++
include/crypto/kpp.h | 28 ++++
include/crypto/rng.h | 17 +++
include/crypto/skcipher.h | 22 ++++
include/linux/crypto.h | 56 ++++++++
include/uapi/linux/cryptouser.h | 34 +++++
tools/crypto/getstat.c | 279 ++++++++++++++++++++++++++++++++++++++++
24 files changed, 661 insertions(+)
create mode 100644 tools/crypto/getstat.c

--
2.13.6