diff options
-rw-r--r-- | src/regress/lib/libssl/interop/Makefile | 4 | ||||
-rw-r--r-- | src/regress/lib/libssl/interop/Makefile.inc | 43 | ||||
-rw-r--r-- | src/regress/lib/libssl/interop/README | 5 | ||||
-rw-r--r-- | src/regress/lib/libssl/interop/cert/Makefile | 70 | ||||
-rw-r--r-- | src/regress/lib/libssl/interop/client.c | 58 | ||||
-rw-r--r-- | src/regress/lib/libssl/interop/libressl/Makefile | 9 | ||||
-rw-r--r-- | src/regress/lib/libssl/interop/openssl/Makefile | 9 | ||||
-rw-r--r-- | src/regress/lib/libssl/interop/openssl11/Makefile | 9 | ||||
-rw-r--r-- | src/regress/lib/libssl/interop/server.c | 70 | ||||
-rw-r--r-- | src/regress/lib/libssl/interop/util.c | 12 | ||||
-rw-r--r-- | src/regress/lib/libssl/interop/util.h | 3 |
11 files changed, 244 insertions, 48 deletions
diff --git a/src/regress/lib/libssl/interop/Makefile b/src/regress/lib/libssl/interop/Makefile index d89376aaf6..0226cae4ab 100644 --- a/src/regress/lib/libssl/interop/Makefile +++ b/src/regress/lib/libssl/interop/Makefile | |||
@@ -1,5 +1,5 @@ | |||
1 | # $OpenBSD: Makefile,v 1.2 2018/11/07 19:09:01 bluhm Exp $ | 1 | # $OpenBSD: Makefile,v 1.3 2018/11/09 06:30:41 bluhm Exp $ |
2 | 2 | ||
3 | SUBDIR = libressl openssl openssl11 | 3 | SUBDIR = libressl openssl openssl11 cert |
4 | 4 | ||
5 | .include <bsd.subdir.mk> | 5 | .include <bsd.subdir.mk> |
diff --git a/src/regress/lib/libssl/interop/Makefile.inc b/src/regress/lib/libssl/interop/Makefile.inc index 1a1ef30ca6..9daae79e57 100644 --- a/src/regress/lib/libssl/interop/Makefile.inc +++ b/src/regress/lib/libssl/interop/Makefile.inc | |||
@@ -1,17 +1,15 @@ | |||
1 | # $OpenBSD: Makefile.inc,v 1.3 2018/11/07 20:46:28 bluhm Exp $ | 1 | # $OpenBSD: Makefile.inc,v 1.4 2018/11/09 06:30:41 bluhm Exp $ |
2 | 2 | ||
3 | .PATH: ${.CURDIR}/.. | 3 | .PATH: ${.CURDIR}/.. |
4 | 4 | ||
5 | SRCS_client = client.c util.c | 5 | SRCS_client = client.c util.c |
6 | SRCS_server = server.c util.c | 6 | SRCS_server = server.c util.c |
7 | WARNINGS = yes | 7 | WARNINGS = yes |
8 | REGRESS_TARGETS = | ||
9 | 8 | ||
10 | # check that program is linked with correct libraries | 9 | # check that program is linked with correct libraries |
11 | 10 | ||
12 | .for p in ${PROGS} | 11 | .for p in ${PROGS} |
13 | CLEANFILES += ldd-$p.out | 12 | CLEANFILES += ldd-$p.out |
14 | REGRESS_TARGETS += run-ldd-$p | ||
15 | ldd-$p.out: $p | 13 | ldd-$p.out: $p |
16 | LD_LIBRARY_PATH=${LD_LIBRARY_PATH} ldd $p >$@ | 14 | LD_LIBRARY_PATH=${LD_LIBRARY_PATH} ldd $p >$@ |
17 | .endfor | 15 | .endfor |
@@ -19,12 +17,13 @@ ldd-$p.out: $p | |||
19 | # run netcat server and connect with test client | 17 | # run netcat server and connect with test client |
20 | 18 | ||
21 | CLEANFILES += nc-client.out netcat-l.out netcat-l.fstat | 19 | CLEANFILES += nc-client.out netcat-l.out netcat-l.fstat |
22 | REGRESS_TARGETS += run-client | ||
23 | nc-client.out run-client: client 127.0.0.1.crt | 20 | nc-client.out run-client: client 127.0.0.1.crt |
24 | @echo '\n======== $@ ========' | 21 | @echo '\n======== $@ ========' |
25 | echo "greeting" | nc -l -c -C 127.0.0.1.crt -K 127.0.0.1.key \ | 22 | echo "greeting" | nc -l -c -C 127.0.0.1.crt -K 127.0.0.1.key \ |
26 | 127.0.0.1 0 >netcat-l.out & \ | 23 | 127.0.0.1 0 >netcat-l.out & \ |
27 | sleep 1; fstat -p $$! >netcat-l.fstat | 24 | for i in `jot 1000`; do fstat -p $$! >netcat-l.fstat; \ |
25 | grep -q ' stream tcp .*:[1-9][0-9]*$$' netcat-l.fstat && exit 0; \ | ||
26 | done; exit 1 | ||
28 | LD_LIBRARY_PATH=${LD_LIBRARY_PATH} ./client \ | 27 | LD_LIBRARY_PATH=${LD_LIBRARY_PATH} ./client \ |
29 | `sed -n 's/.* stream tcp .*:/127.0.0.1 /p' netcat-l.fstat` \ | 28 | `sed -n 's/.* stream tcp .*:/127.0.0.1 /p' netcat-l.fstat` \ |
30 | >nc-client.out | 29 | >nc-client.out |
@@ -38,12 +37,11 @@ nc-client.out run-client: client 127.0.0.1.crt | |||
38 | # run test server and connect with netcat client | 37 | # run test server and connect with netcat client |
39 | 38 | ||
40 | CLEANFILES += nc-server.out netcat.out | 39 | CLEANFILES += nc-server.out netcat.out |
41 | REGRESS_TARGETS += run-server | ||
42 | nc-server.out run-server: server 127.0.0.1.crt | 40 | nc-server.out run-server: server 127.0.0.1.crt |
43 | @echo '\n======== $@ ========' | 41 | @echo '\n======== $@ ========' |
44 | LD_LIBRARY_PATH=${LD_LIBRARY_PATH} ./server 127.0.0.1 0 \ | 42 | LD_LIBRARY_PATH=${LD_LIBRARY_PATH} ./server 127.0.0.1 0 \ |
45 | >nc-server.out | 43 | >nc-server.out |
46 | echo "hello" | nc -c -T noverify \ | 44 | echo "hello" | nc -c -R 127.0.0.1.crt \ |
47 | `sed -n 's/listen sock: //p' nc-server.out` \ | 45 | `sed -n 's/listen sock: //p' nc-server.out` \ |
48 | >netcat.out | 46 | >netcat.out |
49 | # check that the server child run successfully to the end | 47 | # check that the server child run successfully to the end |
@@ -56,7 +54,6 @@ nc-server.out run-server: server 127.0.0.1.crt | |||
56 | # run test server and with test client, self test the ssl library | 54 | # run test server and with test client, self test the ssl library |
57 | 55 | ||
58 | CLEANFILES += self-client.out self-server.out | 56 | CLEANFILES += self-client.out self-server.out |
59 | REGRESS_TARGETS += run-self | ||
60 | self-client.out self-server.out run-self: client server 127.0.0.1.crt | 57 | self-client.out self-server.out run-self: client server 127.0.0.1.crt |
61 | @echo '\n======== $@ ========' | 58 | @echo '\n======== $@ ========' |
62 | LD_LIBRARY_PATH=${LD_LIBRARY_PATH} ./server 127.0.0.1 0 \ | 59 | LD_LIBRARY_PATH=${LD_LIBRARY_PATH} ./server 127.0.0.1 0 \ |
@@ -73,23 +70,27 @@ self-client.out self-server.out run-self: client server 127.0.0.1.crt | |||
73 | # server must have read client hello | 70 | # server must have read client hello |
74 | grep -q '^<<< hello$$' self-server.out | 71 | grep -q '^<<< hello$$' self-server.out |
75 | 72 | ||
76 | .for o in nc-client nc-server self-client self-server | ||
77 | |||
78 | # check that client and server have used correct runtime library | ||
79 | |||
80 | REGRESS_TARGETS += run-version-$o | ||
81 | |||
82 | # check that client and server have used correct TLS protocol | ||
83 | |||
84 | REGRESS_TARGETS += run-protocol-$o | ||
85 | |||
86 | .endfor | ||
87 | |||
88 | # create certificates for TLS | 73 | # create certificates for TLS |
89 | 74 | ||
90 | CLEANFILES += 127.0.0.1.crt 127.0.0.1.key | 75 | CLEANFILES += 127.0.0.1.{crt,key} \ |
76 | ca.{crt,key,srl} fake-ca.{crt,key} \ | ||
77 | {client,server}.{req,crt,key} | ||
91 | 78 | ||
92 | 127.0.0.1.crt: | 79 | 127.0.0.1.crt: |
93 | openssl req -batch -new \ | 80 | openssl req -batch -new \ |
94 | -subj /L=OpenBSD/O=tls-regress/OU=server/CN=127.0.0.1/ \ | 81 | -subj /L=OpenBSD/O=tls-regress/OU=server/CN=127.0.0.1/ \ |
95 | -nodes -newkey rsa -keyout 127.0.0.1.key -x509 -out $@ | 82 | -nodes -newkey rsa -keyout 127.0.0.1.key -x509 -out $@ |
83 | |||
84 | ca.crt fake-ca.crt: | ||
85 | openssl req -batch -new \ | ||
86 | -subj /L=OpenBSD/O=tls-regress/OU=ca/CN=root/ \ | ||
87 | -nodes -newkey rsa -keyout ${@:R}.key -x509 -out $@ | ||
88 | |||
89 | client.req server.req: | ||
90 | openssl req -batch -new \ | ||
91 | -subj /L=OpenBSD/O=tls-regress/OU=${@:R}/CN=localhost/ \ | ||
92 | -nodes -newkey rsa -keyout ${@:R}.key -out $@ | ||
93 | |||
94 | client.crt server.crt: ca.crt ${@:R}.req | ||
95 | openssl x509 -CAcreateserial -CAkey ca.key -CA ca.crt \ | ||
96 | -req -in ${@:R}.req -out $@ | ||
diff --git a/src/regress/lib/libssl/interop/README b/src/regress/lib/libssl/interop/README index 1bd418c9cc..b53b47b878 100644 --- a/src/regress/lib/libssl/interop/README +++ b/src/regress/lib/libssl/interop/README | |||
@@ -12,3 +12,8 @@ that the highest available TLS version is selected. LibreSSL TLS | |||
12 | Currently OpenSSL 1.0.2p and OpenSSL 1.1.1 from ports are used. As | 12 | Currently OpenSSL 1.0.2p and OpenSSL 1.1.1 from ports are used. As |
13 | soon as LibreSSL supports TLS 1.3, it should be used automatically | 13 | soon as LibreSSL supports TLS 1.3, it should be used automatically |
14 | when netcat is communicating with OpenSSL 1.1. | 14 | when netcat is communicating with OpenSSL 1.1. |
15 | |||
16 | The cert subdir is testing all combinations of certificate validation. | ||
17 | Having the three libraries, client and server certificates, missing | ||
18 | or invalid CA or certificates, and enforcing peer certificate results | ||
19 | in 1944 test cases. | ||
diff --git a/src/regress/lib/libssl/interop/cert/Makefile b/src/regress/lib/libssl/interop/cert/Makefile new file mode 100644 index 0000000000..dabc0441f0 --- /dev/null +++ b/src/regress/lib/libssl/interop/cert/Makefile | |||
@@ -0,0 +1,70 @@ | |||
1 | # $OpenBSD: Makefile,v 1.1 2018/11/09 06:30:41 bluhm Exp $ | ||
2 | |||
3 | .if ! exists(/usr/local/bin/eopenssl) || ! exists(/usr/local/bin/eopenssl11) | ||
4 | regress: | ||
5 | # install openssl-1.0.2p and openssl-1.1.1 from ports | ||
6 | @echo SKIPPED | ||
7 | .endif | ||
8 | |||
9 | CLEANFILES += client.out server.out | ||
10 | |||
11 | .for cca in noca ca fakeca | ||
12 | .for sca in noca ca fakeca | ||
13 | .for ccert in nocert cert | ||
14 | .for scert in nocert cert | ||
15 | .for cv in noverify verify | ||
16 | .for sv in noverify verify certverify | ||
17 | |||
18 | # remember when certificate verification should fail | ||
19 | .if (("${cv}" == verify && "${cca}" == ca && "${scert}" == cert) || \ | ||
20 | "${cv}" == noverify) && \ | ||
21 | (("${sv}" == verify && "${ccert}" == nocert) || \ | ||
22 | ("${sv}" == verify && "${sca}" == ca && "${ccert}" == cert) || \ | ||
23 | ("${sv}" == certverify && "${sca}" == ca && "${ccert}" == cert) || \ | ||
24 | "${sv}" == noverify) | ||
25 | FAIL_${cca}_${sca}_${ccert}_${scert}_${cv}_${sv} = | ||
26 | .else | ||
27 | FAIL_${cca}_${sca}_${ccert}_${scert}_${cv}_${sv} = ! | ||
28 | .endif | ||
29 | |||
30 | .for clib in libressl openssl openssl11 | ||
31 | .for slib in libressl openssl openssl11 | ||
32 | |||
33 | REGRESS_TARGETS += \ | ||
34 | run-client-${clib}-${cca}-${ccert}-${cv}-server-${slib}-${sca}-${scert}-${sv} | ||
35 | |||
36 | run-client-${clib}-${cca}-${ccert}-${cv}-server-${slib}-${sca}-${scert}-${sv}:\ | ||
37 | 127.0.0.1.crt ca.crt fake-ca.crt client.crt server.crt \ | ||
38 | ../${clib}/client ../${slib}/server | ||
39 | @echo '\n======== $@ ========' | ||
40 | LD_LIBRARY_PATH=/usr/local/lib/e${slib} \ | ||
41 | ../${slib}/server >server.out \ | ||
42 | ${sca:S/^noca//:S/^fakeca/-C fake-ca.crt/:S/^ca/-C ca.crt/} \ | ||
43 | ${scert:S/^nocert//:S/^cert/-c server.crt -k server.key/} \ | ||
44 | ${sv:S/^noverify//:S/^verify/-v/:S/^certverify/-vv/} \ | ||
45 | 127.0.0.1 0 | ||
46 | ${FAIL_${cca}_${sca}_${ccert}_${scert}_${cv}_${sv}} \ | ||
47 | LD_LIBRARY_PATH=/usr/local/lib/e${clib} \ | ||
48 | ../${clib}/client >client.out \ | ||
49 | ${cca:S/^noca//:S/^fakeca/-C fake-ca.crt/:S/^ca/-C ca.crt/} \ | ||
50 | ${ccert:S/^nocert//:S/^cert/-c server.crt -k server.key/} \ | ||
51 | ${cv:S/^noverify//:S/^verify/-v/} \ | ||
52 | `sed -n 's/listen sock: //p' server.out` | ||
53 | .if empty(${FAIL_${cca}_${sca}_${ccert}_${scert}_${cv}_${sv}}) | ||
54 | grep '^success$$' server.out | ||
55 | grep '^success$$' client.out | ||
56 | .elif ! ("${sv}" == certverify && "${ccert}" == nocert) || \ | ||
57 | ("${cv}" == verify && "${scert}" != cert) | ||
58 | grep '^verify: fail' client.out server.out | ||
59 | .endif | ||
60 | |||
61 | .endfor | ||
62 | .endfor | ||
63 | .endfor | ||
64 | .endfor | ||
65 | .endfor | ||
66 | .endfor | ||
67 | .endfor | ||
68 | .endfor | ||
69 | |||
70 | .include <bsd.regress.mk> | ||
diff --git a/src/regress/lib/libssl/interop/client.c b/src/regress/lib/libssl/interop/client.c index 60fb718fdb..c312d7ae8a 100644 --- a/src/regress/lib/libssl/interop/client.c +++ b/src/regress/lib/libssl/interop/client.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: client.c,v 1.3 2018/11/07 19:09:01 bluhm Exp $ */ | 1 | /* $OpenBSD: client.c,v 1.4 2018/11/09 06:30:41 bluhm Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2018 Alexander Bluhm <bluhm@openbsd.org> | 3 | * Copyright (c) 2018 Alexander Bluhm <bluhm@openbsd.org> |
4 | * | 4 | * |
@@ -34,7 +34,8 @@ void __dead usage(void); | |||
34 | void __dead | 34 | void __dead |
35 | usage(void) | 35 | usage(void) |
36 | { | 36 | { |
37 | fprintf(stderr, "usage: client host port"); | 37 | fprintf(stderr, |
38 | "usage: client [-c] [-C CA] [-c crt -k key] host port"); | ||
38 | exit(2); | 39 | exit(2); |
39 | } | 40 | } |
40 | 41 | ||
@@ -46,19 +47,42 @@ main(int argc, char *argv[]) | |||
46 | SSL *ssl; | 47 | SSL *ssl; |
47 | BIO *bio; | 48 | BIO *bio; |
48 | SSL_SESSION *session; | 49 | SSL_SESSION *session; |
49 | int error; | 50 | int error, verify = 0; |
50 | char buf[256]; | 51 | char buf[256], ch; |
52 | char *ca = NULL, *crt = NULL, *key = NULL; | ||
51 | char *host_port, *host, *port; | 53 | char *host_port, *host, *port; |
52 | 54 | ||
53 | if (argc == 3) { | 55 | while ((ch = getopt(argc, argv, "C:c:k:v")) != -1) { |
54 | host = argv[1]; | 56 | switch (ch) { |
55 | port = argv[2]; | 57 | case 'C': |
58 | ca = optarg; | ||
59 | break; | ||
60 | case 'c': | ||
61 | crt = optarg; | ||
62 | break; | ||
63 | case 'k': | ||
64 | key = optarg; | ||
65 | break; | ||
66 | case 'v': | ||
67 | verify = 1; | ||
68 | break; | ||
69 | default: | ||
70 | usage(); | ||
71 | } | ||
72 | } | ||
73 | argc -= optind; | ||
74 | argv += optind; | ||
75 | if (argc == 2) { | ||
76 | host = argv[0]; | ||
77 | port = argv[1]; | ||
56 | } else { | 78 | } else { |
57 | usage(); | 79 | usage(); |
58 | } | 80 | } |
59 | if (asprintf(&host_port, strchr(host, ':') ? "[%s]:%s" : "%s:%s", | 81 | if (asprintf(&host_port, strchr(host, ':') ? "[%s]:%s" : "%s:%s", |
60 | host, port) == -1) | 82 | host, port) == -1) |
61 | err(1, "asprintf host port"); | 83 | err(1, "asprintf host port"); |
84 | if ((crt == NULL && key != NULL) || (crt != NULL && key == NULL)) | ||
85 | errx(1, "certificate and private key must be used together"); | ||
62 | 86 | ||
63 | SSL_library_init(); | 87 | SSL_library_init(); |
64 | SSL_load_error_strings(); | 88 | SSL_load_error_strings(); |
@@ -78,6 +102,26 @@ main(int argc, char *argv[]) | |||
78 | if (ctx == NULL) | 102 | if (ctx == NULL) |
79 | err_ssl(1, "SSL_CTX_new"); | 103 | err_ssl(1, "SSL_CTX_new"); |
80 | 104 | ||
105 | /* load client certificate */ | ||
106 | if (crt != NULL) { | ||
107 | if (SSL_CTX_use_certificate_file(ctx, crt, | ||
108 | SSL_FILETYPE_PEM) <= 0) | ||
109 | err_ssl(1, "SSL_CTX_use_certificate_file"); | ||
110 | if (SSL_CTX_use_PrivateKey_file(ctx, key, | ||
111 | SSL_FILETYPE_PEM) <= 0) | ||
112 | err_ssl(1, "SSL_CTX_use_PrivateKey_file"); | ||
113 | if (SSL_CTX_check_private_key(ctx) <= 0) | ||
114 | err_ssl(1, "SSL_CTX_check_private_key"); | ||
115 | } | ||
116 | |||
117 | /* verify server certificate */ | ||
118 | if (ca != NULL) { | ||
119 | if (SSL_CTX_load_verify_locations(ctx, ca, NULL) <= 0) | ||
120 | err_ssl(1, "SSL_CTX_load_verify_locations"); | ||
121 | } | ||
122 | SSL_CTX_set_verify(ctx, verify ? SSL_VERIFY_PEER : SSL_VERIFY_NONE, | ||
123 | verify_callback); | ||
124 | |||
81 | /* setup ssl and bio for socket operations */ | 125 | /* setup ssl and bio for socket operations */ |
82 | ssl = SSL_new(ctx); | 126 | ssl = SSL_new(ctx); |
83 | if (ssl == NULL) | 127 | if (ssl == NULL) |
diff --git a/src/regress/lib/libssl/interop/libressl/Makefile b/src/regress/lib/libssl/interop/libressl/Makefile index 19557ffbc1..6923e12469 100644 --- a/src/regress/lib/libssl/interop/libressl/Makefile +++ b/src/regress/lib/libssl/interop/libressl/Makefile | |||
@@ -1,4 +1,4 @@ | |||
1 | # $OpenBSD: Makefile,v 1.3 2018/11/07 20:46:28 bluhm Exp $ | 1 | # $OpenBSD: Makefile,v 1.4 2018/11/09 06:30:41 bluhm Exp $ |
2 | 2 | ||
3 | PROGS = client server | 3 | PROGS = client server |
4 | CPPFLAGS = | 4 | CPPFLAGS = |
@@ -6,6 +6,13 @@ LDFLAGS = | |||
6 | LDADD = -lssl -lcrypto | 6 | LDADD = -lssl -lcrypto |
7 | DPADD = ${LIBSSL} ${LIBCRYPTO} | 7 | DPADD = ${LIBSSL} ${LIBCRYPTO} |
8 | LD_LIBRARY_PATH = | 8 | LD_LIBRARY_PATH = |
9 | REGRESS_TARGETS = run-self | ||
10 | .for p in ${PROGS} | ||
11 | REGRESS_TARGETS += run-ldd-$p run-$p | ||
12 | .for x in nc self | ||
13 | REGRESS_TARGETS += run-version-$x-$p run-protocol-$x-$p | ||
14 | .endfor | ||
15 | .endfor | ||
9 | 16 | ||
10 | run-protocol-self-client run-protocol-self-server \ | 17 | run-protocol-self-client run-protocol-self-server \ |
11 | run-protocol-nc-client run-protocol-nc-server: | 18 | run-protocol-nc-client run-protocol-nc-server: |
diff --git a/src/regress/lib/libssl/interop/openssl/Makefile b/src/regress/lib/libssl/interop/openssl/Makefile index ad0c7288ca..5c51c029ce 100644 --- a/src/regress/lib/libssl/interop/openssl/Makefile +++ b/src/regress/lib/libssl/interop/openssl/Makefile | |||
@@ -1,4 +1,4 @@ | |||
1 | # $OpenBSD: Makefile,v 1.3 2018/11/07 20:46:28 bluhm Exp $ | 1 | # $OpenBSD: Makefile,v 1.4 2018/11/09 06:30:41 bluhm Exp $ |
2 | 2 | ||
3 | .if ! exists(/usr/local/bin/eopenssl) | 3 | .if ! exists(/usr/local/bin/eopenssl) |
4 | regress: | 4 | regress: |
@@ -13,6 +13,13 @@ LDADD = -lssl -lcrypto | |||
13 | DPADD = /usr/local/lib/eopenssl/libssl.a \ | 13 | DPADD = /usr/local/lib/eopenssl/libssl.a \ |
14 | /usr/local/lib/eopenssl/libcrypto.a | 14 | /usr/local/lib/eopenssl/libcrypto.a |
15 | LD_LIBRARY_PATH = /usr/local/lib/eopenssl | 15 | LD_LIBRARY_PATH = /usr/local/lib/eopenssl |
16 | REGRESS_TARGETS = run-self | ||
17 | .for p in ${PROGS} | ||
18 | REGRESS_TARGETS += run-ldd-$p run-$p | ||
19 | .for x in nc self | ||
20 | REGRESS_TARGETS += run-version-$x-$p run-protocol-$x-$p | ||
21 | .endfor | ||
22 | .endfor | ||
16 | 23 | ||
17 | .for p in ${PROGS} | 24 | .for p in ${PROGS} |
18 | run-ldd-$p: ldd-$p.out | 25 | run-ldd-$p: ldd-$p.out |
diff --git a/src/regress/lib/libssl/interop/openssl11/Makefile b/src/regress/lib/libssl/interop/openssl11/Makefile index e7257a3976..ec6f6db7ec 100644 --- a/src/regress/lib/libssl/interop/openssl11/Makefile +++ b/src/regress/lib/libssl/interop/openssl11/Makefile | |||
@@ -1,4 +1,4 @@ | |||
1 | # $OpenBSD: Makefile,v 1.2 2018/11/07 20:46:28 bluhm Exp $ | 1 | # $OpenBSD: Makefile,v 1.3 2018/11/09 06:30:41 bluhm Exp $ |
2 | 2 | ||
3 | .if ! exists(/usr/local/bin/eopenssl11) | 3 | .if ! exists(/usr/local/bin/eopenssl11) |
4 | regress: | 4 | regress: |
@@ -13,6 +13,13 @@ LDADD = -lssl -lcrypto | |||
13 | DPADD = /usr/local/lib/eopenssl11/libssl.a \ | 13 | DPADD = /usr/local/lib/eopenssl11/libssl.a \ |
14 | /usr/local/lib/eopenssl11/libcrypto.a | 14 | /usr/local/lib/eopenssl11/libcrypto.a |
15 | LD_LIBRARY_PATH = /usr/local/lib/eopenssl11 | 15 | LD_LIBRARY_PATH = /usr/local/lib/eopenssl11 |
16 | REGRESS_TARGETS = run-self | ||
17 | .for p in ${PROGS} | ||
18 | REGRESS_TARGETS += run-ldd-$p run-$p | ||
19 | .for x in nc self | ||
20 | REGRESS_TARGETS += run-version-$x-$p run-protocol-$x-$p | ||
21 | .endfor | ||
22 | .endfor | ||
16 | 23 | ||
17 | run-protocol-nc-client run-protocol-nc-server: | 24 | run-protocol-nc-client run-protocol-nc-server: |
18 | @echo '\n======== $@ ========' | 25 | @echo '\n======== $@ ========' |
diff --git a/src/regress/lib/libssl/interop/server.c b/src/regress/lib/libssl/interop/server.c index 0aece87583..6c0c720dfe 100644 --- a/src/regress/lib/libssl/interop/server.c +++ b/src/regress/lib/libssl/interop/server.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: server.c,v 1.3 2018/11/07 19:09:01 bluhm Exp $ */ | 1 | /* $OpenBSD: server.c,v 1.4 2018/11/09 06:30:41 bluhm Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2018 Alexander Bluhm <bluhm@openbsd.org> | 3 | * Copyright (c) 2018 Alexander Bluhm <bluhm@openbsd.org> |
4 | * | 4 | * |
@@ -34,7 +34,8 @@ void __dead usage(void); | |||
34 | void __dead | 34 | void __dead |
35 | usage(void) | 35 | usage(void) |
36 | { | 36 | { |
37 | fprintf(stderr, "usage: server [host port]"); | 37 | fprintf(stderr, |
38 | "usage: server [-vv] [-C CA] [-c crt -k key] [host port]"); | ||
38 | exit(2); | 39 | exit(2); |
39 | } | 40 | } |
40 | 41 | ||
@@ -46,22 +47,46 @@ main(int argc, char *argv[]) | |||
46 | SSL *ssl; | 47 | SSL *ssl; |
47 | BIO *bio; | 48 | BIO *bio; |
48 | SSL_SESSION *session; | 49 | SSL_SESSION *session; |
49 | int error; | 50 | int error, verify = 0; |
50 | char buf[256]; | 51 | char buf[256], ch; |
51 | char *crt, *key, *host_port, *host = "127.0.0.1", *port = "0"; | 52 | char *ca = NULL, *crt = NULL, *key = NULL; |
52 | 53 | char *host_port, *host = "127.0.0.1", *port = "0"; | |
53 | if (argc == 3) { | 54 | |
54 | host = argv[1]; | 55 | while ((ch = getopt(argc, argv, "C:c:k:v")) != -1) { |
55 | port = argv[2]; | 56 | switch (ch) { |
56 | } else if (argc != 1) { | 57 | case 'C': |
58 | ca = optarg; | ||
59 | break; | ||
60 | case 'c': | ||
61 | crt = optarg; | ||
62 | break; | ||
63 | case 'k': | ||
64 | key = optarg; | ||
65 | break; | ||
66 | case 'v': | ||
67 | /* use twice to force client cert */ | ||
68 | verify++; | ||
69 | break; | ||
70 | default: | ||
71 | usage(); | ||
72 | } | ||
73 | } | ||
74 | argc -= optind; | ||
75 | argv += optind; | ||
76 | if (argc == 2) { | ||
77 | host = argv[0]; | ||
78 | port = argv[1]; | ||
79 | } else if (argc != 0) { | ||
57 | usage(); | 80 | usage(); |
58 | } | 81 | } |
59 | if (asprintf(&host_port, strchr(host, ':') ? "[%s]:%s" : "%s:%s", | 82 | if (asprintf(&host_port, strchr(host, ':') ? "[%s]:%s" : "%s:%s", |
60 | host, port) == -1) | 83 | host, port) == -1) |
61 | err(1, "asprintf host port"); | 84 | err(1, "asprintf host port"); |
62 | if (asprintf(&crt, "%s.crt", host) == -1) | 85 | if ((crt == NULL && key != NULL) || (crt != NULL && key == NULL)) |
86 | errx(1, "certificate and private key must be used together"); | ||
87 | if (crt == NULL && asprintf(&crt, "%s.crt", host) == -1) | ||
63 | err(1, "asprintf crt"); | 88 | err(1, "asprintf crt"); |
64 | if (asprintf(&key, "%s.key", host) == -1) | 89 | if (key == NULL && asprintf(&key, "%s.key", host) == -1) |
65 | err(1, "asprintf key"); | 90 | err(1, "asprintf key"); |
66 | 91 | ||
67 | SSL_library_init(); | 92 | SSL_library_init(); |
@@ -94,6 +119,23 @@ main(int argc, char *argv[]) | |||
94 | if (SSL_CTX_check_private_key(ctx) <= 0) | 119 | if (SSL_CTX_check_private_key(ctx) <= 0) |
95 | err_ssl(1, "SSL_CTX_check_private_key"); | 120 | err_ssl(1, "SSL_CTX_check_private_key"); |
96 | 121 | ||
122 | /* request client certificate and verify it */ | ||
123 | if (ca != NULL) { | ||
124 | STACK_OF(X509_NAME) *x509stack; | ||
125 | |||
126 | x509stack = SSL_load_client_CA_file(ca); | ||
127 | if (x509stack == NULL) | ||
128 | err_ssl(1, "SSL_load_client_CA_file"); | ||
129 | SSL_CTX_set_client_CA_list(ctx, x509stack); | ||
130 | if (SSL_CTX_load_verify_locations(ctx, ca, NULL) <= 0) | ||
131 | err_ssl(1, "SSL_CTX_load_verify_locations"); | ||
132 | } | ||
133 | SSL_CTX_set_verify(ctx, | ||
134 | verify == 0 ? SSL_VERIFY_NONE : | ||
135 | verify == 1 ? SSL_VERIFY_PEER : | ||
136 | SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, | ||
137 | verify_callback); | ||
138 | |||
97 | /* setup ssl and bio for socket operations */ | 139 | /* setup ssl and bio for socket operations */ |
98 | ssl = SSL_new(ctx); | 140 | ssl = SSL_new(ctx); |
99 | if (ssl == NULL) | 141 | if (ssl == NULL) |
@@ -109,9 +151,11 @@ main(int argc, char *argv[]) | |||
109 | printf("listen "); | 151 | printf("listen "); |
110 | print_sockname(bio); | 152 | print_sockname(bio); |
111 | 153 | ||
112 | /* fork to background and accept */ | 154 | /* fork to background, set timeout, and accept */ |
113 | if (daemon(1, 1) == -1) | 155 | if (daemon(1, 1) == -1) |
114 | err(1, "daemon"); | 156 | err(1, "daemon"); |
157 | if ((int)alarm(60) == -1) | ||
158 | err(1, "alarm"); | ||
115 | if (BIO_do_accept(bio) <= 0) | 159 | if (BIO_do_accept(bio) <= 0) |
116 | err_ssl(1, "BIO_do_accept wait"); | 160 | err_ssl(1, "BIO_do_accept wait"); |
117 | bio = BIO_pop(bio); | 161 | bio = BIO_pop(bio); |
diff --git a/src/regress/lib/libssl/interop/util.c b/src/regress/lib/libssl/interop/util.c index b012d73193..5190e81828 100644 --- a/src/regress/lib/libssl/interop/util.c +++ b/src/regress/lib/libssl/interop/util.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: util.c,v 1.2 2018/11/07 06:29:26 bluhm Exp $ */ | 1 | /* $OpenBSD: util.c,v 1.3 2018/11/09 06:30:41 bluhm Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2018 Alexander Bluhm <bluhm@openbsd.org> | 3 | * Copyright (c) 2018 Alexander Bluhm <bluhm@openbsd.org> |
4 | * | 4 | * |
@@ -133,3 +133,13 @@ err_ssl(int eval, const char *fmt, ...) | |||
133 | verrx(eval, fmt, ap); | 133 | verrx(eval, fmt, ap); |
134 | va_end(ap); | 134 | va_end(ap); |
135 | } | 135 | } |
136 | |||
137 | int | ||
138 | verify_callback(int preverify_ok, X509_STORE_CTX *x509_ctx) | ||
139 | { | ||
140 | printf("verify: %s\n", preverify_ok ? "pass" : "fail"); | ||
141 | if (fflush(stdout) != 0) | ||
142 | err(1, "fflush stdout"); | ||
143 | |||
144 | return preverify_ok; | ||
145 | } | ||
diff --git a/src/regress/lib/libssl/interop/util.h b/src/regress/lib/libssl/interop/util.h index 78f7bb63b6..7414a037d7 100644 --- a/src/regress/lib/libssl/interop/util.h +++ b/src/regress/lib/libssl/interop/util.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: util.h,v 1.2 2018/11/07 06:29:26 bluhm Exp $ */ | 1 | /* $OpenBSD: util.h,v 1.3 2018/11/09 06:30:41 bluhm Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2018 Alexander Bluhm <bluhm@openbsd.org> | 3 | * Copyright (c) 2018 Alexander Bluhm <bluhm@openbsd.org> |
4 | * | 4 | * |
@@ -20,3 +20,4 @@ void print_ciphers(STACK_OF(SSL_CIPHER) *); | |||
20 | void print_sockname(BIO *); | 20 | void print_sockname(BIO *); |
21 | void print_peername(BIO *); | 21 | void print_peername(BIO *); |
22 | void err_ssl(int, const char *, ...); | 22 | void err_ssl(int, const char *, ...); |
23 | int verify_callback(int, X509_STORE_CTX *); | ||