Skip to content

Latest commit

 

History

History
167 lines (117 loc) · 6.33 KB

APDUSPEC.md

File metadata and controls

167 lines (117 loc) · 6.33 KB

Algorand App

General structure

The general structure of commands and responses is as follows:

Commands

Field Type Content Note
CLA byte (1) Application Identifier 0x80
INS byte (1) Instruction ID
P1 byte (1) Parameter 1
P2 byte (1) Parameter 2
L byte (1) Bytes in payload
PAYLOAD byte (L) Payload

Response

Field Type Content Note
ANSWER byte (?) Answer depends on the command
SW1-SW2 byte (2) Return code see list of return codes

Return codes

Return code Description
0x6400 Execution Error
0x6982 Empty buffer
0x6983 Output buffer too small
0x6986 Command not allowed
0x6D00 INS not supported
0x6E00 CLA not supported
0x6F00 Unknown
0x8000 Success

Command definition

GET_VERSION

Command

Field Type Content Expected
CLA byte (1) Application Identifier 0x80
INS byte (1) Instruction ID 0x00
P1 byte (1) Parameter 1 ignored
P2 byte (1) Parameter 2 ignored
L byte (1) Bytes in payload 0

Response

Field Type Content Note
TEST byte (1) Test Mode 0xFF means test mode is enabled
MAJOR byte (2) Version Major 0..65535
MINOR byte (2) Version Minor 0..65535
PATCH byte (2) Version Patch 0..65535
LOCKED byte (1) Device is locked
SW1-SW2 byte (2) Return code see list of return codes

INS_GET_PUBLIC_KEY

Command

Field Type Content Expected
CLA byte (1) Application Identifier 0x80
INS byte (1) Instruction ID 0x03
P1 byte (1) Request User confirmation No = 0
P2 byte (1) Parameter 2 ignored
LC byte (1) Bytes in payload (depends)
Payload byte (4) Account ID (depends)

The account number is used to derive keys from BIP32 path 44'/283'/<account>'/0/0 (note that the account number is hardened as shown by the ' sign). Account number defaults to 0x0 in the case of APDU with empty payload.

Response

Field Type Content Note
PublicKey byte (65) Public Key
Address byte (58) Address
SW1-SW2 byte (2) Return code see list of return codes

INS_SIGN_MSGPACK

Command

Field Type Content Expected
CLA byte (1) Application Identifier 0x80
INS byte (1) Instruction ID 0x08
P1 byte (1) Request User confirmation (depends)
P2 byte (1) Parameter 2 (depends)
LC byte (1) Bytes in payload (depends)
Payload byte (var) AccID + MsgPack Chunks (depends)

If one single APDU may contain a whole transaction, P1 and P2 are both 0x00.

New format enhances messaging with an optional account number that must be inserted in the first chunk of the sequence. As an optional payload, bit 0 of field P1 in the first chunk must be set if present in the message.

And as for INS_GET_PUBLIC_KEY instruction, it is a big-endian encoded 32-bit unsigned integer word.

The resulting sequence of chunks is as follows:

First APDU message

CLA INS P1 P2 LC Payload
0x80 0x08 0x01 0x80 N1 account + MsgPack chunk #1

...

APDU message i

CLA INS P1 P2 LC Payload
0x80 0x08 0x80 0x80 Ni MsgPack chunk #i

...

Last APDU message

CLA INS P1 P2 LC Payload
0x80 0x08 0x80 0x00 NI MsgPack chunk #I

Response

Field Type Content Note
Signature byte (64) Signed message
SW1-SW2 byte (2) Return code see list of return codes

If one signle APDU is needed for the whole transaction along with the account number, P1 and P2 are 0x01 and 0x00 respectively.

CLA INS P1 P2 LC Payload
0x80 0x08 0x01 0x00 N1 account + MsgPack txn

If the account number is not inserted within the message, the former message format is used (P1 in the first chunk is 0x00) and the account number defaults to 0x00 for the transaction signature.

CLA INS P1 P2 LC Payload
0x80 0x08 0x00 0x00 N1 MsgPack txn