260 lines
8.6 KiB
C
260 lines
8.6 KiB
C
/**
|
|
*
|
|
* \file
|
|
*
|
|
* \brief WINC Crypto Application Interface.
|
|
*
|
|
* Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved.
|
|
*
|
|
* \asf_license_start
|
|
*
|
|
* \page License
|
|
*
|
|
* 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. The name of Atmel may not be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
|
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
|
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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.
|
|
*
|
|
* \asf_license_stop
|
|
*
|
|
*/
|
|
|
|
#ifndef __M2M_CRYPTO_H__
|
|
#define __M2M_CRYPTO_H__
|
|
|
|
/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
|
|
INCLUDES
|
|
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
|
|
|
|
#include "common/include/nm_common.h"
|
|
#include "driver/include/m2m_types.h"
|
|
#include "driver/source/m2m_hif.h"
|
|
|
|
/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
|
|
MACROS
|
|
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
|
|
#define M2M_MAX_RSA_LEN (256)
|
|
#define M2M_SHA256_DIGEST_LEN 32
|
|
#define M2M_SHA256_MAX_DATA (M2M_BUFFER_MAX_SIZE - M2M_SHA256_CONTEXT_BUFF_LEN - M2M_HIF_HDR_OFFSET)
|
|
/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
|
|
DATA TYPES
|
|
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
|
|
|
|
/*!
|
|
@struct \
|
|
tstrM2mSha256Ctxt
|
|
|
|
@brief
|
|
SHA256 context data
|
|
*/
|
|
typedef struct sha256ctxt {
|
|
uint32 au32Sha256CtxtBuff[M2M_SHA256_CONTEXT_BUFF_LEN / sizeof(uint32)];
|
|
} tstrM2mSha256Ctxt;
|
|
|
|
/*!
|
|
@enum \
|
|
tenuRsaSignStatus
|
|
|
|
@brief
|
|
RSA Signature status: pass or fail.
|
|
|
|
@see
|
|
m2m_crypto_rsa_sign_gen
|
|
*/
|
|
typedef enum { M2M_RSA_SIGN_OK, M2M_RSA_SIGN_FAIL } tenuRsaSignStatus;
|
|
|
|
/*!
|
|
@typedef \
|
|
tpfAppCryproCb
|
|
|
|
@brief Crypto Calback function receiving the crypto related messages
|
|
@param [in] u8MsgType
|
|
Crypto command about which the notification is received.
|
|
@param [in] pvResp
|
|
A pointer to the result associated with the notification.
|
|
@param [in] pvMsg
|
|
A pointer to a buffer containing the notification parameters (if any). It should be
|
|
Casted to the correct data type corresponding to the notification type.
|
|
@see
|
|
m2m_crypto_init
|
|
tenuM2mCryptoCmd
|
|
*/
|
|
typedef void (*tpfAppCryproCb)(uint8 u8MsgType, void *pvResp, void *pvMsg);
|
|
/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
|
|
FUNCTION PROTOTYPES
|
|
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
/*!
|
|
@fn \
|
|
sint8 m2m_crypto_init();
|
|
|
|
@brief crypto initialization.
|
|
|
|
@param[in] pfAppCryproCb
|
|
Pointer to the Crypto Calback function receiving the crypto related messages.
|
|
@see
|
|
tpfAppCryproCb
|
|
|
|
@return
|
|
The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise.
|
|
*/
|
|
sint8 m2m_crypto_init(tpfAppCryproCb pfAppCryproCb);
|
|
/*!
|
|
@fn \
|
|
sint8 m2m_sha256_hash_init(tstrM2mSha256Ctxt *psha256Ctxt);
|
|
|
|
@brief SHA256 hash initialization
|
|
|
|
@param[in] psha256Ctxt
|
|
Pointer to a sha256 context allocated by the caller.
|
|
@return
|
|
The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise.
|
|
*/
|
|
sint8 m2m_crypto_sha256_hash_init(tstrM2mSha256Ctxt *psha256Ctxt);
|
|
|
|
/*!
|
|
@fn \
|
|
sint8 m2m_sha256_hash_update(tstrM2mSha256Ctxt *psha256Ctxt, uint8 *pu8Data, uint16 u16DataLength);
|
|
|
|
@brief SHA256 hash update
|
|
|
|
@param [in] psha256Ctxt
|
|
Pointer to the sha256 context.
|
|
|
|
@param [in] pu8Data
|
|
Buffer holding the data submitted to the hash.
|
|
|
|
@param [in] u16DataLength
|
|
Size of the data bufefr in bytes.
|
|
@pre SHA256 module should be initialized first through m2m_crypto_sha256_hash_init function.
|
|
|
|
@see m2m_crypto_sha256_hash_init
|
|
|
|
@return
|
|
The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise.
|
|
|
|
*/
|
|
sint8 m2m_crypto_sha256_hash_update(tstrM2mSha256Ctxt *psha256Ctxt, uint8 *pu8Data, uint16 u16DataLength);
|
|
|
|
/*!
|
|
@fn \
|
|
sint8 m2m_sha256_hash_finish(tstrM2mSha256Ctxt *psha256Ctxt, uint8 *pu8Sha256Digest);
|
|
|
|
@brief SHA256 hash finalization
|
|
|
|
@param[in] psha256Ctxt
|
|
Pointer to a sha256 context allocated by the caller.
|
|
|
|
@param [in] pu8Sha256Digest
|
|
Buffer allocated by the caller which will hold the resultant SHA256 Digest. It must be allocated no less
|
|
than M2M_SHA256_DIGEST_LEN.
|
|
|
|
@return
|
|
The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise.
|
|
*/
|
|
sint8 m2m_crypto_sha256_hash_finish(tstrM2mSha256Ctxt *psha256Ctxt, uint8 *pu8Sha256Digest);
|
|
|
|
/*!
|
|
@fn \
|
|
sint8 m2m_rsa_sign_verify(uint8 *pu8N, uint16 u16NSize, uint8 *pu8E, uint16 u16ESize, uint8 *pu8SignedMsgHash, \
|
|
uint16 u16HashLength, uint8 *pu8RsaSignature);
|
|
|
|
@brief RSA Signature Verification
|
|
|
|
The function shall request the RSA Signature verification from the WINC Firmware for the given message. The signed
|
|
message shall be compressed to the corresponding hash algorithm before calling this function. The hash type is
|
|
identified by the given hash length. For example, if the hash length is 32 bytes, then it is SHA256.
|
|
|
|
@param[in] pu8N
|
|
RSA Key modulus n.
|
|
|
|
@param[in] u16NSize
|
|
Size of the RSA modulus n in bytes.
|
|
|
|
@param[in] pu8E
|
|
RSA public exponent.
|
|
|
|
@param[in] u16ESize
|
|
Size of the RSA public exponent in bytes.
|
|
|
|
@param[in] pu8SignedMsgHash
|
|
The hash digest of the signed message.
|
|
|
|
@param[in] u16HashLength
|
|
The length of the hash digest.
|
|
|
|
@param[out] pu8RsaSignature
|
|
Signature value to be verified.
|
|
|
|
@return
|
|
The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise.
|
|
*/
|
|
sint8 m2m_crypto_rsa_sign_verify(uint8 *pu8N, uint16 u16NSize, uint8 *pu8E, uint16 u16ESize, uint8 *pu8SignedMsgHash,
|
|
uint16 u16HashLength, uint8 *pu8RsaSignature);
|
|
|
|
/*!
|
|
@fn \
|
|
sint8 m2m_rsa_sign_gen(uint8 *pu8N, uint16 u16NSize, uint8 *pu8d, uint16 u16dSize, uint8 *pu8SignedMsgHash, \
|
|
uint16 u16HashLength, uint8 *pu8RsaSignature);
|
|
|
|
@brief RSA Signature Generation
|
|
|
|
The function shall request the RSA Signature generation from the WINC Firmware for the given message. The signed
|
|
message shall be compressed to the corresponding hash algorithm before calling this function. The hash type is
|
|
identified by the given hash length. For example, if the hash length is 32 bytes, then it is SHA256.
|
|
|
|
@param[in] pu8N
|
|
RSA Key modulus n.
|
|
|
|
@param[in] u16NSize
|
|
Size of the RSA modulus n in bytes.
|
|
|
|
@param[in] pu8d
|
|
RSA private exponent.
|
|
|
|
@param[in] u16dSize
|
|
Size of the RSA private exponent in bytes.
|
|
|
|
@param[in] pu8SignedMsgHash
|
|
The hash digest of the signed message.
|
|
|
|
@param[in] u16HashLength
|
|
The length of the hash digest.
|
|
|
|
@param[out] pu8RsaSignature
|
|
Pointer to a user buffer allocated by teh caller shall hold the generated signature.
|
|
|
|
@return
|
|
The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise.
|
|
*/
|
|
sint8 m2m_crypto_rsa_sign_gen(uint8 *pu8N, uint16 u16NSize, uint8 *pu8d, uint16 u16dSize, uint8 *pu8SignedMsgHash,
|
|
uint16 u16HashLength, uint8 *pu8RsaSignature);
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __M2M_CRYPTO_H__ */
|