1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.crypto.digests;
2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
3a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstromimport org.bouncycastle.util.Memoable;
4d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Rootimport org.bouncycastle.util.Pack;
5c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
6b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
7b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam/**
8b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * FIPS 180-2 implementation of SHA-512.
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 SHA512Digest
19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    extends LongDigest
20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{
21b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private static final int    DIGEST_LENGTH = 64;
22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * Standard constructor
25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public SHA512Digest()
27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
30b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
31b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * Copy constructor.  This will copy the state of the provided
32b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * message digest.
33b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
34b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public SHA512Digest(SHA512Digest t)
35b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
36b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        super(t);
37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
39d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root    public SHA512Digest(byte[] encodedState)
40d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root    {
41d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root        restoreState(encodedState);
42d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root    }
43d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root
44b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public String getAlgorithmName()
45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return "SHA-512";
47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public int getDigestSize()
50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return DIGEST_LENGTH;
52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public int doFinal(
55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        byte[]  out,
56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        int     outOff)
57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
58b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        finish();
59b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
60c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        Pack.longToBigEndian(H1, out, outOff);
61c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        Pack.longToBigEndian(H2, out, outOff + 8);
62c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        Pack.longToBigEndian(H3, out, outOff + 16);
63c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        Pack.longToBigEndian(H4, out, outOff + 24);
64c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        Pack.longToBigEndian(H5, out, outOff + 32);
65c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        Pack.longToBigEndian(H6, out, outOff + 40);
66c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        Pack.longToBigEndian(H7, out, outOff + 48);
67c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        Pack.longToBigEndian(H8, out, outOff + 56);
68b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
69b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        reset();
70b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return DIGEST_LENGTH;
72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * reset the chaining variables
76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public void reset()
78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        super.reset();
80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        /* SHA-512 initial hash value
82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam         * The first 64 bits of the fractional parts of the square roots
83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam         * of the first eight prime numbers
84b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam         */
85b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        H1 = 0x6a09e667f3bcc908L;
86b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        H2 = 0xbb67ae8584caa73bL;
87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        H3 = 0x3c6ef372fe94f82bL;
88b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        H4 = 0xa54ff53a5f1d36f1L;
89b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        H5 = 0x510e527fade682d1L;
90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        H6 = 0x9b05688c2b3e6c1fL;
91b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        H7 = 0x1f83d9abfb41bd6bL;
92b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        H8 = 0x5be0cd19137e2179L;
93b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
94a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
95a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    public Memoable copy()
96a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    {
97a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        return new SHA512Digest(this);
98a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    }
99a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
100a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    public void reset(Memoable other)
101a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    {
102a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        SHA512Digest d = (SHA512Digest)other;
103a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
104a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        copyIn(d);
105a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    }
106d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root
107d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root    public byte[] getEncodedState()
108d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root    {
109d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root        byte[] encoded = new byte[getEncodedStateSize()];
110d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root        super.populateState(encoded);
111d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root        return encoded;
112d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root    }
113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam}
114b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
115