2022-12-22 10:00:34 +01:00

118 lines
3.7 KiB
Go

package main
import "C"
import (
"encoding/json"
"fmt"
"os"
"path/filepath"
skg "github.com/status-im/status-keycard-go"
"github.com/status-im/status-keycard-go/signal"
)
var flow *skg.KeycardFlow
var finished chan (struct{})
var correctPairing = "KeycardDefaultPairing"
var correctPIN = "123456"
var correctPUK = "123456123456"
var keyUID = "136cbfc087cf7df6cf3248bce7563d4253b302b2f9e2b5eef8713fa5091409bc"
func signalHandler(j []byte) {
var sig signal.Envelope
json.Unmarshal(j, &sig)
fmt.Printf("Received signal: %+v\n", sig)
go func() {
switch sig.Type {
case skg.InsertCard:
fmt.Print("Insert card\n")
case skg.CardInserted:
fmt.Printf("Card inserted\n")
case skg.SwapCard:
fmt.Printf("Swap card. Changing constraint\n")
flow.Resume(skg.FlowParams{skg.KeyUID: keyUID})
case skg.EnterPairing:
fmt.Printf("Entering pass: %+v\n", correctPairing)
flow.Resume(skg.FlowParams{skg.PairingPass: correctPairing})
case skg.EnterPIN:
fmt.Printf("Entering PIN: %+v\n", correctPIN)
flow.Resume(skg.FlowParams{skg.PIN: correctPIN})
case skg.EnterNewPIN:
fmt.Printf("Creating PIN: %+v\n", correctPIN)
flow.Resume(skg.FlowParams{skg.NewPIN: correctPIN})
case skg.EnterNewPUK:
fmt.Printf("Creating PUK: %+v\n", correctPUK)
flow.Resume(skg.FlowParams{skg.NewPUK: correctPUK})
case skg.EnterNewPair:
fmt.Printf("Creating pairing: %+v\n", correctPairing)
flow.Resume(skg.FlowParams{skg.NewPairing: correctPairing})
case skg.EnterMnemonic:
fmt.Printf("Loading mnemonic\n")
flow.Resume(skg.FlowParams{skg.Mnemonic: "receive fan copper bracket end train again sustain wet siren throw cigar"})
case skg.FlowResult:
fmt.Printf("Flow result: %+v\n", sig.Event)
close(finished)
}
}()
}
func testFlow(typ skg.FlowType, params skg.FlowParams) {
finished = make(chan struct{})
err := flow.Start(typ, params)
if err != nil {
fmt.Printf("error: %+v\n", err)
}
<-finished
}
func testRecoverAccount() {
finished = make(chan struct{})
err := flow.Start(skg.RecoverAccount, skg.FlowParams{})
if err != nil {
fmt.Printf("error: %+v\n", err)
}
<-finished
}
func main() {
dir, err := os.MkdirTemp("", "status-keycard-go")
if err != nil {
fmt.Printf("error: %+v\n", err)
return
}
defer os.RemoveAll(dir)
pairingsFile := filepath.Join(dir, "keycard-pairings.json")
flow, err = skg.NewFlow(pairingsFile)
if err != nil {
fmt.Printf("error: %+v\n", err)
return
}
signal.SetKeycardSignalHandler(signalHandler)
testFlow(skg.GetAppInfo, skg.FlowParams{skg.FactoryReset: true})
testFlow(skg.LoadAccount, skg.FlowParams{skg.MnemonicLen: 12})
testFlow(skg.UnpairThis, skg.FlowParams{skg.PIN: correctPIN})
testFlow(skg.RecoverAccount, skg.FlowParams{skg.PairingPass: "WrongPass", skg.PIN: "234567"})
testFlow(skg.Login, skg.FlowParams{skg.KeyUID: "60a78c98d5dd659f714eb7072bfb2c0d8a65f74a8f6aff7bb27cf56ae1feec17"})
testFlow(skg.GetAppInfo, skg.FlowParams{})
testFlow(skg.ExportPublic, skg.FlowParams{skg.BIP44Path: "m/44'/60'/0'/0/1", skg.ExportMaster: true})
testFlow(skg.ExportPublic, skg.FlowParams{skg.BIP44Path: "m/43'/60'/1581'/1'/0", skg.ExportPriv: true})
testFlow(skg.ExportPublic, skg.FlowParams{skg.BIP44Path: []interface{}{"m/44'/60'/0'/0/2", "m/44'/60'/0'/0/3", "m/44'/60'/0'/0/4"}})
testFlow(skg.Sign, skg.FlowParams{skg.TXHash: "60a78c98d5dd659f714eb7072bfb2c0d8a65f74a8f6aff7bb27cf56ae1feec17", skg.BIP44Path: "m/44'/60'/0'/0/0"})
testFlow(skg.StoreMetadata, skg.FlowParams{skg.CardName: "TestCard", skg.WalletPaths: []interface{}{"m/44'/60'/0'/0/0", "m/44'/60'/0'/0/1", "m/44'/60'/0'/0/5", "m/44'/60'/0'/0/6"}})
testFlow(skg.GetMetadata, skg.FlowParams{})
testFlow(skg.GetMetadata, skg.FlowParams{skg.ResolveAddr: true})
testFlow(skg.UnpairThis, skg.FlowParams{skg.PIN: correctPIN})
}