diff options
Diffstat (limited to 'src/lib/libtls/tls_conninfo.c')
| -rw-r--r-- | src/lib/libtls/tls_conninfo.c | 52 |
1 files changed, 51 insertions, 1 deletions
diff --git a/src/lib/libtls/tls_conninfo.c b/src/lib/libtls/tls_conninfo.c index c4d23c308b..87660fa989 100644 --- a/src/lib/libtls/tls_conninfo.c +++ b/src/lib/libtls/tls_conninfo.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tls_conninfo.c,v 1.14 2017/04/05 03:13:53 beck Exp $ */ | 1 | /* $OpenBSD: tls_conninfo.c,v 1.15 2017/04/05 03:19:22 beck Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2015 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2015 Joel Sing <jsing@openbsd.org> |
| 4 | * Copyright (c) 2015 Bob Beck <beck@openbsd.org> | 4 | * Copyright (c) 2015 Bob Beck <beck@openbsd.org> |
| @@ -174,6 +174,49 @@ tls_conninfo_alpn_proto(struct tls *ctx) | |||
| 174 | return (0); | 174 | return (0); |
| 175 | } | 175 | } |
| 176 | 176 | ||
| 177 | static int | ||
| 178 | tls_conninfo_cert_pem(struct tls *ctx) | ||
| 179 | { | ||
| 180 | int i, rv = -1; | ||
| 181 | BIO *membio = NULL; | ||
| 182 | BUF_MEM *bptr = NULL; | ||
| 183 | |||
| 184 | if (ctx->conninfo == NULL) | ||
| 185 | goto err; | ||
| 186 | if (ctx->ssl_peer_cert == NULL) | ||
| 187 | return 0; | ||
| 188 | if ((membio = BIO_new(BIO_s_mem()))== NULL) | ||
| 189 | goto err; | ||
| 190 | |||
| 191 | /* | ||
| 192 | * We have to write the peer cert out separately, because | ||
| 193 | * the certificate chain may or may not contain it. | ||
| 194 | */ | ||
| 195 | if (!PEM_write_bio_X509(membio, ctx->ssl_peer_cert)) | ||
| 196 | goto err; | ||
| 197 | for (i = 0; i < sk_X509_num(ctx->ssl_peer_chain); i++) { | ||
| 198 | X509 *chaincert = sk_X509_value(ctx->ssl_peer_chain, i); | ||
| 199 | if (chaincert != ctx->ssl_peer_cert && | ||
| 200 | !PEM_write_bio_X509(membio, chaincert)) | ||
| 201 | goto err; | ||
| 202 | } | ||
| 203 | |||
| 204 | BIO_get_mem_ptr(membio, &bptr); | ||
| 205 | free(ctx->conninfo->peer_cert); | ||
| 206 | ctx->conninfo->peer_cert_len = 0; | ||
| 207 | if ((ctx->conninfo->peer_cert = malloc(bptr->length)) == NULL) | ||
| 208 | goto err; | ||
| 209 | ctx->conninfo->peer_cert_len = bptr->length; | ||
| 210 | memcpy(ctx->conninfo->peer_cert, bptr->data, | ||
| 211 | ctx->conninfo->peer_cert_len); | ||
| 212 | |||
| 213 | /* BIO_free() will kill BUF_MEM - because we have not set BIO_NOCLOSE */ | ||
| 214 | rv = 0; | ||
| 215 | err: | ||
| 216 | BIO_free(membio); | ||
| 217 | return rv; | ||
| 218 | } | ||
| 219 | |||
| 177 | int | 220 | int |
| 178 | tls_conninfo_populate(struct tls *ctx) | 221 | tls_conninfo_populate(struct tls *ctx) |
| 179 | { | 222 | { |
| @@ -210,6 +253,9 @@ tls_conninfo_populate(struct tls *ctx) | |||
| 210 | if (tls_get_peer_cert_info(ctx) == -1) | 253 | if (tls_get_peer_cert_info(ctx) == -1) |
| 211 | goto err; | 254 | goto err; |
| 212 | 255 | ||
| 256 | if (tls_conninfo_cert_pem(ctx) == -1) | ||
| 257 | goto err; | ||
| 258 | |||
| 213 | return (0); | 259 | return (0); |
| 214 | 260 | ||
| 215 | err: | 261 | err: |
| @@ -241,6 +287,10 @@ tls_conninfo_free(struct tls_conninfo *conninfo) | |||
| 241 | free(conninfo->subject); | 287 | free(conninfo->subject); |
| 242 | conninfo->subject = NULL; | 288 | conninfo->subject = NULL; |
| 243 | 289 | ||
| 290 | free(conninfo->peer_cert); | ||
| 291 | conninfo->peer_cert = NULL; | ||
| 292 | conninfo->peer_cert_len = 0; | ||
| 293 | |||
| 244 | free(conninfo); | 294 | free(conninfo); |
| 245 | } | 295 | } |
| 246 | 296 | ||
