Skip to content

skythen/apdu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

22 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

APDU

Build Status Coverage Status GoDoc Go Report Card

Package apdu implements parsing and conversion of Application Protocol Data Units (APDU) which is the communication format between a card and off-card applications. The format of the APDU is defined in ISO specification 7816-4.

The package has support for extended length APDUs as well.

go get github.com/skythen/apdu

Capdu

Create

You can create a Capdu either by creating a Capdu struct:

  capduCase1 := Capdu{Cla: 0x00, Ins: 0xAB, P1: 0xCD, P2: 0xEF}
  capduCase2 := Capdu{Cla: 0x80, Ins: 0xCA, P1: 0x00, P2: 0x66, Ne: 256}
  capduCase3 := Capdu{Cla: 0x80, Ins: 0xF2, P1: 0xE0, P2: 0x02, Data: []byte{0x4F, 0x00}, Ne: 256}
  capduCase4 := Capdu{Cla: 0x00, Ins: 0xAA, P1: 0xBB, P2: 0xCC, Data: make([]byte, 65535), Ne: 65536}

(please note that Ne is the expected length of response in bytes, not encoded as Le)

or by parsing from bytes/strings:

  bCapdu, err := apdu.ParseCapdu([]byte{0x80, 0xF2, 0xE0, 0x02, 0x02, 0x4F, 0x00, 0x00)
  sCapdu, err := apdu.ParseCapduHexString("80F2E002024F0000")

Convert

Bytes

You can convert a Capdu to its bytes representation with the Bytes() function. Case and format (standard/extended) are inferred and applied automatically.

  b, err := capdu.Bytes()

String

You can convert a Capdu to its hex representation as well. The same rules apply as for conversion to bytes:

  s, err := capdu.String()

Utility

IsExtendedLength

Use IsExtendedLength to check if the CAPDU is of extended length (len of Data > 65535 or Ne > 65536):

  ext := capdu.IsExtendedLength()

Rapdu

Create

You can create a Rapdu either by creating a Rapdu struct:

  r1 := Rapdu{SW1: 0x90, SW2: 0x00}
  r2 := Rapdu{Data: []byte{0x01, 0x02, 0x03}, SW1: 0x90, SW2: 0x00}

or by parsing from bytes/strings:

  r1, err := apdu.ParseRapdu([]byte{0x90, 0x00)
  r2, err := apdu.ParseRapduHexString("0102039000")

Convert

Bytes

You can convert a Rapdu to its bytes representation with the Bytes() function.

  b, err := rapdu.Bytes()

String

You can convert a Rapdu to its hex representation as well.

  s, err := rapdu.String()

Utility

Success/Warning/Error

Use IsSuccess/IsWarning/IsError to check the response status.

  if !rapdu.IsSuccess() {
	  ...
  }

  if rapdu.IsWarning() || rapdu.IsError(){
      ...
  }