/** \ingroup HighLevel_KeyringRead \brief Reads a keyring from memory \param keyring Pointer to existing ops_keyring_t struct \param armour ops_true if file is armoured; else ops_false \param mem Pointer to a ops_memory_t struct containing keyring to be read \return ops true if OK; ops_false on error \note Keyring struct must already exist. \note Can be used with either a public or secret keyring. \note You must call ops_keyring_free() after usage to free alloc-ed memory. \note If you call this twice on the same keyring struct, without calling ops_keyring_free() between these calls, you will introduce a memory leak. \sa ops_keyring_read_from_file \sa ops_keyring_free Example code: \code ops_memory_t* mem; // Filled with keyring packets ops_keyring_t* keyring=ops_mallocz(sizeof *keyring); ops_boolean_t armoured=ops_false; ops_keyring_read_from_mem(keyring, armoured, mem); ... ops_keyring_free(keyring); free (keyring); \endcode */ ops_boolean_t ops_keyring_read_from_mem(ops_keyring_t *keyring, const ops_boolean_t armour, ops_memory_t* mem) { ops_parse_info_t *pinfo=NULL; ops_boolean_t res = ops_true; ops_setup_memory_read(&pinfo, mem, NULL, cb_keyring_read, OPS_ACCUMULATE_NO); ops_parse_options(pinfo,OPS_PTAG_SS_ALL,OPS_PARSE_PARSED); if (armour) { ops_reader_push_dearmour(pinfo); } if ( ops_parse_and_accumulate(keyring,pinfo) == 0 ) { res = ops_false; } else { res = ops_true; } ops_print_errors(ops_parse_info_get_errors(pinfo)); if (armour) ops_reader_pop_dearmour(pinfo); // don't call teardown_memory_read because memory was passed // in. But we need to free the parse_info object allocated by // ops_setup_memory_read(). ops_parse_info_delete(pinfo); return res; }
ops_boolean_t ops_decrypt_memory(const unsigned char *encrypted_memory,int em_length, unsigned char **decrypted_memory,int *out_length, ops_keyring_t* keyring, const ops_boolean_t use_armour, ops_parse_cb_t* cb_get_passphrase) { int fd_in=0; int fd_out=0; char* myfilename=NULL; // ops_parse_info_t *pinfo=NULL; // setup for reading from given input file ops_memory_t *input_mem = ops_memory_new() ; ops_memory_add(input_mem,encrypted_memory,em_length) ; ops_setup_memory_read(&pinfo, input_mem, NULL, callback_write_parsed, ops_false); if (pinfo == NULL) { perror("cannot create memory read"); return ops_false; } // setup memory chunk ops_memory_t *output_mem; ops_setup_memory_write(&pinfo->cbinfo.cinfo, &output_mem,0) ; if (output_mem == NULL) { perror("Cannot create output memory"); ops_teardown_memory_read(pinfo, input_mem); return ops_false; } // \todo check for suffix matching armour param // setup keyring and passphrase callback pinfo->cbinfo.cryptinfo.keyring=keyring; pinfo->cbinfo.cryptinfo.cb_get_passphrase=cb_get_passphrase; // Set up armour/passphrase options if (use_armour) ops_reader_push_dearmour(pinfo); // Do it ops_boolean_t res = ops_parse_and_print_errors(pinfo); // Unsetup if (use_armour) ops_reader_pop_dearmour(pinfo); // copy output memory to supplied buffer. // *out_length = ops_memory_get_length(output_mem) ; *decrypted_memory = ops_mallocz(*out_length) ; memcpy(*decrypted_memory,ops_memory_get_data(output_mem),*out_length) ; ops_decrypt_memory_ABORT: ops_teardown_memory_write(pinfo->cbinfo.cinfo, output_mem); ops_teardown_memory_read(pinfo, input_mem); return res ; }