diff --git a/pom.xml b/pom.xml
index 8fa4433..115f598 100644
--- a/pom.xml
+++ b/pom.xml
@@ -76,6 +76,14 @@
+
+
+
+ org.mapdb
+ mapdb
+ 3.0.8
+
+
\ No newline at end of file
diff --git a/src/main/java/minsecurity/identity/Identity.java b/src/main/java/minsecurity/identity/Identity.java
index b16efd0..f678dd4 100644
--- a/src/main/java/minsecurity/identity/Identity.java
+++ b/src/main/java/minsecurity/identity/Identity.java
@@ -20,6 +20,7 @@ import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.io.IOException;
+import java.io.Serializable;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
@@ -43,10 +44,12 @@ public class Identity {
private PublicKeyInterface Pubkey;
private String Passwd;
private Certificate Cert;
+ private boolean IsDefault;
public Identity(String name, KeyParam keyParam,
PrivateKeyInterface prikey, byte[] prikeyRawByte,
- PublicKeyInterface pubkey, String passwd, Certificate cert) {
+ PublicKeyInterface pubkey, String passwd, Certificate cert,
+ boolean isDefault) {
Name = name;
KeyParam = keyParam;
Prikey = prikey;
@@ -54,6 +57,7 @@ public class Identity {
Pubkey = pubkey;
Passwd = passwd;
Cert = cert;
+ IsDefault = isDefault;
}
@@ -240,16 +244,27 @@ public class Identity {
Cert = cert;
}
+ public boolean isDefault() {
+ return IsDefault;
+ }
+
+ public void setDefault(boolean aDefault) {
+ IsDefault = aDefault;
+ }
+
@Override
public String toString() {
return "Identity{" +
"Name='" + Name + '\'' +
- ", KeyParam=" + KeyParam +
- ", Prikey=" + Prikey +
+ ", KeyParam.signAlgo=" + KeyParam.SignatureAlgorithm +
+ ", KeyParam.pubAlgo=" + KeyParam.PublicKeyAlgorithm +
+ ", Prikey=" + ByteUtils.toHexString(Prikey.getBytes()) +
+ ", pubKey=" + ByteUtils.toHexString(Pubkey.getBytes()) +
", PrikeyRawByte=" + (PrikeyRawByte == null ? "null":ByteUtils.toHexString(PrikeyRawByte)) +
", Pubkey=" + Pubkey +
", Passwd='" + Passwd + '\'' +
", Cert=" + Cert +
+ ", isDefault=" + IsDefault +
'}';
}
}
diff --git a/src/main/java/minsecurity/identity/persist/IdentitySerializer.java b/src/main/java/minsecurity/identity/persist/IdentitySerializer.java
new file mode 100644
index 0000000..fea81d4
--- /dev/null
+++ b/src/main/java/minsecurity/identity/persist/IdentitySerializer.java
@@ -0,0 +1,97 @@
+package minsecurity.identity.persist;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import minsecurity.Common;
+import minsecurity.certificate.cert.CertException;
+import minsecurity.certificate.cert.CertUtils;
+import minsecurity.certificate.cert.Certificate;
+import minsecurity.crypto.sm2.SM2PrivateKey;
+import minsecurity.crypto.sm2.SM2PublicKey;
+import minsecurity.identity.Identity;
+import minsecurity.identity.KeyParam;
+import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
+import org.jetbrains.annotations.NotNull;
+import org.mapdb.DataInput2;
+import org.mapdb.DataOutput2;
+import org.mapdb.Serializer;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import java.io.IOException;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+
+/*
+ * @Author: hongyu guo
+ * @Description: mapDB需要自定义序列化、反序列化方法
+ * @Version: 1.0.0
+ * @Date: 20:50 2021/03/09
+ * @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
+ */
+public class IdentitySerializer implements Serializer {
+
+
+ @Override
+ public void serialize(@NotNull DataOutput2 dataOutput2, @NotNull Identity identity) throws IOException {
+ String name = identity.getName();
+ String pub = ByteUtils.toHexString(identity.getPubkey().getBytes());
+ String priv = ByteUtils.toHexString(identity.getPrikey().getBytes());
+ int pubAlgo = identity.getKeyParam().PublicKeyAlgorithm;
+ int signAlgo = identity.getKeyParam().SignatureAlgorithm;
+ String passwd = identity.getPasswd();
+ String cert = "";
+ try {
+ cert = CertUtils.toPem(identity.getCert(),null, Common.SM4CBC);
+ } catch (CertException | NoSuchPaddingException | InvalidAlgorithmParameterException |
+ NoSuchAlgorithmException | IllegalBlockSizeException | BadPaddingException |
+ NoSuchProviderException | InvalidKeyException e) {
+ e.printStackTrace();
+ }
+ boolean isDefault = identity.isDefault();
+ String prikeyRawByte = identity.getPrikeyRawByte()== null ?
+ "" :ByteUtils.toHexString(identity.getPrikeyRawByte());
+
+
+ dataOutput2.writeUTF(name);
+ dataOutput2.writeUTF(pub);
+ dataOutput2.writeUTF(priv);
+ dataOutput2.writeInt(pubAlgo);
+ dataOutput2.writeInt(signAlgo);
+ dataOutput2.writeUTF(passwd);
+ dataOutput2.writeUTF(cert);
+ dataOutput2.writeBoolean(isDefault);
+ dataOutput2.writeUTF(prikeyRawByte);
+ }
+
+ @Override
+ public Identity deserialize(@NotNull DataInput2 dataInput2, int i) throws IOException {
+ String name = dataInput2.readUTF();
+ byte[] pub = ByteUtils.fromHexString(dataInput2.readUTF());
+ byte[] priv = ByteUtils.fromHexString(dataInput2.readUTF());
+ int pubAlgo = dataInput2.readInt();
+ int signAlgo = dataInput2.readInt();
+ String passwd = dataInput2.readUTF();
+ String certString = dataInput2.readUTF();
+ Certificate certificate = null;
+ try {
+ certificate = CertUtils.fromPem(certString, null, Common.SM4CBC);
+ } catch (CertException | BadPaddingException | NoSuchPaddingException |
+ InvalidAlgorithmParameterException | NoSuchAlgorithmException |
+ IllegalBlockSizeException | NoSuchProviderException | InvalidKeyException e) {
+ e.printStackTrace();
+ }
+ boolean isDefault = dataInput2.readBoolean();
+ byte[] prikeyRawByte = dataInput2.readUTF().equals("") ?
+ null : ByteUtils.fromHexString(dataInput2.readUTF());
+ KeyParam keyParam = new KeyParam(pubAlgo, signAlgo);
+ SM2PrivateKey sm2PrivateKey = new SM2PrivateKey();
+ sm2PrivateKey.setBytes(priv);
+ SM2PublicKey sm2PublicKey = new SM2PublicKey();
+ sm2PublicKey.setBytes(pub);
+ return new Identity(name,keyParam, sm2PrivateKey,prikeyRawByte, sm2PublicKey, passwd, certificate, isDefault);
+ }
+
+}
diff --git a/src/test/java/minsecurity/identity/TestIdentity.java b/src/test/java/minsecurity/identity/TestIdentity.java
index d8df6ae..45394bc 100644
--- a/src/test/java/minsecurity/identity/TestIdentity.java
+++ b/src/test/java/minsecurity/identity/TestIdentity.java
@@ -41,7 +41,7 @@ public class TestIdentity {
SM2PrivateKey sm2PrivateKey = new SM2PrivateKey(d);
SM2PublicKey sm2PublicKey = new SM2PublicKey(x,y);
KeyParam keyParam = new KeyParam(Common.SM2, Common.SM3withSM2);
- Identity identity = new Identity("root",keyParam,sm2PrivateKey,null,sm2PublicKey, "123456", null);
+ Identity identity = new Identity("root",keyParam,sm2PrivateKey,null,sm2PublicKey, "123456", null, false);
Certificate certificate = new Certificate(1, 1, sm2PublicKey, null,
Common.SM3withSM2, Common.SM2, "root", "root",
System.currentTimeMillis() - 1000, System.currentTimeMillis() + 5000,
@@ -73,6 +73,8 @@ public class TestIdentity {
idFromBytes = Identity.load(bytesOfDump, null);
assertEquals(ByteUtils.toHexString(identity.getPrikey().getBytes()), ByteUtils.toHexString(idFromBytes.getPrikey().getBytes()));
assertEquals(ByteUtils.toHexString(identity.getPubkey().getBytes()), ByteUtils.toHexString(idFromBytes.getPubkey().getBytes()));
+
+ logger.debug(identity.getPrikey().getBytes().length + " " + identity.getPubkey().getBytes().length);
}
diff --git a/src/test/java/minsecurity/identity/TestPersist.java b/src/test/java/minsecurity/identity/TestPersist.java
new file mode 100644
index 0000000..8578ba6
--- /dev/null
+++ b/src/test/java/minsecurity/identity/TestPersist.java
@@ -0,0 +1,68 @@
+package minsecurity.identity;
+
+
+import minsecurity.Common;
+import minsecurity.certificate.cert.CertUtils;
+import minsecurity.certificate.cert.Certificate;
+import minsecurity.crypto.sm2.SM2Base;
+import minsecurity.crypto.sm2.SM2PrivateKey;
+import minsecurity.crypto.sm2.SM2PublicKey;
+import minsecurity.identity.persist.IdentitySerializer;
+import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
+import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
+import org.bouncycastle.crypto.params.ECPublicKeyParameters;
+import org.junit.Test;
+import org.mapdb.BTreeMap;
+import org.mapdb.DB;
+import org.mapdb.DBMaker;
+import org.mapdb.Serializer;
+import org.slf4j.LoggerFactory;
+
+import java.util.concurrent.ConcurrentMap;
+
+/*
+ * @Author: hongyu guo
+ * @Description:
+ * @Version: 1.0.0
+ * @Date: 17:35 2021/03/09
+ * @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
+ */
+public class TestPersist {
+ private static final org.slf4j.Logger logger = LoggerFactory.getLogger(TestIdentity.class);
+
+ @Test
+ public void testMapDB() throws Exception {
+
+
+ AsymmetricCipherKeyPair keyPair = SM2Base.generateKeyPairParameter();
+ ECPrivateKeyParameters priKey = (ECPrivateKeyParameters) keyPair.getPrivate();
+ ECPublicKeyParameters pubKey = (ECPublicKeyParameters) keyPair.getPublic();
+ byte[] d = priKey.getD().toByteArray();
+ // d = Arrays.copyOf(d,32);
+ byte[] x = pubKey.getQ().getAffineXCoord().getEncoded();
+ byte[] y = pubKey.getQ().getAffineYCoord().getEncoded();
+ // BigInteger bigInteger = priKey.getD();
+ SM2PrivateKey sm2PrivateKey = new SM2PrivateKey(d);
+ SM2PublicKey sm2PublicKey = new SM2PublicKey(x,y);
+ KeyParam keyParam = new KeyParam(Common.SM2, Common.SM3withSM2);
+ Identity identity = new Identity("root",keyParam,sm2PrivateKey,null,sm2PublicKey, "123456", null, false);
+ Certificate certificate = new Certificate(1, 1, sm2PublicKey, null,
+ Common.SM3withSM2, Common.SM2, "root", "root",
+ System.currentTimeMillis() - 1000, System.currentTimeMillis() + 5000,
+ Common.CertSign, true, System.currentTimeMillis());
+ CertUtils.signCert(certificate, sm2PrivateKey);
+ identity.setCert(certificate);
+ DB db = DBMaker.fileDB("./target/test.db").closeOnJvmShutdown().transactionEnable().make();
+ Serializer customSerializer = new IdentitySerializer();
+ ConcurrentMap map = db.hashMap("identity")
+ .keySerializer(Serializer.STRING)
+ .valueSerializer(customSerializer)
+ .createOrOpen();
+ // map.put("/min/test05", new Identity());
+ map.put("/min/test06", identity);
+ db.commit();
+ logger.debug(identity.toString());
+ Identity id = map.get("/min/test06");
+ logger.debug(id.toString());
+ }
+}