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