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