add mnemonic generation

This commit is contained in:
Michele Balistreri 2022-06-09 11:16:31 +02:00
parent a0679327f8
commit c86dd29a2e
6 changed files with 32 additions and 8 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
.vscode
/keycard /keycard
/build /build
/status-keycard-go /status-keycard-go

View File

@ -48,6 +48,9 @@ func signalHandler(j []byte) {
case skg.EnterNewPair: case skg.EnterNewPair:
fmt.Printf("Creating pairing: %+v\n", correctPairing) fmt.Printf("Creating pairing: %+v\n", correctPairing)
flow.Resume(skg.FlowParams{skg.NewPairing: 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: case skg.FlowResult:
fmt.Printf("Flow result: %+v\n", sig.Event) fmt.Printf("Flow result: %+v\n", sig.Event)
close(finished) close(finished)
@ -98,7 +101,7 @@ func main() {
signal.SetKeycardSignalHandler(signalHandler) signal.SetKeycardSignalHandler(signalHandler)
testFlow(skg.GetAppInfo, skg.FlowParams{skg.FactoryReset: true}) testFlow(skg.GetAppInfo, skg.FlowParams{skg.FactoryReset: true})
testFlow(skg.LoadAccount, skg.FlowParams{skg.Mnemonic: "receive fan copper bracket end train again sustain wet siren throw cigar"}) testFlow(skg.LoadAccount, skg.FlowParams{skg.MnemonicLen: 12})
testFlow(skg.UnpairThis, skg.FlowParams{skg.PIN: correctPIN}) testFlow(skg.UnpairThis, skg.FlowParams{skg.PIN: correctPIN})
testFlow(skg.RecoverAccount, skg.FlowParams{skg.PairingPass: "WrongPass", skg.PIN: "234567"}) testFlow(skg.RecoverAccount, skg.FlowParams{skg.PairingPass: "WrongPass", skg.PIN: "234567"})
testFlow(skg.Login, skg.FlowParams{skg.KeyUID: "60a78c98d5dd659f714eb7072bfb2c0d8a65f74a8f6aff7bb27cf56ae1feec17"}) testFlow(skg.Login, skg.FlowParams{skg.KeyUID: "60a78c98d5dd659f714eb7072bfb2c0d8a65f74a8f6aff7bb27cf56ae1feec17"})

14
flow.go
View File

@ -105,9 +105,7 @@ func (f *KeycardFlow) runFlow() {
f.state = Idle f.state = Idle
} }
func (f *KeycardFlow) pause(action string, errMsg string) { func (f *KeycardFlow) pause(action string, errMsg string, status FlowParams) {
status := FlowParams{}
status[ErrorKey] = errMsg status[ErrorKey] = errMsg
if f.cardInfo.freeSlots != -1 { if f.cardInfo.freeSlots != -1 {
@ -125,12 +123,12 @@ func (f *KeycardFlow) pause(action string, errMsg string) {
f.state = Paused f.state = Paused
} }
func (f *KeycardFlow) pauseAndWait(action string, errMsg string) error { func (f *KeycardFlow) pauseAndWaitWithStatus(action string, errMsg string, status FlowParams) error {
if f.state == Cancelling { if f.state == Cancelling {
return giveupErr() return giveupErr()
} }
f.pause(action, errMsg) f.pause(action, errMsg, status)
<-f.wakeUp <-f.wakeUp
if f.state == Resuming { if f.state == Resuming {
@ -141,6 +139,10 @@ func (f *KeycardFlow) pauseAndWait(action string, errMsg string) error {
} }
} }
func (f *KeycardFlow) pauseAndWait(action string, errMsg string) error {
return f.pauseAndWaitWithStatus(action, errMsg, FlowParams{})
}
func (f *KeycardFlow) pauseAndRestart(action string, errMsg string) error { func (f *KeycardFlow) pauseAndRestart(action string, errMsg string) error {
err := f.pauseAndWait(action, errMsg) err := f.pauseAndWait(action, errMsg)
@ -184,7 +186,7 @@ func (f *KeycardFlow) connect() *keycardContext {
return nil return nil
} }
f.pause(InsertCard, ErrorConnection) f.pause(InsertCard, ErrorConnection, FlowParams{})
select { select {
case <-f.wakeUp: case <-f.wakeUp:
if f.state != Cancelling { if f.state != Cancelling {

View File

@ -311,7 +311,20 @@ func (f *KeycardFlow) loadKeys(kc *keycardContext) error {
return nil return nil
} }
err := f.pauseAndWait(EnterMnemonic, ErrorLoading) mnemonicLength, ok := f.params[MnemonicLen]
if !ok {
mnemonicLength = defMnemoLen
}
indexes, err := kc.generateMnemonic(mnemonicLength.(int) / 3)
if isSCardError(err) {
return restartErr()
} else if err != nil {
return err
}
err = f.pauseAndWaitWithStatus(EnterMnemonic, ErrorLoading, FlowParams{MnemonicIdxs: indexes})
if err != nil { if err != nil {
return err return err

View File

@ -105,6 +105,8 @@ const (
EncKey = "encryption-key" EncKey = "encryption-key"
ExportedKey = "exported-key" ExportedKey = "exported-key"
Mnemonic = "mnemonic" Mnemonic = "mnemonic"
MnemonicLen = "mnemonic-length"
MnemonicIdxs = "mnemonic-indexes"
TXHash = "tx-hash" TXHash = "tx-hash"
BIP44Path = "bip44-path" BIP44Path = "bip44-path"
TXSignature = "tx-signature" TXSignature = "tx-signature"
@ -115,6 +117,7 @@ const (
maxPINRetries = 3 maxPINRetries = 3
maxPUKRetries = 5 maxPUKRetries = 5
maxFreeSlots = 5 maxFreeSlots = 5
defMnemoLen = 12
) )
const ( const (

View File

@ -237,6 +237,7 @@ func (kc *keycardContext) unblockPIN(puk string, newPIN string) error {
return nil return nil
} }
//lint:ignore U1000 will be used
func (kc *keycardContext) generateKey() ([]byte, error) { func (kc *keycardContext) generateKey() ([]byte, error) {
<-kc.connected <-kc.connected
if kc.runErr != nil { if kc.runErr != nil {
@ -293,6 +294,7 @@ func (kc *keycardContext) removeKey() error {
return nil return nil
} }
//lint:ignore U1000 will be used
func (kc *keycardContext) deriveKey(path string) error { func (kc *keycardContext) deriveKey(path string) error {
<-kc.connected <-kc.connected
if kc.runErr != nil { if kc.runErr != nil {