From: Hans Leidekker hans@codeweavers.com
Based on a patch by Nikolay Sivov. --- dlls/bcrypt/bcrypt_internal.h | 22 ++++++--- dlls/bcrypt/bcrypt_main.c | 85 ++++++++++++++++++++++++++--------- dlls/bcrypt/gnutls.c | 20 +++++++++ dlls/bcrypt/tests/bcrypt.c | 75 ++++++++++++++++++++++++++++++- include/bcrypt.h | 16 +++++++ 5 files changed, 190 insertions(+), 28 deletions(-)
diff --git a/dlls/bcrypt/bcrypt_internal.h b/dlls/bcrypt/bcrypt_internal.h index 92dc6813cfc..893dbd26d0c 100644 --- a/dlls/bcrypt/bcrypt_internal.h +++ b/dlls/bcrypt/bcrypt_internal.h @@ -62,12 +62,14 @@ enum alg_id
/* secret agreement */ ALG_ID_DH, + ALG_ID_ECDH, ALG_ID_ECDH_P256, ALG_ID_ECDH_P384, ALG_ID_ECDH_P521,
/* signature */ ALG_ID_RSA_SIGN, + ALG_ID_ECDSA, ALG_ID_ECDSA_P256, ALG_ID_ECDSA_P384, ALG_ID_ECDSA_P521, @@ -89,12 +91,21 @@ enum chain_mode CHAIN_MODE_GCM, };
+enum ecc_curve_id +{ + ECC_CURVE_NONE, + ECC_CURVE_P256R1, + ECC_CURVE_P384R1, + ECC_CURVE_P521R1, +}; + struct algorithm { - struct object hdr; - enum alg_id id; - enum chain_mode mode; - unsigned flags; + struct object hdr; + enum alg_id id; + enum chain_mode mode; + unsigned flags; + enum ecc_curve_id curve_id; };
struct key_symmetric @@ -113,7 +124,8 @@ struct key_symmetric
struct key_asymmetric { - ULONG bitlen; /* ignored for ECC keys */ + ULONG bitlen; /* key strength for ECC keys */ + enum ecc_curve_id curve_id; unsigned flags; DSSSEED dss_seed; }; diff --git a/dlls/bcrypt/bcrypt_main.c b/dlls/bcrypt/bcrypt_main.c index c3045a330a0..a4eacd4a993 100644 --- a/dlls/bcrypt/bcrypt_main.c +++ b/dlls/bcrypt/bcrypt_main.c @@ -116,10 +116,12 @@ builtin_algorithms[] = { BCRYPT_MD2_ALGORITHM, BCRYPT_HASH_INTERFACE, 270, 16, 128 }, { BCRYPT_RSA_ALGORITHM, BCRYPT_ASYMMETRIC_ENCRYPTION_INTERFACE, 0, 0, 0 }, { BCRYPT_DH_ALGORITHM, BCRYPT_SECRET_AGREEMENT_INTERFACE, 0, 0, 0 }, + { BCRYPT_ECDH_ALGORITHM, BCRYPT_SECRET_AGREEMENT_INTERFACE, 0, 0, 0 }, { BCRYPT_ECDH_P256_ALGORITHM, BCRYPT_SECRET_AGREEMENT_INTERFACE, 0, 0, 0 }, { BCRYPT_ECDH_P384_ALGORITHM, BCRYPT_SECRET_AGREEMENT_INTERFACE, 0, 0, 0 }, { BCRYPT_ECDH_P521_ALGORITHM, BCRYPT_SECRET_AGREEMENT_INTERFACE, 0, 0, 0 }, { BCRYPT_RSA_SIGN_ALGORITHM, BCRYPT_SIGNATURE_INTERFACE, 0, 0, 0 }, + { BCRYPT_ECDSA_ALGORITHM, BCRYPT_SIGNATURE_INTERFACE, 0, 0, 0 }, { BCRYPT_ECDSA_P256_ALGORITHM, BCRYPT_SIGNATURE_INTERFACE, 0, 0, 0 }, { BCRYPT_ECDSA_P384_ALGORITHM, BCRYPT_SIGNATURE_INTERFACE, 0, 0, 0 }, { BCRYPT_ECDSA_P521_ALGORITHM, BCRYPT_SIGNATURE_INTERFACE, 0, 0, 0 }, @@ -220,7 +222,7 @@ static const struct algorithm pseudo_algorithms[] = {{ MAGIC_ALG }, ALG_ID_SHA384, 0, BCRYPT_ALG_HANDLE_HMAC_FLAG }, {{ MAGIC_ALG }, ALG_ID_SHA512, 0, BCRYPT_ALG_HANDLE_HMAC_FLAG }, {{ MAGIC_ALG }, ALG_ID_RSA }, - {{ 0 }}, /* ECDSA */ + {{ MAGIC_ALG }, ALG_ID_ECDSA }, {{ 0 }}, /* AES_CMAC */ {{ 0 }}, /* AES_GMAC */ {{ MAGIC_ALG }, ALG_ID_MD2, 0, BCRYPT_ALG_HANDLE_HMAC_FLAG }, @@ -246,14 +248,14 @@ static const struct algorithm pseudo_algorithms[] = {{ 0 }}, /* RC2_ECB */ {{ 0 }}, /* RC2_CFB */ {{ MAGIC_ALG }, ALG_ID_DH }, - {{ 0 }}, /* ECDH */ - {{ MAGIC_ALG }, ALG_ID_ECDH_P256 }, - {{ MAGIC_ALG }, ALG_ID_ECDH_P384 }, - {{ MAGIC_ALG }, ALG_ID_ECDH_P521 }, + {{ MAGIC_ALG }, ALG_ID_ECDH }, + {{ MAGIC_ALG }, ALG_ID_ECDH_P256, 0, 0, ECC_CURVE_P256R1 }, + {{ MAGIC_ALG }, ALG_ID_ECDH_P384, 0, 0, ECC_CURVE_P384R1 }, + {{ MAGIC_ALG }, ALG_ID_ECDH_P521, 0, 0, ECC_CURVE_P521R1 }, {{ MAGIC_ALG }, ALG_ID_DSA }, - {{ MAGIC_ALG }, ALG_ID_ECDSA_P256 }, - {{ MAGIC_ALG }, ALG_ID_ECDSA_P384 }, - {{ MAGIC_ALG }, ALG_ID_ECDSA_P521 }, + {{ MAGIC_ALG }, ALG_ID_ECDSA_P256, 0, 0, ECC_CURVE_P256R1 }, + {{ MAGIC_ALG }, ALG_ID_ECDSA_P384, 0, 0, ECC_CURVE_P384R1 }, + {{ MAGIC_ALG }, ALG_ID_ECDSA_P521, 0, 0, ECC_CURVE_P521R1 }, {{ MAGIC_ALG }, ALG_ID_RSA_SIGN }, };
@@ -762,6 +764,31 @@ static NTSTATUS set_alg_property( struct algorithm *alg, const WCHAR *prop, UCHA FIXME( "unsupported rc4 algorithm property %s\n", debugstr_w(prop) ); return STATUS_NOT_IMPLEMENTED;
+ case ALG_ID_ECDH: + case ALG_ID_ECDSA: + if (!wcscmp( prop, BCRYPT_ECC_CURVE_NAME )) + { + if (!wcscmp( (WCHAR *)value, BCRYPT_ECC_CURVE_SECP256R1 )) + { + alg->curve_id = ECC_CURVE_P256R1; + return STATUS_SUCCESS; + } + else if (!wcscmp( (WCHAR *)value, BCRYPT_ECC_CURVE_SECP384R1 )) + { + alg->curve_id = ECC_CURVE_P384R1; + return STATUS_SUCCESS; + } + else if (!wcscmp( (WCHAR *)value, BCRYPT_ECC_CURVE_SECP521R1 )) + { + alg->curve_id = ECC_CURVE_P521R1; + return STATUS_SUCCESS; + } + FIXME( "unsupported curve %s\n", debugstr_w((WCHAR *)value) ); + return STATUS_NOT_IMPLEMENTED; + } + FIXME( "unsupported ECDH/ECDSA algorithm property %s\n", debugstr_w(prop) ); + return STATUS_NOT_IMPLEMENTED; + default: FIXME( "unsupported algorithm %u\n", alg->id ); return STATUS_NOT_IMPLEMENTED; @@ -1113,7 +1140,20 @@ NTSTATUS WINAPI BCryptHash( BCRYPT_ALG_HANDLE handle, UCHAR *secret, ULONG secre return hash_single(alg, secret, secret_len, input, input_len, output, output_len ); }
-static NTSTATUS key_asymmetric_create( enum alg_id alg_id, ULONG bitlen, struct key **ret_key ) +static ULONG curve_strength( enum ecc_curve_id curve_id ) +{ + switch (curve_id) + { + case ECC_CURVE_P256R1: return 256; + case ECC_CURVE_P384R1: return 384; + case ECC_CURVE_P521R1: return 521; + default: + FIXME( "unsupported curve %u\n", curve_id ); + return 0; + } +} + +static NTSTATUS key_asymmetric_create( enum alg_id alg_id, enum ecc_curve_id curve_id, ULONG bitlen, struct key **ret_key ) { struct key *key;
@@ -1126,9 +1166,10 @@ static NTSTATUS key_asymmetric_create( enum alg_id alg_id, ULONG bitlen, struct if (alg_id == ALG_ID_DH && bitlen < 512) return STATUS_INVALID_PARAMETER;
if (!(key = calloc( 1, sizeof(*key) ))) return STATUS_NO_MEMORY; - key->hdr.magic = MAGIC_KEY; - key->alg_id = alg_id; - key->u.a.bitlen = bitlen; + key->hdr.magic = MAGIC_KEY; + key->alg_id = alg_id; + key->u.a.bitlen = curve_id ? curve_strength( curve_id ) : bitlen; + key->u.a.curve_id = curve_id;
*ret_key = key; return STATUS_SUCCESS; @@ -1783,7 +1824,7 @@ static NTSTATUS key_import_pair( struct algorithm *alg, const WCHAR *type, BCRYP if (ecc_blob->cbKey != len_from_bitlen( bitlen ) || input_len < sizeof(*ecc_blob) + ecc_blob->cbKey * 2) return STATUS_INVALID_PARAMETER;
- if ((status = key_asymmetric_create( alg->id, bitlen, &key ))) return status; + if ((status = key_asymmetric_create( alg->id, 0, bitlen, &key ))) return status; params.key = key; params.flags = KEY_IMPORT_FLAG_PUBLIC; params.buf = input; @@ -1842,7 +1883,7 @@ static NTSTATUS key_import_pair( struct algorithm *alg, const WCHAR *type, BCRYP if (ecc_blob->cbKey != len_from_bitlen( bitlen ) || input_len < sizeof(*ecc_blob) + ecc_blob->cbKey * 3) return STATUS_INVALID_PARAMETER;
- if ((status = key_asymmetric_create( alg->id, bitlen, &key ))) return status; + if ((status = key_asymmetric_create( alg->id, 0, bitlen, &key ))) return status; params.key = key; params.flags = 0; params.buf = input; @@ -1864,7 +1905,7 @@ static NTSTATUS key_import_pair( struct algorithm *alg, const WCHAR *type, BCRYP size = sizeof(*rsa_blob) + rsa_blob->cbPublicExp + rsa_blob->cbModulus; if (size != input_len) return NTE_BAD_DATA;
- if ((status = key_asymmetric_create( alg->id, rsa_blob->BitLength, &key ))) return status; + if ((status = key_asymmetric_create( alg->id, 0, rsa_blob->BitLength, &key ))) return status; params.key = key; params.flags = KEY_IMPORT_FLAG_PUBLIC; params.buf = input; @@ -1883,7 +1924,7 @@ static NTSTATUS key_import_pair( struct algorithm *alg, const WCHAR *type, BCRYP if (alg->id != ALG_ID_RSA || (rsa_blob->Magic != BCRYPT_RSAPRIVATE_MAGIC && rsa_blob->Magic != BCRYPT_RSAFULLPRIVATE_MAGIC)) return STATUS_NOT_SUPPORTED;
- if ((status = key_asymmetric_create( alg->id, rsa_blob->BitLength, &key ))) return status; + if ((status = key_asymmetric_create( alg->id, 0, rsa_blob->BitLength, &key ))) return status; params.key = key; params.flags = 0; params.buf = input; @@ -1915,7 +1956,7 @@ static NTSTATUS key_import_pair( struct algorithm *alg, const WCHAR *type, BCRYP if (alg->id != ALG_ID_DSA || dsa_blob->dwMagic != BCRYPT_DSA_PUBLIC_MAGIC) return STATUS_NOT_SUPPORTED;
- if ((status = key_asymmetric_create( alg->id, dsa_blob->cbKey * 8, &key ))) return status; + if ((status = key_asymmetric_create( alg->id, 0, dsa_blob->cbKey * 8, &key ))) return status; params.key = key; params.flags = KEY_IMPORT_FLAG_PUBLIC; params.buf = input; @@ -1951,7 +1992,7 @@ static NTSTATUS key_import_pair( struct algorithm *alg, const WCHAR *type, BCRYP if (input_len < sizeof(*hdr) + sizeof(*pubkey) + len_from_bitlen( pubkey->bitlen ) * 2 + 40 + sizeof(DSSSEED)) return STATUS_INVALID_PARAMETER;
- if ((status = key_asymmetric_create( alg->id, pubkey->bitlen, &key ))) return status; + if ((status = key_asymmetric_create( alg->id, 0, pubkey->bitlen, &key ))) return status; key->u.a.flags |= KEY_FLAG_LEGACY_DSA_V2; params.key = key; params.flags = 0; @@ -1984,7 +2025,7 @@ static NTSTATUS key_import_pair( struct algorithm *alg, const WCHAR *type, BCRYP size = sizeof(*hdr) + sizeof(*pubkey) + len_from_bitlen( pubkey->bitlen ) * 3 + 20 + sizeof(DSSSEED); if (input_len < size) return STATUS_INVALID_PARAMETER;
- if ((status = key_asymmetric_create( alg->id, pubkey->bitlen, &key ))) return status; + if ((status = key_asymmetric_create( alg->id, 0, pubkey->bitlen, &key ))) return status; key->u.a.flags |= KEY_FLAG_LEGACY_DSA_V2; params.key = key; params.flags = KEY_IMPORT_FLAG_PUBLIC; @@ -2004,7 +2045,7 @@ static NTSTATUS key_import_pair( struct algorithm *alg, const WCHAR *type, BCRYP if (alg->id != ALG_ID_DH || dh_blob->dwMagic != BCRYPT_DH_PRIVATE_MAGIC) return STATUS_NOT_SUPPORTED;
- if ((status = key_asymmetric_create( alg->id, dh_blob->cbKey * 8, &key ))) return status; + if ((status = key_asymmetric_create( alg->id, 0, dh_blob->cbKey * 8, &key ))) return status; params.key = key; params.flags = 0; params.buf = input; @@ -2023,7 +2064,7 @@ static NTSTATUS key_import_pair( struct algorithm *alg, const WCHAR *type, BCRYP if (alg->id != ALG_ID_DH || dh_blob->dwMagic != BCRYPT_DH_PUBLIC_MAGIC) return STATUS_NOT_SUPPORTED;
- if ((status = key_asymmetric_create( alg->id, dh_blob->cbKey * 8, &key ))) return status; + if ((status = key_asymmetric_create( alg->id, 0, dh_blob->cbKey * 8, &key ))) return status; params.key = key; params.flags = KEY_IMPORT_FLAG_PUBLIC; params.buf = input; @@ -2081,7 +2122,7 @@ NTSTATUS WINAPI BCryptGenerateKeyPair( BCRYPT_ALG_HANDLE handle, BCRYPT_KEY_HAND if (!alg) return STATUS_INVALID_HANDLE; if (!ret_handle) return STATUS_INVALID_PARAMETER;
- if ((status = key_asymmetric_create( alg->id, key_len, &key ))) return status; + if ((status = key_asymmetric_create( alg->id, alg->curve_id, key_len, &key ))) return status; *ret_handle = key; TRACE( "returning handle %p\n", *ret_handle ); return STATUS_SUCCESS; diff --git a/dlls/bcrypt/gnutls.c b/dlls/bcrypt/gnutls.c index 78f30dc7c83..d64b9651b45 100644 --- a/dlls/bcrypt/gnutls.c +++ b/dlls/bcrypt/gnutls.c @@ -1129,6 +1129,26 @@ static NTSTATUS key_asymmetric_generate( void *args ) bitlen = key->u.a.bitlen; break;
+ case ALG_ID_ECDH: + case ALG_ID_ECDSA: + pk_alg = GNUTLS_PK_ECC; + switch (key->u.a.curve_id) + { + case ECC_CURVE_P256R1: + bitlen = GNUTLS_CURVE_TO_BITS( GNUTLS_ECC_CURVE_SECP256R1 ); + break; + case ECC_CURVE_P384R1: + bitlen = GNUTLS_CURVE_TO_BITS( GNUTLS_ECC_CURVE_SECP384R1 ); + break; + case ECC_CURVE_P521R1: + bitlen = GNUTLS_CURVE_TO_BITS( GNUTLS_ECC_CURVE_SECP521R1 ); + break; + default: + FIXME( "unsupported ECDH/ECDSA curve %u\n", key->u.a.curve_id ); + return STATUS_INVALID_PARAMETER; + } + break; + case ALG_ID_ECDH_P256: case ALG_ID_ECDSA_P256: pk_alg = GNUTLS_PK_ECC; /* compatible with ECDSA and ECDH */ diff --git a/dlls/bcrypt/tests/bcrypt.c b/dlls/bcrypt/tests/bcrypt.c index 36f86851b3e..6ffb8d3c375 100644 --- a/dlls/bcrypt/tests/bcrypt.c +++ b/dlls/bcrypt/tests/bcrypt.c @@ -2260,7 +2260,7 @@ static void test_ECDSA(void) BCRYPT_KEY_HANDLE key; NTSTATUS status; DWORD keylen; - ULONG size; + ULONG size, strength;
status = BCryptOpenAlgorithmProvider(&alg, BCRYPT_ECDSA_P256_ALGORITHM, NULL, 0); ok(!status, "got %#lx\n", status); @@ -2415,6 +2415,40 @@ static void test_ECDSA(void)
BCryptDestroyKey(key); BCryptCloseAlgorithmProvider(alg, 0); + + /* generic ECDSA provider */ + status = BCryptOpenAlgorithmProvider(&alg, BCRYPT_ECDSA_ALGORITHM, NULL, 0); + ok(status == STATUS_SUCCESS, "got %#lx\n", status); + + status = BCryptGenerateKeyPair(alg, &key, 0, 0); + ok(status == STATUS_SUCCESS, "got %#lx\n", status); + + status = BCryptFinalizeKeyPair(key, 0); + ok(status == STATUS_INVALID_PARAMETER, "got %#lx\n", status); + BCryptDestroyKey(key); + BCryptCloseAlgorithmProvider(alg, 0); + + status = BCryptOpenAlgorithmProvider(&alg, BCRYPT_ECDSA_ALGORITHM, NULL, 0); + ok(status == STATUS_SUCCESS, "got %#lx\n", status); + + status = BCryptSetProperty(alg, BCRYPT_ECC_CURVE_NAME, (UCHAR *)BCRYPT_ECC_CURVE_SECP256R1, sizeof(BCRYPT_ECC_CURVE_SECP256R1), 0); + ok(status == STATUS_SUCCESS, "got %#lx\n", status); + + status = BCryptGenerateKeyPair(alg, &key, 255, 0); + todo_wine ok(status == STATUS_INVALID_PARAMETER, "got %#lx\n", status); + + status = BCryptGenerateKeyPair(alg, &key, 0, 0); + ok(status == STATUS_SUCCESS, "got %#lx\n", status); + + strength = 0; + status = BCryptGetProperty(key, BCRYPT_KEY_STRENGTH, (UCHAR *)&strength, sizeof(strength), &size, 0); + ok(status == STATUS_SUCCESS, "got %#lx\n", status); + ok(strength == 256, "got %lu\n", strength); + + status = BCryptFinalizeKeyPair(key, 0); + ok(status == STATUS_SUCCESS, "got %#lx\n", status); + BCryptDestroyKey(key); + BCryptCloseAlgorithmProvider(alg, 0); }
static UCHAR rsaPublicBlob[] = @@ -3294,6 +3328,11 @@ derive_end:
static void test_ECDH(void) { + BCRYPT_ALG_HANDLE alg; + BCRYPT_KEY_HANDLE key; + NTSTATUS status; + ULONG strength, size; + static BYTE ecc256privkey[] = { 0x45, 0x43, 0x4b, 0x32, 0x20, 0x00, 0x00, 0x00, @@ -3428,6 +3467,40 @@ static void test_ECDH(void) test_ECDH_alg(&tests[i]); winetest_pop_context(); } + + /* generic ECDH provider */ + status = BCryptOpenAlgorithmProvider(&alg, BCRYPT_ECDH_ALGORITHM, NULL, 0); + ok(status == STATUS_SUCCESS, "got %#lx\n", status); + + status = BCryptGenerateKeyPair(alg, &key, 0, 0); + ok(status == STATUS_SUCCESS, "got %#lx\n", status); + + status = BCryptFinalizeKeyPair(key, 0); + ok(status == STATUS_INVALID_PARAMETER, "got %#lx\n", status); + BCryptDestroyKey(key); + BCryptCloseAlgorithmProvider(alg, 0); + + status = BCryptOpenAlgorithmProvider(&alg, BCRYPT_ECDH_ALGORITHM, NULL, 0); + ok(status == STATUS_SUCCESS, "got %#lx\n", status); + + status = BCryptSetProperty(alg, BCRYPT_ECC_CURVE_NAME, (UCHAR *)BCRYPT_ECC_CURVE_SECP256R1, sizeof(BCRYPT_ECC_CURVE_SECP256R1), 0); + ok(status == STATUS_SUCCESS, "got %#lx\n", status); + + status = BCryptGenerateKeyPair(alg, &key, 255, 0); + todo_wine ok(status == STATUS_INVALID_PARAMETER, "got %#lx\n", status); + + status = BCryptGenerateKeyPair(alg, &key, 0, 0); + ok(status == STATUS_SUCCESS, "got %#lx\n", status); + + strength = 0; + status = BCryptGetProperty(key, BCRYPT_KEY_STRENGTH, (UCHAR *)&strength, sizeof(strength), &size, 0); + ok(status == STATUS_SUCCESS, "got %#lx\n", status); + ok(strength == 256, "got %lu\n", strength); + + status = BCryptFinalizeKeyPair(key, 0); + ok(status == STATUS_SUCCESS, "got %#lx\n", status); + BCryptDestroyKey(key); + BCryptCloseAlgorithmProvider(alg, 0); }
static BYTE dh_pubkey[] = diff --git a/include/bcrypt.h b/include/bcrypt.h index 3333d2a64be..26550bb4b96 100644 --- a/include/bcrypt.h +++ b/include/bcrypt.h @@ -89,9 +89,11 @@ typedef LONG NTSTATUS; #define BCRYPT_DES_ALGORITHM L"DES" #define BCRYPT_DH_ALGORITHM L"DH" #define BCRYPT_DSA_ALGORITHM L"DSA" +#define BCRYPT_ECDH_ALGORITHM L"ECDH" #define BCRYPT_ECDH_P256_ALGORITHM L"ECDH_P256" #define BCRYPT_ECDH_P384_ALGORITHM L"ECDH_P384" #define BCRYPT_ECDH_P521_ALGORITHM L"ECDH_P521" +#define BCRYPT_ECDSA_ALGORITHM L"ECDSA" #define BCRYPT_ECDSA_P256_ALGORITHM L"ECDSA_P256" #define BCRYPT_ECDSA_P384_ALGORITHM L"ECDSA_P384" #define BCRYPT_ECDSA_P521_ALGORITHM L"ECDSA_P521" @@ -116,6 +118,12 @@ typedef LONG NTSTATUS; #define BCRYPT_CHAIN_MODE_CCM L"ChainingModeCCM" #define BCRYPT_CHAIN_MODE_GCM L"ChainingModeGCM"
+#define BCRYPT_ECC_CURVE_NAME L"ECCCurveName" +#define BCRYPT_ECC_CURVE_BRAINPOOLP256R1 L"brainpoolP256r1" +#define BCRYPT_ECC_CURVE_SECP256R1 L"secP256r1" +#define BCRYPT_ECC_CURVE_SECP384R1 L"secP384r1" +#define BCRYPT_ECC_CURVE_SECP521R1 L"secP521r1" + #define BCRYPT_KDF_HASH L"HASH" #define BCRYPT_KDF_HMAC L"HMAC" #define BCRYPT_KDF_TLS_PRF L"TLS_PRF" @@ -174,9 +182,11 @@ static const WCHAR BCRYPT_AES_ALGORITHM[] = {'A','E','S',0}; static const WCHAR BCRYPT_DES_ALGORITHM[] = {'D','E','S',0}; static const WCHAR BCRYPT_DH_ALGORITHM[] = {'D','H',0}; static const WCHAR BCRYPT_DSA_ALGORITHM[] = {'D','S','A',0}; +static const WCHAR BCRYPT_ECDH_ALGORITHM[] = {'E','C','D','H',0}; static const WCHAR BCRYPT_ECDH_P256_ALGORITHM[] = {'E','C','D','H','_','P','2','5','6',0}; static const WCHAR BCRYPT_ECDH_P384_ALGORITHM[] = {'E','C','D','H','_','P','3','8','4',0}; static const WCHAR BCRYPT_ECDH_P521_ALGORITHM[] = {'E','C','D','H','_','P','5','2','1',0}; +static const WCHAR BCRYPT_ECDSA_ALGORITHM[] = {'E','C','D','S','A',0}; static const WCHAR BCRYPT_ECDSA_P256_ALGORITHM[] = {'E','C','D','S','A','_','P','2','5','6',0}; static const WCHAR BCRYPT_ECDSA_P384_ALGORITHM[] = {'E','C','D','S','A','_','P','3','8','4',0}; static const WCHAR BCRYPT_ECDSA_P521_ALGORITHM[] = {'E','C','D','S','A','_','P','5','2','1',0}; @@ -201,6 +211,12 @@ static const WCHAR BCRYPT_CHAIN_MODE_CFB[] = {'C','h','a','i','n','i','n','g','M static const WCHAR BCRYPT_CHAIN_MODE_CCM[] = {'C','h','a','i','n','i','n','g','M','o','d','e','C','C','M',0}; static const WCHAR BCRYPT_CHAIN_MODE_GCM[] = {'C','h','a','i','n','i','n','g','M','o','d','e','G','C','M',0};
+static const WCHAR BCRYPT_ECC_CURVE_NAME[] = {'E','C','C','C','u','r','v','e','N','a','m','e',0}; +static const WCHAR BCRYPT_ECC_CURVE_BRAINPOOLP256R1[] = {'b','r','a','i','n','p','o','o','l','P','2','5','6','r','1',0}; +static const WCHAR BCRYPT_ECC_CURVE_SECP256R1[] = {'s','e','c','P','2','5','6','r','1',0}; +static const WCHAR BCRYPT_ECC_CURVE_SECP384R1[] = {'s','e','c','P','3','8','4','r','1',0}; +static const WCHAR BCRYPT_ECC_CURVE_SECP521R1[] = {'s','e','c','P','5','2','1','r','1',0}; + static const WCHAR BCRYPT_KDF_HASH[] = {'H','A','S','H',0}; static const WCHAR BCRYPT_KDF_HMAC[] = {'H','M','A','C',0}; static const WCHAR BCRYPT_KDF_TLS_PRF[] = {'T','L','S','_','P','R','F',0};