Browse Source

Refactoring: change the type of the Algorithm property of class CryptoBytes to type “short”, and modify the relevant code that depends on this property;

tags/1.0.0
huanghaiquan 5 years ago
parent
commit
eb28dc1ad3
38 changed files with 1435 additions and 1293 deletions
  1. +11
    -5
      source/crypto/crypto-classic/src/main/java/com/jd/blockchain/crypto/service/classic/AESEncryptionFunction.java
  2. +27
    -0
      source/crypto/crypto-classic/src/main/java/com/jd/blockchain/crypto/service/classic/ClassicAlgorithm.java
  3. +0
    -21
      source/crypto/crypto-classic/src/main/java/com/jd/blockchain/crypto/service/classic/ClassicCryptoService.java
  4. +1
    -1
      source/crypto/crypto-classic/src/main/java/com/jd/blockchain/crypto/service/classic/ECDSASignatureFunction.java
  5. +4
    -4
      source/crypto/crypto-classic/src/main/java/com/jd/blockchain/crypto/service/classic/ED25519SignatureFunction.java
  6. +1
    -1
      source/crypto/crypto-classic/src/main/java/com/jd/blockchain/crypto/service/classic/JVMSecureRandomFunction.java
  7. +1
    -1
      source/crypto/crypto-classic/src/main/java/com/jd/blockchain/crypto/service/classic/RIPEMD160HashFunction.java
  8. +1
    -1
      source/crypto/crypto-classic/src/main/java/com/jd/blockchain/crypto/service/classic/SHA256HashFunction.java
  9. +229
    -228
      source/crypto/crypto-classic/src/test/java/test/com/jd/blockchain/crypto/service/classic/AESEncryptionFunctionTest.java
  10. +33
    -23
      source/crypto/crypto-classic/src/test/java/test/com/jd/blockchain/crypto/service/classic/ED25519SignatureFunctionTest.java
  11. +135
    -135
      source/crypto/crypto-classic/src/test/java/test/com/jd/blockchain/crypto/service/classic/RIPEMD160HashFunctionTest.java
  12. +133
    -133
      source/crypto/crypto-classic/src/test/java/test/com/jd/blockchain/crypto/service/classic/SHA256HashFunctionTest.java
  13. +1
    -1
      source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/AddressEncoding.java
  14. +1
    -1
      source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/AsymmetricCiphertext.java
  15. +28
    -15
      source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/BaseCryptoBytes.java
  16. +5
    -1
      source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/BaseCryptoKey.java
  17. +66
    -0
      source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/CryptoAlgorithm.java
  18. +1
    -1
      source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/CryptoBytes.java
  19. +2
    -2
      source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/CryptoKeyPair.java
  20. +1
    -1
      source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/HashDigest.java
  21. +4
    -0
      source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/PrivKey.java
  22. +4
    -0
      source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/PubKey.java
  23. +1
    -1
      source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/SignatureDigest.java
  24. +1
    -1
      source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/SymmetricCiphertext.java
  25. +6
    -5
      source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/serialize/ByteArrayObjectSerializer.java
  26. +17
    -8
      source/crypto/crypto-sm/src/main/java/com/jd/blockchain/crypto/service/sm/SM2CryptoFunction.java
  27. +1
    -1
      source/crypto/crypto-sm/src/main/java/com/jd/blockchain/crypto/service/sm/SM3HashFunction.java
  28. +27
    -26
      source/crypto/crypto-sm/src/main/java/com/jd/blockchain/crypto/service/sm/SM4EncryptionFunction.java
  29. +17
    -0
      source/crypto/crypto-sm/src/main/java/com/jd/blockchain/crypto/service/sm/SMAlgorithm.java
  30. +0
    -10
      source/crypto/crypto-sm/src/main/java/com/jd/blockchain/crypto/service/sm/SMCryptoService.java
  31. +329
    -338
      source/crypto/crypto-sm/src/test/java/test/com/jd/blockchain/crypto/service/sm/SM2CyptoFunctionTest.java
  32. +4
    -4
      source/crypto/crypto-sm/src/test/java/test/com/jd/blockchain/crypto/service/sm/SM3HashFunctionTest.java
  33. +249
    -243
      source/crypto/crypto-sm/src/test/java/test/com/jd/blockchain/crypto/service/sm/SM4EncryptionFunctionTest.java
  34. +6
    -8
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/data/CryptoKeyEncoding.java
  35. +3
    -3
      source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/service/NodeSigningAppender.java
  36. +1
    -3
      source/sdk/sdk-client/src/main/java/com/jd/blockchain/sdk/client/GatewayServiceFactory.java
  37. +3
    -4
      source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/LedgerInitializeWebController.java
  38. +81
    -63
      source/utils/utils-common/src/main/java/com/jd/blockchain/utils/io/BytesUtils.java

+ 11
- 5
source/crypto/crypto-classic/src/main/java/com/jd/blockchain/crypto/service/classic/AESEncryptionFunction.java View File

@@ -8,12 +8,18 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import com.jd.blockchain.crypto.*;
import com.jd.blockchain.crypto.Ciphertext;
import com.jd.blockchain.crypto.CryptoAlgorithm;
import com.jd.blockchain.crypto.CryptoException;
import com.jd.blockchain.crypto.CryptoKey;
import com.jd.blockchain.crypto.SymmetricCiphertext;
import com.jd.blockchain.crypto.SymmetricEncryptionFunction;
import com.jd.blockchain.crypto.SymmetricKey;
import com.jd.blockchain.utils.security.AESUtils;

