1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.bouncycastle.crypto.digests;
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.crypto.digests.GeneralDigest;
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * FIPS 180-2 implementation of SHA-256.
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <pre>
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *         block  word  digest
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * SHA-1   512    32    160
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * SHA-256 512    32    256
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * SHA-384 1024   64    384
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * SHA-512 1024   64    512
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </pre>
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class SHA256Digest
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    extends GeneralDigest
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final int    DIGEST_LENGTH = 32;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private int     H1, H2, H3, H4, H5, H6, H7, H8;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private int[]   X = new int[64];
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private int     xOff;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Standard constructor
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public SHA256Digest()
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        reset();
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Copy constructor.  This will copy the state of the provided
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * message digest.
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public SHA256Digest(SHA256Digest t)
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super(t);
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H1 = t.H1;
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H2 = t.H2;
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H3 = t.H3;
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H4 = t.H4;
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H5 = t.H5;
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H6 = t.H6;
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H7 = t.H7;
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H8 = t.H8;
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        System.arraycopy(t.X, 0, X, 0, t.X.length);
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        xOff = t.xOff;
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getAlgorithmName()
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return "SHA-256";
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getDigestSize()
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return DIGEST_LENGTH;
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected void processWord(
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[]  in,
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     inOff)
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        X[xOff++] = ((in[inOff] & 0xff) << 24) | ((in[inOff + 1] & 0xff) << 16)
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    | ((in[inOff + 2] & 0xff) << 8) | ((in[inOff + 3] & 0xff));
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (xOff == 16)
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            processBlock();
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private void unpackWord(
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     word,
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[]  out,
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     outOff)
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        out[outOff]     = (byte)(word >>> 24);
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        out[outOff + 1] = (byte)(word >>> 16);
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        out[outOff + 2] = (byte)(word >>> 8);
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        out[outOff + 3] = (byte)word;
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected void processLength(
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        long    bitLength)
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (xOff > 14)
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            processBlock();
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        X[14] = (int)(bitLength >>> 32);
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        X[15] = (int)(bitLength & 0xffffffff);
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int doFinal(
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[]  out,
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     outOff)
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        finish();
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        unpackWord(H1, out, outOff);
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        unpackWord(H2, out, outOff + 4);
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        unpackWord(H3, out, outOff + 8);
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        unpackWord(H4, out, outOff + 12);
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        unpackWord(H5, out, outOff + 16);
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        unpackWord(H6, out, outOff + 20);
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        unpackWord(H7, out, outOff + 24);
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        unpackWord(H8, out, outOff + 28);
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        reset();
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return DIGEST_LENGTH;
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * reset the chaining variables
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void reset()
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super.reset();
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /* SHA-256 initial hash value
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * The first 32 bits of the fractional parts of the square roots
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * of the first eight prime numbers
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H1 = 0x6a09e667;
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H2 = 0xbb67ae85;
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H3 = 0x3c6ef372;
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H4 = 0xa54ff53a;
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H5 = 0x510e527f;
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H6 = 0x9b05688c;
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H7 = 0x1f83d9ab;
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H8 = 0x5be0cd19;
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        xOff = 0;
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i != X.length; i++)
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            X[i] = 0;
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected void processBlock()
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // expand 16 word block into 64 word blocks.
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int t = 16; t <= 63; t++)
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            X[t] = Theta1(X[t - 2]) + X[t - 7] + Theta0(X[t - 15]) + X[t - 16];
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // set up working variables.
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     a = H1;
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     b = H2;
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     c = H3;
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     d = H4;
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     e = H5;
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     f = H6;
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     g = H7;
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     h = H8;
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int t = 0;
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for(int i = 0; i < 8; i ++)
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // t = 8 * i
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            h += Sum1(e) + Ch(e, f, g) + K[t] + X[t++];
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            d += h;
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            h += Sum0(a) + Maj(a, b, c);
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // t = 8 * i + 1
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            g += Sum1(d) + Ch(d, e, f) + K[t] + X[t++];
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c += g;
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            g += Sum0(h) + Maj(h, a, b);
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // t = 8 * i + 2
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            f += Sum1(c) + Ch(c, d, e) + K[t] + X[t++];
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            b += f;
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            f += Sum0(g) + Maj(g, h, a);
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // t = 8 * i + 3
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            e += Sum1(b) + Ch(b, c, d) + K[t] + X[t++];
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            a += e;
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            e += Sum0(f) + Maj(f, g, h);
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // t = 8 * i + 4
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            d += Sum1(a) + Ch(a, b, c) + K[t] + X[t++];
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            h += d;
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            d += Sum0(e) + Maj(e, f, g);
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // t = 8 * i + 5
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c += Sum1(h) + Ch(h, a, b) + K[t] + X[t++];
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            g += c;
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c += Sum0(d) + Maj(d, e, f);
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // t = 8 * i + 6
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            b += Sum1(g) + Ch(g, h, a) + K[t] + X[t++];
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            f += b;
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            b += Sum0(c) + Maj(c, d, e);
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // t = 8 * i + 7
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            a += Sum1(f) + Ch(f, g, h) + K[t] + X[t++];
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            e += a;
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            a += Sum0(b) + Maj(b, c, d);
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H1 += a;
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H2 += b;
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H3 += c;
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H4 += d;
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H5 += e;
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H6 += f;
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H7 += g;
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        H8 += h;
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // reset the offset and clean out the word buffer.
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        xOff = 0;
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < 16; i++)
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            X[i] = 0;
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* SHA-256 functions */
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private int Ch(
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int    x,
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int    y,
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int    z)
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (x & y) ^ ((~x) & z);
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private int Maj(
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int    x,
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int    y,
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int    z)
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (x & y) ^ (x & z) ^ (y & z);
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private int Sum0(
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int    x)
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return ((x >>> 2) | (x << 30)) ^ ((x >>> 13) | (x << 19)) ^ ((x >>> 22) | (x << 10));
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private int Sum1(
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int    x)
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return ((x >>> 6) | (x << 26)) ^ ((x >>> 11) | (x << 21)) ^ ((x >>> 25) | (x << 7));
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private int Theta0(
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int    x)
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return ((x >>> 7) | (x << 25)) ^ ((x >>> 18) | (x << 14)) ^ (x >>> 3);
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private int Theta1(
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int    x)
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return ((x >>> 17) | (x << 15)) ^ ((x >>> 19) | (x << 13)) ^ (x >>> 10);
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* SHA-256 Constants
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (represent the first 32 bits of the fractional parts of the
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * cube roots of the first sixty-four prime numbers)
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static final int K[] = {
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    };
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
292