1*a8d85e88Sbluhm /* $OpenBSD: util.c,v 1.3 2018/11/09 06:30:41 bluhm Exp $ */
29231079cSbluhm /*
39231079cSbluhm * Copyright (c) 2018 Alexander Bluhm <bluhm@openbsd.org>
49231079cSbluhm *
59231079cSbluhm * Permission to use, copy, modify, and distribute this software for any
69231079cSbluhm * purpose with or without fee is hereby granted, provided that the above
79231079cSbluhm * copyright notice and this permission notice appear in all copies.
89231079cSbluhm *
99231079cSbluhm * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
109231079cSbluhm * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
119231079cSbluhm * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
129231079cSbluhm * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
139231079cSbluhm * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
149231079cSbluhm * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
159231079cSbluhm * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
169231079cSbluhm */
179231079cSbluhm
189231079cSbluhm #include <sys/types.h>
199231079cSbluhm #include <sys/socket.h>
209231079cSbluhm
219231079cSbluhm #include <err.h>
229231079cSbluhm #include <netdb.h>
239231079cSbluhm #include <stdio.h>
249231079cSbluhm
259231079cSbluhm #include <openssl/err.h>
269231079cSbluhm #include <openssl/ssl.h>
2722303e31Sbluhm #include <openssl/opensslv.h>
2822303e31Sbluhm #include <openssl/crypto.h>
299231079cSbluhm
309231079cSbluhm #include "util.h"
319231079cSbluhm
329231079cSbluhm void
print_version(void)3322303e31Sbluhm print_version(void)
3422303e31Sbluhm {
3522303e31Sbluhm #ifdef OPENSSL_VERSION_NUMBER
3622303e31Sbluhm printf("OPENSSL_VERSION_NUMBER: %#08lx\n", OPENSSL_VERSION_NUMBER);
3722303e31Sbluhm #endif
3822303e31Sbluhm #ifdef LIBRESSL_VERSION_NUMBER
3922303e31Sbluhm printf("LIBRESSL_VERSION_NUMBER: %#08lx\n", LIBRESSL_VERSION_NUMBER);
4022303e31Sbluhm #endif
4122303e31Sbluhm #ifdef LIBRESSL_VERSION_TEXT
4222303e31Sbluhm printf("LIBRESSL_VERSION_TEXT: %s\n", LIBRESSL_VERSION_TEXT);
4322303e31Sbluhm #endif
4422303e31Sbluhm #if OPENSSL_VERSION_NUMBER >= 0x1010000f
4522303e31Sbluhm printf("OpenSSL_version_num: %#08lx\n", OpenSSL_version_num());
4622303e31Sbluhm printf("OpenSSL_version OPENSSL_VERSION: %s\n",
4722303e31Sbluhm OpenSSL_version(OPENSSL_VERSION));
4822303e31Sbluhm printf("OpenSSL_version OPENSSL_CFLAGS: %s\n",
4922303e31Sbluhm OpenSSL_version(OPENSSL_CFLAGS));
5022303e31Sbluhm printf("OpenSSL_version OPENSSL_BUILT_ON: %s\n",
5122303e31Sbluhm OpenSSL_version(OPENSSL_BUILT_ON));
5222303e31Sbluhm printf("OpenSSL_version OPENSSL_PLATFORM: %s\n",
5322303e31Sbluhm OpenSSL_version(OPENSSL_PLATFORM));
5422303e31Sbluhm printf("OpenSSL_version OPENSSL_DIR: %s\n",
5522303e31Sbluhm OpenSSL_version(OPENSSL_DIR));
5622303e31Sbluhm printf("OpenSSL_version OPENSSL_ENGINES_DIR: %s\n",
5722303e31Sbluhm OpenSSL_version(OPENSSL_ENGINES_DIR));
5822303e31Sbluhm #endif
5922303e31Sbluhm printf("SSLeay: %#08lx\n", SSLeay());
6022303e31Sbluhm printf("SSLeay_version SSLEAY_VERSION: %s\n",
6122303e31Sbluhm SSLeay_version(SSLEAY_VERSION));
6222303e31Sbluhm printf("SSLeay_version SSLEAY_CFLAGS: %s\n",
6322303e31Sbluhm SSLeay_version(SSLEAY_CFLAGS));
6422303e31Sbluhm printf("SSLeay_version SSLEAY_BUILT_ON: %s\n",
6522303e31Sbluhm SSLeay_version(SSLEAY_BUILT_ON));
6622303e31Sbluhm printf("SSLeay_version SSLEAY_PLATFORM: %s\n",
6722303e31Sbluhm SSLeay_version(SSLEAY_PLATFORM));
6822303e31Sbluhm printf("SSLeay_version SSLEAY_DIR: %s\n",
6922303e31Sbluhm SSLeay_version(SSLEAY_DIR));
7022303e31Sbluhm }
7122303e31Sbluhm
7222303e31Sbluhm void
print_ciphers(STACK_OF (SSL_CIPHER)* cstack)739231079cSbluhm print_ciphers(STACK_OF(SSL_CIPHER) *cstack)
749231079cSbluhm {
7522303e31Sbluhm const SSL_CIPHER *cipher;
769231079cSbluhm int i;
779231079cSbluhm
789231079cSbluhm for (i = 0; (cipher = sk_SSL_CIPHER_value(cstack, i)) != NULL; i++)
799231079cSbluhm printf("cipher %s\n", SSL_CIPHER_get_name(cipher));
809231079cSbluhm if (fflush(stdout) != 0)
819231079cSbluhm err(1, "fflush stdout");
829231079cSbluhm }
839231079cSbluhm
849231079cSbluhm void
print_sockname(BIO * bio)859231079cSbluhm print_sockname(BIO *bio)
869231079cSbluhm {
879231079cSbluhm struct sockaddr_storage ss;
889231079cSbluhm socklen_t slen;
899231079cSbluhm char host[NI_MAXHOST], port[NI_MAXSERV];
909231079cSbluhm int fd;
919231079cSbluhm
929231079cSbluhm if (BIO_get_fd(bio, &fd) <= 0)
939231079cSbluhm err_ssl(1, "BIO_get_fd");
949231079cSbluhm slen = sizeof(ss);
959231079cSbluhm if (getsockname(fd, (struct sockaddr *)&ss, &slen) == -1)
969231079cSbluhm err(1, "getsockname");
979231079cSbluhm if (getnameinfo((struct sockaddr *)&ss, ss.ss_len, host,
989231079cSbluhm sizeof(host), port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV))
999231079cSbluhm errx(1, "getnameinfo");
1009231079cSbluhm printf("sock: %s %s\n", host, port);
1019231079cSbluhm if (fflush(stdout) != 0)
1029231079cSbluhm err(1, "fflush stdout");
1039231079cSbluhm }
1049231079cSbluhm
1059231079cSbluhm void
print_peername(BIO * bio)1069231079cSbluhm print_peername(BIO *bio)
1079231079cSbluhm {
1089231079cSbluhm struct sockaddr_storage ss;
1099231079cSbluhm socklen_t slen;
1109231079cSbluhm char host[NI_MAXHOST], port[NI_MAXSERV];
1119231079cSbluhm int fd;
1129231079cSbluhm
1139231079cSbluhm if (BIO_get_fd(bio, &fd) <= 0)
1149231079cSbluhm err_ssl(1, "BIO_get_fd");
1159231079cSbluhm slen = sizeof(ss);
1169231079cSbluhm if (getpeername(fd, (struct sockaddr *)&ss, &slen) == -1)
1179231079cSbluhm err(1, "getpeername");
1189231079cSbluhm if (getnameinfo((struct sockaddr *)&ss, ss.ss_len, host,
1199231079cSbluhm sizeof(host), port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV))
1209231079cSbluhm errx(1, "getnameinfo");
1219231079cSbluhm printf("peer: %s %s\n", host, port);
1229231079cSbluhm if (fflush(stdout) != 0)
1239231079cSbluhm err(1, "fflush stdout");
1249231079cSbluhm }
1259231079cSbluhm
1269231079cSbluhm void
err_ssl(int eval,const char * fmt,...)1279231079cSbluhm err_ssl(int eval, const char *fmt, ...)
1289231079cSbluhm {
1299231079cSbluhm va_list ap;
1309231079cSbluhm
1319231079cSbluhm ERR_print_errors_fp(stderr);
1329231079cSbluhm va_start(ap, fmt);
1339231079cSbluhm verrx(eval, fmt, ap);
1349231079cSbluhm va_end(ap);
1359231079cSbluhm }
136*a8d85e88Sbluhm
137*a8d85e88Sbluhm int
verify_callback(int preverify_ok,X509_STORE_CTX * x509_ctx)138*a8d85e88Sbluhm verify_callback(int preverify_ok, X509_STORE_CTX *x509_ctx)
139*a8d85e88Sbluhm {
140*a8d85e88Sbluhm printf("verify: %s\n", preverify_ok ? "pass" : "fail");
141*a8d85e88Sbluhm if (fflush(stdout) != 0)
142*a8d85e88Sbluhm err(1, "fflush stdout");
143*a8d85e88Sbluhm
144*a8d85e88Sbluhm return preverify_ok;
145*a8d85e88Sbluhm }
146