MINOR: ssl: merge client's and frontend's certificate functions.
diff --git a/src/ssl_sock.c b/src/ssl_sock.c
index 9509d4f..e88024d 100644
--- a/src/ssl_sock.c
+++ b/src/ssl_sock.c
@@ -1898,11 +1898,15 @@
 	return 1;
 }
 
-/* bin, returns serial in a binary chunk */
+/* binary, returns serial of certificate in a binary chunk.
+ * The 5th keyword char is used to know if SSL_get_certificate or SSL_get_peer_certificate
+ * should be use.
+ */
 static int
-smp_fetch_ssl_c_serial(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
+smp_fetch_ssl_x_serial(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
                        const struct arg *args, struct sample *smp, const char *kw)
 {
+	int cert_peer = (kw[4] == 'c') ? 1 : 0;
 	X509 *crt = NULL;
 	int ret = 0;
 	struct chunk *smp_trash;
@@ -1920,8 +1924,11 @@
 		return 0;
 	}
 
-	/* SSL_get_peer_certificate, it increase X509 * ref count */
-	crt = SSL_get_peer_certificate(conn->xprt_ctx);
+	if (cert_peer)
+		crt = SSL_get_peer_certificate(conn->xprt_ctx);
+	else
+		crt = SSL_get_certificate(conn->xprt_ctx);
+
 	if (!crt)
 		goto out;
 
@@ -1933,16 +1940,21 @@
 	smp->type = SMP_T_BIN;
 	ret = 1;
 out:
-	if (crt)
+	/* SSL_get_peer_certificate, it increase X509 * ref count */
+	if (cert_peer && crt)
 		X509_free(crt);
 	return ret;
 }
 
-/* bin, returns the client certificate's SHA-1 fingerprint (SHA-1 hash of DER-encoded certificate) in a binary chunk */
+/* binary, returns the client certificate's SHA-1 fingerprint (SHA-1 hash of DER-encoded certificate) in a binary chunk.
+ * The 5th keyword char is used to know if SSL_get_certificate or SSL_get_peer_certificate
+ * should be use.
+ */
 static int
-smp_fetch_ssl_c_sha1(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
+smp_fetch_ssl_x_sha1(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
                      const struct arg *args, struct sample *smp, const char *kw)
 {
+	int cert_peer = (kw[4] == 'c') ? 1 : 0;
 	X509 *crt = NULL;
 	const EVP_MD *digest;
 	int ret = 0;
@@ -1961,8 +1973,10 @@
 		return 0;
 	}
 
-	/* SSL_get_peer_certificate, it increase X509 * ref count */
-	crt = SSL_get_peer_certificate(conn->xprt_ctx);
+	if (cert_peer)
+		crt = SSL_get_peer_certificate(conn->xprt_ctx);
+	else
+		crt = SSL_get_certificate(conn->xprt_ctx);
 	if (!crt)
 		goto out;
 
@@ -1974,16 +1988,21 @@
 	smp->type = SMP_T_BIN;
 	ret = 1;
 out:
-	if (crt)
+	/* SSL_get_peer_certificate, it increase X509 * ref count */
+	if (cert_peer && crt)
 		X509_free(crt);
 	return ret;
 }
 
-/*str, returns notafter date in ASN1_UTCTIME format */
+/* string, returns certificate's notafter date in ASN1_UTCTIME format.
+ * The 5th keyword char is used to know if SSL_get_certificate or SSL_get_peer_certificate
+ * should be use.
+ */
 static int
