ops_parse_cb_return_t callback_cmd_get_secret_key(const ops_parser_content_t *content_,ops_parse_cb_info_t *cbinfo) { ops_parser_content_union_t* content=(ops_parser_content_union_t *)&content_->content; const ops_secret_key_t *secret; ops_parser_content_t pc; OPS_USED(cbinfo); // ops_print_packet(content_); switch(content_->tag) { case OPS_PARSER_CMD_GET_SECRET_KEY: cbinfo->cryptinfo.keydata=ops_keyring_find_key_by_id(cbinfo->cryptinfo.keyring,content->get_secret_key.pk_session_key->key_id); if (!cbinfo->cryptinfo.keydata || !ops_is_key_secret(cbinfo->cryptinfo.keydata)) return 0; /* now get the key from the data */ secret=ops_get_secret_key_from_data(cbinfo->cryptinfo.keydata); int tag_to_use = OPS_PARSER_CMD_GET_SK_PASSPHRASE ; int nbtries = 0 ; while( (!secret) && nbtries++ < 3) { if (!cbinfo->cryptinfo.passphrase) { memset(&pc,'\0',sizeof pc); pc.content.secret_key_passphrase.passphrase=&cbinfo->cryptinfo.passphrase; CB(cbinfo,tag_to_use,&pc); if (!cbinfo->cryptinfo.passphrase) { fprintf(stderr,"can't get passphrase\n"); assert(0); } } /* then it must be encrypted */ secret=ops_decrypt_secret_key_from_data(cbinfo->cryptinfo.keydata,cbinfo->cryptinfo.passphrase); free(cbinfo->cryptinfo.passphrase) ; cbinfo->cryptinfo.passphrase = NULL ; tag_to_use = OPS_PARSER_CMD_GET_SK_PASSPHRASE_PREV_WAS_BAD ; } if(!secret) return 0 ; *content->get_secret_key.secret_key=secret; break; default: // return callback_general(content_,cbinfo); break; } return OPS_RELEASE_MEMORY; }
void ops_keyring_list(const ops_keyring_t* keyring) { int n; unsigned int i; ops_keydata_t* key; printf ("%d keys\n", keyring->nkeys); for(n=0,key=&keyring->keys[n] ; n < keyring->nkeys ; ++n,++key) { for(i=0; i<key->nuids; i++) { if (ops_is_key_secret(key)) ops_print_secret_keydata(key); else ops_print_public_keydata(key); } } }