Botan
1.11.15
|
00001 /* 00002 * OFB Mode 00003 * (C) 1999-2007,2014 Jack Lloyd 00004 * 00005 * Botan is released under the Simplified BSD License (see license.txt) 00006 */ 00007 00008 #include <botan/internal/stream_utils.h> 00009 #include <botan/ofb.h> 00010 00011 namespace Botan { 00012 00013 BOTAN_REGISTER_NAMED_T(StreamCipher, "OFB", OFB, OFB::make); 00014 00015 OFB* OFB::make(const Spec& spec) 00016 { 00017 if(spec.algo_name() == "OFB" && spec.arg_count() == 1) 00018 { 00019 if(BlockCipher* c = Algo_Registry<BlockCipher>::global_registry().make(spec.arg(0))) 00020 return new OFB(c); 00021 } 00022 return nullptr; 00023 } 00024 00025 OFB::OFB(BlockCipher* cipher) : 00026 m_cipher(cipher), 00027 m_buffer(m_cipher->block_size()), 00028 m_buf_pos(0) 00029 { 00030 } 00031 00032 void OFB::clear() 00033 { 00034 m_cipher->clear(); 00035 zeroise(m_buffer); 00036 m_buf_pos = 0; 00037 } 00038 00039 void OFB::key_schedule(const byte key[], size_t key_len) 00040 { 00041 m_cipher->set_key(key, key_len); 00042 00043 // Set a default all-zeros IV 00044 set_iv(nullptr, 0); 00045 } 00046 00047 std::string OFB::name() const 00048 { 00049 return "OFB(" + m_cipher->name() + ")"; 00050 } 00051 00052 void OFB::cipher(const byte in[], byte out[], size_t length) 00053 { 00054 while(length >= m_buffer.size() - m_buf_pos) 00055 { 00056 xor_buf(out, in, &m_buffer[m_buf_pos], m_buffer.size() - m_buf_pos); 00057 length -= (m_buffer.size() - m_buf_pos); 00058 in += (m_buffer.size() - m_buf_pos); 00059 out += (m_buffer.size() - m_buf_pos); 00060 m_cipher->encrypt(m_buffer); 00061 m_buf_pos = 0; 00062 } 00063 xor_buf(out, in, &m_buffer[m_buf_pos], length); 00064 m_buf_pos += length; 00065 } 00066 00067 void OFB::set_iv(const byte iv[], size_t iv_len) 00068 { 00069 if(!valid_iv_length(iv_len)) 00070 throw Invalid_IV_Length(name(), iv_len); 00071 00072 zeroise(m_buffer); 00073 buffer_insert(m_buffer, 0, iv, iv_len); 00074 00075 m_cipher->encrypt(m_buffer); 00076 m_buf_pos = 0; 00077 } 00078 00079 }