public class AESEncryptionFunction implements SymmetricEncryptionFunction {

public static final CryptoAlgorithm AES = ClassicCryptoService.AES_ALGORITHM;
public static final CryptoAlgorithm AES = ClassicAlgorithm.AES;

private static final int KEY_SIZE = 128 / 8;
private static final int BLOCK_SIZE = 128 / 8;
@@ -38,7 +44,7 @@ public class AESEncryptionFunction implements SymmetricEncryptionFunction {
}

// 验证密钥数据的算法标识对应AES算法
if (key.getAlgorithm().code() != AES.code()) {
if (key.getAlgorithm() != AES.code()) {
throw new CryptoException("The is not AES symmetric key!");
}

@@ -103,7 +109,7 @@ public class AESEncryptionFunction implements SymmetricEncryptionFunction {
}

// 验证密钥数据的算法标识对应AES算法
if (key.getAlgorithm().code() != AES.code()) {
if (key.getAlgorithm() != AES.code()) {
throw new CryptoException("The is not AES symmetric key!");
}

@@ -113,7 +119,7 @@ public class AESEncryptionFunction implements SymmetricEncryptionFunction {
}

// 验证密文数据算法标识对应AES算法
if (ciphertext.getAlgorithm().code() != AES.code()) {
if (ciphertext.getAlgorithm() != AES.code()) {
throw new CryptoException("This is not AES ciphertext!");
}



+ 27
- 0
source/crypto/crypto-classic/src/main/java/com/jd/blockchain/crypto/service/classic/ClassicAlgorithm.java View File

@@ -0,0 +1,27 @@
package com.jd.blockchain.crypto.service.classic;

import com.jd.blockchain.crypto.CryptoAlgorithm;
import com.jd.blockchain.crypto.CryptoAlgorithmDefinition;

public final class ClassicAlgorithm {

public static final CryptoAlgorithm ED25519 = CryptoAlgorithmDefinition.defineSignature("ED25519", false,
(byte) 21);
public static final CryptoAlgorithm ECDSA = CryptoAlgorithmDefinition.defineSignature("ECDSA", false, (byte) 22);

public static final CryptoAlgorithm RSA = CryptoAlgorithmDefinition.defineSignature("RSA", true, (byte) 23);

public static final CryptoAlgorithm SHA256 = CryptoAlgorithmDefinition.defineHash("SHA256", (byte) 24);

public static final CryptoAlgorithm RIPEMD160 = CryptoAlgorithmDefinition.defineHash("RIPEMD160", (byte) 25);

public static final CryptoAlgorithm AES = CryptoAlgorithmDefinition.defineSymmetricEncryption("AES", (byte) 26);

public static final CryptoAlgorithm JVM_SECURE_RANDOM = CryptoAlgorithmDefinition.defineRandom("JVM-SECURE-RANDOM",
(byte) 27);

private ClassicAlgorithm() {

}

}

+ 0
- 21
source/crypto/crypto-classic/src/main/java/com/jd/blockchain/crypto/service/classic/ClassicCryptoService.java View File

@@ -5,8 +5,6 @@ import java.util.Collection;
import java.util.Collections;
import java.util.List;

import com.jd.blockchain.crypto.CryptoAlgorithm;
import com.jd.blockchain.crypto.CryptoAlgorithmDefinition;
import com.jd.blockchain.crypto.CryptoFunction;
import com.jd.blockchain.crypto.CryptoService;
import com.jd.blockchain.provider.NamedProvider;
@@ -14,25 +12,6 @@ import com.jd.blockchain.provider.NamedProvider;
@NamedProvider("CLASSIC")
public class ClassicCryptoService implements CryptoService {

public static final CryptoAlgorithm ED25519_ALGORITHM = CryptoAlgorithmDefinition.defineSignature("ED25519",
false, (byte) 21);
public static final CryptoAlgorithm ECDSA_ALGORITHM = CryptoAlgorithmDefinition.defineSignature("ECDSA",
false, (byte) 22);

public static final CryptoAlgorithm RSA_ALGORITHM = CryptoAlgorithmDefinition.defineSignature("RSA",
true, (byte) 23);

public static final CryptoAlgorithm SHA256_ALGORITHM = CryptoAlgorithmDefinition.defineHash("SHA256",
(byte) 24);

public static final CryptoAlgorithm RIPEMD160_ALGORITHM = CryptoAlgorithmDefinition.defineHash("RIPEMD160",
(byte) 25);

public static final CryptoAlgorithm AES_ALGORITHM = CryptoAlgorithmDefinition.defineSymmetricEncryption("AES",
(byte) 26);

public static final CryptoAlgorithm JVM_SECURE_RANDOM_ALGORITHM = CryptoAlgorithmDefinition
.defineRandom("JVM-SECURE-RANDOM", (byte) 27);

public static final AESEncryptionFunction AES = new AESEncryptionFunction();



+ 1
- 1
source/crypto/crypto-classic/src/main/java/com/jd/blockchain/crypto/service/classic/ECDSASignatureFunction.java View File

@@ -59,7 +59,7 @@ public class ECDSASignatureFunction implements SignatureFunction {

@Override
public CryptoAlgorithm getAlgorithm() {
return ClassicCryptoService.ECDSA_ALGORITHM;
return ClassicAlgorithm.ECDSA;
}

@Override


+ 4
- 4
source/crypto/crypto-classic/src/main/java/com/jd/blockchain/crypto/service/classic/ED25519SignatureFunction.java View File

@@ -20,7 +20,7 @@ import org.bouncycastle.crypto.params.Ed25519PublicKeyParameters;

public class ED25519SignatureFunction implements SignatureFunction {

private static final CryptoAlgorithm ED25519 = ClassicCryptoService.ED25519_ALGORITHM;
private static final CryptoAlgorithm ED25519 = ClassicAlgorithm.ED25519;

private static final int PUBKEY_SIZE = 32;
private static final int PRIVKEY_SIZE = 32;
@@ -44,7 +44,7 @@ public class ED25519SignatureFunction implements SignatureFunction {
}

// 验证密钥数据的算法标识对应ED25519签名算法
if (privKey.getAlgorithm().code() != ED25519.code()) {
if (privKey.getAlgorithm() != ED25519.code()) {
throw new CryptoException("This key is not ED25519 private key!");
}

@@ -66,12 +66,12 @@ public class ED25519SignatureFunction implements SignatureFunction {
}

// 验证密钥数据的算法标识对应ED25519签名算法
if (pubKey.getAlgorithm().code() != ED25519.code()) {
if (pubKey.getAlgorithm() != ED25519.code()) {
throw new CryptoException("This key is not ED25519 public key!");
}

// 验证密文数据的算法标识对应ED25519签名算法,并且原始摘要长度为64字节
if (digest.getAlgorithm().code() != ED25519.code() || rawDigestBytes.length != SIGNATUREDIGEST_SIZE) {
if (digest.getAlgorithm() != ED25519.code() || rawDigestBytes.length != SIGNATUREDIGEST_SIZE) {
throw new CryptoException("This is not ED25519 signature digest!");
}



+ 1
- 1
source/crypto/crypto-classic/src/main/java/com/jd/blockchain/crypto/service/classic/JVMSecureRandomFunction.java View File

@@ -8,7 +8,7 @@ import com.jd.blockchain.crypto.RandomGenerator;

public class JVMSecureRandomFunction implements RandomFunction {

private static final CryptoAlgorithm JVM_SECURE_RANDOM = ClassicCryptoService.JVM_SECURE_RANDOM_ALGORITHM;
private static final CryptoAlgorithm JVM_SECURE_RANDOM = ClassicAlgorithm.JVM_SECURE_RANDOM;


JVMSecureRandomFunction() {


+ 1
- 1
source/crypto/crypto-classic/src/main/java/com/jd/blockchain/crypto/service/classic/RIPEMD160HashFunction.java View File

@@ -12,7 +12,7 @@ import com.jd.blockchain.utils.security.RipeMD160Utils;

public class RIPEMD160HashFunction implements HashFunction {

private static final CryptoAlgorithm RIPEMD160 = ClassicCryptoService.RIPEMD160_ALGORITHM;
private static final CryptoAlgorithm RIPEMD160 = ClassicAlgorithm.RIPEMD160;

private static final int DIGEST_BYTES = 160 / 8;



+ 1
- 1
source/crypto/crypto-classic/src/main/java/com/jd/blockchain/crypto/service/classic/SHA256HashFunction.java View File

@@ -12,7 +12,7 @@ import com.jd.blockchain.utils.security.ShaUtils;

public class SHA256HashFunction implements HashFunction {

private static final CryptoAlgorithm SHA256 = ClassicCryptoService.SHA256_ALGORITHM;
private static final CryptoAlgorithm SHA256 = ClassicAlgorithm.SHA256;

private static final int DIGEST_BYTES = 256 / 8;



+ 229
- 228
source/crypto/crypto-classic/src/test/java/test/com/jd/blockchain/crypto/service/classic/AESEncryptionFunctionTest.java View File

@@ -1,20 +1,28 @@
package test.com.jd.blockchain.crypto.service.classic;

import com.jd.blockchain.crypto.*;
import com.jd.blockchain.utils.io.BytesUtils;
import org.junit.Test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Random;

import static com.jd.blockchain.crypto.CryptoAlgorithm.ENCRYPTION_ALGORITHM;
import static com.jd.blockchain.crypto.CryptoAlgorithm.SYMMETRIC_KEY;
import static com.jd.blockchain.crypto.CryptoKeyType.PUBLIC;
import static com.jd.blockchain.crypto.CryptoKeyType.SYMMETRIC;
import static org.junit.Assert.*;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

import java.util.Random;

import org.junit.Test;

import com.jd.blockchain.crypto.Ciphertext;
import com.jd.blockchain.crypto.CryptoAlgorithm;
import com.jd.blockchain.crypto.CryptoException;
import com.jd.blockchain.crypto.CryptoServiceProviders;
import com.jd.blockchain.crypto.SymmetricEncryptionFunction;
import com.jd.blockchain.crypto.SymmetricKey;
import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm;
import com.jd.blockchain.utils.io.BytesUtils;

/**
* @author zhanglin33
@@ -24,268 +32,261 @@ import static org.junit.Assert.*;
*/
public class AESEncryptionFunctionTest {

@Test
public void getAlgorithmTest(){
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("aes");
assertNotNull(algorithm);

SymmetricEncryptionFunction symmetricEncryptionFunction =
CryptoServiceProviders.getSymmetricEncryptionFunction(algorithm);

assertEquals(symmetricEncryptionFunction.getAlgorithm().name(), algorithm.name());
assertEquals(symmetricEncryptionFunction.getAlgorithm().code(), algorithm.code());

algorithm = CryptoServiceProviders.getAlgorithm("AES");
assertNotNull(algorithm);

assertEquals(symmetricEncryptionFunction.getAlgorithm().name(), algorithm.name());
assertEquals(symmetricEncryptionFunction.getAlgorithm().code(), algorithm.code());

algorithm = CryptoServiceProviders.getAlgorithm("aess");
assertNull(algorithm);
}

@Test
public void generateSymmetricKeyTest(){
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("aes");
assertNotNull(algorithm);

SymmetricEncryptionFunction symmetricEncryptionFunction =
CryptoServiceProviders.getSymmetricEncryptionFunction(algorithm);

SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();

assertEquals(SYMMETRIC.CODE,symmetricKey.getKeyType().CODE);
assertEquals(128 / 8, symmetricKey.getRawKeyBytes().length);

assertEquals(algorithm.name(),symmetricKey.getAlgorithm().name());
assertEquals(algorithm.code(),symmetricKey.getAlgorithm().code());

assertEquals(2 + 1 + 128 / 8, symmetricKey.toBytes().length);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] keyTypeBytes = new byte[] {SYMMETRIC.CODE};
byte[] rawKeyBytes = symmetricKey.getRawKeyBytes();
assertArrayEquals(BytesUtils.concat(algoBytes,keyTypeBytes,rawKeyBytes),symmetricKey.toBytes());
}



@Test
public void encryptTest(){

byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("aes");
assertNotNull(algorithm);

SymmetricEncryptionFunction symmetricEncryptionFunction =
CryptoServiceProviders.getSymmetricEncryptionFunction(algorithm);
@Test
public void getAlgorithmTest() {
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("aes");
assertNotNull(algorithm);

SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();
SymmetricEncryptionFunction symmetricEncryptionFunction = CryptoServiceProviders
.getSymmetricEncryptionFunction(algorithm);

Ciphertext ciphertext = symmetricEncryptionFunction.encrypt(symmetricKey,data);
assertEquals(symmetricEncryptionFunction.getAlgorithm().name(), algorithm.name());
assertEquals(symmetricEncryptionFunction.getAlgorithm().code(), algorithm.code());

byte[] ciphertextBytes = ciphertext.toBytes();
assertEquals(2 + 16 + 1024 , ciphertextBytes.length);
CryptoAlgorithm ciphertextAlgo = ciphertext.getAlgorithm();
assertEquals("AES",ciphertextAlgo.name());
assertEquals((short) (ENCRYPTION_ALGORITHM | SYMMETRIC_KEY | ((byte) 26 & 0x00FF)),ciphertextAlgo.code());
algorithm = CryptoServiceProviders.getAlgorithm("AES");
assertNotNull(algorithm);

byte[] algoBytes = CryptoAlgorithm.toBytes(ciphertextAlgo);
byte[] rawCiphertextBytes = ciphertext.getRawCiphertext();
assertArrayEquals(BytesUtils.concat(algoBytes,rawCiphertextBytes),ciphertextBytes);
}
assertEquals(symmetricEncryptionFunction.getAlgorithm().name(), algorithm.name());
assertEquals(symmetricEncryptionFunction.getAlgorithm().code(), algorithm.code());

algorithm = CryptoServiceProviders.getAlgorithm("aess");
assertNull(algorithm);
}

@Test
public void decryptTest(){
@Test
public void generateSymmetricKeyTest() {
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("aes");
assertNotNull(algorithm);

byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
SymmetricEncryptionFunction symmetricEncryptionFunction = CryptoServiceProviders
.getSymmetricEncryptionFunction(algorithm);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("aes");
assertNotNull(algorithm);
SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();

SymmetricEncryptionFunction symmetricEncryptionFunction =
CryptoServiceProviders.getSymmetricEncryptionFunction(algorithm);
assertEquals(SYMMETRIC.CODE, symmetricKey.getKeyType().CODE);
assertEquals(128 / 8, symmetricKey.getRawKeyBytes().length);

SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();
assertEquals(algorithm.code(), symmetricKey.getAlgorithm());

Ciphertext ciphertext = symmetricEncryptionFunction.encrypt(symmetricKey,data);
assertEquals(2 + 1 + 128 / 8, symmetricKey.toBytes().length);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] keyTypeBytes = new byte[] { SYMMETRIC.CODE };
byte[] rawKeyBytes = symmetricKey.getRawKeyBytes();
assertArrayEquals(BytesUtils.concat(algoBytes, keyTypeBytes, rawKeyBytes), symmetricKey.toBytes());
}

byte[] decryptedPlaintext = symmetricEncryptionFunction.decrypt(symmetricKey,ciphertext);
@Test
public void encryptTest() {

assertArrayEquals(data,decryptedPlaintext);
}
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);

// @Test
// public void streamEncryptTest(){
//
// byte[] data = new byte[1024];
// Random random = new Random();
// random.nextBytes(data);
//
//
// InputStream inputStream = new ByteArrayInputStream(data);
// OutputStream outputStream = new ByteArrayOutputStream();
//
// CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("aes");
// assertNotNull(algorithm);
//
// SymmetricEncryptionFunction symmetricEncryptionFunction =
// CryptoServiceProviders.getSymmetricEncryptionFunction(algorithm);
//
// SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();
//
// symmetricEncryptionFunction.encrypt(symmetricKey,inputStream,outputStream);
//
// assertNotNull(outputStream);
//
//
// }
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("aes");
assertNotNull(algorithm);

SymmetricEncryptionFunction symmetricEncryptionFunction = CryptoServiceProviders
.getSymmetricEncryptionFunction(algorithm);

SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();

@Test
public void supportSymmetricKeyTest(){
Ciphertext ciphertext = symmetricEncryptionFunction.encrypt(symmetricKey, data);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("aes");
assertNotNull(algorithm);
byte[] ciphertextBytes = ciphertext.toBytes();
assertEquals(2 + 16 + 1024, ciphertextBytes.length);
assertEquals(ClassicAlgorithm.AES.code(), ciphertext.getAlgorithm());
assertEquals((short) (ENCRYPTION_ALGORITHM | SYMMETRIC_KEY | ((byte) 26 & 0x00FF)), ciphertext.getAlgorithm());

SymmetricEncryptionFunction symmetricEncryptionFunction =
CryptoServiceProviders.getSymmetricEncryptionFunction(algorithm);
byte[] algoBytes = BytesUtils.toBytes(ciphertext.getAlgorithm());
byte[] rawCiphertextBytes = ciphertext.getRawCiphertext();
assertArrayEquals(BytesUtils.concat(algoBytes, rawCiphertextBytes), ciphertextBytes);
}

SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();
byte[] symmetricKeyBytes = symmetricKey.toBytes();
@Test
public void decryptTest() {

assertTrue(symmetricEncryptionFunction.supportSymmetricKey(symmetricKeyBytes));
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);

algorithm = CryptoServiceProviders.getAlgorithm("ripemd160");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] pubKeyTypeBytes = new byte[] {PUBLIC.CODE};
byte[] rawKeyBytes = symmetricKey.getRawKeyBytes();
byte[] ripemd160KeyBytes = BytesUtils.concat(algoBytes,pubKeyTypeBytes,rawKeyBytes);
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("aes");
assertNotNull(algorithm);

SymmetricEncryptionFunction symmetricEncryptionFunction = CryptoServiceProviders
.getSymmetricEncryptionFunction(algorithm);

SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();

assertFalse(symmetricEncryptionFunction.supportSymmetricKey(ripemd160KeyBytes));
}
Ciphertext ciphertext = symmetricEncryptionFunction.encrypt(symmetricKey, data);

byte[] decryptedPlaintext = symmetricEncryptionFunction.decrypt(symmetricKey, ciphertext);

@Test
public void resolveSymmetricKeyTest(){
assertArrayEquals(data, decryptedPlaintext);
}

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("aes");
assertNotNull(algorithm);
// @Test
// public void streamEncryptTest(){
//
// byte[] data = new byte[1024];
// Random random = new Random();
// random.nextBytes(data);
//
//
// InputStream inputStream = new ByteArrayInputStream(data);
// OutputStream outputStream = new ByteArrayOutputStream();
//
// CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("aes");
// assertNotNull(algorithm);
//
// SymmetricEncryptionFunction symmetricEncryptionFunction =
// CryptoServiceProviders.getSymmetricEncryptionFunction(algorithm);
//
// SymmetricKey symmetricKey = (SymmetricKey)
// symmetricEncryptionFunction.generateSymmetricKey();
//
// symmetricEncryptionFunction.encrypt(symmetricKey,inputStream,outputStream);
//
// assertNotNull(outputStream);
//
//
// }

SymmetricEncryptionFunction symmetricEncryptionFunction =
CryptoServiceProviders.getSymmetricEncryptionFunction(algorithm);
@Test
public void supportSymmetricKeyTest() {

SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();
byte[] symmetricKeyBytes = symmetricKey.toBytes();
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("aes");
assertNotNull(algorithm);

SymmetricKey resolvedKey = symmetricEncryptionFunction.resolveSymmetricKey(symmetricKeyBytes);
SymmetricEncryptionFunction symmetricEncryptionFunction = CryptoServiceProviders
.getSymmetricEncryptionFunction(algorithm);

assertEquals(SYMMETRIC.CODE,resolvedKey.getKeyType().CODE);
assertEquals(128 / 8, resolvedKey.getRawKeyBytes().length);
assertEquals("AES",resolvedKey.getAlgorithm().name());
assertEquals((short) (ENCRYPTION_ALGORITHM | SYMMETRIC_KEY | ((byte) 26 & 0x00FF)),resolvedKey.getAlgorithm().code());
assertArrayEquals(symmetricKeyBytes,resolvedKey.toBytes());
SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();
byte[] symmetricKeyBytes = symmetricKey.toBytes();

algorithm = CryptoServiceProviders.getAlgorithm("ripemd160");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] pubKeyTypeBytes = new byte[] {PUBLIC.CODE};
byte[] rawKeyBytes = symmetricKey.getRawKeyBytes();
byte[] ripemd160KeyBytes = BytesUtils.concat(algoBytes,pubKeyTypeBytes,rawKeyBytes);
assertTrue(symmetricEncryptionFunction.supportSymmetricKey(symmetricKeyBytes));

algorithm = CryptoServiceProviders.getAlgorithm("ripemd160");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] pubKeyTypeBytes = new byte[] { PUBLIC.CODE };
byte[] rawKeyBytes = symmetricKey.getRawKeyBytes();
byte[] ripemd160KeyBytes = BytesUtils.concat(algoBytes, pubKeyTypeBytes, rawKeyBytes);

Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
try {
symmetricEncryptionFunction.resolveSymmetricKey(ripemd160KeyBytes);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
}
assertFalse(symmetricEncryptionFunction.supportSymmetricKey(ripemd160KeyBytes));
}

@Test
public void supportCiphertextTest(){

byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("aes");
assertNotNull(algorithm);

SymmetricEncryptionFunction symmetricEncryptionFunction =
CryptoServiceProviders.getSymmetricEncryptionFunction(algorithm);

SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();

Ciphertext ciphertext = symmetricEncryptionFunction.encrypt(symmetricKey,data);

byte[] ciphertextBytes = ciphertext.toBytes();
assertTrue(symmetricEncryptionFunction.supportCiphertext(ciphertextBytes));
@Test
public void resolveSymmetricKeyTest() {

algorithm = CryptoServiceProviders.getAlgorithm("ripemd160");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] rawCiphertextBytes = ciphertext.toBytes();
byte[] ripemd160CiphertextBytes = BytesUtils.concat(algoBytes,rawCiphertextBytes);
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("aes");
assertNotNull(algorithm);

assertFalse(symmetricEncryptionFunction.supportCiphertext(ripemd160CiphertextBytes));
}
SymmetricEncryptionFunction symmetricEncryptionFunction = CryptoServiceProviders
.getSymmetricEncryptionFunction(algorithm);

@Test
public void resolveCiphertextTest(){
SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();
byte[] symmetricKeyBytes = symmetricKey.toBytes();

SymmetricKey resolvedKey = symmetricEncryptionFunction.resolveSymmetricKey(symmetricKeyBytes);

assertEquals(SYMMETRIC.CODE, resolvedKey.getKeyType().CODE);
assertEquals(128 / 8, resolvedKey.getRawKeyBytes().length);
assertEquals(ClassicAlgorithm.AES, resolvedKey.getAlgorithm());
assertEquals((short) (ENCRYPTION_ALGORITHM | SYMMETRIC_KEY | ((byte) 26 & 0x00FF)), resolvedKey.getAlgorithm());
assertArrayEquals(symmetricKeyBytes, resolvedKey.toBytes());

algorithm = CryptoServiceProviders.getAlgorithm("ripemd160");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] pubKeyTypeBytes = new byte[] { PUBLIC.CODE };
byte[] rawKeyBytes = symmetricKey.getRawKeyBytes();
byte[] ripemd160KeyBytes = BytesUtils.concat(algoBytes, pubKeyTypeBytes, rawKeyBytes);

Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
try {
symmetricEncryptionFunction.resolveSymmetricKey(ripemd160KeyBytes);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
}

@Test
public void supportCiphertextTest() {

byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("aes");
assertNotNull(algorithm);

SymmetricEncryptionFunction symmetricEncryptionFunction = CryptoServiceProviders
.getSymmetricEncryptionFunction(algorithm);

SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();

Ciphertext ciphertext = symmetricEncryptionFunction.encrypt(symmetricKey, data);

byte[] ciphertextBytes = ciphertext.toBytes();
assertTrue(symmetricEncryptionFunction.supportCiphertext(ciphertextBytes));

algorithm = CryptoServiceProviders.getAlgorithm("ripemd160");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] rawCiphertextBytes = ciphertext.toBytes();
byte[] ripemd160CiphertextBytes = BytesUtils.concat(algoBytes, rawCiphertextBytes);

assertFalse(symmetricEncryptionFunction.supportCiphertext(ripemd160CiphertextBytes));
}

@Test
public void resolveCiphertextTest() {

byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("aes");
assertNotNull(algorithm);
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("aes");
assertNotNull(algorithm);

SymmetricEncryptionFunction symmetricEncryptionFunction =
CryptoServiceProviders.getSymmetricEncryptionFunction(algorithm);
SymmetricEncryptionFunction symmetricEncryptionFunction = CryptoServiceProviders
.getSymmetricEncryptionFunction(algorithm);

SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();
SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();

Ciphertext ciphertext = symmetricEncryptionFunction.encrypt(symmetricKey,data);
Ciphertext ciphertext = symmetricEncryptionFunction.encrypt(symmetricKey, data);

byte[] ciphertextBytes = ciphertext.toBytes();
byte[] ciphertextBytes = ciphertext.toBytes();

Ciphertext resolvedCiphertext = symmetricEncryptionFunction.resolveCiphertext(ciphertextBytes);
Ciphertext resolvedCiphertext = symmetricEncryptionFunction.resolveCiphertext(ciphertextBytes);

assertEquals(1024 + 16 , resolvedCiphertext.getRawCiphertext().length);
assertEquals("AES",resolvedCiphertext.getAlgorithm().name());
assertEquals((short) (ENCRYPTION_ALGORITHM | SYMMETRIC_KEY | ((byte) 26 & 0x00FF)),resolvedCiphertext.getAlgorithm().code());
assertArrayEquals(ciphertextBytes,resolvedCiphertext.toBytes());
assertEquals(1024 + 16, resolvedCiphertext.getRawCiphertext().length);
assertEquals(ClassicAlgorithm.AES, resolvedCiphertext.getAlgorithm());
assertEquals((short) (ENCRYPTION_ALGORITHM | SYMMETRIC_KEY | ((byte) 26 & 0x00FF)),
resolvedCiphertext.getAlgorithm());
assertArrayEquals(ciphertextBytes, resolvedCiphertext.toBytes());

assertArrayEquals(ciphertext.toBytes(),resolvedCiphertext.toBytes());
assertArrayEquals(ciphertext.getRawCiphertext(),resolvedCiphertext.getRawCiphertext());
assertEquals(ciphertext.getAlgorithm().name(),resolvedCiphertext.getAlgorithm().name());
assertEquals(ciphertext.getAlgorithm().code(),resolvedCiphertext.getAlgorithm().code());
assertArrayEquals(ciphertext.toBytes(), resolvedCiphertext.toBytes());
assertArrayEquals(ciphertext.getRawCiphertext(), resolvedCiphertext.getRawCiphertext());
assertEquals(ciphertext.getAlgorithm(), resolvedCiphertext.getAlgorithm());

algorithm = CryptoServiceProviders.getAlgorithm("ripemd160");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] rawCiphertextBytes = ciphertext.getRawCiphertext();
byte[] ripemd160CiphertextBytes = BytesUtils.concat(algoBytes,rawCiphertextBytes);
algorithm = CryptoServiceProviders.getAlgorithm("ripemd160");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] rawCiphertextBytes = ciphertext.getRawCiphertext();
byte[] ripemd160CiphertextBytes = BytesUtils.concat(algoBytes, rawCiphertextBytes);

Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
try {
symmetricEncryptionFunction.resolveCiphertext(ripemd160CiphertextBytes);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
}
Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
try {
symmetricEncryptionFunction.resolveCiphertext(ripemd160CiphertextBytes);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
}
}

+ 33
- 23
source/crypto/crypto-classic/src/test/java/test/com/jd/blockchain/crypto/service/classic/ED25519SignatureFunctionTest.java View File

@@ -1,16 +1,30 @@
package test.com.jd.blockchain.crypto.service.classic;

import com.jd.blockchain.crypto.*;
import com.jd.blockchain.utils.io.BytesUtils;
import org.junit.Test;

import java.util.Random;

import static com.jd.blockchain.crypto.CryptoAlgorithm.ASYMMETRIC_KEY;
import static com.jd.blockchain.crypto.CryptoAlgorithm.SIGNATURE_ALGORITHM;
import static com.jd.blockchain.crypto.CryptoKeyType.PRIVATE;
import static com.jd.blockchain.crypto.CryptoKeyType.PUBLIC;
import static org.junit.Assert.*;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

import java.util.Random;

import org.junit.Test;

import com.jd.blockchain.crypto.CryptoAlgorithm;
import com.jd.blockchain.crypto.CryptoException;
import com.jd.blockchain.crypto.CryptoKeyPair;
import com.jd.blockchain.crypto.CryptoServiceProviders;
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.ClassicAlgorithm;
import com.jd.blockchain.utils.io.BytesUtils;

/**
* @author zhanglin33
@@ -60,10 +74,8 @@ public class ED25519SignatureFunctionTest {
assertEquals(PRIVATE.CODE,privKey.getKeyType().CODE);
assertEquals(32, privKey.getRawKeyBytes().length);

assertEquals(algorithm.name(),pubKey.getAlgorithm().name());
assertEquals(algorithm.code(),pubKey.getAlgorithm().code());
assertEquals(algorithm.name(),privKey.getAlgorithm().name());
assertEquals(algorithm.code(),privKey.getAlgorithm().code());
assertEquals(algorithm.code(),pubKey.getAlgorithm());
assertEquals(algorithm.code(),privKey.getAlgorithm());

assertEquals(2 + 1 + 32, pubKey.toBytes().length);
assertEquals(2 + 1 + 32, privKey.toBytes().length);
@@ -94,8 +106,7 @@ public class ED25519SignatureFunctionTest {

assertEquals(pubKey.getKeyType(),retrievedPubKey.getKeyType());
assertEquals(pubKey.getRawKeyBytes().length, retrievedPubKey.getRawKeyBytes().length);
assertEquals(pubKey.getAlgorithm().name(),retrievedPubKey.getAlgorithm().name());
assertEquals(pubKey.getAlgorithm().code(),retrievedPubKey.getAlgorithm().code());
assertEquals(pubKey.getAlgorithm(),retrievedPubKey.getAlgorithm());
assertArrayEquals(pubKey.toBytes(),retrievedPubKey.toBytes());
}

@@ -119,12 +130,11 @@ public class ED25519SignatureFunctionTest {
byte[] signatureBytes = signatureDigest.toBytes();

assertEquals(2 + 64, signatureBytes.length);
CryptoAlgorithm signatureAlgo = signatureDigest.getAlgorithm();
assertEquals("ED25519",signatureAlgo.name());
assertEquals(ClassicAlgorithm.ED25519.code(),signatureDigest.getAlgorithm());
assertEquals((short) (SIGNATURE_ALGORITHM | ASYMMETRIC_KEY | ((byte) 21 & 0x00FF)),
signatureAlgo.code());
signatureDigest.getAlgorithm());

byte[] algoBytes = CryptoAlgorithm.toBytes(signatureAlgo);
byte[] algoBytes = BytesUtils.toBytes(signatureDigest.getAlgorithm());
byte[] rawSinatureBytes = signatureDigest.getRawDigest();
assertArrayEquals(BytesUtils.concat(algoBytes,rawSinatureBytes),signatureBytes);
}
@@ -192,9 +202,9 @@ public class ED25519SignatureFunctionTest {

assertEquals(PRIVATE.CODE,resolvedPrivKey.getKeyType().CODE);
assertEquals(32, resolvedPrivKey.getRawKeyBytes().length);
assertEquals("ED25519",resolvedPrivKey.getAlgorithm().name());
assertEquals(ClassicAlgorithm.ED25519.code(),resolvedPrivKey.getAlgorithm());
assertEquals((short) (SIGNATURE_ALGORITHM | ASYMMETRIC_KEY | ((byte) 21 & 0x00FF)),
resolvedPrivKey.getAlgorithm().code());
resolvedPrivKey.getAlgorithm());
assertArrayEquals(privKeyBytes,resolvedPrivKey.toBytes());

algorithm = CryptoServiceProviders.getAlgorithm("ripemd160");
@@ -257,9 +267,9 @@ public class ED25519SignatureFunctionTest {

assertEquals(PUBLIC.CODE,resolvedPubKey.getKeyType().CODE);
assertEquals(32, resolvedPubKey.getRawKeyBytes().length);
assertEquals("ED25519",resolvedPubKey.getAlgorithm().name());
assertEquals(ClassicAlgorithm.ED25519.code(),resolvedPubKey.getAlgorithm());
assertEquals((short) (SIGNATURE_ALGORITHM | ASYMMETRIC_KEY | ((byte) 21 & 0x00FF)),
resolvedPubKey.getAlgorithm().code());
resolvedPubKey.getAlgorithm());
assertArrayEquals(pubKeyBytes,resolvedPubKey.toBytes());

algorithm = CryptoServiceProviders.getAlgorithm("ripemd160");
@@ -336,9 +346,9 @@ public class ED25519SignatureFunctionTest {
SignatureDigest resolvedSignatureDigest = signatureFunction.resolveDigest(signatureDigestBytes);

assertEquals(64, resolvedSignatureDigest.getRawDigest().length);
assertEquals("ED25519",resolvedSignatureDigest.getAlgorithm().name());
assertEquals(ClassicAlgorithm.ED25519,resolvedSignatureDigest.getAlgorithm());
assertEquals((short) (SIGNATURE_ALGORITHM | ASYMMETRIC_KEY | ((byte) 21 & 0x00FF)),
resolvedSignatureDigest.getAlgorithm().code());
resolvedSignatureDigest.getAlgorithm());
assertArrayEquals(signatureDigestBytes,resolvedSignatureDigest.toBytes());

algorithm = CryptoServiceProviders.getAlgorithm("ripemd160");


+ 135
- 135
source/crypto/crypto-classic/src/test/java/test/com/jd/blockchain/crypto/service/classic/RIPEMD160HashFunctionTest.java View File

@@ -5,6 +5,7 @@ import com.jd.blockchain.crypto.CryptoException;
import com.jd.blockchain.crypto.CryptoServiceProviders;
import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.HashFunction;
import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm;
import com.jd.blockchain.utils.io.BytesUtils;
import org.junit.Test;

@@ -22,152 +23,151 @@ import static org.junit.Assert.assertEquals;
*/
public class RIPEMD160HashFunctionTest {

@Test
public void getAlgorithmTest(){
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("RIPEMD160");
assertNotNull(algorithm);
@Test
public void getAlgorithmTest() {
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("RIPEMD160");
assertNotNull(algorithm);

HashFunction hashFunction = CryptoServiceProviders.getHashFunction(algorithm);
HashFunction hashFunction = CryptoServiceProviders.getHashFunction(algorithm);

assertEquals(hashFunction.getAlgorithm().name(), algorithm.name());
assertEquals(hashFunction.getAlgorithm().code(), algorithm.code());
assertEquals(hashFunction.getAlgorithm().name(), algorithm.name());
assertEquals(hashFunction.getAlgorithm().code(), algorithm.code());

algorithm = CryptoServiceProviders.getAlgorithm("RIPEmd160");
assertNotNull(algorithm);
algorithm = CryptoServiceProviders.getAlgorithm("RIPEmd160");
assertNotNull(algorithm);

assertEquals(hashFunction.getAlgorithm().name(), algorithm.name());
assertEquals(hashFunction.getAlgorithm().code(), algorithm.code());
assertEquals(hashFunction.getAlgorithm().name(), algorithm.name());
assertEquals(hashFunction.getAlgorithm().code(), algorithm.code());

algorithm = CryptoServiceProviders.getAlgorithm("RIPEMD-160");
assertNull(algorithm);
}
algorithm = CryptoServiceProviders.getAlgorithm("RIPEMD-160");
assertNull(algorithm);
}

@Test
public void hashTest(){
@Test
public void hashTest() {

byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("RIPEMD160");
assertNotNull(algorithm);
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("RIPEMD160");
assertNotNull(algorithm);

HashFunction hashFunction = CryptoServiceProviders.getHashFunction(algorithm);
HashFunction hashFunction = CryptoServiceProviders.getHashFunction(algorithm);

HashDigest digest = hashFunction.hash(data);
byte[] rawDigestBytes = digest.getRawDigest();
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
HashDigest digest = hashFunction.hash(data);
byte[] rawDigestBytes = digest.getRawDigest();
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);

byte[] digestBytes = digest.toBytes();
assertEquals(160 / 8 + 2,digestBytes.length);
assertArrayEquals(digestBytes, BytesUtils.concat(algoBytes, rawDigestBytes));
byte[] digestBytes = digest.toBytes();
assertEquals(160 / 8 + 2, digestBytes.length);
assertArrayEquals(digestBytes, BytesUtils.concat(algoBytes, rawDigestBytes));

assertEquals(algorithm.code(),digest.getAlgorithm().code());
assertEquals(algorithm.name(),digest.getAlgorithm().name());
assertEquals(algorithm.code(), digest.getAlgorithm());

Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
try {
data = null;
hashFunction.hash(data);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
}
@Test
public void verifyTest(){
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("RIPEMD160");
assertNotNull(algorithm);
HashFunction hashFunction = CryptoServiceProviders.getHashFunction(algorithm);
HashDigest digest = hashFunction.hash(data);
assertTrue(hashFunction.verify(digest,data));
}
@Test
public void supportHashDigestTest(){
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("RIPEMD160");
assertNotNull(algorithm);
HashFunction hashFunction = CryptoServiceProviders.getHashFunction(algorithm);
HashDigest digest = hashFunction.hash(data);
byte[] digestBytes = digest.toBytes();
assertTrue(hashFunction.supportHashDigest(digestBytes));
algorithm = CryptoServiceProviders.getAlgorithm("aes");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
System.arraycopy(algoBytes,0,digestBytes,0,algoBytes.length);
assertFalse(hashFunction.supportHashDigest(digestBytes));
}
@Test
public void resolveHashDigestTest(){
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("RIPEMD160");
assertNotNull(algorithm);
HashFunction hashFunction = CryptoServiceProviders.getHashFunction(algorithm);
HashDigest digest = hashFunction.hash(data);
byte[] digestBytes = digest.toBytes();
HashDigest resolvedDigest = hashFunction.resolveHashDigest(digestBytes);
assertEquals(160 / 8,resolvedDigest.getRawDigest().length);
assertEquals("RIPEMD160",resolvedDigest.getAlgorithm().name());
assertEquals((short) (HASH_ALGORITHM | ((byte) 25 & 0x00FF)),resolvedDigest.getAlgorithm().code());
assertArrayEquals(digestBytes,resolvedDigest.toBytes());
algorithm = CryptoServiceProviders.getAlgorithm("aes");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] rawDigestBytes = digest.getRawDigest();
byte[] aesDigestBytes = BytesUtils.concat(algoBytes,rawDigestBytes);
Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
try {
hashFunction.resolveHashDigest(aesDigestBytes);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
algorithm = CryptoServiceProviders.getAlgorithm("sha256");
assertNotNull(algorithm);
algoBytes = CryptoAlgorithm.toBytes(algorithm);
rawDigestBytes = digest.getRawDigest();
byte[] ripemd160DigestBytes = BytesUtils.concat(algoBytes,rawDigestBytes);
expectedException = CryptoException.class;
actualEx = null;
try {
hashFunction.resolveHashDigest(ripemd160DigestBytes);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
}
Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
try {
data = null;
hashFunction.hash(data);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
}
@Test
public void verifyTest() {
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("RIPEMD160");
assertNotNull(algorithm);
HashFunction hashFunction = CryptoServiceProviders.getHashFunction(algorithm);
HashDigest digest = hashFunction.hash(data);
assertTrue(hashFunction.verify(digest, data));
}
@Test
public void supportHashDigestTest() {
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("RIPEMD160");
assertNotNull(algorithm);
HashFunction hashFunction = CryptoServiceProviders.getHashFunction(algorithm);
HashDigest digest = hashFunction.hash(data);
byte[] digestBytes = digest.toBytes();
assertTrue(hashFunction.supportHashDigest(digestBytes));
algorithm = CryptoServiceProviders.getAlgorithm("aes");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
System.arraycopy(algoBytes, 0, digestBytes, 0, algoBytes.length);
assertFalse(hashFunction.supportHashDigest(digestBytes));
}
@Test
public void resolveHashDigestTest() {
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("RIPEMD160");
assertNotNull(algorithm);
HashFunction hashFunction = CryptoServiceProviders.getHashFunction(algorithm);
HashDigest digest = hashFunction.hash(data);
byte[] digestBytes = digest.toBytes();
HashDigest resolvedDigest = hashFunction.resolveHashDigest(digestBytes);
assertEquals(160 / 8, resolvedDigest.getRawDigest().length);
assertEquals(ClassicAlgorithm.RIPEMD160, resolvedDigest.getAlgorithm());
assertEquals((short) (HASH_ALGORITHM | ((byte) 25 & 0x00FF)), resolvedDigest.getAlgorithm());
assertArrayEquals(digestBytes, resolvedDigest.toBytes());
algorithm = CryptoServiceProviders.getAlgorithm("aes");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] rawDigestBytes = digest.getRawDigest();
byte[] aesDigestBytes = BytesUtils.concat(algoBytes, rawDigestBytes);
Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
try {
hashFunction.resolveHashDigest(aesDigestBytes);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
algorithm = CryptoServiceProviders.getAlgorithm("sha256");
assertNotNull(algorithm);
algoBytes = CryptoAlgorithm.toBytes(algorithm);
rawDigestBytes = digest.getRawDigest();
byte[] ripemd160DigestBytes = BytesUtils.concat(algoBytes, rawDigestBytes);
expectedException = CryptoException.class;
actualEx = null;
try {
hashFunction.resolveHashDigest(ripemd160DigestBytes);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
}
}

+ 133
- 133
source/crypto/crypto-classic/src/test/java/test/com/jd/blockchain/crypto/service/classic/SHA256HashFunctionTest.java View File

@@ -5,6 +5,7 @@ import com.jd.blockchain.crypto.CryptoException;
import com.jd.blockchain.crypto.CryptoServiceProviders;
import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.HashFunction;
import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm;
import com.jd.blockchain.utils.io.BytesUtils;
import org.junit.Test;

@@ -22,152 +23,151 @@ import static org.junit.Assert.*;

public class SHA256HashFunctionTest {

@Test
public void getAlgorithmTest(){
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sha256");
assertNotNull(algorithm);
@Test
public void getAlgorithmTest() {
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sha256");
assertNotNull(algorithm);

HashFunction hashFunction = CryptoServiceProviders.getHashFunction(algorithm);
HashFunction hashFunction = CryptoServiceProviders.getHashFunction(algorithm);

assertEquals(hashFunction.getAlgorithm().name(), algorithm.name());
assertEquals(hashFunction.getAlgorithm().code(), algorithm.code());
assertEquals(hashFunction.getAlgorithm().name(), algorithm.name());
assertEquals(hashFunction.getAlgorithm().code(), algorithm.code());

algorithm = CryptoServiceProviders.getAlgorithm("SHa256");
assertNotNull(algorithm);
algorithm = CryptoServiceProviders.getAlgorithm("SHa256");
assertNotNull(algorithm);

assertEquals(hashFunction.getAlgorithm().name(), algorithm.name());
assertEquals(hashFunction.getAlgorithm().code(), algorithm.code());
assertEquals(hashFunction.getAlgorithm().name(), algorithm.name());
assertEquals(hashFunction.getAlgorithm().code(), algorithm.code());

algorithm = CryptoServiceProviders.getAlgorithm("sha-256");
assertNull(algorithm);
}
algorithm = CryptoServiceProviders.getAlgorithm("sha-256");
assertNull(algorithm);
}

@Test
public void hashTest(){
@Test
public void hashTest() {

byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sha256");
assertNotNull(algorithm);
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sha256");
assertNotNull(algorithm);

HashFunction hashFunction = CryptoServiceProviders.getHashFunction(algorithm);
HashFunction hashFunction = CryptoServiceProviders.getHashFunction(algorithm);

HashDigest digest = hashFunction.hash(data);
byte[] rawDigestBytes = digest.getRawDigest();
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
HashDigest digest = hashFunction.hash(data);
byte[] rawDigestBytes = digest.getRawDigest();
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);

byte[] digestBytes = digest.toBytes();
assertEquals(256 / 8 + 2,digestBytes.length);
assertArrayEquals(digestBytes, BytesUtils.concat(algoBytes, rawDigestBytes));
byte[] digestBytes = digest.toBytes();
assertEquals(256 / 8 + 2, digestBytes.length);
assertArrayEquals(digestBytes, BytesUtils.concat(algoBytes, rawDigestBytes));

assertEquals(algorithm.code(),digest.getAlgorithm().code());
assertEquals(algorithm.name(),digest.getAlgorithm().name());
assertEquals(algorithm.code(), digest.getAlgorithm());

Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
try {
data = null;
hashFunction.hash(data);
} catch (Exception e) {
Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
try {
data = null;
hashFunction.hash(data);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
}
@Test
public void verifyTest(){
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sha256");
assertNotNull(algorithm);
HashFunction hashFunction = CryptoServiceProviders.getHashFunction(algorithm);
HashDigest digest = hashFunction.hash(data);
assertTrue(hashFunction.verify(digest,data));
}
@Test
public void supportHashDigestTest(){
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sha256");
assertNotNull(algorithm);
HashFunction hashFunction = CryptoServiceProviders.getHashFunction(algorithm);
HashDigest digest = hashFunction.hash(data);
byte[] digestBytes = digest.toBytes();
assertTrue(hashFunction.supportHashDigest(digestBytes));
algorithm = CryptoServiceProviders.getAlgorithm("aes");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
System.arraycopy(algoBytes,0,digestBytes,0,algoBytes.length);
assertFalse(hashFunction.supportHashDigest(digestBytes));
}
@Test
public void resolveHashDigestTest(){
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sha256");
assertNotNull(algorithm);
HashFunction hashFunction = CryptoServiceProviders.getHashFunction(algorithm);
HashDigest digest = hashFunction.hash(data);
byte[] digestBytes = digest.toBytes();
HashDigest resolvedDigest = hashFunction.resolveHashDigest(digestBytes);
assertEquals(256 / 8,resolvedDigest.getRawDigest().length);
assertEquals("SHA256",resolvedDigest.getAlgorithm().name());
assertEquals((short) (HASH_ALGORITHM | ((byte) 24 & 0x00FF)),resolvedDigest.getAlgorithm().code());
assertArrayEquals(digestBytes,resolvedDigest.toBytes());
algorithm = CryptoServiceProviders.getAlgorithm("aes");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] rawDigestBytes = digest.getRawDigest();
byte[] aesDigestBytes = BytesUtils.concat(algoBytes,rawDigestBytes);
Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
try {
hashFunction.resolveHashDigest(aesDigestBytes);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
algorithm = CryptoServiceProviders.getAlgorithm("ripemd160");
assertNotNull(algorithm);
algoBytes = CryptoAlgorithm.toBytes(algorithm);
rawDigestBytes = digest.getRawDigest();
byte[] ripemd160DigestBytes = BytesUtils.concat(algoBytes,rawDigestBytes);
expectedException = CryptoException.class;
actualEx = null;
try {
hashFunction.resolveHashDigest(ripemd160DigestBytes);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
}
@Test
public void verifyTest() {
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sha256");
assertNotNull(algorithm);
HashFunction hashFunction = CryptoServiceProviders.getHashFunction(algorithm);
HashDigest digest = hashFunction.hash(data);
assertTrue(hashFunction.verify(digest, data));
}
@Test
public void supportHashDigestTest() {
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sha256");
assertNotNull(algorithm);
HashFunction hashFunction = CryptoServiceProviders.getHashFunction(algorithm);
HashDigest digest = hashFunction.hash(data);
byte[] digestBytes = digest.toBytes();
assertTrue(hashFunction.supportHashDigest(digestBytes));
algorithm = CryptoServiceProviders.getAlgorithm("aes");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
System.arraycopy(algoBytes, 0, digestBytes, 0, algoBytes.length);
assertFalse(hashFunction.supportHashDigest(digestBytes));
}
@Test
public void resolveHashDigestTest() {
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sha256");
assertNotNull(algorithm);
HashFunction hashFunction = CryptoServiceProviders.getHashFunction(algorithm);
HashDigest digest = hashFunction.hash(data);
byte[] digestBytes = digest.toBytes();
HashDigest resolvedDigest = hashFunction.resolveHashDigest(digestBytes);
assertEquals(256 / 8, resolvedDigest.getRawDigest().length);
assertEquals(ClassicAlgorithm.SHA256, resolvedDigest.getAlgorithm());
assertEquals((short) (HASH_ALGORITHM | ((byte) 24 & 0x00FF)), resolvedDigest.getAlgorithm());
assertArrayEquals(digestBytes, resolvedDigest.toBytes());
algorithm = CryptoServiceProviders.getAlgorithm("aes");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] rawDigestBytes = digest.getRawDigest();
byte[] aesDigestBytes = BytesUtils.concat(algoBytes, rawDigestBytes);
Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
try {
hashFunction.resolveHashDigest(aesDigestBytes);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
algorithm = CryptoServiceProviders.getAlgorithm("ripemd160");
assertNotNull(algorithm);
algoBytes = CryptoAlgorithm.toBytes(algorithm);
rawDigestBytes = digest.getRawDigest();
byte[] ripemd160DigestBytes = BytesUtils.concat(algoBytes, rawDigestBytes);
expectedException = CryptoException.class;
actualEx = null;
try {
hashFunction.resolveHashDigest(ripemd160DigestBytes);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
}
}

+ 1
- 1
source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/AddressEncoding.java View File

@@ -55,7 +55,7 @@ public class AddressEncoding {
public static Bytes generateAddress(PubKey pubKey) {
byte[] h1Bytes = ShaUtils.hash_256(pubKey.getRawKeyBytes());
byte[] h2Bytes = RipeMD160Utils.hash(h1Bytes);
byte[] xBytes = BytesUtils.concat(new byte[] { AddressVersion.V1.CODE}, CryptoAlgorithm.toBytes(pubKey.getAlgorithm()), h2Bytes);
byte[] xBytes = BytesUtils.concat(new byte[] { AddressVersion.V1.CODE}, BytesUtils.toBytes(pubKey.getAlgorithm()), h2Bytes);
byte[] checksum = Arrays.copyOf(ShaUtils.hash_256(ShaUtils.hash_256(xBytes)), 4);
byte[] addressBytes = BytesUtils.concat(xBytes, checksum);


+ 1
- 1
source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/AsymmetricCiphertext.java View File

@@ -11,7 +11,7 @@ public class AsymmetricCiphertext extends BaseCryptoBytes implements Ciphertext
}

@Override
protected boolean support(CryptoAlgorithm algorithm) {
protected boolean support(short algorithm) {
return CryptoAlgorithm.isAsymmetricEncryptionAlgorithm(algorithm);
}



+ 28
- 15
source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/BaseCryptoBytes.java View File

@@ -8,47 +8,60 @@ import com.jd.blockchain.utils.io.BytesUtils;

public abstract class BaseCryptoBytes extends Bytes implements CryptoBytes {

private CryptoAlgorithm algorithm;
private short algorithm;
public BaseCryptoBytes() {
super();
}
public BaseCryptoBytes(short algorithm, byte[] rawCryptoBytes) {
super(encodeBytes(algorithm, rawCryptoBytes));
this.algorithm = algorithm;
}

public BaseCryptoBytes(CryptoAlgorithm algorithm, byte[] rawCryptoBytes) {
super(encodeBytes(algorithm, rawCryptoBytes));
this.algorithm = algorithm;
this.algorithm = algorithm.code();
}

public BaseCryptoBytes(byte[] cryptoBytes) {
super(cryptoBytes);
CryptoAlgorithm algorithm = decodeAlgorithm(cryptoBytes);
short algorithm = decodeAlgorithm(cryptoBytes);
if (!support(algorithm)) {
throw new CryptoException("Not supported algorithm[" + algorithm.toString() + "]!");
throw new CryptoException("Not supported algorithm [code:" + algorithm + "]!");
}
this.algorithm = algorithm;
}
static byte[] encodeBytes(short algorithm, byte[] rawCryptoBytes) {
return BytesUtils.concat(BytesUtils.toBytes(algorithm), rawCryptoBytes);
}

static byte[] encodeBytes(CryptoAlgorithm algorithm, byte[] rawCryptoBytes) {
return BytesUtils.concat(CryptoAlgorithm.toBytes(algorithm), rawCryptoBytes);
}

static CryptoAlgorithm decodeAlgorithm(byte[] cryptoBytes) {
short algorithmCode = BytesUtils.toShort(cryptoBytes, 0);
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm(algorithmCode);
if (algorithm == null) {
throw new CryptoException("The algorithm with code[" + algorithmCode + "] is not supported!");
}
return algorithm;
static short decodeAlgorithm(byte[] cryptoBytes) {
return CryptoAlgorithm.resolveCode(cryptoBytes);
}

protected abstract boolean support(CryptoAlgorithm algorithm);
// static CryptoAlgorithm decodeAlgorithm(byte[] cryptoBytes) {
// short algorithmCode = BytesUtils.toShort(cryptoBytes, 0);
// CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm(algorithmCode);
// if (algorithm == null) {
// throw new CryptoException("The algorithm with code[" + algorithmCode + "] is not supported!");
// }
// return algorithm;
// }

protected abstract boolean support(short algorithm);

protected byte[] resolveRawCryptoBytes(byte[] cryptoBytes) {
return Arrays.copyOfRange(cryptoBytes, 1, cryptoBytes.length);
}

@Override
public CryptoAlgorithm getAlgorithm() {
public short getAlgorithm() {
return algorithm;
}



+ 5
- 1
source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/BaseCryptoKey.java View File

@@ -13,6 +13,10 @@ public abstract class BaseCryptoKey extends BaseCryptoBytes implements CryptoKey
// public BaseCryptoKey() {
// super();
// }
protected BaseCryptoKey(short algorithm, byte[] rawKeyBytes, CryptoKeyType keyType) {
super(algorithm, encodeKeyBytes(rawKeyBytes, keyType));
}

protected BaseCryptoKey(CryptoAlgorithm algorithm, byte[] rawKeyBytes, CryptoKeyType keyType) {
super(algorithm, encodeKeyBytes(rawKeyBytes, keyType));
@@ -35,7 +39,7 @@ public abstract class BaseCryptoKey extends BaseCryptoBytes implements CryptoKey
}

@Override
protected boolean support(CryptoAlgorithm algorithm) {
protected boolean support(short algorithm) {
return CryptoAlgorithm.hasAsymmetricKey(algorithm) || CryptoAlgorithm.hasSymmetricKey(algorithm);
}



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

@@ -1,5 +1,8 @@
package com.jd.blockchain.crypto;

import java.io.InputStream;
import java.io.OutputStream;

import com.jd.blockchain.binaryproto.DataContract;
import com.jd.blockchain.binaryproto.DataField;
import com.jd.blockchain.consts.TypeCodes;
@@ -90,6 +93,14 @@ public interface CryptoAlgorithm {
return BytesUtils.toShort(algorithmBytes, offset);
}

static short resolveCode(InputStream in) {
return BytesUtils.readShort(in);
}

static int writeCode(short code, OutputStream out) {
return BytesUtils.writeShort(code, out);
}

static boolean match(CryptoAlgorithm algorithm, byte[] algorithmBytes) {
return algorithm.code() == BytesUtils.toShort(algorithmBytes, 0);
}
@@ -116,6 +127,24 @@ public interface CryptoAlgorithm {
return HASH_ALGORITHM == (algorithm.code() & HASH_ALGORITHM);
}

/**
* 是否属于摘要算法;
*
* @return
*/
static boolean isHashAlgorithm(short algorithm) {
return HASH_ALGORITHM == (algorithm & HASH_ALGORITHM);
}

/**
* 是否属于签名算法;
*
* @return
*/
static boolean isSignatureAlgorithm(short algorithm) {
return SIGNATURE_ALGORITHM == (algorithm & SIGNATURE_ALGORITHM);
}

/**
* 是否属于签名算法;
*
@@ -125,6 +154,15 @@ public interface CryptoAlgorithm {
return SIGNATURE_ALGORITHM == (algorithm.code() & SIGNATURE_ALGORITHM);
}

/**
* 是否属于加密算法;
*
* @return
*/
static boolean isEncryptionAlgorithm(short algorithm) {
return ENCRYPTION_ALGORITHM == (algorithm & ENCRYPTION_ALGORITHM);
}

/**
* 是否属于加密算法;
*
@@ -143,6 +181,15 @@ public interface CryptoAlgorithm {
return EXT_ALGORITHM == (algorithm.code() & 0xF000);
}

/**
* 算法是否包含非对称密钥;
*
* @return
*/
static boolean hasAsymmetricKey(short algorithm) {
return ASYMMETRIC_KEY == (algorithm & ASYMMETRIC_KEY);
}

/**
* 算法是否包含非对称密钥;
*
@@ -152,6 +199,15 @@ public interface CryptoAlgorithm {
return ASYMMETRIC_KEY == (algorithm.code() & ASYMMETRIC_KEY);
}

/**
* 算法是否包含对称密钥;
*
* @return
*/
static boolean hasSymmetricKey(short algorithm) {
return SYMMETRIC_KEY == (algorithm & SYMMETRIC_KEY);
}

/**
* 算法是否包含对称密钥;
*
@@ -171,6 +227,16 @@ public interface CryptoAlgorithm {
return isEncryptionAlgorithm(algorithm) && hasSymmetricKey(algorithm);
}

/**
* 是否属于非对称加密算法;
*
* @param algorithm
* @return
*/
static boolean isAsymmetricEncryptionAlgorithm(short algorithm) {
return isEncryptionAlgorithm(algorithm) && hasAsymmetricKey(algorithm);
}

/**
* 是否属于非对称加密算法;
*


+ 1
- 1
source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/CryptoBytes.java View File

@@ -20,7 +20,7 @@ public interface CryptoBytes extends BytesSerializable {
*
* @return
*/
CryptoAlgorithm getAlgorithm();
short getAlgorithm();

/**
* 返回编码后的摘要信息;<br>


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

@@ -6,7 +6,7 @@ public class CryptoKeyPair {

private PrivKey privKey;

public CryptoAlgorithm getAlgorithm() {
public short getAlgorithm() {
return pubKey.getAlgorithm();
}

@@ -19,7 +19,7 @@ public class CryptoKeyPair {
}

public CryptoKeyPair(PubKey pubKey, PrivKey privKey) {
if (!CryptoAlgorithm.equals(pubKey.getAlgorithm(), privKey.getAlgorithm())) {
if (pubKey.getAlgorithm() != privKey.getAlgorithm()) {
throw new IllegalArgumentException("The algorithms of PubKey and PrivKey don't match!");
}
this.pubKey = pubKey;


+ 1
- 1
source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/HashDigest.java View File

@@ -19,7 +19,7 @@ public class HashDigest extends BaseCryptoBytes implements CryptoDigest,Serializ
}
@Override
protected boolean support(CryptoAlgorithm algorithm) {
protected boolean support(short algorithm) {
return CryptoAlgorithm.isHashAlgorithm(algorithm);
}



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

@@ -8,6 +8,10 @@ package com.jd.blockchain.crypto;
*/
public class PrivKey extends BaseCryptoKey {
private static final long serialVersionUID = 6265440395252295646L;
public PrivKey(short algorithm, byte[] rawCryptoBytes) {
super(algorithm, rawCryptoBytes, CryptoKeyType.PRIVATE);
}
public PrivKey(CryptoAlgorithm algorithm, byte[] rawCryptoBytes) {
super(algorithm, rawCryptoBytes, CryptoKeyType.PRIVATE);


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

@@ -9,6 +9,10 @@ package com.jd.blockchain.crypto;
public class PubKey extends BaseCryptoKey {

private static final long serialVersionUID = -2055071197736385328L;
public PubKey(short algorithm, byte[] rawCryptoBytes) {
super(algorithm, rawCryptoBytes, CryptoKeyType.PUBLIC);
}

public PubKey(CryptoAlgorithm algorithm, byte[] rawCryptoBytes) {
super(algorithm, rawCryptoBytes, CryptoKeyType.PUBLIC);


+ 1
- 1
source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/SignatureDigest.java View File

@@ -14,7 +14,7 @@ public class SignatureDigest extends BaseCryptoBytes implements CryptoDigest {
}

@Override
protected boolean support(CryptoAlgorithm algorithm) {
protected boolean support(short algorithm) {
return CryptoAlgorithm.isSignatureAlgorithm(algorithm);
}



+ 1
- 1
source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/SymmetricCiphertext.java View File

@@ -11,7 +11,7 @@ public class SymmetricCiphertext extends BaseCryptoBytes implements Ciphertext {
}

@Override
protected boolean support(CryptoAlgorithm algorithm) {
protected boolean support(short algorithm) {
return CryptoAlgorithm.isEncryptionAlgorithm(algorithm) && CryptoAlgorithm.hasSymmetricKey(algorithm);
}


+ 6
- 5
source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/serialize/ByteArrayObjectSerializer.java View File

@@ -1,5 +1,7 @@
package com.jd.blockchain.crypto.serialize;

import java.lang.reflect.Type;

import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import com.jd.blockchain.crypto.HashDigest;
@@ -8,9 +10,6 @@ import com.jd.blockchain.crypto.SignatureDigest;
import com.jd.blockchain.utils.Bytes;
import com.jd.blockchain.utils.io.BytesSlice;

import java.io.IOException;
import java.lang.reflect.Type;

public class ByteArrayObjectSerializer implements ObjectSerializer {

private Class<?> clazz;
@@ -51,11 +50,13 @@ public class ByteArrayObjectSerializer implements ObjectSerializer {
this.value = value;
}

public String getValue() {
@SuppressWarnings("unused")
public String getValue() {
return value;
}

public void setValue(String value) {
@SuppressWarnings("unused")
public void setValue(String value) {
this.value = value;
}
}


+ 17
- 8
source/crypto/crypto-sm/src/main/java/com/jd/blockchain/crypto/service/sm/SM2CryptoFunction.java View File

@@ -5,16 +5,25 @@ import static com.jd.blockchain.crypto.CryptoBytes.ALGORYTHM_CODE_SIZE;
import static com.jd.blockchain.crypto.CryptoKeyType.PRIVATE;
import static com.jd.blockchain.crypto.CryptoKeyType.PUBLIC;

import com.jd.blockchain.crypto.*;
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;

import com.jd.blockchain.crypto.AsymmetricCiphertext;
import com.jd.blockchain.crypto.AsymmetricEncryptionFunction;
import com.jd.blockchain.crypto.Ciphertext;
import com.jd.blockchain.crypto.CryptoAlgorithm;
import com.jd.blockchain.crypto.CryptoException;
import com.jd.blockchain.crypto.CryptoKeyPair;
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.utils.sm.SM2Utils;

public class SM2CryptoFunction implements AsymmetricEncryptionFunction, SignatureFunction {

private static final CryptoAlgorithm SM2 = SMCryptoService.SM2_ALGORITHM;
private static final CryptoAlgorithm SM2 = SMAlgorithm.SM2;

private static final int ECPOINT_SIZE = 65;
private static final int PRIVKEY_SIZE = 32;
@@ -39,7 +48,7 @@ public class SM2CryptoFunction implements AsymmetricEncryptionFunction, Signatur
}

// 验证密钥数据的算法标识对应SM2算法
if (pubKey.getAlgorithm().code() != SM2.code()) {
if (pubKey.getAlgorithm() != SM2.code()) {
throw new CryptoException("The is not sm2 public key!");
}

@@ -59,12 +68,12 @@ public class SM2CryptoFunction implements AsymmetricEncryptionFunction, Signatur
}

// 验证密钥数据的算法标识对应SM2算法
if (privKey.getAlgorithm().code() != SM2.code()) {
if (privKey.getAlgorithm() != SM2.code()) {
throw new CryptoException("This key is not SM2 private key!");
}

// 验证密文数据的算法标识对应SM2签名算法,并且原始摘要长度为64字节
if (ciphertext.getAlgorithm().code() != SM2.code()
if (ciphertext.getAlgorithm() != SM2.code()
|| rawCiphertextBytes.length < ECPOINT_SIZE + HASHDIGEST_SIZE) {
throw new CryptoException("This is not SM2 ciphertext!");
}
@@ -147,7 +156,7 @@ public class SM2CryptoFunction implements AsymmetricEncryptionFunction, Signatur
}

// 验证密钥数据的算法标识对应SM2签名算法
if (privKey.getAlgorithm().code() != SM2.code()) {
if (privKey.getAlgorithm() != SM2.code()) {
throw new CryptoException("This key is not SM2 private key!");
}

@@ -167,12 +176,12 @@ public class SM2CryptoFunction implements AsymmetricEncryptionFunction, Signatur
}

// 验证密钥数据的算法标识对应SM2签名算法
if (pubKey.getAlgorithm().code() != SM2.code()) {
if (pubKey.getAlgorithm() != SM2.code()) {
throw new CryptoException("This key is not SM2 public key!");
}

// 验证签名数据的算法标识对应SM2签名算法,并且原始签名长度为64字节
if (digest.getAlgorithm().code() != SM2.code() || rawDigestBytes.length != SIGNATUREDIGEST_SIZE) {
if (digest.getAlgorithm() != SM2.code() || rawDigestBytes.length != SIGNATUREDIGEST_SIZE) {
throw new CryptoException("This is not SM2 signature digest!");
}



+ 1
- 1
source/crypto/crypto-sm/src/main/java/com/jd/blockchain/crypto/service/sm/SM3HashFunction.java View File

@@ -11,7 +11,7 @@ import com.jd.blockchain.crypto.utils.sm.SM3Utils;

public class SM3HashFunction implements HashFunction {

private static final CryptoAlgorithm SM3 = SMCryptoService.SM3_ALGORITHM;
private static final CryptoAlgorithm SM3 = SMAlgorithm.SM3;

private static final int DIGEST_BYTES = 256 / 8;



+ 27
- 26
source/crypto/crypto-sm/src/main/java/com/jd/blockchain/crypto/service/sm/SM4EncryptionFunction.java View File

@@ -13,7 +13,7 @@ import com.jd.blockchain.crypto.utils.sm.SM4Utils;

public class SM4EncryptionFunction implements SymmetricEncryptionFunction {

private static final CryptoAlgorithm SM4 = SMCryptoService.SM4_ALGORITHM;
private static final CryptoAlgorithm SM4 = SMAlgorithm.SM4;

private static final int KEY_SIZE = 128 / 8;
private static final int BLOCK_SIZE = 128 / 8;
@@ -38,7 +38,7 @@ public class SM4EncryptionFunction implements SymmetricEncryptionFunction {
}

// 验证密钥数据的算法标识对应SM4算法
if (key.getAlgorithm().code() != SM4.code()) {
if (key.getAlgorithm() != SM4.code()) {
throw new CryptoException("The is not SM4 symmetric key!");
}

@@ -53,7 +53,8 @@ public class SM4EncryptionFunction implements SymmetricEncryptionFunction {
try {
byte[] buffBytes = new byte[PLAINTEXT_BUFFER_LENGTH];

// The final byte of plaintextWithPadding represents the length of padding in the first 256 bytes,
// The final byte of plaintextWithPadding represents the length of padding in
// the first 256 bytes,
// and the padded value in hexadecimal
byte[] plaintextWithPadding = new byte[buffBytes.length + 1];

@@ -62,21 +63,21 @@ public class SM4EncryptionFunction implements SymmetricEncryptionFunction {
int len;
int i;

while((len=in.read(buffBytes)) > 0) {
while ((len = in.read(buffBytes)) > 0) {
padding = (byte) (PLAINTEXT_BUFFER_LENGTH - len);
i = len;
while (i < plaintextWithPadding.length) {
plaintextWithPadding[i] = padding;
i++;
}
out.write(encrypt(key,plaintextWithPadding).toBytes());
out.write(encrypt(key, plaintextWithPadding).toBytes());
}
// byte[] sm4Data = new byte[in.available()];
// in.read(sm4Data);
// in.close();
//
// out.write(encrypt(key, sm4Data).toBytes());
// out.close();
// byte[] sm4Data = new byte[in.available()];
// in.read(sm4Data);
// in.close();
//
// out.write(encrypt(key, sm4Data).toBytes());
// out.close();
} catch (IOException e) {
throw new CryptoException(e.getMessage(), e);
}
@@ -94,7 +95,7 @@ public class SM4EncryptionFunction implements SymmetricEncryptionFunction {
}

// 验证密钥数据的算法标识对应SM4算法
if (key.getAlgorithm().code() != SM4.code()) {
if (key.getAlgorithm() != SM4.code()) {
throw new CryptoException("The is not SM4 symmetric key!");
}

@@ -104,7 +105,7 @@ public class SM4EncryptionFunction implements SymmetricEncryptionFunction {
}

// 验证密文数据算法标识对应SM4算法
if (ciphertext.getAlgorithm().code() != SM4.code()) {
if (ciphertext.getAlgorithm() != SM4.code()) {
throw new CryptoException("This is not SM4 ciphertext!");
}

@@ -122,7 +123,7 @@ public class SM4EncryptionFunction implements SymmetricEncryptionFunction {
byte padding;
byte[] plaintext;

int len,i;
int len, i;
while ((len = in.read(buffBytes)) > 0) {
if (len != CIPHERTEXT_BUFFER_LENGTH) {
throw new CryptoException("inputStream's length is wrong!");
@@ -131,7 +132,7 @@ public class SM4EncryptionFunction implements SymmetricEncryptionFunction {
throw new CryptoException("InputStream is not valid SM4 ciphertext!");
}

plaintextWithPadding = decrypt(key,resolveCiphertext(buffBytes));
plaintextWithPadding = decrypt(key, resolveCiphertext(buffBytes));

if (plaintextWithPadding.length != (PLAINTEXT_BUFFER_LENGTH + 1)) {
throw new CryptoException("The decrypted plaintext is invalid");
@@ -148,19 +149,19 @@ public class SM4EncryptionFunction implements SymmetricEncryptionFunction {
i--;
}
plaintext = new byte[PLAINTEXT_BUFFER_LENGTH - padding];
System.arraycopy(plaintextWithPadding,0,plaintext,0,plaintext.length);
System.arraycopy(plaintextWithPadding, 0, plaintext, 0, plaintext.length);
out.write(plaintext);
}
// byte[] sm4Data = new byte[in.available()];
// in.read(sm4Data);
// in.close();
//
// if (!supportCiphertext(sm4Data)) {
// throw new CryptoException("InputStream is not valid SM4 ciphertext!");
// }
//
// out.write(decrypt(key, resolveCiphertext(sm4Data)));
// out.close();
// byte[] sm4Data = new byte[in.available()];
// in.read(sm4Data);
// in.close();
//
// if (!supportCiphertext(sm4Data)) {
// throw new CryptoException("InputStream is not valid SM4 ciphertext!");
// }
//
// out.write(decrypt(key, resolveCiphertext(sm4Data)));
// out.close();
} catch (IOException e) {
throw new CryptoException(e.getMessage(), e);
}


+ 17
- 0
source/crypto/crypto-sm/src/main/java/com/jd/blockchain/crypto/service/sm/SMAlgorithm.java View File

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

import com.jd.blockchain.crypto.CryptoAlgorithm;
import com.jd.blockchain.crypto.CryptoAlgorithmDefinition;

public final class SMAlgorithm {

public static final CryptoAlgorithm SM2 = CryptoAlgorithmDefinition.defineSignature("SM2", true, (byte) 2);

public static final CryptoAlgorithm SM3 = CryptoAlgorithmDefinition.defineHash("SM3", (byte) 3);

public static final CryptoAlgorithm SM4 = CryptoAlgorithmDefinition.defineSymmetricEncryption("SM4", (byte) 4);

private SMAlgorithm() {
}

}

+ 0
- 10
source/crypto/crypto-sm/src/main/java/com/jd/blockchain/crypto/service/sm/SMCryptoService.java View File

@@ -5,8 +5,6 @@ import java.util.Collection;
import java.util.Collections;
import java.util.List;

import com.jd.blockchain.crypto.CryptoAlgorithm;
import com.jd.blockchain.crypto.CryptoAlgorithmDefinition;
import com.jd.blockchain.crypto.CryptoFunction;
import com.jd.blockchain.crypto.CryptoService;
import com.jd.blockchain.provider.NamedProvider;
@@ -20,14 +18,6 @@ import com.jd.blockchain.provider.NamedProvider;
@NamedProvider("SM-SOFTWARE")
public class SMCryptoService implements CryptoService {

public static final CryptoAlgorithm SM2_ALGORITHM = CryptoAlgorithmDefinition.defineSignature("SM2",
true, (byte) 2);

public static final CryptoAlgorithm SM3_ALGORITHM = CryptoAlgorithmDefinition.defineHash("SM3", (byte) 3);

public static final CryptoAlgorithm SM4_ALGORITHM = CryptoAlgorithmDefinition.defineSymmetricEncryption("SM4",
(byte) 4);

public static final SM2CryptoFunction SM2 = new SM2CryptoFunction();
public static final SM3HashFunction SM3 = new SM3HashFunction();
public static final SM4EncryptionFunction SM4 = new SM4EncryptionFunction();


+ 329
- 338
source/crypto/crypto-sm/src/test/java/test/com/jd/blockchain/crypto/service/sm/SM2CyptoFunctionTest.java View File

@@ -1,6 +1,7 @@
package test.com.jd.blockchain.crypto.service.sm;

import com.jd.blockchain.crypto.*;
import com.jd.blockchain.crypto.service.sm.SMAlgorithm;
import com.jd.blockchain.utils.io.BytesUtils;
import org.junit.Test;

@@ -19,479 +20,469 @@ import static org.junit.Assert.*;
*/
public class SM2CyptoFunctionTest {

@Test
public void getAlgorithmTest(){
@Test
public void getAlgorithmTest() {

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);

SignatureFunction signatureFunction = CryptoServiceProviders.getSignatureFunction(algorithm);
SignatureFunction signatureFunction = CryptoServiceProviders.getSignatureFunction(algorithm);

assertEquals(signatureFunction.getAlgorithm().name(), algorithm.name());
assertEquals(signatureFunction.getAlgorithm().code(), algorithm.code());

assertEquals(signatureFunction.getAlgorithm().name(), algorithm.name());
assertEquals(signatureFunction.getAlgorithm().code(), algorithm.code());
algorithm = CryptoServiceProviders.getAlgorithm("sM2");
assertNotNull(algorithm);

algorithm = CryptoServiceProviders.getAlgorithm("sM2");
assertNotNull(algorithm);
assertEquals(signatureFunction.getAlgorithm().name(), algorithm.name());
assertEquals(signatureFunction.getAlgorithm().code(), algorithm.code());

assertEquals(signatureFunction.getAlgorithm().name(), algorithm.name());
assertEquals(signatureFunction.getAlgorithm().code(), algorithm.code());
algorithm = CryptoServiceProviders.getAlgorithm("sm22");
assertNull(algorithm);
}

algorithm = CryptoServiceProviders.getAlgorithm("sm22");
assertNull(algorithm);
}
@Test
public void generateKeyPairTest() {

@Test
public void generateKeyPairTest(){
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);
SignatureFunction signatureFunction = CryptoServiceProviders.getSignatureFunction(algorithm);

SignatureFunction signatureFunction = CryptoServiceProviders.getSignatureFunction(algorithm);
CryptoKeyPair keyPair = signatureFunction.generateKeyPair();

CryptoKeyPair keyPair = signatureFunction.generateKeyPair();
PubKey pubKey = keyPair.getPubKey();
PrivKey privKey = keyPair.getPrivKey();

PubKey pubKey = keyPair.getPubKey();
PrivKey privKey = keyPair.getPrivKey();
assertEquals(PUBLIC.CODE, pubKey.getKeyType().CODE);
assertEquals(65, pubKey.getRawKeyBytes().length);
assertEquals(PRIVATE.CODE, privKey.getKeyType().CODE);
assertEquals(32, privKey.getRawKeyBytes().length);

assertEquals(PUBLIC.CODE,pubKey.getKeyType().CODE);
assertEquals(65, pubKey.getRawKeyBytes().length);
assertEquals(PRIVATE.CODE,privKey.getKeyType().CODE);
assertEquals(32, privKey.getRawKeyBytes().length);
assertEquals(algorithm.code(), pubKey.getAlgorithm());
assertEquals(algorithm.code(), privKey.getAlgorithm());

assertEquals(algorithm.name(),pubKey.getAlgorithm().name());
assertEquals(algorithm.code(),pubKey.getAlgorithm().code());
assertEquals(algorithm.name(),privKey.getAlgorithm().name());
assertEquals(algorithm.code(),privKey.getAlgorithm().code());
assertEquals(2 + 1 + 65, pubKey.toBytes().length);
assertEquals(2 + 1 + 32, privKey.toBytes().length);

assertEquals(2 + 1 + 65, pubKey.toBytes().length);
assertEquals(2 + 1 + 32, privKey.toBytes().length);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] pubKeyTypeBytes = new byte[] { PUBLIC.CODE };
byte[] privKeyTypeBytes = new byte[] { PRIVATE.CODE };
byte[] rawPubKeyBytes = pubKey.getRawKeyBytes();
byte[] rawPrivKeyBytes = privKey.getRawKeyBytes();
assertArrayEquals(BytesUtils.concat(algoBytes, pubKeyTypeBytes, rawPubKeyBytes), pubKey.toBytes());
assertArrayEquals(BytesUtils.concat(algoBytes, privKeyTypeBytes, rawPrivKeyBytes), privKey.toBytes());
}

byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] pubKeyTypeBytes = new byte[] {PUBLIC.CODE};
byte[] privKeyTypeBytes = new byte[] {PRIVATE.CODE};
byte[] rawPubKeyBytes = pubKey.getRawKeyBytes();
byte[] rawPrivKeyBytes = privKey.getRawKeyBytes();
assertArrayEquals(BytesUtils.concat(algoBytes,pubKeyTypeBytes,rawPubKeyBytes),pubKey.toBytes());
assertArrayEquals(BytesUtils.concat(algoBytes,privKeyTypeBytes,rawPrivKeyBytes),privKey.toBytes());
}
@Test
public void retrievePubKeyTest() {

@Test
public void retrievePubKeyTest(){
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);
SignatureFunction signatureFunction = CryptoServiceProviders.getSignatureFunction(algorithm);

SignatureFunction signatureFunction = CryptoServiceProviders.getSignatureFunction(algorithm);
CryptoKeyPair keyPair = signatureFunction.generateKeyPair();

CryptoKeyPair keyPair = signatureFunction.generateKeyPair();
PubKey pubKey = keyPair.getPubKey();
PrivKey privKey = keyPair.getPrivKey();

PubKey pubKey = keyPair.getPubKey();
PrivKey privKey = keyPair.getPrivKey();
PubKey retrievedPubKey = signatureFunction.retrievePubKey(privKey);

PubKey retrievedPubKey = signatureFunction.retrievePubKey(privKey);
assertEquals(pubKey.getKeyType(), retrievedPubKey.getKeyType());
assertEquals(pubKey.getRawKeyBytes().length, retrievedPubKey.getRawKeyBytes().length);
assertEquals(pubKey.getAlgorithm(), retrievedPubKey.getAlgorithm());
assertArrayEquals(pubKey.toBytes(), retrievedPubKey.toBytes());
}

assertEquals(pubKey.getKeyType(),retrievedPubKey.getKeyType());
assertEquals(pubKey.getRawKeyBytes().length, retrievedPubKey.getRawKeyBytes().length);
assertEquals(pubKey.getAlgorithm().name(),retrievedPubKey.getAlgorithm().name());
assertEquals(pubKey.getAlgorithm().code(),retrievedPubKey.getAlgorithm().code());
assertArrayEquals(pubKey.toBytes(),retrievedPubKey.toBytes());
}
@Test
public void signTest() {

@Test
public void signTest(){
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);

byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);
SignatureFunction signatureFunction = CryptoServiceProviders.getSignatureFunction(algorithm);

SignatureFunction signatureFunction = CryptoServiceProviders.getSignatureFunction(algorithm);
CryptoKeyPair keyPair = signatureFunction.generateKeyPair();

CryptoKeyPair keyPair = signatureFunction.generateKeyPair();
PrivKey privKey = keyPair.getPrivKey();
SignatureDigest signatureDigest = signatureFunction.sign(privKey, data);

PrivKey privKey = keyPair.getPrivKey();
SignatureDigest signatureDigest = signatureFunction.sign(privKey,data);
byte[] signatureBytes = signatureDigest.toBytes();

byte[] signatureBytes = signatureDigest.toBytes();
assertEquals(2 + 64, signatureBytes.length);
assertEquals(algorithm.code(), signatureDigest.getAlgorithm());

assertEquals(2 + 64, signatureBytes.length);
CryptoAlgorithm signatureAlgo = signatureDigest.getAlgorithm();
assertEquals(algorithm.name(),signatureDigest.getAlgorithm().name());
assertEquals(algorithm.code(),signatureDigest.getAlgorithm().code());
assertEquals(SMAlgorithm.SM2, signatureDigest.getAlgorithm());
assertEquals((short) (SIGNATURE_ALGORITHM | ENCRYPTION_ALGORITHM | ASYMMETRIC_KEY | ((byte) 2 & 0x00FF)),
signatureDigest.getAlgorithm());

assertEquals("SM2",signatureAlgo.name());
assertEquals((short) (SIGNATURE_ALGORITHM | ENCRYPTION_ALGORITHM | ASYMMETRIC_KEY | ((byte) 2 & 0x00FF)),
signatureAlgo.code());
byte[] algoBytes = BytesUtils.toBytes(signatureDigest.getAlgorithm());
byte[] rawSinatureBytes = signatureDigest.getRawDigest();
assertArrayEquals(BytesUtils.concat(algoBytes, rawSinatureBytes), signatureBytes);
}

byte[] algoBytes = CryptoAlgorithm.toBytes(signatureAlgo);
byte[] rawSinatureBytes = signatureDigest.getRawDigest();
assertArrayEquals(BytesUtils.concat(algoBytes,rawSinatureBytes),signatureBytes);
}
@Test
public void verifyTest() {
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);

@Test
public void verifyTest(){
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);
SignatureFunction signatureFunction = CryptoServiceProviders.getSignatureFunction(algorithm);

SignatureFunction signatureFunction = CryptoServiceProviders.getSignatureFunction(algorithm);
CryptoKeyPair keyPair = signatureFunction.generateKeyPair();

CryptoKeyPair keyPair = signatureFunction.generateKeyPair();
PubKey pubKey = keyPair.getPubKey();
PrivKey privKey = keyPair.getPrivKey();
SignatureDigest signatureDigest = signatureFunction.sign(privKey, data);

PubKey pubKey = keyPair.getPubKey();
PrivKey privKey = keyPair.getPrivKey();
SignatureDigest signatureDigest = signatureFunction.sign(privKey,data);
assertTrue(signatureFunction.verify(signatureDigest, pubKey, data));
}

assertTrue(signatureFunction.verify(signatureDigest,pubKey,data));
}
@Test
public void encryptTest() {

@Test
public void encryptTest(){
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);

byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);
AsymmetricEncryptionFunction asymmetricEncryptionFunction = CryptoServiceProviders
.getAsymmetricEncryptionFunction(algorithm);

AsymmetricEncryptionFunction asymmetricEncryptionFunction =
CryptoServiceProviders.getAsymmetricEncryptionFunction(algorithm);
CryptoKeyPair keyPair = asymmetricEncryptionFunction.generateKeyPair();

CryptoKeyPair keyPair = asymmetricEncryptionFunction.generateKeyPair();
PubKey pubKey = keyPair.getPubKey();

PubKey pubKey = keyPair.getPubKey();
Ciphertext ciphertext = asymmetricEncryptionFunction.encrypt(pubKey, data);

Ciphertext ciphertext =asymmetricEncryptionFunction.encrypt(pubKey,data);
byte[] ciphertextBytes = ciphertext.toBytes();
assertEquals(2 + 65 + 256 / 8 + 1024, ciphertextBytes.length);
assertEquals(SMAlgorithm.SM2, ciphertext.getAlgorithm());

byte[] ciphertextBytes = ciphertext.toBytes();
assertEquals(2 + 65 + 256 / 8 + 1024, ciphertextBytes.length);
CryptoAlgorithm ciphertextAlgo = ciphertext.getAlgorithm();
assertEquals("SM2",ciphertext.getAlgorithm().name());
assertEquals((short) (SIGNATURE_ALGORITHM | ENCRYPTION_ALGORITHM | ASYMMETRIC_KEY | ((byte) 2 & 0x00FF)),
ciphertextAlgo.code());
assertEquals((short) (SIGNATURE_ALGORITHM | ENCRYPTION_ALGORITHM | ASYMMETRIC_KEY | ((byte) 2 & 0x00FF)),
ciphertext.getAlgorithm());

byte[] algoBytes = CryptoAlgorithm.toBytes(ciphertextAlgo);
byte[] rawCiphertextBytes = ciphertext.getRawCiphertext();
assertArrayEquals(BytesUtils.concat(algoBytes,rawCiphertextBytes),ciphertextBytes);
}
byte[] algoBytes = BytesUtils.toBytes(ciphertext.getAlgorithm());
byte[] rawCiphertextBytes = ciphertext.getRawCiphertext();
assertArrayEquals(BytesUtils.concat(algoBytes, rawCiphertextBytes), ciphertextBytes);
}

@Test
public void decryptTest() {

@Test
public void decryptTest(){
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);

byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);
AsymmetricEncryptionFunction asymmetricEncryptionFunction = CryptoServiceProviders
.getAsymmetricEncryptionFunction(algorithm);

AsymmetricEncryptionFunction asymmetricEncryptionFunction =
CryptoServiceProviders.getAsymmetricEncryptionFunction(algorithm);
CryptoKeyPair keyPair = asymmetricEncryptionFunction.generateKeyPair();

CryptoKeyPair keyPair = asymmetricEncryptionFunction.generateKeyPair();
PubKey pubKey = keyPair.getPubKey();
PrivKey privKey = keyPair.getPrivKey();

PubKey pubKey = keyPair.getPubKey();
PrivKey privKey = keyPair.getPrivKey();
Ciphertext ciphertext = asymmetricEncryptionFunction.encrypt(pubKey, data);

Ciphertext ciphertext =asymmetricEncryptionFunction.encrypt(pubKey,data);
byte[] decryptedPlaintext = asymmetricEncryptionFunction.decrypt(privKey, ciphertext);

byte[] decryptedPlaintext = asymmetricEncryptionFunction.decrypt(privKey,ciphertext);
assertArrayEquals(data, decryptedPlaintext);
}

assertArrayEquals(data,decryptedPlaintext);
}
@Test
public void supportPrivKeyTest() {

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);

@Test
public void supportPrivKeyTest(){
SignatureFunction signatureFunction = CryptoServiceProviders.getSignatureFunction(algorithm);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);
CryptoKeyPair keyPair = signatureFunction.generateKeyPair();

SignatureFunction signatureFunction = CryptoServiceProviders.getSignatureFunction(algorithm);
PrivKey privKey = keyPair.getPrivKey();
byte[] privKeyBytes = privKey.toBytes();

CryptoKeyPair keyPair = signatureFunction.generateKeyPair();
assertTrue(signatureFunction.supportPrivKey(privKeyBytes));

PrivKey privKey = keyPair.getPrivKey();
byte[] privKeyBytes = privKey.toBytes();
algorithm = CryptoServiceProviders.getAlgorithm("sm3");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] pubKeyTypeBytes = new byte[] { PUBLIC.CODE };
byte[] rawKeyBytes = privKey.getRawKeyBytes();
byte[] sm3PubKeyBytes = BytesUtils.concat(algoBytes, pubKeyTypeBytes, rawKeyBytes);

assertTrue(signatureFunction.supportPrivKey(privKeyBytes));
assertFalse(signatureFunction.supportPrivKey(sm3PubKeyBytes));
}

algorithm = CryptoServiceProviders.getAlgorithm("sm3");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] pubKeyTypeBytes = new byte[] {PUBLIC.CODE};
byte[] rawKeyBytes = privKey.getRawKeyBytes();
byte[] sm3PubKeyBytes = BytesUtils.concat(algoBytes,pubKeyTypeBytes,rawKeyBytes);
@Test
public void resolvePrivKeyTest() {

assertFalse(signatureFunction.supportPrivKey(sm3PubKeyBytes));
}
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);

@Test
public void resolvePrivKeyTest(){
SignatureFunction signatureFunction = CryptoServiceProviders.getSignatureFunction(algorithm);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);
CryptoKeyPair keyPair = signatureFunction.generateKeyPair();

SignatureFunction signatureFunction = CryptoServiceProviders.getSignatureFunction(algorithm);
PrivKey privKey = keyPair.getPrivKey();
byte[] privKeyBytes = privKey.toBytes();

CryptoKeyPair keyPair = signatureFunction.generateKeyPair();
PrivKey resolvedPrivKey = signatureFunction.resolvePrivKey(privKeyBytes);

PrivKey privKey = keyPair.getPrivKey();
byte[] privKeyBytes = privKey.toBytes();
assertEquals(PRIVATE.CODE, resolvedPrivKey.getKeyType().CODE);
assertEquals(32, resolvedPrivKey.getRawKeyBytes().length);
assertEquals(SMAlgorithm.SM2, resolvedPrivKey.getAlgorithm());
assertEquals((short) (SIGNATURE_ALGORITHM | ENCRYPTION_ALGORITHM | ASYMMETRIC_KEY | ((byte) 2 & 0x00FF)),
resolvedPrivKey.getAlgorithm());
assertArrayEquals(privKeyBytes, resolvedPrivKey.toBytes());

PrivKey resolvedPrivKey = signatureFunction.resolvePrivKey(privKeyBytes);
algorithm = CryptoServiceProviders.getAlgorithm("sm3");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] pubKeyTypeBytes = new byte[] { PUBLIC.CODE };
byte[] rawKeyBytes = privKey.getRawKeyBytes();
byte[] sm3PubKeyBytes = BytesUtils.concat(algoBytes, pubKeyTypeBytes, rawKeyBytes);

assertEquals(PRIVATE.CODE,resolvedPrivKey.getKeyType().CODE);
assertEquals(32, resolvedPrivKey.getRawKeyBytes().length);
assertEquals("SM2",resolvedPrivKey.getAlgorithm().name());
assertEquals((short) (SIGNATURE_ALGORITHM | ENCRYPTION_ALGORITHM | ASYMMETRIC_KEY | ((byte) 2 & 0x00FF)),
resolvedPrivKey.getAlgorithm().code());
assertArrayEquals(privKeyBytes,resolvedPrivKey.toBytes());
Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
try {
signatureFunction.resolvePrivKey(sm3PubKeyBytes);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
}

algorithm = CryptoServiceProviders.getAlgorithm("sm3");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] pubKeyTypeBytes = new byte[] {PUBLIC.CODE};
byte[] rawKeyBytes = privKey.getRawKeyBytes();
byte[] sm3PubKeyBytes = BytesUtils.concat(algoBytes,pubKeyTypeBytes,rawKeyBytes);
@Test
public void supportPubKeyTest() {

Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
try {
signatureFunction.resolvePrivKey(sm3PubKeyBytes);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
}
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);

@Test
public void supportPubKeyTest(){
SignatureFunction signatureFunction = CryptoServiceProviders.getSignatureFunction(algorithm);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);
CryptoKeyPair keyPair = signatureFunction.generateKeyPair();

SignatureFunction signatureFunction = CryptoServiceProviders.getSignatureFunction(algorithm);
PubKey pubKey = keyPair.getPubKey();
byte[] pubKeyBytes = pubKey.toBytes();

CryptoKeyPair keyPair = signatureFunction.generateKeyPair();
assertTrue(signatureFunction.supportPubKey(pubKeyBytes));

PubKey pubKey = keyPair.getPubKey();
byte[] pubKeyBytes = pubKey.toBytes();
algorithm = CryptoServiceProviders.getAlgorithm("sm3");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] privKeyTypeBytes = new byte[] { PRIVATE.CODE };
byte[] rawKeyBytes = pubKey.getRawKeyBytes();
byte[] sm3PrivKeyBytes = BytesUtils.concat(algoBytes, privKeyTypeBytes, rawKeyBytes);

assertTrue(signatureFunction.supportPubKey(pubKeyBytes));
assertFalse(signatureFunction.supportPubKey(sm3PrivKeyBytes));
}

algorithm = CryptoServiceProviders.getAlgorithm("sm3");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] privKeyTypeBytes = new byte[] {PRIVATE.CODE};
byte[] rawKeyBytes = pubKey.getRawKeyBytes();
byte[] sm3PrivKeyBytes = BytesUtils.concat(algoBytes,privKeyTypeBytes,rawKeyBytes);
@Test
public void resolvePubKeyTest() {

assertFalse(signatureFunction.supportPubKey(sm3PrivKeyBytes));
}
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);

@Test
public void resolvePubKeyTest(){
SignatureFunction signatureFunction = CryptoServiceProviders.getSignatureFunction(algorithm);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);
CryptoKeyPair keyPair = signatureFunction.generateKeyPair();

SignatureFunction signatureFunction = CryptoServiceProviders.getSignatureFunction(algorithm);
PubKey pubKey = keyPair.getPubKey();
byte[] pubKeyBytes = pubKey.toBytes();

CryptoKeyPair keyPair = signatureFunction.generateKeyPair();
PubKey resolvedPubKey = signatureFunction.resolvePubKey(pubKeyBytes);

PubKey pubKey = keyPair.getPubKey();
byte[] pubKeyBytes = pubKey.toBytes();
assertEquals(PUBLIC.CODE, resolvedPubKey.getKeyType().CODE);
assertEquals(65, resolvedPubKey.getRawKeyBytes().length);
assertEquals(SMAlgorithm.SM2, resolvedPubKey.getAlgorithm());
assertEquals((short) (SIGNATURE_ALGORITHM | ENCRYPTION_ALGORITHM | ASYMMETRIC_KEY | ((byte) 2 & 0x00FF)),
resolvedPubKey.getAlgorithm());
assertArrayEquals(pubKeyBytes, resolvedPubKey.toBytes());

PubKey resolvedPubKey = signatureFunction.resolvePubKey(pubKeyBytes);
algorithm = CryptoServiceProviders.getAlgorithm("sm3");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] privKeyTypeBytes = new byte[] { PRIVATE.CODE };
byte[] rawKeyBytes = pubKey.getRawKeyBytes();
byte[] sm3PrivKeyBytes = BytesUtils.concat(algoBytes, privKeyTypeBytes, rawKeyBytes);

assertEquals(PUBLIC.CODE,resolvedPubKey.getKeyType().CODE);
assertEquals(65, resolvedPubKey.getRawKeyBytes().length);
assertEquals("SM2",resolvedPubKey.getAlgorithm().name());
assertEquals((short) (SIGNATURE_ALGORITHM | ENCRYPTION_ALGORITHM | ASYMMETRIC_KEY | ((byte) 2 & 0x00FF)),
resolvedPubKey.getAlgorithm().code());
assertArrayEquals(pubKeyBytes,resolvedPubKey.toBytes());
Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
try {
signatureFunction.resolvePrivKey(sm3PrivKeyBytes);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
}

algorithm = CryptoServiceProviders.getAlgorithm("sm3");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] privKeyTypeBytes = new byte[] {PRIVATE.CODE};
byte[] rawKeyBytes = pubKey.getRawKeyBytes();
byte[] sm3PrivKeyBytes = BytesUtils.concat(algoBytes,privKeyTypeBytes,rawKeyBytes);
@Test
public void supportDigestTest() {

Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
try {
signatureFunction.resolvePrivKey(sm3PrivKeyBytes);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
}
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);

@Test
public void supportDigestTest(){
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);

byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
SignatureFunction signatureFunction = CryptoServiceProviders.getSignatureFunction(algorithm);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);
CryptoKeyPair keyPair = signatureFunction.generateKeyPair();

SignatureFunction signatureFunction =
CryptoServiceProviders.getSignatureFunction(algorithm);
PrivKey privKey = keyPair.getPrivKey();

CryptoKeyPair keyPair = signatureFunction.generateKeyPair();
SignatureDigest signatureDigest = signatureFunction.sign(privKey, data);

PrivKey privKey = keyPair.getPrivKey();
byte[] signatureDigestBytes = signatureDigest.toBytes();
assertTrue(signatureFunction.supportDigest(signatureDigestBytes));

SignatureDigest signatureDigest = signatureFunction.sign(privKey,data);
algorithm = CryptoServiceProviders.getAlgorithm("sm3");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] rawDigestBytes = signatureDigest.toBytes();
byte[] sm3SignatureBytes = BytesUtils.concat(algoBytes, rawDigestBytes);

byte[] signatureDigestBytes = signatureDigest.toBytes();
assertTrue(signatureFunction.supportDigest(signatureDigestBytes));
assertFalse(signatureFunction.supportDigest(sm3SignatureBytes));
}

algorithm = CryptoServiceProviders.getAlgorithm("sm3");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] rawDigestBytes = signatureDigest.toBytes();
byte[] sm3SignatureBytes = BytesUtils.concat(algoBytes,rawDigestBytes);
@Test
public void resolveDigestTest() {

assertFalse(signatureFunction.supportDigest(sm3SignatureBytes));
}
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);

@Test
public void resolveDigestTest(){
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);

byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
SignatureFunction signatureFunction = CryptoServiceProviders.getSignatureFunction(algorithm);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);
CryptoKeyPair keyPair = signatureFunction.generateKeyPair();

SignatureFunction signatureFunction =
CryptoServiceProviders.getSignatureFunction(algorithm);
PrivKey privKey = keyPair.getPrivKey();

CryptoKeyPair keyPair = signatureFunction.generateKeyPair();
SignatureDigest signatureDigest = signatureFunction.sign(privKey, data);

PrivKey privKey = keyPair.getPrivKey();
byte[] signatureDigestBytes = signatureDigest.toBytes();

SignatureDigest signatureDigest = signatureFunction.sign(privKey,data);
SignatureDigest resolvedSignatureDigest = signatureFunction.resolveDigest(signatureDigestBytes);

byte[] signatureDigestBytes = signatureDigest.toBytes();
assertEquals(64, resolvedSignatureDigest.getRawDigest().length);
assertEquals(SMAlgorithm.SM2, resolvedSignatureDigest.getAlgorithm());
assertEquals((short) (SIGNATURE_ALGORITHM | ENCRYPTION_ALGORITHM | ASYMMETRIC_KEY | ((byte) 2 & 0x00FF)),
resolvedSignatureDigest.getAlgorithm());
assertArrayEquals(signatureDigestBytes, resolvedSignatureDigest.toBytes());

SignatureDigest resolvedSignatureDigest = signatureFunction.resolveDigest(signatureDigestBytes);
algorithm = CryptoServiceProviders.getAlgorithm("sm3");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] rawDigestBytes = signatureDigest.getRawDigest();
byte[] sm3SignatureDigestBytes = BytesUtils.concat(algoBytes, rawDigestBytes);

assertEquals(64, resolvedSignatureDigest.getRawDigest().length);
assertEquals("SM2",resolvedSignatureDigest.getAlgorithm().name());
assertEquals((short) (SIGNATURE_ALGORITHM | ENCRYPTION_ALGORITHM | ASYMMETRIC_KEY | ((byte) 2 & 0x00FF)),
resolvedSignatureDigest.getAlgorithm().code());
assertArrayEquals(signatureDigestBytes,resolvedSignatureDigest.toBytes());
Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
try {
signatureFunction.resolveDigest(sm3SignatureDigestBytes);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
}

algorithm = CryptoServiceProviders.getAlgorithm("sm3");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] rawDigestBytes = signatureDigest.getRawDigest();
byte[] sm3SignatureDigestBytes = BytesUtils.concat(algoBytes,rawDigestBytes);
@Test
public void supportCiphertextTest() {

Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
try {
signatureFunction.resolveDigest(sm3SignatureDigestBytes);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
}
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);

@Test
public void supportCiphertextTest(){
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);

byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
AsymmetricEncryptionFunction asymmetricEncryptionFunction = CryptoServiceProviders
.getAsymmetricEncryptionFunction(algorithm);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);
CryptoKeyPair keyPair = asymmetricEncryptionFunction.generateKeyPair();

AsymmetricEncryptionFunction asymmetricEncryptionFunction =
CryptoServiceProviders.getAsymmetricEncryptionFunction(algorithm);
PubKey pubKey = keyPair.getPubKey();

CryptoKeyPair keyPair = asymmetricEncryptionFunction.generateKeyPair();
Ciphertext ciphertext = asymmetricEncryptionFunction.encrypt(pubKey, data);

PubKey pubKey = keyPair.getPubKey();
byte[] ciphertextBytes = ciphertext.toBytes();

Ciphertext ciphertext =asymmetricEncryptionFunction.encrypt(pubKey,data);
assertTrue(asymmetricEncryptionFunction.supportCiphertext(ciphertextBytes));

byte[] ciphertextBytes = ciphertext.toBytes();
algorithm = CryptoServiceProviders.getAlgorithm("sm3");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] rawCiphertextBytes = ciphertext.toBytes();
byte[] sm3CiphertextBytes = BytesUtils.concat(algoBytes, rawCiphertextBytes);

assertTrue(asymmetricEncryptionFunction.supportCiphertext(ciphertextBytes));
assertFalse(asymmetricEncryptionFunction.supportCiphertext(sm3CiphertextBytes));
}

algorithm = CryptoServiceProviders.getAlgorithm("sm3");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] rawCiphertextBytes = ciphertext.toBytes();
byte[] sm3CiphertextBytes = BytesUtils.concat(algoBytes,rawCiphertextBytes);
@Test
public void resolveCiphertextTest() {

assertFalse(asymmetricEncryptionFunction.supportCiphertext(sm3CiphertextBytes));
}
byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);

@Test
public void resolveCiphertextTest(){
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);

byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
AsymmetricEncryptionFunction asymmetricEncryptionFunction = CryptoServiceProviders
.getAsymmetricEncryptionFunction(algorithm);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm2");
assertNotNull(algorithm);
CryptoKeyPair keyPair = asymmetricEncryptionFunction.generateKeyPair();

AsymmetricEncryptionFunction asymmetricEncryptionFunction =
CryptoServiceProviders.getAsymmetricEncryptionFunction(algorithm);
PubKey pubKey = keyPair.getPubKey();

CryptoKeyPair keyPair = asymmetricEncryptionFunction.generateKeyPair();
Ciphertext ciphertext = asymmetricEncryptionFunction.encrypt(pubKey, data);

PubKey pubKey = keyPair.getPubKey();
byte[] ciphertextBytes = ciphertext.toBytes();

Ciphertext ciphertext =asymmetricEncryptionFunction.encrypt(pubKey,data);
Ciphertext resolvedCiphertext = asymmetricEncryptionFunction.resolveCiphertext(ciphertextBytes);

byte[] ciphertextBytes = ciphertext.toBytes();
assertEquals(65 + 256 / 8 + 1024, resolvedCiphertext.getRawCiphertext().length);
assertEquals(SMAlgorithm.SM2, resolvedCiphertext.getAlgorithm());
assertEquals((short) (SIGNATURE_ALGORITHM | ENCRYPTION_ALGORITHM | ASYMMETRIC_KEY | ((byte) 2 & 0x00FF)),
resolvedCiphertext.getAlgorithm());
assertArrayEquals(ciphertextBytes, resolvedCiphertext.toBytes());

Ciphertext resolvedCiphertext = asymmetricEncryptionFunction.resolveCiphertext(ciphertextBytes);
algorithm = CryptoServiceProviders.getAlgorithm("sm3");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] rawCiphertextBytes = ciphertext.getRawCiphertext();
byte[] sm3CiphertextBytes = BytesUtils.concat(algoBytes, rawCiphertextBytes);

assertEquals(65 + 256 / 8 + 1024, resolvedCiphertext.getRawCiphertext().length);
assertEquals("SM2",resolvedCiphertext.getAlgorithm().name());
assertEquals((short) (SIGNATURE_ALGORITHM | ENCRYPTION_ALGORITHM | ASYMMETRIC_KEY | ((byte) 2 & 0x00FF)),
resolvedCiphertext.getAlgorithm().code());
assertArrayEquals(ciphertextBytes,resolvedCiphertext.toBytes());

algorithm = CryptoServiceProviders.getAlgorithm("sm3");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] rawCiphertextBytes = ciphertext.getRawCiphertext();
byte[] sm3CiphertextBytes = BytesUtils.concat(algoBytes,rawCiphertextBytes);

Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
try {
asymmetricEncryptionFunction.resolveCiphertext(sm3CiphertextBytes);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
}
Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
try {
asymmetricEncryptionFunction.resolveCiphertext(sm3CiphertextBytes);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
}

}

+ 4
- 4
source/crypto/crypto-sm/src/test/java/test/com/jd/blockchain/crypto/service/sm/SM3HashFunctionTest.java View File

@@ -5,6 +5,7 @@ import com.jd.blockchain.crypto.CryptoException;
import com.jd.blockchain.crypto.CryptoServiceProviders;
import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.HashFunction;
import com.jd.blockchain.crypto.service.sm.SMAlgorithm;
import com.jd.blockchain.utils.io.BytesUtils;
import org.junit.Test;

@@ -60,8 +61,7 @@ public class SM3HashFunctionTest {
assertEquals(256 / 8 + 2,digestBytes.length);
assertArrayEquals(digestBytes, BytesUtils.concat(algoBytes, rawDigestBytes));

assertEquals(algorithm.code(),digest.getAlgorithm().code());
assertEquals(algorithm.name(),digest.getAlgorithm().name());
assertEquals(algorithm.code(),digest.getAlgorithm());

Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
@@ -132,8 +132,8 @@ public class SM3HashFunctionTest {
HashDigest resolvedDigest = hashFunction.resolveHashDigest(digestBytes);

assertEquals(256 / 8,resolvedDigest.getRawDigest().length);
assertEquals("SM3",resolvedDigest.getAlgorithm().name());
assertEquals((short) (HASH_ALGORITHM | ((byte) 3 & 0x00FF)),resolvedDigest.getAlgorithm().code());
assertEquals(SMAlgorithm.SM3,resolvedDigest.getAlgorithm());
assertEquals((short) (HASH_ALGORITHM | ((byte) 3 & 0x00FF)),resolvedDigest.getAlgorithm());
assertArrayEquals(digestBytes,resolvedDigest.toBytes());

algorithm = CryptoServiceProviders.getAlgorithm("sm4");


+ 249
- 243
source/crypto/crypto-sm/src/test/java/test/com/jd/blockchain/crypto/service/sm/SM4EncryptionFunctionTest.java View File

@@ -1,16 +1,28 @@
package test.com.jd.blockchain.crypto.service.sm;

import com.jd.blockchain.crypto.*;
import com.jd.blockchain.utils.io.BytesUtils;
import org.junit.Test;

import java.util.Random;

import static com.jd.blockchain.crypto.CryptoAlgorithm.ENCRYPTION_ALGORITHM;
import static com.jd.blockchain.crypto.CryptoAlgorithm.SYMMETRIC_KEY;
import static com.jd.blockchain.crypto.CryptoKeyType.PUBLIC;
import static com.jd.blockchain.crypto.CryptoKeyType.SYMMETRIC;
import static org.junit.Assert.*;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

import java.util.Random;

import org.junit.Test;

import com.jd.blockchain.crypto.Ciphertext;
import com.jd.blockchain.crypto.CryptoAlgorithm;
import com.jd.blockchain.crypto.CryptoException;
import com.jd.blockchain.crypto.CryptoServiceProviders;
import com.jd.blockchain.crypto.SymmetricEncryptionFunction;
import com.jd.blockchain.crypto.SymmetricKey;
import com.jd.blockchain.crypto.service.sm.SMAlgorithm;
import com.jd.blockchain.utils.io.BytesUtils;

/**
* @author zhanglin33
@@ -19,262 +31,256 @@ import static org.junit.Assert.*;
* @date 2019-04-03, 16:35
*/
public class SM4EncryptionFunctionTest {
@Test
public void getAlgorithmTest(){
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm4");
assertNotNull(algorithm);

SymmetricEncryptionFunction symmetricEncryptionFunction =
CryptoServiceProviders.getSymmetricEncryptionFunction(algorithm);

assertEquals(symmetricEncryptionFunction.getAlgorithm().name(), algorithm.name());
assertEquals(symmetricEncryptionFunction.getAlgorithm().code(), algorithm.code());

algorithm = CryptoServiceProviders.getAlgorithm("sM4");
assertNotNull(algorithm);

assertEquals(symmetricEncryptionFunction.getAlgorithm().name(), algorithm.name());
assertEquals(symmetricEncryptionFunction.getAlgorithm().code(), algorithm.code());

algorithm = CryptoServiceProviders.getAlgorithm("smm4");
assertNull(algorithm);
}

@Test
public void generateSymmetricKeyTest(){
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm4");
assertNotNull(algorithm);

SymmetricEncryptionFunction symmetricEncryptionFunction =
CryptoServiceProviders.getSymmetricEncryptionFunction(algorithm);

SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();

assertEquals(SYMMETRIC.CODE,symmetricKey.getKeyType().CODE);
assertEquals(128 / 8, symmetricKey.getRawKeyBytes().length);

assertEquals(algorithm.name(),symmetricKey.getAlgorithm().name());
assertEquals(algorithm.code(),symmetricKey.getAlgorithm().code());

assertEquals(2 + 1 + 128 / 8, symmetricKey.toBytes().length);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] keyTypeBytes = new byte[] {SYMMETRIC.CODE};
byte[] rawKeyBytes = symmetricKey.getRawKeyBytes();
assertArrayEquals(BytesUtils.concat(algoBytes,keyTypeBytes,rawKeyBytes),symmetricKey.toBytes());
}



@Test
public void encryptTest(){

byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm4");
assertNotNull(algorithm);

SymmetricEncryptionFunction symmetricEncryptionFunction =
CryptoServiceProviders.getSymmetricEncryptionFunction(algorithm);

SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();

Ciphertext ciphertext = symmetricEncryptionFunction.encrypt(symmetricKey,data);

byte[] ciphertextBytes = ciphertext.toBytes();
assertEquals(2 + 16 +16 + 1024 , ciphertextBytes.length);
CryptoAlgorithm ciphertextAlgo = ciphertext.getAlgorithm();
assertEquals("SM4",ciphertextAlgo.name());
assertEquals((short) (ENCRYPTION_ALGORITHM | SYMMETRIC_KEY | ((byte) 4 & 0x00FF)),ciphertextAlgo.code());

byte[] algoBytes = CryptoAlgorithm.toBytes(ciphertextAlgo);
byte[] rawCiphertextBytes = ciphertext.getRawCiphertext();
assertArrayEquals(BytesUtils.concat(algoBytes,rawCiphertextBytes),ciphertextBytes);
}


@Test
public void decryptTest(){

byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm4");
assertNotNull(algorithm);

SymmetricEncryptionFunction symmetricEncryptionFunction =
CryptoServiceProviders.getSymmetricEncryptionFunction(algorithm);

SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();

Ciphertext ciphertext = symmetricEncryptionFunction.encrypt(symmetricKey,data);

byte[] decryptedPlaintext = symmetricEncryptionFunction.decrypt(symmetricKey,ciphertext);

assertArrayEquals(data,decryptedPlaintext);
}

// @Test
// public void streamEncryptTest(){
//
// byte[] data = new byte[1024];
// Random random = new Random();
// random.nextBytes(data);
//
//
// InputStream inputStream = new ByteArrayInputStream(data);
// OutputStream outputStream = new ByteArrayOutputStream();
//
// CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("aes");
// assertNotNull(algorithm);
//
// SymmetricEncryptionFunction symmetricEncryptionFunction =
// CryptoServiceProviders.getSymmetricEncryptionFunction(algorithm);
//
// SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();
//
// symmetricEncryptionFunction.encrypt(symmetricKey,inputStream,outputStream);
//
// assertNotNull(outputStream);
//
//
// }



@Test
public void supportSymmetricKeyTest(){
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm4");
assertNotNull(algorithm);

SymmetricEncryptionFunction symmetricEncryptionFunction =
CryptoServiceProviders.getSymmetricEncryptionFunction(algorithm);

SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();
byte[] symmetricKeyBytes = symmetricKey.toBytes();

assertTrue(symmetricEncryptionFunction.supportSymmetricKey(symmetricKeyBytes));

algorithm = CryptoServiceProviders.getAlgorithm("sm3");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] pubKeyTypeBytes = new byte[] {PUBLIC.CODE};
byte[] rawKeyBytes = symmetricKey.getRawKeyBytes();
byte[] ripemd160KeyBytes = BytesUtils.concat(algoBytes,pubKeyTypeBytes,rawKeyBytes);
@Test
public void getAlgorithmTest() {
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm4");
assertNotNull(algorithm);

assertFalse(symmetricEncryptionFunction.supportSymmetricKey(ripemd160KeyBytes));
}
SymmetricEncryptionFunction symmetricEncryptionFunction = CryptoServiceProviders
.getSymmetricEncryptionFunction(algorithm);

@Test
public void resolveSymmetricKeyTest(){
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm4");
assertNotNull(algorithm);
assertEquals(symmetricEncryptionFunction.getAlgorithm().name(), algorithm.name());
assertEquals(symmetricEncryptionFunction.getAlgorithm().code(), algorithm.code());

SymmetricEncryptionFunction symmetricEncryptionFunction =
CryptoServiceProviders.getSymmetricEncryptionFunction(algorithm);
algorithm = CryptoServiceProviders.getAlgorithm("sM4");
assertNotNull(algorithm);

SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();
byte[] symmetricKeyBytes = symmetricKey.toBytes();
assertEquals(symmetricEncryptionFunction.getAlgorithm().name(), algorithm.name());
assertEquals(symmetricEncryptionFunction.getAlgorithm().code(), algorithm.code());

algorithm = CryptoServiceProviders.getAlgorithm("smm4");
assertNull(algorithm);
}

@Test
public void generateSymmetricKeyTest() {
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm4");
assertNotNull(algorithm);

SymmetricEncryptionFunction symmetricEncryptionFunction = CryptoServiceProviders
.getSymmetricEncryptionFunction(algorithm);

SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();

SymmetricKey resolvedKey = symmetricEncryptionFunction.resolveSymmetricKey(symmetricKeyBytes);
assertEquals(SYMMETRIC.CODE, symmetricKey.getKeyType().CODE);
assertEquals(128 / 8, symmetricKey.getRawKeyBytes().length);

assertEquals(SYMMETRIC.CODE,resolvedKey.getKeyType().CODE);
assertEquals(128 / 8, resolvedKey.getRawKeyBytes().length);
assertEquals("SM4",resolvedKey.getAlgorithm().name());
assertEquals((short) (ENCRYPTION_ALGORITHM | SYMMETRIC_KEY | ((byte) 4 & 0x00FF)),resolvedKey.getAlgorithm().code());
assertArrayEquals(symmetricKeyBytes,resolvedKey.toBytes());
assertEquals(algorithm.code(), symmetricKey.getAlgorithm());

assertEquals(2 + 1 + 128 / 8, symmetricKey.toBytes().length);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] keyTypeBytes = new byte[] { SYMMETRIC.CODE };
byte[] rawKeyBytes = symmetricKey.getRawKeyBytes();
assertArrayEquals(BytesUtils.concat(algoBytes, keyTypeBytes, rawKeyBytes), symmetricKey.toBytes());
}

@Test
public void encryptTest() {

byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);

algorithm = CryptoServiceProviders.getAlgorithm("sm3");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] pubKeyTypeBytes = new byte[] {PUBLIC.CODE};
byte[] rawKeyBytes = symmetricKey.getRawKeyBytes();
byte[] ripemd160KeyBytes = BytesUtils.concat(algoBytes,pubKeyTypeBytes,rawKeyBytes);
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm4");
assertNotNull(algorithm);

SymmetricEncryptionFunction symmetricEncryptionFunction = CryptoServiceProviders
.getSymmetricEncryptionFunction(algorithm);

Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
try {
symmetricEncryptionFunction.resolveSymmetricKey(ripemd160KeyBytes);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
}

@Test
public void supportCiphertextTest(){

byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm4");
assertNotNull(algorithm);

SymmetricEncryptionFunction symmetricEncryptionFunction =
CryptoServiceProviders.getSymmetricEncryptionFunction(algorithm);

SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();

Ciphertext ciphertext = symmetricEncryptionFunction.encrypt(symmetricKey,data);

byte[] ciphertextBytes = ciphertext.toBytes();
assertTrue(symmetricEncryptionFunction.supportCiphertext(ciphertextBytes));

algorithm = CryptoServiceProviders.getAlgorithm("sm3");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] rawCiphertextBytes = ciphertext.toBytes();
byte[] sm3CiphertextBytes = BytesUtils.concat(algoBytes,rawCiphertextBytes);
SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();

assertFalse(symmetricEncryptionFunction.supportCiphertext(sm3CiphertextBytes));
}
Ciphertext ciphertext = symmetricEncryptionFunction.encrypt(symmetricKey, data);

