cdk_error_t _cdk_copy_seckey (cdk_pkt_seckey_t* dst, cdk_pkt_seckey_t src) { cdk_pkt_seckey_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); _cdk_copy_pubkey (&k->pk, src->pk); if (src->encdata) { k->encdata = cdk_calloc (1, src->enclen + 1); if (!k->encdata) return CDK_Out_Of_Core; memcpy (k->encdata, src->encdata, src->enclen); } _cdk_s2k_copy (&k->protect.s2k, src->protect.s2k); for (i = 0; i < cdk_pk_get_nskey (src->pubkey_algo); i++) { k->mpi[i] = gcry_mpi_copy (src->mpi[i]); gcry_mpi_set_flag (k->mpi[i], GCRYMPI_FLAG_SECURE); } *dst = k; return 0; }
/** * cdk_pk_from_secret_key: * @sk: the secret key * @ret_pk: the new public key * * Create a new public key from a secret key. **/ cdk_error_t cdk_pk_from_secret_key (cdk_pkt_seckey_t sk, cdk_pubkey_t * ret_pk) { if (!sk) return CDK_Inv_Value; return _cdk_copy_pubkey (ret_pk, sk->pk); }
cdk_error_t cdk_keydb_get_pk( cdk_keydb_hd_t hd, u32 * keyid, cdk_pkt_pubkey_t* r_pk ) { cdk_kbnode_t knode = NULL, node = NULL; cdk_pkt_pubkey_t pk = NULL; int rc = 0; if( !keyid || !r_pk ) return CDK_Inv_Value; if( !hd ) return CDK_Error_No_Keyring; rc = cdk_keydb_search_start( hd, !keyid[0]? CDK_DBSEARCH_SHORT_KEYID : CDK_DBSEARCH_KEYID, keyid ); if( !rc ) rc = cdk_keydb_search( hd, &knode ); if( rc ) goto leave; node = keydb_find_bykeyid( knode, keyid ); if( !node ) { rc = CDK_Error_No_Key; goto leave; } _cdk_copy_pubkey( &pk, node->pkt->pkt.public_key ); cdk_kbnode_release( knode ); leave: *r_pk = pk; return rc; }
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; }
static cdk_pkt_seckey_t sk_create( cdk_keygen_ctx_t hd, int type ) { cdk_pkt_seckey_t sk; int nskey, rc = 0; if( type < 0 || type > 1 ) return NULL; sk = cdk_calloc( 1, sizeof * sk ); if( !sk ) return NULL; _cdk_copy_pubkey( &sk->pk, hd->key[type].pk ); sk->version = 4; sk->pubkey_algo = hd->key[type].algo; sk->csum = 0; sk->is_protected = 0; nskey = cdk_pk_get_nskey( sk->pubkey_algo ); rc = gcry_mpi_to_native( hd, nskey, type, NULL, sk ); if( rc ) { cdk_free( sk ); sk = NULL; } return sk; }