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