25#define WIN32_NO_STATUS
32#include <wine/unicode.h>
35#ifdef SONAME_LIBMBEDTLS
59 FIXME(
"%#lx, %s, %#lx, %s, %s, %lu: stub\n",
table,
debugstr_w(
ctx), iface,
debugstr_w(
func),
71 const WCHAR *provider )
101#define MAX_HASH_OUTPUT_BYTES 64
102#define MAX_HASH_BLOCK_BITS 1024
187 TRACE(
"%#lx, %p, %p, %#lx\n",
type, ret_count, ret_list,
flags );
290 FIXME(
"pseudo-handle %p not supported\n",
handle );
333 FIXME(
"pseudo-handle %p not supported\n",
handle );
342 if (
flags & ~supported_flags)
343 FIXME(
"unsupported flags %#lx\n",
flags & ~supported_flags);
346 FIXME(
"ignoring selected algorithm\n");
357 FIXME(
"called with unsupported parameters, returning error\n");
383 if (
flags & ~supported_flags)
385 FIXME(
"unsupported flags %#lx\n",
flags & ~supported_flags );
405 FIXME(
"implementation %s not supported\n",
debugstr_w(implementation) );
737 FIXME(
"unsupported algorithm %u\n", alg->
id );
861 TRACE(
"%p, %s, %p, %lu, %p, %#lx\n",
handle,
wine_dbgstr_w(prop),
buffer,
count,
res,
flags );
875 const struct key *
key = (
const struct key *)
object;
894 struct hash *hash_temp;
908 if (!(hash_temp =
calloc( 1,
sizeof(*hash_temp) )))
return;
919 for (
i = 0;
i < block_bytes;
i++)
buffer[
i] ^= 0x5c;
921 for (
i = 0;
i < block_bytes;
i++)
buffer[
i] ^= (0x5c ^ 0x36);
927 struct hash **ret_hash )
958 TRACE(
"%p, %p, %p, %lu, %p, %lu, %#lx\n",
handle, ret_handle,
object, object_len,
secret,
secret_len,
flags );
964 if (
object)
FIXME(
"ignoring object buffer\n" );
971 TRACE(
"returning handle %p\n", *ret_handle );
979 struct hash *hash_copy;
981 TRACE(
"%p, %p, %p, %lu, %#lx\n",
handle, handle_copy,
object, objectlen,
flags );
985 if (
object)
FIXME(
"ignoring object buffer\n" );
989 memcpy( hash_copy, hash_orig,
sizeof(*hash_orig) );
997 *handle_copy = hash_copy;
998 TRACE(
"returning handle %p\n", *handle_copy );
1096 TRACE(
"%p, %p, %lu, %p, %lu, %p, %lu\n",
handle,
secret, secret_len,
input, input_len, output, output_len );
1113 key->
u.
a.bitlen = bitlen;
1133 key->
u.
s.vector_len = 0;
1137 key->
u.
s.vector_len = vector_len;
1155 if (!(
ret->u.s.secret =
malloc( secret_len )))
1162 ret->u.s.secret_len = secret_len;
1209 WARN(
"secret_len %lu exceeds key max length %lu, setting to maximum\n", secret_len,
size );
1214 WARN(
"secret_len %lu is less than minimum key length %lu\n", secret_len,
size );
1219 WARN(
"secret_len %lu is not a valid key length\n", secret_len );
1240 ULONG bytes_left = input_len;
1267 auth_params.encrypt =
FALSE;
1271 decrypt_params.
key =
key;
1274 decrypt_params.
output = output;
1281 tag_params.
len =
sizeof(
tag);
1302 bytes_left -=
key->
u.
s.block_size;
1309 decrypt_params.
key =
key;
1312 decrypt_params.
output = output;
1314 while (bytes_left >=
key->
u.
s.block_size)
1319 bytes_left -=
key->
u.
s.block_size;
1342 if (
key->
u.
s.vector && input_len >=
key->
u.
s.vector_len)
1347 else if (
key->
u.
s.vector)
1348 FIXME(
"Unexpected vector len %lu, *ret_len %lu.\n",
key->
u.
s.vector_len, *
ret_len );
1368 for (
j = 5;
j >= 0;
j--)
1370 r = plain + (
n - 1) * 8;
1371 for (
i =
n;
i >= 1;
i--)
1402 FIXME(
"decryption of key not supported\n" );
1414 FIXME(
"unknown key data blob version %lu\n",
header->dwVersion );
1436 len = input_len - 8;
1455 ULONG bytes_left = input_len;
1468 FIXME(
"call chaining not implemented\n" );
1482 auth_params.encrypt =
TRUE;
1486 encrypt_params.
key =
key;
1489 encrypt_params.
output = output;
1503 else if (input_len & (
key->
u.
s.block_size - 1))
1511 encrypt_params.
key =
key;
1514 encrypt_params.
output = output;
1516 while (bytes_left >=
key->
u.
s.block_size)
1522 bytes_left -=
key->
u.
s.block_size;
1531 memset(
buf + bytes_left,
key->
u.
s.block_size - bytes_left,
key->
u.
s.block_size - bytes_left );
1544 else if (
key->
u.
s.vector)
1545 FIXME(
"Unexpected vector len %lu, *ret_len %lu.\n",
key->
u.
s.vector_len, *
ret_len );
1566 for (
j = 0;
j <= 5;
j++)
1569 for (
i = 1;
i <=
n;
i++)
1597 FIXME(
"encryption of key not supported\n" );
1699 len =
sizeof(**rsa_data) +
sizeof(
blob->rsapubkey.pubexp) +
blob->rsapubkey.bitlen / 4;
1703 (*rsa_data)->
Magic =
blob->rsapubkey.magic;
1704 (*rsa_data)->BitLength =
blob->rsapubkey.bitlen;
1705 (*rsa_data)->cbPublicExp =
sizeof(
blob->rsapubkey.pubexp);
1706 (*rsa_data)->cbModulus =
blob->rsapubkey.bitlen / 8;
1707 (*rsa_data)->cbPrime1 =
blob->rsapubkey.bitlen / 16;
1708 (*rsa_data)->cbPrime2 =
blob->rsapubkey.bitlen / 16;
1709 len =
sizeof(**rsa_data);
1711 for(
i = 0;
i < (*rsa_data)->cbPublicExp;
i++)
1712 conv[
len++] = ((
UCHAR *)&
blob->rsapubkey.pubexp)[(*rsa_data)->cbPublicExp -
i - 1];
1714 for(
i = 0;
i < (*rsa_data)->cbModulus;
i++)
1715 conv[
len++] =
input[
pos + (*rsa_data)->cbModulus -
i - 1];
1716 pos += (*rsa_data)->cbModulus;
1717 for(
i = 0;
i < (*rsa_data)->cbPrime1;
i++)
1718 conv[
len++] =
input[
pos + (*rsa_data)->cbPrime1 -
i - 1];
1719 pos += (*rsa_data)->cbPrime1;
1720 for(
i = 0;
i < (*rsa_data)->cbPrime2;
i++)
1721 conv[
len++] =
input[
pos + (*rsa_data)->cbPrime2 -
i - 1];
1738 DWORD key_size, magic;
1765 FIXME(
"algorithm %u does not yet support importing blob of type %s\n", alg->
id,
debugstr_w(
type) );
1770 if (ecc_blob->
cbKey != key_size || input_len <
sizeof(*ecc_blob) + ecc_blob->
cbKey * 2)
1787 DWORD key_size, magic;
1809 FIXME(
"algorithm %u does not yet support importing blob of type %s\n", alg->
id,
debugstr_w(
type) );
1814 if (ecc_blob->
cbKey != key_size || input_len <
sizeof(*ecc_blob) + ecc_blob->
cbKey * 3)
1910 FIXME(
"blob type %u version %u alg id %u not supported\n",
hdr->bType,
hdr->bVersion,
hdr->aiKeyAlg );
1923 if (input_len <
sizeof(*
hdr) +
sizeof(*pubkey) + (
pubkey->bitlen / 8) * 2 + 40 +
sizeof(
DSSSEED))
1948 FIXME(
"blob type %u version %u alg id %u not supported\n",
hdr->bType,
hdr->bVersion,
hdr->aiKeyAlg );
1956 size =
sizeof(*hdr) +
sizeof(*pubkey) + (
pubkey->bitlen / 8) * 3 + 20 +
sizeof(
DSSSEED);
2030 TRACE(
"%p, %p, %p, %lu, %p, %lu, %#lx\n",
handle, ret_handle,
object, object_len,
secret, secret_len,
flags );
2031 if (
object)
FIXME(
"ignoring object buffer\n" );
2034 TRACE(
"returning handle %p\n", *ret_handle );
2052 TRACE(
"returning handle %p\n", *ret_handle );
2074 struct key *decrypt_key =
NULL;
2077 TRACE(
"%p, %p, %s, %p, %p, %lu, %p, %lu, %#lx\n",
handle, decrypt_key_handle,
debugstr_w(
type), ret_handle,
2078 object, object_len,
input, input_len,
flags );
2085 TRACE(
"returning handle %p\n", *ret_handle );
2093 struct key *encrypt_key =
NULL;
2095 TRACE(
"%p, %p, %s, %p, %lu, %p, %#lx\n", export_key_handle, encrypt_key_handle,
debugstr_w(
type), output,
2108 struct key *key_copy;
2113 key_copy->
hdr = key_orig->
hdr;
2125 key_copy->
u.
s.mode = key_orig->
u.
s.mode;
2126 key_copy->
u.
s.block_size = key_orig->
u.
s.block_size;
2128 key_copy->
u.
s.secret_len = key_orig->
u.
s.secret_len;
2130 *ret_key = key_copy;
2134 key_copy->
u.
a.bitlen = key_orig->
u.
a.bitlen;
2135 key_copy->
u.
a.flags = key_orig->
u.
a.flags;
2136 key_copy->
u.
a.dss_seed = key_orig->
u.
a.dss_seed;
2138 params.key_orig = key_orig;
2139 params.key_copy = key_copy;
2141 else free( key_copy );
2149 struct key *key_copy;
2152 TRACE(
"%p, %p, %p, %lu, %#lx\n",
handle, handle_copy,
object, object_len,
flags );
2153 if (
object)
FIXME(
"ignoring object buffer\n" );
2160 *handle_copy = key_copy;
2161 TRACE(
"returning handle %p\n", *handle_copy );
2171 if (input_len <
sizeof(*
blob))
return NULL;
2173 switch (
blob->Magic)
2188 FIXME(
"unsupported key magic %#lx\n",
blob->Magic );
2199 TRACE(
"%p, %p, %s, %p, %p, %lu, %#lx\n",
handle, decrypt_key_handle,
debugstr_w(
type), ret_handle,
input,
2205 if (decrypt_key_handle)
2207 FIXME(
"decryption of key not yet supported\n" );
2212 TRACE(
"returning handle %p\n", *ret_handle );
2222 TRACE(
"%p, %p, %p, %lu, %p, %lu, %p, %#lx\n",
handle,
padding,
input, input_len, output, output_len,
2231 params.input_len = input_len;
2233 params.output_len = output_len;
2245 TRACE(
"%p, %p, %p, %lu, %p, %lu, %#lx\n",
handle,
padding,
hash, hash_len,
signature, signature_len,
flags );
2254 params.hash_len = hash_len;
2256 params.signature_len = signature_len;
2279 TRACE(
"%p, %p, %lu, %p, %p, %lu, %p, %lu, %p, %#lx\n",
handle,
input,
input_len,
padding, iv, iv_len,
output,
2288 FIXME(
"flags %#lx not implemented\n",
flags );
2299 FIXME(
"flags %#lx not implemented\n",
flags );
2307 asymmetric_params.
key =
key;
2325 TRACE(
"%p, %p, %lu, %p, %p, %lu, %p, %lu, %p, %#lx\n",
handle,
input,
input_len,
padding, iv, iv_len,
output,
2334 FIXME(
"flags %#lx not supported\n",
flags );
2346 FIXME(
"flags %#lx not implemented\n",
flags );
2392#define HMAC_PAD_LEN 64
2407 FIXME(
"algorithm handle not supported\n" );
2418 for (
i = 0;
i <
sizeof(pad1);
i++)
2420 pad1[
i] = 0x36 ^ (
i <
len ?
buf[
i] : 0);
2421 pad2[
i] = 0x5c ^ (
i <
len ?
buf[
i] : 0);
2455 bytes[0] = (
i >> 24) & 0xff;
2456 bytes[1] = (
i >> 16) & 0xff;
2457 bytes[2] = (
i >> 8) & 0xff;
2465 else for (
k = 0;
k < hash_len;
k++)
dst[
k] ^=
buf[
k];
2475 ULONG hash_len, block_count, bytes_left,
i;
2483 block_count = 1 + ((
dk_len - 1) / hash_len);
2484 bytes_left =
dk_len - (block_count - 1) * hash_len;
2489 for (
i = 1;
i < block_count;
i++)
2499 if (!(partial =
malloc( hash_len )))
2511 memcpy(
dk + ((block_count - 1) * hash_len), partial, bytes_left );
2523 TRACE(
"%p, %p, %lu, %p, %lu, %s, %p, %lu, %#lx\n",
handle,
pwd,
pwd_len,
salt,
salt_len,
2538 TRACE(
"%p, %p, %p, %#lx\n", privkey_handle, pubkey_handle, ret_handle,
flags );
2559 TRACE(
"returning handle %p\n", *ret_handle );
2579 for (
i = 0;
i <
len / 2;
i++)
2638 else FIXME(
"buffer type %lu not supported\n",
desc->pBuffers[
i].BufferType );
2646 params.output = derived_key;
2647 params.output_len = derived_key_len;
2651 free( derived_key );
2656#if !defined(__REACTOS__)
2657 assert( hash_len <=
sizeof(hash_buf) );
2661 if (!output) *
ret_len = hash_len;
2669 free( derived_key );
2678 TRACE(
"%p, %s, %p, %p, %lu, %p, %#lx\n",
secret,
debugstr_w(kdf),
desc, output, output_len,
2703 ULONG salt_size = 0;
2708 TRACE(
"%p, %p, %p, %lu, %p, %#lx\n",
key,
desc, output, output_size,
ret_len,
flags );
2717 for (
i = 0;
i <
desc->cBuffers;
i++)
2719 switch (
desc->pBuffers[
i].BufferType)
2726 salt_size =
desc->pBuffers[
i].cbBuffer;
2733 FIXME(
"buffer type %lu not supported\n",
desc->pBuffers[
i].BufferType );
2739 salt, salt_size, iter_count, output, output_size );
static unsigned char bytes[4]
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
#define BCRYPT_MD4_ALGORITHM
#define BCRYPT_KEY_LENGTHS
#define LEGACY_RSAPRIVATE_BLOB
#define BCRYPT_RSAPUBLIC_BLOB
#define BCRYPT_RNG_ALG_HANDLE
#define LEGACY_DSA_V2_PRIVATE_BLOB
#define BCRYPT_ECDH_P384_ALGORITHM
#define BCRYPT_SECRET_AGREEMENT_OPERATION
#define BCRYPT_3DES_ALGORITHM
#define BCRYPT_CHAIN_MODE_GCM
#define BCRYPT_SIGNATURE_OPERATION
#define BCRYPT_HASH_OPERATION
#define BCRYPT_DH_PUBLIC_MAGIC
#define BCRYPT_ECDH_PRIVATE_P256_MAGIC
#define BCRYPT_KEY_DATA_BLOB_MAGIC
#define BCRYPT_HMAC_SHA1_ALG_HANDLE
#define BCRYPT_ECDSA_PUBLIC_P256_MAGIC
#define BCRYPT_ECDSA_P384_ALGORITHM
#define BCRYPT_ECCPUBLIC_BLOB
#define BCRYPT_RSA_ALGORITHM
#define BCRYPT_KEY_DERIVATION_INTERFACE
#define BCRYPT_ECDH_PUBLIC_P384_MAGIC
#define BCRYPT_SHA256_ALG_HANDLE
#define LEGACY_DSA_V2_PUBLIC_BLOB
#define BCRYPT_SHA384_ALG_HANDLE
#define BCRYPT_OBJECT_LENGTH
#define BCRYPT_RC4_ALGORITHM
#define BCRYPT_ECDSA_PUBLIC_P384_MAGIC
#define BCRYPT_KEY_LENGTH
#define BCRYPT_AUTH_TAG_LENGTH
#define BCRYPT_CHAINING_MODE
#define BCRYPT_CHAIN_MODE_CFB
#define BCRYPT_CHAIN_MODE_CBC
#define KDF_ITERATION_COUNT
#define BCRYPT_KEY_DATA_BLOB
#define BCRYPT_SHA512_ALGORITHM
#define BCRYPT_ALGORITHM_NAME
#define BCRYPT_DH_PARAMETERS
#define BCRYPT_DSA_ALGORITHM
#define BCRYPT_KEY_STRENGTH
#define BCRYPT_AES_ALGORITHM
#define BCRYPT_PBKDF2_ALGORITHM
#define BCRYPT_SUPPORTED_PAD_PKCS1_SIG
struct _BCRYPT_KEY_DATA_BLOB_HEADER BCRYPT_KEY_DATA_BLOB_HEADER
#define BCRYPT_RSAFULLPRIVATE_MAGIC
#define BCRYPT_BLOCK_LENGTH
#define BCRYPT_MD2_ALGORITHM
#define BCRYPT_SECRET_AGREEMENT_INTERFACE
#define BCRYPT_PUBLIC_KEY_BLOB
#define BCRYPT_SHA256_ALGORITHM
#define BCRYPT_HMAC_SHA256_ALG_HANDLE
#define BCRYPT_CHAIN_MODE_NA
#define BCRYPT_RSAPRIVATE_MAGIC
#define BCRYPT_CIPHER_INTERFACE
#define BCRYPT_RSAPRIVATE_BLOB
#define BCRYPT_DSA_PUBLIC_BLOB
#define BCRYPT_SUPPORTED_PAD_OAEP
#define BCRYPT_ASYMMETRIC_ENCRYPTION_INTERFACE
#define BCRYPT_RNG_OPERATION
#define BCRYPT_ECDH_PUBLIC_P256_MAGIC
#define BCRYPT_ALG_HANDLE_HMAC_FLAG
#define BCRYPT_ECCPRIVATE_BLOB
#define KDF_HASH_ALGORITHM
#define BCRYPT_CIPHER_OPERATION
#define BCRYPT_ECDSA_P256_ALGORITHM
#define BCRYPT_RNG_ALGORITHM
#define BCRYPT_AES_WRAP_KEY_BLOB
#define BCRYPT_DSA_PRIVATE_BLOB
#define BCRYPT_HASH_LENGTH
#define BCRYPT_ECDSA_PRIVATE_P256_MAGIC
#define BCRYPT_SIGNATURE_INTERFACE
#define BCRYPT_KDF_RAW_SECRET
#define BCRYPT_BLOCK_PADDING
#define BCRYPT_SHA512_ALG_HANDLE
#define BCRYPT_PADDING_SCHEMES
#define BCRYPT_DH_PARAMETERS_MAGIC
#define BCRYPT_RSAPUBLIC_MAGIC
#define BCRYPT_ECDH_PRIVATE_P384_MAGIC
#define BCRYPT_KEY_DERIVATION_OPERATION
#define BCRYPT_HASH_REUSABLE_FLAG
#define BCRYPT_KEY_DATA_BLOB_VERSION1
#define BCRYPT_HASH_INTERFACE
#define MS_PRIMITIVE_PROVIDER
#define BCRYPT_HMAC_SHA384_ALG_HANDLE
#define BCRYPT_DH_PRIVATE_BLOB
#define BCRYPT_AUTH_MODE_CHAIN_CALLS_FLAG
#define BCRYPT_ECDH_P256_ALGORITHM
#define BCRYPT_ASYMMETRIC_ENCRYPTION_OPERATION
#define BCRYPT_RSA_SIGN_ALGORITHM
#define BCRYPT_SHA384_ALGORITHM
#define BCRYPT_DSA_PUBLIC_MAGIC
#define BCRYPT_OPAQUE_KEY_BLOB
#define BCRYPT_DH_ALGORITHM
#define BCRYPT_CHAIN_MODE_ECB
#define BCRYPT_SHA1_ALGORITHM
#define BCRYPT_RNG_INTERFACE
#define BCRYPT_RSAFULLPRIVATE_BLOB
#define BCRYPT_MD5_ALGORITHM
#define BCRYPT_HMAC_SHA512_ALG_HANDLE
#define BCRYPT_SHA1_ALG_HANDLE
#define BCRYPT_DH_PUBLIC_BLOB
#define BCRYPT_DH_PRIVATE_MAGIC
#define BCRYPT_USE_SYSTEM_PREFERRED_RNG
NTSTATUS hmac_init(struct hash *hash, UCHAR *key, ULONG key_size)
NTSTATUS key_symmetric_vector_reset(void *args)
NTSTATUS key_symmetric_encrypt_internal(void *args)
NTSTATUS key_asymmetric_export(void *args)
#define KEY_FLAG_FINALIZED
NTSTATUS key_symmetric_set_auth_data(void *args)
NTSTATUS key_symmetric_get_tag(void *args)
NTSTATUS hash_update(struct hash *hash, UCHAR *input, ULONG size)
NTSTATUS key_asymmetric_encrypt(void *args)
NTSTATUS key_symmetric_destroy(void *args)
#define BLOCK_LENGTH_3DES
#define KEY_EXPORT_FLAG_DH_PARAMETERS
NTSTATUS key_symmetric_decrypt_internal(void *args)
NTSTATUS hmac_update(struct hash *hash, UCHAR *input, ULONG size)
NTSTATUS hash_get_size(struct hash *hash, ULONG *output)
NTSTATUS hash_finish(struct hash *hash, UCHAR *output)
#define KEY_IMPORT_FLAG_PUBLIC
NTSTATUS key_asymmetric_generate(void *args)
NTSTATUS key_asymmetric_destroy(void *args)
NTSTATUS process_attach(void *args)
#define KEY_EXPORT_FLAG_RSA_FULL
NTSTATUS key_asymmetric_verify(void *args)
NTSTATUS key_asymmetric_derive_key(void *args)
NTSTATUS key_asymmetric_import(void *args)
NTSTATUS hash_init(struct hash *hash)
#define KEY_IMPORT_FLAG_DH_PARAMETERS
#define KEY_FLAG_LEGACY_DSA_V2
NTSTATUS key_asymmetric_sign(void *args)
NTSTATUS key_asymmetric_decrypt(void *args)
#define HASH_FLAG_REUSABLE
NTSTATUS key_asymmetric_duplicate(void *args)
NTSTATUS hmac_finish(struct hash *hash, UCHAR *output)
#define KEY_EXPORT_FLAG_PUBLIC
static struct algorithm * create_algorithm(enum alg_id id, enum chain_mode mode, DWORD flags)
NTSTATUS WINAPI BCryptAddContextFunctionProvider(ULONG table, const WCHAR *ctx, ULONG iface, const WCHAR *func, const WCHAR *provider, ULONG pos)
#define MAX_HASH_OUTPUT_BYTES
static const struct algorithm pseudo_algorithms[]
NTSTATUS WINAPI BCryptSecretAgreement(BCRYPT_KEY_HANDLE privkey_handle, BCRYPT_KEY_HANDLE pubkey_handle, BCRYPT_SECRET_HANDLE *ret_handle, ULONG flags)
NTSTATUS WINAPI BCryptRemoveContextFunctionProvider(ULONG table, const WCHAR *ctx, ULONG iface, const WCHAR *func, const WCHAR *provider)
static const WCHAR * resolve_blob_type(const WCHAR *type, UCHAR *input, ULONG input_len)
static NTSTATUS key_symmetric_decrypt(struct key *key, UCHAR *input, ULONG input_len, void *padding, UCHAR *iv, ULONG iv_len, UCHAR *output, ULONG output_len, ULONG *ret_len, ULONG flags)
NTSTATUS WINAPI BCryptGenRandom(BCRYPT_ALG_HANDLE handle, UCHAR *buffer, ULONG count, ULONG flags)
NTSTATUS WINAPI BCryptDuplicateKey(BCRYPT_KEY_HANDLE handle, BCRYPT_KEY_HANDLE *handle_copy, UCHAR *object, ULONG object_len, ULONG flags)
static struct key * key_symmetric_create(enum alg_id alg, enum chain_mode mode, ULONG block_size, const UCHAR *secret, ULONG secret_len)
static NTSTATUS get_key_property(const struct key *key, const WCHAR *prop, UCHAR *buf, ULONG size, ULONG *ret_size)
NTSTATUS WINAPI BCryptHashData(BCRYPT_HASH_HANDLE handle, UCHAR *input, ULONG size, ULONG flags)
static NTSTATUS generic_alg_property(enum alg_id id, const WCHAR *prop, UCHAR *buf, ULONG size, ULONG *ret_size)
NTSTATUS WINAPI BCryptGetProperty(BCRYPT_HANDLE handle, const WCHAR *prop, UCHAR *buffer, ULONG count, ULONG *res, ULONG flags)
static NTSTATUS set_key_property(struct key *key, const WCHAR *prop, UCHAR *value, ULONG size, ULONG flags)
NTSTATUS WINAPI BCryptCreateHash(BCRYPT_ALG_HANDLE handle, BCRYPT_HASH_HANDLE *ret_handle, UCHAR *object, ULONG object_len, UCHAR *secret, ULONG secret_len, ULONG flags)
NTSTATUS WINAPI BCryptDecrypt(BCRYPT_KEY_HANDLE handle, UCHAR *input, ULONG input_len, void *padding, UCHAR *iv, ULONG iv_len, UCHAR *output, ULONG output_len, ULONG *ret_len, ULONG flags)
NTSTATUS WINAPI BCryptUnregisterProvider(const WCHAR *provider)
static void hash_finalize(struct hash *hash, UCHAR *output, ULONG size)
static NTSTATUS key_export(struct key *key, struct key *encrypt_key, const WCHAR *type, UCHAR *output, ULONG output_len, ULONG *size)
NTSTATUS WINAPI BCryptRemoveContextFunction(ULONG table, const WCHAR *ctx, ULONG iface, const WCHAR *func)
static struct algorithm * get_alg_object(BCRYPT_ALG_HANDLE handle)
NTSTATUS WINAPI BCryptDeriveKeyPBKDF2(BCRYPT_ALG_HANDLE handle, UCHAR *pwd, ULONG pwd_len, UCHAR *salt, ULONG salt_len, ULONGLONG iterations, UCHAR *dk, ULONG dk_len, ULONG flags)
NTSTATUS WINAPI BCryptImportKeyPair(BCRYPT_ALG_HANDLE handle, BCRYPT_KEY_HANDLE decrypt_key_handle, const WCHAR *type, BCRYPT_KEY_HANDLE *ret_handle, UCHAR *input, ULONG input_len, ULONG flags)
static NTSTATUS get_3des_property(enum chain_mode mode, const WCHAR *prop, UCHAR *buf, ULONG size, ULONG *ret_size)
static NTSTATUS key_asymmetric_create(enum alg_id alg_id, ULONG bitlen, struct key **ret_key)
NTSTATUS WINAPI BCryptRegisterProvider(const WCHAR *provider, ULONG flags, CRYPT_PROVIDER_REG *reg)
NTSTATUS WINAPI BCryptDestroyHash(BCRYPT_HASH_HANDLE handle)
static NTSTATUS pbkdf2(struct hash *hash, UCHAR *pwd, ULONG pwd_len, UCHAR *salt, ULONG salt_len, ULONGLONG iterations, ULONG i, UCHAR *dst, ULONG hash_len)
static NTSTATUS derive_key_pbkdf2(struct algorithm *alg, UCHAR *pwd, ULONG pwd_len, UCHAR *salt, ULONG salt_len, ULONGLONG iterations, UCHAR *dk, ULONG dk_len)
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID reserved)
static BOOL is_asymmetric_encryption_key(struct key *key)
NTSTATUS WINAPI BCryptGenerateSymmetricKey(BCRYPT_ALG_HANDLE handle, BCRYPT_KEY_HANDLE *ret_handle, UCHAR *object, ULONG object_len, UCHAR *secret, ULONG secret_len, ULONG flags)
static NTSTATUS get_alg_property(const struct algorithm *alg, const WCHAR *prop, UCHAR *buf, ULONG size, ULONG *ret_size)
static NTSTATUS aes_wrap(const UCHAR *secret, ULONG secret_len, const UCHAR *plain, ULONG plain_len, UCHAR *cipher)
static void destroy_object(struct object *obj)
#define MAX_HASH_BLOCK_BITS
static NTSTATUS derive_key_hash(struct secret *secret, BCryptBufferDesc *desc, UCHAR *output, ULONG output_len, ULONG *ret_len)
NTSTATUS WINAPI BCryptExportKey(BCRYPT_KEY_HANDLE export_key_handle, BCRYPT_KEY_HANDLE encrypt_key_handle, const WCHAR *type, UCHAR *output, ULONG output_len, ULONG *size, ULONG flags)
static void key_destroy(struct key *key)
static NTSTATUS set_alg_property(struct algorithm *alg, const WCHAR *prop, UCHAR *value, ULONG size, ULONG flags)
static NTSTATUS get_hash_property(const struct hash *hash, const WCHAR *prop, UCHAR *buf, ULONG size, ULONG *ret_size)
static HINSTANCE instance
static BOOL is_signature_key(struct key *key)
static NTSTATUS get_dh_property(const struct key *key, const WCHAR *prop, UCHAR *buf, ULONG size, ULONG *ret_size)
static struct secret * get_secret_object(BCRYPT_SECRET_HANDLE handle)
NTSTATUS WINAPI BCryptEncrypt(BCRYPT_KEY_HANDLE handle, UCHAR *input, ULONG input_len, void *padding, UCHAR *iv, ULONG iv_len, UCHAR *output, ULONG output_len, ULONG *ret_len, ULONG flags)
static NTSTATUS derive_key_raw(struct secret *secret, UCHAR *output, ULONG output_len, ULONG *ret_len)
NTSTATUS WINAPI BCryptOpenAlgorithmProvider(BCRYPT_ALG_HANDLE *handle, const WCHAR *id, const WCHAR *implementation, DWORD flags)
NTSTATUS WINAPI BCryptEnumAlgorithms(ULONG type, ULONG *ret_count, BCRYPT_ALGORITHM_IDENTIFIER **ret_list, ULONG flags)
static NTSTATUS get_rsa_property(enum chain_mode mode, const WCHAR *prop, UCHAR *buf, ULONG size, ULONG *ret_size)
NTSTATUS WINAPI BCryptAddContextFunction(ULONG table, const WCHAR *ctx, ULONG iface, const WCHAR *func, ULONG pos)
static void hash_prepare(struct hash *hash)
NTSTATUS WINAPI BCryptGenerateKeyPair(BCRYPT_ALG_HANDLE handle, BCRYPT_KEY_HANDLE *ret_handle, ULONG key_len, ULONG flags)
NTSTATUS WINAPI BCryptSetProperty(BCRYPT_HANDLE handle, const WCHAR *prop, UCHAR *value, ULONG size, ULONG flags)
static struct hash * get_hash_object(BCRYPT_HASH_HANDLE handle)
static NTSTATUS key_import_pair(struct algorithm *alg, const WCHAR *type, BCRYPT_KEY_HANDLE *ret_key, UCHAR *input, ULONG input_len)
static NTSTATUS hash_create(const struct algorithm *alg, UCHAR *secret, ULONG secret_len, ULONG flags, struct hash **ret_hash)
static void reverse_bytes(UCHAR *buf, ULONG len)
static BOOL is_agreement_key(struct key *key)
static NTSTATUS aes_unwrap(const UCHAR *secret, ULONG secret_len, const UCHAR *cipher, ULONG cipher_len, UCHAR *plain)
static BOOL is_symmetric_key(const struct key *key)
NTSTATUS WINAPI BCryptFinalizeKeyPair(BCRYPT_KEY_HANDLE handle, ULONG flags)
static NTSTATUS key_duplicate(struct key *key_orig, struct key **ret_key)
NTSTATUS WINAPI BCryptDeriveKeyCapi(BCRYPT_HASH_HANDLE handle, BCRYPT_ALG_HANDLE halg, UCHAR *key, ULONG keylen, ULONG flags)
NTSTATUS WINAPI BCryptCloseAlgorithmProvider(BCRYPT_ALG_HANDLE handle, DWORD flags)
static NTSTATUS get_dsa_property(enum chain_mode mode, const WCHAR *prop, UCHAR *buf, ULONG size, ULONG *ret_size)
NTSTATUS WINAPI BCryptDeriveKey(BCRYPT_SECRET_HANDLE handle, const WCHAR *kdf, BCryptBufferDesc *desc, UCHAR *output, ULONG output_len, ULONG *ret_len, ULONG flags)
NTSTATUS WINAPI BCryptDestroySecret(BCRYPT_SECRET_HANDLE handle)
NTSTATUS WINAPI BCryptVerifySignature(BCRYPT_KEY_HANDLE handle, void *padding, UCHAR *hash, ULONG hash_len, UCHAR *signature, ULONG signature_len, ULONG flags)
static void hash_destroy(struct hash *hash)
NTSTATUS WINAPI BCryptImportKey(BCRYPT_ALG_HANDLE handle, BCRYPT_KEY_HANDLE decrypt_key_handle, const WCHAR *type, BCRYPT_KEY_HANDLE *ret_handle, UCHAR *object, ULONG object_len, UCHAR *input, ULONG input_len, ULONG flags)
static NTSTATUS key_symmetric_set_vector(struct key *key, UCHAR *vector, ULONG vector_len, BOOL force_reset)
static NTSTATUS key_import(struct algorithm *alg, struct key *decrypt_key, const WCHAR *type, BCRYPT_KEY_HANDLE *key, UCHAR *object, ULONG object_len, UCHAR *input, ULONG input_len)
static NTSTATUS convert_legacy_rsaprivate_blob(struct algorithm *alg, BCRYPT_RSAKEY_BLOB **rsa_data, ULONG *rsa_len, UCHAR *input, ULONG input_len)
NTSTATUS WINAPI BCryptKeyDerivation(BCRYPT_KEY_HANDLE handle, BCryptBufferDesc *desc, UCHAR *output, ULONG output_size, ULONG *ret_len, ULONG flags)
static NTSTATUS hash_single(struct algorithm *alg, UCHAR *secret, ULONG secret_len, UCHAR *input, ULONG input_len, UCHAR *output, ULONG output_len)
static struct object * get_object(BCRYPT_HANDLE handle, ULONG magic)
NTSTATUS WINAPI BCryptDestroyKey(BCRYPT_KEY_HANDLE handle)
static NTSTATUS key_symmetric_encrypt(struct key *key, UCHAR *input, ULONG input_len, void *padding, UCHAR *iv, ULONG iv_len, UCHAR *output, ULONG output_len, ULONG *ret_len, ULONG flags)
static struct algorithm * get_hash_alg(BCryptBuffer *buf, BOOL hmac)
static NTSTATUS key_symmetric_generate(struct algorithm *alg, BCRYPT_KEY_HANDLE *ret_handle, const UCHAR *secret, ULONG secret_len)
static BOOL is_alg_pseudo_handle(BCRYPT_ALG_HANDLE handle)
static struct key * get_key_object(BCRYPT_KEY_HANDLE handle)
static BOOL is_equal_vector(const UCHAR *vector, ULONG len, const UCHAR *vector2, ULONG len2)
NTSTATUS WINAPI BCryptFinishHash(BCRYPT_HASH_HANDLE handle, UCHAR *output, ULONG size, ULONG flags)
void WINAPI BCryptFreeBuffer(void *buffer)
static BOOL match_operation_type(ULONG type, ULONG class)
NTSTATUS WINAPI BCryptHash(BCRYPT_ALG_HANDLE handle, UCHAR *secret, ULONG secret_len, UCHAR *input, ULONG input_len, UCHAR *output, ULONG output_len)
NTSTATUS WINAPI BCryptDuplicateHash(BCRYPT_HASH_HANDLE handle, BCRYPT_HASH_HANDLE *handle_copy, UCHAR *object, ULONG objectlen, ULONG flags)
static NTSTATUS get_aes_property(enum chain_mode mode, const WCHAR *prop, UCHAR *buf, ULONG size, ULONG *ret_size)
static NTSTATUS get_rc4_property(enum chain_mode mode, const WCHAR *prop, UCHAR *buf, ULONG size, ULONG *ret_size)
static const struct @319 builtin_algorithms[]
NTSTATUS WINAPI BCryptGetFipsAlgorithmMode(BOOLEAN *enabled)
NTSTATUS WINAPI BCryptSignHash(BCRYPT_KEY_HANDLE handle, void *padding, UCHAR *input, ULONG input_len, UCHAR *output, ULONG output_len, ULONG *ret_len, ULONG flags)
static ULONG get_block_size(struct algorithm *alg)
static NTSTATUS get_pbkdf2_property(enum chain_mode mode, const WCHAR *prop, UCHAR *buf, ULONG size, ULONG *ret_size)
NTSTATUS WINAPI BCryptEnumContextFunctions(ULONG table, const WCHAR *ctx, ULONG iface, ULONG *buflen, CRYPT_CONTEXT_FUNCTIONS **buffer)
#define STATUS_INVALID_HANDLE
#define STATUS_NOT_SUPPORTED
#define STATUS_NOT_IMPLEMENTED
static WCHAR reason[MAX_STRING_RESOURCE_LEN]
#define DLL_PROCESS_ATTACH
#define DLL_PROCESS_DETACH
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
static const WCHAR pubkey[]
BOOL WINAPI DisableThreadLibraryCalls(IN HMODULE hLibModule)
static void process_detach(void)
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
GLuint GLuint GLsizei count
GLuint GLuint GLsizei GLenum type
GLdouble GLdouble GLdouble r
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLboolean GLboolean GLboolean b
GLenum const GLfloat * params
GLenum GLuint GLenum GLsizei const GLchar * buf
GLboolean GLboolean GLboolean GLboolean a
GLenum GLenum GLenum input
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
static DWORD block_size(DWORD block)
This file contains the generic message-digest wrapper.
#define memcpy(s1, s2, n)
D3D11_SHADER_VARIABLE_DESC desc
static JOBOBJECTINFOCLASS LPVOID DWORD LPDWORD ret_len
static const DWORD padding[]
static void ULONG ULONG * ret_size
#define STATUS_AUTH_TAG_MISMATCH
#define STATUS_INVALID_BUFFER_SIZE
MD5 message digest algorithm (hash function)
This file contains SHA-1 definitions and functions.
This file contains SHA-224 and SHA-256 definitions and functions.
This file contains SHA-384 and SHA-512 definitions and functions.
#define STATUS_BUFFER_TOO_SMALL
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
#define STATUS_ACCESS_DENIED
#define STATUS_INVALID_PARAMETER
#define STATUS_UNSUCCESSFUL
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)