mirror of
https://gitee.com/willfree/min-dev-java.git
synced 2026-06-18 06:00:25 +08:00
344 lines
14 KiB
Java
344 lines
14 KiB
Java
package security;
|
|
|
|
import component.Identifier;
|
|
import component.TTL;
|
|
import encoding.TLV;
|
|
import encoding.VlInt;
|
|
import minsecurity.Common;
|
|
import minsecurity.certificate.cert.CertUtils;
|
|
import minsecurity.certificate.cert.Certificate;
|
|
import minsecurity.crypto.sm2.SM2KeyPair;
|
|
import minsecurity.identity.Identity;
|
|
import minsecurity.identity.KeyParam;
|
|
import minsecurity.identity.TestIdentity;
|
|
//import org.checkerframework.checker.units.qual.C;
|
|
//import org.checkerframework.checker.units.qual.K;
|
|
import org.junit.Test;
|
|
import org.slf4j.LoggerFactory;
|
|
import packet.CPacket;
|
|
import packet.Data;
|
|
import packet.Interest;
|
|
import packet.MINPacket;
|
|
|
|
import java.util.HashMap;
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
public class KeyChainTest {
|
|
private static final org.slf4j.Logger logger = LoggerFactory.getLogger(TestIdentity.class);
|
|
/**
|
|
* 随机生成身份数据
|
|
* @return Identity
|
|
*/
|
|
private Identity createRandomIdentity() throws Exception{
|
|
// 测试PersistIdentity
|
|
SM2KeyPair pair = SM2KeyPair.generateKeyPair();
|
|
Identity identity = new Identity();
|
|
identity.setName("/wzq"+Math.random()); // 身份名称必须以/开头 Identifier规定
|
|
KeyParam keyParam = new KeyParam();
|
|
keyParam.PublicKeyAlgorithm = 0;
|
|
keyParam.SignatureAlgorithm = 0;
|
|
identity.setKeyParam(keyParam);
|
|
identity.setPrikey(pair.getSm2PrivateKey());
|
|
identity.setPubkey(pair.getSm2PublicKey());
|
|
identity.setPasswd("2DD29CA851E7B56E4697B0E1F08507293D761A05CE4D1B628663F411A8086D99");
|
|
// identity.lock("0123456789abcdef", Common.SM4ECB);
|
|
Certificate cert = new Certificate();
|
|
cert.setVersion(1);
|
|
cert.setSerialNumber(1);
|
|
cert.setPublicKey(pair.getSm2PublicKey());
|
|
cert.setSignatureAlgorithm(Common.SM3withSM2); // TODO 名字有误? SM2withSM3?
|
|
cert.setPublicKeyAlgorithm(Common.SM2);
|
|
cert.setIssueTo("root");
|
|
cert.setIssuer("root");
|
|
long timestamp = System.currentTimeMillis() / 1000;
|
|
cert.setTimestamp(timestamp); // 10bit timestamp
|
|
cert.setNotAfter(timestamp); // 10bit timestamp
|
|
cert.setNotBefore(timestamp + 1000); // 10bit timestamp
|
|
cert.setKeyUsage(Common.CertSign);
|
|
cert.setCA(true);
|
|
CertUtils.signCert(cert, pair.getSm2PrivateKey());
|
|
|
|
identity.setCert(cert);
|
|
return identity;
|
|
}
|
|
@Test
|
|
public void testCreateKeyChain(){
|
|
try{
|
|
KeyChain keyChain = new KeyChain();
|
|
Identity identity = new Identity();
|
|
identity.setName("wzq");
|
|
identity.setPasswd("123456123456");
|
|
|
|
ConcurrentHashMap<String, Identity> identityHashMap = new ConcurrentHashMap<>();
|
|
identityHashMap.put("/wzq", identity);
|
|
|
|
logger.debug(String.format("身份数量:%d", keyChain.getIdentifyManager().getIdentifies().size()));
|
|
keyChain.getIdentifyManager().setIdentifies(identityHashMap);
|
|
keyChain.getIdentifyManager().setDefaultIdentity(identity);
|
|
|
|
String passwd = "2DD29CA851E7B56E";
|
|
Identity identity1 = keyChain.getIdentifyManager().createIdentityByName("/wzq1", passwd, false);
|
|
identity1.unLock(passwd, Common.SM4ECB);
|
|
System.out.println(identity1.getPrikey());
|
|
logger.debug(String.format("身份数量:%d", keyChain.getIdentifyManager().getIdentifies().size()));
|
|
}catch (Exception ex){
|
|
System.out.println(ex.getMessage());
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void testInitialKeyChain(){
|
|
try {
|
|
// 测试设置新身份为当前身份
|
|
KeyChain keyChain = new KeyChain();
|
|
Identity id = createRandomIdentity();
|
|
keyChain.getIdentifyManager().setDefaultIdentity(id, true);
|
|
// 输入密码用于解锁身份
|
|
keyChain.setCurrentIdentity(keyChain.getIdentifyManager().getDefaultIdentity(), "0123456789abcdef");
|
|
}catch (Exception ex){
|
|
logger.debug(ex.getMessage());
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void testSignAndVerifyInterest(){
|
|
try {
|
|
// 测试设置新身份为当前身份
|
|
KeyChain keyChain = new KeyChain();
|
|
Identity id = createRandomIdentity();
|
|
keyChain.getIdentifyManager().setDefaultIdentity(id, true);
|
|
// 输入密码用于解锁身份
|
|
keyChain.setCurrentIdentity(keyChain.getIdentifyManager().getDefaultIdentity(), "0123456789abcdef");
|
|
|
|
// 身份允许签名与验证签名
|
|
Identifier id1 = new Identifier("/min/pku/sz");
|
|
Identifier id2 = new Identifier("/install");
|
|
|
|
//////////////////// 构建兴趣包 ////////////////////////
|
|
Interest interest = new Interest();
|
|
interest.minPacket.packetType = new VlInt(3);
|
|
interest.setName(id1);
|
|
interest.canBePrefix.setCanBePrefix(true);
|
|
interest.mustBeRefresh.setMustBeRefresh(true);
|
|
interest.nonce.setNonce(1234);
|
|
interest.hopLimit.setHopLimit(1234);
|
|
interest.congestionMark.setCongestionLevel(1234);
|
|
interest.ttl.setTtl(1234);
|
|
interest.payload.setValue(new byte[]{1, 2, 3, 4, 5});
|
|
|
|
|
|
// 正常测试签名与验签
|
|
keyChain.signInterest(interest);
|
|
keyChain.verifyInterest(interest);
|
|
}catch (Exception ex){
|
|
logger.debug(ex.getMessage());
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void testSignAndVerifyInterest2(){
|
|
try {
|
|
// 测试设置新身份为当前身份
|
|
KeyChain keyChain = new KeyChain();
|
|
Identity id = createRandomIdentity();
|
|
keyChain.getIdentifyManager().setDefaultIdentity(id, true);
|
|
// 输入密码用于解锁身份
|
|
keyChain.setCurrentIdentity(keyChain.getIdentifyManager().getDefaultIdentity(), "0123456789abcdef");
|
|
|
|
// 身份允许签名与验证签名
|
|
Identifier id1 = new Identifier("/min/pku/sz");
|
|
Identifier id2 = new Identifier("/install");
|
|
|
|
//////////////////// 构建兴趣包 只读区与标识区为空 ////////////////////////
|
|
Interest interest = new Interest();
|
|
interest.minPacket.packetType = new VlInt(3);
|
|
// interest.setName(id1);
|
|
// interest.canBePrefix.setCanBePrefix(true);
|
|
// interest.mustBeRefresh.setMustBeRefresh(true);
|
|
// interest.nonce.setNonce(1234);
|
|
// interest.hopLimit.setHopLimit(1234);
|
|
// interest.interestLifeTime.setInterestLifeTime(1234);
|
|
interest.congestionMark.setCongestionLevel(1234);
|
|
interest.ttl.setTtl(1234);
|
|
// interest.payload.setValue(new byte[]{1, 2, 3, 4, 5});
|
|
|
|
|
|
// 测试无数据的签名与验签 通过
|
|
keyChain.signInterest(interest);
|
|
keyChain.verifyInterest(interest);
|
|
}catch (Exception ex){
|
|
logger.debug(ex.getMessage());
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void testSignAndVerifyCPacket2(){
|
|
try {
|
|
// 测试设置新身份为当前身份
|
|
KeyChain keyChain = new KeyChain();
|
|
Identity id = createRandomIdentity();
|
|
keyChain.getIdentifyManager().setDefaultIdentity(id, true);
|
|
// 输入密码用于解锁身份
|
|
keyChain.setCurrentIdentity(keyChain.getIdentifyManager().getDefaultIdentity(), "0123456789abcdef");
|
|
|
|
// 身份允许签名与验证签名
|
|
// Identifier id1 = new Identifier("/min/pku/sz");
|
|
// Identifier id2 = new Identifier("/install");
|
|
|
|
CPacket cPacket = new CPacket();
|
|
cPacket.minPacket.packetType = new VlInt(3);
|
|
// cPacket.setSrcIdentifier(id1);
|
|
// cPacket.setDstIdentifier(id2);
|
|
cPacket.setTtl(new TTL(16546418374324163L));
|
|
// cPacket.payload.setValue(new byte[]{1, 2, 3, 4, 6});
|
|
|
|
// 测试无数据的签名与验证 通过
|
|
keyChain.signCPacket(cPacket);
|
|
keyChain.verifyCPacket(cPacket);
|
|
}catch (Exception ex){
|
|
logger.debug(ex.getMessage());
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void testSignAndVerifyCPacket(){
|
|
try {
|
|
// 测试设置新身份为当前身份
|
|
KeyChain keyChain = new KeyChain();
|
|
Identity id = createRandomIdentity();
|
|
keyChain.getIdentifyManager().setDefaultIdentity(id, true);
|
|
// 输入密码用于解锁身份
|
|
keyChain.setCurrentIdentity(keyChain.getIdentifyManager().getDefaultIdentity(), "0123456789abcdef");
|
|
|
|
// 身份允许签名与验证签名
|
|
Identifier id1 = new Identifier("/min/pku/sz");
|
|
Identifier id2 = new Identifier("/install");
|
|
|
|
CPacket cPacket = new CPacket();
|
|
cPacket.minPacket.packetType = new VlInt(3);
|
|
cPacket.setSrcIdentifier(id1);
|
|
cPacket.setDstIdentifier(id2);
|
|
cPacket.setTtl(new TTL(16546418374324163L));
|
|
cPacket.payload.setValue(new byte[]{1, 2, 3, 4, 6});
|
|
|
|
// 正常测试签名与验签
|
|
keyChain.signCPacket(cPacket);
|
|
keyChain.verifyCPacket(cPacket);
|
|
}catch (Exception ex){
|
|
logger.debug(ex.getMessage());
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void testSignAndVerifyData(){
|
|
try{
|
|
// 测试设置新身份为当前身份
|
|
KeyChain keyChain = new KeyChain();
|
|
Identity id = createRandomIdentity();
|
|
keyChain.getIdentifyManager().setDefaultIdentity(id, true);
|
|
// 输入密码用于解锁身份
|
|
keyChain.setCurrentIdentity(keyChain.getIdentifyManager().getDefaultIdentity(), "0123456789abcdef");
|
|
//////////////////// 构建Data包 ////////////////////////
|
|
Data data = new Data();
|
|
data.freshnessPeriod.setFreshnessPeriod(02346345465453L);
|
|
data.payload.setValue(new byte[]{1, 2, 3, 4, 5});
|
|
data.congestionMark.setCongestionLevel(1234L);
|
|
Identifier id2 = new Identifier("/wzq");
|
|
data.setName(id2);
|
|
data.minPacket.packetType = new VlInt(3);
|
|
// 正常测试签名与验签
|
|
keyChain.signData(data);
|
|
keyChain.verifyData(data);
|
|
}catch (Exception ex){
|
|
logger.debug(ex.getMessage());
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void testSignAndVerifyData2(){
|
|
try{
|
|
// 测试设置新身份为当前身份
|
|
KeyChain keyChain = new KeyChain();
|
|
Identity id = createRandomIdentity();
|
|
keyChain.getIdentifyManager().setDefaultIdentity(id, true);
|
|
// 输入密码用于解锁身份
|
|
keyChain.setCurrentIdentity(keyChain.getIdentifyManager().getDefaultIdentity(), "0123456789abcdef");
|
|
//////////////////// 构建Data包 无只读区与标识区 ////////////////////////
|
|
Data data = new Data();
|
|
// data.freshnessPeriod.setFreshnessPeriod(02346345465453L);
|
|
// data.payload.setValue(new byte[]{1, 2, 3, 4, 5});
|
|
data.congestionMark.setCongestionLevel(1234L);
|
|
Identifier id2 = new Identifier("/wzq");
|
|
data.setName(id2);
|
|
data.minPacket.packetType = new VlInt(3);
|
|
// 测试无数据的签名与验证 通过
|
|
keyChain.signData(data);
|
|
keyChain.verifyData(data);
|
|
}catch (Exception ex){
|
|
logger.debug(ex.getMessage());
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void testExportAndImportSafeBag(){
|
|
try{
|
|
Identity id = createRandomIdentity();
|
|
// 测试设置新身份为当前身份
|
|
KeyChain keyChain = new KeyChain();
|
|
Identity id2 = createRandomIdentity();
|
|
id2.unLock("0123456789abcdef", Common.SM4ECB); // 锁住的Identity无法导出
|
|
keyChain.getIdentifyManager().setDefaultIdentity(id, true);
|
|
// 输入密码用于解锁身份
|
|
keyChain.setCurrentIdentity(keyChain.getIdentifyManager().getDefaultIdentity(), "0123456789abcdef");
|
|
// 正常导入导出 通过
|
|
logger.debug(String.format("身份数量:%d", keyChain.getIdentifyManager().getIdentifies().size()));
|
|
SafeBag bag = keyChain.exportSafeBag(id2, "1234");
|
|
keyChain.importSafeBag(bag, "1234", true);
|
|
logger.debug(String.format("身份数量:%d", keyChain.getIdentifyManager().getIdentifies().size()));
|
|
}catch (Exception ex){
|
|
logger.debug(ex.getMessage());
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void testExportAndImportSafeBag2(){
|
|
try{
|
|
Identity id = createRandomIdentity();
|
|
// 测试设置新身份为当前身份
|
|
KeyChain keyChain = new KeyChain();
|
|
Identity id2 = createRandomIdentity();
|
|
id2.unLock("0123456789abcdef", Common.SM4ECB); // 锁住的Identity无法导出
|
|
keyChain.getIdentifyManager().setDefaultIdentity(id, true);
|
|
// 输入密码用于解锁身份
|
|
keyChain.setCurrentIdentity(keyChain.getIdentifyManager().getDefaultIdentity(), "0123456789abcdef");
|
|
// 导入null 抛出异常
|
|
logger.debug(String.format("身份数量:%d", keyChain.getIdentifyManager().getIdentifies().size()));
|
|
SafeBag bag = keyChain.exportSafeBag(null, "1234");
|
|
keyChain.importSafeBag(bag, "1234", true);
|
|
logger.debug(String.format("身份数量:%d", keyChain.getIdentifyManager().getIdentifies().size()));
|
|
}catch (Exception ex){
|
|
logger.debug(ex.getMessage());
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void testExportAndImportSafeBag3(){
|
|
try{
|
|
Identity id = createRandomIdentity();
|
|
// 测试设置新身份为当前身份
|
|
KeyChain keyChain = new KeyChain();
|
|
Identity id2 = new Identity();
|
|
keyChain.getIdentifyManager().setDefaultIdentity(id, true);
|
|
// 输入密码用于解锁身份
|
|
keyChain.setCurrentIdentity(keyChain.getIdentifyManager().getDefaultIdentity(), "0123456789abcdef");
|
|
// 导入空Identity 抛出异常
|
|
logger.debug(String.format("身份数量:%d", keyChain.getIdentifyManager().getIdentifies().size()));
|
|
SafeBag bag = keyChain.exportSafeBag(null, "1234");
|
|
keyChain.importSafeBag(bag, "1234", true);
|
|
logger.debug(String.format("身份数量:%d", keyChain.getIdentifyManager().getIdentifies().size()));
|
|
}catch (Exception ex){
|
|
logger.debug(ex.getMessage());
|
|
}
|
|
}
|
|
}
|