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 }