-smp_fetch_ssl_c_notafter(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
+smp_fetch_ssl_x_notafter(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
                        const struct arg *args, struct sample *smp, const char *kw)
 {
+	int cert_peer = (kw[4] == 'c') ? 1 : 0;
 	X509 *crt = NULL;
 	int ret = 0;
 	struct chunk *smp_trash;
@@ -2001,8 +2020,10 @@
 		return 0;
 	}
 
-	/* SSL_get_peer_certificate, it increase X509 * ref count */
-	crt = SSL_get_peer_certificate(conn->xprt_ctx);
+	if (cert_peer)
+		crt = SSL_get_peer_certificate(conn->xprt_ctx);
+	else
+		crt = SSL_get_certificate(conn->xprt_ctx);
 	if (!crt)
 		goto out;
 
@@ -2014,16 +2035,21 @@
 	smp->type = SMP_T_STR;
 	ret = 1;
 out:
-	if (crt)
+	/* SSL_get_peer_certificate, it increase X509 * ref count */
+	if (cert_peer && crt)
 		X509_free(crt);
 	return ret;
 }
 
-/* str, returns a string of a formatted full dn \C=..\O=..\OU=.. \CN=.. */
+/* string, returns a string of a formatted full dn \C=..\O=..\OU=.. \CN=.. of certificate's issuer
+ * The 5th keyword char is used to know if SSL_get_certificate or SSL_get_peer_certificate
+ * should be use.
+ */
 static int
-smp_fetch_ssl_c_i_dn(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
+smp_fetch_ssl_x_i_dn(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
                        const struct arg *args, struct sample *smp, const char *kw)
 {
+	int cert_peer = (kw[4] == 'c') ? 1 : 0;
 	X509 *crt = NULL;
 	X509_NAME *name;
 	int ret = 0;
@@ -2042,8 +2068,10 @@
 		return 0;
 	}
 
-	/* SSL_get_peer_certificate, it increase X509 * ref count */
-	crt = SSL_get_peer_certificate(conn->xprt_ctx);
+	if (cert_peer)
+		crt = SSL_get_peer_certificate(conn->xprt_ctx);
+	else
+		crt = SSL_get_certificate(conn->xprt_ctx);
 	if (!crt)
 		goto out;
 
@@ -2070,16 +2098,21 @@
 	smp->data.str = *smp_trash;
 	ret = 1;
 out:
-	if (crt)
+	/* SSL_get_peer_certificate, it increase X509 * ref count */
+	if (cert_peer && crt)
 		X509_free(crt);
 	return ret;
 }
 
-/*str, returns notbefore date in ASN1_UTCTIME format */
+/* string, returns notbefore date in ASN1_UTCTIME format.
+ * The 5th keyword char is used to know if SSL_get_certificate or SSL_get_peer_certificate
+ * should be use.
+ */
 static int
-smp_fetch_ssl_c_notbefore(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
+smp_fetch_ssl_x_notbefore(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
                        const struct arg *args, struct sample *smp, const char *kw)
 {
+	int cert_peer = (kw[4] == 'c') ? 1 : 0;
 	X509 *crt = NULL;
 	int ret = 0;
 	struct chunk *smp_trash;
@@ -2097,8 +2130,10 @@
 		return 0;
 	}
 
-	/* SSL_get_peer_certificate, it increase X509 * ref count */
-	crt = SSL_get_peer_certificate(conn->xprt_ctx);
+	if (cert_peer)
+		crt = SSL_get_peer_certificate(conn->xprt_ctx);
+	else
+		crt = SSL_get_certificate(conn->xprt_ctx);
 	if (!crt)
 		goto out;
 
@@ -2110,16 +2145,21 @@
 	smp->type = SMP_T_STR;
 	ret = 1;
 out:
-	if (crt)
+	/* SSL_get_peer_certificate, it increase X509 * ref count */
+	if (cert_peer && crt)
 		X509_free(crt);
 	return ret;
 }
 
-/* str, returns a string of a formatted full dn \C=..\O=..\OU=.. \CN=.. */
+/* string, returns a string of a formatted full dn \C=..\O=..\OU=.. \CN=.. of certificate's subject
+ * The 5th keyword char is used to know if SSL_get_certificate or SSL_get_peer_certificate
+ * should be use.
+ */
 static int
