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