1 /***************************************************************************
2  * Copyright (c) 2024 Microsoft Corporation
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the MIT License which is available at
6  * https://opensource.org/licenses/MIT.
7  *
8  * SPDX-License-Identifier: MIT
9  **************************************************************************/
10 
11 
12 /**************************************************************************/
13 /**************************************************************************/
14 /**                                                                       */
15 /** NetX Crypto Component                                                 */
16 /**                                                                       */
17 /**   Elliptical Curve Cryptography                                       */
18 /**                                                                       */
19 /**************************************************************************/
20 /**************************************************************************/
21 
22 
23 #include "nx_crypto_ec.h"
24 static NX_CRYPTO_CONST HN_UBASE           secp224r1_fixed_points_data[][28 >> HN_SIZE_SHIFT] =
25 {
26 
27     /* 2G.x */
28     {
29         HN_ULONG_TO_UBASE(0x666EBBE9), HN_ULONG_TO_UBASE(0x5EFD9675),
30         HN_ULONG_TO_UBASE(0x664D40CE), HN_ULONG_TO_UBASE(0x2A43BCA7),
31         HN_ULONG_TO_UBASE(0x42DF8D8A), HN_ULONG_TO_UBASE(0xF99BC522),
32         HN_ULONG_TO_UBASE(0x1F49BBB0)
33     },
34 
35     /* 2G.y */
36     {
37         HN_ULONG_TO_UBASE(0x92DC9C43), HN_ULONG_TO_UBASE(0x6229E0B8),
38         HN_ULONG_TO_UBASE(0x608436E6), HN_ULONG_TO_UBASE(0x10D0ECE8),
39         HN_ULONG_TO_UBASE(0x858F1853), HN_ULONG_TO_UBASE(0xB8D321DC),
40         HN_ULONG_TO_UBASE(0x9812DD4E)
41     },
42 
43     /* 3G.x */
44     {
45         HN_ULONG_TO_UBASE(0x8D5D8EB8), HN_ULONG_TO_UBASE(0xF16D3E67),
46         HN_ULONG_TO_UBASE(0xED1CB362), HN_ULONG_TO_UBASE(0x8A3F559E),
47         HN_ULONG_TO_UBASE(0xE9A3BBCE), HN_ULONG_TO_UBASE(0xC2A74816),
48         HN_ULONG_TO_UBASE(0xEEDCCCD8)
49     },
50 
51     /* 3G.y */
52     {
53         HN_ULONG_TO_UBASE(0xED50266D), HN_ULONG_TO_UBASE(0xDFF19F90),
54         HN_ULONG_TO_UBASE(0xB4BF65F9), HN_ULONG_TO_UBASE(0xAFECABF2),
55         HN_ULONG_TO_UBASE(0x3865468F), HN_ULONG_TO_UBASE(0x910A1731),
56         HN_ULONG_TO_UBASE(0x5CB379BA)
57     },
58 
59     /* 4G.x */
60     {
61         HN_ULONG_TO_UBASE(0x6CAB26E3), HN_ULONG_TO_UBASE(0xA0064196),
62         HN_ULONG_TO_UBASE(0x2991FAB0), HN_ULONG_TO_UBASE(0x3A0B91FB),
63         HN_ULONG_TO_UBASE(0xEC27A4E1), HN_ULONG_TO_UBASE(0x5F8EBEEF),
64         HN_ULONG_TO_UBASE(0x0499AA8A)
65     },
66 
67     /* 4G.y */
68     {
69         HN_ULONG_TO_UBASE(0x7766AF5D), HN_ULONG_TO_UBASE(0x50751040),
70         HN_ULONG_TO_UBASE(0x29610D54), HN_ULONG_TO_UBASE(0xF70684D9),
71         HN_ULONG_TO_UBASE(0xD77AAE82), HN_ULONG_TO_UBASE(0x338C5B81),
72         HN_ULONG_TO_UBASE(0x6916F6D4)
73     },
74 
75     /* 5G.x */
76     {
77         HN_ULONG_TO_UBASE(0x3B1F15C6), HN_ULONG_TO_UBASE(0xD4EA95AC),
78         HN_ULONG_TO_UBASE(0x00905E82), HN_ULONG_TO_UBASE(0xC8B10860),
79         HN_ULONG_TO_UBASE(0x323AE4D1), HN_ULONG_TO_UBASE(0x7685A3DD),
80         HN_ULONG_TO_UBASE(0x932B56BE)
81     },
82 
83     /* 5G.y */
84     {
85         HN_ULONG_TO_UBASE(0xEA25DBBF), HN_ULONG_TO_UBASE(0xF09EF93D),
86         HN_ULONG_TO_UBASE(0x5960F390), HN_ULONG_TO_UBASE(0xA8A74166),
87         HN_ULONG_TO_UBASE(0xEC76DBE2), HN_ULONG_TO_UBASE(0x19062AFD),
88         HN_ULONG_TO_UBASE(0x523E80F0)
89     },
90 
91     /* 6G.x */
92     {
93         HN_ULONG_TO_UBASE(0x26732C73), HN_ULONG_TO_UBASE(0x0F822FDD),
94         HN_ULONG_TO_UBASE(0x83531B5D), HN_ULONG_TO_UBASE(0x1BA4A01C),
95         HN_ULONG_TO_UBASE(0x3F37347C), HN_ULONG_TO_UBASE(0x84725C36),
96         HN_ULONG_TO_UBASE(0xC391B45C)
97     },
98 
99     /* 6G.y */
100     {
101         HN_ULONG_TO_UBASE(0xB2D6AD24), HN_ULONG_TO_UBASE(0xECBBD5E1),
102         HN_ULONG_TO_UBASE(0xCDE19DFA), HN_ULONG_TO_UBASE(0x2A7FDDFB),
103         HN_ULONG_TO_UBASE(0x93DA7E22), HN_ULONG_TO_UBASE(0xEDE244C3),
104         HN_ULONG_TO_UBASE(0x1EFB7890)
105     },
106 
107     /* 7G.x */
108     {
109         HN_ULONG_TO_UBASE(0xCA217DA1), HN_ULONG_TO_UBASE(0xBB4C9E90),
110         HN_ULONG_TO_UBASE(0xECA79159), HN_ULONG_TO_UBASE(0x8B7CD11B),
111         HN_ULONG_TO_UBASE(0x8D33C2C9), HN_ULONG_TO_UBASE(0x09F849FF),
112         HN_ULONG_TO_UBASE(0x2610B394)
113     },
114 
115     /* 7G.y */
116     {
117         HN_ULONG_TO_UBASE(0x2AC64DA0), HN_ULONG_TO_UBASE(0xFB44D135),
118         HN_ULONG_TO_UBASE(0x7B2C46B4), HN_ULONG_TO_UBASE(0x3C89CDBB),
119         HN_ULONG_TO_UBASE(0x6C079B75), HN_ULONG_TO_UBASE(0x20B11296),
120         HN_ULONG_TO_UBASE(0xFE67E4E8)
121     },
122 
123     /* 8G.x */
124     {
125         HN_ULONG_TO_UBASE(0x2DF5312D), HN_ULONG_TO_UBASE(0x6EE28CAE),
126         HN_ULONG_TO_UBASE(0x61D16F5C), HN_ULONG_TO_UBASE(0x7C4CC71B),
127         HN_ULONG_TO_UBASE(0xB7619A3E), HN_ULONG_TO_UBASE(0x899B4779),
128         HN_ULONG_TO_UBASE(0x05C73240)
129     },
130 
131     /* 8G.y */
132     {
133         HN_ULONG_TO_UBASE(0x82C73E3A), HN_ULONG_TO_UBASE(0xDA9F7F63),
134         HN_ULONG_TO_UBASE(0x5165C56B), HN_ULONG_TO_UBASE(0xFD561861),
135         HN_ULONG_TO_UBASE(0x1FAB2116), HN_ULONG_TO_UBASE(0xB0839464),
136         HN_ULONG_TO_UBASE(0x72855882)
137     },
138 
139     /* 9G.x */
140     {
141         HN_ULONG_TO_UBASE(0x2F161C09), HN_ULONG_TO_UBASE(0xB5046918),
142         HN_ULONG_TO_UBASE(0x8CA8D00F), HN_ULONG_TO_UBASE(0xA3E074A9),
143         HN_ULONG_TO_UBASE(0x9DA93489), HN_ULONG_TO_UBASE(0xFB0C1DB8),
144         HN_ULONG_TO_UBASE(0x41C98768)
145     },
146 
147     /* 9G.y */
148     {
149         HN_ULONG_TO_UBASE(0xFB32DA81), HN_ULONG_TO_UBASE(0x55E5EA05),
150         HN_ULONG_TO_UBASE(0x9FFBCA68), HN_ULONG_TO_UBASE(0x59E63DCE),
151         HN_ULONG_TO_UBASE(0xFE2D3FBF), HN_ULONG_TO_UBASE(0x8738A71C),
152         HN_ULONG_TO_UBASE(0x0E5E0340)
153     },
154 
155     /* 10G.x */
156     {
157         HN_ULONG_TO_UBASE(0x2333E87F), HN_ULONG_TO_UBASE(0xF6DAB22B),
158         HN_ULONG_TO_UBASE(0x137A5DD2), HN_ULONG_TO_UBASE(0xBEB84430),
159         HN_ULONG_TO_UBASE(0x3AB9F738), HN_ULONG_TO_UBASE(0xC34F24E0),
160         HN_ULONG_TO_UBASE(0xCB0C5D0D)
161     },
162 
163     /* 10G.y */
164     {
165         HN_ULONG_TO_UBASE(0xF0C8FDA5), HN_ULONG_TO_UBASE(0x44764A7D),
166         HN_ULONG_TO_UBASE(0xA5C3FA20), HN_ULONG_TO_UBASE(0xBE50185B),
167         HN_ULONG_TO_UBASE(0x81D688BC), HN_ULONG_TO_UBASE(0x89388192),
168         HN_ULONG_TO_UBASE(0xC40331DF)
169     },
170 
171     /* 11G.x */
172     {
173         HN_ULONG_TO_UBASE(0x796F0F60), HN_ULONG_TO_UBASE(0xA3B89530),
174         HN_ULONG_TO_UBASE(0x2BD26909), HN_ULONG_TO_UBASE(0x84DAADE9),
175         HN_ULONG_TO_UBASE(0x0C83FB48), HN_ULONG_TO_UBASE(0xA5A9841A),
176         HN_ULONG_TO_UBASE(0x1765BF22)
177     },
178 
179     /* 11G.y */
180     {
181         HN_ULONG_TO_UBASE(0xE75DB09E), HN_ULONG_TO_UBASE(0x6F772A9E),
182         HN_ULONG_TO_UBASE(0x6C67CEC1), HN_ULONG_TO_UBASE(0x4E2F23BC),
183         HN_ULONG_TO_UBASE(0x1EDBA8B1), HN_ULONG_TO_UBASE(0x6113694C),
184         HN_ULONG_TO_UBASE(0xE2A215D9)
185     },
186 
187     /* 12G.x */
188     {
189         HN_ULONG_TO_UBASE(0x9FB5EFB3), HN_ULONG_TO_UBASE(0x52571E50),
190         HN_ULONG_TO_UBASE(0x86964105), HN_ULONG_TO_UBASE(0x74FEADE8),
191         HN_ULONG_TO_UBASE(0xAE85FADA), HN_ULONG_TO_UBASE(0x3BBDE3C8),
192         HN_ULONG_TO_UBASE(0x6C7E4BE8)
193     },
194 
195     /* 12G.y */
196     {
197         HN_ULONG_TO_UBASE(0x160F4652), HN_ULONG_TO_UBASE(0x39FF9F51),
198         HN_ULONG_TO_UBASE(0xE2495A65), HN_ULONG_TO_UBASE(0x82F4B47C),
199         HN_ULONG_TO_UBASE(0x946C53B5), HN_ULONG_TO_UBASE(0xEE9A60A2),
200         HN_ULONG_TO_UBASE(0x286D2DB3)
201     },
202 
203     /* 13G.x */
204     {
205         HN_ULONG_TO_UBASE(0x081A44AF), HN_ULONG_TO_UBASE(0x6C40BBD5),
206         HN_ULONG_TO_UBASE(0x183B1392), HN_ULONG_TO_UBASE(0xF6D00995),
207         HN_ULONG_TO_UBASE(0xEFBA6F47), HN_ULONG_TO_UBASE(0xCC0057BC),
208         HN_ULONG_TO_UBASE(0x215619E9)
209     },
210 
211     /* 13G.y */
212     {
213         HN_ULONG_TO_UBASE(0x3B0DF45E), HN_ULONG_TO_UBASE(0x6F8BC94D),
214         HN_ULONG_TO_UBASE(0x54A3694F), HN_ULONG_TO_UBASE(0xE8B5F11C),
215         HN_ULONG_TO_UBASE(0x31B93CDF), HN_ULONG_TO_UBASE(0x982DB986),
216         HN_ULONG_TO_UBASE(0xE7E3F4B0)
217     },
218 
219     /* 14G.x */
220     {
221         HN_ULONG_TO_UBASE(0xAB3E1C7B), HN_ULONG_TO_UBASE(0xD8B17048),
222         HN_ULONG_TO_UBASE(0xF36FF8A1), HN_ULONG_TO_UBASE(0xD2C6AC38),
223         HN_ULONG_TO_UBASE(0x29819435), HN_ULONG_TO_UBASE(0x4C07E91C),
224         HN_ULONG_TO_UBASE(0xC813132F)
225     },
226 
227     /* 14G.y */
228     {
229         HN_ULONG_TO_UBASE(0x5503B11F), HN_ULONG_TO_UBASE(0xEA289142),
230         HN_ULONG_TO_UBASE(0x1030579F), HN_ULONG_TO_UBASE(0x96740878),
231         HN_ULONG_TO_UBASE(0x426BA5CC), HN_ULONG_TO_UBASE(0x8562BCF5),
232         HN_ULONG_TO_UBASE(0x1E28EBF1)
233     },
234 
235     /* 15G.x */
236     {
237         HN_ULONG_TO_UBASE(0x7CC864EB), HN_ULONG_TO_UBASE(0x4C9F3199),
238         HN_ULONG_TO_UBASE(0x91D28B5E), HN_ULONG_TO_UBASE(0xA97306CD),
239         HN_ULONG_TO_UBASE(0x17036691), HN_ULONG_TO_UBASE(0x497C58FF),
240         HN_ULONG_TO_UBASE(0xF1AEF351)
241     },
242 
243     /* 15G.y */
244     {
245         HN_ULONG_TO_UBASE(0x600564FF), HN_ULONG_TO_UBASE(0xDBDD1F2D),
246         HN_ULONG_TO_UBASE(0x073B1402), HN_ULONG_TO_UBASE(0xD693DEAD),
247         HN_ULONG_TO_UBASE(0xA684435B), HN_ULONG_TO_UBASE(0x96255874),
248         HN_ULONG_TO_UBASE(0xEEA7471F)
249     }
250 };
251 static NX_CRYPTO_CONST HN_UBASE           secp224r1_fixed_points_2e_data[][28 >> HN_SIZE_SHIFT] =
252 {
253 
254     /* 2^e * 1G.x */
255     {
256         HN_ULONG_TO_UBASE(0x6DDDF554), HN_ULONG_TO_UBASE(0x2D966526),
257         HN_ULONG_TO_UBASE(0xD78B60EF), HN_ULONG_TO_UBASE(0xA4179613),
258         HN_ULONG_TO_UBASE(0x27A34CDB), HN_ULONG_TO_UBASE(0x6AFC31CE),
259         HN_ULONG_TO_UBASE(0xD35AB74D)
260     },
261 
262     /* 2^e * 1G.y */
263     {
264         HN_ULONG_TO_UBASE(0x22DEB15E), HN_ULONG_TO_UBASE(0xAB85CCDD),
265         HN_ULONG_TO_UBASE(0xE5783A6A), HN_ULONG_TO_UBASE(0x93C62137),
266         HN_ULONG_TO_UBASE(0x41CFFD8C), HN_ULONG_TO_UBASE(0xE90F2DA1),
267         HN_ULONG_TO_UBASE(0x355A1830)
268     },
269 
270     /* 2^e * 2G.x */
271     {
272         HN_ULONG_TO_UBASE(0xADAADE65), HN_ULONG_TO_UBASE(0x3C1A494E),
273         HN_ULONG_TO_UBASE(0x4DA77FE5), HN_ULONG_TO_UBASE(0xEC86D6DA),
274         HN_ULONG_TO_UBASE(0x992996AB), HN_ULONG_TO_UBASE(0x6090E3E7),
275         HN_ULONG_TO_UBASE(0x65C3553C)
276     },
277 
278     /* 2^e * 2G.y */
279     {
280         HN_ULONG_TO_UBASE(0x1FB09346), HN_ULONG_TO_UBASE(0xAFFA610B),
281         HN_ULONG_TO_UBASE(0x540B8A4A), HN_ULONG_TO_UBASE(0xCBABF1C6),
282         HN_ULONG_TO_UBASE(0x1A13CCD3), HN_ULONG_TO_UBASE(0x18C28AC5),
283         HN_ULONG_TO_UBASE(0x02995B1B)
284     },
285 
286     /* 2^e * 3G.x */
287     {
288         HN_ULONG_TO_UBASE(0x8E7295EF), HN_ULONG_TO_UBASE(0x04787456),
289         HN_ULONG_TO_UBASE(0x19FBE38D), HN_ULONG_TO_UBASE(0x0D9A86B4),
290         HN_ULONG_TO_UBASE(0x0690A755), HN_ULONG_TO_UBASE(0xBEAC33DC),
291         HN_ULONG_TO_UBASE(0xD3966A44)
292     },
293 
294     /* 2^e * 3G.y */
295     {
296         HN_ULONG_TO_UBASE(0xEC29132F), HN_ULONG_TO_UBASE(0xF32B7280),
297         HN_ULONG_TO_UBASE(0x3B6A032D), HN_ULONG_TO_UBASE(0x1200BEAA),
298         HN_ULONG_TO_UBASE(0x7DD88AE4), HN_ULONG_TO_UBASE(0xE3A100DC),
299         HN_ULONG_TO_UBASE(0xD25E2513)
300     },
301 
302     /* 2^e * 4G.x */
303     {
304         HN_ULONG_TO_UBASE(0xEB2EFAFD), HN_ULONG_TO_UBASE(0x90924857),
305         HN_ULONG_TO_UBASE(0xCE412231), HN_ULONG_TO_UBASE(0x53FCAC2B),
306         HN_ULONG_TO_UBASE(0xDAA14455), HN_ULONG_TO_UBASE(0x3562D58E),
307         HN_ULONG_TO_UBASE(0x825800FD)
308     },
309 
310     /* 2^e * 4G.y */
311     {
312         HN_ULONG_TO_UBASE(0x8EA96621), HN_ULONG_TO_UBASE(0x8D8D7914),
313         HN_ULONG_TO_UBASE(0x1C3DD9ED), HN_ULONG_TO_UBASE(0x16B523A0),
314         HN_ULONG_TO_UBASE(0x8B219F94), HN_ULONG_TO_UBASE(0x77DAEAAF),
315         HN_ULONG_TO_UBASE(0xD8DB0CC2)
316     },
317 
318     /* 2^e * 5G.x */
319     {
320         HN_ULONG_TO_UBASE(0xB1A700F0), HN_ULONG_TO_UBASE(0x9176A9C3),
321         HN_ULONG_TO_UBASE(0xD29BC7E6), HN_ULONG_TO_UBASE(0x0327E9AC),
322         HN_ULONG_TO_UBASE(0x212D1A6B), HN_ULONG_TO_UBASE(0xE154BE69),
323         HN_ULONG_TO_UBASE(0x6322E97F)
324     },
325 
326     /* 2^e * 5G.y */
327     {
328         HN_ULONG_TO_UBASE(0x465D62AA), HN_ULONG_TO_UBASE(0x05469FC5),
329         HN_ULONG_TO_UBASE(0xED18883B), HN_ULONG_TO_UBASE(0x2B888D41),
330         HN_ULONG_TO_UBASE(0x8EAE66C5), HN_ULONG_TO_UBASE(0x25BE511F),
331         HN_ULONG_TO_UBASE(0xE4FCBE93)
332     },
333 
334     /* 2^e * 6G.x */
335     {
336         HN_ULONG_TO_UBASE(0x583CAC16), HN_ULONG_TO_UBASE(0x3A825FDF),
337         HN_ULONG_TO_UBASE(0x857C7B02), HN_ULONG_TO_UBASE(0x0165020B),
338         HN_ULONG_TO_UBASE(0x3C17744B), HN_ULONG_TO_UBASE(0xDAF2F168),
339         HN_ULONG_TO_UBASE(0x14FFD0A2)
340     },
341 
342     /* 2^e * 6G.y */
343     {
344         HN_ULONG_TO_UBASE(0x184218F9), HN_ULONG_TO_UBASE(0xD4323B36),
345         HN_ULONG_TO_UBASE(0xEC4E3B47), HN_ULONG_TO_UBASE(0x1ACF4944),
346         HN_ULONG_TO_UBASE(0x5B308084), HN_ULONG_TO_UBASE(0x1A28BBC1),
347         HN_ULONG_TO_UBASE(0x0BCED4B0)
348     },
349 
350     /* 2^e * 7G.x */
351     {
352         HN_ULONG_TO_UBASE(0x230DF5C4), HN_ULONG_TO_UBASE(0xA892AC22),
353         HN_ULONG_TO_UBASE(0x3B4063ED), HN_ULONG_TO_UBASE(0x0C9352F3),
354         HN_ULONG_TO_UBASE(0x3F19870C), HN_ULONG_TO_UBASE(0xA65233CB),
355         HN_ULONG_TO_UBASE(0x40064F2B)
356     },
357 
358     /* 2^e * 7G.y */
359     {
360         HN_ULONG_TO_UBASE(0x924F8992), HN_ULONG_TO_UBASE(0x17FE16F0),
361         HN_ULONG_TO_UBASE(0xA25AF5B5), HN_ULONG_TO_UBASE(0x23A6012D),
362         HN_ULONG_TO_UBASE(0x57BB24F7), HN_ULONG_TO_UBASE(0x760DEF1A),
363         HN_ULONG_TO_UBASE(0x06F8BC76)
364     },
365 
366     /* 2^e * 8G.x */
367     {
368         HN_ULONG_TO_UBASE(0xF7817CB9), HN_ULONG_TO_UBASE(0x784A7084),
369         HN_ULONG_TO_UBASE(0x0738EE9A), HN_ULONG_TO_UBASE(0xC326BCAB),
370         HN_ULONG_TO_UBASE(0xC11E11D9), HN_ULONG_TO_UBASE(0x0F1AAE3E),
371         HN_ULONG_TO_UBASE(0xDC0FE90E)
372     },
373 
374     /* 2^e * 8G.y */
375     {
376         HN_ULONG_TO_UBASE(0xA5F98390), HN_ULONG_TO_UBASE(0x74CF639E),
377         HN_ULONG_TO_UBASE(0x0AA22FFB), HN_ULONG_TO_UBASE(0x47B75C35),
378         HN_ULONG_TO_UBASE(0xFAE98A40), HN_ULONG_TO_UBASE(0x17FC459A),
379         HN_ULONG_TO_UBASE(0x956EC2D6)
380     },
381 
382     /* 2^e * 9G.x */
383     {
384         HN_ULONG_TO_UBASE(0x48C1BE6A), HN_ULONG_TO_UBASE(0x624306D6),
385         HN_ULONG_TO_UBASE(0xCD8BC9A4), HN_ULONG_TO_UBASE(0x2F2E9247),
386         HN_ULONG_TO_UBASE(0x595E377D), HN_ULONG_TO_UBASE(0xF1A52EF5),
387         HN_ULONG_TO_UBASE(0xBD1C3CAF)
388     },
389 
390     /* 2^e * 9G.y */
391     {
392         HN_ULONG_TO_UBASE(0x472409D0), HN_ULONG_TO_UBASE(0x73045E14),
393         HN_ULONG_TO_UBASE(0xE17078F7), HN_ULONG_TO_UBASE(0x4F7D29F3),
394         HN_ULONG_TO_UBASE(0x5A602B2D), HN_ULONG_TO_UBASE(0x5CDFBB74),
395         HN_ULONG_TO_UBASE(0x19183768)
396     },
397 
398     /* 2^e * 10G.x */
399     {
400         HN_ULONG_TO_UBASE(0x54A8CB79), HN_ULONG_TO_UBASE(0x265B6EE2),
401         HN_ULONG_TO_UBASE(0x433F5E70), HN_ULONG_TO_UBASE(0xDEF44953),
402         HN_ULONG_TO_UBASE(0x1FAEB1D1), HN_ULONG_TO_UBASE(0x5C09DEE2),
403         HN_ULONG_TO_UBASE(0xC4C22578)
404     },
405 
406     /* 2^e * 10G.y */
407     {
408         HN_ULONG_TO_UBASE(0xBBA1E518), HN_ULONG_TO_UBASE(0xB8307CE7),
409         HN_ULONG_TO_UBASE(0x25B1036D), HN_ULONG_TO_UBASE(0x9E8F31B1),
410         HN_ULONG_TO_UBASE(0xE9186883), HN_ULONG_TO_UBASE(0x33B9F347),
411         HN_ULONG_TO_UBASE(0xC765866E)
412     },
413 
414     /* 2^e * 11G.x */
415     {
416         HN_ULONG_TO_UBASE(0x24F96906), HN_ULONG_TO_UBASE(0x933BFECE),
417         HN_ULONG_TO_UBASE(0xDA641E50), HN_ULONG_TO_UBASE(0xDB264794),
418         HN_ULONG_TO_UBASE(0x5DF64F95), HN_ULONG_TO_UBASE(0x714B05DE),
419         HN_ULONG_TO_UBASE(0x297ECD89)
420     },
421 
422     /* 2^e * 11G.y */
423     {
424         HN_ULONG_TO_UBASE(0xEBB2C3AA), HN_ULONG_TO_UBASE(0xD5701BD3),
425         HN_ULONG_TO_UBASE(0xB4F53CB1), HN_ULONG_TO_UBASE(0xAF167073),
426         HN_ULONG_TO_UBASE(0xC5665658), HN_ULONG_TO_UBASE(0x66FE5813),
427         HN_ULONG_TO_UBASE(0x9895089D)
428     },
429 
430     /* 2^e * 12G.x */
431     {
432         HN_ULONG_TO_UBASE(0xF78C4790), HN_ULONG_TO_UBASE(0x2E0FEF05),
433         HN_ULONG_TO_UBASE(0x3633B05D), HN_ULONG_TO_UBASE(0x1C942D77),
434         HN_ULONG_TO_UBASE(0x229C3A95), HN_ULONG_TO_UBASE(0x4911BB94),
435         HN_ULONG_TO_UBASE(0xBBBD70DF)
436     },
437 
438     /* 2^e * 12G.y */
439     {
440         HN_ULONG_TO_UBASE(0x3D2C1168), HN_ULONG_TO_UBASE(0x73B2C696),
441         HN_ULONG_TO_UBASE(0x47A72B0D), HN_ULONG_TO_UBASE(0x4080105F),
442         HN_ULONG_TO_UBASE(0xDF611161), HN_ULONG_TO_UBASE(0x9E67B09F),
443         HN_ULONG_TO_UBASE(0x7B7E94B3)
444     },
445 
446     /* 2^e * 13G.x */
447     {
448         HN_ULONG_TO_UBASE(0x6EFBE2B3), HN_ULONG_TO_UBASE(0x9DAD1A7D),
449         HN_ULONG_TO_UBASE(0x482C0DA6), HN_ULONG_TO_UBASE(0x8345F012),
450         HN_ULONG_TO_UBASE(0x3BDF1243), HN_ULONG_TO_UBASE(0x7AA4D96B),
451         HN_ULONG_TO_UBASE(0x40D7558D)
452     },
453 
454     /* 2^e * 13G.y */
455     {
456         HN_ULONG_TO_UBASE(0xFB5C6D3D), HN_ULONG_TO_UBASE(0x388A09FF),
457         HN_ULONG_TO_UBASE(0x6E5D9FFD), HN_ULONG_TO_UBASE(0x9B1C9A35),
458         HN_ULONG_TO_UBASE(0x73F15F4F), HN_ULONG_TO_UBASE(0x63C3EA59),
459         HN_ULONG_TO_UBASE(0xDCD5F59F)
460     },
461 
462     /* 2^e * 14G.x */
463     {
464         HN_ULONG_TO_UBASE(0x4C5CA7AB), HN_ULONG_TO_UBASE(0x37ACF39F),
465         HN_ULONG_TO_UBASE(0x71CC5FD7), HN_ULONG_TO_UBASE(0x11844C80),
466         HN_ULONG_TO_UBASE(0x4E3602CD), HN_ULONG_TO_UBASE(0xC9ABBAC6),
467         HN_ULONG_TO_UBASE(0x0ACD4644)
468     },
469 
470     /* 2^e * 14G.y */
471     {
472         HN_ULONG_TO_UBASE(0x36D8BF6E), HN_ULONG_TO_UBASE(0x2A6C011A),
473         HN_ULONG_TO_UBASE(0x87BA24E3), HN_ULONG_TO_UBASE(0xFAD8FECD),
474         HN_ULONG_TO_UBASE(0xF6F56574), HN_ULONG_TO_UBASE(0xED940519),
475         HN_ULONG_TO_UBASE(0x050B204C)
476     },
477 
478     /* 2^e * 15G.x */
479     {
480         HN_ULONG_TO_UBASE(0xAE7D9A96), HN_ULONG_TO_UBASE(0x0AED4F1C),
481         HN_ULONG_TO_UBASE(0xF7AD94C4), HN_ULONG_TO_UBASE(0xEF9B5CEE),
482         HN_ULONG_TO_UBASE(0x8E4A3BF3), HN_ULONG_TO_UBASE(0xC3B55E77),
483         HN_ULONG_TO_UBASE(0x7405783D)
484     },
485 
486     /* 2^e * 15G.y */
487     {
488         HN_ULONG_TO_UBASE(0x61B6E8C6), HN_ULONG_TO_UBASE(0x8B32477C),
489         HN_ULONG_TO_UBASE(0x97570F01), HN_ULONG_TO_UBASE(0x95D1B46A),
490         HN_ULONG_TO_UBASE(0x176D0A7E), HN_ULONG_TO_UBASE(0x4C7D0E91),
491         HN_ULONG_TO_UBASE(0x3DF90FBC)
492     }
493 };
494 static NX_CRYPTO_CONST NX_CRYPTO_EC_POINT secp224r1_fixed_points_array[] =
495 {
496 
497     /* 2G */
498     {
499         NX_CRYPTO_EC_POINT_AFFINE,
500         {
501             (HN_UBASE *)&secp224r1_fixed_points_data[0],
502             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
503         },
504         {
505             (HN_UBASE *)&secp224r1_fixed_points_data[1],
506             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
507         },
508         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
509     },
510 
511     /* 3G */
512     {
513         NX_CRYPTO_EC_POINT_AFFINE,
514         {
515             (HN_UBASE *)&secp224r1_fixed_points_data[2],
516             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
517         },
518         {
519             (HN_UBASE *)&secp224r1_fixed_points_data[3],
520             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
521         },
522         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
523     },
524 
525     /* 4G */
526     {
527         NX_CRYPTO_EC_POINT_AFFINE,
528         {
529             (HN_UBASE *)&secp224r1_fixed_points_data[4],
530             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
531         },
532         {
533             (HN_UBASE *)&secp224r1_fixed_points_data[5],
534             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
535         },
536         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
537     },
538 
539     /* 5G */
540     {
541         NX_CRYPTO_EC_POINT_AFFINE,
542         {
543             (HN_UBASE *)&secp224r1_fixed_points_data[6],
544             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
545         },
546         {
547             (HN_UBASE *)&secp224r1_fixed_points_data[7],
548             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
549         },
550         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
551     },
552 
553     /* 6G */
554     {
555         NX_CRYPTO_EC_POINT_AFFINE,
556         {
557             (HN_UBASE *)&secp224r1_fixed_points_data[8],
558             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
559         },
560         {
561             (HN_UBASE *)&secp224r1_fixed_points_data[9],
562             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
563         },
564         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
565     },
566 
567     /* 7G */
568     {
569         NX_CRYPTO_EC_POINT_AFFINE,
570         {
571             (HN_UBASE *)&secp224r1_fixed_points_data[10],
572             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
573         },
574         {
575             (HN_UBASE *)&secp224r1_fixed_points_data[11],
576             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
577         },
578         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
579     },
580 
581     /* 8G */
582     {
583         NX_CRYPTO_EC_POINT_AFFINE,
584         {
585             (HN_UBASE *)&secp224r1_fixed_points_data[12],
586             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
587         },
588         {
589             (HN_UBASE *)&secp224r1_fixed_points_data[13],
590             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
591         },
592         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
593     },
594 
595     /* 9G */
596     {
597         NX_CRYPTO_EC_POINT_AFFINE,
598         {
599             (HN_UBASE *)&secp224r1_fixed_points_data[14],
600             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
601         },
602         {
603             (HN_UBASE *)&secp224r1_fixed_points_data[15],
604             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
605         },
606         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
607     },
608 
609     /* 10G */
610     {
611         NX_CRYPTO_EC_POINT_AFFINE,
612         {
613             (HN_UBASE *)&secp224r1_fixed_points_data[16],
614             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
615         },
616         {
617             (HN_UBASE *)&secp224r1_fixed_points_data[17],
618             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
619         },
620         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
621     },
622 
623     /* 11G */
624     {
625         NX_CRYPTO_EC_POINT_AFFINE,
626         {
627             (HN_UBASE *)&secp224r1_fixed_points_data[18],
628             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
629         },
630         {
631             (HN_UBASE *)&secp224r1_fixed_points_data[19],
632             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
633         },
634         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
635     },
636 
637     /* 12G */
638     {
639         NX_CRYPTO_EC_POINT_AFFINE,
640         {
641             (HN_UBASE *)&secp224r1_fixed_points_data[20],
642             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
643         },
644         {
645             (HN_UBASE *)&secp224r1_fixed_points_data[21],
646             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
647         },
648         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
649     },
650 
651     /* 13G */
652     {
653         NX_CRYPTO_EC_POINT_AFFINE,
654         {
655             (HN_UBASE *)&secp224r1_fixed_points_data[22],
656             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
657         },
658         {
659             (HN_UBASE *)&secp224r1_fixed_points_data[23],
660             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
661         },
662         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
663     },
664 
665     /* 14G */
666     {
667         NX_CRYPTO_EC_POINT_AFFINE,
668         {
669             (HN_UBASE *)&secp224r1_fixed_points_data[24],
670             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
671         },
672         {
673             (HN_UBASE *)&secp224r1_fixed_points_data[25],
674             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
675         },
676         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
677     },
678 
679     /* 15G */
680     {
681         NX_CRYPTO_EC_POINT_AFFINE,
682         {
683             (HN_UBASE *)&secp224r1_fixed_points_data[26],
684             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
685         },
686         {
687             (HN_UBASE *)&secp224r1_fixed_points_data[27],
688             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
689         },
690         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
691     }
692 };
693 static NX_CRYPTO_CONST NX_CRYPTO_EC_POINT secp224r1_fixed_points_2e_array[] =
694 {
695 
696     /* 2^e * 1G */
697     {
698         NX_CRYPTO_EC_POINT_AFFINE,
699         {
700             (HN_UBASE *)&secp224r1_fixed_points_2e_data[0],
701             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
702         },
703         {
704             (HN_UBASE *)&secp224r1_fixed_points_2e_data[1],
705             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
706         },
707         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
708     },
709 
710     /* 2^e * 2G */
711     {
712         NX_CRYPTO_EC_POINT_AFFINE,
713         {
714             (HN_UBASE *)&secp224r1_fixed_points_2e_data[2],
715             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
716         },
717         {
718             (HN_UBASE *)&secp224r1_fixed_points_2e_data[3],
719             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
720         },
721         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
722     },
723 
724     /* 2^e * 3G */
725     {
726         NX_CRYPTO_EC_POINT_AFFINE,
727         {
728             (HN_UBASE *)&secp224r1_fixed_points_2e_data[4],
729             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
730         },
731         {
732             (HN_UBASE *)&secp224r1_fixed_points_2e_data[5],
733             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
734         },
735         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
736     },
737 
738     /* 2^e * 4G */
739     {
740         NX_CRYPTO_EC_POINT_AFFINE,
741         {
742             (HN_UBASE *)&secp224r1_fixed_points_2e_data[6],
743             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
744         },
745         {
746             (HN_UBASE *)&secp224r1_fixed_points_2e_data[7],
747             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
748         },
749         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
750     },
751 
752     /* 2^e * 5G */
753     {
754         NX_CRYPTO_EC_POINT_AFFINE,
755         {
756             (HN_UBASE *)&secp224r1_fixed_points_2e_data[8],
757             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
758         },
759         {
760             (HN_UBASE *)&secp224r1_fixed_points_2e_data[9],
761             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
762         },
763         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
764     },
765 
766     /* 2^e * 6G */
767     {
768         NX_CRYPTO_EC_POINT_AFFINE,
769         {
770             (HN_UBASE *)&secp224r1_fixed_points_2e_data[10],
771             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
772         },
773         {
774             (HN_UBASE *)&secp224r1_fixed_points_2e_data[11],
775             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
776         },
777         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
778     },
779 
780     /* 2^e * 7G */
781     {
782         NX_CRYPTO_EC_POINT_AFFINE,
783         {
784             (HN_UBASE *)&secp224r1_fixed_points_2e_data[12],
785             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
786         },
787         {
788             (HN_UBASE *)&secp224r1_fixed_points_2e_data[13],
789             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
790         },
791         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
792     },
793 
794     /* 2^e * 8G */
795     {
796         NX_CRYPTO_EC_POINT_AFFINE,
797         {
798             (HN_UBASE *)&secp224r1_fixed_points_2e_data[14],
799             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
800         },
801         {
802             (HN_UBASE *)&secp224r1_fixed_points_2e_data[15],
803             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
804         },
805         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
806     },
807 
808     /* 2^e * 9G */
809     {
810         NX_CRYPTO_EC_POINT_AFFINE,
811         {
812             (HN_UBASE *)&secp224r1_fixed_points_2e_data[16],
813             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
814         },
815         {
816             (HN_UBASE *)&secp224r1_fixed_points_2e_data[17],
817             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
818         },
819         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
820     },
821 
822     /* 2^e * 10G */
823     {
824         NX_CRYPTO_EC_POINT_AFFINE,
825         {
826             (HN_UBASE *)&secp224r1_fixed_points_2e_data[18],
827             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
828         },
829         {
830             (HN_UBASE *)&secp224r1_fixed_points_2e_data[19],
831             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
832         },
833         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
834     },
835 
836     /* 2^e * 11G */
837     {
838         NX_CRYPTO_EC_POINT_AFFINE,
839         {
840             (HN_UBASE *)&secp224r1_fixed_points_2e_data[20],
841             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
842         },
843         {
844             (HN_UBASE *)&secp224r1_fixed_points_2e_data[21],
845             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
846         },
847         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
848     },
849 
850     /* 2^e * 12G */
851     {
852         NX_CRYPTO_EC_POINT_AFFINE,
853         {
854             (HN_UBASE *)&secp224r1_fixed_points_2e_data[22],
855             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
856         },
857         {
858             (HN_UBASE *)&secp224r1_fixed_points_2e_data[23],
859             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
860         },
861         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
862     },
863 
864     /* 2^e * 13G */
865     {
866         NX_CRYPTO_EC_POINT_AFFINE,
867         {
868             (HN_UBASE *)&secp224r1_fixed_points_2e_data[24],
869             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
870         },
871         {
872             (HN_UBASE *)&secp224r1_fixed_points_2e_data[25],
873             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
874         },
875         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
876     },
877 
878     /* 2^e * 14G */
879     {
880         NX_CRYPTO_EC_POINT_AFFINE,
881         {
882             (HN_UBASE *)&secp224r1_fixed_points_2e_data[26],
883             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
884         },
885         {
886             (HN_UBASE *)&secp224r1_fixed_points_2e_data[27],
887             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
888         },
889         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
890     },
891 
892     /* 2^e * 15G */
893     {
894         NX_CRYPTO_EC_POINT_AFFINE,
895         {
896             (HN_UBASE *)&secp224r1_fixed_points_2e_data[28],
897             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
898         },
899         {
900             (HN_UBASE *)&secp224r1_fixed_points_2e_data[29],
901             28 >> HN_SIZE_SHIFT, 28, (UINT)NX_CRYPTO_FALSE
902         },
903         {(HN_UBASE *)NX_CRYPTO_NULL, 0u, 0u, 0u}
904     }
905 };
906 
907 
908 NX_CRYPTO_CONST NX_CRYPTO_EC_FIXED_POINTS _nx_crypto_ec_secp224r1_fixed_points =
909 {
910     4u, 224u, 56u, 28u,
911     (NX_CRYPTO_EC_POINT *)secp224r1_fixed_points_array,
912     (NX_CRYPTO_EC_POINT *)secp224r1_fixed_points_2e_array
913 };
914 
915