Changeset 326

Show
Ignore:
Timestamp:
01/03/06 14:18:52
Author:
ben
Message:

Parse encrypted session key.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • openpgpsdk/trunk/examples/packet-dump.c

    r320 r326  
    832832        break; 
    833833 
     834    case OPS_PTAG_CT_PK_SESSION_KEY: 
     835        print_tagname("PUBLIC KEY SESSION KEY"); 
     836        printf("Version: %d\n",content->pk_session_key.version); 
     837        print_hexdump("key ID",content->pk_session_key.key_id, 
     838                      sizeof content->pk_session_key.key_id); 
     839        printf("Algorithm: %d\n",content->pk_session_key.algorithm); 
     840        switch(content->pk_session_key.algorithm) 
     841            { 
     842        case OPS_PKA_RSA: 
     843            print_bn("encrypted_m", 
     844                     content->pk_session_key.parameters.rsa.encrypted_m); 
     845            break; 
     846 
     847        case OPS_PKA_ELGAMAL: 
     848            print_bn("g_to_k", 
     849                     content->pk_session_key.parameters.elgamal.g_to_k); 
     850            print_bn("encrypted_m", 
     851                     content->pk_session_key.parameters.elgamal.encrypted_m); 
     852            break; 
     853 
     854        default: 
     855            assert(0); 
     856            } 
     857        break; 
     858 
    834859    default: 
    835860        print_tagname("UNKNOWN PACKET TYPE"); 
  • openpgpsdk/trunk/include/openpgpsdk/packet.h

    r307 r326  
    753753    unsigned char               *data; 
    754754    } ops_unarmoured_text_t; 
     755 
     756typedef enum 
     757    { 
     758    OPS_PKSK_V3=3 
     759    } ops_pk_session_key_version_t; 
     760 
     761typedef struct 
     762    { 
     763    BIGNUM                      *encrypted_m; 
     764    } ops_pk_session_key_parameters_rsa_t; 
     765 
     766typedef struct 
     767    { 
     768    BIGNUM                      *g_to_k; 
     769    BIGNUM                      *encrypted_m; 
     770    } ops_pk_session_key_parameters_elgamal_t; 
     771 
     772typedef union 
     773    { 
     774    ops_pk_session_key_parameters_rsa_t         rsa; 
     775    ops_pk_session_key_parameters_elgamal_t     elgamal; 
     776    } ops_pk_session_key_parameters_t; 
     777 
     778typedef struct 
     779    { 
     780    ops_pk_session_key_version_t version; 
     781    unsigned char               key_id[OPS_KEY_ID_SIZE]; 
     782    ops_public_key_algorithm_t  algorithm; 
     783    ops_pk_session_key_parameters_t parameters; 
     784    } ops_pk_session_key_t; 
    755785 
    756786/** ops_parser_union_content_t */ 
     
    798828    ops_signed_cleartext_trailer_t signed_cleartext_trailer; 
    799829    ops_unarmoured_text_t       unarmoured_text; 
     830    ops_pk_session_key_t        pk_session_key; 
    800831    } ops_parser_content_union_t; 
    801832 
     
    841872void ops_parser_content_free(ops_parser_content_t *c); 
    842873void ops_secret_key_free(ops_secret_key_t *key); 
     874void ops_pk_session_key_free(ops_pk_session_key_t *sk); 
    843875 
    844876/* vim:set textwidth=120: */ 
  • openpgpsdk/trunk/src/packet-parse.c

    r324 r326  
    731731        break; 
    732732 
     733    case OPS_PTAG_CT_PK_SESSION_KEY: 
     734        ops_pk_session_key_free(&c->content.pk_session_key); 
     735        break; 
     736 
    733737    default: 
    734738        fprintf(stderr,"Can't free %d (0x%x)\n",c->tag,c->tag); 
     
    741745    BN_free(*pp); 
    742746    *pp=NULL; 
     747    } 
     748 
     749void ops_pk_session_key_free(ops_pk_session_key_t *sk) 
     750    { 
     751    switch(sk->algorithm) 
     752        { 
     753    case OPS_PKA_RSA: 
     754        free_BN(&sk->parameters.rsa.encrypted_m); 
     755        break; 
     756 
     757    case OPS_PKA_ELGAMAL: 
     758        free_BN(&sk->parameters.elgamal.g_to_k); 
     759        free_BN(&sk->parameters.elgamal.encrypted_m); 
     760        break; 
     761 
     762    default: 
     763        assert(0); 
     764        } 
    743765    } 
    744766 
     
    17581780    } 
    17591781 
     1782static int parse_pk_session_key(ops_region_t *region, 
     1783                                ops_parse_info_t *parse_info) 
     1784    { 
     1785    unsigned char c[1]; 
     1786    ops_parser_content_t content; 
     1787 
     1788    if(!limited_read(c,1,region,parse_info)) 
     1789        return 0; 
     1790    C.pk_session_key.version=c[0]; 
     1791    if(C.pk_session_key.version != OPS_PKSK_V3) 
     1792        ERR1P(parse_info, 
     1793              "Bad public-key encrypted session key version (%d)", 
     1794              C.pk_session_key.version); 
     1795 
     1796    if(!limited_read(C.pk_session_key.key_id, 
     1797                     sizeof C.pk_session_key.key_id,region,parse_info)) 
     1798        return 0; 
     1799 
     1800    if(!limited_read(c,1,region,parse_info)) 
     1801        return 0; 
     1802    C.pk_session_key.algorithm=c[0]; 
     1803    switch(C.pk_session_key.algorithm) 
     1804        { 
     1805    case OPS_PKA_RSA: 
     1806        if(!limited_read_mpi(&C.pk_session_key.parameters.rsa.encrypted_m, 
     1807                             region,parse_info)) 
     1808            return 0; 
     1809        break; 
     1810 
     1811    case OPS_PKA_ELGAMAL: 
     1812        if(!limited_read_mpi(&C.pk_session_key.parameters.elgamal.g_to_k, 
     1813                             region,parse_info) 
     1814           || limited_read_mpi(&C.pk_session_key.parameters.elgamal.encrypted_m, 
     1815                             region,parse_info)) 
     1816            return 0; 
     1817        break; 
     1818 
     1819    default: 
     1820        ERR1P(parse_info, 
     1821              "Unknown public key algorithm in session key (%d)", 
     1822              C.pk_session_key.algorithm); 
     1823        return 0; 
     1824        } 
     1825 
     1826    CBP(parse_info,OPS_PTAG_CT_PK_SESSION_KEY,&content); 
     1827 
     1828    return 1; 
     1829    } 
     1830     
     1831 
    17601832/** Parse one packet. 
    17611833 * 
     
    18751947        break; 
    18761948 
     1949    case OPS_PTAG_CT_PK_SESSION_KEY: 
     1950        r=parse_pk_session_key(&region,parse_info); 
     1951        break; 
     1952 
    18771953    default: 
    18781954        format_error(&content,"Format error (unknown content tag %d)",