1
0
Fork 0
mirror of synced 2025-03-07 03:53:26 +01:00

bcrypt: Add helpers to create a public/private key pair.

This commit is contained in:
Hans Leidekker 2023-12-07 10:00:42 +01:00 committed by Alexandre Julliard
parent b82faa2697
commit 4becbefe5d

View file

@ -1005,6 +1005,48 @@ done:
return status;
}
static gnutls_privkey_t create_privkey( gnutls_pk_algorithm_t pk_alg, unsigned int bitlen )
{
gnutls_privkey_t privkey;
int ret;
if ((ret = pgnutls_privkey_init( &privkey )))
{
pgnutls_perror( ret );
return NULL;
}
if ((ret = pgnutls_privkey_generate( privkey, pk_alg, bitlen, 0 )))
{
pgnutls_perror( ret );
pgnutls_privkey_deinit( privkey );
return NULL;
}
return privkey;
}
static gnutls_pubkey_t create_pubkey_from_privkey( gnutls_privkey_t privkey )
{
gnutls_pubkey_t pubkey;
int ret;
if ((ret = pgnutls_pubkey_init( &pubkey )))
{
pgnutls_perror( ret );
return NULL;
}
if ((ret = pgnutls_pubkey_import_privkey( pubkey, privkey, 0, 0 )))
{
pgnutls_perror( ret );
pgnutls_pubkey_deinit( pubkey );
return NULL;
}
return pubkey;
}
static NTSTATUS key_asymmetric_generate( void *args )
{
struct key *key = args;
@ -1012,7 +1054,6 @@ static NTSTATUS key_asymmetric_generate( void *args )
gnutls_privkey_t privkey;
gnutls_pubkey_t pubkey;
unsigned int bitlen;
int ret;
if (!libgnutls_handle) return STATUS_INTERNAL_ERROR;
if (key_data(key)->a.privkey) return STATUS_INVALID_HANDLE;
@ -1052,33 +1093,13 @@ static NTSTATUS key_asymmetric_generate( void *args )
return STATUS_NOT_SUPPORTED;
}
if ((ret = pgnutls_privkey_init( &privkey )))
if (!(privkey = create_privkey( pk_alg, bitlen ))) return STATUS_INTERNAL_ERROR;
if (!(pubkey = create_pubkey_from_privkey( privkey )))
{
pgnutls_perror( ret );
return STATUS_INTERNAL_ERROR;
}
if ((ret = pgnutls_pubkey_init( &pubkey )))
{
pgnutls_perror( ret );
pgnutls_privkey_deinit( privkey );
return STATUS_INTERNAL_ERROR;
}
if ((ret = pgnutls_privkey_generate( privkey, pk_alg, bitlen, 0 )))
{
pgnutls_perror( ret );
pgnutls_privkey_deinit( privkey );
pgnutls_pubkey_deinit( pubkey );
return STATUS_INTERNAL_ERROR;
}
if ((ret = pgnutls_pubkey_import_privkey( pubkey, privkey, 0, 0 )))
{
pgnutls_perror( ret );
pgnutls_privkey_deinit( privkey );
pgnutls_pubkey_deinit( pubkey );
return STATUS_INTERNAL_ERROR;
}
key_data(key)->a.privkey = privkey;
key_data(key)->a.pubkey = pubkey;
return STATUS_SUCCESS;