Browse Source

Added crypto-provider attribute to the settings of ledger;

tags/1.0.0
huanghaiquan 5 years ago
parent
commit
dd021222d7
23 changed files with 370 additions and 49 deletions
  1. +2
    -0
      source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java
  2. +25
    -6
      source/base/src/main/java/com/jd/blockchain/provider/ProviderManager.java
  3. +32
    -0
      source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/Crypto.java
  4. +8
    -2
      source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/CryptoAlgorithm.java
  5. +13
    -25
      source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/CryptoAlgorithmDefinition.java
  6. +17
    -0
      source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/CryptoProvider.java
  7. +24
    -0
      source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/CryptoProviderInfo.java
  8. +52
    -1
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/CryptoConfig.java
  9. +14
    -0
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/AccountSetTest.java
  10. +13
    -0
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/BaseAccountTest.java
  11. +13
    -0
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerAdminAccountTest.java
  12. +13
    -0
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerEditerTest.java
  13. +12
    -0
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerInitOperationTest.java
  14. +13
    -0
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerInitSettingTest.java
  15. +16
    -0
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerManagerTest.java
  16. +27
    -0
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerMetaDataTest.java
  17. +13
    -0
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerTestUtils.java
  18. +26
    -0
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/MerkleDataSetTest.java
  19. +0
    -12
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CryptoProviderInfo.java
  20. +12
    -1
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CryptoSetting.java
  21. +2
    -2
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountKVSetOpTemplate.java
  22. +11
    -0
      source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/initializer/LedgerInitializeTest.java
  23. +12
    -0
      source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/LedgerInitializeWebController.java

+ 2
- 0
source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java View File

