1 /***************************************************************************//**
2 * \file cy_crypto_core_ecc_domain_params.c
3 * \version 2.120
4 *
5 * \brief
6 *  This file provides constant and parameters for the API for the ECC
7 *  in the Crypto driver.
8 *
9 ********************************************************************************
10 * \copyright
11 * Copyright (c) (2020-2022), Cypress Semiconductor Corporation (an Infineon company) or
12 * an affiliate of Cypress Semiconductor Corporation.
13 * SPDX-License-Identifier: Apache-2.0
14 *
15 * Licensed under the Apache License, Version 2.0 (the "License");
16 * you may not use this file except in compliance with the License.
17 * You may obtain a copy of the License at
18 *
19 *    http://www.apache.org/licenses/LICENSE-2.0
20 *
21 * Unless required by applicable law or agreed to in writing, software
22 * distributed under the License is distributed on an "AS IS" BASIS,
23 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
24 * See the License for the specific language governing permissions and
25 * limitations under the License.
26 *******************************************************************************/
27 
28 #include "cy_device.h"
29 
30 #if defined (CY_IP_MXCRYPTO)
31 
32 #include "cy_crypto_core_ecc.h"
33 
34 #if defined(__cplusplus)
35 extern "C" {
36 #endif
37 
38 #if defined (CY_CRYPTO_CFG_ECP_C)
39 
40 /*******************************************************************************
41 * Function Name: Cy_Crypto_Core_EDW_GetCurveParams
42 ****************************************************************************//**
43 *
44 * Get edward's curve domain parameters.
45 *
46 * \param curveId
47 * See \ref cy_en_crypto_ecc_curve_id_t.
48 *
49 * \param cy_stc_crypto_edw_dp_type
50 * Pointer to curve domain parameters. See \ref cy_stc_crypto_edw_dp_type.
51 *
52 * \return status code. See \ref cy_en_crypto_status_t.
53 *
54 *******************************************************************************/
Cy_Crypto_Core_EDW_GetCurveParams(cy_stc_crypto_edw_dp_type * dp,cy_en_crypto_ecc_curve_id_t curveId)55 cy_en_crypto_status_t Cy_Crypto_Core_EDW_GetCurveParams(cy_stc_crypto_edw_dp_type *dp, cy_en_crypto_ecc_curve_id_t curveId)
56 {
57 #if defined(CY_CRYPTO_CFG_ECP_DP_ED25519_ENABLED)
58     /* ED25519 CURVE PARAMETERS */
59     /* prime: "2^255 - 19" */
60     /* prime: "7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED" */
61     CY_ALIGN(4) static const uint8_t  ed25519Prime[CY_CRYPTO_ECC_ED25519_BYTE_SIZE] =
62     {
63         0xedu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
64         0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
65         0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
66         0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0x7fu
67     };
68     /*A: "7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC" */
69     CY_ALIGN(4) static const uint8_t  ed25519A[CY_CRYPTO_ECC_ED25519_BYTE_SIZE] =
70     {
71         0xecu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
72         0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
73         0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
74         0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0x7fu
75     };
76     /*D: "52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3" */
77     CY_ALIGN(4) static const uint8_t  ed25519D[CY_CRYPTO_ECC_ED25519_BYTE_SIZE] =
78     {
79         0xa3u, 0x78u, 0x59u, 0x13u, 0xcau, 0x4du, 0xebu, 0x75u,
80         0xabu, 0xd8u, 0x41u, 0x41u, 0x4du, 0x0au, 0x70u, 0x00u,
81         0x98u, 0xe8u, 0x79u, 0x77u, 0x79u, 0x40u, 0xc7u, 0x8cu,
82         0x73u, 0xfeu, 0x6fu, 0x2bu, 0xeeu, 0x6cu, 0x03u, 0x52u
83     };
84 
85     /* order: "2^252 + 0x14def9dea2f79cd65812631a5cf5d3ed" */
86     /* order: "1000000000000000000000000000000014DEF9DEA2F79CD65812631A5CF5D3ED" */
87     CY_ALIGN(4) static const uint8_t  ed25519Order[CY_CRYPTO_ECC_ED25519_BYTE_SIZE] =
88     {
89         0xedu, 0xd3u, 0xf5u, 0x5cu, 0x1au, 0x63u, 0x12u, 0x58u,
90         0xd6u, 0x9cu, 0xf7u, 0xa2u, 0xdeu, 0xf9u, 0xdeu, 0x14u,
91         0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
92         0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x10u
93     };
94     /* barrett_p: "2000000000000000000000000000000000000000000000000000000000000004C" */
95     CY_ALIGN(4) static const uint8_t  ed25519PrimeBarrett[CY_CRYPTO_ECC_ED25519_BYTE_SIZE + 1u] =
96     {  /* pre-calculated! */
97         0x4cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
98         0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
99         0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
100         0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
101         0x02u,
102     };
103     /* barrett_o: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB2106215D086329A7ED9CE5A30A2C131B" */
104     CY_ALIGN(4) static const uint8_t  ed25519OrderBarrett[CY_CRYPTO_ECC_ED25519_BYTE_SIZE + 1u] =
105     {   /* pre-calculated */
106         0x1bu, 0x13u, 0x2cu, 0x0au, 0xa3u, 0xe5u, 0x9cu, 0xedu,
107         0xa7u, 0x29u, 0x63u, 0x08u, 0x5du, 0x21u, 0x06u, 0x21u,
108         0xebu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
109         0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
110         0x0fu,
111     };
112     /*(X(P),Y(P)) of edwards25519 in RFC7748*/
113     /* base point x: "151122213495354007725011514095885315114540126930418572060461132
114       83949847762202" */
115     CY_ALIGN(4) static const uint8_t  ed25519BasePointX[CY_CRYPTO_ECC_ED25519_BYTE_SIZE] =
116     {
117         0x1au, 0xd5u, 0x25u, 0x8fu, 0x60u, 0x2du, 0x56u, 0xc9u,
118         0xb2u, 0xa7u, 0x25u, 0x95u, 0x60u, 0xc7u, 0x2cu, 0x69u,
119         0x5cu, 0xdcu, 0xd6u, 0xfdu, 0x31u, 0xe2u, 0xa4u, 0xc0u,
120         0xfeu, 0x53u, 0x6eu, 0xcdu, 0xd3u, 0x36u, 0x69u, 0x21u,
121     };
122 
123     /* base point y: "463168356949264781694283940034751631413079938662562256157830336
124       03165251855960" */
125     CY_ALIGN(4) static const uint8_t  ed25519BasePointY[CY_CRYPTO_ECC_ED25519_BYTE_SIZE] =
126     {
127         0x58u, 0x66u, 0x66u, 0x66u, 0x66u, 0x66u, 0x66u, 0x66u,
128         0x66u, 0x66u, 0x66u, 0x66u, 0x66u, 0x66u, 0x66u, 0x66u,
129         0x66u, 0x66u, 0x66u, 0x66u, 0x66u, 0x66u, 0x66u, 0x66u,
130         0x66u, 0x66u, 0x66u, 0x66u, 0x66u, 0x66u, 0x66u, 0x66u,
131     };
132 
133     if (curveId == CY_CRYPTO_ECC_ECP_ED25519)
134     {
135         dp->id          = CY_CRYPTO_ECC_ECP_ED25519;
136         dp->size        = CY_CRYPTO_ECC_ED25519_SIZE;
137         dp->name        = "Edward's ED25519";
138         dp->algo        = CY_CRYPTO_NIST_P_BARRETT_RED_ALG;
139         dp->prime       = ed25519Prime;
140         dp->barrett_p   = ed25519PrimeBarrett;
141         dp->order       = ed25519Order;
142         dp->barrett_o   = ed25519OrderBarrett;
143         dp->d           = ed25519D;
144         dp->a           = ed25519A;
145         dp->Gx          = ed25519BasePointX;
146         dp->Gy          = ed25519BasePointY;
147         dp->barret_osize = 260;                     /* barret_o = (2^512(513 bits)/ed25519Order(253 bits) */
148         dp->barret_psize = 258;                     /* barret_p = (2^512(513 bits)/ed25519Prime(255 bits) */
149 
150         return CY_CRYPTO_SUCCESS;
151     }
152 #endif /* defined(CY_CRYPTO_CFG_ECP_DP_ED25519_ENABLED) */
153 
154     return CY_CRYPTO_NOT_SUPPORTED;
155 }
156 
157 
158 
159 
160 /*******************************************************************************
161 * Function Name: Cy_Crypto_Core_ECC_GetCurveParams
162 ****************************************************************************//**
163 *
164 * Get curve domain parameters if this curve is supported.
165 *
166 * \param curveId
167 * See \ref cy_en_crypto_ecc_curve_id_t.
168 *
169 * \return
170 * Pointer to curve domain parameters. See \ref cy_stc_crypto_ecc_dp_type.
171 *
172 *******************************************************************************/
Cy_Crypto_Core_ECC_GetCurveParams(cy_en_crypto_ecc_curve_id_t curveId)173 cy_stc_crypto_ecc_dp_type *Cy_Crypto_Core_ECC_GetCurveParams(cy_en_crypto_ecc_curve_id_t curveId)
174 {
175 #if defined(CY_CRYPTO_CFG_ECP_DP_SECP192R1_ENABLED)
176     /* P192 CURVE PARAMETERS */
177     CY_ALIGN(4) static const uint8_t  eccP192Polynomial[CY_CRYPTO_ECC_P192_BYTE_SIZE] =
178     {
179        0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
180        0xfeu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
181        0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
182     };
183 
184     CY_ALIGN(4) static const uint8_t  eccP192PolyBarrett[CY_CRYPTO_ECC_P192_BYTE_SIZE + 1u] =
185     {  /* pre-calculated */
186        0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
187        0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
188        0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
189        0x01u
190     };
191     CY_ALIGN(4) static const uint8_t  eccP192Order[CY_CRYPTO_ECC_P192_BYTE_SIZE] =
192     {
193         0x31u, 0x28u, 0xD2u, 0xB4u, 0xB1u, 0xC9u, 0x6Bu, 0x14u,
194         0x36u, 0xF8u, 0xDEu, 0x99u, 0xffu, 0xffu, 0xffu, 0xffu,
195         0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu
196     };
197 
198     /* barrett_o: "1000000000000000000000000662107c9eb94364e4b2dd7cf" */
199     CY_ALIGN(4) static const uint8_t  eccP192OrderBarrett[CY_CRYPTO_ECC_P192_BYTE_SIZE + 1u] =
200     {   /* pre-calculated */
201         0xcfu, 0xd7u, 0x2du, 0x4bu, 0x4eu, 0x36u, 0x94u, 0xebu,
202         0xc9u, 0x07u, 0x21u, 0x66u, 0x00u, 0x00u, 0x00u, 0x00u,
203         0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
204         0x01u
205     };
206 
207     /* base point x: "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012" */
208     CY_ALIGN(4) static const uint8_t  eccP192BasePointX[CY_CRYPTO_ECC_P192_BYTE_SIZE] =
209     {
210         0x12u, 0x10u, 0xffu, 0x82u, 0xfdu, 0x0au, 0xffu, 0xf4u,
211         0x00u, 0x88u, 0xa1u, 0x43u, 0xebu, 0x20u, 0xbfu, 0x7cu,
212         0xf6u, 0x90u, 0x30u, 0xb0u, 0x0eu, 0xa8u, 0x8du, 0x18u
213     };
214 
215     /* base point y: "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811" */
216     CY_ALIGN(4) static const uint8_t  eccP192BasePointY[CY_CRYPTO_ECC_P192_BYTE_SIZE] =
217     {
218         0x11u, 0x48u, 0x79u, 0x1eu, 0xa1u, 0x77u, 0xf9u, 0x73u,
219         0xd5u, 0xcdu, 0x24u, 0x6bu, 0xedu, 0x11u, 0x10u, 0x63u,
220         0x78u, 0xdau, 0xc8u, 0xffu, 0x95u, 0x2bu, 0x19u, 0x07u
221     };
222 #endif /* defined(CY_CRYPTO_CFG_ECP_DP_SECP192R1_ENABLED) */
223 
224 #if defined(CY_CRYPTO_CFG_ECP_DP_SECP224R1_ENABLED)
225     /* P224 CURVE PARAMETERS */
226     CY_ALIGN(4) static const uint8_t  eccP224Polynomial[CY_CRYPTO_ECC_P224_BYTE_SIZE] =
227     {
228        0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
229        0x00u, 0x00u, 0x00u, 0x00u, 0xffu, 0xffu, 0xffu, 0xffu,
230        0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
231        0xffu, 0xffu, 0xffu, 0xffu
232     };
233 
234     CY_ALIGN(4) static const uint8_t  eccP224PolyBarrett[CY_CRYPTO_ECC_P224_BYTE_SIZE + 1u] =
235     {  /* pre-calculated */
236        0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
237        0xffu, 0xffu, 0xffu, 0xffu, 0x00u, 0x00u, 0x00u, 0x00u,
238        0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
239        0x00u, 0x00u, 0x00u, 0x00u, 0x01u
240     };
241 
242     CY_ALIGN(4) static const uint8_t  eccP224Order[CY_CRYPTO_ECC_P224_BYTE_SIZE] =
243     {
244         0x3Du, 0x2Au, 0x5Cu, 0x5Cu, 0x45u, 0x29u, 0xDDu, 0x13u,
245         0x3Eu, 0xF0u, 0xB8u, 0xE0u, 0xA2u, 0x16u, 0xffu, 0xffu,
246         0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
247         0xffu, 0xffu, 0xffu, 0xffu
248     };
249     /* barrett_o: "10000000000000000000000000000e95d1f470fc1ec22d6baa3a3d5c3" */
250     CY_ALIGN(4) static const uint8_t  eccP224OrderBarrett[CY_CRYPTO_ECC_P224_BYTE_SIZE + 1u] =
251     {   /* pre-calculated */
252         0xc3u, 0xd5u, 0xa3u, 0xa3u, 0xbau, 0xd6u, 0x22u, 0xecu,
253         0xc1u, 0x0fu, 0x47u, 0x1fu, 0x5du, 0xe9u, 0x00u, 0x00u,
254         0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
255         0x00u, 0x00u, 0x00u, 0x00u, 0x01u
256     };
257 
258     /* Gx - base point x: "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21" */
259     CY_ALIGN(4) static const uint8_t  eccP224BasePointX[CY_CRYPTO_ECC_P224_BYTE_SIZE] =
260     {
261         0x21u, 0x1du, 0x5cu, 0x11u, 0xd6u, 0x80u, 0x32u, 0x34u,
262         0x22u, 0x11u, 0xc2u, 0x56u, 0xd3u, 0xc1u, 0x03u, 0x4au,
263         0xb9u, 0x90u, 0x13u, 0x32u, 0x7fu, 0xbfu, 0xb4u, 0x6bu,
264         0xbdu, 0x0cu, 0x0eu, 0xb7u
265     };
266 
267     /* Gy - base point y: "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34" */
268     CY_ALIGN(4) static const uint8_t  eccP224BasePointY[CY_CRYPTO_ECC_P224_BYTE_SIZE] =
269     {
270         0x34u, 0x7eu, 0x00u, 0x85u, 0x99u, 0x81u, 0xd5u, 0x44u,
271         0x64u, 0x47u, 0x07u, 0x5au, 0xa0u, 0x75u, 0x43u, 0xcdu,
272         0xe6u, 0xdfu, 0x22u, 0x4cu, 0xfbu, 0x23u, 0xf7u, 0xb5u,
273         0x88u, 0x63u, 0x37u, 0xbdu
274     };
275 #endif /* defined(CY_CRYPTO_CFG_ECP_DP_SECP224R1_ENABLED) */
276 
277 
278 #if defined(CY_CRYPTO_CFG_ECP_DP_SECP256R1_ENABLED)
279     /* P256 CURVE PARAMETERS */
280     /* prime: "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF" */
281     CY_ALIGN(4) static const uint8_t  eccP256Polynomial[CY_CRYPTO_ECC_P256_BYTE_SIZE] =
282     {
283        0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
284        0xffu, 0xffu, 0xffu, 0xffu, 0x00u, 0x00u, 0x00u, 0x00u,
285        0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
286        0x01u, 0x00u, 0x00u, 0x00u, 0xffu, 0xffu, 0xffu, 0xffu
287     };
288 
289     /* barrett_p: "100000000fffffffffffffffefffffffefffffffeffffffff0000000000000003" */
290     CY_ALIGN(4) static const uint8_t  eccP256PolyBarrett[CY_CRYPTO_ECC_P256_BYTE_SIZE + 1u] =
291     {  /* pre-calculated! */
292        0x03u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
293        0xffu, 0xffu, 0xffu, 0xffu, 0xfeu, 0xffu, 0xffu, 0xffu,
294        0xfeu, 0xffu, 0xffu, 0xffu, 0xfeu, 0xffu, 0xffu, 0xffu,
295        0xffu, 0xffu, 0xffu, 0xffu, 0x00u, 0x00u, 0x00u, 0x00u,
296        0x01u
297     };
298 
299     /* order: "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551" */
300     CY_ALIGN(4) static const uint8_t  eccP256Order[CY_CRYPTO_ECC_P256_BYTE_SIZE] =
301     {
302         0x51u, 0x25u, 0x63u, 0xfcu, 0xc2u, 0xcau, 0xb9u, 0xf3u,
303         0x84u, 0x9eu, 0x17u, 0xa7u, 0xadu, 0xfau, 0xe6u, 0xbcu,
304         0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
305         0x00u, 0x00u, 0x00u, 0x00u, 0xffu, 0xffu, 0xffu, 0xffu
306     };
307 
308     /* barrett_o: 100000000fffffffffffffffeffffffff43190552df1a6c21012ffd85eedf9bfe" */
309     CY_ALIGN(4) static const uint8_t  eccP256OrderBarrett[CY_CRYPTO_ECC_P256_BYTE_SIZE + 1u] =
310     {   /* pre-calculated */
311         0xfeu, 0x9bu, 0xdfu, 0xeeu, 0x85u, 0xfdu, 0x2fu, 0x01u,
312         0x21u, 0x6cu, 0x1au, 0xdfu, 0x52u, 0x05u, 0x19u, 0x43u,
313         0xffu, 0xffu, 0xffu, 0xffu, 0xfeu, 0xffu, 0xffu, 0xffu,
314         0xffu, 0xffu, 0xffu, 0xffu, 0x00u, 0x00u, 0x00u, 0x00u,
315         0x01u
316     };
317 
318     /* base point x: "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296" */
319     CY_ALIGN(4) static const uint8_t  eccP256BasePointX[CY_CRYPTO_ECC_P256_BYTE_SIZE] =
320     {
321         0x96u, 0xc2u, 0x98u, 0xd8u, 0x45u, 0x39u, 0xa1u, 0xf4u,
322         0xa0u, 0x33u, 0xebu, 0x2du, 0x81u, 0x7du, 0x03u, 0x77u,
323         0xf2u, 0x40u, 0xa4u, 0x63u, 0xe5u, 0xe6u, 0xbcu, 0xf8u,
324         0x47u, 0x42u, 0x2cu, 0xe1u, 0xf2u, 0xd1u, 0x17u, 0x6bu
325     };
326 
327     /* base point y: "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5" */
328     CY_ALIGN(4) static const uint8_t  eccP256BasePointY[CY_CRYPTO_ECC_P256_BYTE_SIZE] =
329     {
330         0xf5u, 0x51u, 0xbfu, 0x37u, 0x68u, 0x40u, 0xb6u, 0xcbu,
331         0xceu, 0x5eu, 0x31u, 0x6bu, 0x57u, 0x33u, 0xceu, 0x2bu,
332         0x16u, 0x9eu, 0x0fu, 0x7cu, 0x4au, 0xebu, 0xe7u, 0x8eu,
333         0x9bu, 0x7fu, 0x1au, 0xfeu, 0xe2u, 0x42u, 0xe3u, 0x4fu,
334     };
335 #endif /* defined(CY_CRYPTO_CFG_ECP_DP_SECP256R1_ENABLED) */
336 
337 #if defined(CY_CRYPTO_CFG_ECP_DP_SECP384R1_ENABLED)
338     /* prime: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF" */
339     CY_ALIGN(4) static const uint8_t  eccP384Polynomial[CY_CRYPTO_ECC_P384_BYTE_SIZE] =
340     {
341         0xffu, 0xffu, 0xffu, 0xffu, 0x00u, 0x00u, 0x00u, 0x00u,
342         0x00u, 0x00u, 0x00u, 0x00u, 0xffu, 0xffu, 0xffu, 0xffu,
343         0xfeu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
344         0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
345         0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
346         0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu
347     };
348 
349     /* barrett_p: "1000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001" */
350     CY_ALIGN(4) static const uint8_t  eccP384PolyBarrett[CY_CRYPTO_ECC_P384_BYTE_SIZE + 1u] =
351     {   /* pre-calculated */
352         0x01u, 0x00u, 0x00u, 0x00u, 0xffu, 0xffu, 0xffu, 0xffu,
353         0xffu, 0xffu, 0xffu, 0xffu, 0x00u, 0x00u, 0x00u, 0x00u,
354         0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
355         0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
356         0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
357         0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
358         0x01u
359     };
360 
361     /* order: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973" */
362     CY_ALIGN(4) static const uint8_t  eccP384Order[CY_CRYPTO_ECC_P384_BYTE_SIZE] =
363     {
364         0x73u, 0x29u, 0xC5u, 0xCCu, 0x6Au, 0x19u, 0xECu, 0xECu,
365         0x7Au, 0xA7u, 0xB0u, 0x48u, 0xB2u, 0x0Du, 0x1Au, 0x58u,
366         0xDFu, 0x2Du, 0x37u, 0xF4u, 0x81u, 0x4Du, 0x63u, 0xC7u,
367         0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
368         0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
369         0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu
370     };
371 
372     /* barrett_o: "1000000000000000000000000000000000000000000000000389cb27e0bc8d220a7e5f24db74f58851313e695333ad68d" */
373     CY_ALIGN(4) static const uint8_t  eccP384OrderBarrett[CY_CRYPTO_ECC_P384_BYTE_SIZE + 1u] =
374     {   /* pre-calculated */
375         0x8du, 0xd6u, 0x3au, 0x33u, 0x95u, 0xe6u, 0x13u, 0x13u,
376         0x85u, 0x58u, 0x4fu, 0xb7u, 0x4du, 0xf2u, 0xe5u, 0xa7u,
377         0x20u, 0xd2u, 0xc8u, 0x0bu, 0x7eu, 0xb2u, 0x9cu, 0x38u,
378         0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
379         0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
380         0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
381         0x01u
382     };
383 
384     /* base point x: "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7" */
385     CY_ALIGN(4) static const uint8_t  eccP384BasePointX[CY_CRYPTO_ECC_P384_BYTE_SIZE] =
386     {
387         0xb7u, 0x0au, 0x76u, 0x72u, 0x38u, 0x5eu, 0x54u, 0x3au,
388         0x6cu, 0x29u, 0x55u, 0xbfu, 0x5du, 0xf2u, 0x02u, 0x55u,
389         0x38u, 0x2au, 0x54u, 0x82u, 0xe0u, 0x41u, 0xf7u, 0x59u,
390         0x98u, 0x9bu, 0xa7u, 0x8bu, 0x62u, 0x3bu, 0x1du, 0x6eu,
391         0x74u, 0xadu, 0x20u, 0xf3u, 0x1eu, 0xc7u, 0xb1u, 0x8eu,
392         0x37u, 0x05u, 0x8bu, 0xbeu, 0x22u, 0xcau, 0x87u, 0xaau
393     };
394 
395     /* base point y: "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F" */
396     CY_ALIGN(4) static const uint8_t  eccP384BasePointY[CY_CRYPTO_ECC_P384_BYTE_SIZE] =
397     {
398         0x5fu, 0x0eu, 0xeau, 0x90u, 0x7cu, 0x1du, 0x43u, 0x7au,
399         0x9du, 0x81u, 0x7eu, 0x1du, 0xceu, 0xb1u, 0x60u, 0x0au,
400         0xc0u, 0xb8u, 0xf0u, 0xb5u, 0x13u, 0x31u, 0xdau, 0xe9u,
401         0x7cu, 0x14u, 0x9au, 0x28u, 0xbdu, 0x1du, 0xf4u, 0xf8u,
402         0x29u, 0xdcu, 0x92u, 0x92u, 0xbfu, 0x98u, 0x9eu, 0x5du,
403         0x6fu, 0x2cu, 0x26u, 0x96u, 0x4au, 0xdeu, 0x17u, 0x36u
404     };
405 #endif /* defined(CY_CRYPTO_CFG_ECP_DP_SECP384R1_ENABLED) */
406 
407 #if defined(CY_CRYPTO_CFG_ECP_DP_SECP521R1_ENABLED)
408     CY_ALIGN(4) static const uint8_t  eccP521Polynomial[CY_CRYPTO_ECC_P521_BYTE_SIZE] =
409     {
410        0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
411        0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
412        0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
413        0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
414        0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
415        0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
416        0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
417        0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
418        0xffu, 0x01u
419     };
420 
421     CY_ALIGN(4) static const uint8_t  eccP521PolyBarrett[CY_CRYPTO_ECC_P521_BYTE_SIZE] =
422     {  /* pre-calculated */
423        0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
424        0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
425        0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
426        0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
427        0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
428        0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
429        0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
430        0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
431        0x00u, 0x02u
432     };
433 
434     CY_ALIGN(4) static const uint8_t  eccP521Order[CY_CRYPTO_ECC_P521_BYTE_SIZE] =
435     {
436         0x09u, 0x64u, 0x38u, 0x91u, 0x1Eu, 0xB7u, 0x6Fu, 0xBBu,
437         0xAEu, 0x47u, 0x9Cu, 0x89u, 0xB8u, 0xC9u, 0xB5u, 0x3Bu,
438         0xD0u, 0xA5u, 0x09u, 0xF7u, 0x48u, 0x01u, 0xCCu, 0x7Fu,
439         0x6Bu, 0x96u, 0x2Fu, 0xBFu, 0x83u, 0x87u, 0x86u, 0x51u,
440         0xFAu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
441         0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
442         0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
443         0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,
444         0xffu, 0x01u
445     };
446 
447     /* barrett_o: "2000000000000000000000000000000000000000000000000000000000000000005ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf7" */
448     CY_ALIGN(4) static const uint8_t  eccP521OrderBarrett[CY_CRYPTO_ECC_P521_BYTE_SIZE] =
449     {   /* pre-calculated */
450         0xf7u, 0x9bu, 0xc7u, 0x6eu, 0xe1u, 0x48u, 0x90u, 0x44u,
451         0x51u, 0xb8u, 0x63u, 0x76u, 0x47u, 0x36u, 0x4au, 0xc4u,
452         0x2fu, 0x5au, 0xf6u, 0x08u, 0xb7u, 0xfeu, 0x33u, 0x80u,
453         0x94u, 0x69u, 0xd0u, 0x40u, 0x7cu, 0x78u, 0x79u, 0xaeu,
454         0x05u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
455         0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
456         0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
457         0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
458         0x00u, 0x02u
459     };
460 
461     /* base point x: "00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66" */
462     CY_ALIGN(4) static const uint8_t  eccP521BasePointX[CY_CRYPTO_ECC_P521_BYTE_SIZE] =
463     {
464         0x66u, 0xbdu, 0xe5u, 0xc2u, 0x31u, 0x7eu, 0x7eu, 0xf9u,
465         0x9bu, 0x42u, 0x6au, 0x85u, 0xc1u, 0xb3u, 0x48u, 0x33u,
466         0xdeu, 0xa8u, 0xffu, 0xa2u, 0x27u, 0xc1u, 0x1du, 0xfeu,
467         0x28u, 0x59u, 0xe7u, 0xefu, 0x77u, 0x5eu, 0x4bu, 0xa1u,
468         0xbau, 0x3du, 0x4du, 0x6bu, 0x60u, 0xafu, 0x28u, 0xf8u,
469         0x21u, 0xb5u, 0x3fu, 0x05u, 0x39u, 0x81u, 0x64u, 0x9cu,
470         0x42u, 0xb4u, 0x95u, 0x23u, 0x66u, 0xcbu, 0x3eu, 0x9eu,
471         0xcdu, 0xe9u, 0x04u, 0x04u, 0xb7u, 0x06u, 0x8eu, 0x85u,
472         0xc6u, 0x00u
473     };
474 
475     /* base point y: "011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650" */
476     CY_ALIGN(4) static const uint8_t  eccP521BasePointY[CY_CRYPTO_ECC_P521_BYTE_SIZE] =
477     {
478         0x50u, 0x66u, 0xd1u, 0x9fu, 0x76u, 0x94u, 0xbeu, 0x88u,
479         0x40u, 0xc2u, 0x72u, 0xa2u, 0x86u, 0x70u, 0x3cu, 0x35u,
480         0x61u, 0x07u, 0xadu, 0x3fu, 0x01u, 0xb9u, 0x50u, 0xc5u,
481         0x40u, 0x26u, 0xf4u, 0x5eu, 0x99u, 0x72u, 0xeeu, 0x97u,
482         0x2cu, 0x66u, 0x3eu, 0x27u, 0x17u, 0xbdu, 0xafu, 0x17u,
483         0x68u, 0x44u, 0x9bu, 0x57u, 0x49u, 0x44u, 0xf5u, 0x98u,
484         0xd9u, 0x1bu, 0x7du, 0x2cu, 0xb4u, 0x5fu, 0x8au, 0x5cu,
485         0x04u, 0xc0u, 0x3bu, 0x9au, 0x78u, 0x6au, 0x29u, 0x39u,
486         0x18u, 0x01u
487     };
488 #endif /* defined(CY_CRYPTO_CFG_ECP_DP_SECP521R1_ENABLED) */
489 
490     static const cy_stc_crypto_ecc_dp_type eccDomainParams[] =
491     {
492         {
493             CY_CRYPTO_ECC_ECP_NONE,
494             0u,
495             NULL,
496             CY_CRYPTO_NIST_P_CURVE_SPECIFIC_RED_ALG,
497             NULL,
498             NULL,
499             NULL,
500             NULL,
501             NULL,
502             NULL
503         }
504         #if defined(CY_CRYPTO_CFG_ECP_DP_SECP192R1_ENABLED)
505         ,
506         {
507             CY_CRYPTO_ECC_ECP_SECP192R1,
508             CY_CRYPTO_ECC_P192_SIZE,
509             "NIST P-192",
510             CY_CRYPTO_NIST_P_CURVE_SPECIFIC_RED_ALG,
511             /* prime: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF" */
512             eccP192Polynomial,
513             /* barrett_p: "1000000000000000000000000000000010000000000000001" */
514             eccP192PolyBarrett,
515             /* order: "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831" */
516             eccP192Order,
517             /* barrett_o: "1000000000000000000000000662107c9eb94364e4b2dd7cf" */
518             eccP192OrderBarrett,
519             /* base point x: "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012" */
520             eccP192BasePointX,
521             /* base point y: "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811" */
522             eccP192BasePointY
523         }
524         #endif /* defined(CY_CRYPTO_CFG_ECP_DP_SECP192R1_ENABLED) */
525         #if defined(CY_CRYPTO_CFG_ECP_DP_SECP224R1_ENABLED)
526         ,
527         {
528             CY_CRYPTO_ECC_ECP_SECP224R1,
529             CY_CRYPTO_ECC_P224_SIZE,
530             "NIST P-224",
531             CY_CRYPTO_NIST_P_CURVE_SPECIFIC_RED_ALG,
532             /* prime: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001" */
533             eccP224Polynomial,
534             /* barrett_p: "100000000000000000000000000000000ffffffffffffffffffffffff" */
535             eccP224PolyBarrett,
536             /* order: "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D" */
537             eccP224Order,
538             /* barrett_o: "10000000000000000000000000000e95d1f470fc1ec22d6baa3a3d5c3" */
539             eccP224OrderBarrett,
540             /* Gx - base point x: "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21" */
541             eccP224BasePointX,
542             /* Gy - base point y: "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34" */
543             eccP224BasePointY
544         }
545         #endif /* defined(CY_CRYPTO_CFG_ECP_DP_SECP224R1_ENABLED) */
546         #if defined(CY_CRYPTO_CFG_ECP_DP_SECP256R1_ENABLED)
547         ,
548         {
549             CY_CRYPTO_ECC_ECP_SECP256R1,
550             CY_CRYPTO_ECC_P256_SIZE,
551             "NIST P-256",
552             CY_CRYPTO_NIST_P_BARRETT_RED_ALG,
553             /* prime: "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF" */
554             eccP256Polynomial,
555             /* barrett_p: "100000000fffffffffffffffefffffffefffffffeffffffff0000000000000003" */
556             eccP256PolyBarrett,
557             /* order: "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551" */
558             eccP256Order,
559             /* barrett_o: "100000000fffffffffffffffeffffffff43190552df1a6c21012ffd85eedf9bfe" */
560             eccP256OrderBarrett,
561             /* Gx - base point x: "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296" */
562             eccP256BasePointX,
563             /* Gy - base point y: "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5" */
564             eccP256BasePointY
565         }
566         #endif /* defined(CY_CRYPTO_CFG_ECP_DP_SECP256R1_ENABLED) */
567         #if defined(CY_CRYPTO_CFG_ECP_DP_SECP384R1_ENABLED)
568         ,
569         {
570             CY_CRYPTO_ECC_ECP_SECP384R1,
571             CY_CRYPTO_ECC_P384_SIZE,
572             "NIST P-384",
573             CY_CRYPTO_NIST_P_BARRETT_RED_ALG,
574             /* prime: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF" */
575             eccP384Polynomial,
576             /* barrett_p: "1000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001" */
577             eccP384PolyBarrett,
578             /* order: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973" */
579             eccP384Order,
580             /* barrett_o: "1000000000000000000000000000000000000000000000000389cb27e0bc8d220a7e5f24db74f58851313e695333ad68d" */
581             eccP384OrderBarrett,
582             /* base point x: "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7" */
583             eccP384BasePointX,
584             /* base point y: "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F" */
585             eccP384BasePointY
586         }
587         #endif /*defined(CY_CRYPTO_CFG_ECP_DP_SECP384R1_ENABLED) */
588         #if defined(CY_CRYPTO_CFG_ECP_DP_SECP521R1_ENABLED)
589         ,
590         {
591             CY_CRYPTO_ECC_ECP_SECP521R1,
592             CY_CRYPTO_ECC_P521_SIZE,
593             "NIST P-521",
594             CY_CRYPTO_NIST_P_CURVE_SPECIFIC_RED_ALG,
595             /* prime: "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" */
596             eccP521Polynomial,
597             /* barrett_p: "20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" */
598             eccP521PolyBarrett,
599             /* order: "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409" */
600             eccP521Order,
601             /* barrett_o: "2000000000000000000000000000000000000000000000000000000000000000005ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf7" */
602             eccP521OrderBarrett,
603             /* base point x: "0C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66" */
604             eccP521BasePointX,
605             /* base point y: "11839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650" */
606             eccP521BasePointY
607         }
608         #endif /* defined(CY_CRYPTO_CFG_ECP_DP_SECP521R1_ENABLED) */
609     };
610 
611     cy_stc_crypto_ecc_dp_type *tmpResult = NULL;
612 
613     if ((curveId > CY_CRYPTO_ECC_ECP_NONE) && (curveId < CY_CRYPTO_ECC_ECP_CURVES_CNT))
614     {
615         tmpResult = (cy_stc_crypto_ecc_dp_type *)&eccDomainParams[curveId];
616     }
617 
618     return tmpResult;
619 }
620 
621 #endif /* defined (CY_CRYPTO_CFG_ECP_C) */
622 
623 #if defined(__cplusplus)
624 }
625 #endif
626 
627 #endif /* CY_IP_MXCRYPTO */
628 
629 
630 /* [] END OF FILE */
631