Exemple #1
0
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;
}
Exemple #2
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);
}
Exemple #3
0
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;
}
Exemple #4
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;
}
Exemple #5
0
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;
}