diff --git a/Gopkg.lock b/Gopkg.lock index 0c1efb9..ace2053 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -42,7 +42,7 @@ [[projects]] branch = "develop" - digest = "1:fdad9e6435d380941cc5a8270d3bb5a1d391069f6e0ad828f3b8d105ce51c263" + digest = "1:bb595307da0f85c32419658d722f3260dfb3c1256f8ec4707a204f7375b66b13" name = "github.com/status-im/keycard-go" packages = [ ".", @@ -57,7 +57,7 @@ "types", ] pruneopts = "NUT" - revision = "8adf2b6627095127f26f77af865c056bb510097a" + revision = "dbfad2a8b07afcc0ca3b28b41f8d03376669719f" [[projects]] branch = "master" diff --git a/shell.go b/shell.go index 9385af6..568803d 100644 --- a/shell.go +++ b/shell.go @@ -121,6 +121,7 @@ func NewShell(t keycardio.Transmitter) *Shell { "gp-delete": s.commandGPDelete, "gp-load": s.commandGPLoad, "gp-install-for-install": s.commandGPInstallForInstall, + "gp-get-status": s.commandGPGetStatus, "keycard-init": s.commandKeycardInit, "keycard-select": s.commandKeycardSelect, "keycard-pair": s.commandKeycardPair, @@ -317,6 +318,16 @@ func (s *Shell) commandGPInstallForInstall(args ...string) error { return s.gpCmdSet.InstallForInstall(pkgAID, appletAID, instanceAID, params) } +func (s *Shell) commandGPGetStatus(args ...string) error { + if err := s.requireArgs(args, 0); err != nil { + return err + } + + logger.Info("get status") + + return s.gpCmdSet.GetStatus() +} + func (s *Shell) commandKeycardInit(args ...string) error { if err := s.requireArgs(args, 0); err != nil { return err diff --git a/vendor/github.com/status-im/keycard-go/apdu/command.go b/vendor/github.com/status-im/keycard-go/apdu/command.go index 98c53f0..145bf14 100644 --- a/vendor/github.com/status-im/keycard-go/apdu/command.go +++ b/vendor/github.com/status-im/keycard-go/apdu/command.go @@ -3,8 +3,12 @@ package apdu import ( "bytes" "encoding/binary" + "errors" ) +// ErrBadRawCommand is an error returned by ParseCommand in case the command data is not long enough. +var ErrBadRawCommand = errors.New("command must be at least 4 bytes") + // Command struct represent the data sent as an APDU command with CLA, Ins, P1, P2, Lc, Data, and Le. type Command struct { Cla uint8 @@ -76,3 +80,52 @@ func (c *Command) Serialize() ([]byte, error) { return buf.Bytes(), nil } + +func (c *Command) deserialize(data []byte) error { + if len(data) < 4 { + return ErrBadRawCommand + } + + buf := bytes.NewReader(data) + + if err := binary.Read(buf, binary.BigEndian, &c.Cla); err != nil { + return err + } + + if err := binary.Read(buf, binary.BigEndian, &c.Ins); err != nil { + return err + } + + if err := binary.Read(buf, binary.BigEndian, &c.P1); err != nil { + return err + } + + if err := binary.Read(buf, binary.BigEndian, &c.P2); err != nil { + return err + } + + var lc uint8 + if err := binary.Read(buf, binary.BigEndian, &lc); err != nil { + return nil + } + + cmdData := make([]byte, lc) + if err := binary.Read(buf, binary.BigEndian, &cmdData); err != nil { + return nil + } + c.Data = cmdData + + var le uint8 + if err := binary.Read(buf, binary.BigEndian, &le); err != nil { + return nil + } + c.SetLe(le) + + return nil +} + +// ParseCommand parses a raw command and returns a Command +func ParseCommand(raw []byte) (*Command, error) { + cmd := &Command{} + return cmd, cmd.deserialize(raw) +} diff --git a/vendor/github.com/status-im/keycard-go/command_set.go b/vendor/github.com/status-im/keycard-go/command_set.go index 08d40ff..20a9cbd 100644 --- a/vendor/github.com/status-im/keycard-go/command_set.go +++ b/vendor/github.com/status-im/keycard-go/command_set.go @@ -41,14 +41,7 @@ func (cs *CommandSet) Select() error { return err } - cmd := apdu.NewCommand( - 0x00, - globalplatform.InsSelect, - uint8(0x04), - uint8(0x00), - instanceAID, - ) - + cmd := globalplatform.NewCommandSelect(instanceAID) cmd.SetLe(0) resp, err := cs.c.Send(cmd) if err = cs.checkOK(resp, err); err != nil { diff --git a/vendor/github.com/status-im/keycard-go/globalplatform/command_set.go b/vendor/github.com/status-im/keycard-go/globalplatform/command_set.go index 2463e91..bc01e04 100644 --- a/vendor/github.com/status-im/keycard-go/globalplatform/command_set.go +++ b/vendor/github.com/status-im/keycard-go/globalplatform/command_set.go @@ -31,14 +31,7 @@ func (cs *CommandSet) Select() error { } func (cs *CommandSet) SelectAID(aid []byte) error { - cmd := apdu.NewCommand( - 0x00, - InsSelect, - uint8(0x04), - uint8(0x00), - aid, - ) - + cmd := NewCommandSelect(aid) cmd.SetLe(0) resp, err := cs.c.Send(cmd) @@ -150,6 +143,20 @@ func (cs *CommandSet) InstallForInstall(packageAID, appletAID, instanceAID, para return cs.checkOK(resp, err) } +func (cs *CommandSet) GetStatus() error { + cmd := NewCommandGetStatus([]byte{}, P1GetStatusIssuerSecurityDomain) + resp, err := cs.sc.Send(cmd) + return cs.checkOK(resp, err) +} + +func (cs *CommandSet) Channel() types.Channel { + return cs.c +} + +func (cs *CommandSet) SecureChannel() *SecureChannel { + return cs.sc +} + func (cs *CommandSet) initializeUpdate(hostChallenge []byte) error { cmd := NewCommandInitializeUpdate(hostChallenge) resp, err := cs.c.Send(cmd) diff --git a/vendor/github.com/status-im/keycard-go/globalplatform/commands.go b/vendor/github.com/status-im/keycard-go/globalplatform/commands.go index 094a4f0..bb2a681 100644 --- a/vendor/github.com/status-im/keycard-go/globalplatform/commands.go +++ b/vendor/github.com/status-im/keycard-go/globalplatform/commands.go @@ -56,10 +56,6 @@ func NewCommandSelect(aid []byte) *apdu.Command { aid, ) - // with T=0 we can both set or not the Le value - // with T=1 it works only without Le - // c.SetLe(0x00) - return c }