diff options
author | Michael Brown | 2012-09-27 02:37:06 +0200 |
---|---|---|
committer | Michael Brown | 2012-09-27 02:54:55 +0200 |
commit | 09d45ffd7991e6b64a76d86f338a2f0973527be6 (patch) | |
tree | 45716ff1b35d0b04f289eea59e8caf49bdf2700b /src/crypto | |
parent | [test] Add speed tests for cipher algorithms (diff) | |
download | ipxe-09d45ffd7991e6b64a76d86f338a2f0973527be6.tar.gz ipxe-09d45ffd7991e6b64a76d86f338a2f0973527be6.tar.xz ipxe-09d45ffd7991e6b64a76d86f338a2f0973527be6.zip |
[crypto] Allow in-place CBC decryption
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/crypto')
-rw-r--r-- | src/crypto/cbc.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/src/crypto/cbc.c b/src/crypto/cbc.c index 28d38b2d..9bf0e8b4 100644 --- a/src/crypto/cbc.c +++ b/src/crypto/cbc.c @@ -88,13 +88,15 @@ void cbc_encrypt ( void *ctx, const void *src, void *dst, size_t len, void cbc_decrypt ( void *ctx, const void *src, void *dst, size_t len, struct cipher_algorithm *raw_cipher, void *cbc_ctx ) { size_t blocksize = raw_cipher->blocksize; + uint8_t next_cbc_ctx[blocksize]; assert ( ( len % blocksize ) == 0 ); while ( len ) { + memcpy ( next_cbc_ctx, src, blocksize ); cipher_decrypt ( raw_cipher, ctx, src, dst, blocksize ); cbc_xor ( cbc_ctx, dst, blocksize ); - memcpy ( cbc_ctx, src, blocksize ); + memcpy ( cbc_ctx, next_cbc_ctx, blocksize ); dst += blocksize; src += blocksize; len -= blocksize; |