// Create a new DB Signature Entry func NewDBSignatureEntry(identityAdminChainID interfaces.IHash, sig interfaces.IFullSignature) (*DBSignatureEntry, error) { e := new(DBSignatureEntry) e.IdentityAdminChainID = identityAdminChainID bytes, err := sig.MarshalBinary() if err != nil { return nil, err } prevDBSig := new(primitives.Signature) prevDBSig.SetPub(bytes[:32]) err = prevDBSig.SetSignature(bytes[32:]) if err != nil { return nil, err } e.PrevDBSig = *prevDBSig return e, nil }
func (m *DirectoryBlockSignature) MarshalBinary() (data []byte, err error) { var sig interfaces.IFullSignature resp, err := m.MarshalForSignature() if err == nil { sig = m.GetSignature() } if sig != nil { sigBytes, err := sig.MarshalBinary() if err != nil { return resp, nil } return append(resp, sigBytes...), nil } return resp, nil }
// Checks the signature of a message. Returns an int based on who signed it: // 1 -> Federated Signature // 0 -> Audit Signature // -1 -> Neither Fed or Audit Signature func (st *State) FastVerifyAuthoritySignature(msg []byte, sig interfaces.IFullSignature, dbheight uint32) (int, error) { feds := st.GetFedServers(dbheight) if feds == nil { return 0, fmt.Errorf("Federated Servers are unknown at directory block hieght %d", dbheight) } auds := st.GetAuditServers(dbheight) for _, fed := range feds { auth, _ := st.GetAuthority(fed.GetChainID()) if auth == nil { continue } compareKey, err := auth.SigningKey.MarshalBinary() if err == nil { if pkEq(sig.GetKey(), compareKey) { valid, err := auth.VerifySignature(msg, sig.GetSignature()) if err == nil && valid { return 1, nil } } } } for _, aud := range auds { auth, _ := st.GetAuthority(aud.GetChainID()) if auth == nil { continue } compareKey, err := auth.SigningKey.MarshalBinary() if err == nil { if pkEq(sig.GetKey(), compareKey) { valid, err := auth.VerifySignature(msg, sig.GetSignature()) if err == nil && valid { return 0, nil } } } } //fmt.Println("WARNING: A signature failed to validate.") return -1, fmt.Errorf("%s", "Signature Key Invalid or not Federated Server Key") }