Header And Logo

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

Functions | Variables

pgp-info.c File Reference

#include "postgres.h"
#include "px.h"
#include "mbuf.h"
#include "pgp.h"
Include dependency graph for pgp-info.c:

Go to the source code of this file.

Functions

static int read_pubkey_keyid (PullFilter *pkt, uint8 *keyid_buf)
static int read_pubenc_keyid (PullFilter *pkt, uint8 *keyid_buf)
static int print_key (uint8 *keyid, char *dst)
int pgp_get_keyid (MBuf *pgp_data, char *dst)

Variables

static const char hextbl [] = "0123456789ABCDEF"
static const uint8 any_key []

Function Documentation

int pgp_get_keyid ( MBuf pgp_data,
char *  dst 
)

Definition at line 112 of file pgp-info.c.

References any_key, memcmp(), NULL, pgp_create_pkt_reader(), pgp_parse_pkt_hdr(), PGP_PKT_MARKER, PGP_PKT_PRIV_61, PGP_PKT_PUBENCRYPTED_SESSKEY, PGP_PKT_PUBLIC_KEY, PGP_PKT_PUBLIC_SUBKEY, PGP_PKT_SECRET_KEY, PGP_PKT_SECRET_SUBKEY, PGP_PKT_SIGNATURE, PGP_PKT_SYMENCRYPTED_DATA, PGP_PKT_SYMENCRYPTED_DATA_MDC, PGP_PKT_SYMENCRYPTED_SESSKEY, PGP_PKT_TRUST, PGP_PKT_USER_ATTR, PGP_PKT_USER_ID, pgp_skip_packet(), print_key(), pullf_create_mbuf_reader(), pullf_free(), read_pubenc_keyid(), and read_pubkey_keyid().

Referenced by pgp_key_id_w().

{
    int         res;
    PullFilter *src;
    PullFilter *pkt = NULL;
    int         len;
    uint8       tag;
    int         got_pub_key = 0,
                got_symenc_key = 0,
                got_pubenc_key = 0;
    int         got_data = 0;
    uint8       keyid_buf[8];
    int         got_main_key = 0;


    res = pullf_create_mbuf_reader(&src, pgp_data);
    if (res < 0)
        return res;

    while (1)
    {
        res = pgp_parse_pkt_hdr(src, &tag, &len, 0);
        if (res <= 0)
            break;
        res = pgp_create_pkt_reader(&pkt, src, len, res, NULL);
        if (res < 0)
            break;

        switch (tag)
        {
            case PGP_PKT_SECRET_KEY:
            case PGP_PKT_PUBLIC_KEY:
                /* main key is for signing, so ignore it */
                if (!got_main_key)
                {
                    got_main_key = 1;
                    res = pgp_skip_packet(pkt);
                }
                else
                    res = PXE_PGP_MULTIPLE_KEYS;
                break;
            case PGP_PKT_SECRET_SUBKEY:
            case PGP_PKT_PUBLIC_SUBKEY:
                res = read_pubkey_keyid(pkt, keyid_buf);
                if (res < 0)
                    break;
                if (res > 0)
                    got_pub_key++;
                break;
            case PGP_PKT_PUBENCRYPTED_SESSKEY:
                got_pubenc_key++;
                res = read_pubenc_keyid(pkt, keyid_buf);
                break;
            case PGP_PKT_SYMENCRYPTED_DATA:
            case PGP_PKT_SYMENCRYPTED_DATA_MDC:
                /* don't skip it, just stop */
                got_data = 1;
                break;
            case PGP_PKT_SYMENCRYPTED_SESSKEY:
                got_symenc_key++;
                /* fallthru */
            case PGP_PKT_SIGNATURE:
            case PGP_PKT_MARKER:
            case PGP_PKT_TRUST:
            case PGP_PKT_USER_ID:
            case PGP_PKT_USER_ATTR:
            case PGP_PKT_PRIV_61:
                res = pgp_skip_packet(pkt);
                break;
            default:
                res = PXE_PGP_CORRUPT_DATA;
        }

        if (pkt)
            pullf_free(pkt);
        pkt = NULL;

        if (res < 0 || got_data)
            break;
    }

    pullf_free(src);
    if (pkt)
        pullf_free(pkt);

    if (res < 0)
        return res;

    /* now check sanity */
    if (got_pub_key && got_pubenc_key)
        res = PXE_PGP_CORRUPT_DATA;

    if (got_pub_key > 1)
        res = PXE_PGP_MULTIPLE_KEYS;

    if (got_pubenc_key > 1)
        res = PXE_PGP_MULTIPLE_KEYS;

    /*
     * if still ok, look what we got
     */
    if (res >= 0)
    {
        if (got_pubenc_key || got_pub_key)
        {
            if (memcmp(keyid_buf, any_key, 8) == 0)
            {
                memcpy(dst, "ANYKEY", 7);
                res = 6;
            }
            else
                res = print_key(keyid_buf, dst);
        }
        else if (got_symenc_key)
        {
            memcpy(dst, "SYMKEY", 7);
            res = 6;
        }
        else
            res = PXE_PGP_NO_USABLE_KEY;
    }

    return res;
}

