/
fact.go
95 lines (72 loc) · 1.55 KB
/
fact.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package base
import (
"math"
"github.com/ProtoconNet/mitum2/util"
)
const MaxTokenSize = math.MaxUint16
type Fact interface {
util.IsValider
util.Hasher
Token() Token
}
type Facter interface {
Fact() Fact
}
type SignFact interface {
util.HashByter
util.IsValider
Fact() Fact
Signs() []Sign
}
type NodeSignFact interface {
SignFact
NodeSigns() []NodeSign
}
type Token []byte
type Tokener interface {
Token() Token
}
type TokenSetter interface {
SetToken(Token) error
}
func (t Token) IsValid([]byte) error {
e := util.ErrInvalid.Errorf("invalid Token")
switch l := len(t); {
case l < 1:
return e.Errorf("empty")
case l > MaxTokenSize:
return e.Errorf("too long; %d > %d", l, MaxTokenSize)
}
return nil
}
func IsValidFact(fact Fact, b []byte) error {
if err := util.CheckIsValiders(b, false,
fact.Hash(),
fact.Token(),
); err != nil {
return util.ErrInvalid.Wrapf(err, "invalid Fact")
}
return nil
}
func IsValidSignFact(sf SignFact, networkID []byte) error {
e := util.ErrInvalid.Errorf("invalid SignFact")
sfs := sf.Signs()
if len(sfs) < 1 {
return e.Errorf("empty signs")
}
bs := make([]util.IsValider, len(sf.Signs())+1)
bs[0] = sf.Fact()
for i := range sfs {
bs[i+1] = sfs[i]
}
if err := util.CheckIsValiders(networkID, false, bs...); err != nil {
return e.Wrapf(err, "invalid SignFact")
}
// NOTE caller should check the duplication of Signs
for i := range sfs {
if err := sfs[i].Verify(networkID, sf.Fact().Hash().Bytes()); err != nil {
return e.Wrapf(err, "failed to verify sign")
}
}
return nil
}