xref: /openbsd-src/lib/libtls/tls_peer.c (revision 26433cb13cc3308103fce1cf0c8fcad1280ba684)
1*26433cb1Stb /* $OpenBSD: tls_peer.c,v 1.9 2024/12/10 08:40:30 tb Exp $ */
2a0ec9d6bSjsing /*
3a0ec9d6bSjsing  * Copyright (c) 2015 Joel Sing <jsing@openbsd.org>
40fb5de82Sbeck  * Copyright (c) 2015 Bob Beck <beck@openbsd.org>
5a0ec9d6bSjsing  *
6a0ec9d6bSjsing  * Permission to use, copy, modify, and distribute this software for any
7a0ec9d6bSjsing  * purpose with or without fee is hereby granted, provided that the above
8a0ec9d6bSjsing  * copyright notice and this permission notice appear in all copies.
9a0ec9d6bSjsing  *
10a0ec9d6bSjsing  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11a0ec9d6bSjsing  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12a0ec9d6bSjsing  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13a0ec9d6bSjsing  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14a0ec9d6bSjsing  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15a0ec9d6bSjsing  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16a0ec9d6bSjsing  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17a0ec9d6bSjsing  */
18a0ec9d6bSjsing 
19a0ec9d6bSjsing #include <stdio.h>
20a0ec9d6bSjsing 
21a0ec9d6bSjsing #include <openssl/x509.h>
22a0ec9d6bSjsing 
23a0ec9d6bSjsing #include <tls.h>
24a0ec9d6bSjsing #include "tls_internal.h"
25a0ec9d6bSjsing 
26ab8f2ec6Sbeck const char *
27*26433cb1Stb tls_peer_cert_common_name(struct tls *ctx)
28*26433cb1Stb {
29*26433cb1Stb 	if (ctx->conninfo == NULL)
30*26433cb1Stb 		return (NULL);
31*26433cb1Stb 	return (ctx->conninfo->common_name);
32*26433cb1Stb }
33*26433cb1Stb 
34*26433cb1Stb const char *
35ab8f2ec6Sbeck tls_peer_cert_hash(struct tls *ctx)
36a0ec9d6bSjsing {
37b50cee5aSjsing 	if (ctx->conninfo == NULL)
38b50cee5aSjsing 		return (NULL);
39ab8f2ec6Sbeck 	return (ctx->conninfo->hash);
40a0ec9d6bSjsing }
41ab8f2ec6Sbeck const char *
42ab8f2ec6Sbeck tls_peer_cert_issuer(struct tls *ctx)
43a0ec9d6bSjsing {
44b50cee5aSjsing 	if (ctx->conninfo == NULL)
45b50cee5aSjsing 		return (NULL);
46ab8f2ec6Sbeck 	return (ctx->conninfo->issuer);
47a0ec9d6bSjsing }
48a0ec9d6bSjsing 
49ab8f2ec6Sbeck const char *
50ab8f2ec6Sbeck tls_peer_cert_subject(struct tls *ctx)
51ab8f2ec6Sbeck {
52b50cee5aSjsing 	if (ctx->conninfo == NULL)
53b50cee5aSjsing 		return (NULL);
54ab8f2ec6Sbeck 	return (ctx->conninfo->subject);
55a0ec9d6bSjsing }
560fb5de82Sbeck 
570fb5de82Sbeck int
580fb5de82Sbeck tls_peer_cert_provided(struct tls *ctx)
590fb5de82Sbeck {
600fb5de82Sbeck 	return (ctx->ssl_peer_cert != NULL);
610fb5de82Sbeck }
620fb5de82Sbeck 
630fb5de82Sbeck int
640fb5de82Sbeck tls_peer_cert_contains_name(struct tls *ctx, const char *name)
650fb5de82Sbeck {
665f3c5205Sjsing 	int match;
675f3c5205Sjsing 
680fb5de82Sbeck 	if (ctx->ssl_peer_cert == NULL)
690fb5de82Sbeck 		return (0);
700fb5de82Sbeck 
715f3c5205Sjsing 	if (tls_check_name(ctx, ctx->ssl_peer_cert, name, &match) == -1)
725f3c5205Sjsing 		return (0);
735f3c5205Sjsing 
745f3c5205Sjsing 	return (match);
750fb5de82Sbeck }
760fb5de82Sbeck 
77f00a4e85Sbeck time_t
78f00a4e85Sbeck tls_peer_cert_notbefore(struct tls *ctx)
79f00a4e85Sbeck {
80f00a4e85Sbeck 	if (ctx->ssl_peer_cert == NULL)
81f00a4e85Sbeck 		return (-1);
82f00a4e85Sbeck 	if (ctx->conninfo == NULL)
83f00a4e85Sbeck 		return (-1);
84f00a4e85Sbeck 	return (ctx->conninfo->notbefore);
85f00a4e85Sbeck }
86f00a4e85Sbeck 
87f00a4e85Sbeck time_t
88f00a4e85Sbeck tls_peer_cert_notafter(struct tls *ctx)
89f00a4e85Sbeck {
90f00a4e85Sbeck 	if (ctx->ssl_peer_cert == NULL)
91f00a4e85Sbeck 		return (-1);
92f00a4e85Sbeck 	if (ctx->conninfo == NULL)
93f00a4e85Sbeck 		return (-1);
94f00a4e85Sbeck 	return (ctx->conninfo->notafter);
95f00a4e85Sbeck }
96f00a4e85Sbeck 
97c67861f7Sbeck const uint8_t *
98c67861f7Sbeck tls_peer_cert_chain_pem(struct tls *ctx, size_t *size)
99c67861f7Sbeck {
100c67861f7Sbeck 	if (ctx->ssl_peer_cert == NULL)
101c67861f7Sbeck 		return (NULL);
102c67861f7Sbeck 	if (ctx->conninfo == NULL)
103c67861f7Sbeck 		return (NULL);
104c67861f7Sbeck 	*size = ctx->conninfo->peer_cert_len;
105c67861f7Sbeck 	return (ctx->conninfo->peer_cert);
106c67861f7Sbeck }
107c67861f7Sbeck 
108