diff --git a/initializer.go b/initializer.go index a3c1fc1..5db8184 100644 --- a/initializer.go +++ b/initializer.go @@ -23,7 +23,7 @@ var ( // Initializer defines a struct with methods to install applets and initialize a card. type Initializer struct { - c globalplatform.Channel + c types.Channel } // NewInitializer returns a new Initializer that communicates to Transmitter t. @@ -33,40 +33,6 @@ func NewInitializer(t globalplatform.Transmitter) *Initializer { } } -// Install installs the applet from the specified capFile. -func (i *Initializer) Install(capFile *os.File, overwriteApplet bool) error { - info, err := keycard.Select(i.c, identifiers.KeycardAID) - if err != nil { - return err - } - - if info.Installed && !overwriteApplet { - return errors.New("applet already installed") - } - - err = i.initGPSecureChannel(keycard.CardManagerAID) - if err != nil { - return err - } - - instanceAID, err := identifiers.KeycardInstanceAID(1) - if err != nil { - return err - } - - err = i.deleteAID(identifiers.NdefInstanceAID, instanceAID, identifiers.PackageAID) - if err != nil { - return err - } - - err = i.installApplets(capFile) - if err != nil { - return err - } - - return err -} - func (i *Initializer) Init() (*keycard.Secrets, error) { secrets, err := keycard.NewSecrets() if err != nil { @@ -94,61 +60,11 @@ func (i *Initializer) Init() (*keycard.Secrets, error) { return secrets, nil } -func (i *Initializer) Pair(pairingPass, pin string) (*types.PairingInfo, error) { - appInfo, err := keycard.Select(i.c, identifiers.KeycardAID) - if err != nil { - return nil, err - } - - if !appInfo.Initialized { - return nil, ErrNotInitialized - } - - return keycard.Pair(i.c, pairingPass, pin) -} - // Info returns a types.ApplicationInfo struct with info about the card. func (i *Initializer) Info() (*types.ApplicationInfo, error) { return keycard.Select(i.c, identifiers.KeycardAID) } -// Status returns -func (i *Initializer) Status(index uint8, key []byte) (*types.ApplicationStatus, error) { - info, err := keycard.Select(i.c, identifiers.KeycardAID) - if err != nil { - return nil, err - } - - if !info.Installed { - return nil, errAppletNotInstalled - } - - if !info.Initialized { - return nil, errCardNotInitialized - } - - sc, err := keycard.OpenSecureChannel(i.c, info, index, key) - if err != nil { - return nil, err - } - - return keycard.GetStatusApplication(sc) -} - -// Delete deletes the applet and related package from the card. -func (i *Initializer) Delete() error { - err := i.initGPSecureChannel(keycard.CardManagerAID) - if err != nil { - return err - } - - instanceAID, err := identifiers.KeycardInstanceAID(1) - if err != nil { - return err - } - return i.deleteAID(identifiers.NdefInstanceAID, instanceAID, identifiers.PackageAID) -} - func (i *Initializer) initGPSecureChannel(sdaid []byte) error { // select card manager err := i.selectAID(sdaid) @@ -169,7 +85,7 @@ func (i *Initializer) initGPSecureChannel(sdaid []byte) error { } func (i *Initializer) selectAID(aid []byte) error { - sel := globalplatform.NewCommandSelect(keycard.CardManagerAID) + sel := globalplatform.NewCommandSelect(identifiers.CardManagerAID) _, err := i.send("select", sel) return err @@ -220,7 +136,7 @@ func (i *Initializer) deleteAID(aids ...[]byte) error { func (i *Initializer) installApplets(capFile *os.File) error { // install for load - preLoad := globalplatform.NewCommandInstallForLoad(identifiers.PackageAID, keycard.CardManagerAID) + preLoad := globalplatform.NewCommandInstallForLoad(identifiers.PackageAID, identifiers.CardManagerAID) _, err := i.send("install for load", preLoad) if err != nil { return err diff --git a/installer.go b/installer.go index 48d779d..bc8b7b0 100644 --- a/installer.go +++ b/installer.go @@ -10,6 +10,7 @@ import ( "github.com/status-im/keycard-go/globalplatform" "github.com/status-im/keycard-go/hexutils" "github.com/status-im/keycard-go/identifiers" + "github.com/status-im/keycard-go/types" ) var ( @@ -19,7 +20,7 @@ var ( // Installer defines a struct with methods to install applets in a card. type Installer struct { - c globalplatform.Channel + c types.Channel } // NewInstaller returns a new Installer that communicates to Transmitter t. @@ -86,6 +87,32 @@ func (i *Installer) Install(capFile *os.File, overwriteApplet bool) error { return err } +// Delete deletes the applet from the card. +func (i *Installer) Delete() error { + cmdSet := globalplatform.NewCommandSet(i.c) + + logger.Info("select ISD") + err := cmdSet.Select() + if err != nil { + logger.Error("select failed", "error", err) + return err + } + + logger.Info("opening secure channel") + if err = cmdSet.OpenSecureChannel(); err != nil { + logger.Error("open secure channel failed", "error", err) + return err + } + + logger.Info("delete old version") + if err = cmdSet.DeleteKeycardInstancesAndPackage(); err != nil { + logger.Error("delete keycard instances and package failed", "error", err) + return err + } + + return nil +} + func (i *Installer) checkAppletAlreadyInstalled(cmdSet *globalplatform.CommandSet, overwriteApplet bool) error { keycardInstanceAID, err := identifiers.KeycardInstanceAID(1) if err != nil { diff --git a/main.go b/main.go index d16a83d..51029a7 100644 --- a/main.go +++ b/main.go @@ -214,7 +214,7 @@ func commandInfo(card *scard.Card) error { } func commandDelete(card *scard.Card) error { - i := NewInitializer(card) + i := NewInstaller(card) err := i.Delete() if err != nil { return err