Manage ODE decryption keys
Your UCM storage plugin can be used on a device that is secured with Samsung’s On-Device Encryption (ODE). In such a case, the decryption key for ODE can be stored in your space, which means you must ensure that the decryption key is available to the Samsung boot loader early enough in the boot process to decrypt the device. To do so, implement the following.
Command-response APDU sequence
When the Samsung boot loader issues the following command APDU, your plugin must respond with the correct response APDU. The format of these APDUs closely follows the ISO/IEC 7816-4 specification but are not an exact implementation.
Command APDU Fields and Meaning
Field Name | Description |
---|---|
CLA | The type of command, instruction class |
INS | The specific command, instruction code |
P1-P2 | Instruction parameters for the command |
Lc | The number of bytes of command data |
Data | The command data |
Le | The maximum number of response bytes expected |
Response data | Response data |
SW1-SW2 | Command processing status |
Command APDU: Get status of plugin
The following APDUs enable the boot loader to determine the lock state of the plugin as well as how many remaining attempts are available to unlock it.
Field Name | Acceptable Values |
---|---|
CLA | 0x80 - data on plugin is not encrypted 0x84 - data on plugin is encrypted |
INS | 0xCA |
P1 | 0x00 |
P2 | 0xE2 |
Lc | 0 |
Data | None |
Le | Absent for encoding, Ne = 0 (will be ignored if present) |
Response APDU
Note
The state of the plugin and the remaining number of attempts to get the plugin state must always be returned in the response APDU. Miscellaneous information is optional.
Response Bytes | Description |
---|---|
Data Field (BER-TLV) |
TAG = 0x8A indicates the plugin state
TAG = 0xC2 remaining number of attempts to get the plugin's state
TAG = 0xC3 miscellaneous information
|
SW1-SW2 | 0x9000: Success 0x6B00: Invalid P1 0x6A82: Invalid P2 |
Command APDU: Verify PIN
The following APDUs enable the boot loader to verify the input PIN number and return the current state and remaining retry count. This requires two consecutive APDU commands. The first is a VERIFY APDU command, followed by the GET DATA APDU command (defined in getStatus) to get the applet state and miscellaneous information.
Field Name | Acceptable Values |
---|---|
CLA | 0x80 - data on plugin is not encrypted 0x84 - data on plugin is encrypted |
INS | 0x20 |
P1 | 0x00 |
P2 | 0x00 |
Lc | Length of PIN |
Data | User PIN |
Le | Absent for encoding, Ne = 0 (will be ignored if present) |
Response APDU
Response Bytes | Description |
---|---|
Data Field (BER-TLV) |
None |
SW1-SW2 | 0x9000: Success - PIN is valid 0x63CX: Error - PIN is not valid, X encondes the number of remaining retires 0x6B00: Invalid P1, P2 0x6A80: The command data-field is empty or contains incorrect data. 0x6982: The plugin's current state does not allow this to be processed. |
Command APDU: Generate device encryption key (DEK)
The following APDUs enable the boot loader to generate the DEK, which is stored in the plugin.
Field Name | Acceptable Values |
---|---|
CLA | 0x80 - data on plugin is not encrypted 0x84 - data on plugin is encrypted |
INS | 0xCA |
P1 | 0x00 |
P2 | 0xCE |
Lc | 0 |
Data | None |
Le | Absent for encoding, Ne = 0 (will be ignored if present) |
Response APDU
Response Bytes | Description |
---|---|
Data Field (BER-TLV) |
None |
SW1-SW2 | 0x9000: Success 0x6B00: invalid P1 0x6A82: Invalid P2 0x6982: The plugin's current state does not allow this to be processed. |
Command APDU: Generate DEK and return wrapped DEK
The following APDUs enable the boot loader to generate the DEK and return the wrapped DEK. ODE stores the DEK on the device’s non-volatile memory.
Field Name | Acceptable Values |
---|---|
CLA | 0x80 - data on plugin is not encrypted 0x84 - data on plugin is encrypted |
INS | 0xCA |
P1 | 0x00 |
P2 | 0xCF |
Lc | 0 |
Data | None |
Le | Absent for encoding, Ne = 0 (will be ignored if present) |
Response APDU
Response Bytes | Description |
---|---|
Data Field (BER-TLV) |
TAG = 0xCF to indicate wrapped DEK
|
SW1-SW2 | 0x9000: Success 0x6B00: invalid P1 0x6A82: Invalid P2 0x6982: The plugin's current state does not allow this to be processed. |
Is this page helpful?