static int print_key ( uint8 keyid,
char *  dst 
) [static]

Definition at line 90 of file pgp-info.c.

References hextbl, and i.

Referenced by pgp_get_keyid().

{
    int         i;
    unsigned    c;

    for (i = 0; i < 8; i++)
    {
        c = keyid[i];
        *dst++ = hextbl[(c >> 4) & 0x0F];
        *dst++ = hextbl[c & 0x0F];
    }
    *dst = 0;
    return 8 * 2;
}

static int read_pubenc_keyid ( PullFilter pkt,
uint8 keyid_buf 
) [static]

Definition at line 71 of file pgp-info.c.

References GETBYTE, pgp_skip_packet(), and pullf_read_fixed().

Referenced by pgp_get_keyid().

{
    uint8       ver;
    int         res;

    GETBYTE(pkt, ver);
    if (ver != 3)
        return -1;

    res = pullf_read_fixed(pkt, 8, keyid_buf);
    if (res < 0)
        return res;

    return pgp_skip_packet(pkt);
}

static int read_pubkey_keyid ( PullFilter pkt,
uint8 keyid_buf 
) [static]

Definition at line 38 of file pgp-info.c.

References _pgp_read_public_key(), PGP_PubKey::algo, PGP_PubKey::key_id, pgp_key_free(), PGP_PUB_ELG_ENCRYPT, PGP_PUB_RSA_ENCRYPT, PGP_PUB_RSA_ENCRYPT_SIGN, and pgp_skip_packet().

Referenced by pgp_get_keyid().

{
    int         res;
    PGP_PubKey *pk = NULL;

    res = _pgp_read_public_key(pkt, &pk);
    if (res < 0)
        goto err;

    /* skip secret key part, if it exists */
    res = pgp_skip_packet(pkt);
    if (res < 0)
        goto err;

    /* is it encryption key */
    switch (pk->algo)
    {
        case PGP_PUB_ELG_ENCRYPT:
        case PGP_PUB_RSA_ENCRYPT:
        case PGP_PUB_RSA_ENCRYPT_SIGN:
            memcpy(keyid_buf, pk->key_id, 8);
            res = 1;
            break;
        default:
            res = 0;
    }

err:
    pgp_key_free(pk);
    return res;
}


Variable Documentation

const uint8 any_key[] [static]
Initial value:
{0, 0, 0, 0, 0, 0, 0, 0}

Definition at line 105 of file pgp-info.c.

Referenced by pgp_get_keyid().

const char hextbl[] = "0123456789ABCDEF" [static]

Definition at line 87 of file pgp-info.c.

Referenced by appendByteaLiteral(), and print_key().