From 39daa496e9b2a7c3825ca102fa3c7462dc6683fc Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Sun, 22 Oct 2017 08:38:45 +0000 Subject: Crypto driver initial setup. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@10869 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/hal/src/hal_crypto.c | 424 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 424 insertions(+) create mode 100644 os/hal/src/hal_crypto.c (limited to 'os/hal/src/hal_crypto.c') diff --git a/os/hal/src/hal_crypto.c b/os/hal/src/hal_crypto.c new file mode 100644 index 000000000..0493da872 --- /dev/null +++ b/os/hal/src/hal_crypto.c @@ -0,0 +1,424 @@ +/* + ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file hal_crypto.c + * @brief Cryptographic Driver code. + * + * @addtogroup CRYPTO + * @{ + */ + +#include "hal.h" + +#if (HAL_USE_CRY == TRUE) || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Driver local definitions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver exported variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local variables and types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local functions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver exported functions. */ +/*===========================================================================*/ + +/** + * @brief Crypto Driver initialization. + * @note This function is implicitly invoked by @p halInit(), there is + * no need to explicitly initialize the driver. + * + * @init + */ +void cryInit(void) { + + cry_lld_init(); +} + +/** + * @brief Initializes the standard part of a @p CRYDriver structure. + * + * @param[out] cryp pointer to the @p CRYDriver object + * + * @init + */ +void cryObjectInit(CRYDriver *cryp) { + + cryp->state = CRY_STOP; + cryp->config = NULL; + cryp->thread = NULL; +#if CRY_USE_MUTUAL_EXCLUSION == TRUE + osalMutexObjectInit(&cryp->mutex); +#endif +#if defined(CRY_DRIVER_EXT_INIT_HOOK) + CRY_DRIVER_EXT_INIT_HOOK(cryp); +#endif +} + +/** + * @brief Configures and activates the CRY peripheral. + * + * @param[in] cryp pointer to the @p CRYDriver object + * @param[in] config pointer to the @p CRYConfig object. Depending on + * the implementation the value can be @p NULL. + * + * @api + */ +void cryStart(CRYDriver *cryp, const CRYConfig *config) { + + osalDbgCheck(cryp != NULL); + + osalSysLock(); + osalDbgAssert((cryp->state == CRY_STOP) || (cryp->state == CRY_READY), + "invalid state"); + cryp->config = config; + cry_lld_start(cryp); + cryp->state = CRY_READY; + osalSysUnlock(); +} + +/** + * @brief Deactivates the CRY peripheral. + * + * @param[in] cryp pointer to the @p CRYDriver object + * + * @api + */ +void cryStop(CRYDriver *cryp) { + + osalDbgCheck(cryp != NULL); + + osalSysLock(); + + osalDbgAssert((cryp->state == CRY_STOP) || (cryp->state == CRY_READY), + "invalid state"); + + cry_lld_stop(cryp); + cryp->config = NULL; + cryp->state = CRY_STOP; + + osalSysUnlock(); +} + +/** + * @brief Initializes the transient key for a specific algorithm. + * + * @param[in] cryp pointer to the @p CRYDriver object + * @param[in] algorithm the algorithm identifier + * @param[in] size key size in bytes + * @param[in] keyp pointer to the key data + * @return The operation status. + * @retval CRY_NOERROR if the operation succeeded. + * @retval CRY_ERR_INV_ALGO if the specified algorithm is unknown or + * unsupported. + * @retval CRY_ERR_INV_KEY_SIZE if the specified key size is invalid. + * + * @api + */ +cryerror_t cryLoadTransientKey(CRYDriver *cryp, + cryalgorithm_t algorithm, + size_t size, + const uint8_t *keyp); + +#if (CRY_LLD_SUPPORTS_AES_ECB == TRUE) || defined(__DOXYGEN__) +/** + * @brief Encryption operation using AES-ECB. + * + * @param[in] key_id the key to be used for the operation, zero is the + * transient key, other values are keys stored in an + * unspecified way + * @param[in] size size of the plaintext buffer, this number must be a + * multiple of the selected key size + * @param[in] in buffer containing the input plaintext + * @param[out] out buffer for the output cyphertext + * @return The operation status. + * @retval CRY_NOERROR if the operation succeeded. + * @retval CRY_ERR_INV_ALGO if the operation is unsupported on this + * device instance. + * @retval CRY_ERR_INV_KEY_TYPE the selected key is invalid for this operation. + * @retval CRY_ERR_INV_KEY_ID if the specified key identifier is invalid + * or refers and empty key slot. + * + * @api + */ +cryerror_t cryEncryptAES_ECB(crykey_t key_id, + size_t size, + const uint8_t *in, + uint8_t *out) { + +} + +/** + * @brief Decryption operation using AES-ECB. + * + * @param[in] key_id the key to be used for the operation, zero is the + * transient key, other values are keys stored in an + * unspecified way + * @param[in] size size of the plaintext buffer, this number must be a + * multiple of the selected key size + * @param[in] in buffer containing the input plaintext + * @param[out] out buffer for the output cyphertext + * @return The operation status. + * @retval CRY_NOERROR if the operation succeeded. + * @retval CRY_ERR_INV_ALGO if the operation is unsupported on this + * device instance. + * @retval CRY_ERR_INV_KEY_TYPE the selected key is invalid for this operation. + * @retval CRY_ERR_INV_KEY_ID if the specified key identifier is invalid + * or refers and empty key slot. + * + * @api + */ +cryerror_t cryDecryptAES_ECB(crykey_t key_id, + size_t blocks, + const uint8_t *in, + uint8_t *out) { + +} +#endif /* CRY_LLD_SUPPORTS_AES_ECB == TRUE */ + +#if (CRY_LLD_SUPPORTS_AES_CBC == TRUE) || defined(__DOXYGEN__) +/** + * @brief Encryption operation using AES-CBC. + * + * @param[in] key_id the key to be used for the operation, zero is the + * transient key, other values are keys stored in an + * unspecified way + * @param[in] size size of the plaintext buffer, this number must be a + * multiple of the selected key size + * @param[in] in buffer containing the input plaintext + * @param[out] out buffer for the output cyphertext + * @param[in] iv input vector + * @return The operation status. + * @retval CRY_NOERROR if the operation succeeded. + * @retval CRY_ERR_INV_ALGO if the operation is unsupported on this + * device instance. + * @retval CRY_ERR_INV_KEY_TYPE the selected key is invalid for this operation. + * @retval CRY_ERR_INV_KEY_ID if the specified key identifier is invalid + * or refers and empty key slot. + * + * @api + */ +cryerror_t cryEncryptAES_CBC(crykey_t key_id, + size_t size, + const uint8_t *in, + uint8_t *out, + const uint8_t *iv){ + +} + +/** + * @brief Decryption operation using AES-CBC. + * + * @param[in] key_id the key to be used for the operation, zero is the + * transient key, other values are keys stored in an + * unspecified way + * @param[in] size size of the plaintext buffer, this number must be a + * multiple of the selected key size + * @param[in] in buffer containing the input plaintext + * @param[out] out buffer for the output cyphertext + * @param[in] iv input vector + * @return The operation status. + * @retval CRY_NOERROR if the operation succeeded. + * @retval CRY_ERR_INV_ALGO if the operation is unsupported on this + * device instance. + * @retval CRY_ERR_INV_KEY_TYPE the selected key is invalid for this operation. + * @retval CRY_ERR_INV_KEY_ID if the specified key identifier is invalid + * or refers and empty key slot. + * + * @api + */ +cryerror_t cryDecryptAES_CBC(crykey_t key_id, + size_t size, + const uint8_t *in, + uint8_t *out, + const uint8_t *iv) { + +} +#endif /* CRY_LLD_SUPPORTS_AES_CBC == TRUE */ + +#if (CRY_LLD_SUPPORTS_AES_CFB == TRUE) || defined(__DOXYGEN__) +/** + * @brief Encryption operation using AES-CFB. + * + * @param[in] key_id the key to be used for the operation, zero is the + * transient key, other values are keys stored in an + * unspecified way + * @param[in] size size of the plaintext buffer, this number must be a + * multiple of the selected key size + * @param[in] in buffer containing the input plaintext + * @param[out] out buffer for the output cyphertext + * @param[in] iv input vector + * @return The operation status. + * @retval CRY_NOERROR if the operation succeeded. + * @retval CRY_ERR_INV_ALGO if the operation is unsupported on this + * device instance. + * @retval CRY_ERR_INV_KEY_TYPE the selected key is invalid for this operation. + * @retval CRY_ERR_INV_KEY_ID if the specified key identifier is invalid + * or refers and empty key slot. + * + * @api + */ +cryerror_t cryEncryptAES_CFB(crykey_t key_id, + size_t size, + const uint8_t *in, + uint8_t *out, + const uint8_t *iv) { + +} + +/** + * @brief Decryption operation using AES-CFB. + * + * @param[in] key_id the key to be used for the operation, zero is the + * transient key, other values are keys stored in an + * unspecified way + * @param[in] size size of the plaintext buffer, this number must be a + * multiple of the selected key size + * @param[in] in buffer containing the input plaintext + * @param[out] out buffer for the output cyphertext + * @param[in] iv input vector + * @return The operation status. + * @retval CRY_NOERROR if the operation succeeded. + * @retval CRY_ERR_INV_ALGO if the operation is unsupported on this + * device instance. + * @retval CRY_ERR_INV_KEY_TYPE the selected key is invalid for this operation. + * @retval CRY_ERR_INV_KEY_ID if the specified key identifier is invalid + * or refers and empty key slot. + * + * @api + */ +cryerror_t cryDecryptAES_CFB(crykey_t key_id, + size_t size, + const uint8_t *in, + uint8_t *out, + const uint8_t *iv) { + +} +#endif /* CRY_LLD_SUPPORTS_AES_CFB == TRUE */ + +#if (CRY_LLD_SUPPORTS_AES_CTR == TRUE) || defined(__DOXYGEN__) +/** + * @brief Encryption operation using AES-CTR. + * + * @param[in] key_id the key to be used for the operation, zero is the + * transient key, other values are keys stored in an + * unspecified way + * @param[in] size size of the plaintext buffer, this number must be a + * multiple of the selected key size + * @param[in] in buffer containing the input plaintext + * @param[out] out buffer for the output cyphertext + * @param[in] nonce the "nonce" constant + * @param[in,out] cnt the initial value of the counter, normally zero + * @return The operation status. + * @retval CRY_NOERROR if the operation succeeded. + * @retval CRY_ERR_INV_ALGO if the operation is unsupported on this + * device instance. + * @retval CRY_ERR_INV_KEY_TYPE the selected key is invalid for this operation. + * @retval CRY_ERR_INV_KEY_ID if the specified key identifier is invalid + * or refers and empty key slot. + * + * @api + */ +cryerror_t cryEncryptAES_CTR(crykey_t key_id, + size_t size, + const uint8_t *in, + uint8_t *out, + const uint8_t *nonce, + uint8_t *cnt) { + +} + +/** + * @brief Decryption operation using AES-CTR. + * + * @param[in] key_id the key to be used for the operation, zero is the + * transient key, other values are keys stored in an + * unspecified way + * @param[in] size size of the plaintext buffer, this number must be a + * multiple of the selected key size + * @param[in] in buffer containing the input plaintext + * @param[out] out buffer for the output cyphertext + * @param[in] nonce the "nonce" constant + * @param[in,out] cnt the initial value of the counter, normally zero + * @return The operation status. + * @retval CRY_NOERROR if the operation succeeded. + * @retval CRY_ERR_INV_ALGO if the operation is unsupported on this + * device instance. + * @retval CRY_ERR_INV_KEY_TYPE the selected key is invalid for this operation. + * @retval CRY_ERR_INV_KEY_ID if the specified key identifier is invalid + * or refers and empty key slot. + * + * @api + */ +cryerror_t cryDecryptAES_CTR(crykey_t key_id, + size_t size, + const uint8_t *in, + uint8_t *out, + const uint8_t *nonce, + uint8_t *cnt) { + +} +#endif /* CRY_LLD_SUPPORTS_AES_CTR == TRUE */ + +#if (CRY_USE_MUTUAL_EXCLUSION == TRUE) || defined(__DOXYGEN__) +/** + * @brief Gains exclusive access to the CRY peripheral. + * @details This function tries to gain ownership to CRY bus, if the bus + * is already being used then the invoking thread is queued. + * @pre In order to use this function the option + * @p CRY_USE_MUTUAL_EXCLUSION must be enabled. + * + * @param[in] cryp pointer to the @p CRYDriver object + * + * @api + */ +void cryAcquireBus(CRYDriver *cryp) { + + osalDbgCheck(cryp != NULL); + + osalMutexLock(&cryp->mutex); +} + +/** + * @brief Releases exclusive access to the CRY peripheral. + * @pre In order to use this function the option + * @p CRY_USE_MUTUAL_EXCLUSION must be enabled. + * + * @param[in] cryp pointer to the @p CRYDriver object + * + * @api + */ +void cryReleaseBus(CRYDriver *cryp) { + + osalDbgCheck(cryp != NULL); + + osalMutexUnlock(&cryp->mutex); +} +#endif /* CRY_USE_MUTUAL_EXCLUSION == TRUE */ + +#endif /* HAL_USE_CRY == TRUE */ + +/** @} */ -- cgit v1.2.3