ReactOS 0.4.17-dev-1037-g720d112
main.c File Reference
#include <stdarg.h>
#include <stdlib.h>
#include "ntstatus.h"
#include "windef.h"
#include "winbase.h"
#include "ncrypt.h"
#include "bcrypt.h"
#include "ncrypt_internal.h"
#include "wine/debug.h"
Include dependency graph for main.c:

Go to the source code of this file.

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (ncrypt)
 
static SECURITY_STATUS map_ntstatus (NTSTATUS status)
 
static struct object * allocate_object (enum object_type type)
 
static void provider_addref (NCRYPT_PROV_HANDLE handle)
 
static struct object_property * get_object_property (struct object *object, const WCHAR *name)
 
struct object_property * add_object_property (struct object *object, const WCHAR *name)
 
static SECURITY_STATUS set_object_property (struct object *object, const WCHAR *name, BYTE *value, DWORD value_size)
 
static struct object * create_key_object (enum algid algid, NCRYPT_PROV_HANDLE provider)
 
SECURITY_STATUS WINAPI NCryptCreatePersistedKey (NCRYPT_PROV_HANDLE provider, NCRYPT_KEY_HANDLE *key, const WCHAR *algid, const WCHAR *name, DWORD keyspec, DWORD flags)
 
SECURITY_STATUS WINAPI NCryptDecrypt (NCRYPT_KEY_HANDLE key, BYTE *input, DWORD insize, void *padding, BYTE *output, DWORD outsize, DWORD *result, DWORD flags)
 
SECURITY_STATUS WINAPI NCryptDeleteKey (NCRYPT_KEY_HANDLE key, DWORD flags)
 
SECURITY_STATUS WINAPI NCryptEncrypt (NCRYPT_KEY_HANDLE key, BYTE *input, DWORD insize, void *padding, BYTE *output, DWORD outsize, DWORD *result, DWORD flags)
 
SECURITY_STATUS WINAPI NCryptEnumAlgorithms (NCRYPT_PROV_HANDLE provider, DWORD alg_ops, DWORD *alg_count, NCryptAlgorithmName **alg_list, DWORD flags)
 
SECURITY_STATUS WINAPI NCryptEnumKeys (NCRYPT_PROV_HANDLE provider, const WCHAR *scope, NCryptKeyName **key_name, PVOID *enum_state, DWORD flags)
 
SECURITY_STATUS WINAPI NCryptFinalizeKey (NCRYPT_KEY_HANDLE handle, DWORD flags)
 
SECURITY_STATUS WINAPI NCryptFreeBuffer (PVOID buf)
 
static SECURITY_STATUS free_key_object (struct key *key)
 
SECURITY_STATUS WINAPI NCryptFreeObject (NCRYPT_HANDLE handle)
 
SECURITY_STATUS WINAPI NCryptGetProperty (NCRYPT_HANDLE handle, const WCHAR *name, BYTE *output, DWORD outsize, DWORD *result, DWORD flags)
 
SECURITY_STATUS WINAPI NCryptImportKey (NCRYPT_PROV_HANDLE provider, NCRYPT_KEY_HANDLE decrypt_key, const WCHAR *type, NCryptBufferDesc *params, NCRYPT_KEY_HANDLE *handle, BYTE *data, DWORD datasize, DWORD flags)
 
SECURITY_STATUS WINAPI NCryptExportKey (NCRYPT_KEY_HANDLE key, NCRYPT_KEY_HANDLE encrypt_key, const WCHAR *type, NCryptBufferDesc *params, BYTE *output, DWORD output_len, DWORD *ret_len, DWORD flags)
 
SECURITY_STATUS WINAPI NCryptIsAlgSupported (NCRYPT_PROV_HANDLE provider, const WCHAR *algid, DWORD flags)
 
BOOL WINAPI NCryptIsKeyHandle (NCRYPT_KEY_HANDLE hKey)
 
SECURITY_STATUS WINAPI NCryptOpenKey (NCRYPT_PROV_HANDLE provider, NCRYPT_KEY_HANDLE *key, const WCHAR *name, DWORD keyspec, DWORD flags)
 
SECURITY_STATUS WINAPI NCryptOpenStorageProvider (NCRYPT_PROV_HANDLE *provider, const WCHAR *name, DWORD flags)
 
SECURITY_STATUS WINAPI NCryptSetProperty (NCRYPT_HANDLE handle, const WCHAR *name, BYTE *input, DWORD insize, DWORD flags)
 
SECURITY_STATUS WINAPI NCryptSignHash (NCRYPT_KEY_HANDLE handle, void *padding, BYTE *value, DWORD value_len, BYTE *sig, DWORD sig_len, DWORD *ret_len, DWORD flags)
 
SECURITY_STATUS WINAPI NCryptVerifySignature (NCRYPT_KEY_HANDLE handle, void *padding, BYTE *hash, DWORD hash_size, BYTE *signature, DWORD signature_size, DWORD flags)
 

Function Documentation

