diff options
Diffstat (limited to 'src/regress/lib/libssl/interop/client.c')
| -rw-r--r-- | src/regress/lib/libssl/interop/client.c | 58 |
1 files changed, 51 insertions, 7 deletions
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) |
