mirror of
https://github.com/thelsing/knx.git
synced 2025-10-12 11:15:54 +02:00
git-subtree-dir: examples/knx-cc1310/coresdk_cc13xx_cc26xx git-subtree-split: 0d78d3280357416a5c0388148cda13717c9ffaa5
279 lines
9.5 KiB
C
279 lines
9.5 KiB
C
/*
|
|
* Copyright (c) 2017, Texas Instruments Incorporated
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
*
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* * Neither the name of Texas Instruments Incorporated nor the names of
|
|
* its contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
/** ============================================================================
|
|
* @file CryptoKey.h
|
|
*
|
|
* @brief The CryptoKey type is an opaque representation of a cryptographic key.
|
|
*
|
|
* @warning This is a beta API. It may change in future releases.
|
|
*
|
|
* Cryptographic keying material may be stored on an embedded system multiple ways.
|
|
* - plaintext: in plaintext in flash or RAM
|
|
* - keyblob: in encrypted form in flash or RAM
|
|
* - key store: in a dedicated hardware database whose entries can not be directly
|
|
* read out.
|
|
*
|
|
* Each storage option requires different approaches to handling the keying material
|
|
* when performing a crypto operation. In order to separate these concerns from
|
|
* the API of the various crypto drivers available with TI-RTOS, the CryptoKey
|
|
* type abstracts away from these details. It does not contain any cryptographic
|
|
* keying material itself but instead contains the details necessary for drivers to use the
|
|
* keying material. The driver implementation handles preparing and moving the keying
|
|
* material as necessary to perform the desired crypto operation.
|
|
*
|
|
* The same CryptoKey may be passed to crypto APIs of different modes subject to
|
|
* restrictions placed on the key by their storage types. Plaintext keys may be used
|
|
* without restriction while key store and keyblob keys have their permitted uses
|
|
* restricted when the keying material is loaded or the keyblob is encrypted respectively.
|
|
* These restrictions are specified in a CryptoKey_SecurityPolicy that is device-specific
|
|
* and depends on the hardware capability of the device.
|
|
*
|
|
* An application should never access a field within a CryptoKey struct itself.
|
|
* Where needed, helper functions are provided to do so.
|
|
*
|
|
* Before using a CryptoKey in another crypto API call, it must be initialized
|
|
* with a call to one of the initialization functions.
|
|
* - CryptoKeyPlaintext_initKey()
|
|
* - CryptoKeyPlaintext_initBlankKey()
|
|
* - CryptoKeyKeyStore_initKey()
|
|
* - CryptoKeyKeyStore_initBlankKey()
|
|
* - CryptoKeyKeyBlob_initKey()
|
|
* - CryptoKeyKeyBlob_initBlankKey()
|
|
*
|
|
* The keyblob and keystore CryptoKeys may be used to create a keyblob or
|
|
* load a key into a key store after their respective _init call.
|
|
*
|
|
* CryptoKeys can be initialized "blank", without keying material but with an empty buffer
|
|
* or key store entry, to encode the destination of a key to be created in the
|
|
* future. This way, keys may be generated securely within a key store
|
|
* for example and never even be stored in RAM temporarily.
|
|
*
|
|
* Not all devices support all CryptoKey functionality. This is hardware-dependent.
|
|
*
|
|
*/
|
|
|
|
#ifndef ti_drivers_cryptoutils_cyptokey_CryptoKey__include
|
|
#define ti_drivers_cryptoutils_cyptokey_CryptoKey__include
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
|
|
/*!
|
|
|
|
*/
|
|
|
|
/**
|
|
* @defgroup CryptoKey_CONTROL Status codes
|
|
* These CryptoKey macros are reservations for CryptoKey.h
|
|
* @{
|
|
*/
|
|
|
|
|
|
/*!
|
|
* Common CryptoKey_control status code reservation offset.
|
|
* CryptoKey driver implementations should offset status codes with
|
|
* CryptoKey_STATUS_RESERVED growing negatively.
|
|
*
|
|
* Example implementation specific status codes:
|
|
* @code
|
|
* #define CryptoKeyXYZ_STATUS_ERROR0 CryptoKey_STATUS_RESERVED - 0
|
|
* #define CryptoKeyXYZ_STATUS_ERROR1 CryptoKey_STATUS_RESERVED - 1
|
|
* #define CryptoKeyXYZ_STATUS_ERROR2 CryptoKey_STATUS_RESERVED - 2
|
|
* @endcode
|
|
*/
|
|
#define CryptoKey_STATUS_RESERVED (-32)
|
|
|
|
/**
|
|
* @defgroup CryptoKey_STATUS Status Codes
|
|
* CryptoKey_STATUS_* macros are general status codes returned by CryptoKey_control()
|
|
* @{
|
|
* @ingroup CryptoKey_CONTROL
|
|
*/
|
|
|
|
/*!
|
|
* @brief Successful status code
|
|
*
|
|
* CryptoKey_control() returns CryptoKey_STATUS_SUCCESS if the control code was executed
|
|
* successfully.
|
|
*/
|
|
#define CryptoKey_STATUS_SUCCESS (0)
|
|
|
|
/*!
|
|
* @brief Generic error status code
|
|
*
|
|
* CryptoKey_control() returns CryptoKey_STATUS_ERROR if the control code was not executed
|
|
* successfully.
|
|
*/
|
|
#define CryptoKey_STATUS_ERROR (-1)
|
|
|
|
/*!
|
|
* @brief Returned if the encoding of a CryptoKey is not a CryptoKey_Encoding value
|
|
*
|
|
* CryptoKey_control() returns CryptoKey_STATUS_ERROR if the control code was not executed
|
|
* successfully.
|
|
*/
|
|
#define CryptoKey_STATUS_UNDEFINED_ENCODING (-2)
|
|
|
|
|
|
/** @}*/
|
|
|
|
/** @}*/
|
|
|
|
/*!
|
|
* @brief List of the different types of CryptoKey.
|
|
*
|
|
*/
|
|
typedef enum CryptoKey_Encoding_ {
|
|
CryptoKey_PLAINTEXT = 1 << 1,
|
|
CryptoKey_BLANK_PLAINTEXT = 1 << 2,
|
|
CryptoKey_KEYSTORE = 1 << 3,
|
|
CryptoKey_BLANK_KEYSTORE = 1 << 4,
|
|
CryptoKey_KEYBLOB = 1 << 5,
|
|
CryptoKey_BLANK_KEYBLOB = 1 << 6,
|
|
} CryptoKey_Encoding;
|
|
|
|
/*!
|
|
* @brief Plaintext CryptoKey datastructure.
|
|
*
|
|
* This structure contains all the information necessary to access keying material stored
|
|
* in plaintext form in flash or RAM.
|
|
*/
|
|
typedef struct CryptoKey_Plaintext_ {
|
|
uint8_t *keyMaterial;
|
|
uint16_t keyLength;
|
|
} CryptoKey_Plaintext;
|
|
|
|
/*!
|
|
* @brief Key store CryptoKey datastructure.
|
|
*
|
|
* This structure contains all the information necessary to access keying material stored
|
|
* in a dedicated key store or key database with memory access controls.
|
|
*/
|
|
typedef struct CryptoKey_KeyStore_ {
|
|
void* keyStore;
|
|
uint16_t keyLength;
|
|
uint32_t keyIndex;
|
|
} CryptoKey_KeyStore;
|
|
|
|
/*!
|
|
* @brief Keyblob CryptoKey datastructure.
|
|
*
|
|
* This structure contains all the information necessary to access keying material stored
|
|
* in an encrypted structure in flash or RAM.
|
|
*/
|
|
typedef struct CryptoKey_KeyBlob_ {
|
|
uint8_t *keyBlob;
|
|
uint32_t keyBlobLength;
|
|
} CryptoKey_KeyBlob;
|
|
|
|
/*!
|
|
* @brief CryptoKey datastructure.
|
|
*
|
|
* This structure contains a CryptoKey_Encoding and one of
|
|
* - CryptoKey_Plaintext
|
|
* - CryptoKey_KeyStore
|
|
* - CryptoKey_KeyBlob
|
|
*/
|
|
typedef struct CryptoKey_ {
|
|
CryptoKey_Encoding encoding;
|
|
union {
|
|
CryptoKey_Plaintext plaintext;
|
|
CryptoKey_KeyStore keyStore;
|
|
CryptoKey_KeyBlob keyBlob;
|
|
} u;
|
|
} CryptoKey;
|
|
|
|
|
|
/*!
|
|
* @brief Structure that specifies the restrictions on a CryptoKey
|
|
*
|
|
* This structure is device-specific and declared here in incomplete form.
|
|
* The structure is fully defined in CryptoKeyDEVICE.h. This creates a link-time binding
|
|
* when using the structure with key store or keyblob functions. If the instance
|
|
* of the CryptoKey_SecurityPolicy is kept in a device-specific application-file,
|
|
* the gernic application code may still use references to it despite being
|
|
* an incomplete type in the generic application file at compile time.
|
|
*/
|
|
typedef struct CryptoKey_SecurityPolicy_ CryptoKey_SecurityPolicy;
|
|
|
|
/*!
|
|
* @brief Gets the key type of the CryptoKey
|
|
*
|
|
* @param [in] keyHandle Pointer to a CryptoKey
|
|
* @param [out] keyType Type of the CryptoKey
|
|
*
|
|
* @return Returns a status code
|
|
*/
|
|
int_fast16_t CryptoKey_getCryptoKeyType(CryptoKey *keyHandle, CryptoKey_Encoding *keyType);
|
|
|
|
/*!
|
|
* @brief Wheather the CryptoKey is 'blank' or represents valid keying material
|
|
*
|
|
* @param [in] keyHandle Pointer to a CryptoKey
|
|
* @param [out] isBlank Wheather the CryptoKey is 'blank' or not
|
|
*
|
|
* @return Returns a status code
|
|
*/
|
|
int_fast16_t CryptoKey_isBlank(CryptoKey *keyHandle, bool *isBlank);
|
|
|
|
/*!
|
|
* @brief Marks a CryptoKey as 'blank'.
|
|
*
|
|
* The CryptoKey will be unlinked from any previously connected keying material
|
|
*
|
|
* @param [in] keyHandle Pointer to a CryptoKey
|
|
*
|
|
* @return Returns a status code
|
|
*/
|
|
int_fast16_t CryptoKey_markAsBlank(CryptoKey *keyHandle);
|
|
|
|
/*!
|
|
* @brief Function to initialize the CryptoKey_SecurityPolicy struct to its defaults
|
|
*
|
|
* This will zero-out all fields that cannot be set to safe defaults
|
|
*
|
|
* @param [in] policy Pointer to a CryptoKey_SecurityPolicy
|
|
*
|
|
* @return Returns a status code
|
|
*/
|
|
int_fast16_t CryptoKey_initSecurityPolicy(CryptoKey_SecurityPolicy *policy);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ti_drivers_cryptoutils_cyptokey_CryptoKey__include */
|