return GNUTLS_E_MPI_SCAN_FAILED;
}
- ret=_gnutls_dh_set_peer_public_bits( session, _gnutls_mpi_get_nbits(
- session->key->client_Y));
+ ret=_gnutls_dh_set_peer_public( session, session->key->client_Y);
if (ret<0) {
gnutls_assert();
return ret;
return GNUTLS_E_MEMORY_ERROR;
}
- ret=_gnutls_dh_set_peer_public_bits( session, _gnutls_mpi_get_nbits(
- session->key->client_Y));
+ ret=_gnutls_dh_set_peer_public( session, session->key->client_Y);
if (ret<0) {
gnutls_assert();
failed:
return ret;
}
- ret=_gnutls_dh_set_peer_public_bits( session, _gnutls_mpi_get_nbits(
- session->key->client_Y));
+ ret = _gnutls_dh_set_peer_public( session, session->key->client_Y);
if (ret<0) {
gnutls_assert();
return ret;
size_t prime_size;
opaque generator[16];
size_t generator_size;
+ opaque public_key[1024];
+ size_t public_key_size;
} dh_info_st;
int _gnutls_gen_dh_common_client_kx(gnutls_session, opaque **);
break;
#endif
+ default:
+ gnutls_free(ret);
+ return NULL;
}
return ret;
}
if (handle!=NULL) {
switch( handle->algo) {
- /* case GNUTLS_COMP_LZO:
- break; */
#ifdef HAVE_LIBZ
case GNUTLS_COMP_DEFLATE:
if (d)
err = deflateEnd( handle->handle);
break;
#endif
+ default:
+ break;
}
gnutls_free( handle->handle);
gnutls_free( handle);
/* Functions that refer to the libgcrypt library.
*/
-void _gnutls_mpi_release( GNUTLS_MPI* x) {
+void _gnutls_mpi_release( mpi_t* x) {
if (*x==NULL) return;
gcry_mpi_release(*x);
*x=NULL;
/* returns zero on success
*/
-int _gnutls_mpi_scan( GNUTLS_MPI *ret_mpi, const opaque *buffer, size_t *nbytes ) {
+int _gnutls_mpi_scan( mpi_t *ret_mpi, const opaque *buffer, size_t *nbytes ) {
int ret;
ret = gcry_mpi_scan( ret_mpi, GCRYMPI_FMT_USG, buffer, *nbytes, nbytes);
return 0;
}
-int _gnutls_mpi_scan_pgp( GNUTLS_MPI *ret_mpi, const opaque *buffer, size_t *nbytes)
+int _gnutls_mpi_scan_pgp( mpi_t *ret_mpi, const opaque *buffer, size_t *nbytes)
{
int ret;
ret = gcry_mpi_scan( ret_mpi, GCRYMPI_FMT_PGP, buffer, *nbytes, nbytes);
return 0;
}
-int _gnutls_mpi_print( void *buffer, size_t *nbytes, const GNUTLS_MPI a )
+int _gnutls_mpi_print( void *buffer, size_t *nbytes, const mpi_t a )
{
int ret;
}
/* Always has the first bit zero */
-int _gnutls_mpi_print_lz( void *buffer, size_t *nbytes, const GNUTLS_MPI a )
+int _gnutls_mpi_print_lz( void *buffer, size_t *nbytes, const mpi_t a )
{
int ret;
}
/* Always has the first bit zero */
-int _gnutls_mpi_dprint_lz( gnutls_datum* dest, const GNUTLS_MPI a )
+int _gnutls_mpi_dprint_lz( gnutls_datum* dest, const mpi_t a )
{
int ret;
opaque* buf = NULL;
* steps.
*/
int _gnutls_x509_read_int( ASN1_TYPE node, const char* value,
- GNUTLS_MPI* ret_mpi)
+ mpi_t* ret_mpi)
{
int result;
size_t s_len;
/* Writes the specified integer into the specified node.
*/
-int _gnutls_x509_write_int( ASN1_TYPE node, const char* value, GNUTLS_MPI mpi, int lz)
+int _gnutls_x509_write_int( ASN1_TYPE node, const char* value, mpi_t mpi, int lz)
{
opaque *tmpstr;
size_t s_len;
return session->internals.dh_prime_bits;
}
-int _gnutls_dh_set_peer_public_bits( gnutls_session session, uint bits)
+int _gnutls_dh_set_peer_public( gnutls_session session, mpi_t public)
{
switch( gnutls_auth_get_type( session)) {
case GNUTLS_CRD_ANON: {
info = _gnutls_get_auth_info(session);
if (info == NULL)
return GNUTLS_E_INTERNAL_ERROR;
- info->dh.peer_public_bits = bits;
+
+ _gnutls_mpi_print_lz( info->dh.public_key, &info->dh.public_key_size, public);
+ info->dh.peer_public_bits = _gnutls_mpi_get_nbits(public);
break;
}
case GNUTLS_CRD_CERTIFICATE: {
if (info == NULL)
return GNUTLS_E_INTERNAL_ERROR;
- info->dh.peer_public_bits = bits;
+ _gnutls_mpi_print_lz( info->dh.public_key, &info->dh.public_key_size, public);
+ info->dh.peer_public_bits = _gnutls_mpi_get_nbits(public);
break;
}
default:
int _gnutls_session_cert_type_supported( gnutls_session, gnutls_certificate_type);
-int _gnutls_dh_set_peer_public_bits( gnutls_session session, uint bits);
int _gnutls_dh_set_secret_bits( gnutls_session session, uint bits);
-int _gnutls_dh_set_prime( gnutls_session session, GNUTLS_MPI gen, GNUTLS_MPI prime);
+int _gnutls_dh_set_peer_public( gnutls_session session, mpi_t public);
+int _gnutls_dh_set_prime( gnutls_session session, mpi_t gen, mpi_t prime);
int _gnutls_dh_get_allowed_prime_bits( gnutls_session session);
void gnutls_dh_set_prime_bits( gnutls_session session, unsigned int bits);
return 0;
}
+/**
+ * gnutls_dh_get_public_key - This function returns the peer's public key used in DH authentication
+ * @session: is a gnutls session
+ * @raw_key: will hold the public key. To be treated as constant.
+ *
+ * This function will return the peer's public key used in the last Diffie Hellman authentication.
+ * Should be used for both anonymous and ephemeral diffie Hellman.
+ * Returns a negative value in case of an error.
+ *
+ **/
+int gnutls_dh_get_public_key(gnutls_session session, gnutls_datum* key)
+{
+dh_info_st dh;
+ANON_SERVER_AUTH_INFO anon_info;
+CERTIFICATE_AUTH_INFO cert_info;
+
+ switch( gnutls_auth_get_type( session)) {
+ case GNUTLS_CRD_ANON: {
+ anon_info = _gnutls_get_auth_info(session);
+ if (anon_info == NULL)
+ return GNUTLS_E_INTERNAL_ERROR;
+ dh = anon_info->dh;
+ break;
+ }
+ case GNUTLS_CRD_CERTIFICATE: {
+
+ cert_info = _gnutls_get_auth_info(session);
+ if (cert_info == NULL)
+ return GNUTLS_E_INTERNAL_ERROR;
+ dh = cert_info->dh;
+ break;
+ }
+ default:
+ gnutls_assert();
+ return GNUTLS_E_INVALID_REQUEST;
+ }
+
+ key->data = dh.public_key;
+ key->size = dh.public_key_size;
+
+ return 0;
+}
+
/**
* gnutls_dh_get_generator - This function returns the generator used in DH authentication
int gnutls_dh_get_prime(gnutls_session, gnutls_datum* prime);
int gnutls_dh_get_generator(gnutls_session, gnutls_datum* gen);
+int gnutls_dh_get_public_key(gnutls_session, gnutls_datum* gen);
/* RSA */
int gnutls_rsa_export_get_modulus_bits(gnutls_session session);