keycard-go/globalplatform/commands.go

82 lines
1.6 KiB
Go
Raw Normal View History

2018-09-19 13:31:06 +00:00
package globalplatform
2018-10-01 11:25:24 +00:00
import (
"github.com/status-im/status-go/smartcard/apdu"
"github.com/status-im/status-go/smartcard/globalplatform/crypto"
)
2018-09-19 13:31:06 +00:00
2018-09-25 15:43:26 +00:00
const (
2018-10-02 11:24:13 +00:00
ClaISO7816 = uint8(0x00)
ClaGp = uint8(0x80)
ClaMac = uint8(0x84)
2018-09-19 13:31:06 +00:00
2018-10-01 11:25:24 +00:00
InsSelect = uint8(0xA4)
InsInitializeUpdate = uint8(0x50)
InsExternalAuthenticate = uint8(0x82)
2018-10-02 11:24:13 +00:00
InsGetResponse = uint8(0xC0)
Sw1ResponseDataIncomplete = uint8(0x61)
2018-09-25 15:43:26 +00:00
)
2018-09-19 13:31:06 +00:00
func NewCommandSelect(aid []byte) *apdu.Command {
2018-10-02 11:24:13 +00:00
c := apdu.NewCommand(
ClaISO7816,
2018-09-19 13:31:06 +00:00
InsSelect,
uint8(0x04),
uint8(0x00),
aid,
)
2018-10-02 11:24:13 +00:00
c.SetLe(0x00)
return c
2018-09-19 13:31:06 +00:00
}
2018-09-25 15:43:26 +00:00
func NewCommandInitializeUpdate(challenge []byte) *apdu.Command {
return apdu.NewCommand(
ClaGp,
InsInitializeUpdate,
uint8(0x00),
uint8(0x00),
challenge,
)
}
2018-10-01 11:25:24 +00:00
func NewCommandExternalAuthenticate(encKey, cardChallenge, hostChallenge []byte) (*apdu.Command, error) {
hostCryptogram, err := calculateHostCryptogram(encKey, cardChallenge, hostChallenge)
if err != nil {
return nil, err
}
return apdu.NewCommand(
ClaMac,
InsExternalAuthenticate,
uint8(0x01), // C-MAC
uint8(0x00),
hostCryptogram,
), nil
}
2018-10-02 11:24:13 +00:00
func NewCommandGetResponse(length uint8) *apdu.Command {
c := apdu.NewCommand(
ClaISO7816,
InsGetResponse,
uint8(0),
uint8(0),
nil,
)
c.SetLe(length)
return c
}
2018-10-01 11:25:24 +00:00
func calculateHostCryptogram(encKey, cardChallenge, hostChallenge []byte) ([]byte, error) {
var data []byte
data = append(data, cardChallenge...)
data = append(data, hostChallenge...)
data = crypto.AppendDESPadding(data)
return crypto.Mac3DES(encKey, data, crypto.NullBytes8)
}