1// SPDX-License-Identifier: GPL-2.0 OR MIT
2/*
3 * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
4 */
5
6#include <crypto/curve25519.h>
7
8struct curve25519_test_vector {
9	u8 private[CURVE25519_KEY_SIZE];
10	u8 public[CURVE25519_KEY_SIZE];
11	u8 result[CURVE25519_KEY_SIZE];
12	bool valid;
13};
14static const struct curve25519_test_vector curve25519_test_vectors[] __initconst = {
15	{
16		.private = { 0x77, 0x07, 0x6d, 0x0a, 0x73, 0x18, 0xa5, 0x7d,
17			     0x3c, 0x16, 0xc1, 0x72, 0x51, 0xb2, 0x66, 0x45,
18			     0xdf, 0x4c, 0x2f, 0x87, 0xeb, 0xc0, 0x99, 0x2a,
19			     0xb1, 0x77, 0xfb, 0xa5, 0x1d, 0xb9, 0x2c, 0x2a },
20		.public = { 0xde, 0x9e, 0xdb, 0x7d, 0x7b, 0x7d, 0xc1, 0xb4,
21			    0xd3, 0x5b, 0x61, 0xc2, 0xec, 0xe4, 0x35, 0x37,
22			    0x3f, 0x83, 0x43, 0xc8, 0x5b, 0x78, 0x67, 0x4d,
23			    0xad, 0xfc, 0x7e, 0x14, 0x6f, 0x88, 0x2b, 0x4f },
24		.result = { 0x4a, 0x5d, 0x9d, 0x5b, 0xa4, 0xce, 0x2d, 0xe1,
25			    0x72, 0x8e, 0x3b, 0xf4, 0x80, 0x35, 0x0f, 0x25,
26			    0xe0, 0x7e, 0x21, 0xc9, 0x47, 0xd1, 0x9e, 0x33,
27			    0x76, 0xf0, 0x9b, 0x3c, 0x1e, 0x16, 0x17, 0x42 },
28		.valid = true
29	},
30	{
31		.private = { 0x5d, 0xab, 0x08, 0x7e, 0x62, 0x4a, 0x8a, 0x4b,
32			     0x79, 0xe1, 0x7f, 0x8b, 0x83, 0x80, 0x0e, 0xe6,
33			     0x6f, 0x3b, 0xb1, 0x29, 0x26, 0x18, 0xb6, 0xfd,
34			     0x1c, 0x2f, 0x8b, 0x27, 0xff, 0x88, 0xe0, 0xeb },
35		.public = { 0x85, 0x20, 0xf0, 0x09, 0x89, 0x30, 0xa7, 0x54,
36			    0x74, 0x8b, 0x7d, 0xdc, 0xb4, 0x3e, 0xf7, 0x5a,
37			    0x0d, 0xbf, 0x3a, 0x0d, 0x26, 0x38, 0x1a, 0xf4,
38			    0xeb, 0xa4, 0xa9, 0x8e, 0xaa, 0x9b, 0x4e, 0x6a },
39		.result = { 0x4a, 0x5d, 0x9d, 0x5b, 0xa4, 0xce, 0x2d, 0xe1,
40			    0x72, 0x8e, 0x3b, 0xf4, 0x80, 0x35, 0x0f, 0x25,
41			    0xe0, 0x7e, 0x21, 0xc9, 0x47, 0xd1, 0x9e, 0x33,
42			    0x76, 0xf0, 0x9b, 0x3c, 0x1e, 0x16, 0x17, 0x42 },
43		.valid = true
44	},
45	{
46		.private = { 1 },
47		.public = { 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
48			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
49			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
50			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
51		.result = { 0x3c, 0x77, 0x77, 0xca, 0xf9, 0x97, 0xb2, 0x64,
52			    0x41, 0x60, 0x77, 0x66, 0x5b, 0x4e, 0x22, 0x9d,
53			    0x0b, 0x95, 0x48, 0xdc, 0x0c, 0xd8, 0x19, 0x98,
54			    0xdd, 0xcd, 0xc5, 0xc8, 0x53, 0x3c, 0x79, 0x7f },
55		.valid = true
56	},
57	{
58		.private = { 1 },
59		.public = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
60			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
61			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
62			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
63		.result = { 0xb3, 0x2d, 0x13, 0x62, 0xc2, 0x48, 0xd6, 0x2f,
64			    0xe6, 0x26, 0x19, 0xcf, 0xf0, 0x4d, 0xd4, 0x3d,
65			    0xb7, 0x3f, 0xfc, 0x1b, 0x63, 0x08, 0xed, 0xe3,
66			    0x0b, 0x78, 0xd8, 0x73, 0x80, 0xf1, 0xe8, 0x34 },
67		.valid = true
68	},
69	{
70		.private = { 0xa5, 0x46, 0xe3, 0x6b, 0xf0, 0x52, 0x7c, 0x9d,
71			     0x3b, 0x16, 0x15, 0x4b, 0x82, 0x46, 0x5e, 0xdd,
72			     0x62, 0x14, 0x4c, 0x0a, 0xc1, 0xfc, 0x5a, 0x18,
73			     0x50, 0x6a, 0x22, 0x44, 0xba, 0x44, 0x9a, 0xc4 },
74		.public = { 0xe6, 0xdb, 0x68, 0x67, 0x58, 0x30, 0x30, 0xdb,
75			    0x35, 0x94, 0xc1, 0xa4, 0x24, 0xb1, 0x5f, 0x7c,
76			    0x72, 0x66, 0x24, 0xec, 0x26, 0xb3, 0x35, 0x3b,
77			    0x10, 0xa9, 0x03, 0xa6, 0xd0, 0xab, 0x1c, 0x4c },
78		.result = { 0xc3, 0xda, 0x55, 0x37, 0x9d, 0xe9, 0xc6, 0x90,
79			    0x8e, 0x94, 0xea, 0x4d, 0xf2, 0x8d, 0x08, 0x4f,
80			    0x32, 0xec, 0xcf, 0x03, 0x49, 0x1c, 0x71, 0xf7,
81			    0x54, 0xb4, 0x07, 0x55, 0x77, 0xa2, 0x85, 0x52 },
82		.valid = true
83	},
84	{
85		.private = { 1, 2, 3, 4 },
86		.public = { 0 },
87		.result = { 0 },
88		.valid = false
89	},
90	{
91		.private = { 2, 4, 6, 8 },
92		.public = { 0xe0, 0xeb, 0x7a, 0x7c, 0x3b, 0x41, 0xb8, 0xae,
93			    0x16, 0x56, 0xe3, 0xfa, 0xf1, 0x9f, 0xc4, 0x6a,
94			    0xda, 0x09, 0x8d, 0xeb, 0x9c, 0x32, 0xb1, 0xfd,
95			    0x86, 0x62, 0x05, 0x16, 0x5f, 0x49, 0xb8 },
96		.result = { 0 },
97		.valid = false
98	},
99	{
100		.private = { 0xff, 0xff, 0xff, 0xff, 0x0a, 0xff, 0xff, 0xff,
101			     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
102			     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
103			     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
104		.public = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
105			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
106			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
107			    0xff, 0xff, 0xff, 0xff, 0x0a, 0x00, 0xfb, 0x9f },
108		.result = { 0x77, 0x52, 0xb6, 0x18, 0xc1, 0x2d, 0x48, 0xd2,
109			    0xc6, 0x93, 0x46, 0x83, 0x81, 0x7c, 0xc6, 0x57,
110			    0xf3, 0x31, 0x03, 0x19, 0x49, 0x48, 0x20, 0x05,
111			    0x42, 0x2b, 0x4e, 0xae, 0x8d, 0x1d, 0x43, 0x23 },
112		.valid = true
113	},
114	{
115		.private = { 0x8e, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
116			     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
117			     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
118			     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
119		.public = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
120			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
121			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
122			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, 0x06 },
123		.result = { 0x5a, 0xdf, 0xaa, 0x25, 0x86, 0x8e, 0x32, 0x3d,
124			    0xae, 0x49, 0x62, 0xc1, 0x01, 0x5c, 0xb3, 0x12,
125			    0xe1, 0xc5, 0xc7, 0x9e, 0x95, 0x3f, 0x03, 0x99,
126			    0xb0, 0xba, 0x16, 0x22, 0xf3, 0xb6, 0xf7, 0x0c },
127		.valid = true
128	},
129	/* wycheproof - normal case */
130	{
131		.private = { 0x48, 0x52, 0x83, 0x4d, 0x9d, 0x6b, 0x77, 0xda,
132			     0xde, 0xab, 0xaa, 0xf2, 0xe1, 0x1d, 0xca, 0x66,
133			     0xd1, 0x9f, 0xe7, 0x49, 0x93, 0xa7, 0xbe, 0xc3,
134			     0x6c, 0x6e, 0x16, 0xa0, 0x98, 0x3f, 0xea, 0xba },
135		.public = { 0x9c, 0x64, 0x7d, 0x9a, 0xe5, 0x89, 0xb9, 0xf5,
136			    0x8f, 0xdc, 0x3c, 0xa4, 0x94, 0x7e, 0xfb, 0xc9,
137			    0x15, 0xc4, 0xb2, 0xe0, 0x8e, 0x74, 0x4a, 0x0e,
138			    0xdf, 0x46, 0x9d, 0xac, 0x59, 0xc8, 0xf8, 0x5a },
139		.result = { 0x87, 0xb7, 0xf2, 0x12, 0xb6, 0x27, 0xf7, 0xa5,
140			    0x4c, 0xa5, 0xe0, 0xbc, 0xda, 0xdd, 0xd5, 0x38,
141			    0x9d, 0x9d, 0xe6, 0x15, 0x6c, 0xdb, 0xcf, 0x8e,
142			    0xbe, 0x14, 0xff, 0xbc, 0xfb, 0x43, 0x65, 0x51 },
143		.valid = true
144	},
145	/* wycheproof - public key on twist */
146	{
147		.private = { 0x58, 0x8c, 0x06, 0x1a, 0x50, 0x80, 0x4a, 0xc4,
148			     0x88, 0xad, 0x77, 0x4a, 0xc7, 0x16, 0xc3, 0xf5,
149			     0xba, 0x71, 0x4b, 0x27, 0x12, 0xe0, 0x48, 0x49,
150			     0x13, 0x79, 0xa5, 0x00, 0x21, 0x19, 0x98, 0xa8 },
151		.public = { 0x63, 0xaa, 0x40, 0xc6, 0xe3, 0x83, 0x46, 0xc5,
152			    0xca, 0xf2, 0x3a, 0x6d, 0xf0, 0xa5, 0xe6, 0xc8,
153			    0x08, 0x89, 0xa0, 0x86, 0x47, 0xe5, 0x51, 0xb3,
154			    0x56, 0x34, 0x49, 0xbe, 0xfc, 0xfc, 0x97, 0x33 },
155		.result = { 0xb1, 0xa7, 0x07, 0x51, 0x94, 0x95, 0xff, 0xff,
156			    0xb2, 0x98, 0xff, 0x94, 0x17, 0x16, 0xb0, 0x6d,
157			    0xfa, 0xb8, 0x7c, 0xf8, 0xd9, 0x11, 0x23, 0xfe,
158			    0x2b, 0xe9, 0xa2, 0x33, 0xdd, 0xa2, 0x22, 0x12 },
159		.valid = true
160	},
161	/* wycheproof - public key on twist */
162	{
163		.private = { 0xb0, 0x5b, 0xfd, 0x32, 0xe5, 0x53, 0x25, 0xd9,
164			     0xfd, 0x64, 0x8c, 0xb3, 0x02, 0x84, 0x80, 0x39,
165			     0x00, 0x0b, 0x39, 0x0e, 0x44, 0xd5, 0x21, 0xe5,
166			     0x8a, 0xab, 0x3b, 0x29, 0xa6, 0x96, 0x0b, 0xa8 },
167		.public = { 0x0f, 0x83, 0xc3, 0x6f, 0xde, 0xd9, 0xd3, 0x2f,
168			    0xad, 0xf4, 0xef, 0xa3, 0xae, 0x93, 0xa9, 0x0b,
169			    0xb5, 0xcf, 0xa6, 0x68, 0x93, 0xbc, 0x41, 0x2c,
170			    0x43, 0xfa, 0x72, 0x87, 0xdb, 0xb9, 0x97, 0x79 },
171		.result = { 0x67, 0xdd, 0x4a, 0x6e, 0x16, 0x55, 0x33, 0x53,
172			    0x4c, 0x0e, 0x3f, 0x17, 0x2e, 0x4a, 0xb8, 0x57,
173			    0x6b, 0xca, 0x92, 0x3a, 0x5f, 0x07, 0xb2, 0xc0,
174			    0x69, 0xb4, 0xc3, 0x10, 0xff, 0x2e, 0x93, 0x5b },
175		.valid = true
176	},
177	/* wycheproof - public key on twist */
178	{
179		.private = { 0x70, 0xe3, 0x4b, 0xcb, 0xe1, 0xf4, 0x7f, 0xbc,
180			     0x0f, 0xdd, 0xfd, 0x7c, 0x1e, 0x1a, 0xa5, 0x3d,
181			     0x57, 0xbf, 0xe0, 0xf6, 0x6d, 0x24, 0x30, 0x67,
182			     0xb4, 0x24, 0xbb, 0x62, 0x10, 0xbe, 0xd1, 0x9c },
183		.public = { 0x0b, 0x82, 0x11, 0xa2, 0xb6, 0x04, 0x90, 0x97,
184			    0xf6, 0x87, 0x1c, 0x6c, 0x05, 0x2d, 0x3c, 0x5f,
185			    0xc1, 0xba, 0x17, 0xda, 0x9e, 0x32, 0xae, 0x45,
186			    0x84, 0x03, 0xb0, 0x5b, 0xb2, 0x83, 0x09, 0x2a },
187		.result = { 0x4a, 0x06, 0x38, 0xcf, 0xaa, 0x9e, 0xf1, 0x93,
188			    0x3b, 0x47, 0xf8, 0x93, 0x92, 0x96, 0xa6, 0xb2,
189			    0x5b, 0xe5, 0x41, 0xef, 0x7f, 0x70, 0xe8, 0x44,
190			    0xc0, 0xbc, 0xc0, 0x0b, 0x13, 0x4d, 0xe6, 0x4a },
191		.valid = true
192	},
193	/* wycheproof - public key on twist */
194	{
195		.private = { 0x68, 0xc1, 0xf3, 0xa6, 0x53, 0xa4, 0xcd, 0xb1,
196			     0xd3, 0x7b, 0xba, 0x94, 0x73, 0x8f, 0x8b, 0x95,
197			     0x7a, 0x57, 0xbe, 0xb2, 0x4d, 0x64, 0x6e, 0x99,
198			     0x4d, 0xc2, 0x9a, 0x27, 0x6a, 0xad, 0x45, 0x8d },
199		.public = { 0x34, 0x3a, 0xc2, 0x0a, 0x3b, 0x9c, 0x6a, 0x27,
200			    0xb1, 0x00, 0x81, 0x76, 0x50, 0x9a, 0xd3, 0x07,
201			    0x35, 0x85, 0x6e, 0xc1, 0xc8, 0xd8, 0xfc, 0xae,
202			    0x13, 0x91, 0x2d, 0x08, 0xd1, 0x52, 0xf4, 0x6c },
203		.result = { 0x39, 0x94, 0x91, 0xfc, 0xe8, 0xdf, 0xab, 0x73,
204			    0xb4, 0xf9, 0xf6, 0x11, 0xde, 0x8e, 0xa0, 0xb2,
205			    0x7b, 0x28, 0xf8, 0x59, 0x94, 0x25, 0x0b, 0x0f,
206			    0x47, 0x5d, 0x58, 0x5d, 0x04, 0x2a, 0xc2, 0x07 },
207		.valid = true
208	},
209	/* wycheproof - public key on twist */
210	{
211		.private = { 0xd8, 0x77, 0xb2, 0x6d, 0x06, 0xdf, 0xf9, 0xd9,
212			     0xf7, 0xfd, 0x4c, 0x5b, 0x37, 0x69, 0xf8, 0xcd,
213			     0xd5, 0xb3, 0x05, 0x16, 0xa5, 0xab, 0x80, 0x6b,
214			     0xe3, 0x24, 0xff, 0x3e, 0xb6, 0x9e, 0xa0, 0xb2 },
215		.public = { 0xfa, 0x69, 0x5f, 0xc7, 0xbe, 0x8d, 0x1b, 0xe5,
216			    0xbf, 0x70, 0x48, 0x98, 0xf3, 0x88, 0xc4, 0x52,
217			    0xba, 0xfd, 0xd3, 0xb8, 0xea, 0xe8, 0x05, 0xf8,
218			    0x68, 0x1a, 0x8d, 0x15, 0xc2, 0xd4, 0xe1, 0x42 },
219		.result = { 0x2c, 0x4f, 0xe1, 0x1d, 0x49, 0x0a, 0x53, 0x86,
220			    0x17, 0x76, 0xb1, 0x3b, 0x43, 0x54, 0xab, 0xd4,
221			    0xcf, 0x5a, 0x97, 0x69, 0x9d, 0xb6, 0xe6, 0xc6,
222			    0x8c, 0x16, 0x26, 0xd0, 0x76, 0x62, 0xf7, 0x58 },
223		.valid = true
224	},
225	/* wycheproof - public key = 0 */
226	{
227		.private = { 0x20, 0x74, 0x94, 0x03, 0x8f, 0x2b, 0xb8, 0x11,
228			     0xd4, 0x78, 0x05, 0xbc, 0xdf, 0x04, 0xa2, 0xac,
229			     0x58, 0x5a, 0xda, 0x7f, 0x2f, 0x23, 0x38, 0x9b,
230			     0xfd, 0x46, 0x58, 0xf9, 0xdd, 0xd4, 0xde, 0xbc },
231		.public = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
232			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
233			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
234			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
235		.result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
236			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
237			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
238			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
239		.valid = false
240	},
241	/* wycheproof - public key = 1 */
242	{
243		.private = { 0x20, 0x2e, 0x89, 0x72, 0xb6, 0x1c, 0x7e, 0x61,
244			     0x93, 0x0e, 0xb9, 0x45, 0x0b, 0x50, 0x70, 0xea,
245			     0xe1, 0xc6, 0x70, 0x47, 0x56, 0x85, 0x54, 0x1f,
246			     0x04, 0x76, 0x21, 0x7e, 0x48, 0x18, 0xcf, 0xab },
247		.public = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
248			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
249			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
250			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
251		.result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
252			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
253			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
254			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
255		.valid = false
256	},
257	/* wycheproof - edge case on twist */
258	{
259		.private = { 0x38, 0xdd, 0xe9, 0xf3, 0xe7, 0xb7, 0x99, 0x04,
260			     0x5f, 0x9a, 0xc3, 0x79, 0x3d, 0x4a, 0x92, 0x77,
261			     0xda, 0xde, 0xad, 0xc4, 0x1b, 0xec, 0x02, 0x90,
262			     0xf8, 0x1f, 0x74, 0x4f, 0x73, 0x77, 0x5f, 0x84 },
263		.public = { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
264			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
265			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
266			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
267		.result = { 0x9a, 0x2c, 0xfe, 0x84, 0xff, 0x9c, 0x4a, 0x97,
268			    0x39, 0x62, 0x5c, 0xae, 0x4a, 0x3b, 0x82, 0xa9,
269			    0x06, 0x87, 0x7a, 0x44, 0x19, 0x46, 0xf8, 0xd7,
270			    0xb3, 0xd7, 0x95, 0xfe, 0x8f, 0x5d, 0x16, 0x39 },
271		.valid = true
272	},
273	/* wycheproof - edge case on twist */
274	{
275		.private = { 0x98, 0x57, 0xa9, 0x14, 0xe3, 0xc2, 0x90, 0x36,
276			     0xfd, 0x9a, 0x44, 0x2b, 0xa5, 0x26, 0xb5, 0xcd,
277			     0xcd, 0xf2, 0x82, 0x16, 0x15, 0x3e, 0x63, 0x6c,
278			     0x10, 0x67, 0x7a, 0xca, 0xb6, 0xbd, 0x6a, 0xa5 },
279		.public = { 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
280			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
281			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
282			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
283		.result = { 0x4d, 0xa4, 0xe0, 0xaa, 0x07, 0x2c, 0x23, 0x2e,
284			    0xe2, 0xf0, 0xfa, 0x4e, 0x51, 0x9a, 0xe5, 0x0b,
285			    0x52, 0xc1, 0xed, 0xd0, 0x8a, 0x53, 0x4d, 0x4e,
286			    0xf3, 0x46, 0xc2, 0xe1, 0x06, 0xd2, 0x1d, 0x60 },
287		.valid = true
288	},
289	/* wycheproof - edge case on twist */
290	{
291		.private = { 0x48, 0xe2, 0x13, 0x0d, 0x72, 0x33, 0x05, 0xed,
292			     0x05, 0xe6, 0xe5, 0x89, 0x4d, 0x39, 0x8a, 0x5e,
293			     0x33, 0x36, 0x7a, 0x8c, 0x6a, 0xac, 0x8f, 0xcd,
294			     0xf0, 0xa8, 0x8e, 0x4b, 0x42, 0x82, 0x0d, 0xb7 },
295		.public = { 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0xf8, 0xff,
296			    0xff, 0x1f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff,
297			    0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00,
298			    0x00, 0xf0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00 },
299		.result = { 0x9e, 0xd1, 0x0c, 0x53, 0x74, 0x7f, 0x64, 0x7f,
300			    0x82, 0xf4, 0x51, 0x25, 0xd3, 0xde, 0x15, 0xa1,
301			    0xe6, 0xb8, 0x24, 0x49, 0x6a, 0xb4, 0x04, 0x10,
302			    0xff, 0xcc, 0x3c, 0xfe, 0x95, 0x76, 0x0f, 0x3b },
303		.valid = true
304	},
305	/* wycheproof - edge case on twist */
306	{
307		.private = { 0x28, 0xf4, 0x10, 0x11, 0x69, 0x18, 0x51, 0xb3,
308			     0xa6, 0x2b, 0x64, 0x15, 0x53, 0xb3, 0x0d, 0x0d,
309			     0xfd, 0xdc, 0xb8, 0xff, 0xfc, 0xf5, 0x37, 0x00,
310			     0xa7, 0xbe, 0x2f, 0x6a, 0x87, 0x2e, 0x9f, 0xb0 },
311		.public = { 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x07, 0x00,
312			    0x00, 0xe0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00,
313			    0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0xf8, 0xff,
314			    0xff, 0x0f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x7f },
315		.result = { 0xcf, 0x72, 0xb4, 0xaa, 0x6a, 0xa1, 0xc9, 0xf8,
316			    0x94, 0xf4, 0x16, 0x5b, 0x86, 0x10, 0x9a, 0xa4,
317			    0x68, 0x51, 0x76, 0x48, 0xe1, 0xf0, 0xcc, 0x70,
318			    0xe1, 0xab, 0x08, 0x46, 0x01, 0x76, 0x50, 0x6b },
319		.valid = true
320	},
321	/* wycheproof - edge case on twist */
322	{
323		.private = { 0x18, 0xa9, 0x3b, 0x64, 0x99, 0xb9, 0xf6, 0xb3,
324			     0x22, 0x5c, 0xa0, 0x2f, 0xef, 0x41, 0x0e, 0x0a,
325			     0xde, 0xc2, 0x35, 0x32, 0x32, 0x1d, 0x2d, 0x8e,
326			     0xf1, 0xa6, 0xd6, 0x02, 0xa8, 0xc6, 0x5b, 0x83 },
327		.public = { 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
328			    0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
329			    0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
330			    0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x7f },
331		.result = { 0x5d, 0x50, 0xb6, 0x28, 0x36, 0xbb, 0x69, 0x57,
332			    0x94, 0x10, 0x38, 0x6c, 0xf7, 0xbb, 0x81, 0x1c,
333			    0x14, 0xbf, 0x85, 0xb1, 0xc7, 0xb1, 0x7e, 0x59,
334			    0x24, 0xc7, 0xff, 0xea, 0x91, 0xef, 0x9e, 0x12 },
335		.valid = true
336	},
337	/* wycheproof - edge case on twist */
338	{
339		.private = { 0xc0, 0x1d, 0x13, 0x05, 0xa1, 0x33, 0x8a, 0x1f,
340			     0xca, 0xc2, 0xba, 0x7e, 0x2e, 0x03, 0x2b, 0x42,
341			     0x7e, 0x0b, 0x04, 0x90, 0x31, 0x65, 0xac, 0xa9,
342			     0x57, 0xd8, 0xd0, 0x55, 0x3d, 0x87, 0x17, 0xb0 },
343		.public = { 0xea, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
344			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
345			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
346			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
347		.result = { 0x19, 0x23, 0x0e, 0xb1, 0x48, 0xd5, 0xd6, 0x7c,
348			    0x3c, 0x22, 0xab, 0x1d, 0xae, 0xff, 0x80, 0xa5,
349			    0x7e, 0xae, 0x42, 0x65, 0xce, 0x28, 0x72, 0x65,
350			    0x7b, 0x2c, 0x80, 0x99, 0xfc, 0x69, 0x8e, 0x50 },
351		.valid = true
352	},
353	/* wycheproof - edge case for public key */
354	{
355		.private = { 0x38, 0x6f, 0x7f, 0x16, 0xc5, 0x07, 0x31, 0xd6,
356			     0x4f, 0x82, 0xe6, 0xa1, 0x70, 0xb1, 0x42, 0xa4,
357			     0xe3, 0x4f, 0x31, 0xfd, 0x77, 0x68, 0xfc, 0xb8,
358			     0x90, 0x29, 0x25, 0xe7, 0xd1, 0xe2, 0x1a, 0xbe },
359		.public = { 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
361			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
362			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
363		.result = { 0x0f, 0xca, 0xb5, 0xd8, 0x42, 0xa0, 0x78, 0xd7,
364			    0xa7, 0x1f, 0xc5, 0x9b, 0x57, 0xbf, 0xb4, 0xca,
365			    0x0b, 0xe6, 0x87, 0x3b, 0x49, 0xdc, 0xdb, 0x9f,
366			    0x44, 0xe1, 0x4a, 0xe8, 0xfb, 0xdf, 0xa5, 0x42 },
367		.valid = true
368	},
369	/* wycheproof - edge case for public key */
370	{
371		.private = { 0xe0, 0x23, 0xa2, 0x89, 0xbd, 0x5e, 0x90, 0xfa,
372			     0x28, 0x04, 0xdd, 0xc0, 0x19, 0xa0, 0x5e, 0xf3,
373			     0xe7, 0x9d, 0x43, 0x4b, 0xb6, 0xea, 0x2f, 0x52,
374			     0x2e, 0xcb, 0x64, 0x3a, 0x75, 0x29, 0x6e, 0x95 },
375		.public = { 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
376			    0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
377			    0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
378			    0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 },
379		.result = { 0x54, 0xce, 0x8f, 0x22, 0x75, 0xc0, 0x77, 0xe3,
380			    0xb1, 0x30, 0x6a, 0x39, 0x39, 0xc5, 0xe0, 0x3e,
381			    0xef, 0x6b, 0xbb, 0x88, 0x06, 0x05, 0x44, 0x75,
382			    0x8d, 0x9f, 0xef, 0x59, 0xb0, 0xbc, 0x3e, 0x4f },
383		.valid = true
384	},
385	/* wycheproof - edge case for public key */
386	{
387		.private = { 0x68, 0xf0, 0x10, 0xd6, 0x2e, 0xe8, 0xd9, 0x26,
388			     0x05, 0x3a, 0x36, 0x1c, 0x3a, 0x75, 0xc6, 0xea,
389			     0x4e, 0xbd, 0xc8, 0x60, 0x6a, 0xb2, 0x85, 0x00,
390			     0x3a, 0x6f, 0x8f, 0x40, 0x76, 0xb0, 0x1e, 0x83 },
391		.public = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
392			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
393			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
394			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03 },
395		.result = { 0xf1, 0x36, 0x77, 0x5c, 0x5b, 0xeb, 0x0a, 0xf8,
396			    0x11, 0x0a, 0xf1, 0x0b, 0x20, 0x37, 0x23, 0x32,
397			    0x04, 0x3c, 0xab, 0x75, 0x24, 0x19, 0x67, 0x87,
398			    0x75, 0xa2, 0x23, 0xdf, 0x57, 0xc9, 0xd3, 0x0d },
399		.valid = true
400	},
401	/* wycheproof - edge case for public key */
402	{
403		.private = { 0x58, 0xeb, 0xcb, 0x35, 0xb0, 0xf8, 0x84, 0x5c,
404			     0xaf, 0x1e, 0xc6, 0x30, 0xf9, 0x65, 0x76, 0xb6,
405			     0x2c, 0x4b, 0x7b, 0x6c, 0x36, 0xb2, 0x9d, 0xeb,
406			     0x2c, 0xb0, 0x08, 0x46, 0x51, 0x75, 0x5c, 0x96 },
407		.public = { 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xfb, 0xff,
408			    0xff, 0xdf, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff,
409			    0xfe, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xf7, 0xff,
410			    0xff, 0xf7, 0xff, 0xff, 0xbf, 0xff, 0xff, 0x3f },
411		.result = { 0xbf, 0x9a, 0xff, 0xd0, 0x6b, 0x84, 0x40, 0x85,
412			    0x58, 0x64, 0x60, 0x96, 0x2e, 0xf2, 0x14, 0x6f,
413			    0xf3, 0xd4, 0x53, 0x3d, 0x94, 0x44, 0xaa, 0xb0,
414			    0x06, 0xeb, 0x88, 0xcc, 0x30, 0x54, 0x40, 0x7d },
415		.valid = true
416	},
417	/* wycheproof - edge case for public key */
418	{
419		.private = { 0x18, 0x8c, 0x4b, 0xc5, 0xb9, 0xc4, 0x4b, 0x38,
420			     0xbb, 0x65, 0x8b, 0x9b, 0x2a, 0xe8, 0x2d, 0x5b,
421			     0x01, 0x01, 0x5e, 0x09, 0x31, 0x84, 0xb1, 0x7c,
422			     0xb7, 0x86, 0x35, 0x03, 0xa7, 0x83, 0xe1, 0xbb },
423		.public = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
424			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
425			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
426			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f },
427		.result = { 0xd4, 0x80, 0xde, 0x04, 0xf6, 0x99, 0xcb, 0x3b,
428			    0xe0, 0x68, 0x4a, 0x9c, 0xc2, 0xe3, 0x12, 0x81,
429			    0xea, 0x0b, 0xc5, 0xa9, 0xdc, 0xc1, 0x57, 0xd3,
430			    0xd2, 0x01, 0x58, 0xd4, 0x6c, 0xa5, 0x24, 0x6d },
431		.valid = true
432	},
433	/* wycheproof - edge case for public key */
434	{
435		.private = { 0xe0, 0x6c, 0x11, 0xbb, 0x2e, 0x13, 0xce, 0x3d,
436			     0xc7, 0x67, 0x3f, 0x67, 0xf5, 0x48, 0x22, 0x42,
437			     0x90, 0x94, 0x23, 0xa9, 0xae, 0x95, 0xee, 0x98,
438			     0x6a, 0x98, 0x8d, 0x98, 0xfa, 0xee, 0x23, 0xa2 },
439		.public = { 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x7f,
440			    0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x7f,
441			    0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x7f,
442			    0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x7f },
443		.result = { 0x4c, 0x44, 0x01, 0xcc, 0xe6, 0xb5, 0x1e, 0x4c,
444			    0xb1, 0x8f, 0x27, 0x90, 0x24, 0x6c, 0x9b, 0xf9,
445			    0x14, 0xdb, 0x66, 0x77, 0x50, 0xa1, 0xcb, 0x89,
446			    0x06, 0x90, 0x92, 0xaf, 0x07, 0x29, 0x22, 0x76 },
447		.valid = true
448	},
449	/* wycheproof - edge case for public key */
450	{
451		.private = { 0xc0, 0x65, 0x8c, 0x46, 0xdd, 0xe1, 0x81, 0x29,
452			     0x29, 0x38, 0x77, 0x53, 0x5b, 0x11, 0x62, 0xb6,
453			     0xf9, 0xf5, 0x41, 0x4a, 0x23, 0xcf, 0x4d, 0x2c,
454			     0xbc, 0x14, 0x0a, 0x4d, 0x99, 0xda, 0x2b, 0x8f },
455		.public = { 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
456			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
457			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
458			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
459		.result = { 0x57, 0x8b, 0xa8, 0xcc, 0x2d, 0xbd, 0xc5, 0x75,
460			    0xaf, 0xcf, 0x9d, 0xf2, 0xb3, 0xee, 0x61, 0x89,
461			    0xf5, 0x33, 0x7d, 0x68, 0x54, 0xc7, 0x9b, 0x4c,
462			    0xe1, 0x65, 0xea, 0x12, 0x29, 0x3b, 0x3a, 0x0f },
463		.valid = true
464	},
465	/* wycheproof - public key with low order */
466	{
467		.private = { 0x10, 0x25, 0x5c, 0x92, 0x30, 0xa9, 0x7a, 0x30,
468			     0xa4, 0x58, 0xca, 0x28, 0x4a, 0x62, 0x96, 0x69,
469			     0x29, 0x3a, 0x31, 0x89, 0x0c, 0xda, 0x9d, 0x14,
470			     0x7f, 0xeb, 0xc7, 0xd1, 0xe2, 0x2d, 0x6b, 0xb1 },
471		.public = { 0xe0, 0xeb, 0x7a, 0x7c, 0x3b, 0x41, 0xb8, 0xae,
472			    0x16, 0x56, 0xe3, 0xfa, 0xf1, 0x9f, 0xc4, 0x6a,
473			    0xda, 0x09, 0x8d, 0xeb, 0x9c, 0x32, 0xb1, 0xfd,
474			    0x86, 0x62, 0x05, 0x16, 0x5f, 0x49, 0xb8, 0x00 },
475		.result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
476			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
477			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
478			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
479		.valid = false
480	},
481	/* wycheproof - public key with low order */
482	{
483		.private = { 0x78, 0xf1, 0xe8, 0xed, 0xf1, 0x44, 0x81, 0xb3,
484			     0x89, 0x44, 0x8d, 0xac, 0x8f, 0x59, 0xc7, 0x0b,
485			     0x03, 0x8e, 0x7c, 0xf9, 0x2e, 0xf2, 0xc7, 0xef,
486			     0xf5, 0x7a, 0x72, 0x46, 0x6e, 0x11, 0x52, 0x96 },
487		.public = { 0x5f, 0x9c, 0x95, 0xbc, 0xa3, 0x50, 0x8c, 0x24,
488			    0xb1, 0xd0, 0xb1, 0x55, 0x9c, 0x83, 0xef, 0x5b,
489			    0x04, 0x44, 0x5c, 0xc4, 0x58, 0x1c, 0x8e, 0x86,
490			    0xd8, 0x22, 0x4e, 0xdd, 0xd0, 0x9f, 0x11, 0x57 },
491		.result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
492			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
493			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
494			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
495		.valid = false
496	},
497	/* wycheproof - public key with low order */
498	{
499		.private = { 0xa0, 0xa0, 0x5a, 0x3e, 0x8f, 0x9f, 0x44, 0x20,
500			     0x4d, 0x5f, 0x80, 0x59, 0xa9, 0x4a, 0xc7, 0xdf,
501			     0xc3, 0x9a, 0x49, 0xac, 0x01, 0x6d, 0xd7, 0x43,
502			     0xdb, 0xfa, 0x43, 0xc5, 0xd6, 0x71, 0xfd, 0x88 },
503		.public = { 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
504			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
505			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
506			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
507		.result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
508			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
509			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
510			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
511		.valid = false
512	},
513	/* wycheproof - public key with low order */
514	{
515		.private = { 0xd0, 0xdb, 0xb3, 0xed, 0x19, 0x06, 0x66, 0x3f,
516			     0x15, 0x42, 0x0a, 0xf3, 0x1f, 0x4e, 0xaf, 0x65,
517			     0x09, 0xd9, 0xa9, 0x94, 0x97, 0x23, 0x50, 0x06,
518			     0x05, 0xad, 0x7c, 0x1c, 0x6e, 0x74, 0x50, 0xa9 },
519		.public = { 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
520			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
521			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
522			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
523		.result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
524			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
525			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
526			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
527		.valid = false
528	},
529	/* wycheproof - public key with low order */
530	{
531		.private = { 0xc0, 0xb1, 0xd0, 0xeb, 0x22, 0xb2, 0x44, 0xfe,
532			     0x32, 0x91, 0x14, 0x00, 0x72, 0xcd, 0xd9, 0xd9,
533			     0x89, 0xb5, 0xf0, 0xec, 0xd9, 0x6c, 0x10, 0x0f,
534			     0xeb, 0x5b, 0xca, 0x24, 0x1c, 0x1d, 0x9f, 0x8f },
535		.public = { 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
536			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
537			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
538			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
539		.result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
540			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
541			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
542			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
543		.valid = false
544	},
545	/* wycheproof - public key with low order */
546	{
547		.private = { 0x48, 0x0b, 0xf4, 0x5f, 0x59, 0x49, 0x42, 0xa8,
548			     0xbc, 0x0f, 0x33, 0x53, 0xc6, 0xe8, 0xb8, 0x85,
549			     0x3d, 0x77, 0xf3, 0x51, 0xf1, 0xc2, 0xca, 0x6c,
550			     0x2d, 0x1a, 0xbf, 0x8a, 0x00, 0xb4, 0x22, 0x9c },
551		.public = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
552			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
553			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
554			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 },
555		.result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
556			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
557			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
558			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
559		.valid = false
560	},
561	/* wycheproof - public key with low order */
562	{
563		.private = { 0x30, 0xf9, 0x93, 0xfc, 0xf8, 0x51, 0x4f, 0xc8,
564			     0x9b, 0xd8, 0xdb, 0x14, 0xcd, 0x43, 0xba, 0x0d,
565			     0x4b, 0x25, 0x30, 0xe7, 0x3c, 0x42, 0x76, 0xa0,
566			     0x5e, 0x1b, 0x14, 0x5d, 0x42, 0x0c, 0xed, 0xb4 },
567		.public = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
568			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
569			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
570			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 },
571		.result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
572			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
573			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
574			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
575		.valid = false
576	},
577	/* wycheproof - public key with low order */
578	{
579		.private = { 0xc0, 0x49, 0x74, 0xb7, 0x58, 0x38, 0x0e, 0x2a,
580			     0x5b, 0x5d, 0xf6, 0xeb, 0x09, 0xbb, 0x2f, 0x6b,
581			     0x34, 0x34, 0xf9, 0x82, 0x72, 0x2a, 0x8e, 0x67,
582			     0x6d, 0x3d, 0xa2, 0x51, 0xd1, 0xb3, 0xde, 0x83 },
583		.public = { 0xe0, 0xeb, 0x7a, 0x7c, 0x3b, 0x41, 0xb8, 0xae,
584			    0x16, 0x56, 0xe3, 0xfa, 0xf1, 0x9f, 0xc4, 0x6a,
585			    0xda, 0x09, 0x8d, 0xeb, 0x9c, 0x32, 0xb1, 0xfd,
586			    0x86, 0x62, 0x05, 0x16, 0x5f, 0x49, 0xb8, 0x80 },
587		.result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
588			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
589			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
590			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
591		.valid = false
592	},
593	/* wycheproof - public key with low order */
594	{
595		.private = { 0x50, 0x2a, 0x31, 0x37, 0x3d, 0xb3, 0x24, 0x46,
596			     0x84, 0x2f, 0xe5, 0xad, 0xd3, 0xe0, 0x24, 0x02,
597			     0x2e, 0xa5, 0x4f, 0x27, 0x41, 0x82, 0xaf, 0xc3,
598			     0xd9, 0xf1, 0xbb, 0x3d, 0x39, 0x53, 0x4e, 0xb5 },
599		.public = { 0x5f, 0x9c, 0x95, 0xbc, 0xa3, 0x50, 0x8c, 0x24,
600			    0xb1, 0xd0, 0xb1, 0x55, 0x9c, 0x83, 0xef, 0x5b,
601			    0x04, 0x44, 0x5c, 0xc4, 0x58, 0x1c, 0x8e, 0x86,
602			    0xd8, 0x22, 0x4e, 0xdd, 0xd0, 0x9f, 0x11, 0xd7 },
603		.result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
604			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
605			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
606			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
607		.valid = false
608	},
609	/* wycheproof - public key with low order */
610	{
611		.private = { 0x90, 0xfa, 0x64, 0x17, 0xb0, 0xe3, 0x70, 0x30,
612			     0xfd, 0x6e, 0x43, 0xef, 0xf2, 0xab, 0xae, 0xf1,
613			     0x4c, 0x67, 0x93, 0x11, 0x7a, 0x03, 0x9c, 0xf6,
614			     0x21, 0x31, 0x8b, 0xa9, 0x0f, 0x4e, 0x98, 0xbe },
615		.public = { 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
616			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
617			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
618			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
619		.result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
620			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
621			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
622			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
623		.valid = false
624	},
625	/* wycheproof - public key with low order */
626	{
627		.private = { 0x78, 0xad, 0x3f, 0x26, 0x02, 0x7f, 0x1c, 0x9f,
628			     0xdd, 0x97, 0x5a, 0x16, 0x13, 0xb9, 0x47, 0x77,
629			     0x9b, 0xad, 0x2c, 0xf2, 0xb7, 0x41, 0xad, 0xe0,
630			     0x18, 0x40, 0x88, 0x5a, 0x30, 0xbb, 0x97, 0x9c },
631		.public = { 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
632			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
633			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
634			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
635		.result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
636			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
637			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
638			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
639		.valid = false
640	},
641	/* wycheproof - public key with low order */
642	{
643		.private = { 0x98, 0xe2, 0x3d, 0xe7, 0xb1, 0xe0, 0x92, 0x6e,
644			     0xd9, 0xc8, 0x7e, 0x7b, 0x14, 0xba, 0xf5, 0x5f,
645			     0x49, 0x7a, 0x1d, 0x70, 0x96, 0xf9, 0x39, 0x77,
646			     0x68, 0x0e, 0x44, 0xdc, 0x1c, 0x7b, 0x7b, 0x8b },
647		.public = { 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
648			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
649			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
650			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
651		.result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
652			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
653			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
654			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
655		.valid = false
656	},
657	/* wycheproof - public key >= p */
658	{
659		.private = { 0xf0, 0x1e, 0x48, 0xda, 0xfa, 0xc9, 0xd7, 0xbc,
660			     0xf5, 0x89, 0xcb, 0xc3, 0x82, 0xc8, 0x78, 0xd1,
661			     0x8b, 0xda, 0x35, 0x50, 0x58, 0x9f, 0xfb, 0x5d,
662			     0x50, 0xb5, 0x23, 0xbe, 0xbe, 0x32, 0x9d, 0xae },
663		.public = { 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
664			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
665			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
666			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
667		.result = { 0xbd, 0x36, 0xa0, 0x79, 0x0e, 0xb8, 0x83, 0x09,
668			    0x8c, 0x98, 0x8b, 0x21, 0x78, 0x67, 0x73, 0xde,
669			    0x0b, 0x3a, 0x4d, 0xf1, 0x62, 0x28, 0x2c, 0xf1,
670			    0x10, 0xde, 0x18, 0xdd, 0x48, 0x4c, 0xe7, 0x4b },
671		.valid = true
672	},
673	/* wycheproof - public key >= p */
674	{
675		.private = { 0x28, 0x87, 0x96, 0xbc, 0x5a, 0xff, 0x4b, 0x81,
676			     0xa3, 0x75, 0x01, 0x75, 0x7b, 0xc0, 0x75, 0x3a,
677			     0x3c, 0x21, 0x96, 0x47, 0x90, 0xd3, 0x86, 0x99,
678			     0x30, 0x8d, 0xeb, 0xc1, 0x7a, 0x6e, 0xaf, 0x8d },
679		.public = { 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
680			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
681			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
682			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
683		.result = { 0xb4, 0xe0, 0xdd, 0x76, 0xda, 0x7b, 0x07, 0x17,
684			    0x28, 0xb6, 0x1f, 0x85, 0x67, 0x71, 0xaa, 0x35,
685			    0x6e, 0x57, 0xed, 0xa7, 0x8a, 0x5b, 0x16, 0x55,
686			    0xcc, 0x38, 0x20, 0xfb, 0x5f, 0x85, 0x4c, 0x5c },
687		.valid = true
688	},
689	/* wycheproof - public key >= p */
690	{
691		.private = { 0x98, 0xdf, 0x84, 0x5f, 0x66, 0x51, 0xbf, 0x11,
692			     0x38, 0x22, 0x1f, 0x11, 0x90, 0x41, 0xf7, 0x2b,
693			     0x6d, 0xbc, 0x3c, 0x4a, 0xce, 0x71, 0x43, 0xd9,
694			     0x9f, 0xd5, 0x5a, 0xd8, 0x67, 0x48, 0x0d, 0xa8 },
695		.public = { 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
696			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
697			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
698			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
699		.result = { 0x6f, 0xdf, 0x6c, 0x37, 0x61, 0x1d, 0xbd, 0x53,
700			    0x04, 0xdc, 0x0f, 0x2e, 0xb7, 0xc9, 0x51, 0x7e,
701			    0xb3, 0xc5, 0x0e, 0x12, 0xfd, 0x05, 0x0a, 0xc6,
702			    0xde, 0xc2, 0x70, 0x71, 0xd4, 0xbf, 0xc0, 0x34 },
703		.valid = true
704	},
705	/* wycheproof - public key >= p */
706	{
707		.private = { 0xf0, 0x94, 0x98, 0xe4, 0x6f, 0x02, 0xf8, 0x78,
708			     0x82, 0x9e, 0x78, 0xb8, 0x03, 0xd3, 0x16, 0xa2,
709			     0xed, 0x69, 0x5d, 0x04, 0x98, 0xa0, 0x8a, 0xbd,
710			     0xf8, 0x27, 0x69, 0x30, 0xe2, 0x4e, 0xdc, 0xb0 },
711		.public = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
712			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
713			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
714			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
715		.result = { 0x4c, 0x8f, 0xc4, 0xb1, 0xc6, 0xab, 0x88, 0xfb,
716			    0x21, 0xf1, 0x8f, 0x6d, 0x4c, 0x81, 0x02, 0x40,
717			    0xd4, 0xe9, 0x46, 0x51, 0xba, 0x44, 0xf7, 0xa2,
718			    0xc8, 0x63, 0xce, 0xc7, 0xdc, 0x56, 0x60, 0x2d },
719		.valid = true
720	},
721	/* wycheproof - public key >= p */
722	{
723		.private = { 0x18, 0x13, 0xc1, 0x0a, 0x5c, 0x7f, 0x21, 0xf9,
724			     0x6e, 0x17, 0xf2, 0x88, 0xc0, 0xcc, 0x37, 0x60,
725			     0x7c, 0x04, 0xc5, 0xf5, 0xae, 0xa2, 0xdb, 0x13,
726			     0x4f, 0x9e, 0x2f, 0xfc, 0x66, 0xbd, 0x9d, 0xb8 },
727		.public = { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
728			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
729			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
730			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 },
731		.result = { 0x1c, 0xd0, 0xb2, 0x82, 0x67, 0xdc, 0x54, 0x1c,
732			    0x64, 0x2d, 0x6d, 0x7d, 0xca, 0x44, 0xa8, 0xb3,
733			    0x8a, 0x63, 0x73, 0x6e, 0xef, 0x5c, 0x4e, 0x65,
734			    0x01, 0xff, 0xbb, 0xb1, 0x78, 0x0c, 0x03, 0x3c },
735		.valid = true
736	},
737	/* wycheproof - public key >= p */
738	{
739		.private = { 0x78, 0x57, 0xfb, 0x80, 0x86, 0x53, 0x64, 0x5a,
740			     0x0b, 0xeb, 0x13, 0x8a, 0x64, 0xf5, 0xf4, 0xd7,
741			     0x33, 0xa4, 0x5e, 0xa8, 0x4c, 0x3c, 0xda, 0x11,
742			     0xa9, 0xc0, 0x6f, 0x7e, 0x71, 0x39, 0x14, 0x9e },
743		.public = { 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
744			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
745			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
746			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 },
747		.result = { 0x87, 0x55, 0xbe, 0x01, 0xc6, 0x0a, 0x7e, 0x82,
748			    0x5c, 0xff, 0x3e, 0x0e, 0x78, 0xcb, 0x3a, 0xa4,
749			    0x33, 0x38, 0x61, 0x51, 0x6a, 0xa5, 0x9b, 0x1c,
750			    0x51, 0xa8, 0xb2, 0xa5, 0x43, 0xdf, 0xa8, 0x22 },
751		.valid = true
752	},
753	/* wycheproof - public key >= p */
754	{
755		.private = { 0xe0, 0x3a, 0xa8, 0x42, 0xe2, 0xab, 0xc5, 0x6e,
756			     0x81, 0xe8, 0x7b, 0x8b, 0x9f, 0x41, 0x7b, 0x2a,
757			     0x1e, 0x59, 0x13, 0xc7, 0x23, 0xee, 0xd2, 0x8d,
758			     0x75, 0x2f, 0x8d, 0x47, 0xa5, 0x9f, 0x49, 0x8f },
759		.public = { 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
760			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
761			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
762			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 },
763		.result = { 0x54, 0xc9, 0xa1, 0xed, 0x95, 0xe5, 0x46, 0xd2,
764			    0x78, 0x22, 0xa3, 0x60, 0x93, 0x1d, 0xda, 0x60,
765			    0xa1, 0xdf, 0x04, 0x9d, 0xa6, 0xf9, 0x04, 0x25,
766			    0x3c, 0x06, 0x12, 0xbb, 0xdc, 0x08, 0x74, 0x76 },
767		.valid = true
768	},
769	/* wycheproof - public key >= p */
770	{
771		.private = { 0xf8, 0xf7, 0x07, 0xb7, 0x99, 0x9b, 0x18, 0xcb,
772			     0x0d, 0x6b, 0x96, 0x12, 0x4f, 0x20, 0x45, 0x97,
773			     0x2c, 0xa2, 0x74, 0xbf, 0xc1, 0x54, 0xad, 0x0c,
774			     0x87, 0x03, 0x8c, 0x24, 0xc6, 0xd0, 0xd4, 0xb2 },
775		.public = { 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
776			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
777			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
778			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
779		.result = { 0xcc, 0x1f, 0x40, 0xd7, 0x43, 0xcd, 0xc2, 0x23,
780			    0x0e, 0x10, 0x43, 0xda, 0xba, 0x8b, 0x75, 0xe8,
781			    0x10, 0xf1, 0xfb, 0xab, 0x7f, 0x25, 0x52, 0x69,
782			    0xbd, 0x9e, 0xbb, 0x29, 0xe6, 0xbf, 0x49, 0x4f },
783		.valid = true
784	},
785	/* wycheproof - public key >= p */
786	{
787		.private = { 0xa0, 0x34, 0xf6, 0x84, 0xfa, 0x63, 0x1e, 0x1a,
788			     0x34, 0x81, 0x18, 0xc1, 0xce, 0x4c, 0x98, 0x23,
789			     0x1f, 0x2d, 0x9e, 0xec, 0x9b, 0xa5, 0x36, 0x5b,
790			     0x4a, 0x05, 0xd6, 0x9a, 0x78, 0x5b, 0x07, 0x96 },
791		.public = { 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
792			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
793			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
794			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
795		.result = { 0x54, 0x99, 0x8e, 0xe4, 0x3a, 0x5b, 0x00, 0x7b,
796			    0xf4, 0x99, 0xf0, 0x78, 0xe7, 0x36, 0x52, 0x44,
797			    0x00, 0xa8, 0xb5, 0xc7, 0xe9, 0xb9, 0xb4, 0x37,
798			    0x71, 0x74, 0x8c, 0x7c, 0xdf, 0x88, 0x04, 0x12 },
799		.valid = true
800	},
801	/* wycheproof - public key >= p */
802	{
803		.private = { 0x30, 0xb6, 0xc6, 0xa0, 0xf2, 0xff, 0xa6, 0x80,
804			     0x76, 0x8f, 0x99, 0x2b, 0xa8, 0x9e, 0x15, 0x2d,
805			     0x5b, 0xc9, 0x89, 0x3d, 0x38, 0xc9, 0x11, 0x9b,
806			     0xe4, 0xf7, 0x67, 0xbf, 0xab, 0x6e, 0x0c, 0xa5 },
807		.public = { 0xdc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
808			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
809			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
810			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
811		.result = { 0xea, 0xd9, 0xb3, 0x8e, 0xfd, 0xd7, 0x23, 0x63,
812			    0x79, 0x34, 0xe5, 0x5a, 0xb7, 0x17, 0xa7, 0xae,
813			    0x09, 0xeb, 0x86, 0xa2, 0x1d, 0xc3, 0x6a, 0x3f,
814			    0xee, 0xb8, 0x8b, 0x75, 0x9e, 0x39, 0x1e, 0x09 },
815		.valid = true
816	},
817	/* wycheproof - public key >= p */
818	{
819		.private = { 0x90, 0x1b, 0x9d, 0xcf, 0x88, 0x1e, 0x01, 0xe0,
820			     0x27, 0x57, 0x50, 0x35, 0xd4, 0x0b, 0x43, 0xbd,
821			     0xc1, 0xc5, 0x24, 0x2e, 0x03, 0x08, 0x47, 0x49,
822			     0x5b, 0x0c, 0x72, 0x86, 0x46, 0x9b, 0x65, 0x91 },
823		.public = { 0xea, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
824			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
825			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
826			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
827		.result = { 0x60, 0x2f, 0xf4, 0x07, 0x89, 0xb5, 0x4b, 0x41,
828			    0x80, 0x59, 0x15, 0xfe, 0x2a, 0x62, 0x21, 0xf0,
829			    0x7a, 0x50, 0xff, 0xc2, 0xc3, 0xfc, 0x94, 0xcf,
830			    0x61, 0xf1, 0x3d, 0x79, 0x04, 0xe8, 0x8e, 0x0e },
831		.valid = true
832	},
833	/* wycheproof - public key >= p */
834	{
835		.private = { 0x80, 0x46, 0x67, 0x7c, 0x28, 0xfd, 0x82, 0xc9,
836			     0xa1, 0xbd, 0xb7, 0x1a, 0x1a, 0x1a, 0x34, 0xfa,
837			     0xba, 0x12, 0x25, 0xe2, 0x50, 0x7f, 0xe3, 0xf5,
838			     0x4d, 0x10, 0xbd, 0x5b, 0x0d, 0x86, 0x5f, 0x8e },
839		.public = { 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
840			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
841			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
842			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
843		.result = { 0xe0, 0x0a, 0xe8, 0xb1, 0x43, 0x47, 0x12, 0x47,
844			    0xba, 0x24, 0xf1, 0x2c, 0x88, 0x55, 0x36, 0xc3,
845			    0xcb, 0x98, 0x1b, 0x58, 0xe1, 0xe5, 0x6b, 0x2b,
846			    0xaf, 0x35, 0xc1, 0x2a, 0xe1, 0xf7, 0x9c, 0x26 },
847		.valid = true
848	},
849	/* wycheproof - public key >= p */
850	{
851		.private = { 0x60, 0x2f, 0x7e, 0x2f, 0x68, 0xa8, 0x46, 0xb8,
852			     0x2c, 0xc2, 0x69, 0xb1, 0xd4, 0x8e, 0x93, 0x98,
853			     0x86, 0xae, 0x54, 0xfd, 0x63, 0x6c, 0x1f, 0xe0,
854			     0x74, 0xd7, 0x10, 0x12, 0x7d, 0x47, 0x24, 0x91 },
855		.public = { 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
856			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
857			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
858			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
859		.result = { 0x98, 0xcb, 0x9b, 0x50, 0xdd, 0x3f, 0xc2, 0xb0,
860			    0xd4, 0xf2, 0xd2, 0xbf, 0x7c, 0x5c, 0xfd, 0xd1,
861			    0x0c, 0x8f, 0xcd, 0x31, 0xfc, 0x40, 0xaf, 0x1a,
862			    0xd4, 0x4f, 0x47, 0xc1, 0x31, 0x37, 0x63, 0x62 },
863		.valid = true
864	},
865	/* wycheproof - public key >= p */
866	{
867		.private = { 0x60, 0x88, 0x7b, 0x3d, 0xc7, 0x24, 0x43, 0x02,
868			     0x6e, 0xbe, 0xdb, 0xbb, 0xb7, 0x06, 0x65, 0xf4,
869			     0x2b, 0x87, 0xad, 0xd1, 0x44, 0x0e, 0x77, 0x68,
870			     0xfb, 0xd7, 0xe8, 0xe2, 0xce, 0x5f, 0x63, 0x9d },
871		.public = { 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
872			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
873			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
874			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
875		.result = { 0x38, 0xd6, 0x30, 0x4c, 0x4a, 0x7e, 0x6d, 0x9f,
876			    0x79, 0x59, 0x33, 0x4f, 0xb5, 0x24, 0x5b, 0xd2,
877			    0xc7, 0x54, 0x52, 0x5d, 0x4c, 0x91, 0xdb, 0x95,
878			    0x02, 0x06, 0x92, 0x62, 0x34, 0xc1, 0xf6, 0x33 },
879		.valid = true
880	},
881	/* wycheproof - public key >= p */
882	{
883		.private = { 0x78, 0xd3, 0x1d, 0xfa, 0x85, 0x44, 0x97, 0xd7,
884			     0x2d, 0x8d, 0xef, 0x8a, 0x1b, 0x7f, 0xb0, 0x06,
885			     0xce, 0xc2, 0xd8, 0xc4, 0x92, 0x46, 0x47, 0xc9,
886			     0x38, 0x14, 0xae, 0x56, 0xfa, 0xed, 0xa4, 0x95 },
887		.public = { 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
888			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
889			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
890			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
891		.result = { 0x78, 0x6c, 0xd5, 0x49, 0x96, 0xf0, 0x14, 0xa5,
892			    0xa0, 0x31, 0xec, 0x14, 0xdb, 0x81, 0x2e, 0xd0,
893			    0x83, 0x55, 0x06, 0x1f, 0xdb, 0x5d, 0xe6, 0x80,
894			    0xa8, 0x00, 0xac, 0x52, 0x1f, 0x31, 0x8e, 0x23 },
895		.valid = true
896	},
897	/* wycheproof - public key >= p */
898	{
899		.private = { 0xc0, 0x4c, 0x5b, 0xae, 0xfa, 0x83, 0x02, 0xdd,
900			     0xde, 0xd6, 0xa4, 0xbb, 0x95, 0x77, 0x61, 0xb4,
901			     0xeb, 0x97, 0xae, 0xfa, 0x4f, 0xc3, 0xb8, 0x04,
902			     0x30, 0x85, 0xf9, 0x6a, 0x56, 0x59, 0xb3, 0xa5 },
903		.public = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
904			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
905			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
906			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
907		.result = { 0x29, 0xae, 0x8b, 0xc7, 0x3e, 0x9b, 0x10, 0xa0,
908			    0x8b, 0x4f, 0x68, 0x1c, 0x43, 0xc3, 0xe0, 0xac,
909			    0x1a, 0x17, 0x1d, 0x31, 0xb3, 0x8f, 0x1a, 0x48,
910			    0xef, 0xba, 0x29, 0xae, 0x63, 0x9e, 0xa1, 0x34 },
911		.valid = true
912	},
913	/* wycheproof - RFC 7748 */
914	{
915		.private = { 0xa0, 0x46, 0xe3, 0x6b, 0xf0, 0x52, 0x7c, 0x9d,
916			     0x3b, 0x16, 0x15, 0x4b, 0x82, 0x46, 0x5e, 0xdd,
917			     0x62, 0x14, 0x4c, 0x0a, 0xc1, 0xfc, 0x5a, 0x18,
918			     0x50, 0x6a, 0x22, 0x44, 0xba, 0x44, 0x9a, 0x44 },
919		.public = { 0xe6, 0xdb, 0x68, 0x67, 0x58, 0x30, 0x30, 0xdb,
920			    0x35, 0x94, 0xc1, 0xa4, 0x24, 0xb1, 0x5f, 0x7c,
921			    0x72, 0x66, 0x24, 0xec, 0x26, 0xb3, 0x35, 0x3b,
922			    0x10, 0xa9, 0x03, 0xa6, 0xd0, 0xab, 0x1c, 0x4c },
923		.result = { 0xc3, 0xda, 0x55, 0x37, 0x9d, 0xe9, 0xc6, 0x90,
924			    0x8e, 0x94, 0xea, 0x4d, 0xf2, 0x8d, 0x08, 0x4f,
925			    0x32, 0xec, 0xcf, 0x03, 0x49, 0x1c, 0x71, 0xf7,
926			    0x54, 0xb4, 0x07, 0x55, 0x77, 0xa2, 0x85, 0x52 },
927		.valid = true
928	},
929	/* wycheproof - RFC 7748 */
930	{
931		.private = { 0x48, 0x66, 0xe9, 0xd4, 0xd1, 0xb4, 0x67, 0x3c,
932			     0x5a, 0xd2, 0x26, 0x91, 0x95, 0x7d, 0x6a, 0xf5,
933			     0xc1, 0x1b, 0x64, 0x21, 0xe0, 0xea, 0x01, 0xd4,
934			     0x2c, 0xa4, 0x16, 0x9e, 0x79, 0x18, 0xba, 0x4d },
935		.public = { 0xe5, 0x21, 0x0f, 0x12, 0x78, 0x68, 0x11, 0xd3,
936			    0xf4, 0xb7, 0x95, 0x9d, 0x05, 0x38, 0xae, 0x2c,
937			    0x31, 0xdb, 0xe7, 0x10, 0x6f, 0xc0, 0x3c, 0x3e,
938			    0xfc, 0x4c, 0xd5, 0x49, 0xc7, 0x15, 0xa4, 0x13 },
939		.result = { 0x95, 0xcb, 0xde, 0x94, 0x76, 0xe8, 0x90, 0x7d,
940			    0x7a, 0xad, 0xe4, 0x5c, 0xb4, 0xb8, 0x73, 0xf8,
941			    0x8b, 0x59, 0x5a, 0x68, 0x79, 0x9f, 0xa1, 0x52,
942			    0xe6, 0xf8, 0xf7, 0x64, 0x7a, 0xac, 0x79, 0x57 },
943		.valid = true
944	},
945	/* wycheproof - edge case for shared secret */
946	{
947		.private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
948			     0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
949			     0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
950			     0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
951		.public = { 0x0a, 0xb4, 0xe7, 0x63, 0x80, 0xd8, 0x4d, 0xde,
952			    0x4f, 0x68, 0x33, 0xc5, 0x8f, 0x2a, 0x9f, 0xb8,
953			    0xf8, 0x3b, 0xb0, 0x16, 0x9b, 0x17, 0x2b, 0xe4,
954			    0xb6, 0xe0, 0x59, 0x28, 0x87, 0x74, 0x1a, 0x36 },
955		.result = { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
956			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
957			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
958			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
959		.valid = true
960	},
961	/* wycheproof - edge case for shared secret */
962	{
963		.private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
964			     0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
965			     0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
966			     0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
967		.public = { 0x89, 0xe1, 0x0d, 0x57, 0x01, 0xb4, 0x33, 0x7d,
968			    0x2d, 0x03, 0x21, 0x81, 0x53, 0x8b, 0x10, 0x64,
969			    0xbd, 0x40, 0x84, 0x40, 0x1c, 0xec, 0xa1, 0xfd,
970			    0x12, 0x66, 0x3a, 0x19, 0x59, 0x38, 0x80, 0x00 },
971		.result = { 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
972			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
973			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
974			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
975		.valid = true
976	},
977	/* wycheproof - edge case for shared secret */
978	{
979		.private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
980			     0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
981			     0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
982			     0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
983		.public = { 0x2b, 0x55, 0xd3, 0xaa, 0x4a, 0x8f, 0x80, 0xc8,
984			    0xc0, 0xb2, 0xae, 0x5f, 0x93, 0x3e, 0x85, 0xaf,
985			    0x49, 0xbe, 0xac, 0x36, 0xc2, 0xfa, 0x73, 0x94,
986			    0xba, 0xb7, 0x6c, 0x89, 0x33, 0xf8, 0xf8, 0x1d },
987		.result = { 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
988			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
989			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
990			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
991		.valid = true
992	},
993	/* wycheproof - edge case for shared secret */
994	{
995		.private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
996			     0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
997			     0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
998			     0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
999		.public = { 0x63, 0xe5, 0xb1, 0xfe, 0x96, 0x01, 0xfe, 0x84,
1000			    0x38, 0x5d, 0x88, 0x66, 0xb0, 0x42, 0x12, 0x62,
1001			    0xf7, 0x8f, 0xbf, 0xa5, 0xaf, 0xf9, 0x58, 0x5e,
1002			    0x62, 0x66, 0x79, 0xb1, 0x85, 0x47, 0xd9, 0x59 },
1003		.result = { 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1004			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1005			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1006			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f },
1007		.valid = true
1008	},
1009	/* wycheproof - edge case for shared secret */
1010	{
1011		.private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
1012			     0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
1013			     0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
1014			     0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
1015		.public = { 0xe4, 0x28, 0xf3, 0xda, 0xc1, 0x78, 0x09, 0xf8,
1016			    0x27, 0xa5, 0x22, 0xce, 0x32, 0x35, 0x50, 0x58,
1017			    0xd0, 0x73, 0x69, 0x36, 0x4a, 0xa7, 0x89, 0x02,
1018			    0xee, 0x10, 0x13, 0x9b, 0x9f, 0x9d, 0xd6, 0x53 },
1019		.result = { 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1020			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1021			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1022			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f },
1023		.valid = true
1024	},
1025	/* wycheproof - edge case for shared secret */
1026	{
1027		.private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
1028			     0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
1029			     0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
1030			     0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
1031		.public = { 0xb3, 0xb5, 0x0e, 0x3e, 0xd3, 0xa4, 0x07, 0xb9,
1032			    0x5d, 0xe9, 0x42, 0xef, 0x74, 0x57, 0x5b, 0x5a,
1033			    0xb8, 0xa1, 0x0c, 0x09, 0xee, 0x10, 0x35, 0x44,
1034			    0xd6, 0x0b, 0xdf, 0xed, 0x81, 0x38, 0xab, 0x2b },
1035		.result = { 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1036			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1037			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1038			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f },
1039		.valid = true
1040	},
1041	/* wycheproof - edge case for shared secret */
1042	{
1043		.private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
1044			     0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
1045			     0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
1046			     0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
1047		.public = { 0x21, 0x3f, 0xff, 0xe9, 0x3d, 0x5e, 0xa8, 0xcd,
1048			    0x24, 0x2e, 0x46, 0x28, 0x44, 0x02, 0x99, 0x22,
1049			    0xc4, 0x3c, 0x77, 0xc9, 0xe3, 0xe4, 0x2f, 0x56,
1050			    0x2f, 0x48, 0x5d, 0x24, 0xc5, 0x01, 0xa2, 0x0b },
1051		.result = { 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1052			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1053			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1054			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f },
1055		.valid = true
1056	},
1057	/* wycheproof - edge case for shared secret */
1058	{
1059		.private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
1060			     0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
1061			     0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
1062			     0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
1063		.public = { 0x91, 0xb2, 0x32, 0xa1, 0x78, 0xb3, 0xcd, 0x53,
1064			    0x09, 0x32, 0x44, 0x1e, 0x61, 0x39, 0x41, 0x8f,
1065			    0x72, 0x17, 0x22, 0x92, 0xf1, 0xda, 0x4c, 0x18,
1066			    0x34, 0xfc, 0x5e, 0xbf, 0xef, 0xb5, 0x1e, 0x3f },
1067		.result = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1068			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1069			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1070			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03 },
1071		.valid = true
1072	},
1073	/* wycheproof - edge case for shared secret */
1074	{
1075		.private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
1076			     0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
1077			     0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
1078			     0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
1079		.public = { 0x04, 0x5c, 0x6e, 0x11, 0xc5, 0xd3, 0x32, 0x55,
1080			    0x6c, 0x78, 0x22, 0xfe, 0x94, 0xeb, 0xf8, 0x9b,
1081			    0x56, 0xa3, 0x87, 0x8d, 0xc2, 0x7c, 0xa0, 0x79,
1082			    0x10, 0x30, 0x58, 0x84, 0x9f, 0xab, 0xcb, 0x4f },
1083		.result = { 0xe5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1084			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1085			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1086			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
1087		.valid = true
1088	},
1089	/* wycheproof - edge case for shared secret */
1090	{
1091		.private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
1092			     0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
1093			     0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
1094			     0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
1095		.public = { 0x1c, 0xa2, 0x19, 0x0b, 0x71, 0x16, 0x35, 0x39,
1096			    0x06, 0x3c, 0x35, 0x77, 0x3b, 0xda, 0x0c, 0x9c,
1097			    0x92, 0x8e, 0x91, 0x36, 0xf0, 0x62, 0x0a, 0xeb,
1098			    0x09, 0x3f, 0x09, 0x91, 0x97, 0xb7, 0xf7, 0x4e },
1099		.result = { 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1100			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1101			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1102			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
1103		.valid = true
1104	},
1105	/* wycheproof - edge case for shared secret */
1106	{
1107		.private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
1108			     0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
1109			     0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
1110			     0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
1111		.public = { 0xf7, 0x6e, 0x90, 0x10, 0xac, 0x33, 0xc5, 0x04,
1112			    0x3b, 0x2d, 0x3b, 0x76, 0xa8, 0x42, 0x17, 0x10,
1113			    0x00, 0xc4, 0x91, 0x62, 0x22, 0xe9, 0xe8, 0x58,
1114			    0x97, 0xa0, 0xae, 0xc7, 0xf6, 0x35, 0x0b, 0x3c },
1115		.result = { 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1116			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1117			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1118			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
1119		.valid = true
1120	},
1121	/* wycheproof - edge case for shared secret */
1122	{
1123		.private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
1124			     0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
1125			     0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
1126			     0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
1127		.public = { 0xbb, 0x72, 0x68, 0x8d, 0x8f, 0x8a, 0xa7, 0xa3,
1128			    0x9c, 0xd6, 0x06, 0x0c, 0xd5, 0xc8, 0x09, 0x3c,
1129			    0xde, 0xc6, 0xfe, 0x34, 0x19, 0x37, 0xc3, 0x88,
1130			    0x6a, 0x99, 0x34, 0x6c, 0xd0, 0x7f, 0xaa, 0x55 },
1131		.result = { 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1132			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1133			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1134			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
1135		.valid = true
1136	},
1137	/* wycheproof - edge case for shared secret */
1138	{
1139		.private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
1140			     0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
1141			     0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
1142			     0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
1143		.public = { 0x88, 0xfd, 0xde, 0xa1, 0x93, 0x39, 0x1c, 0x6a,
1144			    0x59, 0x33, 0xef, 0x9b, 0x71, 0x90, 0x15, 0x49,
1145			    0x44, 0x72, 0x05, 0xaa, 0xe9, 0xda, 0x92, 0x8a,
1146			    0x6b, 0x91, 0xa3, 0x52, 0xba, 0x10, 0xf4, 0x1f },
1147		.result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1148			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1149			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1150			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 },
1151		.valid = true
1152	},
1153	/* wycheproof - edge case for shared secret */
1154	{
1155		.private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
1156			     0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
1157			     0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
1158			     0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
1159		.public = { 0x30, 0x3b, 0x39, 0x2f, 0x15, 0x31, 0x16, 0xca,
1160			    0xd9, 0xcc, 0x68, 0x2a, 0x00, 0xcc, 0xc4, 0x4c,
1161			    0x95, 0xff, 0x0d, 0x3b, 0xbe, 0x56, 0x8b, 0xeb,
1162			    0x6c, 0x4e, 0x73, 0x9b, 0xaf, 0xdc, 0x2c, 0x68 },
1163		.result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1164			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1165			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1166			    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 },
1167		.valid = true
1168	},
1169	/* wycheproof - checking for overflow */
1170	{
1171		.private = { 0xc8, 0x17, 0x24, 0x70, 0x40, 0x00, 0xb2, 0x6d,
1172			     0x31, 0x70, 0x3c, 0xc9, 0x7e, 0x3a, 0x37, 0x8d,
1173			     0x56, 0xfa, 0xd8, 0x21, 0x93, 0x61, 0xc8, 0x8c,
1174			     0xca, 0x8b, 0xd7, 0xc5, 0x71, 0x9b, 0x12, 0xb2 },
1175		.public = { 0xfd, 0x30, 0x0a, 0xeb, 0x40, 0xe1, 0xfa, 0x58,
1176			    0x25, 0x18, 0x41, 0x2b, 0x49, 0xb2, 0x08, 0xa7,
1177			    0x84, 0x2b, 0x1e, 0x1f, 0x05, 0x6a, 0x04, 0x01,
1178			    0x78, 0xea, 0x41, 0x41, 0x53, 0x4f, 0x65, 0x2d },
1179		.result = { 0xb7, 0x34, 0x10, 0x5d, 0xc2, 0x57, 0x58, 0x5d,
1180			    0x73, 0xb5, 0x66, 0xcc, 0xb7, 0x6f, 0x06, 0x27,
1181			    0x95, 0xcc, 0xbe, 0xc8, 0x91, 0x28, 0xe5, 0x2b,
1182			    0x02, 0xf3, 0xe5, 0x96, 0x39, 0xf1, 0x3c, 0x46 },
1183		.valid = true
1184	},
1185	/* wycheproof - checking for overflow */
1186	{
1187		.private = { 0xc8, 0x17, 0x24, 0x70, 0x40, 0x00, 0xb2, 0x6d,
1188			     0x31, 0x70, 0x3c, 0xc9, 0x7e, 0x3a, 0x37, 0x8d,
1189			     0x56, 0xfa, 0xd8, 0x21, 0x93, 0x61, 0xc8, 0x8c,
1190			     0xca, 0x8b, 0xd7, 0xc5, 0x71, 0x9b, 0x12, 0xb2 },
1191		.public = { 0xc8, 0xef, 0x79, 0xb5, 0x14, 0xd7, 0x68, 0x26,
1192			    0x77, 0xbc, 0x79, 0x31, 0xe0, 0x6e, 0xe5, 0xc2,
1193			    0x7c, 0x9b, 0x39, 0x2b, 0x4a, 0xe9, 0x48, 0x44,
1194			    0x73, 0xf5, 0x54, 0xe6, 0x67, 0x8e, 0xcc, 0x2e },
1195		.result = { 0x64, 0x7a, 0x46, 0xb6, 0xfc, 0x3f, 0x40, 0xd6,
1196			    0x21, 0x41, 0xee, 0x3c, 0xee, 0x70, 0x6b, 0x4d,
1197			    0x7a, 0x92, 0x71, 0x59, 0x3a, 0x7b, 0x14, 0x3e,
1198			    0x8e, 0x2e, 0x22, 0x79, 0x88, 0x3e, 0x45, 0x50 },
1199		.valid = true
1200	},
1201	/* wycheproof - checking for overflow */
1202	{
1203		.private = { 0xc8, 0x17, 0x24, 0x70, 0x40, 0x00, 0xb2, 0x6d,
1204			     0x31, 0x70, 0x3c, 0xc9, 0x7e, 0x3a, 0x37, 0x8d,
1205			     0x56, 0xfa, 0xd8, 0x21, 0x93, 0x61, 0xc8, 0x8c,
1206			     0xca, 0x8b, 0xd7, 0xc5, 0x71, 0x9b, 0x12, 0xb2 },
1207		.public = { 0x64, 0xae, 0xac, 0x25, 0x04, 0x14, 0x48, 0x61,
1208			    0x53, 0x2b, 0x7b, 0xbc, 0xb6, 0xc8, 0x7d, 0x67,
1209			    0xdd, 0x4c, 0x1f, 0x07, 0xeb, 0xc2, 0xe0, 0x6e,
1210			    0xff, 0xb9, 0x5a, 0xec, 0xc6, 0x17, 0x0b, 0x2c },
1211		.result = { 0x4f, 0xf0, 0x3d, 0x5f, 0xb4, 0x3c, 0xd8, 0x65,
1212			    0x7a, 0x3c, 0xf3, 0x7c, 0x13, 0x8c, 0xad, 0xce,
1213			    0xcc, 0xe5, 0x09, 0xe4, 0xeb, 0xa0, 0x89, 0xd0,
1214			    0xef, 0x40, 0xb4, 0xe4, 0xfb, 0x94, 0x61, 0x55 },
1215		.valid = true
1216	},
1217	/* wycheproof - checking for overflow */
1218	{
1219		.private = { 0xc8, 0x17, 0x24, 0x70, 0x40, 0x00, 0xb2, 0x6d,
1220			     0x31, 0x70, 0x3c, 0xc9, 0x7e, 0x3a, 0x37, 0x8d,
1221			     0x56, 0xfa, 0xd8, 0x21, 0x93, 0x61, 0xc8, 0x8c,
1222			     0xca, 0x8b, 0xd7, 0xc5, 0x71, 0x9b, 0x12, 0xb2 },
1223		.public = { 0xbf, 0x68, 0xe3, 0x5e, 0x9b, 0xdb, 0x7e, 0xee,
1224			    0x1b, 0x50, 0x57, 0x02, 0x21, 0x86, 0x0f, 0x5d,
1225			    0xcd, 0xad, 0x8a, 0xcb, 0xab, 0x03, 0x1b, 0x14,
1226			    0x97, 0x4c, 0xc4, 0x90, 0x13, 0xc4, 0x98, 0x31 },
1227		.result = { 0x21, 0xce, 0xe5, 0x2e, 0xfd, 0xbc, 0x81, 0x2e,
1228			    0x1d, 0x02, 0x1a, 0x4a, 0xf1, 0xe1, 0xd8, 0xbc,
1229			    0x4d, 0xb3, 0xc4, 0x00, 0xe4, 0xd2, 0xa2, 0xc5,
1230			    0x6a, 0x39, 0x26, 0xdb, 0x4d, 0x99, 0xc6, 0x5b },
1231		.valid = true
1232	},
1233	/* wycheproof - checking for overflow */
1234	{
1235		.private = { 0xc8, 0x17, 0x24, 0x70, 0x40, 0x00, 0xb2, 0x6d,
1236			     0x31, 0x70, 0x3c, 0xc9, 0x7e, 0x3a, 0x37, 0x8d,
1237			     0x56, 0xfa, 0xd8, 0x21, 0x93, 0x61, 0xc8, 0x8c,
1238			     0xca, 0x8b, 0xd7, 0xc5, 0x71, 0x9b, 0x12, 0xb2 },
1239		.public = { 0x53, 0x47, 0xc4, 0x91, 0x33, 0x1a, 0x64, 0xb4,
1240			    0x3d, 0xdc, 0x68, 0x30, 0x34, 0xe6, 0x77, 0xf5,
1241			    0x3d, 0xc3, 0x2b, 0x52, 0xa5, 0x2a, 0x57, 0x7c,
1242			    0x15, 0xa8, 0x3b, 0xf2, 0x98, 0xe9, 0x9f, 0x19 },
1243		.result = { 0x18, 0xcb, 0x89, 0xe4, 0xe2, 0x0c, 0x0c, 0x2b,
1244			    0xd3, 0x24, 0x30, 0x52, 0x45, 0x26, 0x6c, 0x93,
1245			    0x27, 0x69, 0x0b, 0xbe, 0x79, 0xac, 0xb8, 0x8f,
1246			    0x5b, 0x8f, 0xb3, 0xf7, 0x4e, 0xca, 0x3e, 0x52 },
1247		.valid = true
1248	},
1249	/* wycheproof - private key == -1 (mod order) */
1250	{
1251		.private = { 0xa0, 0x23, 0xcd, 0xd0, 0x83, 0xef, 0x5b, 0xb8,
1252			     0x2f, 0x10, 0xd6, 0x2e, 0x59, 0xe1, 0x5a, 0x68,
1253			     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1254			     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50 },
1255		.public = { 0x25, 0x8e, 0x04, 0x52, 0x3b, 0x8d, 0x25, 0x3e,
1256			    0xe6, 0x57, 0x19, 0xfc, 0x69, 0x06, 0xc6, 0x57,
1257			    0x19, 0x2d, 0x80, 0x71, 0x7e, 0xdc, 0x82, 0x8f,
1258			    0xa0, 0xaf, 0x21, 0x68, 0x6e, 0x2f, 0xaa, 0x75 },
1259		.result = { 0x25, 0x8e, 0x04, 0x52, 0x3b, 0x8d, 0x25, 0x3e,
1260			    0xe6, 0x57, 0x19, 0xfc, 0x69, 0x06, 0xc6, 0x57,
1261			    0x19, 0x2d, 0x80, 0x71, 0x7e, 0xdc, 0x82, 0x8f,
1262			    0xa0, 0xaf, 0x21, 0x68, 0x6e, 0x2f, 0xaa, 0x75 },
1263		.valid = true
1264	},
1265	/* wycheproof - private key == 1 (mod order) on twist */
1266	{
1267		.private = { 0x58, 0x08, 0x3d, 0xd2, 0x61, 0xad, 0x91, 0xef,
1268			     0xf9, 0x52, 0x32, 0x2e, 0xc8, 0x24, 0xc6, 0x82,
1269			     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1270			     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f },
1271		.public = { 0x2e, 0xae, 0x5e, 0xc3, 0xdd, 0x49, 0x4e, 0x9f,
1272			    0x2d, 0x37, 0xd2, 0x58, 0xf8, 0x73, 0xa8, 0xe6,
1273			    0xe9, 0xd0, 0xdb, 0xd1, 0xe3, 0x83, 0xef, 0x64,
1274			    0xd9, 0x8b, 0xb9, 0x1b, 0x3e, 0x0b, 0xe0, 0x35 },
1275		.result = { 0x2e, 0xae, 0x5e, 0xc3, 0xdd, 0x49, 0x4e, 0x9f,
1276			    0x2d, 0x37, 0xd2, 0x58, 0xf8, 0x73, 0xa8, 0xe6,
1277			    0xe9, 0xd0, 0xdb, 0xd1, 0xe3, 0x83, 0xef, 0x64,
1278			    0xd9, 0x8b, 0xb9, 0x1b, 0x3e, 0x0b, 0xe0, 0x35 },
1279		.valid = true
1280	}
1281};
1282
1283bool __init curve25519_selftest(void)
1284{
1285	bool success = true, ret, ret2;
1286	size_t i = 0, j;
1287	u8 in[CURVE25519_KEY_SIZE];
1288	u8 out[CURVE25519_KEY_SIZE], out2[CURVE25519_KEY_SIZE],
1289	   out3[CURVE25519_KEY_SIZE];
1290
1291	for (i = 0; i < ARRAY_SIZE(curve25519_test_vectors); ++i) {
1292		memset(out, 0, CURVE25519_KEY_SIZE);
1293		ret = curve25519(out, curve25519_test_vectors[i].private,
1294				 curve25519_test_vectors[i].public);
1295		if (ret != curve25519_test_vectors[i].valid ||
1296		    memcmp(out, curve25519_test_vectors[i].result,
1297			   CURVE25519_KEY_SIZE)) {
1298			pr_err("curve25519 self-test %zu: FAIL\n", i + 1);
1299			success = false;
1300		}
1301	}
1302
1303	for (i = 0; i < 5; ++i) {
1304		get_random_bytes(in, sizeof(in));
1305		ret = curve25519_generate_public(out, in);
1306		ret2 = curve25519(out2, in, (u8[CURVE25519_KEY_SIZE]){ 9 });
1307		curve25519_generic(out3, in, (u8[CURVE25519_KEY_SIZE]){ 9 });
1308		if (ret != ret2 ||
1309		    memcmp(out, out2, CURVE25519_KEY_SIZE) ||
1310		    memcmp(out, out3, CURVE25519_KEY_SIZE)) {
1311			pr_err("curve25519 basepoint self-test %zu: FAIL: input - 0x",
1312			       i + 1);
1313			for (j = CURVE25519_KEY_SIZE; j-- > 0;)
1314				printk(KERN_CONT "%02x", in[j]);
1315			printk(KERN_CONT "\n");
1316			success = false;
1317		}
1318	}
1319
1320	return success;
1321}
1322