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