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

CA认证

开发平台:

Java

  1. package org.infosecurity.cryptography;
  2. import org.infosecurity.cryptography.*;
  3. /**
  4.  * <p>Title: 摘要算法的抽象类 </p>
  5.  * <p>Description: 摘要算法的抽象类 </p>
  6.  * <p>Copyright: Copyright (c) 2003</p>
  7.  * <p>Company:bouncycastle org </p>
  8.  */
  9. public abstract class CDigest
  10.     implements IDigest
  11. {
  12.     private byte[]  xBuf;
  13.     private int     xBufOff;
  14.     private long    byteCount;
  15.     // 1.构造
  16. protected CDigest()
  17. {
  18. xBuf = new byte[4];
  19. xBufOff = 0;
  20. }
  21. protected CDigest(CDigest t)
  22. {
  23.         xBuf = new byte[t.xBuf.length];
  24. System.arraycopy(t.xBuf, 0, xBuf, 0, t.xBuf.length);
  25. xBufOff = t.xBufOff;
  26. byteCount = t.byteCount;
  27. }
  28.     // 2.输入一个字节的数据
  29.     public void update(
  30.         byte in)
  31.     {
  32.         xBuf[xBufOff++] = in;
  33.         // 填充满一个4个字节了
  34.         if (xBufOff == xBuf.length)
  35.         {
  36.             processWord(xBuf, 0);
  37.             xBufOff = 0;
  38.         }
  39.         byteCount++;
  40.     }
  41.     public void update(
  42.         byte[]  in,
  43.         int     inOff,
  44.         int     len)
  45.     {
  46.         //
  47.         // fill the current word
  48.         //
  49.         while ((xBufOff != 0) && (len > 0))
  50.         {
  51.             update(in[inOff]);
  52.             inOff++;
  53.             len--;
  54.         }
  55.         //
  56.         // process whole words.
  57.         //
  58.         while (len > xBuf.length)
  59.         {
  60.             processWord(in, inOff);
  61.             inOff += xBuf.length;
  62.             len -= xBuf.length;
  63.             byteCount += xBuf.length;
  64.         }
  65.         //
  66.         // load in the remainder.
  67.         //
  68.         while (len > 0)
  69.         {
  70.             update(in[inOff]);
  71.             inOff++;
  72.             len--;
  73.         }
  74.     }
  75.     // 3.完成
  76.     public void finish()
  77.     {
  78.         // 每一个字节是8位
  79.         long    bitLength = (byteCount << 3);
  80.         //
  81.         // 附加填充比特一个1,多个0,直到len mod 512 = 448
  82.         //1000,0000B=128
  83.         update((byte)128);
  84.         while (xBufOff != 0)
  85.         {
  86.             update((byte)0);
  87.         }
  88.         // 最后填充8字节(64bit)的长度信息
  89.         processLength(bitLength);
  90.         // 处理最后一块
  91.         processBlock();
  92.     }
  93.     public void reset()
  94.     {
  95.         byteCount = 0;
  96.         xBufOff = 0;
  97. for ( int i = 0; i < xBuf.length; i++ ) {
  98. xBuf[i] = 0;
  99. }
  100.     }
  101.     protected abstract void processWord(byte[] in, int inOff);
  102.     protected abstract void processLength(long bitLength);
  103.     protected abstract void processBlock();
  104. }