/* Returns the public key of the private key (if possible) */ int _gnutls_privkey_get_public_mpis(gnutls_privkey_t key, gnutls_pk_params_st * params) { int ret; gnutls_pk_algorithm_t pk = gnutls_privkey_get_pk_algorithm(key, NULL); switch (key->type) { #ifdef ENABLE_OPENPGP case GNUTLS_PRIVKEY_OPENPGP: { gnutls_pk_params_st tmp_params; uint32_t kid[2]; uint8_t keyid[GNUTLS_OPENPGP_KEYID_SIZE]; ret = gnutls_openpgp_privkey_get_preferred_key_id (key->key.openpgp, keyid); if (ret == 0) { KEYID_IMPORT(kid, keyid); ret = _gnutls_openpgp_privkey_get_mpis(key-> key. openpgp, kid, &tmp_params); } else ret = _gnutls_openpgp_privkey_get_mpis(key-> key. openpgp, NULL, &tmp_params); if (ret < 0) { gnutls_assert(); return ret; } ret = privkey_to_pubkey(pk, &tmp_params, params); gnutls_pk_params_release(&tmp_params); } break; #endif case GNUTLS_PRIVKEY_X509: ret = privkey_to_pubkey(pk, &key->key.x509->params, params); break; default: gnutls_assert(); return GNUTLS_E_INVALID_REQUEST; } return ret; }
int _gnutls_privkey_get_public_mpis(gnutls_privkey_t key, gnutls_pk_params_st * params) { int ret; gnutls_pk_params_st tmp1; gnutls_pk_params_init(&tmp1); ret = _gnutls_privkey_get_mpis(key, &tmp1); if (ret < 0) return gnutls_assert_val(ret); ret = privkey_to_pubkey(key->pk_algorithm, &tmp1, params); gnutls_pk_params_release(&tmp1); if (ret < 0) gnutls_assert(); return ret; }
/* Returns the public key of the private key (if possible) */ int _gnutls_privkey_get_public_mpis (gnutls_privkey_t key, bigint_t * params, int *params_size) { int ret; gnutls_pk_algorithm_t pk = gnutls_privkey_get_pk_algorithm (key, NULL); switch (key->type) { #ifdef ENABLE_OPENPGP case GNUTLS_PRIVKEY_OPENPGP: { bigint_t tmp_params[MAX_PRIV_PARAMS_SIZE]; int tmp_params_size = MAX_PRIV_PARAMS_SIZE; uint32_t kid[2], i; gnutls_openpgp_keyid_t keyid; ret = gnutls_openpgp_privkey_get_preferred_key_id (key->key.openpgp, keyid); if (ret == 0) { KEYID_IMPORT (kid, keyid); ret = _gnutls_openpgp_privkey_get_mpis (key->key.openpgp, kid, tmp_params, &tmp_params_size); } else ret = _gnutls_openpgp_privkey_get_mpis (key->key.openpgp, NULL, tmp_params, &tmp_params_size); if (ret < 0) { gnutls_assert (); return ret; } ret = privkey_to_pubkey (pk, tmp_params, tmp_params_size, params, params_size); for (i = 0; i < tmp_params_size; i++) _gnutls_mpi_release (&tmp_params[i]); } break; #endif case GNUTLS_PRIVKEY_X509: ret = privkey_to_pubkey (pk, key->key.x509->params, key->key.x509->params_size, params, params_size); break; default: gnutls_assert (); return GNUTLS_E_INVALID_REQUEST; } return ret; }