summaryrefslogtreecommitdiffstats
path: root/src/crypto
diff options
context:
space:
mode:
authorMichael Brown2012-09-27 02:37:06 +0200
committerMichael Brown2012-09-27 02:54:55 +0200
commit09d45ffd7991e6b64a76d86f338a2f0973527be6 (patch)
tree45716ff1b35d0b04f289eea59e8caf49bdf2700b /src/crypto
parent[test] Add speed tests for cipher algorithms (diff)
downloadipxe-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.c4
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;