Commit e1fb6316 authored by Paul Gofman's avatar Paul Gofman Committed by Alexandre Julliard

bcrypt: Set pubkey from privkey in key_asymmetric_import().

parent 6f455e10
...@@ -713,8 +713,6 @@ static NTSTATUS key_export_rsa_public( struct key *key, UCHAR *buf, ULONG len, U ...@@ -713,8 +713,6 @@ static NTSTATUS key_export_rsa_public( struct key *key, UCHAR *buf, ULONG len, U
if (key_data(key)->a.pubkey) if (key_data(key)->a.pubkey)
ret = pgnutls_pubkey_export_rsa_raw( key_data(key)->a.pubkey, &m, &e ); ret = pgnutls_pubkey_export_rsa_raw( key_data(key)->a.pubkey, &m, &e );
else if (key_data(key)->a.privkey)
ret = pgnutls_privkey_export_rsa_raw( key_data(key)->a.privkey, &m, &e, NULL, NULL, NULL, NULL, NULL, NULL );
else else
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
...@@ -781,8 +779,6 @@ static NTSTATUS key_export_ecc_public( struct key *key, UCHAR *buf, ULONG len, U ...@@ -781,8 +779,6 @@ static NTSTATUS key_export_ecc_public( struct key *key, UCHAR *buf, ULONG len, U
if (key_data(key)->a.pubkey) if (key_data(key)->a.pubkey)
ret = pgnutls_pubkey_export_ecc_raw( key_data(key)->a.pubkey, &curve, &x, &y ); ret = pgnutls_pubkey_export_ecc_raw( key_data(key)->a.pubkey, &curve, &x, &y );
else if (key_data(key)->a.privkey)
ret = pgnutls_privkey_export_ecc_raw( key_data(key)->a.privkey, &curve, &x, &y, NULL );
else else
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
...@@ -831,8 +827,6 @@ static NTSTATUS key_export_dsa_public( struct key *key, UCHAR *buf, ULONG len, U ...@@ -831,8 +827,6 @@ static NTSTATUS key_export_dsa_public( struct key *key, UCHAR *buf, ULONG len, U
if (key_data(key)->a.pubkey) if (key_data(key)->a.pubkey)
ret = pgnutls_pubkey_export_dsa_raw( key_data(key)->a.pubkey, &p, &q, &g, &y ); ret = pgnutls_pubkey_export_dsa_raw( key_data(key)->a.pubkey, &p, &q, &g, &y );
else if (key_data(key)->a.privkey)
ret = pgnutls_privkey_export_dsa_raw( key_data(key)->a.privkey, &p, &q, &g, &y, NULL );
else else
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
...@@ -1574,6 +1568,8 @@ static NTSTATUS key_asymmetric_import( void *args ) ...@@ -1574,6 +1568,8 @@ static NTSTATUS key_asymmetric_import( void *args )
const struct key_asymmetric_import_params *params = args; const struct key_asymmetric_import_params *params = args;
struct key *key = params->key; struct key *key = params->key;
unsigned flags = params->flags; unsigned flags = params->flags;
gnutls_pubkey_t pubkey;
NTSTATUS ret;
switch (key->alg_id) switch (key->alg_id)
{ {
...@@ -1583,13 +1579,15 @@ static NTSTATUS key_asymmetric_import( void *args ) ...@@ -1583,13 +1579,15 @@ static NTSTATUS key_asymmetric_import( void *args )
case ALG_ID_ECDSA_P384: case ALG_ID_ECDSA_P384:
if (flags & KEY_IMPORT_FLAG_PUBLIC) if (flags & KEY_IMPORT_FLAG_PUBLIC)
return key_import_ecc_public( key, params->buf, params->len ); return key_import_ecc_public( key, params->buf, params->len );
return key_import_ecc( key, params->buf, params->len ); ret = key_import_ecc( key, params->buf, params->len );
break;
case ALG_ID_RSA: case ALG_ID_RSA:
case ALG_ID_RSA_SIGN: case ALG_ID_RSA_SIGN:
if (flags & KEY_IMPORT_FLAG_PUBLIC) if (flags & KEY_IMPORT_FLAG_PUBLIC)
return key_import_rsa_public( key, params->buf, params->len ); return key_import_rsa_public( key, params->buf, params->len );
return key_import_rsa( key, params->buf, params->len ); ret = key_import_rsa( key, params->buf, params->len );
break;
case ALG_ID_DSA: case ALG_ID_DSA:
if (flags & KEY_IMPORT_FLAG_PUBLIC) if (flags & KEY_IMPORT_FLAG_PUBLIC)
...@@ -1599,7 +1597,10 @@ static NTSTATUS key_asymmetric_import( void *args ) ...@@ -1599,7 +1597,10 @@ static NTSTATUS key_asymmetric_import( void *args )
return key_import_dsa_public( key, params->buf, params->len ); return key_import_dsa_public( key, params->buf, params->len );
} }
if (key->u.a.flags & KEY_FLAG_LEGACY_DSA_V2) if (key->u.a.flags & KEY_FLAG_LEGACY_DSA_V2)
return key_import_dsa_capi( key, params->buf, params->len ); {
ret = key_import_dsa_capi( key, params->buf, params->len );
break;
}
FIXME( "DSA private key not supported\n" ); FIXME( "DSA private key not supported\n" );
return STATUS_NOT_IMPLEMENTED; return STATUS_NOT_IMPLEMENTED;
...@@ -1607,6 +1608,26 @@ static NTSTATUS key_asymmetric_import( void *args ) ...@@ -1607,6 +1608,26 @@ static NTSTATUS key_asymmetric_import( void *args )
FIXME( "algorithm %u not yet supported\n", key->alg_id ); FIXME( "algorithm %u not yet supported\n", key->alg_id );
return STATUS_NOT_IMPLEMENTED; return STATUS_NOT_IMPLEMENTED;
} }
if (ret) return ret;
if ((ret = pgnutls_pubkey_init( &pubkey )))
{
pgnutls_perror( ret );
return STATUS_INTERNAL_ERROR;
}
if (pgnutls_pubkey_import_privkey( pubkey, key_data(params->key)->a.privkey, 0, 0 ))
{
/* Imported private key may be legitimately missing public key, so ignore the failure here. */
pgnutls_pubkey_deinit( pubkey );
}
else
{
if (key_data(key)->a.pubkey) pgnutls_pubkey_deinit( key_data(key)->a.pubkey );
key_data(key)->a.pubkey = pubkey;
}
return STATUS_SUCCESS;
} }
static NTSTATUS prepare_gnutls_signature_dsa( struct key *key, UCHAR *signature, ULONG signature_len, static NTSTATUS prepare_gnutls_signature_dsa( struct key *key, UCHAR *signature, ULONG signature_len,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment