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 
8 struct 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 };
14 static 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 
curve25519_selftest(void)1283 bool __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