blob: 5edff48590e3398a046f94b565311056a3ad8203 [file] [log] [blame]
/*
*
* Copyright 2019,2020 NXP
* SPDX-License-Identifier: Apache-2.0
*/
/** @file */
#ifndef _FSL_SSS_POLICY_H_
#define _FSL_SSS_POLICY_H_
#if !defined(SSS_CONFIG_FILE)
#include "fsl_sss_config.h"
#else
#include SSS_CONFIG_FILE
#endif
#include "fsl_sss_types.h"
//#include <Applet_SE050_Ver.h>
/** @defgroup sss_policy Policy
*
* Policies to restrict and control sessions and objects.
*/
/** @addtogroup sss_policy
* @{ */
/** Type of policy */
typedef enum
{
/** No policy applied */
KPolicy_None,
/** Policy related to session. @see sss_policy_session_u */
KPolicy_Session,
/** Policy related to key. @see sss_policy_key_u */
KPolicy_Sym_Key,
KPolicy_Asym_Key,
KPolicy_UserID,
KPolicy_File,
KPolicy_Counter,
KPolicy_PCR,
KPolicy_Common,
KPolicy_Common_PCR_Value,
} sss_policy_type_u;
/** Policy applicable to a session */
typedef struct
{
/** Number of operations permitted in a session */
uint16_t maxOperationsInSession;
/** Session can be used for this much time, in seconds */
uint16_t maxDurationOfSession_sec;
/** Whether maxOperationsInSession is set.
* This is to ensure '0 == maxOperationsInSession' does not get set
* by middleware. */
uint8_t has_MaxOperationsInSession : 1;
/** Whether maxOperationsInSession is set.
* This is to ensure '0 == maxDurationOfSession_sec' does not get set
* by middleware. */
uint8_t has_MaxDurationOfSession_sec : 1;
/** Whether this session can be refreshed without losing context.
* And also reset maxDurationOfSession_sec / maxOperationsInSession */
uint8_t allowRefresh : 1;
} sss_policy_session_u;
/** Policies applicable to Symmetric KEY */
typedef struct
{
/** Allow signature generation */
uint8_t can_Sign : 1;
/** Allow signature verification */
uint8_t can_Verify : 1;
/** Allow encryption */
uint8_t can_Encrypt : 1;
/** Allow decryption */
uint8_t can_Decrypt : 1;
/** Allow key derivation */
uint8_t can_KD : 1;
/** Allow key wrapping */
uint8_t can_Wrap : 1;
/** Allow to write the object */
uint8_t can_Write : 1;
/** Allow to (re)generate the object */
uint8_t can_Gen : 1;
/** Allow to perform DESFire authentication */
uint8_t can_Desfire_Auth : 1;
/** Allow to dump DESFire session keys */
uint8_t can_Desfire_Dump : 1;
/** Allow to imported or exported */
uint8_t can_Import_Export : 1;
#if 1 // SSS_HAVE_SE05X_VER_GTE_06_00
/** Forbid derived output */
uint8_t forbid_Derived_Output : 1;
#endif
/** Allow kdf(prf) external random */
uint8_t allow_kdf_ext_rnd : 1;
} sss_policy_sym_key_u;
/** Policies applicable to Asymmetric KEY */
typedef struct
{
/** Allow signature generation */
uint8_t can_Sign : 1;
/** Allow signature verification */
uint8_t can_Verify : 1;
/** Allow encryption */
uint8_t can_Encrypt : 1;
/** Allow decryption */
uint8_t can_Decrypt : 1;
/** Allow key derivation */
uint8_t can_KD : 1;
/** Allow key wrapping */
uint8_t can_Wrap : 1;
/** Allow to write the object */
uint8_t can_Write : 1;
/** Allow to (re)generate the object */
uint8_t can_Gen : 1;
/** Allow to imported or exported */
uint8_t can_Import_Export : 1;
/** Allow key agreement */
uint8_t can_KA : 1;
/** Allow to read the object */
uint8_t can_Read : 1;
/** Allow to attest an object */
uint8_t can_Attest : 1;
#if 1 // SSS_HAVE_SE05X_VER_GTE_06_00
/** Forbid derived output */
uint8_t forbid_Derived_Output : 1;
#endif
} sss_policy_asym_key_u;
/** All policies related to secure object type File */
typedef struct
{
/** Allow to write the object */
uint8_t can_Write : 1;
/** Allow to read the object */
uint8_t can_Read : 1;
} sss_policy_file_u;
/** All policies related to secure object type Counter */
typedef struct
{
/** Allow to write the object */
uint8_t can_Write : 1;
/** Allow to read the object */
uint8_t can_Read : 1;
} sss_policy_counter_u;
/** All policies related to secure object type PCR */
typedef struct
{
/** Allow to write the object */
uint8_t can_Write : 1;
/** Allow to read the object */
uint8_t can_Read : 1;
} sss_policy_pcr_u;
/** All policies related to secure object type UserID */
typedef struct
{
/** Allow to write the object */
uint8_t can_Write : 1;
} sss_policy_userid_u;
/** Common Policies for all object types */
typedef struct
{
/** Forbid all operations */
uint8_t forbid_All : 1;
/** Allow to delete the object */
uint8_t can_Delete : 1;
/** Require having secure messaging enabled with encryption and integrity on the command */
uint8_t req_Sm : 1;
} sss_policy_common_u;
/** Common PCR Value Policies for all object types */
typedef struct
{
/** PCR object ID */
uint32_t pcrObjId;
/** Expected value of the PCR */
uint8_t pcrExpectedValue[32];
} sss_policy_common_pcr_value_u;
/** Unique/individual policy.
* For any operation, you need array of sss_policy_u.
*/
typedef struct
{
/** Secure Object Type */
sss_policy_type_u type;
/** Auth ID for each Object Policy, invalid for session policy type == KPolicy_Session*/
uint32_t auth_obj_id;
/** Union of applicable policies based on the type of object
*/
union {
sss_policy_file_u file;
sss_policy_counter_u counter;
sss_policy_pcr_u pcr;
sss_policy_sym_key_u symmkey;
sss_policy_asym_key_u asymmkey;
sss_policy_userid_u pin;
sss_policy_common_u common;
sss_policy_common_pcr_value_u common_pcr_value;
sss_policy_session_u session;
} policy;
} sss_policy_u;
/** An array of policies @ref sss_policy_u */
typedef struct
{
/** Array of unique policies, this needs to be allocated based nPolicies */
const sss_policy_u *policies[SSS_POLICY_COUNT_MAX];
/** Number of policies */
size_t nPolicies;
} sss_policy_t;
/** @} */
#endif /* _FSL_SSS_POLICY_H_ */