View Javadoc
1   package civitas.crypto.messagedigest;
2   
3   import java.security.MessageDigest;
4   import java.security.NoSuchAlgorithmException;
5   import java.util.Arrays;
6   import java.util.List;
7   import java.util.Objects;
8   import java.util.stream.Stream;
9   
10  import org.springframework.stereotype.Service;
11  
12  import civitas.crypto.Constants;
13  import civitas.crypto.CryptoError;
14  import civitas.util.CivitasBigInteger;
15  import civitas.util.CivitasBigIntegerFactory;
16  import civitas.util.CivitasBigintegerBase;
17  
18  @Service
19  public class CryptoHash implements Constants {
20  
21  	MessageDigest messageDigest;
22  
23  	CryptoHash() {
24  		try {
25  			messageDigest = MessageDigest.getInstance(MESSAGE_DIGEST_ALG);
26  		} catch (NoSuchAlgorithmException e) {
27  			throw new CryptoError(e);
28  		}
29  	}
30  
31  	public byte[] apply(final List<CivitasBigInteger> list) {
32  		return apply(list.stream()
33  				.filter(Objects::nonNull)
34  				.map(CivitasBigintegerBase::toByteArray)
35  				.toList()
36  				.toArray(new byte[0][0]));
37  	}
38  
39  	public CivitasBigInteger apply(
40  			final CivitasBigInteger a, final CivitasBigInteger b, final CivitasBigInteger c, final byte[] d) {
41  		Stream<byte[]> bigintStream =
42  				Stream.of(a, b, c).filter(Objects::nonNull).map(CivitasBigintegerBase::toByteArray);
43  		List<byte[]> nums = Stream.concat(bigintStream, Stream.of(d)).toList();
44  		return CivitasBigIntegerFactory.obtain(apply(nums.toArray(new byte[0][0])));
45  	}
46  
47  	public byte[] apply(final byte[]... bytearrays) {
48  		Arrays.asList(bytearrays).forEach(x -> {
49  			if (null != x) {
50  				messageDigest.update(x);
51  			}
52  		});
53  		return messageDigest.digest();
54  	}
55  }