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 |