Skip to content

Commit

Permalink
feat(wallet): Add sr25519-adr8 and sr25519-raw support
Browse files Browse the repository at this point in the history
  • Loading branch information
matevz authored and kostko committed Sep 26, 2023
1 parent 517ad46 commit 36faab7
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 4 deletions.
20 changes: 16 additions & 4 deletions wallet/file/file.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,12 @@ const (
// SupportedAlgorithmsForImport returns the algorithms supported by the given import kind.
func SupportedAlgorithmsForImport(kind *wallet.ImportKind) []string {
if kind == nil {
return []string{wallet.AlgorithmEd25519Adr8, wallet.AlgorithmEd25519Raw, wallet.AlgorithmSecp256k1Bip44, wallet.AlgorithmSecp256k1Raw, wallet.AlgorithmSr25519Raw}
return []string{wallet.AlgorithmEd25519Adr8, wallet.AlgorithmEd25519Raw, wallet.AlgorithmSecp256k1Bip44, wallet.AlgorithmSecp256k1Raw, wallet.AlgorithmSr25519Adr8, wallet.AlgorithmSr25519Raw}
}

switch *kind {
case wallet.ImportKindMnemonic:
return []string{wallet.AlgorithmEd25519Adr8, wallet.AlgorithmSecp256k1Bip44}
return []string{wallet.AlgorithmEd25519Adr8, wallet.AlgorithmSecp256k1Bip44, wallet.AlgorithmSr25519Adr8}
case wallet.ImportKindPrivateKey:
return []string{wallet.AlgorithmEd25519Raw, wallet.AlgorithmSecp256k1Raw, wallet.AlgorithmSr25519Raw}
default:
Expand Down Expand Up @@ -192,7 +192,7 @@ func (af *fileAccountFactory) PrettyKind(rawCfg map[string]interface{}) string {
// In case of ADR8 or BIP44 show the keypair number.
var number string
switch cfg.Algorithm {
case wallet.AlgorithmEd25519Adr8, wallet.AlgorithmSecp256k1Bip44:
case wallet.AlgorithmEd25519Adr8, wallet.AlgorithmSecp256k1Bip44, wallet.AlgorithmSr25519Adr8:
number = fmt.Sprintf(":%d", cfg.Number)
}
return fmt.Sprintf("%s (%s%s)", Kind, cfg.Algorithm, number)
Expand Down Expand Up @@ -429,7 +429,7 @@ func (af *fileAccountFactory) Import(name string, passphrase string, rawCfg map[
switch src.Kind {
case wallet.ImportKindMnemonic:
switch cfg.Algorithm {
case wallet.AlgorithmEd25519Adr8, wallet.AlgorithmSecp256k1Bip44:
case wallet.AlgorithmEd25519Adr8, wallet.AlgorithmSecp256k1Bip44, wallet.AlgorithmSr25519Adr8:
default:
return nil, fmt.Errorf("algorithm '%s' does not support import from mnemonic", cfg.Algorithm)
}
Expand Down Expand Up @@ -520,6 +520,18 @@ func newAccount(state *secretState, cfg *accountConfig) (wallet.Account, error)
return nil, fmt.Errorf("failed to initialize signer: %w", err)
}

return &fileAccount{
cfg: cfg,
state: state,
signer: signer,
}, nil
case wallet.AlgorithmSr25519Adr8:
// For Sr25519 use the ADR 0008 derivation scheme.
signer, err := Sr25519FromMnemonic(state.Data, cfg.Number)
if err != nil {
return nil, fmt.Errorf("failed to initialize signer: %w", err)
}

return &fileAccount{
cfg: cfg,
state: state,
Expand Down
53 changes: 53 additions & 0 deletions wallet/file/sr25519.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package file

import (
"fmt"

"github.com/oasisprotocol/oasis-core/go/common/crypto/sakg"
"github.com/oasisprotocol/oasis-core/go/common/crypto/signature"
"github.com/oasisprotocol/oasis-core/go/common/crypto/slip10"
sdkSignature "github.com/oasisprotocol/oasis-sdk/client-sdk/go/crypto/signature"
"github.com/oasisprotocol/oasis-sdk/client-sdk/go/crypto/signature/sr25519"
"github.com/tyler-smith/go-bip39"
)

// Sr25519FromMnemonic derives a signer using ADR-8 from given mnemonic.
func Sr25519FromMnemonic(mnemonic string, number uint32) (sdkSignature.Signer, error) {
if number > sakg.MaxAccountKeyNumber {
return nil, fmt.Errorf(
"sakg: invalid key number: %d (maximum: %d)",
number,
sakg.MaxAccountKeyNumber,
)
}

if !bip39.IsMnemonicValid(mnemonic) {
return nil, fmt.Errorf("sakg: invalid mnemonic")
}

seed := bip39.NewSeed(mnemonic, "")

signer, chainCode, err := slip10.NewMasterKey(seed)
if err != nil {
return nil, fmt.Errorf("sakg: error deriving master key: %w", err)
}

pathStr := fmt.Sprintf("%s/%d'", sakg.BIP32PathPrefix, number)
path, err := sakg.NewBIP32Path(pathStr)
if err != nil {
return nil, fmt.Errorf("sakg: error creating BIP-0032 path %s: %w", pathStr, err)
}

for _, index := range path {
signer, chainCode, err = slip10.NewChildKey(signer, chainCode, index)
if err != nil {
return nil, fmt.Errorf("sakg: error deriving child key: %w", err)
}
}

sr25519signer, err := sr25519.NewSigner(signer.(signature.UnsafeSigner).UnsafeBytes())
if err != nil {
return nil, err
}
return sr25519signer, nil
}

0 comments on commit 36faab7

Please sign in to comment.