mirror of
https://gitee.com/willfree/min-dev-java.git
synced 2026-10-04 19:42:01 +08:00
finished component: SignatureField
This commit is contained in:
1 parent
ff3c622cba
commit
7f28f54810
2 files changed
+204
No files matched your search
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user