Changeset 707

Show
Ignore:
Timestamp:
05/15/12 12:25:47
Author:
ben
Message:

Fixes from Cyril Soler.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • openpgpsdk/trunk/CHANGES

    r703 r707  
    11Changes since V0.9 
    22================== 
     3 
     4  *) Memory leak fixes and some bug fixes. 
     5     [Cyril Soler <cyril.soler@imag.fr>] 
    36 
    47  *) Various warnings from gcc 4.6 fixed. 
  • openpgpsdk/trunk/include/openpgpsdk/crypto.h

    r701 r707  
    156156 
    157157// Hash everything that's read 
    158 void ops_reader_push_hash(ops_parse_info_t *pinfo,ops_hash_t *hash); 
     158void ops_reader_push_hash(ops_parse_info_t *pinfo, ops_hash_t *hash); 
    159159void ops_reader_pop_hash(ops_parse_info_t *pinfo); 
    160160 
    161 int ops_decrypt_and_unencode_mpi(unsigned char *buf,unsigned buflen,const BIGNUM *encmpi, 
    162                     const ops_secret_key_t *skey); 
     161int ops_decrypt_and_unencode_mpi(unsigned char *buf, 
     162                                 unsigned buflen, const BIGNUM *encmpi, 
     163                                 const ops_secret_key_t *skey); 
    163164ops_boolean_t ops_rsa_encrypt_mpi(const unsigned char *buf, const size_t buflen, 
    164                               const ops_public_key_t *pkey, 
    165                               ops_pk_session_key_parameters_t *spk); 
     165                                 const ops_public_key_t *pkey, 
     166                                 ops_pk_session_key_parameters_t *spk); 
    166167 
    167168 
     
    171172                             const struct ops_key_data *key); 
    172173 
    173 ops_boolean_t ops_encrypt_file(const char* input_filename, const char* output_filename, const ops_keydata_t *pub_key, const ops_boolean_t use_armour, const ops_boolean_t allow_overwrite); 
    174 ops_boolean_t ops_decrypt_file(const char* input_filename, const char* output_filename, ops_keyring_t *keyring, const ops_boolean_t use_armour, const ops_boolean_t allow_overwrite,ops_parse_cb_t* cb_get_passphrase); 
    175 extern void ops_encrypt_stream(ops_create_info_t* cinfo, const ops_keydata_t* public_key, const ops_secret_key_t* secret_key, const ops_boolean_t compress, const ops_boolean_t use_armour); 
    176  
     174ops_boolean_t ops_encrypt_file(const char* input_filename, 
     175                               const char* output_filename, const ops_keydata_t *pub_key, const ops_boolean_t use_armour, const ops_boolean_t allow_overwrite); 
     176ops_boolean_t ops_decrypt_file(const char* input_filename, 
     177                               const char* output_filename, 
     178                               ops_keyring_t *keyring, 
     179                               const ops_boolean_t use_armour, 
     180                               const ops_boolean_t allow_overwrite, 
     181                               ops_parse_cb_t* cb_get_passphrase); 
     182extern void ops_encrypt_stream(ops_create_info_t* cinfo, 
     183                               const ops_keydata_t* public_key, 
     184                               const ops_secret_key_t* secret_key, 
     185                               const ops_boolean_t compress, 
     186                               const ops_boolean_t use_armour); 
     187ops_boolean_t ops_decrypt_memory(const unsigned char *encrypted_memory, 
     188                                 int em_length, 
     189                                 unsigned char **decrypted_memory, 
     190                                 int *out_length,  ops_keyring_t* keyring, 
     191                                 const ops_boolean_t use_armour, 
     192                                 ops_parse_cb_t* cb_get_passphrase) ; 
    177193// Keys 
    178 ops_boolean_t ops_rsa_generate_keypair(const int numbits, const unsigned long e, ops_keydata_t* keydata); 
    179 ops_keydata_t* ops_rsa_create_selfsigned_keypair(const int numbits, const unsigned long e, ops_user_id_t * userid); 
     194ops_boolean_t ops_rsa_generate_keypair(const int numbits, const unsigned long e, 
     195                                       ops_keydata_t* keydata); 
     196ops_keydata_t* ops_rsa_create_selfsigned_keypair(const int numbits, 
     197                                                 const unsigned long e, 
     198                                                 ops_user_id_t * userid); 
    180199 
    181200int ops_dsa_size(const ops_dsa_public_key_t *dsa); 
    182 DSA_SIG* ops_dsa_sign(unsigned char* hashbuf, unsigned hashsize, const ops_dsa_secret_key_t *sdsa, const ops_dsa_public_key_t *dsa); 
     201DSA_SIG* ops_dsa_sign(unsigned char* hashbuf, unsigned hashsize, 
     202                      const ops_dsa_secret_key_t *sdsa, 
     203                      const ops_dsa_public_key_t *dsa); 
    183204#endif 
  • openpgpsdk/trunk/include/openpgpsdk/keyring.h

    r612 r707  
    4949                               const char* userid); 
    5050void ops_keydata_free(ops_keydata_t *key); 
     51void ops_keydata_copy(ops_keydata_t *dst, const ops_keydata_t *src); 
    5152void ops_keyring_free(ops_keyring_t *keyring); 
    5253void ops_dump_keyring(const ops_keyring_t *keyring); 
     
    6162                                                   const char *pphrase); 
    6263 
    63 ops_boolean_t ops_keyring_read_from_file(ops_keyring_t *keyring, const ops_boolean_t armour, const char *filename); 
    64 ops_boolean_t ops_keyring_read_from_mem(ops_keyring_t *keyring, const ops_boolean_t armour, ops_memory_t *mem); 
     64ops_boolean_t ops_keyring_read_from_file(ops_keyring_t *keyring, 
     65                                         const ops_boolean_t armour, 
     66                                         const char *filename); 
     67ops_boolean_t ops_keyring_read_from_mem(ops_keyring_t *keyring, 
     68                                        const ops_boolean_t armour, 
     69                                        ops_memory_t *mem); 
     70ops_boolean_t ops_write_keyring_to_file(const ops_keyring_t *keyring, 
     71                                        ops_boolean_t armoured, 
     72                                        const char *filename); 
    6573 
    6674char *ops_malloc_passphrase(char *passphrase); 
     
    6977void ops_keyring_list(const ops_keyring_t* keyring); 
    7078 
    71 void ops_set_secret_key(ops_parser_content_union_t* content,const ops_keydata_t *key); 
     79void ops_set_secret_key(ops_parser_content_union_t* content, 
     80                        const ops_keydata_t *key); 
    7281 
    7382const unsigned char* ops_get_key_id(const ops_keydata_t *key); 
     
    7584const unsigned char* ops_get_user_id(const ops_keydata_t *key, unsigned index); 
    7685ops_boolean_t ops_is_key_supported(const ops_keydata_t *key); 
    77 const ops_keydata_t* ops_keyring_get_key_by_index(const ops_keyring_t *keyring, int index); 
     86const ops_keydata_t* ops_keyring_get_key_by_index(const ops_keyring_t *keyring, 
     87                                                  int index); 
    7888 
    79 ops_user_id_t* ops_add_userid_to_keydata(ops_keydata_t* keydata, const ops_user_id_t* userid); 
    80 ops_packet_t* ops_add_packet_to_keydata(ops_keydata_t* keydata, const ops_packet_t* packet); 
    81 void ops_add_signed_userid_to_keydata(ops_keydata_t* keydata, const ops_user_id_t* userid, const ops_packet_t* packet); 
     89ops_user_id_t* ops_add_userid_to_keydata(ops_keydata_t *keydata, 
     90                                         const ops_user_id_t *userid); 
     91ops_packet_t* ops_add_packet_to_keydata(ops_keydata_t* keydata, 
     92                                        const ops_packet_t *packet); 
     93void ops_add_signed_userid_to_keydata(ops_keydata_t *keydata, 
     94                                      const ops_user_id_t *userid, 
     95                                      const ops_packet_t* packet); 
    8296 
    83 ops_boolean_t ops_add_selfsigned_userid_to_keydata(ops_keydata_t* keydata, ops_user_id_t* userid); 
     97ops_boolean_t ops_add_selfsigned_userid_to_keydata(ops_keydata_t *keydata, 
     98                                                   ops_user_id_t *userid); 
    8499 
    85100ops_keydata_t *ops_keydata_new(void); 
    86 void ops_keydata_init(ops_keydata_t* keydata, const ops_content_tag_t type); 
     101void ops_keydata_init(ops_keydata_t *keydata, const ops_content_tag_t type); 
    87102 
    88103#endif 
  • openpgpsdk/trunk/include/openpgpsdk/packet.h

    r705 r707  
    126126 */ 
    127127#define OPS_PTAG_NF_CONTENT_TAG_SHIFT   0 
    128  
    129  
    130128 
    131129 
     
    698696    { 
    699697    unsigned                    length; 
    700     unsigned char               data[8192]
     698    unsigned char               *data
    701699    } ops_literal_data_body_t; 
    702700 
     
    744742    { 
    745743    unsigned                    length; 
    746     unsigned char               data[8192]; // \todo fix hard-coded value? 
     744    unsigned char               *data; 
    747745    } ops_signed_cleartext_body_t; 
    748746 
     
    916914void ops_keyid(unsigned char keyid[OPS_KEY_ID_SIZE], 
    917915               const ops_public_key_t *key); 
    918 void ops_fingerprint(ops_fingerprint_t *fp,const ops_public_key_t *key); 
     916void ops_fingerprint(ops_fingerprint_t *fp, const ops_public_key_t *key); 
    919917void ops_public_key_free(ops_public_key_t *key); 
     918void ops_public_key_copy(ops_public_key_t *dst, const ops_public_key_t *src); 
    920919void ops_user_id_free(ops_user_id_t *id); 
    921920void ops_user_attribute_free(ops_user_attribute_t *att); 
     
    941940void ops_parser_content_free(ops_parser_content_t *c); 
    942941void ops_secret_key_free(ops_secret_key_t *key); 
     942void ops_secret_key_copy(ops_secret_key_t *dst, const ops_secret_key_t *src); 
    943943void ops_pk_session_key_free(ops_pk_session_key_t *sk); 
    944944 
  • openpgpsdk/trunk/include/openpgpsdk/signature.h

    r701 r707  
    8888 
    8989// Standard Interface 
    90 ops_boolean_t ops_sign_file_as_cleartext(const char* input_filename, const char* output_filename, const ops_secret_key_t *skey, const ops_boolean_t overwrite); 
    91 ops_boolean_t ops_sign_buf_as_cleartext(const char* input, const size_t len, ops_memory_t** output, const ops_secret_key_t *skey); 
    92 ops_boolean_t ops_sign_file(const char* input_filename, const char* output_filename, const ops_secret_key_t *skey, const ops_boolean_t use_armour, const ops_boolean_t overwrite); 
    93 ops_memory_t * ops_sign_buf(const void* input, const size_t input_len, const ops_sig_type_t sig_type,  const ops_secret_key_t *skey, const ops_boolean_t use_armour); 
    94 ops_boolean_t ops_writer_push_signed(ops_create_info_t *cinfo, const ops_sig_type_t sig_type, const ops_secret_key_t *skey); 
     90ops_boolean_t ops_sign_file_as_cleartext(const char* input_filename, 
     91                                         const char* output_filename, 
     92                                         const ops_secret_key_t *skey, 
     93                                         const ops_boolean_t overwrite); 
     94ops_boolean_t ops_sign_buf_as_cleartext(const char* input, 
     95                                        const size_t len, ops_memory_t** output, 
     96                                        const ops_secret_key_t *skey); 
     97ops_boolean_t ops_sign_file(const char* input_filename, 
     98                            const char* output_filename, 
     99                            const ops_secret_key_t *skey, 
     100                            const ops_boolean_t use_armour, 
     101                            const ops_boolean_t overwrite); 
     102ops_memory_t * ops_sign_buf(const void* input, 
     103                            const size_t input_len, 
     104                            const ops_sig_type_t sig_type, 
     105                            const ops_secret_key_t *skey, 
     106                            const ops_boolean_t use_armour, 
     107                            ops_boolean_t include_data); 
     108ops_boolean_t ops_writer_push_signed(ops_create_info_t *cinfo, 
     109                                     const ops_sig_type_t sig_type, 
     110                                     const ops_secret_key_t *skey); 
    95111 
    96112#endif 
  • openpgpsdk/trunk/include/openpgpsdk/types.h

    r701 r707  
    4343typedef unsigned ops_boolean_t; 
    4444 
     45/** ops_content_tag_t */ 
     46 
    4547/* PTag Content Tags */ 
    4648/***************************/ 
     
    5355 * \see RFC4880 5.2.3.1 
    5456 */ 
     57 
     58#ifndef __cplusplus 
     59typedef enum ops_content_tag_t ops_content_tag_t ; 
     60#endif 
     61 
    5562enum ops_content_tag_t 
    5663    { 
     
    146153    OPS_PARSER_CMD_GET_SK_PASSPHRASE    =0x400, 
    147154    OPS_PARSER_CMD_GET_SECRET_KEY       =0x400+1, 
     155    OPS_PARSER_CMD_GET_SK_PASSPHRASE_PREV_WAS_BAD =0x400+2, 
    148156 
    149157 
     
    153161    }; 
    154162 
    155 /** ops_content_tag_t */ 
    156 typedef enum ops_content_tag_t ops_content_tag_t; 
     163/** Used to specify whether subpackets should be returned raw, parsed or ignored. 
     164 */ 
     165 
     166enum ops_parse_type_t 
     167    { 
     168    OPS_PARSE_RAW,      /*!< Callback Raw */ 
     169    OPS_PARSE_PARSED,   /*!< Callback Parsed */ 
     170    OPS_PARSE_IGNORE,   /*!< Don't callback */ 
     171    }; 
    157172 
    158173typedef struct _ops_crypt_t ops_crypt_t; 
     
    179194/** Used to specify whether subpackets should be returned raw, parsed or ignored. 
    180195 */ 
    181 enum ops_parse_type_t 
    182     { 
    183     OPS_PARSE_RAW,      /*!< Callback Raw */ 
    184     OPS_PARSE_PARSED,   /*!< Callback Parsed */ 
    185     OPS_PARSE_IGNORE,   /*!< Don't callback */ 
    186     }; 
    187196 
    188197typedef enum ops_parse_type_t ops_parse_type_t; 
  • openpgpsdk/trunk/include/openpgpsdk/validate.h

    r683 r707  
    7979        SIGNED_CLEARTEXT 
    8080        } use; /*<! this is set to indicate what kind of data we have */ 
     81 
    8182    union 
    82         { 
    83         ops_literal_data_body_t literal_data_body; /*<! Used to hold Literal Data */ 
    84         ops_signed_cleartext_body_t signed_cleartext_body; /*<! Used to hold Signed Cleartext */ 
    85         } data; /*<! the data itself */ 
     83        { 
     84        ops_literal_data_body_t literal_data_body; /*<! Used to hold Literal Data */ 
     85        ops_signed_cleartext_body_t signed_cleartext_body; /*<! Used to hold Signed Cleartext */ 
     86        } data; 
     87 
    8688    unsigned char hash[OPS_MAX_HASH_SIZE]; /*<! the hash */ 
    8789    const ops_keyring_t *keyring; /*<! keyring to use */ 
     
    99101ops_boolean_t ops_validate_file(ops_validate_result_t* result, const char* filename, const int armoured, const ops_keyring_t* keyring); 
    100102ops_boolean_t ops_validate_mem(ops_validate_result_t *result, ops_memory_t* mem, const int armoured, const ops_keyring_t* keyring); 
    101  
    102 // EOF 
     103ops_boolean_t ops_validate_detached_signature(const void *literal_data, unsigned int literal_data_length, const unsigned char *signature_packet, unsigned int signature_packet_length,const ops_keydata_t *signers_key) ; 
  • openpgpsdk/trunk/src/lib/create.c

    r701 r707  
    129129 
    130130    default: 
     131        fprintf(stderr,"Bad algorithm type in key: %d\n",key->algorithm) ; 
    131132        assert(!"unknown key algorithm"); 
    132133        } 
     
    383384           || !ops_write_mpi(key->key.rsa.q,info) 
    384385           || !ops_write_mpi(key->key.rsa.u,info)) 
    385         { 
    386         if (debug) 
    387             { fprintf(stderr,"4 x mpi not written - problem\n"); } 
     386           { 
     387           if (debug) 
     388                fprintf(stderr,"4 x mpi not written - problem\n"); 
    388389            return ops_false; 
    389         } 
     390           } 
    390391 
    391392        break; 
     
    403404 
    404405    ops_writer_pop(info); 
    405      
     406 
     407    free(crypt.encrypt_key); 
     408    free(crypt.decrypt_key); 
     409 
    406410    return ops_true; 
    407  
     411    
    408412 
    409413 
  • openpgpsdk/trunk/src/lib/crypto.c

    r701 r707  
    180180 
    181181    ops_create_info_t *cinfo; 
    182  
     182#ifdef WINDOWS_SYS 
    183183    fd_in=open(input_filename, O_RDONLY | O_BINARY); 
     184#else 
     185    fd_in=open(input_filename, O_RDONLY ); 
     186#endif 
    184187    if(fd_in < 0) 
    185188        { 
     
    265268    else 
    266269        ops_writer_push_literal(cinfo); 
     270    } 
     271 
     272/** 
     273   \ingroup HighLevel_Crypto 
     274   \brief Decrypt a chunk of memory, containing a encrypted stream. 
     275   \param input_filename Name of file to be decrypted 
     276   \param output_filename Name of file to write to. If NULL, the filename is constructed from the input filename, following GPG conventions. 
     277   \param keyring Keyring to use 
     278   \param use_armour Expect armoured text, if set 
     279   \param allow_overwrite Allow output file to overwritten, if set. 
     280   \param cb_get_passphrase Callback to use to get passphrase 
     281*/ 
     282 
     283ops_boolean_t ops_decrypt_memory(const unsigned char *encrypted_memory, 
     284                                 int em_length, 
     285                                 unsigned char **decrypted_memory, 
     286                                 int *out_length, ops_keyring_t *keyring, 
     287                                 const ops_boolean_t use_armour, 
     288                                 ops_parse_cb_t *cb_get_passphrase) 
     289    { 
     290 
     291    // 
     292    ops_parse_info_t *pinfo=NULL; 
     293 
     294    // setup for reading from given input file 
     295 
     296    ops_memory_t *input_mem = ops_memory_new() ; 
     297    ops_memory_add(input_mem,encrypted_memory,em_length) ; 
     298 
     299    ops_setup_memory_read(&pinfo, input_mem, NULL, callback_write_parsed, 
     300                          ops_false); 
     301 
     302    if (pinfo == NULL) 
     303         { 
     304         perror("cannot create memory read"); 
     305         return ops_false; 
     306         } 
     307 
     308    // setup memory chunk  
     309 
     310    ops_memory_t *output_mem = ops_memory_new() ; 
     311 
     312    ops_setup_memory_write(&pinfo->cbinfo.cinfo, &output_mem,0) ; 
     313 
     314    if (output_mem == NULL) 
     315        {  
     316        perror("Cannot create output memory");  
     317        ops_teardown_memory_read(pinfo, input_mem); 
     318        return ops_false; 
     319        } 
     320 
     321    // \todo check for suffix matching armour param 
     322 
     323    // setup keyring and passphrase callback 
     324    pinfo->cbinfo.cryptinfo.keyring=keyring; 
     325    pinfo->cbinfo.cryptinfo.cb_get_passphrase=cb_get_passphrase; 
     326 
     327    // Set up armour/passphrase options 
     328 
     329    if (use_armour) 
     330        ops_reader_push_dearmour(pinfo); 
     331     
     332    // Do it 
     333 
     334    ops_parse_and_print_errors(pinfo); 
     335 
     336    // Unsetup 
     337 
     338    if (use_armour) 
     339        ops_reader_pop_dearmour(pinfo); 
     340 
     341    ops_boolean_t res = ops_true; 
     342 
     343    // copy output memory to supplied buffer. 
     344    // 
     345    *out_length = ops_memory_get_length(output_mem); 
     346    *decrypted_memory = ops_mallocz(*out_length); 
     347    memcpy(*decrypted_memory, ops_memory_get_data(output_mem), *out_length); 
     348 
     349    ops_teardown_memory_write(pinfo->cbinfo.cinfo, output_mem); 
     350    ops_teardown_memory_read(pinfo, input_mem); 
     351 
     352    return res; 
    267353    } 
    268354 
     
    420506 
    421507    case OPS_PARSER_CMD_GET_SK_PASSPHRASE: 
     508    case OPS_PARSER_CMD_GET_SK_PASSPHRASE_PREV_WAS_BAD: 
    422509        //        return callback_cmd_get_secret_key_passphrase(content_,cbinfo); 
    423510        return cbinfo->cryptinfo.cb_get_passphrase(content_, cbinfo); 
  • openpgpsdk/trunk/src/lib/keyring.c

    r704 r707  
    7979    keydata->npackets=0; 
    8080 
     81    free(keydata->sigs); 
     82 
    8183    if(keydata->type == OPS_PTAG_CT_PUBLIC_KEY) 
    8284        ops_public_key_free(&keydata->key.pkey); 
    8385    else 
    8486        ops_secret_key_free(&keydata->key.skey); 
    85  
    8687    } 
    8788 
     
    101102    free(keydata); 
    102103    } 
     104 
     105// \todo check where userid pointers are copied 
     106/** 
     107\ingroup Core_Keys 
     108\brief Copy user id, including contents 
     109\param dst Destination User ID 
     110\param src Source User ID 
     111\note If dst already has a user_id, it will be freed. 
     112*/ 
     113void ops_copy_userid(ops_user_id_t* dst, const ops_user_id_t* src) 
     114    { 
     115    int len=strlen((char *)src->user_id); 
     116    if (dst->user_id) 
     117        free(dst->user_id); 
     118    dst->user_id=ops_mallocz(len+1); 
     119 
     120    memcpy(dst->user_id, src->user_id, len); 
     121    } 
     122// \todo check where pkt pointers are copied 
     123/** 
     124\ingroup Core_Keys 
     125\brief Copy packet, including contents 
     126\param dst Destination packet 
     127\param src Source packet 
     128\note If dst already has a packet, it will be freed. 
     129*/ 
     130void ops_copy_packet(ops_packet_t* dst, const ops_packet_t* src) 
     131    { 
     132    if (dst->raw) 
     133        free(dst->raw); 
     134    dst->raw=ops_mallocz(src->length); 
     135 
     136    dst->length=src->length; 
     137    memcpy(dst->raw, src->raw, src->length); 
     138    } 
     139 
     140 
     141 
     142/** 
     143\ingroup Core_Keys 
     144\brief Copies entire key data 
     145\param dst Destination key where to copy 
     146\param src Source key to copy 
     147*/ 
     148void ops_keydata_copy(ops_keydata_t *dst,const ops_keydata_t *src) 
     149    { 
     150    unsigned n; 
     151 
     152    memset(dst, 0, sizeof(ops_keydata_t)); 
     153 
     154    dst->uids = (ops_user_id_t*)ops_mallocz(src->nuids * sizeof(ops_user_id_t)); 
     155    dst->nuids = src->nuids; 
     156    dst->nuids_allocated = src->nuids; 
     157 
     158    for(n=0 ; n < src->nuids ; ++n) 
     159        ops_copy_userid(&dst->uids[n],&src->uids[n]); 
     160 
     161    dst->packets = (ops_packet_t*)ops_mallocz(src->npackets * sizeof(ops_packet_t)); 
     162    dst->npackets = src->npackets; 
     163    dst->npackets_allocated = src->npackets; 
     164 
     165    for(n=0 ; n < src->npackets ; ++n) 
     166        ops_copy_packet(&(dst->packets[n]),&(src->packets[n])); 
     167 
     168    dst->nsigs = src->nsigs; 
     169    dst->sigs = (sigpacket_t*)ops_mallocz(src->nsigs * sizeof(sigpacket_t)); 
     170    dst->nsigs_allocated = src->nsigs; 
     171 
     172    for(n=0 ; n < src->nsigs ; ++n) 
     173        { 
     174        dst->sigs[n].userid = (ops_user_id_t*)ops_mallocz(sizeof(ops_user_id_t)); 
     175        dst->sigs[n].packet = (ops_packet_t*)ops_mallocz(sizeof(ops_packet_t)); 
     176        ops_copy_userid(dst->sigs[n].userid,src->sigs[n].userid); 
     177        ops_copy_packet(dst->sigs[n].packet,src->sigs[n].packet); 
     178        } 
     179 
     180    dst->key_id[0] = src->key_id[0]; 
     181    dst->key_id[1] = src->key_id[1]; 
     182    dst->key_id[2] = src->key_id[2]; 
     183    dst->key_id[3] = src->key_id[3]; 
     184    dst->key_id[4] = src->key_id[4]; 
     185    dst->key_id[5] = src->key_id[5]; 
     186    dst->key_id[6] = src->key_id[6]; 
     187    dst->key_id[7] = src->key_id[7]; 
     188    dst->type = src->type; 
     189    dst->key = src->key; 
     190    dst->fingerprint = src->fingerprint; 
     191 
     192    if(src->type == OPS_PTAG_CT_PUBLIC_KEY) 
     193        ops_public_key_copy(&dst->key.pkey,&src->key.pkey); 
     194    else                   
     195        ops_secret_key_copy(&dst->key.skey,&src->key.skey); 
     196    } 
     197 
    103198 
    104199/** 
     
    267362    ops_parse(pinfo); 
    268363 
     364    ops_parse_info_delete(pinfo); 
     365 
    269366    return arg.skey; 
    270367    } 
     
    363460        return NULL; 
    364461    return &keyring->keys[index];  
    365     } 
    366  
    367 // \todo check where userid pointers are copied 
    368 /** 
    369 \ingroup Core_Keys 
    370 \brief Copy user id, including contents 
    371 \param dst Destination User ID 
    372 \param src Source User ID 
    373 \note If dst already has a user_id, it will be freed. 
    374 */ 
    375 void ops_copy_userid(ops_user_id_t* dst, const ops_user_id_t* src) 
    376     { 
    377     int len=strlen((char *)src->user_id); 
    378     if (dst->user_id) 
    379         free(dst->user_id); 
    380     dst->user_id=ops_mallocz(len+1); 
    381  
    382     memcpy(dst->user_id, src->user_id, len); 
    383     } 
    384  
    385 // \todo check where pkt pointers are copied 
    386 /** 
    387 \ingroup Core_Keys 
    388 \brief Copy packet, including contents 
    389 \param dst Destination packet 
    390 \param src Source packet 
    391 \note If dst already has a packet, it will be freed. 
    392 */ 
    393 void ops_copy_packet(ops_packet_t* dst, const ops_packet_t* src) 
    394     { 
    395     if (dst->raw) 
    396         free(dst->raw); 
    397     dst->raw=ops_mallocz(src->length); 
    398  
    399     dst->length=src->length; 
    400     memcpy(dst->raw, src->raw, src->length); 
    401462    } 
    402463 
     
    624685    //    ops_parse_options(pinfo,OPS_PTAG_SS_ALL,OPS_PARSE_RAW); 
    625686    ops_parse_options(pinfo,OPS_PTAG_SS_ALL,OPS_PARSE_PARSED); 
    626  
    627687    fd=open(filename,O_RDONLY | O_BINARY); 
    628688    if(fd < 0) 
     
    907967    } 
    908968 
     969/** 
     970   \ingroup HighLevel_KeyringList 
     971 
     972   \brief Saves keyring to specified file 
     973 
     974   \param keyring  Keyring to save 
     975   \param armoured Save in ascii armoured format 
     976   \param output filename 
     977 
     978   \return ops_true is anything when ok 
     979*/ 
     980 
     981ops_boolean_t ops_write_keyring_to_file(const ops_keyring_t *keyring,ops_boolean_t armoured,const char *filename) 
     982    { 
     983    ops_create_info_t *info; 
     984    int fd = ops_setup_file_write(&info, filename, ops_true); 
     985 
     986    if (fd < 0)  
     987        { 
     988        fprintf(stderr,"ops_write_keyring(): ERROR: Cannot write to %s\n", 
     989                filename); 
     990        return ops_false; 
     991        } 
     992 
     993    int i; 
     994    for(i=0 ; i<keyring->nkeys ; ++i) 
     995        if(keyring->keys[i].key.pkey.algorithm  == OPS_PKA_RSA) 
     996            ops_write_transferable_public_key(&keyring->keys[i],armoured,info); 
     997        else 
     998            { 
     999            fprintf(stdout, "ops_write_keyring: not writing key. Algorithm not handled: "); 
     1000            ops_print_public_keydata(&keyring->keys[i]); 
     1001            fprintf(stdout, "\n"); 
     1002            } 
     1003 
     1004    ops_writer_close(info); 
     1005    ops_create_info_delete(info); 
     1006 
     1007    return ops_true; 
     1008    } 
     1009 
    9091010/*\@}*/ 
    9101011 
  • openpgpsdk/trunk/src/lib/openssl_crypto.c

    r661 r707  
    747747        { 
    748748        ops_keydata_free(keydata); 
     749        free(keydata); 
    749750        return NULL; 
    750751        } 
  • openpgpsdk/trunk/src/lib/packet-parse.c

    r705 r707  
    922922 
    923923    case OPS_PARSER_CMD_GET_SK_PASSPHRASE: 
     924    case OPS_PARSER_CMD_GET_SK_PASSPHRASE_PREV_WAS_BAD: 
    924925        ops_cmd_get_passphrase_free(&c->content.secret_key_passphrase); 
    925926        break; 
     
    998999    } 
    9991000 
     1001void ops_public_key_copy(ops_public_key_t *dst,const ops_public_key_t *src) 
     1002    { 
     1003    *dst = *src ; 
     1004 
     1005    switch(src->algorithm) 
     1006        { 
     1007    case OPS_PKA_RSA: 
     1008    case OPS_PKA_RSA_ENCRYPT_ONLY: 
     1009    case OPS_PKA_RSA_SIGN_ONLY: 
     1010        dst->key.rsa.n = BN_dup(src->key.rsa.n); 
     1011        dst->key.rsa.e = BN_dup(src->key.rsa.e); 
     1012        break; 
     1013 
     1014    case OPS_PKA_DSA: 
     1015        dst->key.dsa.p = BN_dup(src->key.dsa.p); 
     1016        dst->key.dsa.q = BN_dup(src->key.dsa.q); 
     1017        dst->key.dsa.g = BN_dup(src->key.dsa.g); 
     1018        dst->key.dsa.y = BN_dup(src->key.dsa.y); 
     1019        break; 
     1020 
     1021    case OPS_PKA_ELGAMAL: 
     1022    case OPS_PKA_ELGAMAL_ENCRYPT_OR_SIGN: 
     1023        dst->key.elgamal.p = BN_dup(src->key.elgamal.p); 
     1024        dst->key.elgamal.g = BN_dup(src->key.elgamal.g); 
     1025        dst->key.elgamal.y = BN_dup(src->key.elgamal.y); 
     1026        break; 
     1027 
     1028        //case 0: 
     1029        // nothing to free 
     1030        //   break; 
     1031 
     1032    default: 
     1033        assert(0); 
     1034        } 
     1035    } 
     1036 
     1037 
    10001038/** 
    10011039   \ingroup Core_ReadPackets 
    10021040*/ 
    1003 static int parse_public_key_data(ops_public_key_t *key,ops_region_t *region, 
     1041static int parse_public_key_data(ops_public_key_t *key, ops_region_t *region, 
    10041042                                 ops_parse_info_t *pinfo) 
    10051043    { 
     
    12141252 
    12151253    CBP(pinfo,OPS_PTAG_CT_USER_ID,&content); 
     1254 
    12161255    return 1; 
    12171256    } 
     
    20732112        unsigned l=region->length-region->length_read; 
    20742113 
    2075         if(l > sizeof C.literal_data_body.data) 
    2076             l=sizeof C.literal_data_body.data; 
     2114        C.literal_data_body.data = (unsigned char *)malloc(l) ; 
    20772115 
    20782116        if(!limited_read(C.literal_data_body.data,l,region,pinfo)) 
     
    21212159 
    21222160    ops_public_key_free(&key->public_key); 
     2161    } 
     2162 
     2163void ops_secret_key_copy(ops_secret_key_t *dst,const ops_secret_key_t *src) 
     2164    { 
     2165    *dst = *src ; 
     2166    ops_public_key_copy(&dst->public_key,&src->public_key); 
     2167 
     2168    switch(src->public_key.algorithm) 
     2169        { 
     2170    case OPS_PKA_RSA: 
     2171    case OPS_PKA_RSA_ENCRYPT_ONLY: 
     2172    case OPS_PKA_RSA_SIGN_ONLY: 
     2173        dst->key.rsa.d = BN_dup(src->key.rsa.d) ; 
     2174        dst->key.rsa.p = BN_dup(src->key.rsa.p) ; 
     2175        dst->key.rsa.q = BN_dup(src->key.rsa.q) ; 
     2176        dst->key.rsa.u = BN_dup(src->key.rsa.u) ; 
     2177        break; 
     2178 
     2179    case OPS_PKA_DSA: 
     2180        dst->key.dsa.x = BN_dup(src->key.dsa.x) ; 
     2181        break; 
     2182 
     2183    default: 
     2184        fprintf(stderr,"ops_secret_key_copy: Unknown algorithm: %d (%s)\n", 
     2185                src->public_key.algorithm, 
     2186                ops_show_pka(src->public_key.algorithm)); 
     2187        //assert(0); 
     2188        } 
    21232189    } 
    21242190 
     
    29703036        pinfo->rinfo.asize=0; 
    29713037        } 
     3038    else 
     3039       C.packet.raw = NULL ; 
     3040 
    29723041    pinfo->rinfo.alength=0; 
    29733042         
  • openpgpsdk/trunk/src/lib/reader_armoured.c

    r625 r707  
    388388    hash->init(hash); 
    389389 
     390#define BODYSIZE 4096 
     391    body->data = malloc(BODYSIZE); 
    390392    body->length=0; 
    391393    total=0; 
     
    434436        body->data[body->length++]=c; 
    435437        ++total; 
    436         if(body->length == sizeof body->data
     438        if(body->length == BODYSIZE
    437439            { 
    438440            if (debug) 
     
    446448    assert(body->length == 1); 
    447449    /* don't send that one character, because its part of the trailer. */ 
     450 
     451    free(body->data); 
    448452 
    449453    trailer->hash=hash; 
  • openpgpsdk/trunk/src/lib/readerwriter.c

    r671 r707  
    338338 
    339339ops_parse_cb_return_t 
    340 callback_cmd_get_secret_key(const ops_parser_content_t *content_,ops_parse_cb_info_t *cbinfo) 
    341     { 
    342     ops_parser_content_union_t* content=(ops_parser_content_union_t *)&content_->content; 
     340callback_cmd_get_secret_key(const ops_parser_content_t *content_, 
     341                            ops_parse_cb_info_t *cbinfo) 
     342    { 
     343    const ops_parser_content_union_t* content=&content_->content; 
    343344    const ops_secret_key_t *secret; 
    344345    ops_parser_content_t pc; 
    345346 
    346347    OPS_USED(cbinfo); 
    347  
    348 //    ops_print_packet(content_); 
    349348 
    350349    switch(content_->tag) 
    351350        { 
    352351    case OPS_PARSER_CMD_GET_SECRET_KEY: 
    353         cbinfo->cryptinfo.keydata=ops_keyring_find_key_by_id(cbinfo->cryptinfo.keyring,content->get_secret_key.pk_session_key->key_id); 
    354         if (!cbinfo->cryptinfo.keydata || !ops_is_key_secret(cbinfo->cryptinfo.keydata)) 
     352        cbinfo->cryptinfo.keydata =  
     353            ops_keyring_find_key_by_id(cbinfo->cryptinfo.keyring, 
     354                               content->get_secret_key.pk_session_key->key_id); 
     355        if (!cbinfo->cryptinfo.keydata 
     356            || !ops_is_key_secret(cbinfo->cryptinfo.keydata)) 
    355357            return 0; 
    356358 
    357359        /* now get the key from the data */ 
    358360        secret=ops_get_secret_key_from_data(cbinfo->cryptinfo.keydata); 
    359         while(!secret) 
     361        int tag_to_use = OPS_PARSER_CMD_GET_SK_PASSPHRASE ; 
     362        int nbtries = 0 ; 
     363 
     364        while( (!secret) && nbtries++ < 3) 
    360365            { 
    361366            if (!cbinfo->cryptinfo.passphrase) 
    362367                { 
    363368                memset(&pc,'\0',sizeof pc); 
    364                 pc.content.secret_key_passphrase.passphrase=&cbinfo->cryptinfo.passphrase; 
    365                 CB(cbinfo,OPS_PARSER_CMD_GET_SK_PASSPHRASE,&pc); 
     369                pc.content.secret_key_passphrase.passphrase= 
     370                    &cbinfo->cryptinfo.passphrase; 
     371                CB(cbinfo, tag_to_use, &pc); 
    366372                if (!cbinfo->cryptinfo.passphrase) 
    367373                    { 
     
    371377                } 
    372378            /* then it must be encrypted */ 
    373             secret=ops_decrypt_secret_key_from_data(cbinfo->cryptinfo.keydata,cbinfo->cryptinfo.passphrase); 
     379            secret=ops_decrypt_secret_key_from_data(cbinfo->cryptinfo.keydata, 
     380                                                  cbinfo->cryptinfo.passphrase); 
     381             
     382            free(cbinfo->cryptinfo.passphrase) ; 
     383            cbinfo->cryptinfo.passphrase = NULL ; 
     384            tag_to_use = OPS_PARSER_CMD_GET_SK_PASSPHRASE_PREV_WAS_BAD ; 
    374385            } 
    375          
     386 
     387        if(!secret) 
     388            return 0; 
     389 
    376390        *content->get_secret_key.secret_key=secret; 
    377391        break; 
     
    381395        break; 
    382396        } 
    383      
     397 
    384398    return OPS_RELEASE_MEMORY; 
    385399    } 
  • openpgpsdk/trunk/src/lib/signature.c

    r705 r707  
    12341234\param skey Secret Key 
    12351235\param use_armour Write armoured text, if set 
     1236\param include_data Includes the signed data in the output message. If not, creates a detached signature. 
    12361237\return New ops_memory_t struct containing signed text 
    12371238\note It is the caller's responsibility to call ops_memory_free(me) 
     
    12631264                           const ops_sig_type_t sig_type, 
    12641265                           const ops_secret_key_t *skey, 
    1265                            const ops_boolean_t use_armour) 
     1266                           const ops_boolean_t use_armour, 
     1267                           ops_boolean_t include_data) 
    12661268    { 
    12671269    // \todo allow choice of hash algorithams 
     
    13101312        fprintf(stderr,"** Writing out data now\n"); 
    13111313 
    1312     ops_write_literal_data_from_buf(input, input_len, ld_type, cinfo); 
     1314    if(include_data) 
     1315        ops_write_literal_data_from_buf(input, input_len, ld_type, cinfo); 
    13131316 
    13141317    if (debug) 
     
    13311334    // tidy up 
    13321335    ops_writer_close(cinfo); 
     1336         free(cinfo) ; 
    13331337    ops_create_signature_delete(sig); 
    13341338 
  • openpgpsdk/trunk/src/lib/validate.c

    r666 r707  
    7777        trailer[5]=hashedlen; 
    7878        hash.add(&hash,&trailer[0],6); 
    79          
     79 
    8080        break; 
    8181 
     
    9292 
    9393static int keydata_reader(void *dest,size_t length,ops_error_t **errors, 
    94                           ops_reader_info_t *rinfo, 
    95                           ops_parse_cb_info_t *cbinfo) 
     94                          ops_reader_info_t *rinfo, 
     95                          ops_parse_cb_info_t *cbinfo) 
    9696    { 
    9797    validate_reader_arg_t *arg=ops_reader_get_arg(rinfo); 
     
    123123    } 
    124124 
    125 static void copy_signature_info(ops_signature_info_t* dst, const ops_signature_info_t* src) 
     125static void copy_signature_info(ops_signature_info_t* dst, 
     126                                const ops_signature_info_t* src) 
    126127    { 
    127128    memcpy(dst,src,sizeof *src); 
    128129    dst->v4_hashed_data=ops_mallocz(src->v4_hashed_data_length); 
    129     memcpy(dst->v4_hashed_data,src->v4_hashed_data,src->v4_hashed_data_length); 
    130     } 
    131  
    132 static void add_sig_to_valid_list(ops_validate_result_t * result, const ops_signature_info_t* sig) 
     130    memcpy(dst->v4_hashed_data, src->v4_hashed_data, 
     131           src->v4_hashed_data_length); 
     132    } 
     133 
     134static void add_sig_to_valid_list(ops_validate_result_t *result, 
     135                                  const ops_signature_info_t *sig) 
    133136    { 
    134137    size_t newsize; 
    135     size_t start; 
    136138 
    137139    // increment count 
     
    146148 
    147149    // copy key ptr to array 
    148     start=(sizeof *sig) * (result->valid_count-1); 
    149     copy_signature_info(result->valid_sigs+start,sig); 
    150     } 
    151  
    152 static void add_sig_to_invalid_list(ops_validate_result_t * result, const ops_signature_info_t *sig) 
     150    copy_signature_info(&result->valid_sigs[result->valid_count-1], sig); 
     151    } 
     152 
     153static void add_sig_to_invalid_list(ops_validate_result_t *result, 
     154                                  const ops_signature_info_t *sig) 
    153155    { 
    154156    size_t newsize; 
    155     size_t start; 
    156157 
    157158    // increment count 
     
    166167 
    167168    // copy key ptr to array 
    168     start=(sizeof *sig) * (result->invalid_count-1); 
    169     copy_signature_info(result->invalid_sigs+start, sig); 
    170     } 
    171  
    172 static void add_sig_to_unknown_list(ops_validate_result_t * result, const ops_signature_info_t *sig) 
     169    copy_signature_info(&result->invalid_sigs[result->invalid_count-1], sig); 
     170    } 
     171 
     172static void add_sig_to_unknown_list(ops_validate_result_t * result, 
     173                                  const ops_signature_info_t *sig) 
    173174    { 
    174175    size_t newsize; 
    175     size_t start; 
    176176 
    177177    // increment count 
     
    186186 
    187187    // copy key id to array 
    188     start=OPS_KEY_ID_SIZE * (result->unknown_signer_count-1); 
    189     copy_signature_info(result->unknown_sigs+start, sig); 
     188    copy_signature_info(&result->unknown_sigs[result->unknown_signer_count-1], 
     189                       sig); 
    190190    } 
    191191 
    192192ops_parse_cb_return_t 
    193 ops_validate_key_cb(const ops_parser_content_t *content_,ops_parse_cb_info_t *cbinfo) 
     193ops_validate_key_cb(const ops_parser_content_t *content_, 
     194                    ops_parse_cb_info_t *cbinfo) 
    194195    { 
    195196    const ops_parser_content_union_t *content=&content_->content; 
     
    208209        arg->pkey=content->public_key; 
    209210        return OPS_KEEP_MEMORY; 
    210          
     211 
    211212    case OPS_PTAG_CT_PUBLIC_SUBKEY: 
    212213        if(arg->subkey.version) 
     
    214215        arg->subkey=content->public_key; 
    215216        return OPS_KEEP_MEMORY; 
    216          
     217 
    217218    case OPS_PTAG_CT_SECRET_KEY: 
    218219        arg->skey=content->secret_key; 
     
    271272                                                                       ops_get_public_key_from_data(signer), 
    272273                                                                       arg->rarg->key->packets[arg->rarg->packet].raw); 
    273                  
     274 
    274275            break; 
    275276 
     
    341342 
    342343ops_parse_cb_return_t 
    343 validate_data_cb(const ops_parser_content_t *content_,ops_parse_cb_info_t *cbinfo) 
     344validate_data_cb(const ops_parser_content_t *content_, 
     345                 ops_parse_cb_info_t *cbinfo) 
    344346    { 
    345347    const ops_parser_content_union_t *content=&content_->content; 
     
    364366 
    365367    case OPS_PTAG_CT_LITERAL_DATA_BODY: 
    366         arg->data.literal_data_body=content->literal_data_body; 
     368        if(arg->data.literal_data_body.data != NULL) 
     369            free(arg->data.literal_data_body.data); 
     370        arg->data.literal_data_body=content->literal_data_body; 
    367371        arg->use=LITERAL_DATA; 
    368372        return OPS_KEEP_MEMORY; 
     
    370374 
    371375    case OPS_PTAG_CT_SIGNED_CLEARTEXT_BODY: 
    372         arg->data.signed_cleartext_body=content->signed_cleartext_body; 
     376        if(arg->data.signed_cleartext_body.data != NULL) 
     377            free(arg->data.signed_cleartext_body.data); 
     378        arg->data.signed_cleartext_body=content->signed_cleartext_body; 
    373379        arg->use=SIGNED_CLEARTEXT; 
    374380        return OPS_KEEP_MEMORY; 
     
    381387    case OPS_PTAG_CT_SIGNATURE: // V3 sigs 
    382388    case OPS_PTAG_CT_SIGNATURE_FOOTER: // V4 sigs 
    383          
     389 
    384390        if (debug) 
    385391            { 
     
    402408            break; 
    403409            } 
    404          
     410 
    405411        mem=ops_memory_new(); 
    406412        ops_memory_init(mem,128); 
    407          
     413 
    408414        switch(content->signature.info.type) 
    409415            { 
     
    414420            case LITERAL_DATA: 
    415421                ops_memory_add(mem, 
    416                                arg->data.literal_data_body.data, 
    417                                arg->data.literal_data_body.length); 
     422                              arg->data.literal_data_body.data, 
     423                              arg->data.literal_data_body.length); 
    418424                break; 
    419                  
     425 
    420426            case SIGNED_CLEARTEXT: 
    421427                ops_memory_add(mem, 
    422                                arg->data.signed_cleartext_body.data, 
    423                                arg->data.signed_cleartext_body.length); 
     428                              arg->data.signed_cleartext_body.data, 
     429                              arg->data.signed_cleartext_body.length); 
    424430                break; 
    425                  
     431 
    426432            default: 
    427433                OPS_ERROR_1(errors,OPS_E_UNIMPLEMENTED,"Unimplemented Sig Use %d", arg->use); 
     
    429435                break; 
    430436                } 
    431              
     437 
    432438            valid=check_binary_signature(ops_memory_get_length(mem),  
    433439                                         ops_memory_get_data(mem), 
     
    440446                        "Verification of signature type 0x%02x not yet implemented\n", content->signature.info.type); 
    441447            break; 
    442              
     448 
    443449            } 
    444     ops_memory_free(mem); 
     450       ops_memory_free(mem); 
    445451 
    446452        if(valid) 
    447             { 
    448         add_sig_to_valid_list(arg->result, &content->signature.info); 
    449             } 
     453            add_sig_to_valid_list(arg->result, &content->signature.info); 
    450454        else 
    451455            { 
    452         OPS_ERROR(errors,OPS_E_V_BAD_SIGNATURE,"Bad Signature"); 
    453         add_sig_to_invalid_list(arg->result, &content->signature.info); 
     456           OPS_ERROR(errors,OPS_E_V_BAD_SIGNATURE,"Bad Signature"); 
     457           add_sig_to_invalid_list(arg->result, &content->signature.info); 
    454458            } 
    455459        break; 
     
    496500ops_boolean_t validate_result_status(ops_validate_result_t* result) 
    497501    { 
    498     if (result->invalid_count || result->unknown_signer_count || !result->valid_count) 
     502    if (result->invalid_count || result->unknown_signer_count 
     503        || !result->valid_count) 
    499504        return ops_false; 
    500505    else 
     
    512517 * \note It is the caller's responsiblity to free result after use. 
    513518 * \sa ops_validate_result_free() 
    514   
     519 
    515520 Example Code: 
    516 \code 
    517 void example(const ops_keydata_t* key, const ops_keyring_t *keyring) 
    518 
     521 \code 
     522 void example(const ops_keydata_t* key, const ops_keyring_t *keyring) 
     523
    519524  ops_validate_result_t *result=NULL; 
    520525  if (ops_validate_key_signatures(result, key, keyring, callback_cmd_get_passphrase_from_cmdline)==ops_true) 
     
    527532         result->unknown_signer_count); 
    528533  ops_validate_result_free(result); 
    529 
    530  
    531 \endcode 
     534
     535 
     536 \endcode 
    532537 */ 
    533538ops_boolean_t ops_validate_key_signatures(ops_validate_result_t *result,const ops_keydata_t *key, 
     
    566571    ops_parse_info_delete(pinfo); 
    567572 
    568     if (result->invalid_count || result->unknown_signer_count || !result->valid_count) 
     573    if (result->invalid_count || result->unknown_signer_count 
     574        || !result->valid_count) 
    569575        return ops_false; 
    570576    else 
     
    579585   \note It is the caller's responsibility to free result after use. 
    580586   \sa ops_validate_result_free() 
    581 */ 
     587 */ 
    582588ops_boolean_t ops_validate_all_signatures(ops_validate_result_t *result, 
    583589                                 const ops_keyring_t *ring, 
     
    589595    memset(result,'\0',sizeof *result); 
    590596    for(n=0 ; n < ring->nkeys ; ++n) 
    591         ops_validate_key_signatures(result,&ring->keys[n],ring, cb_get_passphrase); 
     597        ops_validate_key_signatures(result,&ring->keys[n],ring, 
     598                                    cb_get_passphrase); 
    592599    return validate_result_status(result); 
    593600    } 
     
    598605   \param result Struct to be freed 
    599606   \note Must be called after validation functions 
    600 */ 
     607 */ 
    601608void ops_validate_result_free(ops_validate_result_t *result) 
    602609    { 
     
    627634   \note It is the caller's responsiblity to call ops_validate_result_free(result) after use. 
    628635 
    629 Example code: 
    630 \code 
    631 void example(const char* filename, const int armoured, const ops_keyring_t* keyring) 
    632 
     636  Example code: 
     637  \code 
     638  void example(const char* filename, const int armoured, const ops_keyring_t* keyring) 
     639 
    633640  ops_validate_result_t* result=ops_mallocz(sizeof *result); 
    634    
     641 
    635642  if (ops_validate_file(result, filename, armoured, keyring)==ops_true) 
    636643  { 
    637644    printf("OK"); 
    638     // look at result for details of keys with good signatures 
    639  
    640   else 
    641  
    642     printf("ERR"); 
    643     // look at result for details of failed signatures or unknown signers 
    644  
    645  
    646   ops_validate_result_free(result); 
     645// look at result for details of keys with good signatures 
     646
     647else 
     648
     649printf("ERR"); 
     650// look at result for details of failed signatures or unknown signers 
     651
     652 
     653ops_validate_result_free(result); 
    647654} 
    648655\endcode 
    649 */ 
    650 ops_boolean_t ops_validate_file(ops_validate_result_t *result, const char* filename, const int armoured, const ops_keyring_t* keyring) 
     656 */ 
     657ops_boolean_t ops_validate_file(ops_validate_result_t *result, 
     658                                const char* filename, 
     659                                const int armoured, 
     660                                const ops_keyring_t* keyring) 
    651661    { 
    652662    ops_parse_info_t *pinfo=NULL; 
    653663    validate_data_cb_arg_t validate_arg; 
    654  
    655664    int fd=0; 
    656665 
    657     // 
    658     fd=ops_setup_file_read(&pinfo, filename, &validate_arg, validate_data_cb, ops_true); 
     666    fd=ops_setup_file_read(&pinfo, filename, &validate_arg, validate_data_cb, 
     667                          ops_true); 
    659668    if (fd < 0) 
    660669        return ops_false; 
     
    662671    // Set verification reader and handling options 
    663672 
    664     memset(&validate_arg,'\0',sizeof validate_arg); 
     673    memset(&validate_arg, '\0', sizeof validate_arg); 
    665674    validate_arg.result=result; 
    666675    validate_arg.keyring=keyring; 
     
    671680    if (armoured) 
    672681        ops_reader_push_dearmour(pinfo); 
    673      
     682 
    674683    // Do the verification 
    675684 
     
    688697        ops_reader_pop_dearmour(pinfo); 
    689698    ops_teardown_file_read(pinfo, fd); 
     699 
     700    if(validate_arg.data.literal_data_body.data != NULL) 
     701        free(validate_arg.data.literal_data_body.data); 
    690702 
    691703    return validate_result_status(result); 
     
    703715   have passed, failed and not been recognised. 
    704716   \note It is the caller's responsiblity to call ops_validate_result_free(result) after use. 
    705 */ 
     717 */ 
    706718 
    707719ops_boolean_t ops_validate_mem(ops_validate_result_t *result, ops_memory_t* mem, const int armoured, const ops_keyring_t* keyring) 
     
    710722    validate_data_cb_arg_t validate_arg; 
    711723 
    712     // 
    713724    ops_setup_memory_read(&pinfo, mem, &validate_arg, validate_data_cb, ops_true); 
    714725 
    715726    // Set verification reader and handling options 
    716727 
    717     memset(&validate_arg,'\0',sizeof validate_arg); 
     728    memset(&validate_arg, '\0', sizeof validate_arg); 
    718729    validate_arg.result=result; 
    719730    validate_arg.keyring=keyring; 
     
    724735    if (armoured) 
    725736        ops_reader_push_dearmour(pinfo); 
    726      
     737 
    727738    // Do the verification 
    728739 
     
    742753    ops_teardown_memory_read(pinfo, mem); 
    743754 
     755    if(validate_arg.data.literal_data_body.data != NULL) 
     756        free(validate_arg.data.literal_data_body.data); 
     757 
    744758    return validate_result_status(result); 
    745759    } 
    746760 
    747 // eof 
     761/** 
     762  \ingroup HighLevel_Verify 
     763  \brief Verifies the signature in a detached signature data packet, given the literal data 
     764  \param literal_data Literal data that is signed 
     765  \param literal_data_length length of the literal data that is signed 
     766  \param signature_packet signature packet in binary PGP format 
     767  \param signature_packet_length length of the signature packet 
     768  \param signers_key Public key of the signer to check the signature for. 
     769  \return ops_true if signature validates successfully; ops_false if not 
     770 */ 
     771 
     772ops_boolean_t 
     773ops_validate_detached_signature(const void *literal_data, 
     774                                unsigned int literal_data_length, 
     775                                const unsigned char *signature_packet, 
     776                                unsigned int signature_packet_length, 
     777                                const ops_keydata_t *signers_key) 
     778    { 
     779    ops_validate_result_t *result = (ops_validate_result_t*)ops_mallocz(sizeof(ops_validate_result_t)); 
     780 
     781    ops_memory_t *mem = ops_memory_new(); 
     782    ops_memory_add(mem,signature_packet,signature_packet_length); 
     783 
     784    ops_parse_info_t *pinfo=NULL; 
     785    validate_data_cb_arg_t validate_arg; 
     786 
     787    ops_setup_memory_read(&pinfo, mem, &validate_arg, validate_data_cb, 
     788                          ops_true); 
     789 
     790    // Set verification reader and handling options 
     791 
     792    ops_keyring_t tmp_keyring; 
     793    tmp_keyring.nkeys = 1; 
     794    tmp_keyring.nkeys_allocated = 1; 
     795    tmp_keyring.keys = (ops_keydata_t *)signers_key;    // this is a const_cast, somehow 
     796 
     797    memset(&validate_arg,'\0',sizeof validate_arg); 
     798 
     799    validate_arg.result=result; 
     800    validate_arg.keyring=&tmp_keyring; 
     801 
     802    int length = literal_data_length; 
     803 
     804    validate_arg.data.literal_data_body.data = malloc(length); 
     805    memcpy(validate_arg.data.literal_data_body.data, literal_data, length); 
     806    validate_arg.data.literal_data_body.length = length; 
     807 
     808    // Note: Coverity incorrectly reports an error that carg.rarg 
     809    // is never used. 
     810    validate_arg.rarg=ops_reader_get_arg_from_pinfo(pinfo); 
     811 
     812    //if (armoured) 
     813    //  ops_reader_push_dearmour(pinfo); 
     814 
     815    // Do the verification 
     816 
     817    ops_parse(pinfo); 
     818 
     819    printf("valid=%d, invalid=%d, unknown=%d\n", result->valid_count, 
     820           result->invalid_count, result->unknown_signer_count); 
     821 
     822    // Tidy up 
     823    //if (armoured) 
     824    //  ops_reader_pop_dearmour(pinfo); 
     825 
     826    ops_teardown_memory_read(pinfo, mem); 
     827 
     828    ops_boolean_t res = validate_result_status(result); 
     829    ops_validate_result_free(result); 
     830 
     831    if(validate_arg.data.literal_data_body.data != NULL) 
     832        free(validate_arg.data.literal_data_body.data); 
     833 
     834    return res; 
     835    } 
  • openpgpsdk/trunk/src/lib/writer_armour.c

    r701 r707  
    3535static int debug=0; 
    3636 
    37 #define LINE_LENGTH 75 
     37#define LINE_LENGTH 63 
    3838 
    3939static const char newline[] = "\r\n"; 
     
    285285    } linebreak_arg_t; 
    286286 
    287 #define BREAKPOS        76 
     287#define BREAKPOS        64 
    288288 
    289289static ops_boolean_t linebreak_writer(const unsigned char *src, 
  • openpgpsdk/trunk/tests/test_dsa_signature.c

    r701 r707  
    173173    validate_data_cb_arg_t validate_arg; 
    174174 
    175     mem=ops_sign_buf(input, input_len, OPS_SIG_TEXT, skey, use_armour); 
     175    mem=ops_sign_buf(input, input_len, OPS_SIG_TEXT, skey, use_armour, 
     176                     ops_true); 
    176177 
    177178    if (debug) 
  • openpgpsdk/trunk/tests/test_rsa_signature.c

    r702 r707  
    207207    validate_data_cb_arg_t validate_arg; 
    208208 
    209     mem=ops_sign_buf(input, input_len, OPS_SIG_TEXT, skey, use_armour); 
     209    mem=ops_sign_buf(input, input_len, OPS_SIG_TEXT, skey, use_armour, 
     210                     ops_true); 
    210211 
    211212    /*