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
wifi_host_driver/driver/source/m2m_crypto.c@32:8298a2fb074f, 2017-09-04 (annotated)
- 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?
User | Revision | Line number | New 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 |