@@ -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 )
0 commit comments