mirror of
https://gitee.com/willfree/min-dev-java.git
synced 2026-10-04 19:42:01 +08:00
108 lines
4.5 KiB
Java
108 lines
4.5 KiB
Java
package minsecurity.certificate.cert;
|
|
|
|
import minsecurity.Common;
|
|
import minsecurity.crypto.PublicKeyInterface;
|
|
import minsecurity.crypto.sm2.Sm2PublicKey;
|
|
|
|
/*
|
|
* @Author: hongyu guo
|
|
* @Description:
|
|
* @Version: 1.0.0
|
|
* @Date: 17:09 2021/03/05
|
|
* @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
|
|
*/
|
|
public class CertUtils {
|
|
|
|
public static final int VERSION1 = 1;
|
|
|
|
public static InnerCertificate parseCertToInnerCert(Certificate certificate){
|
|
TbsCertificate tbsCertificate = new TbsCertificate();
|
|
tbsCertificate.setVersion(certificate.getVersion());
|
|
tbsCertificate.setSerialNumber(certificate.getSerialNumber());
|
|
tbsCertificate.setPublicKey(certificate.getPublicKey().getBytes());
|
|
tbsCertificate.setSignatureAlgorithm(certificate.getSignatureAlgorithm());
|
|
tbsCertificate.setPublicKeyAlgorithm(certificate.getPublicKeyAlgorithm());
|
|
tbsCertificate.setIssueTo(certificate.getIssueTo());
|
|
tbsCertificate.setIssuer(certificate.getIssuer());
|
|
tbsCertificate.setNotAfter(certificate.getNotAfter());
|
|
tbsCertificate.setNotBefore(certificate.getNotBefore());
|
|
tbsCertificate.setKeyUsage(certificate.getKeyUsage());
|
|
tbsCertificate.setCA(certificate.isCA());
|
|
tbsCertificate.setTimestamp(certificate.getTimestamp());
|
|
|
|
InnerCertificate innerCertificate = new InnerCertificate();
|
|
innerCertificate.setSignatureAlgorithm(certificate.getSignatureAlgorithm());
|
|
innerCertificate.setSignatureValue(certificate.getSignature());
|
|
innerCertificate.setTbsCertificate(tbsCertificate);
|
|
return innerCertificate;
|
|
}
|
|
|
|
public static Certificate parseInnerCertToCert(InnerCertificate i){
|
|
Certificate certificate = new Certificate();
|
|
|
|
certificate.setVersion(i.getTbsCertificate().getVersion());
|
|
certificate.setSerialNumber(i.getTbsCertificate().getSerialNumber());
|
|
PublicKeyInterface publicKey = unMarshalPublicKey(i.getTbsCertificate().getPublicKey(),i.getSignatureAlgorithm());
|
|
certificate.setPublicKey(publicKey);
|
|
certificate.setSignature(i.getSignatureValue());
|
|
certificate.setSignatureAlgorithm(i.getTbsCertificate().getSignatureAlgorithm());
|
|
certificate.setPublicKeyAlgorithm(i.getTbsCertificate().getPublicKeyAlgorithm());
|
|
certificate.setIssueTo(i.getTbsCertificate().getIssueTo());
|
|
certificate.setIssuer(i.getTbsCertificate().getIssuer());
|
|
certificate.setNotBefore(i.getTbsCertificate().getNotBefore());
|
|
certificate.setNotAfter(i.getTbsCertificate().getNotAfter());
|
|
certificate.setKeyUsage(i.getTbsCertificate().getKeyUsage());
|
|
certificate.setCA(i.getTbsCertificate().isCA());
|
|
certificate.setTimestamp(i.getTbsCertificate().getTimestamp());
|
|
|
|
return certificate;
|
|
}
|
|
|
|
public static PublicKeyInterface unMarshalPublicKey(byte[] bytesOfPublicKey, int algorithm) {
|
|
if (bytesOfPublicKey == null || bytesOfPublicKey.length == 0) {
|
|
return null;
|
|
}
|
|
switch (algorithm) {
|
|
case Common.SM2:
|
|
Sm2PublicKey sm2PublicKey = new Sm2PublicKey();
|
|
sm2PublicKey.setBytes(bytesOfPublicKey);
|
|
return sm2PublicKey;
|
|
default:
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static boolean checkDuration(InnerCertificate innerCertificate){
|
|
long curTime = System.currentTimeMillis();
|
|
if(innerCertificate.getTbsCertificate().getNotAfter() > curTime)
|
|
return false;
|
|
if(innerCertificate.getTbsCertificate().getNotBefore() < curTime)
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
|
|
public static boolean checkSign(InnerCertificate cert, PublicKeyInterface publicKey) throws Exception {
|
|
switch (cert.getTbsCertificate().getSignatureAlgorithm()){
|
|
case Common.SM3withSM2:
|
|
// TODO: 证书序列化方法
|
|
byte[] bytesOfCert = serialization(cert);
|
|
// byte[] digest = HashAlgo.sm3(bytesOfCert);
|
|
return publicKey.verify(bytesOfCert, cert.getSignatureValue());
|
|
default:
|
|
throw new Exception("未定义的签名方法");
|
|
}
|
|
}
|
|
|
|
// TODO: 证书序列化方法
|
|
public static byte[] serialization(InnerCertificate innerCertificate){
|
|
return new byte[0];
|
|
}
|
|
|
|
// TODO: 证书反序列化
|
|
public static InnerCertificate deserialization(byte[] bytesOfCert){
|
|
return new InnerCertificate();
|
|
}
|
|
|
|
}
|