package key import "golang.org/x/crypto/ed25519" type Sig struct { PKAlg [2]byte KeyNum [8]byte Sig [ed25519.SignatureSize]byte } func (v *Sig) Validate() error { if v.PKAlg != pkAlg { return ErrInvalidPK } return nil } // Verify message with public key func (v *Sig) Verify(message []byte, pub *Pub) error { if v.KeyNum != pub.KeyNum { return ErrKeyNum } if !ed25519.Verify(ed25519.PublicKey(pub.Key[:]), message, v.Sig[:]) { return ErrInvalidSig } return nil } func (v *Sig) MarshalBinary() ([]byte, error) { return marshal(v) } func (v *Sig) UnmarshalBinary(data []byte) error { return unmarshal(data, v) } // NewSig return parsed signature func NewSig(data []byte) (*Sig, error) { sig := new(Sig) if err := sig.UnmarshalBinary(data); err != nil { return nil, err } return sig, sig.Validate() }