-smp_fetch_ssl_c_s_dn(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
+smp_fetch_ssl_x_s_dn(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
                        const struct arg *args, struct sample *smp, const char *kw)
 {
+	int cert_peer = (kw[4] == 'c') ? 1 : 0;
 	X509 *crt = NULL;
 	X509_NAME *name;
 	int ret = 0;
@@ -2138,8 +2178,10 @@
 		return 0;
 	}
 
-	/* SSL_get_peer_certificate, it increase X509 * ref count */
-	crt = SSL_get_peer_certificate(conn->xprt_ctx);
+	if (cert_peer)
+		crt = SSL_get_peer_certificate(conn->xprt_ctx);
+	else
+		crt = SSL_get_certificate(conn->xprt_ctx);
 	if (!crt)
 		goto out;
 
@@ -2166,7 +2208,8 @@
 	smp->data.str = *smp_trash;
 	ret = 1;
 out:
-	if (crt)
+	/* SSL_get_peer_certificate, it increase X509 * ref count */
+	if (cert_peer && crt)
 		X509_free(crt);
 	return ret;
 }
@@ -2202,11 +2245,15 @@
 	return 1;
 }
 
-/* integer, returns the client certificate version */
+/* integer, returns the certificate version
+ * The 5th keyword char is used to know if SSL_get_certificate or SSL_get_peer_certificate
+ * should be use.
+ */
 static int
-smp_fetch_ssl_c_version(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
+smp_fetch_ssl_x_version(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
                         const struct arg *args, struct sample *smp, const char *kw)
 {
+	int cert_peer = (kw[4] == 'c') ? 1 : 0;
 	X509 *crt;
 	struct connection *conn;
 
@@ -2222,23 +2269,31 @@
 		return 0;
 	}
 
-	/* SSL_get_peer_certificate returns a ptr on allocated X509 struct */
-	crt = SSL_get_peer_certificate(conn->xprt_ctx);
+	if (cert_peer)
+		crt = SSL_get_peer_certificate(conn->xprt_ctx);
+	else
+		crt = SSL_get_certificate(conn->xprt_ctx);
 	if (!crt)
 		return 0;
 
 	smp->data.uint = (unsigned int)(1 + X509_get_version(crt));
-	X509_free(crt);
+	/* SSL_get_peer_certificate increase X509 * ref count  */
+	if (cert_peer)
+		X509_free(crt);
 	smp->type = SMP_T_UINT;
 
 	return 1;
 }
 
-/* str, returns the client certificate sig alg */
+/* string, returns the certificate's signature algorithm.
+ * The 5th keyword char is used to know if SSL_get_certificate or SSL_get_peer_certificate
+ * should be use.
+ */
 static int
-smp_fetch_ssl_c_sig_alg(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
+smp_fetch_ssl_x_sig_alg(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
                         const struct arg *args, struct sample *smp, const char *kw)
 {
+	int cert_peer = (kw[4] == 'c') ? 1 : 0;
 	X509 *crt;
 	int nid;
 	struct connection *conn;
@@ -2255,8 +2310,10 @@
 		return 0;
 	}
 
-	/* SSL_get_peer_certificate increase X509 * ref count  */
-	crt = SSL_get_peer_certificate(conn->xprt_ctx);
+	if (cert_peer)
+		crt = SSL_get_peer_certificate(conn->xprt_ctx);
+	else
+		crt = SSL_get_certificate(conn->xprt_ctx);
 	if (!crt)
 		return 0;
 
@@ -2264,23 +2321,31 @@
 
 	smp->data.str.str = (char *)OBJ_nid2sn(nid);
 	if (!smp->data.str.str) {
-		X509_free(crt);
+		/* SSL_get_peer_certificate increase X509 * ref count  */
+		if (cert_peer)
+			X509_free(crt);
 		return 0;
 	}
 
 	smp->type = SMP_T_STR;
 	smp->flags |= SMP_F_CONST;
 	smp->data.str.len = strlen(smp->data.str.str);
-	X509_free(crt);
+	/* SSL_get_peer_certificate increase X509 * ref count  */
+	if (cert_peer)
+		X509_free(crt);
 
 	return 1;
 }
 
