Header And Logo

PostgreSQL
| The world's most advanced open source database.

Functions | Variables

sslinfo.c File Reference

#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>
Include dependency graph for sslinfo.c:

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

Function Documentation

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.

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.

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

Datum X509_NAME_field_to_text ( X509_NAME *  name,
text fieldName 
)

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


Variable Documentation

Definition at line 22 of file sslinfo.c.