212 lines
6.2 KiB
C
212 lines
6.2 KiB
C
/**
|
|
*
|
|
* \file
|
|
*
|
|
* \brief WINC3400 Crypto API
|
|
*
|
|
* Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries.
|
|
*
|
|
* \asf_license_start
|
|
*
|
|
* \page License
|
|
*
|
|
* Subject to your compliance with these terms, you may use Microchip
|
|
* software and any derivatives exclusively with Microchip products.
|
|
* It is your responsibility to comply with third party license terms applicable
|
|
* to your use of third party software (including open source software) that
|
|
* may accompany Microchip software.
|
|
*
|
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
|
*
|
|
* \asf_license_stop
|
|
*
|
|
*/
|
|
|
|
#ifndef __M2M_CRYPTO_H__
|
|
#define __M2M_CRYPTO_H__
|
|
|
|
|
|
/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
|
|
INCLUDES
|
|
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
|
|
|
|
|
|
#include "common/include/nm_common.h"
|
|
#include "driver/include/m2m_types.h"
|
|
|
|
/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
|
|
MACROS
|
|
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
|
|
#define M2M_SHA256_CONTEXT_BUFF_LEN 128
|
|
#define M2M_SHA256_DIGEST_LEN 32
|
|
/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
|
|
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.
|
|
*/
|
|
typedef enum{
|
|
M2M_RSA_SIGN_OK,
|
|
M2M_RSA_SIGN_FAIL
|
|
} tenuRsaSignStatus;
|
|
|
|
|
|
/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
|
|
FUNCTION PROTOTYPES
|
|
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*!
|
|
@fn \
|
|
sint8 m2m_sha256_hash_init(tstrM2mSha256Ctxt *psha256Ctxt);
|
|
|
|
@brief SHA256 hash initialization
|
|
|
|
@param[in] psha256Ctxt
|
|
Pointer to a sha256 context allocated by the caller.
|
|
*/
|
|
sint8 m2m_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.
|
|
*/
|
|
sint8 m2m_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.
|
|
*/
|
|
sint8 m2m_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.
|
|
*/
|
|
sint8 m2m_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.
|
|
*/
|
|
sint8 m2m_rsa_sign_gen(uint8 *pu8N, uint16 u16NSize, uint8 *pu8d, uint16 u16dSize, uint8 *pu8SignedMsgHash,
|
|
uint16 u16HashLength, uint8 *pu8RsaSignature);
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
|
|
#endif /* __M2M_CRYPTO_H__ */ |