Skip to content
This repository was archived by the owner on Apr 22, 2025. It is now read-only.

Commit 1ceab9a

Browse files
committed
FAB-2564 crypto configuration
PS 5 Addressed Jim's review. Change-Id: Iabc0f86962e63f3a0828e5399f6a5f0e322e80c0 Signed-off-by: rickr <cr22rc@gmail.com>
1 parent 9282be9 commit 1ceab9a

File tree

20 files changed

+885
-476
lines changed

20 files changed

+885
-476
lines changed

src/main/java/org/hyperledger/fabric/sdk/HFClient.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,10 @@ public class HFClient {
4848

4949
private CryptoSuite cryptoSuite;
5050

51+
5152
static {
5253

54+
5355
if (null == System.getProperty("org.hyperledger.fabric.sdk.logGRPC")) {
5456
// Turn this off by default!
5557
Logger.getLogger("io.netty").setLevel(Level.OFF);
@@ -87,16 +89,26 @@ public CryptoSuite getCryptoSuite() {
8789
}
8890

8991
public void setCryptoSuite(CryptoSuite cryptoSuite) throws CryptoException, InvalidArgumentException {
90-
if (this.cryptoSuite != null) {
92+
if (null == cryptoSuite) {
93+
throw new InvalidArgumentException("CryptoSuite paramter is null.");
94+
}
95+
if (this.cryptoSuite != null && cryptoSuite != this.cryptoSuite) {
9196
throw new InvalidArgumentException("CryptoSuite may only be set once.");
9297

9398
}
99+
// if (cryptoSuiteFactory == null) {
100+
// cryptoSuiteFactory = cryptoSuite.getCryptoSuiteFactory();
101+
// } else {
102+
// if (cryptoSuiteFactory != cryptoSuite.getCryptoSuiteFactory()) {
103+
// throw new InvalidArgumentException("CryptoSuite is not derivied from cryptosuite factory");
104+
// }
105+
// }
94106

95-
cryptoSuite.init();
96107
this.cryptoSuite = cryptoSuite;
97108

98109
}
99110

111+
100112
/**
101113
* createNewInstance create a new instance of the HFClient
102114
*
@@ -592,6 +604,7 @@ private void clientCheck() throws InvalidArgumentException {
592604
throw new InvalidArgumentException("No cryptoSuite has been set.");
593605
}
594606

607+
595608
userContextCheck(userContext);
596609

597610
}

src/main/java/org/hyperledger/fabric/sdk/SDKUtils.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,21 @@ private SDKUtils() {
4747
* @throws IOException
4848
* @throws InvalidArgumentException
4949
*/
50-
public static byte[] calculateBlockHash(long blockNumber, byte[] previousHash, byte[] dataHash) throws IOException, InvalidArgumentException {
50+
public static byte[] calculateBlockHash(HFClient client, long blockNumber, byte[] previousHash, byte[] dataHash) throws IOException, InvalidArgumentException {
5151

5252
if (previousHash == null) {
5353
throw new InvalidArgumentException("previousHash parameter is null.");
5454
}
5555
if (dataHash == null) {
5656
throw new InvalidArgumentException("dataHash parameter is null.");
5757
}
58+
if (null == client) {
59+
throw new InvalidArgumentException("client parameter is null.");
60+
}
5861

59-
if (null == suite) {
60-
suite = CryptoSuite.Factory.getCryptoSuite();
62+
CryptoSuite cryptoSuite = client.getCryptoSuite();
63+
if (null == client) {
64+
throw new InvalidArgumentException("Client crypto suite has not been set.");
6165
}
6266

6367
ByteArrayOutputStream s = new ByteArrayOutputStream();
@@ -66,7 +70,7 @@ public static byte[] calculateBlockHash(long blockNumber, byte[] previousHash, b
6670
seq.addObject(new DEROctetString(previousHash));
6771
seq.addObject(new DEROctetString(dataHash));
6872
seq.close();
69-
return suite.hash(s.toByteArray());
73+
return cryptoSuite.hash(s.toByteArray());
7074

7175
}
7276

src/main/java/org/hyperledger/fabric/sdk/helper/Config.java

Lines changed: 114 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,17 @@
1616
import java.io.File;
1717
import java.io.FileInputStream;
1818
import java.io.IOException;
19+
import java.util.Collections;
20+
import java.util.HashMap;
21+
import java.util.Map;
1922
import java.util.Properties;
2023

2124
import org.apache.commons.logging.Log;
2225
import org.apache.commons.logging.LogFactory;
2326
import org.apache.log4j.Level;
27+
import org.bouncycastle.jce.provider.BouncyCastleProvider;
28+
29+
import static java.lang.String.format;
2430

2531
/**
2632
* Config allows for a global config of the toolkit. Central location for all
@@ -37,28 +43,40 @@ public class Config {
3743

3844
private static final String DEFAULT_CONFIG = "config.properties";
3945
public static final String ORG_HYPERLEDGER_FABRIC_SDK_CONFIGURATION = "org.hyperledger.fabric.sdk.configuration";
40-
public static final String SECURITY_LEVEL = "org.hyperledger.fabric.sdk.security_level";
41-
public static final String HASH_ALGORITHM = "org.hyperledger.fabric.sdk.hash_algorithm";
46+
/**
47+
* Timeout settings
48+
**/
4249
public static final String PROPOSAL_WAIT_TIME = "org.hyperledger.fabric.sdk.proposal.wait.time";
4350
public static final String CHANNEL_CONFIG_WAIT_TIME = "org.hyperledger.fabric.sdk.channelconfig.wait_time";
4451
public static final String ORDERER_RETRY_WAIT_TIME = "org.hyperledger.fabric.sdk.orderer_retry.wait_time";
4552
public static final String ORDERER_WAIT_TIME = "org.hyperledger.fabric.sdk.orderer.ordererWaitTimeMilliSecs";
4653
public static final String EVENTHUB_CONNECTION_WAIT_TIME = "org.hyperledger.fabric.sdk.eventhub_connection.wait_time";
47-
public static final String PROPOSAL_CONSISTENCY_VALIDATION = "org.hyperledger.fabric.sdk.proposal.consistency_validation";
4854
public static final String GENESISBLOCK_WAIT_TIME = "org.hyperledger.fabric.sdk.channel.genesisblock_wait_time";
55+
/**
56+
* Crypto configuration settings
57+
**/
58+
public static final String DEFAULT_CRYPTO_SUITE_FACTORY = "org.hyperledger.fabric.sdk.crypto.default_crypto_suite_factory";
59+
public static final String SECURITY_LEVEL = "org.hyperledger.fabric.sdk.security_level";
60+
public static final String SECURITY_PROVIDER_CLASS_NAME = "org.hyperledger.fabric.sdk.security_provider_class_name";
61+
public static final String SECURITY_CURVE_MAPPING = "org.hyperledger.fabric.sdk.security_curve_mapping";
62+
public static final String HASH_ALGORITHM = "org.hyperledger.fabric.sdk.hash_algorithm";
4963
public static final String ASYMMETRIC_KEY_TYPE = "org.hyperledger.fabric.sdk.crypto.asymmetric_key_type";
50-
public static final String KEY_AGREEMENT_ALGORITHM = "org.hyperledger.fabric.sdk.crypto.key_agreement_algorithm";
51-
public static final String SYMMETRIC_KEY_TYPE = "org.hyperledger.fabric.sdk.crypto.symmetric_key_type";
52-
public static final String SYMMETRIC_KEY_BYTE_COUNT = "org.hyperledger.fabric.sdk.crypto.symmetric_key_byte_count";
53-
public static final String SYMMETRIC_ALGORITHM = "org.hyperledger.fabric.sdk.crypto.symmetric_algorithm";
54-
public static final String MAC_KEY_BYTE_COUNT = "org.hyperledger.fabric.sdk.crypto.mac_key_byte_count";
64+
5565
public static final String CERTIFICATE_FORMAT = "org.hyperledger.fabric.sdk.crypto.certificate_format";
5666
public static final String SIGNATURE_ALGORITHM = "org.hyperledger.fabric.sdk.crypto.default_signature_algorithm";
67+
/**
68+
* Logging settings
69+
**/
5770
public static final String MAX_LOG_STRING_LENGTH = "org.hyperledger.fabric.sdk.log.stringlengthmax";
5871
public static final String EXTRALOGLEVEL = "org.hyperledger.fabric.sdk.log.extraloglevel";
5972
public static final String LOGGERLEVEL = "org.hyperledger.fabric.sdk.loglevel"; // ORG_HYPERLEDGER_FABRIC_SDK_LOGLEVEL=TRACE,DEBUG
6073
public static final String DIAGNOTISTIC_FILE_DIRECTORY = "org.hyperledger.fabric.sdk.diagnosticFileDir"; //ORG_HYPERLEDGER_FABRIC_SDK_DIAGNOSTICFILEDIR
6174

75+
/**
76+
* Miscellaneous settings
77+
**/
78+
public static final String PROPOSAL_CONSISTENCY_VALIDATION = "org.hyperledger.fabric.sdk.proposal.consistency_validation";
79+
6280
private static Config config;
6381
private static final Properties sdkProperties = new Properties();
6482

@@ -69,39 +87,51 @@ private Config() {
6987
try {
7088
loadFile = new File(System.getProperty(ORG_HYPERLEDGER_FABRIC_SDK_CONFIGURATION, DEFAULT_CONFIG))
7189
.getAbsoluteFile();
72-
logger.debug(String.format("Loading configuration from %s and it is present: %b", loadFile.toString(),
90+
logger.debug(format("Loading configuration from %s and it is present: %b", loadFile.toString(),
7391
loadFile.exists()));
7492
configProps = new FileInputStream(loadFile);
7593
sdkProperties.load(configProps);
7694

7795
} catch (IOException e) {
78-
logger.warn(String.format("Failed to load any configuration from: %s. Using toolkit defaults",
96+
logger.warn(format("Failed to load any configuration from: %s. Using toolkit defaults",
7997
DEFAULT_CONFIG));
8098
} finally {
8199

82100
// Default values
101+
/**
102+
* Timeout settings
103+
**/
104+
defaultProperty(PROPOSAL_WAIT_TIME, "20000");
105+
defaultProperty(CHANNEL_CONFIG_WAIT_TIME, "15000");
106+
defaultProperty(ORDERER_RETRY_WAIT_TIME, "200");
107+
defaultProperty(ORDERER_WAIT_TIME, "3000");
108+
defaultProperty(EVENTHUB_CONNECTION_WAIT_TIME, "1000");
109+
defaultProperty(GENESISBLOCK_WAIT_TIME, "5000");
110+
111+
/**
112+
* Crypto configuration settings
113+
**/
114+
defaultProperty(DEFAULT_CRYPTO_SUITE_FACTORY, "org.hyperledger.fabric.sdk.security.HLSDKJCryptoSuiteFactory");
115+
defaultProperty(SECURITY_LEVEL, "256");
116+
defaultProperty(SECURITY_PROVIDER_CLASS_NAME, BouncyCastleProvider.class.getName());
117+
defaultProperty(SECURITY_CURVE_MAPPING, "256=secp256r1:384=secp384r1");
118+
defaultProperty(HASH_ALGORITHM, "SHA2");
83119
defaultProperty(ASYMMETRIC_KEY_TYPE, "EC");
84-
defaultProperty(KEY_AGREEMENT_ALGORITHM, "ECDH");
85-
defaultProperty(SYMMETRIC_KEY_TYPE, "AES");
86-
defaultProperty(SYMMETRIC_KEY_BYTE_COUNT, "32");
87-
defaultProperty(SYMMETRIC_ALGORITHM, "AES/CFB/NoPadding");
88-
defaultProperty(MAC_KEY_BYTE_COUNT, "32");
120+
89121
defaultProperty(CERTIFICATE_FORMAT, "X.509");
90122
defaultProperty(SIGNATURE_ALGORITHM, "SHA256withECDSA");
91-
defaultProperty(SECURITY_LEVEL, "256");
92-
defaultProperty(HASH_ALGORITHM, "SHA2");
93-
defaultProperty(PROPOSAL_CONSISTENCY_VALIDATION, "true");
94123

95-
defaultProperty(PROPOSAL_WAIT_TIME, "20000");
96-
defaultProperty(GENESISBLOCK_WAIT_TIME, "5000");
124+
/**
125+
* Logging settings
126+
**/
97127
defaultProperty(MAX_LOG_STRING_LENGTH, "64");
98128
defaultProperty(EXTRALOGLEVEL, "0");
99129
defaultProperty(LOGGERLEVEL, null);
100130
defaultProperty(DIAGNOTISTIC_FILE_DIRECTORY, null);
101-
defaultProperty(CHANNEL_CONFIG_WAIT_TIME, "15000");
102-
defaultProperty(ORDERER_RETRY_WAIT_TIME, "200");
103-
defaultProperty(ORDERER_WAIT_TIME, "3000");
104-
defaultProperty(EVENTHUB_CONNECTION_WAIT_TIME, "1000");
131+
/**
132+
* Miscellaneous settings
133+
*/
134+
defaultProperty(PROPOSAL_CONSISTENCY_VALIDATION, "true");
105135

106136
final String inLogLevel = sdkProperties.getProperty(LOGGERLEVEL);
107137

@@ -171,7 +201,7 @@ private String getProperty(String property) {
171201
String ret = sdkProperties.getProperty(property);
172202

173203
if (null == ret) {
174-
logger.warn(String.format("No configuration value found for '%s'", property));
204+
logger.warn(format("No configuration value found for '%s'", property));
175205
}
176206
return ret;
177207
}
@@ -207,6 +237,16 @@ public int getSecurityLevel() {
207237

208238
}
209239

240+
/**
241+
* Get the configured security provider.
242+
* This is the security provider used for the default SDK crypto suite factory.
243+
*
244+
* @return the security provider.
245+
*/
246+
public String getSecurityProviderClassName() {
247+
return getProperty(SECURITY_PROVIDER_CLASS_NAME);
248+
}
249+
210250
/**
211251
* Get the name of the configured hash algorithm, used for digital signatures.
212252
*
@@ -217,6 +257,51 @@ public String getHashAlgorithm() {
217257

218258
}
219259

260+
private Map<Integer, String> curveMapping = null;
261+
262+
/**
263+
* Get a mapping from strength to curve desired.
264+
*
265+
* @return mapping from strength to curve name to use.
266+
*/
267+
public Map<Integer, String> getSecurityCurveMapping() {
268+
269+
if (curveMapping == null) {
270+
271+
curveMapping = parseSecurityCurveMappings(getProperty(SECURITY_CURVE_MAPPING));
272+
}
273+
274+
return Collections.unmodifiableMap(curveMapping);
275+
}
276+
277+
public static Map<Integer, String> parseSecurityCurveMappings(final String property) {
278+
Map<Integer, String> lcurveMapping = new HashMap<>(8);
279+
280+
if (property != null && !property.isEmpty()) { //empty will be caught later.
281+
282+
String[] cmaps = property.split("[ \t]*:[ \t]*");
283+
for (String mape : cmaps) {
284+
285+
String[] ep = mape.split("[ \t]*=[ \t]*");
286+
if (ep.length != 2) {
287+
logger.warn(format("Bad curve mapping for %s in property %s", mape, SECURITY_CURVE_MAPPING));
288+
continue;
289+
}
290+
291+
try {
292+
int parseInt = Integer.parseInt(ep[0]);
293+
lcurveMapping.put(parseInt, ep[1]);
294+
} catch (NumberFormatException e) {
295+
logger.warn(format("Bad curve mapping. Integer needed for strength %s for %s in property %s",
296+
ep[0], mape, SECURITY_CURVE_MAPPING));
297+
}
298+
299+
}
300+
301+
}
302+
return lcurveMapping;
303+
}
304+
220305
/**
221306
* Get the timeout for a single proposal request to endorser.
222307
*
@@ -265,26 +350,6 @@ public String getAsymmetricKeyType() {
265350
return getProperty(ASYMMETRIC_KEY_TYPE);
266351
}
267352

268-
public String getKeyAgreementAlgorithm() {
269-
return getProperty(KEY_AGREEMENT_ALGORITHM);
270-
}
271-
272-
public String getSymmetricKeyType() {
273-
return getProperty(SYMMETRIC_KEY_TYPE);
274-
}
275-
276-
public int getSymmetricKeyByteCount() {
277-
return Integer.parseInt(getProperty(SYMMETRIC_KEY_BYTE_COUNT));
278-
}
279-
280-
public String getSymmetricAlgorithm() {
281-
return getProperty(SYMMETRIC_ALGORITHM);
282-
}
283-
284-
public int getMACKeyByteCount() {
285-
return Integer.parseInt(getProperty(MAC_KEY_BYTE_COUNT));
286-
}
287-
288353
public String getCertificateFormat() {
289354
return getProperty(CERTIFICATE_FORMAT);
290355
}
@@ -293,6 +358,10 @@ public String getSignatureAlgorithm() {
293358
return getProperty(SIGNATURE_ALGORITHM);
294359
}
295360

361+
public String getDefaultCryptoSuiteFactory() {
362+
return getProperty(DEFAULT_CRYPTO_SUITE_FACTORY);
363+
}
364+
296365
public int maxLogStringLength() {
297366
return Integer.parseInt(getProperty(MAX_LOG_STRING_LENGTH));
298367
}

0 commit comments

Comments
 (0)