conninfo
tls_conninfo_free(ctx->conninfo);
ctx->conninfo = NULL;
if (tls_get_peer_cert_hash(ctx, &ctx->conninfo->hash) == -1)
if (tls_get_peer_cert_subject(ctx, &ctx->conninfo->subject) == -1)
if (tls_get_peer_cert_issuer(ctx, &ctx->conninfo->issuer) == -1)
if (tls_get_peer_cert_times(ctx, &ctx->conninfo->notbefore,
&ctx->conninfo->notafter) == -1)
free(ctx->conninfo->alpn);
ctx->conninfo->alpn = NULL;
if ((ctx->conninfo->alpn = malloc(len + 1)) == NULL)
memcpy(ctx->conninfo->alpn, p, len);
ctx->conninfo->alpn[len] = '\0';
free(ctx->conninfo->peer_cert);
ctx->conninfo->peer_cert_len = 0;
if ((ctx->conninfo->peer_cert = malloc(bptr->length)) == NULL)
ctx->conninfo->peer_cert_len = bptr->length;
memcpy(ctx->conninfo->peer_cert, bptr->data,
ctx->conninfo->peer_cert_len);
ctx->conninfo->session_resumed = SSL_session_reused(ctx->ssl_conn);
tls_conninfo_free(ctx->conninfo);
if ((ctx->conninfo = calloc(1, sizeof(struct tls_conninfo))) == NULL) {
if ((ctx->conninfo->cipher = strdup(tmp)) == NULL)
ctx->conninfo->cipher_strength = SSL_get_cipher_bits(ctx->ssl_conn, NULL);
if ((ctx->conninfo->servername =
if ((ctx->conninfo->version = strdup(tmp)) == NULL)
tls_conninfo_free(ctx->conninfo);
ctx->conninfo = NULL;
tls_conninfo_free(struct tls_conninfo *conninfo)
if (conninfo == NULL)
free(conninfo->alpn);
free(conninfo->cipher);
free(conninfo->servername);
free(conninfo->version);
free(conninfo->hash);
free(conninfo->issuer);
free(conninfo->subject);
free(conninfo->peer_cert);
free(conninfo);
if (ctx->conninfo == NULL)
return (ctx->conninfo->alpn);
if (ctx->conninfo == NULL)
return (ctx->conninfo->cipher);
if (ctx->conninfo == NULL)
return (ctx->conninfo->cipher_strength);
if (ctx->conninfo == NULL)
return (ctx->conninfo->servername);
if (ctx->conninfo == NULL)
return (ctx->conninfo->session_resumed);
if (ctx->conninfo == NULL)
return (ctx->conninfo->version);
struct tls_conninfo *conninfo;
void tls_conninfo_free(struct tls_conninfo *conninfo);
if (ctx->conninfo == NULL)
return (ctx->conninfo->hash);
if (ctx->conninfo == NULL)
return (ctx->conninfo->issuer);
if (ctx->conninfo == NULL)
return (ctx->conninfo->subject);
if (ctx->conninfo == NULL)
return (ctx->conninfo->notbefore);
if (ctx->conninfo == NULL)
return (ctx->conninfo->notafter);
if (ctx->conninfo == NULL)
*size = ctx->conninfo->peer_cert_len;
return (ctx->conninfo->peer_cert);
char *conninfo;
xasprintf(&conninfo, "SSH_CONNECTION=%.50s %d %.50s %d",
if ((r = pam_putenv(sshpam_handle, conninfo)) != PAM_SUCCESS)
free(conninfo);
static struct conninfo *search_conn(struct servtab *sep, int ctrl);
static int room_conn(struct servtab *sep, struct conninfo *conn);
static void addchild_conn(struct conninfo *conn, pid_t pid);
static void free_conn(struct conninfo *conn);
static struct conninfo *
struct conninfo *conn;
if ((conn = malloc(sizeof(struct conninfo))) == NULL) {
room_conn(struct servtab *sep, struct conninfo *conn)
addchild_conn(struct conninfo *conn, pid_t pid)
struct conninfo *conn;
struct conninfo *conn;
struct conninfo *conn;
free_conn(struct conninfo *conn)
struct conninfo *conn;
LIST_HEAD(, conninfo) se_conn[PERIPSIZE];
struct conninfo *pr_conn;
LIST_ENTRY(conninfo) co_link;