◆ add_object_property()

struct object_property * add_object_property ( struct object *  object,
const WCHAR *  name 
)

Definition at line 81 of file main.c.

82{
84
86 {
87 if (!(object->properties = malloc(sizeof(*property))))
88 {
89 ERR("Error allocating memory.\n");
90 return NULL;
91 }
92 property = &object->properties[object->num_properties++];
93 }
94 else
95 {
96 struct object_property *tmp;
97 if (!(tmp = realloc(object->properties, sizeof(*property) * (object->num_properties + 1))))
98 {
99 ERR("Error allocating memory.\n");
100 return NULL;
101 }
102 object->properties = tmp;
103 property = &object->properties[object->num_properties++];
104 }
105
106 memset(property, 0, sizeof(*property));
107 if (!(property->key = wcsdup(name)))
108 {
109 ERR("Error allocating memory.\n");
110 return NULL;
111 }
112
113 return property;
114}
#define ERR(fmt,...)
Definition: precomp.h:57
#define realloc
Definition: debug_ros.c:6
#define malloc
Definition: debug_ros.c:4
#define NULL
Definition: types.h:112
static wchar_t * wcsdup(const wchar_t *str)
Definition: string.h:94
#define memset(x, y, z)
Definition: compat.h:39
Definition: name.c:39
struct object_property * properties
DWORD num_properties

Referenced by set_object_property().

◆ allocate_object()

static struct object * allocate_object ( enum object_type  type)
static

Definition at line 55 of file main.c.

56{
57 struct object *ret;
58 if (!(ret = calloc(1, sizeof(*ret)))) return NULL;
59 ret->type = type;
60 ret->refs = 1;
61 return ret;
62}
return ret
Definition: mutex.c:147
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
#define calloc
Definition: rosglue.h:14

Referenced by create_key_object(), and NCryptOpenStorageProvider().

◆ create_key_object()

static struct object * create_key_object ( enum algid  algid,
NCRYPT_PROV_HANDLE  provider 
)
static

Definition at line 138 of file main.c.

139{
140 NCRYPT_SUPPORTED_LENGTHS supported_lengths = {512, 16384, 8, 1024};
141 struct object *object;
142 DWORD dw_value;
143
144 switch (algid)
145 {
146 case RSA:
147 if (!(object = allocate_object(KEY))) return NULL;
148
149 object->key.algid = RSA;
151 sizeof(BCRYPT_RSA_ALGORITHM));
153 sizeof(BCRYPT_RSA_ALGORITHM));
154 set_object_property(object, NCRYPT_LENGTHS_PROPERTY, (BYTE *)&supported_lengths,
155 sizeof(supported_lengths));
156 dw_value = 128;
157 set_object_property(object, NCRYPT_BLOCK_LENGTH_PROPERTY, (BYTE *)&dw_value, sizeof(dw_value));
158 dw_value = 128;
159 set_object_property(object, BCRYPT_SIGNATURE_LENGTH, (BYTE *)&dw_value, sizeof(dw_value));
160 break;
161
162 case ECDSA_P256:
163 if (!(object = allocate_object(KEY))) return NULL;
164
165 object->key.algid = ECDSA_P256;
166 break;
167
168 default:
169 ERR("Invalid algid %#x\n", algid);
170 return NULL;
171 }
172
173 dw_value = 0;
174 set_object_property(object, NCRYPT_EXPORT_POLICY_PROPERTY, (BYTE *)&dw_value, sizeof(dw_value));
175 dw_value = NCRYPT_ALLOW_ALL_USAGES;
176 set_object_property(object, NCRYPT_KEY_USAGE_PROPERTY, (BYTE *)&dw_value, sizeof(dw_value));
177 dw_value = 0;
178 set_object_property(object, NCRYPT_KEY_TYPE_PROPERTY, (BYTE *)&dw_value, sizeof(dw_value));
179 provider_addref(provider);
180 set_object_property(object, NCRYPT_PROVIDER_HANDLE_PROPERTY, (BYTE *)&provider, sizeof(provider));
181 return object;
182}
#define BCRYPT_SIGNATURE_LENGTH
Definition: bcrypt.h:68
#define BCRYPT_RSA_ALGORITHM
Definition: bcrypt.h:117
static void provider_addref(NCRYPT_PROV_HANDLE handle)
Definition: main.c:64
static SECURITY_STATUS set_object_property(struct object *object, const WCHAR *name, BYTE *value, DWORD value_size)
Definition: main.c:116
static struct object * allocate_object(enum object_type type)
Definition: main.c:55
unsigned long DWORD
Definition: ntddk_ex.h:95
#define NCRYPT_BLOCK_LENGTH_PROPERTY
Definition: ncrypt.h:110
#define NCRYPT_PROVIDER_HANDLE_PROPERTY
Definition: ncrypt.h:126
#define NCRYPT_ALGORITHM_PROPERTY
Definition: ncrypt.h:107
#define NCRYPT_ALGORITHM_GROUP_PROPERTY
Definition: ncrypt.h:125
#define NCRYPT_LENGTHS_PROPERTY
Definition: ncrypt.h:109
#define NCRYPT_EXPORT_POLICY_PROPERTY
Definition: ncrypt.h:112
#define NCRYPT_KEY_TYPE_PROPERTY
Definition: ncrypt.h:117
#define NCRYPT_ALLOW_ALL_USAGES
Definition: ncrypt.h:98
#define NCRYPT_KEY_USAGE_PROPERTY
Definition: ncrypt.h:116
algid
@ ECDSA_P256
@ RSA
Definition: btrfs.h:143
IWbemClassObject * object
Definition: locator.c:514
unsigned char BYTE
Definition: xxhash.c:193

