From 7f28f5481009ee69ebd6d32d39a47e059c5e033a Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Tue, 16 Mar 2021 10:02:29 +0800 Subject: [PATCH] finished component: SignatureField --- src/main/java/component/Signature.java | 21 +++ src/main/java/component/SignatureField.java | 183 ++++++++++++++++++++ 2 files changed, 204 insertions(+) create mode 100644 src/main/java/component/SignatureField.java diff --git a/src/main/java/component/Signature.java b/src/main/java/component/Signature.java index 3240dd3..af34680 100644 --- a/src/main/java/component/Signature.java +++ b/src/main/java/component/Signature.java @@ -10,6 +10,22 @@ import minsecurity.identity.Identity; * @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 */ public class Signature { + public SignatureInfo getSigInfo() { + return sigInfo; + } + + public void setSigInfo(SignatureInfo sigInfo) { + this.sigInfo = sigInfo; + } + + public SignatureValue getSigValue() { + return sigValue; + } + + public void setSigValue(SignatureValue sigValue) { + this.sigValue = sigValue; + } + private SignatureInfo sigInfo; private SignatureValue sigValue; @@ -25,4 +41,9 @@ public class Signature { new SignatureAlgorithm(identity.getKeyParam().SignatureAlgorithm),keyLocator); this.sigValue=new SignatureValue(value); } + + public Signature(SignatureInfo signatureInfo,SignatureValue signatureValue){ + this.sigInfo=signatureInfo; + this.sigValue=signatureValue; + } } diff --git a/src/main/java/component/SignatureField.java b/src/main/java/component/SignatureField.java new file mode 100644 index 0000000..0fa192a --- /dev/null +++ b/src/main/java/component/SignatureField.java @@ -0,0 +1,183 @@ +package component; + +import encoding.*; + +import java.util.LinkedList; +import java.util.List; + +/* + * @Author: Wang Feng + * @Description: 表示一个MIN包格式中的签名区 + * @Version: 1.0.0 + * @Date: 21:24 2021/3/15 + * @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 + */ +class SignatureContainer{ + private List signatures; + + public SignatureContainer(){ + signatures=new LinkedList<>(); + } + + /** + * 组件个数 + * @return + */ + public int length(){ + return signatures.size(); + } + + /** + * 清空组件 + */ + public void clear(){ + signatures.clear(); + } + + /** + * 增加一个组件 + * @param signature + */ + public void addElement(Signature signature){ + signatures.add(signature); + } + + /** + * 获取指定索引位置的组件 + * @param index + * @return + */ + public Signature getElement(int index){ + if(index>=length()){ + return null; + } + return signatures.get(index); + } + + /** + * 设置指定索引位置的组件 + * @param index + * @param signature + * @return + */ + public boolean setElement(int index,Signature signature){ + if(index>=length()){ + return false; + } + signatures.set(index,signature); + return true; + } +} +public class SignatureField implements TlvComponentBase, IEncodingAble { + private SignatureContainer signatures; + + /** + * 添加一个签名 + * @param signature + */ + public void addSignature(Signature signature){ + signatures.addElement(signature); + } + + /** + * 获取指定位置的签名 + * @param index + * @return + */ + public Signature getSignature(int index){ + return signatures.getElement(index); + } + + /** + * 获取所有签名 + * @return + */ + public SignatureContainer getSignatures(){ + return signatures; + } + + /** + * 将签名区线速编码为一个 TLV + * @param encoder + * @return + */ + @Override + public int wireEncode(Encoder encoder) { + // 如果签名区没有签名,则可以直接去掉签名区 TLV,因为它不是必须的 + if(signatures.length()==0){ + return 0; + } + int totalLength=0; + // 编码 TLV-VALUE + // 反向遍历,可以保证解码的时候正向输出 + for(int i=signatures.length()-1;i>=0;i--){ + Signature newSignature=signatures.getElement(i); + int tmplen=newSignature.getSigValue().wireEncode(encoder); + if(tmplen<=0){ + return 0; + } + totalLength+=tmplen; + tmplen=newSignature.getSigInfo().wireEncode(encoder); + if(tmplen<=0){ + return 0; + } + totalLength+=tmplen; + } + + // 编码签名区 TLV-LENGTH + int tmplen=encoder.prependVarNumber(new VlInt(totalLength)); + if(tmplen<=0){ + return 0; + } + totalLength+=tmplen; + + // 编码签名区 TLV-TYPE + tmplen=encoder.prependVarNumber(new VlInt(TLV.TlvSignatureField)); + if(tmplen<=0){ + return 0; + } + totalLength+=tmplen; + + return totalLength; + } + + /** + * 从 TLV Block 中解码出一个 SignatureField + * @param block + * @return + */ + @Override + public boolean wireDecode(Block block) { + // 检查 TYPE 是否正确 + if(!TLV.expectType(block.getType(),new VlInt(TLV.TlvSignatureField))){ + return false; + } + + // 解析子 TLV + if(!block.parseSubElements()){ + return false; + } + ElementContainer subElements=block.getSubElements(); + int subElementNum=subElements.length(); + if(subElementNum%2!=0){ + throw new Error("SignatureField.wireDecode: Invalid SignatureField TLV, require even num sub element"); + } + + // 存储所有解析到的签名 + SignatureContainer signatureContainer=new SignatureContainer(); + // 解析每一个签名 + for (int i = 0; i < subElementNum; i+=2) { + // 第奇数个子 TLV 解析为 SignatureInfo + SignatureInfo signatureInfo=new SignatureInfo(subElements.getBlock(i)); + // 第偶数个子 TLV 解析为 SignatureValue + SignatureValue signatureValue=new SignatureValue(subElements.getBlock(i+1)); + // 构造Signature + Signature signature=new Signature(signatureInfo,signatureValue); + signatureContainer.addElement(signature); + } + // 赋值 + signatures.clear(); + this.signatures=signatureContainer; + return true; + } +}