summaryrefslogtreecommitdiff
path: root/src/experimental/ciphermodeofb.h
diff options
context:
space:
mode:
authorMike Buland <eichlan@xagasoft.com>2012-04-10 08:32:23 +0000
committerMike Buland <eichlan@xagasoft.com>2012-04-10 08:32:23 +0000
commitd49fc3aeac4daa65416751f94943b6611ad247d3 (patch)
tree2d843ebe59284d06fea389744a3a08aad423868d /src/experimental/ciphermodeofb.h
parent1e9d8f7a92e43f61e4d9f478f6e8dd5ae206616e (diff)
downloadlibbu++-d49fc3aeac4daa65416751f94943b6611ad247d3.tar.gz
libbu++-d49fc3aeac4daa65416751f94943b6611ad247d3.tar.bz2
libbu++-d49fc3aeac4daa65416751f94943b6611ad247d3.tar.xz
libbu++-d49fc3aeac4daa65416751f94943b6611ad247d3.zip
Rearranged the Cipher system, and added four modes of operation. It's pretty
slick, really, and we actually support four of the most common modes. Blowfish is still a template, but it doesn't really need to be anymore...
Diffstat (limited to 'src/experimental/ciphermodeofb.h')
-rw-r--r--src/experimental/ciphermodeofb.h56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/experimental/ciphermodeofb.h b/src/experimental/ciphermodeofb.h
new file mode 100644
index 0000000..8c2aa20
--- /dev/null
+++ b/src/experimental/ciphermodeofb.h
@@ -0,0 +1,56 @@
1#ifndef BU_MODE_OFB_H
2#define BU_MODE_OFB_H
3
4#include "bu/filter.h"
5#include "bu/string.h"
6
7namespace Bu
8{
9 template<int iBlockSize, typename CipherType>
10 class CipherModeOfb : public CipherType
11 {
12 public:
13 CipherModeOfb(class Stream &rNext ) :
14 CipherType( rNext ),
15 bStart( true )
16 {
17 memset( aVector, 0, iBlockSize );
18 }
19
20 virtual ~CipherModeOfb()
21 {
22 }
23
24 void setIv( const Bu::String &sIv )
25 {
26 memcpy( aVector, sIv.getStr(), iBlockSize );
27 }
28
29 protected:
30 void decipher( void *pBuf )
31 {
32 CipherType::encipher( aVector );
33 uint8_t aTmp[iBlockSize];
34 memcpy( aTmp, aVector, iBlockSize );
35 for( int j = 0; j < iBlockSize; j++ )
36 ((uint8_t *)pBuf)[j] ^= aVector[j];
37 memcpy( aVector, aTmp, iBlockSize );
38 }
39
40 void encipher( void *pBuf )
41 {
42 CipherType::encipher( aVector );
43 uint8_t aTmp[iBlockSize];
44 memcpy( aTmp, aVector, iBlockSize );
45 for( int j = 0; j < iBlockSize; j++ )
46 ((uint8_t *)pBuf)[j] ^= aVector[j];
47 memcpy( aVector, aTmp, iBlockSize );
48 }
49
50 private:
51 bool bStart;
52 uint8_t aVector[iBlockSize];
53 };
54};
55
56#endif