blob: da71088e4b181191adec8bf9f0f3c10ac22c7832 [file] [log] [blame]
/*
*
* Copyright 2019-2020 NXP
* SPDX-License-Identifier: Apache-2.0
*/
/** @file */
#ifndef SE050X_APDU_APIS_H_INC
#define SE050X_APDU_APIS_H_INC
#include "se05x_enums.h"
#include "se05x_tlv.h"
/** Se05x_API_CreateSession
*
* Creates a session on SE05X .
*
* Depending on the authentication object being referenced, a specific method of
* authentication applies. The response needs to adhere to this authentication
* method.
*
*
* # Command to Applet
*
* @rst
* +---------+-------------------+------------------------------+
* | Field | Value | Description |
* +=========+===================+==============================+
* | CLA | 0x80 | |
* +---------+-------------------+------------------------------+
* | INS | INS_MGMT | See :cpp:type:`SE05x_INS_t` |
* +---------+-------------------+------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +---------+-------------------+------------------------------+
* | P2 | P2_SESSION_CREATE | See :cpp:type:`SE05x_P2_t` |
* +---------+-------------------+------------------------------+
* | Lc | #(Payload) | Payload length. |
* +---------+-------------------+------------------------------+
* | Payload | TLV[TAG_1] | 4-byte authentication object |
* | | | identifier. |
* +---------+-------------------+------------------------------+
* | Le | 0x0A | Expecting TLV with 8-byte |
* | | | session ID. |
* +---------+-------------------+------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+----------------------------+
* | Value | Description |
* +============+============================+
* | TLV[TAG_1] | 8-byte session identifier. |
* +------------+----------------------------+
* @endrst
*
* # R-APDU Trailer
*
* SW_NO_ERROR:
* * The command is handled successfully.
*
* SW_CONDITIONS_NOT_SATISFIED:
* * The authenticator does not exist
* * The provided input data are incorrect.
* * The session is invalid.
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] authObjectID auth [1:kSE05x_TAG_1]
* @param[out] sessionId [0:kSE05x_TAG_1]
* @param[in,out] psessionIdLen Length for sessionId
*
*
*/
smStatus_t Se05x_API_CreateSession(
pSe05xSession_t session_ctx, uint32_t authObjectID, uint8_t *sessionId, size_t *psessionIdLen);
/** Se05x_API_ExchangeSessionData
*
* Sets session policies for the current session.
*
*
* # Command to Applet
*
* @rst
* +---------+-------------------+-----------------------------+
* | Field | Value | Description |
* +=========+===================+=============================+
* | CLA | 0x80 or 0x84 | - |
* +---------+-------------------+-----------------------------+
* | INS | INS_MGMT | See :cpp:type:`SE05x_INS_t` |
* +---------+-------------------+-----------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +---------+-------------------+-----------------------------+
* | P2 | P2_SESSION_POLICY | See P2 |
* +---------+-------------------+-----------------------------+
* | Lc | #(Payload) | Payload length. |
* +---------+-------------------+-----------------------------+
* | Payload | TLV[TAG_1] | Session policies |
* +---------+-------------------+-----------------------------+
* | | C-MAC | If applicable |
* +---------+-------------------+-----------------------------+
* | Le | 0x00 | - |
* +---------+-------------------+-----------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +-------+----------------------------+
* | Value | Description |
* +=======+============================+
* | R-MAC | Optional, depending on |
* | | established security level |
* +-------+----------------------------+
* @endrst
*
*
* @rst
* +-----------------------------+------------------------+
* | SW | Description |
* +=============================+========================+
* | SW_NO_ERROR | The command is handled |
* | | successfully. |
* +-----------------------------+------------------------+
* | SW_CONDITIONS_NOT_SATISFIED | Invalid policies |
* +-----------------------------+------------------------+
* @endrst
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] policy Check pdf [1:kSE05x_TAG_1]
*
*/
smStatus_t Se05x_API_ExchangeSessionData(pSe05xSession_t session_ctx, pSe05xPolicy_t policy);
/** Se05x_API_RefreshSession
*
* Refreshes a session on , the policy of the running session can be updated; the
* rest of the session state remains.
*
* # Command to Applet
*
* @rst
* +-------+--------------------+-----------------------------------------------+
* | Field | Value | Description |
* +=======+====================+===============================================+
* | CLA | 0x80 | - |
* +-------+--------------------+-----------------------------------------------+
* | INS | INS_MGMT | See :cpp:type:`SE05x_INS_t` |
* +-------+--------------------+-----------------------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+--------------------+-----------------------------------------------+
* | P2 | P2_SESSION_REFRESH | See :cpp:type:`SE05x_P2_t` |
* +-------+--------------------+-----------------------------------------------+
* | Lc | #(Payload) | Payload length. |
* +-------+--------------------+-----------------------------------------------+
* | | TLV[TAG_POLICY] | Byte array containing the policy to attach to |
* | | | the session. [Optional] |
* +-------+--------------------+-----------------------------------------------+
* | Le | - | |
* +-------+--------------------+-----------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] policy policy [1:kSE05x_TAG_POLICY]
*/
smStatus_t Se05x_API_RefreshSession(pSe05xSession_t session_ctx, pSe05xPolicy_t policy);
/** Se05x_API_CloseSession
*
* Closes a running session.
*
* When a session is closed, it cannot be reopened.
*
* All session parameters are transient.
*
* # Command to Applet
*
* @rst
* +-------+------------------+-----------------------------+
* | Field | Value | Description |
* +=======+==================+=============================+
* | CLA | 0x80 | |
* +-------+------------------+-----------------------------+
* | INS | INS_MGMT | See :cpp:type:`SE05x_INS_t` |
* +-------+------------------+-----------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+------------------+-----------------------------+
* | P2 | P2_SESSION_CLOSE | See :cpp:type:`SE05x_P2_t` |
* +-------+------------------+-----------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
* @rst
* +-------------+-------------------------------------+
* | SW | Description |
* +=============+=====================================+
* | SW_NO_ERROR | The session is closed successfully. |
* +-------------+-------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
*/
smStatus_t Se05x_API_CloseSession(pSe05xSession_t session_ctx);
/** Se05x_API_VerifySessionUserID
*
* Verifies the session user identifier (UserID) in order to allow setting up a
* session. If the UserID is correct, the session establishment is successful;
* otherwise the session cannot be opened (SW_CONDITIONS_NOT_SATISFIED is
* returned).
*
* # Command to Applet
*
* @rst
* +-------+-------------------+-----------------------------+
* | Field | Value | Description |
* +=======+===================+=============================+
* | CLA | 0x80 | |
* +-------+-------------------+-----------------------------+
* | INS | INS_MGMT | See :cpp:type:`SE05x_INS_t` |
* +-------+-------------------+-----------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+-------------------+-----------------------------+
* | P2 | P2_SESSION_USERID | See :cpp:type:`SE05x_P2_t` |
* +-------+-------------------+-----------------------------+
* | Lc | #(Payload) | Payload length. |
* +-------+-------------------+-----------------------------+
* | | TLV[TAG_1] | UserID value |
* +-------+-------------------+-----------------------------+
* | Le | - | |
* +-------+-------------------+-----------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] userId userId [1:kSE05x_TAG_1]
* @param[in] userIdLen Length of userId
*/
smStatus_t Se05x_API_VerifySessionUserID(pSe05xSession_t session_ctx, const uint8_t *userId, size_t userIdLen);
/** Se05x_API_SetLockState
*
* Sets the applet transport lock (locked or unlocked). There is a Persistent
* lock and a Transient Lock. If the Persistent lock is UNLOCKED, the device is
* unlocked (regardless of the Transient lock). If the Persistent lock is LOCKED,
* the device is only unlocked when the Transient lock is UNLOCKED and the device
* will be locked again after deselect of the applet.
*
* Note that regardless of the lock state, the credential RESERVED_ID_TRANSPORT
* allows access to all features. For example, it is possible to write/update
* objects within the session opened by RESERVED_ID_TRANSPORT, even if the applet
* is locked.
*
* The default TRANSIENT_LOCK state is LOCKED; there is no default
* PERSISTENT_LOCK state (depends on product configuration).
*
* This command can only be used in a session that used the credential with
* identifier RESERVED_ID_TRANSPORT as authentication object.
*
* @rst
* +-----------------+----------------+-----------------------------------------------+
* | PERSISTENT_LOCK | TRANSIENT_LOCK | Behavior |
* +=================+================+===============================================+
* | UNLOCKED | UNLOCKED | Unlocked until PERSISTENT_LOCK set to LOCKED. |
* +-----------------+----------------+-----------------------------------------------+
* | UNLOCKED | LOCKED | Unlocked until PERSISTENT_LOCK set to LOCKED. |
* +-----------------+----------------+-----------------------------------------------+
* | LOCKED | UNLOCKED | Unlocked until deselect or TRANSIENT_LOCK set |
* | | | to LOCKED. |
* +-----------------+----------------+-----------------------------------------------+
* | LOCKED | LOCKED | Locked until PERSISTENT_LOCK set to UNLOCKED. |
* +-----------------+----------------+-----------------------------------------------+
* @endrst
*
*
* # Command to Applet
*
* @rst
* +---------+--------------+-------------------------------------+
* | Field | Value | Description |
* +=========+==============+=====================================+
* | CLA | 0x80 | |
* +---------+--------------+-------------------------------------+
* | INS | INS_MGMT | See :cpp:type:`SE05x_INS_t` |
* +---------+--------------+-------------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +---------+--------------+-------------------------------------+
* | P2 | P2_TRANSPORT | See :cpp:type:`SE05x_P2_t` |
* +---------+--------------+-------------------------------------+
* | Lc | #(Payload) | |
* +---------+--------------+-------------------------------------+
* | Payload | TLV[TAG_1] | 1-byte :cpp:type:`LockIndicatorRef` |
* +---------+--------------+-------------------------------------+
* | | TLV[TAG_2] | 1-byte :cpp:type:`LockStateRef` |
* +---------+--------------+-------------------------------------+
* | Le | | |
* +---------+--------------+-------------------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] lockIndicator lock indicator [1:kSE05x_TAG_1]
* @param[in] lockState lock state [2:kSE05x_TAG_2]
*/
smStatus_t Se05x_API_SetLockState(pSe05xSession_t session_ctx, uint8_t lockIndicator, uint8_t lockState);
/** Se05x_API_SetPlatformSCPRequest
*
* Sets the required state for platform SCP (required or not required). This is a
* persistent state.
*
* If platform SCP is set to SCP_REQUIRED, any applet APDU command will be
* refused by the applet when platform SCP is not enabled. Enabled means full
* encryption and MAC, both on C-APDU and R-APDU. Any other level is not
* sufficient and will not be accepted. SCP02 will not be accepted (as there is
* no response MAC and encryption).
*
* If platform SCP is set to "not required," any applet APDU command will be
* accepted by the applet.
*
* This command can only be used in a session that used the credential with
* identifier RESERVED_ID_PLATFORM_SCP as authentication object.
*
* Note that the default state is SCP_NOT_REQUIRED.
*
*
* # Command to Applet
*
* @rst
* +---------+------------+-----------------------------------------------+
* | Field | Value | Description |
* +=========+============+===============================================+
* | CLA | 0x80 | |
* +---------+------------+-----------------------------------------------+
* | INS | INS_MGMT | See :cpp:type:`SE05x_INS_t` |
* +---------+------------+-----------------------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +---------+------------+-----------------------------------------------+
* | P2 | P2_SCP | See :cpp:type:`SE05x_P2_t` |
* +---------+------------+-----------------------------------------------+
* | Lc | #(Payload) | |
* +---------+------------+-----------------------------------------------+
* | Payload | TLV[TAG_1] | 1-byte :cpp:type:`SE05x_PlatformSCPRequest_t` |
* +---------+------------+-----------------------------------------------+
* | Le | | |
* +---------+------------+-----------------------------------------------+
* @endrst
*
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] platformSCPRequest platf scp req [1:kSE05x_TAG_1]
*/
smStatus_t Se05x_API_SetPlatformSCPRequest(pSe05xSession_t session_ctx, SE05x_PlatformSCPRequest_t platformSCPRequest);
/** Se05x_API_SetAppletFeatures
*
* Sets the applet features that are supported. To successfully execute this
* command, the session must be authenticated using the RESERVED_ID_FEATURE.
*
* The 2-byte input value is a pre-defined AppletConfig value.
*
* # Command to Applet
*
* @rst
* +---------+------------+-----------------------------------------------+
* | Field | Value | Description |
* +=========+============+===============================================+
* | CLA | 0x80 | |
* +---------+------------+-----------------------------------------------+
* | INS | INS_MGMT | See :cpp:type:`SE05x_INS_t` |
* +---------+------------+-----------------------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +---------+------------+-----------------------------------------------+
* | P2 | P2_VARIANT | See :cpp:type:`SE05x_P2_t` |
* +---------+------------+-----------------------------------------------+
* | Lc | #(Payload) | Payload length |
* +---------+------------+-----------------------------------------------+
* | Payload | TLV[TAG_1] | 2-byte Variant from |
* | | | :cpp:type:`SE05x_AppletConfig_t` |
* +---------+------------+-----------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] variant variant [1:kSE05x_TAG_1]
*/
smStatus_t Se05x_API_SetAppletFeatures(pSe05xSession_t session_ctx, pSe05xAppletFeatures_t appletVariant);
/** Se05x_API_WriteECKey
*
* Write or update an EC key object.
*
* P1KeyPart indicates the key type to be created (if the object does not yet
* exist).
*
* If P1KeyPart = P1_KEY_PAIR, Private Key Value (TLV[TAG_3]) and Public Key
* Value (TLV[TAG_4) must both be present, or both be absent. If absent, the key
* pair is generated in the SE05X .
*
* If the object already exists, P1KeyPart is ignored.
*
* @rst
* +---------+------------------------+------------------------------------------------+
* | Field | Value | Description |
* +=========+========================+================================================+
* | P1 | :cpp:type:`SE05x_P1_t` | See :cpp:type:`SE05x_P1_t` , P1KeyType |
* | | | P1_EC | should only be set for new objects. |
* +---------+------------------------+------------------------------------------------+
* | P2 | P2_DEFAULT | See P2 |
* +---------+------------------------+------------------------------------------------+
* | Payload | TLV[TAG_POLICY] | Byte array containing the object policy. |
* | | | [Optional: default policy applies] |
* | | | [Conditional - only when the object |
* | | | identifier is not in use yet] |
* +---------+------------------------+------------------------------------------------+
* | | TLV[TAG_MAX_ATTEMPTS] | 2-byte maximum number of attempts. If 0 is |
* | | | given, this means unlimited. [Optional: |
* | | | default unlimited] [Conditional: only when |
* | | | the object identifier is not in use yet and |
* | | | INS includes INS_AUTH_OBJECT; see |
* | | | AuthenticationObjectPolicies ] |
* +---------+------------------------+------------------------------------------------+
* | | TLV[TAG_1] | 4-byte object identifier |
* +---------+------------------------+------------------------------------------------+
* | | TLV[TAG_2] | 1-byte curve identifier, see ECCurve |
* | | | [Conditional: only when the object identifier |
* | | | is not in use yet; ] |
* +---------+------------------------+------------------------------------------------+
* | | TLV[TAG_3] | Private key value (see :cpp:type:`ECKeyRef` |
* | | | ) [Conditional: only when the private key is |
* | | | externally generated and P1KeyType is either |
* | | | P1_KEY_PAIR or P1_PRIVATE] |
* +---------+------------------------+------------------------------------------------+
* | | TLV[TAG_4] | Public key value (see :cpp:type:`ECKeyRef` ) |
* | | | [Conditional: only when the public key is |
* | | | externally generated and P1KeyType is either |
* | | | P1_KEY_PAIR or P1_PUBLIC] |
* +---------+------------------------+------------------------------------------------+
* | | TLV[TAG_11] | 4-byte version [Optional] |
* +---------+------------------------+------------------------------------------------+
* @endrst
*
* @param[in] session_ctx The session context
* @param[in] policy The policy
* @param[in] maxAttempt The maximum attempt
* @param[in] objectID The object id
* @param[in] curveID The curve id
* @param[in] privKey The priv key
* @param[in] privKeyLen The priv key length
* @param[in] pubKey The pub key
* @param[in] pubKeyLen The pub key length
* @param[in] ins_type The insert type
* @param[in] key_part The key part
*
* @return The sm status.
*/
smStatus_t Se05x_API_WriteECKey(pSe05xSession_t session_ctx,
pSe05xPolicy_t policy,
SE05x_MaxAttemps_t maxAttempt,
uint32_t objectID,
SE05x_ECCurve_t curveID,
const uint8_t *privKey,
size_t privKeyLen,
const uint8_t *pubKey,
size_t pubKeyLen,
const SE05x_INS_t ins_type,
const SE05x_KeyPart_t key_part);
/** Se05x_API_WriteRSAKey
*
* Creates or writes an RSA key or a key component.
*
* Supported key sizes are listed in RSABitLength. Other values are not
* supported.
*
* An RSA key creation requires multiple ADPUs to be sent:
*
* * The first APDU must contain:
*
* * Policy (optional, so only if non-default applies)
*
* * Object identifier
*
* * Key size
*
* * 1 of the key components.
*
* * Each next APDU must contain 1 of the key components.
*
* The policy applies only once all key components are set.
*
* Once an RSAKey object has been created, its format remains fixed and cannot
* be updated (so CRT or raw mode, no switch possible).
*
* If the object already exists, P1KeyType is ignored.
*
* For key pairs, if no component is present (TAG_3 until TAG_9), the key pair
* will be generated on chip; otherwise the key pair will be constructed
* starting with the given component.
*
* For private keys or public keys, there should always be exactly one of the
* tags TAG_3 until TAG_10.
*
* * TLV[TAG_8] and TLV[TAG_10] must only contain a value if the key pair is
* to be set to a known value and P1KeyType is either P1_KEY_PAIR or
* P1_PUBLIC; otherwise the value must be absent and the length must be
* equal to 0.
*
* * TLV[TAG_9] must only contain a value it the key is to be set in raw mode
* to a known value and P1KeyType is either P1_KEY_PAIR or P1_PRIVATE;
* otherwise the value must be absent and the length must be equal to 0.
*
* * If TLV[TAG_3] up to TLV[TAG_10] are absent (except TLV[TAG_8]), the RSA
* key will be generated on chip in case the object does not yet exist;
* otherwise it will be regenerated. This only applies to RSA key pairs.
*
* * Keys can be set by setting the different components of a key; only 1
* component can be set at a time in this case.
*
*
* @rst
* +---------+-------------------------------+------------------------------------------------+
* | Field | Value | Description |
* +=========+===============================+================================================+
* | P1 | :cpp:type:`SE05x_KeyPart_t` | | See :cpp:type:`SE05x_P1_t` |
* | | P1_RSA | |
* +---------+-------------------------------+------------------------------------------------+
* | P2 | P2_DEFAULT or P2_RAW | See :cpp:type:`SE05x_P2_t`; P2_RAW only in |
* | | | case P1KeyPart = P1_KEY_PAIR and TLV[TAG_3] |
* | | | until TLV[TAG_10] is empty and the must |
* | | | generate a raw RSA key pair; all other cases: |
* | | | P2_DEFAULT. |
* +---------+-------------------------------+------------------------------------------------+
* | Payload | TLV[TAG_POLICY] | Byte array containing the object policy. |
* | | | [Optional: default policy applies] |
* | | | [Conditional: only when the object identifier |
* | | | is not in use yet] |
* +---------+-------------------------------+------------------------------------------------+
* | | TLV[TAG_1] | 4-byte object identifier |
* +---------+-------------------------------+------------------------------------------------+
* | | TLV[TAG_2] | 2-byte key size in bits |
* | | | (:cpp:type:`SE05x_RSABitLength_t`) |
* | | | [Conditional: only when the object identifier |
* | | | is not in use yet] |
* +---------+-------------------------------+------------------------------------------------+
* | | TLV[TAG_3] | P component [Conditional: only when the |
* | | | object identifier is in CRT mode and the key |
* | | | is generated externally and P1KeyPart is |
* | | | either P1_KEY_PAIR or P1_PRIVATE] |
* +---------+-------------------------------+------------------------------------------------+
* | | TLV[TAG_4] | Q component [Conditional: only when the |
* | | | object identifier is in CRT mode and the key |
* | | | is generated externally and P1KeyPart is |
* | | | either P1_KEY_PAIR or P1_PRIVATE] |
* +---------+-------------------------------+------------------------------------------------+
* | | TLV[TAG_5] | DP component [Conditional: only when the |
* | | | object identifier is in CRT mode and the key |
* | | | is generated externally and P1KeyPart is |
* | | | either P1_KEY_PAIR or P1_PRIVATE] |
* +---------+-------------------------------+------------------------------------------------+
* | | TLV[TAG_6] | DQ component [Conditional: only when the |
* | | | object identifier is in CRT mode and the key |
* | | | is generated externally and P1KeyPart is |
* | | | either P1_KEY_PAIR or P1_PRIVATE] |
* +---------+-------------------------------+------------------------------------------------+
* | | TLV[TAG_7] | INV_Q component [Conditional: only when the |
* | | | object identifier is in CRT mode and the key |
* | | | is generated externally and P1KeyPart is |
* | | | either P1_KEY_PAIR or P1_PRIVATE] |
* +---------+-------------------------------+------------------------------------------------+
* | | TLV[TAG_8] | Public exponent |
* +---------+-------------------------------+------------------------------------------------+
* | | TLV[TAG_9] | Private Key (non-CRT mode only) |
* +---------+-------------------------------+------------------------------------------------+
* | | TLV[TAG_10] | Public Key (Modulus) |
* +---------+-------------------------------+------------------------------------------------+
* | | TLV[TAG_11] | 4-byte version [Optional] |
* +---------+-------------------------------+------------------------------------------------+
* @endrst
*
* @param[in] session_ctx The session context
* @param[in] policy The policy
* @param[in] objectID The object id
* @param[in] size The size
* @param[in] p The part p
* @param[in] pLen The p length
* @param[in] q The quarter
* @param[in] qLen The quarter length
* @param[in] dp The part dp
* @param[in] dpLen The dp length
* @param[in] dq The part dq
* @param[in] dqLen The dq length
* @param[in] qInv The quarter inv
* @param[in] qInvLen The quarter inv length
* @param[in] pubExp The pub exponent
* @param[in] pubExpLen The pub exponent length
* @param[in] priv The priv
* @param[in] privLen The priv length
* @param[in] pubMod The pub modifier
* @param[in] pubModLen The pub modifier length
* @param[in] transient_type The transient type
* @param[in] key_part The key part
* @param[in] rsa_format The rsa format
*
* @return The sm status.
*/
smStatus_t Se05x_API_WriteRSAKey(pSe05xSession_t session_ctx,
pSe05xPolicy_t policy,
uint32_t objectID,
uint16_t size,
const uint8_t *p,
size_t pLen,
const uint8_t *q,
size_t qLen,
const uint8_t *dp,
size_t dpLen,
const uint8_t *dq,
size_t dqLen,
const uint8_t *qInv,
size_t qInvLen,
const uint8_t *pubExp,
size_t pubExpLen,
const uint8_t *priv,
size_t privLen,
const uint8_t *pubMod,
size_t pubModLen,
const SE05x_INS_t transient_type,
const SE05x_KeyPart_t key_part,
const SE05x_RSAKeyFormat_t rsa_format);
/** Se05x_API_WriteSymmKey
*
* Creates or writes an AES key, DES key or HMAC key, indicated by P1:
*
* * P1_AES
*
* * P1_DES
*
* * P1_HMAC
*
* Users can pass RFC3394 wrapped keys by indicating the KEK in TLV[TAG_2]. Note
* that RFC3394 required 8-byte aligned input, so this can only be used when the
* key has an 8-byte aligned length.
*
* # Command to Applet
*
* @rst
* +---------+-----------------------+-----------------------------------------------+
* | Field | Value | Description |
* +=========+=======================+===============================================+
* | P1 | See above | See :cpp:type:`SE05x_P1_t` |
* +---------+-----------------------+-----------------------------------------------+
* | P2 | P2_DEFAULT | See :cpp:type:`SE05x_P2_t` |
* +---------+-----------------------+-----------------------------------------------+
* | Payload | TLV[TAG_POLICY] | Byte array containing the object policy. |
* | | | [Optional: default policy applies] |
* | | | [Conditional: only when the object identifier |
* | | | is not in use yet] |
* +---------+-----------------------+-----------------------------------------------+
* | | TLV[TAG_MAX_ATTEMPTS] | 2-byte maximum number of attempts. If 0 is |
* | | | given, this means unlimited. [Optional: |
* | | | default unlimited] [Conditional: only when |
* | | | the object identifier is not in use yet and |
* | | | INS includes INS_AUTH_OBJECT; see |
* | | | AuthenticationObjectPolicies] |
* +---------+-----------------------+-----------------------------------------------+
* | | TLV[TAG_1] | 4-byte object identifier |
* +---------+-----------------------+-----------------------------------------------+
* | | TLV[TAG_2] | 4-byte KEK identifier [Conditional: only |
* | | | when the key value is RFC3394 wrapped] |
* +---------+-----------------------+-----------------------------------------------+
* | | TLV[TAG_3] | Key value, either plain or RFC3394 wrapped. |
* +---------+-----------------------+-----------------------------------------------+
* | | TLV[TAG_4] | Tag length for GCM/GMAC. Will only be used if |
* | | | the object is an AESKey. [Optional] |
* +---------+-----------------------+-----------------------------------------------+
* | | TLV[TAG_11] | 4-byte version [Optional] |
* +---------+-----------------------+-----------------------------------------------+
* @endrst
*
* @param[in] session_ctx The session context
* @param[in] policy The policy
* @param[in] maxAttempt The maximum attempt
* @param[in] objectID The object id
* @param[in] kekID The kek id
* @param[in] keyValue The key value
* @param[in] keyValueLen The key value length
* @param[in] ins_type The insert type
* @param[in] type The type
*
* @return The sm status.
*/
smStatus_t Se05x_API_WriteSymmKey(pSe05xSession_t session_ctx,
pSe05xPolicy_t policy,
SE05x_MaxAttemps_t maxAttempt,
uint32_t objectID,
SE05x_KeyID_t kekID,
const uint8_t *keyValue,
size_t keyValueLen,
const SE05x_INS_t ins_type,
const SE05x_SymmKeyType_t type);
/** Se05x_API_WriteBinary
*
* Creates or writes to a binary file object. Data are written to either the
* start of the file or (if specified) to the offset passed to the function.
*
* # Command to Applet
*
* @rst
* +---------+-----------------+-----------------------------------------------+
* | Field | Value | Description |
* +=========+=================+===============================================+
* | P1 | P1_BINARY | See :cpp:type:`SE05x_P1_t` |
* +---------+-----------------+-----------------------------------------------+
* | P2 | P2_DEFAULT | See :cpp:type:`SE05x_P2_t` |
* +---------+-----------------+-----------------------------------------------+
* | Payload | TLV[TAG_POLICY] | Byte array containing the object policy. |
* | | | [Optional: default policy applies] |
* | | | [Conditional: only when the object identifier |
* | | | is not in use yet] |
* +---------+-----------------+-----------------------------------------------+
* | | TLV[TAG_1] | 4-byte object identifier |
* +---------+-----------------+-----------------------------------------------+
* | | TLV[TAG_2] | 2-byte file offset [Optional: default = 0] |
* +---------+-----------------+-----------------------------------------------+
* | | TLV[TAG_3] | 2-byte file length (up to 0x7FFF). |
* | | | [Conditional: only when the object identifier |
* | | | is not in use yet] |
* +---------+-----------------+-----------------------------------------------+
* | | TLV[TAG_4] | Data to be written [Optional: if not given, |
* | | | TAG_3 must be filled] |
* +---------+-----------------+-----------------------------------------------+
* | | TLV[TAG_11] | 4-byte version [Optional] |
* +---------+-----------------+-----------------------------------------------+
* @endrst
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] policy policy [1:kSE05x_TAG_POLICY]
* @param[in] objectID object id [2:kSE05x_TAG_1]
* @param[in] offset offset [3:kSE05x_TAG_2]
* @param[in] length length [4:kSE05x_TAG_3]
* @param[in] inputData input data [5:kSE05x_TAG_4]
* @param[in] inputDataLen Length of inputData
*/
smStatus_t Se05x_API_WriteBinary(pSe05xSession_t session_ctx,
pSe05xPolicy_t policy,
uint32_t objectID,
uint16_t offset,
uint16_t length,
const uint8_t *inputData,
size_t inputDataLen);
/** Se05x_API_WriteUserID
*
* Creates a UserID object, setting the user identifier value. The policy defines
* the maximum number of attempts that can be performed as comparison.
*
* # Command to Applet
*
* @rst
* +-------+-----------------------+-----------------------------------------------+
* | Field | Value | Description |
* +=======+=======================+===============================================+
* | P1 | P1_USERID | See :cpp:type:`SE05x_P1_t` |
* +-------+-----------------------+-----------------------------------------------+
* | P2 | P2_DEFAULT | See :cpp:type:`SE05x_P2_t` |
* +-------+-----------------------+-----------------------------------------------+
* | | TLV[TAG_POLICY] | Byte array containing the object policy. |
* | | | [Optional: default policy applies] |
* | | | [Conditional: only when the object identifier |
* | | | is not in use yet] |
* +-------+-----------------------+-----------------------------------------------+
* | | TLV[TAG_MAX_ATTEMPTS] | 2-byte maximum number of attempts. If 0 is |
* | | | given, this means unlimited. For pins, the |
* | | | maximum number of attempts must be smaller |
* | | | than 256. [Optional: default = 0] |
* | | | [Conditional: only when the object identifier |
* | | | is not in use yet and INS includes |
* | | | INS_AUTH_OBJECT; see :cpp:type:`-`] |
* +-------+-----------------------+-----------------------------------------------+
* | | TLV[TAG_1] | 4-byte object identifier. |
* +-------+-----------------------+-----------------------------------------------+
* | | TLV[TAG_2] | Byte array containing 4 to 16 bytes user |
* | | | identifier value. |
* +-------+-----------------------+-----------------------------------------------+
* @endrst
*
* @param[in] session_ctx The session context
* @param[in] policy The policy
* @param[in] maxAttempt The maximum attempt
* @param[in] objectID The object id
* @param[in] userId The user identifier
* @param[in] userIdLen The user identifier length
* @param[in] attestation_type The attestation type
*
* @return The sm status.
*/
smStatus_t Se05x_API_WriteUserID(pSe05xSession_t session_ctx,
pSe05xPolicy_t policy,
SE05x_MaxAttemps_t maxAttempt,
uint32_t objectID,
const uint8_t *userId,
size_t userIdLen,
const SE05x_AttestationType_t attestation_type);
/** Se05x_API_CreateCounter
*
* Creates a new counter object.
*
* Counters can only be incremented, not decremented.
*
* When a counter reaches its maximum value (e.g., 0xFFFFFFFF for a 4-byte
* counter), they cannot be incremented again.
*
* An input value (TAG_3) must always have the same length as the existing
* counter (if it exists); otherwise the command will return an error.
*
* # Command to Applet
*
* @rst
* +---------+-----------------+------------------------------------------------+
* | Field | Value | Description |
* +=========+=================+================================================+
* | P1 | P1_COUNTER | See :cpp:type:`SE05x_P1_t` |
* +---------+-----------------+------------------------------------------------+
* | P2 | P2_DEFAULT | See :cpp:type:`SE05x_P2_t` |
* +---------+-----------------+------------------------------------------------+
* | Payload | TLV[TAG_POLICY] | Byte array containing the object policy. |
* | | | [Optional: default policy applies] |
* | | | [Conditional: only when the object identifier |
* | | | is not in use yet] |
* +---------+-----------------+------------------------------------------------+
* | | TLV[TAG_1] | 4-byte counter identifier. |
* +---------+-----------------+------------------------------------------------+
* | | TLV[TAG_2] | 2-byte counter size (1 up to 8 bytes). |
* | | | [Conditional: only if object doesn't exist yet |
* | | | and TAG_3 is not given] |
* +---------+-----------------+------------------------------------------------+
* | | TLV[TAG_3] | Counter value [Optional: - if object doesn't |
* | | | exist: must be present if TAG_2 is not given. |
* | | | - if object exists: if not present, increment |
* | | | by 1. if present, set counter to value.] |
* +---------+-----------------+------------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
* NA
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] policy policy [1:kSE05x_TAG_POLICY]
* @param[in] objectID object id [2:kSE05x_TAG_1]
* @param[in] size size [3:kSE05x_TAG_2]
*/
smStatus_t Se05x_API_CreateCounter(
pSe05xSession_t session_ctx, pSe05xPolicy_t policy, uint32_t objectID, uint16_t size);
/** Se05x_API_SetCounterValue
*
* See @ref Se05x_API_CreateCounter
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID object id [1:kSE05x_TAG_1]
* @param[in] size size [3:kSE05x_TAG_2]
* @param[in] value value [4:kSE05x_TAG_3]
*/
smStatus_t Se05x_API_SetCounterValue(pSe05xSession_t session_ctx, uint32_t objectID, uint16_t size, uint64_t value);
/** Se05x_API_IncCounter
*
* See @ref Se05x_API_CreateCounter
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID object id [1:kSE05x_TAG_1]
*/
smStatus_t Se05x_API_IncCounter(pSe05xSession_t session_ctx, uint32_t objectID);
/** Se05x_API_WritePCR
*
* Creates or writes to a PCR object.
*
* A PCR is a hash to which data can be appended; i.e., writing data to a PCR
* will update the value of the PCR to be the hash of all previously inserted
* data concatenated with the new input data.
*
* A PCR will always use DigestMode = DIGEST_SHA256; no other configuration
* possible.
*
* If TAG_2 and TAG_3 is not passed, the PCR is reset to its initial value (i.e.,
* the value set when the PCR was created).
*
* This reset is controlled under the POLICY_OBJ_ALLOW_DELETE policy, so users
* that can delete the PCR can also reset the PCR to initial value.
*
* # Command to Applet
*
* @rst
* +---------+-----------------+------------------------------------------------+
* | Field | Value | Description |
* +=========+=================+================================================+
* | P1 | P1_PCR | See :cpp:type:`SE05x_P1_t` |
* +---------+-----------------+------------------------------------------------+
* | P2 | P2_DEFAULT | See :cpp:type:`SE05x_P2_t` |
* +---------+-----------------+------------------------------------------------+
* | Payload | TLV[TAG_POLICY] | Byte array containing the object policy. |
* | | | [Optional: default policy applies] |
* | | | [Conditional: only when the object identifier |
* | | | is not in use yet] |
* +---------+-----------------+------------------------------------------------+
* | | TLV[TAG_1] | 4-byte PCR identifier. |
* +---------+-----------------+------------------------------------------------+
* | | TLV[TAG_2] | Initial hash value [Conditional: only when |
* | | | the object identifier is not in use yet] |
* +---------+-----------------+------------------------------------------------+
* | | TLV[TAG_3] | Data to be extended to the existing PCR. |
* | | | [Conditional: only when the object identifier |
* | | | is already in use] [Optional: not present if |
* | | | a Reset is requested] |
* +---------+-----------------+------------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] policy policy [1:kSE05x_TAG_POLICY]
* @param[in] pcrID object id [2:kSE05x_TAG_1]
* @param[in] initialValue initialValue [3:kSE05x_TAG_2]
* @param[in] initialValueLen Length of initialValue
* @param[in] inputData inputData [4:kSE05x_TAG_3]
* @param[in] inputDataLen Length of inputData
*/
smStatus_t Se05x_API_WritePCR(pSe05xSession_t session_ctx,
pSe05xPolicy_t policy,
uint32_t pcrID,
const uint8_t *initialValue,
size_t initialValueLen,
const uint8_t *inputData,
size_t inputDataLen);
/** Se05x_API_ImportObject
*
* Writes a serialized Secure Object to the SE05X (i.e., "import")
*
* # Command to Applet
*
* @rst
* +---------+------------+-----------------------------------------------+
* | Field | Value | Description |
* +=========+============+===============================================+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +---------+------------+-----------------------------------------------+
* | P2 | P2_IMPORT | See :cpp:type:`SE05x_P2_t` |
* +---------+------------+-----------------------------------------------+
* | Payload | TLV[TAG_1] | 4-byte identifier. |
* +---------+------------+-----------------------------------------------+
* | | TLV[TAG_2] | 1-byte :cpp:type:`SE05x_RSAKeyComponent_t` |
* | | | [Conditional: only when the identifier refers |
* | | | to an RSAKey object] |
* +---------+------------+-----------------------------------------------+
* | | TLV[TAG_3] | Serialized object (encrypted). |
* +---------+------------+-----------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID object id [1:kSE05x_TAG_1]
* @param[in] rsaKeyComp rsaKeyComp [2:kSE05x_TAG_2]
* @param[in] serializedObject serializedObject [3:kSE05x_TAG_3]
* @param[in] serializedObjectLen Length of serializedObject
*/
smStatus_t Se05x_API_ImportObject(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_RSAKeyComponent_t rsaKeyComp,
const uint8_t *serializedObject,
size_t serializedObjectLen);
/** Se05x_API_ImportExternalObject
*
* Combined with the INS_IMPORT_EXTERNAL mask, enables users to send a
* WriteSecureObject APDU (WriteECKey until WritePCR) protected by a
* secure channel.
*
* Secure Objects can be imported into the SE05X through a secure channel which
* does not require the establishment of a session. This feature is also referred
* to single side import and can only be used to create or update objects.
*
* The mechanism is based on ECKey session to protect the Secure Object content
* and is summarized in the following figure.
*
* External import flow
*
* The flow above can be summarized in the following steps:
*
* 1. The user obtains the SE public key for import via the to get
* the public key from the device's key pair. Key ID 0x02 will
* return the public key of the EC key pair with
* RESERVED_ID_EXTERNAL_IMPORT. The response is signed by the
* same key pair.
*
* 2. The user calls with input:
* * the applet AID (e.g.A0000003965453000000010300000000)
*
* * the SCPparameters
*
* * 1-byte SCP identifier, must equal0xAB
*
* * 2-byte SCP parameter, must equal 0x01 followed by 1-byte
* security level (which follows the GlobalPlatform security
* level definition, see: .
*
* * key type, must be 0x88 (AES keytype)
*
* * key length, must be 0x10 (AES128key)
*
* * host public key (65-byte NIST P-256 publickey)
*
* * host public key curve identifier (must be 0x03 (=NIST_P256))
*
* * ASN.1 signature over the TLV with tags 0xA6 and0x7F49.
*
* The applet will then calculate the master key by performing SHA256
* over a byte array containing (in order):
*
* * 4-byte counter value being0x00000001
*
* * shared secret (ECDH calculation according [IEEE P1363] using
* the private keyfrom RESERVED_ID_ECKEY_SESSION and the public
* key provided as input to ECKeySessionInternalAuthenticate. The
* length depends on the curve used (e.g. 32 byte for NIST P-256
* curve).
*
* * 16-byte random generated by the SE05X.
*
* * 2-byte SCP parameter, must equal 0x01 followed by 1-byte
* security level (which follows the GlobalPlatform security level
* definition, see: .
*
* * 1-byte keytype
*
* * 1-byte keylength
*
* The master key will then be the 16 MSB's of the hash output.
*
* Using the master key, the 3 session keys are derived by following the
* GlobalPlatform specification to derive session keys, e.g. derivation input:
*
* * ENCsession key = CMAC(MK, 00000000000000000000000400008001)
*
* * CMACsession key = CMAC(MK, 00000000000000000000000600008001)
*
* * RMACsession key = CMAC(MK, 00000000000000000000000700008001)
*
* The Authentication Object ID needs to be passed using TAG_IMPORT_AUTH_KEY_ID,
* followed by the Write APDU command (using tag TAG_1).
*
* The Write APDU command needs to be constructed as follows:
*
* * Encrypt the command encryption counter (starting with
* 0x00000000000000000000000000000001) using the S_ENC key. This
* becomes the IV for the encrypted APDU.
*
* * Get the APDU command payload and pad it (ISO9797 M2 padding).
*
* * Encrypt the payload in AES CBC mode using the S_ENC key.
*
* * Set the Secure Messaging bit in the CLA (0x04).
*
* * Concatenate the MAC chaining value with the full APDU.
*
* * Then calculate the MAC on this byte array and append the 8-byte
* MAC value to the APDU.
*
* * Finally increment the encryption counter for the next command.
*
* A receipt will be generated by doing a CMAC operation on the input from tag
* 0xA6 and 0x7F49 using the RMAC session key,
*
* Receipt = CMAC(RMAC session key, <input from TLV 0xA6 and TLV 0x7F49>)
*
* There is no need to establish a session; therefore, the ImportExternalObject
* commands are always sent in the default session. The ImportExternalObject
* commands are replayable.
*
* The P1 and P2 parameters shall be coded as per the intended operation. For
* example, to import an EC Key, the P1 and P2 parameters as defined in
* WriteECKey shall be specified.
*
* # Command to Applet
*
* @rst
* +---------+-----------------------------+---------------------------------------------+
* | Field | Value | Description |
* +=========+=============================+=============================================+
* | CLA | 0x80 | |
* +---------+-----------------------------+---------------------------------------------+
* | INS | INS_IMPORT_EXTERNAL | See :cpp:type:`SE05x_INS_t` |
* +---------+-----------------------------+---------------------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +---------+-----------------------------+---------------------------------------------+
* | P2 | P2_DEFAULT | See :cpp:type:`SE05x_P2_t` |
* +---------+-----------------------------+---------------------------------------------+
* | Lc | #(Payload) | |
* +---------+-----------------------------+---------------------------------------------+
* | Payload | TLV[TAG_IMPORT_AUTH_DATA] | Authentication data |
* +---------+-----------------------------+---------------------------------------------+
* | | TLV[TAG_IMPORT_AUTH_KEY_ID] | Host public key Identifier |
* +---------+-----------------------------+---------------------------------------------+
* | | TLV[TAG_1]... | Wraps a complete WriteSecureObject command, |
* | | | protected by ECKey session secure messaging |
* +---------+-----------------------------+---------------------------------------------+
* | | TLV[TAG_11] | 4-byte version [Optional] |
* +---------+-----------------------------+---------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] ECKeydata ECKeydata [1:kSE05x_TAG_2]
* @param[in] ECKeydataLen Length of ECKeydata
* @param[in] serializedObject serializedObject [2:kSE05x_TAG_3]
* @param[in] serializedObjectLen Length of serializedObject
*/
smStatus_t Se05x_API_ImportExternalObject(pSe05xSession_t session_ctx,
const uint8_t *ECKeydata,
size_t ECKeydataLen,
const uint8_t *ECAuthKeyID,
size_t ECAuthKeyIDLen,
const uint8_t *serializedObject,
size_t serializedObjectLen);
/** Se05x_API_ReadObject
*
* Reads the content of a Secure Object.
*
* * If the object is a key pair, the command will return the key
* pair's public key.
*
* * If the object is a public key, the command will return the public
* key.
*
* * If the object is a private key or a symmetric key or a userID,
* the command will return SW_CONDITIONS_NOT_SATISFIED.
*
* * If the object is a binary file, the file content is read, giving
* the offset in TLV[TAG_2] and the length to read in
* TLV[TAG_3]. Both TLV[TAG_2] and TLV[TAG_3] are bound together;
* i.e.. either both tags are present, or both are absent. If both
* are absent, the whole file content is returned.
*
* * If the object is a monotonic counter, the counter value is
* returned.
*
* * If the object is a PCR, the PCR value is returned.
*
* * If TLV[TAG_4] is filled, only the modulus or public exponent of
* an RSA key pair or RSA public key is read. It does not apply to
* other Secure Object types.
*
* # Command to Applet
*
* @rst
* +-------+------------+----------------------------------------------+
* | Field | Value | Description |
* +=======+============+==============================================+
* | CLA | 0x80 | |
* +-------+------------+----------------------------------------------+
* | INS | INS_READ | See :cpp:type:`SE05x_INS_t`, in addition to |
* | | | INS_READ, users can set the INS_ATTEST flag. |
* | | | In that case, attestation applies. |
* +-------+------------+----------------------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+------------+----------------------------------------------+
* | P2 | P2_DEFAULT | See :cpp:type:`SE05x_P2_t` |
* +-------+------------+----------------------------------------------+
* | Lc | #(Payload) | Payload Length. |
* +-------+------------+----------------------------------------------+
* | | TLV[TAG_1] | 4-byte object identifier |
* +-------+------------+----------------------------------------------+
* | | TLV[TAG_2] | 2-byte offset [Optional: default 0] |
* | | | [Conditional: only when the object is a |
* | | | BinaryFile object] |
* +-------+------------+----------------------------------------------+
* | | TLV[TAG_3] | 2-byte length [Optional: default 0] |
* | | | [Conditional: only when the object is a |
* | | | BinaryFile object] |
* +-------+------------+----------------------------------------------+
* | | TLV[TAG_4] | 1-byte :cpp:type:`SE05x_RSAKeyComponent_t`: |
* | | | either RSA_COMP_MOD or RSA_COMP_PUB_EXP. |
* | | | [Optional] [Conditional: only for RSA key |
* | | | components] |
* +-------+------------+----------------------------------------------+
* | Le | 0x00 | |
* +-------+------------+----------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+--------------------------------------------+
* | Value | Description |
* +============+============================================+
* | TLV[TAG_1] | Data read from the secure object. |
* +------------+--------------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------+
* | SW | Description |
* +=============+================================+
* | SW_NO_ERROR | The read is done successfully. |
* +-------------+--------------------------------+
* @endrst
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID object id [1:kSE05x_TAG_1]
* @param[in] offset offset [2:kSE05x_TAG_2]
* @param[in] length length [3:kSE05x_TAG_3]
* @param[out] data [0:kSE05x_TAG_1]
* @param[in,out] pdataLen Length for data
*/
smStatus_t Se05x_API_ReadObject(
pSe05xSession_t session_ctx, uint32_t objectID, uint16_t offset, uint16_t length, uint8_t *data, size_t *pdataLen);
/** Se05x_API_ReadObject_W_Attst
*
* Read with attestation.
*
* See @ref Se05x_API_ReadObject
*
* When INS_ATTEST is set in addition to INS_READ, the secure object is read with
* attestation. In addition to the response in TLV[TAG_1], there are additional
* tags:
*
* TLV[TAG_2] will hold the object attributes (see ObjectAttributes).
*
* TLV[TAG_3] relative timestamp when the object has been retrieved
*
* TLV[TAG_4] will hold freshness random data
*
* TLV[TAG_5] will hold the unique ID of the device.
*
* TLV[TAG_6] will hold the signature over all concatenated Value fields tags of
* the response (TAG_1 until and including TAG_5).
*
* # Command to Applet
*
* @rst
* +-------+------------+----------------------------------------------+
* | Field | Value | Description |
* +=======+============+==============================================+
* | CLA | 0x80 | |
* +-------+------------+----------------------------------------------+
* | INS | INS_READ | See :cpp:type:`SE05x_INS_t`, in addition to |
* | | | INS_READ, users can set the INS_ATTEST flag. |
* | | | In that case, attestation applies. |
* +-------+------------+----------------------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+------------+----------------------------------------------+
* | P2 | P2_DEFAULT | See :cpp:type:`SE05x_P2_t` |
* +-------+------------+----------------------------------------------+
* | Lc | #(Payload) | Payload Length. |
* +-------+------------+----------------------------------------------+
* | | TLV[TAG_1] | 4-byte object identifier |
* +-------+------------+----------------------------------------------+
* | | TLV[TAG_2] | 2-byte offset [Optional: default 0] |
* | | | [Conditional: only when the object is a |
* | | | BinaryFile object] |
* +-------+------------+----------------------------------------------+
* | | TLV[TAG_3] | 2-byte length [Optional: default 0] |
* | | | [Conditional: only when the object is a |
* | | | BinaryFile object] |
* +-------+------------+----------------------------------------------+
* | | TLV[TAG_4] | 1-byte :cpp:type:`SE05x_RSAKeyComponent_t`: |
* | | | either RSA_COMP_MOD or RSA_COMP_PUB_EXP. |
* | | | [Optional] [Conditional: only for RSA key |
* | | | components] |
* +-------+------------+----------------------------------------------+
* | | TLV[TAG_5] | 4-byte attestation object identifier. |
* | | | [Optional] [Conditional: only when |
* | | | INS_ATTEST is set] |
* +-------+------------+----------------------------------------------+
* | | TLV[TAG_6] | 1-byte :cpp:type:`SE05x_AttestationAlgo_t` |
* | | | [Optional] [Conditional: only when |
* | | | INS_ATTEST is set] |
* +-------+------------+----------------------------------------------+
* | | TLV[TAG_7] | 16-byte freshness random [Optional] |
* | | | [Conditional: only when INS_ATTEST is set] |
* +-------+------------+----------------------------------------------+
* | Le | 0x00 | |
* +-------+------------+----------------------------------------------+
* @endrst
*
*
* @rst
* +------------+--------------------------------------------+
* | Value | Description |
* +============+============================================+
* | TLV[TAG_1] | Data read from the secure object. |
* +------------+--------------------------------------------+
* | TLV[TAG_2] | (only when INS_ATTEST is set) Byte array |
* | | containing the attributes (see |
* | | :cpp:type:`ObjectAttributesRef`). |
* +------------+--------------------------------------------+
* | TLV[TAG_3] | (only when INS_ATTEST is set) 12-byte |
* | | timestamp |
* +------------+--------------------------------------------+
* | TLV[TAG_4] | (only when INS_ATTEST is set) 16-byte |
* | | freshness random |
* +------------+--------------------------------------------+
* | TLV[TAG_5] | (only when INS_ATTEST is set) 18-byte Chip |
* | | unique ID |
* +------------+--------------------------------------------+
* | TLV[TAG_6] | (only when INS_ATTEST is set) Signature |
* | | applied over the value of TLV[TAG_1], |
* | | TLV[TAG_2], TLV[TAG_3], TLV[TAG_4] and |
* | | TLV[TAG_5]. |
* +------------+--------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+--------------------------------------------+
* | Value | Description |
* +============+============================================+
* | TLV[TAG_1] | Data read from the secure object. |
* +------------+--------------------------------------------+
* | TLV[TAG_2] | (only when INS_ATTEST is set) Byte array |
* | | containing the attributes (see |
* | | :cpp:type:`ObjectAttributesRef`). |
* +------------+--------------------------------------------+
* | TLV[TAG_3] | (only when INS_ATTEST is set) 12-byte |
* | | timestamp |
* +------------+--------------------------------------------+
* | TLV[TAG_4] | (only when INS_ATTEST is set) 16-byte |
* | | freshness random |
* +------------+--------------------------------------------+
* | TLV[TAG_5] | (only when INS_ATTEST is set) 18-byte Chip |
* | | unique ID |
* +------------+--------------------------------------------+
* | TLV[TAG_6] | (only when INS_ATTEST is set) Signature |
* | | applied over the value of TLV[TAG_1], |
* | | TLV[TAG_2], TLV[TAG_3], TLV[TAG_4] and |
* | | TLV[TAG_5]. |
* +------------+--------------------------------------------+
* @endrst
*
* @param[in] session_ctx The session context
* @param[in] objectID The object id
* @param[in] offset The offset
* @param[in] length The length
* @param[in] attestID The attest id
* @param[in] attestAlgo The attest algorithm
* @param[in] random The random
* @param[in] randomLen The random length
* @param data The data
* @param pdataLen The pdata length
* @param attribute The attribute
* @param pattributeLen The pattribute length
* @param ptimeStamp The ptime stamp
* @param outrandom The outrandom
* @param poutrandomLen The poutrandom length
* @param chipId The chip identifier
* @param pchipIdLen The pchip identifier length
* @param signature The signature
* @param psignatureLen The psignature length
*
* @return The sm status.
*/
smStatus_t Se05x_API_ReadObject_W_Attst(pSe05xSession_t session_ctx,
uint32_t objectID,
uint16_t offset,
uint16_t length,
uint32_t attestID,
SE05x_AttestationAlgo_t attestAlgo,
const uint8_t *random,
size_t randomLen,
uint8_t *data,
size_t *pdataLen,
uint8_t *attribute,
size_t *pattributeLen,
SE05x_TimeStamp_t *ptimeStamp,
uint8_t *outrandom,
size_t *poutrandomLen,
uint8_t *chipId,
size_t *pchipIdLen,
uint8_t *signature,
size_t *psignatureLen);
/** Se05x_API_ReadRSA
*
* See @ref Se05x_API_ReadObject
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID object id [1:kSE05x_TAG_1]
* @param[in] offset offset [2:kSE05x_TAG_2]
* @param[in] length length [3:kSE05x_TAG_3]
* @param[in] rsa_key_comp rsa_key_comp [4:kSE05x_TAG_4]
* @param[out] data [0:kSE05x_TAG_1]
* @param[in,out] pdataLen Length for data
*/
smStatus_t Se05x_API_ReadRSA(pSe05xSession_t session_ctx,
uint32_t objectID,
uint16_t offset,
uint16_t length,
SE05x_RSAPubKeyComp_t rsa_key_comp,
uint8_t *data,
size_t *pdataLen);
/** Se05x_API_ReadRSA_W_Attst
*
* See @ref Se05x_API_ReadObject_W_Attst
*
* @param[in] session_ctx The session context
* @param[in] objectID The object id
* @param[in] offset The offset
* @param[in] length The length
* @param[in] rsa_key_comp The rsa key component
* @param[in] attestID The attest id
* @param[in] attestAlgo The attest algorithm
* @param[in] random The random
* @param[in] randomLen The random length
* @param data The data
* @param pdataLen The pdata length
* @param attribute The attribute
* @param pattributeLen The pattribute length
* @param ptimeStamp The ptime stamp
* @param outrandom The outrandom
* @param poutrandomLen The poutrandom length
* @param chipId The chip identifier
* @param pchipIdLen The pchip identifier length
* @param signature The signature
* @param psignatureLen The psignature length
*
* @return The sm status.
*/
smStatus_t Se05x_API_ReadRSA_W_Attst(pSe05xSession_t session_ctx,
uint32_t objectID,
uint16_t offset,
uint16_t length,
SE05x_RSAPubKeyComp_t rsa_key_comp,
uint32_t attestID,
SE05x_AttestationAlgo_t attestAlgo,
const uint8_t *random,
size_t randomLen,
uint8_t *data,
size_t *pdataLen,
uint8_t *attribute,
size_t *pattributeLen,
SE05x_TimeStamp_t *ptimeStamp,
uint8_t *outrandom,
size_t *poutrandomLen,
uint8_t *chipId,
size_t *pchipIdLen,
uint8_t *signature,
size_t *psignatureLen);
/** Se05x_API_ReadObjectAttributes_W_Attst
*
* Reads the attributes of a Secure Object (without the value of the Secure
* Object).
*
* Each Secure Object has a number of attributes assigned to it. These attributes
* are listed in for Authentication Objects and in for non-Authentication
* Objects.
*
* # Authentication Object attributes
*
* @rst
* +----------------------------------+--------------+------------------------------------------------+
* | Attribute | Size (bytes) | Description |
* +==================================+==============+================================================+
* | Object identifier | 4 | See :cpp:type:`identifiersRef` |
* +----------------------------------+--------------+------------------------------------------------+
* | Object type | 1 | One of SecureObjectType |
* +----------------------------------+--------------+------------------------------------------------+
* | Authentication attribute | 1 | One of :cpp:type:`SetIndicatorRef` |
* +----------------------------------+--------------+------------------------------------------------+
* | Object counter | 2 | Number of failed attempts for an |
* | | | authentication object if the Maximum |
* | | | Authentication Attempts has been set. |
* +----------------------------------+--------------+------------------------------------------------+
* | Authentication object identifier | 4 | "Owner" of the secure object; i.e., the |
* | | | identifier of the session authentication |
* | | | object when the object has been created. |
* +----------------------------------+--------------+------------------------------------------------+
* | Maximum authentication attempts | 2 | Maximum number of authentication attempts. 0 |
* | | | means unlimited. |
* +----------------------------------+--------------+------------------------------------------------+
* | Policy | Variable | Policy attached to the object |
* +----------------------------------+--------------+------------------------------------------------+
* | Origin | 1 | One of :cpp:type:`OriginRef`; indicates the |
* | | | origin of the Secure Object, either |
* | | | externally set, internally generated or trust |
* | | | provisioned by NXP. |
* +----------------------------------+--------------+------------------------------------------------+
* | Version | 1 | The Secure Object version. Default = 0. See |
* | | | FIPS compliance for details about versioning |
* | | | of Secure Objects. |
* +----------------------------------+--------------+------------------------------------------------+
* @endrst
*
* # Non-Authentication Objects
*
* @rst
* +----------------------------------+--------------+------------------------------------------------+
* | Attribute | Size (bytes) | Description |
* +==================================+==============+================================================+
* | Object identifier | 4 | See Object identifiers |
* +----------------------------------+--------------+------------------------------------------------+
* | Object type | 1 | One of SecureObjectType |
* +----------------------------------+--------------+------------------------------------------------+
* | Authentication attribute | 1 | One of :cpp:type:`SetIndicatorRef` |
* +----------------------------------+--------------+------------------------------------------------+
* | Tag length | 2 | Set to 0x0000, except for AESKey objects: for |
* | | | AESKey objects, this indicates the GMAC |
* | | | length that applies when doing AEAD |
* | | | operations. If the value is set to 0 and AEAD |
* | | | operations are done, the GMAC length shall be |
* | | | 128 bit. |
* +----------------------------------+--------------+------------------------------------------------+
* | Authentication object identifier | 4 | "Owner" of the secure object; i.e., the |
* | | | identifier of the session authentication |
* | | | object when the object has been created. |
* +----------------------------------+--------------+------------------------------------------------+
* | RFU | 2 | Set to 0x0000. |
* +----------------------------------+--------------+------------------------------------------------+
* | Policy | Variable | Policy attached to the object |
* +----------------------------------+--------------+------------------------------------------------+
* | Origin | 1 | One of :cpp:type:`OriginRef`; indicates the |
* | | | origin of the Secure Object, either |
* | | | externally set, internally generated or trust |
* | | | provisioned by NXP. |
* +----------------------------------+--------------+------------------------------------------------+
* | Version | 1 | The Secure Object version. Default = 0. See |
* | | | FIPS compliance for details about versioning |
* | | | of Secure Objects. |
* +----------------------------------+--------------+------------------------------------------------+
* @endrst
*
*
* # Command to Applet
*
* @rst
* +-------+---------------+-----------------------------------------------+
* | Field | Value | Description |
* +=======+===============+===============================================+
* | CLA | 0x80 | |
* +-------+---------------+-----------------------------------------------+
* | INS | INS_READ | See :cpp:type:`SE05x_INS_t`, in addition to |
* | | | INS_READ, users can set the INS_ATTEST flag. |
* | | | In that case, attestation applies. |
* +-------+---------------+-----------------------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+---------------+-----------------------------------------------+
* | P2 | P2_ATTRIBUTES | See :cpp:type:`SE05x_P2_t` |
* +-------+---------------+-----------------------------------------------+
* | Lc | #(Payload) | Payload Length. |
* +-------+---------------+-----------------------------------------------+
* | | TLV[TAG_1] | 4-byte object identifier |
* +-------+---------------+-----------------------------------------------+
* | | TLV[TAG_5] | 4-byte attestation object identifier. |
* | | | [Optional] [Conditional: only when |
* | | | INS_ATTEST is set] |
* +-------+---------------+-----------------------------------------------+
* | | TLV[TAG_6] | 1-byte AttestationAlgo [Optional] |
* | | | [Conditional: only when INS_ATTEST is set] |
* +-------+---------------+-----------------------------------------------+
* | | TLV[TAG_7] | 16-byte freshness random [Optional] |
* | | | [Conditional: only when INS_ATTEST is set] |
* +-------+---------------+-----------------------------------------------+
* | Le | 0x00 | |
* +-------+---------------+-----------------------------------------------+
* @endrst
*
*
* # R-APDU Body
*
* @rst
* +------------+--------------------------------------------+
* | Value | Description |
* +============+============================================+
* | TLV[TAG_2] | Byte array containing the attributes (see |
* | | Object Attributes). |
* +------------+--------------------------------------------+
* | TLV[TAG_3] | (only when INS_ATTEST is set) 12-byte |
* | | timestamp |
* +------------+--------------------------------------------+
* | TLV[TAG_4] | (only when INS_ATTEST is set) 16-byte |
* | | freshness random |
* +------------+--------------------------------------------+
* | TLV[TAG_5] | (only when INS_ATTEST is set) 18-byte Chip |
* | | unique ID |
* +------------+--------------------------------------------+
* | TLV[TAG_6] | (only when INS_ATTEST is set) Signature |
* | | applied over the value of TLV[TAG_2], |
* | | TLV[TAG_2], TLV[TAG_3], TLV[TAG_4] and |
* | | TLV[TAG_5]. |
* +------------+--------------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------+
* | SW | Description |
* +=============+================================+
* | SW_NO_ERROR | The read is done successfully. |
* +-------------+--------------------------------+
* @endrst
*
* @param[in] session_ctx The session context
* @param[in] objectID The object id
* @param[in] attestID The attest id
* @param[in] attestAlgo The attest algorithm
* @param[in] random The random
* @param[in] randomLen The random length
* @param data The data
* @param pdataLen The pdata length
* @param ptimeStamp The ptime stamp
* @param outrandom The outrandom
* @param poutrandomLen The poutrandom length
* @param chipId The chip identifier
* @param pchipIdLen The pchip identifier length
* @param signature The signature
* @param psignatureLen The psignature length
*
* @return The sm status.
*/
smStatus_t Se05x_API_ReadObjectAttributes_W_Attst(pSe05xSession_t session_ctx,
uint32_t objectID,
uint32_t attestID,
SE05x_AttestationAlgo_t attestAlgo,
const uint8_t *random,
size_t randomLen,
uint8_t *data,
size_t *pdataLen,
SE05x_TimeStamp_t *ptimeStamp,
uint8_t *outrandom,
size_t *poutrandomLen,
uint8_t *chipId,
size_t *pchipIdLen,
uint8_t *signature,
size_t *psignatureLen);
/** Se05x_API_ExportObject
*
* Reads a transient Secure Object from SE05X.
*
* Secure Objects can be serialized so the Secure Object can be represented as a
* byte array. The byte array contains all attributes of the Secure Object, as
* well as the value (including the secret part!) of the object.
*
* The purpose of the serialization is to be able to allow export and import of
* Secure Objects. Serialized Secure Objects can be reconstructed so they can be
* used as a (normal) Secure Object. Any operation like key or file management
* and crypto operation can only be done on a deserialized Secure Object.
*
* Users can export transient Secure Objects to a non-trusted environment (e.g.,
* host controller). The object must be AESKey, DESKey, RSAKey or ECCKey.
*
* Exported credentials are always encrypted and MAC'ed.
*
* The following steps are taken:
*
* * The secure element holds a randomly generated persistent
* 256-bit AES cipher and an 128-bit AES CMAC key. Both keys do
* not require user interaction, they are internal to the SE05X .
*
* * A Secure Object that is identified for export is
* serialized. This means the key value as well as all Secure
* Object attributes are stored as byte array (see Object
* attributes for attribute details).
*
* * The serialized Secure Object is encrypted using AES CBC (no
* padding) and using the default IV.
*
* * A CMAC is applied to the serialized Secure Object + metadata
* using the AES CMAC key.
*
* * The byte array is exported.
*
* An object may only be imported into the store if the SecureObject ID and type
* are the same as the exported object. Therefore, it is not possible to import
* if the corresponding object in the applet has been deleted.
*
* NOTES:
*
* * The exported object is not deleted automatically.
*
* * The timestamp has a 100msec granularity, so it is possible to
* export multiple times with the same timestamp. The freshness
* (user input) should avoid duplicate attestation results as the
* user has to provide different freshness input.
*
* # Command to Applet
*
* @rst
* +-------+------------+--------------------------------------------+
* | Field | Value | Description |
* +=======+============+============================================+
* | CLA | 0x80 | |
* +-------+------------+--------------------------------------------+
* | INS | INS_READ | See :cpp:type:`SE05x_INS_t`. |
* +-------+------------+--------------------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+------------+--------------------------------------------+
* | P2 | P2_EXPORT | See :cpp:type:`SE05x_P2_t` |
* +-------+------------+--------------------------------------------+
* | Lc | #(Payload) | Payload Length. |
* +-------+------------+--------------------------------------------+
* | | TLV[TAG_1] | 4-byte object identifier |
* +-------+------------+--------------------------------------------+
* | | TLV[TAG_2] | 1-byte :cpp:type:`SE05x_RSAKeyComponent_t` |
* | | | (only applies to Secure Objects of type |
* | | | RSAKey). |
* +-------+------------+--------------------------------------------+
* | Le | 0x00 | |
* +-------+------------+--------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+----------------------------------------------+
* | Value | Description |
* +============+==============================================+
* | TLV[TAG_1] | Byte array containing exported Secure Object |
* | | data. |
* +------------+----------------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+----------------------------------------------+
* | SW | Description |
* +=============+==============================================+
* | SW_NO_ERROR | The file is created or updated successfully. |
* +-------------+----------------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID object id [1:kSE05x_TAG_1]
* @param[in] rsaKeyComp rsaKeyComp [2:kSE05x_TAG_2]
* @param[out] data [0:kSE05x_TAG_1]
* @param[in,out] pdataLen Length for data
*/
smStatus_t Se05x_API_ExportObject(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_RSAKeyComponent_t rsaKeyComp,
uint8_t *data,
size_t *pdataLen);
/** Se05x_API_ReadType
*
* Get the type of a Secure Object.
*
* # Command to Applet
*
* @rst
* +-------+------------+-----------------------------+
* | Field | Value | Description |
* +=======+============+=============================+
* | CLA | 0x80 | |
* +-------+------------+-----------------------------+
* | INS | INS_READ | See :cpp:type:`SE05x_INS_t` |
* +-------+------------+-----------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+------------+-----------------------------+
* | P2 | P2_TYPE | See :cpp:type:`SE05x_P2_t` |
* +-------+------------+-----------------------------+
* | Lc | #(Payload) | |
* +-------+------------+-----------------------------+
* | | TLV[TAG_1] | 4-byte object identifier. |
* +-------+------------+-----------------------------+
* | Le | 0x00 | |
* +-------+------------+-----------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+-----------------------------------+
* | Value | Description |
* +============+===================================+
* | TLV[TAG_1] | Type of the Secure Object: one of |
* | | :cpp:type:`SE05x_SecObjTyp_t` |
* +------------+-----------------------------------+
* | TLV[TAG_2] | :cpp:type:`TransientIndicatorRef` |
* +------------+-----------------------------------+
* @endrst
*
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------+
* | SW | Description |
* +=============+================================+
* | SW_NO_ERROR | Data is returned successfully. |
* +-------------+--------------------------------+
* @endrst
*
*
* @param[in] session_ctx The session context
* @param[in] objectID The object id
* @param ptype The ptype
* @param pisTransient The pis transient
* @param[in] attestation_type The attestation type
*
* @return The sm status.
*/
smStatus_t Se05x_API_ReadType(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_SecureObjectType_t *ptype,
uint8_t *pisTransient,
const SE05x_AttestationType_t attestation_type);
/** Se05x_API_ReadSize
*
* ReadSize
*
* Get the size of a Secure Object (in bytes):
*
* * For EC keys: the size of the curve is returned.
*
* * For RSA keys: the key size is returned.
*
* * For AES/DES/HMAC keys, the key size is returned.
*
* * For binary files: the file size is returned
*
* * For userIDs: nothing is returned (SW_CONDITIONS_NOT_SATISFIED).
*
* * For counters: the counter length is returned.
*
* * For PCR: the PCR length is returned.
*
* # Command to Applet
*
* @rst
* +-------+------------+-----------------------------+
* | Field | Value | Description |
* +=======+============+=============================+
* | CLA | 0x80 | |
* +-------+------------+-----------------------------+
* | INS | INS_READ | See :cpp:type:`SE05x_INS_t` |
* +-------+------------+-----------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+------------+-----------------------------+
* | P2 | P2_SIZE | See :cpp:type:`SE05x_P2_t` |
* +-------+------------+-----------------------------+
* | Lc | #(Payload) | |
* +-------+------------+-----------------------------+
* | | TLV[TAG_1] | 4-byte object identifier. |
* +-------+------------+-----------------------------+
* | Le | 0x00 | |
* +-------+------------+-----------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+-----------------------------+
* | Value | Description |
* +============+=============================+
* | TLV[TAG_1] | Byte array containing size. |
* +------------+-----------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------+
* | SW | Description |
* +=============+================================+
* | SW_NO_ERROR | Data is returned successfully. |
* +-------------+--------------------------------+
* @endrst
*
*
* @param[in] session_ctx The session context
* @param[in] objectID The object id
* @param psize The psize
*
* @return The sm status.
*/
smStatus_t Se05x_API_ReadSize(pSe05xSession_t session_ctx, uint32_t objectID, uint16_t *psize);
/** Se05x_API_ReadIDList
*
* Get a list of present Secure Object identifiers.
*
* The offset in TAG_1 is an 0-based offset in the list of object. As the user
* does not know how many objects would be returned, the offset needs to be based
* on the return values from the previous ReadIDList. If the applet only returns
* a part of the result, it will indicate that more identifiers are available (by
* setting TLV[TAG_1] in the response to 0x01). The user can then retrieve the
* next chunk of identifiers by calling ReadIDList with an offset that equals the
* amount of identifiers listed in the previous response.
*
* _Example 1:_ first ReadIDList command TAG_1=0, response TAG_1=0,
* TAG_2=complete list
*
* _Example 2:_ first ReadIDList command TAG_1=0, response TAG_1=1, TAG_2=first
* chunk (m entries) second ReadIDList command TAG_1=m, response TAG_1=1,
* TAG_2=second chunk (n entries) thirst ReadIDList command TAG_1=(m+n), response
* TAG_1=0, TAG_2=third last chunk
*
* # Command to Applet
*
* @rst
* +-------+------------+-----------------------------------------------+
* | Field | Value | Description |
* +=======+============+===============================================+
* | CLA | 0x80 | |
* +-------+------------+-----------------------------------------------+
* | INS | INS_READ | See :cpp:type:`SE05x_INS_t` |
* +-------+------------+-----------------------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+------------+-----------------------------------------------+
* | P2 | P2_LIST | See :cpp:type:`SE05x_P2_t` |
* +-------+------------+-----------------------------------------------+
* | Lc | #(Payload) | |
* +-------+------------+-----------------------------------------------+
* | | TLV[TAG_1] | 2-byte offset |
* +-------+------------+-----------------------------------------------+
* | | TLV[TAG_2] | 1-byte type filter: 1 byte from |
* | | | :cpp:type:`SE05x_SecObjTyp_t` or 0xFF for all |
* | | | types. |
* +-------+------------+-----------------------------------------------+
* | Le | 0x00 | |
* +-------+------------+-----------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+-------------------------------------------+
* | Value | Description |
* +============+===========================================+
* | TLV[TAG_1] | 1-byte :cpp:type:`MoreIndicatorRef` |
* +------------+-------------------------------------------+
* | TLV[TAG_2] | Byte array containing 4-byte identifiers. |
* +------------+-------------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------+
* | SW | Description |
* +=============+================================+
* | SW_NO_ERROR | Data is returned successfully. |
* +-------------+--------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] outputOffset output offset [1:kSE05x_TAG_1]
* @param[in] filter filter [2:kSE05x_TAG_2]
* @param[out] pmore If more ids are present [0:kSE05x_TAG_1]
* @param[out] idlist Byte array containing 4-byte identifiers [1:kSE05x_TAG_2]
* @param[in,out] pidlistLen Length for idlist
*/
smStatus_t Se05x_API_ReadIDList(pSe05xSession_t session_ctx,
uint16_t outputOffset,
uint8_t filter,
uint8_t *pmore,
uint8_t *idlist,
size_t *pidlistLen);
/** Se05x_API_CheckObjectExists
*
*
* Check if a Secure Object with a certain identifier exists or not.
*
* # Command to Applet
*
* @rst
* +-------+------------+-------------------------------------------+
* | Field | Value | Description |
* +=======+============+===========================================+
* | CLA | 0x80 | |
* +-------+------------+-------------------------------------------+
* | INS | INS_MGMT | See :cpp:type:`SE05x_INS_t` |
* +-------+------------+-------------------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+------------+-------------------------------------------+
* | P2 | P2_EXIST | See :cpp:type:`SE05x_P2_t` |
* +-------+------------+-------------------------------------------+
* | Lc | #(Payload) | |
* +-------+------------+-------------------------------------------+
* | | TLV[TAG_1] | 4-byte existing Secure Object identifier. |
* +-------+------------+-------------------------------------------+
* | Le | 0x00 | |
* +-------+------------+-------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+-----------------------------------+
* | Value | Description |
* +============+===================================+
* | TLV[TAG_1] | 1-byte :cpp:type:`SE05x_Result_t` |
* +------------+-----------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------+
* | SW | Description |
* +=============+================================+
* | SW_NO_ERROR | Data is returned successfully. |
* +-------------+--------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID object id [1:kSE05x_TAG_1]
* @param[out] presult [0:kSE05x_TAG_1]
*/
smStatus_t Se05x_API_CheckObjectExists(pSe05xSession_t session_ctx, uint32_t objectID, SE05x_Result_t *presult);
/** Se05x_API_DeleteSecureObject
*
* Deletes a Secure Object.
*
* If the object origin = ORIGIN_PROVISIONED, an error will be returned and the
* object is not deleted.
*
*
* # Command to Applet
*
* @rst
* +-------+------------------+-------------------------------------------+
* | Field | Value | Description |
* +=======+==================+===========================================+
* | CLA | 0x80 | |
* +-------+------------------+-------------------------------------------+
* | INS | INS_MGMT | See :cpp:type:`SE05x_INS_t` |
* +-------+------------------+-------------------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+------------------+-------------------------------------------+
* | P2 | P2_DELETE_OBJECT | See :cpp:type:`SE05x_P2_t` |
* +-------+------------------+-------------------------------------------+
* | Lc | #(Payload) | |
* +-------+------------------+-------------------------------------------+
* | | TLV[TAG_1] | 4-byte existing Secure Object identifier. |
* +-------+------------------+-------------------------------------------+
* | Le | - | |
* +-------+------------------+-------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
* @rst
* +-------------+----------------------------------------------+
* | SW | Description |
* +=============+==============================================+
* | SW_NO_ERROR | The file is created or updated successfully. |
* +-------------+----------------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID object id [1:kSE05x_TAG_1]
*/
smStatus_t Se05x_API_DeleteSecureObject(pSe05xSession_t session_ctx, uint32_t objectID);
/** Se05x_API_CreateECCurve
*
* Create an EC curve listed in ECCurve.
*
*
* # Command to Applet
*
* @rst
* +-------+------------+-------------------------------+
* | Field | Value | Description |
* +=======+============+===============================+
* | CLA | 0x80 | |
* +-------+------------+-------------------------------+
* | INS | INS_WRITE | See :cpp:type:`SE05x_INS_t` |
* +-------+------------+-------------------------------+
* | P1 | P1_CURVE | See :cpp:type:`SE05x_P1_t` |
* +-------+------------+-------------------------------+
* | P2 | P2_CREATE | See :cpp:type:`SE05x_P2_t` |
* +-------+------------+-------------------------------+
* | Lc | #(Payload) | |
* +-------+------------+-------------------------------+
* | | TLV[TAG_1] | 1-byte curve identifier (from |
* | | | :cpp:type:`SE05x_ECCurve_t`). |
* +-------+------------+-------------------------------+
* | Le | | |
* +-------+------------+-------------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------+
* | SW | Description |
* +=============+================================+
* | SW_NO_ERROR | Data is returned successfully. |
* +-------------+--------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] curveID curve id [1:kSE05x_TAG_1]
*/
smStatus_t Se05x_API_CreateECCurve(pSe05xSession_t session_ctx, SE05x_ECCurve_t curveID);
/** Se05x_API_SetECCurveParam
*
* Set a curve parameter. The curve must have been created first by
* CreateEcCurve.
*
* All parameters must match the expected value for the listed curves. If the
* curve parameters are not correct, the curve cannot be used.
*
* Users have to set all 5 curve parameters for the curve to be usable. Once all
* curve parameters are given, the secure element will check if all parameters
* are correct and return SW_NO_ERROR..
*
* # Command to Applet
*
* @rst
* +-------+------------+----------------------------------------------+
* | Field | Value | Description |
* +=======+============+==============================================+
* | CLA | 0x80 | |
* +-------+------------+----------------------------------------------+
* | INS | INS_WRITE | See :cpp:type:`SE05x_INS_t` |
* +-------+------------+----------------------------------------------+
* | P1 | P1_CURVE | See :cpp:type:`SE05x_P1_t` |
* +-------+------------+----------------------------------------------+
* | P2 | P2_PARAM | See :cpp:type:`SE05x_P2_t` |
* +-------+------------+----------------------------------------------+
* | Lc | #(Payload) | |
* +-------+------------+----------------------------------------------+
* | | TLV[TAG_1] | 1-byte curve identifier, from |
* | | | :cpp:type:`SE05x_ECCurve_t` |
* +-------+------------+----------------------------------------------+
* | | TLV[TAG_2] | 1-byte :cpp:type:`SE05x_ECCurveParam_t` |
* +-------+------------+----------------------------------------------+
* | | TLV[TAG_3] | Bytestring containing curve parameter value. |
* +-------+------------+----------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------+
* | SW | Description |
* +=============+================================+
* | SW_NO_ERROR | Data is returned successfully. |
* +-------------+--------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] curveID curve id [1:kSE05x_TAG_1]
* @param[in] ecCurveParam ecCurveParam [2:kSE05x_TAG_2]
* @param[in] inputData inputData [3:kSE05x_TAG_3]
* @param[in] inputDataLen Length of inputData
*/
smStatus_t Se05x_API_SetECCurveParam(pSe05xSession_t session_ctx,
SE05x_ECCurve_t curveID,
SE05x_ECCurveParam_t ecCurveParam,
const uint8_t *inputData,
size_t inputDataLen);
/** Se05x_API_GetECCurveId
*
* Get the curve associated with an EC key.
*
*
* # Command to Applet
*
* @rst
* +---------+------------+-----------------------------+
* | Field | Value | Description |
* +=========+============+=============================+
* | CLA | 0x80 | |
* +---------+------------+-----------------------------+
* | INS | INS_READ | See :cpp:type:`SE05x_INS_t` |
* +---------+------------+-----------------------------+
* | P1 | P1_CURVE | See :cpp:type:`SE05x_P1_t` |
* +---------+------------+-----------------------------+
* | P2 | P2_ID | See :cpp:type:`SE05x_P2_t` |
* +---------+------------+-----------------------------+
* | Lc | #(Payload) | |
* +---------+------------+-----------------------------+
* | Payload | TLV[TAG_1] | 4-byte identifier |
* +---------+------------+-----------------------------+
* | Le | 0x00 | |
* +---------+------------+-----------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+-------------------------------+
* | Value | Description |
* +============+===============================+
* | TLV[TAG_1] | 1-byte curve identifier (from |
* | | :cpp:type:`SE05x_ECCurve_t`) |
* +------------+-------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------+
* | SW | Description |
* +=============+================================+
* | SW_NO_ERROR | Data is returned successfully. |
* +-------------+--------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID object id [1:kSE05x_TAG_1]
* @param[out] pcurveId [0:kSE05x_TAG_1]
*/
smStatus_t Se05x_API_GetECCurveId(pSe05xSession_t session_ctx, uint32_t objectID, uint8_t *pcurveId);
/** Se05x_API_ReadECCurveList
*
* Get a list of (Weierstrass) EC curves that are instantiated.
*
*
* # Command to Applet
*
* @rst
* +-------+----------+-----------------------------+
* | Field | Value | Description |
* +=======+==========+=============================+
* | CLA | 0x80 | |
* +-------+----------+-----------------------------+
* | INS | INS_READ | See :cpp:type:`SE05x_INS_t` |
* +-------+----------+-----------------------------+
* | P1 | P1_CURVE | See :cpp:type:`SE05x_P1_t` |
* +-------+----------+-----------------------------+
* | P2 | P2_LIST | See :cpp:type:`SE05x_P2_t` |
* +-------+----------+-----------------------------+
* | Le | 0x00 | |
* +-------+----------+-----------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+------------------------------------------------+
* | Value | Description |
* +============+================================================+
* | TLV[TAG_1] | Byte array listing all curve identifiers in |
* | | :cpp:type:`SE05x_ECCurve_t` (excluding UNUSED) |
* | | where the curve identifier < 0x40; for each |
* | | curve, a 1-byte :cpp:type:`SetIndicatorRef` is |
* | | returned. |
* +------------+------------------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------+
* | SW | Description |
* +=============+================================+
* | SW_NO_ERROR | Data is returned successfully. |
* +-------------+--------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[out] curveList [0:kSE05x_TAG_1]
* @param[in,out] pcurveListLen Length for curveList
*/
smStatus_t Se05x_API_ReadECCurveList(pSe05xSession_t session_ctx, uint8_t *curveList, size_t *pcurveListLen);
/** Se05x_API_DeleteECCurve
*
* Deletes an EC curve.
*
* # Command to Applet
*
* @rst
* +-------+------------------+-------------------------------+
* | Field | Value | Description |
* +=======+==================+===============================+
* | CLA | 0x80 | |
* +-------+------------------+-------------------------------+
* | INS | INS_MGMT | See :cpp:type:`SE05x_INS_t` |
* +-------+------------------+-------------------------------+
* | P1 | P1_CURVE | See :cpp:type:`SE05x_P1_t` |
* +-------+------------------+-------------------------------+
* | P2 | P2_DELETE_OBJECT | See :cpp:type:`SE05x_P2_t` |
* +-------+------------------+-------------------------------+
* | Lc | #(Payload) | |
* +-------+------------------+-------------------------------+
* | | TLV[TAG_1] | 1-byte curve identifier (from |
* | | | :cpp:type:`SE05x_ECCurve_t`) |
* +-------+------------------+-------------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------+
* | SW | Description |
* +=============+================================+
* | SW_NO_ERROR | Data is returned successfully. |
* +-------------+--------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] curveID curve id [1:kSE05x_TAG_1]
*/
smStatus_t Se05x_API_DeleteECCurve(pSe05xSession_t session_ctx, SE05x_ECCurve_t curveID);
/** Se05x_API_CreateCryptoObject
*
* Creates a Crypto Object on the SE05X . Once the Crypto Object is created, it
* is bound to the user who created the Crypto Object.
*
* A CryptoObject is a 2-byte value consisting of a CryptoContext in MSB and one
* of the following in LSB:
*
* * DigestMode in case CryptoContext = CC_DIGEST
*
* * CipherMode in case CryptoContext = CC_CIPHER
*
* * MACAlgo in case CryptoContext = CC_SIGNATURE
*
* * AEADMode in case CryptoContext = CC_AEAD
*
* # Command to Applet
*
* @rst
* +---------+---------------+-------------------------------------------+
* | Field | Value | Description |
* +=========+===============+===========================================+
* | CLA | 0x80 | |
* +---------+---------------+-------------------------------------------+
* | INS | INS_WRITE | See :cpp:type:`SE05x_INS_t` |
* +---------+---------------+-------------------------------------------+
* | P1 | P1_CRYPTO_OBJ | See :cpp:type:`SE05x_P1_t` |
* +---------+---------------+-------------------------------------------+
* | P2 | P2_DEFAULT | See :cpp:type:`SE05x_P2_t` |
* +---------+---------------+-------------------------------------------+
* | Lc | #(Payload) | Payload length |
* +---------+---------------+-------------------------------------------+
* | Payload | TLV[TAG_1] | 2-byte Crypto Object identifier |
* +---------+---------------+-------------------------------------------+
* | | TLV[TAG_2] | 1-byte :cpp:type:`SE05x_CryptoObject_t` |
* +---------+---------------+-------------------------------------------+
* | | TLV[TAG_3] | 1-byte Crypto Object subtype, either from |
* | | | :cpp:type:`DigestModeRef`, CipherMode, |
* | | | MACAlgo (depending on TAG_2) or AEADMode. |
* +---------+---------------+-------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
* @rst
* +-------------+----------------------------------------------+
* | SW | Description |
* +=============+==============================================+
* | SW_NO_ERROR | The file is created or updated successfully. |
* +-------------+----------------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] cryptoObjectID cryptoObjectID [1:kSE05x_TAG_1]
* @param[in] cryptoContext cryptoContext [2:kSE05x_TAG_2]
*
* @param[in] subtype 1-byte Crypto Object subtype, either from
* DigestMode, CipherMode or MACAlgo (depending on
* TAG_2). [3:kSE05x_TAG_3]
*/
smStatus_t Se05x_API_CreateCryptoObject(pSe05xSession_t session_ctx,
SE05x_CryptoObjectID_t cryptoObjectID,
SE05x_CryptoContext_t cryptoContext,
SE05x_CryptoModeSubType_t subtype);
/** Se05x_API_ReadCryptoObjectList
*
* Get the list of allocated Crypto Objects indicating the identifier, the
* CryptoContext and the sub type of the CryptoContext.
*
* # Command to Applet
*
* @rst
* +-------+---------------+-----------------------------+
* | Field | Value | Description |
* +=======+===============+=============================+
* | CLA | 0x80 | |
* +-------+---------------+-----------------------------+
* | INS | INS_READ | See :cpp:type:`SE05x_INS_t` |
* +-------+---------------+-----------------------------+
* | P1 | P1_CRYPTO_OBJ | See :cpp:type:`SE05x_P1_t` |
* +-------+---------------+-----------------------------+
* | P2 | P2_LIST | See :cpp:type:`SE05x_P2_t` |
* +-------+---------------+-----------------------------+
* | Le | 0x00 | |
* +-------+---------------+-----------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+-----------------------------------------------+
* | Value | Description |
* +============+===============================================+
* | TLV[TAG_1] | Byte array containing a list of 2-byte Crypto |
* | | Object identifiers, followed by 1-byte |
* | | CryptoContext and 1-byte subtype for each |
* | | Crypto Object (so 4 bytes for each Crypto |
* | | Object). |
* +------------+-----------------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------+
* | SW | Description |
* +=============+================================+
* | SW_NO_ERROR | Data is returned successfully. |
* +-------------+--------------------------------+
* @endrst
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[out] idlist If more ids are present [0:kSE05x_TAG_1]
* @param[in,out] pidlistLen Length for idlist
*/
smStatus_t Se05x_API_ReadCryptoObjectList(pSe05xSession_t session_ctx, uint8_t *idlist, size_t *pidlistLen);
/** Se05x_API_DeleteCryptoObject
*
* Deletes a Crypto Object on the SE05X .
*
* Note: when a Crypto Object is deleted, the memory (as mentioned in ) is de-
* allocated, but the transient memory is only freed when de-selecting the
* applet!
*
* # Command to Applet
*
* @rst
* +---------+------------------+---------------------------------+
* | Field | Value | Description |
* +=========+==================+=================================+
* | CLA | 0x80 | |
* +---------+------------------+---------------------------------+
* | INS | INS_MGMT | See :cpp:type:`SE05x_INS_t` |
* +---------+------------------+---------------------------------+
* | P1 | P1_CRYPTO_OBJ | See :cpp:type:`SE05x_P1_t` |
* +---------+------------------+---------------------------------+
* | P2 | P2_DELETE_OBJECT | See :cpp:type:`SE05x_P2_t` |
* +---------+------------------+---------------------------------+
* | Lc | #(Payload) | Payload length |
* +---------+------------------+---------------------------------+
* | Payload | TLV[TAG_1] | 2-byte Crypto Object identifier |
* +---------+------------------+---------------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
* @rst
* +-------------+----------------------------------------------+
* | SW | Description |
* +=============+==============================================+
* | SW_NO_ERROR | The file is created or updated successfully. |
* +-------------+----------------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] cryptoObjectID cryptoObjectID [1:kSE05x_TAG_1]
*/
smStatus_t Se05x_API_DeleteCryptoObject(pSe05xSession_t session_ctx, SE05x_CryptoObjectID_t cryptoObjectID);
/** Se05x_API_ECDSASign
*
* The ECDSASign command signs external data using the indicated key pair or
* private key.
*
* The ECSignatureAlgo indicates the ECDSA algorithm that is used, but the
* hashing of data always must be done on the host. E.g., if ECSignatureAlgo =
* SIG_ ECDSA_SHA256, the user must have applied SHA256 on the input data
* already.
*
* The user must take care of providing the correct input length; i.e., the data
* input length (TLV[TAG_3]) must match the digest indicated in the signature
* algorithm (TLV[TAG_2]).
*
* In any case, the APDU payload must be smaller than MAX_APDU_PAYLOAD_LENGTH.
*
* This is performed according to the ECDSA algorithm as specified in [ANSI
* X9.62]. The signature (a sequence of two integers 'r' and 's') as
* returned in the response adheres to the ASN.1 DER encoded formatting rules for
* integers.
*
* # Command to Applet
*
* @rst
* +-------+--------------+---------------------------------------------+
* | Field | Value | Description |
* +=======+==============+=============================================+
* | CLA | 0x80 | |
* +-------+--------------+---------------------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +-------+--------------+---------------------------------------------+
* | P1 | P1_SIGNATURE | See :cpp:type:`SE05x_P1_t` |
* +-------+--------------+---------------------------------------------+
* | P2 | P2_SIGN | See :cpp:type:`SE05x_P2_t` |
* +-------+--------------+---------------------------------------------+
* | Lc | #(Payload) | |
* +-------+--------------+---------------------------------------------+
* | | TLV[TAG_1] | 4-byte identifier of EC key pair or private |
* | | | key. |
* +-------+--------------+---------------------------------------------+
* | | TLV[TAG_2] | 1-byte ECSignatureAlgo. |
* +-------+--------------+---------------------------------------------+
* | | TLV[TAG_3] | Byte array containing input data. |
* +-------+--------------+---------------------------------------------+
* | Le | 0x00 | Expecting ASN.1 signature |
* +-------+--------------+---------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+----------------------------------+
* | Value | Description |
* +============+==================================+
* | TLV[TAG_1] | ECDSA Signature in ASN.1 format. |
* +------------+----------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID objectID [1:kSE05x_TAG_1]
* @param[in] ecSignAlgo ecSignAlgo [2:kSE05x_TAG_2]
* @param[in] inputData inputData [3:kSE05x_TAG_3]
* @param[in] inputDataLen Length of inputData
* @param[out] signature [0:kSE05x_TAG_1]
* @param[in,out] psignatureLen Length for signature
*/
smStatus_t Se05x_API_ECDSASign(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_ECSignatureAlgo_t ecSignAlgo,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *signature,
size_t *psignatureLen);
/** Se05x_API_EdDSASign
*
* The EdDSASign command signs external data using the indicated key pair or
* private key (using a Twisted Edwards curve). This is performed according to
* the EdDSA algorithm as specified in [RFC8032].
*
* The input data need to be the plain data (not hashed).
*
* The signature as returned in the response is a 64-byte array, being the
* concatenation of the signature r and s component (without leading zeroes for
* sign indication).
*
* # Command to Applet
*
* @rst
* +-------+--------------+---------------------------------------------+
* | Field | Value | Description |
* +=======+==============+=============================================+
* | CLA | 0x80 | |
* +-------+--------------+---------------------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +-------+--------------+---------------------------------------------+
* | P1 | P1_SIGNATURE | See :cpp:type:`SE05x_P1_t` |
* +-------+--------------+---------------------------------------------+
* | P2 | P2_SIGN | See :cpp:type:`SE05x_P2_t` |
* +-------+--------------+---------------------------------------------+
* | Lc | #(Payload) | |
* +-------+--------------+---------------------------------------------+
* | | TLV[TAG_1] | 4-byte identifier of EC key pair or private |
* | | | key. |
* +-------+--------------+---------------------------------------------+
* | | TLV[TAG_2] | 1-byte EDSignatureAlgo |
* +-------+--------------+---------------------------------------------+
* | | TLV[TAG_3] | Byte array containing plain input data. |
* +-------+--------------+---------------------------------------------+
* | Le | 0x00 | Expecting signature |
* +-------+--------------+---------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+------------------------------------------+
* | Value | Description |
* +============+==========================================+
* | TLV[TAG_1] | EdDSA Signature (r concatenated with s). |
* +------------+------------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID objectID [1:kSE05x_TAG_1]
* @param[in] edSignAlgo edSignAlgo [2:kSE05x_TAG_2]
* @param[in] inputData inputData [3:kSE05x_TAG_3]
* @param[in] inputDataLen Length of inputData
* @param[out] signature [0:kSE05x_TAG_1]
* @param[in,out] psignatureLen Length for signature
*/
smStatus_t Se05x_API_EdDSASign(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_EDSignatureAlgo_t edSignAlgo,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *signature,
size_t *psignatureLen);
/** Se05x_API_ECDAASign
*
* The ECDAASign command signs external data using the indicated key pair or
* private key. This is performed according to ECDAA. The generated signature is:
*
* * r = random mod n
*
* * s = (r + T.ds) mod n where d is the private key
*
* The ECDAASignatureAlgo indicates the applied algorithm.
*
* This APDU command should be used with a key identifier linked to
* TPM_ECC_BN_P256 curve.
*
* _Note:_ The applet allows the random input to be 32 bytes of zeroes; the user
* must take care that this is not considered as valid input. Only input in the
* interval [1, n-1] must be considered as valid.
*
* # Command to Applet
*
* @rst
* +-------+--------------+------------------------------------------------+
* | Field | Value | Description |
* +=======+==============+================================================+
* | CLA | 0x80 | |
* +-------+--------------+------------------------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +-------+--------------+------------------------------------------------+
* | P1 | P1_SIGNATURE | See :cpp:type:`SE05x_P1_t` |
* +-------+--------------+------------------------------------------------+
* | P2 | P2_SIGN | See :cpp:type:`SE05x_P2_t` |
* +-------+--------------+------------------------------------------------+
* | Lc | #(Payload) | |
* +-------+--------------+------------------------------------------------+
* | | TLV[TAG_1] | 4-byte identifier of EC key pair or private |
* | | | key. |
* +-------+--------------+------------------------------------------------+
* | | TLV[TAG_2] | 1-byte ECDAASignatureAlgo |
* +-------+--------------+------------------------------------------------+
* | | TLV[TAG_3] | T = 32-byte array containing hashed input |
* | | | data. |
* +-------+--------------+------------------------------------------------+
* | | TLV[TAG_4] | r = 32-byte array containing random data, must |
* | | | be in the interval [1, n-1] where n is the |
* | | | order of the curve. |
* +-------+--------------+------------------------------------------------+
* | Le | 0x00 | Expecting signature |
* +-------+--------------+------------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+------------------------------------------+
* | Value | Description |
* +============+==========================================+
* | TLV[TAG_1] | ECDSA Signature (r concatenated with s). |
* +------------+------------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID objectID [1:kSE05x_TAG_1]
* @param[in] ecdaaSignAlgo ecdaaSignAlgo [2:kSE05x_TAG_2]
* @param[in] inputData inputData [3:kSE05x_TAG_3]
* @param[in] inputDataLen Length of inputData
* @param[in] randomData randomData [4:kSE05x_TAG_4]
* @param[in] randomDataLen Length of randomData
* @param[out] signature [0:kSE05x_TAG_1]
* @param[in,out] psignatureLen Length for signature
*/
smStatus_t Se05x_API_ECDAASign(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_ECDAASignatureAlgo_t ecdaaSignAlgo,
const uint8_t *inputData,
size_t inputDataLen,
const uint8_t *randomData,
size_t randomDataLen,
uint8_t *signature,
size_t *psignatureLen);
/** Se05x_API_ECDSAVerify
*
* The ECDSAVerify command verifies whether the signature is correct for a given
* (hashed) data input using an EC public key or EC key pair's public key.
*
* The ECSignatureAlgo indicates the ECDSA algorithm that is used, but the
* hashing of data must always be done on the host. E.g., if ECSignatureAlgo =
* SIG_ ECDSA_SHA256, the user must have applied SHA256 on the input data
* already.
*
* The key cannot be passed externally to the command directly. In case users
* want to use the command to verify signatures using different public keys or
* the public key value regularly changes, the user should create a transient key
* object to which the key value is written and then the identifier of that
* transient secure object can be used by this ECDSAVerify command.
*
* # Command to Applet
*
* @rst
* +-------+--------------+-----------------------------------------------+
* | Field | Value | Description |
* +=======+==============+===============================================+
* | CLA | 0x80 | |
* +-------+--------------+-----------------------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +-------+--------------+-----------------------------------------------+
* | P1 | P1_SIGNATURE | See :cpp:type:`SE05x_P1_t` |
* +-------+--------------+-----------------------------------------------+
* | P2 | P2_VERIFY | See :cpp:type:`SE05x_P2_t` |
* +-------+--------------+-----------------------------------------------+
* | Lc | #(Payload) | |
* +-------+--------------+-----------------------------------------------+
* | | TLV[TAG_1] | 4-byte identifier of the key pair or public |
* | | | key. |
* +-------+--------------+-----------------------------------------------+
* | | TLV[TAG_2] | 1-byte ECSignatureAlgo. |
* +-------+--------------+-----------------------------------------------+
* | | TLV[TAG_3] | Byte array containing ASN.1 signature |
* +-------+--------------+-----------------------------------------------+
* | | TLV[TAG_5] | Byte array containing hashed data to compare. |
* +-------+--------------+-----------------------------------------------+
* | Le | 0x03 | Expecting TLV with :cpp:type:`SE05x_Result_t` |
* +-------+--------------+-----------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+--------------------------------------+
* | Value | Description |
* +============+======================================+
* | TLV[TAG_1] | Result of the signature verification |
* | | (:cpp:type:`SE05x_Result_t`). |
* +------------+--------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-----------------------------+--------------------------------------+
* | SW | Description |
* +=============================+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-----------------------------+--------------------------------------+
* | SW_CONDITIONS_NOT_SATISFIED | Incorrect data |
* +-----------------------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID objectID [1:kSE05x_TAG_1]
* @param[in] ecSignAlgo ecSignAlgo [2:kSE05x_TAG_2]
* @param[in] inputData inputData [3:kSE05x_TAG_3]
* @param[in] inputDataLen Length of inputData
* @param[in] signature signature [4:kSE05x_TAG_5]
* @param[in] signatureLen Length of signature
* @param[out] presult [0:kSE05x_TAG_1]
*/
smStatus_t Se05x_API_ECDSAVerify(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_ECSignatureAlgo_t ecSignAlgo,
const uint8_t *inputData,
size_t inputDataLen,
const uint8_t *signature,
size_t signatureLen,
SE05x_Result_t *presult);
/** Se05x_API_EdDSAVerify
*
* The EdDSAVerify command verifies whether the signature is correct for a given
* data input (hashed using SHA512) using an EC public key or EC key pair's
* public key. The signature needs to be given as concatenation of r and s.
*
* The data needs to be compared with the plain message without being hashed.
*
* _Note_ : See chapter 7 for correct byte order as both r and s need to be byte
* swapped.
*
* This is performed according to the EdDSA algorithm as specified in [RFC8032].
*
* The key cannot be passed externally to the command directly. In case users
* want to use the command to verify signatures using different public keys or
* the public key value regularly changes, the user should create a transient key
* object to which the key value is written and then the identifier of that
* transient secure object can be used by this EdDSAVerify command.
*
* # Command to Applet
*
* @rst
* +-------+--------------+-----------------------------------------------+
* | Field | Value | Description |
* +=======+==============+===============================================+
* | CLA | 0x80 | |
* +-------+--------------+-----------------------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +-------+--------------+-----------------------------------------------+
* | P1 | P1_SIGNATURE | See :cpp:type:`SE05x_P1_t` |
* +-------+--------------+-----------------------------------------------+
* | P2 | P2_VERIFY | See :cpp:type:`SE05x_P2_t` |
* +-------+--------------+-----------------------------------------------+
* | Lc | #(Payload) | |
* +-------+--------------+-----------------------------------------------+
* | | TLV[TAG_1] | 4-byte identifier of the key pair or public |
* | | | key. |
* +-------+--------------+-----------------------------------------------+
* | | TLV[TAG_2] | 1-byte :cpp:type:`EDSignatureAlgoRef`. |
* +-------+--------------+-----------------------------------------------+
* | | TLV[TAG_3] | 64-byte array containing the signature |
* | | | (concatenation of r and s). |
* +-------+--------------+-----------------------------------------------+
* | | TLV[TAG_5] | Byte array containing plain data to compare. |
* +-------+--------------+-----------------------------------------------+
* | Le | 0x03 | Expecting TLV with :cpp:type:`SE05x_Result_t` |
* +-------+--------------+-----------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+--------------------------------------+
* | Value | Description |
* +============+======================================+
* | TLV[TAG_1] | Result of the signature verification |
* | | (:cpp:type:`SE05x_Result_t`). |
* +------------+--------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-----------------------------+--------------------------------------+
* | SW | Description |
* +=============================+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-----------------------------+--------------------------------------+
* | SW_CONDITIONS_NOT_SATISFIED | Incorrect data |
* +-----------------------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID objectID [1:kSE05x_TAG_1]
* @param[in] edSignAlgo edSignAlgo [2:kSE05x_TAG_2]
* @param[in] inputData inputData [3:kSE05x_TAG_3]
* @param[in] inputDataLen Length of inputData
* @param[in] signature signature [4:kSE05x_TAG_5]
* @param[in] signatureLen Length of signature
* @param[out] presult [0:kSE05x_TAG_1]
*/
smStatus_t Se05x_API_EdDSAVerify(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_EDSignatureAlgo_t edSignAlgo,
const uint8_t *inputData,
size_t inputDataLen,
const uint8_t *signature,
size_t signatureLen,
SE05x_Result_t *presult);
/** Se05x_API_ECDHGenerateSharedSecret
*
* The ECDHGenerateSharedSecret command generates a shared secret ECC point on
* the curve using an EC private key on SE05X and an external public key provided
* by the caller. The output shared secret is returned to the caller.
*
* All curves from ECCurve are supported, except ECC_ED_25519.
*
* Note that ECDHGenerateSharedSecret commands with EC keys using curve
* ID_ECC_MONT_DH_25519 or ID_ECC_MONT_DH_448 cause NVM write operations for each
* call. This is not the case for the other curves.
*
* When CONFIG_FIPS_MODE_DISABLED is not set, this function will always return
* SW_CONDTIONS_NOT_SATISFIED.
*
* The shared secret can only be received when the Secure Object containing the
* key pair or private key (TLV[TAG_1]) does not contain the policy
* POLICY_OBJ_FORBID_DERIVED_OUTPUT. If that is the case, the user must provide
* TLV[TAG_7} to store the shared secret in an HMACKey object. The user is
* responsible to assign the correct size of the HMACKey object: this must equal
* the size of the shared secret exactly.
*
* On applet 4.4.0, the policy POLICY_OBJ_FORBID_DERIVED_OUTPUT is not yet
* verified for this function. It will always be allowed.
*
* # Command to Applet
*
* @rst
* +------------+------------------------------+----------------------------------------------+
* | Field | Value | Description |
* +============+==============================+==============================================+
* | CLA | 0x80 | |
* +------------+------------------------------+----------------------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +------------+------------------------------+----------------------------------------------+
* | P1 | P1_EC | See :cpp:type:`SE05x_P1_t` |
* +------------+------------------------------+----------------------------------------------+
* | P2 | P2_DH | See :cpp:type:`SE05x_P2_t` |
* +------------+------------------------------+----------------------------------------------+
* | Lc | #(Payload) | |
* +------------+------------------------------+----------------------------------------------+
* | Payload | TLV[TAG_1] | 4-byte identifier of the key pair or private |
* | | | key. |
* +------------+------------------------------+----------------------------------------------+
* | TLV[TAG_2] | External public key (see | |
* | | :cpp:type:`ECKeyRef`). | |
* +------------+------------------------------+----------------------------------------------+
* | TLV[TAG_7] | 4-byte HMACKey identifier to | |
* | | store output. [Optional] | |
* +------------+------------------------------+----------------------------------------------+
* | Le | 0x00 | Expected shared secret length. |
* +------------+------------------------------+----------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+----------------------------------------------+
* | Value | Description |
* +============+==============================================+
* | TLV[TAG_1] | The returned shared secret. [Conditional: |
* | | only when the input does not contain |
* | | TLV[TAG_7].} |
* +------------+----------------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID objectID [1:kSE05x_TAG_1]
* @param[in] pubKey pubKey [2:kSE05x_TAG_2]
* @param[in] pubKeyLen Length of pubKey
* @param[out] sharedSecret [0:kSE05x_TAG_1]
* @param[in,out] psharedSecretLen Length for sharedSecret
*/
smStatus_t Se05x_API_ECDHGenerateSharedSecret(pSe05xSession_t session_ctx,
uint32_t objectID,
const uint8_t *pubKey,
size_t pubKeyLen,
uint8_t *sharedSecret,
size_t *psharedSecretLen);
/** Se05x_API_RSASign
*
* The RSASign command signs the input message using an RSA private key.
*
* @rst
* +----------------------+-------+----------------------------+
* | Name | Value | Description |
* +======================+=======+============================+
* | RSA_SHA1_PKCS1_PSS | 0x15 | RFC8017: RSASSA-PSS |
* +----------------------+-------+----------------------------+
* | RSA_SHA224_PKCS1_PSS | 0x2B | RFC8017: RSASSA-PSS |
* +----------------------+-------+----------------------------+
* | RSA_SHA256_PKCS1_PSS | 0x2C | RFC8017: RSASSA-PSS |
* +----------------------+-------+----------------------------+
* | RSA_SHA384_PKCS1_PSS | 0x2D | RFC8017: RSASSA-PSS |
* +----------------------+-------+----------------------------+
* | RSA_SHA512_PKCS1_PSS | 0x2E | RFC8017: RSASSA-PSS |
* +----------------------+-------+----------------------------+
* | RSA_SHA1_PKCS1 | 0x0A | RFC8017: RSASSA-PKCS1-v1_5 |
* +----------------------+-------+----------------------------+
* | RSA_SHA_224_PKCS1 | 0x27 | RFC8017: RSASSA-PKCS1-v1_5 |
* +----------------------+-------+----------------------------+
* | RSA_SHA_256_PKCS1 | 0x28 | RFC8017: RSASSA-PKCS1-v1_5 |
* +----------------------+-------+----------------------------+
* | RSA_SHA_384_PKCS1 | 0x29 | RFC8017: RSASSA-PKCS1-v1_5 |
* +----------------------+-------+----------------------------+
* | RSA_SHA_512_PKCS1 | 0x2A | RFC8017: RSASSA-PKCS1-v1_5 |
* +----------------------+-------+----------------------------+
* @endrst
*
* # Command to Applet
*
* @rst
* +-------+--------------+----------------------------------------------+
* | Field | Value | Description |
* +=======+==============+==============================================+
* | CLA | 0x80 | |
* +-------+--------------+----------------------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +-------+--------------+----------------------------------------------+
* | P1 | P1_SIGNATURE | See :cpp:type:`SE05x_P1_t` |
* +-------+--------------+----------------------------------------------+
* | P2 | P2_SIGN | See :cpp:type:`SE05x_P2_t` |
* +-------+--------------+----------------------------------------------+
* | Lc | #(Payload) | |
* +-------+--------------+----------------------------------------------+
* | | TLV[TAG_1] | 4-byte identifier of the key pair or private |
* | | | key. |
* +-------+--------------+----------------------------------------------+
* | | TLV[TAG_2] | 1-byte :cpp:type:`SE05x_RSASignAlgo_t` |
* +-------+--------------+----------------------------------------------+
* | | TLV[TAG_3] | Byte array containing input data. |
* +-------+--------------+----------------------------------------------+
* | Le | 0x00 | Expecting ASN.1 signature. |
* +-------+--------------+----------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+--------------------------------+
* | Value | Description |
* +============+================================+
* | TLV[TAG_1] | RSA signature in ASN.1 format. |
* +------------+--------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID objectID [1:kSE05x_TAG_1]
* @param[in] rsaSigningAlgo rsaSigningAlgo [2:kSE05x_TAG_2]
* @param[in] inputData inputData [3:kSE05x_TAG_3]
* @param[in] inputDataLen Length of inputData
* @param[out] signature [0:kSE05x_TAG_1]
* @param[in,out] psignatureLen Length for signature
*/
smStatus_t Se05x_API_RSASign(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_RSASignatureAlgo_t rsaSigningAlgo,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *signature,
size_t *psignatureLen);
/** Se05x_API_RSAVerify
*
* The RSAVerify command verifies the given signature and returns the result.
*
* The key cannot be passed externally to the command directly. In case users
* want to use the command to verify signatures using different public keys or
* the public key value regularly changes, the user should create a transient key
* object to which the key value is written and then the identifier of that
* transient secure object can be used by this RSAVerify command.
*
* # Command to Applet
*
* @rst
* +---------+--------------+---------------------------------------------+
* | Field | Value | Description |
* +=========+==============+=============================================+
* | CLA | 0x80 | |
* +---------+--------------+---------------------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +---------+--------------+---------------------------------------------+
* | P1 | P1_SIGNATURE | See :cpp:type:`SE05x_P1_t` |
* +---------+--------------+---------------------------------------------+
* | P2 | P2_VERIFY | See :cpp:type:`SE05x_P2_t` |
* +---------+--------------+---------------------------------------------+
* | Lc | #(Payload) | |
* +---------+--------------+---------------------------------------------+
* | Payload | | |
* +---------+--------------+---------------------------------------------+
* | | TLV[TAG_1] | 4-byte identifier of the key pair or public |
* | | | key. |
* +---------+--------------+---------------------------------------------+
* | | TLV[TAG_2] | 1-byte :cpp:type:`SE05x_RSASignAlgo_t` |
* +---------+--------------+---------------------------------------------+
* | | TLV[TAG_3] | Byte array containing data to be verified. |
* +---------+--------------+---------------------------------------------+
* | | TLV[TAG_5] | Byte array containing ASN.1 signature. |
* +---------+--------------+---------------------------------------------+
* | Le | 0x03 | Expecting Result in TLV |
* +---------+--------------+---------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+------------------------------------------+
* | Value | Description |
* +============+==========================================+
* | TLV[TAG_1] | :cpp:type:`SE05x_Result_t`: Verification |
* | | result |
* +------------+------------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID objectID [1:kSE05x_TAG_1]
* @param[in] rsaSigningAlgo rsaSigningAlgo [2:kSE05x_TAG_2]
* @param[in] inputData inputData [3:kSE05x_TAG_3]
* @param[in] inputDataLen Length of inputData
* @param[in] signature signature [4:kSE05x_TAG_5]
* @param[in] signatureLen Length of signature
* @param[out] presult [0:kSE05x_TAG_1]
*/
smStatus_t Se05x_API_RSAVerify(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_RSASignatureAlgo_t rsaSigningAlgo,
const uint8_t *inputData,
size_t inputDataLen,
const uint8_t *signature,
size_t signatureLen,
SE05x_Result_t *presult);
/** Se05x_API_RSAEncrypt
*
* The RSAEncrypt command encrypts data.
*
* # Command to Applet
*
* @rst
* +---------+--------------------+----------------------------------------------+
* | Field | Value | Description |
* +=========+====================+==============================================+
* | CLA | 0x80 | |
* +---------+--------------------+----------------------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +---------+--------------------+----------------------------------------------+
* | P1 | P1_RSA | See :cpp:type:`SE05x_P1_t` |
* +---------+--------------------+----------------------------------------------+
* | P2 | P2_ENCRYPT_ONESHOT | See :cpp:type:`SE05x_P2_t` |
* +---------+--------------------+----------------------------------------------+
* | Lc | #(Payload) | |
* +---------+--------------------+----------------------------------------------+
* | Payload | TLV[TAG_1] | 4-byte identifier of the key pair or public |
* | | | key. |
* +---------+--------------------+----------------------------------------------+
* | | TLV[TAG_2] | 1-byte :cpp:type:`SE05x_RSAEncryptionAlgo_t` |
* +---------+--------------------+----------------------------------------------+
* | | TLV[TAG_3] | Byte array containing data to be encrypted. |
* +---------+--------------------+----------------------------------------------+
* | Le | 0x00 | Expected TLV with encrypted data. |
* +---------+--------------------+----------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+----------------+
* | Value | Description |
* +============+================+
* | TLV[TAG_1] | Encrypted data |
* +------------+----------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID objectID [1:kSE05x_TAG_1]
* @param[in] rsaEncryptionAlgo rsaEncryptionAlgo [2:kSE05x_TAG_2]
* @param[in] inputData inputData [3:kSE05x_TAG_3]
* @param[in] inputDataLen Length of inputData
* @param[out] encryptedData [0:kSE05x_TAG_1]
* @param[in,out] pencryptedDataLen Length for encryptedData
*/
smStatus_t Se05x_API_RSAEncrypt(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_RSAEncryptionAlgo_t rsaEncryptionAlgo,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *encryptedData,
size_t *pencryptedDataLen);
/** Se05x_API_RSADecrypt
*
* The RSADecrypt command decrypts data.
*
*
* # Command to Applet
*
* @rst
* +---------+--------------------+----------------------------------------------+
* | Field | Value | Description |
* +=========+====================+==============================================+
* | CLA | 0x80 | |
* +---------+--------------------+----------------------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +---------+--------------------+----------------------------------------------+
* | P1 | P1_RSA | See :cpp:type:`SE05x_P1_t` |
* +---------+--------------------+----------------------------------------------+
* | P2 | P2_DECRYPT_ONESHOT | See :cpp:type:`SE05x_P2_t` |
* +---------+--------------------+----------------------------------------------+
* | Lc | #(Payload) | |
* +---------+--------------------+----------------------------------------------+
* | Payload | TLV[TAG_1] | 4-byte identifier of the key pair or private |
* | | | key. |
* +---------+--------------------+----------------------------------------------+
* | | TLV[TAG_2] | 1-byte :cpp:type:`SE05x_RSAEncryptionAlgo_t` |
* +---------+--------------------+----------------------------------------------+
* | | TLV[TAG_3] | Byte array containing data to be decrypted. |
* +---------+--------------------+----------------------------------------------+
* | Le | 0x00 | Expected TLV with decrypted data. |
* +---------+--------------------+----------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+----------------+
* | Value | Description |
* +============+================+
* | TLV[TAG_1] | Encrypted data |
* +------------+----------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID objectID [1:kSE05x_TAG_1]
* @param[in] rsaEncryptionAlgo rsaEncryptionAlgo [2:kSE05x_TAG_2]
* @param[in] inputData inputData [3:kSE05x_TAG_3]
* @param[in] inputDataLen Length of inputData
* @param[out] decryptedData [0:kSE05x_TAG_1]
* @param[in,out] pdecryptedDataLen Length for decryptedData
*/
smStatus_t Se05x_API_RSADecrypt(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_RSAEncryptionAlgo_t rsaEncryptionAlgo,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *decryptedData,
size_t *pdecryptedDataLen);
/** Se05x_API_CipherInit
*
* Initialize a symmetric encryption or decryption. The Crypto Object keeps the
* state of the cipher operation until it's finalized or deleted. Once the
* CipherFinal function is executed successfully, the Crypto Object state returns
* to the state immediately after the previous CipherInit function.
*
* # Command to Applet
*
* @rst
* +---------+--------------------------+--------------------------------------------+
* | Field | Value | Description |
* +=========+==========================+============================================+
* | CLA | 0x80 | |
* +---------+--------------------------+--------------------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +---------+--------------------------+--------------------------------------------+
* | P1 | P1_CIPHER | See :cpp:type:`SE05x_P1_t` |
* +---------+--------------------------+--------------------------------------------+
* | P2 | P2_ENCRYPT or P2_DECRYPT | See :cpp:type:`SE05x_P2_t` |
* +---------+--------------------------+--------------------------------------------+
* | Lc | #(Payload) | |
* +---------+--------------------------+--------------------------------------------+
* | Payload | TLV[TAG_1] | 4-byte identifier of the key object. |
* +---------+--------------------------+--------------------------------------------+
* | | TLV[TAG_2] | 2-byte Crypto Object identifier |
* +---------+--------------------------+--------------------------------------------+
* | | TLV[TAG_4] | Initialization Vector [Optional] |
* | | | [Conditional: only when the Crypto Object |
* | | | type equals CC_CIPHER and subtype is not |
* | | | including ECB] |
* +---------+--------------------------+--------------------------------------------+
* | Le | - | |
* +---------+--------------------------+--------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID objectID [1:kSE05x_TAG_1]
* @param[in] cryptoObjectID cryptoObjectID [2:kSE05x_TAG_2]
* @param[in] IV IV [3:kSE05x_TAG_4]
* @param[in] IVLen Length of IV
* @param[in] operation See @ref SE05x_Cipher_Oper_t
*/
smStatus_t Se05x_API_CipherInit(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_CryptoObjectID_t cryptoObjectID,
const uint8_t *IV,
size_t IVLen,
const SE05x_Cipher_Oper_t operation);
/** Se05x_API_CipherUpdate
*
* Update a cipher context.
*
*
* # Command to Applet
*
* @rst
* +------------+----------------------------------+---------------------------------+
* | Field | Value | Description |
* +============+==================================+=================================+
* | CLA | 0x80 | |
* +------------+----------------------------------+---------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +------------+----------------------------------+---------------------------------+
* | P1 | P1_CIPHER | See :cpp:type:`SE05x_P1_t` |
* +------------+----------------------------------+---------------------------------+
* | P2 | P2_UPDATE | See :cpp:type:`SE05x_P2_t` |
* +------------+----------------------------------+---------------------------------+
* | Lc | #(Payload) | |
* +------------+----------------------------------+---------------------------------+
* | Payload | TLV[TAG_2] | 2-byte Crypto Object identifier |
* +------------+----------------------------------+---------------------------------+
* | TLV[TAG_3] | Byte array containing input data | |
* +------------+----------------------------------+---------------------------------+
* | Le | 0x00 | Expecting returned data. |
* +------------+----------------------------------+---------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+-------------+
* | Value | Description |
* +============+=============+
* | TLV[TAG_1] | Output data |
* +------------+-------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] cryptoObjectID cryptoObjectID [1:kSE05x_TAG_2]
* @param[in] inputData inputData [2:kSE05x_TAG_3]
* @param[in] inputDataLen Length of inputData
* @param[out] outputData [0:kSE05x_TAG_1]
* @param[in,out] poutputDataLen Length for outputData
*/
smStatus_t Se05x_API_CipherUpdate(pSe05xSession_t session_ctx,
SE05x_CryptoObjectID_t cryptoObjectID,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *outputData,
size_t *poutputDataLen);
/** Se05x_API_CipherFinal
*
* Finish a sequence of cipher operations.
*
* # Command to Applet
*
* @rst
* +------------+------------+---------------------------------+
* | Field | Value | Description |
* +============+============+=================================+
* | CLA | 0x80 | |
* +------------+------------+---------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +------------+------------+---------------------------------+
* | P1 | P1_CIPHER | See :cpp:type:`SE05x_P1_t` |
* +------------+------------+---------------------------------+
* | P2 | P2_FINAL | See :cpp:type:`SE05x_P2_t` |
* +------------+------------+---------------------------------+
* | Lc | #(Payload) | |
* +------------+------------+---------------------------------+
* | Payload | TLV[TAG_2] | 2-byte Crypto Object identifier |
* +------------+------------+---------------------------------+
* | TLV[TAG_3] | Input data | |
* +------------+------------+---------------------------------+
* | Le | 0x00 | Expected returned data. |
* +------------+------------+---------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+-------------+
* | Value | Description |
* +============+=============+
* | TLV[TAG_1] | Output data |
* +------------+-------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] cryptoObjectID cryptoObjectID [1:kSE05x_TAG_2]
* @param[in] inputData inputData [2:kSE05x_TAG_3]
* @param[in] inputDataLen Length of inputData
* @param[out] outputData [0:kSE05x_TAG_1]
* @param[in,out] poutputDataLen Length for outputData
*/
smStatus_t Se05x_API_CipherFinal(pSe05xSession_t session_ctx,
SE05x_CryptoObjectID_t cryptoObjectID,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *outputData,
size_t *poutputDataLen);
/**
* @brief Se05x_API_CipherOneShot
*
* Encrypt or decrypt data in one shot mode.
*
* The key object must be either an AES key or DES key.
*
* # Command to Applet
*
* @rst
* +---------+-----------------------+------------------------------------------------+
* | Field | Value | Description |
* +=========+=======================+================================================+
* | CLA | 0x80 | |
* +---------+-----------------------+------------------------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +---------+-----------------------+------------------------------------------------+
* | P1 | P1_CIPHER | See :cpp:type:`SE05x_P1_t` |
* +---------+-----------------------+------------------------------------------------+
* | P2 | P2_ENCRYPT_ONESHOT or | See :cpp:type:`SE05x_P2_t` |
* | | P2_DECRYPT_ONESHOT | |
* +---------+-----------------------+------------------------------------------------+
* | Lc | #(Payload) | |
* +---------+-----------------------+------------------------------------------------+
* | Payload | TLV[TAG_1] | 4-byte identifier of the key object. |
* +---------+-----------------------+------------------------------------------------+
* | | TLV[TAG_2] | 1-byte CipherMode |
* +---------+-----------------------+------------------------------------------------+
* | | TLV[TAG_3] | Byte array containing input data. |
* +---------+-----------------------+------------------------------------------------+
* | | TLV[TAG_4] | Byte array containing an initialization |
* | | | vector. [Optional] [Conditional: only when |
* | | | the Crypto Object type equals CC_CIPHER and |
* | | | subtype is not including ECB] |
* +---------+-----------------------+------------------------------------------------+
* | Le | 0x00 | Expecting return data. |
* +---------+-----------------------+------------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+-------------+
* | Value | Description |
* +============+=============+
* | TLV[TAG_1] | Output data |
* +------------+-------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
* @param[in] session_ctx The session context
* @param[in] objectID The object id
* @param[in] cipherMode The cipher mode
* @param[in] inputData The input data
* @param[in] inputDataLen The input data length
* @param[in] IV Initial vector
* @param[in] IVLen The iv length
* @param outputData The output data
* @param poutputDataLen The poutput data length
* @param[in] operation The operation
*
* @return The sm status.
*/
smStatus_t Se05x_API_CipherOneShot(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_CipherMode_t cipherMode,
const uint8_t *inputData,
size_t inputDataLen,
const uint8_t *IV,
size_t IVLen,
uint8_t *outputData,
size_t *poutputDataLen,
const SE05x_Cipher_Oper_OneShot_t operation);
/** Se05x_API_MACInit
*
* Initiate a MAC operation. The state of the MAC operation is kept in the Crypto
* Object until it's finalized or deleted.
*
* The 4-byte identifier of the key must refer to an AESKey, DESKey or HMACKey.
*
*
* # Command to Applet
*
* @rst
* +---------+----------------------------+-----------------------------------+
* | Field | Value | Description |
* +=========+============================+===================================+
* | CLA | 0x80 | |
* +---------+----------------------------+-----------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +---------+----------------------------+-----------------------------------+
* | P1 | P1_MAC | See :cpp:type:`SE05x_P1_t` |
* +---------+----------------------------+-----------------------------------+
* | P2 | P2_GENERATE or P2_VALIDATE | See :cpp:type:`SE05x_P2_t` |
* +---------+----------------------------+-----------------------------------+
* | Lc | #(Payload) | |
* +---------+----------------------------+-----------------------------------+
* | Payload | TLV[TAG_1] | 4-byte identifier of the MAC key. |
* +---------+----------------------------+-----------------------------------+
* | | TLV[TAG_2] | 2-byte Crypto Object identifier |
* +---------+----------------------------+-----------------------------------+
* | Le | 0x00 | |
* +---------+----------------------------+-----------------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID objectID [1:kSE05x_TAG_1]
* @param[in] cryptoObjectID cryptoObjectID [2:kSE05x_TAG_2]
* @param[in] mac_oper The Operation
*/
smStatus_t Se05x_API_MACInit(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_CryptoObjectID_t cryptoObjectID,
const SE05x_Mac_Oper_t mac_oper);
/** Se05x_API_MACUpdate
*
* Update MAC
*
* # Command to Applet
*
* @rst
* +---------+------------+-------------------------------------------+
* | Field | Value | Description |
* +=========+============+===========================================+
* | CLA | 0x80 | |
* +---------+------------+-------------------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +---------+------------+-------------------------------------------+
* | P1 | P1_MAC | See :cpp:type:`SE05x_P1_t` |
* +---------+------------+-------------------------------------------+
* | P2 | P2_UPDATE | See :cpp:type:`SE05x_P2_t` |
* +---------+------------+-------------------------------------------+
* | Lc | #(Payload) | |
* +---------+------------+-------------------------------------------+
* | Payload | TLV[TAG_1] | Byte array containing data to be taken as |
* | | | input to MAC. |
* +---------+------------+-------------------------------------------+
* | | TLV[TAG_2] | 2-byte Crypto Object identifier |
* +---------+------------+-------------------------------------------+
* | Le | - | |
* +---------+------------+-------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] inputData inputData [1:kSE05x_TAG_1]
* @param[in] inputDataLen Length of inputData
* @param[in] cryptoObjectID cryptoObjectID [2:kSE05x_TAG_2]
*/
smStatus_t Se05x_API_MACUpdate(
pSe05xSession_t session_ctx, const uint8_t *inputData, size_t inputDataLen, SE05x_CryptoObjectID_t cryptoObjectID);
/** Se05x_API_MACFinal
*
* # Command to Applet
*
* @rst
* +---------+------------+--------------------------------------------+
* | Field | Value | Description |
* +=========+============+============================================+
* | CLA | 0x80 | |
* +---------+------------+--------------------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +---------+------------+--------------------------------------------+
* | P1 | P1_MAC | See :cpp:type:`SE05x_P1_t` |
* +---------+------------+--------------------------------------------+
* | P2 | P2_FINAL | See :cpp:type:`SE05x_P2_t` |
* +---------+------------+--------------------------------------------+
* | Payload | TLV[TAG_1] | Byte array containing data to be taken as |
* | | | input to MAC. |
* +---------+------------+--------------------------------------------+
* | | TLV[TAG_2] | 2-byte Crypto Object identifier |
* +---------+------------+--------------------------------------------+
* | | TLV[TAG_3] | Byte array containing MAC to validate. |
* | | | [Conditional: only applicable the crypto |
* | | | object is set for validating (MACInit P2 = |
* | | | P2_VALIDATE)] |
* +---------+------------+--------------------------------------------+
* | Le | 0x00 | Expecting MAC or result. |
* +---------+------------+--------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+-----------------------------------------------+
* | Value | Description |
* +============+===============================================+
* | TLV[TAG_1] | MAC value (when MACInit had P2 = P2_GENERATE) |
* | | or :cpp:type:`SE05x_Result_t` (when MACInit |
* | | had P2 = P2_VERIFY). |
* +------------+-----------------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] inputData inputData [1:kSE05x_TAG_1]
* @param[in] inputDataLen Length of inputData
* @param[in] cryptoObjectID cryptoObjectID [2:kSE05x_TAG_2]
* @param[in] macValidateData macValidateData [3:kSE05x_TAG_3]
* @param[in] macValidateDataLen Length of macValidateData
* @param[out] macValue [0:kSE05x_TAG_1]
* @param[in,out] pmacValueLen Length for macValue
*/
smStatus_t Se05x_API_MACFinal(pSe05xSession_t session_ctx,
const uint8_t *inputData,
size_t inputDataLen,
SE05x_CryptoObjectID_t cryptoObjectID,
const uint8_t *macValidateData,
size_t macValidateDataLen,
uint8_t *macValue,
size_t *pmacValueLen);
/** Se05x_API_MACOneShot_G
*
* Generate. See @ref Se05x_API_MACOneShot_V for Verfiication.
*
* Performs a MAC operation in one shot (without keeping state).
*
* The 4-byte identifier of the key must refer to an AESKey, DESKey or HMACKey.
*
* # Command to Applet
*
* @rst
* +---------+------------------------+---------------------------------------------+
* | Field | Value | Description |
* +=========+========================+=============================================+
* | CLA | 0x80 | |
* +---------+------------------------+---------------------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +---------+------------------------+---------------------------------------------+
* | P1 | P1_MAC | See :cpp:type:`SE05x_P1_t` |
* +---------+------------------------+---------------------------------------------+
* | P2 | P2_GENERATE_ONESHOT or | See :cpp:type:`SE05x_P2_t` |
* | | P2_VALIDATE_ONESHOT | |
* +---------+------------------------+---------------------------------------------+
* | Lc | #(Payload) | |
* +---------+------------------------+---------------------------------------------+
* | Payload | TLV[TAG_1] | 4-byte identifier of the key object. |
* +---------+------------------------+---------------------------------------------+
* | | TLV[TAG_2] | 1-byte :cpp:type:`MACAlgoRef` |
* +---------+------------------------+---------------------------------------------+
* | | TLV[TAG_3] | Byte array containing data to be taken as |
* | | | input to MAC. |
* +---------+------------------------+---------------------------------------------+
* | | TLV[TAG_5] | MAC to verify (when P2=P2_VALIDATE_ONESHOT) |
* +---------+------------------------+---------------------------------------------+
* | Le | 0x00 | Expecting MAC or Result. |
* +---------+------------------------+---------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+---------------------------------------+
* | Value | Description |
* +============+=======================================+
* | TLV[TAG_1] | MAC value (P2=P2_GENERATE_ONESHOT) or |
* | | :cpp:type:`SE05x_Result_t` (when |
* | | p2=P2_VALIDATE_ONESHOT). |
* +------------+---------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID objectID [1:kSE05x_TAG_1]
* @param[in] macOperation macOperation [2:kSE05x_TAG_2]
* @param[in] inputData inputData [3:kSE05x_TAG_3]
* @param[in] inputDataLen Length of inputData
* @param[out] macValue [0:kSE05x_TAG_1]
* @param[in,out] pmacValueLen Length for macValue
*/
smStatus_t Se05x_API_MACOneShot_G(pSe05xSession_t session_ctx,
uint32_t objectID,
uint8_t macOperation,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *macValue,
size_t *pmacValueLen);
/** Se05x_API_MACOneShot_V
*
* Validate. See @ref Se05x_API_MACOneShot_G for Generation.
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID objectID [1:kSE05x_TAG_1]
* @param[in] macOperation macOperation [2:kSE05x_TAG_2]
* @param[in] inputData inputData [3:kSE05x_TAG_3]
* @param[in] inputDataLen Length of inputData
* @param[in] MAC MAC to verify (when P2=P2_VALIDATE_ONESHOT) [4:kSE05x_TAG_5]
* @param[in] MACLen Length of MAC
* @param[out] macValue [0:kSE05x_TAG_1]
* @param[in,out] pmacValueLen Length for macValue
*/
smStatus_t Se05x_API_MACOneShot_V(pSe05xSession_t session_ctx,
uint32_t objectID,
uint8_t macOperation,
const uint8_t *inputData,
size_t inputDataLen,
const uint8_t *MAC,
size_t MACLen,
uint8_t *macValue,
size_t *pmacValueLen);
/** Se05x_API_HKDF
*
* Note that this KDF is equal to the KDF in Feedback Mode described in [NIST
* SP800-108] with the PRF being HMAC with SHA256 and with an 8-bit counter at
* the end of the iteration variable.
*
* The full HKDF algorithm is executed, i.e. Extract-And-Expand.
*
* The caller must provide a salt length (0 up to 64 bytes). If salt length
* equals 0 or salt is not provided as input, the default salt will be used.
*
* The output of the HKDF functions can be either:
*
* * send back to the caller => _precondition_ : none of the input Secure Objects -if present- shall have a policy POLICY_OBJ_FORBID_DERIVED_OUTPUT set.
*
* * be stored in a Secure Object => _precondition_ : the Secure Object must be created upfront and the size must exactly match the expected length.
*
*
* # Command to Applet
*
* @rst
* +------------+--------------------------------+-----------------------------------+
* | Field | Value | Description |
* +============+================================+===================================+
* | CLA | 0x80 | |
* +------------+--------------------------------+-----------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +------------+--------------------------------+-----------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +------------+--------------------------------+-----------------------------------+
* | P2 | P2_HKDF | See :cpp:type:`SE05x_P2_t` |
* +------------+--------------------------------+-----------------------------------+
* | Lc | #(Payload) | |
* +------------+--------------------------------+-----------------------------------+
* | Payload | TLV[TAG_1] | 4-byte HMACKey identifier (= IKM) |
* +------------+--------------------------------+-----------------------------------+
* | TLV[TAG_2] | 1-byte DigestMode (except | |
* | | DIGEST_NO_HASH) | |
* +------------+--------------------------------+-----------------------------------+
* | TLV[TAG_3] | Byte array (0-64 bytes) | |
* | | containing salt. [Optional] | |
* | | [Conditional: only when | |
* | | TLV[TAG_6] is absent.] | |
* +------------+--------------------------------+-----------------------------------+
* | TLV[TAG_4] | Info: The context and | |
* | | information to apply (1 to 80 | |
* | | bytes). [Optional] | |
* +------------+--------------------------------+-----------------------------------+
* | TLV[TAG_5] | 2-byte requested length (L): 1 | |
* | | up to MAX_APDU_PAYLOAD_LENGTH | |
* +------------+--------------------------------+-----------------------------------+
* | TLV[TAG_6] | 4-byte HMACKey identifier | |
* | | containing salt. [Optional] | |
* | | [Conditional: only when | |
* | | TLV[TAG_3] is absent] | |
* +------------+--------------------------------+-----------------------------------+
* | TLV[TAG_7] | 4-byte HMACKey identifier to | |
* | | store output. [Optional] | |
* +------------+--------------------------------+-----------------------------------+
* | Le | 0x00 | |
* +------------+--------------------------------+-----------------------------------+
* @endrst
*
*
* # R-APDU Body
*
* @rst
* +------------+--------------------------------------------+
* | Value | Description |
* +============+============================================+
* | TLV[TAG_1] | HKDF output. [Conditional: only when the |
* | | input does not contain TLV[TAG-7]] |
* +------------+--------------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+------------------------------------+
* | SW | Description |
* +=============+====================================+
* | SW_NO_ERROR | The HKDF is executed successfully. |
* +-------------+------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] hmacID hmacID [1:kSE05x_TAG_1]
* @param[in] digestMode digestMode [2:kSE05x_TAG_2]
* @param[in] salt salt [3:kSE05x_TAG_3]
* @param[in] saltLen Length of salt
* @param[in] info info [4:kSE05x_TAG_4]
* @param[in] infoLen Length of info
* @param[in] deriveDataLen 2-byte requested length (L) [5:kSE05x_TAG_5]
* @param[out] hkdfOuput [0:kSE05x_TAG_1]
* @param[in,out] phkdfOuputLen Length for hkdfOuput
*/
smStatus_t Se05x_API_HKDF(pSe05xSession_t session_ctx,
uint32_t hmacID,
SE05x_DigestMode_t digestMode,
const uint8_t *salt,
size_t saltLen,
const uint8_t *info,
size_t infoLen,
uint16_t deriveDataLen,
uint8_t *hkdfOuput,
size_t *phkdfOuputLen);
/** Se05x_API_HKDF_Extended
*
* Only step 2 of the algorithm is executed, i.e. Expand only.
*
* Using an IV as input parameter results in a FIPS compliant SP800-108 KDF in
* Feedback Mode where K[0] is the provided IV. This KDF is then using a 8-bit
* counter, AFTER_FIXED counter location.
*
* # Command to Applet
*
* @rst
* +------------+--------------------------------+-----------------------------------+
* | Field | Value | Description |
* +============+================================+===================================+
* | CLA | 0x80 | |
* +------------+--------------------------------+-----------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +------------+--------------------------------+-----------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +------------+--------------------------------+-----------------------------------+
* | P2 | P2_HKDF_EXPAND_ONLY | See :cpp:type:`SE05x_P2_t` |
* +------------+--------------------------------+-----------------------------------+
* | Lc | #(Payload) | |
* +------------+--------------------------------+-----------------------------------+
* | Payload | TLV[TAG_1] | 4-byte HMACKey identifier (= PRK) |
* +------------+--------------------------------+-----------------------------------+
* | TLV[TAG_2] | 1-byte DigestMode (except | |
* | | DIGEST_NO_HASH) | |
* +------------+--------------------------------+-----------------------------------+
* | TLV[TAG_3] | Byte array (0-64 bytes) | |
* | | containing IV. [Optional] | |
* | | [Conditional: only when | |
* | | TLV[TAG_6] is absent.] | |
* +------------+--------------------------------+-----------------------------------+
* | TLV[TAG_4] | Info: The context and | |
* | | information to apply (1 to 80 | |
* | | bytes). [Optional] | |
* +------------+--------------------------------+-----------------------------------+
* | TLV[TAG_5] | 2-byte requested length (L): 1 | |
* | | up to MAX_APDU_PAYLOAD_LENGTH | |
* +------------+--------------------------------+-----------------------------------+
* | TLV[TAG_6] | 4-byte HMACKey identifier | |
* | | containing IV. [Optional] | |
* | | [Conditional: only when | |
* | | TLV[TAG_3] is absent] | |
* +------------+--------------------------------+-----------------------------------+
* | TLV[TAG_7] | 4-byte HMACKey identifier to | |
* | | store output. [Optional] | |
* +------------+--------------------------------+-----------------------------------+
* | Le | 0x00 | |
* +------------+--------------------------------+-----------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+--------------------------------------------+
* | Value | Description |
* +============+============================================+
* | TLV[TAG_1] | HKDF output. [Conditional: only when the |
* | | input does not contain TLV[TAG-7]] |
* +------------+--------------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+------------------------------------+
* | SW | Description |
* +=============+====================================+
* | SW_NO_ERROR | The HKDF is executed successfully. |
* +-------------+------------------------------------+
*
*
*/
smStatus_t Se05x_API_HKDF_Extended(pSe05xSession_t session_ctx,
uint32_t hmacID,
SE05x_DigestMode_t digestMode,
SE05x_HkdfMode_t hkdfMode,
const uint8_t *salt,
size_t saltLen,
uint32_t saltID,
const uint8_t *info,
size_t infoLen,
uint32_t derivedKeyID,
uint16_t deriveDataLen,
uint8_t *hkdfOuput,
size_t *phkdfOuputLen);
/** Se05x_API_PBKDF2
*
* Password Based Key Derivation Function 2 (PBKDF2) according [RFC8018].
*
* The password is an input to the KDF and must be stored inside the .
*
* The output is returned to the host.
*
*
* # Command to Applet
*
* @rst
* +-------+------------+----------------------------------------------+
* | Field | Value | Description |
* +=======+============+==============================================+
* | CLA | 0x80 | |
* +-------+------------+----------------------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +-------+------------+----------------------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+------------+----------------------------------------------+
* | P2 | P2_PBKDF | See :cpp:type:`SE05x_P2_t` |
* +-------+------------+----------------------------------------------+
* | Lc | #(Payload) | |
* +-------+------------+----------------------------------------------+
* | | TLV[TAG_1] | 4-byte password identifier (object type must |
* | | | be HMACKey) |
* +-------+------------+----------------------------------------------+
* | | TLV[TAG_2] | Salt (0 to 64 bytes) [Optional] |
* +-------+------------+----------------------------------------------+
* | | TLV[TAG_3] | 2-byte Iteration count: 1 up to 0x7FFF. |
* +-------+------------+----------------------------------------------+
* | | TLV[TAG_4] | 2-byte Requested length: 1 up to 512 bytes. |
* +-------+------------+----------------------------------------------+
* | Le | 0x00 | Expecting derived key material. |
* +-------+------------+----------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+-------------------------------------+
* | Value | Description |
* +============+=====================================+
* | TLV[TAG_1] | Derived key material (session key). |
* +------------+-------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID 4-byte password identifier (object type must be HMACKey) [1:kSE05x_TAG_1]
* @param[in] salt salt [2:kSE05x_TAG_2]
* @param[in] saltLen Length of salt
* @param[in] count count [3:kSE05x_TAG_3]
* @param[in] requestedLen requestedLen [4:kSE05x_TAG_4]
* @param[out] derivedSessionKey [0:kSE05x_TAG_1]
* @param[in,out] pderivedSessionKeyLen Length for derivedSessionKey
*/
smStatus_t Se05x_API_PBKDF2(pSe05xSession_t session_ctx,
uint32_t objectID,
const uint8_t *salt,
size_t saltLen,
uint16_t count,
uint16_t requestedLen,
uint8_t *derivedSessionKey,
size_t *pderivedSessionKeyLen);
/** Se05x_API_DFDiversifyKey
*
*
* Create a Diversified Key. Input is _divInput_ 1 up to 31 bytes.
*
* Note that users need to create the diversified key object before calling this
* function.
*
* Both the master key and the diversified key need the policy
* POLICY_OBJ_ALLOW_DESFIRE_AUTHENTICATION to be set.
*
* # Command to Applet
*
* @rst
* +-------+--------------+------------------------------------------+
* | Field | Value | Description |
* +=======+==============+==========================================+
* | CLA | 0x80 | |
* +-------+--------------+------------------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +-------+--------------+------------------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+--------------+------------------------------------------+
* | P2 | P2_DIVERSIFY | See :cpp:type:`SE05x_P2_t` |
* +-------+--------------+------------------------------------------+
* | Lc | #(Payload) | |
* +-------+--------------+------------------------------------------+
* | | TLV[TAG_1] | 4-byte master key identifier. |
* +-------+--------------+------------------------------------------+
* | | TLV[TAG_2] | 4-byte diversified key identifier. |
* +-------+--------------+------------------------------------------+
* | | TLV[TAG_3] | Byte array containing divInput (up to 31 |
* | | | bytes). |
* +-------+--------------+------------------------------------------+
* | Le | | |
* +-------+--------------+------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
* @rst
* +-----------------------------+--------------------------------------+
* | SW | Description |
* +=============================+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-----------------------------+--------------------------------------+
* | SW_CONDITIONS_NOT_SATISFIED | No master key found. |
* +-----------------------------+--------------------------------------+
* | | Wrong length for divInput. |
* +-----------------------------+--------------------------------------+
* @endrst
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] masterKeyID masterKeyID [1:kSE05x_TAG_1]
* @param[in] diversifiedKeyID diversifiedKeyID [2:kSE05x_TAG_2]
* @param[in] divInputData divInputData [3:kSE05x_TAG_3]
* @param[in] divInputDataLen Length of divInputData
*/
smStatus_t Se05x_API_DFDiversifyKey(pSe05xSession_t session_ctx,
uint32_t masterKeyID,
uint32_t diversifiedKeyID,
const uint8_t *divInputData,
size_t divInputDataLen);
/** Se05x_API_DFAuthenticateFirstPart1
*
* MIFARE DESFire support
*
* MIFARE DESFire EV2 Key derivation (S-mode). This is limited to AES128 keys
* only.
*
* The SE05X can be used by a card reader to setup a session where the SE05X
* stores the master key(s) and the session keys are generated and passed to the
* host.
*
* The SE05X keeps an internal state of MIFARE DESFire authentication data during
* authentication setup. This state is fully transient, so it is lost on deselect
* of the applet.
*
* The MIFARE DESFire state is owned by 1 user at a time; i.e., the user who
* calls DFAuthenticateFirstPart1 owns the MIFARE DESFire context until
* DFAuthenticateFirstPart1 is called again or until DFKillAuthentication is
* called.
*
* The SE05X can also be used to support a ChangeKey command, either supporting
* ChangeKey or ChangeKeyEV2. To establish a correct use case, policies need to
* be applied to the keys to indicate keys can be used for ChangeKey or not, etc.
* (to be detailed)
*
* # Command to Applet
*
* @rst
* +-------+---------------------+----------------------------------------------+
* | Field | Value | Description |
* +=======+=====================+==============================================+
* | CLA | 0x80 | |
* +-------+---------------------+----------------------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +-------+---------------------+----------------------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+---------------------+----------------------------------------------+
* | P2 | P2_AUTH_FIRST_PART1 | See :cpp:type:`SE05x_P2_t` |
* +-------+---------------------+----------------------------------------------+
* | Lc | #(Payload) | |
* +-------+---------------------+----------------------------------------------+
* | | TLV[TAG_1] | 4-byte key identifier. |
* +-------+---------------------+----------------------------------------------+
* | | TLV[TAG_2] | 16-byte encrypted card challenge: E(Kx,RndB) |
* +-------+---------------------+----------------------------------------------+
* | Le | 0x00 | |
* +-------+---------------------+----------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+---------------------------------------------+
* | Value | Description |
* +============+=============================================+
* | TLV[TAG_1] | 32-byte output data: E(Kx, RandA || RandB') |
* +------------+---------------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID objectID [1:kSE05x_TAG_1]
* @param[in] inputData inputData [2:kSE05x_TAG_2]
* @param[in] inputDataLen Length of inputData
* @param[out] outputData [0:kSE05x_TAG_1]
* @param[in,out] poutputDataLen Length for outputData
*/
smStatus_t Se05x_API_DFAuthenticateFirstPart1(pSe05xSession_t session_ctx,
uint32_t objectID,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *outputData,
size_t *poutputDataLen);
/** Se05x_API_DFAuthenticateNonFirstPart1
*
*
* # Command to Applet
*
* @rst
* +-------+------------------------+----------------------------------------------+
* | Field | Value | Description |
* +=======+========================+==============================================+
* | CLA | 0x80 | |
* +-------+------------------------+----------------------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +-------+------------------------+----------------------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+------------------------+----------------------------------------------+
* | P2 | P2_AUTH_NONFIRST_PART1 | See :cpp:type:`SE05x_P2_t` |
* +-------+------------------------+----------------------------------------------+
* | Lc | #(Payload) | |
* +-------+------------------------+----------------------------------------------+
* | | TLV[TAG_1] | 4-byte key identifier. |
* +-------+------------------------+----------------------------------------------+
* | | TLV[TAG_2] | 16-byte encrypted card challenge: E(Kx,RndB) |
* +-------+------------------------+----------------------------------------------+
* | Le | 0x00 | |
* +-------+------------------------+----------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+---------------------------------------------+
* | Value | Description |
* +============+=============================================+
* | TLV[TAG_1] | 32-byte output data: E(Kx, RandA || RandB') |
* +------------+---------------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] objectID objectID [1:kSE05x_TAG_1]
* @param[in] inputData inputData [2:kSE05x_TAG_2]
* @param[in] inputDataLen Length of inputData
* @param[out] outputData [0:kSE05x_TAG_1]
* @param[in,out] poutputDataLen Length for outputData
*/
smStatus_t Se05x_API_DFAuthenticateNonFirstPart1(pSe05xSession_t session_ctx,
uint32_t objectID,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *outputData,
size_t *poutputDataLen);
/** Se05x_API_DFAuthenticateFirstPart2
*
* For First part 2, the key identifier is implicitly set to the identifier used
* for the First authentication. DFAuthenticateFirstPart1 needs to be called
* before; otherwise an error is returned.
*
* # Command to Applet
*
* @rst
* +-------+---------------------+------------------------------------+
* | Field | Value | Description |
* +=======+=====================+====================================+
* | CLA | 0x80 | |
* +-------+---------------------+------------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +-------+---------------------+------------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+---------------------+------------------------------------+
* | P2 | P2_AUTH_FIRST_PART2 | See :cpp:type:`SE05x_P2_t` |
* +-------+---------------------+------------------------------------+
* | Lc | #(Payload) | |
* +-------+---------------------+------------------------------------+
* | | TLV[TAG_1] | 32 byte input: |
* | | | E(Kx,TI||RndA'||PDcap2||PCDcap2) |
* +-------+---------------------+------------------------------------+
* | Le | 0x00 | |
* +-------+---------------------+------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+------------------------------------------+
* | Value | Description |
* +============+==========================================+
* | TLV[TAG_1] | 12-byte array returning PDcap2||PCDcap2. |
* +------------+------------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-----------------------------+--------------------------------------+
* | SW | Description |
* +=============================+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-----------------------------+--------------------------------------+
* | SW_WRONG_DATA | |
* +-----------------------------+--------------------------------------+
* | SW_CONDITIONS_NOT_SATISFIED | |
* +-----------------------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] inputData inputData [1:kSE05x_TAG_1]
* @param[in] inputDataLen Length of inputData
* @param[out] outputData [0:kSE05x_TAG_1]
* @param[in,out] poutputDataLen Length for outputData
*/
smStatus_t Se05x_API_DFAuthenticateFirstPart2(pSe05xSession_t session_ctx,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *outputData,
size_t *poutputDataLen);
/** Se05x_API_DFAuthenticateNonFirstPart2
*
* For NonFirst part 2, the key identifier is implicitly set to the identifier
* used for the NonFirst part 1 authentication. DFAuthenticateNonFirstPart1 needs
* to be called before; otherwise an error is returned.
*
* If authentication fails, SW_WRONG_DATA will be returned.
*
* # Command to Applet
*
* @rst
* +-------+------------------------+----------------------------+
* | Field | Value | Description |
* +=======+========================+============================+
* | CLA | 0x80 | |
* +-------+------------------------+----------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +-------+------------------------+----------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+------------------------+----------------------------+
* | P2 | P2_AUTH_NONFIRST_PART2 | See :cpp:type:`SE05x_P2_t` |
* +-------+------------------------+----------------------------+
* | Lc | #(Payload) | |
* +-------+------------------------+----------------------------+
* | | TLV[TAG_1] | 16-byte E(Kx, RndA') |
* +-------+------------------------+----------------------------+
* | Le | 0x00 | |
* +-------+------------------------+----------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] inputData inputData [1:kSE05x_TAG_1]
* @param[in] inputDataLen Length of inputData
*/
smStatus_t Se05x_API_DFAuthenticateNonFirstPart2(
pSe05xSession_t session_ctx, const uint8_t *inputData, size_t inputDataLen);
/** Se05x_API_DFDumpSessionKeys
*
* Dump the Transaction Identifier and the session keys to the host.
*
*
* # Command to Applet
*
* @rst
* +-------+-------------+-----------------------------------+
* | Field | Value | Description |
* +=======+=============+===================================+
* | CLA | 0x80 | |
* +-------+-------------+-----------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +-------+-------------+-----------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+-------------+-----------------------------------+
* | P2 | P2_DUMP_KEY | See :cpp:type:`SE05x_P2_t` |
* +-------+-------------+-----------------------------------+
* | Lc | #(Payload) | |
* +-------+-------------+-----------------------------------+
* | Le | 0x28 | Expecting TLV with 38 bytes data. |
* +-------+-------------+-----------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+--------------------------------------+
* | Value | Description |
* +============+======================================+
* | TLV[TAG_1] | 38 bytes: KeyID.SesAuthENCKey || |
* | | KeyID.SesAuthMACKey || TI || Cmd-Ctr |
* +------------+--------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[out] sessionData 38 bytes: KeyID.SesAuthENCKey || KeyID.SesAuthMACKey || TI || Cmd-Ctr [0:kSE05x_TAG_1]
* @param[in,out] psessionDataLen Length for sessionData
*/
smStatus_t Se05x_API_DFDumpSessionKeys(pSe05xSession_t session_ctx, uint8_t *sessionData, size_t *psessionDataLen);
/** Se05x_API_DFChangeKeyPart1
*
*
* The DFChangeKeyPart1 command is supporting the function to change keys on the
* DESFire PICC. The command generates the cryptogram required to perform such
* operation.
*
* The new key and, if used, the current (or old) key must be stored in the SE05X
* and have the POLICY_OBJ_ALLOW_DESFIRE_AUTHENTICATION associated to execute
* this command. This means the new PICC key must have been loaded into the SE05X
* prior to issuing this command.
*
* The 1-byte key set number indicates whether DESFire ChangeKey or DESFire
* ChangeKeyEV2 is used. When key set equals 0xFF, ChangeKey is used.
*
*
* # Command to Applet
*
* @rst
* +-------+---------------------+------------------------------------------------+
* | Field | Value | Description |
* +=======+=====================+================================================+
* | CLA | 0x80 | |
* +-------+---------------------+------------------------------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +-------+---------------------+------------------------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+---------------------+------------------------------------------------+
* | P2 | P2_CHANGE_KEY_PART1 | See :cpp:type:`SE05x_P2_t` |
* +-------+---------------------+------------------------------------------------+
* | Lc | #(Payload) | |
* +-------+---------------------+------------------------------------------------+
* | | TLV[TAG_1] | 4-byte identifier of the old key. [Optional: |
* | | | if the authentication key is the same as the |
* | | | key to be replaced, this TAG should not be |
* | | | present]. |
* +-------+---------------------+------------------------------------------------+
* | | TLV[TAG_2] | 4-byte identifier of the new key. |
* +-------+---------------------+------------------------------------------------+
* | | TLV[TAG_3] | 1-byte key set number [Optional: default = |
* | | | 0xC6] |
* +-------+---------------------+------------------------------------------------+
* | | TLV[TAG_4] | 1-byte DESFire key number to be targeted. |
* +-------+---------------------+------------------------------------------------+
* | | TLV[TAG_5] | 1-byte key version |
* +-------+---------------------+------------------------------------------------+
* | Le | 0x00 | |
* +-------+---------------------+------------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+-----------------------------+
* | Value | Description |
* +============+=============================+
* | TLV[TAG_1] | Cryptogram holding key data |
* +------------+-----------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] oldObjectID oldObjectID [1:kSE05x_TAG_1]
* @param[in] newObjectID newObjectID [2:kSE05x_TAG_2]
* @param[in] keySetNr keySetNr [3:kSE05x_TAG_3]
* @param[in] keyNoDESFire keyNoDESFire [4:kSE05x_TAG_4]
* @param[in] keyVer keyVer [5:kSE05x_TAG_5]
* @param[out] KeyData [0:kSE05x_TAG_1]
* @param[in,out] pKeyDataLen Length for KeyData
*/
smStatus_t Se05x_API_DFChangeKeyPart1(pSe05xSession_t session_ctx,
uint32_t oldObjectID,
uint32_t newObjectID,
uint8_t keySetNr,
uint8_t keyNoDESFire,
uint8_t keyVer,
uint8_t *KeyData,
size_t *pKeyDataLen);
/** Se05x_API_DFChangeKeyPart2
*
* The DFChangeKeyPart2 command verifies the MAC returned by ChangeKey or
* ChangeKeyEV2. Note that this function only needs to be called if a MAC is
* returned (which is not the case if the currently authenticated key is changed
* on the DESFire card).
*
* # Command to Applet
*
* @rst
* +-------+---------------------+----------------------------+
* | Field | Value | Description |
* +=======+=====================+============================+
* | CLA | 0x80 | |
* +-------+---------------------+----------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +-------+---------------------+----------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+---------------------+----------------------------+
* | P2 | P2_CHANGE_KEY_PART2 | See :cpp:type:`SE05x_P2_t` |
* +-------+---------------------+----------------------------+
* | Lc | #(Payload) | |
* +-------+---------------------+----------------------------+
* | | TLV[TAG_1] | MAC |
* +-------+---------------------+----------------------------+
* | Le | 0x00 | |
* +-------+---------------------+----------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+-----------------------------------+
* | Value | Description |
* +============+===================================+
* | TLV[TAG_1] | 1-byte :cpp:type:`SE05x_Result_t` |
* +------------+-----------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] MAC MAC [1:kSE05x_TAG_1]
* @param[in] MACLen Length of MAC
* @param[out] presult [0:kSE05x_TAG_1]
*/
smStatus_t Se05x_API_DFChangeKeyPart2(pSe05xSession_t session_ctx, const uint8_t *MAC, size_t MACLen, uint8_t *presult);
/** Se05x_API_DFKillAuthentication
*
* DFKillAuthentication invalidates any authentication and clears the internal
* DESFire state. Keys used as input (master keys or diversified keys) are not
* touched.
*
* # Command to Applet
*
* @rst
* +-------+--------------+----------------------------+
* | Field | Value | Description |
* +=======+==============+============================+
* | CLA | 0x80 | |
* +-------+--------------+----------------------------+
* | INS | INS_CRYPTO | :cpp:type:`SE05x_INS_t` |
* +-------+--------------+----------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+--------------+----------------------------+
* | P2 | P2_KILL_AUTH | See :cpp:type:`SE05x_P2_t` |
* +-------+--------------+----------------------------+
* | Lc | #(Payload) | |
* +-------+--------------+----------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
*/
smStatus_t Se05x_API_DFKillAuthentication(pSe05xSession_t session_ctx);
/** Se05x_API_TLSGenerateRandom
*
* Generates a random that is stored in the SE05X and used by TLSPerformPRF.
*
* # Command to Applet
*
* @rst
* +-------+------------+-----------------------------------+
* | Field | Value | Description |
* +=======+============+===================================+
* | CLA | 0x80 | |
* +-------+------------+-----------------------------------+
* | INS | INS_CRYPTO | See :cpp:type:`SE05x_INS_t` |
* +-------+------------+-----------------------------------+
* | P1 | P1_TLS | See :cpp:type:`SE05x_P1_t` |
* +-------+------------+-----------------------------------+
* | P2 | P2_RANDOM | See :cpp:type:`SE05x_P2_t` |
* +-------+------------+-----------------------------------+
* | Lc | #(Payload) | |
* +-------+------------+-----------------------------------+
* | Le | 0x22 | Expecting TLV with 32 bytes data. |
* +-------+------------+-----------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+----------------------+
* | Value | Description |
* +============+======================+
* | TLV[TAG_1] | 32-byte random value |
* +------------+----------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[out] randomValue [0:kSE05x_TAG_1]
* @param[in,out] prandomValueLen Length for randomValue
*/
smStatus_t Se05x_API_TLSGenerateRandom(pSe05xSession_t session_ctx, uint8_t *randomValue, size_t *prandomValueLen);
/** Se05x_API_TLSCalculatePreMasterSecret
*
* The command TLSCalculatePreMasterSecret will compute the pre-master secret for
* TLS according [RFC5246]. The pre-master secret will always be stored in an
* HMACKey object (TLV[TAG_3]). The HMACKey object must be created before;
* otherwise the calculation of the pre-master secret will fail.
*
* It can use one of these algorithms: - - - -
*
* * PSK Key Exchange algorithm as defined in [RFC4279]
*
* * RSA_PSK Key Exchange algorithm as defined in [RFC4279]
*
* * ECDHE_PSK Key Exchange algorithm as defined in [RFC5489]
*
* * EC Key Exchange algorithm as defined in [RFC4492]
*
* * RSA Key Exchange algorithm as defined in [RFC5246]
*
*
* TLV[TAG_1] needs to be an (existing) HMACKey identifier containing the pre-
* shared Key.
*
* Input data in TLV[TAG_4] are:
*
* * An EC public key when TLV[TAG_2] refers to an EC key pair.
*
* * An RSA encrypted secret when TLV[TAG_2] refers to an RSA key pair.
*
* * Empty when TLV[TAG_2] is absent or empty.
*
*
* # Command to Applet
*
* @rst
* +-------+------------+----------------------------------------------+
* | Field | Value | Description |
* +=======+============+==============================================+
* | CLA | 0x80 | |
* +-------+------------+----------------------------------------------+
* | INS | INS_CRYPTO | See :cpp:type:`SE05x_INS_t` |
* +-------+------------+----------------------------------------------+
* | P1 | P1_TLS | See :cpp:type:`SE05x_P1_t` |
* +-------+------------+----------------------------------------------+
* | P2 | P2_PMS | See :cpp:type:`SE05x_P2_t` |
* +-------+------------+----------------------------------------------+
* | Lc | #(Payload) | |
* +-------+------------+----------------------------------------------+
* | | TLV[TAG_1] | 4-byte PSK identifier referring to a 16, 32, |
* | | | 48 or 64-byte Pre Shared Key. [Optional] |
* +-------+------------+----------------------------------------------+
* | | TLV[TAG_2] | 4-byte key pair identifier. [Optional] |
* +-------+------------+----------------------------------------------+
* | | TLV[TAG_3] | 4-byte target HMACKey identifier. |
* +-------+------------+----------------------------------------------+
* | | TLV[TAG_4] | Byte array containing input data. |
* +-------+------------+----------------------------------------------+
* | Le | - | |
* +-------+------------+----------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] keyPairId keyPairId [1:kSE05x_TAG_1]
* @param[in] pskId pskId [2:kSE05x_TAG_2]
* @param[in] hmacKeyId hmacKeyId [3:kSE05x_TAG_3]
* @param[in] inputData inputData [4:kSE05x_TAG_4]
* @param[in] inputDataLen Length of inputData
*/
smStatus_t Se05x_API_TLSCalculatePreMasterSecret(pSe05xSession_t session_ctx,
uint32_t keyPairId,
uint32_t pskId,
uint32_t hmacKeyId,
const uint8_t *inputData,
size_t inputDataLen);
/** Se05x_API_TLSPerformPRF
*
* The command TLSPerformPRF will compute either:
*
* * the master secret for TLS according [RFC5246], section 8.1
*
* * key expansion data from a master secret for TLS according [RFC5246], section 6.3
*
* Each time before calling this function, TLSGenerateRandom must be called.
* Executing this function will clear the random that is stored in the SE05X .
*
* The function can be called as client or as server and either using the pre-
* master secret or master secret as input, stored in an HMACKey. The input
* length must be either 16, 32, 48 or 64 bytes.
*
* This results in P2 having 4 possibilities:
*
* * P2_TLS_PRF_CLI_HELLO: pass the clientHelloRandom to calculate a master secret, the serverHelloRandom is in SE05X , generated by TLSGenerateRandom.
*
* * P2_TLS_PRF_SRV_HELLO: pass the serverHelloRandom to calculate a master secret, the clientHelloRandom is in SE05X , generated by TLSGenerateRandom.
*
* * P2_TLS_PRF_CLI_RANDOM: pass the clientRandom to generate key expansion data, the serverRandom is in SE05X , generated by TLSGenerateRandom.
*
* * P2_TLS_PRF_SRV_RANDOM: pass the serverRandom to generate key expansion data, the clientRandom is in SE05X
*
*
* # Command to Applet
*
* @rst
* +-------+------------------------+-----------------------------------------------+
* | Field | Value | Description |
* +=======+========================+===============================================+
* | CLA | 0x80 | |
* +-------+------------------------+-----------------------------------------------+
* | INS | INS_CRYPTO | See :cpp:type:`SE05x_INS_t` |
* +-------+------------------------+-----------------------------------------------+
* | P1 | P1_TLS | See :cpp:type:`SE05x_P1_t` |
* +-------+------------------------+-----------------------------------------------+
* | P2 | See description above. | See :cpp:type:`SE05x_P2_t` |
* +-------+------------------------+-----------------------------------------------+
* | Lc | #(Payload) | |
* +-------+------------------------+-----------------------------------------------+
* | | TLV[TAG_1] | 4-byte HMACKey identifier. |
* +-------+------------------------+-----------------------------------------------+
* | | TLV[TAG_2] | 1-byte :cpp:type:`SE05x_DigestMode_t`, except |
* | | | DIGEST_NO_HASH. |
* +-------+------------------------+-----------------------------------------------+
* | | TLV[TAG_3] | Label (1 to 64 bytes) |
* +-------+------------------------+-----------------------------------------------+
* | | TLV[TAG_4] | 32-byte random |
* +-------+------------------------+-----------------------------------------------+
* | | TLV[TAG_5] | 2-byte requested length |
* +-------+------------------------+-----------------------------------------------+
* | Le | 0x00 | |
* +-------+------------------------+-----------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+----------------------------------------------+
* | Value | Description |
* +============+==============================================+
* | TLV[TAG_1] | Byte array containing requested output data. |
* +------------+----------------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
*
*
* @param[in] session_ctx The session context
* @param[in] objectID The object id
* @param[in] digestAlgo The digest algorithm
* @param[in] label The label
* @param[in] labelLen The label length
* @param[in] random The random
* @param[in] randomLen The random length
* @param[in] reqLen The request length
* @param outputData The output data
* @param poutputDataLen The poutput data length
* @param[in] tlsprf The tlsprf
*
* @return The sm status.
*/
smStatus_t Se05x_API_TLSPerformPRF(pSe05xSession_t session_ctx,
uint32_t objectID,
uint8_t digestAlgo,
const uint8_t *label,
size_t labelLen,
const uint8_t *random,
size_t randomLen,
uint16_t reqLen,
uint8_t *outputData,
size_t *poutputDataLen,
const SE05x_TLSPerformPRFType_t tlsprf);
/** Se05x_API_I2CM_ExecuteCommandSet
*
* Execute one or multiple I2C commands in master mode. Execution is conditional
* to the presence of the authentication object identified by
* RESERVED_ID_I2CM_ACCESS. If the credential is not present in the eSE, access
* is allowed in general. Otherwise, a session shall be established before
* executing this command. In this case, the I2CM_ExecuteCommandSet command shall
* be sent within the mentioned session.
*
* The I2C command set is constructed as a sequence of instructions described in
* with the following rules:
*
* * The length should be limited to MAX_I2CM_COMMAND_LENGTH.
*
* * The data to be read cannot exceed MAX_I2CM_COMMAND_LENGTH, including protocol overhead.
*
* # Command to Applet
*
* @rst
* +-------+------------+------------------------------------------------+
* | Field | Value | Description |
* +=======+============+================================================+
* | CLA | 0x80 | |
* +-------+------------+------------------------------------------------+
* | INS | INS_CRYPTO | See :cpp:type:`SE05x_INS_t`, in addition to |
* | | | INS_CRYPTO, users can set the INS_ATTEST flag. |
* | | | In that case, attestation applies. |
* +-------+------------+------------------------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+------------+------------------------------------------------+
* | P2 | P2_I2CM | See :cpp:type:`SE05x_P2_t` |
* +-------+------------+------------------------------------------------+
* | Lc | #(Payload) | |
* +-------+------------+------------------------------------------------+
* | | TLV[TAG_1] | Byte array containing I2C Command set as TLV |
* | | | array. |
* +-------+------------+------------------------------------------------+
* | | TLV[TAG_2] | 4-byte attestation object identifier. |
* | | | [Optional] [Conditional: only when |
* | | | INS_ATTEST is set] |
* +-------+------------+------------------------------------------------+
* | | TLV[TAG_3] | 1-byte :cpp:type:`SE05x_AttestationAlgo_t` |
* | | | [Optional] [Conditional: only when |
* | | | INS_ATTEST is set] |
* +-------+------------+------------------------------------------------+
* | | TLV[TAG_7] | 16-byte freshness random [Optional] |
* | | | [Conditional: only when INS_ATTEST is set] |
* +-------+------------+------------------------------------------------+
* | Le | 0x00 | Expecting TLV with return data. |
* +-------+------------+------------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+------------------------------------------------+
* | Value | Description |
* +============+================================================+
* | TLV[TAG_1] | Read response, a bytestring containing a |
* | | sequence of: * CONFIGURE (0x01), |
* | | followed by 1 byte of return code (0x5A = |
* | | SUCCESS). * WRITE (0x03), |
* | | followed by 1 byte of return code * |
* | | READ (0x04), followed by - |
* | | Length: 2 bytes in big endian encoded without |
* | | TLV length encoding - |
* | | Read bytes * |
* | | 0xFF followed by the error return code in case |
* | | of a structural error of the incoming buffer |
* | | (too long, for example) |
* +------------+------------------------------------------------+
* | TLV[TAG_3] | TLV containing 12-byte timestamp |
* +------------+------------------------------------------------+
* | TLV[TAG_4] | TLV containing 16-byte freshness (random) |
* +------------+------------------------------------------------+
* | TLV[TAG_5] | TLV containing 18-byte chip unique ID |
* +------------+------------------------------------------------+
* | TLV[TAG_6] | TLV containing signature over the concatenated |
* | | values of TLV[TAG_1], TLV[TAG_3], TLV[TAG_4] |
* | | and TLV[TAG_5]. |
* +------------+------------------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
*
*
*
* @param[in] session_ctx The session context
* @param[in] inputData The input data
* @param[in] inputDataLen The input data length
* @param[in] attestationID The attestation id
* @param[in] attestationAlgo The attestation algorithm
* @param response The response
* @param presponseLen The presponse length
* @param ptimeStamp The ptime stamp
* @param freshness The freshness
* @param pfreshnessLen The pfreshness length
* @param chipId The chip identifier
* @param pchipIdLen The pchip identifier length
* @param signature The signature
* @param psignatureLen The psignature length
* @param randomAttst The random attst
* @param[in] randomAttstLen The random attst length
*
* @return The sm status.
*/
smStatus_t Se05x_API_I2CM_ExecuteCommandSet(pSe05xSession_t session_ctx,
const uint8_t *inputData,
size_t inputDataLen,
uint32_t attestationID,
uint8_t attestationAlgo,
uint8_t *response,
size_t *presponseLen,
SE05x_TimeStamp_t *ptimeStamp,
uint8_t *freshness,
size_t *pfreshnessLen,
uint8_t *chipId,
size_t *pchipIdLen,
uint8_t *signature,
size_t *psignatureLen,
uint8_t *randomAttst,
size_t randomAttstLen);
/** Se05x_API_DigestInit
*
* Open a digest operation. The state of the digest operation is kept in the
* Crypto Object until the Crypto Object is finalized or deleted.
*
*
* # Command to Applet
*
* @rst
* +-------+------------+---------------------------------+
* | Field | Value | Description |
* +=======+============+=================================+
* | CLA | 0x80 | |
* +-------+------------+---------------------------------+
* | INS | INS_CRYPTO | See :cpp:type:`SE05x_INS_t` |
* +-------+------------+---------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+------------+---------------------------------+
* | P2 | P2_INIT | See :cpp:type:`SE05x_P2_t` |
* +-------+------------+---------------------------------+
* | Lc | #(Payload) | |
* +-------+------------+---------------------------------+
* | | TLV[TAG_2] | 2-byte Crypto Object identifier |
* +-------+------------+---------------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] cryptoObjectID cryptoObjectID [1:kSE05x_TAG_2]
*/
smStatus_t Se05x_API_DigestInit(pSe05xSession_t session_ctx, SE05x_CryptoObjectID_t cryptoObjectID);
/** Se05x_API_DigestUpdate
*
*
* # Command to Applet
*
* @rst
* +-------+------------+---------------------------------+
* | Field | Value | Description |
* +=======+============+=================================+
* | CLA | 0x80 | |
* +-------+------------+---------------------------------+
* | INS | INS_CRYPTO | See :cpp:type:`SE05x_INS_t` |
* +-------+------------+---------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+------------+---------------------------------+
* | P2 | P2_UPDATE | See :cpp:type:`SE05x_P2_t` |
* +-------+------------+---------------------------------+
* | Lc | #(Payload) | |
* +-------+------------+---------------------------------+
* | | TLV[TAG_2] | 2-byte Crypto Object identifier |
* +-------+------------+---------------------------------+
* | | TLV[TAG_3] | Data to be hashed. |
* +-------+------------+---------------------------------+
* | Le | | |
* +-------+------------+---------------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------------+
* | SW | Description |
* +=============+======================================+
* | SW_NO_ERROR | The command is handled successfully. |
* +-------------+--------------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] cryptoObjectID cryptoObjectID [1:kSE05x_TAG_2]
* @param[in] inputData inputData [2:kSE05x_TAG_3]
* @param[in] inputDataLen Length of inputData
*/
smStatus_t Se05x_API_DigestUpdate(
pSe05xSession_t session_ctx, SE05x_CryptoObjectID_t cryptoObjectID, const uint8_t *inputData, size_t inputDataLen);
/** Se05x_API_DigestFinal
*
*
* # Command to Applet
*
* @rst
* +-------+------------+------------------------------------+
* | Field | Value | Description |
* +=======+============+====================================+
* | CLA | 0x80 | |
* +-------+------------+------------------------------------+
* | INS | INS_CRYPTO | See :cpp:type:`SE05x_INS_t` |
* +-------+------------+------------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+------------+------------------------------------+
* | P2 | P2_FINAL | See :cpp:type:`SE05x_P2_t` |
* +-------+------------+------------------------------------+
* | Lc | #(Payload) | |
* +-------+------------+------------------------------------+
* | | TLV[TAG_2] | 2-byte Crypto Object identifier |
* +-------+------------+------------------------------------+
* | | TLV[TAG_3] | Data to be encrypted or decrypted. |
* +-------+------------+------------------------------------+
* | Le | 0x00 | Expecting TLV with hash value. |
* +-------+------------+------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+-------------+
* | Value | Description |
* +============+=============+
* | TLV[TAG_1] | CMAC value |
* +------------+-------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+-----------------------------------+
* | SW | Description |
* +=============+===================================+
* | SW_NO_ERROR | The hash is created successfully. |
* +-------------+-----------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] cryptoObjectID cryptoObjectID [1:kSE05x_TAG_2]
* @param[in] inputData inputData [2:kSE05x_TAG_3]
* @param[in] inputDataLen Length of inputData
* @param[out] cmacValue [0:kSE05x_TAG_1]
* @param[in,out] pcmacValueLen Length for cmacValue
*/
smStatus_t Se05x_API_DigestFinal(pSe05xSession_t session_ctx,
SE05x_CryptoObjectID_t cryptoObjectID,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *cmacValue,
size_t *pcmacValueLen);
/** Se05x_API_DigestOneShot
*
* Performs a hash operation in one shot (without context).
*
*
* # Command to Applet
*
* @rst
* +-------+------------+-------------------------------------------+
* | Field | Value | Description |
* +=======+============+===========================================+
* | CLA | 0x80 | |
* +-------+------------+-------------------------------------------+
* | INS | INS_CRYPTO | See :cpp:type:`SE05x_INS_t` |
* +-------+------------+-------------------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+------------+-------------------------------------------+
* | P2 | P2_ONESHOT | See :cpp:type:`SE05x_P2_t` |
* +-------+------------+-------------------------------------------+
* | Lc | #(Payload) | |
* +-------+------------+-------------------------------------------+
* | | TLV[TAG_1] | 1-byte DigestMode (except DIGEST_NO_HASH) |
* +-------+------------+-------------------------------------------+
* | | TLV[TAG_2] | Data to hash. |
* +-------+------------+-------------------------------------------+
* | Le | 0x00 | TLV expecting hash value |
* +-------+------------+-------------------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+-------------+
* | Value | Description |
* +============+=============+
* | TLV[TAG_1] | Hash value. |
* +------------+-------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+-----------------------------------+
* | SW | Description |
* +=============+===================================+
* | SW_NO_ERROR | The hash is created successfully. |
* +-------------+-----------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
* @param[in] digestMode digestMode [1:kSE05x_TAG_1]
* @param[in] inputData inputData [2:kSE05x_TAG_2]
* @param[in] inputDataLen Length of inputData
* @param[out] hashValue [0:kSE05x_TAG_1]
* @param[in,out] phashValueLen Length for hashValue
*/
smStatus_t Se05x_API_DigestOneShot(pSe05xSession_t session_ctx,
uint8_t digestMode,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *hashValue,
size_t *phashValueLen);
/** Se05x_API_GetVersion
*
* Gets the applet version information.
*
* This will return 7-byte VersionInfo (including major, minor and patch version
* of the applet, supported applet features and secure box version).
*
* # Command to Applet
*
* @rst
* +-------+------------------------------+----------------------------------------------+
* | Field | Value | Description |
* +=======+==============================+==============================================+
* | CLA | 0x80 | |
* +-------+------------------------------+----------------------------------------------+
* | INS | INS_MGMT | See :cpp:type:`SE05x_INS_t` |
* +-------+------------------------------+----------------------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+------------------------------+----------------------------------------------+
* | P2 | P2_VERSION or P2_VERSION_EXT | See :cpp:type:`SE05x_P2_t` |
* +-------+------------------------------+----------------------------------------------+
* | Lc | #(Payload) | |
* +-------+------------------------------+----------------------------------------------+
* | Le | 0x00 | Expecting TLV with 7-byte data (when P2 = |
* | | | P2_VERSION) or a TLV with 37 byte data (when |
* | | | P2= P2_VERSION_EXT). |
* +-------+------------------------------+----------------------------------------------+
* @endrst
*
*
* # R-APDU Body
*
* @rst
* +------------+------------------------------------------------+
* | Value | Description |
* +============+================================================+
* | TLV[TAG_1] | 7-byte :cpp:type:`VersionInfoRef` (if P2 = |
* | | P2_VERSION) or 7-byte VersionInfo followed by |
* | | 30 bytes extendedFeatureBits (if P2 = |
* | | P2_VERSION_EXT) |
* +------------+------------------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------+
* | SW | Description |
* +=============+================================+
* | SW_NO_ERROR | Data is returned successfully. |
* +-------------+--------------------------------+
* @endrst
*
* @param[in] session_ctx The session context
* @param pappletVersion The papplet version
* @param appletVersionLen The applet version length
*
* @return The sm status.
*/
smStatus_t Se05x_API_GetVersion(pSe05xSession_t session_ctx, uint8_t *pappletVersion, size_t *appletVersionLen);
/** Se05x_API_GetTimestamp
*
* Gets a monotonic counter value (time stamp) from the operating system of the
* device (both persistent and transient part). See TimestampFunctionality for
* details on the timestamps.
*
*
* # Command to Applet
*
* @rst
* +-------+------------+-------------------------------+
* | Field | Value | Description |
* +=======+============+===============================+
* | CLA | 0x80 | |
* +-------+------------+-------------------------------+
* | INS | INS_MGMT | See :cpp:type:`SE05x_INS_t` |
* +-------+------------+-------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+------------+-------------------------------+
* | P2 | P2_TIME | See :cpp:type:`SE05x_P2_t` |
* +-------+------------+-------------------------------+
* | Lc | #(Payload) | |
* +-------+------------+-------------------------------+
* | Le | 0x2C | Expecting TLV with timestamp. |
* +-------+------------+-------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+-------------------------------------------+
* | Value | Description |
* +============+===========================================+
* | TLV[TAG_1] | TLV containing a 12-byte operating system |
* | | timestamp. |
* +------------+-------------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------+
* | SW | Description |
* +=============+================================+
* | SW_NO_ERROR | Data is returned successfully. |
* +-------------+--------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx The session context
* @param ptimeStamp The ptime stamp
*
* @return The sm status.
*/
smStatus_t Se05x_API_GetTimestamp(pSe05xSession_t session_ctx, SE05x_TimeStamp_t *ptimeStamp);
/** Se05x_API_GetFreeMemory
*
* Gets the amount of free memory. MemoryType indicates the type of memory.
*
* The result indicates the amount of free memory. Note that behavior of the
* function might not be fully linear and can have a granularity of 16 bytes
* where the applet will typically report the "worst case" amount. For example,
* when allocating 2 bytes a time, the first report will show 16 bytes being
* allocated, which remains the same for the next 7 allocations of 2 bytes.
*
*
* # Command to Applet
*
* @rst
* +-------+------------+---------------------------------+
* | Field | Value | Description |
* +=======+============+=================================+
* | CLA | 0x80 | |
* +-------+------------+---------------------------------+
* | INS | INS_MGMT | See :cpp:type:`SE05x_INS_t` |
* +-------+------------+---------------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+------------+---------------------------------+
* | P2 | P2_MEMORY | See :cpp:type:`SE05x_P2_t` |
* +-------+------------+---------------------------------+
* | Lc | #(Payload) | |
* +-------+------------+---------------------------------+
* | | TLV[TAG_1] | :cpp:type:`SE05x_MemTyp_t` |
* +-------+------------+---------------------------------+
* | Le | 0x04 | Expecting TLV with 2-byte data. |
* +-------+------------+---------------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+----------------------------------------------+
* | Value | Description |
* +============+==============================================+
* | TLV[TAG_1] | 2 bytes indicating the amount of free memory |
* | | of the requested memory type. 0x7FFF as |
* | | response means at least 32768 bytes are |
* | | available. |
* +------------+----------------------------------------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------+
* | SW | Description |
* +=============+================================+
* | SW_NO_ERROR | Data is returned successfully. |
* +-------------+--------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx The session context
* @param[in] memoryType The memory type
* @param pfreeMem The pfree memory
*
* @return The sm status.
*/
smStatus_t Se05x_API_GetFreeMemory(pSe05xSession_t session_ctx, SE05x_MemoryType_t memoryType, uint16_t *pfreeMem);
/** Se05x_API_GetRandom
*
* Gets random data from the SE05X .
*
*
* # Command to Applet
*
* @rst
* +-------+------------+-----------------------------+
* | Field | Value | Description |
* +=======+============+=============================+
* | CLA | 0x80 | |
* +-------+------------+-----------------------------+
* | INS | INS_MGMT | See :cpp:type:`SE05x_INS_t` |
* +-------+------------+-----------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+------------+-----------------------------+
* | P2 | P2_RANDOM | See :cpp:type:`SE05x_P2_t` |
* +-------+------------+-----------------------------+
* | Lc | #(Payload) | |
* +-------+------------+-----------------------------+
* | | TLV[TAG_1] | 2-byte requested size. |
* +-------+------------+-----------------------------+
* | Le | 0x00 | Expecting random data |
* +-------+------------+-----------------------------+
* @endrst
*
* # R-APDU Body
*
* @rst
* +------------+--------------+
* | Value | Description |
* +============+==============+
* | TLV[TAG_1] | Random data. |
* +------------+--------------+
* @endrst
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------+
* | SW | Description |
* +=============+================================+
* | SW_NO_ERROR | Data is returned successfully. |
* +-------------+--------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx The session context
* @param[in] size The size
* @param randomData The random data
* @param prandomDataLen The prandom data length
*
* @return The sm status.
*/
smStatus_t Se05x_API_GetRandom(pSe05xSession_t session_ctx, uint16_t size, uint8_t *randomData, size_t *prandomDataLen);
/** Se05x_API_DeleteAll
*
* Delete all Secure Objects, delete all curves and Crypto Objects. Secure
* Objects that are trust provisioned by NXP are not deleted (i.e., all objects
* that have Origin set to ORIGIN_PROVISIONED, including the objects with
* reserved object identifiers listed in Object attributes).
*
* This command can only be used from sessions that are authenticated using the
* credential with index RESERVED_ID_FACTORY_RESET.
*
* _Important_ : if a secure messaging session is up & running (e.g., AESKey or
* ECKey session) and the command is sent within this session, the response of
* the DeleteAll command will not be wrapped (i.e., not encrypted and no R-MAC),
* so this will also break down the secure channel protocol (as the session is
* closed by the DeleteAll command itself).
*
* # Command to Applet
*
* @rst
* +-------+---------------+-----------------------------+
* | Field | Value | Description |
* +=======+===============+=============================+
* | CLA | 0x80 | |
* +-------+---------------+-----------------------------+
* | INS | INS_MGMT | See :cpp:type:`SE05x_INS_t` |
* +-------+---------------+-----------------------------+
* | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
* +-------+---------------+-----------------------------+
* | P2 | P2_DELETE_ALL | See :cpp:type:`SE05x_P2_t` |
* +-------+---------------+-----------------------------+
* | Lc | 0x00 | |
* +-------+---------------+-----------------------------+
* @endrst
*
* # R-APDU Body
*
* NA
*
* # R-APDU Trailer
*
* @rst
* +-------------+--------------------------------+
* | SW | Description |
* +=============+================================+
* | SW_NO_ERROR | Data is returned successfully. |
* +-------------+--------------------------------+
* @endrst
*
*
*
* @param[in] session_ctx Session Context [0:kSE05x_pSession]
*/
smStatus_t Se05x_API_DeleteAll(pSe05xSession_t session_ctx);
#if SSS_HAVE_SE05X_VER_GTE_06_00
#include "se05x_04_xx_APDU_apis.h"
#endif
#endif /* SE050X_APDU_APIS_H_INC */