Skip to content

Commit f9ad07a

Browse files
authored
Merge pull request #326 from thegushi/issue-multisign-tests
libopendkim/tests: add multi-signing unit tests (t-test204, t-test205)
2 parents c119d37 + d8bb9e6 commit f9ad07a

3 files changed

Lines changed: 505 additions & 0 deletions

File tree

libopendkim/tests/Makefile.am

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ check_PROGRAMS = t-setup t-test00 t-test01 t-test02 t-test03 t-test04 \
4343
t-test151 t-test152 t-test153 t-test154 t-test155 t-test156 \
4444
t-test157 t-test158 t-test159 t-test160 \
4545
t-test200 t-test201 t-test202 t-test203 \
46+
t-test204 t-test205 \
4647
t-signperf t-verifyperf
4748
check_SCRIPTS = t-signperf-sha1 t-signperf-relaxed-relaxed \
4849
t-signperf-simple-simple \
@@ -231,6 +232,8 @@ t_test200_SOURCES = t-test200.c t-testdata.h
231232
t_test201_SOURCES = t-test201.c t-testdata.h
232233
t_test202_SOURCES = t-test202.c t-testdata.h
233234
t_test203_SOURCES = t-test203.c t-testdata.h
235+
t_test204_SOURCES = t-test204.c t-testdata.h
236+
t_test205_SOURCES = t-test205.c t-testdata.h
234237

235238
MOSTLYCLEANFILES=
236239

libopendkim/tests/t-test204.c

