-
Notifications
You must be signed in to change notification settings - Fork 41
/
tx_sign_info.go
133 lines (102 loc) · 3.05 KB
/
tx_sign_info.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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package types
import (
"errors"
"github.com/cheqd/cheqd-node/x/did/utils"
validation "github.com/go-ozzo/ozzo-validation/v4"
"github.com/mr-tron/base58"
)
func NewSignInfo(verificationMethodID string, signature []byte) *SignInfo {
return &SignInfo{VerificationMethodId: verificationMethodID, Signature: signature}
}
// Helpers
func GetSignInfoIds(infos []*SignInfo) []string {
res := make([]string, len(infos))
for i := range infos {
res[i] = infos[i].VerificationMethodId
}
return res
}
func IsUniqueSignInfoList(infos []*SignInfo) bool {
hash := func(si *SignInfo) string {
return si.VerificationMethodId + ":" + base58.Encode(si.Signature)
}
tmp := map[string]bool{}
for _, si := range infos {
h := hash(si)
_, found := tmp[h]
if found {
return false
}
tmp[h] = true
}
return true
}
// FindSignInfosBySigner returns the sign infos that corresponds to the provided signer's did
func FindSignInfosBySigner(infos []*SignInfo, signer string) []SignInfo {
var result []SignInfo
for _, info := range infos {
did, _, _, _ := utils.MustSplitDIDUrl(info.VerificationMethodId)
if did == signer {
result = append(result, *info)
}
}
return result
}
// FindSignInfoBySigner returns the first sign info that corresponds to the provided signer's did
func FindSignInfoBySigner(infos []*SignInfo, signer string) (info SignInfo, found bool) {
infosBS := FindSignInfosBySigner(infos, signer)
if len(infosBS) == 0 {
return SignInfo{}, false
}
return infosBS[0], true
}
// Validate
func (si SignInfo) Validate(allowedNamespaces []string) error {
return validation.ValidateStruct(&si,
validation.Field(&si.VerificationMethodId, validation.Required, IsDIDUrl(allowedNamespaces, Empty, Empty, Required)),
validation.Field(&si.Signature, validation.Required),
)
}
func ValidSignInfoRule(allowedNamespaces []string) *CustomErrorRule {
return NewCustomErrorRule(func(value interface{}) error {
casted, ok := value.(SignInfo)
if !ok {
panic("ValidSignInfoRule must be only applied on sign infos")
}
return casted.Validate(allowedNamespaces)
})
}
func IsUniqueSignInfoListByIDRule() *CustomErrorRule {
return NewCustomErrorRule(func(value interface{}) error {
casted, ok := value.([]*SignInfo)
if !ok {
panic("IsUniqueVerificationMethodListByIdRule must be only applied on VM lists")
}
ids := GetSignInfoIds(casted)
if !utils.IsUnique(ids) {
return errors.New("there are sign info records with the same ID")
}
return nil
})
}
func IsUniqueSignInfoListRule() *CustomErrorRule {
return NewCustomErrorRule(func(value interface{}) error {
casted, ok := value.([]*SignInfo)
if !ok {
panic("IsUniqueVerificationMethodListByIdRule must be only applied on VM lists")
}
if !IsUniqueSignInfoList(casted) {
return errors.New("there are full sign info duplicates")
}
return nil
})
}
// Normalization
func (si *SignInfo) Normalize() {
si.VerificationMethodId = utils.NormalizeDIDUrl(si.VerificationMethodId)
}
func NormalizeSignInfoList(signatures []*SignInfo) {
for _, s := range signatures {
s.Normalize()
}
}