mirror of
https://github.com/onsonr/sonr.git
synced 2025-03-10 21:09:11 +00:00
60 lines
1.1 KiB
Go
60 lines
1.1 KiB
Go
package builder
|
|
|
|
import (
|
|
"github.com/onsonr/crypto"
|
|
"github.com/onsonr/sonr/x/did/types"
|
|
)
|
|
|
|
type Signer interface {
|
|
Sign(msg []byte) ([]byte, error)
|
|
Verify(msg []byte, sig []byte) error
|
|
PublicKey() []byte
|
|
}
|
|
|
|
type signer struct {
|
|
user *types.Keyshare
|
|
val *types.Keyshare
|
|
}
|
|
|
|
func (k signer) Sign(msg []byte) ([]byte, error) {
|
|
valSignFunc, err := crypto.GetSignFunc(k.val, msg)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
usrSignFunc, err := crypto.GetSignFunc(k.user, msg)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
sig, err := crypto.RunMPCSign(valSignFunc, usrSignFunc)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return crypto.SerializeMPCSignature(sig)
|
|
}
|
|
|
|
func (k signer) Verify(msg []byte, sig []byte) error {
|
|
sigMpc, err := crypto.DeserializeMPCSignature(sig)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
pk, err := crypto.GetECDSAPublicKey(k.val)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ok := crypto.VerifyMPCSignature(sigMpc, msg, pk)
|
|
if !ok {
|
|
return types.ErrInvalidSignature
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (k signer) PublicKey() []byte {
|
|
if k.user != nil {
|
|
return k.user.PublicKey
|
|
}
|
|
if k.val != nil {
|
|
return k.val.PublicKey
|
|
}
|
|
return nil
|
|
}
|