Home | History | Annotate | Line # | Download | only in tls
      1 /*	$NetBSD: tls_proxy_context_scan.c,v 1.4 2025/02/25 19:15:50 christos Exp $	*/
      2 
      3 /*++
      4 /* NAME
      5 /*	tls_proxy_context_scan
      6 /* SUMMARY
      7 /*	read TLS session state from stream
      8 /* SYNOPSIS
      9 /*	#include <tls_proxy.h>
     10 /*
     11 /*	int     tls_proxy_context_scan(scan_fn, stream, flags, ptr)
     12 /*	ATTR_SCAN_COMMON_FN scan_fn;
     13 /*	VSTREAM *stream;
     14 /*	int     flags;
     15 /*	void    *ptr;
     16 /*
     17 /*	void	tls_proxy_context_free(tls_context)
     18 /*	TLS_SESS_STATE *tls_context;
     19 /* DESCRIPTION
     20 /*	tls_proxy_context_scan() reads the public members of a
     21 /*	TLS_ATTR_STATE structure from the named stream using the
     22 /*	specified attribute scan routine.  tls_proxy_context_scan()
     23 /*	is meant to be passed as a call-back to attr_scan() as shown
     24 /*	below.
     25 /*
     26 /*	tls_proxy_context_free() destroys a TLS context object that
     27 /*	was received with tls_proxy_context_scan().
     28 /*
     29 /*	TLS_ATTR_STATE *tls_context = 0;
     30 /*	...
     31 /*	... RECV_ATTR_FUNC(tls_proxy_context_scan, (void *) &tls_context), ...
     32 /*	...
     33 /*	if (tls_context)
     34 /*	    tls_proxy_context_free(tls_context);
     35 /* DIAGNOSTICS
     36 /*	Fatal: out of memory.
     37 /* LICENSE
     38 /* .ad
     39 /* .fi
     40 /*	The Secure Mailer license must be distributed with this software.
     41 /* AUTHOR(S)
     42 /*	Wietse Venema
     43 /*	IBM T.J. Watson Research
     44 /*	P.O. Box 704
     45 /*	Yorktown Heights, NY 10598, USA
     46 /*
     47 /*	Wietse Venema
     48 /*	Google, Inc.
     49 /*	111 8th Avenue
     50 /*	New York, NY 10011, USA
     51 /*--*/
     52 
     53 #ifdef USE_TLS
     54 
     55 /* System library. */
     56 
     57 #include <sys_defs.h>
     58 
     59 /* Utility library */
     60 
     61 #include <attr.h>
     62 #include <msg.h>
     63 
     64 /* TLS library. */
     65 
     66 #include <tls.h>
     67 #include <tls_proxy.h>
     68 
     69 /* tls_proxy_context_scan - receive TLS session state from stream */
     70 
     71 int     tls_proxy_context_scan(ATTR_SCAN_COMMON_FN scan_fn, VSTREAM *fp,
     72 			               int flags, void *ptr)
     73 {
     74     TLS_SESS_STATE *tls_context
     75     = (TLS_SESS_STATE *) mymalloc(sizeof(*tls_context));;
     76     int     ret;
     77     VSTRING *peer_CN = vstring_alloc(25);
     78     VSTRING *issuer_CN = vstring_alloc(25);
     79     VSTRING *peer_cert_fprint = vstring_alloc(60);	/* 60 for SHA-1 */
     80     VSTRING *peer_pkey_fprint = vstring_alloc(60);	/* 60 for SHA-1 */
     81     VSTRING *protocol = vstring_alloc(25);
     82     VSTRING *cipher_name = vstring_alloc(25);
     83     VSTRING *kex_name = vstring_alloc(25);
     84     VSTRING *kex_curve = vstring_alloc(25);
     85     VSTRING *clnt_sig_name = vstring_alloc(25);
     86     VSTRING *clnt_sig_curve = vstring_alloc(25);
     87     VSTRING *clnt_sig_dgst = vstring_alloc(25);
     88     VSTRING *srvr_sig_name = vstring_alloc(25);
     89     VSTRING *srvr_sig_curve = vstring_alloc(25);
     90     VSTRING *srvr_sig_dgst = vstring_alloc(25);
     91     VSTRING *namaddr = vstring_alloc(100);
     92 
     93     if (msg_verbose)
     94 	msg_info("begin tls_proxy_context_scan");
     95 
     96     /*
     97      * Note: memset() is not a portable way to initialize non-integer types.
     98      */
     99     memset(tls_context, 0, sizeof(*tls_context));
    100     ret = scan_fn(fp, flags | ATTR_FLAG_MORE,
    101 		  RECV_ATTR_STR(TLS_ATTR_PEER_CN, peer_CN),
    102 		  RECV_ATTR_STR(TLS_ATTR_ISSUER_CN, issuer_CN),
    103 		  RECV_ATTR_STR(TLS_ATTR_PEER_CERT_FPT, peer_cert_fprint),
    104 		  RECV_ATTR_STR(TLS_ATTR_PEER_PKEY_FPT, peer_pkey_fprint),
    105 		  RECV_ATTR_INT(TLS_ATTR_SEC_LEVEL,
    106 				&tls_context->level),
    107 		  RECV_ATTR_INT(TLS_ATTR_PEER_STATUS,
    108 				&tls_context->peer_status),
    109 		  RECV_ATTR_STR(TLS_ATTR_CIPHER_PROTOCOL, protocol),
    110 		  RECV_ATTR_STR(TLS_ATTR_CIPHER_NAME, cipher_name),
    111 		  RECV_ATTR_INT(TLS_ATTR_CIPHER_USEBITS,
    112 				&tls_context->cipher_usebits),
    113 		  RECV_ATTR_INT(TLS_ATTR_CIPHER_ALGBITS,
    114 				&tls_context->cipher_algbits),
    115 		  RECV_ATTR_STR(TLS_ATTR_KEX_NAME, kex_name),
    116 		  RECV_ATTR_STR(TLS_ATTR_KEX_CURVE, kex_curve),
    117 		  RECV_ATTR_INT(TLS_ATTR_KEX_BITS, &tls_context->kex_bits),
    118 		  RECV_ATTR_INT(TLS_ATTR_CTOS_RPK, &tls_context->ctos_rpk),
    119 		  RECV_ATTR_INT(TLS_ATTR_STOC_RPK, &tls_context->stoc_rpk),
    120 		  RECV_ATTR_STR(TLS_ATTR_CLNT_SIG_NAME, clnt_sig_name),
    121 		  RECV_ATTR_STR(TLS_ATTR_CLNT_SIG_CURVE, clnt_sig_curve),
    122 	 RECV_ATTR_INT(TLS_ATTR_CLNT_SIG_BITS, &tls_context->clnt_sig_bits),
    123 		  RECV_ATTR_STR(TLS_ATTR_CLNT_SIG_DGST, clnt_sig_dgst),
    124 		  RECV_ATTR_STR(TLS_ATTR_SRVR_SIG_NAME, srvr_sig_name),
    125 		  RECV_ATTR_STR(TLS_ATTR_SRVR_SIG_CURVE, srvr_sig_curve),
    126 	 RECV_ATTR_INT(TLS_ATTR_SRVR_SIG_BITS, &tls_context->srvr_sig_bits),
    127 		  RECV_ATTR_STR(TLS_ATTR_SRVR_SIG_DGST, srvr_sig_dgst),
    128 		  RECV_ATTR_STR(TLS_ATTR_NAMADDR, namaddr),
    129 		  RECV_ATTR_INT(TLS_ATTR_RPT_REPORTED,
    130 				&tls_context->rpt_reported),
    131 		  ATTR_TYPE_END);
    132     /* Always construct a well-formed structure. */
    133     tls_context->peer_CN = vstring_export(peer_CN);
    134     tls_context->issuer_CN = vstring_export(issuer_CN);
    135     tls_context->peer_cert_fprint = vstring_export(peer_cert_fprint);
    136     tls_context->peer_pkey_fprint = vstring_export(peer_pkey_fprint);
    137     tls_context->protocol = vstring_export(protocol);
    138     tls_context->cipher_name = vstring_export(cipher_name);
    139     tls_context->kex_name = vstring_export(kex_name);
    140     tls_context->kex_curve = vstring_export(kex_curve);
    141     tls_context->clnt_sig_name = vstring_export(clnt_sig_name);
    142     tls_context->clnt_sig_curve = vstring_export(clnt_sig_curve);
    143     tls_context->clnt_sig_dgst = vstring_export(clnt_sig_dgst);
    144     tls_context->srvr_sig_name = vstring_export(srvr_sig_name);
    145     tls_context->srvr_sig_curve = vstring_export(srvr_sig_curve);
    146     tls_context->srvr_sig_dgst = vstring_export(srvr_sig_dgst);
    147     tls_context->namaddr = vstring_export(namaddr);
    148     ret = (ret == 25 ? 1 : -1);
    149     if (ret != 1) {
    150 	tls_proxy_context_free(tls_context);
    151 	tls_context = 0;
    152     }
    153     *(TLS_SESS_STATE **) ptr = tls_context;
    154     if (msg_verbose)
    155 	msg_info("tls_proxy_context_scan ret=%d", ret);
    156     return (ret);
    157 }
    158 
    159 /* tls_proxy_context_free - destroy object from tls_proxy_context_receive() */
    160 
    161 void    tls_proxy_context_free(TLS_SESS_STATE *tls_context)
    162 {
    163     if (tls_context->peer_CN)
    164 	myfree(tls_context->peer_CN);
    165     if (tls_context->issuer_CN)
    166 	myfree(tls_context->issuer_CN);
    167     if (tls_context->peer_cert_fprint)
    168 	myfree(tls_context->peer_cert_fprint);
    169     if (tls_context->peer_pkey_fprint)
    170 	myfree(tls_context->peer_pkey_fprint);
    171     if (tls_context->protocol)
    172 	myfree((void *) tls_context->protocol);
    173     if (tls_context->cipher_name)
    174 	myfree((void *) tls_context->cipher_name);
    175     if (tls_context->kex_name)
    176 	myfree((void *) tls_context->kex_name);
    177     if (tls_context->kex_curve)
    178 	myfree((void *) tls_context->kex_curve);
    179     if (tls_context->clnt_sig_name)
    180 	myfree((void *) tls_context->clnt_sig_name);
    181     if (tls_context->clnt_sig_curve)
    182 	myfree((void *) tls_context->clnt_sig_curve);
    183     if (tls_context->clnt_sig_dgst)
    184 	myfree((void *) tls_context->clnt_sig_dgst);
    185     if (tls_context->srvr_sig_name)
    186 	myfree((void *) tls_context->srvr_sig_name);
    187     if (tls_context->srvr_sig_curve)
    188 	myfree((void *) tls_context->srvr_sig_curve);
    189     if (tls_context->srvr_sig_dgst)
    190 	myfree((void *) tls_context->srvr_sig_dgst);
    191     if (tls_context->namaddr)
    192 	myfree((void *) tls_context->namaddr);
    193     myfree((void *) tls_context);
    194 }
    195 
    196 #endif
    197