diff options
author | lloyd <[email protected]> | 2010-10-29 14:55:25 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2010-10-29 14:55:25 +0000 |
commit | 89a2e78d2ff2f0266825708a0294b13a4c370a29 (patch) | |
tree | 3b97ae49d9ddd732b8e7d165c1b4e7c77f7aa56a /src | |
parent | 82c677e2326a83fafcb89df3be2fe9719934d847 (diff) |
Always do 256 blocks at a time in CTR, makes increment easier
Diffstat (limited to 'src')
-rw-r--r-- | src/stream/ctr/ctr.cpp | 37 |
1 files changed, 14 insertions, 23 deletions
diff --git a/src/stream/ctr/ctr.cpp b/src/stream/ctr/ctr.cpp index 87d68f5c3..7e835e326 100644 --- a/src/stream/ctr/ctr.cpp +++ b/src/stream/ctr/ctr.cpp @@ -1,6 +1,6 @@ /* -* CTR-BE Mode Cipher -* (C) 1999-2009 Jack Lloyd +* Counter mode +* (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ @@ -14,12 +14,12 @@ namespace Botan { * CTR-BE Constructor */ -CTR_BE::CTR_BE(BlockCipher* ciph) : permutation(ciph) +CTR_BE::CTR_BE(BlockCipher* ciph) : + permutation(ciph), + counter(256 * permutation->block_size()), + buffer(counter.size()), + position(0) { - position = 0; - - counter.resize(permutation->parallel_bytes()); - buffer.resize(counter.size()); } /* @@ -91,9 +91,7 @@ void CTR_BE::set_iv(const byte iv[], size_t iv_len) counter.copy(0, iv, iv_len); - const size_t PARALLEL_BLOCKS = counter.size() / BLOCK_SIZE; - - for(size_t i = 1; i != PARALLEL_BLOCKS; ++i) + for(size_t i = 1; i != 256; ++i) { counter.copy(i*BLOCK_SIZE, &counter[(i-1)*BLOCK_SIZE], @@ -104,7 +102,7 @@ void CTR_BE::set_iv(const byte iv[], size_t iv_len) break; } - permutation->encrypt_n(&counter[0], &buffer[0], PARALLEL_BLOCKS); + permutation->encrypt_n(&counter[0], &buffer[0], 256); position = 0; } @@ -114,24 +112,17 @@ void CTR_BE::set_iv(const byte iv[], size_t iv_len) void CTR_BE::increment_counter() { const size_t BLOCK_SIZE = permutation->block_size(); - const size_t PARALLEL_BLOCKS = counter.size() / BLOCK_SIZE; - for(size_t i = 0; i != PARALLEL_BLOCKS; ++i) + for(size_t i = 0; i != 256; ++i) { byte* this_ctr = &counter[i * BLOCK_SIZE]; - byte last_byte = this_ctr[BLOCK_SIZE-1]; - last_byte += PARALLEL_BLOCKS; - - if(this_ctr[BLOCK_SIZE-1] > last_byte) - for(u32bit j = 1; j != BLOCK_SIZE; ++j) - if(++counter[i*BLOCK_SIZE + (BLOCK_SIZE-1-j)]) - break; - - this_ctr[BLOCK_SIZE-1] = last_byte; + for(u32bit j = 1; j != BLOCK_SIZE; ++j) + if(++counter[i*BLOCK_SIZE + (BLOCK_SIZE-1-j)]) + break; } - permutation->encrypt_n(&counter[0], &buffer[0], PARALLEL_BLOCKS); + permutation->encrypt_n(&counter[0], &buffer[0], 256); position = 0; } |