Skip to content

Commit 02deb69

Browse files
author
gefeili
committed
Introduce DataOperator and related classes.
1 parent d26c8c3 commit 02deb69

File tree

9 files changed

+201
-99
lines changed

9 files changed

+201
-99
lines changed

core/src/main/java/org/bouncycastle/crypto/engines/AEADBufferBaseEngine.java

Lines changed: 179 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ protected enum AADOperatorType
2525
Stream
2626
}
2727

28+
protected enum DataOperatorType
29+
{
30+
Default,
31+
Counter,
32+
Stream
33+
}
34+
2835
protected enum State
2936
{
3037
Uninitialized,
@@ -48,6 +55,7 @@ protected enum State
4855
protected int m_bufferSizeDecrypt;
4956
protected AADProcessingBuffer processor;
5057
protected AADOperator aadOperator;
58+
protected DataOperator dataOperator;
5159

5260
protected AEADBufferBaseEngine(ProcessingBufferType type)
5361
{
@@ -100,6 +108,51 @@ protected void setInnerMembers(ProcessingBufferType type, AADOperatorType aadOpe
100108
}
101109
}
102110

111+
protected void setInnerMembers(ProcessingBufferType type, AADOperatorType aadOperatorType, DataOperatorType dataOperatorType)
112+
{
113+
// switch (type)
114+
// {
115+
// case Buffered:
116+
// processor = new BufferedAADProcessor();
117+
// break;
118+
// case BufferedLargeMac:
119+
// processor = new BufferedLargeMacAADProcessor();
120+
// break;
121+
// case Immediate:
122+
// processor = new ImmediateAADProcessor();
123+
// break;
124+
// case ImmediateLargeMac:
125+
// processor = new ImmediateLargeMacAADProcessor();
126+
// break;
127+
// }
128+
129+
switch (aadOperatorType)
130+
{
131+
case Default:
132+
aadOperator = new DefaultAADOperator();
133+
break;
134+
case Counter:
135+
aadOperator = new CounterAADOperator();
136+
break;
137+
case Stream:
138+
aadOperator = new StreamAADOperator();
139+
break;
140+
}
141+
142+
switch (dataOperatorType)
143+
{
144+
case Default:
145+
dataOperator = new DefaultDataOperator();
146+
break;
147+
case Counter:
148+
dataOperator = new CounterDataOperator();
149+
break;
150+
case Stream:
151+
dataOperator = new StreamDataOperator();
152+
break;
153+
}
154+
}
155+
103156
protected interface AADProcessingBuffer
104157
{
105158
void processAADByte(byte input);
@@ -226,7 +279,7 @@ protected interface AADOperator
226279

227280
void reset();
228281

229-
int getAadLen();
282+
int getLen();
230283
}
231284

232285
protected class DefaultAADOperator
@@ -241,39 +294,15 @@ public void processAADByte(byte input)
241294
@Override
242295
public void processAADBytes(byte[] input, int inOff, int len)
243296
{
244-
if (m_aadPos > 0)
245-
{
246-
int available = AADBufferSize - m_aadPos;
247-
if (processor.isLengthWithinAvailableSpace(len, available))
248-
{
249-
System.arraycopy(input, inOff, m_aad, m_aadPos, len);
250-
m_aadPos += len;
251-
return;
252-
}
253-
254-
System.arraycopy(input, inOff, m_aad, m_aadPos, available);
255-
inOff += available;
256-
len -= available;
257-
258-
processBufferAAD(m_aad, 0);
259-
}
260-
while (processor.isLengthExceedingBlockSize(len, AADBufferSize))
261-
{
262-
processBufferAAD(input, inOff);
263-
inOff += AADBufferSize;
264-
len -= AADBufferSize;
265-
}
266-
System.arraycopy(input, inOff, m_aad, 0, len);
267-
m_aadPos = len;
297+
processAadBytes(input, inOff, len);
268298
}
269299

270300
public void reset()
271301
{
272-
273302
}
274303

275304
@Override
276-
public int getAadLen()
305+
public int getLen()
277306
{
278307
return m_aadPos;
279308
}
@@ -295,33 +324,10 @@ public void processAADByte(byte input)
295324
public void processAADBytes(byte[] input, int inOff, int len)
296325
{
297326
aadLen += len;
298-
if (m_aadPos > 0)
299-
{
300-
int available = AADBufferSize - m_aadPos;
301-
if (processor.isLengthWithinAvailableSpace(len, available))
302-
{
303-
System.arraycopy(input, inOff, m_aad, m_aadPos, len);
304-
m_aadPos += len;
305-
return;
306-
}
307-
308-
System.arraycopy(input, inOff, m_aad, m_aadPos, available);
309-
inOff += available;
310-
len -= available;
311-
312-
processBufferAAD(m_aad, 0);
313-
}
314-
while (processor.isLengthExceedingBlockSize(len, AADBufferSize))
315-
{
316-
processBufferAAD(input, inOff);
317-
inOff += AADBufferSize;
318-
len -= AADBufferSize;
319-
}
320-
System.arraycopy(input, inOff, m_aad, 0, len);
321-
m_aadPos = len;
327+
processAadBytes(input, inOff, len);
322328
}
323329

324-
public int getAadLen()
330+
public int getLen()
325331
{
326332
return aadLen;
327333
}
@@ -332,10 +338,10 @@ public void reset()
332338
}
333339
}
334340

335-
protected class StreamAADOperator
341+
protected static class StreamAADOperator
336342
implements AADOperator
337343
{
338-
private ErasableOutputStream stream = new ErasableOutputStream();
344+
private final ErasableOutputStream stream = new ErasableOutputStream();
339345

340346
@Override
341347
public void processAADByte(byte input)
@@ -361,12 +367,96 @@ public void reset()
361367
}
362368