-/* str, returns the client certificate key alg */
+/* string, returns the certificate's key algorithm.
+ * The 5th keyword char is used to know if SSL_get_certificate or SSL_get_peer_certificate
+ * should be use.
+ */
 static int
-smp_fetch_ssl_c_key_alg(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
+smp_fetch_ssl_x_key_alg(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
                         const struct arg *args, struct sample *smp, const char *kw)
 {
+	int cert_peer = (kw[4] == 'c') ? 1 : 0;
 	X509 *crt;
 	int nid;
 	struct connection *conn;
@@ -2297,8 +2362,10 @@
 		return 0;
 	}
 
-	/* SSL_get_peer_certificate increase X509 * ref count  */
-	crt = SSL_get_peer_certificate(conn->xprt_ctx);
+	if (cert_peer)
+		crt = SSL_get_peer_certificate(conn->xprt_ctx);
+	else
+		crt = SSL_get_certificate(conn->xprt_ctx);
 	if (!crt)
 		return 0;
 
@@ -2306,14 +2373,17 @@
 
 	smp->data.str.str = (char *)OBJ_nid2sn(nid);
 	if (!smp->data.str.str) {
-		X509_free(crt);
+		/* SSL_get_peer_certificate increase X509 * ref count  */
+		if (cert_peer)
+			X509_free(crt);
 		return 0;
 	}
 
 	smp->type = SMP_T_STR;
 	smp->flags |= SMP_F_CONST;
 	smp->data.str.len = strlen(smp->data.str.str);
-	X509_free(crt);
+	if (cert_peer)
+		X509_free(crt);
 
 	return 1;
 }
@@ -2352,329 +2422,6 @@
 #endif
 }
 
