From 1d54dbb30e97097ef74b302032430a97e56fb328 Mon Sep 17 00:00:00 2001 From: lloyd Date: Wed, 14 Oct 2009 23:23:29 +0000 Subject: Similiar treatment for OFB which is also just a plain stream cipher --- src/stream/ctr/info.txt | 1 + src/stream/ofb/info.txt | 15 ++++++++ src/stream/ofb/ofb.cpp | 97 +++++++++++++++++++++++++++++++++++++++++++++++++ src/stream/ofb/ofb.h | 48 ++++++++++++++++++++++++ 4 files changed, 161 insertions(+) create mode 100644 src/stream/ofb/info.txt create mode 100644 src/stream/ofb/ofb.cpp create mode 100644 src/stream/ofb/ofb.h (limited to 'src/stream') diff --git a/src/stream/ctr/info.txt b/src/stream/ctr/info.txt index 53ab0afa5..04d14518a 100644 --- a/src/stream/ctr/info.txt +++ b/src/stream/ctr/info.txt @@ -10,6 +10,7 @@ ctr.h +block stream diff --git a/src/stream/ofb/info.txt b/src/stream/ofb/info.txt new file mode 100644 index 000000000..444fe0ffe --- /dev/null +++ b/src/stream/ofb/info.txt @@ -0,0 +1,15 @@ +realname "OFB block cipher mode" + +define OFB + +load_on auto + + +ofb.cpp +ofb.h + + + +block +stream + diff --git a/src/stream/ofb/ofb.cpp b/src/stream/ofb/ofb.cpp new file mode 100644 index 000000000..577f61cbf --- /dev/null +++ b/src/stream/ofb/ofb.cpp @@ -0,0 +1,97 @@ +/* +* OFB Mode +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* OFB Constructor +*/ +OFB::OFB(BlockCipher* ciph) : + StreamCipher(ciph->MINIMUM_KEYLENGTH, + ciph->MAXIMUM_KEYLENGTH, + ciph->KEYLENGTH_MULTIPLE), + permutation(ciph) + { + position = 0; + buffer.create(permutation->BLOCK_SIZE); + } + +/* +* OFB Destructor +*/ +OFB::~OFB() + { + delete permutation; + } + +/* +* Zeroize +*/ +void OFB::clear() throw() + { + permutation->clear(); + buffer.clear(); + position = 0; + } + +/* +* Set the key +*/ +void OFB::key_schedule(const byte key[], u32bit key_len) + { + permutation->set_key(key, key_len); + + // Set a default all-zeros IV + set_iv(0, 0); + } + +/* +* Return the name of this type +*/ +std::string OFB::name() const + { + return ("OFB(" + permutation->name() + ")"); + } + +/* +* CTR-BE Encryption/Decryption +*/ +void OFB::cipher(const byte in[], byte out[], u32bit length) + { + while(length >= buffer.size() - position) + { + xor_buf(out, in, buffer.begin() + position, buffer.size() - position); + length -= (buffer.size() - position); + in += (buffer.size() - position); + out += (buffer.size() - position); + permutation->encrypt(buffer); + position = 0; + } + xor_buf(out, in, buffer.begin() + position, length); + position += length; + } + +/* +* Set CTR-BE IV +*/ +void OFB::set_iv(const byte iv[], u32bit iv_len) + { + if(!valid_iv_length(iv_len)) + throw Invalid_IV_Length(name(), iv_len); + + buffer.clear(); + buffer.copy(0, iv, iv_len); + + permutation->encrypt(buffer); + position = 0; + } + +} diff --git a/src/stream/ofb/ofb.h b/src/stream/ofb/ofb.h new file mode 100644 index 000000000..5cd48716b --- /dev/null +++ b/src/stream/ofb/ofb.h @@ -0,0 +1,48 @@ +/* +* OFB Mode +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_OUTPUT_FEEDBACK_MODE_H__ +#define BOTAN_OUTPUT_FEEDBACK_MODE_H__ + +#include +#include + +namespace Botan { + +/* +* OFB Mode +*/ +class BOTAN_DLL OFB : public StreamCipher + { + public: + void cipher(const byte in[], byte out[], u32bit length); + + void set_iv(const byte iv[], u32bit iv_len); + + bool valid_iv_length(u32bit iv_len) const + { return (iv_len <= permutation->BLOCK_SIZE); } + + std::string name() const; + + OFB* clone() const + { return new OFB(permutation->clone()); } + + void clear() throw(); + + OFB(BlockCipher*); + ~OFB(); + private: + void key_schedule(const byte key[], u32bit key_len); + + BlockCipher* permutation; + SecureVector buffer; + u32bit position; + }; + +} + +#endif -- cgit v1.2.3