home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1999 April / DPPCPRO0499.ISO / April / Notes / 50b2wic.exe / DATA1.CAB / NotesProgramFilesJavaSupport / rt.jar / sun / security / provider / SHA.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-04-23  |  3.4 KB  |  197 lines

  1. package sun.security.provider;
  2.  
  3. import java.security.MessageDigest;
  4.  
  5. public class SHA extends MessageDigest implements Cloneable {
  6.    private int version;
  7.    // $FF: renamed from: W int[]
  8.    private final int[] field_0;
  9.    private long count;
  10.    private final int countmax;
  11.    private final int countmask;
  12.    private final int round1_kt;
  13.    private final int round2_kt;
  14.    private final int round3_kt;
  15.    private final int round4_kt;
  16.    // $FF: renamed from: AA int
  17.    private int field_1;
  18.    // $FF: renamed from: BB int
  19.    private int field_2;
  20.    // $FF: renamed from: CC int
  21.    private int field_3;
  22.    // $FF: renamed from: DD int
  23.    private int field_4;
  24.    // $FF: renamed from: EE int
  25.    private int field_5;
  26.  
  27.    private SHA(SHA var1) {
  28.       this();
  29.       this.version = var1.version;
  30.       System.arraycopy(var1.field_0, 0, this.field_0, 0, this.field_0.length);
  31.       this.count = var1.count;
  32.       this.field_1 = var1.field_1;
  33.       this.field_2 = var1.field_2;
  34.       this.field_3 = var1.field_3;
  35.       this.field_4 = var1.field_4;
  36.       this.field_5 = var1.field_5;
  37.    }
  38.  
  39.    SHA(int var1) {
  40.       this();
  41.       this.version = var1;
  42.    }
  43.  
  44.    public SHA() {
  45.       super("SHA");
  46.       this.version = 1;
  47.       this.field_0 = new int[80];
  48.       this.countmax = 64;
  49.       this.countmask = 63;
  50.       this.round1_kt = 1518500249;
  51.       this.round2_kt = 1859775393;
  52.       this.round3_kt = -1894007588;
  53.       this.round4_kt = -899497514;
  54.       this.engineReset();
  55.    }
  56.  
  57.    public void engineUpdate(byte var1) {
  58.       this.engineUpdate((int)var1);
  59.    }
  60.  
  61.    private void engineUpdate(int var1) {
  62.       int var2 = ((int)this.count & 63) >>> 2;
  63.       int var3 = (~((int)this.count) & 3) << 3;
  64.       this.field_0[var2] = this.field_0[var2] & ~(255 << var3) | (var1 & 255) << var3;
  65.       if (((int)this.count & 63) == 63) {
  66.          this.computeBlock();
  67.       }
  68.  
  69.       ++this.count;
  70.    }
  71.  
  72.    public void engineUpdate(byte[] var1, int var2, int var3) {
  73.       if (var2 >= 0 && var3 >= 0 && var2 + var3 <= var1.length) {
  74.          while(var3 > 0 && ((int)this.count & 3) != 0) {
  75.             this.engineUpdate(var1[var2]);
  76.             ++var2;
  77.             --var3;
  78.          }
  79.  
  80.          while(var3 >= 4) {
  81.             int var4 = ((int)this.count & 63) >> 2;
  82.             this.field_0[var4] = (var1[var2] & 255) << 24 | (var1[var2 + 1] & 255) << 16 | (var1[var2 + 2] & 255) << 8 | var1[var2 + 3] & 255;
  83.             this.count += 4L;
  84.             if (((int)this.count & 63) == 0) {
  85.                this.computeBlock();
  86.             }
  87.  
  88.             var3 -= 4;
  89.             var2 += 4;
  90.          }
  91.  
  92.          while(var3 > 0) {
  93.             this.engineUpdate(var1[var2]);
  94.             --var3;
  95.             ++var2;
  96.          }
  97.  
  98.       } else {
  99.          throw new ArrayIndexOutOfBoundsException();
  100.       }
  101.    }
  102.  
  103.    public void engineReset() {
  104.       this.field_1 = 1732584193;
  105.       this.field_2 = -271733879;
  106.       this.field_3 = -1732584194;
  107.       this.field_4 = 271733878;
  108.       this.field_5 = -1009589776;
  109.  
  110.       for(int var1 = 0; var1 < 80; ++var1) {
  111.          this.field_0[var1] = 0;
  112.       }
  113.  
  114.       this.count = 0L;
  115.    }
  116.  
  117.    public byte[] engineDigest() {
  118.       long var2 = this.count << 3;
  119.       this.engineUpdate((int)128);
  120.  
  121.       while((int)(this.count & 63L) != 56) {
  122.          this.engineUpdate((int)0);
  123.       }
  124.  
  125.       this.field_0[14] = (int)(var2 >>> 32);
  126.       this.field_0[15] = (int)(var2 & -1L);
  127.       this.count += 8L;
  128.       this.computeBlock();
  129.       byte[] var1 = new byte[]{(byte)(this.field_1 >>> 24), (byte)(this.field_1 >>> 16), (byte)(this.field_1 >>> 8), (byte)this.field_1, (byte)(this.field_2 >>> 24), (byte)(this.field_2 >>> 16), (byte)(this.field_2 >>> 8), (byte)this.field_2, (byte)(this.field_3 >>> 24), (byte)(this.field_3 >>> 16), (byte)(this.field_3 >>> 8), (byte)this.field_3, (byte)(this.field_4 >>> 24), (byte)(this.field_4 >>> 16), (byte)(this.field_4 >>> 8), (byte)this.field_4, (byte)(this.field_5 >>> 24), (byte)(this.field_5 >>> 16), (byte)(this.field_5 >>> 8), (byte)this.field_5};
  130.       this.engineReset();
  131.       return var1;
  132.    }
  133.  
  134.    private void computeBlock() {
  135.       for(int var7 = 16; var7 <= 79; ++var7) {
  136.          if (this.version == 0) {
  137.             this.field_0[var7] = this.field_0[var7 - 3] ^ this.field_0[var7 - 8] ^ this.field_0[var7 - 14] ^ this.field_0[var7 - 16];
  138.          } else {
  139.             int var1 = this.field_0[var7 - 3] ^ this.field_0[var7 - 8] ^ this.field_0[var7 - 14] ^ this.field_0[var7 - 16];
  140.             this.field_0[var7] = var1 << 1 | var1 >>> 31;
  141.          }
  142.       }
  143.  
  144.       int var2 = this.field_1;
  145.       int var3 = this.field_2;
  146.       int var4 = this.field_3;
  147.       int var5 = this.field_4;
  148.       int var6 = this.field_5;
  149.  
  150.       for(int var8 = 0; var8 < 20; ++var8) {
  151.          int var12 = (var2 << 5 | var2 >>> 27) + (var3 & var4 | ~var3 & var5) + var6 + this.field_0[var8] + 1518500249;
  152.          var6 = var5;
  153.          var5 = var4;
  154.          var4 = var3 << 30 | var3 >>> 2;
  155.          var3 = var2;
  156.          var2 = var12;
  157.       }
  158.  
  159.       for(int var9 = 20; var9 < 40; ++var9) {
  160.          int var13 = (var2 << 5 | var2 >>> 27) + (var3 ^ var4 ^ var5) + var6 + this.field_0[var9] + 1859775393;
  161.          var6 = var5;
  162.          var5 = var4;
  163.          var4 = var3 << 30 | var3 >>> 2;
  164.          var3 = var2;
  165.          var2 = var13;
  166.       }
  167.  
  168.       for(int var10 = 40; var10 < 60; ++var10) {
  169.          int var14 = (var2 << 5 | var2 >>> 27) + (var3 & var4 | var3 & var5 | var4 & var5) + var6 + this.field_0[var10] + -1894007588;
  170.          var6 = var5;
  171.          var5 = var4;
  172.          var4 = var3 << 30 | var3 >>> 2;
  173.          var3 = var2;
  174.          var2 = var14;
  175.       }
  176.  
  177.       for(int var11 = 60; var11 < 80; ++var11) {
  178.          int var15 = (var2 << 5 | var2 >>> 27) + (var3 ^ var4 ^ var5) + var6 + this.field_0[var11] + -899497514;
  179.          var6 = var5;
  180.          var5 = var4;
  181.          var4 = var3 << 30 | var3 >>> 2;
  182.          var3 = var2;
  183.          var2 = var15;
  184.       }
  185.  
  186.       this.field_1 += var2;
  187.       this.field_2 += var3;
  188.       this.field_3 += var4;
  189.       this.field_4 += var5;
  190.       this.field_5 += var6;
  191.    }
  192.  
  193.    public Object clone() {
  194.       return new SHA(this);
  195.    }
  196. }
  197.