1 /***************************************************************************//**
2 * \file cy_cryptolite_ecdsa.c
3 * \version 2.50
4 *
5 * \brief
6 * This file provides constant and parameters
7 * for the API of the ECDSA in the Cryptolite driver.
8 *
9 ********************************************************************************
10 * Copyright 2020-2021 Cypress Semiconductor Corporation
11 * SPDX-License-Identifier: Apache-2.0
12 *
13 * Licensed under the Apache License, Version 2.0 (the "License");
14 * you may not use this file except in compliance with the License.
15 * You may obtain a copy of the License at
16 *
17 * http://www.apache.org/licenses/LICENSE-2.0
18 *
19 * Unless required by applicable law or agreed to in writing, software
20 * distributed under the License is distributed on an "AS IS" BASIS,
21 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22 * See the License for the specific language governing permissions and
23 * limitations under the License.
24 *******************************************************************************/
25 #include "cy_device.h"
26
27 #if defined (CY_IP_MXCRYPTOLITE)
28
29 #if defined(__cplusplus)
30 extern "C" {
31 #endif
32
33 #include "cy_sysint.h"
34 #include "cy_cryptolite_ecdsa.h"
35 #include "cy_cryptolite_nist_p.h"
36
37 #if (CRYPTOLITE_VU_PRESENT == 1)
38 #if defined(CY_CRYPTOLITE_CFG_ECDSA_C)
39
40 #include "cy_cryptolite_utils.h"
41 #include "cy_cryptolite_ecc_key_gen.h"
42
43 /*******************************************************************************
44 * Function Name: Cy_Cryptolite_ECC_GetCurveParams
45 ****************************************************************************//**
46 *
47 * Get curve domain parameters if this curve is supported.
48 *
49 * \param curveId
50 * See \ref cy_en_cryptolite_ecc_curve_id_t.
51 *
52 * \return
53 * Pointer to curve domain parameters. See \ref cy_stc_cryptolite_ecc_dp_type.
54 *
55 *******************************************************************************/
Cy_Cryptolite_ECC_GetCurveParams(cy_en_cryptolite_ecc_curve_id_t curveId)56 cy_stc_cryptolite_ecc_dp_type *Cy_Cryptolite_ECC_GetCurveParams(cy_en_cryptolite_ecc_curve_id_t curveId)
57 {
58 /* P192 CURVE PARAMETERS */
59 #ifdef CY_CRYPTOLITE_CFG_ECP_DP_SECP192R1_ENABLED
60 CY_ALIGN(4) static const uint8_t eccP192Polynomial[CY_CRYPTOLITE_ECC_P192_BYTE_SIZE] =
61 {
62 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
63 0xfeu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
64 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
65 };
66
67 CY_ALIGN(4) static const uint8_t eccP192PolyBarrett[CY_CRYPTOLITE_ECC_P192_BYTE_SIZE + 1u] =
68 { /* pre-calculated */
69 0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
70 0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
71 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
72 0x01u
73 };
74 CY_ALIGN(4) static const uint8_t eccP192Order[CY_CRYPTOLITE_ECC_P192_BYTE_SIZE] =
75 {
76 0x31u, 0x28u, 0xD2u, 0xB4u, 0xB1u, 0xC9u, 0x6Bu, 0x14u,
77 0x36u, 0xF8u, 0xDEu, 0x99u, 0xffu, 0xffu, 0xffu, 0xffu,
78 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu
79 };
80
81 /* barrett_o: "1000000000000000000000000662107c9eb94364e4b2dd7cf" */
82 CY_ALIGN(4) static const uint8_t eccP192OrderBarrett[CY_CRYPTOLITE_ECC_P192_BYTE_SIZE + 1u] =
83 { /* pre-calculated */
84 0xcfu, 0xd7u, 0x2du, 0x4bu, 0x4eu, 0x36u, 0x94u, 0xebu,
85 0xc9u, 0x07u, 0x21u, 0x66u, 0x00u, 0x00u, 0x00u, 0x00u,
86 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
87 0x01u
88 };
89
90 /* base point x: "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012" */
91 CY_ALIGN(4) static const uint8_t eccP192BasePointX[CY_CRYPTOLITE_ECC_P192_BYTE_SIZE] =
92 {
93 0x12u, 0x10u, 0xffu, 0x82u, 0xfdu, 0x0au, 0xffu, 0xf4u,
94 0x00u, 0x88u, 0xa1u, 0x43u, 0xebu, 0x20u, 0xbfu, 0x7cu,
95 0xf6u, 0x90u, 0x30u, 0xb0u, 0x0eu, 0xa8u, 0x8du, 0x18u
96 };
97
98 /* base point y: "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811" */
99 CY_ALIGN(4) static const uint8_t eccP192BasePointY[CY_CRYPTOLITE_ECC_P192_BYTE_SIZE] =
100 {
101 0x11u, 0x48u, 0x79u, 0x1eu, 0xa1u, 0x77u, 0xf9u, 0x73u,
102 0xd5u, 0xcdu, 0x24u, 0x6bu, 0xedu, 0x11u, 0x10u, 0x63u,
103 0x78u, 0xdau, 0xc8u, 0xffu, 0x95u, 0x2bu, 0x19u, 0x07u
104 };
105 #endif
106 /* P224 CURVE PARAMETERS */
107 #ifdef CY_CRYPTOLITE_CFG_ECP_DP_SECP224R1_ENABLED
108 CY_ALIGN(4) static const uint8_t eccP224Polynomial[CY_CRYPTOLITE_ECC_P224_BYTE_SIZE] =
109 {
110 0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
111 0x00u, 0x00u, 0x00u, 0x00u, 0xffu, 0xffu, 0xffu, 0xffu,
112 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
113 0xffu, 0xffu, 0xffu, 0xffu
114 };
115
116 CY_ALIGN(4) static const uint8_t eccP224PolyBarrett[CY_CRYPTOLITE_ECC_P224_BYTE_SIZE + 1u] =
117 { /* pre-calculated */
118 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
119 0xffu, 0xffu, 0xffu, 0xffu, 0x00u, 0x00u, 0x00u, 0x00u,
120 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
121 0x00u, 0x00u, 0x00u, 0x00u, 0x01u
122 };
123
124 CY_ALIGN(4) static const uint8_t eccP224Order[CY_CRYPTOLITE_ECC_P224_BYTE_SIZE] =
125 {
126 0x3Du, 0x2Au, 0x5Cu, 0x5Cu, 0x45u, 0x29u, 0xDDu, 0x13u,
127 0x3Eu, 0xF0u, 0xB8u, 0xE0u, 0xA2u, 0x16u, 0xffu, 0xffu,
128 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
129 0xffu, 0xffu, 0xffu, 0xffu
130 };
131 /* barrett_o: "10000000000000000000000000000e95d1f470fc1ec22d6baa3a3d5c3" */
132 CY_ALIGN(4) static const uint8_t eccP224OrderBarrett[CY_CRYPTOLITE_ECC_P224_BYTE_SIZE + 1u] =
133 { /* pre-calculated */
134 0xc3u, 0xd5u, 0xa3u, 0xa3u, 0xbau, 0xd6u, 0x22u, 0xecu,
135 0xc1u, 0x0fu, 0x47u, 0x1fu, 0x5du, 0xe9u, 0x00u, 0x00u,
136 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
137 0x00u, 0x00u, 0x00u, 0x00u, 0x01u
138 };
139
140 /* Gx - base point x: "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21" */
141 CY_ALIGN(4) static const uint8_t eccP224BasePointX[CY_CRYPTOLITE_ECC_P224_BYTE_SIZE] =
142 {
143 0x21u, 0x1du, 0x5cu, 0x11u, 0xd6u, 0x80u, 0x32u, 0x34u,
144 0x22u, 0x11u, 0xc2u, 0x56u, 0xd3u, 0xc1u, 0x03u, 0x4au,
145 0xb9u, 0x90u, 0x13u, 0x32u, 0x7fu, 0xbfu, 0xb4u, 0x6bu,
146 0xbdu, 0x0cu, 0x0eu, 0xb7u
147 };
148
149 /* Gy - base point y: "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34" */
150 CY_ALIGN(4) static const uint8_t eccP224BasePointY[CY_CRYPTOLITE_ECC_P224_BYTE_SIZE] =
151 {
152 0x34u, 0x7eu, 0x00u, 0x85u, 0x99u, 0x81u, 0xd5u, 0x44u,
153 0x64u, 0x47u, 0x07u, 0x5au, 0xa0u, 0x75u, 0x43u, 0xcdu,
154 0xe6u, 0xdfu, 0x22u, 0x4cu, 0xfbu, 0x23u, 0xf7u, 0xb5u,
155 0x88u, 0x63u, 0x37u, 0xbdu
156 };
157 #endif
158 /* P256 CURVE PARAMETERS */
159 #ifdef CY_CRYPTOLITE_CFG_ECP_DP_SECP256R1_ENABLED
160 /* prime: "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF" */
161 CY_ALIGN(4) static const uint8_t eccP256Polynomial[CY_CRYPTOLITE_ECC_P256_BYTE_SIZE] =
162 {
163 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
164 0xffu, 0xffu, 0xffu, 0xffu, 0x00u, 0x00u, 0x00u, 0x00u,
165 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
166 0x01u, 0x00u, 0x00u, 0x00u, 0xffu, 0xffu, 0xffu, 0xffu
167 };
168
169 /* barrett_p: "100000000fffffffffffffffefffffffefffffffeffffffff0000000000000003" */
170 CY_ALIGN(4) static const uint8_t eccP256PolyBarrett[CY_CRYPTOLITE_ECC_P256_BYTE_SIZE + 1u] =
171 { /* pre-calculated! */
172 0x03u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
173 0xffu, 0xffu, 0xffu, 0xffu, 0xfeu, 0xffu, 0xffu, 0xffu,
174 0xfeu, 0xffu, 0xffu, 0xffu, 0xfeu, 0xffu, 0xffu, 0xffu,
175 0xffu, 0xffu, 0xffu, 0xffu, 0x00u, 0x00u, 0x00u, 0x00u,
176 0x01u
177 };
178
179 /* order: "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551" */
180 CY_ALIGN(4) static const uint8_t eccP256Order[CY_CRYPTOLITE_ECC_P256_BYTE_SIZE] =
181 {
182 0x51u, 0x25u, 0x63u, 0xfcu, 0xc2u, 0xcau, 0xb9u, 0xf3u,
183 0x84u, 0x9eu, 0x17u, 0xa7u, 0xadu, 0xfau, 0xe6u, 0xbcu,
184 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
185 0x00u, 0x00u, 0x00u, 0x00u, 0xffu, 0xffu, 0xffu, 0xffu
186 };
187
188 /* barrett_o: 100000000fffffffffffffffeffffffff43190552df1a6c21012ffd85eedf9bfe" */
189 CY_ALIGN(4) static const uint8_t eccP256OrderBarrett[CY_CRYPTOLITE_ECC_P256_BYTE_SIZE + 1u] =
190 { /* pre-calculated */
191 0xfeu, 0x9bu, 0xdfu, 0xeeu, 0x85u, 0xfdu, 0x2fu, 0x01u,
192 0x21u, 0x6cu, 0x1au, 0xdfu, 0x52u, 0x05u, 0x19u, 0x43u,
193 0xffu, 0xffu, 0xffu, 0xffu, 0xfeu, 0xffu, 0xffu, 0xffu,
194 0xffu, 0xffu, 0xffu, 0xffu, 0x00u, 0x00u, 0x00u, 0x00u,
195 0x01u
196 };
197
198 /* base point x: "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296" */
199 CY_ALIGN(4) static const uint8_t eccP256BasePointX[CY_CRYPTOLITE_ECC_P256_BYTE_SIZE] =
200 {
201 0x96u, 0xc2u, 0x98u, 0xd8u, 0x45u, 0x39u, 0xa1u, 0xf4u,
202 0xa0u, 0x33u, 0xebu, 0x2du, 0x81u, 0x7du, 0x03u, 0x77u,
203 0xf2u, 0x40u, 0xa4u, 0x63u, 0xe5u, 0xe6u, 0xbcu, 0xf8u,
204 0x47u, 0x42u, 0x2cu, 0xe1u, 0xf2u, 0xd1u, 0x17u, 0x6bu
205 };
206
207 /* base point y: "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5" */
208 CY_ALIGN(4) static const uint8_t eccP256BasePointY[CY_CRYPTOLITE_ECC_P256_BYTE_SIZE] =
209 {
210 0xf5u, 0x51u, 0xbfu, 0x37u, 0x68u, 0x40u, 0xb6u, 0xcbu,
211 0xceu, 0x5eu, 0x31u, 0x6bu, 0x57u, 0x33u, 0xceu, 0x2bu,
212 0x16u, 0x9eu, 0x0fu, 0x7cu, 0x4au, 0xebu, 0xe7u, 0x8eu,
213 0x9bu, 0x7fu, 0x1au, 0xfeu, 0xe2u, 0x42u, 0xe3u, 0x4fu,
214 };
215 #endif
216 /* P384 CURVE PARAMETERS */
217 #ifdef CY_CRYPTOLITE_CFG_ECP_DP_SECP384R1_ENABLED
218 /* prime: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF" */
219 CY_ALIGN(4) static const uint8_t eccP384Polynomial[CY_CRYPTOLITE_ECC_P384_BYTE_SIZE] =
220 {
221 0xffu, 0xffu, 0xffu, 0xffu, 0x00u, 0x00u, 0x00u, 0x00u,
222 0x00u, 0x00u, 0x00u, 0x00u, 0xffu, 0xffu, 0xffu, 0xffu,
223 0xfeu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
224 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
225 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
226 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu
227 };
228
229 /* barrett_p: "1000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001" */
230 CY_ALIGN(4) static const uint8_t eccP384PolyBarrett[CY_CRYPTOLITE_ECC_P384_BYTE_SIZE + 1u] =
231 { /* pre-calculated */
232 0x01u, 0x00u, 0x00u, 0x00u, 0xffu, 0xffu, 0xffu, 0xffu,
233 0xffu, 0xffu, 0xffu, 0xffu, 0x00u, 0x00u, 0x00u, 0x00u,
234 0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
235 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
236 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
237 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
238 0x01u
239 };
240
241 /* order: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973" */
242 CY_ALIGN(4) static const uint8_t eccP384Order[CY_CRYPTOLITE_ECC_P384_BYTE_SIZE] =
243 {
244 0x73u, 0x29u, 0xC5u, 0xCCu, 0x6Au, 0x19u, 0xECu, 0xECu,
245 0x7Au, 0xA7u, 0xB0u, 0x48u, 0xB2u, 0x0Du, 0x1Au, 0x58u,
246 0xDFu, 0x2Du, 0x37u, 0xF4u, 0x81u, 0x4Du, 0x63u, 0xC7u,
247 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
248 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
249 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu
250 };
251
252 /* barrett_o: "1000000000000000000000000000000000000000000000000389cb27e0bc8d220a7e5f24db74f58851313e695333ad68d" */
253 CY_ALIGN(4) static const uint8_t eccP384OrderBarrett[CY_CRYPTOLITE_ECC_P384_BYTE_SIZE + 1u] =
254 { /* pre-calculated */
255 0x8du, 0xd6u, 0x3au, 0x33u, 0x95u, 0xe6u, 0x13u, 0x13u,
256 0x85u, 0x58u, 0x4fu, 0xb7u, 0x4du, 0xf2u, 0xe5u, 0xa7u,
257 0x20u, 0xd2u, 0xc8u, 0x0bu, 0x7eu, 0xb2u, 0x9cu, 0x38u,
258 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
259 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
260 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
261 0x01u
262 };
263
264 /* base point x: "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7" */
265 CY_ALIGN(4) static const uint8_t eccP384BasePointX[CY_CRYPTOLITE_ECC_P384_BYTE_SIZE] =
266 {
267 0xb7u, 0x0au, 0x76u, 0x72u, 0x38u, 0x5eu, 0x54u, 0x3au,
268 0x6cu, 0x29u, 0x55u, 0xbfu, 0x5du, 0xf2u, 0x02u, 0x55u,
269 0x38u, 0x2au, 0x54u, 0x82u, 0xe0u, 0x41u, 0xf7u, 0x59u,
270 0x98u, 0x9bu, 0xa7u, 0x8bu, 0x62u, 0x3bu, 0x1du, 0x6eu,
271 0x74u, 0xadu, 0x20u, 0xf3u, 0x1eu, 0xc7u, 0xb1u, 0x8eu,
272 0x37u, 0x05u, 0x8bu, 0xbeu, 0x22u, 0xcau, 0x87u, 0xaau
273 };
274
275 /* base point y: "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F" */
276 CY_ALIGN(4) static const uint8_t eccP384BasePointY[CY_CRYPTOLITE_ECC_P384_BYTE_SIZE] =
277 {
278 0x5fu, 0x0eu, 0xeau, 0x90u, 0x7cu, 0x1du, 0x43u, 0x7au,
279 0x9du, 0x81u, 0x7eu, 0x1du, 0xceu, 0xb1u, 0x60u, 0x0au,
280 0xc0u, 0xb8u, 0xf0u, 0xb5u, 0x13u, 0x31u, 0xdau, 0xe9u,
281 0x7cu, 0x14u, 0x9au, 0x28u, 0xbdu, 0x1du, 0xf4u, 0xf8u,
282 0x29u, 0xdcu, 0x92u, 0x92u, 0xbfu, 0x98u, 0x9eu, 0x5du,
283 0x6fu, 0x2cu, 0x26u, 0x96u, 0x4au, 0xdeu, 0x17u, 0x36u
284 };
285 #endif
286 /* P521 CURVE PARAMETERS */
287 #ifdef CY_CRYPTOLITE_CFG_ECP_DP_SECP521R1_ENABLED
288 CY_ALIGN(4) static const uint8_t eccP521Polynomial[CY_CRYPTOLITE_ECC_P521_BYTE_SIZE] =
289 {
290 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
291 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
292 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
293 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
294 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
295 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
296 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
297 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
298 0xffu, 0x01u, 0x00u, 0x00u
299 };
300
301 CY_ALIGN(4) static const uint8_t eccP521PolyBarrett[CY_CRYPTOLITE_ECC_P521_BYTE_SIZE] =
302 { /* pre-calculated */
303 0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
304 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
305 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
306 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
307 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
308 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
309 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
310 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
311 0x00u, 0x02u, 0x00u, 0x00u
312 };
313
314 CY_ALIGN(4) static const uint8_t eccP521Order[CY_CRYPTOLITE_ECC_P521_BYTE_SIZE] =
315 {
316 0x09u, 0x64u, 0x38u, 0x91u, 0x1Eu, 0xB7u, 0x6Fu, 0xBBu,
317 0xAEu, 0x47u, 0x9Cu, 0x89u, 0xB8u, 0xC9u, 0xB5u, 0x3Bu,
318 0xD0u, 0xA5u, 0x09u, 0xF7u, 0x48u, 0x01u, 0xCCu, 0x7Fu,
319 0x6Bu, 0x96u, 0x2Fu, 0xBFu, 0x83u, 0x87u, 0x86u, 0x51u,
320 0xFAu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
321 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
322 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
323 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
324 0xffu, 0x01u, 0x00u, 0x00u
325 };
326
327 /* barrett_o: "2000000000000000000000000000000000000000000000000000000000000000005ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf7" */
328 CY_ALIGN(4) static const uint8_t eccP521OrderBarrett[CY_CRYPTOLITE_ECC_P521_BYTE_SIZE] =
329 { /* pre-calculated */
330 0xf7u, 0x9bu, 0xc7u, 0x6eu, 0xe1u, 0x48u, 0x90u, 0x44u,
331 0x51u, 0xb8u, 0x63u, 0x76u, 0x47u, 0x36u, 0x4au, 0xc4u,
332 0x2fu, 0x5au, 0xf6u, 0x08u, 0xb7u, 0xfeu, 0x33u, 0x80u,
333 0x94u, 0x69u, 0xd0u, 0x40u, 0x7cu, 0x78u, 0x79u, 0xaeu,
334 0x05u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
335 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
336 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
337 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
338 0x00u, 0x02u, 0x00u, 0x00u
339 };
340
341 /* base point x: "00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66" */
342 CY_ALIGN(4) static const uint8_t eccP521BasePointX[CY_CRYPTOLITE_ECC_P521_BYTE_SIZE] =
343 {
344 0x66u, 0xbdu, 0xe5u, 0xc2u, 0x31u, 0x7eu, 0x7eu, 0xf9u,
345 0x9bu, 0x42u, 0x6au, 0x85u, 0xc1u, 0xb3u, 0x48u, 0x33u,
346 0xdeu, 0xa8u, 0xffu, 0xa2u, 0x27u, 0xc1u, 0x1du, 0xfeu,
347 0x28u, 0x59u, 0xe7u, 0xefu, 0x77u, 0x5eu, 0x4bu, 0xa1u,
348 0xbau, 0x3du, 0x4du, 0x6bu, 0x60u, 0xafu, 0x28u, 0xf8u,
349 0x21u, 0xb5u, 0x3fu, 0x05u, 0x39u, 0x81u, 0x64u, 0x9cu,
350 0x42u, 0xb4u, 0x95u, 0x23u, 0x66u, 0xcbu, 0x3eu, 0x9eu,
351 0xcdu, 0xe9u, 0x04u, 0x04u, 0xb7u, 0x06u, 0x8eu, 0x85u,
352 0xc6u, 0x00u, 0x00u, 0x00u
353 };
354
355 /* base point y: "011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650" */
356 CY_ALIGN(4) static const uint8_t eccP521BasePointY[CY_CRYPTOLITE_ECC_P521_BYTE_SIZE] =
357 {
358 0x50u, 0x66u, 0xd1u, 0x9fu, 0x76u, 0x94u, 0xbeu, 0x88u,
359 0x40u, 0xc2u, 0x72u, 0xa2u, 0x86u, 0x70u, 0x3cu, 0x35u,
360 0x61u, 0x07u, 0xadu, 0x3fu, 0x01u, 0xb9u, 0x50u, 0xc5u,
361 0x40u, 0x26u, 0xf4u, 0x5eu, 0x99u, 0x72u, 0xeeu, 0x97u,
362 0x2cu, 0x66u, 0x3eu, 0x27u, 0x17u, 0xbdu, 0xafu, 0x17u,
363 0x68u, 0x44u, 0x9bu, 0x57u, 0x49u, 0x44u, 0xf5u, 0x98u,
364 0xd9u, 0x1bu, 0x7du, 0x2cu, 0xb4u, 0x5fu, 0x8au, 0x5cu,
365 0x04u, 0xc0u, 0x3bu, 0x9au, 0x78u, 0x6au, 0x29u, 0x39u,
366 0x18u, 0x01u, 0x00u, 0x00u
367 };
368 #endif
369
370 static const cy_stc_cryptolite_ecc_dp_type eccDomainParams[] =
371 {
372 {
373 CY_CRYPTOLITE_ECC_ECP_NONE,
374 0u,
375 NULL,
376 CY_CRYPTOLITE_NIST_P_CURVE_SPECIFIC_RED_ALG,
377 NULL,
378 NULL,
379 NULL,
380 NULL,
381 NULL,
382 NULL
383 },
384 #ifdef CY_CRYPTOLITE_CFG_ECP_DP_SECP192R1_ENABLED
385 {
386 CY_CRYPTOLITE_ECC_ECP_SECP192R1,
387 CY_CRYPTOLITE_ECC_P192_SIZE,
388 "NIST P-192",
389 CY_CRYPTOLITE_NIST_P_CURVE_SPECIFIC_RED_ALG,
390 /* prime: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF" */
391 eccP192Polynomial,
392 /* barrett_p: "1000000000000000000000000000000010000000000000001" */
393 eccP192PolyBarrett,
394 /* order: "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831" */
395 eccP192Order,
396 /* barrett_o: "1000000000000000000000000662107c9eb94364e4b2dd7cf" */
397 eccP192OrderBarrett,
398 /* base point x: "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012" */
399 eccP192BasePointX,
400 /* base point y: "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811" */
401 eccP192BasePointY
402 },
403 #endif
404 #ifdef CY_CRYPTOLITE_CFG_ECP_DP_SECP224R1_ENABLED
405 {
406 CY_CRYPTOLITE_ECC_ECP_SECP224R1,
407 CY_CRYPTOLITE_ECC_P224_SIZE,
408 "NIST P-224",
409 CY_CRYPTOLITE_NIST_P_CURVE_SPECIFIC_RED_ALG,
410 /* prime: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001" */
411 eccP224Polynomial,
412 /* barrett_p: "100000000000000000000000000000000ffffffffffffffffffffffff" */
413 eccP224PolyBarrett,
414 /* order: "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D" */
415 eccP224Order,
416 /* barrett_o: "10000000000000000000000000000e95d1f470fc1ec22d6baa3a3d5c3" */
417 eccP224OrderBarrett,
418 /* Gx - base point x: "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21" */
419 eccP224BasePointX,
420 /* Gy - base point y: "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34" */
421 eccP224BasePointY
422 },
423 #endif
424 #ifdef CY_CRYPTOLITE_CFG_ECP_DP_SECP256R1_ENABLED
425 {
426 CY_CRYPTOLITE_ECC_ECP_SECP256R1,
427 CY_CRYPTOLITE_ECC_P256_SIZE,
428 "NIST P-256",
429 CY_CRYPTOLITE_NIST_P_BARRETT_RED_ALG,
430 /* prime: "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF" */
431 eccP256Polynomial,
432 /* barrett_p: "100000000fffffffffffffffefffffffefffffffeffffffff0000000000000003" */
433 eccP256PolyBarrett,
434 /* order: "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551" */
435 eccP256Order,
436 /* barrett_o: "100000000fffffffffffffffeffffffff43190552df1a6c21012ffd85eedf9bfe" */
437 eccP256OrderBarrett,
438 /* Gx - base point x: "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296" */
439 eccP256BasePointX,
440 /* Gy - base point y: "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5" */
441 eccP256BasePointY
442 },
443 #endif
444 #ifdef CY_CRYPTOLITE_CFG_ECP_DP_SECP384R1_ENABLED
445 {
446 CY_CRYPTOLITE_ECC_ECP_SECP384R1,
447 CY_CRYPTOLITE_ECC_P384_SIZE,
448 "NIST P-384",
449 CY_CRYPTOLITE_NIST_P_BARRETT_RED_ALG,
450 /* prime: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF" */
451 eccP384Polynomial,
452 /* barrett_p: "1000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001" */
453 eccP384PolyBarrett,
454 /* order: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973" */
455 eccP384Order,
456 /* barrett_o: "1000000000000000000000000000000000000000000000000389cb27e0bc8d220a7e5f24db74f58851313e695333ad68d" */
457 eccP384OrderBarrett,
458 /* base point x: "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7" */
459 eccP384BasePointX,
460 /* base point y: "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F" */
461 eccP384BasePointY
462 },
463 #endif
464 #ifdef CY_CRYPTOLITE_CFG_ECP_DP_SECP521R1_ENABLED
465 {
466 CY_CRYPTOLITE_ECC_ECP_SECP521R1,
467 CY_CRYPTOLITE_ECC_P521_SIZE,
468 "NIST P-521",
469 CY_CRYPTOLITE_NIST_P_CURVE_SPECIFIC_RED_ALG,
470 /* prime: "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" */
471 eccP521Polynomial,
472 /* barrett_p: "20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" */
473 eccP521PolyBarrett,
474 /* order: "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409" */
475 eccP521Order,
476 /* barrett_o: "2000000000000000000000000000000000000000000000000000000000000000005ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf7" */
477 eccP521OrderBarrett,
478 /* base point x: "0C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66" */
479 eccP521BasePointX,
480 /* base point y: "11839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650" */
481 eccP521BasePointY
482 }
483 #endif
484 };
485
486 cy_stc_cryptolite_ecc_dp_type *tmpResult = NULL;
487
488 if ((curveId > CY_CRYPTOLITE_ECC_ECP_NONE) && (curveId < CY_CRYPTOLITE_ECC_ECP_CURVES_CNT))
489 {
490 tmpResult = (cy_stc_cryptolite_ecc_dp_type *)&eccDomainParams[curveId];
491 }
492
493 return tmpResult;
494 }
495
496
497 /*******************************************************************************
498 * Function Name: Cy_Cryptolite_ECC_Init
499 ****************************************************************************//*
500 *
501 * Init ECC Context.
502 *
503 * \param base
504 * The pointer to a Cryptolite instance.
505 *
506 * \param cfContext
507 * The pointer to the cy_stc_cryptolite_context_ecdsa_t.
508 *
509 * \param eccBuffer
510 * The pointer to the cy_stc_cryptolite_ecc_buffer_t.
511 *
512 * \return status code. See \ref cy_en_cryptolite_status_t.
513 *
514 *******************************************************************************/
Cy_Cryptolite_ECC_Init(CRYPTOLITE_Type * base,cy_stc_cryptolite_context_ecdsa_t * cfContext,cy_stc_cryptolite_ecc_buffer_t * eccBuffer)515 cy_en_cryptolite_status_t Cy_Cryptolite_ECC_Init(CRYPTOLITE_Type *base,
516 cy_stc_cryptolite_context_ecdsa_t *cfContext,
517 cy_stc_cryptolite_ecc_buffer_t *eccBuffer)
518 {
519 if(base == NULL || cfContext == NULL || eccBuffer == NULL)
520 {
521 return CY_CRYPTOLITE_BAD_PARAMS;
522 }
523
524 cfContext->my_BARRETT_U = eccBuffer->my_BARRETT_U;
525 cfContext->my_P = eccBuffer->my_P;
526 cfContext->dividend = eccBuffer->dividend;
527 cfContext->p_r = eccBuffer->p_r;
528 cfContext->p_s = eccBuffer->p_s;
529 cfContext->p_u1 = eccBuffer->p_u1;
530 cfContext->p_u2 = eccBuffer->p_u2;
531 cfContext->p_o = eccBuffer->p_o;
532 cfContext->p_gx = eccBuffer->p_gx;
533 cfContext->p_gy = eccBuffer->p_gy;
534 cfContext->p_qx = eccBuffer->p_qx;
535 cfContext->p_qy = eccBuffer->p_qy;
536 cfContext->p_buf = eccBuffer->p_buf;
537
538 return CY_CRYPTOLITE_SUCCESS;
539 }
540
541 /*******************************************************************************
542 * Function Name: Cy_Cryptolite_ECC_Free
543 ****************************************************************************//*
544 *
545 * Clean up ECC Context.
546 *
547 * \param base
548 * The pointer to a Cryptolite instance.
549 *
550 * \param cfContext
551 * The pointer to the cy_stc_cryptolite_context_ecdsa_t.
552 *
553 * \return status code. See \ref cy_en_cryptolite_status_t.
554 *
555 *******************************************************************************/
Cy_Cryptolite_ECC_Free(CRYPTOLITE_Type * base,cy_stc_cryptolite_context_ecdsa_t * cfContext)556 cy_en_cryptolite_status_t Cy_Cryptolite_ECC_Free(CRYPTOLITE_Type *base,
557 cy_stc_cryptolite_context_ecdsa_t *cfContext)
558 {
559 if(base == NULL || cfContext == NULL)
560 {
561 return CY_CRYPTOLITE_BAD_PARAMS;
562 }
563
564 if(cfContext->my_BARRETT_U != NULL)
565 {
566 Cy_Cryptolite_Vu_clr(cfContext->my_BARRETT_U, VU_BITS_TO_WORDS(BIT_SIZE+1U));
567 cfContext->my_BARRETT_U = NULL;
568 }
569 if(cfContext->my_P != NULL)
570 {
571 Cy_Cryptolite_Vu_clr(cfContext->my_P, VU_BITS_TO_WORDS(BIT_SIZE));
572 cfContext->my_P = NULL;
573 }
574 if(cfContext->dividend != NULL)
575 {
576 Cy_Cryptolite_Vu_clr(cfContext->dividend, VU_BITS_TO_WORDS(BIT_SIZE));
577 cfContext->dividend = NULL;
578 }
579 if(cfContext->p_r != NULL)
580 {
581 Cy_Cryptolite_Vu_clr(cfContext->p_r, VU_BITS_TO_WORDS(BIT_SIZE));
582 cfContext->p_r = NULL;
583 }
584 if(cfContext->p_s != NULL)
585 {
586 Cy_Cryptolite_Vu_clr(cfContext->p_s, VU_BITS_TO_WORDS(BIT_SIZE));
587 cfContext->p_s = NULL;
588 }
589 if(cfContext->p_u1 != NULL)
590 {
591 Cy_Cryptolite_Vu_clr(cfContext->p_u1, VU_BITS_TO_WORDS(BIT_SIZE));
592 cfContext->p_u1 = NULL;
593 }
594 if(cfContext->p_u2 != NULL)
595 {
596 Cy_Cryptolite_Vu_clr(cfContext->p_u2, VU_BITS_TO_WORDS(BIT_SIZE));
597 cfContext->p_u2 = NULL;
598 }
599 if(cfContext->p_o != NULL)
600 {
601 Cy_Cryptolite_Vu_clr(cfContext->p_o, VU_BITS_TO_WORDS(BIT_SIZE));
602 cfContext->p_o = NULL;
603 }
604 if(cfContext->p_gx != NULL)
605 {
606 Cy_Cryptolite_Vu_clr(cfContext->p_gx, VU_BITS_TO_WORDS(BIT_SIZE));
607 cfContext->p_gx = NULL;
608 }
609 if(cfContext->p_gy != NULL)
610 {
611 Cy_Cryptolite_Vu_clr(cfContext->p_gy, VU_BITS_TO_WORDS(BIT_SIZE));
612 cfContext->p_gy = NULL;
613 }
614 if(cfContext->p_qx != NULL)
615 {
616 Cy_Cryptolite_Vu_clr(cfContext->p_qx, VU_BITS_TO_WORDS(BIT_SIZE));
617 cfContext->p_qx = NULL;
618 }
619 if(cfContext->p_qy != NULL)
620 {
621 Cy_Cryptolite_Vu_clr(cfContext->p_qy, VU_BITS_TO_WORDS(BIT_SIZE));
622 cfContext->p_qy = NULL;
623 }
624 if(cfContext->p_buf != NULL)
625 {
626 Cy_Cryptolite_Vu_clr(cfContext->p_buf, VU_BITS_TO_WORDS(BIT_SIZE+1U));
627 cfContext->p_buf = NULL;
628 }
629 return CY_CRYPTOLITE_SUCCESS;
630 }
631
632 #if defined(CY_CRYPTOLITE_CFG_ECDSA_SIGN_C)
633 /*******************************************************************************
634 * Function Name: Cy_Cryptolite_ECC_SignHash
635 ****************************************************************************//*
636 *
637 * Function to generate an ECC signature.
638 * key, hash and messageKey must be in little endian.
639 * Cy_Cryptolite_InvertEndianness() function is used for converting the endianness.
640 *
641 * \param base
642 * The pointer to a Cryptolite instance.
643 *
644 * \param cfContext
645 * The pointer to the cy_stc_cryptolite_context_ecdsa_t.
646 *
647 * \param hash
648 * The hash (message digest) to be signed.
649 *
650 * \param hashlen
651 * The length of the hash (octets).
652 *
653 * \param sig
654 * The pointer to the buffer to store the generated signature 'R' followed by 'S'.
655 *
656 * \param key
657 * The private ECC key to sign the hash. See \ref cy_stc_cryptolite_ecc_key.
658 *
659 * \param messageKey
660 * The random number for generating the signature.
661 *
662 * \return status code. See \ref cy_en_cryptolite_status_t.
663 *
664 *******************************************************************************/
Cy_Cryptolite_ECC_SignHash(CRYPTOLITE_Type * base,cy_stc_cryptolite_context_ecdsa_t * cfContext,const uint8_t * hash,uint32_t hashlen,uint8_t * sig,const cy_stc_cryptolite_ecc_key * key,const uint8_t * messageKey)665 cy_en_cryptolite_status_t Cy_Cryptolite_ECC_SignHash(CRYPTOLITE_Type *base,
666 cy_stc_cryptolite_context_ecdsa_t *cfContext, const uint8_t *hash, uint32_t hashlen, uint8_t *sig,
667 const cy_stc_cryptolite_ecc_key *key, const uint8_t *messageKey)
668 {
669 cy_en_cryptolite_status_t result = CY_CRYPTOLITE_BAD_PARAMS;
670 const cy_stc_cryptolite_ecc_dp_type *eccDp;
671
672 /* NULL parameters checking */
673 if ((base != NULL) && (sig != NULL) && (hash != NULL) && (0u != hashlen) && (key != NULL) && (messageKey != NULL))
674 {
675 cy_stc_cryptolite_descr_t *vu_struct0 = &cfContext->vu_desptr[0];
676 cy_stc_cryptolite_descr_t *vu_struct1 = &cfContext->vu_desptr[1];
677
678 result = CY_CRYPTOLITE_NOT_SUPPORTED;
679 eccDp = Cy_Cryptolite_ECC_GetCurveParams(key->curveID);
680
681 if (eccDp != NULL)
682 {
683 uint8_t *p_r = cfContext->p_r;
684 uint8_t *p_s = cfContext->p_s;
685 uint8_t *p_u1 = cfContext->p_u1;
686 uint8_t *p_u2 = cfContext->p_u2;
687 uint8_t *my_P = cfContext->my_P;
688 uint8_t *my_BARRETT_U = cfContext->my_BARRETT_U;
689 uint32_t bytesize = VU_BITS_TO_BYTES(eccDp->size);
690 uint32_t bitsize = eccDp->size;
691 CY_ALIGN(4) uint8_t temp[VU_BITS_TO_BYTES(VU_TEST_EQUAL_LESS_SIZE+1U)]={0};
692 cy_stc_cryptolite_ecc_key publicKey;
693 uint8_t pubkey[128];
694
695 publicKey.pubkey.x = pubkey;
696 publicKey.pubkey.y = &pubkey[bytesize];
697
698 //Generate the public key
699 result = Cy_Cryptolite_ECC_MakePublicKey(base, cfContext, key->curveID, //(x1, y1) = k * G.
700 messageKey, &publicKey);
701
702 if(CY_CRYPTOLITE_SUCCESS != result)
703 {
704 return result;
705 }
706
707 // load prime, order and barrett coefficient
708 Cy_Cryptolite_Setnumber(my_P, (uint8_t *) eccDp->order, bytesize);
709 Cy_Cryptolite_Setnumber(my_BARRETT_U, (uint8_t *) eccDp->barrett_o, VU_BITS_TO_BYTES(bitsize+1U));
710
711 Cy_Cryptolite_Setnumber(p_r, (uint8_t *)publicKey.pubkey.x, bytesize);
712
713 if (Cy_Cryptolite_Vu_test_zero(base, vu_struct0, p_r, (uint16_t)bitsize) == true)
714 {
715 return CY_CRYPTOLITE_BAD_PARAMS;
716 }
717
718 // Setting the R component of the signature // r = x1
719 if (Cy_Cryptolite_Vu_test_less_than(base, vu_struct1, p_r, my_P, (uint16_t)bitsize) == false)
720 {
721 (void)Cy_Cryptolite_Vu_mov_hw (base, vu_struct0, temp, VU_BITS_TO_WORDS(bitsize+1U), p_r, VU_BITS_TO_WORDS(bitsize));
722 Cy_Cryptolite_EC_Bar_MulRed( base, cfContext, p_r, temp, bitsize);
723 if (Cy_Cryptolite_Vu_test_zero(base, vu_struct0, p_r, (uint16_t)bitsize) == true)
724 {
725 return CY_CRYPTOLITE_BAD_PARAMS;
726 }
727 Cy_Cryptolite_Setnumber(sig, (uint8_t *)p_r, bytesize);
728 }
729 else
730 {
731 Cy_Cryptolite_Setnumber(sig, (uint8_t *)publicKey.pubkey.x, bytesize);
732 }
733
734 // d*r mod n
735 Cy_Cryptolite_Setnumber(p_u2, (uint8_t *)key->k, bytesize);
736 Cy_Cryptolite_EC_MulMod(base, cfContext, p_s, p_u2, p_r, (int)bitsize);
737
738 // load message hash, truncate it if needed
739 Cy_Cryptolite_Vu_wait_hw(base);
740 Cy_Cryptolite_Vu_clr(p_u1, VU_BITS_TO_WORDS(bitsize));
741 if (hashlen * 8U > bitsize)
742 {
743 Cy_Cryptolite_Setnumber(p_u1, (uint8_t *)(&hash[hashlen - CY_CRYPTOLITE_BYTE_SIZE_OF_BITS(bitsize)]), CY_CRYPTOLITE_BYTE_SIZE_OF_BITS(bitsize));
744 }
745 else
746 {
747 Cy_Cryptolite_Setnumber(p_u1, (uint8_t *)hash, hashlen);
748 }
749
750 // e + d*r mod n
751 Cy_Cryptolite_EC_AddMod (base, cfContext, p_s, p_u1, p_s);
752
753 // z = a / b % mod
754 Cy_Cryptolite_Vu_wait_hw(base);
755 (void)Cy_Cryptolite_Vu_mov_hw (base, vu_struct0, temp, VU_BITS_TO_WORDS(bitsize+1U), p_s, VU_BITS_TO_WORDS(bitsize));
756
757 Cy_Cryptolite_Setnumber(p_u1, (uint8_t *)messageKey, bytesize);
758
759 // (e + d*r)/k mod n
760 Cy_Cryptolite_EC_DivMod(base, cfContext, p_s, temp, p_u1, (int)bitsize);
761
762 if (Cy_Cryptolite_Vu_test_zero(base, vu_struct0, p_s, (uint16_t)bitsize) == true)
763 {
764 return CY_CRYPTOLITE_BAD_PARAMS;
765 }
766
767 Cy_Cryptolite_Setnumber(&sig[bytesize], (uint8_t *)p_s, bytesize);
768 result = CY_CRYPTOLITE_SUCCESS;
769 }
770 }
771
772 return result;
773 }
774 #endif
775
776 #if defined(CY_CRYPTOLITE_CFG_ECDSA_VERIFY_C)
777 /*******************************************************************************
778 * Function Name: Cy_Cryptolite_Core_ECC_VerifyHash
779 ****************************************************************************//*
780 *
781 * Verify an ECC signature.
782 * sig, hash and key must be in little endian.
783 * Cy_Cryptolite_InvertEndianness() function is used for converting the endianness.
784 *
785 * \param base
786 * The pointer to a Cryptolite instance.
787 *
788 * \param cfContext
789 * The pointer to the cy_stc_cryptolite_context_ecdsa_t.
790 *
791 * \param sig
792 * The signature to verify, 'R' followed by 'S'.
793 *
794 * \param siglen
795 * The length of signature.
796 *
797 * \param hash
798 * The hash (message digest) that was signed.
799 *
800 * \param hashlen
801 * The length of the hash (octets).
802 *
803 * \param stat
804 * Result of signature, 0xAAAAAAAA = invalid, 0x55555555 = valid.
805 *
806 * \param key
807 * The corresponding public ECC key. See \ref cy_stc_cryptolite_ecc_key.
808 *
809 * \return status code. See \ref cy_en_cryptolite_status_t.
810 *
811 *******************************************************************************/
Cy_Cryptolite_ECC_VerifyHash(CRYPTOLITE_Type * base,cy_stc_cryptolite_context_ecdsa_t * cfContext,const uint8_t * sig,uint32_t siglen,const uint8_t * hash,uint32_t hashlen,cy_en_cryptolite_sig_verify_result_t * stat,const cy_stc_cryptolite_ecc_key * key)812 cy_en_cryptolite_status_t Cy_Cryptolite_ECC_VerifyHash(CRYPTOLITE_Type *base,
813 cy_stc_cryptolite_context_ecdsa_t *cfContext,
814 const uint8_t *sig, uint32_t siglen, const uint8_t *hash, uint32_t hashlen,
815 cy_en_cryptolite_sig_verify_result_t *stat, const cy_stc_cryptolite_ecc_key *key)
816 {
817
818 cy_en_cryptolite_status_t result = CY_CRYPTOLITE_BAD_PARAMS;
819 const cy_stc_cryptolite_ecc_dp_type *eccDp;
820 (void)siglen;
821
822
823 /* NULL parameters checking */
824 if ((sig != NULL) && (hash != NULL) && (0u != hashlen) && (stat != NULL) && (key != NULL) && (cfContext != NULL))
825 {
826 cy_stc_cryptolite_descr_t *vu_struct0 = &cfContext->vu_desptr[0];
827 cy_stc_cryptolite_descr_t *vu_struct1 = &cfContext->vu_desptr[1];
828
829 result = CY_CRYPTOLITE_NOT_SUPPORTED;
830 eccDp = Cy_Cryptolite_ECC_GetCurveParams(key->curveID);
831
832 if (eccDp != NULL)
833 {
834 uint8_t *dividend = cfContext->dividend;
835 uint8_t *p_r = cfContext->p_r;
836 uint8_t *p_s = cfContext->p_s;
837 uint8_t *p_u1 = cfContext->p_u1;
838 uint8_t *p_u2 = cfContext->p_u2;
839 uint8_t *p_o = cfContext->p_o;
840 uint8_t *p_gx = cfContext->p_gx;
841 uint8_t *p_gy = cfContext->p_gy;
842 uint8_t *p_qx = cfContext->p_qx;
843 uint8_t *p_qy = cfContext->p_qy;
844 uint8_t *my_P = cfContext->my_P;
845 uint8_t *my_BARRETT_U = cfContext->my_BARRETT_U;
846
847 uint32_t bitsize = eccDp->size;
848 uint32_t bytesize = VU_BITS_TO_BYTES(eccDp->size);
849 bool isHashZero = false;
850
851 *stat = CY_CRYPTOLITE_SIG_INVALID;
852 cfContext->bitsize = bitsize;
853 /* load values needed for reduction modulo order of the base point */
854 Cy_Cryptolite_Setnumber (my_P, (uint8_t *)eccDp->order, VU_BITS_TO_BYTES(bitsize));
855 Cy_Cryptolite_Setnumber (my_BARRETT_U, (uint8_t *)eccDp->barrett_o, VU_BITS_TO_BYTES(bitsize+1U));
856
857 /* check that R and S are within the valid range, i.e. 0 < R < n and 0 < S < n */
858 Cy_Cryptolite_Setnumber(p_r, (uint8_t *)sig, bytesize);
859 Cy_Cryptolite_Setnumber(p_s, (uint8_t *)&sig[VU_BITS_TO_BYTES(bitsize)], bytesize);
860
861 if (Cy_Cryptolite_Vu_test_zero(base, vu_struct0, p_r, (uint16_t)bitsize) == true) {
862 return CY_CRYPTOLITE_BAD_PARAMS;
863 }
864 if (Cy_Cryptolite_Vu_test_less_than(base, vu_struct1, p_r, my_P, (uint16_t)bitsize) == false) {
865 return CY_CRYPTOLITE_BAD_PARAMS;
866 }
867 if (Cy_Cryptolite_Vu_test_zero(base, vu_struct0, p_s, (uint16_t)bitsize) == true) {
868 return CY_CRYPTOLITE_BAD_PARAMS;
869 }
870 if (Cy_Cryptolite_Vu_test_less_than(base, vu_struct1, p_s, my_P, (uint16_t)bitsize) == false) {
871 return CY_CRYPTOLITE_BAD_PARAMS;
872 }
873 // load message hash, truncate it if needed
874 Cy_Cryptolite_Vu_wait_hw(base);
875 Cy_Cryptolite_Vu_clr(p_u1, VU_BITS_TO_WORDS(bitsize));
876 if (hashlen * 8U > bitsize)
877 {
878 Cy_Cryptolite_Setnumber(p_u1, (uint8_t *)(&hash[hashlen - CY_CRYPTOLITE_BYTE_SIZE_OF_BITS(bitsize)]), CY_CRYPTOLITE_BYTE_SIZE_OF_BITS(bitsize));
879 }
880 else
881 {
882 Cy_Cryptolite_Setnumber(p_u1, (uint8_t *)hash, hashlen);
883 }
884 /* Check if message hash is zero */
885 if(Cy_Cryptolite_Vu_test_zero(base, vu_struct1, p_u1, (uint16_t)bitsize))
886 {
887 isHashZero = true;
888 }
889 // w = s^-1 mod n
890 Cy_Cryptolite_Vu_wait_hw(base);
891 Cy_Cryptolite_Vu_clr(dividend, VU_BITS_TO_WORDS(bitsize));
892 Cy_Cryptolite_Vu_set_bit(dividend, 0);
893
894 Cy_Cryptolite_EC_DivMod(base, cfContext, p_s, dividend, p_s, (int)bitsize);
895
896 // u1 = e*w mod n
897 Cy_Cryptolite_EC_MulMod(base, cfContext, p_u1, p_u1, p_s, (int)bitsize);
898 // u2 = r*w mod n
899 Cy_Cryptolite_EC_MulMod(base, cfContext, p_u2, p_r, p_s, (int)bitsize);
900
901 //-----------------------------------------------------------------------------
902 // Initialize point multiplication
903 //
904 // load prime, order and barrett coefficient
905 Cy_Cryptolite_Setnumber(my_P, (uint8_t *) eccDp->prime, bytesize);
906 Cy_Cryptolite_Setnumber(p_o, (uint8_t *) eccDp->order, bytesize);
907 Cy_Cryptolite_Setnumber(my_BARRETT_U, (uint8_t *) eccDp->barrett_p, VU_BITS_TO_BYTES(bitsize+1U));
908 // load base Point G
909 Cy_Cryptolite_Setnumber(p_gx, (uint8_t *) eccDp->Gx, bytesize);
910 Cy_Cryptolite_Setnumber(p_gy, (uint8_t *) eccDp->Gy, bytesize);
911 // load public key Qa
912 Cy_Cryptolite_Setnumber(p_qx, (uint8_t *)key->pubkey.x, bytesize);
913 Cy_Cryptolite_Setnumber(p_qy, (uint8_t *)key->pubkey.y, bytesize);
914 // u1 * G
915 if(!isHashZero)
916 {
917 Cy_Cryptolite_EC_NistP_PointMul(base, cfContext, p_gx, p_gy, p_u1, p_o, (int)bitsize);
918 }
919
920 // reload order since p_o is modified by Crypto_EC_JacobianEcScalarMul_coZ (!!!!)
921 Cy_Cryptolite_Setnumber(p_o, (uint8_t *) eccDp->order, bytesize);
922
923 // u2 * Qa
924 Cy_Cryptolite_EC_NistP_PointMul(base, cfContext, p_qx, p_qy, p_u2, p_o, (int)bitsize);
925
926 //-----------------------------------------------------------------------------
927 // P = u1 * G + u2 * Qa. Only Px is needed
928
929 if(isHashZero)
930 {
931 /* GECC 3.22 */
932 Cy_Cryptolite_Setnumber(p_s, p_qx, bytesize);
933 }
934 else
935 {
936 Cy_Cryptolite_EC_SubMod(base, cfContext, dividend, p_qy, p_gy); // (y2-y1)
937 Cy_Cryptolite_EC_SubMod(base, cfContext, p_s, p_qx, p_gx); // (x2-x1)
938 Cy_Cryptolite_EC_DivMod(base, cfContext, p_s, dividend, p_s, (int)bitsize); // s = (y2-y1)/(x2-x1)
939
940 Cy_Cryptolite_EC_SquareMod(base, cfContext, p_s, p_s, (int)bitsize); // s^2
941 Cy_Cryptolite_EC_SubMod(base, cfContext, p_s, p_s, p_gx); // s^2 - x1
942 Cy_Cryptolite_EC_SubMod(base, cfContext, p_s, p_s, p_qx); // s^2 - x1 - x2 which is Px mod n
943 }
944
945 if (Cy_Cryptolite_Vu_test_equal(base, vu_struct0, p_s, p_r, (uint16_t)bitsize))
946 {
947 *stat = CY_CRYPTOLITE_SIG_VALID;
948 }
949 else
950 {
951 *stat = CY_CRYPTOLITE_SIG_INVALID;
952 }
953
954 result = CY_CRYPTOLITE_SUCCESS;
955 }
956 }
957 return result;
958 }
959 #endif
960
961 #endif /*#if (CY_CRYPTOLITE_CFG_ECDSA_C)*/
962 #endif /* #if (CPUSS_CRYPTOLITE_VU == 1) */
963
964 #if defined(__cplusplus)
965 }
966 #endif
967
968 #endif /* CY_IP_MXCRYPTOLITE */
969