363369
@Override
364-
public int getAadLen()
370+
public int getLen()
365371
{
366372
return stream.size();
367373
}
368374
}
369375

376+
protected interface DataOperator
377+
{
378+
int processBytes(byte[] input, int inOff, int len, byte[] output, int outOff);
379+
380+
int getLen();
381+
382+
void reset();
383+
}
384+
385+
protected class DefaultDataOperator
386+
implements DataOperator
387+
{
388+
public int processBytes(byte[] input, int inOff, int len, byte[] output, int outOff)
389+
{
390+
return processEncDecBytes(input, inOff, len, output, outOff);
391+
}
392+
393+
@Override
394+
public int getLen()
395+
{
396+
return m_bufPos;
397+
}
398+
399+
@Override
400+
public void reset()
401+
{
402+
403+
}
404+
}
405+
406+
protected class CounterDataOperator
407+
implements DataOperator
408+
{
409+
private int messegeLen;
410+
411+
public int processBytes(byte[] input, int inOff, int len, byte[] output, int outOff)
412+
{
413+
messegeLen += len;
414+
return processEncDecBytes(input, inOff, len, output, outOff);
415+
}
416+
417+
@Override
418+
public int getLen()
419+
{
420+
return messegeLen;
421+
}
422+
423+
@Override
424+
public void reset()
425+
{
426+
messegeLen = 0;
427+
}
428+
}
429+
430+
protected class StreamDataOperator
431+
implements DataOperator
432+
{
433+
private ErasableOutputStream stream = new ErasableOutputStream();
434+
435+
@Override
436+
public int processBytes(byte[] input, int inOff, int len, byte[] output, int outOff)
437+
{
438+
stream.write(input, inOff, len);
439+
return 0;
440+
}
441+
442+
public byte[] getBytes()
443+
{
444+
return stream.getBuf();
445+
}
446+
447+
@Override
448+
public int getLen()
449+
{
450+
return stream.size();
451+
}
452+
453+
@Override
454+
public void reset()
455+
{
456+
stream.reset();
457+
}
458+
}
459+
370460
protected static final class ErasableOutputStream
371461
extends ByteArrayOutputStream
372462
{
@@ -401,11 +491,44 @@ public void processAADBytes(byte[] input, int inOff, int len)
401491
aadOperator.processAADBytes(input, inOff, len);
402492
}
403493

494+
private void processAadBytes(byte[] input, int inOff, int len)
495+
{
496+
if (m_aadPos > 0)
497+
{
498+
int available = AADBufferSize - m_aadPos;
499+
if (processor.isLengthWithinAvailableSpace(len, available))
500+
{
501+
System.arraycopy(input, inOff, m_aad, m_aadPos, len);
502+
m_aadPos += len;
503+
return;
504+
}
505+
506+
System.arraycopy(input, inOff, m_aad, m_aadPos, available);
507+
inOff += available;
508+
len -= available;
509+
510+
processBufferAAD(m_aad, 0);
511+
}
512+
while (processor.isLengthExceedingBlockSize(len, AADBufferSize))
513+
{
514+
processBufferAAD(input, inOff);
515+
inOff += AADBufferSize;
516+
len -= AADBufferSize;
517+
}
518+
System.arraycopy(input, inOff, m_aad, 0, len);
519+
m_aadPos = len;
520+
}
521+
404522
@Override
405523
public int processBytes(byte[] input, int inOff, int len, byte[] output, int outOff)
406524
throws DataLengthException
407525
{
408526
ensureSufficientInputBuffer(input, inOff, len);
527+
return dataOperator.processBytes(input, inOff, len, output, outOff);
528+
}
529+
530+
protected int processEncDecBytes(byte[] input, int inOff, int len, byte[] output, int outOff)
531+
{
409532
int available, resultLength;
410533
if (checkData(false))
411534
{
@@ -702,6 +825,7 @@ protected void bufferReset()
702825
throw new IllegalStateException(getAlgorithmName() + " needs to be initialized");
703826
}
704827
aadOperator.reset();
828+
dataOperator.reset();
705829
}
706830

707831
protected void ensureSufficientOutputBuffer(byte[] output, int outOff, int len)

core/src/main/java/org/bouncycastle/crypto/engines/AsconBaseEngine.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ abstract class AsconBaseEngine
2727
protected AsconBaseEngine(ProcessingBufferType type)
2828
{
2929
super(type);
30-
setInnerMembers(type, AADOperatorType.Default);
30+
setInnerMembers(type, AADOperatorType.Default, DataOperatorType.Default);
3131
}
3232

3333
private void round(long C)

core/src/main/java/org/bouncycastle/crypto/engines/ElephantEngine.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public ElephantEngine(ElephantParameters parameters)
7070
buffer = new byte[BlockSize];
7171
m_buf = new byte[BlockSize + MAC_SIZE];
7272
previous_outputMessage = new byte[BlockSize];
73-
setInnerMembers(ProcessingBufferType.Immediate, AADOperatorType.Stream);
73+
setInnerMembers(ProcessingBufferType.Immediate, AADOperatorType.Stream, DataOperatorType.Default);
7474
reset(false);
7575
}
7676

@@ -470,7 +470,7 @@ protected void processFinalAAD()
470470
{
471471
ad = ((StreamAADOperator)aadOperator).getBytes();
472472
adOff = 0;
473-
adlen = aadOperator.getAadLen();
473+
adlen = aadOperator.getLen();
474474
aadOperator.reset();
475475
}
476476
switch (m_state)

0 commit comments

Comments
 (0)