@@ -320,21 +320,15 @@ public class RSAUtils { | |||
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(pubKeyBytes); | |||
KeyFactory keyFactory; | |||
try { | |||
keyFactory = KeyFactory.getInstance("RSA"); | |||
} catch (NoSuchAlgorithmException e) { | |||
throw new com.jd.blockchain.crypto.CryptoException(e.getMessage(), e); | |||
} | |||
RSAPublicKey publicKey; | |||
try { | |||
keyFactory = KeyFactory.getInstance("RSA"); | |||
publicKey = (RSAPublicKey) keyFactory.generatePublic(keySpec); | |||
} catch (InvalidKeySpecException e) { | |||
} catch (InvalidKeySpecException | NoSuchAlgorithmException e) { | |||
throw new com.jd.blockchain.crypto.CryptoException(e.getMessage(), e); | |||
} | |||
assert publicKey != null; | |||
BigInteger exponent = publicKey.getPublicExponent(); | |||
BigInteger modulus = publicKey.getModulus(); | |||
@@ -430,7 +424,7 @@ public class RSAUtils { | |||
BigInteger qInv = privKey.getQInv(); | |||
byte[] modulusBytes = bigInteger2Bytes(modulus,MODULUS_LENGTH); | |||
byte[] pubExpBytes = pubExp.toByteArray(); | |||
byte[] pubExpBytes = pubExp.toByteArray(); | |||
byte[] privExpBytes = bigInteger2Bytes(privExp,PRIVEXP_LENGTH); | |||
byte[] pBytes = bigInteger2Bytes(p,P_LENGTH); | |||
byte[] qBytes = bigInteger2Bytes(q,Q_LENGTH); | |||
@@ -463,21 +457,15 @@ public class RSAUtils { | |||
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privKeyBytes); | |||
KeyFactory keyFactory; | |||
try { | |||
keyFactory = KeyFactory.getInstance("RSA"); | |||
} catch (NoSuchAlgorithmException e) { | |||
throw new com.jd.blockchain.crypto.CryptoException(e.getMessage(), e); | |||
} | |||
RSAPrivateCrtKey privateKey; | |||
try { | |||
keyFactory = KeyFactory.getInstance("RSA"); | |||
privateKey = (RSAPrivateCrtKey) keyFactory.generatePrivate(keySpec); | |||
} catch (InvalidKeySpecException e) { | |||
} catch (InvalidKeySpecException | NoSuchAlgorithmException e) { | |||
throw new com.jd.blockchain.crypto.CryptoException(e.getMessage(), e); | |||
} | |||
assert privateKey != null; | |||
BigInteger modulus = privateKey.getModulus(); | |||
BigInteger pubExp = privateKey.getPublicExponent(); | |||
BigInteger privExp = privateKey.getPrivateExponent(); | |||
@@ -540,7 +528,7 @@ public class RSAUtils { | |||
result,0, length); | |||
} else { | |||
System.arraycopy(srcBytes,0, | |||
result,length - srcLength, length); | |||
result,length - srcLength, srcLength); | |||
} | |||
return result; | |||
@@ -1,58 +0,0 @@ | |||
package test.com.jd.blockchain.crypto.utils.classic; | |||
import org.bouncycastle.asn1.x500.X500Name; | |||
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; | |||
import org.bouncycastle.operator.ContentSigner; | |||
import org.bouncycastle.operator.OperatorCreationException; | |||
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; | |||
import org.bouncycastle.pkcs.PKCS10CertificationRequestBuilder; | |||
import java.io.IOException; | |||
import java.security.*; | |||
/** | |||
* @author zhanglin33 | |||
* @title: CSRTest | |||
* @description: TODO | |||
* @date 2019-05-10, 12:55 | |||
*/ | |||
public class CSRTest { | |||
public static String genCSR(String subject, String alg,String provider) { | |||
String signalg=""; | |||
int alglength=0; | |||
String keyAlg=""; | |||
if(alg.toUpperCase().equals("RSA1024")){ | |||
signalg="SHA1WithRSA"; | |||
alglength=1024; | |||
keyAlg="RSA"; | |||
}else if(alg.toUpperCase().equals("RSA2048")){ | |||
signalg="SHA1WithRSA"; | |||
alglength=2048; | |||
keyAlg="RSA"; | |||
}else if(alg.toUpperCase().equals("SM2")){ | |||
signalg="SM3withSM2"; | |||
alglength=256; | |||
keyAlg="SM2"; | |||
} | |||
KeyPairGenerator keyGen; | |||
PKCS10CertificationRequestBuilder builder; | |||
try { | |||
keyGen = KeyPairGenerator.getInstance(keyAlg); | |||
keyGen.initialize(alglength); | |||
KeyPair kp = keyGen.generateKeyPair(); | |||
builder = new PKCS10CertificationRequestBuilder(new X500Name(subject), SubjectPublicKeyInfo.getInstance(kp.getPublic().getEncoded())); | |||
JcaContentSignerBuilder jcaContentSignerBuilder = new JcaContentSignerBuilder(signalg); | |||
jcaContentSignerBuilder.setProvider(provider); | |||
ContentSigner contentSigner = jcaContentSignerBuilder.build(kp.getPrivate()); | |||
builder.build(contentSigner); | |||
return builder.toString(); | |||
} catch (OperatorCreationException | NoSuchAlgorithmException e) { | |||
e.printStackTrace(); | |||
} | |||
return null; | |||
} | |||
} |
@@ -1,79 +0,0 @@ | |||
package test.com.jd.blockchain.crypto.utils.classic; | |||
import org.bouncycastle.util.encoders.Base64; | |||
import org.bouncycastle.util.encoders.Hex; | |||
import org.junit.Test; | |||
import java.io.ByteArrayInputStream; | |||
import java.io.IOException; | |||
import java.security.NoSuchProviderException; | |||
import java.security.cert.CertificateException; | |||
import java.security.cert.CertificateFactory; | |||
import java.security.cert.X509Certificate; | |||
import org.bouncycastle.jce.provider.BouncyCastleProvider; | |||
/** | |||
* @author zhanglin33 | |||
* @title: CertTest | |||
* @description: TODO | |||
* @date 2019-05-09, 11:34 | |||
*/ | |||
public class CertTest { | |||
private byte[] certBytes = Base64.decode("MIIEQDCCAyigAwIBAgIFICdVYzEwDQYJKoZIhvcNAQEFBQAwWTELMAkGA1UEBhMCQ04xMDAuBgNVBAoTJ0NoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEYMBYGA1UEAxMPQ0ZDQSBURVNUIE9DQTExMB4XDTE5MDUxMDExMjAyNFoXDTIxMDUxMDExMjAyNFowcjELMAkGA1UEBhMCQ04xGDAWBgNVBAoTD0NGQ0EgVEVTVCBPQ0ExMTERMA8GA1UECxMITG9jYWwgUkExFTATBgNVBAsTDEluZGl2aWR1YWwtMTEfMB0GA1UEAxQWMDUxQGFhYWFhQFpIMDkzNTgwMjhAMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJx3F2WD1dJPzK/nRHO7d1TJ1hTjzGTmv0PQ7ECsJAh3U3BtnGTpCB+b4+JMI4LO8nHkKIBQ3P9XnF+Bf1iXdWNAQ4aWCxa2nV7lCp4w0GliPu/EMgIfmsSDUtgqbM3cr8sR8r9m1xG3gt2TIQJ+jT7sAiguU/kyNzpjaccOUIgUFa8IDFq9UeB76MXtCuhlERRZQCl47e+9w7ZoxmE7e6IZORxPp7rQWVBHlR9ntWjJfNDTm3gMP5ehP+yIZnKx1LudxkBLQxpMmspzOyH1zqx5nkKe49AfWWpDxxRvYkriyYC3aE81qLsU/bhLwNEKOju7BGDF/mhJLZUedojM0gMCAwEAAaOB9TCB8jAfBgNVHSMEGDAWgBT8C7xEmg4xoYOpgYcnHgVCxr9W+DBIBgNVHSAEQTA/MD0GCGCBHIbvKgECMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2ZjYS5jb20uY24vdXMvdXMtMTUuaHRtMDoGA1UdHwQzMDEwL6AtoCuGKWh0dHA6Ly8yMTAuNzQuNDIuMy9PQ0ExMS9SU0EvY3JsMjU2OTMuY3JsMAsGA1UdDwQEAwID6DAdBgNVHQ4EFgQU5oKGaQs7Jt5Gfbt1XhFTWAySEKswHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMA0GCSqGSIb3DQEBBQUAA4IBAQAlmPRaImZV51iKjtpMKuyLMw7dX8L0lY3tl+pVZZSxHuwsN4GCCtV0Ej50up+/6EbfL4NUTiuHVAjCroKKvb+94CrdEwdnQGM5IbGSjT78nQpeASXbIWuUwA+ImjvZOzvq/0b56AzonNzBxOMGko/bj5smM6X8jrgJ0NQppo2KNSVNC4JbuoNWI4FM94SE4DUi9H7EYl4JdOtDaDtCsq49o/A1CZyYrmoOPCgxpQQXmuB3lGq/jyoOlW2aW8uee/hYG1JJcSHLBjF0WBwdxssgbBotA5f1PebiIMSbFgjk57bd4M80hhU/rI4Hkn9pcp5R7NsX95TtyDIg90LboBnW"); | |||
public static String getSubjectDN(byte[] der) { | |||
String dn = ""; | |||
try { | |||
ByteArrayInputStream bIn = new ByteArrayInputStream(der); | |||
//BouncyCastleProvider provider = new BouncyCastleProvider(); | |||
//CertificateFactory cf = CertificateFactory.getInstance("X509", | |||
//provider); | |||
//CertificateFactory cf = CertificateFactory.getInstance("X.509", | |||
// "SUN"); | |||
//android 需采用bcprov | |||
CertificateFactory cf = CertificateFactory.getInstance("X.509"); | |||
// System.out.println(cf.getProvider().getName()); | |||
X509Certificate cert = (X509Certificate) cf | |||
.generateCertificate(bIn); | |||
dn = cert.getSubjectDN().getName(); | |||
System.out.println(Hex.toHexString(cert.getEncoded())); | |||
byte[] pubKeyBytes = cert.getPublicKey().getEncoded(); | |||
System.out.println(Hex.toHexString(pubKeyBytes)); | |||
System.out.println(cert.getSigAlgName()); | |||
String issuerName = cert.getIssuerDN().getName(); | |||
System.out.println(issuerName); | |||
String oid = cert.getSigAlgOID(); | |||
System.out.println(oid); | |||
System.out.println(); | |||
String name = cert.getIssuerX500Principal().getName(); | |||
System.out.println(name); | |||
bIn.close(); | |||
} catch (CertificateException | IOException e) { | |||
e.printStackTrace(); | |||
} | |||
return dn; | |||
} | |||
// public static String parseCertDN(String dn, String type) { | |||
// type = type + "="; | |||
// String[] split = dn.split(","); | |||
// for (String x : split) { | |||
// if (x.contains(type)) { | |||
// x = x.trim(); | |||
// return x.substring(type.length()); | |||
// } | |||
// } | |||
// return null; | |||
// } | |||
@Test | |||
public void cert1Test() { | |||
String string = getSubjectDN(certBytes); | |||
System.out.println(Hex.toHexString(certBytes)); | |||
System.out.println(string); | |||
} | |||
} |
@@ -159,10 +159,10 @@ public class RSAUtilsTest { | |||
AsymmetricKeyParameter privKey = keyPair.getPrivate(); | |||
byte[] privKeyBytes = RSAUtils.privKey2Bytes_RawKey((RSAPrivateCrtKeyParameters) privKey); | |||
Random random = new Random(); | |||
byte[] data; | |||
for (int i = 1; i < 1024; i++) { | |||
data = new byte[i]; | |||
Random random = new Random(); | |||
data = new byte[1024]; | |||
random.nextBytes(data); | |||
byte[] ciphertext = RSAUtils.encrypt(data, pubKey); | |||
@@ -171,7 +171,6 @@ public class RSAUtilsTest { | |||
assertArrayEquals(data, plaintextFromPrivKey); | |||
assertArrayEquals(data, plaintextFromPrivKeyBytes); | |||
} | |||
} | |||
@@ -1,212 +1,212 @@ | |||
package test.com.jd.blockchain.crypto.utils.classic; | |||
import org.bouncycastle.asn1.ASN1Sequence; | |||
import org.bouncycastle.crypto.params.RSAKeyParameters; | |||
import org.bouncycastle.crypto.params.RSAPrivateCrtKeyParameters; | |||
import org.bouncycastle.crypto.util.OpenSSHPrivateKeyUtil; | |||
import org.bouncycastle.crypto.util.OpenSSHPublicKeyUtil; | |||
import org.bouncycastle.jce.spec.OpenSSHPrivateKeySpec; | |||
import org.bouncycastle.jce.spec.OpenSSHPublicKeySpec; | |||
import org.bouncycastle.util.Strings; | |||
import org.bouncycastle.util.encoders.Base64; | |||
import org.bouncycastle.util.encoders.Hex; | |||
import org.bouncycastle.util.io.pem.PemReader; | |||
import org.junit.Test; | |||
import java.io.IOException; | |||
import java.io.StringReader; | |||
import java.math.BigInteger; | |||
/** | |||
* @author zhanglin33 | |||
* @title: SSHKeyUtilsTest | |||
* @description: Tests for methods in SSHKeyUtils | |||
* @date 2019-05-07, 15:14 | |||
*/ | |||
public class SSHKeyUtilsTest { | |||
@Test | |||
public void parseRSAPublicKeyTest() { | |||
String pubKeyStr = "AAAAB3NzaC1yc2EAAAADAQABAAABAQCYwLN4EXy7g0Xugv4lQfoujbARi48gPSxVupt" + | |||
"GsSoGqsS00e9rA7v0qzFKa9Zhnw1WkjCnEXRYAMiCAJYkM/mGI8mb3qkcdNhGWZmPnopV+D46CTFB1" + | |||
"4yeR9mjoOPXs4pjX3zGveKx5Nx8jvdoFewbTCtdN0x1XWTjNT5bXqP/4gXkLENEU5tLsWVAOu0ME/N" + | |||
"e/9gMujAtDoolJ181a9P06bvEpIw5cLtUnsm5CtvBuiL7WBXxDJ/IASJrKNGBdK8xib1+Kb8tNLAT6" + | |||
"Dj25BwylqiRNhb5l1Ni4aKrE2FqSEc5Nx5+csQMEl9MBJ3pEsLHBNbohDL+jbwLguRVD6CJ"; | |||
byte[] pubKeyBytes = Base64.decode(pubKeyStr); | |||
System.out.println(Hex.toHexString(pubKeyBytes)); | |||
OpenSSHPublicKeySpec pubKeySpec = new OpenSSHPublicKeySpec(pubKeyBytes); | |||
String pubKeyFormat = pubKeySpec.getFormat(); | |||
String pubKeyType = pubKeySpec.getType(); | |||
System.out.println(pubKeyFormat); | |||
System.out.println(pubKeyType); | |||
RSAKeyParameters pubKey = (RSAKeyParameters) OpenSSHPublicKeyUtil.parsePublicKey(pubKeyBytes); | |||
BigInteger e = pubKey.getExponent(); | |||
BigInteger n = pubKey.getModulus(); | |||
System.out.println(Hex.toHexString(e.toByteArray())); | |||
System.out.println(Hex.toHexString(n.toByteArray())); | |||
System.out.println(); | |||
System.out.println("-------------------------------------------------------"); | |||
System.out.println(); | |||
} | |||
@Test | |||
public void parseRSAPrivateKeyTest() { | |||
String str2 = "-----BEGIN OPENSSH PRIVATE KEY-----\n" + | |||
"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\n" + | |||
"-----END OPENSSH PRIVATE KEY-----"; | |||
byte[] Bytes2 = null; | |||
try { | |||
Bytes2 = new PemReader(new StringReader(str2)).readPemObject().getContent(); | |||
} catch (IOException e1) { | |||
e1.printStackTrace(); | |||
} | |||
System.out.println(Hex.toHexString(Bytes2)); | |||
String str3 = "-----BEGIN OPENSSH PRIVATE KEY-----\n" + | |||
"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\n" + | |||
"-----END OPENSSH PRIVATE KEY-----"; | |||
byte[] Bytes3 = null; | |||
try { | |||
Bytes3 = new PemReader(new StringReader(str3)).readPemObject().getContent(); | |||
} catch (IOException e1) { | |||
e1.printStackTrace(); | |||
} | |||
System.out.println(Hex.toHexString(Bytes3)); | |||
// System.out.println(Hex.toHexString(Base64.decode("oNE9iA4ZyuZLbpEL7B29NaxGi4puT2Y5RDaMoEkoAKI"))); | |||
// String test = "1ac477fa"; | |||
// byte[] testBytes = Hex.decode(test); | |||
// | |||
// System.out.println(Base64.toBase64String(testBytes)); | |||
byte[] AUTH_MAGIC = Strings.toByteArray("openssh-key-v1\0"); | |||
System.out.println(Hex.toHexString(AUTH_MAGIC)); | |||
System.out.println(Base64.toBase64String(AUTH_MAGIC)); | |||
String privKeyStr = "-----BEGIN OPENSSH PRIVATE KEY-----\n" + | |||
"b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn\n" + | |||
"NhAAAAAwEAAQAAAQEAmMCzeBF8u4NF7oL+JUH6Lo2wEYuPID0sVbqbRrEqBqrEtNHvawO7\n" + | |||
"9KsxSmvWYZ8NVpIwpxF0WADIggCWJDP5hiPJm96pHHTYRlmZj56KVfg+OgkxQdeMnkfZo6\n" + | |||
"Dj17OKY198xr3iseTcfI73aBXsG0wrXTdMdV1k4zU+W16j/+IF5CxDRFObS7FlQDrtDBPz\n" + | |||
"Xv/YDLowLQ6KJSdfNWvT9Om7xKSMOXC7VJ7JuQrbwboi+1gV8QyfyAEiayjRgXSvMYm9fi\n" + | |||
"m/LTSwE+g49uQcMpaokTYW+ZdTYuGiqxNhakhHOTcefnLEDBJfTASd6RLCxwTW6IQy/o28\n" + | |||
"C4LkVQ+giQAAA9AaxHf6GsR3+gAAAAdzc2gtcnNhAAABAQCYwLN4EXy7g0Xugv4lQfoujb\n" + | |||
"ARi48gPSxVuptGsSoGqsS00e9rA7v0qzFKa9Zhnw1WkjCnEXRYAMiCAJYkM/mGI8mb3qkc\n" + | |||
"dNhGWZmPnopV+D46CTFB14yeR9mjoOPXs4pjX3zGveKx5Nx8jvdoFewbTCtdN0x1XWTjNT\n" + | |||
"5bXqP/4gXkLENEU5tLsWVAOu0ME/Ne/9gMujAtDoolJ181a9P06bvEpIw5cLtUnsm5CtvB\n" + | |||
"uiL7WBXxDJ/IASJrKNGBdK8xib1+Kb8tNLAT6Dj25BwylqiRNhb5l1Ni4aKrE2FqSEc5Nx\n" + | |||
"5+csQMEl9MBJ3pEsLHBNbohDL+jbwLguRVD6CJAAAAAwEAAQAAAQARfhfPSylei9TpUGTs\n" + | |||
"PVb6F82u5K16QqceFiWL/ePTKaEnF9d0CNRwW15kqF6/hShQ3qLlrvEE1uofQRPwh2cuvl\n" + | |||
"BrIh95m8PcoowcT0qGN8xgdwcGBDodMhsxSs5suCnD4X53f+1C8/Nv7CtW5xPHuHxKy3dd\n" + | |||
"BVn1TvaaHgdn2PwJVKtZp+WVG3/UHr25nFHd8mYgpeHZqK9AW16N0UEMXMM1u8ZCubVOoS\n" + | |||
"IGuMAXpTug0xA+BXHo17FcDGKSzcXFzh+urIz5glRp5zFioHBqxNmkKfQkG6C7UxnPGyS/\n" + | |||
"/J+3lL2lvl0G8kO/5EDFMBhTMEy1NeR2b629S4G1qUxVAAAAgHDwE9kPiVETcxSzI4wotT\n" + | |||
"1Ee9nKVVD3oGdRqefvX7EUR8bvdv4nCqHPNBx8C6l8zo7fsQD81YL85F4eWbtrdxEijRHX\n" + | |||
"5m7J/muh/laY1Hq43WCkZGboO4fZ2HHi7oN096FqrKRpvbQGQi1FLbcISUdsitwrs6ywn3\n" + | |||
"fNx3q+X3V6AAAAgQDJRo9v+0QvldI33cpJKPKiaop5QvfIDzMatD3vLA1qqycgIi4KOtb5\n" + | |||
"+LP/jgIpCYah/sk+JpKNz/vsZmZmrfaVu9D3Le2LLBgMpEoSO8jOe9WGI4Ew75C7w7AZCa\n" + | |||
"SyUnHIVX/9D8Y5tx4cKx6Im9AGbNF35XZoKO4KCk5VMTXhnwAAAIEAwkjKIpTYdeAQVTRf\n" + | |||
"C13kg84Bu5n4WkiLnp1WOCg2GN5RekqprINtpjIMZoB9Fv292Np99La8yvmRoy5qzNHGdm\n" + | |||
"Q6AMku8jP123jF2J+wDvF714VtZHNvdCYBGJS+rZ81xtJfHhKtZqRAVtbPertOWZeuRm9V\n" + | |||
"o+/rEuEzgGYGXNcAAAAbemhhbmdsaW4zM0B6aGFuZ2xpbjMzLmxvY2Fs\n" + | |||
"-----END OPENSSH PRIVATE KEY-----"; | |||
byte[] privKeyBytes = null; | |||
try { | |||
privKeyBytes = new PemReader(new StringReader(privKeyStr)).readPemObject().getContent(); | |||
} catch (IOException e1) { | |||
e1.printStackTrace(); | |||
} | |||
assert privKeyBytes != null; | |||
System.out.println(Hex.toHexString(privKeyBytes)); | |||
OpenSSHPrivateKeySpec privKeySpec = new OpenSSHPrivateKeySpec(privKeyBytes); | |||
String privKeyFormat = privKeySpec.getFormat(); | |||
System.out.println(privKeyFormat); | |||
RSAKeyParameters privKey = (RSAKeyParameters) OpenSSHPrivateKeyUtil.parsePrivateKeyBlob(privKeyBytes); | |||
// BigInteger e = privKey.getPublicExponent(); | |||
// BigInteger n = privKey.getModulus(); | |||
// | |||
// BigInteger d = privKey.getExponent(); | |||
// BigInteger p = privKey.getP(); | |||
// BigInteger q = privKey.getQ(); | |||
// BigInteger dP = privKey.getDP(); | |||
// BigInteger dQ = privKey.getDQ(); | |||
// BigInteger qInv = privKey.getQInv(); | |||
//package test.com.jd.blockchain.crypto.utils.classic; | |||
// | |||
//import org.bouncycastle.asn1.ASN1Sequence; | |||
//import org.bouncycastle.crypto.params.RSAKeyParameters; | |||
//import org.bouncycastle.crypto.params.RSAPrivateCrtKeyParameters; | |||
//import org.bouncycastle.crypto.util.OpenSSHPrivateKeyUtil; | |||
//import org.bouncycastle.crypto.util.OpenSSHPublicKeyUtil; | |||
//import org.bouncycastle.jce.spec.OpenSSHPrivateKeySpec; | |||
//import org.bouncycastle.jce.spec.OpenSSHPublicKeySpec; | |||
//import org.bouncycastle.util.Strings; | |||
//import org.bouncycastle.util.encoders.Base64; | |||
//import org.bouncycastle.util.encoders.Hex; | |||
//import org.bouncycastle.util.io.pem.PemReader; | |||
//import org.junit.Test; | |||
// | |||
//import java.io.IOException; | |||
//import java.io.StringReader; | |||
//import java.math.BigInteger; | |||
// | |||
///** | |||
// * @author zhanglin33 | |||
// * @title: SSHKeyUtilsTest | |||
// * @description: Tests for methods in SSHKeyUtils | |||
// * @date 2019-05-07, 15:14 | |||
// */ | |||
//public class SSHKeyUtilsTest { | |||
// | |||
// @Test | |||
// public void parseRSAPublicKeyTest() { | |||
// | |||
// String pubKeyStr = "AAAAB3NzaC1yc2EAAAADAQABAAABAQCYwLN4EXy7g0Xugv4lQfoujbARi48gPSxVupt" + | |||
// "GsSoGqsS00e9rA7v0qzFKa9Zhnw1WkjCnEXRYAMiCAJYkM/mGI8mb3qkcdNhGWZmPnopV+D46CTFB1" + | |||
// "4yeR9mjoOPXs4pjX3zGveKx5Nx8jvdoFewbTCtdN0x1XWTjNT5bXqP/4gXkLENEU5tLsWVAOu0ME/N" + | |||
// "e/9gMujAtDoolJ181a9P06bvEpIw5cLtUnsm5CtvBuiL7WBXxDJ/IASJrKNGBdK8xib1+Kb8tNLAT6" + | |||
// "Dj25BwylqiRNhb5l1Ni4aKrE2FqSEc5Nx5+csQMEl9MBJ3pEsLHBNbohDL+jbwLguRVD6CJ"; | |||
// | |||
// byte[] pubKeyBytes = Base64.decode(pubKeyStr); | |||
// System.out.println(Hex.toHexString(pubKeyBytes)); | |||
// OpenSSHPublicKeySpec pubKeySpec = new OpenSSHPublicKeySpec(pubKeyBytes); | |||
// | |||
// String pubKeyFormat = pubKeySpec.getFormat(); | |||
// String pubKeyType = pubKeySpec.getType(); | |||
// System.out.println(pubKeyFormat); | |||
// System.out.println(pubKeyType); | |||
// | |||
// RSAKeyParameters pubKey = (RSAKeyParameters) OpenSSHPublicKeyUtil.parsePublicKey(pubKeyBytes); | |||
// BigInteger e = pubKey.getExponent(); | |||
// BigInteger n = pubKey.getModulus(); | |||
// System.out.println(Hex.toHexString(e.toByteArray())); | |||
// System.out.println(Hex.toHexString(n.toByteArray())); | |||
// | |||
// System.out.println(Hex.toHexString(d.toByteArray())); | |||
// System.out.println(Hex.toHexString(p.toByteArray())); | |||
// System.out.println(Hex.toHexString(q.toByteArray())); | |||
// System.out.println(Hex.toHexString(dP.toByteArray())); | |||
// System.out.println(Hex.toHexString(dQ.toByteArray())); | |||
// System.out.println(Hex.toHexString(qInv.toByteArray())); | |||
} | |||
} | |||
// System.out.println(); | |||
// System.out.println("-------------------------------------------------------"); | |||
// System.out.println(); | |||
// | |||
// | |||
// } | |||
// | |||
// @Test | |||
// public void parseRSAPrivateKeyTest() { | |||
// | |||
// String str2 = "-----BEGIN OPENSSH PRIVATE KEY-----\n" + | |||
// "b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn\n" + | |||
// "NhAAAAAwEAAQAAAQEAwFyeWgHFu/ZMvqWa28QUGlKMDV7vpbzT7kyA/4yuotfprZKHNeEy\n" + | |||
// "GugleJ/Kv5kqHh8Km4IZcfNcerTYds+U5m/uX4bSYpEbXco3DQ2lYQbYo7PBWwPMq2aIdd\n" + | |||
// "i7WxUAlt0z1ugLNimskPzJ7DNra+ax0Wh9RnMsjZkfuBZiKq7wbBm7NyJmpg2B7xo5cz+G\n" + | |||
// "Lw9e0tDlvgeLe+n68WvYWWFP59mfP6Qoy+NwjQnnwrhJi2j4dEexO97KmgnJhL07lu4eCQ\n" + | |||
// "fdv68Tai9+aeDNawe7nmFYf2eNjah2jW/DwOwA/ErXnvgjLSMsgc6WGKfokhytAOFDGgvH\n" + | |||
// "KKNd6BMYZwAAA9A7JircOyYq3AAAAAdzc2gtcnNhAAABAQDAXJ5aAcW79ky+pZrbxBQaUo\n" + | |||
// "wNXu+lvNPuTID/jK6i1+mtkoc14TIa6CV4n8q/mSoeHwqbghlx81x6tNh2z5Tmb+5fhtJi\n" + | |||
// "kRtdyjcNDaVhBtijs8FbA8yrZoh12LtbFQCW3TPW6As2KayQ/MnsM2tr5rHRaH1GcyyNmR\n" + | |||
// "+4FmIqrvBsGbs3ImamDYHvGjlzP4YvD17S0OW+B4t76frxa9hZYU/n2Z8/pCjL43CNCefC\n" + | |||
// "uEmLaPh0R7E73sqaCcmEvTuW7h4JB92/rxNqL35p4M1rB7ueYVh/Z42NqHaNb8PA7AD8St\n" + | |||
// "ee+CMtIyyBzpYYp+iSHK0A4UMaC8coo13oExhnAAAAAwEAAQAAAQAEEvIXnen+LR06/G7n\n" + | |||
// "MKPsWss0jUouDG3AokYpI2WfdUsxreTHM1nIUBpbD6dPn4LQ2H91A7BeRXUz9BiRi5vvtX\n" + | |||
// "cq9sQF6mTV+65mzF8wSuDTtr7lmpL/HlDNjiWJrEwy5cRvTMLQBtnsyC3OntgrlNs3QCtH\n" + | |||
// "DrFm3lNZpr+1f62Vu43dbcTPvLwcc335cJ73BU5WsMGaouCAqVXsVsgfkA66u6+gQs8O3F\n" + | |||
// "IQntdzS8vYpkzH8N9qqNZit7kbFCRUTI7CDLHquJmclzB8uVwO0pR5+Aross+YL3QxPZoJ\n" + | |||
// "+LXLlCi27oSmYk3fx3uh0XwwO3JFDQpeCxOuEsZbOy8BAAAAgCsktFksS0BViRuLyzC2H7\n" + | |||
// "X7Uonf+dr8e4Yn+RgR329KFh/ok28/KZndZHsUnhdmiIjPr+SplFZZMrV/uJDkGezUNWGf\n" + | |||
// "8qn+eEglm7nYfVf2EXTVNhpg8yfPChx90ybc8GYlqpEqf7LiCuEBCPqPJgq6K7i6UKbwn2\n" + | |||
// "SfqUOBcz5BAAAAgQDqszdiNv0cTvZ/Xg3qJPsHXqQuLBYoe2vhU+Pipt9HviruUD1y3Mso\n" + | |||
// "rOL9QBwjE7szGnwVE00J0mLp+s309+kftADLXqMyqFYiy7S8GIWQw0YNB2m8yjq+phHbBm\n" + | |||
// "/Gs2P4+s8yKTcVJvMTyWr02rpCHiLTKDHoXPJcJ8yVMTHFRwAAAIEA0dHB9fXiesEKfwcp\n" + | |||
// "X11IHAV8pTd+7VN81oGwxtRg88U7H2rmQFCxSZah2O/OCCmYLH3PHT95qnMHHqzcsVvoIy\n" + | |||
// "7AfnMpp4KYU0Ic3aFuRjZk2sDsYUniPcCpuCvs8Jb75sDwKDW2EM8MowiNylDnYMmfYj0l\n" + | |||
// "gIhz1/p79hXEI+EAAAAbemhhbmdsaW4zM0B6aGFuZ2xpbjMzLmxvY2Fs\n" + | |||
// "-----END OPENSSH PRIVATE KEY-----"; | |||
// | |||
// byte[] Bytes2 = null; | |||
// try { | |||
// Bytes2 = new PemReader(new StringReader(str2)).readPemObject().getContent(); | |||
// } catch (IOException e1) { | |||
// e1.printStackTrace(); | |||
// } | |||
// System.out.println(Hex.toHexString(Bytes2)); | |||
// | |||
// String str3 = "-----BEGIN OPENSSH PRIVATE KEY-----\n" + | |||
// "b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn\n" + | |||
// "NhAAAAAwEAAQAAAQEAvummQZm1FUFc/cV5nQBeowhjX4vIU4kBmyPmXHMViX4ORvWvD1yi\n" + | |||
// "oxcaawPpP9QconpzjdCrNbmw0oZNt9UKlmrOU34YTRD5LFlEVOYjr/21/SO5yDGog8xJBU\n" + | |||
// "HQYnXY5L2q9EXKOF45e5P6gSGUovrhePEsaniuQN48GIObPCOFkEN0ZV2DqRsn3It1vY+D\n" + | |||
// "GiSb5EaZ2sNkudyzYfgFxcCbqBXmDa1WeyX5xYh8wldBJLUH+pO4gPoTXXX4UI4yNdDmPD\n" + | |||
// "BWFvPVIOdpfdBnDbEp1AoE5Jx/+tbwFBIEvTPOECtOUKDGIlXXIH0I4waHbwf6EnHD5+BR\n" + | |||
// "N0XwrzSkuwAAA9DYV/7H2Ff+xwAAAAdzc2gtcnNhAAABAQC+6aZBmbUVQVz9xXmdAF6jCG\n" + | |||
// "Nfi8hTiQGbI+ZccxWJfg5G9a8PXKKjFxprA+k/1ByienON0Ks1ubDShk231QqWas5TfhhN\n" + | |||
// "EPksWURU5iOv/bX9I7nIMaiDzEkFQdBiddjkvar0Rco4Xjl7k/qBIZSi+uF48SxqeK5A3j\n" + | |||
// "wYg5s8I4WQQ3RlXYOpGyfci3W9j4MaJJvkRpnaw2S53LNh+AXFwJuoFeYNrVZ7JfnFiHzC\n" + | |||
// "V0EktQf6k7iA+hNddfhQjjI10OY8MFYW89Ug52l90GcNsSnUCgTknH/61vAUEgS9M84QK0\n" + | |||
// "5QoMYiVdcgfQjjBodvB/oSccPn4FE3RfCvNKS7AAAAAwEAAQAAAQArRruxUy6BSvfRbtpK\n" + | |||
// "hLLvMg+UsRMQHJaInHKzskLHkBOcckTkrpMPdUU/zPsqxOJY0nkvRIYK/7TdhCRJ77ker8\n" + | |||
// "dllcfccGSLcRDUTfb5BgIjB94tS1Rvy/chgfHC4APyliwSg197t6BAKyM18m7HIyfJSqJO\n" + | |||
// "4FxfyADHbc3aq654tu+eaUtD7TEN1bH6PKMDvwSioMLgKU43GQeDJZbqamBE9y+KVhVx9y\n" + | |||
// "3DEHrOPkRkZIG33y9j7B/i0vl+WnwUTzmLGRR0U6J9wrzyANL8ODYaAvk4FvUED8hQ72jh\n" + | |||
// "NpAXsSgf6COUE1sUnO5DOwN1zHBNHaSo73Qu7aKZtL4BAAAAgDBW3ItiqU9Ip34KtLaayK\n" + | |||
// "/BkRDDwFNvAxpOw9alpfbLGF5xbVjRN4wy7HJ4eA+7JJnx6A6xYrzykbPP+dnUnfzYuxH8\n" + | |||
// "MrihOkYipw1VaR6/0XH+apmE1SmotuYbl+bpl9dlZYUI0pJ8wldqoDCNlSOcLy77HnKwu9\n" + | |||
// "GpJx9KmW9WAAAAgQDdnrwfVv5trAuZZIcw2vLRWhoDT196k/Ty1GP4zFpDttb8OyZ8Ygpx\n" + | |||
// "oA5PhYyl5M1g/2oR/Rpp3vfKDVThfn/bCnMtAbUHMfvYK3Oufvq5JmzT1rgGr3MEek+JBR\n" + | |||
// "O17I87m4GE7iM1LzCUs2G/fKt2uoVXdniv0Vn0iCiZZc7JmwAAAIEA3IdsccarkUfFcQ2c\n" + | |||
// "4TdHrx/RGmoTAO6k1xOHXZjWPmerinuOspIJL/ymWfqIxABCjub3UHyP7ap+1+AAnk+TMU\n" + | |||
// "eR3tLEp9tRM6n0Td56DnQ9Q+RZhPqR486/teZ33cMBMHg52aIs/3AzMpK9xTFCRgqsKa6e\n" + | |||
// "ednMB4Q1txvHU2EAAAAbemhhbmdsaW4zM0B6aGFuZ2xpbjMzLmxvY2Fs\n" + | |||
// "-----END OPENSSH PRIVATE KEY-----"; | |||
// | |||
// byte[] Bytes3 = null; | |||
// try { | |||
// Bytes3 = new PemReader(new StringReader(str3)).readPemObject().getContent(); | |||
// } catch (IOException e1) { | |||
// e1.printStackTrace(); | |||
// } | |||
// System.out.println(Hex.toHexString(Bytes3)); | |||
//// System.out.println(Hex.toHexString(Base64.decode("oNE9iA4ZyuZLbpEL7B29NaxGi4puT2Y5RDaMoEkoAKI"))); | |||
//// String test = "1ac477fa"; | |||
//// byte[] testBytes = Hex.decode(test); | |||
//// | |||
//// System.out.println(Base64.toBase64String(testBytes)); | |||
// | |||
// byte[] AUTH_MAGIC = Strings.toByteArray("openssh-key-v1\0"); | |||
// System.out.println(Hex.toHexString(AUTH_MAGIC)); | |||
// System.out.println(Base64.toBase64String(AUTH_MAGIC)); | |||
// String privKeyStr = "-----BEGIN OPENSSH PRIVATE KEY-----\n" + | |||
// "b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn\n" + | |||
// "NhAAAAAwEAAQAAAQEAmMCzeBF8u4NF7oL+JUH6Lo2wEYuPID0sVbqbRrEqBqrEtNHvawO7\n" + | |||
// "9KsxSmvWYZ8NVpIwpxF0WADIggCWJDP5hiPJm96pHHTYRlmZj56KVfg+OgkxQdeMnkfZo6\n" + | |||
// "Dj17OKY198xr3iseTcfI73aBXsG0wrXTdMdV1k4zU+W16j/+IF5CxDRFObS7FlQDrtDBPz\n" + | |||
// "Xv/YDLowLQ6KJSdfNWvT9Om7xKSMOXC7VJ7JuQrbwboi+1gV8QyfyAEiayjRgXSvMYm9fi\n" + | |||
// "m/LTSwE+g49uQcMpaokTYW+ZdTYuGiqxNhakhHOTcefnLEDBJfTASd6RLCxwTW6IQy/o28\n" + | |||
// "C4LkVQ+giQAAA9AaxHf6GsR3+gAAAAdzc2gtcnNhAAABAQCYwLN4EXy7g0Xugv4lQfoujb\n" + | |||
// "ARi48gPSxVuptGsSoGqsS00e9rA7v0qzFKa9Zhnw1WkjCnEXRYAMiCAJYkM/mGI8mb3qkc\n" + | |||
// "dNhGWZmPnopV+D46CTFB14yeR9mjoOPXs4pjX3zGveKx5Nx8jvdoFewbTCtdN0x1XWTjNT\n" + | |||
// "5bXqP/4gXkLENEU5tLsWVAOu0ME/Ne/9gMujAtDoolJ181a9P06bvEpIw5cLtUnsm5CtvB\n" + | |||
// "uiL7WBXxDJ/IASJrKNGBdK8xib1+Kb8tNLAT6Dj25BwylqiRNhb5l1Ni4aKrE2FqSEc5Nx\n" + | |||
// "5+csQMEl9MBJ3pEsLHBNbohDL+jbwLguRVD6CJAAAAAwEAAQAAAQARfhfPSylei9TpUGTs\n" + | |||
// "PVb6F82u5K16QqceFiWL/ePTKaEnF9d0CNRwW15kqF6/hShQ3qLlrvEE1uofQRPwh2cuvl\n" + | |||
// "BrIh95m8PcoowcT0qGN8xgdwcGBDodMhsxSs5suCnD4X53f+1C8/Nv7CtW5xPHuHxKy3dd\n" + | |||
// "BVn1TvaaHgdn2PwJVKtZp+WVG3/UHr25nFHd8mYgpeHZqK9AW16N0UEMXMM1u8ZCubVOoS\n" + | |||
// "IGuMAXpTug0xA+BXHo17FcDGKSzcXFzh+urIz5glRp5zFioHBqxNmkKfQkG6C7UxnPGyS/\n" + | |||
// "/J+3lL2lvl0G8kO/5EDFMBhTMEy1NeR2b629S4G1qUxVAAAAgHDwE9kPiVETcxSzI4wotT\n" + | |||
// "1Ee9nKVVD3oGdRqefvX7EUR8bvdv4nCqHPNBx8C6l8zo7fsQD81YL85F4eWbtrdxEijRHX\n" + | |||
// "5m7J/muh/laY1Hq43WCkZGboO4fZ2HHi7oN096FqrKRpvbQGQi1FLbcISUdsitwrs6ywn3\n" + | |||
// "fNx3q+X3V6AAAAgQDJRo9v+0QvldI33cpJKPKiaop5QvfIDzMatD3vLA1qqycgIi4KOtb5\n" + | |||
// "+LP/jgIpCYah/sk+JpKNz/vsZmZmrfaVu9D3Le2LLBgMpEoSO8jOe9WGI4Ew75C7w7AZCa\n" + | |||
// "SyUnHIVX/9D8Y5tx4cKx6Im9AGbNF35XZoKO4KCk5VMTXhnwAAAIEAwkjKIpTYdeAQVTRf\n" + | |||
// "C13kg84Bu5n4WkiLnp1WOCg2GN5RekqprINtpjIMZoB9Fv292Np99La8yvmRoy5qzNHGdm\n" + | |||
// "Q6AMku8jP123jF2J+wDvF714VtZHNvdCYBGJS+rZ81xtJfHhKtZqRAVtbPertOWZeuRm9V\n" + | |||
// "o+/rEuEzgGYGXNcAAAAbemhhbmdsaW4zM0B6aGFuZ2xpbjMzLmxvY2Fs\n" + | |||
// "-----END OPENSSH PRIVATE KEY-----"; | |||
// | |||
// byte[] privKeyBytes = null; | |||
// try { | |||
// privKeyBytes = new PemReader(new StringReader(privKeyStr)).readPemObject().getContent(); | |||
// } catch (IOException e1) { | |||
// e1.printStackTrace(); | |||
// } | |||
// | |||
// assert privKeyBytes != null; | |||
// System.out.println(Hex.toHexString(privKeyBytes)); | |||
// | |||
// | |||
// OpenSSHPrivateKeySpec privKeySpec = new OpenSSHPrivateKeySpec(privKeyBytes); | |||
// | |||
// String privKeyFormat = privKeySpec.getFormat(); | |||
// System.out.println(privKeyFormat); | |||
// | |||
// RSAKeyParameters privKey = (RSAKeyParameters) OpenSSHPrivateKeyUtil.parsePrivateKeyBlob(privKeyBytes); | |||
// | |||
//// BigInteger e = privKey.getPublicExponent(); | |||
//// BigInteger n = privKey.getModulus(); | |||
//// | |||
//// BigInteger d = privKey.getExponent(); | |||
//// BigInteger p = privKey.getP(); | |||
//// BigInteger q = privKey.getQ(); | |||
//// BigInteger dP = privKey.getDP(); | |||
//// BigInteger dQ = privKey.getDQ(); | |||
//// BigInteger qInv = privKey.getQInv(); | |||
// | |||
//// System.out.println(Hex.toHexString(e.toByteArray())); | |||
//// System.out.println(Hex.toHexString(n.toByteArray())); | |||
//// | |||
//// System.out.println(Hex.toHexString(d.toByteArray())); | |||
//// System.out.println(Hex.toHexString(p.toByteArray())); | |||
//// System.out.println(Hex.toHexString(q.toByteArray())); | |||
//// System.out.println(Hex.toHexString(dP.toByteArray())); | |||
//// System.out.println(Hex.toHexString(dQ.toByteArray())); | |||
//// System.out.println(Hex.toHexString(qInv.toByteArray())); | |||
// | |||
// | |||
// | |||
// } | |||
// | |||
//} |
@@ -14,7 +14,7 @@ | |||
<dependencies> | |||
<dependency> | |||
<groupId>com.jd.blockchain</groupId> | |||
<artifactId>crypto-classic</artifactId> | |||
<artifactId>crypto-framework</artifactId> | |||
<version>${project.version}</version> | |||
</dependency> | |||
<dependency> | |||
@@ -2,6 +2,7 @@ package com.jd.blockchain.crypto.service.pki; | |||
import com.jd.blockchain.crypto.CryptoFunction; | |||
import com.jd.blockchain.crypto.CryptoService; | |||
import com.jd.blockchain.provider.NamedProvider; | |||
import java.util.Arrays; | |||
import java.util.Collection; | |||
@@ -14,6 +15,7 @@ import java.util.List; | |||
* @description: TODO | |||
* @date 2019-05-15, 16:35 | |||
*/ | |||
@NamedProvider("PKI-SOFTWARE") | |||
public class PKICryptoService implements CryptoService { | |||
public static final SHA1WITHRSA2048SignatureFunction SHA1WITHRSA2048 = new SHA1WITHRSA2048SignatureFunction(); | |||
@@ -4,18 +4,16 @@ 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.rsa.BCRSAPrivateCrtKey; | |||
import org.bouncycastle.jcajce.provider.asymmetric.util.KeyUtil; | |||
import org.bouncycastle.jce.provider.BouncyCastleProvider; | |||
import sun.security.rsa.RSAPrivateCrtKeyImpl; | |||
import sun.security.rsa.RSAPrivateKeyImpl; | |||
import sun.security.rsa.RSAPublicKeyImpl; | |||
import java.math.BigInteger; | |||
import java.security.*; | |||
import java.security.interfaces.RSAPrivateCrtKey; | |||
import java.security.interfaces.RSAPrivateKey; | |||
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; | |||
@@ -53,16 +51,21 @@ public class SHA1WITHRSA2048SignatureFunction implements SignatureFunction { | |||
throw new CryptoException("This key is not SHA1WITHRSA2048 private key!"); | |||
} | |||
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(rawPrivKeyBytes); | |||
KeyFactory keyFactory; | |||
RSAPrivateCrtKey rawPrivKey; | |||
Signature signer; | |||
byte[] signature; | |||
try { | |||
rawPrivKey = (RSAPrivateCrtKey) RSAPrivateCrtKeyImpl.newKey(rawPrivKeyBytes); | |||
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 e) { | |||
} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException | InvalidKeySpecException e) { | |||
throw new CryptoException(e.getMessage(), e); | |||
} | |||
@@ -86,17 +89,23 @@ public class SHA1WITHRSA2048SignatureFunction implements SignatureFunction { | |||
if (digest.getAlgorithm() != SHA1WITHRSA2048.code() || rawDigestBytes.length != RAW_SIGNATUREDIGEST_SIZE) { | |||
throw new CryptoException("This is not SHA1WITHRSA2048 signature digest!"); | |||
} | |||
RSAPublicKeyImpl rawPubKey; | |||
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(rawPubKeyBytes); | |||
KeyFactory keyFactory; | |||
RSAPublicKey rawPubKey; | |||
Signature verifier; | |||
boolean isValid = false; | |||
boolean isValid; | |||
try { | |||
rawPubKey = new RSAPublicKeyImpl(rawPubKeyBytes); | |||
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 e) { | |||
e.printStackTrace(); | |||
} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException | InvalidKeySpecException e) { | |||
throw new CryptoException(e.getMessage(), e); | |||
} | |||
return isValid; | |||
@@ -146,14 +155,20 @@ public class SHA1WITHRSA2048SignatureFunction implements SignatureFunction { | |||
if (privKey.getAlgorithm() != SHA1WITHRSA2048.code()) { | |||
throw new CryptoException("This key is not SHA1WITHRSA2048 private key!"); | |||
} | |||
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(rawPrivKeyBytes); | |||
KeyFactory keyFactory; | |||
RSAPrivateCrtKey rawPrivKey; | |||
byte[] rawPubKeyBytes; | |||
try { | |||
RSAPrivateCrtKey rawPrivKey = (RSAPrivateCrtKey) RSAPrivateCrtKeyImpl.newKey(rawPrivKeyBytes); | |||
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 (InvalidKeyException e) { | |||
} catch (NoSuchAlgorithmException | InvalidKeySpecException e) { | |||
throw new CryptoException(e.getMessage(), e); | |||
} | |||
@@ -0,0 +1,273 @@ | |||
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.*; | |||
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.*; | |||
import static org.junit.Assert.assertArrayEquals; | |||
/** | |||
* @author zhanglin33 | |||
* @title: SHA1WITHRSA2048SignatureFunctionTest | |||
* @description: TODO | |||
* @date 2019-05-16, 10:49 | |||
*/ | |||
public class SHA1WITHRSA2048SignatureFunctionTest { | |||
@Test | |||
public void getAlgorithmTest() { | |||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SHA1WITHRSA2048"); | |||
assertNotNull(algorithm); | |||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||
assertEquals(signatureFunction.getAlgorithm().name(), algorithm.name()); | |||
assertEquals(signatureFunction.getAlgorithm().code(), algorithm.code()); | |||
algorithm = Crypto.getAlgorithm("SHA1withRsa2048"); | |||
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("SHA1WITHRSA2048"); | |||
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 > 259); | |||
assertEquals(PRIVATE.CODE, privKey.getKeyType().CODE); | |||
assertTrue(privKey.getRawKeyBytes().length > 1155); | |||
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("SHA1WITHRSA2048"); | |||
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("SHA1WITHRSA2048"); | |||
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(); | |||
assertEquals(2 + 256, signatureBytes.length); | |||
assertEquals(algorithm.code(), signatureDigest.getAlgorithm()); | |||
assertEquals(PKIAlgorithm.SHA1WITHRSA2048.code(), signatureDigest.getAlgorithm()); | |||
assertEquals((short) (SIGNATURE_ALGORITHM | ASYMMETRIC_KEY | ((byte) 31 & 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("SHA1WITHRSA2048"); | |||
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); | |||
assertTrue(signatureFunction.verify(signatureDigest, pubKey, data)); | |||
} | |||
@Test | |||
public void supportPrivKeyTest() { | |||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SHA1WITHRSA2048"); | |||
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("SHA1WITHRSA2048"); | |||
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.SHA1WITHRSA2048.code(), resolvedPrivKey.getAlgorithm()); | |||
assertEquals((short) (SIGNATURE_ALGORITHM | ASYMMETRIC_KEY | ((byte) 31 & 0x00FF)), | |||
resolvedPrivKey.getAlgorithm()); | |||
assertArrayEquals(privKeyBytes, resolvedPrivKey.toBytes()); | |||
} | |||
@Test | |||
public void supportPubKeyTest() { | |||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SHA1WITHRSA2048"); | |||
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("SHA1WITHRSA2048"); | |||
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.SHA1WITHRSA2048.code(), resolvedPubKey.getAlgorithm()); | |||
assertEquals((short) (SIGNATURE_ALGORITHM | ASYMMETRIC_KEY | ((byte) 31 & 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("SHA1WITHRSA2048"); | |||
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("SHA1WITHRSA2048"); | |||
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); | |||
assertEquals(256, resolvedSignatureDigest.getRawDigest().length); | |||
assertEquals(PKIAlgorithm.SHA1WITHRSA2048.code(), resolvedSignatureDigest.getAlgorithm()); | |||
assertEquals((short) (SIGNATURE_ALGORITHM | ASYMMETRIC_KEY | ((byte) 31 & 0x00FF)), | |||
resolvedSignatureDigest.getAlgorithm()); | |||
assertArrayEquals(signatureDigestBytes, resolvedSignatureDigest.toBytes()); | |||
} | |||
} |
@@ -40,7 +40,6 @@ public class CSRBuilderTest { | |||
String csr = builder.buildRequest(countryName,stateName,cityName, | |||
organizationName,departmentName,domainName, | |||
emailName); | |||
System.out.println(csr); | |||
PublicKey pubKey = builder.getPubKey(); | |||
PrivateKey privKey = builder.getPrivKey(); | |||