mbox series

[v3,0/2] crypto: Implement a generic crypto statistics

Message ID 1537351855-16618-1-git-send-email-clabbe@baylibre.com (mailing list archive)
Headers show
Series crypto: Implement a generic crypto statistics | expand

Message

Corentin LABBE Sept. 19, 2018, 10:10 a.m. UTC
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 unless
tools/crypto is the good place for it.

Example of output:
pkcs1pad(rsa-sun8i-ce,sha1)     Akcipher
        Encrypt: 0 bytes: 0
        Decrypt: 0 bytes: 0
        Sign: 0
        Verify: 5
        Errors: 0
cryptd(__xts-aes-ce)    cipher
        Encrypt: 0 bytes: 0
        Decrypt: 0 bytes: 0
        Errors: 0
xts-aes-ce      cipher
        Encrypt: 17 bytes: 4384
        Decrypt: 17 bytes: 4384
        Errors: 0
cryptd(__ctr-aes-ce)    cipher
        Encrypt: 0 bytes: 0
        Decrypt: 0 bytes: 0
        Errors: 0
ctr-aes-ce      cipher
        Encrypt: 19 bytes: 5551
        Decrypt: 19 bytes: 5551
        Errors: 0
cryptd(__cbc-aes-ce)    cipher
        Encrypt: 0 bytes: 0
        Decrypt: 0 bytes: 0
        Errors: 0
cbc-aes-ce      cipher
        Encrypt: 19 bytes: 3040
        Decrypt: 19 bytes: 3040
        Errors: 0
cryptd(__ecb-aes-ce)    cipher
        Encrypt: 0 bytes: 0
        Decrypt: 0 bytes: 0
        Errors: 0
ecb-aes-ce      cipher
        Encrypt: 14 bytes: 2624
        Decrypt: 14 bytes: 2624
        Errors: 0
cbcmac-aes-ce   Hash
        Hash: 20 bytes: 1244
        Errors: 0
xcbc-aes-ce     Hash
        Hash: 28 bytes: 543
        Errors: 0
cmac-aes-ce     Hash
        Hash: 36 bytes: 1472
        Errors: 0
__xts-aes-ce    cipher
        Encrypt: 17 bytes: 4384
        Decrypt: 17 bytes: 4384
        Errors: 0
ctr-aes-ce      cipher
        Encrypt: 19 bytes: 5551
        Decrypt: 19 bytes: 5551
        Errors: 0
__ctr-aes-ce    cipher
        Encrypt: 19 bytes: 5551
        Decrypt: 19 bytes: 5551
        Errors: 0
__cbc-aes-ce    cipher
        Encrypt: 19 bytes: 3040
        Decrypt: 19 bytes: 3040
        Errors: 0
__ecb-aes-ce    cipher
        Encrypt: 14 bytes: 2624
        Decrypt: 14 bytes: 2624
        Errors: 0
rsa-sun8i-ce    Akcipher
        Encrypt: 7 bytes: 232
        Decrypt: 6 bytes: 1152
        Sign: 0
        Verify: 5
        Errors: 0
sun8i_ce_rng    RNG
        Seed: 0
        Generate: 0 bytes: 0
        Errors: 0
ecb(des3_ede-generic)   cipher
        Encrypt: 24 bytes: 4584
        Decrypt: 24 bytes: 4584
        Errors: 0
ecb-des3-sun8i-ce       cipher
        Encrypt: 18 bytes: 3072
        Decrypt: 18 bytes: 3072
        Errors: 0
cbc(des3_ede-generic)   cipher
        Encrypt: 14 bytes: 5104
        Decrypt: 14 bytes: 5104
        Errors: 0
aes-ce  cipher
        Encrypt: 0 bytes: 0
        Decrypt: 0 bytes: 0
        Errors: 0
des3_ede-generic        cipher
        Encrypt: 0 bytes: 0
        Decrypt: 0 bytes: 0
        Errors: 0
des-generic     cipher
        Encrypt: 0 bytes: 0
        Decrypt: 0 bytes: 0
        Errors: 0
aes-arm64       cipher
        Encrypt: 0 bytes: 0
        Decrypt: 0 bytes: 0
        Errors: 0