-/* bin, returns serial in a binary chunk */
-static int
-smp_fetch_ssl_f_serial(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
-                       const struct arg *args, struct sample *smp, const char *kw)
-{
-	X509 *crt = NULL;
-	int ret = 0;
-	struct chunk *smp_trash;
-	struct connection *conn;
-
-	if (!l4)
-		return 0;
-
-	conn = objt_conn(l4->si[0].end);
-	if (!conn || conn->xprt != &ssl_sock)
-		return 0;
-
-	if (!(conn->flags & CO_FL_CONNECTED)) {
-		smp->flags |= SMP_F_MAY_CHANGE;
-		return 0;
-	}
-
-	crt = SSL_get_certificate(conn->xprt_ctx);
-	if (!crt)
-		goto out;
-
-	smp_trash = get_trash_chunk();
-	if (ssl_sock_get_serial(crt, smp_trash) <= 0)
-		goto out;
-
-	smp->data.str = *smp_trash;
-	smp->type = SMP_T_BIN;
-	ret = 1;
-out:
-	return ret;
-}
-/*str, returns notafter date in ASN1_UTCTIME format */
-static int
-smp_fetch_ssl_f_notafter(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
-                       const struct arg *args, struct sample *smp, const char *kw)
-{
-	X509 *crt = NULL;
-	int ret = 0;
-	struct chunk *smp_trash;
-	struct connection *conn;
-
-	if (!l4)
-		return 0;
-
-	conn = objt_conn(l4->si[0].end);
-	if (!conn || conn->xprt != &ssl_sock)
-		return 0;
-
-	if (!(conn->flags & CO_FL_CONNECTED)) {
-		smp->flags |= SMP_F_MAY_CHANGE;
-		return 0;
-	}
-
-	crt = SSL_get_certificate(conn->xprt_ctx);
-	if (!crt)
-		goto out;
-
-	smp_trash = get_trash_chunk();
-	if (ssl_sock_get_time(X509_get_notAfter(crt), smp_trash) <= 0)
-		goto out;
-
-	smp->data.str = *smp_trash;
-	smp->type = SMP_T_STR;
-	ret = 1;
-out:
-	return ret;
-}
-
-/*str, returns notbefore date in ASN1_UTCTIME format */
-static int
-smp_fetch_ssl_f_notbefore(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
-                       const struct arg *args, struct sample *smp, const char *kw)
-{
-	X509 *crt = NULL;
-	int ret = 0;
-	struct chunk *smp_trash;
-	struct connection *conn;
-
-	if (!l4)
-		return 0;
-
-	conn = objt_conn(l4->si[0].end);
-	if (!conn || conn->xprt != &ssl_sock)
-		return 0;
-
-	if (!(conn->flags & CO_FL_CONNECTED)) {
-		smp->flags |= SMP_F_MAY_CHANGE;
-		return 0;
-	}
-
-	crt = SSL_get_certificate(conn->xprt_ctx);
-	if (!crt)
-		goto out;
-
-	smp_trash = get_trash_chunk();
-	if (ssl_sock_get_time(X509_get_notBefore(crt), smp_trash) <= 0)
-		goto out;
-
-	smp->data.str = *smp_trash;
-	smp->type = SMP_T_STR;
-	ret = 1;
-out:
-	return ret;
-}
-
-/* integer, returns the frontend certificate version */
-static int
-smp_fetch_ssl_f_version(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
-                           const struct arg *args, struct sample *smp, const char *kw)
-{
-	X509 *crt;
-	struct connection *conn;
-
-	if (!l4)
-		return 0;
-
-	conn = objt_conn(l4->si[0].end);
-	if (!conn || conn->xprt != &ssl_sock)
-		return 0;
-
-	if (!(conn->flags & CO_FL_CONNECTED)) {
-		smp->flags |= SMP_F_MAY_CHANGE;
-		return 0;
-	}
-
-	/* SSL_get_certificate returns a ptr on an SSL * internal sub struct */
-	crt = SSL_get_certificate(conn->xprt_ctx);
-	if (!crt)
-		return 0;
-
-	smp->data.uint = (unsigned int)(1 + X509_get_version(crt));
-	smp->type = SMP_T_UINT;
-
-	return 1;
-}
-
-/* str, returns the client certificate sig alg */
-static int
-smp_fetch_ssl_f_sig_alg(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
-                        const struct arg *args, struct sample *smp, const char *kw)
-{
-	X509 *crt;
-	int nid;
-	struct connection *conn;
-
-	if (!l4)
-		return 0;
-
-	conn = objt_conn(l4->si[0].end);
-	if (!conn || conn->xprt != &ssl_sock)
-		return 0;
-
-	if (!(conn->flags & CO_FL_CONNECTED)) {
-		smp->flags |= SMP_F_MAY_CHANGE;
-		return 0;
-	}
-
-	crt = SSL_get_certificate(conn->xprt_ctx);
-	if (!crt)
-		return 0;
-
-	nid = OBJ_obj2nid((ASN1_OBJECT *)(crt->cert_info->signature->algorithm));
-
-	smp->data.str.str = (char *)OBJ_nid2sn(nid);
-	if (!smp->data.str.str)
-		return 0;
-
-	smp->type = SMP_T_STR;
-	smp->flags |= SMP_F_CONST;
-	smp->data.str.len = strlen(smp->data.str.str);
-
-	return 1;
-}
-
-/* str, returns the client certificate key alg */
-static int
-smp_fetch_ssl_f_key_alg(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
-                        const struct arg *args, struct sample *smp, const char *kw)
-{
-	X509 *crt;
-	int nid;
-	struct connection *conn;
-
-	if (!l4)
-		return 0;
-
-	conn = objt_conn(l4->si[0].end);
-	if (!conn || conn->xprt != &ssl_sock)
-		return 0;
-
-	if (!(conn->flags & CO_FL_CONNECTED)) {
-		smp->flags |= SMP_F_MAY_CHANGE;
-		return 0;
-	}
-
-	crt = SSL_get_certificate(conn->xprt_ctx);
-	if (!crt)
-		return 0;
-
-	nid = OBJ_obj2nid((ASN1_OBJECT *)(crt->cert_info->key->algor->algorithm));
-
-	smp->data.str.str = (char *)OBJ_nid2sn(nid);
-	if (!smp->data.str.str)
-		return 0;
-
-	smp->type = SMP_T_STR;
-	smp->flags |= SMP_F_CONST;
-	smp->data.str.len = strlen(smp->data.str.str);
-
-	return 1;
-}
-
-/* str, returns a string of a formatted full dn \C=..\O=..\OU=.. \CN=.. */
-static int
-smp_fetch_ssl_f_i_dn(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
-                       const struct arg *args, struct sample *smp, const char *kw)
-{
-	X509 *crt = NULL;
-	X509_NAME *name;
-	int ret = 0;
-	struct chunk *smp_trash;
-	struct connection *conn;
-
-	if (!l4)
-		return 0;
-
-	conn = objt_conn(l4->si[0].end);
-	if (!conn || conn->xprt != &ssl_sock)
-		return 0;
-
-	if (!(conn->flags & CO_FL_CONNECTED)) {
-		smp->flags |= SMP_F_MAY_CHANGE;
-		return 0;
-	}
-
-	crt = SSL_get_certificate(conn->xprt_ctx);
-	if (!crt)
-		goto out;
-
-	name = X509_get_issuer_name(crt);
-	if (!name)
-		goto out;
-
-	smp_trash = get_trash_chunk();
-	if (args && args[0].type == ARGT_STR) {
-		int pos = 1;
-
-		if (args[1].type == ARGT_SINT)
-			pos = args[1].data.sint;
-		else if (args[1].type == ARGT_UINT)
-			pos =(int)args[1].data.uint;
-
-		if (ssl_sock_get_dn_entry(name, &args[0].data.str, pos, smp_trash) <= 0)
-			goto out;
-	}
-	else if (ssl_sock_get_dn_oneline(name, smp_trash) <= 0)
-		goto out;
-
-	smp->type = SMP_T_STR;
-	smp->data.str = *smp_trash;
-	ret = 1;
-out:
-	return ret;
-}
-
-/* str, returns a string of a formatted full dn \C=..\O=..\OU=.. \CN=.. */
-static int
-smp_fetch_ssl_f_s_dn(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
-                       const struct arg *args, struct sample *smp, const char *kw)
-{
-	X509 *crt = NULL;
-	X509_NAME *name;
-	int ret = 0;
-	struct chunk *smp_trash;
-	struct connection *conn;
-
-	if (!l4)
-		return 0;
-
-	conn = objt_conn(l4->si[0].end);
-	if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock)
-		return 0;
-
-	if (!(conn->flags & CO_FL_CONNECTED)) {
-		smp->flags |= SMP_F_MAY_CHANGE;
-		return 0;
-	}
-
-	crt = SSL_get_certificate(conn->xprt_ctx);
-	if (!crt)
-		goto out;
-
-	name = X509_get_subject_name(crt);
-	if (!name)
-		goto out;
-
-	smp_trash = get_trash_chunk();
-	if (args && args[0].type == ARGT_STR) {
-		int pos = 1;
-
-		if (args[1].type == ARGT_SINT)
-			pos = args[1].data.sint;
-		else if (args[1].type == ARGT_UINT)
-			pos =(int)args[1].data.uint;
-
-		if (ssl_sock_get_dn_entry(name, &args[0].data.str, pos, smp_trash) <= 0)
-			goto out;
-	}
-	else if (ssl_sock_get_dn_oneline(name, smp_trash) <= 0)
-		goto out;
-
-	smp->type = SMP_T_STR;
-	smp->data.str = *smp_trash;
-	ret = 1;
-out:
-	return ret;
-}
-
 /* string, returns the used cipher if front conn. transport layer is SSL.
  * This function is also usable on backend conn if the fetch keyword 5th
  * char is 'b'.
@@ -3670,25 +3417,25 @@
 	{ "ssl_c_ca_err",           smp_fetch_ssl_c_ca_err,       0,                   NULL,    SMP_T_UINT, SMP_USE_L5CLI },
 	{ "ssl_c_ca_err_depth",     smp_fetch_ssl_c_ca_err_depth, 0,                   NULL,    SMP_T_UINT, SMP_USE_L5CLI },
 	{ "ssl_c_err",              smp_fetch_ssl_c_err,          0,                   NULL,    SMP_T_UINT, SMP_USE_L5CLI },
-	{ "ssl_c_i_dn",             smp_fetch_ssl_c_i_dn,         ARG2(0,STR,SINT),    NULL,    SMP_T_STR,  SMP_USE_L5CLI },
-	{ "ssl_c_key_alg",          smp_fetch_ssl_c_key_alg,      0,                   NULL,    SMP_T_STR,  SMP_USE_L5CLI },
-	{ "ssl_c_notafter",         smp_fetch_ssl_c_notafter,     0,                   NULL,    SMP_T_STR,  SMP_USE_L5CLI },
-	{ "ssl_c_notbefore",        smp_fetch_ssl_c_notbefore,    0,                   NULL,    SMP_T_STR,  SMP_USE_L5CLI },
-	{ "ssl_c_sig_alg",          smp_fetch_ssl_c_sig_alg,      0,                   NULL,    SMP_T_STR,  SMP_USE_L5CLI },
-	{ "ssl_c_s_dn",             smp_fetch_ssl_c_s_dn,         ARG2(0,STR,SINT),    NULL,    SMP_T_STR,  SMP_USE_L5CLI },
-	{ "ssl_c_serial",           smp_fetch_ssl_c_serial,       0,                   NULL,    SMP_T_BIN,  SMP_USE_L5CLI },
-	{ "ssl_c_sha1",             smp_fetch_ssl_c_sha1,         0,                   NULL,    SMP_T_BIN,  SMP_USE_L5CLI },
+	{ "ssl_c_i_dn",             smp_fetch_ssl_x_i_dn,         ARG2(0,STR,SINT),    NULL,    SMP_T_STR,  SMP_USE_L5CLI },
+	{ "ssl_c_key_alg",          smp_fetch_ssl_x_key_alg,      0,                   NULL,    SMP_T_STR,  SMP_USE_L5CLI },
+	{ "ssl_c_notafter",         smp_fetch_ssl_x_notafter,     0,                   NULL,    SMP_T_STR,  SMP_USE_L5CLI },
+	{ "ssl_c_notbefore",        smp_fetch_ssl_x_notbefore,    0,                   NULL,    SMP_T_STR,  SMP_USE_L5CLI },
+	{ "ssl_c_sig_alg",          smp_fetch_ssl_x_sig_alg,      0,                   NULL,    SMP_T_STR,  SMP_USE_L5CLI },
+	{ "ssl_c_s_dn",             smp_fetch_ssl_x_s_dn,         ARG2(0,STR,SINT),    NULL,    SMP_T_STR,  SMP_USE_L5CLI },
+	{ "ssl_c_serial",           smp_fetch_ssl_x_serial,       0,                   NULL,    SMP_T_BIN,  SMP_USE_L5CLI },
+	{ "ssl_c_sha1",             smp_fetch_ssl_x_sha1,         0,                   NULL,    SMP_T_BIN,  SMP_USE_L5CLI },
 	{ "ssl_c_used",             smp_fetch_ssl_c_used,         0,                   NULL,    SMP_T_BOOL, SMP_USE_L5CLI },
 	{ "ssl_c_verify",           smp_fetch_ssl_c_verify,       0,                   NULL,    SMP_T_UINT, SMP_USE_L5CLI },
-	{ "ssl_c_version",          smp_fetch_ssl_c_version,      0,                   NULL,    SMP_T_UINT, SMP_USE_L5CLI },
-	{ "ssl_f_i_dn",             smp_fetch_ssl_f_i_dn,         ARG2(0,STR,SINT),    NULL,    SMP_T_STR,  SMP_USE_L5CLI },
-	{ "ssl_f_key_alg",          smp_fetch_ssl_f_key_alg,      0,                   NULL,    SMP_T_STR,  SMP_USE_L5CLI },
-	{ "ssl_f_notafter",         smp_fetch_ssl_f_notafter,     0,                   NULL,    SMP_T_STR,  SMP_USE_L5CLI },
-	{ "ssl_f_notbefore",        smp_fetch_ssl_f_notbefore,    0,                   NULL,    SMP_T_STR,  SMP_USE_L5CLI },
-	{ "ssl_f_sig_alg",          smp_fetch_ssl_f_sig_alg,      0,                   NULL,    SMP_T_STR,  SMP_USE_L5CLI },
-	{ "ssl_f_s_dn",             smp_fetch_ssl_f_s_dn,         ARG2(0,STR,SINT),    NULL,    SMP_T_STR,  SMP_USE_L5CLI },
-	{ "ssl_f_serial",           smp_fetch_ssl_f_serial,       0,                   NULL,    SMP_T_BIN,  SMP_USE_L5CLI },
-	{ "ssl_f_version",          smp_fetch_ssl_f_version,      0,                   NULL,    SMP_T_UINT, SMP_USE_L5CLI },
+	{ "ssl_c_version",          smp_fetch_ssl_x_version,      0,                   NULL,    SMP_T_UINT, SMP_USE_L5CLI },
+	{ "ssl_f_i_dn",             smp_fetch_ssl_x_i_dn,         ARG2(0,STR,SINT),    NULL,    SMP_T_STR,  SMP_USE_L5CLI },
+	{ "ssl_f_key_alg",          smp_fetch_ssl_x_key_alg,      0,                   NULL,    SMP_T_STR,  SMP_USE_L5CLI },
+	{ "ssl_f_notafter",         smp_fetch_ssl_x_notafter,     0,                   NULL,    SMP_T_STR,  SMP_USE_L5CLI },
+	{ "ssl_f_notbefore",        smp_fetch_ssl_x_notbefore,    0,                   NULL,    SMP_T_STR,  SMP_USE_L5CLI },
+	{ "ssl_f_sig_alg",          smp_fetch_ssl_x_sig_alg,      0,                   NULL,    SMP_T_STR,  SMP_USE_L5CLI },
+	{ "ssl_f_s_dn",             smp_fetch_ssl_x_s_dn,         ARG2(0,STR,SINT),    NULL,    SMP_T_STR,  SMP_USE_L5CLI },
+	{ "ssl_f_serial",           smp_fetch_ssl_x_serial,       0,                   NULL,    SMP_T_BIN,  SMP_USE_L5CLI },
+	{ "ssl_f_version",          smp_fetch_ssl_x_version,      0,                   NULL,    SMP_T_UINT, SMP_USE_L5CLI },
 	{ "ssl_fc",                 smp_fetch_ssl_fc,             0,                   NULL,    SMP_T_BOOL, SMP_USE_L5CLI },
 	{ "ssl_fc_alg_keysize",     smp_fetch_ssl_fc_alg_keysize, 0,                   NULL,    SMP_T_UINT, SMP_USE_L5CLI },
 	{ "ssl_fc_cipher",          smp_fetch_ssl_fc_cipher,      0,                   NULL,    SMP_T_STR,  SMP_USE_L5CLI },