byte[] ciphertextBytes = ciphertext.toBytes();
assertEquals(2 + 16 + 16 + 1024, ciphertextBytes.length);
assertEquals(SMAlgorithm.SM4.code(), ciphertext.getAlgorithm());
assertEquals((short) (ENCRYPTION_ALGORITHM | SYMMETRIC_KEY | ((byte) 4 & 0x00FF)), ciphertext.getAlgorithm());

byte[] algoBytes = BytesUtils.toBytes(ciphertext.getAlgorithm());
byte[] rawCiphertextBytes = ciphertext.getRawCiphertext();
assertArrayEquals(BytesUtils.concat(algoBytes, rawCiphertextBytes), ciphertextBytes);
}

@Test
public void decryptTest() {

byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm4");
assertNotNull(algorithm);

SymmetricEncryptionFunction symmetricEncryptionFunction = CryptoServiceProviders
.getSymmetricEncryptionFunction(algorithm);

SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();

Ciphertext ciphertext = symmetricEncryptionFunction.encrypt(symmetricKey, data);

byte[] decryptedPlaintext = symmetricEncryptionFunction.decrypt(symmetricKey, ciphertext);

assertArrayEquals(data, decryptedPlaintext);
}

// @Test
// public void streamEncryptTest(){
//
// byte[] data = new byte[1024];
// Random random = new Random();
// random.nextBytes(data);
//
//
// InputStream inputStream = new ByteArrayInputStream(data);
// OutputStream outputStream = new ByteArrayOutputStream();
//
// CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("aes");
// assertNotNull(algorithm);
//
// SymmetricEncryptionFunction symmetricEncryptionFunction =
// CryptoServiceProviders.getSymmetricEncryptionFunction(algorithm);
//
// SymmetricKey symmetricKey = (SymmetricKey)
// symmetricEncryptionFunction.generateSymmetricKey();
//
// symmetricEncryptionFunction.encrypt(symmetricKey,inputStream,outputStream);
//
// assertNotNull(outputStream);
//
//
// }

