#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);
}
1.7.1