Пример #1
0
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;
}
Пример #2
0
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;
}