1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.bouncycastle.crypto.digests;
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * implementation of SHA-1 as outlined in "Handbook of Applied Cryptography", pages 346 - 349.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * It is interesting to ponder why the, apart from the extra IV, the other difference here from MD5
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is the "endienness" of the word processing!
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class SHA1Digest
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    extends GeneralDigest
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final int    DIGEST_LENGTH = 20;
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private int     H1, H2, H3, H4, H5;
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private int[]   X = new int[80];
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private int     xOff;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Standard constructor
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public SHA1Digest()
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        reset();
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Copy constructor.  This will copy the state of the provided
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * message digest.
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public SHA1Digest(SHA1Digest t)
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super(t);
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H1 = t.H1;
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H2 = t.H2;
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H3 = t.H3;
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H4 = t.H4;
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H5 = t.H5;
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        System.arraycopy(t.X, 0, X, 0, t.X.length);
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        xOff = t.xOff;
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getAlgorithmName()
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return "SHA-1";
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getDigestSize()
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return DIGEST_LENGTH;
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected void processWord(
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[]  in,
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     inOff)
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        X[xOff++] = (in[inOff] & 0xff) << 24 | (in[inOff + 1] & 0xff) << 16
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    | (in[inOff + 2] & 0xff) << 8 | in[inOff + 3] & 0xff;
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (xOff == 16)
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            processBlock();
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private void unpackWord(
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     word,
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[]  out,
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     outOff)
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        out[outOff++] = (byte)(word >>> 24);
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        out[outOff++] = (byte)(word >>> 16);
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        out[outOff++] = (byte)(word >>> 8);
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        out[outOff++] = (byte)word;
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected void processLength(
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        long    bitLength)
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (xOff > 14)
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            processBlock();
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        X[14] = (int)(bitLength >>> 32);
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        X[15] = (int)(bitLength & 0xffffffff);
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int doFinal(
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[]  out,
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     outOff)
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        finish();
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        unpackWord(H1, out, outOff);
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        unpackWord(H2, out, outOff + 4);
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        unpackWord(H3, out, outOff + 8);
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        unpackWord(H4, out, outOff + 12);
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        unpackWord(H5, out, outOff + 16);
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        reset();
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return DIGEST_LENGTH;
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * reset the chaining variables
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void reset()
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super.reset();
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H1 = 0x67452301;
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H2 = 0xefcdab89;
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H3 = 0x98badcfe;
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H4 = 0x10325476;
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H5 = 0xc3d2e1f0;
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        xOff = 0;
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i != X.length; i++)
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            X[i] = 0;
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    //
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // Additive constants
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    //
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final int    Y1 = 0x5a827999;
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final int    Y2 = 0x6ed9eba1;
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final int    Y3 = 0x8f1bbcdc;
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final int    Y4 = 0xca62c1d6;
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private int f(
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int    u,
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int    v,
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int    w)
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return ((u & v) | ((~u) & w));
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private int h(
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int    u,
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int    v,
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int    w)
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (u ^ v ^ w);
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private int g(
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int    u,
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int    v,
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int    w)
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return ((u & v) | (u & w) | (v & w));
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected void processBlock()
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // expand 16 word block into 80 word block.
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 16; i < 80; i++)
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int t = X[i - 3] ^ X[i - 8] ^ X[i - 14] ^ X[i - 16];
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            X[i] = t << 1 | t >>> 31;
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // set up working variables.
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     A = H1;
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     B = H2;
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     C = H3;
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     D = H4;
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     E = H5;
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // round 1
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int idx = 0;
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int j = 0; j < 4; j++)
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // E = rotateLeft(A, 5) + f(B, C, D) + E + X[idx++] + Y1
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // B = rotateLeft(B, 30)
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            E += (A << 5 | A >>> 27) + f(B, C, D) + X[idx++] + Y1;
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            B = B << 30 | B >>> 2;
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            D += (E << 5 | E >>> 27) + f(A, B, C) + X[idx++] + Y1;
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            A = A << 30 | A >>> 2;
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            C += (D << 5 | D >>> 27) + f(E, A, B) + X[idx++] + Y1;
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            E = E << 30 | E >>> 2;
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            B += (C << 5 | C >>> 27) + f(D, E, A) + X[idx++] + Y1;
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            D = D << 30 | D >>> 2;
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            A += (B << 5 | B >>> 27) + f(C, D, E) + X[idx++] + Y1;
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            C = C << 30 | C >>> 2;
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // round 2
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int j = 0; j < 4; j++)
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // E = rotateLeft(A, 5) + h(B, C, D) + E + X[idx++] + Y2
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // B = rotateLeft(B, 30)
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            E += (A << 5 | A >>> 27) + h(B, C, D) + X[idx++] + Y2;
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            B = B << 30 | B >>> 2;
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            D += (E << 5 | E >>> 27) + h(A, B, C) + X[idx++] + Y2;
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            A = A << 30 | A >>> 2;
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            C += (D << 5 | D >>> 27) + h(E, A, B) + X[idx++] + Y2;
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            E = E << 30 | E >>> 2;
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            B += (C << 5 | C >>> 27) + h(D, E, A) + X[idx++] + Y2;
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            D = D << 30 | D >>> 2;
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            A += (B << 5 | B >>> 27) + h(C, D, E) + X[idx++] + Y2;
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            C = C << 30 | C >>> 2;
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // round 3
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int j = 0; j < 4; j++)
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // E = rotateLeft(A, 5) + g(B, C, D) + E + X[idx++] + Y3
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // B = rotateLeft(B, 30)
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            E += (A << 5 | A >>> 27) + g(B, C, D) + X[idx++] + Y3;
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            B = B << 30 | B >>> 2;
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            D += (E << 5 | E >>> 27) + g(A, B, C) + X[idx++] + Y3;
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            A = A << 30 | A >>> 2;
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            C += (D << 5 | D >>> 27) + g(E, A, B) + X[idx++] + Y3;
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            E = E << 30 | E >>> 2;
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            B += (C << 5 | C >>> 27) + g(D, E, A) + X[idx++] + Y3;
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            D = D << 30 | D >>> 2;
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            A += (B << 5 | B >>> 27) + g(C, D, E) + X[idx++] + Y3;
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            C = C << 30 | C >>> 2;
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // round 4
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int j = 0; j <= 3; j++)
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // E = rotateLeft(A, 5) + h(B, C, D) + E + X[idx++] + Y4
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // B = rotateLeft(B, 30)
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            E += (A << 5 | A >>> 27) + h(B, C, D) + X[idx++] + Y4;
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            B = B << 30 | B >>> 2;
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            D += (E << 5 | E >>> 27) + h(A, B, C) + X[idx++] + Y4;
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            A = A << 30 | A >>> 2;
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            C += (D << 5 | D >>> 27) + h(E, A, B) + X[idx++] + Y4;
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            E = E << 30 | E >>> 2;
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            B += (C << 5 | C >>> 27) + h(D, E, A) + X[idx++] + Y4;
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            D = D << 30 | D >>> 2;
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            A += (B << 5 | B >>> 27) + h(C, D, E) + X[idx++] + Y4;
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            C = C << 30 | C >>> 2;
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H1 += A;
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H2 += B;
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H3 += C;
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H4 += D;
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H5 += E;
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // reset start of the buffer.
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        xOff = 0;
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < 16; i++)
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            X[i] = 0;
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
295