package com.ripple.core.coretypes.hash;
import com.ripple.core.coretypes.hash.prefixes.Prefix;
import com.ripple.core.serialized.BytesSink;
import com.ripple.core.serialized.SerializedType;
import java.security.MessageDigest;
public class HalfSha512 implements BytesSink {
MessageDigest messageDigest;
public HalfSha512() {
try {
messageDigest = MessageDigest.getInstance("SHA-512", "RBC");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static HalfSha512 prefixed256(Prefix bytes) {
HalfSha512 halfSha512 = new HalfSha512();
halfSha512.update(bytes);
return halfSha512;
}
public void update(byte[] bytes) {
messageDigest.update(bytes);
}
public void update(Hash256 hash) {
messageDigest.update(hash.bytes());
}
public MessageDigest digest() {
return messageDigest;
}
public Hash256 finish() {
byte[] half = digestBytes();
return new Hash256(half);
}
private byte[] digestBytes() {
byte[] digest = messageDigest.digest();
byte[] half = new byte[32];
System.arraycopy(digest, 0, half, 0, 32);
return half;
}
private Hash256 makeHash(byte[] half) {
return new Hash256(half);
}
@Override
public void add(byte aByte) {
messageDigest.update(aByte);
}
@Override
public void add(byte[] bytes) {
messageDigest.update(bytes);
}
public void update(Prefix prefix) {
messageDigest.update(prefix.bytes());
}
public HalfSha512 add(SerializedType st) {
st.toBytesSink(this);
return this;
}
}