#include "postgres.h"
#include "fmgr.h"
#include "utils/numeric.h"
#include "libpq/libpq-be.h"
#include "miscadmin.h"
#include "utils/builtins.h"
#include "mb/pg_wchar.h"
#include <openssl/x509.h>
#include <openssl/asn1.h>
Go to the source code of this file.
Functions | |
Datum | ssl_is_used (PG_FUNCTION_ARGS) |
Datum | ssl_version (PG_FUNCTION_ARGS) |
Datum | ssl_cipher (PG_FUNCTION_ARGS) |
Datum | ssl_client_cert_present (PG_FUNCTION_ARGS) |
Datum | ssl_client_serial (PG_FUNCTION_ARGS) |
Datum | ssl_client_dn_field (PG_FUNCTION_ARGS) |
Datum | ssl_issuer_field (PG_FUNCTION_ARGS) |
Datum | ssl_client_dn (PG_FUNCTION_ARGS) |
Datum | ssl_issuer_dn (PG_FUNCTION_ARGS) |
Datum | X509_NAME_field_to_text (X509_NAME *name, text *fieldName) |
Datum | X509_NAME_to_text (X509_NAME *name) |
Datum | ASN1_STRING_to_text (ASN1_STRING *str) |
PG_FUNCTION_INFO_V1 (ssl_is_used) | |
PG_FUNCTION_INFO_V1 (ssl_version) | |
PG_FUNCTION_INFO_V1 (ssl_cipher) | |
PG_FUNCTION_INFO_V1 (ssl_client_cert_present) | |
PG_FUNCTION_INFO_V1 (ssl_client_serial) | |
PG_FUNCTION_INFO_V1 (ssl_client_dn_field) | |
PG_FUNCTION_INFO_V1 (ssl_issuer_field) | |
PG_FUNCTION_INFO_V1 (ssl_client_dn) | |
PG_FUNCTION_INFO_V1 (ssl_issuer_dn) | |
Variables | |
PG_MODULE_MAGIC |
Datum ASN1_STRING_to_text | ( | ASN1_STRING * | str | ) |
Definition at line 142 of file sslinfo.c.
References cstring_to_text(), GetDatabaseEncoding(), pfree(), pg_do_encoding_conversion(), and PG_RETURN_TEXT_P.
Referenced by X509_NAME_field_to_text().
{ BIO *membuf; size_t size; char nullterm; char *sp; char *dp; text *result; membuf = BIO_new(BIO_s_mem()); (void) BIO_set_close(membuf, BIO_CLOSE); ASN1_STRING_print_ex(membuf, str, ((ASN1_STRFLGS_RFC2253 & ~ASN1_STRFLGS_ESC_MSB) | ASN1_STRFLGS_UTF8_CONVERT)); /* ensure null termination of the BIO's content */ nullterm = '\0'; BIO_write(membuf, &nullterm, 1); size = BIO_get_mem_data(membuf, &sp); dp = (char *) pg_do_encoding_conversion((unsigned char *) sp, size - 1, PG_UTF8, GetDatabaseEncoding()); result = cstring_to_text(dp); if (dp != sp) pfree(dp); BIO_free(membuf); PG_RETURN_TEXT_P(result); }
PG_FUNCTION_INFO_V1 | ( | ssl_client_cert_present | ) |
PG_FUNCTION_INFO_V1 | ( | ssl_client_serial | ) |
PG_FUNCTION_INFO_V1 | ( | ssl_client_dn_field | ) |
PG_FUNCTION_INFO_V1 | ( | ssl_issuer_field | ) |
PG_FUNCTION_INFO_V1 | ( | ssl_client_dn | ) |
PG_FUNCTION_INFO_V1 | ( | ssl_issuer_dn | ) |
PG_FUNCTION_INFO_V1 | ( | ssl_cipher | ) |
PG_FUNCTION_INFO_V1 | ( | ssl_is_used | ) |
PG_FUNCTION_INFO_V1 | ( | ssl_version | ) |
Datum ssl_cipher | ( | PG_FUNCTION_ARGS | ) |
Definition at line 71 of file sslinfo.c.
References cstring_to_text(), MyProcPort, NULL, PG_RETURN_NULL, and PG_RETURN_TEXT_P.
{ if (MyProcPort->ssl == NULL) PG_RETURN_NULL(); PG_RETURN_TEXT_P(cstring_to_text(SSL_get_cipher(MyProcPort->ssl))); }
Datum ssl_client_cert_present | ( | PG_FUNCTION_ARGS | ) |
Definition at line 87 of file sslinfo.c.
References MyProcPort, NULL, and PG_RETURN_BOOL.
{ PG_RETURN_BOOL(MyProcPort->peer != NULL); }
Datum ssl_client_dn | ( | PG_FUNCTION_ARGS | ) |
Definition at line 349 of file sslinfo.c.
References MyProcPort, PG_RETURN_NULL, and X509_NAME_to_text().
{ if (!(MyProcPort->peer)) PG_RETURN_NULL(); return X509_NAME_to_text(X509_get_subject_name(MyProcPort->peer)); }
Datum ssl_client_dn_field | ( | PG_FUNCTION_ARGS | ) |
Definition at line 227 of file sslinfo.c.
References MyProcPort, PG_GETARG_TEXT_P, PG_RETURN_NULL, and X509_NAME_field_to_text().
{ text *fieldname = PG_GETARG_TEXT_P(0); Datum result; if (!(MyProcPort->peer)) PG_RETURN_NULL(); result = X509_NAME_field_to_text(X509_get_subject_name(MyProcPort->peer), fieldname); if (!result) PG_RETURN_NULL(); else return result; }
Datum ssl_client_serial | ( | PG_FUNCTION_ARGS | ) |
Definition at line 103 of file sslinfo.c.
References CStringGetDatum, DirectFunctionCall3, Int32GetDatum, MyProcPort, NULL, numeric_in(), ObjectIdGetDatum, PG_RETURN_NULL, and port.
{ Datum result; Port *port = MyProcPort; X509 *peer = port->peer; ASN1_INTEGER *serial = NULL; BIGNUM *b; char *decimal; if (!peer) PG_RETURN_NULL(); serial = X509_get_serialNumber(peer); b = ASN1_INTEGER_to_BN(serial, NULL); decimal = BN_bn2dec(b); BN_free(b); result = DirectFunctionCall3(numeric_in, CStringGetDatum(decimal), ObjectIdGetDatum(0), Int32GetDatum(-1)); OPENSSL_free(decimal); return result; }
Datum ssl_is_used | ( | PG_FUNCTION_ARGS | ) |
Definition at line 47 of file sslinfo.c.
References MyProcPort, NULL, and PG_RETURN_BOOL.
{ PG_RETURN_BOOL(MyProcPort->ssl != NULL); }
Datum ssl_issuer_dn | ( | PG_FUNCTION_ARGS | ) |
Definition at line 368 of file sslinfo.c.
References MyProcPort, PG_RETURN_NULL, and X509_NAME_to_text().
{ if (!(MyProcPort->peer)) PG_RETURN_NULL(); return X509_NAME_to_text(X509_get_issuer_name(MyProcPort->peer)); }
Datum ssl_issuer_field | ( | PG_FUNCTION_ARGS | ) |
Definition at line 262 of file sslinfo.c.
References MyProcPort, PG_GETARG_TEXT_P, PG_RETURN_NULL, and X509_NAME_field_to_text().
{ text *fieldname = PG_GETARG_TEXT_P(0); Datum result; if (!(MyProcPort->peer)) PG_RETURN_NULL(); result = X509_NAME_field_to_text(X509_get_issuer_name(MyProcPort->peer), fieldname); if (!result) PG_RETURN_NULL(); else return result; }
Datum ssl_version | ( | PG_FUNCTION_ARGS | ) |
Definition at line 58 of file sslinfo.c.
References cstring_to_text(), MyProcPort, NULL, PG_RETURN_NULL, and PG_RETURN_TEXT_P.
{ if (MyProcPort->ssl == NULL) PG_RETURN_NULL(); PG_RETURN_TEXT_P(cstring_to_text(SSL_get_version(MyProcPort->ssl))); }
Definition at line 186 of file sslinfo.c.
References ASN1_STRING_to_text(), ereport, errcode(), errmsg(), ERROR, pfree(), and text_to_cstring().
Referenced by ssl_client_dn_field(), and ssl_issuer_field().
{ char *string_fieldname; int nid, index; ASN1_STRING *data; string_fieldname = text_to_cstring(fieldName); nid = OBJ_txt2nid(string_fieldname); if (nid == NID_undef) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid X.509 field name: \"%s\"", string_fieldname))); pfree(string_fieldname); index = X509_NAME_get_index_by_NID(name, nid, -1); if (index < 0) return (Datum) 0; data = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(name, index)); return ASN1_STRING_to_text(data); }
Datum X509_NAME_to_text | ( | X509_NAME * | name | ) |
Definition at line 291 of file sslinfo.c.
References cstring_to_text(), GetDatabaseEncoding(), i, pfree(), pg_do_encoding_conversion(), and PG_RETURN_TEXT_P.
Referenced by ssl_client_dn(), and ssl_issuer_dn().
{ BIO *membuf = BIO_new(BIO_s_mem()); int i, nid, count = X509_NAME_entry_count(name); X509_NAME_ENTRY *e; ASN1_STRING *v; const char *field_name; size_t size; char nullterm; char *sp; char *dp; text *result; (void) BIO_set_close(membuf, BIO_CLOSE); for (i = 0; i < count; i++) { e = X509_NAME_get_entry(name, i); nid = OBJ_obj2nid(X509_NAME_ENTRY_get_object(e)); v = X509_NAME_ENTRY_get_data(e); field_name = OBJ_nid2sn(nid); if (!field_name) field_name = OBJ_nid2ln(nid); BIO_printf(membuf, "/%s=", field_name); ASN1_STRING_print_ex(membuf, v, ((ASN1_STRFLGS_RFC2253 & ~ASN1_STRFLGS_ESC_MSB) | ASN1_STRFLGS_UTF8_CONVERT)); } /* ensure null termination of the BIO's content */ nullterm = '\0'; BIO_write(membuf, &nullterm, 1); size = BIO_get_mem_data(membuf, &sp); dp = (char *) pg_do_encoding_conversion((unsigned char *) sp, size - 1, PG_UTF8, GetDatabaseEncoding()); result = cstring_to_text(dp); if (dp != sp) pfree(dp); BIO_free(membuf); PG_RETURN_TEXT_P(result); }