Referenced by NCryptCreatePersistedKey(), and NCryptImportKey().

◆ free_key_object()

static SECURITY_STATUS free_key_object ( struct key *  key)
static

Definition at line 337 of file main.c.

338{
340}
NTSTATUS WINAPI BCryptDestroyKey(BCRYPT_KEY_HANDLE handle)
Definition: bcrypt_main.c:4008
static SECURITY_STATUS map_ntstatus(NTSTATUS status)
Definition: main.c:37
Definition: copy.c:22
BCRYPT_KEY_HANDLE bcrypt_key

Referenced by NCryptFreeObject().

◆ get_object_property()

static struct object_property * get_object_property ( struct object *  object,
const WCHAR *  name 
)
static

Definition at line 70 of file main.c.

71{
72 unsigned int i;
73 for (i = 0; i < object->num_properties; i++)
74 {
75 struct object_property *property = &object->properties[i];
76 if (!lstrcmpW(property->key, name)) return property;
77 }
78 return NULL;
79}
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4152
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
Definition: glfuncs.h:248

Referenced by NCryptFinalizeKey(), NCryptGetProperty(), and set_object_property().

◆ map_ntstatus()

static SECURITY_STATUS map_ntstatus ( NTSTATUS  status)
static

Definition at line 37 of file main.c.

38{
39 switch (status)
40 {
43 case STATUS_SUCCESS: return ERROR_SUCCESS;
47 case NTE_BAD_DATA: return NTE_BAD_DATA;
49 default:
50 FIXME("unhandled status %#lx\n", status);
51 return NTE_INTERNAL_ERROR;
52 }
53}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define STATUS_INVALID_HANDLE
Definition: d3dkmdt.h:40
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48
#define ERROR_SUCCESS
Definition: deptool.c:10
#define STATUS_INVALID_SIGNATURE
Definition: ntstatus.h:1397
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
Definition: ps.c:97
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define NTE_INVALID_PARAMETER
Definition: winerror.h:4286
#define NTE_BAD_DATA
Definition: winerror.h:4252
#define NTE_INVALID_HANDLE
Definition: winerror.h:4285
#define NTE_INTERNAL_ERROR
Definition: winerror.h:4292
#define NTE_NOT_SUPPORTED
Definition: winerror.h:4288
#define NTE_BAD_SIGNATURE
Definition: winerror.h:4253
#define NTE_NO_MEMORY
Definition: winerror.h:4261
#define NTE_BUFFER_TOO_SMALL
Definition: winerror.h:4287

Referenced by free_key_object(), NCryptCreatePersistedKey(), NCryptEncrypt(), NCryptExportKey(), NCryptFinalizeKey(), NCryptImportKey(), NCryptIsAlgSupported(), NCryptSignHash(), and NCryptVerifySignature().

◆ NCryptCreatePersistedKey()

SECURITY_STATUS WINAPI NCryptCreatePersistedKey ( NCRYPT_PROV_HANDLE  provider,
NCRYPT_KEY_HANDLE *  key,
const WCHAR *  algid,
const WCHAR *  name,
DWORD  keyspec,
DWORD  flags 
)

Definition at line 184 of file main.c.

