int _cdk_keydb_get_pk_byusage( cdk_keydb_hd_t hd, const char * name, cdk_pkt_pubkey_t* ret_pk, int usage ) { cdk_kbnode_t knode, node = NULL; cdk_pkt_pubkey_t pk = NULL; const char * s; int rc = 0; if( !ret_pk || !usage ) return CDK_Inv_Value; if( !hd ) return CDK_Error_No_Keyring; rc = cdk_keydb_search_start( hd, CDK_DBSEARCH_AUTO, (char *)name ); if( !rc ) rc = cdk_keydb_search( hd, &knode ); if( rc ) goto leave; node = keydb_find_byusage( knode, usage, 1 ); if( !node ) { rc = CDK_Unusable_Key; goto leave; } _cdk_copy_pubkey( &pk, node->pkt->pkt.public_key ); for( node = knode; node; node = node->next ) { if( node->pkt->pkttype == CDK_PKT_USER_ID ) { s = node->pkt->pkt.user_id->name; if( pk && !pk->uid && _cdk_memistr( s, strlen( s ), name ) ) { _cdk_copy_userid( &pk->uid, node->pkt->pkt.user_id ); break; } } } cdk_kbnode_release( knode ); leave: *ret_pk = pk; return rc; }
cdk_error_t _cdk_copy_pubkey(cdk_pkt_pubkey_t * dst, cdk_pkt_pubkey_t src) { cdk_pkt_pubkey_t k; int i; if (!dst || !src) return CDK_Inv_Value; *dst = NULL; k = cdk_calloc(1, sizeof *k); if (!k) return CDK_Out_Of_Core; memcpy(k, src, sizeof *k); if (src->uid) _cdk_copy_userid(&k->uid, src->uid); if (src->prefs) k->prefs = _cdk_copy_prefs(src->prefs); for (i = 0; i < cdk_pk_get_npkey(src->pubkey_algo); i++) k->mpi[i] = _gnutls_mpi_copy(src->mpi[i]); *dst = k; return 0; }