@Test
public void supportSymmetricKeyTest() {
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm4");
assertNotNull(algorithm);

@Test
public void resolveCiphertextTest(){
SymmetricEncryptionFunction symmetricEncryptionFunction = CryptoServiceProviders
.getSymmetricEncryptionFunction(algorithm);

byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);
SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();
byte[] symmetricKeyBytes = symmetricKey.toBytes();

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm4");
assertNotNull(algorithm);
assertTrue(symmetricEncryptionFunction.supportSymmetricKey(symmetricKeyBytes));

SymmetricEncryptionFunction symmetricEncryptionFunction =
CryptoServiceProviders.getSymmetricEncryptionFunction(algorithm);
algorithm = CryptoServiceProviders.getAlgorithm("sm3");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] pubKeyTypeBytes = new byte[] { PUBLIC.CODE };
byte[] rawKeyBytes = symmetricKey.getRawKeyBytes();
byte[] ripemd160KeyBytes = BytesUtils.concat(algoBytes, pubKeyTypeBytes, rawKeyBytes);

assertFalse(symmetricEncryptionFunction.supportSymmetricKey(ripemd160KeyBytes));
}

SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();
@Test
public void resolveSymmetricKeyTest() {
CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm4");
assertNotNull(algorithm);

SymmetricEncryptionFunction symmetricEncryptionFunction = CryptoServiceProviders
.getSymmetricEncryptionFunction(algorithm);

SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();
byte[] symmetricKeyBytes = symmetricKey.toBytes();

SymmetricKey resolvedKey = symmetricEncryptionFunction.resolveSymmetricKey(symmetricKeyBytes);

assertEquals(SYMMETRIC.CODE, resolvedKey.getKeyType().CODE);
assertEquals(128 / 8, resolvedKey.getRawKeyBytes().length);
assertEquals(SMAlgorithm.SM4, resolvedKey.getAlgorithm());
assertEquals((short) (ENCRYPTION_ALGORITHM | SYMMETRIC_KEY | ((byte) 4 & 0x00FF)),
resolvedKey.getAlgorithm());
assertArrayEquals(symmetricKeyBytes, resolvedKey.toBytes());

algorithm = CryptoServiceProviders.getAlgorithm("sm3");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] pubKeyTypeBytes = new byte[] { PUBLIC.CODE };
byte[] rawKeyBytes = symmetricKey.getRawKeyBytes();
byte[] ripemd160KeyBytes = BytesUtils.concat(algoBytes, pubKeyTypeBytes, rawKeyBytes);

Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
try {
symmetricEncryptionFunction.resolveSymmetricKey(ripemd160KeyBytes);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
}

