Files
min-dev-java/src/test/java/minsecurity/certificate/x509/TestX509.java
T

124 lines
5.1 KiB
Java

package minsecurity.certificate.x509;
import minsecurity.Common;
import minsecurity.certificate.X509.X509CertMaker;
import minsecurity.certificate.X509.X509CertUtil;
import minsecurity.crypto.sm2.SM2Base;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import org.bouncycastle.util.io.pem.PemObject;
import org.bouncycastle.util.io.pem.PemWriter;
import org.junit.Test;
import static org.junit.Assert.*;
import org.slf4j.LoggerFactory;
import util.FileUtil;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.security.*;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.security.spec.PKCS8EncodedKeySpec;
import static minsecurity.certificate.X509.X509CertMaker.makeRootCA;
/*
* @Author: hongyu guo
* @Description:
* @Version: 1.0.0
* @Date: 22:55 2021/03/04
* @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
*/
public class TestX509 {
// WARNING: X509不需要测试!!!!!!!
// WARNING: X509不需要测试!!!!!!!
// WARNING: X509不需要测试!!!!!!!
// WARNING: X509不需要测试!!!!!!!
// WARNING: X509不需要测试!!!!!!!
static {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
}
private static final org.slf4j.Logger logger = LoggerFactory.getLogger(TestX509.class);
private static final Provider BC = new BouncyCastleProvider();
@Test
public void testRebuildKeyPair(){
try {
KeyPair rootKP = SM2Base.generateKeyPair();
X509Certificate rootCA = makeRootCA(rootKP,"CN","MIN",
"MIN-GROUP","MIN ROOT CA",
365L * 24 * 60 * 60 * 1000, "SM3withSM2");
FileUtil.writeFile("./target/root.cer",rootCA.getEncoded());
FileUtil.writeFile("./target/root.priv",rootKP.getPrivate().getEncoded());
rootCA.verify(rootKP.getPublic());
System.out.println(rootKP.getPrivate().getFormat());
CertificateFactory fact = CertificateFactory.getInstance(Common.X509, Common.BC_NAME);
X509Certificate cert =
(X509Certificate) fact.generateCertificate(
new ByteArrayInputStream(rootCA.getEncoded()));
PublicKey publicKey = cert.getPublicKey();
KeyFactory keyFac = KeyFactory.getInstance("EC", BouncyCastleProvider.PROVIDER_NAME);
byte[] privBytes = FileUtil.readFile("./target/root.priv");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privBytes);
PrivateKey privateKey = keyFac.generatePrivate(keySpec);
KeyPair rootKeyPair = new KeyPair(publicKey, privateKey);
logger.debug("origin: {}", ByteUtils.toHexString(rootKP.getPrivate().getEncoded()));
logger.debug("rebuild:{}", ByteUtils.toHexString(rootKeyPair.getPrivate().getEncoded()));
logger.debug("origin: {}", ByteUtils.toHexString(rootKP.getPublic().getEncoded()));
logger.debug("rebuild:{}", ByteUtils.toHexString(rootKeyPair.getPublic().getEncoded()));
KeyPair subKeyPair = SM2Base.generateKeyPair();
X509Certificate subCert =
X509CertMaker.makeSubCACert(rootKeyPair,
cert,
subKeyPair,
"c","o","ou","cn",
365L * 24 * 60 * 60 * 1000,
"SM3withSM2");
FileUtil.writeFile("./target/sub.cer",subCert.getEncoded());
subCert.verify(rootKeyPair.getPublic());
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testVerify() throws IOException, CertificateException, NoSuchProviderException {
// 保存在本地的已有证书
byte[] bytesOfCert = FileUtil.readFile("./target/root.cer");
CertificateFactory fact = CertificateFactory.getInstance(Common.X509, "BC");
X509Certificate cert =
(X509Certificate) fact.generateCertificate(
new ByteArrayInputStream(bytesOfCert));
assertFalse(X509CertUtil.isExpired(cert));
assertTrue(X509CertUtil.isValid(cert,cert.getPublicKey()));
}
@Test
public void testX509toPem() throws IOException, CertificateException, NoSuchProviderException {
byte[] bytesOfCert = FileUtil.readFile("./target/root.cer");
CertificateFactory fact = CertificateFactory.getInstance(Common.X509, "BC");
X509Certificate cert =
(X509Certificate) fact.generateCertificate(
new ByteArrayInputStream(bytesOfCert));
StringWriter sw = new StringWriter();
PemObject pemCSR = new PemObject("CERTIFICATE REQUEST", cert.getEncoded());
PemWriter pemWriter = new PemWriter(sw);
pemWriter.writeObject(pemCSR);
pemWriter.close();
logger.debug(sw.toString());
}
}