home *** CD-ROM | disk | FTP | other *** search
- package sun.security.provider;
-
- import java.security.MessageDigest;
-
- public class SHA extends MessageDigest implements Cloneable {
- private int version;
- // $FF: renamed from: W int[]
- private final int[] field_0;
- private long count;
- private final int countmax;
- private final int countmask;
- private final int round1_kt;
- private final int round2_kt;
- private final int round3_kt;
- private final int round4_kt;
- // $FF: renamed from: AA int
- private int field_1;
- // $FF: renamed from: BB int
- private int field_2;
- // $FF: renamed from: CC int
- private int field_3;
- // $FF: renamed from: DD int
- private int field_4;
- // $FF: renamed from: EE int
- private int field_5;
-
- private SHA(SHA var1) {
- this();
- this.version = var1.version;
- System.arraycopy(var1.field_0, 0, this.field_0, 0, this.field_0.length);
- this.count = var1.count;
- this.field_1 = var1.field_1;
- this.field_2 = var1.field_2;
- this.field_3 = var1.field_3;
- this.field_4 = var1.field_4;
- this.field_5 = var1.field_5;
- }
-
- SHA(int var1) {
- this();
- this.version = var1;
- }
-
- public SHA() {
- super("SHA");
- this.version = 1;
- this.field_0 = new int[80];
- this.countmax = 64;
- this.countmask = 63;
- this.round1_kt = 1518500249;
- this.round2_kt = 1859775393;
- this.round3_kt = -1894007588;
- this.round4_kt = -899497514;
- this.engineReset();
- }
-
- public void engineUpdate(byte var1) {
- this.engineUpdate((int)var1);
- }
-
- private void engineUpdate(int var1) {
- int var2 = ((int)this.count & 63) >>> 2;
- int var3 = (~((int)this.count) & 3) << 3;
- this.field_0[var2] = this.field_0[var2] & ~(255 << var3) | (var1 & 255) << var3;
- if (((int)this.count & 63) == 63) {
- this.computeBlock();
- }
-
- ++this.count;
- }
-
- public void engineUpdate(byte[] var1, int var2, int var3) {
- if (var2 >= 0 && var3 >= 0 && var2 + var3 <= var1.length) {
- while(var3 > 0 && ((int)this.count & 3) != 0) {
- this.engineUpdate(var1[var2]);
- ++var2;
- --var3;
- }
-
- while(var3 >= 4) {
- int var4 = ((int)this.count & 63) >> 2;
- this.field_0[var4] = (var1[var2] & 255) << 24 | (var1[var2 + 1] & 255) << 16 | (var1[var2 + 2] & 255) << 8 | var1[var2 + 3] & 255;
- this.count += 4L;
- if (((int)this.count & 63) == 0) {
- this.computeBlock();
- }
-
- var3 -= 4;
- var2 += 4;
- }
-
- while(var3 > 0) {
- this.engineUpdate(var1[var2]);
- --var3;
- ++var2;
- }
-
- } else {
- throw new ArrayIndexOutOfBoundsException();
- }
- }
-
- public void engineReset() {
- this.field_1 = 1732584193;
- this.field_2 = -271733879;
- this.field_3 = -1732584194;
- this.field_4 = 271733878;
- this.field_5 = -1009589776;
-
- for(int var1 = 0; var1 < 80; ++var1) {
- this.field_0[var1] = 0;
- }
-
- this.count = 0L;
- }
-
- public byte[] engineDigest() {
- long var2 = this.count << 3;
- this.engineUpdate((int)128);
-
- while((int)(this.count & 63L) != 56) {
- this.engineUpdate((int)0);
- }
-
- this.field_0[14] = (int)(var2 >>> 32);
- this.field_0[15] = (int)(var2 & -1L);
- this.count += 8L;
- this.computeBlock();
- 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};
- this.engineReset();
- return var1;
- }
-
- private void computeBlock() {
- for(int var7 = 16; var7 <= 79; ++var7) {
- if (this.version == 0) {
- this.field_0[var7] = this.field_0[var7 - 3] ^ this.field_0[var7 - 8] ^ this.field_0[var7 - 14] ^ this.field_0[var7 - 16];
- } else {
- int var1 = this.field_0[var7 - 3] ^ this.field_0[var7 - 8] ^ this.field_0[var7 - 14] ^ this.field_0[var7 - 16];
- this.field_0[var7] = var1 << 1 | var1 >>> 31;
- }
- }
-
- int var2 = this.field_1;
- int var3 = this.field_2;
- int var4 = this.field_3;
- int var5 = this.field_4;
- int var6 = this.field_5;
-
- for(int var8 = 0; var8 < 20; ++var8) {
- int var12 = (var2 << 5 | var2 >>> 27) + (var3 & var4 | ~var3 & var5) + var6 + this.field_0[var8] + 1518500249;
- var6 = var5;
- var5 = var4;
- var4 = var3 << 30 | var3 >>> 2;
- var3 = var2;
- var2 = var12;
- }
-
- for(int var9 = 20; var9 < 40; ++var9) {
- int var13 = (var2 << 5 | var2 >>> 27) + (var3 ^ var4 ^ var5) + var6 + this.field_0[var9] + 1859775393;
- var6 = var5;
- var5 = var4;
- var4 = var3 << 30 | var3 >>> 2;
- var3 = var2;
- var2 = var13;
- }
-
- for(int var10 = 40; var10 < 60; ++var10) {
- int var14 = (var2 << 5 | var2 >>> 27) + (var3 & var4 | var3 & var5 | var4 & var5) + var6 + this.field_0[var10] + -1894007588;
- var6 = var5;
- var5 = var4;
- var4 = var3 << 30 | var3 >>> 2;
- var3 = var2;
- var2 = var14;
- }
-
- for(int var11 = 60; var11 < 80; ++var11) {
- int var15 = (var2 << 5 | var2 >>> 27) + (var3 ^ var4 ^ var5) + var6 + this.field_0[var11] + -899497514;
- var6 = var5;
- var5 = var4;
- var4 = var3 << 30 | var3 >>> 2;
- var3 = var2;
- var2 = var15;
- }
-
- this.field_1 += var2;
- this.field_2 += var3;
- this.field_3 += var4;
- this.field_4 += var5;
- this.field_5 += var6;
- }
-
- public Object clone() {
- return new SHA(this);
- }
- }
-