@@ -60,35 +60,39 @@ public virtual void Init(bool forEncryption, ICipherParameters parameters)
60
60
throw new ArgumentException ( "Invalid parameters passed to Noekeon init - "
61
61
+ Platform . GetTypeName ( parameters ) , "parameters" ) ;
62
62
63
- this . _forEncryption = forEncryption ;
64
- this . _initialised = true ;
65
-
66
63
KeyParameter p = ( KeyParameter ) parameters ;
64
+ byte [ ] key = p . GetKey ( ) ;
65
+ if ( key . Length != 16 )
66
+ throw new ArgumentException ( "Key length not 128 bits." ) ;
67
67
68
- Pack . BE_To_UInt32 ( p . GetKey ( ) , 0 , k , 0 , 4 ) ;
68
+ Pack . BE_To_UInt32 ( key , 0 , k , 0 , 4 ) ;
69
69
70
70
if ( ! forEncryption )
71
71
{
72
72
// theta(k, new uint[]{ 0x00, 0x00, 0x00, 0x00 });
73
73
{
74
74
uint a0 = k [ 0 ] , a1 = k [ 1 ] , a2 = k [ 2 ] , a3 = k [ 3 ] ;
75
75
76
- uint t = a0 ^ a2 ;
77
- t ^= Integers . RotateLeft ( t , 8 ) ^ Integers . RotateLeft ( t , 24 ) ;
78
- a1 ^= t ;
79
- a3 ^= t ;
76
+ uint t02 = a0 ^ a2 ;
77
+ t02 ^= Integers . RotateLeft ( t02 , 8 ) ^ Integers . RotateLeft ( t02 , 24 ) ;
78
+
79
+ uint t13 = a1 ^ a3 ;
80
+ t13 ^= Integers . RotateLeft ( t13 , 8 ) ^ Integers . RotateLeft ( t13 , 24 ) ;
80
81
81
- t = a1 ^ a3 ;
82
- t ^= Integers . RotateLeft ( t , 8 ) ^ Integers . RotateLeft ( t , 24 ) ;
83
- a0 ^= t ;
84
- a2 ^= t ;
82
+ a0 ^= t13 ;
83
+ a1 ^= t02 ;
84
+ a2 ^= t13 ;
85
+ a3 ^= t02 ;
85
86
86
- k [ 0 ] = a0 ; k [ 1 ] = a1 ; k [ 2 ] = a2 ; k [ 3 ] = a3 ;
87
+ k [ 0 ] = a0 ; k [ 1 ] = a1 ; k [ 2 ] = a2 ; k [ 3 ] = a3 ;
87
88
}
88
89
}
89
- }
90
90
91
- public virtual int ProcessBlock (
91
+ this . _forEncryption = forEncryption ;
92
+ this . _initialised = true ;
93
+ }
94
+
95
+ public virtual int ProcessBlock (
92
96
byte [ ] input ,
93
97
int inOff ,
94
98
byte [ ] output ,
@@ -119,27 +123,27 @@ private int EncryptBlock(byte[] input, int inOff, byte[] output, int outOff)
119
123
uint k0 = k [ 0 ] , k1 = k [ 1 ] , k2 = k [ 2 ] , k3 = k [ 3 ] ;
120
124
121
125
int round = 0 ;
122
- uint t ;
123
126
for ( ; ; )
124
127
{
125
128
a0 ^= RoundConstants [ round ] ;
126
129
127
130
// theta(a, k);
128
131
{
129
- t = a0 ^ a2 ;
130
- t ^= Integers . RotateLeft ( t , 8 ) ^ Integers . RotateLeft ( t , 24 ) ;
131
- a1 ^= t ;
132
- a3 ^= t ;
132
+ uint t02 = a0 ^ a2 ;
133
+ t02 ^= Integers . RotateLeft ( t02 , 8 ) ^ Integers . RotateLeft ( t02 , 24 ) ;
133
134
134
135
a0 ^= k0 ;
135
136
a1 ^= k1 ;
136
137
a2 ^= k2 ;
137
138
a3 ^= k3 ;
138
139
139
- t = a1 ^ a3 ;
140
- t ^= Integers . RotateLeft ( t , 8 ) ^ Integers . RotateLeft ( t , 24 ) ;
141
- a0 ^= t ;
142
- a2 ^= t ;
140
+ uint t13 = a1 ^ a3 ;
141
+ t13 ^= Integers . RotateLeft ( t13 , 8 ) ^ Integers . RotateLeft ( t13 , 24 ) ;
142
+
143
+ a0 ^= t13 ;
144
+ a1 ^= t02 ;
145
+ a2 ^= t13 ;
146
+ a3 ^= t02 ;
143
147
}
144
148
145
149
if ( ++ round > Size )
@@ -154,14 +158,14 @@ private int EncryptBlock(byte[] input, int inOff, byte[] output, int outOff)
154
158
155
159
// gamma(a);
156
160
{
157
- a1 ^= ~ a3 & ~ a2 ;
158
- a0 ^= a2 & a1 ;
161
+ uint t = a3 ;
162
+ a1 ^= a3 | a2 ;
163
+ a3 = a0 ^ ( a2 & ~ a1 ) ;
159
164
160
- t = a3 ; a3 = a0 ; a0 = t ;
161
- a2 ^= a0 ^ a1 ^ a3 ;
165
+ a2 = t ^ ~ a1 ^ a2 ^ a3 ;
162
166
163
- a1 ^= ~ a3 & ~ a2 ;
164
- a0 ^= a2 & a1 ;
167
+ a1 ^= a3 | a2 ;
168
+ a0 = t ^ ( a2 & a1 ) ;
165
169
}
166
170
167
171
// pi2(a);
@@ -190,28 +194,28 @@ private int DecryptBlock(byte[] input, int inOff, byte[] output, int outOff)
190
194
uint k0 = k [ 0 ] , k1 = k [ 1 ] , k2 = k [ 2 ] , k3 = k [ 3 ] ;
191
195
192
196
int round = Size ;
193
- uint t ;
194
197
for ( ; ; )
195
198
{
196
199
// theta(a, k);
197
200
{
198
- t = a0 ^ a2 ;
199
- t ^= Integers . RotateLeft ( t , 8 ) ^ Integers . RotateLeft ( t , 24 ) ;
200
- a1 ^= t ;
201
- a3 ^= t ;
201
+ uint t02 = a0 ^ a2 ;
202
+ t02 ^= Integers . RotateLeft ( t02 , 8 ) ^ Integers . RotateLeft ( t02 , 24 ) ;
202
203
203
- a0 ^= k0 ;
204
- a1 ^= k1 ;
205
- a2 ^= k2 ;
206
- a3 ^= k3 ;
204
+ a0 ^= k0 ;
205
+ a1 ^= k1 ;
206
+ a2 ^= k2 ;
207
+ a3 ^= k3 ;
207
208
208
- t = a1 ^ a3 ;
209
- t ^= Integers . RotateLeft ( t , 8 ) ^ Integers . RotateLeft ( t , 24 ) ;
210
- a0 ^= t ;
211
- a2 ^= t ;
212
- }
209
+ uint t13 = a1 ^ a3 ;
210
+ t13 ^= Integers . RotateLeft ( t13 , 8 ) ^ Integers . RotateLeft ( t13 , 24 ) ;
213
211
214
- a0 ^= RoundConstants [ round ] ;
212
+ a0 ^= t13 ;
213
+ a1 ^= t02 ;
214
+ a2 ^= t13 ;
215
+ a3 ^= t02 ;
216
+ }
217
+
218
+ a0 ^= RoundConstants [ round ] ;
215
219
216
220
if ( -- round < 0 )
217
221
break ;
@@ -225,18 +229,18 @@ private int DecryptBlock(byte[] input, int inOff, byte[] output, int outOff)
225
229
226
230
// gamma(a);
227
231
{
228
- a1 ^= ~ a3 & ~ a2 ;
229
- a0 ^= a2 & a1 ;
232
+ uint t = a3 ;
233
+ a1 ^= a3 | a2 ;
234
+ a3 = a0 ^ ( a2 & ~ a1 ) ;
230
235
231
- t = a3 ; a3 = a0 ; a0 = t ;
232
- a2 ^= a0 ^ a1 ^ a3 ;
236
+ a2 = t ^ ~ a1 ^ a2 ^ a3 ;
233
237
234
- a1 ^= ~ a3 & ~ a2 ;
235
- a0 ^= a2 & a1 ;
236
- }
238
+ a1 ^= a3 | a2 ;
239
+ a0 = t ^ ( a2 & a1 ) ;
240
+ }
237
241
238
- // pi2(a);
239
- {
242
+ // pi2(a);
243
+ {
240
244
a1 = Integers . RotateLeft ( a1 , 31 ) ;
241
245
a2 = Integers . RotateLeft ( a2 , 27 ) ;
242
246
a3 = Integers . RotateLeft ( a3 , 30 ) ;
0 commit comments