Changeset 602

Show
Ignore:
Timestamp:
08/27/08 15:33:54
Author:
rachel
Message:

Split ops_signature_t struct into 2 parts: the actual signature information
derived from the packet; and the data needed whilst parsing it.
The actual signature information can then be passed back in the
ops_validate_result_t for a user to do further processing if they wish.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • openpgpsdk/trunk/include/openpgpsdk/packet.h

    r601 r602  
    579579    ops_public_key_algorithm_t  key_algorithm;  /*!< public key algorithm number */ 
    580580    ops_hash_algorithm_t        hash_algorithm; /*!< hashing algorithm number */ 
    581     unsigned char               hash2[2];       /*!< high 2 bytes of hashed value - for quick test */ 
    582581    ops_signature_union_t       signature;      /*!< signature parameters */ 
    583     size_t                      v4_hashed_data_start; /* only valid if accumulate is set */ 
    584582    size_t                      v4_hashed_data_length; 
    585     unsigned char* v4_hashed_data; 
    586     ops_hash_t                  *hash;          /*!< if set, the hash filled in for the data so far */ 
     583    unsigned char*              v4_hashed_data; 
    587584    ops_boolean_t               creation_time_set:1; 
    588585    ops_boolean_t               signer_id_set:1; 
     586    } ops_signature_info_t; 
     587 
     588typedef struct 
     589    { 
     590    ops_signature_info_t        info; 
     591    /* The following fields are only used while parsing the signature */ 
     592    unsigned char               hash2[2];       /*!< high 2 bytes of hashed value - for quick test */ 
     593    size_t                      v4_hashed_data_start; /* only valid if accumulate is set */ 
     594    ops_hash_t                  *hash;          /*!< if set, the hash filled in for the data so far */ 
    589595    } ops_signature_t; 
    590596 
  • openpgpsdk/trunk/include/openpgpsdk/validate.h

    r570 r602  
    2424    { 
    2525    unsigned int valid_count; 
    26     ops_keydata_t * valid_keys; 
     26    ops_signature_info_t * valid_sigs; 
    2727    unsigned int invalid_count; 
    28     ops_keydata_t * invalid_keys; 
     28    ops_signature_info_t * invalid_sigs; 
    2929    unsigned int unknown_signer_count; 
    30     unsigned char * unknown_keys; 
     30    ops_signature_info_t * unknown_sigs; 
    3131    } ops_validate_result_t; 
    3232 
  • openpgpsdk/trunk/src/lib/packet-parse.c

    r601 r602  
    11851185void ops_signature_free(ops_signature_t *sig) 
    11861186    { 
    1187     switch(sig->key_algorithm) 
     1187    switch(sig->info.key_algorithm) 
    11881188        { 
    11891189    case OPS_PKA_RSA: 
    11901190    case OPS_PKA_RSA_SIGN_ONLY: 
    1191         free_BN(&sig->signature.rsa.sig); 
     1191        free_BN(&sig->info.signature.rsa.sig); 
    11921192        break; 
    11931193 
    11941194    case OPS_PKA_DSA: 
    1195         free_BN(&sig->signature.dsa.r); 
    1196         free_BN(&sig->signature.dsa.s); 
     1195        free_BN(&sig->info.signature.dsa.r); 
     1196        free_BN(&sig->info.signature.dsa.s); 
    11971197        break; 
    11981198 
    11991199    case OPS_PKA_ELGAMAL_ENCRYPT_OR_SIGN: 
    1200         free_BN(&sig->signature.elgamal.r); 
    1201         free_BN(&sig->signature.elgamal.s); 
     1200        free_BN(&sig->info.signature.elgamal.r); 
     1201        free_BN(&sig->info.signature.elgamal.s); 
    12021202        break; 
    12031203 
     
    12131213    case OPS_PKA_PRIVATE09: 
    12141214    case OPS_PKA_PRIVATE10: 
    1215         free_unknown_sig_pka(&sig->signature.unknown); 
     1215        free_unknown_sig_pka(&sig->info.signature.unknown); 
    12161216        break; 
    12171217 
     
    12401240    ops_parser_content_t content; 
    12411241 
    1242     C.signature.version=OPS_V3; 
     1242    C.signature.info.version=OPS_V3; 
    12431243 
    12441244    /* hash info length */ 
     
    12501250    if(!limited_read(c,1,region,pinfo)) 
    12511251        return 0; 
    1252     C.signature.type=c[0]; 
     1252    C.signature.info.type=c[0]; 
    12531253    /* XXX: check signature type */ 
    12541254 
    1255     if(!limited_read_time(&C.signature.creation_time,region,pinfo)) 
    1256         return 0; 
    1257     C.signature.creation_time_set=ops_true; 
    1258  
    1259     if(!limited_read(C.signature.signer_id,OPS_KEY_ID_SIZE,region,pinfo)) 
    1260         return 0; 
    1261     C.signature.signer_id_set=ops_true; 
     1255    if(!limited_read_time(&C.signature.info.creation_time,region,pinfo)) 
     1256        return 0; 
     1257    C.signature.info.creation_time_set=ops_true; 
     1258 
     1259    if(!limited_read(C.signature.info.signer_id,OPS_KEY_ID_SIZE,region,pinfo)) 
     1260        return 0; 
     1261    C.signature.info.signer_id_set=ops_true; 
    12621262 
    12631263    if(!limited_read(c,1,region,pinfo)) 
    12641264        return 0; 
    1265     C.signature.key_algorithm=c[0]; 
     1265    C.signature.info.key_algorithm=c[0]; 
    12661266    /* XXX: check algorithm */ 
    12671267 
    12681268    if(!limited_read(c,1,region,pinfo)) 
    12691269        return 0; 
    1270     C.signature.hash_algorithm=c[0]; 
     1270    C.signature.info.hash_algorithm=c[0]; 
    12711271    /* XXX: check algorithm */ 
    12721272     
     
    12741274        return 0; 
    12751275 
    1276     switch(C.signature.key_algorithm) 
     1276    switch(C.signature.info.key_algorithm) 
    12771277        { 
    12781278    case OPS_PKA_RSA: 
    12791279    case OPS_PKA_RSA_SIGN_ONLY: 
    1280         if(!limited_read_mpi(&C.signature.signature.rsa.sig,region,pinfo)) 
     1280        if(!limited_read_mpi(&C.signature.info.signature.rsa.sig,region,pinfo)) 
    12811281            return 0; 
    12821282        break; 
    12831283 
    12841284    case OPS_PKA_DSA: 
    1285         if(!limited_read_mpi(&C.signature.signature.dsa.r,region,pinfo) 
    1286            || !limited_read_mpi(&C.signature.signature.dsa.s,region,pinfo)) 
     1285        if(!limited_read_mpi(&C.signature.info.signature.dsa.r,region,pinfo) 
     1286           || !limited_read_mpi(&C.signature.info.signature.dsa.s,region,pinfo)) 
    12871287            return 0; 
    12881288        break; 
    12891289 
    12901290    case OPS_PKA_ELGAMAL_ENCRYPT_OR_SIGN: 
    1291         if(!limited_read_mpi(&C.signature.signature.elgamal.r,region,pinfo) 
    1292            || !limited_read_mpi(&C.signature.signature.elgamal.s,region,pinfo)) 
     1291        if(!limited_read_mpi(&C.signature.info.signature.elgamal.r,region,pinfo) 
     1292           || !limited_read_mpi(&C.signature.info.signature.elgamal.s,region,pinfo)) 
    12931293            return 0; 
    12941294        break; 
     
    12971297        OPS_ERROR_1(&pinfo->errors,OPS_E_ALG_UNSUPPORTED_SIGNATURE_ALG, 
    12981298                    "Unsupported signature key algorithm (%s)", 
    1299                     ops_show_pka(C.signature.key_algorithm)); 
     1299                    ops_show_pka(C.signature.info.key_algorithm)); 
    13001300        return 0; 
    13011301        } 
     
    13071307        } 
    13081308 
    1309     if(C.signature.signer_id_set) 
    1310         C.signature.hash=ops_parse_hash_find(pinfo,C.signature.signer_id); 
     1309    if(C.signature.info.signer_id_set) 
     1310        C.signature.hash=ops_parse_hash_find(pinfo,C.signature.info.signer_id); 
    13111311 
    13121312    CBP(pinfo,OPS_PTAG_CT_SIGNATURE,&content); 
     
    13791379        if(content.tag == OPS_PTAG_SS_CREATION_TIME) 
    13801380            { 
    1381             sig->creation_time=C.ss_time.time; 
    1382             sig->creation_time_set=ops_true; 
     1381            sig->info.creation_time=C.ss_time.time; 
     1382            sig->info.creation_time_set=ops_true; 
    13831383            } 
    13841384        break; 
     
    14001400                             &subregion,pinfo)) 
    14011401            return 0; 
    1402         memcpy(sig->signer_id,C.ss_issuer_key_id.key_id,OPS_KEY_ID_SIZE); 
    1403         sig->signer_id_set=ops_true; 
     1402        memcpy(sig->info.signer_id,C.ss_issuer_key_id.key_id,OPS_KEY_ID_SIZE); 
     1403        sig->info.signer_id_set=ops_true; 
    14041404        break; 
    14051405 
     
    16711671    /* Set version,type,algorithms */ 
    16721672 
    1673     C.signature.version=OPS_V4; 
     1673    C.signature.info.version=OPS_V4; 
    16741674 
    16751675    if(!limited_read(c,1,region,pinfo)) 
    16761676        return 0; 
    1677     C.signature.type=c[0]; 
     1677    C.signature.info.type=c[0]; 
    16781678    /* XXX: check signature type */ 
    16791679 
    16801680    if(!limited_read(c,1,region,pinfo)) 
    16811681        return 0; 
    1682     C.signature.key_algorithm=c[0]; 
     1682    C.signature.info.key_algorithm=c[0]; 
    16831683    /* XXX: check algorithm */ 
    16841684 
    16851685    if(!limited_read(c,1,region,pinfo)) 
    16861686        return 0; 
    1687     C.signature.hash_algorithm=c[0]; 
     1687    C.signature.info.hash_algorithm=c[0]; 
    16881688    /* XXX: check algorithm */ 
    16891689 
     
    16931693        return 0; 
    16941694 
    1695     C.signature.v4_hashed_data_length=pinfo->rinfo.alength 
     1695    C.signature.info.v4_hashed_data_length=pinfo->rinfo.alength 
    16961696        -C.signature.v4_hashed_data_start; 
    16971697 
    16981698    // copy hashed subpackets 
    1699     if (C.signature.v4_hashed_data) 
    1700         free(C.signature.v4_hashed_data); 
    1701     C.signature.v4_hashed_data=ops_mallocz(C.signature.v4_hashed_data_length); 
     1699    if (C.signature.info.v4_hashed_data) 
     1700        free(C.signature.info.v4_hashed_data); 
     1701    C.signature.info.v4_hashed_data=ops_mallocz(C.signature.info.v4_hashed_data_length); 
    17021702 
    17031703    if (!pinfo->rinfo.accumulate) 
     
    17081708        } 
    17091709 
    1710     memcpy(C.signature.v4_hashed_data, 
     1710    memcpy(C.signature.info.v4_hashed_data, 
    17111711           pinfo->rinfo.accumulated+C.signature.v4_hashed_data_start, 
    1712            C.signature.v4_hashed_data_length); 
     1712           C.signature.info.v4_hashed_data_length); 
    17131713 
    17141714    if(!parse_signature_subpackets(&C.signature,region,pinfo)) 
     
    17181718        return 0; 
    17191719 
    1720     switch(C.signature.key_algorithm) 
     1720    switch(C.signature.info.key_algorithm) 
    17211721        { 
    17221722    case OPS_PKA_RSA: 
    1723         if(!limited_read_mpi(&C.signature.signature.rsa.sig,region,pinfo)) 
     1723        if(!limited_read_mpi(&C.signature.info.signature.rsa.sig,region,pinfo)) 
    17241724            return 0; 
    17251725        break; 
    17261726 
    17271727    case OPS_PKA_DSA: 
    1728         if(!limited_read_mpi(&C.signature.signature.dsa.r,region,pinfo))  
     1728        if(!limited_read_mpi(&C.signature.info.signature.dsa.r,region,pinfo))  
    17291729            ERRP(pinfo,"Error reading DSA r field in signature"); 
    1730         if (!limited_read_mpi(&C.signature.signature.dsa.s,region,pinfo)) 
     1730        if (!limited_read_mpi(&C.signature.info.signature.dsa.s,region,pinfo)) 
    17311731            ERRP(pinfo,"Error reading DSA s field in signature"); 
    17321732        break; 
    17331733 
    17341734    case OPS_PKA_ELGAMAL_ENCRYPT_OR_SIGN: 
    1735         if(!limited_read_mpi(&C.signature.signature.elgamal.r,region,pinfo) 
    1736            || !limited_read_mpi(&C.signature.signature.elgamal.s,region,pinfo)) 
     1735        if(!limited_read_mpi(&C.signature.info.signature.elgamal.r,region,pinfo) 
     1736           || !limited_read_mpi(&C.signature.info.signature.elgamal.s,region,pinfo)) 
    17371737            return 0; 
    17381738        break; 
     
    17491749    case OPS_PKA_PRIVATE09: 
    17501750    case OPS_PKA_PRIVATE10: 
    1751         if (!read_data(&C.signature.signature.unknown.data,region,pinfo)) 
     1751        if (!read_data(&C.signature.info.signature.unknown.data,region,pinfo)) 
    17521752            return 0; 
    17531753        break; 
     
    17561756        OPS_ERROR_1(&pinfo->errors,OPS_E_ALG_UNSUPPORTED_SIGNATURE_ALG, 
    17571757                    "Bad v4 signature key algorithm (%s)", 
    1758                     ops_show_pka(C.signature.key_algorithm)); 
     1758                    ops_show_pka(C.signature.info.key_algorithm)); 
    17591759        return 0; 
    17601760        } 
  • openpgpsdk/trunk/src/lib/packet-print.c

    r596 r602  
    702702        print_indent(indent); 
    703703        print_unsigned_int("Signature Version", 
    704                content->signature.version); 
    705         if (content->signature.creation_time_set)  
     704               content->signature.info.version); 
     705        if (content->signature.info.creation_time_set)  
    706706            print_time("Signature Creation Time", 
    707                        content->signature.creation_time); 
     707                       content->signature.info.creation_time); 
    708708 
    709709        print_string_and_value("Signature Type", 
    710                                ops_show_sig_type(content->signature.type), 
    711                                content->signature.type); 
    712  
    713         if(content->signature.signer_id_set) 
     710                               ops_show_sig_type(content->signature.info.type), 
     711                               content->signature.info.type); 
     712 
     713        if(content->signature.info.signer_id_set) 
    714714            print_hexdump_data("Signer ID", 
    715                                content->signature.signer_id, 
    716                                sizeof content->signature.signer_id); 
     715                               content->signature.info.signer_id, 
     716                               sizeof content->signature.info.signer_id); 
    717717 
    718718        print_string_and_value("Public Key Algorithm", 
    719                                ops_show_pka(content->signature.key_algorithm), 
    720                                content->signature.key_algorithm); 
     719                               ops_show_pka(content->signature.info.key_algorithm), 
     720                               content->signature.info.key_algorithm); 
    721721        print_string_and_value("Hash Algorithm", 
    722                                ops_show_hash_algorithm(content->signature.hash_algorithm), 
    723                                content->signature.hash_algorithm); 
     722                               ops_show_hash_algorithm(content->signature.info.hash_algorithm), 
     723                               content->signature.info.hash_algorithm); 
    724724 
    725725        print_indent(); 
    726726        print_hexdump_data("hash2",&content->signature.hash2[0],2); 
    727727 
    728         switch(content->signature.key_algorithm) 
     728        switch(content->signature.info.key_algorithm) 
    729729            { 
    730730        case OPS_PKA_RSA: 
    731731        case OPS_PKA_RSA_SIGN_ONLY: 
    732             print_bn("sig",content->signature.signature.rsa.sig); 
     732            print_bn("sig",content->signature.info.signature.rsa.sig); 
    733733            break; 
    734734 
    735735        case OPS_PKA_DSA: 
    736             print_bn("r",content->signature.signature.dsa.r); 
    737             print_bn("s",content->signature.signature.dsa.s); 
     736            print_bn("r",content->signature.info.signature.dsa.r); 
     737            print_bn("s",content->signature.info.signature.dsa.s); 
    738738            break; 
    739739 
    740740        case OPS_PKA_ELGAMAL_ENCRYPT_OR_SIGN: 
    741             print_bn("r",content->signature.signature.elgamal.r); 
    742             print_bn("s",content->signature.signature.elgamal.s); 
     741            print_bn("r",content->signature.info.signature.elgamal.r); 
     742            print_bn("s",content->signature.info.signature.elgamal.s); 
    743743            break; 
    744744 
     
    10431043        print_indent(indent); 
    10441044        print_unsigned_int("Signature Version", 
    1045                content->signature.version); 
    1046         if(content->signature.creation_time_set)  
    1047             print_time("Signature Creation Time", content->signature.creation_time); 
     1045               content->signature.info.version); 
     1046        if(content->signature.info.creation_time_set)  
     1047            print_time("Signature Creation Time", content->signature.info.creation_time); 
    10481048 
    10491049        print_string_and_value("Signature Type", 
    1050                                ops_show_sig_type(content->signature.type), 
    1051                                content->signature.type); 
    1052  
    1053         if(content->signature.signer_id_set) 
     1050                               ops_show_sig_type(content->signature.info.type), 
     1051                               content->signature.info.type); 
     1052 
     1053        if(content->signature.info.signer_id_set) 
    10541054            print_hexdump_data("Signer ID", 
    1055                                content->signature.signer_id, 
    1056                                sizeof content->signature.signer_id); 
     1055                               content->signature.info.signer_id, 
     1056                               sizeof content->signature.info.signer_id); 
    10571057 
    10581058        print_string_and_value("Public Key Algorithm", 
    1059                                ops_show_pka(content->signature.key_algorithm), 
    1060                                content->signature.key_algorithm); 
     1059                               ops_show_pka(content->signature.info.key_algorithm), 
     1060                               content->signature.info.key_algorithm); 
    10611061        print_string_and_value("Hash Algorithm", 
    1062                                ops_show_hash_algorithm(content->signature.hash_algorithm), 
    1063                                content->signature.hash_algorithm); 
     1062                               ops_show_hash_algorithm(content->signature.info.hash_algorithm), 
     1063                               content->signature.info.hash_algorithm); 
    10641064 
    10651065        break; 
     
    10691069        print_hexdump_data("hash2",&content->signature.hash2[0],2); 
    10701070 
    1071         switch(content->signature.key_algorithm) 
     1071        switch(content->signature.info.key_algorithm) 
    10721072            { 
    10731073        case OPS_PKA_RSA: 
    1074             print_bn("sig",content->signature.signature.rsa.sig); 
     1074            print_bn("sig",content->signature.info.signature.rsa.sig); 
    10751075            break; 
    10761076 
    10771077        case OPS_PKA_DSA: 
    1078             print_bn("r",content->signature.signature.dsa.r); 
    1079             print_bn("s",content->signature.signature.dsa.s); 
     1078            print_bn("r",content->signature.info.signature.dsa.r); 
     1079            print_bn("s",content->signature.info.signature.dsa.s); 
    10801080            break; 
    10811081 
    10821082        case OPS_PKA_ELGAMAL_ENCRYPT_OR_SIGN: 
    1083             print_bn("r",content->signature.signature.elgamal.r); 
    1084             print_bn("s",content->signature.signature.elgamal.s); 
     1083            print_bn("r",content->signature.info.signature.elgamal.r); 
     1084            print_bn("s",content->signature.info.signature.elgamal.s); 
    10851085            break; 
    10861086 
     
    10971097        case OPS_PKA_PRIVATE10: 
    10981098            print_data("Private/Experimental", 
    1099                        &content->signature.signature.unknown.data); 
     1099                       &content->signature.info.signature.unknown.data); 
    11001100            break; 
    11011101 
     
    12861286        print_indent(indent); 
    12871287        print_unsigned_int("Signature Version", 
    1288                content->signature.version); 
    1289         if (content->signature.creation_time_set)  
     1288               content->signature.info.version); 
     1289        if (content->signature.info.creation_time_set)  
    12901290            print_time("Signature Creation Time", 
    1291                        content->signature.creation_time); 
     1291                       content->signature.info.creation_time); 
    12921292 
    12931293        print_string_and_value("Signature Type", 
    1294                                ops_show_sig_type(content->signature.type), 
    1295                                content->signature.type); 
    1296  
    1297         if(content->signature.signer_id_set) 
     1294                               ops_show_sig_type(content->signature.info.type), 
     1295                               content->signature.info.type); 
     1296 
     1297        if(content->signature.info.signer_id_set) 
    12981298            print_hexdump_data("Signer ID", 
    1299                                content->signature.signer_id, 
    1300                                sizeof content->signature.signer_id); 
     1299                               content->signature.info.signer_id, 
     1300                               sizeof content->signature.info.signer_id); 
    13011301 
    13021302        print_string_and_value("Public Key Algorithm", 
    1303                                ops_show_pka(content->signature.key_algorithm), 
    1304                                content->signature.key_algorithm); 
     1303                               ops_show_pka(content->signature.info.key_algorithm), 
     1304                               content->signature.info.key_algorithm); 
    13051305        print_string_and_value("Hash Algorithm", 
    1306                                ops_show_hash_algorithm(content->signature.hash_algorithm), 
    1307                                content->signature.hash_algorithm); 
     1306                               ops_show_hash_algorithm(content->signature.info.hash_algorithm), 
     1307                               content->signature.info.hash_algorithm); 
    13081308 
    13091309        print_indent(); 
    13101310        print_hexdump_data("hash2",&content->signature.hash2[0],2); 
    13111311 
    1312         switch(content->signature.key_algorithm) 
     1312        switch(content->signature.info.key_algorithm) 
    13131313            { 
    13141314        case OPS_PKA_RSA: 
    13151315        case OPS_PKA_RSA_SIGN_ONLY: 
    1316             print_bn("sig",content->signature.signature.rsa.sig); 
     1316            print_bn("sig",content->signature.info.signature.rsa.sig); 
    13171317            break; 
    13181318 
    13191319        case OPS_PKA_DSA: 
    1320             print_bn("r",content->signature.signature.dsa.r); 
    1321             print_bn("s",content->signature.signature.dsa.s); 
     1320            print_bn("r",content->signature.info.signature.dsa.r); 
     1321            print_bn("s",content->signature.info.signature.dsa.s); 
    13221322            break; 
    13231323 
    13241324        case OPS_PKA_ELGAMAL_ENCRYPT_OR_SIGN: 
    1325             print_bn("r",content->signature.signature.elgamal.r); 
    1326             print_bn("s",content->signature.signature.elgamal.s); 
     1325            print_bn("r",content->signature.info.signature.elgamal.r); 
     1326            print_bn("s",content->signature.info.signature.elgamal.s); 
    13271327            break; 
    13281328 
     
    16271627        print_indent(indent); 
    16281628        print_unsigned_int("Signature Version", 
    1629                content->signature.version); 
    1630         if(content->signature.creation_time_set)  
    1631             print_time("Signature Creation Time", content->signature.creation_time); 
     1629               content->signature.info.version); 
     1630        if(content->signature.info.creation_time_set)  
     1631            print_time("Signature Creation Time", content->signature.info.creation_time); 
    16321632 
    16331633        print_string_and_value("Signature Type", 
    1634                                ops_show_sig_type(content->signature.type), 
    1635                                content->signature.type); 
    1636  
    1637         if(content->signature.signer_id_set) 
     1634                               ops_show_sig_type(content->signature.info.type), 
     1635                               content->signature.info.type); 
     1636 
     1637        if(content->signature.info.signer_id_set) 
    16381638            print_hexdump_data("Signer ID", 
    1639                                content->signature.signer_id, 
    1640                                sizeof content->signature.signer_id); 
     1639                               content->signature.info.signer_id, 
     1640                               sizeof content->signature.info.signer_id); 
    16411641 
    16421642        print_string_and_value("Public Key Algorithm", 
    1643                                ops_show_pka(content->signature.key_algorithm), 
    1644                                content->signature.key_algorithm); 
     1643                               ops_show_pka(content->signature.info.key_algorithm), 
     1644                               content->signature.info.key_algorithm); 
    16451645        print_string_and_value("Hash Algorithm", 
    1646                                ops_show_hash_algorithm(content->signature.hash_algorithm), 
    1647                                content->signature.hash_algorithm); 
     1646                               ops_show_hash_algorithm(content->signature.info.hash_algorithm), 
     1647                               content->signature.info.hash_algorithm); 
    16481648 
    16491649        break; 
     
    16531653        print_hexdump_data("hash2",&content->signature.hash2[0],2); 
    16541654 
    1655         switch(content->signature.key_algorithm) 
     1655        switch(content->signature.info.key_algorithm) 
    16561656            { 
    16571657        case OPS_PKA_RSA: 
    1658             print_bn("sig",content->signature.signature.rsa.sig); 
     1658            print_bn("sig",content->signature.info.signature.rsa.sig); 
    16591659            break; 
    16601660 
    16611661        case OPS_PKA_DSA: 
    1662             print_bn("r",content->signature.signature.dsa.r); 
    1663             print_bn("s",content->signature.signature.dsa.s); 
     1662            print_bn("r",content->signature.info.signature.dsa.r); 
     1663            print_bn("s",content->signature.info.signature.dsa.s); 
    16641664            break; 
    16651665 
    16661666        case OPS_PKA_ELGAMAL_ENCRYPT_OR_SIGN: 
    1667             print_bn("r",content->signature.signature.elgamal.r); 
    1668             print_bn("s",content->signature.signature.elgamal.s); 
     1667            print_bn("r",content->signature.info.signature.elgamal.r); 
     1668            print_bn("s",content->signature.info.signature.elgamal.s); 
    16691669            break; 
    16701670 
     
    16811681        case OPS_PKA_PRIVATE10: 
    16821682            print_data("Private/Experimental", 
    1683                        &content->signature.signature.unknown.data); 
     1683                       &content->signature.info.signature.unknown.data); 
    16841684            break; 
    16851685 
  • openpgpsdk/trunk/src/lib/signature.c

    r574 r602  
    294294static void initialise_hash(ops_hash_t *hash,const ops_signature_t *sig) 
    295295    { 
    296     ops_hash_any(hash,sig->hash_algorithm); 
     296    ops_hash_any(hash,sig->info.hash_algorithm); 
    297297    hash->init(hash); 
    298298    } 
     
    308308                             const unsigned char *raw_packet) 
    309309    { 
    310     if(sig->version == OPS_V4) 
     310    if(sig->info.version == OPS_V4) 
    311311        { 
    312312        if(raw_packet) 
    313313            hash->add(hash,raw_packet+sig->v4_hashed_data_start, 
    314                       sig->v4_hashed_data_length); 
    315         ops_hash_add_int(hash,sig->version,1); 
     314                      sig->info.v4_hashed_data_length); 
     315        ops_hash_add_int(hash,sig->info.version,1); 
    316316        ops_hash_add_int(hash,0xff,1); 
    317         ops_hash_add_int(hash,sig->v4_hashed_data_length,4); 
     317        ops_hash_add_int(hash,sig->info.v4_hashed_data_length,4); 
    318318        } 
    319319    else 
    320320        { 
    321         ops_hash_add_int(hash,sig->type,1); 
    322         ops_hash_add_int(hash,sig->creation_time,4); 
     321        ops_hash_add_int(hash,sig->info.type,1); 
     322        ops_hash_add_int(hash,sig->info.creation_time,4); 
    323323        } 
    324324    } 
     
    336336    */ 
    337337 
    338     switch(sig->key_algorithm) 
     338    switch(sig->info.key_algorithm) 
    339339        { 
    340340    case OPS_PKA_DSA: 
    341         ret=ops_dsa_verify(hash,length,&sig->signature.dsa,&signer->key.dsa); 
     341        ret=ops_dsa_verify(hash,length,&sig->info.signature.dsa,&signer->key.dsa); 
    342342        break; 
    343343 
    344344    case OPS_PKA_RSA: 
    345         ret=rsa_verify(sig->hash_algorithm,hash,length,&sig->signature.rsa, 
     345        ret=rsa_verify(sig->info.hash_algorithm,hash,length,&sig->info.signature.rsa, 
    346346                       &signer->key.rsa); 
    347347        break; 
     
    398398    init_key_signature(&hash,sig,key); 
    399399 
    400     if(sig->version == OPS_V4) 
     400    if(sig->info.version == OPS_V4) 
    401401        { 
    402402        ops_hash_add_int(&hash,0xb4,1); 
     
    430430    init_key_signature(&hash,sig,key); 
    431431 
    432     if(sig->version == OPS_V4) 
     432    if(sig->info.version == OPS_V4) 
    433433        { 
    434434        ops_hash_add_int(&hash,0xd1,1); 
     
    504504                         const ops_public_key_t *signer) 
    505505    { 
    506     if(sig->hash_algorithm != hash->algorithm) 
     506    if(sig->info.hash_algorithm != hash->algorithm) 
    507507        return ops_false; 
    508508 
     
    519519 
    520520    // write nearly up to the first subpacket 
    521     ops_write_scalar(sig->sig.version,1,sig->info); 
    522     ops_write_scalar(sig->sig.type,1,sig->info); 
    523     ops_write_scalar(sig->sig.key_algorithm,1,sig->info); 
    524     ops_write_scalar(sig->sig.hash_algorithm,1,sig->info); 
     521    ops_write_scalar(sig->sig.info.version,1,sig->info); 
     522    ops_write_scalar(sig->sig.info.type,1,sig->info); 
     523    ops_write_scalar(sig->sig.info.key_algorithm,1,sig->info); 
     524    ops_write_scalar(sig->sig.info.hash_algorithm,1,sig->info); 
    525525 
    526526    // dummy hashed subpacket count 
     
    550550    // use the buffered writer to construct packets (done), and also should 
    551551    // share code for hash calculation) 
    552     sig->sig.version=OPS_V4; 
    553     sig->sig.hash_algorithm=OPS_HASH_SHA1; 
    554     sig->sig.key_algorithm=key->algorithm; 
    555     sig->sig.type=type; 
     552    sig->sig.info.version=OPS_V4; 
     553    sig->sig.info.hash_algorithm=OPS_HASH_SHA1; 
     554    sig->sig.info.key_algorithm=key->algorithm; 
     555    sig->sig.info.type=type; 
    556556 
    557557    sig->hashed_data_length=-1; 
     
    587587    // use the buffered writer to construct packets (done), and also should 
    588588    // share code for hash calculation) 
    589     sig->sig.version=OPS_V4; 
    590     sig->sig.key_algorithm=key->public_key.algorithm; 
    591     sig->sig.hash_algorithm=hash; 
    592     sig->sig.type=type; 
     589    sig->sig.info.version=OPS_V4; 
     590    sig->sig.info.key_algorithm=key->public_key.algorithm; 
     591    sig->sig.info.hash_algorithm=hash; 
     592    sig->sig.info.type=type; 
    593593 
    594594    sig->hashed_data_length=-1; 
     
    687687 
    688688    // add final trailer 
    689     ops_hash_add_int(&sig->hash,sig->sig.version,1); 
     689    ops_hash_add_int(&sig->hash,sig->sig.info.version,1); 
    690690    ops_hash_add_int(&sig->hash,0xff,1); 
    691691    // +6 for version, type, pk alg, hash alg, hashed subpacket length 
  • openpgpsdk/trunk/src/lib/validate.c

    r594 r602  
    5252 
    5353    //common_init_signature(&hash,sig); 
    54     ops_hash_any(&hash,sig->hash_algorithm); 
     54    ops_hash_any(&hash,sig->info.hash_algorithm); 
    5555    hash.init(&hash); 
    5656    hash.add(&hash,data,len); 
    57     hash.add(&hash,sig->v4_hashed_data,sig->v4_hashed_data_length); 
     57    hash.add(&hash,sig->info.v4_hashed_data,sig->info.v4_hashed_data_length); 
    5858 
    5959    trailer[0]=0x04; // version 
    6060    trailer[1]=0xFF; 
    61     hashedlen=sig->v4_hashed_data_length; 
     61    hashedlen=sig->info.v4_hashed_data_length; 
    6262    trailer[2]=hashedlen >> 24; 
    6363    trailer[3]=hashedlen >> 16; 
     
    102102 */ 
    103103 
    104 static void add_key_to_valid_list(ops_validate_result_t * result, const ops_keydata_t *signer) 
     104static void free_signature_info(ops_signature_info_t *sig) 
     105    { 
     106    free (sig->v4_hashed_data); 
     107    free (sig); 
     108    } 
     109 
     110static void copy_signature_info(ops_signature_info_t* dst, const ops_signature_info_t* src) 
     111    { 
     112    memcpy(dst,src,sizeof *src); 
     113    dst->v4_hashed_data=ops_mallocz(src->v4_hashed_data_length); 
     114    memcpy(dst->v4_hashed_data,src->v4_hashed_data,src->v4_hashed_data_length); 
     115    } 
     116 
     117static void add_sig_to_valid_list(ops_validate_result_t * result, const ops_signature_info_t* sig) 
    105118    { 
    106119    size_t newsize; 
     
    111124 
    112125    // increase size of array 
    113     newsize=(sizeof *signer) * result->valid_count; 
    114     if (!result->valid_keys) 
    115         result->valid_keys=malloc(newsize); 
     126    newsize=(sizeof *sig) * result->valid_count; 
     127    if (!result->valid_sigs) 
     128        result->valid_sigs=malloc(newsize); 
    116129    else 
    117         result->valid_keys=realloc(result->valid_keys, newsize); 
     130        result->valid_sigs=realloc(result->valid_sigs, newsize); 
    118131 
    119132    // copy key ptr to array 
    120     start=(sizeof *signer) * (result->valid_count-1); 
    121     memcpy(result->valid_keys+start,signer,sizeof *signer); 
    122     } 
    123  
    124 static void add_key_to_invalid_list(ops_validate_result_t * result, const ops_keydata_t *signer
     133    start=(sizeof *sig) * (result->valid_count-1); 
     134    copy_signature_info(result->valid_sigs+start,sig); 
     135    } 
     136 
     137static void add_sig_to_invalid_list(ops_validate_result_t * result, const ops_signature_info_t *sig
    125138    { 
    126139    size_t newsize; 
     
    131144 
    132145    // increase size of array 
    133     newsize=(sizeof *signer) * result->invalid_count; 
    134     if (!result->invalid_keys) 
    135         result->invalid_keys=malloc(newsize); 
     146    newsize=(sizeof *sig) * result->invalid_count; 
     147    if (!result->invalid_sigs) 
     148        result->invalid_sigs=malloc(newsize); 
    136149    else 
    137         result->invalid_keys=realloc(result->invalid_keys, newsize); 
     150        result->invalid_sigs=realloc(result->invalid_sigs, newsize); 
    138151 
    139152    // copy key ptr to array 
    140     start=(sizeof *signer) * (result->invalid_count-1); 
    141     memcpy(result->invalid_keys+start,signer,(sizeof *signer)); 
    142     } 
    143  
    144 static void add_key_to_unknown_list(ops_validate_result_t * result, const unsigned char signer_id[OPS_KEY_ID_SIZE]
     153    start=(sizeof *sig) * (result->invalid_count-1); 
     154    copy_signature_info(result->invalid_sigs+start, sig); 
     155    } 
     156 
     157static void add_sig_to_unknown_list(ops_validate_result_t * result, const ops_signature_info_t *sig
    145158    { 
    146159    size_t newsize; 
     
    151164 
    152165    // increase size of array 
    153     newsize=(sizeof *signer_id) * result->unknown_signer_count; 
    154     if (!result->unknown_keys) 
    155         result->unknown_keys=malloc(newsize); 
     166    newsize=(sizeof *sig) * result->unknown_signer_count; 
     167    if (!result->unknown_sigs) 
     168        result->unknown_sigs=malloc(newsize); 
    156169    else 
    157         result->unknown_keys=realloc(result->unknown_keys, newsize); 
     170        result->unknown_sigs=realloc(result->unknown_sigs, newsize); 
    158171 
    159172    // copy key id to array 
    160173    start=OPS_KEY_ID_SIZE * (result->unknown_signer_count-1); 
    161     memcpy(result->unknown_keys+start, signer_id, OPS_KEY_ID_SIZE); 
     174    copy_signature_info(result->unknown_sigs+start, sig); 
    162175    } 
    163176 
     
    216229 
    217230        signer=ops_keyring_find_key_by_id(arg->keyring, 
    218                                            content->signature.signer_id); 
     231                                           content->signature.info.signer_id); 
    219232        if(!signer) 
    220233            { 
    221         add_key_to_unknown_list(arg->result, content->signature.signer_id); 
     234        add_sig_to_unknown_list(arg->result, &content->signature.info); 
    222235            break; 
    223236            } 
    224237 
    225         switch(content->signature.type) 
     238        switch(content->signature.info.type) 
    226239            { 
    227240        case OPS_CERT_GENERIC: 
     
    266279    case OPS_SIG_3RD_PARTY: 
    267280        OPS_ERROR_1(errors, OPS_E_UNIMPLEMENTED, 
    268                     "Verification of signature type 0x%02x not yet implemented\n", content->signature.type); 
     281                    "Verification of signature type 0x%02x not yet implemented\n", content->signature.info.type); 
    269282                    break; 
    270283 
    271284        default: 
    272285            OPS_ERROR_1(errors, OPS_E_UNIMPLEMENTED, 
    273                     "Unexpected signature type 0x%02x\n", content->signature.type); 
     286                    "Unexpected signature type 0x%02x\n", content->signature.info.type); 
    274287            } 
    275288 
     
    278291        //          printf(" validated\n"); 
    279292            //++arg->result->valid_count; 
    280         add_key_to_valid_list(arg->result, signer); 
     293        add_sig_to_valid_list(arg->result, &content->signature.info); 
    281294            } 
    282295        else 
     
    285298        //          printf(" BAD SIGNATURE\n"); 
    286299        //          ++arg->result->invalid_count; 
    287         add_key_to_invalid_list(arg->result, signer); 
     300        add_sig_to_invalid_list(arg->result, &content->signature.info); 
    288301            } 
    289302        break; 
     
    362375            printf("\n*** hashed data:\n"); 
    363376            unsigned int zzz=0; 
    364             for (zzz=0; zzz<content->signature.v4_hashed_data_length; zzz++) 
    365                 printf("0x%02x ", content->signature.v4_hashed_data[zzz]); 
     377            for (zzz=0; zzz<content->signature.info.v4_hashed_data_length; zzz++) 
     378                printf("0x%02x ", content->signature.info.v4_hashed_data[zzz]); 
    366379            printf("\n"); 
    367             printf("  type=%02x signer_id=",content->signature.type); 
    368             hexdump(content->signature.signer_id, 
    369                     sizeof content->signature.signer_id); 
     380            printf("  type=%02x signer_id=",content->signature.info.type); 
     381            hexdump(content->signature.info.signer_id, 
     382                    sizeof content->signature.info.signer_id); 
    370383            } 
    371384 
    372385        signer=ops_keyring_find_key_by_id(arg->keyring, 
    373                                           content->signature.signer_id); 
     386                                          content->signature.info.signer_id); 
    374387        if(!signer) 
    375388            { 
    376389            OPS_ERROR(errors,OPS_E_V_UNKNOWN_SIGNER,"Unknown Signer"); 
    377             add_key_to_unknown_list(arg->result, content->signature.signer_id); 
     390            add_sig_to_unknown_list(arg->result, &content->signature.info); 
    378391            break; 
    379392            } 
     
    382395        ops_memory_init(mem,128); 
    383396         
    384         switch(content->signature.type) 
     397        switch(content->signature.info.type) 
    385398            { 
    386399        case OPS_SIG_BINARY: 
     
    414427        default: 
    415428            OPS_ERROR_1(errors, OPS_E_UNIMPLEMENTED, 
    416                         "Verification of signature type 0x%02x not yet implemented\n", content->signature.type); 
     429                        "Verification of signature type 0x%02x not yet implemented\n", content->signature.info.type); 
    417430            break; 
    418431             
     
    422435        if(valid) 
    423436            { 
    424         add_key_to_valid_list(arg->result, signer); 
     437        add_sig_to_valid_list(arg->result, &content->signature.info); 
    425438        //          ++arg->result->valid_count; 
    426439            } 
     
    430443        //          printf(" BAD SIGNATURE\n"); 
    431444        //          ++arg->result->invalid_count; 
    432         add_key_to_invalid_list(arg->result, signer); 
     445        add_sig_to_invalid_list(arg->result, &content->signature.info); 
    433446            } 
    434447        break; 
     
    522535        return; 
    523536 
    524     if (result->valid_keys) 
    525         free(result->valid_keys); 
    526     if (result->invalid_keys) 
    527         free(result->invalid_keys); 
    528     if (result->unknown_keys) 
    529         free(result->unknown_keys); 
     537    if (result->valid_sigs) 
     538        free_signature_info(result->valid_sigs); 
     539    if (result->invalid_sigs) 
     540        free_signature_info(result->invalid_sigs); 
     541    if (result->unknown_sigs) 
     542        free_signature_info(result->unknown_sigs); 
    530543 
    531544    free(result); 
  • openpgpsdk/trunk/tests/test_common.c

    r574 r602  
    475475 
    476476        // example: print out the signature creation time 
    477         if (content_->content.signature.creation_time_set) 
     477        if (content_->content.signature.info.creation_time_set) 
    478478            { 
    479479            printf("\nsignature creation time : %s",  
    480                    ctime(&content_->content.signature.creation_time)); 
     480                   ctime(&content_->content.signature.info.creation_time)); 
    481481            } 
    482482        break; 
  • openpgpsdk/trunk/tests/test_rsa_keys.c

    r594 r602  
    144144    ops_validate_all_signatures(result, &pub_keyring, NULL); 
    145145    CU_ASSERT(result->valid_count==1); 
    146     CU_ASSERT(strncmp((char *)ops_get_key_id(&result->valid_keys[0]),(char *)keyid,strlen((char *)keyid))==0); 
    147     CU_ASSERT(strncmp((char *)ops_get_user_id(&result->valid_keys[0],0),userid,strlen(userid))==0); 
     146 
     147    CU_ASSERT(memcmp(result->valid_sigs[0].signer_id,keyid,OPS_KEY_ID_SIZE)==0); 
    148148    CU_ASSERT(result->invalid_count==0); 
    149149    CU_ASSERT(result->unknown_signer_count==0);