@@ -29,7 +29,6 @@ import static com.jd.blockchain.crypto.service.pki.PKIAlgorithm.SHA1WITHRSA2048; | |||||
*/ | */ | ||||
public class SHA1WITHRSA2048SignatureFunction implements SignatureFunction { | public class SHA1WITHRSA2048SignatureFunction implements SignatureFunction { | ||||
private static final int RAW_PUBKEY_SIZE = 259; | private static final int RAW_PUBKEY_SIZE = 259; | ||||
private static final int RAW_PRIVKEY_SIZE = 1155; | private static final int RAW_PRIVKEY_SIZE = 1155; | ||||
@@ -1,7 +1,24 @@ | |||||
package com.jd.blockchain.crypto.service.pki; | package com.jd.blockchain.crypto.service.pki; | ||||
import com.jd.blockchain.crypto.*; | import com.jd.blockchain.crypto.*; | ||||
import org.bouncycastle.asn1.DERNull; | |||||
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers; | |||||
import org.bouncycastle.asn1.x509.AlgorithmIdentifier; | |||||
import org.bouncycastle.jcajce.provider.asymmetric.util.KeyUtil; | |||||
import org.bouncycastle.jce.provider.BouncyCastleProvider; | |||||
import java.math.BigInteger; | |||||
import java.security.*; | |||||
import java.security.interfaces.RSAPrivateCrtKey; | |||||
import java.security.interfaces.RSAPublicKey; | |||||
import java.security.spec.InvalidKeySpecException; | |||||
import java.security.spec.PKCS8EncodedKeySpec; | |||||
import java.security.spec.X509EncodedKeySpec; | |||||
import static com.jd.blockchain.crypto.BaseCryptoKey.KEY_TYPE_BYTES; | |||||
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 static com.jd.blockchain.crypto.service.pki.PKIAlgorithm.SHA1WITHRSA4096; | import static com.jd.blockchain.crypto.service.pki.PKIAlgorithm.SHA1WITHRSA4096; | ||||
/** | /** | ||||
@@ -11,56 +28,191 @@ import static com.jd.blockchain.crypto.service.pki.PKIAlgorithm.SHA1WITHRSA4096; | |||||
* @date 2019-05-15, 17:13 | * @date 2019-05-15, 17:13 | ||||
*/ | */ | ||||
public class SHA1WITHRSA4096SignatureFunction implements SignatureFunction { | public class SHA1WITHRSA4096SignatureFunction implements SignatureFunction { | ||||
private static final int RAW_PUBKEY_SIZE = 515; | |||||
private static final int RAW_PRIVKEY_SIZE = 2307; | |||||
private static final int RAW_SIGNATUREDIGEST_SIZE = 512; | |||||
private static final AlgorithmIdentifier RSA_ALGORITHM_IDENTIFIER = | |||||
new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, DERNull.INSTANCE); | |||||
@Override | @Override | ||||
public SignatureDigest sign(PrivKey privKey, byte[] data) { | public SignatureDigest sign(PrivKey privKey, byte[] data) { | ||||
return null; | |||||
byte[] rawPrivKeyBytes = privKey.getRawKeyBytes(); | |||||
if (rawPrivKeyBytes.length < RAW_PRIVKEY_SIZE) { | |||||
throw new CryptoException("This key has wrong format!"); | |||||
} | |||||
if (privKey.getAlgorithm() != SHA1WITHRSA4096.code()) { | |||||
throw new CryptoException("This key is not SHA1WITHRSA4096 private key!"); | |||||
} | |||||
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(rawPrivKeyBytes); | |||||
KeyFactory keyFactory; | |||||
RSAPrivateCrtKey rawPrivKey; | |||||
Signature signer; | |||||
byte[] signature; | |||||
try { | |||||
keyFactory = KeyFactory.getInstance("RSA"); | |||||
rawPrivKey = (RSAPrivateCrtKey) keyFactory.generatePrivate(keySpec); | |||||
signer = Signature.getInstance("SHA1withRSA"); | |||||
signer.initSign(rawPrivKey); | |||||
signer.update(data); | |||||
signature = signer.sign(); | |||||
} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException | InvalidKeySpecException e) { | |||||
throw new CryptoException(e.getMessage(), e); | |||||
} | |||||
return new SignatureDigest(SHA1WITHRSA4096, signature); | |||||
} | } | ||||
@Override | @Override | ||||
public boolean verify(SignatureDigest digest, PubKey pubKey, byte[] data) { | public boolean verify(SignatureDigest digest, PubKey pubKey, byte[] data) { | ||||
return false; | |||||
byte[] rawPubKeyBytes = pubKey.getRawKeyBytes(); | |||||
byte[] rawDigestBytes = digest.getRawDigest(); | |||||
if (rawPubKeyBytes.length < RAW_PUBKEY_SIZE) { | |||||
throw new CryptoException("This key has wrong format!"); | |||||
} | |||||
if (pubKey.getAlgorithm() != SHA1WITHRSA4096.code()) { | |||||
throw new CryptoException("This key is not SHA1WITHRSA4096 public key!"); | |||||
} | |||||
if (digest.getAlgorithm() != SHA1WITHRSA4096.code() || rawDigestBytes.length != RAW_SIGNATUREDIGEST_SIZE) { | |||||
throw new CryptoException("This is not SHA1WITHRSA4096 signature digest!"); | |||||
} | |||||
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(rawPubKeyBytes); | |||||
KeyFactory keyFactory; | |||||
RSAPublicKey rawPubKey; | |||||
Signature verifier; | |||||
boolean isValid; | |||||
try { | |||||
keyFactory = KeyFactory.getInstance("RSA"); | |||||
rawPubKey = (RSAPublicKey) keyFactory.generatePublic(keySpec); | |||||
verifier = Signature.getInstance("SHA1withRSA"); | |||||
verifier.initVerify(rawPubKey); | |||||
verifier.update(data); | |||||
isValid = verifier.verify(rawDigestBytes); | |||||
} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException | InvalidKeySpecException e) { | |||||
throw new CryptoException(e.getMessage(), e); | |||||
} | |||||
return isValid; | |||||
} | } | ||||
@Override | @Override | ||||
public PubKey retrievePubKey(PrivKey privKey) { | |||||
return null; | |||||
public boolean supportPubKey(byte[] pubKeyBytes) { | |||||
return pubKeyBytes.length > (ALGORYTHM_CODE_SIZE + KEY_TYPE_BYTES + RAW_PUBKEY_SIZE) | |||||
&& CryptoAlgorithm.match(SHA1WITHRSA4096, pubKeyBytes) | |||||
&& pubKeyBytes[ALGORYTHM_CODE_SIZE] == PUBLIC.CODE; | |||||
} | } | ||||
@Override | @Override | ||||
public boolean supportPrivKey(byte[] privKeyBytes) { | |||||
return false; | |||||
public PubKey resolvePubKey(byte[] pubKeyBytes) { | |||||
if (supportPubKey(pubKeyBytes)) { | |||||
return new PubKey(pubKeyBytes); | |||||
} else { | |||||
throw new CryptoException("pubKeyBytes are invalid!"); | |||||
} | |||||
} | } | ||||
@Override | @Override | ||||
public PrivKey resolvePrivKey(byte[] privKeyBytes) { | |||||
return null; | |||||
public boolean supportPrivKey(byte[] privKeyBytes) { | |||||
return privKeyBytes.length > (ALGORYTHM_CODE_SIZE + KEY_TYPE_BYTES + RAW_PRIVKEY_SIZE) | |||||
&& CryptoAlgorithm.match(SHA1WITHRSA4096, privKeyBytes) | |||||
&& privKeyBytes[ALGORYTHM_CODE_SIZE] == PRIVATE.CODE; | |||||
} | } | ||||
@Override | @Override | ||||
public boolean supportPubKey(byte[] pubKeyBytes) { | |||||
return false; | |||||
public PrivKey resolvePrivKey(byte[] privKeyBytes) { | |||||
if (supportPrivKey(privKeyBytes)) { | |||||
return new PrivKey(privKeyBytes); | |||||
} else { | |||||
throw new CryptoException("privKeyBytes are invalid!"); | |||||
} | |||||
} | } | ||||
@Override | @Override | ||||
public PubKey resolvePubKey(byte[] pubKeyBytes) { | |||||
return null; | |||||
public PubKey retrievePubKey(PrivKey privKey) { | |||||
byte[] rawPrivKeyBytes = privKey.getRawKeyBytes(); | |||||
if (rawPrivKeyBytes.length < RAW_PRIVKEY_SIZE) { | |||||
throw new CryptoException("This key has wrong format!"); | |||||
} | |||||
if (privKey.getAlgorithm() != SHA1WITHRSA4096.code()) { | |||||
throw new CryptoException("This key is not SHA1WITHRSA4096 private key!"); | |||||
} | |||||
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(rawPrivKeyBytes); | |||||
KeyFactory keyFactory; | |||||
RSAPrivateCrtKey rawPrivKey; | |||||
byte[] rawPubKeyBytes; | |||||
try { | |||||
keyFactory = KeyFactory.getInstance("RSA"); | |||||
rawPrivKey = (RSAPrivateCrtKey) keyFactory.generatePrivate(keySpec); | |||||
BigInteger modulus = rawPrivKey.getModulus(); | |||||
BigInteger exponent = rawPrivKey.getPublicExponent(); | |||||
rawPubKeyBytes = KeyUtil.getEncodedSubjectPublicKeyInfo(RSA_ALGORITHM_IDENTIFIER, | |||||
new org.bouncycastle.asn1.pkcs.RSAPublicKey(modulus, exponent)); | |||||
} catch (NoSuchAlgorithmException | InvalidKeySpecException e) { | |||||
throw new CryptoException(e.getMessage(), e); | |||||
} | |||||
return new PubKey(SHA1WITHRSA4096, rawPubKeyBytes); | |||||
} | } | ||||
@Override | @Override | ||||
public boolean supportDigest(byte[] digestBytes) { | public boolean supportDigest(byte[] digestBytes) { | ||||
return false; | |||||
return digestBytes.length == (RAW_SIGNATUREDIGEST_SIZE + ALGORYTHM_CODE_SIZE) | |||||
&& CryptoAlgorithm.match(SHA1WITHRSA4096, digestBytes); | |||||
} | } | ||||
@Override | @Override | ||||
public SignatureDigest resolveDigest(byte[] digestBytes) { | public SignatureDigest resolveDigest(byte[] digestBytes) { | ||||
return null; | |||||
if (supportDigest(digestBytes)) { | |||||
return new SignatureDigest(digestBytes); | |||||
} else { | |||||
throw new CryptoException("digestBytes are invalid!"); | |||||
} | |||||
} | } | ||||
@Override | @Override | ||||
public AsymmetricKeypair generateKeypair() { | public AsymmetricKeypair generateKeypair() { | ||||
return null; | |||||
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); | |||||
KeyPairGenerator generator; | |||||
PublicKey pubKey; | |||||
PrivateKey privKey; | |||||
try { | |||||
generator = KeyPairGenerator.getInstance("RSA", BouncyCastleProvider.PROVIDER_NAME); | |||||
generator.initialize(4096); | |||||
KeyPair keyPair = generator.generateKeyPair(); | |||||
pubKey = keyPair.getPublic(); | |||||
privKey = keyPair.getPrivate(); | |||||
} catch (NoSuchAlgorithmException | NoSuchProviderException e) { | |||||
throw new CryptoException(e.getMessage(), e); | |||||
} | |||||
byte[] pubKeyBytes = pubKey.getEncoded(); | |||||
byte[] privKeyBytes = privKey.getEncoded(); | |||||
return new AsymmetricKeypair(new PubKey(SHA1WITHRSA4096, pubKeyBytes), | |||||
new PrivKey(SHA1WITHRSA4096, privKeyBytes)); | |||||
} | } | ||||
@Override | @Override | ||||
public CryptoAlgorithm getAlgorithm() { | public CryptoAlgorithm getAlgorithm() { | ||||
return SHA1WITHRSA4096; | return SHA1WITHRSA4096; | ||||
@@ -1,7 +1,27 @@ | |||||
package com.jd.blockchain.crypto.service.pki; | package com.jd.blockchain.crypto.service.pki; | ||||
import com.jd.blockchain.crypto.*; | import com.jd.blockchain.crypto.*; | ||||
import org.bouncycastle.asn1.gm.GMObjectIdentifiers; | |||||
import org.bouncycastle.asn1.x509.AlgorithmIdentifier; | |||||
import org.bouncycastle.asn1.x9.X9ObjectIdentifiers; | |||||
import org.bouncycastle.jcajce.provider.asymmetric.util.KeyUtil; | |||||
import org.bouncycastle.jce.provider.BouncyCastleProvider; | |||||
import org.bouncycastle.jce.spec.ECNamedCurveGenParameterSpec; | |||||
import org.bouncycastle.math.ec.ECPoint; | |||||
import org.bouncycastle.math.ec.custom.gm.SM2P256V1Curve; | |||||
import java.math.BigInteger; | |||||
import java.security.*; | |||||
import java.security.interfaces.ECPrivateKey; | |||||
import java.security.interfaces.ECPublicKey; | |||||
import java.security.spec.InvalidKeySpecException; | |||||
import java.security.spec.PKCS8EncodedKeySpec; | |||||
import java.security.spec.X509EncodedKeySpec; | |||||
import static com.jd.blockchain.crypto.BaseCryptoKey.KEY_TYPE_BYTES; | |||||
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 static com.jd.blockchain.crypto.service.pki.PKIAlgorithm.SM3WITHSM2; | import static com.jd.blockchain.crypto.service.pki.PKIAlgorithm.SM3WITHSM2; | ||||
/** | /** | ||||
@@ -11,56 +31,204 @@ import static com.jd.blockchain.crypto.service.pki.PKIAlgorithm.SM3WITHSM2; | |||||
* @date 2019-05-15, 16:39 | * @date 2019-05-15, 16:39 | ||||
*/ | */ | ||||
public class SM3WITHSM2SignatureFunction implements SignatureFunction { | public class SM3WITHSM2SignatureFunction implements SignatureFunction { | ||||
private static final int RAW_PUBKEY_SIZE = 65; | |||||
private static final int RAW_PRIVKEY_SIZE = 32 + 65; | |||||
private static final int RAW_SIGNATUREDIGEST_SIZE = 64; | |||||
private static final SM2P256V1Curve CURVE = new SM2P256V1Curve(); | |||||
private static final BigInteger GX = new BigInteger("32C4AE2C1F1981195F9904466A39C994" + | |||||
"8FE30BBFF2660BE1715A4589334C74C7", 16); | |||||
private static final BigInteger GY = new BigInteger("BC3736A2F4F6779C59BDCEE36B692153" + | |||||
"D0A9877CC62A474002DF32E52139F0A0", 16); | |||||
private static final ECPoint G = CURVE.createPoint(GX, GY); | |||||
private static final AlgorithmIdentifier SM2_ALGORITHM_IDENTIFIER = new AlgorithmIdentifier( | |||||
X9ObjectIdentifiers.id_ecPublicKey, GMObjectIdentifiers.sm2p256v1); | |||||
@Override | @Override | ||||
public SignatureDigest sign(PrivKey privKey, byte[] data) { | public SignatureDigest sign(PrivKey privKey, byte[] data) { | ||||
return null; | |||||
Security.addProvider(new BouncyCastleProvider()); | |||||
byte[] rawPrivKeyBytes = privKey.getRawKeyBytes(); | |||||
if (rawPrivKeyBytes.length < RAW_PRIVKEY_SIZE) { | |||||
throw new CryptoException("This key has wrong format!"); | |||||
} | |||||
if (privKey.getAlgorithm() != SM3WITHSM2.code()) { | |||||
throw new CryptoException("This key is not SM3WITHSM2 private key!"); | |||||
} | |||||
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(rawPrivKeyBytes); | |||||
KeyFactory keyFactory; | |||||
ECPrivateKey rawPrivKey; | |||||
Signature signer; | |||||
byte[] signature; | |||||
try { | |||||
keyFactory = KeyFactory.getInstance("EC", BouncyCastleProvider.PROVIDER_NAME); | |||||
rawPrivKey = (ECPrivateKey) keyFactory.generatePrivate(keySpec); | |||||
signer = Signature.getInstance("SM3withSM2", BouncyCastleProvider.PROVIDER_NAME); | |||||
signer.initSign(rawPrivKey); | |||||
signer.update(data); | |||||
signature = signer.sign(); | |||||
} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException | | |||||
InvalidKeySpecException | NoSuchProviderException e) { | |||||
throw new CryptoException(e.getMessage(), e); | |||||
} | |||||
return new SignatureDigest(SM3WITHSM2, signature); | |||||
} | } | ||||
@Override | @Override | ||||
public boolean verify(SignatureDigest digest, PubKey pubKey, byte[] data) { | public boolean verify(SignatureDigest digest, PubKey pubKey, byte[] data) { | ||||
return false; | |||||
Security.addProvider(new BouncyCastleProvider()); | |||||
byte[] rawPubKeyBytes = pubKey.getRawKeyBytes(); | |||||
byte[] rawDigestBytes = digest.getRawDigest(); | |||||
if (rawPubKeyBytes.length < RAW_PUBKEY_SIZE) { | |||||
throw new CryptoException("This key has wrong format!"); | |||||
} | |||||
if (pubKey.getAlgorithm() != SM3WITHSM2.code()) { | |||||
throw new CryptoException("This key is not SM3WITHSM2 public key!"); | |||||
} | |||||
if (digest.getAlgorithm() != SM3WITHSM2.code() || rawDigestBytes.length < RAW_SIGNATUREDIGEST_SIZE) { | |||||
throw new CryptoException("This is not SM3WITHSM2 signature digest!"); | |||||
} | |||||
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(rawPubKeyBytes); | |||||
KeyFactory keyFactory; | |||||
ECPublicKey rawPubKey; | |||||
Signature verifier; | |||||
boolean isValid; | |||||
try { | |||||
keyFactory = KeyFactory.getInstance("EC", BouncyCastleProvider.PROVIDER_NAME); | |||||
rawPubKey = (ECPublicKey) keyFactory.generatePublic(keySpec); | |||||
verifier = Signature.getInstance("SM3withSM2", BouncyCastleProvider.PROVIDER_NAME); | |||||
verifier.initVerify(rawPubKey); | |||||
verifier.update(data); | |||||
isValid = verifier.verify(rawDigestBytes); | |||||
} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException | InvalidKeySpecException | |||||
| NoSuchProviderException e) { | |||||
throw new CryptoException(e.getMessage(), e); | |||||
} | |||||
return isValid; | |||||
} | } | ||||
@Override | @Override | ||||
public PubKey retrievePubKey(PrivKey privKey) { | |||||
return null; | |||||
public boolean supportPubKey(byte[] pubKeyBytes) { | |||||
return pubKeyBytes.length > (ALGORYTHM_CODE_SIZE + KEY_TYPE_BYTES + RAW_PUBKEY_SIZE) | |||||
&& CryptoAlgorithm.match(SM3WITHSM2, pubKeyBytes) | |||||
&& pubKeyBytes[ALGORYTHM_CODE_SIZE] == PUBLIC.CODE; | |||||
} | } | ||||
@Override | @Override | ||||
public boolean supportPrivKey(byte[] privKeyBytes) { | |||||
return false; | |||||
public PubKey resolvePubKey(byte[] pubKeyBytes) { | |||||
if (supportPubKey(pubKeyBytes)) { | |||||
return new PubKey(pubKeyBytes); | |||||
} else { | |||||
throw new CryptoException("pubKeyBytes are invalid!"); | |||||
} | |||||
} | } | ||||
@Override | @Override | ||||
public PrivKey resolvePrivKey(byte[] privKeyBytes) { | |||||
return null; | |||||
public boolean supportPrivKey(byte[] privKeyBytes) { | |||||
return privKeyBytes.length > (ALGORYTHM_CODE_SIZE + KEY_TYPE_BYTES + RAW_PRIVKEY_SIZE) | |||||
&& CryptoAlgorithm.match(SM3WITHSM2, privKeyBytes) | |||||
&& privKeyBytes[ALGORYTHM_CODE_SIZE] == PRIVATE.CODE; | |||||
} | } | ||||
@Override | @Override | ||||
public boolean supportPubKey(byte[] pubKeyBytes) { | |||||
return false; | |||||
public PrivKey resolvePrivKey(byte[] privKeyBytes) { | |||||
if (supportPrivKey(privKeyBytes)) { | |||||
return new PrivKey(privKeyBytes); | |||||
} else { | |||||
throw new CryptoException("privKeyBytes are invalid!"); | |||||
} | |||||
} | } | ||||
@Override | @Override | ||||
public PubKey resolvePubKey(byte[] pubKeyBytes) { | |||||
return null; | |||||
public PubKey retrievePubKey(PrivKey privKey) { | |||||
byte[] rawPrivKeyBytes = privKey.getRawKeyBytes(); | |||||
if (rawPrivKeyBytes.length < RAW_PRIVKEY_SIZE) { | |||||
throw new CryptoException("This key has wrong format!"); | |||||
} | |||||
if (privKey.getAlgorithm() != SM3WITHSM2.code()) { | |||||
throw new CryptoException("This key is not SM3WITHSM2 private key!"); | |||||
} | |||||
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(rawPrivKeyBytes); | |||||
KeyFactory keyFactory; | |||||
ECPrivateKey rawPrivKey; | |||||
byte[] rawPubKeyBytes; | |||||
try { | |||||
keyFactory = KeyFactory.getInstance("EC", BouncyCastleProvider.PROVIDER_NAME); | |||||
rawPrivKey = (ECPrivateKey) keyFactory.generatePrivate(keySpec); | |||||
BigInteger d = rawPrivKey.getS(); | |||||
ECPoint Q = G.multiply(d).normalize(); | |||||
rawPubKeyBytes = KeyUtil.getEncodedSubjectPublicKeyInfo(SM2_ALGORITHM_IDENTIFIER, | |||||
Q.getEncoded(false)); | |||||
} catch (NoSuchAlgorithmException | InvalidKeySpecException | NoSuchProviderException e) { | |||||
throw new CryptoException(e.getMessage(), e); | |||||
} | |||||
return new PubKey(SM3WITHSM2, rawPubKeyBytes); | |||||
} | } | ||||
@Override | @Override | ||||
public boolean supportDigest(byte[] digestBytes) { | public boolean supportDigest(byte[] digestBytes) { | ||||
return false; | |||||
return digestBytes.length > (RAW_SIGNATUREDIGEST_SIZE + ALGORYTHM_CODE_SIZE) | |||||
&& CryptoAlgorithm.match(SM3WITHSM2, digestBytes); | |||||
} | } | ||||
@Override | @Override | ||||
public SignatureDigest resolveDigest(byte[] digestBytes) { | public SignatureDigest resolveDigest(byte[] digestBytes) { | ||||
return null; | |||||
if (supportDigest(digestBytes)) { | |||||
return new SignatureDigest(digestBytes); | |||||
} else { | |||||
throw new CryptoException("digestBytes are invalid!"); | |||||
} | |||||
} | } | ||||
@Override | @Override | ||||
public AsymmetricKeypair generateKeypair() { | public AsymmetricKeypair generateKeypair() { | ||||
return null; | |||||
} | |||||
Security.addProvider(new BouncyCastleProvider()); | |||||
KeyPairGenerator generator; | |||||
PublicKey pubKey; | |||||
PrivateKey privKey; | |||||
try { | |||||
generator = KeyPairGenerator.getInstance("EC", BouncyCastleProvider.PROVIDER_NAME); | |||||
generator.initialize(new ECNamedCurveGenParameterSpec("sm2p256v1")); | |||||
KeyPair keyPair = generator.generateKeyPair(); | |||||
pubKey = keyPair.getPublic(); | |||||
privKey = keyPair.getPrivate(); | |||||
} catch (NoSuchAlgorithmException | NoSuchProviderException | InvalidAlgorithmParameterException e) { | |||||
throw new CryptoException(e.getMessage(), e); | |||||
} | |||||
byte[] pubKeyBytes = pubKey.getEncoded(); | |||||
byte[] privKeyBytes = privKey.getEncoded(); | |||||
return new AsymmetricKeypair(new PubKey(SM3WITHSM2, pubKeyBytes), | |||||
new PrivKey(SM3WITHSM2, privKeyBytes)); | |||||
} | |||||
@Override | @Override | ||||
public CryptoAlgorithm getAlgorithm() { | public CryptoAlgorithm getAlgorithm() { | ||||
return SM3WITHSM2; | return SM3WITHSM2; | ||||
@@ -14,7 +14,6 @@ import org.bouncycastle.pkcs.PKCS10CertificationRequestBuilder; | |||||
import org.bouncycastle.pkcs.jcajce.JcaPKCS10CertificationRequestBuilder; | import org.bouncycastle.pkcs.jcajce.JcaPKCS10CertificationRequestBuilder; | ||||
import org.bouncycastle.util.encoders.Base64; | import org.bouncycastle.util.encoders.Base64; | ||||
import java.io.IOException; | import java.io.IOException; | ||||
import java.security.*; | import java.security.*; | ||||
@@ -65,17 +64,24 @@ public class CSRBuilder { | |||||
keyPair = generator.generateKeyPair(); | keyPair = generator.generateKeyPair(); | ||||
pubKey = keyPair.getPublic(); | pubKey = keyPair.getPublic(); | ||||
privKey = keyPair.getPrivate(); | privKey = keyPair.getPrivate(); | ||||
break; | |||||
} | } | ||||
case "SM2": { | case "SM2": { | ||||
generator = KeyPairGenerator.getInstance("EC", BC); | generator = KeyPairGenerator.getInstance("EC", BC); | ||||
if (KeyLength != 256) { | |||||
throw new CryptoException("SM3withSM2 with unsupported key length [" + | |||||
KeyLength +"] in CSR!"); | |||||
} | |||||
generator.initialize(new ECNamedCurveGenParameterSpec("sm2p256v1")); | generator.initialize(new ECNamedCurveGenParameterSpec("sm2p256v1")); | ||||
keyPair = generator.generateKeyPair(); | keyPair = generator.generateKeyPair(); | ||||
pubKey = keyPair.getPublic(); | pubKey = keyPair.getPublic(); | ||||
privKey = keyPair.getPrivate(); | privKey = keyPair.getPrivate(); | ||||
break; | |||||
} | } | ||||
default: throw new CryptoException("Unsupported key algorithm[" + algoName + "] in CSR!"); | |||||
default: throw new CryptoException("Unsupported algorithm [" + algoName + "] with key length [" + | |||||
KeyLength +"] in CSR!"); | |||||
} | } | ||||
} catch (NoSuchAlgorithmException | NoSuchProviderException | InvalidAlgorithmParameterException e) { | } catch (NoSuchAlgorithmException | NoSuchProviderException | InvalidAlgorithmParameterException e) { | ||||
throw new CryptoException(e.getMessage(), e); | throw new CryptoException(e.getMessage(), e); | ||||
@@ -86,7 +92,7 @@ public class CSRBuilder { | |||||
String organizationName, String departmentName, String domainName, | String organizationName, String departmentName, String domainName, | ||||
String emailName) { | String emailName) { | ||||
String result = null; | |||||
String result; | |||||
X500NameBuilder nameBuilder = new X500NameBuilder(BCStrictStyle.INSTANCE); | X500NameBuilder nameBuilder = new X500NameBuilder(BCStrictStyle.INSTANCE); | ||||
nameBuilder.addRDN(BCStyle.C, countryName); // a country name, and China is short as CN | nameBuilder.addRDN(BCStyle.C, countryName); // a country name, and China is short as CN | ||||
@@ -120,12 +126,4 @@ public class CSRBuilder { | |||||
public PrivateKey getPrivKey() { | public PrivateKey getPrivKey() { | ||||
return privKey; | return privKey; | ||||
} | } | ||||
public byte[] getPubKeyBytes() { | |||||
return pubKey.getEncoded(); | |||||
} | |||||
public byte[] getPrivKeyBytes() { | |||||
return privKey.getEncoded(); | |||||
} | |||||
} | } |
@@ -0,0 +1,197 @@ | |||||
package com.jd.blockchain.crypto.service.pki; | |||||
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 junit.framework.TestCase.assertNull; | |||||
import static org.junit.Assert.*; | |||||
/** | |||||
* @author zhanglin33 | |||||
* @title: SHA1WITHRSA4096SignatureFunctionTest | |||||
* @description: TODO | |||||
* @date 2019-05-16, 10:49 | |||||
*/ | |||||
public class SHA1WITHRSA4096SignatureFunctionTest { | |||||
private AsymmetricKeypair keyPair = Crypto.getSignatureFunction(Crypto.getAlgorithm("SHA1WITHRSA4096")). | |||||
generateKeypair(); | |||||
@Test | |||||
public void getAlgorithmTest() { | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SHA1WITHRSA4096"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
assertEquals(signatureFunction.getAlgorithm().name(), algorithm.name()); | |||||
assertEquals(signatureFunction.getAlgorithm().code(), algorithm.code()); | |||||
algorithm = Crypto.getAlgorithm("SHA1withRsa4096"); | |||||
assertNotNull(algorithm); | |||||
assertEquals(signatureFunction.getAlgorithm().name(), algorithm.name()); | |||||
assertEquals(signatureFunction.getAlgorithm().code(), algorithm.code()); | |||||
algorithm = Crypto.getAlgorithm("rsa2048"); | |||||
assertNull(algorithm); | |||||
} | |||||
@Test | |||||
public void generateKeyPairTest() { | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SHA1WITHRSA4096"); | |||||
assertNotNull(algorithm); | |||||
PubKey pubKey = keyPair.getPubKey(); | |||||
PrivKey privKey = keyPair.getPrivKey(); | |||||
assertEquals(PUBLIC.CODE, pubKey.getKeyType().CODE); | |||||
assertTrue(pubKey.getRawKeyBytes().length > 515); | |||||
assertEquals(PRIVATE.CODE, privKey.getKeyType().CODE); | |||||
assertTrue(privKey.getRawKeyBytes().length > 2307); | |||||
assertEquals(algorithm.code(), pubKey.getAlgorithm()); | |||||
assertEquals(algorithm.code(), privKey.getAlgorithm()); | |||||
byte[] algoBytes = CryptoAlgorithm.getCodeBytes(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() { | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SHA1WITHRSA4096"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
PubKey pubKey = keyPair.getPubKey(); | |||||
PrivKey privKey = keyPair.getPrivKey(); | |||||
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()); | |||||
} | |||||
@Test | |||||
public void signAndVerifyTest() { | |||||
byte[] data = new byte[1024]; | |||||
Random random = new Random(); | |||||
random.nextBytes(data); | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SHA1WITHRSA4096"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
PrivKey privKey = keyPair.getPrivKey(); | |||||
PubKey pubKey = keyPair.getPubKey(); | |||||
SignatureDigest signatureDigest = signatureFunction.sign(privKey, data); | |||||
byte[] signatureBytes = signatureDigest.toBytes(); | |||||
assertEquals(2 + 512, signatureBytes.length); | |||||
assertEquals(algorithm.code(), signatureDigest.getAlgorithm()); | |||||
assertEquals(PKIAlgorithm.SHA1WITHRSA4096.code(), signatureDigest.getAlgorithm()); | |||||
assertEquals((short) (SIGNATURE_ALGORITHM | ASYMMETRIC_KEY | ((byte) 32 & 0x00FF)), | |||||
signatureDigest.getAlgorithm()); | |||||
byte[] algoBytes = BytesUtils.toBytes(signatureDigest.getAlgorithm()); | |||||
byte[] rawSinatureBytes = signatureDigest.getRawDigest(); | |||||
assertArrayEquals(BytesUtils.concat(algoBytes, rawSinatureBytes), signatureBytes); | |||||
assertTrue(signatureFunction.verify(signatureDigest, pubKey, data)); | |||||
} | |||||
@Test | |||||
public void supportAndResolvePrivKeyTest() { | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SHA1WITHRSA4096"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
PrivKey privKey = keyPair.getPrivKey(); | |||||
byte[] privKeyBytes = privKey.toBytes(); | |||||
assertTrue(signatureFunction.supportPrivKey(privKeyBytes)); | |||||
PrivKey resolvedPrivKey = signatureFunction.resolvePrivKey(privKeyBytes); | |||||
assertEquals(PRIVATE.CODE, resolvedPrivKey.getKeyType().CODE); | |||||
assertEquals(PKIAlgorithm.SHA1WITHRSA4096.code(), resolvedPrivKey.getAlgorithm()); | |||||
assertEquals((short) (SIGNATURE_ALGORITHM | ASYMMETRIC_KEY | ((byte) 32 & 0x00FF)), | |||||
resolvedPrivKey.getAlgorithm()); | |||||
assertArrayEquals(privKeyBytes, resolvedPrivKey.toBytes()); | |||||
} | |||||
@Test | |||||
public void supportAndResolvePubKeyTest() { | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SHA1WITHRSA4096"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
PubKey pubKey = keyPair.getPubKey(); | |||||
byte[] pubKeyBytes = pubKey.toBytes(); | |||||
assertTrue(signatureFunction.supportPubKey(pubKeyBytes)); | |||||
PubKey resolvedPubKey = signatureFunction.resolvePubKey(pubKeyBytes); | |||||
assertEquals(PUBLIC.CODE, resolvedPubKey.getKeyType().CODE); | |||||
assertEquals(PKIAlgorithm.SHA1WITHRSA4096.code(), resolvedPubKey.getAlgorithm()); | |||||
assertEquals((short) (SIGNATURE_ALGORITHM | ASYMMETRIC_KEY | ((byte) 32 & 0x00FF)), | |||||
resolvedPubKey.getAlgorithm()); | |||||
assertArrayEquals(pubKeyBytes, resolvedPubKey.toBytes()); | |||||
} | |||||
@Test | |||||
public void supportAndResolveDigestTest() { | |||||
byte[] data = new byte[1024]; | |||||
Random random = new Random(); | |||||
random.nextBytes(data); | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SHA1WITHRSA4096"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
PrivKey privKey = keyPair.getPrivKey(); | |||||
SignatureDigest signatureDigest = signatureFunction.sign(privKey, data); | |||||
byte[] signatureDigestBytes = signatureDigest.toBytes(); | |||||
assertTrue(signatureFunction.supportDigest(signatureDigestBytes)); | |||||
SignatureDigest resolvedSignatureDigest = signatureFunction.resolveDigest(signatureDigestBytes); | |||||
assertEquals(512, resolvedSignatureDigest.getRawDigest().length); | |||||
assertEquals(PKIAlgorithm.SHA1WITHRSA4096.code(), resolvedSignatureDigest.getAlgorithm()); | |||||
assertEquals((short) (SIGNATURE_ALGORITHM | ASYMMETRIC_KEY | ((byte) 32 & 0x00FF)), | |||||
resolvedSignatureDigest.getAlgorithm()); | |||||
assertArrayEquals(signatureDigestBytes, resolvedSignatureDigest.toBytes()); | |||||
} | |||||
} |
@@ -0,0 +1,274 @@ | |||||
package com.jd.blockchain.crypto.service.pki; | |||||
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 junit.framework.TestCase.assertNull; | |||||
import static org.junit.Assert.*; | |||||
/** | |||||
* @author zhanglin33 | |||||
* @title: SM3WITHSM2SignatureFunctionTest | |||||
* @description: TODO | |||||
* @date 2019-05-16, 17:04 | |||||
*/ | |||||
public class SM3WITHSM2SignatureFunctionTest { | |||||
@Test | |||||
public void getAlgorithmTest() { | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SM3WITHSM2"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
assertEquals(signatureFunction.getAlgorithm().name(), algorithm.name()); | |||||
assertEquals(signatureFunction.getAlgorithm().code(), algorithm.code()); | |||||
algorithm = Crypto.getAlgorithm("sm3withsm2"); | |||||
assertNotNull(algorithm); | |||||
assertEquals(signatureFunction.getAlgorithm().name(), algorithm.name()); | |||||
assertEquals(signatureFunction.getAlgorithm().code(), algorithm.code()); | |||||
algorithm = Crypto.getAlgorithm("sm3withs"); | |||||
assertNull(algorithm); | |||||
} | |||||
@Test | |||||
public void generateKeyPairTest() { | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SM3WITHSM2"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
AsymmetricKeypair keyPair = signatureFunction.generateKeypair(); | |||||
PubKey pubKey = keyPair.getPubKey(); | |||||
PrivKey privKey = keyPair.getPrivKey(); | |||||
assertEquals(PUBLIC.CODE, pubKey.getKeyType().CODE); | |||||
assertTrue(pubKey.getRawKeyBytes().length > 32); | |||||
assertEquals(PRIVATE.CODE, privKey.getKeyType().CODE); | |||||
assertTrue(privKey.getRawKeyBytes().length > 65 + 32); | |||||
assertEquals(algorithm.code(), pubKey.getAlgorithm()); | |||||
assertEquals(algorithm.code(), privKey.getAlgorithm()); | |||||
byte[] algoBytes = CryptoAlgorithm.getCodeBytes(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() { | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SM3WITHSM2"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
AsymmetricKeypair keyPair = signatureFunction.generateKeypair(); | |||||
PubKey pubKey = keyPair.getPubKey(); | |||||
PrivKey privKey = keyPair.getPrivKey(); | |||||
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()); | |||||
} | |||||
@Test | |||||
public void signTest() { | |||||
byte[] data = new byte[1024]; | |||||
Random random = new Random(); | |||||
random.nextBytes(data); | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SM3WITHSM2"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
AsymmetricKeypair keyPair = signatureFunction.generateKeypair(); | |||||
PrivKey privKey = keyPair.getPrivKey(); | |||||
SignatureDigest signatureDigest = signatureFunction.sign(privKey, data); | |||||
byte[] signatureBytes = signatureDigest.toBytes(); | |||||
assertTrue(signatureBytes.length > 2 + 64); | |||||
assertEquals(algorithm.code(), signatureDigest.getAlgorithm()); | |||||
assertEquals(PKIAlgorithm.SM3WITHSM2.code(), signatureDigest.getAlgorithm()); | |||||
assertEquals((short) (SIGNATURE_ALGORITHM | ASYMMETRIC_KEY | ((byte) 33 & 0x00FF)), | |||||
signatureDigest.getAlgorithm()); | |||||
byte[] algoBytes = BytesUtils.toBytes(signatureDigest.getAlgorithm()); | |||||
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); | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SM3WITHSM2"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
AsymmetricKeypair keyPair = signatureFunction.generateKeypair(); | |||||
PubKey pubKey = keyPair.getPubKey(); | |||||
PrivKey privKey = keyPair.getPrivKey(); | |||||
SignatureDigest signatureDigest = signatureFunction.sign(privKey, data); | |||||
System.out.println(signatureDigest.getRawDigest().length); | |||||
assertTrue(signatureFunction.verify(signatureDigest, pubKey, data)); | |||||
} | |||||
@Test | |||||
public void supportPrivKeyTest() { | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SM3WITHSM2"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
AsymmetricKeypair keyPair = signatureFunction.generateKeypair(); | |||||
PrivKey privKey = keyPair.getPrivKey(); | |||||
byte[] privKeyBytes = privKey.toBytes(); | |||||
assertTrue(signatureFunction.supportPrivKey(privKeyBytes)); | |||||
} | |||||
@Test | |||||
public void resolvePrivKeyTest() { | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SM3WITHSM2"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
AsymmetricKeypair keyPair = signatureFunction.generateKeypair(); | |||||
PrivKey privKey = keyPair.getPrivKey(); | |||||
byte[] privKeyBytes = privKey.toBytes(); | |||||
PrivKey resolvedPrivKey = signatureFunction.resolvePrivKey(privKeyBytes); | |||||
assertEquals(PRIVATE.CODE, resolvedPrivKey.getKeyType().CODE); | |||||
assertEquals(PKIAlgorithm.SM3WITHSM2.code(), resolvedPrivKey.getAlgorithm()); | |||||
assertEquals((short) (SIGNATURE_ALGORITHM | ASYMMETRIC_KEY | ((byte) 33 & 0x00FF)), | |||||
resolvedPrivKey.getAlgorithm()); | |||||
assertArrayEquals(privKeyBytes, resolvedPrivKey.toBytes()); | |||||
} | |||||
@Test | |||||
public void supportPubKeyTest() { | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SM3WITHSM2"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
AsymmetricKeypair keyPair = signatureFunction.generateKeypair(); | |||||
PubKey pubKey = keyPair.getPubKey(); | |||||
byte[] pubKeyBytes = pubKey.toBytes(); | |||||
assertTrue(signatureFunction.supportPubKey(pubKeyBytes)); | |||||
} | |||||
@Test | |||||
public void resolvePubKeyTest() { | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SM3WITHSM2"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
AsymmetricKeypair keyPair = signatureFunction.generateKeypair(); | |||||
PubKey pubKey = keyPair.getPubKey(); | |||||
byte[] pubKeyBytes = pubKey.toBytes(); | |||||
PubKey resolvedPubKey = signatureFunction.resolvePubKey(pubKeyBytes); | |||||
assertEquals(PUBLIC.CODE, resolvedPubKey.getKeyType().CODE); | |||||
assertEquals(PKIAlgorithm.SM3WITHSM2.code(), resolvedPubKey.getAlgorithm()); | |||||
assertEquals((short) (SIGNATURE_ALGORITHM | ASYMMETRIC_KEY | ((byte) 33 & 0x00FF)), | |||||
resolvedPubKey.getAlgorithm()); | |||||
assertArrayEquals(pubKeyBytes, resolvedPubKey.toBytes()); | |||||
} | |||||
@Test | |||||
public void supportDigestTest() { | |||||
byte[] data = new byte[1024]; | |||||
Random random = new Random(); | |||||
random.nextBytes(data); | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SM3WITHSM2"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
AsymmetricKeypair keyPair = signatureFunction.generateKeypair(); | |||||
PrivKey privKey = keyPair.getPrivKey(); | |||||
SignatureDigest signatureDigest = signatureFunction.sign(privKey, data); | |||||
byte[] signatureDigestBytes = signatureDigest.toBytes(); | |||||
assertTrue(signatureFunction.supportDigest(signatureDigestBytes)); | |||||
} | |||||
@Test | |||||
public void resolveDigestTest() { | |||||
byte[] data = new byte[1024]; | |||||
Random random = new Random(); | |||||
random.nextBytes(data); | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SM3WITHSM2"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
AsymmetricKeypair keyPair = signatureFunction.generateKeypair(); | |||||
PrivKey privKey = keyPair.getPrivKey(); | |||||
SignatureDigest signatureDigest = signatureFunction.sign(privKey, data); | |||||
byte[] signatureDigestBytes = signatureDigest.toBytes(); | |||||
SignatureDigest resolvedSignatureDigest = signatureFunction.resolveDigest(signatureDigestBytes); | |||||
assertTrue(resolvedSignatureDigest.getRawDigest().length > 64); | |||||
assertEquals(PKIAlgorithm.SM3WITHSM2.code(), resolvedSignatureDigest.getAlgorithm()); | |||||
assertEquals((short) (SIGNATURE_ALGORITHM | ASYMMETRIC_KEY | ((byte) 33 & 0x00FF)), | |||||
resolvedSignatureDigest.getAlgorithm()); | |||||
assertArrayEquals(signatureDigestBytes, resolvedSignatureDigest.toBytes()); | |||||
} | |||||
} |
@@ -1,6 +1,5 @@ | |||||
package com.jd.blockchain.crypto.utils; | package com.jd.blockchain.crypto.utils; | ||||
import com.jd.blockchain.crypto.utils.CSRBuilder; | |||||
import org.bouncycastle.asn1.ASN1Encoding; | import org.bouncycastle.asn1.ASN1Encoding; | ||||
import org.bouncycastle.asn1.DERSet; | import org.bouncycastle.asn1.DERSet; | ||||
import org.bouncycastle.asn1.pkcs.CertificationRequestInfo; | import org.bouncycastle.asn1.pkcs.CertificationRequestInfo; | ||||
@@ -112,4 +111,286 @@ public class CSRBuilderTest { | |||||
} | } | ||||
assertTrue(isValid); | assertTrue(isValid); | ||||
} | } | ||||
@Test | |||||
public void SHA1withRSA2048CSRTest(){ | |||||
String countryName = "CN"; | |||||
String stateName = "Beijing"; | |||||
String cityName = "Beijing"; | |||||
String organizationName = "JD.com"; | |||||
String departmentName = "Blockchain Department"; | |||||
String domainName = "ledger.jd.com"; | |||||
String emailName = "zhanglin33@jd.com"; | |||||
CSRBuilder builder = new CSRBuilder(); | |||||
builder.init("SHA1withRSA",2048); | |||||
String csr = builder.buildRequest(countryName,stateName,cityName, | |||||
organizationName,departmentName,domainName, | |||||
emailName); | |||||
PublicKey pubKey = builder.getPubKey(); | |||||
PrivateKey privKey = builder.getPrivKey(); | |||||
byte[] crsBytes = Base64.decode(csr); | |||||
PKCS10CertificationRequest request = null; | |||||
try { | |||||
request = new PKCS10CertificationRequest(crsBytes); | |||||
} catch (IOException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
assertNotNull(request); | |||||
assertEquals("1.2.840.113549.1.1.5",request.getSignatureAlgorithm().getAlgorithm().getId()); | |||||
byte[] pubKeyBytes = new byte[0]; | |||||
try { | |||||
pubKeyBytes = request.getSubjectPublicKeyInfo().getEncoded(); | |||||
} catch (IOException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
assertArrayEquals(pubKeyBytes,pubKey.getEncoded()); | |||||
RDN[] rdns = request.getSubject().getRDNs(); | |||||
assertEquals(BCStyle.C, rdns[0].getFirst().getType().toASN1Primitive()); | |||||
assertEquals(BCStyle.ST, rdns[1].getFirst().getType().toASN1Primitive()); | |||||
assertEquals(BCStyle.L, rdns[2].getFirst().getType().toASN1Primitive()); | |||||
assertEquals(BCStyle.O, rdns[3].getFirst().getType().toASN1Primitive()); | |||||
assertEquals(BCStyle.OU, rdns[4].getFirst().getType().toASN1Primitive()); | |||||
assertEquals(BCStyle.CN, rdns[5].getFirst().getType().toASN1Primitive()); | |||||
assertEquals(BCStyle.E, rdns[6].getFirst().getType().toASN1Primitive()); | |||||
assertEquals("CN", rdns[0].getFirst().getValue().toASN1Primitive().toString()); | |||||
assertEquals("Beijing", rdns[1].getFirst().getValue().toASN1Primitive().toString()); | |||||
assertEquals("Beijing", rdns[2].getFirst().getValue().toASN1Primitive().toString()); | |||||
assertEquals("JD.com", rdns[3].getFirst().getValue().toASN1Primitive().toString()); | |||||
assertEquals("Blockchain Department", rdns[4].getFirst().getValue().toASN1Primitive().toString()); | |||||
assertEquals("ledger.jd.com", rdns[5].getFirst().getValue().toASN1Primitive().toString()); | |||||
assertEquals("zhanglin33@jd.com", rdns[6].getFirst().getValue().toASN1Primitive().toString()); | |||||
byte[] signature = request.getSignature(); | |||||
CertificationRequestInfo requestInfo = new CertificationRequestInfo(request.getSubject(),request.getSubjectPublicKeyInfo(),new DERSet()); | |||||
byte[] message = new byte[0]; | |||||
try { | |||||
message = requestInfo.getEncoded(ASN1Encoding.DER); | |||||
} catch (IOException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
Signature signer; | |||||
byte[] result = new byte[0]; | |||||
try { | |||||
signer = Signature.getInstance("SHA1withRSA"); | |||||
signer.initSign(privKey); | |||||
signer.update(message); | |||||
result = signer.sign(); | |||||
} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
assertArrayEquals(result,signature); | |||||
Signature verifier; | |||||
boolean isValid = false; | |||||
try { | |||||
verifier = Signature.getInstance("SHA1withRSA"); | |||||
verifier.initVerify(pubKey); | |||||
verifier.update(message); | |||||
isValid = verifier.verify(signature); | |||||
} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
assertTrue(isValid); | |||||
} | |||||
@Test | |||||
public void SHA1withRSA4096CSRTest(){ | |||||
String countryName = "CN"; | |||||
String stateName = "Beijing"; | |||||
String cityName = "Beijing"; | |||||
String organizationName = "JD.com"; | |||||
String departmentName = "Blockchain Department"; | |||||
String domainName = "ledger.jd.com"; | |||||
String emailName = "zhanglin33@jd.com"; | |||||
CSRBuilder builder = new CSRBuilder(); | |||||
builder.init("SHA1withRSA",4096); | |||||
String csr = builder.buildRequest(countryName,stateName,cityName, | |||||
organizationName,departmentName,domainName, | |||||
emailName); | |||||
PublicKey pubKey = builder.getPubKey(); | |||||
PrivateKey privKey = builder.getPrivKey(); | |||||
byte[] crsBytes = Base64.decode(csr); | |||||
PKCS10CertificationRequest request = null; | |||||
try { | |||||
request = new PKCS10CertificationRequest(crsBytes); | |||||
} catch (IOException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
assertNotNull(request); | |||||
assertEquals("1.2.840.113549.1.1.5",request.getSignatureAlgorithm().getAlgorithm().getId()); | |||||
byte[] pubKeyBytes = new byte[0]; | |||||
try { | |||||
pubKeyBytes = request.getSubjectPublicKeyInfo().getEncoded(); | |||||
} catch (IOException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
assertArrayEquals(pubKeyBytes,pubKey.getEncoded()); | |||||
RDN[] rdns = request.getSubject().getRDNs(); | |||||
assertEquals(BCStyle.C, rdns[0].getFirst().getType().toASN1Primitive()); | |||||
assertEquals(BCStyle.ST, rdns[1].getFirst().getType().toASN1Primitive()); | |||||
assertEquals(BCStyle.L, rdns[2].getFirst().getType().toASN1Primitive()); | |||||
assertEquals(BCStyle.O, rdns[3].getFirst().getType().toASN1Primitive()); | |||||
assertEquals(BCStyle.OU, rdns[4].getFirst().getType().toASN1Primitive()); | |||||
assertEquals(BCStyle.CN, rdns[5].getFirst().getType().toASN1Primitive()); | |||||
assertEquals(BCStyle.E, rdns[6].getFirst().getType().toASN1Primitive()); | |||||
assertEquals("CN", rdns[0].getFirst().getValue().toASN1Primitive().toString()); | |||||
assertEquals("Beijing", rdns[1].getFirst().getValue().toASN1Primitive().toString()); | |||||
assertEquals("Beijing", rdns[2].getFirst().getValue().toASN1Primitive().toString()); | |||||
assertEquals("JD.com", rdns[3].getFirst().getValue().toASN1Primitive().toString()); | |||||
assertEquals("Blockchain Department", rdns[4].getFirst().getValue().toASN1Primitive().toString()); | |||||
assertEquals("ledger.jd.com", rdns[5].getFirst().getValue().toASN1Primitive().toString()); | |||||
assertEquals("zhanglin33@jd.com", rdns[6].getFirst().getValue().toASN1Primitive().toString()); | |||||
byte[] signature = request.getSignature(); | |||||
CertificationRequestInfo requestInfo = new CertificationRequestInfo(request.getSubject(),request.getSubjectPublicKeyInfo(),new DERSet()); | |||||
byte[] message = new byte[0]; | |||||
try { | |||||
message = requestInfo.getEncoded(ASN1Encoding.DER); | |||||
} catch (IOException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
Signature signer; | |||||
byte[] result = new byte[0]; | |||||
try { | |||||
signer = Signature.getInstance("SHA1withRSA"); | |||||
signer.initSign(privKey); | |||||
signer.update(message); | |||||
result = signer.sign(); | |||||
} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
assertArrayEquals(result,signature); | |||||
Signature verifier; | |||||
boolean isValid = false; | |||||
try { | |||||
verifier = Signature.getInstance("SHA1withRSA"); | |||||
verifier.initVerify(pubKey); | |||||
verifier.update(message); | |||||
isValid = verifier.verify(signature); | |||||
} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
assertTrue(isValid); | |||||
} | |||||
@Test | |||||
public void SM3withSM2CSRTest(){ | |||||
String countryName = "CN"; | |||||
String stateName = "Beijing"; | |||||
String cityName = "Beijing"; | |||||
String organizationName = "JD.com"; | |||||
String departmentName = "Blockchain Department"; | |||||
String domainName = "ledger.jd.com"; | |||||
String emailName = "zhanglin33@jd.com"; | |||||
CSRBuilder builder = new CSRBuilder(); | |||||
builder.init("SM3withSM2",256); | |||||
String csr = builder.buildRequest(countryName,stateName,cityName, | |||||
organizationName,departmentName,domainName, | |||||
emailName); | |||||
System.out.println(csr); | |||||
PublicKey pubKey = builder.getPubKey(); | |||||
PrivateKey privKey = builder.getPrivKey(); | |||||
byte[] crsBytes = Base64.decode(csr); | |||||
PKCS10CertificationRequest request = null; | |||||
try { | |||||
request = new PKCS10CertificationRequest(crsBytes); | |||||
} catch (IOException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
assertNotNull(request); | |||||
assertEquals("1.2.156.10197.1.501",request.getSignatureAlgorithm().getAlgorithm().getId()); | |||||
byte[] pubKeyBytes = new byte[0]; | |||||
try { | |||||
pubKeyBytes = request.getSubjectPublicKeyInfo().getEncoded(); | |||||
} catch (IOException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
assertArrayEquals(pubKeyBytes,pubKey.getEncoded()); | |||||
RDN[] rdns = request.getSubject().getRDNs(); | |||||
assertEquals(BCStyle.C, rdns[0].getFirst().getType().toASN1Primitive()); | |||||
assertEquals(BCStyle.ST, rdns[1].getFirst().getType().toASN1Primitive()); | |||||
assertEquals(BCStyle.L, rdns[2].getFirst().getType().toASN1Primitive()); | |||||
assertEquals(BCStyle.O, rdns[3].getFirst().getType().toASN1Primitive()); | |||||
assertEquals(BCStyle.OU, rdns[4].getFirst().getType().toASN1Primitive()); | |||||
assertEquals(BCStyle.CN, rdns[5].getFirst().getType().toASN1Primitive()); | |||||
assertEquals(BCStyle.E, rdns[6].getFirst().getType().toASN1Primitive()); | |||||
assertEquals("CN", rdns[0].getFirst().getValue().toASN1Primitive().toString()); | |||||
assertEquals("Beijing", rdns[1].getFirst().getValue().toASN1Primitive().toString()); | |||||
assertEquals("Beijing", rdns[2].getFirst().getValue().toASN1Primitive().toString()); | |||||
assertEquals("JD.com", rdns[3].getFirst().getValue().toASN1Primitive().toString()); | |||||
assertEquals("Blockchain Department", rdns[4].getFirst().getValue().toASN1Primitive().toString()); | |||||
assertEquals("ledger.jd.com", rdns[5].getFirst().getValue().toASN1Primitive().toString()); | |||||
assertEquals("zhanglin33@jd.com", rdns[6].getFirst().getValue().toASN1Primitive().toString()); | |||||
byte[] signature = request.getSignature(); | |||||
CertificationRequestInfo requestInfo = new CertificationRequestInfo(request.getSubject(),request.getSubjectPublicKeyInfo(),new DERSet()); | |||||
byte[] message = new byte[0]; | |||||
try { | |||||
message = requestInfo.getEncoded(ASN1Encoding.DER); | |||||
} catch (IOException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
Signature signer; | |||||
byte[] result = new byte[0]; | |||||
try { | |||||
signer = Signature.getInstance("SM3withSM2"); | |||||
signer.initSign(privKey); | |||||
signer.update(message); | |||||
result = signer.sign(); | |||||
} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
Signature verifier; | |||||
boolean isValid = false; | |||||
try { | |||||
verifier = Signature.getInstance("SM3withSM2"); | |||||
verifier.initVerify(pubKey); | |||||
verifier.update(message); | |||||
isValid = verifier.verify(signature); | |||||
} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
assertTrue(isValid); | |||||
try { | |||||
verifier = Signature.getInstance("SM3withSM2"); | |||||
verifier.initVerify(pubKey); | |||||
verifier.update(message); | |||||
isValid = verifier.verify(result); | |||||
} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
assertTrue(isValid); | |||||
} | |||||
} | } |
@@ -1,6 +1,6 @@ | |||||
package com.jd.blockchain.crypto.utils; | package com.jd.blockchain.crypto.utils; | ||||
import com.jd.blockchain.crypto.utils.CertParser; | |||||
import org.bouncycastle.util.encoders.Hex; | |||||
import org.junit.Test; | import org.junit.Test; | ||||
import static org.junit.Assert.assertEquals; | import static org.junit.Assert.assertEquals; | ||||
@@ -14,7 +14,7 @@ import static org.junit.Assert.assertEquals; | |||||
public class CertParserTest { | public class CertParserTest { | ||||
@Test | @Test | ||||
public void parseTest() { | |||||
public void parseSHA1WITHRSA2048Test() { | |||||
CertParser parser = new CertParser(); | CertParser parser = new CertParser(); | ||||
String issuerCert = | String issuerCert = | ||||
"-----BEGIN CERTIFICATE-----\n" + | "-----BEGIN CERTIFICATE-----\n" + | ||||
@@ -46,4 +46,102 @@ public class CertParserTest { | |||||
parser.parse(userCert, issuerCert); | parser.parse(userCert, issuerCert); | ||||
assertEquals("SHA1WITHRSA",parser.getSigAlgName()); | assertEquals("SHA1WITHRSA",parser.getSigAlgName()); | ||||
} | } | ||||
@Test | |||||
public void parseSHA1WITHRSA4096Test() { | |||||
CertParser parser = new CertParser(); | |||||
String issuerCert = | |||||
"-----BEGIN CERTIFICATE-----\n" + | |||||
"MIIDzzCCAregAwIBAgIKUalCR1Mt5ZSK8jANBgkqhkiG9w0BAQUFADBZMQswCQYD\n" + | |||||
"VQQGEwJDTjEwMC4GA1UEChMnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24g\n" + | |||||
"QXV0aG9yaXR5MRgwFgYDVQQDEw9DRkNBIFRFU1QgQ1MgQ0EwHhcNMTIwODI5MDU1\n" + | |||||
"NDM2WhcNMzIwODI0MDU1NDM2WjBZMQswCQYDVQQGEwJDTjEwMC4GA1UEChMnQ2hp\n" + | |||||
"bmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRgwFgYDVQQDEw9D\n" + | |||||
"RkNBIFRFU1QgT0NBMTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC8\n" + | |||||
"jn0n8Fp6hcRdACdn1+Y6GAkC6KGgNdKyHPrmsdmhCjnd/i4qUFwnG8cp3D4lFw1G\n" + | |||||
"jmjSO5yVYbik/NbS6lbNpRgTK3fDfMFvLJpRIC+IFhG9SdAC2hwjsH9qTpL9cK2M\n" + | |||||
"bSdrC6pBdDgnbzaM9AGBF4Y6vXhj5nah4ZMsBvDp19LzXjlGuTPLuAgv9ZlWknsd\n" + | |||||
"RN70PIAmvomd10uqX4GIJ4Jq/FdKXOLZ2DNK/NhRyN6Yq71L3ham6tutXeZow5t5\n" + | |||||
"0254AnUlo1u6SeH9F8itER653o/oMLFwp+63qXAcqrHUlOQPX+JI8fkumSqZ4F2F\n" + | |||||
"t/HfVMnqdtFNCnh5+eIBAgMBAAGjgZgwgZUwHwYDVR0jBBgwFoAUdN7FjQp9EBqq\n" + | |||||
"aYNbTSHOhpvMcTgwDAYDVR0TBAUwAwEB/zA4BgNVHR8EMTAvMC2gK6AphidodHRw\n" + | |||||
"Oi8vMjEwLjc0LjQyLjMvdGVzdHJjYS9SU0EvY3JsMS5jcmwwCwYDVR0PBAQDAgEG\n" + | |||||
"MB0GA1UdDgQWBBT8C7xEmg4xoYOpgYcnHgVCxr9W+DANBgkqhkiG9w0BAQUFAAOC\n" + | |||||
"AQEAb7W0K9fZPA+JPw6lRiMDaUJ0oh052yEXreMBfoPulxkBj439qombDiFggRLc\n" + | |||||
"3g8wIEKzMOzOKXTWtnzYwN3y/JQSuJb/M1QqOEEM2PZwCxI4AkBuH6jg03RjlkHg\n" + | |||||
"/kTtuIFp9ItBCC2/KkKlp0ENfn4XgVg2KtAjZ7lpyVU0LPnhEqqUVY/xthjlCSa7\n" + | |||||
"/XHNStRxsfCTIBUWJ8n2FZyQhfV/UkMNHDBIiJR0v6C4Ai0/290WvbPEIAq+03Si\n" + | |||||
"fsHzBeA0C8lP5VzfAr6wWePaZMCpStpLaoXNcAqReKxQllElOqAhRxC5VKH+rnIQ\n" + | |||||
"OMRZvB7FRyE9IfwKApngcZbA5g==\n" + | |||||
"-----END CERTIFICATE-----"; | |||||
String userCert = "MIIFRjCCBC6gAwIBAgIFICdWiDMwDQYJKoZIhvcNAQEFBQAwWTELMAkGA1UEBhMCQ04xMDAuBgNVBAoTJ0NoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEYMBYGA1UEAxMPQ0ZDQSBURVNUIE9DQTExMB4XDTE5MDUxNjA3MDcyMloXDTIxMDUxNjA3MDcyMloweDELMAkGA1UEBhMCQ04xGDAWBgNVBAoTD0NGQ0EgVEVTVCBPQ0ExMTERMA8GA1UECxMITG9jYWwgUkExFTATBgNVBAsTDEluZGl2aWR1YWwtMTElMCMGA1UEAxQcMDUxQHpoYW5nbGluIUBaMTg2MTIyMjkyOTVAMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL0rTOxd8rsjPtFJ0aGVh9bZPy5Xo0SADaP7BbJsG4+ykLQMZHg9hTf/6fv1OsD2HEKFoMpIkW2gwCJW2nvicHcVql/shCoktc6ZBW6Dr/DxOgbO9tpoGxZ50xdI4Q0NsrxqtbCldW4ozPHdjgRJ83i1KSFh7evNrVByN/mB+jchrVGLWyJ1uIRgUUgpRZmZPoOHaizVJqrqWJGGk6xbDLR2gUQ1hTzetQaz1OeKtelHDk9FY08XSmNGssSMpuSjrxn78S888VW5WIxyo4cwrXSXFk3J7LNTy70Oga16HZjJD/vLTM6a4riPa8+uivPinKxK38/++nlBPNwhx6n46uYkd9Zvw+SJiJgpnuPJLtMZpKpJx7V1BDVEydKPUthilTdsmJtkBFSlFw0G1aKfuciBGzzJ3SKngJF/JqJAWIonVAFBGb6Gokp1Sw+T4KqXrdbjxYxiyyjZ++8O1vydgFAkx/NjsuwJnpKETiRKFJmY7YawcUvC4ixF7XQc0luFWRDYcbxOppir+ieMqhGXyaFhLUuB4WXv+rFxfa3NmkBW8q5TPzt/PwWcXpITsYTZYla/E/grB+OeZLYgjigT5YlgytPHG6Gt1ySCCd8WXFWpkBbQfXzqcvtU27RCcAUgfXk5NLb7NZCQg7heGjgzOdYJCPsa1d3m7l04+VIKGCZdAgMBAAGjgfUwgfIwHwYDVR0jBBgwFoAU/Au8RJoOMaGDqYGHJx4FQsa/VvgwSAYDVR0gBEEwPzA9BghggRyG7yoBAjAxMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmNmY2EuY29tLmNuL3VzL3VzLTE1Lmh0bTA6BgNVHR8EMzAxMC+gLaArhilodHRwOi8vMjEwLjc0LjQyLjMvT0NBMTEvUlNBL2NybDI1NzE3LmNybDALBgNVHQ8EBAMCA+gwHQYDVR0OBBYEFMjh6AzDCuNkD+pqQfiS6bqPGpI4MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDANBgkqhkiG9w0BAQUFAAOCAQEApZaLXS6/6FudPA3l2xom5U7nJUOpQ1E6DO/ic9dFGtLE0WgyAqB3JVPvXEntppX55x/dAV7rvvz9NaEdiAe8DAj7qyoPDvC8ZWQK8U4n9l8N78QwALOURxzQNs+CBatJQzbu2w1RKVwkfE6xEIVnu+wjiAtymfwdLHMagHxDIC/eOPbTnbbtITJk2ukFfoc0WJ6Awg5lW+x7nGokEn/XAjKyRHCpkRUFGQm4ww41zlrqCqQqnVGVABJtjbdtFf7nh33QHl0fkj19nfMox9eGuntPyM0bNA0XqPMA+FWSCqeDT6uLbyaOKWxlhv53U/NCJl76U3tssMEWsm9amEDDQg=="; | |||||
parser.parse(userCert, issuerCert); | |||||
assertEquals("SHA1WITHRSA",parser.getSigAlgName()); | |||||
} | |||||
@Test | |||||
public void parseSM3WITHSM2Test() { | |||||
CertParser parser = new CertParser(); | |||||
String issuerCert = | |||||
"-----BEGIN CERTIFICATE-----\n" + | |||||
"MIICTzCCAfOgAwIBAgIKJFSZ4SRVDndYUTAMBggqgRzPVQGDdQUAMF0xCzAJBgNV\n" + | |||||
"BAYTAkNOMTAwLgYDVQQKDCdDaGluYSBGaW5hbmNpYWwgQ2VydGlmaWNhdGlvbiBB\n" + | |||||
"dXRob3JpdHkxHDAaBgNVBAMME0NGQ0EgVEVTVCBDUyBTTTIgQ0EwHhcNMTIwODI5\n" + | |||||
"MDU0ODQ3WhcNMzIwODI0MDU0ODQ3WjBdMQswCQYDVQQGEwJDTjEwMC4GA1UECgwn\n" + | |||||
"Q2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRwwGgYDVQQD\n" + | |||||
"DBNDRkNBIFRFU1QgU00yIE9DQTExMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE\n" + | |||||
"L1mx4wriQUojGsIkNL14kslv9nwiqsiVpELOZauzghrbccNlPYKNYKZOCvXwIIqU\n" + | |||||
"9QY02d4weqKqo/JMcNsKEaOBmDCBlTAfBgNVHSMEGDAWgBS12JBvXPDYM9JjvX6y\n" + | |||||
"w43GTxJ6YTAMBgNVHRMEBTADAQH/MDgGA1UdHwQxMC8wLaAroCmGJ2h0dHA6Ly8y\n" + | |||||
"MTAuNzQuNDIuMy90ZXN0cmNhL1NNMi9jcmwxLmNybDALBgNVHQ8EBAMCAQYwHQYD\n" + | |||||
"VR0OBBYEFL6mfk09fI+gVebBLwkuLCBDs0J/MAwGCCqBHM9VAYN1BQADSAAwRQIh\n" + | |||||
"AKuk7s3eYCZDck5NWU0eNQmLhBN/1zmKs517qFrDrkJWAiAP4cVfLtdza/OkwU9P\n" + | |||||
"PrIDl+E4aL3FypntFXHG3T+Keg==\n" + | |||||
"-----END CERTIFICATE-----"; | |||||
String userCert = "MIICwDCCAmWgAwIBAgIFICdWkWgwDAYIKoEcz1UBg3UFADBdMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRwwGgYDVQQDDBNDRkNBIFRFU1QgU00yIE9DQTExMB4XDTE5MDUxNjA4MTA1MVoXDTIxMDUxNjA4MTA1MVoweDELMAkGA1UEBhMCQ04xGDAWBgNVBAoMD0NGQ0EgVEVTVCBPQ0ExMTERMA8GA1UECwwITG9jYWwgUkExFTATBgNVBAsMDEluZGl2aWR1YWwtMTElMCMGA1UEAwwcMDUxQHpoYW5nbGluIUBaMTg2MTIyMjkyOTVAMzBZMBMGByqGSM49AgEGCCqBHM9VAYItA0IABPvNXpdZ4/4g+wx5qKS94CPkMqpEDhlnXYYW7ZzsbNI4d28sVBz5Ji6dTT1Zx627Kvw4tdUaUt7BVMvZsu3BFlyjgfQwgfEwHwYDVR0jBBgwFoAUvqZ+TT18j6BV5sEvCS4sIEOzQn8wSAYDVR0gBEEwPzA9BghggRyG7yoBAjAxMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmNmY2EuY29tLmNuL3VzL3VzLTE1Lmh0bTA5BgNVHR8EMjAwMC6gLKAqhihodHRwOi8vMjEwLjc0LjQyLjMvT0NBMTEvU00yL2NybDIxMDkuY3JsMAsGA1UdDwQEAwID6DAdBgNVHQ4EFgQUxR5C/VjASus5zrAAFS4ulMpRjKgwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMAwGCCqBHM9VAYN1BQADRwAwRAIgVBzVi/fgkknr+2BH2wXeGMXC+Pa6p7rbldUsYMOYoyUCIAmQ4KEk2U1xJZSBpOPy5jN9kmRb+0YH6x04O/2tqCgq"; | |||||
parser.parse(userCert, issuerCert); | |||||
assertEquals("SM3WITHSM2",parser.getSigAlgName()); | |||||
} | |||||
@Test | |||||
public void authenticateIssuerByCATest() { | |||||
CertParser parser = new CertParser(); | |||||
String CACert = | |||||
"-----BEGIN CERTIFICATE-----\n" + | |||||
"MIICFDCCAbegAwIBAgIKPYozwkCO86Nd9TAMBggqgRzPVQGDdQUAMF0xCzAJBgNV\n" + | |||||
"BAYTAkNOMTAwLgYDVQQKDCdDaGluYSBGaW5hbmNpYWwgQ2VydGlmaWNhdGlvbiBB\n" + | |||||
"dXRob3JpdHkxHDAaBgNVBAMME0NGQ0EgVEVTVCBDUyBTTTIgQ0EwHhcNMTIwODI5\n" + | |||||
"MDMyOTQ2WhcNMzIwODI5MDMyOTQ2WjBdMQswCQYDVQQGEwJDTjEwMC4GA1UECgwn\n" + | |||||
"Q2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRwwGgYDVQQD\n" + | |||||
"DBNDRkNBIFRFU1QgQ1MgU00yIENBMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE\n" + | |||||
"tTjB3O4JueYFDDOtxH678HBZbEmrsgd3BDIdGf0BekyA26n9S0/pKPnjBh/zLouS\n" + | |||||
"8+GB5EEnjbn4An24yo1Gv6NdMFswHwYDVR0jBBgwFoAUtdiQb1zw2DPSY71+ssON\n" + | |||||
"xk8SemEwDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFLXYkG9c\n" + | |||||
"8Ngz0mO9frLDjcZPEnphMAwGCCqBHM9VAYN1BQADSQAwRgIhAKwuuqoBS1bwDowW\n" + | |||||
"a4IU//UsvudswJYSlltqrd/PQ9q+AiEAyTUAjFdaGI+8yPdr3A93UiA38wtGPf9e\n" + | |||||
"6B6O/6abyWE=\n" + | |||||
"-----END CERTIFICATE-----"; | |||||
String issuerCert = "-----BEGIN CERTIFICATE-----\n" + | |||||
"MIICTzCCAfOgAwIBAgIKJFSZ4SRVDndYUTAMBggqgRzPVQGDdQUAMF0xCzAJBgNV\n" + | |||||
"BAYTAkNOMTAwLgYDVQQKDCdDaGluYSBGaW5hbmNpYWwgQ2VydGlmaWNhdGlvbiBB\n" + | |||||
"dXRob3JpdHkxHDAaBgNVBAMME0NGQ0EgVEVTVCBDUyBTTTIgQ0EwHhcNMTIwODI5\n" + | |||||
"MDU0ODQ3WhcNMzIwODI0MDU0ODQ3WjBdMQswCQYDVQQGEwJDTjEwMC4GA1UECgwn\n" + | |||||
"Q2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRwwGgYDVQQD\n" + | |||||
"DBNDRkNBIFRFU1QgU00yIE9DQTExMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE\n" + | |||||
"L1mx4wriQUojGsIkNL14kslv9nwiqsiVpELOZauzghrbccNlPYKNYKZOCvXwIIqU\n" + | |||||
"9QY02d4weqKqo/JMcNsKEaOBmDCBlTAfBgNVHSMEGDAWgBS12JBvXPDYM9JjvX6y\n" + | |||||
"w43GTxJ6YTAMBgNVHRMEBTADAQH/MDgGA1UdHwQxMC8wLaAroCmGJ2h0dHA6Ly8y\n" + | |||||
"MTAuNzQuNDIuMy90ZXN0cmNhL1NNMi9jcmwxLmNybDALBgNVHQ8EBAMCAQYwHQYD\n" + | |||||
"VR0OBBYEFL6mfk09fI+gVebBLwkuLCBDs0J/MAwGCCqBHM9VAYN1BQADSAAwRQIh\n" + | |||||
"AKuk7s3eYCZDck5NWU0eNQmLhBN/1zmKs517qFrDrkJWAiAP4cVfLtdza/OkwU9P\n" + | |||||
"PrIDl+E4aL3FypntFXHG3T+Keg==\n" + | |||||
"-----END CERTIFICATE-----"; | |||||
parser.parse(issuerCert, CACert); | |||||
assertEquals("SM3WITHSM2",parser.getSigAlgName()); | |||||
} | |||||
} | } |