GeneralDigest.java
上传用户:lior1029
上传日期:2013-05-07
资源大小:209k
文件大小:2k
源码类别:

CA认证

开发平台:

Java

  1. package org.bouncycastle.crypto.digests;
  2. import org.bouncycastle.crypto.Digest;
  3. /**
  4.  * base implementation of MD4 family style digest as outlined in
  5.  * "Handbook of Applied Cryptography", pages 344 - 347.
  6.  */
  7. public abstract class GeneralDigest
  8.     implements Digest
  9. {
  10.     private byte[]  xBuf;
  11.     private int     xBufOff;
  12.     private long    byteCount;
  13. /**
  14.  * Standard constructor
  15.  */
  16. protected GeneralDigest()
  17. {
  18. xBuf = new byte[4];
  19. xBufOff = 0;
  20. }
  21. /**
  22.  * Copy constructor.  We are using copy constructors in place
  23.  * of the Object.clone() interface as this interface is not
  24.  * supported by J2ME.
  25.  */
  26. protected GeneralDigest(GeneralDigest t)
  27. {
  28.         xBuf = new byte[t.xBuf.length];
  29. System.arraycopy(t.xBuf, 0, xBuf, 0, t.xBuf.length);
  30. xBufOff = t.xBufOff;
  31. byteCount = t.byteCount;
  32. }
  33.     public void update(
  34.         byte in)
  35.     {
  36.         xBuf[xBufOff++] = in;
  37.         if (xBufOff == xBuf.length)
  38.         {
  39.             processWord(xBuf, 0);
  40.             xBufOff = 0;
  41.         }
  42.         byteCount++;
  43.     }
  44.     public void update(
  45.         byte[]  in,
  46.         int     inOff,
  47.         int     len)
  48.     {
  49.         //
  50.         // fill the current word
  51.         //
  52.         while ((xBufOff != 0) && (len > 0))
  53.         {
  54.             update(in[inOff]);
  55.             inOff++;
  56.             len--;
  57.         }
  58.         //
  59.         // process whole words.
  60.         //
  61.         while (len > xBuf.length)
  62.         {
  63.             processWord(in, inOff);
  64.             inOff += xBuf.length;
  65.             len -= xBuf.length;
  66.             byteCount += xBuf.length;
  67.         }
  68.         //
  69.         // load in the remainder.
  70.         //
  71.         while (len > 0)
  72.         {
  73.             update(in[inOff]);
  74.             inOff++;
  75.             len--;
  76.         }
  77.     }
  78.     public void finish()
  79.     {
  80.         long    bitLength = (byteCount << 3);
  81.         //
  82.         // add the pad bytes.
  83.         //
  84.         update((byte)128);
  85.         while (xBufOff != 0)
  86.         {
  87.             update((byte)0);
  88.         }
  89.         processLength(bitLength);
  90.         processBlock();
  91.     }
  92.     public void reset()
  93.     {
  94.         byteCount = 0;
  95.         xBufOff = 0;
  96. for ( int i = 0; i < xBuf.length; i++ ) {
  97. xBuf[i] = 0;
  98. }
  99.     }
  100.     protected abstract void processWord(byte[] in, int inOff);
  101.     protected abstract void processLength(long bitLength);
  102.     protected abstract void processBlock();
  103. }