diff options
author | Mike Buland <eichlan@xagasoft.com> | 2012-04-07 21:46:17 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2012-04-07 21:46:17 +0000 |
commit | b93f18e1dd303fb648bc350416f7f5ace536fd1f (patch) | |
tree | 636bf4dfafcf2e9aef30db19a4e2f9cd12cb36d4 /src/experimental | |
parent | 2c6cbad869b0e60b37859c3c4f0c850721d057ce (diff) | |
download | libbu++-b93f18e1dd303fb648bc350416f7f5ace536fd1f.tar.gz libbu++-b93f18e1dd303fb648bc350416f7f5ace536fd1f.tar.bz2 libbu++-b93f18e1dd303fb648bc350416f7f5ace536fd1f.tar.xz libbu++-b93f18e1dd303fb648bc350416f7f5ace536fd1f.zip |
Blowfish now passes all standard test vectors on little endian. I don't know
about big endian...we can hope.
Diffstat (limited to '')
-rw-r--r-- | src/experimental/blowfish.cpp | 23 | ||||
-rw-r--r-- | src/experimental/blowfish.h | 22 |
2 files changed, 27 insertions, 18 deletions
diff --git a/src/experimental/blowfish.cpp b/src/experimental/blowfish.cpp index 401291c..3dda87a 100644 --- a/src/experimental/blowfish.cpp +++ b/src/experimental/blowfish.cpp | |||
@@ -18,11 +18,13 @@ Bu::Blowfish::~Blowfish() | |||
18 | reset(); | 18 | reset(); |
19 | } | 19 | } |
20 | 20 | ||
21 | #define revBytes( x ) x = (((x&0xff)<<24)|((x&0xff00)<<8)|((x&0xff0000)>>8)|((x&0xff000000)>>24)) | ||
22 | |||
21 | void Bu::Blowfish::setPassword( const Bu::String &sPass ) | 23 | void Bu::Blowfish::setPassword( const Bu::String &sPass ) |
22 | { | 24 | { |
23 | reset(); | 25 | reset(); |
24 | 26 | ||
25 | unsigned int i,j,len=sPass.getSize(); | 27 | uint32_t i,j,len=sPass.getSize(); |
26 | Word Work,null0,null1; | 28 | Word Work,null0,null1; |
27 | 29 | ||
28 | if (len > 0) | 30 | if (len > 0) |
@@ -70,7 +72,7 @@ Bu::size Bu::Blowfish::stop() | |||
70 | 72 | ||
71 | Bu::size Bu::Blowfish::read( void *pBuf, Bu::size iBytes ) | 73 | Bu::size Bu::Blowfish::read( void *pBuf, Bu::size iBytes ) |
72 | { | 74 | { |
73 | unsigned int i; | 75 | uint32_t i; |
74 | DWord dwWork; | 76 | DWord dwWork; |
75 | 77 | ||
76 | if (iBytes%8) | 78 | if (iBytes%8) |
@@ -83,8 +85,11 @@ Bu::size Bu::Blowfish::read( void *pBuf, Bu::size iBytes ) | |||
83 | for (i=0;i<iBytes;i++) | 85 | for (i=0;i<iBytes;i++) |
84 | { | 86 | { |
85 | int iRead = rNext.read( &dwWork, 8 ); | 87 | int iRead = rNext.read( &dwWork, 8 ); |
86 | sio << "Read: " << iRead << sio.nl; | 88 | revBytes( dwWork.word0.word ); |
89 | revBytes( dwWork.word1.word ); | ||
87 | BF_De(&dwWork.word0,&dwWork.word1); | 90 | BF_De(&dwWork.word0,&dwWork.word1); |
91 | dwWork.word0.word = htobe32( dwWork.word0.word ); | ||
92 | dwWork.word1.word = htobe32( dwWork.word1.word ); | ||
88 | memcpy( ((char *)pBuf)+(i*8), &dwWork, 8 ); | 93 | memcpy( ((char *)pBuf)+(i*8), &dwWork, 8 ); |
89 | } | 94 | } |
90 | 95 | ||
@@ -94,7 +99,7 @@ Bu::size Bu::Blowfish::read( void *pBuf, Bu::size iBytes ) | |||
94 | 99 | ||
95 | Bu::size Bu::Blowfish::write( const void *pBuf, Bu::size iBytes ) | 100 | Bu::size Bu::Blowfish::write( const void *pBuf, Bu::size iBytes ) |
96 | { | 101 | { |
97 | unsigned int i; | 102 | uint32_t i; |
98 | DWord dwWork; | 103 | DWord dwWork; |
99 | 104 | ||
100 | if (iBytes%8) | 105 | if (iBytes%8) |
@@ -107,7 +112,11 @@ Bu::size Bu::Blowfish::write( const void *pBuf, Bu::size iBytes ) | |||
107 | for (i=0;i<iBytes;i++) | 112 | for (i=0;i<iBytes;i++) |
108 | { | 113 | { |
109 | memcpy( &dwWork, ((const char *)pBuf)+(i*8), 8 ); | 114 | memcpy( &dwWork, ((const char *)pBuf)+(i*8), 8 ); |
115 | dwWork.word0.word = be32toh( dwWork.word0.word ); | ||
116 | dwWork.word1.word = be32toh( dwWork.word1.word ); | ||
110 | BF_En(&dwWork.word0,&dwWork.word1); | 117 | BF_En(&dwWork.word0,&dwWork.word1); |
118 | revBytes( dwWork.word0.word ); | ||
119 | revBytes( dwWork.word1.word ); | ||
111 | rNext.write( &dwWork, 8 ); | 120 | rNext.write( &dwWork, 8 ); |
112 | } | 121 | } |
113 | 122 | ||
@@ -117,9 +126,9 @@ Bu::size Bu::Blowfish::write( const void *pBuf, Bu::size iBytes ) | |||
117 | 126 | ||
118 | void Bu::Blowfish::reset() | 127 | void Bu::Blowfish::reset() |
119 | { | 128 | { |
120 | unsigned int i,j; | 129 | uint32_t i,j; |
121 | 130 | ||
122 | static unsigned int PA_Init[NUM_SUBKEYS] = | 131 | static uint32_t PA_Init[NUM_SUBKEYS] = |
123 | { | 132 | { |
124 | 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, | 133 | 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, |
125 | 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, | 134 | 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, |
@@ -128,7 +137,7 @@ void Bu::Blowfish::reset() | |||
128 | 0x9216d5d9, 0x8979fb1b | 137 | 0x9216d5d9, 0x8979fb1b |
129 | }; | 138 | }; |
130 | 139 | ||
131 | static unsigned int SB_Init[NUM_S_BOXES][NUM_ENTRIES] = { | 140 | static uint32_t SB_Init[NUM_S_BOXES][NUM_ENTRIES] = { |
132 | { | 141 | { |
133 | 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, | 142 | 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, |
134 | 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, | 143 | 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, |
diff --git a/src/experimental/blowfish.h b/src/experimental/blowfish.h index fb46dfd..054fc82 100644 --- a/src/experimental/blowfish.h +++ b/src/experimental/blowfish.h | |||
@@ -29,24 +29,24 @@ namespace Bu | |||
29 | using Bu::Stream::write; | 29 | using Bu::Stream::write; |
30 | 30 | ||
31 | private: | 31 | private: |
32 | unsigned int PA[NUM_SUBKEYS]; | 32 | uint32_t PA[NUM_SUBKEYS]; |
33 | unsigned int SB[NUM_S_BOXES][NUM_ENTRIES]; | 33 | uint32_t SB[NUM_S_BOXES][NUM_ENTRIES]; |
34 | 34 | ||
35 | #if __BYTE_ORDER == __BIG_ENDIAN | 35 | #if __BYTE_ORDER == __BIG_ENDIAN |
36 | struct WordByte | 36 | struct WordByte |
37 | { | 37 | { |
38 | unsigned int zero:8; | 38 | uint32_t zero:8; |
39 | unsigned int one:8; | 39 | uint32_t one:8; |
40 | unsigned int two:8; | 40 | uint32_t two:8; |
41 | unsigned int three:8; | 41 | uint32_t three:8; |
42 | }; | 42 | }; |
43 | #elif __BYTE_ORDER == __LITTLE_ENDIAN | 43 | #elif __BYTE_ORDER == __LITTLE_ENDIAN |
44 | struct WordByte | 44 | struct WordByte |
45 | { | 45 | { |
46 | unsigned int three:8; | 46 | uint32_t three:8; |
47 | unsigned int two:8; | 47 | uint32_t two:8; |
48 | unsigned int one:8; | 48 | uint32_t one:8; |
49 | unsigned int zero:8; | 49 | uint32_t zero:8; |
50 | }; | 50 | }; |
51 | #else | 51 | #else |
52 | #error No endianness defined | 52 | #error No endianness defined |
@@ -54,7 +54,7 @@ namespace Bu | |||
54 | 54 | ||
55 | union Word | 55 | union Word |
56 | { | 56 | { |
57 | unsigned int word; | 57 | uint32_t word; |
58 | WordByte byte; | 58 | WordByte byte; |
59 | }; | 59 | }; |
60 | 60 | ||