finished component: SignatureField

This commit is contained in:
free will committed 2021-03-16 10:02:29 +08:00
1 parent ff3c622cba
commit 7f28f54810
2 files changed
+204

No files matched your search

+21
View File
@@ -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;
}
}
+183
View File
@@ -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<Signature> 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;
}
}