crc32c-arm64-ce Hash
        Hash: 92 bytes: 20649
        Errors: 0
cbc-des3-sun8i-ce       cipher
        Encrypt: 10 bytes: 3488
        Decrypt: 10 bytes: 3488
        Errors: 0
crc32-arm64-ce  Hash
        Hash: 92 bytes: 20649
        Errors: 0
ecb-aes-sun8i-ce        cipher
        Encrypt: 18 bytes: 3168
        Decrypt: 18 bytes: 3168
        Errors: 0
cbc-aes-sun8i-ce        cipher
        Encrypt: 24 bytes: 3712
        Decrypt: 24 bytes: 3712
        Errors: 0
sha256-ce       Hash
        Hash: 26 bytes: 8860
        Errors: 0
sha224-ce       Hash
        Hash: 26 bytes: 8860
        Errors: 0
cts(cbc-aes-sun8i-ce)   cipher
        Encrypt: 24 bytes: 956
        Decrypt: 24 bytes: 956
        Errors: 0
sha224-arm64-neon       Hash
        Hash: 26 bytes: 8860
        Errors: 0
sha256-arm64-neon       Hash
        Hash: 26 bytes: 8860
        Errors: 0
sha224-arm64    Hash
        Hash: 26 bytes: 8860
        Errors: 0
sha256-arm64    Hash
        Hash: 26 bytes: 8860
        Errors: 0
ctr-aes-sun8i-ce        cipher
        Encrypt: 24 bytes: 6738
        Decrypt: 24 bytes: 6738
        Errors: 0
sha1-ce Hash
        Hash: 28 bytes: 9191
        Errors: 0
ecdh-generic    KPP
        Setsecret: 4
        Generate public key: 3
        Compute_shared_secret: 4
        Errors: 0
ghash-generic   Hash
        Hash: 32 bytes: 4358
        Errors: 0
jitterentropy_rng       RNG
        Seed: 0
        Generate: 1 bytes: 48
        Errors: 0
drbg_nopr_hmac_sha256   RNG
       Seed: 5
        Generate: 9 bytes: 1056
        Errors: 0
drbg_nopr_hmac_sha512   RNG
        Seed: 0
        Generate: 0 bytes: 0
        Errors: 0
drbg_nopr_hmac_sha384   RNG
        Seed: 0
        Generate: 0 bytes: 0
        Errors: 0
drbg_nopr_hmac_sha1     RNG
        Seed: 0
        Generate: 0 bytes: 0
        Errors: 0
drbg_pr_hmac_sha256     RNG
        Seed: 4
        Generate: 8 bytes: 1024
        Errors: 0
drbg_pr_hmac_sha512     RNG
        Seed: 0
        Generate: 0 bytes: 0
        Errors: 0
drbg_pr_hmac_sha384     RNG
        Seed: 0
        Generate: 0 bytes: 0
        Errors: 0
drbg_pr_hmac_sha1       RNG
        Seed: 0
        Generate: 0 bytes: 0
        Errors: 0
crct10dif-generic       Hash
        Hash: 24 bytes: 19893
        Errors: 0
crc32c-generic  Hash
        Hash: 92 bytes: 20649
        Errors: 0
aes-generic     cipher
        Encrypt: 0 bytes: 0
        Decrypt: 0 bytes: 0
        Errors: 0
sha224-generic  Hash
        Hash: 26 bytes: 8860
        Errors: 0
sha256-generic  Hash
        Hash: 26 bytes: 8860
        Errors: 0
sha1-generic    Hash
        Hash: 28 bytes: 9191
        Errors: 0
digest_null-generic     Hash
        Hash: 0 bytes: 0
        Errors: 0
compress_null-generic   Compress
        Compress: 0 bytes: 0
        Decompress: 0 bytes: 0
        Errors: 0
ecb-cipher_null cipher
        Encrypt: 0 bytes: 0
        Decrypt: 0 bytes: 0
        Errors: 0
cipher_null-generic     cipher
        Encrypt: 0 bytes: 0
        Decrypt: 0 bytes: 0
        Errors: 0
