23#ifdef HAVE_GNUTLS_HASH
30#include <gnutls/gnutls.h>
31#include <gnutls/crypto.h>
32#include <gnutls/abstract.h>
35#define WIN32_NO_STATUS
50#if GNUTLS_VERSION_MAJOR < 3
51#define GNUTLS_CIPHER_AES_192_CBC 92
52#define GNUTLS_CIPHER_AES_128_GCM 93
53#define GNUTLS_CIPHER_AES_256_GCM 94
54#define GNUTLS_PK_ECC 4
56#define GNUTLS_CURVE_TO_BITS(curve) (unsigned int)(((unsigned int)1<<31)|((unsigned int)(curve)))
60 GNUTLS_ECC_CURVE_INVALID,
61 GNUTLS_ECC_CURVE_SECP224R1,
62 GNUTLS_ECC_CURVE_SECP256R1,
63 GNUTLS_ECC_CURVE_SECP384R1,
64 GNUTLS_ECC_CURVE_SECP521R1,
68#if GNUTLS_VERSION_MAJOR < 3 || (GNUTLS_VERSION_MAJOR == 3 && GNUTLS_VERSION_MINOR < 6)
69#define GNUTLS_CIPHER_AES_128_CFB8 29
70#define GNUTLS_CIPHER_AES_192_CFB8 30
71#define GNUTLS_CIPHER_AES_256_CFB8 31
73#define GNUTLS_PK_RSA_PSS 6
74#define GNUTLS_PRIVKEY_SIGN_FLAG_RSA_PSS (1 << 7)
75typedef struct gnutls_x509_spki_st *gnutls_x509_spki_t;
78#if GUTLS_VERSION_MAJOR < 3 || (GNUTLS_VERSION_MAJOR == 3 && GNUTLS_VERSION_MINOR < 8)
79#define GNUTLS_KEYGEN_DH 4
87 gnutls_privkey_t privkey;
89 gnutls_dh_params_t dh_params;
92C_ASSERT(
sizeof(
union key_data) <=
sizeof(((
struct key *)0)->
private) );
94static union key_data *key_data(
struct key *
key )
100static int (*pgnutls_cipher_tag)(gnutls_cipher_hd_t,
void *,
size_t);
101static int (*pgnutls_cipher_add_auth)(gnutls_cipher_hd_t,
const void *,
size_t);
102static gnutls_sign_algorithm_t (*pgnutls_pk_to_sign)(gnutls_pk_algorithm_t, gnutls_digest_algorithm_t);
103static int (*pgnutls_pubkey_import_ecc_raw)(gnutls_pubkey_t, gnutls_ecc_curve_t,
104 const gnutls_datum_t *,
const gnutls_datum_t *);
105static int (*pgnutls_pubkey_export_ecc_raw)(gnutls_pubkey_t
key, gnutls_ecc_curve_t *curve,
106 gnutls_datum_t *
x, gnutls_datum_t *
y);
107static int (*pgnutls_privkey_import_ecc_raw)(gnutls_privkey_t, gnutls_ecc_curve_t,
const gnutls_datum_t *,
108 const gnutls_datum_t *,
const gnutls_datum_t *);
109static int (*pgnutls_pubkey_verify_hash2)(gnutls_pubkey_t, gnutls_sign_algorithm_t,
unsigned int,
110 const gnutls_datum_t *,
const gnutls_datum_t *);
111static int (*pgnutls_pubkey_encrypt_data)(gnutls_pubkey_t,
unsigned int flags,
const gnutls_datum_t *,
115static int (*pgnutls_pubkey_import_rsa_raw)(gnutls_pubkey_t,
const gnutls_datum_t *,
const gnutls_datum_t *);
118static int (*pgnutls_pubkey_import_dsa_raw)(gnutls_pubkey_t,
const gnutls_datum_t *,
const gnutls_datum_t *,
119 const gnutls_datum_t *,
const gnutls_datum_t *);
120static int (*pgnutls_pubkey_import_privkey)(gnutls_pubkey_t, gnutls_privkey_t,
unsigned int,
unsigned int);
121static int (*pgnutls_privkey_decrypt_data)(gnutls_privkey_t,
unsigned int flags,
const gnutls_datum_t *,
125static int (*pgnutls_pubkey_export_dsa_raw)(gnutls_pubkey_t, gnutls_datum_t *, gnutls_datum_t *, gnutls_datum_t *,
127static int (*pgnutls_pubkey_export_rsa_raw)(gnutls_pubkey_t, gnutls_datum_t *, gnutls_datum_t *);
128static int (*pgnutls_privkey_export_ecc_raw)(gnutls_privkey_t, gnutls_ecc_curve_t *,
129 gnutls_datum_t *, gnutls_datum_t *, gnutls_datum_t *);
130static int (*pgnutls_privkey_export_rsa_raw)(gnutls_privkey_t, gnutls_datum_t *, gnutls_datum_t *, gnutls_datum_t *,
131 gnutls_datum_t *, gnutls_datum_t *, gnutls_datum_t *, gnutls_datum_t *,
133static int (*pgnutls_privkey_export_dsa_raw)(gnutls_privkey_t, gnutls_datum_t *, gnutls_datum_t *, gnutls_datum_t *,
134 gnutls_datum_t *, gnutls_datum_t *);
135static int (*pgnutls_privkey_import_rsa_raw)(gnutls_privkey_t,
const gnutls_datum_t *,
const gnutls_datum_t *,
136 const gnutls_datum_t *,
const gnutls_datum_t *,
const gnutls_datum_t *,
137 const gnutls_datum_t *,
const gnutls_datum_t *,
const gnutls_datum_t *);
140static int (*pgnutls_privkey_generate2)(gnutls_privkey_t, gnutls_pk_algorithm_t,
unsigned int,
unsigned int,
141 const gnutls_keygen_data_st *,
unsigned);
144static int (*pgnutls_decode_rs_value)(
const gnutls_datum_t *, gnutls_datum_t *, gnutls_datum_t *);
145static int (*pgnutls_x509_spki_init)(gnutls_x509_spki_t *);
146static void (*pgnutls_x509_spki_deinit)(gnutls_x509_spki_t);
147static void (*pgnutls_x509_spki_set_rsa_pss_params)(gnutls_x509_spki_t, gnutls_digest_algorithm_t,
unsigned int);
148static int (*pgnutls_pubkey_set_spki)(gnutls_pubkey_t,
const gnutls_x509_spki_t,
unsigned int);
149static int (*pgnutls_privkey_set_spki)(gnutls_privkey_t,
const gnutls_x509_spki_t,
unsigned int);
152static int (*pgnutls_privkey_derive_secret)(gnutls_privkey_t, gnutls_pubkey_t,
const gnutls_datum_t *,
153 gnutls_datum_t *,
unsigned int);
154static int (*pgnutls_privkey_export_dh_raw)(gnutls_privkey_t, gnutls_dh_params_t, gnutls_datum_t *, gnutls_datum_t *,
156static int (*pgnutls_pubkey_export_dh_raw)(gnutls_pubkey_t, gnutls_dh_params_t, gnutls_datum_t *,
unsigned);
157static int (*pgnutls_privkey_import_dh_raw)(gnutls_privkey_t,
const gnutls_dh_params_t,
const gnutls_datum_t *,
158 const gnutls_datum_t *);
159static int (*pgnutls_pubkey_import_dh_raw)(gnutls_pubkey_t,
const gnutls_dh_params_t,
const gnutls_datum_t *);
162static int (*pgnutls_x509_spki_set_rsa_oaep_params)(gnutls_x509_spki_t, gnutls_digest_algorithm_t, gnutls_datum_t *);
164static void *libgnutls_handle;
165#define MAKE_FUNCPTR(f) static typeof(f) * p##f
196static int compat_gnutls_cipher_tag(gnutls_cipher_hd_t
handle,
void *
tag,
size_t tag_size)
198 return GNUTLS_E_UNKNOWN_CIPHER_TYPE;
201static int compat_gnutls_cipher_add_auth(gnutls_cipher_hd_t
handle,
const void *ptext,
size_t ptext_size)
203 return GNUTLS_E_UNKNOWN_CIPHER_TYPE;
206static int compat_gnutls_pubkey_import_ecc_raw(gnutls_pubkey_t
key, gnutls_ecc_curve_t curve,
207 const gnutls_datum_t *
x,
const gnutls_datum_t *
y)
209 return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
212static int compat_gnutls_pubkey_export_ecc_raw(gnutls_pubkey_t
key, gnutls_ecc_curve_t *curve,
213 gnutls_datum_t *
x, gnutls_datum_t *
y)
215 return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
218static int compat_gnutls_pubkey_export_dsa_raw(gnutls_pubkey_t
key, gnutls_datum_t *
p, gnutls_datum_t *
q,
219 gnutls_datum_t *
g, gnutls_datum_t *
y)
221 return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
224static int compat_gnutls_pubkey_export_rsa_raw(gnutls_pubkey_t
key, gnutls_datum_t *
m, gnutls_datum_t *
e)
226 return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
229static int compat_gnutls_privkey_export_rsa_raw(gnutls_privkey_t
key, gnutls_datum_t *
m, gnutls_datum_t *
e,
230 gnutls_datum_t *
d, gnutls_datum_t *
p, gnutls_datum_t *
q,
231 gnutls_datum_t *
u, gnutls_datum_t *e1, gnutls_datum_t *e2)
233 return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
236static int compat_gnutls_privkey_export_ecc_raw(gnutls_privkey_t
key, gnutls_ecc_curve_t *curve,
237 gnutls_datum_t *
x, gnutls_datum_t *
y, gnutls_datum_t *
k)
239 return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
242static int compat_gnutls_privkey_import_ecc_raw(gnutls_privkey_t
key, gnutls_ecc_curve_t curve,
243 const gnutls_datum_t *
x,
const gnutls_datum_t *
y,
244 const gnutls_datum_t *
k)
246 return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
249static int compat_gnutls_privkey_export_dsa_raw(gnutls_privkey_t
key, gnutls_datum_t *
p, gnutls_datum_t *
q,
250 gnutls_datum_t *
g, gnutls_datum_t *
y, gnutls_datum_t *
x)
252 return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
255static gnutls_sign_algorithm_t compat_gnutls_pk_to_sign(gnutls_pk_algorithm_t pk, gnutls_digest_algorithm_t
hash)
257 return GNUTLS_SIGN_UNKNOWN;
260static int compat_gnutls_pubkey_verify_hash2(gnutls_pubkey_t
key, gnutls_sign_algorithm_t algo,
261 unsigned int flags,
const gnutls_datum_t *
hash,
264 return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
267static int compat_gnutls_pubkey_import_rsa_raw(gnutls_pubkey_t
key,
const gnutls_datum_t *
m,
const gnutls_datum_t *
e)
269 return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
272static int compat_gnutls_pubkey_import_dsa_raw(gnutls_pubkey_t
key,
const gnutls_datum_t *
p,
const gnutls_datum_t *
q,
273 const gnutls_datum_t *
g,
const gnutls_datum_t *
y)
275 return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
278static int compat_gnutls_decode_rs_value(
const gnutls_datum_t * sig_value, gnutls_datum_t *
r, gnutls_datum_t *
s)
280 return GNUTLS_E_INTERNAL_ERROR;
283static int compat_gnutls_privkey_import_rsa_raw(gnutls_privkey_t
key,
const gnutls_datum_t *
m,
const gnutls_datum_t *
e,
284 const gnutls_datum_t *
d,
const gnutls_datum_t *
p,
const gnutls_datum_t *
q,
285 const gnutls_datum_t *
u,
const gnutls_datum_t *e1,
const gnutls_datum_t *e2)
287 return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
290static int compat_gnutls_privkey_decrypt_data(gnutls_privkey_t
key,
unsigned int flags,
const gnutls_datum_t *cipher_text,
291 gnutls_datum_t *plain_text)
293 return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
296static int compat_gnutls_pubkey_encrypt_data(gnutls_pubkey_t
key,
unsigned int flags,
const gnutls_datum_t *cipher_text,
297 gnutls_datum_t *plain_text)
299 return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
302static int compat_gnutls_x509_spki_init(gnutls_x509_spki_t *spki)
304 return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
307static void compat_gnutls_x509_spki_deinit(gnutls_x509_spki_t spki)
311static int compat_gnutls_x509_spki_set_rsa_oaep_params(gnutls_x509_spki_t spki, gnutls_digest_algorithm_t dig,
312 gnutls_datum_t *
label)
314 return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
317static void compat_gnutls_x509_spki_set_rsa_pss_params(gnutls_x509_spki_t spki, gnutls_digest_algorithm_t dig,
318 unsigned int salt_size)
322static int compat_gnutls_pubkey_set_spki(gnutls_pubkey_t
key,
const gnutls_x509_spki_t spki,
unsigned int flags)
324 return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
327static int compat_gnutls_privkey_set_spki(gnutls_privkey_t
key,
const gnutls_x509_spki_t spki,
unsigned int flags)
329 return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
332static int compat_gnutls_privkey_derive_secret(gnutls_privkey_t privkey, gnutls_pubkey_t
pubkey,
const gnutls_datum_t *nonce,
335 return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
338static int compat_gnutls_privkey_export_dh_raw(gnutls_privkey_t privkey, gnutls_dh_params_t
params, gnutls_datum_t *
y,
339 gnutls_datum_t *
x,
unsigned int flags )
341 return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
344static int compat_gnutls_pubkey_export_dh_raw(gnutls_pubkey_t
pubkey, gnutls_dh_params_t
params, gnutls_datum_t *
y,
347 return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
350static int compat_gnutls_privkey_import_dh_raw(gnutls_privkey_t privkey,
const gnutls_dh_params_t
params,
351 const gnutls_datum_t *
y,
const gnutls_datum_t *
x)
353 return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
356static int compat_gnutls_pubkey_import_dh_raw(gnutls_pubkey_t
pubkey,
const gnutls_dh_params_t
params,
357 const gnutls_datum_t *
y)
359 return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
362static int compat_gnutls_privkey_generate2(gnutls_privkey_t privkey, gnutls_pk_algorithm_t alg,
unsigned int bits,
363 unsigned int flags,
const gnutls_keygen_data_st *
data,
unsigned data_size)
365 return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
368static void gnutls_log(
int level,
const char *
msg )
378 if ((env_str =
getenv(
"GNUTLS_SYSTEM_PRIORITY_FILE")))
380 WARN(
"GNUTLS_SYSTEM_PRIORITY_FILE is %s.\n",
debugstr_a(env_str));
384 WARN(
"Setting GNUTLS_SYSTEM_PRIORITY_FILE to \"/dev/null\".\n");
385 setenv(
"GNUTLS_SYSTEM_PRIORITY_FILE",
"/dev/null", 0);
388 if (!(libgnutls_handle = dlopen( SONAME_LIBGNUTLS,
RTLD_NOW )))
390 ERR_(winediag)(
"failed to load libgnutls, no support for encryption\n" );
394#define LOAD_FUNCPTR(f) \
395 if (!(p##f = dlsym( libgnutls_handle, #f ))) \
397 ERR( "failed to load %s\n", #f ); \
429#define LOAD_FUNCPTR_OPT(f) \
430 if (!(p##f = dlsym( libgnutls_handle, #f ))) \
432 WARN( "failed to load %s\n", #f ); \
436 LOAD_FUNCPTR_OPT(gnutls_cipher_tag)
437 LOAD_FUNCPTR_OPT(gnutls_cipher_add_auth)
438 LOAD_FUNCPTR_OPT(gnutls_decode_rs_value)
439 LOAD_FUNCPTR_OPT(gnutls_pk_to_sign)
440 LOAD_FUNCPTR_OPT(gnutls_privkey_decrypt_data)
441 LOAD_FUNCPTR_OPT(gnutls_privkey_derive_secret)
442 LOAD_FUNCPTR_OPT(gnutls_privkey_export_dh_raw)
443 LOAD_FUNCPTR_OPT(gnutls_privkey_export_dsa_raw)
444 LOAD_FUNCPTR_OPT(gnutls_privkey_export_ecc_raw)
445 LOAD_FUNCPTR_OPT(gnutls_privkey_export_rsa_raw)
446 LOAD_FUNCPTR_OPT(gnutls_privkey_generate2)
447 LOAD_FUNCPTR_OPT(gnutls_privkey_import_dh_raw)
448 LOAD_FUNCPTR_OPT(gnutls_privkey_import_ecc_raw)
449 LOAD_FUNCPTR_OPT(gnutls_privkey_import_rsa_raw)
450 LOAD_FUNCPTR_OPT(gnutls_privkey_set_spki)
451 LOAD_FUNCPTR_OPT(gnutls_pubkey_encrypt_data)
452 LOAD_FUNCPTR_OPT(gnutls_pubkey_export_dh_raw)
453 LOAD_FUNCPTR_OPT(gnutls_pubkey_export_dsa_raw)
454 LOAD_FUNCPTR_OPT(gnutls_pubkey_export_ecc_raw)
455 LOAD_FUNCPTR_OPT(gnutls_pubkey_export_rsa_raw)
456 LOAD_FUNCPTR_OPT(gnutls_pubkey_import_dh_raw)
457 LOAD_FUNCPTR_OPT(gnutls_pubkey_import_dsa_raw)
458 LOAD_FUNCPTR_OPT(gnutls_pubkey_import_ecc_raw)
459 LOAD_FUNCPTR_OPT(gnutls_pubkey_import_rsa_raw)
460 LOAD_FUNCPTR_OPT(gnutls_pubkey_set_spki)
461 LOAD_FUNCPTR_OPT(gnutls_pubkey_verify_hash2)
462 LOAD_FUNCPTR_OPT(gnutls_x509_spki_deinit)
463 LOAD_FUNCPTR_OPT(gnutls_x509_spki_init)
464 LOAD_FUNCPTR_OPT(gnutls_x509_spki_set_rsa_oaep_params)
465 LOAD_FUNCPTR_OPT(gnutls_x509_spki_set_rsa_pss_params)
467#undef LOAD_FUNCPTR_OPT
469 if ((
ret = pgnutls_global_init()) != GNUTLS_E_SUCCESS)
471 pgnutls_perror(
ret );
477 char *
env =
getenv(
"GNUTLS_DEBUG_LEVEL");
479 pgnutls_global_set_log_level(
level);
480 pgnutls_global_set_log_function( gnutls_log );
486 dlclose( libgnutls_handle );
487 libgnutls_handle =
NULL;
493 if (libgnutls_handle)
495 pgnutls_global_deinit();
496 dlclose( libgnutls_handle );
497 libgnutls_handle =
NULL;
534 ERR(
"out of memory\n" );
539 buffer->buffer = new_buffer;
540 buffer->length = new_length;
562 if (
length <= 0xff) num_bytes = 1;
563 else if (
length <= 0xffff) num_bytes = 2;
564 else if (
length <= 0xffffff) num_bytes = 3;
567 buffer_append_byte(
buffer, 0x80 | num_bytes );
568 while (num_bytes--) buffer_append_byte(
buffer,
length >> (num_bytes * 8) );
573 DWORD leading_zero = (*
data & 0x80) != 0;
575 buffer_append_byte(
buffer, 0x02 );
576 buffer_append_asn1_length(
buffer,
len + leading_zero );
577 if (leading_zero) buffer_append_byte(
buffer, 0 );
589 buffer_append_byte(
buffer, 0x30 );
599 buffer_append_asn1_integer( &
value,
r, r_len );
600 buffer_append_asn1_integer( &
value,
s, s_len );
602 buffer_free( &
value );
605static gnutls_cipher_algorithm_t get_gnutls_cipher(
const struct key *
key )
610 WARN(
"handle block size\n" );
611 switch (
key->
u.
s.mode)
614 return GNUTLS_CIPHER_3DES_CBC;
618 FIXME(
"3DES mode %u with key length %u not supported\n",
key->
u.
s.mode,
key->
u.
s.secret_len );
619 return GNUTLS_CIPHER_UNKNOWN;
622 WARN(
"handle block size\n" );
623 switch (
key->
u.
s.mode)
626 if (
key->
u.
s.secret_len == 16)
return GNUTLS_CIPHER_AES_128_GCM;
627 if (
key->
u.
s.secret_len == 32)
return GNUTLS_CIPHER_AES_256_GCM;
631 if (
key->
u.
s.secret_len == 16)
return GNUTLS_CIPHER_AES_128_CBC;
632 if (
key->
u.
s.secret_len == 24)
return GNUTLS_CIPHER_AES_192_CBC;
633 if (
key->
u.
s.secret_len == 32)
return GNUTLS_CIPHER_AES_256_CBC;
636 if (
key->
u.
s.secret_len == 16)
return GNUTLS_CIPHER_AES_128_CFB8;
637 if (
key->
u.
s.secret_len == 24)
return GNUTLS_CIPHER_AES_192_CFB8;
638 if (
key->
u.
s.secret_len == 32)
return GNUTLS_CIPHER_AES_256_CFB8;
643 FIXME(
"AES mode %u with key length %u not supported\n",
key->
u.
s.mode,
key->
u.
s.secret_len );
644 return GNUTLS_CIPHER_UNKNOWN;
648 return GNUTLS_CIPHER_UNKNOWN;
657 TRACE(
"invalidating cipher handle\n" );
658 pgnutls_cipher_deinit( key_data(
key)->
cipher );
665 gnutls_cipher_algorithm_t
cipher;
680 pgnutls_perror(
ret );
696 if ((
ret = pgnutls_cipher_add_auth( key_data(
params->key)->cipher,
params->auth_data,
params->len )))
698 pgnutls_perror(
ret );
715 pgnutls_perror(
ret );
732 pgnutls_perror(
ret );
748 pgnutls_perror(
ret );
769 if (
size == buflen + 1)
786#define EXPORT_SIZE(d,l,p) export_gnutls_datum( NULL, l, &d, p )
795 if (key_data(
key)->a.pubkey)
796 ret = pgnutls_pubkey_export_rsa_raw( key_data(
key)->a.pubkey, &
m, &
e );
802 pgnutls_perror(
ret );
806 *
ret_len =
sizeof(*rsa_blob) + EXPORT_SIZE(
e,
size, 0 ) + EXPORT_SIZE(
m,
size, 1 );
828 gnutls_ecc_curve_t curve;
861 if (key_data(
key)->
a.pubkey)
862 ret = pgnutls_pubkey_export_ecc_raw( key_data(
key)->
a.pubkey, &curve, &
x, &
y );
868 pgnutls_perror(
ret );
872 if (curve != GNUTLS_ECC_CURVE_SECP256R1 && curve != GNUTLS_ECC_CURVE_SECP384R1)
874 FIXME(
"curve %u not supported\n", curve );
879 *
ret_len =
sizeof(*ecc_blob) + EXPORT_SIZE(
x,
size, 1 ) + EXPORT_SIZE(
y,
size, 1 );
887 export_gnutls_datum(
dst,
size, &
y, 1 );
897 gnutls_datum_t
p,
q,
g,
y;
903 if (
key->
u.
a.bitlen > 1024)
905 FIXME(
"bitlen > 1024 not supported\n" );
909 if (key_data(
key)->
a.pubkey)
910 ret = pgnutls_pubkey_export_dsa_raw( key_data(
key)->
a.pubkey, &
p, &
q, &
g, &
y );
916 pgnutls_perror(
ret );
920 if (EXPORT_SIZE(
q,
sizeof(dsa_blob->
q), 1 ) >
sizeof(dsa_blob->
q))
926 *
ret_len =
sizeof(*dsa_blob) + EXPORT_SIZE(
p,
size, 1 ) + EXPORT_SIZE(
g,
size, 1 ) + EXPORT_SIZE(
y,
size, 1 );
932 export_gnutls_datum(
dst,
size, &
y, 1 );
935 export_gnutls_datum(
dst,
sizeof(dsa_blob->
q), &
q, 1 );
953 for (
i = 0;
i <
len / 2; ++
i)
966 gnutls_datum_t
p,
q,
g,
y;
972 if (
key->
u.
a.bitlen > 1024)
974 FIXME(
"bitlen > 1024 not supported\n" );
978 if (key_data(
key)->
a.pubkey)
979 ret = pgnutls_pubkey_export_dsa_raw( key_data(
key)->
a.pubkey, &
p, &
q, &
g, &
y );
980 else if (key_data(
key)->
a.privkey)
981 ret = pgnutls_privkey_export_dsa_raw( key_data(
key)->
a.privkey, &
p, &
q, &
g, &
y,
NULL );
987 pgnutls_perror(
ret );
991 if (EXPORT_SIZE(
q, Q_SIZE, 1 ) > Q_SIZE)
997 *
ret_len =
sizeof(*hdr) +
sizeof(*dsskey) +
sizeof(
key->
u.
a.dss_seed) +
998 EXPORT_SIZE(
p,
size, 1 ) + Q_SIZE + EXPORT_SIZE(
g,
size, 1 ) + EXPORT_SIZE(
y,
size, 1 );
1011 export_gnutls_datum(
dst,
size, &
p, 1 );
1015 export_gnutls_datum(
dst, Q_SIZE, &
q, 1 );
1019 export_gnutls_datum(
dst,
size, &
g, 1 );
1023 export_gnutls_datum(
dst,
size, &
y, 1 );
1035static gnutls_privkey_t create_privkey( gnutls_pk_algorithm_t pk_alg,
unsigned int bitlen,
1036 const gnutls_keygen_data_st *
data,
unsigned int data_size )
1038 gnutls_privkey_t privkey;
1041 if ((
ret = pgnutls_privkey_init( &privkey )))
1043 pgnutls_perror(
ret );
1047 if ((
ret = pgnutls_privkey_generate2( privkey, pk_alg, bitlen, 0,
data, data_size )))
1049 pgnutls_perror(
ret );
1050 pgnutls_privkey_deinit( privkey );
1057static gnutls_pubkey_t create_pubkey_from_privkey( gnutls_privkey_t privkey )
1062 if ((
ret = pgnutls_pubkey_init( &
pubkey )))
1064 pgnutls_perror(
ret );
1068 if ((
ret = pgnutls_pubkey_import_privkey(
pubkey, privkey, 0, 0 )))
1070 pgnutls_perror(
ret );
1071 pgnutls_pubkey_deinit(
pubkey );
1078static gnutls_dh_params_t get_dh_params( gnutls_privkey_t privkey )
1080 gnutls_dh_params_t
params;
1084 if ((
ret = pgnutls_dh_params_init( &
params )))
1086 pgnutls_perror(
ret );
1090 if ((
ret = pgnutls_privkey_export_dh_raw( privkey,
params,
NULL, &
x, 0 )))
1092 pgnutls_perror(
ret );
1093 pgnutls_dh_params_deinit(
params );
1104 gnutls_pk_algorithm_t pk_alg;
1105 gnutls_privkey_t privkey;
1107 unsigned int bitlen;
1116 pk_alg = GNUTLS_PK_RSA;
1117 bitlen =
key->
u.
a.bitlen;
1121 pk_alg = GNUTLS_PK_DH;
1122 bitlen =
key->
u.
a.bitlen;
1126 pk_alg = GNUTLS_PK_DSA;
1127 bitlen =
key->
u.
a.bitlen;
1132 pk_alg = GNUTLS_PK_ECC;
1133 bitlen = GNUTLS_CURVE_TO_BITS( GNUTLS_ECC_CURVE_SECP256R1 );
1138 pk_alg = GNUTLS_PK_ECC;
1139 bitlen = GNUTLS_CURVE_TO_BITS( GNUTLS_ECC_CURVE_SECP384R1 );
1149 gnutls_keygen_data_st
data;
1151 data.type = GNUTLS_KEYGEN_DH;
1152 data.data = (
unsigned char *)key_data(
key)->a.dh_params;
1159 !(key_data(
key)->a.dh_params = get_dh_params( privkey )))
1161 pgnutls_privkey_deinit( privkey );
1165 if (!(
pubkey = create_pubkey_from_privkey( privkey )))
1167 pgnutls_privkey_deinit( privkey );
1171 key_data(
key)->a.privkey = privkey;
1179 gnutls_ecc_curve_t curve;
1180 gnutls_datum_t
x,
y,
d;
1208 FIXME(
"algorithm %u does not yet support exporting ecc blob\n",
key->
alg_id );
1214 if ((
ret = pgnutls_privkey_export_ecc_raw( key_data(
key)->
a.privkey, &curve, &
x, &
y, &
d )))
1216 pgnutls_perror(
ret );
1220 if (curve != GNUTLS_ECC_CURVE_SECP256R1 && curve != GNUTLS_ECC_CURVE_SECP384R1)
1222 FIXME(
"curve %u not supported\n", curve );
1227 *
ret_len =
sizeof(*ecc_blob) + EXPORT_SIZE(
x,
size, 1 ) + EXPORT_SIZE(
y,
size, 1 ) + EXPORT_SIZE(
d,
size, 1 );
1237 export_gnutls_datum(
dst,
size, &
d, 1 );
1247 gnutls_ecc_curve_t curve;
1249 gnutls_datum_t
x,
y,
k;
1256 curve = GNUTLS_ECC_CURVE_SECP256R1;
1261 curve = GNUTLS_ECC_CURVE_SECP384R1;
1269 if ((
ret = pgnutls_privkey_init( &
handle )))
1271 pgnutls_perror(
ret );
1276 x.data = (
unsigned char *)(ecc_blob + 1);
1277 x.size = ecc_blob->
cbKey;
1278 y.data =
x.data + ecc_blob->
cbKey;
1279 y.size = ecc_blob->
cbKey;
1280 k.data =
y.data + ecc_blob->
cbKey;
1281 k.size = ecc_blob->
cbKey;
1283 if ((
ret = pgnutls_privkey_import_ecc_raw(
handle, curve, &
x, &
y, &
k )))
1285 pgnutls_perror(
ret );
1286 pgnutls_privkey_deinit(
handle );
1290 if (key_data(
key)->
a.privkey) pgnutls_privkey_deinit( key_data(
key)->
a.privkey );
1298 gnutls_datum_t
m,
e,
d,
p,
q,
u, e1, e2;
1306 if ((
ret = pgnutls_privkey_export_rsa_raw( key_data(
key)->
a.privkey, &
m, &
e, &
d, &
p, &
q, &
u, &e1, &e2 )))
1308 pgnutls_perror(
ret );
1312 *
ret_len =
sizeof(*rsa_blob) + EXPORT_SIZE(
e,
size, 0 ) + EXPORT_SIZE(
m,
size, 1 ) +
1313 EXPORT_SIZE(
p,
size / 2, 1 ) + EXPORT_SIZE(
q,
size / 2, 1 );
1315 if (full) *
ret_len += EXPORT_SIZE( e1,
size / 2, 1 ) + EXPORT_SIZE( e2,
size / 2, 1 ) +
1316 EXPORT_SIZE(
u,
size / 2, 1 ) + EXPORT_SIZE(
d,
size, 1 );
1339 export_gnutls_datum(
dst,
size / 2, &e1, 1 );
1342 export_gnutls_datum(
dst,
size / 2, &e2, 1 );
1345 export_gnutls_datum(
dst,
size / 2, &
u, 1 );
1348 export_gnutls_datum(
dst,
size, &
d, 1 );
1360 gnutls_datum_t
m,
e,
p,
q;
1364 if ((
ret = pgnutls_privkey_init( &
handle )))
1366 pgnutls_perror(
ret );
1370 e.data = (
unsigned char *)(rsa_blob + 1);
1372 m.data =
e.data +
e.size;
1374 p.data =
m.data +
m.size;
1376 q.data =
p.data +
p.size;
1381 pgnutls_perror(
ret );
1382 pgnutls_privkey_deinit(
handle );
1386 if (key_data(
key)->
a.privkey) pgnutls_privkey_deinit( key_data(
key)->
a.privkey );
1395 gnutls_datum_t
p,
q,
g,
y,
x;
1402 if ((
ret = pgnutls_privkey_export_dsa_raw( key_data(
key)->
a.privkey, &
p, &
q, &
g, &
y, &
x )))
1404 pgnutls_perror(
ret );
1408 if (
q.size > 21 ||
x.size > 21)
1410 ERR(
"can't export key in this format\n" );
1415 *
ret_len =
sizeof(*hdr) +
sizeof(*pubkey) +
sizeof(
key->
u.
a.dss_seed) +
1416 EXPORT_SIZE(
p,
size, 1 ) + 20 + EXPORT_SIZE(
g,
size, 1 ) + 20;
1430 export_gnutls_datum(
dst,
size, &
p, 1 );
1434 export_gnutls_datum(
dst, 20, &
q, 1 );
1438 export_gnutls_datum(
dst,
size, &
g, 1 );
1442 export_gnutls_datum(
dst, 20, &
x, 1 );
1458 gnutls_datum_t
p,
q,
g,
x;
1459 unsigned char *
data, p_data[128], q_data[20], g_data[128], x_data[20];
1462 if ((
ret = pgnutls_privkey_init( &
handle )))
1464 pgnutls_perror(
ret );
1469 if ((
size =
pubkey->bitlen / 8) >
sizeof(p_data))
1471 FIXME(
"size %u not supported\n",
size );
1472 pgnutls_privkey_deinit(
handle );
1479 for (
i = 0;
i <
p.size;
i++)
p.data[
i] =
data[
p.size -
i - 1];
1483 q.size =
sizeof(q_data);
1484 for (
i = 0;
i <
q.size;
i++)
q.data[
i] =
data[
q.size -
i - 1];
1493 x.size =
sizeof(x_data);
1494 for (
i = 0;
i <
x.size;
i++)
x.data[
i] =
data[
x.size -
i - 1];
1499 pgnutls_perror(
ret );
1500 pgnutls_privkey_deinit(
handle );
1506 if (key_data(
key)->
a.privkey) pgnutls_privkey_deinit( key_data(
key)->
a.privkey );
1514 gnutls_ecc_curve_t curve;
1515 gnutls_datum_t
x,
y;
1523 curve = GNUTLS_ECC_CURVE_SECP256R1;
break;
1527 curve = GNUTLS_ECC_CURVE_SECP384R1;
break;
1534 if ((
ret = pgnutls_pubkey_init( &
handle )))
1536 pgnutls_perror(
ret );
1541 x.data =
buf +
sizeof(*ecc_blob);
1542 x.size = ecc_blob->
cbKey;
1543 y.data =
buf +
sizeof(*ecc_blob) + ecc_blob->cbKey;
1544 y.size = ecc_blob->cbKey;
1546 if ((
ret = pgnutls_pubkey_import_ecc_raw(
handle, curve, &
x, &
y )))
1548 pgnutls_perror(
ret );
1549 pgnutls_pubkey_deinit(
handle );
1553 if (key_data(
key)->
a.pubkey) pgnutls_pubkey_deinit( key_data(
key)->
a.pubkey );
1562 gnutls_datum_t
m,
e;
1565 if ((
ret = pgnutls_pubkey_init( &
handle )))
1567 pgnutls_perror(
ret );
1572 e.data =
buf +
sizeof(*rsa_blob);
1573 e.size = rsa_blob->cbPublicExp;
1574 m.data =
buf +
sizeof(*rsa_blob) + rsa_blob->cbPublicExp;
1575 m.size = rsa_blob->cbModulus;
1577 if ((
ret = pgnutls_pubkey_import_rsa_raw(
handle, &
m, &
e )))
1579 pgnutls_perror(
ret );
1580 pgnutls_pubkey_deinit(
handle );
1584 if (key_data(
key)->
a.pubkey) pgnutls_pubkey_deinit( key_data(
key)->
a.pubkey );
1592 gnutls_datum_t
p,
q,
g,
y;
1596 if ((
ret = pgnutls_pubkey_init( &
handle )))
1598 pgnutls_perror(
ret );
1603 p.data =
buf +
sizeof(*dsa_blob);
1604 p.size = dsa_blob->
cbKey;
1605 q.data = dsa_blob->q;
1606 q.size =
sizeof(dsa_blob->q);
1607 g.data =
buf +
sizeof(*dsa_blob) + dsa_blob->cbKey;
1608 g.size = dsa_blob->cbKey;
1609 y.data =
buf +
sizeof(*dsa_blob) + dsa_blob->cbKey * 2;
1610 y.size = dsa_blob->cbKey;
1612 if ((
ret = pgnutls_pubkey_import_dsa_raw(
handle, &
p, &
q, &
g, &
y )))
1614 pgnutls_perror(
ret );
1615 pgnutls_pubkey_deinit(
handle );
1619 if (key_data(
key)->
a.pubkey) pgnutls_pubkey_deinit( key_data(
key)->
a.pubkey );
1628 gnutls_datum_t
p,
q,
g,
y;
1630 unsigned char *
data, p_data[128], q_data[20], g_data[128], y_data[128];
1633 if ((
ret = pgnutls_pubkey_init( &
handle )))
1635 pgnutls_perror(
ret );
1646 for (
i = 0;
i <
p.size;
i++)
p.data[
i] =
data[
p.size -
i - 1];
1650 q.size =
sizeof(q_data);
1651 for (
i = 0;
i <
q.size;
i++)
q.data[
i] =
data[
q.size -
i - 1];
1660 y.size =
sizeof(y_data);
1661 for (
i = 0;
i <
y.size;
i++)
y.data[
i] =
data[
y.size -
i - 1];
1665 pgnutls_perror(
ret );
1666 pgnutls_pubkey_deinit(
handle );
1670 if (key_data(
key)->
a.pubkey) pgnutls_pubkey_deinit( key_data(
key)->
a.pubkey );
1679 gnutls_dh_params_t
params;
1680 gnutls_datum_t
p,
g,
y;
1682 int ret = GNUTLS_E_INVALID_REQUEST;
1684 if ((
ret = pgnutls_dh_params_init( &
params )) < 0)
1686 pgnutls_perror(
ret );
1690 if ((
ret = pgnutls_pubkey_export_dh_raw( key_data(
key)->
a.pubkey,
params, &
y, 0 )))
1692 pgnutls_perror(
ret );
1693 pgnutls_dh_params_deinit(
params );
1699 pgnutls_perror(
ret );
1701 pgnutls_dh_params_deinit(
params );
1705 *
ret_len =
sizeof(*dh_blob) + EXPORT_SIZE(
p,
size, 1) + EXPORT_SIZE(
g,
size, 1) + EXPORT_SIZE(
y,
size, 1);
1724 gnutls_datum_t
p,
g,
y,
x;
1725 gnutls_dh_params_t
params;
1732 if ((
ret = pgnutls_dh_params_init( &
params )) < 0)
1734 pgnutls_perror(
ret );
1738 if ((
ret = pgnutls_privkey_export_dh_raw( key_data(
key)->
a.privkey,
params, &
y, &
x, 0 )))
1740 pgnutls_perror(
ret );
1741 pgnutls_dh_params_deinit(
params );
1747 pgnutls_perror(
ret );
1749 pgnutls_dh_params_deinit(
params );
1753 *
ret_len =
sizeof(*dh_blob) + EXPORT_SIZE(
p,
size, 1) + EXPORT_SIZE(
g,
size, 1) +
1754 EXPORT_SIZE(
y,
size, 1) + EXPORT_SIZE(
x,
size, 1);
1768 pgnutls_dh_params_deinit(
params );
1775 unsigned int size =
sizeof(*hdr) +
key->
u.
a.bitlen / 8 * 2;
1776 gnutls_datum_t
p,
g;
1783 if ((
ret = pgnutls_dh_params_export_raw( key_data(
key)->
a.dh_params, &
p, &
g,
NULL )))
1785 pgnutls_perror(
ret );
1795 hdr->cbKeyLength =
key->
u.
a.bitlen / 8;
1798 dst += export_gnutls_datum(
dst,
hdr->cbKeyLength, &
p, 1 );
1799 dst += export_gnutls_datum(
dst,
hdr->cbKeyLength, &
g, 1 );
1857 gnutls_dh_params_t
params;
1858 gnutls_datum_t
p,
g,
y;
1862 if ((
ret = pgnutls_pubkey_init( &
handle )))
1864 pgnutls_perror(
ret );
1868 if ((
ret = pgnutls_dh_params_init( &
params )) < 0)
1870 pgnutls_perror(
ret );
1871 pgnutls_pubkey_deinit(
handle );
1876 p.data =
buf +
sizeof(*dh_blob);
1878 g.data =
buf +
sizeof(*dh_blob) + dh_blob->cbKey;
1879 g.size = dh_blob->cbKey;
1880 y.data =
buf +
sizeof(*dh_blob) + dh_blob->cbKey * 2;
1881 y.size = dh_blob->cbKey;
1883 if ((
ret = pgnutls_dh_params_import_raw(
params, &
p, &
g )) < 0)
1885 pgnutls_perror(
ret );
1886 pgnutls_dh_params_deinit(
params );
1887 pgnutls_pubkey_deinit(
handle );
1893 pgnutls_perror(
ret );
1894 pgnutls_dh_params_deinit(
params );
1895 pgnutls_pubkey_deinit(
handle );
1899 if (key_data(
key)->
a.pubkey) pgnutls_pubkey_deinit( key_data(
key)->
a.pubkey );
1902 if (key_data(
key)->
a.dh_params) pgnutls_dh_params_deinit( key_data(
key)->
a.dh_params );
1910 gnutls_dh_params_t
params;
1911 gnutls_datum_t
p,
g,
y,
x;
1915 if ((
ret = pgnutls_privkey_init( &
handle )))
1917 pgnutls_perror(
ret );
1921 if ((
ret = pgnutls_dh_params_init( &
params )) < 0)
1923 pgnutls_perror(
ret );
1924 pgnutls_privkey_deinit(
handle );
1929 p.data =
buf +
sizeof(*dh_blob);
1931 g.data =
buf +
sizeof(*dh_blob) + dh_blob->cbKey;
1932 g.size = dh_blob->cbKey;
1933 y.data =
buf +
sizeof(*dh_blob) + dh_blob->cbKey * 2;
1934 y.size = dh_blob->cbKey;
1935 x.data =
buf +
sizeof(*dh_blob) + dh_blob->cbKey * 3;
1936 x.size = dh_blob->cbKey;
1938 if ((
ret = pgnutls_dh_params_import_raw(
params, &
p, &
g )) < 0)
1940 pgnutls_perror(
ret );
1941 pgnutls_dh_params_deinit(
params );
1942 pgnutls_privkey_deinit(
handle );
1948 pgnutls_perror(
ret );
1949 pgnutls_dh_params_deinit(
params );
1950 pgnutls_privkey_deinit(
handle );
1954 if (key_data(
key)->
a.privkey) pgnutls_privkey_deinit( key_data(
key)->
a.privkey );
1957 if (key_data(
key)->
a.dh_params) pgnutls_dh_params_deinit( key_data(
key)->
a.dh_params );
1965 gnutls_dh_params_t
params;
1966 gnutls_datum_t
p,
g;
1969 if ((
ret = pgnutls_dh_params_init( &
params )))
1971 pgnutls_perror(
ret );
1975 p.data = (
unsigned char *)(dh_header + 1);
1980 if ((
ret = pgnutls_dh_params_import_raw(
params, &
p, &
g )))
1982 pgnutls_perror(
ret );
1983 pgnutls_dh_params_deinit(
params );
1987 if (key_data(
key)->
a.dh_params) pgnutls_dh_params_deinit( key_data(
key)->
a.dh_params );
2030 FIXME(
"DSA private key not supported\n" );
2048 if ((
ret = pgnutls_pubkey_init( &
pubkey )))
2050 pgnutls_perror(
ret );
2054 if (pgnutls_pubkey_import_privkey(
pubkey, key_data(
params->key)->a.privkey, 0, 0 ))
2057 pgnutls_pubkey_deinit(
pubkey );
2061 if (key_data(
key)->
a.pubkey) pgnutls_pubkey_deinit( key_data(
key)->
a.pubkey );
2068 gnutls_datum_t *gnutls_signature )
2071 DWORD r_len = signature_len / 2;
2072 DWORD s_len = r_len;
2077 buffer_append_asn1_r_s( &
buffer,
r, r_len,
s, s_len );
2084 gnutls_signature->data =
buffer.buffer;
2085 gnutls_signature->size =
buffer.pos;
2090 gnutls_datum_t *gnutls_signature )
2093 gnutls_signature->size = signature_len;
2098 gnutls_datum_t *gnutls_signature )
2105 return prepare_gnutls_signature_dsa(
key,
signature, signature_len, gnutls_signature );
2109 return prepare_gnutls_signature_rsa(
key,
signature, signature_len, gnutls_signature );
2117static gnutls_digest_algorithm_t get_digest_from_id(
const WCHAR *
alg_id )
2125 return GNUTLS_DIG_UNKNOWN;
2128static NTSTATUS pubkey_set_rsa_pss_params( gnutls_pubkey_t
key, gnutls_digest_algorithm_t dig,
unsigned int salt_size )
2130 gnutls_x509_spki_t spki;
2133 if (((
ret = pgnutls_x509_spki_init( &spki ) < 0)))
2135 pgnutls_perror(
ret );
2138 pgnutls_x509_spki_set_rsa_pss_params( spki, dig, salt_size );
2139 ret = pgnutls_pubkey_set_spki(
key, spki, 0 );
2140 pgnutls_x509_spki_deinit( spki );
2143 pgnutls_perror(
ret );
2151#ifdef GNUTLS_VERIFY_ALLOW_BROKEN
2152 unsigned int verify_flags = GNUTLS_VERIFY_ALLOW_BROKEN;
2154 unsigned int verify_flags = 0;
2159 gnutls_digest_algorithm_t hash_alg;
2160 gnutls_sign_algorithm_t sign_alg;
2161 gnutls_datum_t gnutls_hash, gnutls_signature;
2162 gnutls_pk_algorithm_t pk_alg;
2174 switch (
params->hash_len)
2176 case 20: hash_alg = GNUTLS_DIG_SHA1;
break;
2177 case 32: hash_alg = GNUTLS_DIG_SHA256;
break;
2178 case 48: hash_alg = GNUTLS_DIG_SHA384;
break;
2181 FIXME(
"hash size %u not yet supported\n",
params->hash_len );
2184 pk_alg = GNUTLS_PK_ECC;
2195 if (!
info->pszAlgId)
2197 hash_alg = GNUTLS_DIG_UNKNOWN;
2198 verify_flags |= GNUTLS_VERIFY_USE_TLS1_RSA;
2200 else if ((hash_alg = get_digest_from_id(
info->pszAlgId)) == GNUTLS_DIG_UNKNOWN)
2205 pk_alg = GNUTLS_PK_RSA;
2213 if ((hash_alg = get_digest_from_id(
info->pszAlgId)) == GNUTLS_DIG_UNKNOWN)
2218 if ((
status = pubkey_set_rsa_pss_params( key_data(
key)->
a.pubkey, hash_alg,
info->cbSalt )))
return status;
2219 pk_alg = GNUTLS_PK_RSA_PSS;
2227 if (
params->hash_len != 20)
2229 FIXME(
"hash size %u not supported\n",
params->hash_len );
2232 hash_alg = GNUTLS_DIG_SHA1;
2233 pk_alg = GNUTLS_PK_DSA;
2241 if ((sign_alg = pgnutls_pk_to_sign( pk_alg, hash_alg )) == GNUTLS_SIGN_UNKNOWN)
2243 FIXME(
"GnuTLS does not support algorithm %u with hash len %u\n",
key->
alg_id,
params->hash_len );
2247 if ((
status = prepare_gnutls_signature(
key,
params->signature,
params->signature_len, &gnutls_signature )))
2250 gnutls_hash.data =
params->hash;
2251 gnutls_hash.size =
params->hash_len;
2253 ret = pgnutls_pubkey_verify_hash2( key_data(
key)->
a.pubkey, sign_alg, verify_flags, &gnutls_hash, &gnutls_signature );
2254 if (gnutls_signature.data !=
params->signature)
free( gnutls_signature.data );
2258static unsigned int get_signature_length(
enum alg_id id )
2266 FIXME(
"unhandled algorithm %u\n",
id );
2289 unsigned int sig_len = get_signature_length(
type );
2290 gnutls_datum_t
r,
s;
2294 pgnutls_perror(
err );
2301 if (
r.size > sig_len / 2 + 1 ||
s.size > sig_len / 2 + 1)
2303 ERR(
"we didn't get a correct signature\n" );
2309 export_gnutls_datum( output, sig_len / 2, &
r, 1 );
2310 export_gnutls_datum( output + sig_len / 2, sig_len / 2, &
s, 1 );
2321static NTSTATUS privkey_set_rsa_pss_params( gnutls_privkey_t
key, gnutls_digest_algorithm_t dig,
unsigned int salt_size )
2323 gnutls_x509_spki_t spki;
2326 if (((
ret = pgnutls_x509_spki_init( &spki ) < 0)))
2328 pgnutls_perror(
ret );
2331 pgnutls_x509_spki_set_rsa_pss_params( spki, dig, salt_size );
2332 ret = pgnutls_privkey_set_spki(
key, spki, 0 );
2333 pgnutls_x509_spki_deinit( spki );
2336 pgnutls_perror(
ret );
2346 unsigned int flags =
params->flags, gnutls_flags = 0;
2348 gnutls_digest_algorithm_t hash_alg;
2355 switch (
params->input_len)
2357 case 20: hash_alg = GNUTLS_DIG_SHA1;
break;
2358 case 32: hash_alg = GNUTLS_DIG_SHA256;
break;
2359 case 48: hash_alg = GNUTLS_DIG_SHA384;
break;
2360 case 64: hash_alg = GNUTLS_DIG_SHA512;
break;
2363 FIXME(
"hash size %u not yet supported\n",
params->input_len );
2370 if (pad && pad->
pszAlgId && get_digest_from_id( pad->
pszAlgId ) != hash_alg)
2380 if (
params->input_len != 20)
2382 FIXME(
"hash size %u not supported\n",
params->input_len );
2385 hash_alg = GNUTLS_DIG_SHA1;
2393 WARN(
"padding info not found\n" );
2396 if (!pad->
pszAlgId) hash_alg = GNUTLS_DIG_UNKNOWN;
2397 else if ((hash_alg = get_digest_from_id( pad->
pszAlgId )) == GNUTLS_DIG_UNKNOWN)
2409 WARN(
"padding info not found\n" );
2414 FIXME(
"BCRYPT_PAD_PSS not supported for key algorithm %u\n",
key->
alg_id );
2417 if ((hash_alg = get_digest_from_id( pad->
pszAlgId )) == GNUTLS_DIG_UNKNOWN)
2423 if ((
status = privkey_set_rsa_pss_params( key_data(
key)->
a.privkey, hash_alg, pad->
cbSalt )))
return status;
2424 gnutls_flags = GNUTLS_PRIVKEY_SIGN_FLAG_RSA_PSS;
2433 FIXME(
"flags %#x not implemented\n",
flags );
2450 if ((
ret = pgnutls_privkey_sign_hash( key_data(
key)->
a.privkey, hash_alg, gnutls_flags, &
hash, &
signature )))
2452 pgnutls_perror(
ret );
2465 if (key_data(
key)->
a.privkey) pgnutls_privkey_deinit( key_data(
key)->
a.privkey );
2466 if (key_data(
key)->
a.pubkey) pgnutls_pubkey_deinit( key_data(
key)->
a.pubkey );
2467 if (key_data(
key)->
a.dh_params) pgnutls_dh_params_deinit( key_data(
key)->
a.dh_params );
2471static NTSTATUS dup_privkey(
struct key *key_orig,
struct key *key_copy )
2473 gnutls_privkey_t privkey;
2476 if ((
ret = pgnutls_privkey_init( &privkey )))
2478 pgnutls_perror(
ret );
2482 switch (key_orig->
alg_id)
2487 gnutls_datum_t
m,
e,
d,
p,
q,
u, e1, e2;
2489 if ((
ret = pgnutls_privkey_export_rsa_raw( key_data(key_orig)->
a.privkey, &
m, &
e, &
d, &
p, &
q, &
u, &e1, &e2 )))
2491 ret = pgnutls_privkey_import_rsa_raw( privkey, &
m, &
e, &
d, &
p, &
q, &
u, &e1, &e2 );
2498 gnutls_datum_t
p,
q,
g,
y,
x;
2500 if ((
ret = pgnutls_privkey_export_dsa_raw( key_data(key_orig)->
a.privkey, &
p, &
q, &
g, &
y, &
x )))
break;
2501 ret = pgnutls_privkey_import_dsa_raw( privkey, &
p, &
q, &
g, &
y, &
x );
2503 if (!
ret) key_copy->
u.
a.dss_seed = key_orig->
u.
a.dss_seed;
2511 gnutls_ecc_curve_t curve;
2512 gnutls_datum_t
x,
y,
k;
2514 if ((
ret = pgnutls_privkey_export_ecc_raw( key_data(key_orig)->
a.privkey, &curve, &
x, &
y, &
k )))
break;
2515 ret = pgnutls_privkey_import_ecc_raw( privkey, curve, &
x, &
y, &
k );
2521 gnutls_dh_params_t
params;
2522 gnutls_datum_t
y,
x;
2524 if ((
ret = pgnutls_dh_params_init( &
params )) < 0)
break;
2525 if ((
ret = pgnutls_privkey_export_dh_raw( key_data(key_orig)->
a.privkey,
params, &
y, &
x, 0 )) < 0)
2527 pgnutls_dh_params_deinit(
params );
2530 ret = pgnutls_privkey_import_dh_raw( privkey,
params, &
y, &
x );
2531 pgnutls_dh_params_deinit(
params );
2536 ERR(
"unhandled algorithm %u\n", key_orig->
alg_id );
2537 pgnutls_privkey_deinit( privkey );
2543 pgnutls_perror(
ret );
2544 pgnutls_privkey_deinit( privkey );
2548 key_data(key_copy)->a.privkey = privkey;
2552static NTSTATUS dup_pubkey(
struct key *key_orig,
struct key *key_copy )
2557 if ((
ret = pgnutls_pubkey_init( &
pubkey )))
2559 pgnutls_perror(
ret );
2563 switch (key_orig->
alg_id)
2568 gnutls_datum_t
m,
e;
2570 if ((
ret = pgnutls_pubkey_export_rsa_raw( key_data(key_orig)->
a.pubkey, &
m, &
e )))
break;
2571 ret = pgnutls_pubkey_import_rsa_raw(
pubkey, &
m, &
e );
2577 gnutls_datum_t
p,
q,
g,
y;
2579 if ((
ret = pgnutls_pubkey_export_dsa_raw( key_data(key_orig)->
a.pubkey, &
p, &
q, &
g, &
y )))
break;
2580 ret = pgnutls_pubkey_import_dsa_raw(
pubkey, &
p, &
q, &
g, &
y );
2582 if (!
ret) key_copy->
u.
a.dss_seed = key_orig->
u.
a.dss_seed;
2590 gnutls_ecc_curve_t curve;
2591 gnutls_datum_t
x,
y;
2593 if ((
ret = pgnutls_pubkey_export_ecc_raw( key_data(key_orig)->
a.pubkey, &curve, &
x, &
y )))
break;
2594 ret = pgnutls_pubkey_import_ecc_raw(
pubkey, curve, &
x, &
y );
2600 gnutls_dh_params_t
params;
2603 if ((
ret = pgnutls_dh_params_init( &
params )) < 0)
break;
2604 if ((
ret = pgnutls_pubkey_export_dh_raw( key_data(key_orig)->
a.pubkey,
params, &
y, 0 )) < 0)
2606 pgnutls_dh_params_deinit(
params );
2610 pgnutls_dh_params_deinit(
params );
2615 ERR(
"unhandled algorithm %u\n", key_orig->
alg_id );
2616 pgnutls_pubkey_deinit(
pubkey );
2622 pgnutls_perror(
ret );
2623 pgnutls_pubkey_deinit(
pubkey );
2627 key_data(key_copy)->a.pubkey =
pubkey;
2645static NTSTATUS privkey_set_rsa_oaep_params( gnutls_privkey_t
key, gnutls_digest_algorithm_t dig, gnutls_datum_t *
label )
2647 gnutls_x509_spki_t spki;
2650 if (((
ret = pgnutls_x509_spki_init( &spki ) < 0)))
2652 pgnutls_perror(
ret );
2655 pgnutls_x509_spki_set_rsa_oaep_params( spki, dig,
label );
2656 ret = pgnutls_privkey_set_spki(
key, spki, 0 );
2657 pgnutls_x509_spki_deinit( spki );
2660 pgnutls_perror(
ret );
2669 gnutls_datum_t
e,
d = { 0 };
2676 gnutls_digest_algorithm_t dig;
2677 gnutls_datum_t
label;
2681 WARN(
"padding info not found\n" );
2684 if ((dig = get_digest_from_id( pad->
pszAlgId )) == GNUTLS_DIG_UNKNOWN)
2697 if ((
ret = pgnutls_privkey_decrypt_data( key_data(
params->key)->a.privkey, 0, &
e, &
d )))
2699 pgnutls_perror(
ret );
2711static NTSTATUS pubkey_set_rsa_oaep_params( gnutls_pubkey_t
key, gnutls_digest_algorithm_t dig, gnutls_datum_t *
label )
2713 gnutls_x509_spki_t spki;
2716 if (((
ret = pgnutls_x509_spki_init( &spki ) < 0)))
2718 pgnutls_perror(
ret );
2721 pgnutls_x509_spki_set_rsa_oaep_params( spki, dig,
label );
2722 ret = pgnutls_pubkey_set_spki(
key, spki, 0 );
2723 pgnutls_x509_spki_deinit( spki );
2726 pgnutls_perror(
ret );
2735 gnutls_datum_t
d,
e = { 0 };
2744 gnutls_digest_algorithm_t dig;
2745 gnutls_datum_t
label;
2749 WARN(
"padding info not found\n" );
2752 if ((dig = get_digest_from_id( pad->
pszAlgId )) == GNUTLS_DIG_UNKNOWN)
2765 if ((
ret = pgnutls_pubkey_encrypt_data(key_data(
params->key)->a.pubkey, 0, &
d, &
e)))
2767 pgnutls_perror(
ret );
2787 if ((
ret = pgnutls_privkey_derive_secret( key_data(
params->privkey)->a.privkey,
2788 key_data(
params->pubkey)->a.pubkey,
NULL, &
s, 0 )))
2790 pgnutls_perror(
ret );
2794 *
params->ret_len = EXPORT_SIZE(
s,
params->privkey->u.a.bitlen / 8, 1 );
2798 else export_gnutls_datum(
params->output, *
params->ret_len, &
s, 1 );
2807 gnutls_digest_algorithm_t alg;
2814 alg = GNUTLS_DIG_MD5;
2817 alg = GNUTLS_DIG_SHA1;
2821 alg = GNUTLS_DIG_SHA256;
2825 alg = GNUTLS_DIG_SHA384;
2829 alg = GNUTLS_DIG_SHA512;
2843 gnutls_mac_algorithm_t alg;
2850 alg = GNUTLS_MAC_MD5;
2853 alg = GNUTLS_MAC_SHA1;
2857 alg = GNUTLS_MAC_SHA256;
2861 alg = GNUTLS_MAC_SHA384;
2865 alg = GNUTLS_MAC_SHA512;
2891 pgnutls_hash_deinit(
hash->u.hash_handle,
output );
2897 pgnutls_hmac_deinit(
hash->u.hmac_handle,
output );
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
#define BCRYPT_DH_PUBLIC_MAGIC
#define BCRYPT_ECDH_PRIVATE_P256_MAGIC
#define BCRYPT_ECDSA_PUBLIC_P256_MAGIC
#define BCRYPT_ECDH_PUBLIC_P384_MAGIC
#define BCRYPT_ECDSA_PUBLIC_P384_MAGIC
#define BCRYPT_SHA512_ALGORITHM
#define BCRYPT_RSAFULLPRIVATE_MAGIC
#define BCRYPT_MD2_ALGORITHM
#define BCRYPT_SHA256_ALGORITHM
#define BCRYPT_RSAPRIVATE_MAGIC
#define BCRYPT_ECDH_PUBLIC_P256_MAGIC
#define BCRYPT_ECDSA_PRIVATE_P256_MAGIC
#define BCRYPT_ECDSA_PRIVATE_P384_MAGIC
#define BCRYPT_DH_PARAMETERS_MAGIC
#define BCRYPT_RSAPUBLIC_MAGIC
#define BCRYPT_ECDH_PRIVATE_P384_MAGIC
#define BCRYPT_SHA384_ALGORITHM
#define BCRYPT_DSA_PUBLIC_MAGIC
#define BCRYPT_SHA1_ALGORITHM
#define BCRYPT_MD5_ALGORITHM
#define BCRYPT_DH_PRIVATE_MAGIC
NTSTATUS hmac_init(struct hash *hash, UCHAR *key, ULONG key_size)
NTSTATUS key_symmetric_vector_reset(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 KEY_EXPORT_FLAG_DH_PARAMETERS
NTSTATUS hmac_update(struct hash *hash, UCHAR *input, ULONG size)
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)
NTSTATUS key_asymmetric_duplicate(void *args)
NTSTATUS hmac_finish(struct hash *hash, UCHAR *output)
#define KEY_EXPORT_FLAG_PUBLIC
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)
static void reverse_bytes(UCHAR *buf, ULONG len)
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)
#define STATUS_INVALID_HANDLE
#define STATUS_NOT_SUPPORTED
#define STATUS_NOT_IMPLEMENTED
static LPCWSTR LPCWSTR LPCWSTR env
#define WINE_DECLARE_DEBUG_CHANNEL(x)
static const WCHAR pubkey[]
static void process_detach(void)
char *CDECL getenv(const char *name)
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
_ACRTIMP int __cdecl atoi(const char *)
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
GLint GLint GLint GLint GLint x
GLuint GLuint GLsizei GLenum type
GLint GLint GLint GLint GLint GLint y
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLdouble GLdouble GLdouble r
GLdouble GLdouble GLdouble GLdouble q
GLenum const GLfloat * params
GLenum GLuint GLenum GLsizei const GLchar * buf
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * bits
GLuint GLsizei GLsizei * length
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
#define memcpy(s1, s2, n)
static const WCHAR label[]
static JOBOBJECTINFOCLASS LPVOID DWORD LPDWORD ret_len
static unsigned(__cdecl *hash_bstr)(bstr_t s)
#define STATUS_INTERNAL_ERROR
#define STATUS_DLL_NOT_FOUND
#define STATUS_INVALID_SIGNATURE
for(i=0;i< sizeof(testsuite)/sizeof(testsuite[0]);++i) ok(call_test(testsuite[i].func)
#define STATUS_BUFFER_TOO_SMALL
UINT64 private[PRIVATE_DATA_SIZE]
#define STATUS_INVALID_PARAMETER