NNN50 WIFI_API library

Dependents:   NNN50_CE_Test_UDP NNN50_linux_firmware NNN50_SoftAP_HelloWorld NNN50_BLEWIFISensor ... more

This is mbed compatible EthernetInterface lib exclude for Delta DFCM-NNN50 platform.

Additional information and examples can be found in mbed Handbook

Committer:
tsungta
Date:
Mon Sep 04 05:40:11 2017 +0000
Revision:
32:8298a2fb074f
Parent:
28:2abbf8463fa8
56:f4cc53f; Add getRSSI() to readout RSSI while connected with AP router; Add SSL support refer to TCPSocketConnection.connect()

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tsungta 28:2abbf8463fa8 1 /**
tsungta 28:2abbf8463fa8 2 *
tsungta 28:2abbf8463fa8 3 * \file
tsungta 28:2abbf8463fa8 4 *
tsungta 28:2abbf8463fa8 5 * \brief WINC Crypto module.
tsungta 28:2abbf8463fa8 6 *
tsungta 28:2abbf8463fa8 7 * Copyright (c) 2016 Atmel Corporation. All rights reserved.
tsungta 28:2abbf8463fa8 8 *
tsungta 28:2abbf8463fa8 9 * \asf_license_start
tsungta 28:2abbf8463fa8 10 *
tsungta 28:2abbf8463fa8 11 * \page License
tsungta 28:2abbf8463fa8 12 *
tsungta 28:2abbf8463fa8 13 * Redistribution and use in source and binary forms, with or without
tsungta 28:2abbf8463fa8 14 * modification, are permitted provided that the following conditions are met:
tsungta 28:2abbf8463fa8 15 *
tsungta 28:2abbf8463fa8 16 * 1. Redistributions of source code must retain the above copyright notice,
tsungta 28:2abbf8463fa8 17 * this list of conditions and the following disclaimer.
tsungta 28:2abbf8463fa8 18 *
tsungta 28:2abbf8463fa8 19 * 2. Redistributions in binary form must reproduce the above copyright notice,
tsungta 28:2abbf8463fa8 20 * this list of conditions and the following disclaimer in the documentation
tsungta 28:2abbf8463fa8 21 * and/or other materials provided with the distribution.
tsungta 28:2abbf8463fa8 22 *
tsungta 28:2abbf8463fa8 23 * 3. The name of Atmel may not be used to endorse or promote products derived
tsungta 28:2abbf8463fa8 24 * from this software without specific prior written permission.
tsungta 28:2abbf8463fa8 25 *
tsungta 28:2abbf8463fa8 26 * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
tsungta 28:2abbf8463fa8 27 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
tsungta 28:2abbf8463fa8 28 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
tsungta 28:2abbf8463fa8 29 * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
tsungta 28:2abbf8463fa8 30 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
tsungta 28:2abbf8463fa8 31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
tsungta 28:2abbf8463fa8 32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
tsungta 28:2abbf8463fa8 33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
tsungta 28:2abbf8463fa8 34 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
tsungta 28:2abbf8463fa8 35 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
tsungta 28:2abbf8463fa8 36 * POSSIBILITY OF SUCH DAMAGE.
tsungta 28:2abbf8463fa8 37 *
tsungta 28:2abbf8463fa8 38 * \asf_license_stop
tsungta 28:2abbf8463fa8 39 *
tsungta 28:2abbf8463fa8 40 */
tsungta 28:2abbf8463fa8 41
tsungta 28:2abbf8463fa8 42 /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
tsungta 28:2abbf8463fa8 43 INCLUDES
tsungta 28:2abbf8463fa8 44 *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
tsungta 28:2abbf8463fa8 45
tsungta 28:2abbf8463fa8 46 #include "driver/include/m2m_crypto.h"
tsungta 28:2abbf8463fa8 47 #include "driver/source/nmbus.h"
tsungta 28:2abbf8463fa8 48 #include "driver/source/nmasic.h"
tsungta 28:2abbf8463fa8 49
tsungta 28:2abbf8463fa8 50 #ifdef CONF_CRYPTO_HW
tsungta 28:2abbf8463fa8 51
tsungta 28:2abbf8463fa8 52 /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
tsungta 28:2abbf8463fa8 53 MACROS
tsungta 28:2abbf8463fa8 54 *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
tsungta 28:2abbf8463fa8 55
tsungta 28:2abbf8463fa8 56 /*======*======*======*======*======*=======*
tsungta 28:2abbf8463fa8 57 * WINC SHA256 HW Engine Register Definition *
tsungta 28:2abbf8463fa8 58 *======*======*======*======*======*========*/
tsungta 28:2abbf8463fa8 59
tsungta 28:2abbf8463fa8 60 #define SHA_BLOCK_SIZE (64)
tsungta 28:2abbf8463fa8 61
tsungta 28:2abbf8463fa8 62 #define SHARED_MEM_BASE (0xd0000)
tsungta 28:2abbf8463fa8 63
tsungta 28:2abbf8463fa8 64
tsungta 28:2abbf8463fa8 65 #define SHA256_MEM_BASE (0x180000UL)
tsungta 28:2abbf8463fa8 66 #define SHA256_ENGINE_ADDR (0x180000ul)
tsungta 28:2abbf8463fa8 67
tsungta 28:2abbf8463fa8 68 /* SHA256 Registers */
tsungta 28:2abbf8463fa8 69 #define SHA256_CTRL (SHA256_MEM_BASE+0x00)
tsungta 28:2abbf8463fa8 70 #define SHA256_CTRL_START_CALC_MASK (NBIT0)
tsungta 28:2abbf8463fa8 71 #define SHA256_CTRL_START_CALC_SHIFT (0)
tsungta 28:2abbf8463fa8 72 #define SHA256_CTRL_PREPROCESS_MASK (NBIT1)
tsungta 28:2abbf8463fa8 73 #define SHA256_CTRL_PREPROCESS_SHIFT (1)
tsungta 28:2abbf8463fa8 74 #define SHA256_CTRL_HASH_HASH_MASK (NBIT2)
tsungta 28:2abbf8463fa8 75 #define SHA256_CTRL_HASH_HASH_SHIFT (2)
tsungta 28:2abbf8463fa8 76 #define SHA256_CTRL_INIT_SHA256_STATE_MASK (NBIT3)
tsungta 28:2abbf8463fa8 77 #define SHA256_CTRL_INIT_SHA256_STATE_SHIFT (3)
tsungta 28:2abbf8463fa8 78 #define SHA256_CTRL_WR_BACK_HASH_VALUE_MASK (NBIT4)
tsungta 28:2abbf8463fa8 79 #define SHA256_CTRL_WR_BACK_HASH_VALUE_SHIFT (4)
tsungta 28:2abbf8463fa8 80 #define SHA256_CTRL_FORCE_SHA256_QUIT_MASK (NBIT5)
tsungta 28:2abbf8463fa8 81 #define SHA256_CTRL_FORCE_SHA256_QUIT_SHIFT (5)
tsungta 28:2abbf8463fa8 82
tsungta 28:2abbf8463fa8 83 #define SHA256_REGS_SHA256_CTRL_AHB_BYTE_REV_EN (NBIT6)
tsungta 28:2abbf8463fa8 84 #define SHA256_REGS_SHA256_CTRL_RESERVED (NBIT7)
tsungta 28:2abbf8463fa8 85 #define SHA256_REGS_SHA256_CTRL_CORE_TO_AHB_CLK_RATIO (NBIT8+ NBIT9+ NBIT10)
tsungta 28:2abbf8463fa8 86 #define SHA256_REGS_SHA256_CTRL_CORE_TO_AHB_CLK_RATIO_MASK (NBIT2+ NBIT1+ NBIT0)
tsungta 28:2abbf8463fa8 87 #define SHA256_REGS_SHA256_CTRL_CORE_TO_AHB_CLK_RATIO_SHIFT (8)
tsungta 28:2abbf8463fa8 88 #define SHA256_REGS_SHA256_CTRL_RESERVED_11 (NBIT11)
tsungta 28:2abbf8463fa8 89 #define SHA256_REGS_SHA256_CTRL_SHA1_CALC (NBIT12)
tsungta 28:2abbf8463fa8 90 #define SHA256_REGS_SHA256_CTRL_PBKDF2_SHA1_CALC (NBIT13)
tsungta 28:2abbf8463fa8 91
tsungta 28:2abbf8463fa8 92
tsungta 28:2abbf8463fa8 93 #define SHA256_START_RD_ADDR (SHA256_MEM_BASE+0x04UL)
tsungta 28:2abbf8463fa8 94 #define SHA256_DATA_LENGTH (SHA256_MEM_BASE+0x08UL)
tsungta 28:2abbf8463fa8 95 #define SHA256_START_WR_ADDR (SHA256_MEM_BASE+0x0cUL)
tsungta 28:2abbf8463fa8 96 #define SHA256_COND_CHK_CTRL (SHA256_MEM_BASE+0x10)
tsungta 28:2abbf8463fa8 97 #define SHA256_COND_CHK_CTRL_HASH_VAL_COND_CHK_MASK (NBIT1 | NBIT0)
tsungta 28:2abbf8463fa8 98 #define SHA256_COND_CHK_CTRL_HASH_VAL_COND_CHK_SHIFT (0)
tsungta 28:2abbf8463fa8 99 #define SHA256_COND_CHK_CTRL_STEP_VAL_MASK (NBIT6 | NBIT5 | NBIT4 | NBIT3 | NBIT2)
tsungta 28:2abbf8463fa8 100 #define SHA256_COND_CHK_CTRL_STEP_VAL_SHIFT (2)
tsungta 28:2abbf8463fa8 101 #define SHA256_COND_CHK_CTRL_COND_CHK_RESULT_MASK (NBIT7)
tsungta 28:2abbf8463fa8 102 #define SHA256_COND_CHK_CTRL_COND_CHK_RESULT_SHIFT (7)
tsungta 28:2abbf8463fa8 103
tsungta 28:2abbf8463fa8 104 #define SHA256_MOD_DATA_RANGE (SHA256_MEM_BASE+0x14)
tsungta 28:2abbf8463fa8 105 #define SHA256_MOD_DATA_RANGE_ST_BYTE_2_ADD_STP_MASK (NBIT24-1)
tsungta 28:2abbf8463fa8 106 #define SHA256_MOD_DATA_RANGE_ST_BYTE_2_ADD_STP_SHIFT (0)
tsungta 28:2abbf8463fa8 107 #define SHA256_MOD_DATA_RANGE_MOD_DATA_LEN_MASK (NBIT24 | NBIT25| NBIT26)
tsungta 28:2abbf8463fa8 108 #define SHA256_MOD_DATA_RANGE_MOD_DATA_LEN_SHIFT (24)
tsungta 28:2abbf8463fa8 109
tsungta 28:2abbf8463fa8 110
tsungta 28:2abbf8463fa8 111 #define SHA256_COND_CHK_STS_1 (SHA256_MEM_BASE+0x18)
tsungta 28:2abbf8463fa8 112 #define SHA256_COND_CHK_STS_2 (SHA256_MEM_BASE+0x1c)
tsungta 28:2abbf8463fa8 113 #define SHA256_DONE_INTR_ENABLE (SHA256_MEM_BASE+0x20)
tsungta 28:2abbf8463fa8 114 #define SHA256_DONE_INTR_STS (SHA256_MEM_BASE+0x24)
tsungta 28:2abbf8463fa8 115 #define SHA256_TARGET_HASH_H1 (SHA256_MEM_BASE+0x28)
tsungta 28:2abbf8463fa8 116 #define SHA256_TARGET_HASH_H2 (SHA256_MEM_BASE+0x2c)
tsungta 28:2abbf8463fa8 117 #define SHA256_TARGET_HASH_H3 (SHA256_MEM_BASE+0x30)
tsungta 28:2abbf8463fa8 118 #define SHA256_TARGET_HASH_H4 (SHA256_MEM_BASE+0x34)
tsungta 28:2abbf8463fa8 119 #define SHA256_TARGET_HASH_H5 (SHA256_MEM_BASE+0x38)
tsungta 28:2abbf8463fa8 120 #define SHA256_TARGET_HASH_H6 (SHA256_MEM_BASE+0x3c)
tsungta 28:2abbf8463fa8 121 #define SHA256_TARGET_HASH_H7 (SHA256_MEM_BASE+0x40)
tsungta 28:2abbf8463fa8 122 #define SHA256_TARGET_HASH_H8 (SHA256_MEM_BASE+0x44)
tsungta 28:2abbf8463fa8 123
tsungta 28:2abbf8463fa8 124 /*======*======*======*======*======*=======*
tsungta 28:2abbf8463fa8 125 * WINC BIGINT HW Engine Register Definition *
tsungta 28:2abbf8463fa8 126 *======*======*======*======*======*========*/
tsungta 28:2abbf8463fa8 127
tsungta 28:2abbf8463fa8 128
tsungta 28:2abbf8463fa8 129 #define BIGINT_ENGINE_ADDR (0x180080ul)
tsungta 28:2abbf8463fa8 130 #define BIGINT_VERSION (BIGINT_ENGINE_ADDR + 0x00)
tsungta 28:2abbf8463fa8 131
tsungta 28:2abbf8463fa8 132 #define BIGINT_MISC_CTRL (BIGINT_ENGINE_ADDR + 0x04)
tsungta 28:2abbf8463fa8 133 #define BIGINT_MISC_CTRL_CTL_START (NBIT0)
tsungta 28:2abbf8463fa8 134 #define BIGINT_MISC_CTRL_CTL_RESET (NBIT1)
tsungta 28:2abbf8463fa8 135 #define BIGINT_MISC_CTRL_CTL_MSW_FIRST (NBIT2)
tsungta 28:2abbf8463fa8 136 #define BIGINT_MISC_CTRL_CTL_SWAP_BYTE_ORDER (NBIT3)
tsungta 28:2abbf8463fa8 137 #define BIGINT_MISC_CTRL_CTL_FORCE_BARRETT (NBIT4)
tsungta 28:2abbf8463fa8 138 #define BIGINT_MISC_CTRL_CTL_M_PRIME_VALID (NBIT5)
tsungta 28:2abbf8463fa8 139
tsungta 28:2abbf8463fa8 140 #define BIGINT_M_PRIME (BIGINT_ENGINE_ADDR + 0x08)
tsungta 28:2abbf8463fa8 141
tsungta 28:2abbf8463fa8 142 #define BIGINT_STATUS (BIGINT_ENGINE_ADDR + 0x0C)
tsungta 28:2abbf8463fa8 143 #define BIGINT_STATUS_STS_DONE (NBIT0)
tsungta 28:2abbf8463fa8 144
tsungta 28:2abbf8463fa8 145 #define BIGINT_CLK_COUNT (BIGINT_ENGINE_ADDR + 0x10)
tsungta 28:2abbf8463fa8 146 #define BIGINT_ADDR_X (BIGINT_ENGINE_ADDR + 0x14)
tsungta 28:2abbf8463fa8 147 #define BIGINT_ADDR_E (BIGINT_ENGINE_ADDR + 0x18)
tsungta 28:2abbf8463fa8 148 #define BIGINT_ADDR_M (BIGINT_ENGINE_ADDR + 0x1C)
tsungta 28:2abbf8463fa8 149 #define BIGINT_ADDR_R (BIGINT_ENGINE_ADDR + 0x20)
tsungta 28:2abbf8463fa8 150 #define BIGINT_LENGTH (BIGINT_ENGINE_ADDR + 0x24)
tsungta 28:2abbf8463fa8 151
tsungta 28:2abbf8463fa8 152 #define BIGINT_IRQ_STS (BIGINT_ENGINE_ADDR + 0x28)
tsungta 28:2abbf8463fa8 153 #define BIGINT_IRQ_STS_DONE (NBIT0)
tsungta 28:2abbf8463fa8 154 #define BIGINT_IRQ_STS_CHOOSE_MONT (NBIT1)
tsungta 28:2abbf8463fa8 155 #define BIGINT_IRQ_STS_M_READ (NBIT2)
tsungta 28:2abbf8463fa8 156 #define BIGINT_IRQ_STS_X_READ (NBIT3)
tsungta 28:2abbf8463fa8 157 #define BIGINT_IRQ_STS_START (NBIT4)
tsungta 28:2abbf8463fa8 158 #define BIGINT_IRQ_STS_PRECOMP_FINISH (NBIT5)
tsungta 28:2abbf8463fa8 159
tsungta 28:2abbf8463fa8 160 #define BIGINT_IRQ_MASK (BIGINT_ENGINE_ADDR + 0x2C)
tsungta 28:2abbf8463fa8 161 #define BIGINT_IRQ_MASK_CTL_IRQ_MASK_START (NBIT4)
tsungta 28:2abbf8463fa8 162
tsungta 28:2abbf8463fa8 163 #define ENABLE_FLIPPING 1
tsungta 28:2abbf8463fa8 164
tsungta 28:2abbf8463fa8 165
tsungta 28:2abbf8463fa8 166
tsungta 28:2abbf8463fa8 167
tsungta 28:2abbf8463fa8 168 #define GET_UINT32(BUF,OFFSET) (((uint32)((BUF)[OFFSET])) | ((uint32)(((BUF)[OFFSET + 1]) << 8)) | \
tsungta 28:2abbf8463fa8 169 ((uint32)(((BUF)[OFFSET + 2]) << 16)) | ((uint32)(((BUF)[OFFSET + 3]) << 24)))
tsungta 28:2abbf8463fa8 170
tsungta 28:2abbf8463fa8 171 #define PUTU32(VAL32,BUF,OFFSET) \
tsungta 28:2abbf8463fa8 172 do \
tsungta 28:2abbf8463fa8 173 { \
tsungta 28:2abbf8463fa8 174 (BUF)[OFFSET ] = BYTE_3((VAL32)); \
tsungta 28:2abbf8463fa8 175 (BUF)[OFFSET +1 ] = BYTE_2((VAL32)); \
tsungta 28:2abbf8463fa8 176 (BUF)[OFFSET +2 ] = BYTE_1((VAL32)); \
tsungta 28:2abbf8463fa8 177 (BUF)[OFFSET +3 ] = BYTE_0((VAL32)); \
tsungta 28:2abbf8463fa8 178 }while(0)
tsungta 28:2abbf8463fa8 179
tsungta 28:2abbf8463fa8 180
tsungta 28:2abbf8463fa8 181 /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
tsungta 28:2abbf8463fa8 182 DATA TYPES
tsungta 28:2abbf8463fa8 183 *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
tsungta 28:2abbf8463fa8 184
tsungta 28:2abbf8463fa8 185 /*!
tsungta 28:2abbf8463fa8 186 @struct \
tsungta 28:2abbf8463fa8 187 tstrHashContext
tsungta 28:2abbf8463fa8 188
tsungta 28:2abbf8463fa8 189 @brief
tsungta 28:2abbf8463fa8 190 */
tsungta 28:2abbf8463fa8 191 typedef struct{
tsungta 28:2abbf8463fa8 192 uint32 au32HashState[M2M_SHA256_DIGEST_LEN/4];
tsungta 28:2abbf8463fa8 193 uint8 au8CurrentBlock[64];
tsungta 28:2abbf8463fa8 194 uint32 u32TotalLength;
tsungta 28:2abbf8463fa8 195 uint8 u8InitHashFlag;
tsungta 28:2abbf8463fa8 196 }tstrSHA256HashCtxt;
tsungta 28:2abbf8463fa8 197
tsungta 28:2abbf8463fa8 198
tsungta 28:2abbf8463fa8 199
tsungta 28:2abbf8463fa8 200 /*======*======*======*======*======*=======*
tsungta 28:2abbf8463fa8 201 * SHA256 IMPLEMENTATION *
tsungta 28:2abbf8463fa8 202 *======*======*======*======*======*========*/
tsungta 28:2abbf8463fa8 203
tsungta 28:2abbf8463fa8 204 sint8 m2m_crypto_sha256_hash_init(tstrM2mSha256Ctxt *pstrSha256Ctxt)
tsungta 28:2abbf8463fa8 205 {
tsungta 28:2abbf8463fa8 206 tstrSHA256HashCtxt *pstrSHA256 = (tstrSHA256HashCtxt*)pstrSha256Ctxt;
tsungta 28:2abbf8463fa8 207 if(pstrSHA256 != NULL)
tsungta 28:2abbf8463fa8 208 {
tsungta 28:2abbf8463fa8 209 m2m_memset((uint8*)pstrSha256Ctxt, 0, sizeof(tstrM2mSha256Ctxt));
tsungta 28:2abbf8463fa8 210 pstrSHA256->u8InitHashFlag = 1;
tsungta 28:2abbf8463fa8 211 }
tsungta 28:2abbf8463fa8 212 return 0;
tsungta 28:2abbf8463fa8 213 }
tsungta 28:2abbf8463fa8 214
tsungta 28:2abbf8463fa8 215 sint8 m2m_crypto_sha256_hash_update(tstrM2mSha256Ctxt *pstrSha256Ctxt, uint8 *pu8Data, uint16 u16DataLength)
tsungta 28:2abbf8463fa8 216 {
tsungta 28:2abbf8463fa8 217 sint8 s8Ret = M2M_ERR_FAIL;
tsungta 28:2abbf8463fa8 218 tstrSHA256HashCtxt *pstrSHA256 = (tstrSHA256HashCtxt*)pstrSha256Ctxt;
tsungta 28:2abbf8463fa8 219 if(pstrSHA256 != NULL)
tsungta 28:2abbf8463fa8 220 {
tsungta 28:2abbf8463fa8 221 uint32 u32ReadAddr;
tsungta 28:2abbf8463fa8 222 uint32 u32WriteAddr = SHARED_MEM_BASE;
tsungta 28:2abbf8463fa8 223 uint32 u32Addr = u32WriteAddr;
tsungta 28:2abbf8463fa8 224 uint32 u32ResidualBytes;
tsungta 28:2abbf8463fa8 225 uint32 u32NBlocks;
tsungta 28:2abbf8463fa8 226 uint32 u32Offset;
tsungta 28:2abbf8463fa8 227 uint32 u32CurrentBlock = 0;
tsungta 28:2abbf8463fa8 228 uint8 u8IsDone = 0;
tsungta 28:2abbf8463fa8 229
tsungta 28:2abbf8463fa8 230 /* Get the remaining bytes from the previous update (if the length is not block aligned). */
tsungta 28:2abbf8463fa8 231 u32ResidualBytes = pstrSHA256->u32TotalLength % SHA_BLOCK_SIZE;
tsungta 28:2abbf8463fa8 232
tsungta 28:2abbf8463fa8 233 /* Update the total data length. */
tsungta 28:2abbf8463fa8 234 pstrSHA256->u32TotalLength += u16DataLength;
tsungta 28:2abbf8463fa8 235
tsungta 28:2abbf8463fa8 236 if(u32ResidualBytes != 0)
tsungta 28:2abbf8463fa8 237 {
tsungta 28:2abbf8463fa8 238 if((u32ResidualBytes + u16DataLength) >= SHA_BLOCK_SIZE)
tsungta 28:2abbf8463fa8 239 {
tsungta 28:2abbf8463fa8 240 u32Offset = SHA_BLOCK_SIZE - u32ResidualBytes;
tsungta 28:2abbf8463fa8 241 m2m_memcpy(&pstrSHA256->au8CurrentBlock[u32ResidualBytes], pu8Data, u32Offset);
tsungta 28:2abbf8463fa8 242 pu8Data += u32Offset;
tsungta 28:2abbf8463fa8 243 u16DataLength -= u32Offset;
tsungta 28:2abbf8463fa8 244
tsungta 28:2abbf8463fa8 245 nm_write_block(u32Addr, pstrSHA256->au8CurrentBlock, SHA_BLOCK_SIZE);
tsungta 28:2abbf8463fa8 246 u32Addr += SHA_BLOCK_SIZE;
tsungta 28:2abbf8463fa8 247 u32CurrentBlock = 1;
tsungta 28:2abbf8463fa8 248 }
tsungta 28:2abbf8463fa8 249 else
tsungta 28:2abbf8463fa8 250 {
tsungta 28:2abbf8463fa8 251 m2m_memcpy(&pstrSHA256->au8CurrentBlock[u32ResidualBytes], pu8Data, u16DataLength);
tsungta 28:2abbf8463fa8 252 u16DataLength = 0;
tsungta 28:2abbf8463fa8 253 }
tsungta 28:2abbf8463fa8 254 }
tsungta 28:2abbf8463fa8 255
tsungta 28:2abbf8463fa8 256 /* Get the number of HASH BLOCKs and the residual bytes. */
tsungta 28:2abbf8463fa8 257 u32NBlocks = u16DataLength / SHA_BLOCK_SIZE;
tsungta 28:2abbf8463fa8 258 u32ResidualBytes = u16DataLength % SHA_BLOCK_SIZE;
tsungta 28:2abbf8463fa8 259
tsungta 28:2abbf8463fa8 260 if(u32NBlocks != 0)
tsungta 28:2abbf8463fa8 261 {
tsungta 28:2abbf8463fa8 262 nm_write_block(u32Addr, pu8Data, (uint16)(u32NBlocks * SHA_BLOCK_SIZE));
tsungta 28:2abbf8463fa8 263 pu8Data += (u32NBlocks * SHA_BLOCK_SIZE);
tsungta 28:2abbf8463fa8 264 }
tsungta 28:2abbf8463fa8 265
tsungta 28:2abbf8463fa8 266 u32NBlocks += u32CurrentBlock;
tsungta 28:2abbf8463fa8 267 if(u32NBlocks != 0)
tsungta 28:2abbf8463fa8 268 {
tsungta 28:2abbf8463fa8 269 uint32 u32RegVal = 0;
tsungta 28:2abbf8463fa8 270
tsungta 28:2abbf8463fa8 271 nm_write_reg(SHA256_CTRL, u32RegVal);
tsungta 28:2abbf8463fa8 272 u32RegVal |= SHA256_CTRL_FORCE_SHA256_QUIT_MASK;
tsungta 28:2abbf8463fa8 273 nm_write_reg(SHA256_CTRL, u32RegVal);
tsungta 28:2abbf8463fa8 274
tsungta 28:2abbf8463fa8 275 if(pstrSHA256->u8InitHashFlag)
tsungta 28:2abbf8463fa8 276 {
tsungta 28:2abbf8463fa8 277 pstrSHA256->u8InitHashFlag = 0;
tsungta 28:2abbf8463fa8 278 u32RegVal |= SHA256_CTRL_INIT_SHA256_STATE_MASK;
tsungta 28:2abbf8463fa8 279 }
tsungta 28:2abbf8463fa8 280
tsungta 28:2abbf8463fa8 281 u32ReadAddr = u32WriteAddr + (u32NBlocks * SHA_BLOCK_SIZE);
tsungta 28:2abbf8463fa8 282 nm_write_reg(SHA256_DATA_LENGTH, (u32NBlocks * SHA_BLOCK_SIZE));
tsungta 28:2abbf8463fa8 283 nm_write_reg(SHA256_START_RD_ADDR, u32WriteAddr);
tsungta 28:2abbf8463fa8 284 nm_write_reg(SHA256_START_WR_ADDR, u32ReadAddr);
tsungta 28:2abbf8463fa8 285
tsungta 28:2abbf8463fa8 286 u32RegVal |= SHA256_CTRL_START_CALC_MASK;
tsungta 28:2abbf8463fa8 287
tsungta 28:2abbf8463fa8 288 u32RegVal &= ~(0x7 << 8);
tsungta 28:2abbf8463fa8 289 u32RegVal |= (2 << 8);
tsungta 28:2abbf8463fa8 290
tsungta 28:2abbf8463fa8 291 nm_write_reg(SHA256_CTRL, u32RegVal);
tsungta 28:2abbf8463fa8 292
tsungta 28:2abbf8463fa8 293 /* 5. Wait for done_intr */
tsungta 28:2abbf8463fa8 294 while(!u8IsDone)
tsungta 28:2abbf8463fa8 295 {
tsungta 28:2abbf8463fa8 296 u32RegVal = nm_read_reg(SHA256_DONE_INTR_STS);
tsungta 28:2abbf8463fa8 297 u8IsDone = u32RegVal & NBIT0;
tsungta 28:2abbf8463fa8 298 }
tsungta 28:2abbf8463fa8 299 }
tsungta 28:2abbf8463fa8 300 if(u32ResidualBytes != 0)
tsungta 28:2abbf8463fa8 301 {
tsungta 28:2abbf8463fa8 302 m2m_memcpy(pstrSHA256->au8CurrentBlock, pu8Data, u32ResidualBytes);
tsungta 28:2abbf8463fa8 303 }
tsungta 28:2abbf8463fa8 304 s8Ret = M2M_SUCCESS;
tsungta 28:2abbf8463fa8 305 }
tsungta 28:2abbf8463fa8 306 return s8Ret;
tsungta 28:2abbf8463fa8 307 }
tsungta 28:2abbf8463fa8 308
tsungta 28:2abbf8463fa8 309
tsungta 28:2abbf8463fa8 310 sint8 m2m_crypto_sha256_hash_finish(tstrM2mSha256Ctxt *pstrSha256Ctxt, uint8 *pu8Sha256Digest)
tsungta 28:2abbf8463fa8 311 {
tsungta 28:2abbf8463fa8 312 sint8 s8Ret = M2M_ERR_FAIL;
tsungta 28:2abbf8463fa8 313 tstrSHA256HashCtxt *pstrSHA256 = (tstrSHA256HashCtxt*)pstrSha256Ctxt;
tsungta 28:2abbf8463fa8 314 if(pstrSHA256 != NULL)
tsungta 28:2abbf8463fa8 315 {
tsungta 28:2abbf8463fa8 316 uint32 u32ReadAddr;
tsungta 28:2abbf8463fa8 317 uint32 u32WriteAddr = SHARED_MEM_BASE;
tsungta 28:2abbf8463fa8 318 uint32 u32Addr = u32WriteAddr;
tsungta 28:2abbf8463fa8 319 uint16 u16Offset;
tsungta 28:2abbf8463fa8 320 uint16 u16PaddingLength;
tsungta 28:2abbf8463fa8 321 uint16 u16NBlocks = 1;
tsungta 28:2abbf8463fa8 322 uint32 u32RegVal = 0;
tsungta 28:2abbf8463fa8 323 uint32 u32Idx,u32ByteIdx;
tsungta 28:2abbf8463fa8 324 uint32 au32Digest[M2M_SHA256_DIGEST_LEN / 4];
tsungta 28:2abbf8463fa8 325 uint8 u8IsDone = 0;
tsungta 28:2abbf8463fa8 326
tsungta 28:2abbf8463fa8 327 nm_write_reg(SHA256_CTRL,u32RegVal);
tsungta 28:2abbf8463fa8 328 u32RegVal |= SHA256_CTRL_FORCE_SHA256_QUIT_MASK;
tsungta 28:2abbf8463fa8 329 nm_write_reg(SHA256_CTRL,u32RegVal);
tsungta 28:2abbf8463fa8 330
tsungta 28:2abbf8463fa8 331 if(pstrSHA256->u8InitHashFlag)
tsungta 28:2abbf8463fa8 332 {
tsungta 28:2abbf8463fa8 333 pstrSHA256->u8InitHashFlag = 0;
tsungta 28:2abbf8463fa8 334 u32RegVal |= SHA256_CTRL_INIT_SHA256_STATE_MASK;
tsungta 28:2abbf8463fa8 335 }
tsungta 28:2abbf8463fa8 336
tsungta 28:2abbf8463fa8 337 /* Calculate the offset of the last data byte in the current block. */
tsungta 28:2abbf8463fa8 338 u16Offset = (uint16)(pstrSHA256->u32TotalLength % SHA_BLOCK_SIZE);
tsungta 28:2abbf8463fa8 339
tsungta 28:2abbf8463fa8 340 /* Add the padding byte 0x80. */
tsungta 28:2abbf8463fa8 341 pstrSHA256->au8CurrentBlock[u16Offset ++] = 0x80;
tsungta 28:2abbf8463fa8 342
tsungta 28:2abbf8463fa8 343 /* Calculate the required padding to complete
tsungta 28:2abbf8463fa8 344 one Hash Block Size.
tsungta 28:2abbf8463fa8 345 */
tsungta 28:2abbf8463fa8 346 u16PaddingLength = SHA_BLOCK_SIZE - u16Offset;
tsungta 28:2abbf8463fa8 347 m2m_memset(&pstrSHA256->au8CurrentBlock[u16Offset], 0, u16PaddingLength);
tsungta 28:2abbf8463fa8 348
tsungta 28:2abbf8463fa8 349 /* If the padding count is not enough to hold 64-bit representation of
tsungta 28:2abbf8463fa8 350 the total input message length, one padding block is required.
tsungta 28:2abbf8463fa8 351 */
tsungta 28:2abbf8463fa8 352 if(u16PaddingLength < 8)
tsungta 28:2abbf8463fa8 353 {
tsungta 28:2abbf8463fa8 354 nm_write_block(u32Addr, pstrSHA256->au8CurrentBlock, SHA_BLOCK_SIZE);
tsungta 28:2abbf8463fa8 355 u32Addr += SHA_BLOCK_SIZE;
tsungta 28:2abbf8463fa8 356 m2m_memset(pstrSHA256->au8CurrentBlock, 0, SHA_BLOCK_SIZE);
tsungta 28:2abbf8463fa8 357 u16NBlocks ++;
tsungta 28:2abbf8463fa8 358 }
tsungta 28:2abbf8463fa8 359
tsungta 28:2abbf8463fa8 360 /* pack the length at the end of the padding block */
tsungta 28:2abbf8463fa8 361 PUTU32(pstrSHA256->u32TotalLength << 3, pstrSHA256->au8CurrentBlock, (SHA_BLOCK_SIZE - 4));
tsungta 28:2abbf8463fa8 362
tsungta 28:2abbf8463fa8 363 u32ReadAddr = u32WriteAddr + (u16NBlocks * SHA_BLOCK_SIZE);
tsungta 28:2abbf8463fa8 364 nm_write_block(u32Addr, pstrSHA256->au8CurrentBlock, SHA_BLOCK_SIZE);
tsungta 28:2abbf8463fa8 365 nm_write_reg(SHA256_DATA_LENGTH, (u16NBlocks * SHA_BLOCK_SIZE));
tsungta 28:2abbf8463fa8 366 nm_write_reg(SHA256_START_RD_ADDR, u32WriteAddr);
tsungta 28:2abbf8463fa8 367 nm_write_reg(SHA256_START_WR_ADDR, u32ReadAddr);
tsungta 28:2abbf8463fa8 368
tsungta 28:2abbf8463fa8 369 u32RegVal |= SHA256_CTRL_START_CALC_MASK;
tsungta 28:2abbf8463fa8 370 u32RegVal |= SHA256_CTRL_WR_BACK_HASH_VALUE_MASK;
tsungta 28:2abbf8463fa8 371 u32RegVal &= ~(0x7UL << 8);
tsungta 28:2abbf8463fa8 372 u32RegVal |= (0x2UL << 8);
tsungta 28:2abbf8463fa8 373
tsungta 28:2abbf8463fa8 374 nm_write_reg(SHA256_CTRL,u32RegVal);
tsungta 28:2abbf8463fa8 375
tsungta 28:2abbf8463fa8 376
tsungta 28:2abbf8463fa8 377 /* 5. Wait for done_intr */
tsungta 28:2abbf8463fa8 378 while(!u8IsDone)
tsungta 28:2abbf8463fa8 379 {
tsungta 28:2abbf8463fa8 380 u32RegVal = nm_read_reg(SHA256_DONE_INTR_STS);
tsungta 28:2abbf8463fa8 381 u8IsDone = u32RegVal & NBIT0;
tsungta 28:2abbf8463fa8 382 }
tsungta 28:2abbf8463fa8 383 nm_read_block(u32ReadAddr, (uint8*)au32Digest, 32);
tsungta 28:2abbf8463fa8 384
tsungta 28:2abbf8463fa8 385 /* Convert the output words to an array of bytes.
tsungta 28:2abbf8463fa8 386 */
tsungta 28:2abbf8463fa8 387 u32ByteIdx = 0;
tsungta 28:2abbf8463fa8 388 for(u32Idx = 0; u32Idx < (M2M_SHA256_DIGEST_LEN / 4); u32Idx ++)
tsungta 28:2abbf8463fa8 389 {
tsungta 28:2abbf8463fa8 390 pu8Sha256Digest[u32ByteIdx ++] = BYTE_3(au32Digest[u32Idx]);
tsungta 28:2abbf8463fa8 391 pu8Sha256Digest[u32ByteIdx ++] = BYTE_2(au32Digest[u32Idx]);
tsungta 28:2abbf8463fa8 392 pu8Sha256Digest[u32ByteIdx ++] = BYTE_1(au32Digest[u32Idx]);
tsungta 28:2abbf8463fa8 393 pu8Sha256Digest[u32ByteIdx ++] = BYTE_0(au32Digest[u32Idx]);
tsungta 28:2abbf8463fa8 394 }
tsungta 28:2abbf8463fa8 395 s8Ret = M2M_SUCCESS;
tsungta 28:2abbf8463fa8 396 }
tsungta 28:2abbf8463fa8 397 return s8Ret;
tsungta 28:2abbf8463fa8 398 }
tsungta 28:2abbf8463fa8 399
tsungta 28:2abbf8463fa8 400
tsungta 28:2abbf8463fa8 401 /*======*======*======*======*======*=======*
tsungta 28:2abbf8463fa8 402 * RSA IMPLEMENTATION *
tsungta 28:2abbf8463fa8 403 *======*======*======*======*======*========*/
tsungta 28:2abbf8463fa8 404
tsungta 28:2abbf8463fa8 405 static void FlipBuffer(uint8 *pu8InBuffer, uint8 *pu8OutBuffer, uint16 u16BufferSize)
tsungta 28:2abbf8463fa8 406 {
tsungta 28:2abbf8463fa8 407 uint16 u16Idx;
tsungta 28:2abbf8463fa8 408 for(u16Idx = 0; u16Idx < u16BufferSize; u16Idx ++)
tsungta 28:2abbf8463fa8 409 {
tsungta 28:2abbf8463fa8 410 #if ENABLE_FLIPPING == 1
tsungta 28:2abbf8463fa8 411 pu8OutBuffer[u16Idx] = pu8InBuffer[u16BufferSize - u16Idx - 1];
tsungta 28:2abbf8463fa8 412 #else
tsungta 28:2abbf8463fa8 413 pu8OutBuffer[u16Idx] = pu8InBuffer[u16Idx];
tsungta 28:2abbf8463fa8 414 #endif
tsungta 28:2abbf8463fa8 415 }
tsungta 28:2abbf8463fa8 416 }
tsungta 28:2abbf8463fa8 417
tsungta 28:2abbf8463fa8 418 void BigInt_ModExp
tsungta 28:2abbf8463fa8 419 (
tsungta 28:2abbf8463fa8 420 uint8 *pu8X, uint16 u16XSize,
tsungta 28:2abbf8463fa8 421 uint8 *pu8E, uint16 u16ESize,
tsungta 28:2abbf8463fa8 422 uint8 *pu8M, uint16 u16MSize,
tsungta 28:2abbf8463fa8 423 uint8 *pu8R, uint16 u16RSize
tsungta 28:2abbf8463fa8 424 )
tsungta 28:2abbf8463fa8 425 {
tsungta 28:2abbf8463fa8 426 uint32 u32Reg;
tsungta 28:2abbf8463fa8 427 uint8 au8Tmp[780] = {0};
tsungta 28:2abbf8463fa8 428 uint32 u32XAddr = SHARED_MEM_BASE;
tsungta 28:2abbf8463fa8 429 uint32 u32MAddr;
tsungta 28:2abbf8463fa8 430 uint32 u32EAddr;
tsungta 28:2abbf8463fa8 431 uint32 u32RAddr;
tsungta 28:2abbf8463fa8 432 uint8 u8EMswBits = 32;
tsungta 28:2abbf8463fa8 433 uint32 u32Mprime = 0x7F;
tsungta 28:2abbf8463fa8 434 uint16 u16XSizeWords,u16ESizeWords;
tsungta 28:2abbf8463fa8 435 uint32 u32Exponent;
tsungta 28:2abbf8463fa8 436
tsungta 28:2abbf8463fa8 437 u16XSizeWords = (u16XSize + 3) / 4;
tsungta 28:2abbf8463fa8 438 u16ESizeWords = (u16ESize + 3) / 4;
tsungta 28:2abbf8463fa8 439
tsungta 28:2abbf8463fa8 440 u32MAddr = u32XAddr + (u16XSizeWords * 4);
tsungta 28:2abbf8463fa8 441 u32EAddr = u32MAddr + (u16XSizeWords * 4);
tsungta 28:2abbf8463fa8 442 u32RAddr = u32EAddr + (u16ESizeWords * 4);
tsungta 28:2abbf8463fa8 443
tsungta 28:2abbf8463fa8 444 /* Reset the core.
tsungta 28:2abbf8463fa8 445 */
tsungta 28:2abbf8463fa8 446 u32Reg = 0;
tsungta 28:2abbf8463fa8 447 u32Reg |= BIGINT_MISC_CTRL_CTL_RESET;
tsungta 28:2abbf8463fa8 448 u32Reg = nm_read_reg(BIGINT_MISC_CTRL);
tsungta 28:2abbf8463fa8 449 u32Reg &= ~BIGINT_MISC_CTRL_CTL_RESET;
tsungta 28:2abbf8463fa8 450 u32Reg = nm_read_reg(BIGINT_MISC_CTRL);
tsungta 28:2abbf8463fa8 451
tsungta 28:2abbf8463fa8 452 nm_write_block(u32RAddr,au8Tmp, u16RSize);
tsungta 28:2abbf8463fa8 453
tsungta 28:2abbf8463fa8 454 /* Write Input Operands to Chip Memory.
tsungta 28:2abbf8463fa8 455 */
tsungta 28:2abbf8463fa8 456 /*------- X -------*/
tsungta 28:2abbf8463fa8 457 FlipBuffer(pu8X,au8Tmp,u16XSize);
tsungta 28:2abbf8463fa8 458 nm_write_block(u32XAddr,au8Tmp,u16XSizeWords * 4);
tsungta 28:2abbf8463fa8 459
tsungta 28:2abbf8463fa8 460 /*------- E -------*/
tsungta 28:2abbf8463fa8 461 m2m_memset(au8Tmp, 0, sizeof(au8Tmp));
tsungta 28:2abbf8463fa8 462 FlipBuffer(pu8E, au8Tmp, u16ESize);
tsungta 28:2abbf8463fa8 463 nm_write_block(u32EAddr, au8Tmp, u16ESizeWords * 4);
tsungta 28:2abbf8463fa8 464 u32Exponent = GET_UINT32(au8Tmp, (u16ESizeWords * 4) - 4);
tsungta 28:2abbf8463fa8 465 while((u32Exponent & NBIT31)== 0)
tsungta 28:2abbf8463fa8 466 {
tsungta 28:2abbf8463fa8 467 u32Exponent <<= 1;
tsungta 28:2abbf8463fa8 468 u8EMswBits --;
tsungta 28:2abbf8463fa8 469 }
tsungta 28:2abbf8463fa8 470
tsungta 28:2abbf8463fa8 471 /*------- M -------*/
tsungta 28:2abbf8463fa8 472 m2m_memset(au8Tmp, 0, sizeof(au8Tmp));
tsungta 28:2abbf8463fa8 473 FlipBuffer(pu8M, au8Tmp, u16XSize);
tsungta 28:2abbf8463fa8 474 nm_write_block(u32MAddr, au8Tmp, u16XSizeWords * 4);
tsungta 28:2abbf8463fa8 475
tsungta 28:2abbf8463fa8 476 /* Program the addresses of the input operands.
tsungta 28:2abbf8463fa8 477 */
tsungta 28:2abbf8463fa8 478 nm_write_reg(BIGINT_ADDR_X, u32XAddr);
tsungta 28:2abbf8463fa8 479 nm_write_reg(BIGINT_ADDR_E, u32EAddr);
tsungta 28:2abbf8463fa8 480 nm_write_reg(BIGINT_ADDR_M, u32MAddr);
tsungta 28:2abbf8463fa8 481 nm_write_reg(BIGINT_ADDR_R, u32RAddr);
tsungta 28:2abbf8463fa8 482
tsungta 28:2abbf8463fa8 483 /* Mprime.
tsungta 28:2abbf8463fa8 484 */
tsungta 28:2abbf8463fa8 485 nm_write_reg(BIGINT_M_PRIME,u32Mprime);
tsungta 28:2abbf8463fa8 486
tsungta 28:2abbf8463fa8 487 /* Length.
tsungta 28:2abbf8463fa8 488 */
tsungta 28:2abbf8463fa8 489 u32Reg = (u16XSizeWords & 0xFF);
tsungta 28:2abbf8463fa8 490 u32Reg += ((u16ESizeWords & 0xFF) << 8);
tsungta 28:2abbf8463fa8 491 u32Reg += (u8EMswBits << 16);
tsungta 28:2abbf8463fa8 492 nm_write_reg(BIGINT_LENGTH,u32Reg);
tsungta 28:2abbf8463fa8 493
tsungta 28:2abbf8463fa8 494 /* CTRL Register.
tsungta 28:2abbf8463fa8 495 */
tsungta 28:2abbf8463fa8 496 u32Reg = nm_read_reg(BIGINT_MISC_CTRL);
tsungta 28:2abbf8463fa8 497 u32Reg ^= BIGINT_MISC_CTRL_CTL_START;
tsungta 28:2abbf8463fa8 498 u32Reg |= BIGINT_MISC_CTRL_CTL_FORCE_BARRETT;
tsungta 28:2abbf8463fa8 499 //u32Reg |= BIGINT_MISC_CTRL_CTL_M_PRIME_VALID;
tsungta 28:2abbf8463fa8 500 #if ENABLE_FLIPPING == 0
tsungta 28:2abbf8463fa8 501 u32Reg |= BIGINT_MISC_CTRL_CTL_MSW_FIRST;
tsungta 28:2abbf8463fa8 502 #endif
tsungta 28:2abbf8463fa8 503 nm_write_reg(BIGINT_MISC_CTRL,u32Reg);
tsungta 28:2abbf8463fa8 504
tsungta 28:2abbf8463fa8 505 /* Wait for computation to complete. */
tsungta 28:2abbf8463fa8 506 while(1)
tsungta 28:2abbf8463fa8 507 {
tsungta 28:2abbf8463fa8 508 u32Reg = nm_read_reg(BIGINT_IRQ_STS);
tsungta 28:2abbf8463fa8 509 if(u32Reg & BIGINT_IRQ_STS_DONE)
tsungta 28:2abbf8463fa8 510 {
tsungta 28:2abbf8463fa8 511 break;
tsungta 28:2abbf8463fa8 512 }
tsungta 28:2abbf8463fa8 513 }
tsungta 28:2abbf8463fa8 514 nm_write_reg(BIGINT_IRQ_STS,0);
tsungta 28:2abbf8463fa8 515 m2m_memset(au8Tmp, 0, sizeof(au8Tmp));
tsungta 28:2abbf8463fa8 516 nm_read_block(u32RAddr, au8Tmp, u16RSize);
tsungta 28:2abbf8463fa8 517 FlipBuffer(au8Tmp, pu8R, u16RSize);
tsungta 28:2abbf8463fa8 518 }
tsungta 28:2abbf8463fa8 519
tsungta 28:2abbf8463fa8 520
tsungta 28:2abbf8463fa8 521
tsungta 28:2abbf8463fa8 522 #define MD5_DIGEST_SIZE (16)
tsungta 28:2abbf8463fa8 523 #define SHA1_DIGEST_SIZE (20)
tsungta 28:2abbf8463fa8 524
tsungta 28:2abbf8463fa8 525 static const uint8 au8TEncodingMD5[] =
tsungta 28:2abbf8463fa8 526 {
tsungta 28:2abbf8463fa8 527 0x30, 0x20, 0x30, 0x0C, 0x06, 0x08, 0x2A, 0x86,
tsungta 28:2abbf8463fa8 528 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x05, 0x05, 0x00,
tsungta 28:2abbf8463fa8 529 0x04
tsungta 28:2abbf8463fa8 530 };
tsungta 28:2abbf8463fa8 531 /*!< Fixed part of the Encoding T for the MD5 hash algorithm.
tsungta 28:2abbf8463fa8 532 */
tsungta 28:2abbf8463fa8 533
tsungta 28:2abbf8463fa8 534
tsungta 28:2abbf8463fa8 535 static const uint8 au8TEncodingSHA1[] =
tsungta 28:2abbf8463fa8 536 {
tsungta 28:2abbf8463fa8 537 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E,
tsungta 28:2abbf8463fa8 538 0x03, 0x02, 0x1A, 0x05, 0x00, 0x04
tsungta 28:2abbf8463fa8 539 };
tsungta 28:2abbf8463fa8 540 /*!< Fixed part of the Encoding T for the SHA-1 hash algorithm.
tsungta 28:2abbf8463fa8 541 */
tsungta 28:2abbf8463fa8 542
tsungta 28:2abbf8463fa8 543
tsungta 28:2abbf8463fa8 544 static const uint8 au8TEncodingSHA2[] =
tsungta 28:2abbf8463fa8 545 {
tsungta 28:2abbf8463fa8 546 0x30, 0x31, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86,
tsungta 28:2abbf8463fa8 547 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05,
tsungta 28:2abbf8463fa8 548 0x00, 0x04
tsungta 28:2abbf8463fa8 549 };
tsungta 28:2abbf8463fa8 550 /*!< Fixed part of the Encoding T for the SHA-2 hash algorithm.
tsungta 28:2abbf8463fa8 551 */
tsungta 28:2abbf8463fa8 552
tsungta 28:2abbf8463fa8 553
tsungta 28:2abbf8463fa8 554 sint8 m2m_crypto_rsa_sign_verify(uint8 *pu8N, uint16 u16NSize, uint8 *pu8E, uint16 u16ESize, uint8 *pu8SignedMsgHash,
tsungta 28:2abbf8463fa8 555 uint16 u16HashLength, uint8 *pu8RsaSignature)
tsungta 28:2abbf8463fa8 556 {
tsungta 28:2abbf8463fa8 557 sint8 s8Ret = M2M_RSA_SIGN_FAIL;
tsungta 28:2abbf8463fa8 558
tsungta 28:2abbf8463fa8 559 if((pu8N != NULL) && (pu8E != NULL) && (pu8RsaSignature != NULL) && (pu8SignedMsgHash != NULL))
tsungta 28:2abbf8463fa8 560 {
tsungta 28:2abbf8463fa8 561 uint16 u16TLength, u16TEncodingLength;
tsungta 28:2abbf8463fa8 562 uint8 *pu8T;
tsungta 28:2abbf8463fa8 563 uint8 au8EM[512];
tsungta 28:2abbf8463fa8 564
tsungta 28:2abbf8463fa8 565 /* Selection of correct T Encoding based on the hash size.
tsungta 28:2abbf8463fa8 566 */
tsungta 28:2abbf8463fa8 567 if(u16HashLength == MD5_DIGEST_SIZE)
tsungta 28:2abbf8463fa8 568 {
tsungta 28:2abbf8463fa8 569 pu8T = (uint8*)au8TEncodingMD5;
tsungta 28:2abbf8463fa8 570 u16TEncodingLength = sizeof(au8TEncodingMD5);
tsungta 28:2abbf8463fa8 571 }
tsungta 28:2abbf8463fa8 572 else if(u16HashLength == SHA1_DIGEST_SIZE)
tsungta 28:2abbf8463fa8 573 {
tsungta 28:2abbf8463fa8 574 pu8T = (uint8*)au8TEncodingSHA1;
tsungta 28:2abbf8463fa8 575 u16TEncodingLength = sizeof(au8TEncodingSHA1);
tsungta 28:2abbf8463fa8 576 }
tsungta 28:2abbf8463fa8 577 else
tsungta 28:2abbf8463fa8 578 {
tsungta 28:2abbf8463fa8 579 pu8T = (uint8*)au8TEncodingSHA2;
tsungta 28:2abbf8463fa8 580 u16TEncodingLength = sizeof(au8TEncodingSHA2);
tsungta 28:2abbf8463fa8 581 }
tsungta 28:2abbf8463fa8 582 u16TLength = u16TEncodingLength + 1 + u16HashLength;
tsungta 28:2abbf8463fa8 583
tsungta 28:2abbf8463fa8 584 /* If emLen < tLen + 11.
tsungta 28:2abbf8463fa8 585 */
tsungta 28:2abbf8463fa8 586 if(u16NSize >= (u16TLength + 11))
tsungta 28:2abbf8463fa8 587 {
tsungta 28:2abbf8463fa8 588 uint32 u32PSLength,u32Idx = 0;
tsungta 28:2abbf8463fa8 589
tsungta 28:2abbf8463fa8 590 /*
tsungta 28:2abbf8463fa8 591 RSA verification
tsungta 28:2abbf8463fa8 592 */
tsungta 28:2abbf8463fa8 593 BigInt_ModExp(pu8RsaSignature, u16NSize, pu8E, u16ESize, pu8N, u16NSize, au8EM, u16NSize);
tsungta 28:2abbf8463fa8 594
tsungta 28:2abbf8463fa8 595 u32PSLength = u16NSize - u16TLength - 3;
tsungta 28:2abbf8463fa8 596
tsungta 28:2abbf8463fa8 597 /*
tsungta 28:2abbf8463fa8 598 The calculated EM must match the following pattern.
tsungta 28:2abbf8463fa8 599 *======*======*======*======*======*
tsungta 28:2abbf8463fa8 600 * 0x00 || 0x01 || PS || 0x00 || T *
tsungta 28:2abbf8463fa8 601 *======*======*======*======*======*
tsungta 28:2abbf8463fa8 602 Where PS is all 0xFF
tsungta 28:2abbf8463fa8 603 T is defined based on the hash algorithm.
tsungta 28:2abbf8463fa8 604 */
tsungta 28:2abbf8463fa8 605 if((au8EM[0] == 0x00) && (au8EM[1] == 0x01))
tsungta 28:2abbf8463fa8 606 {
tsungta 28:2abbf8463fa8 607 for(u32Idx = 2; au8EM[u32Idx] == 0xFF; u32Idx ++);
tsungta 28:2abbf8463fa8 608 if(u32Idx == (u32PSLength + 2))
tsungta 28:2abbf8463fa8 609 {
tsungta 28:2abbf8463fa8 610 if(au8EM[u32Idx ++] == 0x00)
tsungta 28:2abbf8463fa8 611 {
tsungta 28:2abbf8463fa8 612 if(!m2m_memcmp(&au8EM[u32Idx], pu8T, u16TEncodingLength))
tsungta 28:2abbf8463fa8 613 {
tsungta 28:2abbf8463fa8 614 u32Idx += u16TEncodingLength;
tsungta 28:2abbf8463fa8 615 if(au8EM[u32Idx ++] == u16HashLength)
tsungta 28:2abbf8463fa8 616 s8Ret = m2m_memcmp(&au8EM[u32Idx], pu8SignedMsgHash, u16HashLength);
tsungta 28:2abbf8463fa8 617 }
tsungta 28:2abbf8463fa8 618 }
tsungta 28:2abbf8463fa8 619 }
tsungta 28:2abbf8463fa8 620 }
tsungta 28:2abbf8463fa8 621 }
tsungta 28:2abbf8463fa8 622 }
tsungta 28:2abbf8463fa8 623 return s8Ret;
tsungta 28:2abbf8463fa8 624 }
tsungta 28:2abbf8463fa8 625
tsungta 28:2abbf8463fa8 626
tsungta 28:2abbf8463fa8 627 sint8 m2m_crypto_rsa_sign_gen(uint8 *pu8N, uint16 u16NSize, uint8 *pu8d, uint16 u16dSize, uint8 *pu8SignedMsgHash,
tsungta 28:2abbf8463fa8 628 uint16 u16HashLength, uint8 *pu8RsaSignature)
tsungta 28:2abbf8463fa8 629 {
tsungta 28:2abbf8463fa8 630 sint8 s8Ret = M2M_RSA_SIGN_FAIL;
tsungta 28:2abbf8463fa8 631
tsungta 28:2abbf8463fa8 632 if((pu8N != NULL) && (pu8d != NULL) && (pu8RsaSignature != NULL) && (pu8SignedMsgHash != NULL))
tsungta 28:2abbf8463fa8 633 {
tsungta 28:2abbf8463fa8 634 uint16 u16TLength, u16TEncodingLength;
tsungta 28:2abbf8463fa8 635 uint8 *pu8T;
tsungta 28:2abbf8463fa8 636 uint8 au8EM[512];
tsungta 28:2abbf8463fa8 637
tsungta 28:2abbf8463fa8 638 /* Selection of correct T Encoding based on the hash size.
tsungta 28:2abbf8463fa8 639 */
tsungta 28:2abbf8463fa8 640 if(u16HashLength == MD5_DIGEST_SIZE)
tsungta 28:2abbf8463fa8 641 {
tsungta 28:2abbf8463fa8 642 pu8T = (uint8*)au8TEncodingMD5;
tsungta 28:2abbf8463fa8 643 u16TEncodingLength = sizeof(au8TEncodingMD5);
tsungta 28:2abbf8463fa8 644 }
tsungta 28:2abbf8463fa8 645 else if(u16HashLength == SHA1_DIGEST_SIZE)
tsungta 28:2abbf8463fa8 646 {
tsungta 28:2abbf8463fa8 647 pu8T = (uint8*)au8TEncodingSHA1;
tsungta 28:2abbf8463fa8 648 u16TEncodingLength = sizeof(au8TEncodingSHA1);
tsungta 28:2abbf8463fa8 649 }
tsungta 28:2abbf8463fa8 650 else
tsungta 28:2abbf8463fa8 651 {
tsungta 28:2abbf8463fa8 652 pu8T = (uint8*)au8TEncodingSHA2;
tsungta 28:2abbf8463fa8 653 u16TEncodingLength = sizeof(au8TEncodingSHA2);
tsungta 28:2abbf8463fa8 654 }
tsungta 28:2abbf8463fa8 655 u16TLength = u16TEncodingLength + 1 + u16HashLength;
tsungta 28:2abbf8463fa8 656
tsungta 28:2abbf8463fa8 657 /* If emLen < tLen + 11.
tsungta 28:2abbf8463fa8 658 */
tsungta 28:2abbf8463fa8 659 if(u16NSize >= (u16TLength + 11))
tsungta 28:2abbf8463fa8 660 {
tsungta 28:2abbf8463fa8 661 uint16 u16PSLength = 0;
tsungta 28:2abbf8463fa8 662 uint16 u16Offset = 0;
tsungta 28:2abbf8463fa8 663
tsungta 28:2abbf8463fa8 664 /*
tsungta 28:2abbf8463fa8 665 The calculated EM must match the following pattern.
tsungta 28:2abbf8463fa8 666 *======*======*======*======*======*
tsungta 28:2abbf8463fa8 667 * 0x00 || 0x01 || PS || 0x00 || T *
tsungta 28:2abbf8463fa8 668 *======*======*======*======*======*
tsungta 28:2abbf8463fa8 669 Where PS is all 0xFF
tsungta 28:2abbf8463fa8 670 T is defined based on the hash algorithm.
tsungta 28:2abbf8463fa8 671 */
tsungta 28:2abbf8463fa8 672 au8EM[u16Offset ++] = 0;
tsungta 28:2abbf8463fa8 673 au8EM[u16Offset ++] = 1;
tsungta 28:2abbf8463fa8 674 u16PSLength = u16NSize - u16TLength - 3;
tsungta 28:2abbf8463fa8 675 m2m_memset(&au8EM[u16Offset], 0xFF, u16PSLength);
tsungta 28:2abbf8463fa8 676 u16Offset += u16PSLength;
tsungta 28:2abbf8463fa8 677 au8EM[u16Offset ++] = 0;
tsungta 28:2abbf8463fa8 678 m2m_memcpy(&au8EM[u16Offset], pu8T, u16TEncodingLength);
tsungta 28:2abbf8463fa8 679 u16Offset += u16TEncodingLength;
tsungta 28:2abbf8463fa8 680 au8EM[u16Offset ++] = u16HashLength;
tsungta 28:2abbf8463fa8 681 m2m_memcpy(&au8EM[u16Offset], pu8SignedMsgHash, u16HashLength);
tsungta 28:2abbf8463fa8 682
tsungta 28:2abbf8463fa8 683 /*
tsungta 28:2abbf8463fa8 684 RSA Signature Generation
tsungta 28:2abbf8463fa8 685 */
tsungta 28:2abbf8463fa8 686 BigInt_ModExp(au8EM, u16NSize, pu8d, u16dSize, pu8N, u16NSize, pu8RsaSignature, u16NSize);
tsungta 28:2abbf8463fa8 687 s8Ret = M2M_RSA_SIGN_OK;
tsungta 28:2abbf8463fa8 688 }
tsungta 28:2abbf8463fa8 689 }
tsungta 28:2abbf8463fa8 690 return s8Ret;
tsungta 28:2abbf8463fa8 691 }
tsungta 28:2abbf8463fa8 692
tsungta 28:2abbf8463fa8 693 #endif /* CONF_CRYPTO */
tsungta 28:2abbf8463fa8 694
tsungta 28:2abbf8463fa8 695 #ifdef CONF_CRYPTO_SOFT
tsungta 28:2abbf8463fa8 696
tsungta 28:2abbf8463fa8 697 typedef struct {
tsungta 28:2abbf8463fa8 698 tpfAppCryproCb pfAppCryptoCb;
tsungta 28:2abbf8463fa8 699 uint8 * pu8Digest;
tsungta 28:2abbf8463fa8 700 uint8 * pu8Rsa;
tsungta 28:2abbf8463fa8 701 uint8 u8CryptoBusy;
tsungta 28:2abbf8463fa8 702 }tstrCryptoCtxt;
tsungta 28:2abbf8463fa8 703
tsungta 28:2abbf8463fa8 704 typedef struct {
tsungta 28:2abbf8463fa8 705 uint8 au8N[M2M_MAX_RSA_LEN];
tsungta 28:2abbf8463fa8 706 uint8 au8E[M2M_MAX_RSA_LEN];
tsungta 28:2abbf8463fa8 707 uint8 au8Hash[M2M_SHA256_DIGEST_LEN];
tsungta 28:2abbf8463fa8 708 uint16 u16Nsz;
tsungta 28:2abbf8463fa8 709 uint16 u16Esz;
tsungta 28:2abbf8463fa8 710 uint16 u16Hsz;
tsungta 28:2abbf8463fa8 711 uint8 _pad16_[2];
tsungta 28:2abbf8463fa8 712 }tstrRsaPayload;
tsungta 28:2abbf8463fa8 713
tsungta 28:2abbf8463fa8 714 static tstrCryptoCtxt gstrCryptoCtxt;
tsungta 28:2abbf8463fa8 715
tsungta 28:2abbf8463fa8 716
tsungta 28:2abbf8463fa8 717 /**
tsungta 28:2abbf8463fa8 718 * @fn m2m_crypto_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr)
tsungta 28:2abbf8463fa8 719 * @brief WiFi call back function
tsungta 28:2abbf8463fa8 720 * @param [in] u8OpCode
tsungta 28:2abbf8463fa8 721 * HIF Opcode type.
tsungta 28:2abbf8463fa8 722 * @param [in] u16DataSize
tsungta 28:2abbf8463fa8 723 * HIF data length.
tsungta 28:2abbf8463fa8 724 * @param [in] u32Addr
tsungta 28:2abbf8463fa8 725 * HIF address.
tsungta 28:2abbf8463fa8 726 * @author
tsungta 28:2abbf8463fa8 727 * @date
tsungta 28:2abbf8463fa8 728 * @version 1.0
tsungta 28:2abbf8463fa8 729 */
tsungta 28:2abbf8463fa8 730 static void m2m_crypto_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr)
tsungta 28:2abbf8463fa8 731 {
tsungta 28:2abbf8463fa8 732 sint8 ret = M2M_SUCCESS;
tsungta 28:2abbf8463fa8 733 gstrCryptoCtxt.u8CryptoBusy = 0;
tsungta 28:2abbf8463fa8 734 if(u8OpCode == M2M_CRYPTO_RESP_SHA256_INIT)
tsungta 28:2abbf8463fa8 735 {
tsungta 28:2abbf8463fa8 736 tstrM2mSha256Ctxt strCtxt;
tsungta 28:2abbf8463fa8 737 if (hif_receive(u32Addr, (uint8*) &strCtxt,sizeof(tstrM2mSha256Ctxt), 0) == M2M_SUCCESS)
tsungta 28:2abbf8463fa8 738 {
tsungta 28:2abbf8463fa8 739 tstrCyptoResp strResp;
tsungta 28:2abbf8463fa8 740 if(hif_receive(u32Addr + sizeof(tstrM2mSha256Ctxt), (uint8*) &strResp,sizeof(tstrCyptoResp), 1) == M2M_SUCCESS)
tsungta 28:2abbf8463fa8 741 {
tsungta 28:2abbf8463fa8 742 if (gstrCryptoCtxt.pfAppCryptoCb)
tsungta 28:2abbf8463fa8 743 gstrCryptoCtxt.pfAppCryptoCb(u8OpCode,&strResp,&strCtxt);
tsungta 28:2abbf8463fa8 744 }
tsungta 28:2abbf8463fa8 745 }
tsungta 28:2abbf8463fa8 746 }
tsungta 28:2abbf8463fa8 747 else if(u8OpCode == M2M_CRYPTO_RESP_SHA256_UPDATE)
tsungta 28:2abbf8463fa8 748 {
tsungta 28:2abbf8463fa8 749 tstrM2mSha256Ctxt strCtxt;
tsungta 28:2abbf8463fa8 750 if (hif_receive(u32Addr, (uint8*) &strCtxt,sizeof(tstrM2mSha256Ctxt), 0) == M2M_SUCCESS)
tsungta 28:2abbf8463fa8 751 {
tsungta 28:2abbf8463fa8 752 tstrCyptoResp strResp;
tsungta 28:2abbf8463fa8 753 if (hif_receive(u32Addr + sizeof(tstrM2mSha256Ctxt), (uint8*) &strResp,sizeof(tstrCyptoResp), 1) == M2M_SUCCESS)
tsungta 28:2abbf8463fa8 754 {
tsungta 28:2abbf8463fa8 755 if (gstrCryptoCtxt.pfAppCryptoCb)
tsungta 28:2abbf8463fa8 756 gstrCryptoCtxt.pfAppCryptoCb(u8OpCode,&strResp,&strCtxt);
tsungta 28:2abbf8463fa8 757 }
tsungta 28:2abbf8463fa8 758 }
tsungta 28:2abbf8463fa8 759
tsungta 28:2abbf8463fa8 760 }
tsungta 28:2abbf8463fa8 761 else if(u8OpCode == M2M_CRYPTO_RESP_SHA256_FINSIH)
tsungta 28:2abbf8463fa8 762 {
tsungta 28:2abbf8463fa8 763 tstrCyptoResp strResp;
tsungta 28:2abbf8463fa8 764 if (hif_receive(u32Addr + sizeof(tstrM2mSha256Ctxt), (uint8*) &strResp,sizeof(tstrCyptoResp), 0) == M2M_SUCCESS)
tsungta 28:2abbf8463fa8 765 {
tsungta 28:2abbf8463fa8 766 if (hif_receive(u32Addr + sizeof(tstrM2mSha256Ctxt) + sizeof(tstrCyptoResp), (uint8*)gstrCryptoCtxt.pu8Digest,M2M_SHA256_DIGEST_LEN, 1) == M2M_SUCCESS)
tsungta 28:2abbf8463fa8 767 {
tsungta 28:2abbf8463fa8 768 if (gstrCryptoCtxt.pfAppCryptoCb)
tsungta 28:2abbf8463fa8 769 gstrCryptoCtxt.pfAppCryptoCb(u8OpCode,&strResp,gstrCryptoCtxt.pu8Digest);
tsungta 28:2abbf8463fa8 770
tsungta 28:2abbf8463fa8 771 }
tsungta 28:2abbf8463fa8 772 }
tsungta 28:2abbf8463fa8 773 }
tsungta 28:2abbf8463fa8 774 else if(u8OpCode == M2M_CRYPTO_RESP_RSA_SIGN_GEN)
tsungta 28:2abbf8463fa8 775 {
tsungta 28:2abbf8463fa8 776 tstrCyptoResp strResp;
tsungta 28:2abbf8463fa8 777 if (hif_receive(u32Addr + sizeof(tstrRsaPayload), (uint8*)&strResp,sizeof(tstrCyptoResp), 0) == M2M_SUCCESS)
tsungta 28:2abbf8463fa8 778 {
tsungta 28:2abbf8463fa8 779 if (hif_receive(u32Addr + sizeof(tstrRsaPayload) + sizeof(tstrCyptoResp), (uint8*)gstrCryptoCtxt.pu8Rsa,M2M_MAX_RSA_LEN, 0) == M2M_SUCCESS)
tsungta 28:2abbf8463fa8 780 {
tsungta 28:2abbf8463fa8 781 if (gstrCryptoCtxt.pfAppCryptoCb)
tsungta 28:2abbf8463fa8 782 gstrCryptoCtxt.pfAppCryptoCb(u8OpCode,&strResp,gstrCryptoCtxt.pu8Rsa);
tsungta 28:2abbf8463fa8 783 }
tsungta 28:2abbf8463fa8 784 }
tsungta 28:2abbf8463fa8 785 }
tsungta 28:2abbf8463fa8 786 else if(u8OpCode == M2M_CRYPTO_RESP_RSA_SIGN_VERIFY)
tsungta 28:2abbf8463fa8 787 {
tsungta 28:2abbf8463fa8 788 tstrCyptoResp strResp;
tsungta 28:2abbf8463fa8 789 if (hif_receive(u32Addr + sizeof(tstrRsaPayload), (uint8*)&strResp,sizeof(tstrCyptoResp), 1) == M2M_SUCCESS)
tsungta 28:2abbf8463fa8 790 {
tsungta 28:2abbf8463fa8 791 if (gstrCryptoCtxt.pfAppCryptoCb)
tsungta 28:2abbf8463fa8 792 gstrCryptoCtxt.pfAppCryptoCb(u8OpCode,&strResp,NULL);
tsungta 28:2abbf8463fa8 793 }
tsungta 28:2abbf8463fa8 794 }
tsungta 28:2abbf8463fa8 795 else
tsungta 28:2abbf8463fa8 796 {
tsungta 28:2abbf8463fa8 797 M2M_ERR("u8Code %d ??\n",u8OpCode);
tsungta 28:2abbf8463fa8 798 }
tsungta 28:2abbf8463fa8 799
tsungta 28:2abbf8463fa8 800 }
tsungta 28:2abbf8463fa8 801 /*!
tsungta 28:2abbf8463fa8 802 @fn \
tsungta 28:2abbf8463fa8 803 sint8 m2m_crypto_init();
tsungta 28:2abbf8463fa8 804
tsungta 28:2abbf8463fa8 805 @brief crypto initialization
tsungta 28:2abbf8463fa8 806
tsungta 28:2abbf8463fa8 807 @param[in] pfAppCryproCb
tsungta 28:2abbf8463fa8 808
tsungta 28:2abbf8463fa8 809 */
tsungta 28:2abbf8463fa8 810 sint8 m2m_crypto_init(tpfAppCryproCb pfAppCryproCb)
tsungta 28:2abbf8463fa8 811 {
tsungta 28:2abbf8463fa8 812 sint8 ret = M2M_ERR_FAIL;
tsungta 28:2abbf8463fa8 813 m2m_memset((uint8*)&gstrCryptoCtxt,0,sizeof(tstrCryptoCtxt));
tsungta 28:2abbf8463fa8 814 if(pfAppCryproCb != NULL)
tsungta 28:2abbf8463fa8 815 {
tsungta 28:2abbf8463fa8 816 gstrCryptoCtxt.pfAppCryptoCb = pfAppCryproCb;
tsungta 28:2abbf8463fa8 817 ret = hif_register_cb(M2M_REQ_GROUP_CRYPTO,m2m_crypto_cb);
tsungta 28:2abbf8463fa8 818 }
tsungta 28:2abbf8463fa8 819 return ret;
tsungta 28:2abbf8463fa8 820 }
tsungta 28:2abbf8463fa8 821 /*!
tsungta 28:2abbf8463fa8 822 @fn \
tsungta 28:2abbf8463fa8 823 sint8 m2m_sha256_hash_init(tstrM2mSha256Ctxt *psha256Ctxt);
tsungta 28:2abbf8463fa8 824
tsungta 28:2abbf8463fa8 825 @brief SHA256 hash initialization
tsungta 28:2abbf8463fa8 826
tsungta 28:2abbf8463fa8 827 @param[in] psha256Ctxt
tsungta 28:2abbf8463fa8 828 Pointer to a sha256 context allocated by the caller.
tsungta 28:2abbf8463fa8 829 */
tsungta 28:2abbf8463fa8 830 sint8 m2m_crypto_sha256_hash_init(tstrM2mSha256Ctxt *psha256Ctxt)
tsungta 28:2abbf8463fa8 831 {
tsungta 28:2abbf8463fa8 832 sint8 ret = M2M_ERR_FAIL;
tsungta 28:2abbf8463fa8 833 if((psha256Ctxt != NULL)&&(!gstrCryptoCtxt.u8CryptoBusy))
tsungta 28:2abbf8463fa8 834 {
tsungta 28:2abbf8463fa8 835 ret = hif_send(M2M_REQ_GROUP_CRYPTO,M2M_CRYPTO_REQ_SHA256_INIT|M2M_REQ_DATA_PKT,(uint8*)psha256Ctxt,sizeof(tstrM2mSha256Ctxt),NULL,0,0);
tsungta 28:2abbf8463fa8 836 }
tsungta 28:2abbf8463fa8 837 return ret;
tsungta 28:2abbf8463fa8 838 }
tsungta 28:2abbf8463fa8 839
tsungta 28:2abbf8463fa8 840
tsungta 28:2abbf8463fa8 841 /*!
tsungta 28:2abbf8463fa8 842 @fn \
tsungta 28:2abbf8463fa8 843 sint8 m2m_sha256_hash_update(tstrM2mSha256Ctxt *psha256Ctxt, uint8 *pu8Data, uint16 u16DataLength);
tsungta 28:2abbf8463fa8 844
tsungta 28:2abbf8463fa8 845 @brief SHA256 hash update
tsungta 28:2abbf8463fa8 846
tsungta 28:2abbf8463fa8 847 @param [in] psha256Ctxt
tsungta 28:2abbf8463fa8 848 Pointer to the sha256 context.
tsungta 28:2abbf8463fa8 849
tsungta 28:2abbf8463fa8 850 @param [in] pu8Data
tsungta 28:2abbf8463fa8 851 Buffer holding the data submitted to the hash.
tsungta 28:2abbf8463fa8 852
tsungta 28:2abbf8463fa8 853 @param [in] u16DataLength
tsungta 28:2abbf8463fa8 854 Size of the data bufefr in bytes.
tsungta 28:2abbf8463fa8 855 */
tsungta 28:2abbf8463fa8 856 sint8 m2m_crypto_sha256_hash_update(tstrM2mSha256Ctxt *psha256Ctxt, uint8 *pu8Data, uint16 u16DataLength)
tsungta 28:2abbf8463fa8 857 {
tsungta 28:2abbf8463fa8 858 sint8 ret = M2M_ERR_FAIL;
tsungta 28:2abbf8463fa8 859 if((!gstrCryptoCtxt.u8CryptoBusy) && (psha256Ctxt != NULL) && (pu8Data != NULL) && (u16DataLength < M2M_SHA256_MAX_DATA))
tsungta 28:2abbf8463fa8 860 {
tsungta 28:2abbf8463fa8 861 ret = hif_send(M2M_REQ_GROUP_CRYPTO,M2M_CRYPTO_REQ_SHA256_UPDATE|M2M_REQ_DATA_PKT,(uint8*)psha256Ctxt,sizeof(tstrM2mSha256Ctxt),pu8Data,u16DataLength,sizeof(tstrM2mSha256Ctxt) + sizeof(tstrCyptoResp));
tsungta 28:2abbf8463fa8 862 }
tsungta 28:2abbf8463fa8 863 return ret;
tsungta 28:2abbf8463fa8 864
tsungta 28:2abbf8463fa8 865 }
tsungta 28:2abbf8463fa8 866
tsungta 28:2abbf8463fa8 867
tsungta 28:2abbf8463fa8 868 /*!
tsungta 28:2abbf8463fa8 869 @fn \
tsungta 28:2abbf8463fa8 870 sint8 m2m_sha256_hash_finish(tstrM2mSha256Ctxt *psha256Ctxt, uint8 *pu8Sha256Digest);
tsungta 28:2abbf8463fa8 871
tsungta 28:2abbf8463fa8 872 @brief SHA256 hash finalization
tsungta 28:2abbf8463fa8 873
tsungta 28:2abbf8463fa8 874 @param[in] psha256Ctxt
tsungta 28:2abbf8463fa8 875 Pointer to a sha256 context allocated by the caller.
tsungta 28:2abbf8463fa8 876
tsungta 28:2abbf8463fa8 877 @param [in] pu8Sha256Digest
tsungta 28:2abbf8463fa8 878 Buffer allocated by the caller which will hold the resultant SHA256 Digest. It must be allocated no less than M2M_SHA256_DIGEST_LEN.
tsungta 28:2abbf8463fa8 879 */
tsungta 28:2abbf8463fa8 880 sint8 m2m_crypto_sha256_hash_finish(tstrM2mSha256Ctxt *psha256Ctxt, uint8 *pu8Sha256Digest)
tsungta 28:2abbf8463fa8 881 {
tsungta 28:2abbf8463fa8 882 sint8 ret = M2M_ERR_FAIL;
tsungta 28:2abbf8463fa8 883 if((!gstrCryptoCtxt.u8CryptoBusy) && (psha256Ctxt != NULL) && (pu8Sha256Digest != NULL))
tsungta 28:2abbf8463fa8 884 {
tsungta 28:2abbf8463fa8 885 gstrCryptoCtxt.pu8Digest = pu8Sha256Digest;
tsungta 28:2abbf8463fa8 886 ret = hif_send(M2M_REQ_GROUP_CRYPTO,M2M_CRYPTO_REQ_SHA256_FINSIH|M2M_REQ_DATA_PKT,(uint8*)psha256Ctxt,sizeof(tstrM2mSha256Ctxt),NULL,0,0);
tsungta 28:2abbf8463fa8 887 }
tsungta 28:2abbf8463fa8 888 return ret;
tsungta 28:2abbf8463fa8 889 }
tsungta 28:2abbf8463fa8 890
tsungta 28:2abbf8463fa8 891
tsungta 28:2abbf8463fa8 892
tsungta 28:2abbf8463fa8 893
tsungta 28:2abbf8463fa8 894 /*!
tsungta 28:2abbf8463fa8 895 @fn \
tsungta 28:2abbf8463fa8 896 sint8 m2m_rsa_sign_verify(uint8 *pu8N, uint16 u16NSize, uint8 *pu8E, uint16 u16ESize, uint8 *pu8SignedMsgHash, \
tsungta 28:2abbf8463fa8 897 uint16 u16HashLength, uint8 *pu8RsaSignature);
tsungta 28:2abbf8463fa8 898
tsungta 28:2abbf8463fa8 899 @brief RSA Signature Verification
tsungta 28:2abbf8463fa8 900
tsungta 28:2abbf8463fa8 901 The function shall request the RSA Signature verification from the WINC Firmware for the given message. The signed message shall be
tsungta 28:2abbf8463fa8 902 compressed to the corresponding hash algorithm before calling this function.
tsungta 28:2abbf8463fa8 903 The hash type is identified by the given hash length. For example, if the hash length is 32 bytes, then it is SHA256.
tsungta 28:2abbf8463fa8 904
tsungta 28:2abbf8463fa8 905 @param[in] pu8N
tsungta 28:2abbf8463fa8 906 RSA Key modulus n.
tsungta 28:2abbf8463fa8 907
tsungta 28:2abbf8463fa8 908 @param[in] u16NSize
tsungta 28:2abbf8463fa8 909 Size of the RSA modulus n in bytes.
tsungta 28:2abbf8463fa8 910
tsungta 28:2abbf8463fa8 911 @param[in] pu8E
tsungta 28:2abbf8463fa8 912 RSA public exponent.
tsungta 28:2abbf8463fa8 913
tsungta 28:2abbf8463fa8 914 @param[in] u16ESize
tsungta 28:2abbf8463fa8 915 Size of the RSA public exponent in bytes.
tsungta 28:2abbf8463fa8 916
tsungta 28:2abbf8463fa8 917 @param[in] pu8SignedMsgHash
tsungta 28:2abbf8463fa8 918 The hash digest of the signed message.
tsungta 28:2abbf8463fa8 919
tsungta 28:2abbf8463fa8 920 @param[in] u16HashLength
tsungta 28:2abbf8463fa8 921 The length of the hash digest.
tsungta 28:2abbf8463fa8 922
tsungta 28:2abbf8463fa8 923 @param[out] pu8RsaSignature
tsungta 28:2abbf8463fa8 924 Signature value to be verified.
tsungta 28:2abbf8463fa8 925 */
tsungta 28:2abbf8463fa8 926
tsungta 28:2abbf8463fa8 927
tsungta 28:2abbf8463fa8 928 sint8 m2m_crypto_rsa_sign_verify(uint8 *pu8N, uint16 u16NSize, uint8 *pu8E, uint16 u16ESize, uint8 *pu8SignedMsgHash,
tsungta 28:2abbf8463fa8 929 uint16 u16HashLength, uint8 *pu8RsaSignature)
tsungta 28:2abbf8463fa8 930 {
tsungta 28:2abbf8463fa8 931 sint8 ret = M2M_ERR_FAIL;
tsungta 28:2abbf8463fa8 932 if((!gstrCryptoCtxt.u8CryptoBusy) && (pu8N != NULL) && (pu8E != NULL) && (pu8RsaSignature != NULL) && (pu8SignedMsgHash != NULL)
tsungta 28:2abbf8463fa8 933 && (u16NSize != 0) && (u16ESize != 0) && (u16HashLength != 0) && (pu8RsaSignature != NULL) )
tsungta 28:2abbf8463fa8 934
tsungta 28:2abbf8463fa8 935 {
tsungta 28:2abbf8463fa8 936 tstrRsaPayload strRsa = {0};
tsungta 28:2abbf8463fa8 937
tsungta 28:2abbf8463fa8 938 m2m_memcpy(strRsa.au8N,pu8N,u16NSize);
tsungta 28:2abbf8463fa8 939 m2m_memcpy(strRsa.au8E,pu8E,u16ESize);
tsungta 28:2abbf8463fa8 940 m2m_memcpy(strRsa.au8Hash,pu8SignedMsgHash,u16HashLength);
tsungta 28:2abbf8463fa8 941
tsungta 28:2abbf8463fa8 942 strRsa.u16Esz = u16ESize;
tsungta 28:2abbf8463fa8 943 strRsa.u16Hsz = u16HashLength;
tsungta 28:2abbf8463fa8 944 strRsa.u16Nsz = u16NSize;
tsungta 28:2abbf8463fa8 945
tsungta 28:2abbf8463fa8 946 ret = hif_send(M2M_REQ_GROUP_CRYPTO,M2M_CRYPTO_REQ_RSA_SIGN_VERIFY|M2M_REQ_DATA_PKT,(uint8*)&strRsa,sizeof(tstrRsaPayload),NULL,0,0);
tsungta 28:2abbf8463fa8 947
tsungta 28:2abbf8463fa8 948 }
tsungta 28:2abbf8463fa8 949 return ret;
tsungta 28:2abbf8463fa8 950 }
tsungta 28:2abbf8463fa8 951
tsungta 28:2abbf8463fa8 952
tsungta 28:2abbf8463fa8 953 /*!
tsungta 28:2abbf8463fa8 954 @fn \
tsungta 28:2abbf8463fa8 955 sint8 m2m_rsa_sign_gen(uint8 *pu8N, uint16 u16NSize, uint8 *pu8d, uint16 u16dSize, uint8 *pu8SignedMsgHash, \
tsungta 28:2abbf8463fa8 956 uint16 u16HashLength, uint8 *pu8RsaSignature);
tsungta 28:2abbf8463fa8 957
tsungta 28:2abbf8463fa8 958 @brief RSA Signature Generation
tsungta 28:2abbf8463fa8 959
tsungta 28:2abbf8463fa8 960 The function shall request the RSA Signature generation from the WINC Firmware for the given message. The signed message shall be
tsungta 28:2abbf8463fa8 961 compressed to the corresponding hash algorithm before calling this function.
tsungta 28:2abbf8463fa8 962 The hash type is identified by the given hash length. For example, if the hash length is 32 bytes, then it is SHA256.
tsungta 28:2abbf8463fa8 963
tsungta 28:2abbf8463fa8 964 @param[in] pu8N
tsungta 28:2abbf8463fa8 965 RSA Key modulus n.
tsungta 28:2abbf8463fa8 966
tsungta 28:2abbf8463fa8 967 @param[in] u16NSize
tsungta 28:2abbf8463fa8 968 Size of the RSA modulus n in bytes.
tsungta 28:2abbf8463fa8 969
tsungta 28:2abbf8463fa8 970 @param[in] pu8d
tsungta 28:2abbf8463fa8 971 RSA private exponent.
tsungta 28:2abbf8463fa8 972
tsungta 28:2abbf8463fa8 973 @param[in] u16dSize
tsungta 28:2abbf8463fa8 974 Size of the RSA private exponent in bytes.
tsungta 28:2abbf8463fa8 975
tsungta 28:2abbf8463fa8 976 @param[in] pu8SignedMsgHash
tsungta 28:2abbf8463fa8 977 The hash digest of the signed message.
tsungta 28:2abbf8463fa8 978
tsungta 28:2abbf8463fa8 979 @param[in] u16HashLength
tsungta 28:2abbf8463fa8 980 The length of the hash digest.
tsungta 28:2abbf8463fa8 981
tsungta 28:2abbf8463fa8 982 @param[out] pu8RsaSignature
tsungta 28:2abbf8463fa8 983 Pointer to a user buffer allocated by teh caller shall hold the generated signature.
tsungta 28:2abbf8463fa8 984 */
tsungta 28:2abbf8463fa8 985 sint8 m2m_crypto_rsa_sign_gen(uint8 *pu8N, uint16 u16NSize, uint8 *pu8d, uint16 u16dSize, uint8 *pu8SignedMsgHash,
tsungta 28:2abbf8463fa8 986 uint16 u16HashLength, uint8 *pu8RsaSignature)
tsungta 28:2abbf8463fa8 987 {
tsungta 28:2abbf8463fa8 988 sint8 ret = M2M_ERR_FAIL;
tsungta 28:2abbf8463fa8 989 if((!gstrCryptoCtxt.u8CryptoBusy) && (pu8N != NULL) && (pu8d != NULL) && (pu8RsaSignature != NULL) && (pu8SignedMsgHash != NULL)
tsungta 28:2abbf8463fa8 990 && (u16NSize != 0) && (u16dSize != 0) && (u16HashLength != 0) && (pu8RsaSignature != NULL))
tsungta 28:2abbf8463fa8 991
tsungta 28:2abbf8463fa8 992 {
tsungta 28:2abbf8463fa8 993 tstrRsaPayload strRsa = {0};
tsungta 28:2abbf8463fa8 994
tsungta 28:2abbf8463fa8 995 m2m_memcpy(strRsa.au8N,pu8N,u16NSize);
tsungta 28:2abbf8463fa8 996 m2m_memcpy(strRsa.au8E,pu8d,u16dSize);
tsungta 28:2abbf8463fa8 997 m2m_memcpy(strRsa.au8Hash,pu8SignedMsgHash,u16HashLength);
tsungta 28:2abbf8463fa8 998
tsungta 28:2abbf8463fa8 999 strRsa.u16Esz = u16dSize;
tsungta 28:2abbf8463fa8 1000 strRsa.u16Hsz = u16HashLength;
tsungta 28:2abbf8463fa8 1001 strRsa.u16Nsz = u16NSize;
tsungta 28:2abbf8463fa8 1002
tsungta 28:2abbf8463fa8 1003 gstrCryptoCtxt.pu8Rsa = pu8RsaSignature;
tsungta 28:2abbf8463fa8 1004 ret = hif_send(M2M_REQ_GROUP_CRYPTO,M2M_CRYPTO_REQ_RSA_SIGN_GEN|M2M_REQ_DATA_PKT,(uint8*)&strRsa,sizeof(tstrRsaPayload),NULL,0,0);
tsungta 28:2abbf8463fa8 1005
tsungta 28:2abbf8463fa8 1006 }
tsungta 28:2abbf8463fa8 1007 return ret;
tsungta 28:2abbf8463fa8 1008 }
tsungta 28:2abbf8463fa8 1009
tsungta 28:2abbf8463fa8 1010 #endif
tsungta 28:2abbf8463fa8 1011