rsa-generic     Akcipher
        Encrypt: 17 bytes: 2832
        Decrypt: 9 bytes: 1920
        Sign: 0
        Verify: 36
        Errors: 0

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

Please let me know your opinions about it

Regards

Changes since v2:
- added documentation on new struct crypto_alg members.

Changes since v1:
- Do not use anymore CRYPTO_MSG_GETALG and added a dedicated CRYPTO_MSG_GETSTAT

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/Makefile                              |   1 +
 crypto/ahash.c                               |  21 +-
 crypto/algapi.c                              |   8 +
 crypto/{crypto_user.c => crypto_user_base.c} |   9 +-
 crypto/crypto_user_stat.c                    | 463 +++++++++++++++++++++++++++
 crypto/rng.c                                 |   1 +
 include/crypto/acompress.h                   |  38 ++-
 include/crypto/aead.h                        |  51 ++-
 include/crypto/akcipher.h                    |  76 ++++-
 include/crypto/hash.h                        |  32 +-
 include/crypto/internal/cryptouser.h         |   8 +
 include/crypto/kpp.h                         |  51 ++-
 include/crypto/rng.h                         |  29 +-
 include/crypto/skcipher.h                    |  44 ++-
 include/linux/crypto.h                       | 110 ++++++-
 include/uapi/linux/cryptouser.h              |  52 +++
 tools/crypto/getstat.c                       | 294 +++++++++++++++++
 18 files changed, 1264 insertions(+), 35 deletions(-)
 rename crypto/{crypto_user.c => crypto_user_base.c} (97%)
 create mode 100644 crypto/crypto_user_stat.c
 create mode 100644 include/crypto/internal/cryptouser.h
 create mode 100644 tools/crypto/getstat.c

Comments

