crypto: drbg - in-place cipher operation for CTR
The cipher implementations of the kernel crypto API favor in-place
cipher operations. Thus, switch the CTR cipher operation in the DRBG to
perform in-place operations. This is implemented by using the output
buffer as input buffer and zeroizing it before the cipher operation to
implement a CTR encryption of a NULL buffer.
The speed improvement is quite visibile with the following comparison
using the LRNG implementation.
Without the patch set:
16 bytes| 12.267661 MB/s|
61338304 bytes |
5000000213 ns
32 bytes| 23.603770 MB/s|
118018848 bytes |
5000000073 ns
64 bytes| 46.732262 MB/s|
233661312 bytes |
5000000241 ns
128 bytes| 90.038042 MB/s|
450190208 bytes |
5000000244 ns
256 bytes| 160.399616 MB/s|
801998080 bytes |
5000000393 ns
512 bytes| 259.878400 MB/s|
1299392000 bytes |
5000001675 ns
1024 bytes| 386.050662 MB/s|
1930253312 bytes |
5000001661 ns
2048 bytes| 493.641728 MB/s|
2468208640 bytes |
5000001598 ns
4096 bytes| 581.835981 MB/s|
2909179904 bytes |
5000003426 ns
With the patch set:
16 bytes | 17.051142 MB/s |
85255712 bytes |
5000000854 ns
32 bytes | 32.695898 MB/s |
163479488 bytes |
5000000544 ns
64 bytes | 64.490739 MB/s |
322453696 bytes |
5000000954 ns
128 bytes | 123.285043 MB/s |
616425216 bytes |
5000000201 ns
256 bytes | 233.434573 MB/s |
1167172864 bytes |
5000000573 ns
512 bytes | 384.405197 MB/s |
1922025984 bytes |
5000000671 ns
1024 bytes | 566.313370 MB/s |
2831566848 bytes |
5000001080 ns
2048 bytes | 744.518042 MB/s |
3722590208 bytes |
5000000926 ns
4096 bytes | 867.501670 MB/s |
4337508352 bytes |
5000002181 ns
Signed-off-by: Stephan Mueller <smueller@chronox.de>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>