186{
187 struct object *object;
188
189 TRACE("(%#Ix, %p, %s, %s, %#lx, %#lx)\n", provider, key, wine_dbgstr_w(algid),
190 wine_dbgstr_w(name), keyspec, flags);
191
192 if (!provider) return NTE_INVALID_HANDLE;
194 if (name) FIXME("Persistent keys are not supported\n");
195
197 {
199 DWORD default_bitlen = 1024;
200
201 if (!(object = create_key_object(RSA, provider)))
202 {
203 ERR("Error allocating memory\n");
204 return NTE_NO_MEMORY;
205 }
206
207 status = BCryptGenerateKeyPair(BCRYPT_RSA_ALG_HANDLE, &object->key.bcrypt_key, default_bitlen, 0);
208 if (status != STATUS_SUCCESS)
209 {
210 ERR("Error generating key pair %#lx\n", status);
211 free(object);
212 return map_ntstatus(status);
213 }
214
215 set_object_property(object, NCRYPT_LENGTH_PROPERTY, (BYTE *)&default_bitlen, sizeof(default_bitlen));
216 set_object_property(object, BCRYPT_PUBLIC_KEY_LENGTH, (BYTE *)&default_bitlen, sizeof(default_bitlen));
217 }
219 {
221 DWORD bitlen = 256;
222
223 if (!(object = create_key_object(ECDSA_P256, provider)))
224 return NTE_NO_MEMORY;
225
227 if (status != STATUS_SUCCESS)
228 {
229 free(object);
230 return map_ntstatus(status);
231 }
232
233 set_object_property(object, NCRYPT_LENGTH_PROPERTY, (BYTE *)&bitlen, sizeof(bitlen));
234 set_object_property(object, BCRYPT_PUBLIC_KEY_LENGTH, (BYTE *)&bitlen, sizeof(bitlen));
235 }
236 else
237 {
238 FIXME("Algorithm not handled %s\n", wine_dbgstr_w(algid));
239 return NTE_NOT_SUPPORTED;
240 }
241
242 *key = (NCRYPT_KEY_HANDLE)object;
243 return ERROR_SUCCESS;
244}
LONG NTSTATUS
Definition: precomp.h:26
#define BCRYPT_PUBLIC_KEY_LENGTH
Definition: bcrypt.h:69
#define BCRYPT_RSA_ALG_HANDLE
Definition: bcrypt.h:430
#define BCRYPT_ECDSA_P256_ALGORITHM
Definition: bcrypt.h:107
#define BCRYPT_ECDSA_P256_ALG_HANDLE
Definition: bcrypt.h:462
NTSTATUS WINAPI BCryptGenerateKeyPair(BCRYPT_ALG_HANDLE handle, BCRYPT_KEY_HANDLE *ret_handle, ULONG bitlen, ULONG flags)
Definition: bcrypt_main.c:3571
#define free
Definition: debug_ros.c:5
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4171
static struct object * create_key_object(enum algid algid, NCRYPT_PROV_HANDLE provider)
Definition: main.c:138
GLbitfield flags
Definition: glext.h:7161
#define wine_dbgstr_w
Definition: kernel32.h:34
#define NCRYPT_LENGTH_PROPERTY
Definition: ncrypt.h:108
ULONG_PTR NCRYPT_KEY_HANDLE
Definition: ncrypt.h:78
#define TRACE(s)
Definition: solgame.cpp:4
struct key key
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define RPC_X_NULL_REF_POINTER
Definition: winerror.h:1444

Referenced by test_create_persisted_key(), test_finalize_key(), test_NCryptEncrypt(), test_NCryptExportKey(), and test_set_property().

◆ NCryptDecrypt()

SECURITY_STATUS WINAPI NCryptDecrypt ( NCRYPT_KEY_HANDLE  key,
BYTE *  input,
DWORD  insize,
void *  padding,
BYTE *  output,
DWORD  outsize,
DWORD *  result,
DWORD  flags 
)

Definition at line 246 of file main.c.

248{
249 FIXME("(%#Ix, %p, %lu, %p, %p, %lu, %p, %#lx): stub\n", key, input, insize, padding,
250 output, outsize, result, flags);
251 return NTE_NOT_SUPPORTED;
252}
GLuint64EXT * result
Definition: glext.h:11304
GLenum GLenum GLenum input
Definition: glext.h:9031
const unsigned char size_t insize
Definition: jpeglib.h:986
unsigned char size_t * outsize
Definition: jpeglib.h:983
static const DWORD padding[]
Definition: mciwnd.c:88

◆ NCryptDeleteKey()

SECURITY_STATUS WINAPI NCryptDeleteKey ( NCRYPT_KEY_HANDLE  key,
DWORD  flags 
)

Definition at line 254 of file main.c.

255{
256 FIXME("(%#Ix, %#lx): stub\n", key, flags);
257 return NTE_NOT_SUPPORTED;
258}

◆ NCryptEncrypt()

SECURITY_STATUS WINAPI NCryptEncrypt ( NCRYPT_KEY_HANDLE  key,
BYTE *  input,
DWORD  insize,
void *  padding,
BYTE *  output,
DWORD  outsize,
DWORD *  result,
DWORD  flags 
)

Definition at line 260 of file main.c.

262{
263 struct object *key_object = (struct object *)key;
264
265 TRACE("(%#Ix, %p, %lu, %p, %p, %lu, %p, %#lx)\n", key, input, insize, padding,
266 output, outsize, result, flags);
267
270 {
271 FIXME("Flags %lx not supported\n", flags);
272 return NTE_BAD_FLAGS;
273 }
274
276 {
277 FIXME("No padding and oaep padding not supported\n");
278 return NTE_NOT_SUPPORTED;
279 }
280
281 if (key_object->type != KEY) return NTE_INVALID_HANDLE;
282
283 return map_ntstatus(BCryptEncrypt(key_object->key.bcrypt_key, input, insize, padding,
284 NULL, 0, output, outsize, result, flags));
285}
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)
Definition: bcrypt_main.c:2307
#define NCRYPT_PAD_PKCS1_FLAG
Definition: ncrypt.h:90
#define NCRYPT_NO_PADDING_FLAG
Definition: ncrypt.h:89
#define NCRYPT_PAD_OAEP_FLAG
Definition: ncrypt.h:91
#define NCRYPT_SILENT_FLAG
Definition: ncrypt.h:87
enum object_type type
#define NTE_BAD_FLAGS
Definition: winerror.h:4256

