01: package org.bouncycastle.crypto.digests;
02:
03: /**
04: * FIPS 180-2 implementation of SHA-512.
05: *
06: * <pre>
07: * block word digest
08: * SHA-1 512 32 160
09: * SHA-256 512 32 256
10: * SHA-384 1024 64 384
11: * SHA-512 1024 64 512
12: * </pre>
13: */
14: public class SHA512Digest extends LongDigest {
15: private static final int DIGEST_LENGTH = 64;
16:
17: /**
18: * Standard constructor
19: */
20: public SHA512Digest() {
21: }
22:
23: /**
24: * Copy constructor. This will copy the state of the provided
25: * message digest.
26: */
27: public SHA512Digest(SHA512Digest t) {
28: super (t);
29: }
30:
31: public String getAlgorithmName() {
32: return "SHA-512";
33: }
34:
35: public int getDigestSize() {
36: return DIGEST_LENGTH;
37: }
38:
39: public int doFinal(byte[] out, int outOff) {
40: finish();
41:
42: unpackWord(H1, out, outOff);
43: unpackWord(H2, out, outOff + 8);
44: unpackWord(H3, out, outOff + 16);
45: unpackWord(H4, out, outOff + 24);
46: unpackWord(H5, out, outOff + 32);
47: unpackWord(H6, out, outOff + 40);
48: unpackWord(H7, out, outOff + 48);
49: unpackWord(H8, out, outOff + 56);
50:
51: reset();
52:
53: return DIGEST_LENGTH;
54: }
55:
56: /**
57: * reset the chaining variables
58: */
59: public void reset() {
60: super .reset();
61:
62: /* SHA-512 initial hash value
63: * The first 64 bits of the fractional parts of the square roots
64: * of the first eight prime numbers
65: */
66: H1 = 0x6a09e667f3bcc908L;
67: H2 = 0xbb67ae8584caa73bL;
68: H3 = 0x3c6ef372fe94f82bL;
69: H4 = 0xa54ff53a5f1d36f1L;
70: H5 = 0x510e527fade682d1L;
71: H6 = 0x9b05688c2b3e6c1fL;
72: H7 = 0x1f83d9abfb41bd6bL;
73: H8 = 0x5be0cd19137e2179L;
74: }
75: }
|