@Test
public void supportCiphertextTest() {

byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm4");
assertNotNull(algorithm);

SymmetricEncryptionFunction symmetricEncryptionFunction = CryptoServiceProviders
.getSymmetricEncryptionFunction(algorithm);

SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();

Ciphertext ciphertext = symmetricEncryptionFunction.encrypt(symmetricKey, data);

byte[] ciphertextBytes = ciphertext.toBytes();
assertTrue(symmetricEncryptionFunction.supportCiphertext(ciphertextBytes));

algorithm = CryptoServiceProviders.getAlgorithm("sm3");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] rawCiphertextBytes = ciphertext.toBytes();
byte[] sm3CiphertextBytes = BytesUtils.concat(algoBytes, rawCiphertextBytes);

assertFalse(symmetricEncryptionFunction.supportCiphertext(sm3CiphertextBytes));
}

@Test
public void resolveCiphertextTest() {

byte[] data = new byte[1024];
Random random = new Random();
random.nextBytes(data);

CryptoAlgorithm algorithm = CryptoServiceProviders.getAlgorithm("sm4");
assertNotNull(algorithm);

Ciphertext ciphertext = symmetricEncryptionFunction.encrypt(symmetricKey,data);
SymmetricEncryptionFunction symmetricEncryptionFunction = CryptoServiceProviders
.getSymmetricEncryptionFunction(algorithm);

byte[] ciphertextBytes = ciphertext.toBytes();
SymmetricKey symmetricKey = (SymmetricKey) symmetricEncryptionFunction.generateSymmetricKey();

Ciphertext resolvedCiphertext = symmetricEncryptionFunction.resolveCiphertext(ciphertextBytes);
Ciphertext ciphertext = symmetricEncryptionFunction.encrypt(symmetricKey, data);

assertEquals(1024 + 16 + 16, resolvedCiphertext.getRawCiphertext().length);
assertEquals("SM4",resolvedCiphertext.getAlgorithm().name());
assertEquals((short) (ENCRYPTION_ALGORITHM | SYMMETRIC_KEY | ((byte) 4 & 0x00FF)),resolvedCiphertext.getAlgorithm().code());
assertArrayEquals(ciphertextBytes,resolvedCiphertext.toBytes());
byte[] ciphertextBytes = ciphertext.toBytes();

Ciphertext resolvedCiphertext = symmetricEncryptionFunction.resolveCiphertext(ciphertextBytes);

algorithm = CryptoServiceProviders.getAlgorithm("sm3");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] rawCiphertextBytes = ciphertext.getRawCiphertext();
byte[] sm3CiphertextBytes = BytesUtils.concat(algoBytes,rawCiphertextBytes);
assertEquals(1024 + 16 + 16, resolvedCiphertext.getRawCiphertext().length);
assertEquals(SMAlgorithm.SM4, resolvedCiphertext.getAlgorithm());
assertEquals((short) (ENCRYPTION_ALGORITHM | SYMMETRIC_KEY | ((byte) 4 & 0x00FF)),
resolvedCiphertext.getAlgorithm());
assertArrayEquals(ciphertextBytes, resolvedCiphertext.toBytes());