Referenced by test_NCryptEncrypt().

◆ NCryptEnumAlgorithms()

SECURITY_STATUS WINAPI NCryptEnumAlgorithms ( NCRYPT_PROV_HANDLE  provider,
DWORD  alg_ops,
DWORD *  alg_count,
NCryptAlgorithmName **  alg_list,
DWORD  flags 
)

Definition at line 287 of file main.c.

289{
290 FIXME("(%#Ix, %#lx, %p, %p, %#lx): stub\n", provider, alg_ops, alg_count, alg_list, flags);
291 return NTE_NOT_SUPPORTED;
292}

◆ NCryptEnumKeys()

SECURITY_STATUS WINAPI NCryptEnumKeys ( NCRYPT_PROV_HANDLE  provider,
const WCHAR *  scope,
NCryptKeyName **  key_name,
PVOID *  enum_state,
DWORD  flags 
)

Definition at line 294 of file main.c.

296{
297 FIXME("(%#Ix, %p, %p, %p, %#lx): stub\n", provider, scope, key_name, enum_state, flags);
298 return NTE_NOT_SUPPORTED;
299}

◆ NCryptExportKey()

SECURITY_STATUS WINAPI NCryptExportKey ( NCRYPT_KEY_HANDLE  key,
NCRYPT_KEY_HANDLE  encrypt_key,
const WCHAR *  type,
NCryptBufferDesc *  params,
BYTE *  output,
DWORD  output_len,
DWORD *  ret_len,
DWORD  flags 
)

Definition at line 475 of file main.c.

478{
479 struct object *object = (struct object *)key;
480
481 TRACE("(%#Ix, %#Ix, %s, %p, %p, %lu, %p, %#lx)\n", key, encrypt_key, wine_dbgstr_w(type), params, output,
482 output_len, ret_len, flags);
483
484 if (encrypt_key)
485 {
486 FIXME("Key blob encryption not implemented\n");
487 return NTE_NOT_SUPPORTED;
488 }
489 if (params)
490 {
491 FIXME("Parameter information not implemented\n");
492 return NTE_NOT_SUPPORTED;
493 }
495 {
496 FIXME("Silent flag not implemented\n");
497 }
498
499 return map_ntstatus(BCryptExportKey(object->key.bcrypt_key, NULL, type, output, output_len, ret_len, 0));
500}
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)
Definition: bcrypt_main.c:2749
GLenum const GLfloat * params
Definition: glext.h:5645
static JOBOBJECTINFOCLASS LPVOID DWORD LPDWORD ret_len
Definition: process.c:81

Referenced by test_NCryptExportKey().

◆ NCryptFinalizeKey()

SECURITY_STATUS WINAPI NCryptFinalizeKey ( NCRYPT_KEY_HANDLE  handle,
DWORD  flags 
)

Definition at line 301 of file main.c.

302{
303 struct object *object = (struct object *)handle;
305 struct object_property *prop;
307
308 TRACE("(%#Ix, %#lx)\n", handle, flags);
309
310 if (!object || object->type != KEY) return NTE_INVALID_HANDLE;
311
313 key_length = *(DWORD *)prop->value;
315 if (status != STATUS_SUCCESS)
316 {
317 ERR("Error setting key length property\n");
318 return map_ntstatus(status);
319 }
320
321 status = BCryptFinalizeKeyPair(object->key.bcrypt_key, 0);
322 if (status != STATUS_SUCCESS)
323 {
324 ERR("Error finalizing key pair\n");
325 return map_ntstatus(status);
326 }
327
328 return ERROR_SUCCESS;
329}
#define BCRYPT_KEY_LENGTH
Definition: bcrypt.h:61
NTSTATUS WINAPI BCryptSetProperty(BCRYPT_HANDLE handle, const WCHAR *prop, UCHAR *value, ULONG size, ULONG flags)
Definition: bcrypt_main.c:1230
NTSTATUS WINAPI BCryptFinalizeKeyPair(BCRYPT_KEY_HANDLE handle, ULONG flags)
Definition: bcrypt_main.c:3658
static struct object_property * get_object_property(struct object *object, const WCHAR *name)
Definition: main.c:70
#define key_length
Definition: crypt.c:1100
unsigned char UCHAR
Definition: typedefs.h:53

Referenced by test_create_persisted_key(), test_finalize_key(), test_NCryptEncrypt(), and test_NCryptExportKey().

◆ NCryptFreeBuffer()

SECURITY_STATUS WINAPI NCryptFreeBuffer ( PVOID  buf)

Definition at line 331 of file main.c.

