[#386] util/signature: Add WalletConnect API support

To avoid introducing new dependency (neo-go), crypto routines are used
as in other code.

Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
This commit is contained in:
Evgenii Stratonikov 2022-03-15 16:54:47 +03:00 committed by fyrchik
parent f9a91e5f33
commit dd233c3fbc
6 changed files with 344 additions and 14 deletions

View file

@ -2,9 +2,11 @@ package signature
import (
"crypto/ecdsa"
"encoding/base64"
"fmt"
"github.com/nspcc-dev/neofs-api-go/v2/refs"
"github.com/nspcc-dev/neofs-api-go/v2/util/signature/walletconnect"
crypto "github.com/nspcc-dev/neofs-crypto"
)
@ -24,12 +26,22 @@ func verify(cfg *cfg, data []byte, sig *refs.Signature) error {
}
pub := crypto.UnmarshalPublicKey(sig.GetKey())
if pub == nil {
return crypto.ErrEmptyPublicKey
}
switch cfg.scheme {
case refs.ECDSA_SHA512:
return crypto.Verify(pub, data, sig.GetSign())
case refs.ECDSA_RFC6979_SHA256:
return crypto.VerifyRFC6979(pub, data, sig.GetSign())
case refs.ECDSA_RFC6979_SHA256_WALLET_CONNECT:
buf := make([]byte, base64.StdEncoding.EncodedLen(len(data)))
base64.StdEncoding.Encode(buf, data)
if !walletconnect.Verify(pub, buf, sig.GetSign()) {
return crypto.ErrInvalidSignature
}
return nil
default:
return fmt.Errorf("unsupported signature scheme %s", cfg.scheme)
}
@ -41,6 +53,10 @@ func sign(cfg *cfg, key *ecdsa.PrivateKey, data []byte) ([]byte, error) {
return crypto.Sign(key, data)
case refs.ECDSA_RFC6979_SHA256:
return crypto.SignRFC6979(key, data)
case refs.ECDSA_RFC6979_SHA256_WALLET_CONNECT:
buf := make([]byte, base64.StdEncoding.EncodedLen(len(data)))
base64.StdEncoding.Encode(buf, data)
return walletconnect.Sign(key, buf)
default:
panic(fmt.Sprintf("unsupported scheme %s", cfg.scheme))
}
@ -59,3 +75,9 @@ func WithBuffer(buf []byte) SignOption {
c.buffer = buf
}
}
func SignWithWalletConnect() SignOption {
return func(c *cfg) {
c.scheme = refs.ECDSA_RFC6979_SHA256_WALLET_CONNECT
}
}