Lines changed: 229 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,229 @@
1+
/*
2+
** Copyright (c) 2005-2008 Sendmail, Inc. and its suppliers.
3+
** All rights reserved.
4+
**
5+
** Copyright (c) 2009, 2011-2013, The Trusted Domain Project.
6+
** All rights reserved.
7+
*/
8+
9+
#include "build-config.h"
10+
11+
/* system includes */
12+
#include <sys/types.h>
13+
#include <assert.h>
14+
#include <string.h>
15+
#include <stdio.h>
16+
17+
#ifdef USE_GNUTLS
18+
# include <gnutls/gnutls.h>
19+
#endif /* USE_GNUTLS */
20+
21+
/* libopendkim includes */
22+
#include "../dkim.h"
23+
#include "t-testdata.h"
24+
25+
#define MAXHEADER 4096
26+
27+
/*
28+
** key_lookup -- return public key for a given selector/domain pair
29+
**
30+
** SELECTOR ("test") + DOMAIN -> RSA public key
31+
** SELECTOR2 ("brisbane") + DOMAIN -> Ed25519 public key
32+
*/
33+
34+
static DKIM_STAT
35+
key_lookup(DKIM *dkim, DKIM_SIGINFO *sig, unsigned char *buf, size_t buflen)
36+
{
37+
const char *selector;
38+
const char *domain;
39+
40+
assert(dkim != NULL);
41+
assert(sig != NULL);
42+
assert(buf != NULL);
43+
44+
selector = dkim_sig_getselector(sig);
45+
domain = dkim_sig_getdomain(sig);
46+
47+
assert(selector != NULL);
48+
assert(domain != NULL);
49+
assert(strcmp(domain, DOMAIN) == 0);
50+
51+
memset(buf, '\0', buflen);
52+
53+
if (strcmp(selector, SELECTOR) == 0)
54+
strncpy((char *) buf, PUBLICKEY, buflen - 1);
55+
else if (strcmp(selector, SELECTOR2) == 0)
56+
strncpy((char *) buf, RFC8463_ED25519PUBLICKEY, buflen - 1);
57+
else
58+
assert(0); /* unexpected selector */
59+
60+
return DKIM_STAT_OK;
61+
}
62+
63+
/*
64+
** MAIN -- program mainline
65+
**
66+
** Parameters:
67+
** The usual.
68+
**
69+
** Return value:
70+
** Exit status.
71+
*/
72+
73+
int
74+
main(int argc, char **argv)
75+
{
76+
#ifdef TEST_KEEP_FILES
77+
u_int flags;
78+
#endif /* TEST_KEEP_FILES */
79+
DKIM_STAT status;
80+
DKIM *dkim;
81+
DKIM_LIB *lib;
82+
DKIM_SIGINFO **sigs;
83+
int nsigs;
84+
dkim_sigkey_t key;
85+
unsigned char rsa_sig[MAXHEADER + 1];
86+
unsigned char ed25519_sig[MAXHEADER + 1];
87+
unsigned char hdr[MAXHEADER + 1];
88+
89+
printf("*** relaxed/relaxed multi-signing (RSA-SHA256 + Ed25519), both verify\n");
90+
91+
#ifdef USE_GNUTLS
92+
(void) gnutls_global_init();
93+
#endif /* USE_GNUTLS */
94+
95+
lib = dkim_init(NULL, NULL);
96+
assert(lib != NULL);
97+
98+
if (!dkim_libfeature(lib, DKIM_FEATURE_ED25519) ||
99+
!dkim_libfeature(lib, DKIM_FEATURE_SHA256))
100+
{
101+
printf("*** relaxed/relaxed multi-signing (RSA-SHA256 + Ed25519), both verify SKIPPED\n");
102+
dkim_close(lib);
103+
return 0;
104+
}
105+
106+
#ifdef TEST_KEEP_FILES
107+
flags = (DKIM_LIBFLAGS_TMPFILES|DKIM_LIBFLAGS_KEEPFILES);
108+
(void) dkim_options(lib, DKIM_OP_SETOPT, DKIM_OPTS_FLAGS, &flags,
109+
sizeof flags);
110+
#endif /* TEST_KEEP_FILES */
111+
112+
/* sign with RSA-SHA256 */
113+
key = KEY;
114+
dkim = dkim_sign(lib, JOBID, NULL, key, SELECTOR, DOMAIN,
115+
DKIM_CANON_RELAXED, DKIM_CANON_RELAXED,
116+
DKIM_SIGN_RSASHA256, -1L, &status);
117+
assert(dkim != NULL);
118+
119+
status = dkim_header(dkim, HEADER05, strlen(HEADER05));
120+
assert(status == DKIM_STAT_OK);
121+
status = dkim_header(dkim, HEADER06, strlen(HEADER06));
122+
assert(status == DKIM_STAT_OK);
123+
status = dkim_header(dkim, HEADER07, strlen(HEADER07));
124+
assert(status == DKIM_STAT_OK);
125+
status = dkim_header(dkim, HEADER08, strlen(HEADER08));
126+
assert(status == DKIM_STAT_OK);
127+
status = dkim_header(dkim, HEADER09, strlen(HEADER09));
128+
assert(status == DKIM_STAT_OK);
129+
status = dkim_eoh(dkim);
130+
assert(status == DKIM_STAT_OK);
131+
status = dkim_body(dkim, BODY00, strlen(BODY00));
132+
assert(status == DKIM_STAT_OK);
133+
status = dkim_body(dkim, BODY01, strlen(BODY01));
134+
assert(status == DKIM_STAT_OK);
135+
status = dkim_eom(dkim, NULL);
136+
assert(status == DKIM_STAT_OK);
137+
138+
memset(rsa_sig, '\0', sizeof rsa_sig);
139+
status = dkim_getsighdr(dkim, rsa_sig, sizeof rsa_sig,
140+
strlen(DKIM_SIGNHEADER) + 2);
141+
assert(status == DKIM_STAT_OK);
142+
143+
status = dkim_free(dkim);
144+
assert(status == DKIM_STAT_OK);
145+
146+
/* sign with Ed25519-SHA256 */
147+
key = RFC8463_ED25519KEY;
148+
dkim = dkim_sign(lib, JOBID, NULL, key, SELECTOR2, DOMAIN,
149+
DKIM_CANON_RELAXED, DKIM_CANON_RELAXED,
150+
DKIM_SIGN_ED25519SHA256, -1L, &status);
151+
assert(dkim != NULL);
152+
153+
status = dkim_header(dkim, HEADER05, strlen(HEADER05));
154+
assert(status == DKIM_STAT_OK);
155+
status = dkim_header(dkim, HEADER06, strlen(HEADER06));
156+
assert(status == DKIM_STAT_OK);
157+
status = dkim_header(dkim, HEADER07, strlen(HEADER07));
158+
assert(status == DKIM_STAT_OK);
159+
status = dkim_header(dkim, HEADER08, strlen(HEADER08));
160+
assert(status == DKIM_STAT_OK);
161+
status = dkim_header(dkim, HEADER09, strlen(HEADER09));
162+
assert(status == DKIM_STAT_OK);
163+
status = dkim_eoh(dkim);
164+
assert(status == DKIM_STAT_OK);
165+
status = dkim_body(dkim, BODY00, strlen(BODY00));
166+
assert(status == DKIM_STAT_OK);
167+
status = dkim_body(dkim, BODY01, strlen(BODY01));
168+
assert(status == DKIM_STAT_OK);
169+
status = dkim_eom(dkim, NULL);
170+
assert(status == DKIM_STAT_OK);
171+
172+
memset(ed25519_sig, '\0', sizeof ed25519_sig);
173+
status = dkim_getsighdr(dkim, ed25519_sig, sizeof ed25519_sig,
174+
strlen(DKIM_SIGNHEADER) + 2);
175+
assert(status == DKIM_STAT_OK);
176+
177+
status = dkim_free(dkim);
178+
assert(status == DKIM_STAT_OK);
179+
180+
/* verify both signatures */
181+
status = dkim_set_key_lookup(lib, key_lookup);
182+
assert(status == DKIM_STAT_OK);
183+
184+
dkim = dkim_verify(lib, JOBID, NULL, &status);
185+
assert(dkim != NULL);
186+
187+
snprintf((char *) hdr, sizeof hdr, "%s: %s", DKIM_SIGNHEADER, rsa_sig);
188+
status = dkim_header(dkim, hdr, strlen((char *) hdr));
189+
assert(status == DKIM_STAT_OK);
190+
191+
snprintf((char *) hdr, sizeof hdr, "%s: %s", DKIM_SIGNHEADER, ed25519_sig);
192+
status = dkim_header(dkim, hdr, strlen((char *) hdr));
193+
assert(status == DKIM_STAT_OK);
194+
195+
status = dkim_header(dkim, HEADER05, strlen(HEADER05));
196+
assert(status == DKIM_STAT_OK);
197+
status = dkim_header(dkim, HEADER06, strlen(HEADER06));
198+
assert(status == DKIM_STAT_OK);
199+
status = dkim_header(dkim, HEADER07, strlen(HEADER07));
200+
assert(status == DKIM_STAT_OK);
201+
status = dkim_header(dkim, HEADER08, strlen(HEADER08));
202+
assert(status == DKIM_STAT_OK);
203+
status = dkim_header(dkim, HEADER09, strlen(HEADER09));
204+
assert(status == DKIM_STAT_OK);
205+
status = dkim_eoh(dkim);
206+
assert(status == DKIM_STAT_OK);
207+
status = dkim_body(dkim, BODY00, strlen(BODY00));
208+
assert(status == DKIM_STAT_OK);
209+
status = dkim_body(dkim, BODY01, strlen(BODY01));
210+
assert(status == DKIM_STAT_OK);
211+
status = dkim_eom(dkim, NULL);
212+
assert(status == DKIM_STAT_OK);
213+
214+
nsigs = 0;
215+
assert(dkim_getsiglist(dkim, &sigs, &nsigs) == DKIM_STAT_OK);
216+
assert(nsigs == 2);
217+
218+
assert(dkim_sig_geterror(sigs[0]) == DKIM_SIGERROR_OK);
219+
assert(dkim_sig_geterror(sigs[1]) == DKIM_SIGERROR_OK);
220+
assert(DKIM_SIG_CHECK(sigs[0]));
221+
assert(DKIM_SIG_CHECK(sigs[1]));
222+
223+
status = dkim_free(dkim);
224+
assert(status == DKIM_STAT_OK);
225+
226+
dkim_close(lib);
227+
228+
return 0;
229+
}

0 commit comments

Comments
 (0)