213 lines
8.0 KiB
C
213 lines
8.0 KiB
C
/******************************************************************************
|
|
* Filename: rom_crypto.h
|
|
* Revised: 2020-02-14 11:30:20 +0100 (Fri, 14 Feb 2020)
|
|
* Revision: 56760
|
|
*
|
|
* Description: This header file is the API to the crypto functions
|
|
* built into ROM on the CC13xx/CC26xx.
|
|
*
|
|
* Copyright (c) 2015 - 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:
|
|
*
|
|
* 1) Redistributions of source code must retain the above copyright notice,
|
|
* this list of conditions and the following disclaimer.
|
|
*
|
|
* 2) 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.
|
|
*
|
|
* 3) Neither the name of the ORGANIZATION 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 HOLDER 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.
|
|
*
|
|
*******************************************************************************/
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! \addtogroup peripheral_group
|
|
//! @{
|
|
//! \addtogroup rom_crypto_api
|
|
//! @{
|
|
//
|
|
//*****************************************************************************
|
|
|
|
#ifndef ROM_CRYPTO_H
|
|
#define ROM_CRYPTO_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
{
|
|
#endif
|
|
|
|
////////////////////////////////////* ECC */////////////////////////////////////
|
|
|
|
/* Window size, valid values are 2,3,4,5.
|
|
* Higher the value, faster the computation at the expense of memory usage.
|
|
*
|
|
* Recommended workzone size (in 4-byte words)
|
|
* Window size: 3, Workzone size: 275
|
|
*
|
|
*/
|
|
#define ECC_WINDOW_SIZE 3
|
|
|
|
/*
|
|
* ECC Supported Curves, define one:
|
|
* ECC_PRIME_NIST256_CURVE
|
|
*/
|
|
#define ECC_PRIME_NIST256_CURVE
|
|
|
|
/*
|
|
* ECC Return Status Flags.
|
|
*/
|
|
// Scalar multiplication status
|
|
#define ECC_MODULUS_EVEN 0xDC
|
|
#define ECC_MODULUS_LARGER_THAN_255_WORDS 0xD2
|
|
#define ECC_MODULUS_LENGTH_ZERO 0x08
|
|
#define ECC_MODULUS_MSW_IS_ZERO 0x30
|
|
#define ECC_SCALAR_TOO_LONG 0x35
|
|
#define ECC_SCALAR_LENGTH_ZERO 0x53
|
|
#define ECC_ORDER_TOO_LONG 0xC6
|
|
#define ECC_ORDER_LENGTH_ZERO 0x6C
|
|
#define ECC_X_COORD_TOO_LONG 0x3C
|
|
#define ECC_X_COORD_LENGTH_ZERO 0xC3
|
|
#define ECC_Y_COORD_TOO_LONG 0x65
|
|
#define ECC_Y_COORD_LENGTH_ZERO 0x56
|
|
#define ECC_A_COEF_TOO_LONG 0x5C
|
|
#define ECC_A_COEF_LENGTH_ZERO 0xC5
|
|
#define ECC_BAD_WINDOW_SIZE 0x66
|
|
#define ECC_SCALAR_MUL_OK 0x99
|
|
|
|
// ECDSA and ECDH status
|
|
#define ECC_ORDER_LARGER_THAN_255_WORDS 0x28
|
|
#define ECC_ORDER_EVEN 0x82
|
|
#define ECC_ORDER_MSW_IS_ZERO 0x23
|
|
#define ECC_ECC_KEY_TOO_LONG 0x25
|
|
#define ECC_ECC_KEY_LENGTH_ZERO 0x52
|
|
#define ECC_DIGEST_TOO_LONG 0x27
|
|
#define ECC_DIGEST_LENGTH_ZERO 0x72
|
|
#define ECC_ECDSA_SIGN_OK 0x32
|
|
#define ECC_ECDSA_INVALID_SIGNATURE 0x5A
|
|
#define ECC_ECDSA_VALID_SIGNATURE 0xA5
|
|
#define ECC_SIG_P1_TOO_LONG 0x11
|
|
#define ECC_SIG_P1_LENGTH_ZERO 0x12
|
|
#define ECC_SIG_P2_TOO_LONG 0x22
|
|
#define ECC_SIG_P2_LENGTH_ZERO 0x21
|
|
|
|
#define ECC_ECDSA_KEYGEN_OK ECC_SCALAR_MUL_OK
|
|
#define ECC_ECDH_KEYGEN_OK ECC_SCALAR_MUL_OK
|
|
#define ECC_ECDH_COMMON_KEY_OK ECC_SCALAR_MUL_OK
|
|
|
|
//*****************************************************************************
|
|
/*!
|
|
* \brief Pass pointer to ECC memory allocation to ECC engine.
|
|
*
|
|
* This function can be called again to point the ECC workzone at
|
|
* a different memory buffer.
|
|
*
|
|
* \param pWorkzone Pointer to memory allocated for computations, input.
|
|
* See description at beginning of ECC section for
|
|
* memory requirements.
|
|
*
|
|
* \return None
|
|
*/
|
|
//*****************************************************************************
|
|
extern void ECC_initialize(uint32_t *pWorkzone);
|
|
|
|
//*****************************************************************************
|
|
/*!
|
|
* \brief Generate a key.
|
|
*
|
|
* This is used for both ECDH and ECDSA.
|
|
*
|
|
* \param randString Pointer to random string, input.
|
|
* \param privateKey Pointer to the private key, output.
|
|
* \param publicKey_x Pointer to public key X-coordinate, output.
|
|
* \param publicKey_y Pointer to public key Y-coordinate, output.
|
|
*
|
|
* \return Status
|
|
*/
|
|
//*****************************************************************************
|
|
extern uint8_t ECC_generateKey(uint32_t *randString, uint32_t *privateKey,
|
|
uint32_t *publicKey_x, uint32_t *publicKey_y);
|
|
|
|
//*****************************************************************************
|
|
/*!
|
|
* \brief Sign data.
|
|
*
|
|
* \param secretKey Pointer to the secret key, input.
|
|
* \param text Pointer to the message, input.
|
|
* \param randString Pointer to random string, input.
|
|
* \param sign1 Pointer to signature part 1, output.
|
|
* \param sign2 Pointer to signature part 2, output.
|
|
*
|
|
* \return Status
|
|
*/
|
|
//*****************************************************************************
|
|
extern uint8_t ECC_ECDSA_sign(uint32_t *secretKey, uint32_t *text, uint32_t *randString,
|
|
uint32_t *sign1, uint32_t *sign2);
|
|
|
|
//*****************************************************************************
|
|
/*!
|
|
* \brief Verify signature.
|
|
*
|
|
* \param publicKey_x Pointer to public key X-coordinate, input.
|
|
* \param publicKey_y Pointer to public key Y-coordinate, input.
|
|
* \param text Pointer to message data, input.
|
|
* \param sign1 Pointer to signature part 1, input.
|
|
* \param sign2 Pointer to signature part 2, input.
|
|
*
|
|
* \return Status
|
|
*/
|
|
//*****************************************************************************
|
|
extern uint8_t ECC_ECDSA_verify(uint32_t *publicKey_x, uint32_t *publicKey_y,
|
|
uint32_t *text, uint32_t *sign1, uint32_t *sign2);
|
|
|
|
//*****************************************************************************
|
|
/*!
|
|
* \brief Compute the shared secret.
|
|
*
|
|
* \param privateKey Pointer to private key, input.
|
|
* \param publicKey_x Pointer to public key X-coordinate, input.
|
|
* \param publicKey_y Pointer to public key Y-coordinate, input.
|
|
* \param sharedSecret_x Pointer to shared secret X-coordinate, output.
|
|
* \param sharedSecret_y Pointer to shared secret Y-coordinate, output.
|
|
*
|
|
* \return Status
|
|
*/
|
|
//*****************************************************************************
|
|
extern uint8_t ECC_ECDH_computeSharedSecret(uint32_t *privateKey,
|
|
uint32_t *publicKey_x,
|
|
uint32_t *publicKey_y,
|
|
uint32_t *sharedSecret_x,
|
|
uint32_t *sharedSecret_y);
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ROM_CRYPTO_H */
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! Close the Doxygen group.
|
|
//! @}
|
|
//! @}
|
|
//
|
|
//*****************************************************************************
|