xref: /freebsd/crypto/openssh/regress/unittests/crypto/test_ed25519.c (revision bb5c77e9d281d6def6835d48249898764bc6a5fe)
1 /* 	$OpenBSD: test_ed25519.c,v 1.4 2026/06/22 12:28:48 dtucker Exp $ */
2 /*
3  * Regress test for Ed25519 keypair from seed
4  *
5  * Placed in the public domain
6  */
7 
8 #include "includes.h"
9 
10 #include <sys/types.h>
11 #include <stdarg.h>
12 #include <stdio.h>
13 #include <stdint.h>
14 #include <stdlib.h>
15 #include <string.h>
16 
17 #include "../test_helper/test_helper.h"
18 #include "crypto_api.h"
19 #include "xmalloc.h"
20 
21 struct ed25519_kat {
22 	const char *sk;
23 	const char *pk;
24 	const char *msg;
25 	const char *sig;
26 };
27 
28 static const struct ed25519_kat ed25519_kats[] = {
29 	{
30 		"9d61b19deffd5a60ba844af492ec2cc44449c569"
31 		"7b326919703bac031cae7f60",
32 		"d75a980182b10ab7d54bfed3c964073a0ee172f3"
33 		"daa62325af021a68f707511a",
34 		"",
35 		"e5564300c360ac729086e2cc806e828a84877f1e"
36 		"b8e5d974d873e065224901555fb8821590a33bac"
37 		"c61e39701cf9b46bd25bf5f0595bbe2465514143"
38 		"8e7a100b"
39 	},
40 	{
41 		"4ccd089b28ff96da9db6c346ec114e0f5b8a319f"
42 		"35aba624da8cf6ed4fb8a6fb",
43 		"3d4017c3e843895a92b70aa74d1b7ebc9c982ccf"
44 		"2ec4968cc0cd55f12af4660c",
45 		"72",
46 		"92a009a9f0d4cab8720e820b5f642540a2b27b54"
47 		"16503f8fb3762223ebdb69da085ac1e43e15996e"
48 		"458f3613d0f11d8c387b2eaeb4302aeeb00d2916"
49 		"12bb0c00"
50 	},
51 	{
52 		"c5aa8df43f9f837bedb7442f31dcb7b166d38535"
53 		"076f094b85ce3a2e0b4458f7",
54 		"fc51cd8e6218a1a38da47ed00230f0580816ed13"
55 		"ba3303ac5deb911548908025",
56 		"af82",
57 		"6291d657deec24024827e69c3abe01a30ce548a2"
58 		"84743a445e3680d7db5ac3ac18ff9b538d16f290"
59 		"ae67f760984dc6594a7c15e9716ed28dc027bece"
60 		"ea1ec40a"
61 	}
62 };
63 
64 void ed25519_tests(void);
65 
66 void
ed25519_tests(void)67 ed25519_tests(void)
68 {
69 	uint8_t pk[32], sk[64], seed[32];
70 	uint8_t expected_pk[32], expected_sig[64];
71 	uint8_t *msg, *tmp;
72 	size_t i, msglen;
73 	unsigned long long smlen;
74 
75 	for (i = 0; i < sizeof(ed25519_kats)/sizeof(ed25519_kats[0]); i++) {
76 		TEST_START("Ed25519 keypair from seed");
77 		hex2bin(seed, ed25519_kats[i].sk, 32);
78 		hex2bin(expected_pk, ed25519_kats[i].pk, 32);
79 		ASSERT_INT_EQ(crypto_sign_ed25519_keypair_from_seed(pk, sk, seed), 0);
80 		ASSERT_MEM_EQ(pk, expected_pk, 32);
81 		TEST_DONE();
82 
83 		TEST_START("Ed25519 sign/verify KAT");
84 		msglen = strlen(ed25519_kats[i].msg) / 2;
85 		ASSERT_PTR_NE(msg = malloc(msglen + 64), NULL);
86 		ASSERT_PTR_NE(tmp = malloc(msglen + 64), NULL);
87 		hex2bin(msg + 64, ed25519_kats[i].msg, msglen);
88 		hex2bin(expected_sig, ed25519_kats[i].sig, 64);
89 
90 		ASSERT_INT_EQ(crypto_sign_ed25519(msg, &smlen, msg + 64, msglen, sk), 0);
91 		ASSERT_MEM_EQ(msg, expected_sig, 64);
92 
93 		ASSERT_INT_EQ(crypto_sign_ed25519_open(tmp, &smlen, msg, msglen + 64, pk), 0);
94 		ASSERT_INT_EQ(smlen, msglen);
95 		free(msg);
96 		free(tmp);
97 		TEST_DONE();
98 	}
99 }
100