332{
333 FIXME("(%p): stub\n", buf);
334 return NTE_NOT_SUPPORTED;
335}
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751

◆ NCryptFreeObject()

SECURITY_STATUS WINAPI NCryptFreeObject ( NCRYPT_HANDLE  handle)

Definition at line 342 of file main.c.

343{
344 struct object *object = (struct object *)handle;
346 unsigned int i;
347
348 TRACE("(%#Ix)\n", handle);
349
350 if (!object)
351 {
352 WARN("invalid handle %#Ix\n", handle);
353 return NTE_INVALID_HANDLE;
354 }
355
356 switch (object->type)
357 {
358 case KEY:
359 {
360 if ((ret = free_key_object(&object->key))) return ret;
361 break;
362 }
363 case STORAGE_PROVIDER:
365 return 0;
366 break;
367
368 default:
369 WARN("invalid handle %#Ix\n", handle);
370 return NTE_INVALID_HANDLE;
371 }
372
373 for (i = 0; i < object->num_properties; i++)
374 {
377
378 free(object->properties[i].key);
379 free(object->properties[i].value);
380 }
382 free(object);
383 return ret;
384}
#define InterlockedDecrement
Definition: armddk.h:52
#define WARN(fmt,...)
Definition: precomp.h:61
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1977
SECURITY_STATUS WINAPI NCryptFreeObject(NCRYPT_HANDLE handle)
Definition: main.c:342
static SECURITY_STATUS free_key_object(struct key *key)
Definition: main.c:337
#define KEY
Definition: profile.c:30
LONG SECURITY_STATUS
Definition: ncrypt.h:31
ULONG_PTR NCRYPT_HANDLE
Definition: ncrypt.h:76
@ STORAGE_PROVIDER

Referenced by check_property(), NCryptFreeObject(), test_create_persisted_key(), test_finalize_key(), test_free_object(), test_get_property(), test_key_import_rsa(), test_NCryptEncrypt(), test_NCryptExportKey(), test_NCryptIsAlgSupported(), test_set_property(), and test_verify_signature().

◆ NCryptGetProperty()

SECURITY_STATUS WINAPI NCryptGetProperty ( NCRYPT_HANDLE  handle,
const WCHAR *  name,
BYTE *  output,
DWORD  outsize,
DWORD *  result,
DWORD  flags 
)

Definition at line 386 of file main.c.

388{
389 struct object *object = (struct object *)handle;
390 const struct object_property *property;
391
392 TRACE("(%#Ix, %s, %p, %lu, %p, %#lx)\n", handle, wine_dbgstr_w(name), output, outsize, result, flags);
393 if (flags) FIXME("flags %#lx not supported\n", flags);
394
395 if (!object) return NTE_INVALID_HANDLE;
396 if (!(property = get_object_property(object, name))) return NTE_INVALID_PARAMETER;
397
398 *result = property->value_size;
399 if (!output) return ERROR_SUCCESS;
400 if (outsize < property->value_size) return NTE_BUFFER_TOO_SMALL;
401
402 memcpy(output, property->value, property->value_size);
405 return ERROR_SUCCESS;
406}
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
ULONG_PTR NCRYPT_PROV_HANDLE
Definition: ncrypt.h:77

Referenced by check_property(), and test_get_property().

◆ NCryptImportKey()

SECURITY_STATUS WINAPI NCryptImportKey ( NCRYPT_PROV_HANDLE  provider,
NCRYPT_KEY_HANDLE  decrypt_key,
const WCHAR *  type,
NCryptBufferDesc *  params,
NCRYPT_KEY_HANDLE *  handle,
BYTE *  data,
DWORD  datasize,
DWORD  flags 
)

Definition at line 408 of file main.c.

411{
413 struct object *object;
414
415 TRACE("(%#Ix, %#Ix, %s, %p, %p, %p, %lu, %#lx)\n", provider, decrypt_key, wine_dbgstr_w(type),
417
418 if (decrypt_key)
419 {
420 FIXME("Key blob decryption not implemented\n");
421 return NTE_NOT_SUPPORTED;
422 }
423 if (params)
424 {
425 FIXME("Parameter information not implemented\n");
426 return NTE_NOT_SUPPORTED;
427 }
429 {
430 FIXME("Silent flag not implemented\n");
431 }
432 else if (flags)
433 {
434 WARN("Invalid flags %#lx\n", flags);
435 return NTE_BAD_FLAGS;
436 }
437 if (!header) return NTE_INVALID_PARAMETER;
438
439 switch (header->Magic)
440 {
444 {
447
448 if (!(object = create_key_object(RSA, provider)))
449 {
450 ERR("Error allocating memory\n");
451 return NTE_NO_MEMORY;
452 }
453
455 if (status != STATUS_SUCCESS)
456 {
457 WARN("Error importing key pair %#lx\n", status);
458 free(object);
459 return map_ntstatus(status);
460 }
461
462 set_object_property(object, NCRYPT_LENGTH_PROPERTY, (BYTE *)&rsablob->BitLength, sizeof(rsablob->BitLength));
463 set_object_property(object, BCRYPT_PUBLIC_KEY_LENGTH, (BYTE *)&rsablob->BitLength, sizeof(rsablob->BitLength));
464 break;
465 }
466 default:
467 FIXME("Unhandled key magic %#lx\n", header->Magic);
469 }
470
471 *handle = (NCRYPT_KEY_HANDLE)object;
472 return ERROR_SUCCESS;
473}
#define BCRYPT_RSAFULLPRIVATE_MAGIC
Definition: bcrypt.h:243
#define BCRYPT_RSAPRIVATE_MAGIC
Definition: bcrypt.h:242
#define BCRYPT_RSAPUBLIC_MAGIC
Definition: bcrypt.h:241
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)
Definition: bcrypt_main.c:3481
static SIZE_T datasize
Definition: asm.c:30
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950

