27#include <winpr/winpr.h>
28#include <winpr/wtypes.h>
30typedef PVOID BCRYPT_HANDLE;
31typedef PVOID BCRYPT_ALG_HANDLE;
32typedef PVOID BCRYPT_KEY_HANDLE;
33typedef PVOID BCRYPT_HASH_HANDLE;
34typedef PVOID BCRYPT_SECRET_HANDLE;
36static const WCHAR BCRYPT_RSA_ALGORITHM[] = {
'R',
'S',
'A',
'\0' };
37static const WCHAR BCRYPT_RSA_SIGN_ALGORITHM[] = {
'R',
'S',
'A',
'_',
'S',
'I',
'G',
'N',
'\0' };
38static const WCHAR BCRYPT_DH_ALGORITHM[] = {
'D',
'H',
'\0' };
39static const WCHAR BCRYPT_DSA_ALGORITHM[] = {
'D',
'S',
'A',
'\0' };
40static const WCHAR BCRYPT_RC2_ALGORITHM[] = {
'R',
'C',
'2',
'\0' };
41static const WCHAR BCRYPT_RC4_ALGORITHM[] = {
'R',
'C',
'4',
'\0' };
42static const WCHAR BCRYPT_AES_ALGORITHM[] = {
'A',
'E',
'S',
'\0' };
43static const WCHAR BCRYPT_DES_ALGORITHM[] = {
'D',
'E',
'S',
'\0' };
44static const WCHAR BCRYPT_DESX_ALGORITHM[] = {
'D',
'E',
'S',
'X',
'\0' };
45static const WCHAR BCRYPT_3DES_ALGORITHM[] = {
'3',
'D',
'E',
'S',
'\0' };
46static const WCHAR BCRYPT_3DES_112_ALGORITHM[] = {
'3',
'D',
'E',
'S',
'_',
'1',
'1',
'2',
'\0' };
47static const WCHAR BCRYPT_MD2_ALGORITHM[] = {
'M',
'D',
'2',
'\0' };
48static const WCHAR BCRYPT_MD4_ALGORITHM[] = {
'M',
'D',
'4',
'\0' };
49static const WCHAR BCRYPT_MD5_ALGORITHM[] = {
'M',
'D',
'5',
'\0' };
50static const WCHAR BCRYPT_SHA1_ALGORITHM[] = {
'S',
'H',
'A',
'1',
'\0' };
51static const WCHAR BCRYPT_SHA256_ALGORITHM[] = {
'S',
'H',
'A',
'2',
'5',
'6',
'\0' };
52static const WCHAR BCRYPT_SHA384_ALGORITHM[] = {
'S',
'H',
'A',
'3',
'8',
'4',
'\0' };
53static const WCHAR BCRYPT_SHA512_ALGORITHM[] = {
'S',
'H',
'A',
'5',
'1',
'2',
'\0' };
54static const WCHAR BCRYPT_AES_GMAC_ALGORITHM[] = {
'A',
'E',
'S',
'-',
'G',
'M',
'A',
'C',
'\0' };
55static const WCHAR BCRYPT_AES_CMAC_ALGORITHM[] = {
'A',
'E',
'S',
'-',
'C',
'M',
'A',
'C',
'\0' };
56static const WCHAR BCRYPT_ECDSA_P256_ALGORITHM[] = {
'E',
'C',
'D',
'S',
'A',
'_',
57 'P',
'2',
'5',
'6',
'\0' };
58static const WCHAR BCRYPT_ECDSA_P384_ALGORITHM[] = {
'E',
'C',
'D',
'S',
'A',
'_',
59 'P',
'3',
'8',
'4',
'\0' };
60static const WCHAR BCRYPT_ECDSA_P521_ALGORITHM[] = {
'E',
'C',
'D',
'S',
'A',
'_',
61 'P',
'5',
'2',
'1',
'\0' };
62static const WCHAR BCRYPT_ECDH_P256_ALGORITHM[] = {
'E',
'C',
'D',
'S',
'A',
'_',
63 'P',
'2',
'5',
'6',
'\0' };
64static const WCHAR BCRYPT_ECDH_P384_ALGORITHM[] = {
'E',
'C',
'D',
'S',
'A',
'_',
65 'P',
'3',
'8',
'4',
'\0' };
66static const WCHAR BCRYPT_ECDH_P521_ALGORITHM[] = {
'E',
'C',
'D',
'S',
'A',
'_',
67 'P',
'5',
'2',
'1',
'\0' };
68static const WCHAR BCRYPT_RNG_ALGORITHM[] = {
'R',
'N',
'G',
'\0' };
69static const WCHAR BCRYPT_RNG_FIPS186_DSA_ALGORITHM[] = {
'F',
'I',
'P',
'S',
'1',
'8',
'6',
70 'D',
'S',
'A',
'R',
'N',
'G',
'\0' };
71static const WCHAR BCRYPT_RNG_DUAL_EC_ALGORITHM[] = {
'D',
'U',
'A',
'L',
'E',
72 'C',
'R',
'N',
'G',
'\0' };
74static const WCHAR BCRYPT_ECDSA_ALGORITHM[] = {
'E',
'C',
'D',
'S',
'A',
'\0' };
75static const WCHAR BCRYPT_ECDH_ALGORITHM[] = {
'E',
'C',
'D',
'H',
'\0' };
76static const WCHAR BCRYPT_XTS_AES_ALGORITHM[] = {
'X',
'T',
'S',
'-',
'A',
'E',
'S',
'\0' };
78static const WCHAR MS_PRIMITIVE_PROVIDER[] = {
'M',
'i',
'c',
'r',
'o',
's',
'o',
'f',
't',
' ',
79 'P',
'r',
'i',
'm',
'i',
't',
'i',
'v',
'e',
' ',
80 'P',
'r',
'o',
'v',
'i',
'd',
'e',
'r',
'\0' };
81static const WCHAR MS_PLATFORM_CRYPTO_PROVIDER[] = {
'M',
'i',
'c',
'r',
'o',
's',
'o',
'f',
't',
82 ' ',
'P',
'l',
'a',
't',
'f',
'o',
'r',
'm',
83 ' ',
'C',
'r',
'y',
'p',
't',
'o',
' ',
'P',
84 'r',
'o',
'v',
'i',
'd',
'e',
'r',
'\0' };
86#define BCRYPT_ALG_HANDLE_HMAC_FLAG 0x00000008
87#define BCRYPT_PROV_DISPATCH 0x00000001
89static const WCHAR BCRYPT_OBJECT_LENGTH[] = {
'O',
'b',
'j',
'e',
'c',
't',
'L',
90 'e',
'n',
'g',
't',
'h',
'\0' };
91static const WCHAR BCRYPT_ALGORITHM_NAME[] = {
'A',
'l',
'g',
'o',
'r',
'i',
't',
92 'h',
'm',
'N',
'a',
'm',
'e',
'\0' };
93static const WCHAR BCRYPT_PROVIDER_HANDLE[] = {
'P',
'r',
'o',
'v',
'i',
'd',
'e',
'r',
94 'H',
'a',
'n',
'd',
'l',
'e',
'\0' };
95static const WCHAR BCRYPT_CHAINING_MODE[] = {
'C',
'h',
'a',
'i',
'n',
'i',
'n',
96 'g',
'M',
'o',
'd',
'e',
'\0' };
97static const WCHAR BCRYPT_BLOCK_LENGTH[] = {
'B',
'l',
'o',
'c',
'k',
'L',
98 'e',
'n',
'g',
't',
'h',
'\0' };
99static const WCHAR BCRYPT_KEY_LENGTH[] = {
'K',
'e',
'y',
'L',
'e',
'n',
'g',
't',
'h',
'\0' };
100static const WCHAR BCRYPT_KEY_OBJECT_LENGTH[] = {
'K',
'e',
'y',
'O',
'b',
'j',
'e',
'c',
101 't',
'L',
'e',
'n',
'g',
't',
'h',
'\0' };
102static const WCHAR BCRYPT_KEY_STRENGTH[] = {
'K',
'e',
'y',
'S',
't',
'r',
103 'e',
'n',
'g',
't',
'h',
'\0' };
104static const WCHAR BCRYPT_KEY_LENGTHS[] = {
105 'K',
'e',
'y',
'L',
'e',
'n',
'g',
't',
'h',
's',
'\0'
107static const WCHAR BCRYPT_BLOCK_SIZE_LIST[] = {
'B',
'l',
'o',
'c',
'k',
'S',
'i',
108 'z',
'e',
'L',
'i',
's',
't',
'\0' };
109static const WCHAR BCRYPT_EFFECTIVE_KEY_LENGTH[] = {
'E',
'f',
'f',
'e',
'c',
't',
'i',
110 'v',
'e',
'K',
'e',
'y',
'L',
'e',
111 'n',
'g',
't',
'h',
'\0' };
112static const WCHAR BCRYPT_HASH_LENGTH[] = {
'H',
'a',
's',
'h',
'D',
'i',
'g',
'e',
's',
113 't',
'L',
'e',
'n',
'g',
't',
'h',
'\0' };
114static const WCHAR BCRYPT_HASH_OID_LIST[] = {
'H',
'a',
's',
'h',
'O',
'I',
115 'D',
'L',
'i',
's',
't',
'\0' };
116static const WCHAR BCRYPT_PADDING_SCHEMES[] = {
'P',
'a',
'd',
'd',
'i',
'n',
'g',
'S',
117 'c',
'h',
'e',
'm',
'e',
's',
'\0' };
118static const WCHAR BCRYPT_SIGNATURE_LENGTH[] = {
'S',
'i',
'g',
'n',
'a',
't',
'u',
'r',
119 'e',
'L',
'e',
'n',
'g',
't',
'h',
'\0' };
120static const WCHAR BCRYPT_HASH_BLOCK_LENGTH[] = {
'H',
'a',
's',
'h',
'B',
'l',
'o',
'c',
121 'k',
'L',
'e',
'n',
'g',
't',
'h',
'\0' };
122static const WCHAR BCRYPT_AUTH_TAG_LENGTH[] = {
'A',
'u',
't',
'h',
'T',
'a',
'g',
123 'L',
'e',
'n',
'g',
't',
'h',
'\0' };
124static const WCHAR BCRYPT_PRIMITIVE_TYPE[] = {
'P',
'r',
'i',
'm',
'i',
't',
'i',
125 'v',
'e',
'T',
'y',
'p',
'e',
'\0' };
126static const WCHAR BCRYPT_IS_KEYED_HASH[] = {
'I',
's',
'K',
'e',
'y',
'e',
127 'd',
'H',
'a',
's',
'h',
'\0' };
128static const WCHAR BCRYPT_KEY_DATA_BLOB[] = {
'K',
'e',
'y',
'D',
'a',
't',
129 'a',
'B',
'l',
'o',
'b',
'\0' };
131#define BCRYPT_BLOCK_PADDING 0x00000001
133#define BCRYPT_KEY_DATA_BLOB_MAGIC 0x4d42444b
134#define BCRYPT_KEY_DATA_BLOB_VERSION1 0x1
148 WINPR_API NTSTATUS BCryptOpenAlgorithmProvider(BCRYPT_ALG_HANDLE* phAlgorithm, LPCWSTR pszAlgId,
149 LPCWSTR pszImplementation, ULONG dwFlags);
151 WINPR_API NTSTATUS BCryptCloseAlgorithmProvider(BCRYPT_ALG_HANDLE hAlgorithm, ULONG dwFlags);
153 WINPR_API NTSTATUS BCryptGetProperty(BCRYPT_HANDLE hObject, LPCWSTR pszProperty,
154 PUCHAR pbOutput, ULONG cbOutput, ULONG* pcbResult,
157 WINPR_API NTSTATUS BCryptCreateHash(BCRYPT_ALG_HANDLE hAlgorithm, BCRYPT_HASH_HANDLE* phHash,
158 PUCHAR pbHashObject, ULONG cbHashObject, PUCHAR pbSecret,
159 ULONG cbSecret, ULONG dwFlags);
161 WINPR_API NTSTATUS BCryptDestroyHash(BCRYPT_HASH_HANDLE hHash);
163 WINPR_API NTSTATUS BCryptHashData(BCRYPT_HASH_HANDLE hHash, PUCHAR pbInput, ULONG cbInput,
166 WINPR_API NTSTATUS BCryptFinishHash(BCRYPT_HASH_HANDLE hHash, PUCHAR pbOutput, ULONG cbOutput,
169 WINPR_API NTSTATUS BCryptGenRandom(BCRYPT_ALG_HANDLE hAlgorithm, PUCHAR pbBuffer,
170 ULONG cbBuffer, ULONG dwFlags);
172 WINPR_API NTSTATUS BCryptGenerateSymmetricKey(BCRYPT_ALG_HANDLE hAlgorithm,
173 BCRYPT_KEY_HANDLE* phKey, PUCHAR pbKeyObject,
174 ULONG cbKeyObject, PUCHAR pbSecret,
175 ULONG cbSecret, ULONG dwFlags);
177 WINPR_API NTSTATUS BCryptGenerateKeyPair(BCRYPT_ALG_HANDLE hAlgorithm, BCRYPT_KEY_HANDLE* phKey,
178 ULONG dwLength, ULONG dwFlags);
180 WINPR_API NTSTATUS BCryptImportKey(BCRYPT_ALG_HANDLE hAlgorithm, BCRYPT_KEY_HANDLE hImportKey,
181 LPCWSTR pszBlobType, BCRYPT_KEY_HANDLE* phKey,
182 PUCHAR pbKeyObject, ULONG cbKeyObject, PUCHAR pbInput,
183 ULONG cbInput, ULONG dwFlags);
185 WINPR_API NTSTATUS BCryptDestroyKey(BCRYPT_KEY_HANDLE hKey);
187 WINPR_API NTSTATUS BCryptEncrypt(BCRYPT_KEY_HANDLE hKey, PUCHAR pbInput, ULONG cbInput,
188 VOID* pPaddingInfo, PUCHAR pbIV, ULONG cbIV, PUCHAR pbOutput,
189 ULONG cbOutput, ULONG* pcbResult, ULONG dwFlags);
191 WINPR_API NTSTATUS BCryptDecrypt(BCRYPT_KEY_HANDLE hKey, PUCHAR pbInput, ULONG cbInput,
192 VOID* pPaddingInfo, PUCHAR pbIV, ULONG cbIV, PUCHAR pbOutput,
193 ULONG cbOutput, ULONG* pcbResult, ULONG dwFlags);