algorithm = CryptoServiceProviders.getAlgorithm("sm3");
assertNotNull(algorithm);
byte[] algoBytes = CryptoAlgorithm.toBytes(algorithm);
byte[] rawCiphertextBytes = ciphertext.getRawCiphertext();
byte[] sm3CiphertextBytes = BytesUtils.concat(algoBytes, rawCiphertextBytes);

Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
try {
symmetricEncryptionFunction.resolveCiphertext(sm3CiphertextBytes);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
}
Class<?> expectedException = CryptoException.class;
Exception actualEx = null;
try {
symmetricEncryptionFunction.resolveCiphertext(sm3CiphertextBytes);
} catch (Exception e) {
actualEx = e;
}
assertNotNull(actualEx);
assertTrue(expectedException.isAssignableFrom(actualEx.getClass()));
}
}

+ 6
- 8
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/data/CryptoKeyEncoding.java View File

@@ -12,6 +12,7 @@ import com.jd.blockchain.crypto.PubKey;
import com.jd.blockchain.ledger.MagicNumber;
import com.jd.blockchain.utils.io.ByteArray;
import com.jd.blockchain.utils.io.BytesEncoding;
import com.jd.blockchain.utils.io.BytesUtils;
import com.jd.blockchain.utils.io.NumberMask;
import com.jd.blockchain.utils.io.RuntimeIOException;
@@ -34,9 +35,9 @@ public class CryptoKeyEncoding {
}
out.write(magicNum);
out.write(key.getAlgorithm().code());
BytesUtils.writeShort(key.getAlgorithm(), out);
int size = 2;// 已经写入 2 字节;
int size = 3;// 已经写入 3 字节;
size += BytesEncoding.write(key.getRawKeyBytes(), NumberMask.SHORT, out);
return size;
} catch (IOException e) {
@@ -55,8 +56,7 @@ public class CryptoKeyEncoding {
if (magicNum != MagicNumber.PUB_KEY && magicNum != MagicNumber.PRIV_KEY) {
throw new IllegalArgumentException("The CryptoKey MagicNumber read from the InputStream is Illegal!");
}
byte code = (byte) in.read();
CryptoAlgorithm algorithm = CryptoAlgorithm.valueOf(code);
short algorithm = CryptoAlgorithm.resolveCode(in);
ByteArray value = BytesEncoding.readAsByteArray(NumberMask.SHORT, in);
if (magicNum == MagicNumber.PUB_KEY) {
@@ -80,8 +80,7 @@ public class CryptoKeyEncoding {
if (magicNum != MagicNumber.PUB_KEY) {
throw new IllegalArgumentException("The PubKey MagicNumber read from the InputStream is Illegal!");
}
byte code = (byte) in.read();
CryptoAlgorithm algorithm = CryptoAlgorithm.valueOf(code);
short algorithm = CryptoAlgorithm.resolveCode(in);
ByteArray value = BytesEncoding.readAsByteArray(NumberMask.SHORT, in);
return new PubKey(algorithm, value.bytes());
} catch (IOException e) {
@@ -100,8 +99,7 @@ public class CryptoKeyEncoding {
if (magicNum != MagicNumber.PRIV_KEY) {
throw new IllegalArgumentException("The PrivKey MagicNumber read from the InputStream is Illegal!");
}
byte code = (byte) in.read();
CryptoAlgorithm algorithm = CryptoAlgorithm.valueOf(code);
short algorithm = CryptoAlgorithm.resolveCode(in);
ByteArray value = BytesEncoding.readAsByteArray(NumberMask.SHORT, in);
return new PrivKey(algorithm, value.bytes());
} catch (IOException e) {


+ 3
- 3
source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/service/NodeSigningAppender.java View File

@@ -66,14 +66,14 @@ public class NodeSigningAppender implements TransactionService {
// 生成网关签名;
byte[] endpointRequestBytes = BinaryEncodingUtils.encode(txMessage, TransactionRequest.class);

CryptoAlgorithm signAlgorithm = nodeKeyPair.getAlgorithm();
SignatureFunction signFunc = CryptoServiceProviders.getSignatureFunction(nodeKeyPair.getAlgorithm());
short signAlgorithm = nodeKeyPair.getAlgorithm();
SignatureFunction signFunc = CryptoServiceProviders.getSignatureFunction(signAlgorithm);
SignatureDigest signDigest = signFunc.sign(nodeKeyPair.getPrivKey(), endpointRequestBytes);
txMessage.addNodeSignatures(new DigitalSignatureBlob(nodeKeyPair.getPubKey(), signDigest));

// 计算交易哈希;
byte[] nodeRequestBytes = BinaryEncodingUtils.encode(txMessage, TransactionRequest.class);
HashFunction hashFunc = CryptoServiceProviders.getHashFunction(nodeKeyPair.getAlgorithm());
HashFunction hashFunc = CryptoServiceProviders.getHashFunction(signAlgorithm);
HashDigest txHash = hashFunc.hash(nodeRequestBytes);
txMessage.setHash(txHash);



+ 1
- 3
source/sdk/sdk-client/src/main/java/com/jd/blockchain/sdk/client/GatewayServiceFactory.java View File

@@ -3,7 +3,6 @@ package com.jd.blockchain.sdk.client;
import java.io.Closeable;
import com.jd.blockchain.binaryproto.BinaryEncodingUtils;
import com.jd.blockchain.crypto.CryptoAlgorithm;
import com.jd.blockchain.crypto.CryptoServiceProviders;
import com.jd.blockchain.crypto.PrivKey;
import com.jd.blockchain.crypto.SignatureDigest;
@@ -139,8 +138,7 @@ public class GatewayServiceFactory implements BlockchainServiceFactory, Closeabl
byte[] txContentBytes = BinaryEncodingUtils.encode(txRequest.getTransactionContent(),
TransactionContent.class);
PrivKey userPrivKey = userKey.getPrivKey();
CryptoAlgorithm userAlgorithm = userKey.getAlgorithm();
SignatureFunction signatureFunction = CryptoServiceProviders.getSignatureFunction(userAlgorithm);
SignatureFunction signatureFunction = CryptoServiceProviders.getSignatureFunction(userKey.getAlgorithm());
if (signatureFunction != null) {
SignatureDigest signatureDigest = signatureFunction.sign(userPrivKey, txContentBytes);
DigitalSignature signature = new DigitalSignatureBlob(userKey.getPubKey(), signatureDigest);


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

@@ -673,7 +673,7 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI
return false;
}

return validateAndRecordDecision(targetDecision, resultHandle, privKey.getAlgorithm());
return validateAndRecordDecision(targetDecision, resultHandle);
} catch (Exception e) {
prompter.error(e, "Error occurred on synchronizing decision from participant[%s] to participant[%s] ! --%s",
currentId, targetId, e.getMessage());
@@ -693,7 +693,7 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI
* @return
*/
private synchronized boolean validateAndRecordDecision(LedgerInitDecision targetDecision,
DecisionResultHandle resultHandle, CryptoAlgorithm hashAlgorithm) {
DecisionResultHandle resultHandle) {
if ((!localDecision.getLedgerHash().equals(targetDecision.getLedgerHash()))
&& resultHandle.getResult() == null) {
// 如果结果已经被
@@ -730,9 +730,8 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI
// 当前参与者尚未准备就绪,返回 null;
return null;
}
PubKey pubKey = ledgerInitSetting.getConsensusParticipants()[remoteId].getPubKey();
DecisionResultHandle resultHandle = this.decisions[remoteId];
if (!validateAndRecordDecision(initDecision, resultHandle, pubKey.getAlgorithm())) {
if (!validateAndRecordDecision(initDecision, resultHandle)) {
// 签名无效;
throw new LedgerInitException(
String.format("Reject decision because of invalid signature! --[Id=%s]", remoteId));


+ 81
- 63
source/utils/utils-common/src/main/java/com/jd/blockchain/utils/io/BytesUtils.java View File

@@ -28,8 +28,10 @@ public class BytesUtils {
*
* 此方法不处理两者其中之一为 null 的情形,因为无法定义相等性,所以将引发 {@link NullPointerException} 异常;
*
* @param bytes1 bytes1
* @param bytes2 bytes2
* @param bytes1
* bytes1
* @param bytes2
* bytes2
* @return boolean
*/
public static boolean equals(byte[] bytes1, byte[] bytes2) {
@@ -59,9 +61,11 @@ public class BytesUtils {
}
/**
* 将输入流的所有内容都读入到字节数组返回;
* 如果输入流的长度超出 MAX_BUFFER_SIZE 定义的值,则抛出 IllegalArgumentException ;
* @param in in
* 将输入流的所有内容都读入到字节数组返回; 如果输入流的长度超出 MAX_BUFFER_SIZE 定义的值,则抛出
* IllegalArgumentException ;
*
* @param in
* in
* @return byte[]
*/
public static byte[] copyToBytes(InputStream in) {
@@ -98,7 +102,8 @@ public class BytesUtils {
* @param maxSize
* 最大字节大小;
* @return 返回实际复制的字节数;
* @throws IOException exception
* @throws IOException
* exception
*/
public static int copy(InputStream in, OutputStream out, int maxSize) throws IOException {
byte[] buffer = new byte[BUFFER_SIZE];
@@ -121,7 +126,8 @@ public class BytesUtils {
/**
* 将 int 值转为4字节的二进制数组;
*
* @param value value
* @param value
* value
* @return 转换后的二进制数组,高位在前,低位在后;
*/
public static byte[] toBytes(int value) {
@@ -139,7 +145,8 @@ public class BytesUtils {
/**
* 将 long 值转为8字节的二进制数组;
*
* @param value value
* @param value
* value
* @return 转换后的二进制数组,高位在前,低位在后;
*/
public static byte[] toBytes(long value) {
@@ -206,7 +213,6 @@ public class BytesUtils {
return 4;
}
/**
* 将 int 值转为4字节的二进制数组;
* <p>
@@ -218,20 +224,20 @@ public class BytesUtils {
* 要保存转换结果的二进制数组;转换结果将从高位至低位的顺序写入数组从 offset 指定位置开始的4个元素;
* @param offset
* 写入转换结果的起始位置;
* @param len 写入长度;必须大于 0 ,小于等于 4;
* @param len
* 写入长度;必须大于 0 ,小于等于 4;
* @return 返回写入的长度;
*/
public static int toBytesInReverse(int value, byte[] bytes, int offset, int len) {
int i = 0;
int l = len > 4 ? 4 : len;
for (; i < l; i++) {
bytes[offset + i] = (byte) ((value >>> (8*i)) & 0x00FF);
bytes[offset + i] = (byte) ((value >>> (8 * i)) & 0x00FF);
}
return i;
}
// public static int toBytes(int value, OutputStream out) {
// try {
// out.write((value >>> 24) & 0x00FF);
@@ -486,27 +492,60 @@ public class BytesUtils {
return value;
}
/**
* 从指定的输入流中读入2个字节,由前到后按由高位到低位的方式转为 short 整数;
*
* @param in
* in
* @return short
*/
public static short readShort(InputStream in) {
try {
int v = in.read();
if (v < 0) {
throw new IllegalDataException("No enough data to read as short from the specified input stream!");
}
int value = (v & 0xFF) << 8;
v = in.read();
if (v < 0) {
throw new IllegalDataException("No enough data to read as short from the specified input stream!");
}
value = value | (v & 0xFF);
return (short) value;
} catch (IOException e) {
throw new RuntimeIOException(e.getMessage(), e);
}
}
public static int writeShort(short value, OutputStream out) {
try {
out.write((value >>> 8) & 0x00FF);
out.write(value & 0x00FF);
return 2;
} catch (IOException e) {
throw new RuntimeIOException(e.getMessage(), e);
}
}
/**
* 从指定的输入流中读入4个字节,由前到后按由高位到低位的方式转为 int 整数;
* @param in in
*
* @param in
* in
* @return int
*/
public static int readInt(InputStream in) {
// try {
// byte[] buf = new byte[4];
// if (in.read(buf) < 4) {
// throw new IllegalDataException("No enough data to read as integer from the specified input stream!");
// specified input stream!");
// }
// return toInt(buf);
// } catch (IOException e) {
// throw new RuntimeIOException(e.getMessage(), e);
// }
try {
int value = 0;
int v;
for (int i = 0; i < 4; i++) {
value = value | ((in.read() & 0xFF) << (8 * (3 - i)));
v = in.read();
if (v < 0) {
throw new IllegalDataException(
"No enough data to read as integer from the specified input stream!");
}
value = value | ((v & 0xFF) << (8 * (3 - i)));
}
return value;
} catch (IOException e) {
@@ -515,13 +554,6 @@ public class BytesUtils {
}
public static int writeInt(int value, OutputStream out) {
// byte[] bytes = toBytes(value);
// try {
// out.write(bytes);
// } catch (IOException e) {
// throw new RuntimeIOException(e.getMessage(), e);
// }
try {
out.write((value >>> 24) & 0x00FF);
out.write((value >>> 16) & 0x00FF);
@@ -534,17 +566,6 @@ public class BytesUtils {
}
public static long readLong(InputStream in) {
// try {
// byte[] buf = new byte[8];
// if (in.read(buf) < 8) {
// throw new IllegalDataException(
// "No enough data to read as long integer from the specified input stream!");
// }
// return toLong(buf);
// } catch (IOException e) {
// throw new RuntimeIOException(e.getMessage(), e);
// }
try {
long value = 0;
int v;
@@ -565,13 +586,6 @@ public class BytesUtils {
}
public static int writeLong(long value, OutputStream out) {
// byte[] bytes = toBytes(value);
// try {
// out.write(bytes);
// } catch (IOException e) {
// throw new RuntimeIOException(e.getMessage(), e);
// }
try {
out.write((int) ((value >>> 56) & 0x00FF));
out.write((int) ((value >>> 48) & 0x00FF));
@@ -644,25 +658,29 @@ public class BytesUtils {
/**
* 从字节数组获取对象
*
* @param objBytes objBytes
* @param objBytes
* objBytes
* @return object
* @throws Exception exception
* @throws Exception
* exception
*/
// public static Object getObjectFromBytes(byte[] objBytes) throws Exception {
// if (objBytes == null || objBytes.length == 0) {
// return null;
// }
// ByteArrayInputStream bi = new ByteArrayInputStream(objBytes);
// ObjectInputStream oi = new ObjectInputStream(bi);
// return oi.readObject();
// }
// public static Object getObjectFromBytes(byte[] objBytes) throws Exception {
// if (objBytes == null || objBytes.length == 0) {
// return null;
// }
// ByteArrayInputStream bi = new ByteArrayInputStream(objBytes);
// ObjectInputStream oi = new ObjectInputStream(bi);
// return oi.readObject();
// }
/**
* 从对象获取一个字节数组;
*
* @param obj obj
* @param obj
* obj
* @return byte array
* @throws Exception exception
* @throws Exception
* exception
*/
public static byte[] getBytesFromObject(Object obj) throws Exception {
if (obj == null) {


Loading…
Cancel
Save