Referenced by test_free_object(), test_get_property(), test_key_import_rsa(), test_set_property(), and test_verify_signature().

◆ NCryptIsAlgSupported()

SECURITY_STATUS WINAPI NCryptIsAlgSupported ( NCRYPT_PROV_HANDLE  provider,
const WCHAR *  algid,
DWORD  flags 
)

Definition at line 502 of file main.c.

503{
504 static const ULONG supported = BCRYPT_CIPHER_OPERATION |\
509 ULONG i, count;
511
512 TRACE("(%#Ix, %s, %#lx)\n", provider, wine_dbgstr_w(algid), flags);
513
514 if (!provider) return NTE_INVALID_HANDLE;
517 {
518 FIXME("Silent flag not implemented\n");
519 }
520 else if (flags)
521 {
522 WARN("Invalid flags %#lx\n", flags);
523 return NTE_BAD_FLAGS;
524 }
526
527 status = BCryptEnumAlgorithms(supported, &count, &list, 0);
528 if (status != STATUS_SUCCESS)
529 {
530 ERR("Error retrieving algorithm list %#lx\n", status);
531 return map_ntstatus(status);
532 }
533
535 for (i = 0; i < count; i++)
536 {
537 if (!lstrcmpiW(list[i].pszName, algid))
538 {
540 break;
541 }
542 }
543
545 return map_ntstatus(status);
546}
#define BCRYPT_SECRET_AGREEMENT_OPERATION
Definition: bcrypt.h:180
#define BCRYPT_SIGNATURE_OPERATION
Definition: bcrypt.h:181
#define BCRYPT_CIPHER_OPERATION
Definition: bcrypt.h:177
#define BCRYPT_ASYMMETRIC_ENCRYPTION_OPERATION
Definition: bcrypt.h:179
#define BCRYPT_RSA_SIGN_ALGORITHM
Definition: bcrypt.h:118
NTSTATUS WINAPI BCryptEnumAlgorithms(ULONG type, ULONG *ret_count, BCRYPT_ALGORITHM_IDENTIFIER **ret_list, ULONG flags)
Definition: bcrypt_main.c:424
void WINAPI BCryptFreeBuffer(void *buffer)
Definition: bcrypt_main.c:332
Definition: list.h:39
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define list
Definition: rosglue.h:35
uint32_t ULONG
Definition: typedefs.h:59

Referenced by test_NCryptIsAlgSupported().

◆ NCryptIsKeyHandle()

BOOL WINAPI NCryptIsKeyHandle ( NCRYPT_KEY_HANDLE  hKey)

Definition at line 548 of file main.c.

549{
550 FIXME("(%#Ix): stub\n", hKey);
551 return FALSE;
552}
#define FALSE
Definition: types.h:117
FxAutoRegKey hKey

◆ NCryptOpenKey()

SECURITY_STATUS WINAPI NCryptOpenKey ( NCRYPT_PROV_HANDLE  provider,
NCRYPT_KEY_HANDLE *  key,
const WCHAR *  name,
DWORD  keyspec,
DWORD  flags 
)

Definition at line 554 of file main.c.

556{
557 FIXME("(%#Ix, %p, %s, %#lx, %#lx): stub\n", provider, key, wine_dbgstr_w(name), keyspec, flags);
558 return NTE_NOT_SUPPORTED;
559}

◆ NCryptOpenStorageProvider()

SECURITY_STATUS WINAPI NCryptOpenStorageProvider ( NCRYPT_PROV_HANDLE *  provider,
const WCHAR *  name,
DWORD  flags 
)

Definition at line 561 of file main.c.

562{
563 struct object *object;
564
565 FIXME("(%p, %s, %#lx): stub\n", provider, wine_dbgstr_w(name), flags);
566
567 if (!(object = allocate_object(STORAGE_PROVIDER)))
568 {
569 ERR("Error allocating memory.\n");
570 return NTE_NO_MEMORY;
571 }
572 *provider = (NCRYPT_PROV_HANDLE)object;
573 return ERROR_SUCCESS;
574}

