Skip to content

Commit c0d30eb

Browse files
authored
chore: Introduced CryptoUtils (#18929)
Signed-off-by: Michael Heinrichs <[email protected]>
1 parent 842eacf commit c0d30eb

File tree

14 files changed

+61
-57
lines changed

14 files changed

+61
-57
lines changed

hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/standalone/TransactionExecutorsTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@
117117
import java.util.function.Function;
118118
import java.util.stream.StreamSupport;
119119
import org.apache.tuweni.bytes.Bytes32;
120-
import org.hiero.base.crypto.internal.CryptoUtils;
120+
import org.hiero.base.crypto.internal.DetRandomProvider;
121121
import org.hiero.consensus.model.node.NodeId;
122122
import org.hyperledger.besu.evm.EVM;
123123
import org.hyperledger.besu.evm.frame.MessageFrame;
@@ -582,7 +582,7 @@ private Bytes resourceAsBytes(@NonNull final String loc) {
582582

583583
public static X509Certificate randomX509Certificate() {
584584
try {
585-
final SecureRandom secureRandom = CryptoUtils.getDetRandom();
585+
final SecureRandom secureRandom = DetRandomProvider.getDetRandom();
586586

587587
final KeyPairGenerator rsaKeyGen = KeyPairGenerator.getInstance("RSA");
588588
rsaKeyGen.initialize(3072, secureRandom);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
package org.hiero.base.crypto;
3+
4+
import edu.umd.cs.findbugs.annotations.Nullable;
5+
import java.security.cert.Certificate;
6+
import java.security.cert.CertificateEncodingException;
7+
8+
/**
9+
* Utility class for cryptographic operations.
10+
*/
11+
public class CryptoUtils {
12+
13+
private CryptoUtils() {}
14+
15+
/**
16+
* Check if a certificate is valid. A certificate is valid if it is not null, has a public key, and can be encoded.
17+
*
18+
* @param certificate the certificate to check
19+
* @return true if the certificate is valid, false otherwise
20+
*/
21+
public static boolean checkCertificate(@Nullable final Certificate certificate) {
22+
if (certificate == null) {
23+
return false;
24+
}
25+
if (certificate.getPublicKey() == null) {
26+
return false;
27+
}
28+
try {
29+
if (certificate.getEncoded().length == 0) {
30+
return false;
31+
}
32+
} catch (final CertificateEncodingException e) {
33+
return false;
34+
}
35+
return true;
36+
}
37+
}

platform-sdk/base-crypto/src/main/java/org/hiero/base/crypto/internal/CryptoUtils.java renamed to platform-sdk/base-crypto/src/main/java/org/hiero/base/crypto/internal/DetRandomProvider.java

+2-12
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,16 @@
11
// SPDX-License-Identifier: Apache-2.0
22
package org.hiero.base.crypto.internal;
33

4-
import java.security.MessageDigest;
54
import java.security.NoSuchAlgorithmException;
65
import java.security.NoSuchProviderException;
76
import java.security.SecureRandom;
87

9-
public abstract class CryptoUtils {
10-
/** the type of hash to use */
11-
private static final String HASH_TYPE = "SHA-384";
8+
public class DetRandomProvider {
129

1310
private static final String PRNG_TYPE = "SHA1PRNG";
1411
private static final String PRNG_PROVIDER = "SUN";
1512

16-
// return the MessageDigest for the type of hash function used throughout the code
17-
public static MessageDigest getMessageDigest() {
18-
try {
19-
return MessageDigest.getInstance(HASH_TYPE);
20-
} catch (NoSuchAlgorithmException e) {
21-
throw new RuntimeException(e);
22-
}
23-
}
13+
private DetRandomProvider() {}
2414

2515
/**
2616
* Create an instance of the default deterministic {@link SecureRandom}

platform-sdk/base-crypto/src/test/java/org/hiero/base/crypto/SerializablePublicKeyTests.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import java.security.NoSuchAlgorithmException;
1111
import java.security.NoSuchProviderException;
1212
import java.util.stream.Stream;
13-
import org.hiero.base.crypto.internal.CryptoUtils;
13+
import org.hiero.base.crypto.internal.DetRandomProvider;
1414
import org.junit.jupiter.params.ParameterizedTest;
1515
import org.junit.jupiter.params.provider.Arguments;
1616
import org.junit.jupiter.params.provider.MethodSource;
@@ -26,7 +26,7 @@ static Stream<Arguments> keyTypeProvider() {
2626
void serializeDeserialize(String keyType, int keySize, boolean writeClassId)
2727
throws NoSuchAlgorithmException, NoSuchProviderException, IOException {
2828
KeyPairGenerator keyGen = KeyPairGenerator.getInstance(keyType);
29-
keyGen.initialize(keySize, CryptoUtils.getDetRandom());
29+
keyGen.initialize(keySize, DetRandomProvider.getDetRandom());
3030
KeyPair keyPair = keyGen.generateKeyPair();
3131

3232
SerializablePublicKey original = new SerializablePublicKey(keyPair.getPublic());

platform-sdk/swirlds-common/src/testFixtures/java/com/swirlds/common/test/fixtures/stream/StreamFileSigner.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
package com.swirlds.common.test.fixtures.stream;
33

44
import static com.swirlds.logging.legacy.LogMarker.EXCEPTION;
5-
import static org.hiero.base.crypto.internal.CryptoUtils.getDetRandom;
5+
import static org.hiero.base.crypto.internal.DetRandomProvider.getDetRandom;
66
import static org.hiero.base.utility.CommonUtils.hex;
77

88
import com.swirlds.common.stream.Signer;

platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/Utilities.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import com.hedera.hapi.node.state.roster.Roster;
55
import com.hedera.hapi.node.state.roster.RosterEntry;
66
import com.hedera.pbj.runtime.io.buffer.Bytes;
7-
import com.swirlds.platform.crypto.CryptoStatic;
87
import com.swirlds.platform.internal.Deserializer;
98
import com.swirlds.platform.internal.Serializer;
109
import com.swirlds.platform.network.PeerInfo;
@@ -19,6 +18,7 @@
1918
import java.util.function.Supplier;
2019
import org.apache.logging.log4j.LogManager;
2120
import org.apache.logging.log4j.Logger;
21+
import org.hiero.base.crypto.CryptoUtils;
2222
import org.hiero.base.io.streams.SerializableDataInputStream;
2323
import org.hiero.base.io.streams.SerializableDataOutputStream;
2424
import org.hiero.consensus.model.node.NodeId;
@@ -364,7 +364,7 @@ public static boolean hasAnyCauseSuppliedType(
364364
.filter(entry -> entry.nodeId() != selfId.id())
365365
// Only include peers with valid gossip certificates
366366
// https://github.com/hashgraph/hedera-services/issues/16648
367-
.filter(entry -> CryptoStatic.checkCertificate((RosterUtils.fetchGossipCaCertificate(entry))))
367+
.filter(entry -> CryptoUtils.checkCertificate((RosterUtils.fetchGossipCaCertificate(entry))))
368368
.map(Utilities::toPeerInfo)
369369
.toList();
370370
}

platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/builder/PlatformBuilder.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import org.apache.logging.log4j.LogManager;
5858
import org.apache.logging.log4j.Logger;
5959
import org.hiero.base.concurrent.ExecutorFactory;
60+
import org.hiero.base.crypto.CryptoUtils;
6061
import org.hiero.base.crypto.Signature;
6162
import org.hiero.consensus.config.EventConfig;
6263
import org.hiero.consensus.event.creator.impl.pool.TransactionPoolNexus;
@@ -318,7 +319,7 @@ public PlatformBuilder withKeysAndCerts(@NonNull final KeysAndCerts keysAndCerts
318319
this.keysAndCerts = Objects.requireNonNull(keysAndCerts);
319320
// Ensure that the platform has a valid signing cert that matches the signing private key.
320321
// https://github.com/hashgraph/hedera-services/issues/16648
321-
if (!CryptoStatic.checkCertificate(keysAndCerts.sigCert())) {
322+
if (!CryptoUtils.checkCertificate(keysAndCerts.sigCert())) {
322323
throw new IllegalStateException("Starting the platform requires a signing cert.");
323324
}
324325
final PlatformSigner platformSigner = new PlatformSigner(keysAndCerts);

platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/crypto/CryptoStatic.java

-24
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
import java.security.SignatureException;
4545
import java.security.UnrecoverableKeyException;
4646
import java.security.cert.Certificate;
47-
import java.security.cert.CertificateEncodingException;
4847
import java.security.cert.CertificateException;
4948
import java.security.cert.CertificateFactory;
5049
import java.security.cert.X509Certificate;
@@ -652,27 +651,4 @@ public static Map<NodeId, KeysAndCerts> initNodeSecurity(
652651
}
653652
return store;
654653
}
655-
656-
/**
657-
* Check if a certificate is valid. A certificate is valid if it is not null, has a public key, and can be encoded.
658-
*
659-
* @param certificate the certificate to check
660-
* @return true if the certificate is valid, false otherwise
661-
*/
662-
public static boolean checkCertificate(@Nullable final Certificate certificate) {
663-
if (certificate == null) {
664-
return false;
665-
}
666-
if (certificate.getPublicKey() == null) {
667-
return false;
668-
}
669-
try {
670-
if (certificate.getEncoded().length == 0) {
671-
return false;
672-
}
673-
} catch (final CertificateEncodingException e) {
674-
return false;
675-
}
676-
return true;
677-
}
678654
}

platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/crypto/KeysAndCerts.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import java.security.UnrecoverableKeyException;
1616
import java.security.cert.Certificate;
1717
import java.security.cert.X509Certificate;
18-
import org.hiero.base.crypto.internal.CryptoUtils;
18+
import org.hiero.base.crypto.internal.DetRandomProvider;
1919
import org.hiero.consensus.model.node.NodeId;
2020

2121
/**
@@ -135,8 +135,8 @@ public static KeysAndCerts generate(
135135
sigKeyGen = KeyPairGenerator.getInstance(CryptoConstants.SIG_TYPE1, CryptoConstants.SIG_PROVIDER);
136136
agrKeyGen = KeyPairGenerator.getInstance(CryptoConstants.AGR_TYPE, CryptoConstants.AGR_PROVIDER);
137137

138-
sigDetRandom = CryptoUtils.getDetRandom(); // deterministic, not shared
139-
agrDetRandom = CryptoUtils.getDetRandom(); // deterministic, not shared
138+
sigDetRandom = DetRandomProvider.getDetRandom(); // deterministic, not shared
139+
agrDetRandom = DetRandomProvider.getDetRandom(); // deterministic, not shared
140140

141141
sigDetRandom.setSeed(masterKey);
142142
sigDetRandom.setSeed(swirldId);

platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/gossip/SyncGossipModular.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import com.swirlds.component.framework.wires.output.StandardOutputWire;
1717
import com.swirlds.platform.Utilities;
1818
import com.swirlds.platform.config.StateConfig;
19-
import com.swirlds.platform.crypto.CryptoStatic;
2019
import com.swirlds.platform.crypto.KeysAndCerts;
2120
import com.swirlds.platform.gossip.sync.SyncManagerImpl;
2221
import com.swirlds.platform.metrics.ReconnectMetrics;
@@ -55,6 +54,7 @@
5554
import java.util.stream.Collectors;
5655
import org.apache.logging.log4j.LogManager;
5756
import org.apache.logging.log4j.Logger;
57+
import org.hiero.base.crypto.CryptoUtils;
5858
import org.hiero.consensus.gossip.FallenBehindManager;
5959
import org.hiero.consensus.model.event.PlatformEvent;
6060
import org.hiero.consensus.model.hashgraph.EventWindow;
@@ -112,7 +112,7 @@ public SyncGossipModular(
112112
final RosterEntry selfEntry = RosterUtils.getRosterEntry(roster, selfId.id());
113113
final X509Certificate selfCert = RosterUtils.fetchGossipCaCertificate(selfEntry);
114114
final List<PeerInfo> peers;
115-
if (!CryptoStatic.checkCertificate(selfCert)) {
115+
if (!CryptoUtils.checkCertificate(selfCert)) {
116116
// Do not make peer connections if the self node does not have a valid signing certificate in the roster.
117117
// https://github.com/hashgraph/hedera-services/issues/16648
118118
logger.error(

platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/system/address/Address.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import static com.swirlds.common.utility.NonCryptographicHashing.hash32;
55

66
import com.swirlds.base.utility.ToStringBuilder;
7-
import com.swirlds.platform.crypto.CryptoStatic;
87
import com.swirlds.platform.crypto.SerializableX509Certificate;
98
import edu.umd.cs.findbugs.annotations.NonNull;
109
import edu.umd.cs.findbugs.annotations.Nullable;
@@ -14,6 +13,7 @@
1413
import java.security.cert.X509Certificate;
1514
import java.util.Arrays;
1615
import java.util.Objects;
16+
import org.hiero.base.crypto.CryptoUtils;
1717
import org.hiero.base.crypto.SerializablePublicKey;
1818
import org.hiero.base.io.SelfSerializable;
1919
import org.hiero.base.io.streams.SerializableDataInputStream;
@@ -641,7 +641,7 @@ private SerializableX509Certificate checkCertificateEncoding(
641641
if (certificate == null) {
642642
return null;
643643
}
644-
return CryptoStatic.checkCertificate(certificate.getCertificate()) ? certificate : null;
644+
return CryptoUtils.checkCertificate(certificate.getCertificate()) ? certificate : null;
645645
}
646646

647647
/**

platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/crypto/SerializableX509CertificateTests.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import java.security.cert.CertificateEncodingException;
2020
import java.security.cert.X509Certificate;
2121
import java.util.Random;
22-
import org.hiero.base.crypto.internal.CryptoUtils;
22+
import org.hiero.base.crypto.internal.DetRandomProvider;
2323
import org.junit.jupiter.api.DisplayName;
2424
import org.junit.jupiter.api.Test;
2525

@@ -37,7 +37,7 @@ void serializeDeserialize()
3737
final int ecKeySize = 384;
3838

3939
final Random nonSecureRandom = getRandomPrintSeed();
40-
final SecureRandom secureRandom = CryptoUtils.getDetRandom();
40+
final SecureRandom secureRandom = DetRandomProvider.getDetRandom();
4141
secureRandom.setSeed(nonSecureRandom.nextLong());
4242

4343
// Render key pairs.

platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/network/NetworkPeerIdentifierTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import java.util.Set;
3434
import java.util.regex.Matcher;
3535
import java.util.regex.Pattern;
36-
import org.hiero.base.crypto.internal.CryptoUtils;
36+
import org.hiero.base.crypto.internal.DetRandomProvider;
3737
import org.hiero.consensus.model.node.NodeId;
3838
import org.junit.jupiter.api.Assertions;
3939
import org.junit.jupiter.api.BeforeEach;
@@ -137,7 +137,7 @@ void testReturnsIntendedPeerForMainnet() throws KeyStoreException {
137137
void testIdentifyTlsPeerReturnsNull()
138138
throws NoSuchAlgorithmException, NoSuchProviderException, KeyGeneratingException {
139139

140-
final SecureRandom secureRandom = CryptoUtils.getDetRandom();
140+
final SecureRandom secureRandom = DetRandomProvider.getDetRandom();
141141

142142
final KeyPairGenerator rsaKeyGen = KeyPairGenerator.getInstance("RSA");
143143
rsaKeyGen.initialize(3072, secureRandom);

platform-sdk/swirlds-platform-core/src/test/java/com/swirlds/platform/roster/RosterRetrieverTests.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import java.security.cert.X509Certificate;
2828
import java.util.List;
2929
import java.util.stream.Stream;
30-
import org.hiero.base.crypto.internal.CryptoUtils;
30+
import org.hiero.base.crypto.internal.DetRandomProvider;
3131
import org.junit.jupiter.api.BeforeEach;
3232
import org.junit.jupiter.api.Test;
3333
import org.junit.jupiter.api.extension.ExtendWith;
@@ -201,7 +201,7 @@ void testRetrieveActiveOrGenesisActiveAddressBookRoster() {
201201

202202
public static X509Certificate randomX509Certificate() {
203203
try {
204-
final SecureRandom secureRandom = CryptoUtils.getDetRandom();
204+
final SecureRandom secureRandom = DetRandomProvider.getDetRandom();
205205

206206
final KeyPairGenerator rsaKeyGen = KeyPairGenerator.getInstance("RSA");
207207
rsaKeyGen.initialize(3072, secureRandom);

0 commit comments

Comments
 (0)