package pb import ( "crypto/sha256" "fmt" "github.com/meshplus/bitxhub-kit/types" ) func WrapperKey(height uint64) []byte { return []byte(fmt.Sprintf("wrapper-%d", height)) } func IBTPKey(id string) []byte { return []byte(fmt.Sprintf("ibtp-%s", id)) } func (m *IBTPX) Hash() *types.Hash { data := m.FrontPart() return m.digest(data, m.RouteSign) } func (m *IBTPX) FrontPart() []byte { var data []byte hash := m.Ibtp.Hash() data = append(data, hash.Bytes()...) data = append(data, []byte(m.Mode)...) data = append(data, []byte(m.RouteMethod)...) for _, s := range m.RouteMethodArg { data = append(data, []byte(s)...) } return data } func (m *IBTPX) digest(part []byte, signs []string) *types.Hash { for _, s := range signs { part = append(part, []byte(s)...) } s := sha256.Sum256(part) return types.NewHash(s[:]) } func (m *IBTPX) Verify(verify func(digest []byte, sig []byte) (bool, error)) bool { return m.recursiveVerify(verify) } func (m *IBTPX) recursiveVerify(verify func(digest []byte, sig []byte) (bool, error)) bool { part := m.FrontPart() for i, currentSig := range m.RouteSign { var d, dig []byte copy(d, part) if i == 0 { copy(dig, part) } else { signs := m.RouteSign[:i-1] dig = m.digest(d, signs).Bytes() } if val, _ := verify(dig, []byte(currentSig)); val { return val } } return false }