Referenced by test_create_persisted_key(), test_finalize_key(), test_free_object(), test_get_property(), test_key_import_rsa(), test_NCryptEncrypt(), test_NCryptExportKey(), test_NCryptIsAlgSupported(), test_set_property(), and test_verify_signature().

◆ NCryptSetProperty()

SECURITY_STATUS WINAPI NCryptSetProperty ( NCRYPT_HANDLE  handle,
const WCHAR *  name,
BYTE *  input,
DWORD  insize,
DWORD  flags 
)

Definition at line 576 of file main.c.

577{
578 struct object *object = (struct object *)handle;
579
580 TRACE("(%#Ix, %s, %p, %lu, %#lx)\n", handle, wine_dbgstr_w(name), input, insize, flags);
581 if (flags) FIXME("flags %#lx not supported\n", flags);
582
583 if (!object) return NTE_INVALID_HANDLE;
585 return set_object_property(object, name, input, insize);
586}

Referenced by test_NCryptExportKey(), and test_set_property().

◆ NCryptSignHash()

SECURITY_STATUS WINAPI NCryptSignHash ( NCRYPT_KEY_HANDLE  handle,
void *  padding,
BYTE *  value,
DWORD  value_len,
BYTE *  sig,
DWORD  sig_len,
DWORD *  ret_len,
DWORD  flags 
)

Definition at line 588 of file main.c.

590{
591 struct object *object = (struct object *)handle;
592
593 TRACE("(%#Ix, %p, %p, %lu, %p, %lu, %#lx)\n", handle, padding, value, value_len, sig, sig_len, flags);
594 if (flags & NCRYPT_SILENT_FLAG) FIXME("Silent flag not implemented\n");
595
596 if (!object || object->type != KEY) return NTE_INVALID_HANDLE;
597
598 return map_ntstatus(BCryptSignHash(object->key.bcrypt_key, padding, value, value_len, sig, sig_len,
600}
NTSTATUS WINAPI BCryptSignHash(BCRYPT_KEY_HANDLE handle, void *padding, UCHAR *hash, ULONG hash_len, UCHAR *signature, ULONG signature_len, ULONG *ret_len, ULONG flags)
Definition: bcrypt_main.c:3870
Definition: pdh_main.c:64

◆ NCryptVerifySignature()

SECURITY_STATUS WINAPI NCryptVerifySignature ( NCRYPT_KEY_HANDLE  handle,
void *  padding,
BYTE *  hash,
DWORD  hash_size,
BYTE *  signature,
DWORD  signature_size,
DWORD  flags 
)

Definition at line 602 of file main.c.

604{
605 struct object *key_object = (struct object *)handle;
606
607 TRACE("(%#Ix, %p, %p, %lu, %p, %lu, %#lx)\n", handle, padding, hash, hash_size, signature,
608 signature_size, flags);
609
610 if (!hash_size || !signature_size) return NTE_INVALID_PARAMETER;
612 if (!handle || key_object->type != KEY) return NTE_INVALID_HANDLE;
613
614 if (key_object->key.algid < RSA)
615 {
616 FIXME("Symmetric keys not supported.\n");
617 return NTE_NOT_SUPPORTED;
618 }
619
620 return map_ntstatus(BCryptVerifySignature(key_object->key.bcrypt_key, padding, hash, hash_size, signature,
621 signature_size, flags));
622}
NTSTATUS WINAPI BCryptVerifySignature(BCRYPT_KEY_HANDLE handle, void *padding, UCHAR *hash, ULONG hash_len, UCHAR *signature, ULONG signature_len, ULONG flags)
Definition: bcrypt_main.c:3975

Referenced by test_verify_signature().

◆ provider_addref()

static void provider_addref ( NCRYPT_PROV_HANDLE  handle)
static

Definition at line 64 of file main.c.

65{
66 struct object *object = (struct object *)handle;
68}
#define InterlockedIncrement
Definition: armddk.h:53

Referenced by create_key_object(), and NCryptGetProperty().

◆ set_object_property()

static SECURITY_STATUS set_object_property ( struct object *  object,
const WCHAR *  name,
BYTE *  value,
DWORD  value_size 
)
static

Definition at line 116 of file main.c.

117{
118 struct object_property *property = get_object_property(object, name);
119 void *tmp;
120
121 if (!property && !(property = add_object_property(object, name))) return NTE_NO_MEMORY;
122
123 property->value_size = value_size;
124 if (!(tmp = realloc(property->value, value_size)))
125 {
126 ERR("Error allocating memory.\n");
127 free(property->key);
128 property->key = NULL;
129 return NTE_NO_MEMORY;
130 }
131
132 property->value = tmp;
134
135 return ERROR_SUCCESS;
136}
struct object_property * add_object_property(struct object *object, const WCHAR *name)
Definition: main.c:81
char * value
Definition: wpp.c:53

Referenced by create_key_object(), NCryptCreatePersistedKey(), NCryptImportKey(), and NCryptSetProperty().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( ncrypt  )