Annotation of embedaddon/strongswan/src/libstrongswan/tests/suites/test_ed25519.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2016 Andreas Steffen
3: * HSR Hochschule fuer Technik Rapperswil
4: *
5: * This program is free software; you can redistribute it and/or modify it
6: * under the terms of the GNU General Public License as published by the
7: * Free Software Foundation; either version 2 of the License, or (at your
8: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
9: *
10: * This program is distributed in the hope that it will be useful, but
11: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13: * for more details.
14: */
15:
16: #include "test_suite.h"
17:
18: #include <time.h>
19:
20: typedef struct sig_test_t sig_test_t;
21:
22: struct sig_test_t {
23: chunk_t key;
24: chunk_t pubkey;
25: chunk_t msg;
26: chunk_t sig;
27: chunk_t fp_pk;
28: chunk_t fp_spki;
29: };
30:
31: /**
32: * Ed25519 Test Vectors from RFC 8032
33: */
34: static sig_test_t sig_tests[] = {
35: /* Test 1 */
36: { chunk_from_chars(
37: 0x30, 0x2e, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, 0x03, 0x2b,
38: 0x65, 0x70, 0x04, 0x22, 0x04, 0x20, 0x9d, 0x61, 0xb1, 0x9d,
39: 0xef, 0xfd, 0x5a, 0x60, 0xba, 0x84, 0x4a, 0xf4, 0x92, 0xec,
40: 0x2c, 0xc4, 0x44, 0x49, 0xc5, 0x69, 0x7b, 0x32, 0x69, 0x19,
41: 0x70, 0x3b, 0xac, 0x03, 0x1c, 0xae, 0x7f, 0x60),
42: chunk_from_chars(
43: 0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70, 0x03,
44: 0x21, 0x00, 0xd7, 0x5a, 0x98, 0x01, 0x82, 0xb1, 0x0a, 0xb7,
45: 0xd5, 0x4b, 0xfe, 0xd3, 0xc9, 0x64, 0x07, 0x3a, 0x0e, 0xe1,
46: 0x72, 0xf3, 0xda, 0xa6, 0x23, 0x25, 0xaf, 0x02, 0x1a, 0x68,
47: 0xf7, 0x07, 0x51, 0x1a),
48: { NULL, 0 },
49: chunk_from_chars(
50: 0xe5, 0x56, 0x43, 0x00, 0xc3, 0x60, 0xac, 0x72, 0x90, 0x86,
51: 0xe2, 0xcc, 0x80, 0x6e, 0x82, 0x8a, 0x84, 0x87, 0x7f, 0x1e,
52: 0xb8, 0xe5, 0xd9, 0x74, 0xd8, 0x73, 0xe0, 0x65, 0x22, 0x49,
53: 0x01, 0x55, 0x5f, 0xb8, 0x82, 0x15, 0x90, 0xa3, 0x3b, 0xac,
54: 0xc6, 0x1e, 0x39, 0x70, 0x1c, 0xf9, 0xb4, 0x6b, 0xd2, 0x5b,
55: 0xf5, 0xf0, 0x59, 0x5b, 0xbe, 0x24, 0x65, 0x51, 0x41, 0x43,
56: 0x8e, 0x7a, 0x10, 0x0b),
57: chunk_from_chars(
58: 0x5b, 0x27, 0xaa, 0x55, 0x89, 0x17, 0x97, 0x70, 0xe4, 0x75,
59: 0x75, 0xb1, 0x62, 0xa1, 0xde, 0xd9, 0x7b, 0x8b, 0xfc, 0x6d),
60: chunk_from_chars(
61: 0xa5, 0x66, 0xbe, 0x19, 0x84, 0x01, 0x73, 0x41, 0x3a, 0x61,
62: 0x04, 0x83, 0x50, 0xef, 0xf2, 0x3e, 0x8f, 0xe2, 0x22, 0x66),
63: },
64: /* Test 2 */
65: { chunk_from_chars(
66: 0x30, 0x2e, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, 0x03, 0x2b,
67: 0x65, 0x70, 0x04, 0x22, 0x04, 0x20, 0x4c, 0xcd, 0x08, 0x9b,
68: 0x28, 0xff, 0x96, 0xda, 0x9d, 0xb6, 0xc3, 0x46, 0xec, 0x11,
69: 0x4e, 0x0f, 0x5b, 0x8a, 0x31, 0x9f, 0x35, 0xab, 0xa6, 0x24,
70: 0xda, 0x8c, 0xf6, 0xed, 0x4f, 0xb8, 0xa6, 0xfb),
71: chunk_from_chars(
72: 0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70, 0x03,
73: 0x21, 0x00, 0x3d, 0x40, 0x17, 0xc3, 0xe8, 0x43, 0x89, 0x5a,
74: 0x92, 0xb7, 0x0a, 0xa7, 0x4d, 0x1b, 0x7e, 0xbc, 0x9c, 0x98,
75: 0x2c, 0xcf, 0x2e, 0xc4, 0x96, 0x8c, 0xc0, 0xcd, 0x55, 0xf1,
76: 0x2a, 0xf4, 0x66, 0x0c),
77: chunk_from_chars(
78: 0x72),
79: chunk_from_chars(
80: 0x92, 0xa0, 0x09, 0xa9, 0xf0, 0xd4, 0xca, 0xb8, 0x72, 0x0e,
81: 0x82, 0x0b, 0x5f, 0x64, 0x25, 0x40, 0xa2, 0xb2, 0x7b, 0x54,
82: 0x16, 0x50, 0x3f, 0x8f, 0xb3, 0x76, 0x22, 0x23, 0xeb, 0xdb,
83: 0x69, 0xda, 0x08, 0x5a, 0xc1, 0xe4, 0x3e, 0x15, 0x99, 0x6e,
84: 0x45, 0x8f, 0x36, 0x13, 0xd0, 0xf1, 0x1d, 0x8c, 0x38, 0x7b,
85: 0x2e, 0xae, 0xb4, 0x30, 0x2a, 0xee, 0xb0, 0x0d, 0x29, 0x16,
86: 0x12, 0xbb, 0x0c, 0x00),
87: chunk_from_chars(
88: 0x13, 0xf7, 0x72, 0x66, 0x9e, 0x15, 0x2a, 0xe6, 0xa6, 0x2a,
89: 0x60, 0xa3, 0x48, 0x8a, 0x6f, 0x29, 0x7d, 0x06, 0x13, 0xdd),
90: chunk_from_chars(
91: 0xbd, 0xae, 0x41, 0xeb, 0x5d, 0xbf, 0x88, 0xb9, 0xdf, 0x18,
92: 0xda, 0xbb, 0x2d, 0xee, 0xa9, 0x1a, 0x4e, 0x03, 0x38, 0xe4),
93: },
94: /* Test 3 */
95: { chunk_from_chars(
96: 0x30, 0x2e, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, 0x03, 0x2b,
97: 0x65, 0x70, 0x04, 0x22, 0x04, 0x20, 0xc5, 0xaa, 0x8d, 0xf4,
98: 0x3f, 0x9f, 0x83, 0x7b, 0xed, 0xb7, 0x44, 0x2f, 0x31, 0xdc,
99: 0xb7, 0xb1, 0x66, 0xd3, 0x85, 0x35,0x07, 0x6f, 0x09, 0x4b,
100: 0x85, 0xce, 0x3a, 0x2e, 0x0b, 0x44, 0x58, 0xf7),
101: chunk_from_chars(
102: 0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70, 0x03,
103: 0x21, 0x00, 0xfc, 0x51, 0xcd, 0x8e, 0x62, 0x18, 0xa1, 0xa3,
104: 0x8d, 0xa4, 0x7e, 0xd0, 0x02, 0x30, 0xf0, 0x58, 0x08, 0x16,
105: 0xed, 0x13, 0xba, 0x33, 0x03, 0xac, 0x5d, 0xeb, 0x91, 0x15,
106: 0x48, 0x90, 0x80, 0x25),
107: chunk_from_chars(
108: 0xaf, 0x82),
109: chunk_from_chars(
110: 0x62, 0x91, 0xd6, 0x57, 0xde, 0xec, 0x24, 0x02, 0x48, 0x27,
111: 0xe6, 0x9c, 0x3a, 0xbe, 0x01, 0xa3, 0x0c, 0xe5, 0x48, 0xa2,
112: 0x84, 0x74, 0x3a, 0x44, 0x5e, 0x36, 0x80, 0xd7, 0xdb, 0x5a,
113: 0xc3, 0xac, 0x18, 0xff, 0x9b, 0x53, 0x8d, 0x16, 0xf2, 0x90,
114: 0xae, 0x67, 0xf7, 0x60, 0x98, 0x4d, 0xc6, 0x59, 0x4a, 0x7c,
115: 0x15, 0xe9, 0x71, 0x6e, 0xd2, 0x8d, 0xc0, 0x27, 0xbe, 0xce,
116: 0xea, 0x1e, 0xc4, 0x0a),
117: chunk_from_chars(
118: 0x88, 0xc7, 0x64, 0xc8, 0xbe, 0x44, 0x37, 0x4a, 0x7d, 0x2f,
119: 0x5d, 0x84, 0x72, 0x1f, 0x8e, 0x32, 0x5e, 0x5b, 0xd6, 0x4c),
120: chunk_from_chars(
121: 0xad, 0x01, 0x30, 0xb1, 0x2b, 0x48, 0x62, 0x9b, 0xb9, 0xad,
122: 0xea, 0x92, 0x1f, 0xfe, 0xd2, 0x9a, 0x42, 0xf0, 0xad, 0xe6),
123: },
124: /* Test 1024 */
125: { chunk_from_chars(
126: 0x30, 0x2e, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, 0x03, 0x2b,
127: 0x65, 0x70, 0x04, 0x22, 0x04, 0x20, 0xf5, 0xe5, 0x76, 0x7c,
128: 0xf1, 0x53, 0x31, 0x95, 0x17, 0x63, 0x0f, 0x22, 0x68, 0x76,
129: 0xb8, 0x6c, 0x81, 0x60, 0xcc, 0x58, 0x3b, 0xc0, 0x13, 0x74,
130: 0x4c, 0x6b, 0xf2, 0x55, 0xf5, 0xcc, 0x0e, 0xe5),
131: chunk_from_chars(
132: 0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70, 0x03,
133: 0x21, 0x00, 0x27, 0x81, 0x17, 0xfc, 0x14, 0x4c, 0x72, 0x34,
134: 0x0f, 0x67, 0xd0, 0xf2, 0x31, 0x6e, 0x83, 0x86, 0xce, 0xff,
135: 0xbf, 0x2b, 0x24, 0x28, 0xc9, 0xc5, 0x1f, 0xef, 0x7c, 0x59,
136: 0x7f, 0x1d, 0x42, 0x6e),
137: chunk_from_chars(
138: 0x08, 0xb8, 0xb2, 0xb7, 0x33, 0x42, 0x42, 0x43, 0x76, 0x0f,
139: 0xe4, 0x26, 0xa4, 0xb5, 0x49, 0x08, 0x63, 0x21, 0x10, 0xa6,
140: 0x6c, 0x2f, 0x65, 0x91, 0xea, 0xbd, 0x33, 0x45, 0xe3, 0xe4,
141: 0xeb, 0x98, 0xfa, 0x6e, 0x26, 0x4b, 0xf0, 0x9e, 0xfe, 0x12,
142: 0xee, 0x50, 0xf8, 0xf5, 0x4e, 0x9f, 0x77, 0xb1, 0xe3, 0x55,
143: 0xf6, 0xc5, 0x05, 0x44, 0xe2, 0x3f, 0xb1, 0x43, 0x3d, 0xdf,
144: 0x73, 0xbe, 0x84, 0xd8, 0x79, 0xde, 0x7c, 0x00, 0x46, 0xdc,
145: 0x49, 0x96, 0xd9, 0xe7, 0x73, 0xf4, 0xbc, 0x9e, 0xfe, 0x57,
146: 0x38, 0x82, 0x9a, 0xdb, 0x26, 0xc8, 0x1b, 0x37, 0xc9, 0x3a,
147: 0x1b, 0x27, 0x0b, 0x20, 0x32, 0x9d, 0x65, 0x86, 0x75, 0xfc,
148:
149: 0x6e, 0xa5, 0x34, 0xe0, 0x81, 0x0a, 0x44, 0x32, 0x82, 0x6b,
150: 0xf5, 0x8c, 0x94, 0x1e, 0xfb, 0x65, 0xd5, 0x7a, 0x33, 0x8b,
151: 0xbd, 0x2e, 0x26, 0x64, 0x0f, 0x89, 0xff, 0xbc, 0x1a, 0x85,
152: 0x8e, 0xfc, 0xb8, 0x55, 0x0e, 0xe3, 0xa5, 0xe1, 0x99, 0x8b,
153: 0xd1, 0x77, 0xe9, 0x3a, 0x73, 0x63, 0xc3, 0x44, 0xfe, 0x6b,
154: 0x19, 0x9e, 0xe5, 0xd0, 0x2e, 0x82, 0xd5, 0x22, 0xc4, 0xfe,
155: 0xba, 0x15, 0x45, 0x2f, 0x80, 0x28, 0x8a, 0x82, 0x1a, 0x57,
156: 0x91, 0x16, 0xec, 0x6d, 0xad, 0x2b, 0x3b, 0x31, 0x0d, 0xa9,
157: 0x03, 0x40, 0x1a, 0xa6, 0x21, 0x00, 0xab, 0x5d, 0x1a, 0x36,
158: 0x55, 0x3e, 0x06, 0x20, 0x3b, 0x33, 0x89, 0x0c, 0xc9, 0xb8,
159:
160: 0x32, 0xf7, 0x9e, 0xf8, 0x05, 0x60, 0xcc, 0xb9, 0xa3, 0x9c,
161: 0xe7, 0x67, 0x96, 0x7e, 0xd6, 0x28, 0xc6, 0xad, 0x57, 0x3c,
162: 0xb1, 0x16, 0xdb, 0xef, 0xef, 0xd7, 0x54, 0x99, 0xda, 0x96,
163: 0xbd, 0x68, 0xa8, 0xa9, 0x7b, 0x92, 0x8a, 0x8b, 0xbc, 0x10,
164: 0x3b, 0x66, 0x21, 0xfc, 0xde, 0x2b, 0xec, 0xa1, 0x23, 0x1d,
165: 0x20, 0x6b, 0xe6, 0xcd, 0x9e, 0xc7, 0xaf, 0xf6, 0xf6, 0xc9,
166: 0x4f, 0xcd, 0x72, 0x04, 0xed, 0x34, 0x55, 0xc6, 0x8c, 0x83,
167: 0xf4, 0xa4, 0x1d, 0xa4, 0xaf, 0x2b, 0x74, 0xef, 0x5c, 0x53,
168: 0xf1, 0xd8, 0xac, 0x70, 0xbd, 0xcb, 0x7e, 0xd1, 0x85, 0xce,
169: 0x81, 0xbd, 0x84, 0x35, 0x9d, 0x44, 0x25, 0x4d, 0x95, 0x62,
170:
171: 0x9e, 0x98, 0x55, 0xa9, 0x4a, 0x7c, 0x19, 0x58, 0xd1, 0xf8,
172: 0xad, 0xa5, 0xd0, 0x53, 0x2e, 0xd8, 0xa5, 0xaa, 0x3f, 0xb2,
173: 0xd1, 0x7b, 0xa7, 0x0e, 0xb6, 0x24, 0x8e, 0x59, 0x4e, 0x1a,
174: 0x22, 0x97, 0xac, 0xbb, 0xb3, 0x9d, 0x50, 0x2f, 0x1a, 0x8c,
175: 0x6e, 0xb6, 0xf1, 0xce, 0x22, 0xb3, 0xde, 0x1a, 0x1f, 0x40,
176: 0xcc, 0x24, 0x55, 0x41, 0x19, 0xa8, 0x31, 0xa9, 0xaa, 0xd6,
177: 0x07, 0x9c, 0xad, 0x88, 0x42, 0x5d, 0xe6, 0xbd, 0xe1, 0xa9,
178: 0x18, 0x7e, 0xbb, 0x60, 0x92, 0xcf, 0x67, 0xbf, 0x2b, 0x13,
179: 0xfd, 0x65, 0xf2, 0x70, 0x88, 0xd7, 0x8b, 0x7e, 0x88, 0x3c,
180: 0x87, 0x59, 0xd2, 0xc4, 0xf5, 0xc6, 0x5a, 0xdb, 0x75, 0x53,
181:
182: 0x87, 0x8a, 0xd5, 0x75, 0xf9, 0xfa, 0xd8, 0x78, 0xe8, 0x0a,
183: 0x0c, 0x9b, 0xa6, 0x3b, 0xcb, 0xcc, 0x27, 0x32, 0xe6, 0x94,
184: 0x85, 0xbb, 0xc9, 0xc9, 0x0b, 0xfb, 0xd6, 0x24, 0x81, 0xd9,
185: 0x08, 0x9b, 0xec, 0xcf, 0x80, 0xcf, 0xe2, 0xdf, 0x16, 0xa2,
186: 0xcf, 0x65, 0xbd, 0x92, 0xdd, 0x59, 0x7b, 0x07, 0x07, 0xe0,
187: 0x91, 0x7a, 0xf4, 0x8b, 0xbb, 0x75, 0xfe, 0xd4, 0x13, 0xd2,
188: 0x38, 0xf5, 0x55, 0x5a, 0x7a, 0x56, 0x9d, 0x80, 0xc3, 0x41,
189: 0x4a, 0x8d, 0x08, 0x59, 0xdc, 0x65, 0xa4, 0x61, 0x28, 0xba,
190: 0xb2, 0x7a, 0xf8, 0x7a, 0x71, 0x31, 0x4f, 0x31, 0x8c, 0x78,
191: 0x2b, 0x23, 0xeb, 0xfe, 0x80, 0x8b, 0x82, 0xb0, 0xce, 0x26,
192:
193: 0x40, 0x1d, 0x2e, 0x22, 0xf0, 0x4d, 0x83, 0xd1, 0x25, 0x5d,
194: 0xc5, 0x1a, 0xdd, 0xd3, 0xb7, 0x5a, 0x2b, 0x1a, 0xe0, 0x78,
195: 0x45, 0x04, 0xdf, 0x54, 0x3a, 0xf8, 0x96, 0x9b, 0xe3, 0xea,
196: 0x70, 0x82, 0xff, 0x7f, 0xc9, 0x88, 0x8c, 0x14, 0x4d, 0xa2,
197: 0xaf, 0x58, 0x42, 0x9e, 0xc9, 0x60, 0x31, 0xdb, 0xca, 0xd3,
198: 0xda, 0xd9, 0xaf, 0x0d, 0xcb, 0xaa, 0xaf, 0x26, 0x8c, 0xb8,
199: 0xfc, 0xff, 0xea, 0xd9, 0x4f, 0x3c, 0x7c, 0xa4, 0x95, 0xe0,
200: 0x56, 0xa9, 0xb4, 0x7a, 0xcd, 0xb7, 0x51, 0xfb, 0x73, 0xe6,
201: 0x66, 0xc6, 0xc6, 0x55, 0xad, 0xe8, 0x29, 0x72, 0x97, 0xd0,
202: 0x7a, 0xd1, 0xba, 0x5e, 0x43, 0xf1, 0xbc, 0xa3, 0x23, 0x01,
203:
204: 0x65, 0x13, 0x39, 0xe2, 0x29, 0x04, 0xcc, 0x8c, 0x42, 0xf5,
205: 0x8c, 0x30, 0xc0, 0x4a, 0xaf, 0xdb, 0x03, 0x8d, 0xda, 0x08,
206: 0x47, 0xdd, 0x98, 0x8d, 0xcd, 0xa6, 0xf3, 0xbf, 0xd1, 0x5c,
207: 0x4b, 0x4c, 0x45, 0x25, 0x00, 0x4a, 0xa0, 0x6e, 0xef, 0xf8,
208: 0xca, 0x61, 0x78, 0x3a, 0xac, 0xec, 0x57, 0xfb, 0x3d, 0x1f,
209: 0x92, 0xb0, 0xfe, 0x2f, 0xd1, 0xa8, 0x5f, 0x67, 0x24, 0x51,
210: 0x7b, 0x65, 0xe6, 0x14, 0xad, 0x68, 0x08, 0xd6, 0xf6, 0xee,
211: 0x34, 0xdf, 0xf7, 0x31, 0x0f, 0xdc, 0x82, 0xae, 0xbf, 0xd9,
212: 0x04, 0xb0, 0x1e, 0x1d, 0xc5, 0x4b, 0x29, 0x27, 0x09, 0x4b,
213: 0x2d, 0xb6, 0x8d, 0x6f, 0x90, 0x3b, 0x68, 0x40, 0x1a, 0xde,
214:
215: 0xbf, 0x5a, 0x7e, 0x08, 0xd7, 0x8f, 0xf4, 0xef, 0x5d, 0x63,
216: 0x65, 0x3a, 0x65, 0x04, 0x0c, 0xf9, 0xbf, 0xd4, 0xac, 0xa7,
217: 0x98, 0x4a, 0x74, 0xd3, 0x71, 0x45, 0x98, 0x67, 0x80, 0xfc,
218: 0x0b, 0x16, 0xac, 0x45, 0x16, 0x49, 0xde, 0x61, 0x88, 0xa7,
219: 0xdb, 0xdf, 0x19, 0x1f, 0x64, 0xb5, 0xfc, 0x5e, 0x2a, 0xb4,
220: 0x7b, 0x57, 0xf7, 0xf7, 0x27, 0x6c, 0xd4, 0x19, 0xc1, 0x7a,
221: 0x3c, 0xa8, 0xe1, 0xb9, 0x39, 0xae, 0x49, 0xe4, 0x88, 0xac,
222: 0xba, 0x6b, 0x96, 0x56, 0x10, 0xb5, 0x48, 0x01, 0x09, 0xc8,
223: 0xb1, 0x7b, 0x80, 0xe1, 0xb7, 0xb7, 0x50, 0xdf, 0xc7, 0x59,
224: 0x8d, 0x5d, 0x50, 0x11, 0xfd, 0x2d, 0xcc, 0x56, 0x00, 0xa3,
225:
226: 0x2e, 0xf5, 0xb5, 0x2a, 0x1e, 0xcc, 0x82, 0x0e, 0x30, 0x8a,
227: 0xa3, 0x42, 0x72, 0x1a, 0xac, 0x09, 0x43, 0xbf, 0x66, 0x86,
228: 0xb6, 0x4b, 0x25, 0x79, 0x37, 0x65, 0x04, 0xcc, 0xc4, 0x93,
229: 0xd9, 0x7e, 0x6a, 0xed, 0x3f, 0xb0, 0xf9, 0xcd, 0x71, 0xa4,
230: 0x3d, 0xd4, 0x97, 0xf0, 0x1f, 0x17, 0xc0, 0xe2, 0xcb, 0x37,
231: 0x97, 0xaa, 0x2a, 0x2f, 0x25, 0x66, 0x56, 0x16, 0x8e, 0x6c,
232: 0x49, 0x6a, 0xfc, 0x5f, 0xb9, 0x32, 0x46, 0xf6, 0xb1, 0x11,
233: 0x63, 0x98, 0xa3, 0x46, 0xf1, 0xa6, 0x41, 0xf3, 0xb0, 0x41,
234: 0xe9, 0x89, 0xf7, 0x91, 0x4f, 0x90, 0xcc, 0x2c, 0x7f, 0xff,
235: 0x35, 0x78, 0x76, 0xe5, 0x06, 0xb5, 0x0d, 0x33, 0x4b, 0xa7,
236:
237: 0x7c, 0x22, 0x5b, 0xc3, 0x07, 0xba, 0x53, 0x71, 0x52, 0xf3,
238: 0xf1, 0x61, 0x0e, 0x4e, 0xaf, 0xe5, 0x95, 0xf6, 0xd9, 0xd9,
239: 0x0d, 0x11, 0xfa, 0xa9, 0x33, 0xa1, 0x5e, 0xf1, 0x36, 0x95,
240: 0x46, 0x86, 0x8a, 0x7f, 0x3a, 0x45, 0xa9, 0x67, 0x68, 0xd4,
241: 0x0f, 0xd9, 0xd0, 0x34, 0x12, 0xc0, 0x91, 0xc6, 0x31, 0x5c,
242: 0xf4, 0xfd, 0xe7, 0xcb, 0x68, 0x60, 0x69, 0x37, 0x38, 0x0d,
243: 0xb2, 0xea, 0xaa, 0x70, 0x7b, 0x4c, 0x41, 0x85, 0xc3, 0x2e,
244: 0xdd, 0xcd, 0xd3, 0x06, 0x70, 0x5e, 0x4d, 0xc1, 0xff, 0xc8,
245: 0x72, 0xee, 0xee, 0x47, 0x5a, 0x64, 0xdf, 0xac, 0x86, 0xab,
246: 0xa4, 0x1c, 0x06, 0x18, 0x98, 0x3f, 0x87, 0x41, 0xc5, 0xef,
247:
248: 0x68, 0xd3, 0xa1, 0x01, 0xe8, 0xa3, 0xb8, 0xca, 0xc6, 0x0c,
249: 0x90, 0x5c, 0x15, 0xfc, 0x91, 0x08, 0x40, 0xb9, 0x4c, 0x00,
250: 0xa0, 0xb9, 0xd0),
251: chunk_from_chars(
252: 0x0a, 0xab, 0x4c, 0x90, 0x05, 0x01, 0xb3, 0xe2, 0x4d, 0x7c,
253: 0xdf, 0x46, 0x63, 0x32, 0x6a, 0x3a, 0x87, 0xdf, 0x5e, 0x48,
254: 0x43, 0xb2, 0xcb, 0xdb, 0x67, 0xcb, 0xf6, 0xe4, 0x60, 0xfe,
255: 0xc3, 0x50, 0xaa, 0x53, 0x71, 0xb1, 0x50, 0x8f, 0x9f, 0x45,
256: 0x28, 0xec, 0xea, 0x23, 0xc4, 0x36, 0xd9, 0x4b, 0x5e, 0x8f,
257: 0xcd, 0x4f, 0x68, 0x1e, 0x30, 0xa6, 0xac, 0x00, 0xa9, 0x70,
258: 0x4a, 0x18, 0x8a, 0x03),
259: chunk_from_chars(
260: 0x11, 0x2d, 0xb3, 0x08, 0x97, 0x6e, 0x38, 0x8f, 0x5f, 0x5e,
261: 0xb0, 0xae, 0x8f, 0x5f, 0x59, 0x1d, 0xff, 0x74, 0xf4, 0x44),
262: chunk_from_chars(
263: 0xcb, 0x36, 0xcc, 0x6a, 0x82, 0x2c, 0x49, 0x40, 0xfb, 0x08,
264: 0x04, 0xf6, 0x3a, 0x4f, 0x20, 0x2b, 0xe5, 0x73, 0x43, 0x2f),
265: },
266: /* Test SHA(abc) */
267: { chunk_from_chars(
268: 0x30, 0x2e, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, 0x03, 0x2b,
269: 0x65, 0x70, 0x04, 0x22, 0x04, 0x20, 0x83, 0x3f, 0xe6, 0x24,
270: 0x09, 0x23, 0x7b, 0x9d, 0x62, 0xec, 0x77, 0x58, 0x75, 0x20,
271: 0x91, 0x1e, 0x9a, 0x75, 0x9c, 0xec, 0x1d, 0x19, 0x75, 0x5b,
272: 0x7d, 0xa9, 0x01, 0xb9, 0x6d, 0xca, 0x3d, 0x42),
273: chunk_from_chars(
274: 0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70, 0x03,
275: 0x21, 0x00, 0xec, 0x17, 0x2b, 0x93, 0xad, 0x5e, 0x56, 0x3b,
276: 0xf4, 0x93, 0x2c, 0x70, 0xe1, 0x24, 0x50, 0x34, 0xc3, 0x54,
277: 0x67, 0xef, 0x2e, 0xfd, 0x4d, 0x64, 0xeb, 0xf8, 0x19, 0x68,
278: 0x34, 0x67, 0xe2, 0xbf),
279: chunk_from_chars(
280: 0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba, 0xcc, 0x41,
281: 0x73, 0x49, 0xae, 0x20, 0x41, 0x31, 0x12, 0xe6, 0xfa, 0x4e,
282: 0x89, 0xa9, 0x7e, 0xa2, 0x0a, 0x9e, 0xee, 0xe6, 0x4b, 0x55,
283: 0xd3, 0x9a, 0x21, 0x92, 0x99, 0x2a, 0x27, 0x4f, 0xc1, 0xa8,
284: 0x36, 0xba, 0x3c, 0x23, 0xa3, 0xfe, 0xeb, 0xbd, 0x45, 0x4d,
285: 0x44, 0x23, 0x64, 0x3c, 0xe8, 0x0e, 0x2a, 0x9a, 0xc9, 0x4f,
286: 0xa5, 0x4c, 0xa4, 0x9f),
287: chunk_from_chars(
288: 0xdc, 0x2a, 0x44, 0x59, 0xe7, 0x36, 0x96, 0x33, 0xa5, 0x2b,
289: 0x1b, 0xf2, 0x77, 0x83, 0x9a, 0x00, 0x20, 0x10, 0x09, 0xa3,
290: 0xef, 0xbf, 0x3e, 0xcb, 0x69, 0xbe, 0xa2, 0x18, 0x6c, 0x26,
291: 0xb5, 0x89, 0x09, 0x35, 0x1f, 0xc9, 0xac, 0x90, 0xb3, 0xec,
292: 0xfd, 0xfb, 0xc7, 0xc6, 0x64, 0x31, 0xe0, 0x30, 0x3d, 0xca,
293: 0x17, 0x9c, 0x13, 0x8a, 0xc1, 0x7a, 0xd9, 0xbe, 0xf1, 0x17,
294: 0x73, 0x31, 0xa7, 0x04),
295: chunk_from_chars(
296: 0x26, 0x4c, 0xa5, 0x7f, 0x89, 0x6d, 0x64, 0x81, 0xd1, 0x87,
297: 0xe9, 0x89, 0x47, 0x29, 0x5a, 0xfe, 0xe3, 0x6d, 0x82, 0x44),
298: chunk_from_chars(
299: 0x27, 0x88, 0xfc, 0x14, 0xb1, 0xcd, 0xd0, 0x24, 0xd5, 0x9d,
300: 0x31, 0x65, 0x59, 0x63, 0x69, 0xcf, 0xaf, 0x50, 0x10, 0xe7),
301: }
302: };
303:
304: START_TEST(test_ed25519_sign)
305: {
306: private_key_t *key;
307: public_key_t *pubkey, *public;
308: chunk_t sig, encoding, fp;
309:
310: /* load private key */
311: key = lib->creds->create(lib->creds, CRED_PRIVATE_KEY, KEY_ED25519,
312: BUILD_BLOB_ASN1_DER, sig_tests[_i].key, BUILD_END);
313: ck_assert(key != NULL);
314: ck_assert(key->get_encoding(key, PRIVKEY_ASN1_DER, &encoding));
315: ck_assert_chunk_eq(encoding, sig_tests[_i].key);
316: chunk_free(&encoding);
317:
318: ck_assert(key->get_fingerprint(key, KEYID_PUBKEY_SHA1, &fp));
319: ck_assert_chunk_eq(sig_tests[_i].fp_pk, fp);
320: ck_assert(key->get_fingerprint(key, KEYID_PUBKEY_INFO_SHA1, &fp));
321: ck_assert_chunk_eq(sig_tests[_i].fp_spki, fp);
322:
323: /* load public key */
324: pubkey = lib->creds->create(lib->creds, CRED_PUBLIC_KEY, KEY_ED25519,
325: BUILD_BLOB_ASN1_DER, sig_tests[_i].pubkey, BUILD_END);
326: ck_assert(pubkey != NULL);
327: ck_assert(pubkey->get_encoding(pubkey, PUBKEY_SPKI_ASN1_DER, &encoding));
328: ck_assert_chunk_eq(encoding, sig_tests[_i].pubkey);
329: chunk_free(&encoding);
330:
331: ck_assert(pubkey->get_fingerprint(pubkey, KEYID_PUBKEY_SHA1, &fp));
332: ck_assert_chunk_eq(sig_tests[_i].fp_pk, fp);
333: ck_assert(pubkey->get_fingerprint(pubkey, KEYID_PUBKEY_INFO_SHA1, &fp));
334: ck_assert_chunk_eq(sig_tests[_i].fp_spki, fp);
335:
336: /* compare public keys */
337: public = key->get_public_key(key);
338: ck_assert(public != NULL);
339: ck_assert(public->equals(public, pubkey));
340:
341: /* sign */
342: ck_assert(key->sign(key, SIGN_ED25519, NULL, sig_tests[_i].msg, &sig));
343: ck_assert(sig.len == 64);
344: ck_assert_chunk_eq(sig, sig_tests[_i].sig);
345:
346: /* verify */
347: ck_assert(pubkey->verify(pubkey, SIGN_ED25519, NULL, sig_tests[_i].msg,
348: sig_tests[_i].sig));
349:
350: /* cleanup */
351: key->destroy(key);
352: pubkey->destroy(pubkey);
353: public->destroy(public);
354: chunk_free(&sig);
355: }
356: END_TEST
357:
358: START_TEST(test_ed25519_gen)
359: {
360: private_key_t *key, *key2;
361: public_key_t *pubkey, *pubkey2;
362: chunk_t msg = chunk_from_str("Ed25519"), sig, encoding, fp_priv, fp_pub;
363:
364: /* generate private key */
365: key = lib->creds->create(lib->creds, CRED_PRIVATE_KEY, KEY_ED25519,
366: BUILD_KEY_SIZE, 256, BUILD_END);
367: ck_assert(key != NULL);
368: ck_assert(key->get_type(key) == KEY_ED25519);
369: ck_assert(key->get_keysize(key) == 256);
370: ck_assert(!key->get_encoding(key, PRIVKEY_PGP, &encoding));
371: ck_assert(key->get_encoding(key, PRIVKEY_PEM, &encoding));
372: ck_assert(encoding.ptr != NULL);
373: ck_assert(strstr(encoding.ptr, "PRIVATE KEY"));
374: chunk_free(&encoding);
375:
376: /* clone private key */
377: key2 = key->get_ref(key);
378: ck_assert(key2);
379: key2->destroy(key2);
380:
381: /* decryption not supported */
382: ck_assert(!key->decrypt(key, ENCRYPT_UNKNOWN, msg, NULL));
383:
384: /* wrong signature scheme */
385: ck_assert(!key->sign(key, SIGN_ED448, NULL, msg, &sig));
386:
387: /* correct signature scheme*/
388: ck_assert(key->sign(key, SIGN_ED25519, NULL, msg, &sig));
389:
390: /* export public key */
391: pubkey = key->get_public_key(key);
392: ck_assert(pubkey != NULL);
393: ck_assert(pubkey->get_type(pubkey) == KEY_ED25519);
394: ck_assert(pubkey->get_keysize(pubkey) == 256);
395: ck_assert(pubkey->get_encoding(pubkey, PUBKEY_PEM, &encoding));
396: ck_assert(encoding.ptr != NULL);
397: ck_assert(strstr(encoding.ptr, "PUBLIC KEY"));
398: chunk_free(&encoding);
399:
400: /* generate and compare public and private key fingerprints */
401: ck_assert(!key->get_fingerprint(key, KEYID_PGPV4, &fp_priv));
402: ck_assert(key->get_fingerprint(key, KEYID_PUBKEY_SHA1, &fp_priv));
403: ck_assert(key->get_fingerprint(key, KEYID_PUBKEY_SHA1, &fp_priv));
404: ck_assert(fp_priv.ptr != NULL);
405: ck_assert(!pubkey->get_fingerprint(pubkey, KEYID_PGPV4, &fp_pub));
406: ck_assert(pubkey->get_fingerprint(pubkey, KEYID_PUBKEY_SHA1, &fp_pub));
407: ck_assert(pubkey->get_fingerprint(pubkey, KEYID_PUBKEY_SHA1, &fp_pub));
408: ck_assert(fp_pub.ptr != NULL);
409: ck_assert_chunk_eq(fp_pub, fp_priv);
410:
411: /* clone public key */
412: pubkey2 = pubkey->get_ref(pubkey);
413: ck_assert(pubkey2 != NULL);
414: pubkey2->destroy(pubkey2);
415:
416: /* encryption not supported */
417: ck_assert(!pubkey->encrypt(pubkey, ENCRYPT_UNKNOWN, msg, NULL));
418:
419: /* verify with wrong signature scheme */
420: ck_assert(!pubkey->verify(pubkey, SIGN_ED448, NULL, msg, sig));
421:
422: /* verify with correct signature scheme */
423: ck_assert(pubkey->verify(pubkey, SIGN_ED25519, NULL, msg, sig));
424:
425: /* cleanup */
426: key->destroy(key);
427: pubkey->destroy(pubkey);
428: chunk_free(&sig);
429: }
430: END_TEST
431:
432: START_TEST(test_ed25519_speed)
433: {
434: private_key_t *key;
435: public_key_t *pubkey;
436: chunk_t msg = chunk_from_str("Hello Ed25519"), sig;
437: int i, count = 1000;
438:
439: #ifdef HAVE_CLOCK_GETTIME
440: struct timespec start, stop;
441: clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
442: #endif
443:
444: for (i = 0; i < count; i++)
445: {
446: key = lib->creds->create(lib->creds, CRED_PRIVATE_KEY, KEY_ED25519,
447: BUILD_KEY_SIZE, 256, BUILD_END);
448: ck_assert(key != NULL);
449: ck_assert(key->sign(key, SIGN_ED25519, NULL, msg, &sig));
450: pubkey = key->get_public_key(key);
451: ck_assert(pubkey != NULL);
452: ck_assert(pubkey->verify(pubkey, SIGN_ED25519, NULL, msg, sig));
453: key->destroy(key);
454: pubkey->destroy(pubkey);
455: chunk_free(&sig);
456: }
457:
458: #ifdef HAVE_CLOCK_GETTIME
459: clock_gettime(CLOCK_THREAD_CPUTIME_ID, &stop);
460: DBG0(DBG_LIB, "%d Ed25519 keys and signatures in %d ms\n", count,
461: (stop.tv_nsec - start.tv_nsec) / 1000000 +
462: (stop.tv_sec - start.tv_sec) * 1000);
463: #endif
464: }
465: END_TEST
466:
467: static chunk_t zero_pk = chunk_from_chars(
468: 0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70, 0x03,
469: 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
470: 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
471: 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
472: 0x00, 0x00, 0x00, 0x00);
473:
474: /* sig_tests[0].sig with s+L */
475: static chunk_t malleable_sig = chunk_from_chars(
476: 0xe5, 0x56, 0x43, 0x00, 0xc3, 0x60, 0xac, 0x72, 0x90, 0x86,
477: 0xe2, 0xcc, 0x80, 0x6e, 0x82, 0x8a, 0x84, 0x87, 0x7f, 0x1e,
478: 0xb8, 0xe5, 0xd9, 0x74, 0xd8, 0x73, 0xe0, 0x65, 0x22, 0x49,
479: 0x01, 0x55, 0x4c, 0x8c, 0x78, 0x72, 0xaa, 0x06, 0x4e, 0x04,
480: 0x9d, 0xbb, 0x30, 0x13, 0xfb, 0xf2, 0x93, 0x80, 0xd2, 0x5b,
481: 0xf5, 0xf0, 0x59, 0x5b, 0xbe, 0x24, 0x65, 0x51, 0x41, 0x43,
482: 0x8e, 0x7a, 0x10, 0x1b);
483:
484: START_TEST(test_ed25519_fail)
485: {
486: private_key_t *key;
487: public_key_t *pubkey;
488: chunk_t blob, sig;
489: uint8_t sig1[64];
490:
491: /* Invalid private key format */
492: key = lib->creds->create(lib->creds, CRED_PRIVATE_KEY, KEY_ED25519,
493: BUILD_BLOB_ASN1_DER, chunk_empty, BUILD_END);
494: ck_assert(key == NULL);
495:
496: key = lib->creds->create(lib->creds, CRED_PRIVATE_KEY, KEY_ED25519,
497: BUILD_EDDSA_PRIV_ASN1_DER, chunk_empty, BUILD_END);
498: ck_assert(key == NULL);
499:
500: blob = chunk_from_chars(0x04, 0x01, 0x9d);
501: key = lib->creds->create(lib->creds, CRED_PRIVATE_KEY, KEY_ED25519,
502: BUILD_EDDSA_PRIV_ASN1_DER, blob, BUILD_END);
503: ck_assert(key == NULL);
504:
505: /* Invalid public key format */
506: pubkey = lib->creds->create(lib->creds, CRED_PUBLIC_KEY, KEY_ED25519,
507: BUILD_BLOB_ASN1_DER, chunk_empty, BUILD_END);
508: ck_assert(pubkey == NULL);
509:
510: blob = chunk_from_chars(0x30, 0x0b, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65,
511: 0x70, 0x03, 0x02, 0x00, 0xd7);
512: pubkey = lib->creds->create(lib->creds, CRED_PUBLIC_KEY, KEY_ED25519,
513: BUILD_BLOB_ASN1_DER, blob, BUILD_END);
514: ck_assert(pubkey == NULL);
515:
516: blob = chunk_from_chars(0x30, 0x0b, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x00,
517: 0x70, 0x03, 0x02, 0x00, 0xd7);
518: pubkey = lib->creds->create(lib->creds, CRED_PUBLIC_KEY, KEY_ED25519,
519: BUILD_BLOB_ASN1_DER, blob, BUILD_END);
520: ck_assert(pubkey == NULL);
521:
522: pubkey = lib->creds->create(lib->creds, CRED_PUBLIC_KEY, KEY_ED25519,
523: BUILD_KEY_SIZE, 256, BUILD_BLOB_ASN1_DER, blob, BUILD_END);
524: ck_assert(pubkey == NULL);
525:
526: /* Invalid signature format */
527: pubkey = lib->creds->create(lib->creds, CRED_PUBLIC_KEY, KEY_ED25519,
528: BUILD_BLOB_ASN1_DER, sig_tests[0].pubkey, BUILD_END);
529: ck_assert(pubkey != NULL);
530:
531: ck_assert(!pubkey->verify(pubkey, SIGN_ED25519, NULL, chunk_empty,
532: chunk_empty));
533:
534: /* RFC 8032, section 5.1.7 requires that 0 <= s < L to prevent signature
535: * malleability. Only a warning because Botan, OpenSSL and wolfSSL are
536: * all vulnerable to this. */
537: if (pubkey->verify(pubkey, SIGN_ED25519, NULL, sig_tests[0].msg,
538: malleable_sig))
539: {
540: warn("Ed25519 signature verification is vulnerable to malleable "
541: "signatures");
542: }
543:
544: /* malformed signature */
545: sig = chunk_create(sig1, 64);
546: memcpy(sig1, sig_tests[0].sig.ptr, 64);
547: sig1[63] |= 0xe0;
548: ck_assert(!pubkey->verify(pubkey, SIGN_ED25519, NULL, sig_tests[0].msg,
549: sig));
550:
551: /* wrong signature */
552: memcpy(sig1, sig_tests[0].sig.ptr, 64);
553: sig1[0] = 0xe4;
554: ck_assert(!pubkey->verify(pubkey, SIGN_ED25519, NULL, sig_tests[0].msg,
555: sig));
556:
557: /* detect all-zeroes public key */
558: pubkey->destroy(pubkey);
559: pubkey = lib->creds->create(lib->creds, CRED_PUBLIC_KEY, KEY_ED25519,
560: BUILD_BLOB_ASN1_DER, zero_pk, BUILD_END);
561: ck_assert(pubkey != NULL);
562: ck_assert(!pubkey->verify(pubkey, SIGN_ED25519, NULL, sig_tests[0].msg,
563: sig));
564: pubkey->destroy(pubkey);
565: }
566: END_TEST
567:
568: Suite *ed25519_suite_create()
569: {
570: Suite *s;
571: TCase *tc;
572:
573: s = suite_create("ed25519");
574:
575: tc = tcase_create("ed25519_sign");
576: tcase_add_loop_test(tc, test_ed25519_sign, 0, countof(sig_tests));
577: suite_add_tcase(s, tc);
578:
579: tc = tcase_create("ed25519_gen");
580: tcase_add_test(tc, test_ed25519_gen);
581: suite_add_tcase(s, tc);
582:
583: tc = tcase_create("ed25519_fail");
584: tcase_add_test(tc, test_ed25519_fail);
585: suite_add_tcase(s, tc);
586:
587: tc = tcase_create("ed25519_speed");
588: test_case_set_timeout(tc, 10);
589: tcase_add_test(tc, test_ed25519_speed);
590: suite_add_tcase(s, tc);
591:
592: return s;
593: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>