Herbert Xu Sept. 28, 2018, 5:08 a.m. UTC | #1
On Wed, Sep 19, 2018 at 10:10:53AM +0000, Corentin Labbe wrote:
> 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 unless
> tools/crypto is the good place for it.
> 
> Example of output:
> pkcs1pad(rsa-sun8i-ce,sha1)     Akcipher
>         Encrypt: 0 bytes: 0
>         Decrypt: 0 bytes: 0
>         Sign: 0
>         Verify: 5
>         Errors: 0
> cryptd(__xts-aes-ce)    cipher
>         Encrypt: 0 bytes: 0
>         Decrypt: 0 bytes: 0
>         Errors: 0
> xts-aes-ce      cipher
>         Encrypt: 17 bytes: 4384
>         Decrypt: 17 bytes: 4384
>         Errors: 0
> cryptd(__ctr-aes-ce)    cipher
>         Encrypt: 0 bytes: 0
>         Decrypt: 0 bytes: 0
>         Errors: 0
> ctr-aes-ce      cipher
>         Encrypt: 19 bytes: 5551
>         Decrypt: 19 bytes: 5551
>         Errors: 0
> cryptd(__cbc-aes-ce)    cipher
>         Encrypt: 0 bytes: 0
>         Decrypt: 0 bytes: 0
>         Errors: 0
> cbc-aes-ce      cipher
>         Encrypt: 19 bytes: 3040
>         Decrypt: 19 bytes: 3040
>         Errors: 0
> cryptd(__ecb-aes-ce)    cipher
>         Encrypt: 0 bytes: 0
>         Decrypt: 0 bytes: 0
>         Errors: 0
> ecb-aes-ce      cipher
>         Encrypt: 14 bytes: 2624
>         Decrypt: 14 bytes: 2624
>         Errors: 0
> cbcmac-aes-ce   Hash
>         Hash: 20 bytes: 1244
>         Errors: 0
> xcbc-aes-ce     Hash
>         Hash: 28 bytes: 543
>         Errors: 0
> cmac-aes-ce     Hash
>         Hash: 36 bytes: 1472
>         Errors: 0
> __xts-aes-ce    cipher
>         Encrypt: 17 bytes: 4384
>         Decrypt: 17 bytes: 4384
>         Errors: 0
> ctr-aes-ce      cipher
>         Encrypt: 19 bytes: 5551
>         Decrypt: 19 bytes: 5551
>         Errors: 0
> __ctr-aes-ce    cipher
>         Encrypt: 19 bytes: 5551
>         Decrypt: 19 bytes: 5551
>         Errors: 0
> __cbc-aes-ce    cipher
>         Encrypt: 19 bytes: 3040
>         Decrypt: 19 bytes: 3040
>         Errors: 0
> __ecb-aes-ce    cipher
>         Encrypt: 14 bytes: 2624
>         Decrypt: 14 bytes: 2624
>         Errors: 0
> rsa-sun8i-ce    Akcipher
>         Encrypt: 7 bytes: 232
>         Decrypt: 6 bytes: 1152
>         Sign: 0
>         Verify: 5
>         Errors: 0
> sun8i_ce_rng    RNG
>         Seed: 0
>         Generate: 0 bytes: 0
>         Errors: 0
> ecb(des3_ede-generic)   cipher
>         Encrypt: 24 bytes: 4584
>         Decrypt: 24 bytes: 4584
>         Errors: 0
> ecb-des3-sun8i-ce       cipher
>         Encrypt: 18 bytes: 3072
>         Decrypt: 18 bytes: 3072
>         Errors: 0
> cbc(des3_ede-generic)   cipher
>         Encrypt: 14 bytes: 5104
>         Decrypt: 14 bytes: 5104
>         Errors: 0
> aes-ce  cipher
>         Encrypt: 0 bytes: 0
>         Decrypt: 0 bytes: 0
>         Errors: 0
> des3_ede-generic        cipher
>         Encrypt: 0 bytes: 0
>         Decrypt: 0 bytes: 0
>         Errors: 0
> des-generic     cipher
>         Encrypt: 0 bytes: 0
>         Decrypt: 0 bytes: 0
>         Errors: 0
> aes-arm64       cipher
>         Encrypt: 0 bytes: 0
>         Decrypt: 0 bytes: 0
>         Errors: 0
> crc32c-arm64-ce Hash
>         Hash: 92 bytes: 20649
>         Errors: 0
> cbc-des3-sun8i-ce       cipher
>         Encrypt: 10 bytes: 3488
>         Decrypt: 10 bytes: 3488
>         Errors: 0
> crc32-arm64-ce  Hash
>         Hash: 92 bytes: 20649
>         Errors: 0
> ecb-aes-sun8i-ce        cipher
>         Encrypt: 18 bytes: 3168
>         Decrypt: 18 bytes: 3168
>         Errors: 0
> cbc-aes-sun8i-ce        cipher
>         Encrypt: 24 bytes: 3712
>         Decrypt: 24 bytes: 3712
>         Errors: 0
> sha256-ce       Hash
>         Hash: 26 bytes: 8860
>         Errors: 0
> sha224-ce       Hash
>         Hash: 26 bytes: 8860
>         Errors: 0
> cts(cbc-aes-sun8i-ce)   cipher
>         Encrypt: 24 bytes: 956
>         Decrypt: 24 bytes: 956
>         Errors: 0
> sha224-arm64-neon       Hash
>         Hash: 26 bytes: 8860
>         Errors: 0
> sha256-arm64-neon       Hash
>         Hash: 26 bytes: 8860
>         Errors: 0
> sha224-arm64    Hash
>         Hash: 26 bytes: 8860
>         Errors: 0
> sha256-arm64    Hash
>         Hash: 26 bytes: 8860
>         Errors: 0
> ctr-aes-sun8i-ce        cipher
>         Encrypt: 24 bytes: 6738
>         Decrypt: 24 bytes: 6738
>         Errors: 0
> sha1-ce Hash
>         Hash: 28 bytes: 9191
>         Errors: 0
> ecdh-generic    KPP
>         Setsecret: 4
>         Generate public key: 3
>         Compute_shared_secret: 4
>         Errors: 0
> ghash-generic   Hash
>         Hash: 32 bytes: 4358
>         Errors: 0
> jitterentropy_rng       RNG
>         Seed: 0
>         Generate: 1 bytes: 48
>         Errors: 0
> drbg_nopr_hmac_sha256   RNG
>        Seed: 5
>         Generate: 9 bytes: 1056
>         Errors: 0
> drbg_nopr_hmac_sha512   RNG
>         Seed: 0
>         Generate: 0 bytes: 0
>         Errors: 0
> drbg_nopr_hmac_sha384   RNG
>         Seed: 0
>         Generate: 0 bytes: 0
>         Errors: 0
> drbg_nopr_hmac_sha1     RNG
>         Seed: 0
>         Generate: 0 bytes: 0
>         Errors: 0
> drbg_pr_hmac_sha256     RNG
>         Seed: 4
>         Generate: 8 bytes: 1024
>         Errors: 0
> drbg_pr_hmac_sha512     RNG
>         Seed: 0
>         Generate: 0 bytes: 0
>         Errors: 0
> drbg_pr_hmac_sha384     RNG
>         Seed: 0
>         Generate: 0 bytes: 0
>         Errors: 0
> drbg_pr_hmac_sha1       RNG
>         Seed: 0
>         Generate: 0 bytes: 0
>         Errors: 0
> crct10dif-generic       Hash
>         Hash: 24 bytes: 19893
>         Errors: 0
> crc32c-generic  Hash
>         Hash: 92 bytes: 20649
>         Errors: 0
> aes-generic     cipher
>         Encrypt: 0 bytes: 0
>         Decrypt: 0 bytes: 0
>         Errors: 0
> sha224-generic  Hash
>         Hash: 26 bytes: 8860
>         Errors: 0
> sha256-generic  Hash
>         Hash: 26 bytes: 8860
>         Errors: 0
> sha1-generic    Hash
>         Hash: 28 bytes: 9191
>         Errors: 0
> digest_null-generic     Hash
>         Hash: 0 bytes: 0
>         Errors: 0
> compress_null-generic   Compress
>         Compress: 0 bytes: 0
>         Decompress: 0 bytes: 0
>         Errors: 0
> ecb-cipher_null cipher
>         Encrypt: 0 bytes: 0
>         Decrypt: 0 bytes: 0
>         Errors: 0
> cipher_null-generic     cipher
>         Encrypt: 0 bytes: 0
>         Decrypt: 0 bytes: 0
>         Errors: 0
> rsa-generic     Akcipher
>         Encrypt: 17 bytes: 2832
>         Decrypt: 9 bytes: 1920
>         Sign: 0
>         Verify: 36
>         Errors: 0
> 
> Futur possible additions:
> - Add a "number of needed fallback" statistics.
> - statistics for maximum request size
> 
> Please let me know your opinions about it
> 
> Regards
> 
> Changes since v2:
> - added documentation on new struct crypto_alg members.
> 
> Changes since v1:
> - Do not use anymore CRYPTO_MSG_GETALG and added a dedicated CRYPTO_MSG_GETSTAT
> 
> 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/Makefile                              |   1 +
>  crypto/ahash.c                               |  21 +-
>  crypto/algapi.c                              |   8 +
>  crypto/{crypto_user.c => crypto_user_base.c} |   9 +-
>  crypto/crypto_user_stat.c                    | 463 +++++++++++++++++++++++++++
>  crypto/rng.c                                 |   1 +
>  include/crypto/acompress.h                   |  38 ++-
>  include/crypto/aead.h                        |  51 ++-
>  include/crypto/akcipher.h                    |  76 ++++-
>  include/crypto/hash.h                        |  32 +-
>  include/crypto/internal/cryptouser.h         |   8 +
>  include/crypto/kpp.h                         |  51 ++-
>  include/crypto/rng.h                         |  29 +-
>  include/crypto/skcipher.h                    |  44 ++-
>  include/linux/crypto.h                       | 110 ++++++-
>  include/uapi/linux/cryptouser.h              |  52 +++
>  tools/crypto/getstat.c                       | 294 +++++++++++++++++
>  18 files changed, 1264 insertions(+), 35 deletions(-)
>  rename crypto/{crypto_user.c => crypto_user_base.c} (97%)
>  create mode 100644 crypto/crypto_user_stat.c
>  create mode 100644 include/crypto/internal/cryptouser.h
>  create mode 100644 tools/crypto/getstat.c

All applied.  Thanks.