@@ -68,6 +68,8 @@ public interface DataCodes {
// public static final int METADATA_PARTICIPANT_INFO = 0x640;

public static final int METADATA_CRYPTO_SETTING = 0x642;
public static final int METADATA_CRYPTO_SETTING_PROVIDER = 0x643;

// public static final int ACCOUNT = 0x700;



+ 25
- 6
source/base/src/main/java/com/jd/blockchain/provider/ProviderManager.java View File

@@ -4,6 +4,7 @@ import java.security.AccessControlContext;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -48,32 +49,45 @@ public final class ProviderManager {
* @return
*/
public <S> S getService(Class<S> serviceClazz, String providerName) {
NamedProviders<S> providers = getServiceProvider(serviceClazz);
NamedProviders<S> providers = getNamedProviders(serviceClazz);
return providers.getService(providerName);
}
public <S> Provider<S> getProvider(Class<S> serviceClazz, String providerName) {
@SuppressWarnings("unchecked")
NamedProviders<S> providers = (NamedProviders<S>) serviceProviders.get(serviceClazz);
if (providers == null) {
return null;
}
return providers.getProvider(providerName);
}

public <S> Collection<Provider<S>> getAllProviders(Class<S> serviceClazz) {
NamedProviders<S> providers = getServiceProvider(serviceClazz);
@SuppressWarnings("unchecked")
NamedProviders<S> providers = (NamedProviders<S>) serviceProviders.get(serviceClazz);
if (providers == null) {
return Collections.emptyList();
}
return providers.getProviders();
}

public <S> S installProvider(Class<S> serviceClazz, String providerFullName) {
NamedProviders<S> providers = getServiceProvider(serviceClazz);
NamedProviders<S> providers = getNamedProviders(serviceClazz);
return providers.install(providerFullName);
}

public <S> S installProvider(Class<S> service, String providerFullName, ClassLoader classLoader) {
NamedProviders<S> providers = getServiceProvider(service);
NamedProviders<S> providers = getNamedProviders(service);
return providers.install(providerFullName, classLoader);
}

public <S> void installAllProviders(Class<S> serviceClazz, ClassLoader classLoader) {
NamedProviders<S> providers = getServiceProvider(serviceClazz);
NamedProviders<S> providers = getNamedProviders(serviceClazz);
providers.installAll(classLoader);
}

@SuppressWarnings("unchecked")
private <S> NamedProviders<S> getServiceProvider(Class<S> serviceClazz) {
private <S> NamedProviders<S> getNamedProviders(Class<S> serviceClazz) {
NamedProviders<S> providers = (NamedProviders<S>) serviceProviders.get(serviceClazz);
if (providers == null) {
synchronized (mutex) {
@@ -189,6 +203,11 @@ public final class ProviderManager {
public Collection<Provider<S>> getProviders() {
return namedProviders.values();
}

public Provider<S> getProvider(String providerFullName) {
return namedProviders.get(providerFullName);
}

public S getService(String name) {
String fullName = shortNames.get(name);


+ 32
- 0
source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/Crypto.java View File

@@ -106,6 +106,38 @@ public final class Crypto {
private Crypto() {
}

public static CryptoProvider[] getProviders() {
Collection<Provider<CryptoService>> providers = pm.getAllProviders(CryptoService.class);
CryptoProvider[] infos = new CryptoProvider[providers.size()];

int i = 0;
for (Provider<CryptoService> pd : providers) {
CryptoProviderInfo info = getProviderInfo(pd);
infos[i] = info;
}

return infos;
}

private static CryptoProviderInfo getProviderInfo(Provider<CryptoService> pd) {
Collection<CryptoFunction> functions = pd.getService().getFunctions();
CryptoAlgorithm[] algorithms = new CryptoAlgorithm[functions.size()];
int i = 0;
for (CryptoFunction function : functions) {
algorithms[i] = function.getAlgorithm();
i++;
}
return new CryptoProviderInfo(pd.getFullName(), algorithms);
}

public static CryptoProvider getProvider(String providerFullName) {
Provider<CryptoService> pd = pm.getProvider(CryptoService.class, providerFullName);
if (pd == null) {
return null;
}
return getProviderInfo(pd);
}

public static Collection<CryptoAlgorithm> getAllAlgorithms() {
return algorithms.values();
}


+ 8
- 2
source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/CryptoAlgorithm.java View File

@@ -9,7 +9,7 @@ import com.jd.blockchain.binaryproto.PrimitiveType;
import com.jd.blockchain.consts.DataCodes;
import com.jd.blockchain.utils.io.BytesUtils;

//@DataContract(code = DataCodes.CRYPTO_ALGORITHM)
@DataContract(code = DataCodes.CRYPTO_ALGORITHM)
public interface CryptoAlgorithm {

/**
@@ -63,7 +63,7 @@ public interface CryptoAlgorithm {
* {@link #EXT_ALGORITHM}) 5 种); 接下来4位标识密钥类型(包括:{@link #SYMMETRIC_KEY},
* {@link #ASYMMETRIC_KEY}); 最后8位是算法唯一ID;
*/
// @DataField(primitiveType = PrimitiveType.INT16, order = 0)
@DataField(order = 0, primitiveType = PrimitiveType.INT16)
short code();

/**
@@ -75,7 +75,13 @@ public interface CryptoAlgorithm {
*
* @return
*/
@DataField(order = 1, primitiveType = PrimitiveType.TEXT)
String name();

public static String getString(CryptoAlgorithm algorithm) {
return String.format("%s[%s]", algorithm.name(), (algorithm.code() & 0xFFFF));
}

/**
*


+ 13
- 25
source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/CryptoAlgorithmDefinition.java View File

@@ -23,16 +23,14 @@ public final class CryptoAlgorithmDefinition implements CryptoAlgorithm {

@Override
public String toString() {
return name + "[" + (code & 0xFFFF) + "]";
return CryptoAlgorithm.getString(this);
}

/**
* 声明一项哈希算法;
*
* @param name
* 算法名称;
* @param uid
* 算法ID;需要在同类算法中保持唯一性;
* @param name 算法名称;
* @param uid 算法ID;需要在同类算法中保持唯一性;
* @return
*/
public static CryptoAlgorithm defineHash(String name, byte uid) {
@@ -43,10 +41,8 @@ public final class CryptoAlgorithmDefinition implements CryptoAlgorithm {
/**
* 声明一项非对称密码算法;
*
* @param name
* 算法名称;
* @param uid
* 算法ID;需要在同类算法中保持唯一性;
* @param name 算法名称;
* @param uid 算法ID;需要在同类算法中保持唯一性;
* @return
*/
public static CryptoAlgorithm defineSignature(String name, boolean encryptable, byte uid) {
@@ -62,10 +58,8 @@ public final class CryptoAlgorithmDefinition implements CryptoAlgorithm {
/**
* 声明一项非对称加密算法;
*
* @param name
* 算法名称;
* @param uid
* 算法ID;需要在同类算法中保持唯一性;
* @param name 算法名称;
* @param uid 算法ID;需要在同类算法中保持唯一性;
* @return
*/
public static CryptoAlgorithm defineAsymmetricEncryption(String name, byte uid) {
@@ -76,10 +70,8 @@ public final class CryptoAlgorithmDefinition implements CryptoAlgorithm {
/**
* 声明一项对称密码算法;
*
* @param name
* 算法名称;
* @param uid
* 算法ID;需要在同类算法中保持唯一性;
* @param name 算法名称;
* @param uid 算法ID;需要在同类算法中保持唯一性;
* @return
*/
public static CryptoAlgorithm defineSymmetricEncryption(String name, byte uid) {
@@ -90,10 +82,8 @@ public final class CryptoAlgorithmDefinition implements CryptoAlgorithm {
/**
* 声明一项随机数算法;
*
* @param name
* 算法名称;
* @param uid
* 算法ID;需要在同类算法中保持唯一性;
* @param name 算法名称;
* @param uid 算法ID;需要在同类算法中保持唯一性;
* @return
*/
public static CryptoAlgorithm defineRandom(String name, byte uid) {
@@ -104,10 +94,8 @@ public final class CryptoAlgorithmDefinition implements CryptoAlgorithm {
/**
* 声明一项扩展的密码算法;
*
* @param name
* 算法名称;
* @param uid
* 算法ID;需要在同类算法中保持唯一性;
* @param name 算法名称;
* @param uid 算法ID;需要在同类算法中保持唯一性;
* @return
*/
public static CryptoAlgorithm definExt(String name, byte uid) {


+ 17
- 0
source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/CryptoProvider.java View File

@@ -0,0 +1,17 @@
package com.jd.blockchain.crypto;

import com.jd.blockchain.binaryproto.DataContract;
import com.jd.blockchain.binaryproto.DataField;
import com.jd.blockchain.binaryproto.PrimitiveType;
import com.jd.blockchain.consts.DataCodes;

@DataContract(code = DataCodes.METADATA_CRYPTO_SETTING_PROVIDER)
public interface CryptoProvider {

@DataField(order = 0, primitiveType = PrimitiveType.TEXT)
String getName();

@DataField(order = 1, list = true, refContract = true)
CryptoAlgorithm[] getAlgorithms();

}

+ 24
- 0
source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/CryptoProviderInfo.java View File

@@ -0,0 +1,24 @@
package com.jd.blockchain.crypto;

class CryptoProviderInfo implements CryptoProvider {

private String name;

private CryptoAlgorithm[] algorithms;

public CryptoProviderInfo(String name, CryptoAlgorithm[] algorithms) {
this.name = name;
this.algorithms = algorithms;
}

@Override
public String getName() {
return name;
}

@Override
public CryptoAlgorithm[] getAlgorithms() {
return algorithms.clone();
}

}

+ 52
- 1
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/CryptoConfig.java View File

@@ -1,13 +1,23 @@
package com.jd.blockchain.ledger.core;

import java.util.HashMap;

import com.jd.blockchain.crypto.CryptoAlgorithm;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.ledger.CryptoSetting;

public class CryptoConfig implements CryptoSetting {

private CryptoProvider[] cryptoProviders;

private short hashAlgorithm;

private boolean autoVerifyHash;
HashMap<String, CryptoProvider> providers;
HashMap<String, CryptoAlgorithm> nameAlgorithms;
HashMap<Short, CryptoAlgorithm> codeAlgorithms;


public CryptoConfig() {
}
@@ -17,6 +27,11 @@ public class CryptoConfig implements CryptoSetting {
this.autoVerifyHash = setting.getAutoVerifyHash();
}

@Override
public CryptoProvider[] getSupportedProviders() {
return cryptoProviders == null ? null : cryptoProviders.clone();
}

@Override
public short getHashAlgorithm() {
return hashAlgorithm;
@@ -27,11 +42,47 @@ public class CryptoConfig implements CryptoSetting {
return autoVerifyHash;
}

public void setSupportedProviders(CryptoProvider[] supportedProviders) {
HashMap<String, CryptoProvider> providers = new HashMap<String, CryptoProvider>();
HashMap<String, CryptoAlgorithm> nameAlgorithms = new HashMap<String, CryptoAlgorithm>();
HashMap<Short, CryptoAlgorithm> codeAlgorithms = new HashMap<Short, CryptoAlgorithm>();
if (supportedProviders != null) {
// 检查是否存在重复的提供者以及算法;
for (CryptoProvider cryptoProvider : supportedProviders) {
if (providers.containsKey(cryptoProvider.getName())) {
throw new LedgerException("Duplicate crypto providers [" + cryptoProvider.getName() + "]!");
}
CryptoAlgorithm[] algorithms = cryptoProvider.getAlgorithms();
for (CryptoAlgorithm alg : algorithms) {
if (nameAlgorithms.containsKey(alg.name())) {
throw new LedgerException("Duplicate crypto algorithms [" + alg.toString() + "] from provider "
+ cryptoProvider.getName() + "!");
}
if (codeAlgorithms.containsKey(alg.code())) {
throw new LedgerException("Duplicate crypto algorithms [" + alg.toString() + "] from provider"
+ cryptoProvider.getName() + "!");
}
nameAlgorithms.put(alg.name(), alg);
codeAlgorithms.put(alg.code(), alg);
}
providers.put(cryptoProvider.getName(), cryptoProvider);
}
}
this.providers = providers;
this.nameAlgorithms = nameAlgorithms;
this.codeAlgorithms = codeAlgorithms;
this.cryptoProviders = supportedProviders;
}

public void setHashAlgorithm(CryptoAlgorithm hashAlgorithm) {
this.hashAlgorithm = hashAlgorithm.code();
setHashAlgorithm(hashAlgorithm.code());
}

public void setHashAlgorithm(short hashAlgorithm) {
if (codeAlgorithms == null || !codeAlgorithms.containsKey(hashAlgorithm)) {
throw new LedgerException("The specified algorithm has no provider!");
}
this.hashAlgorithm = hashAlgorithm;
}



+ 14
- 0
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/AccountSetTest.java View File

@@ -6,8 +6,12 @@ import static org.junit.Assert.assertTrue;

import org.junit.Test;

import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.BlockchainKeyGenerator;
import com.jd.blockchain.ledger.BlockchainKeypair;
import com.jd.blockchain.ledger.core.AccountSet;
@@ -17,6 +21,11 @@ import com.jd.blockchain.ledger.core.impl.OpeningAccessPolicy;
import com.jd.blockchain.storage.service.utils.MemoryKVStorage;

public class AccountSetTest {

private static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(),
SMCryptoService.class.getName() };


@Test
public void test() {
@@ -24,7 +33,12 @@ public class AccountSetTest {

MemoryKVStorage storage = new MemoryKVStorage();

CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}
CryptoConfig cryptoConf = new CryptoConfig();
cryptoConf.setSupportedProviders(supportedProviders);
cryptoConf.setAutoVerifyHash(true);
cryptoConf.setHashAlgorithm(ClassicAlgorithm.SHA256);



+ 13
- 0
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/BaseAccountTest.java View File

@@ -5,7 +5,11 @@ import static org.junit.Assert.assertFalse;

import org.junit.Test;

import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.BlockchainKeyGenerator;
import com.jd.blockchain.ledger.BlockchainKeypair;
import com.jd.blockchain.ledger.core.BaseAccount;
@@ -22,12 +26,21 @@ import com.jd.blockchain.utils.io.BytesUtils;
*/
public class BaseAccountTest {

public static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(),
SMCryptoService.class.getName() };

@Test
public void basicTest() {
String keyPrefix = "";
MemoryKVStorage testStorage = new MemoryKVStorage();

CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}

CryptoConfig cryptoConf = new CryptoConfig();
cryptoConf.setSupportedProviders(supportedProviders);
cryptoConf.setAutoVerifyHash(true);
cryptoConf.setHashAlgorithm(ClassicAlgorithm.SHA256);



+ 13
- 0
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerAdminAccountTest.java View File

@@ -13,8 +13,12 @@ import com.jd.blockchain.ledger.LedgerMetadata;
import org.junit.Test;

import com.jd.blockchain.crypto.AddressEncoding;
import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.BlockchainKeyGenerator;
import com.jd.blockchain.ledger.BlockchainKeypair;
import com.jd.blockchain.ledger.ParticipantNode;
@@ -30,6 +34,9 @@ import com.jd.blockchain.utils.net.NetworkAddress;

public class LedgerAdminAccountTest {

private static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(),
SMCryptoService.class.getName() };

private Random rand = new Random();

@Test
@@ -55,7 +62,13 @@ public class LedgerAdminAccountTest {
initSetting.setConsensusSettings(new Bytes(csSysSettingBytes));
initSetting.setConsensusProvider("consensus-provider");

CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}

CryptoConfig cryptoSetting = new CryptoConfig();
cryptoSetting.setSupportedProviders(supportedProviders);
cryptoSetting.setAutoVerifyHash(true);
cryptoSetting.setHashAlgorithm(ClassicAlgorithm.SHA256);
initSetting.setCryptoSetting(cryptoSetting);


+ 13
- 0
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerEditerTest.java View File

@@ -11,8 +11,11 @@ import com.jd.blockchain.binaryproto.DataContractRegistry;
import com.jd.blockchain.crypto.AddressEncoding;
import com.jd.blockchain.crypto.AsymmetricKeypair;
import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.SignatureFunction;
import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.BlockchainKeypair;
import com.jd.blockchain.ledger.LedgerBlock;
import com.jd.blockchain.ledger.LedgerInitSetting;
@@ -34,6 +37,10 @@ import com.jd.blockchain.utils.io.BytesUtils;
import com.jd.blockchain.utils.net.NetworkAddress;

public class LedgerEditerTest {
private static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(),
SMCryptoService.class.getName() };


static {
DataContractRegistry.register(com.jd.blockchain.ledger.TransactionContent.class);
@@ -109,8 +116,14 @@ public class LedgerEditerTest {

private LedgerInitSetting createLedgerInitSetting() {
SignatureFunction signFunc = Crypto.getSignatureFunction("ED25519");
CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}

CryptoConfig defCryptoSetting = new CryptoConfig();
defCryptoSetting.setSupportedProviders(supportedProviders);
defCryptoSetting.setAutoVerifyHash(true);
defCryptoSetting.setHashAlgorithm(ClassicAlgorithm.SHA256);



+ 12
- 0
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerInitOperationTest.java View File

@@ -12,7 +12,11 @@ import org.junit.Test;
import com.jd.blockchain.binaryproto.BinaryProtocol;
import com.jd.blockchain.binaryproto.DataContractRegistry;
import com.jd.blockchain.crypto.AddressEncoding;
import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.BlockchainKeyGenerator;
import com.jd.blockchain.ledger.BlockchainKeypair;
import com.jd.blockchain.ledger.LedgerInitOperation;
@@ -27,6 +31,9 @@ import com.jd.blockchain.utils.net.NetworkAddress;

public class LedgerInitOperationTest {

private static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(),
SMCryptoService.class.getName() };

byte[] seed = null;
byte[] csSysSettingBytes = null;
LedgerInitSettingData ledgerInitSettingData = new LedgerInitSettingData();
@@ -44,7 +51,12 @@ public class LedgerInitOperationTest {
csSysSettingBytes = new byte[64];
rand.nextBytes(csSysSettingBytes);

CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}
CryptoConfig cryptoConfig = new CryptoConfig();
cryptoConfig.setSupportedProviders(supportedProviders);
cryptoConfig.setAutoVerifyHash(true);
cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256);



+ 13
- 0
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerInitSettingTest.java View File

@@ -12,7 +12,11 @@ import org.junit.Test;
import com.jd.blockchain.binaryproto.BinaryProtocol;
import com.jd.blockchain.binaryproto.DataContractRegistry;
import com.jd.blockchain.crypto.AddressEncoding;
import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.BlockchainKeyGenerator;
import com.jd.blockchain.ledger.BlockchainKeypair;
import com.jd.blockchain.ledger.LedgerInitSetting;
@@ -30,6 +34,9 @@ public class LedgerInitSettingTest {
LedgerInitSettingData ledgerInitSettingData = new LedgerInitSettingData();
LedgerInitOpTemplate template = new LedgerInitOpTemplate();

private static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(),
SMCryptoService.class.getName() };

@Before
public void initCfg() {

@@ -41,7 +48,13 @@ public class LedgerInitSettingTest {
csSysSettingBytes = new byte[64];
rand.nextBytes(csSysSettingBytes);

CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}

CryptoConfig cryptoConfig = new CryptoConfig();
cryptoConfig.setSupportedProviders(supportedProviders);
cryptoConfig.setAutoVerifyHash(true);
cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256);



+ 16
- 0
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerManagerTest.java View File

@@ -13,9 +13,12 @@ import com.jd.blockchain.binaryproto.DataContractRegistry;
import com.jd.blockchain.crypto.AddressEncoding;
import com.jd.blockchain.crypto.AsymmetricKeypair;
import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.SignatureFunction;
import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.BlockBody;
import com.jd.blockchain.ledger.BlockchainKeyGenerator;
import com.jd.blockchain.ledger.BlockchainKeypair;
@@ -55,6 +58,10 @@ public class LedgerManagerTest {
DataContractRegistry.register(DataAccountRegisterOperation.class);
DataContractRegistry.register(BlockBody.class);
}

public static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(),
SMCryptoService.class.getName() };

private SignatureFunction signatureFunction;

@@ -170,7 +177,16 @@ public class LedgerManagerTest {
}

private LedgerInitSetting createLedgerInitSetting() {

CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}

CryptoConfig defCryptoSetting = new CryptoConfig();
defCryptoSetting.setSupportedProviders(supportedProviders);
defCryptoSetting.setAutoVerifyHash(true);
defCryptoSetting.setHashAlgorithm(ClassicAlgorithm.SHA256);



+ 27
- 0
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerMetaDataTest.java View File

@@ -15,9 +15,13 @@ import org.junit.Test;
import com.jd.blockchain.binaryproto.BinaryProtocol;
import com.jd.blockchain.binaryproto.DataContractRegistry;
import com.jd.blockchain.crypto.AddressEncoding;
import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.PubKey;
import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.CryptoSetting;
import com.jd.blockchain.ledger.ParticipantNode;
import com.jd.blockchain.ledger.core.CryptoConfig;
@@ -30,6 +34,10 @@ import com.jd.blockchain.utils.Bytes;
* Created by zhangshuang3 on 2018/8/31.
*/
public class LedgerMetaDataTest {

private static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(),
SMCryptoService.class.getName() };

byte[] seed = null;
String consensusProvider = "test-provider";
byte[] consensusSettingBytes = null;
@@ -56,7 +64,13 @@ public class LedgerMetaDataTest {
// ConsensusConfig consensusConfig = new ConsensusConfig();
// consensusConfig.setValue(settingValue);ClassicCryptoService.ED25519_ALGORITHM

CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}

CryptoConfig cryptoConfig = new CryptoConfig();
cryptoConfig.setSupportedProviders(supportedProviders);
cryptoConfig.setAutoVerifyHash(true);
cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256);

@@ -93,7 +107,13 @@ public class LedgerMetaDataTest {
// ConsensusConfig consensusConfig = new ConsensusConfig();
// consensusConfig.setValue(settingValue);

CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}

CryptoConfig cryptoConfig = new CryptoConfig();
cryptoConfig.setSupportedProviders(supportedProviders);
cryptoConfig.setAutoVerifyHash(true);
cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256);

@@ -133,7 +153,14 @@ public class LedgerMetaDataTest {
@Test
public void testSerialize_CryptoSetting() {
// LedgerCodes.METADATA_LEDGER_SETTING_CRYPTO

CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}

CryptoConfig cryptoConfig = new CryptoConfig();
cryptoConfig.setSupportedProviders(supportedProviders);
cryptoConfig.setAutoVerifyHash(true);
cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256);
byte[] encodeBytes = BinaryProtocol.encode(cryptoConfig, CryptoSetting.class);


+ 13
- 0
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerTestUtils.java View File

@@ -4,10 +4,13 @@ import java.util.Random;

import com.jd.blockchain.crypto.AsymmetricKeypair;
import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.PubKey;
import com.jd.blockchain.crypto.SignatureFunction;
import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.BlockchainIdentityData;
import com.jd.blockchain.ledger.CryptoSetting;
import com.jd.blockchain.ledger.PreparedTransaction;
@@ -22,6 +25,9 @@ public class LedgerTestUtils {

// private static ThreadLocalRandom rand = ThreadLocalRandom.current();

private static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(),
SMCryptoService.class.getName() };

private static Random rand = new Random();

public static TransactionRequest createTxRequest(HashDigest ledgerHash) {
@@ -76,7 +82,14 @@ public class LedgerTestUtils {
}

public static CryptoSetting createDefaultCryptoSetting() {

CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}

CryptoConfig cryptoSetting = new CryptoConfig();
cryptoSetting.setSupportedProviders(supportedProviders);
cryptoSetting.setAutoVerifyHash(true);
cryptoSetting.setHashAlgorithm(ClassicAlgorithm.SHA256);
return cryptoSetting;


+ 26
- 0
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/MerkleDataSetTest.java View File

@@ -14,8 +14,12 @@ import java.util.Set;

import org.junit.Test;

import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.core.CryptoConfig;
import com.jd.blockchain.ledger.core.MerkleDataSet;
import com.jd.blockchain.ledger.core.MerkleProof;
@@ -26,13 +30,23 @@ import com.jd.blockchain.utils.io.BytesUtils;

public class MerkleDataSetTest {

private static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(),
SMCryptoService.class.getName() };

/**
* 测试存储的增长;
*/
@Test
public void testStorageIncreasement() {

CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}

String keyPrefix = "";
CryptoConfig cryptoConfig = new CryptoConfig();
cryptoConfig.setSupportedProviders(supportedProviders);
cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256);
cryptoConfig.setAutoVerifyHash(true);

@@ -116,7 +130,13 @@ public class MerkleDataSetTest {
String keyPrefix = "";
Random rand = new Random();

CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}

CryptoConfig cryptoConfig = new CryptoConfig();
cryptoConfig.setSupportedProviders(supportedProviders);
cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256);
cryptoConfig.setAutoVerifyHash(true);

@@ -281,7 +301,13 @@ public class MerkleDataSetTest {
String keyPrefix = "";
Random rand = new Random();

CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}

CryptoConfig cryptoConfig = new CryptoConfig();
cryptoConfig.setSupportedProviders(supportedProviders);
cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256);
cryptoConfig.setAutoVerifyHash(true);



+ 0
- 12
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CryptoProviderInfo.java View File

@@ -1,12 +0,0 @@
package com.jd.blockchain.ledger;

import com.jd.blockchain.crypto.CryptoAlgorithm;

public interface CryptoProviderInfo {
String getName();
CryptoAlgorithm[] getAlgorithms();
}

+ 12
- 1
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CryptoSetting.java View File

@@ -4,6 +4,7 @@ import com.jd.blockchain.binaryproto.DataContract;
import com.jd.blockchain.binaryproto.DataField;
import com.jd.blockchain.binaryproto.PrimitiveType;
import com.jd.blockchain.consts.DataCodes;
import com.jd.blockchain.crypto.CryptoProvider;

/**
* 默克尔树算法相关的配置;
@@ -14,6 +15,15 @@ import com.jd.blockchain.consts.DataCodes;
@DataContract(code = DataCodes.METADATA_CRYPTO_SETTING)
public interface CryptoSetting {

/**
* 系统支持的密码服务提供者;
*
* @return
*/
public CryptoProvider[] getSupportedProviders();

/**
* 系统中使用的 Hash 算法; <br>
*
@@ -27,7 +37,7 @@ public interface CryptoSetting {
public short getHashAlgorithm();

/**
* 当有完整性证明的数据被从持久化介质中加载时,是否对其进行完整性校验(重新计算 hash 比对是否一致); <br>
* 当有加载附带哈希摘要的数据时,是否重新计算哈希摘要进行完整性校验; <br>
*
* 如果为 true ,则自动进行校验,如果校验失败,会引发异常; <br>
*
@@ -37,5 +47,6 @@ public interface CryptoSetting {
*/
@DataField(order = 2, primitiveType = PrimitiveType.BOOLEAN)
public boolean getAutoVerifyHash();

}

+ 2
- 2
source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountKVSetOpTemplate.java View File

@@ -49,7 +49,7 @@ public class DataAccountKVSetOpTemplate implements DataAccountKVSetOperation {
public void set(String key, BytesValue value, long expVersion) {
if (kvset.containsKey(key)) {
throw new IllegalArgumentException("Cann't set the same key repeatly!");
throw new IllegalArgumentException("Cann't set the same key repeatedly!");
}
KVData kvdata = new KVData(key, value, expVersion);
kvset.put(key, kvdata);
@@ -57,7 +57,7 @@ public class DataAccountKVSetOpTemplate implements DataAccountKVSetOperation {
public void set(KVData kvData) {
if (kvset.containsKey(kvData.getKey())) {
throw new IllegalArgumentException("Cann't set the same key repeatly!");
throw new IllegalArgumentException("Cann't set the same key repeatedly!");
}
kvset.put(kvData.getKey(), kvData);
}


+ 11
- 0
source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/initializer/LedgerInitializeTest.java View File

@@ -19,12 +19,15 @@ import com.jd.blockchain.consensus.ConsensusProviders;
import com.jd.blockchain.consensus.ConsensusSettings;
import com.jd.blockchain.crypto.AddressEncoding;
import com.jd.blockchain.crypto.CryptoAlgorithm;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.AsymmetricKeypair;
import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.PrivKey;
import com.jd.blockchain.crypto.PubKey;
import com.jd.blockchain.crypto.SignatureDigest;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.LedgerBlock;
import com.jd.blockchain.ledger.LedgerInitOperation;
import com.jd.blockchain.ledger.UserRegisterOperation;
@@ -60,6 +63,9 @@ public class LedgerInitializeTest {
DataContractRegistry.register(UserRegisterOperation.class);
}

private static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(),
SMCryptoService.class.getName() };

public static final String PASSWORD = IntegrationBase.PASSWORD;

public static final String[] PUB_KEYS = IntegrationBase.PUB_KEYS;
@@ -254,7 +260,12 @@ public class LedgerInitializeTest {
ConsensusSettings csProps, ConsensusProvider csProvider, DBConnectionConfig dbConnConfig,
Prompter prompter, boolean autoVerifyHash) {

CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}
CryptoConfig cryptoSetting = new CryptoConfig();
cryptoSetting.setSupportedProviders(supportedProviders);
cryptoSetting.setAutoVerifyHash(autoVerifyHash);
cryptoSetting.setHashAlgorithm(Crypto.getAlgorithm("SHA256"));



+ 12
- 0
source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/LedgerInitializeWebController.java View File

@@ -20,12 +20,15 @@ import com.jd.blockchain.binaryproto.DataContractRegistry;
import com.jd.blockchain.consensus.ConsensusProvider;
import com.jd.blockchain.consensus.ConsensusSettings;
import com.jd.blockchain.crypto.CryptoAlgorithm;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.PrivKey;
import com.jd.blockchain.crypto.PubKey;
import com.jd.blockchain.crypto.SignatureDigest;
import com.jd.blockchain.crypto.SignatureFunction;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.BlockchainIdentity;
import com.jd.blockchain.ledger.BlockchainIdentityData;
import com.jd.blockchain.ledger.CryptoSetting;
@@ -75,6 +78,10 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI
static {
DataContractRegistry.register(TransactionRequest.class);
}
private static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(),
SMCryptoService.class.getName() };


private static final String DEFAULT_SIGN_ALGORITHM = "ED25519";
@@ -299,7 +306,12 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI
}

public CryptoSetting createDefaultCryptoSetting() {
CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}
CryptoConfig defCryptoSetting = new CryptoConfig();
defCryptoSetting.setSupportedProviders(supportedProviders);
defCryptoSetting.setAutoVerifyHash(true);
defCryptoSetting.setHashAlgorithm(Crypto.getAlgorithm("SHA256"));



Loading…
Cancel
Save