Signed-off-by: Paul Gofman pgofman@codeweavers.com --- dlls/bcrypt/gnutls.c | 68 +++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 36 deletions(-)
diff --git a/dlls/bcrypt/gnutls.c b/dlls/bcrypt/gnutls.c index abbbb1ee89f..f5e4651a03a 100644 --- a/dlls/bcrypt/gnutls.c +++ b/dlls/bcrypt/gnutls.c @@ -841,14 +841,28 @@ static NTSTATUS export_gnutls_pubkey_dsa( gnutls_privkey_t gnutls_key, ULONG bit return STATUS_SUCCESS; }
+static void revert_byte_string( UCHAR *d, ULONG length ) +{ + unsigned int i; + UCHAR tmp; + + for (i = 0; i < length / 2; ++i ) + { + tmp = d[i]; + d[i] = d[length - i - 1]; + d[length - i - 1] = tmp; + } +} + static NTSTATUS export_gnutls_pubkey_dsa_capi( gnutls_privkey_t gnutls_key, const DSSSEED *seed, ULONG bitlen, UCHAR **pubkey, ULONG *pubkey_len ) { BLOBHEADER *hdr; DSSPUBKEY *dsskey; gnutls_datum_t p, q, g, y; - UCHAR *dst, *src; - int i, ret, size = sizeof(*hdr) + sizeof(*dsskey) + sizeof(*seed); + UCHAR *dst; + int ret, size = sizeof(*hdr) + sizeof(*dsskey) + sizeof(*seed); + ULONG q_size;
if (bitlen > 1024) { @@ -862,7 +876,9 @@ static NTSTATUS export_gnutls_pubkey_dsa_capi( gnutls_privkey_t gnutls_key, cons return STATUS_INTERNAL_ERROR; }
- if (!(hdr = RtlAllocateHeap( GetProcessHeap(), 0, size + p.size + q.size + g.size + y.size ))) + q_size = sizeof(((BCRYPT_DSA_KEY_BLOB *)NULL)->q); + + if (!(hdr = RtlAllocateHeap( GetProcessHeap(), 0, size + bitlen / 8 * 3 + q_size ))) { pgnutls_perror( ret ); free( p.data ); free( q.data ); free( g.data ); free( y.data ); @@ -879,46 +895,26 @@ static NTSTATUS export_gnutls_pubkey_dsa_capi( gnutls_privkey_t gnutls_key, cons dsskey->bitlen = bitlen;
dst = (UCHAR *)(dsskey + 1); - if (p.size % 2) - { - src = p.data + 1; - p.size--; - } - else src = p.data; - for (i = 0; i < p.size; i++) dst[i] = src[p.size - i - 1]; + export_gnutls_datum( dst, bitlen / 8, &p, NULL ); + revert_byte_string( dst, bitlen / 8 ); + dst += bitlen / 8;
- dst += p.size; - if (q.size % 2) - { - src = q.data + 1; - q.size--; - } - else src = q.data; - for (i = 0; i < q.size; i++) dst[i] = src[q.size - i - 1]; + export_gnutls_datum( dst, q_size, &q, NULL ); + revert_byte_string( dst, q_size ); + dst += q_size;
- dst += q.size; - if (g.size % 2) - { - src = g.data + 1; - g.size--; - } - else src = g.data; - for (i = 0; i < g.size; i++) dst[i] = src[g.size - i - 1]; + export_gnutls_datum( dst, bitlen / 8, &g, NULL ); + revert_byte_string( dst, bitlen / 8 ); + dst += bitlen / 8;
- dst += g.size; - if (y.size % 2) - { - src = y.data + 1; - y.size--; - } - else src = y.data; - for (i = 0; i < y.size; i++) dst[i] = src[y.size - i - 1]; + export_gnutls_datum( dst, bitlen / 8, &y, NULL ); + revert_byte_string( dst, bitlen / 8 ); + dst += bitlen / 8;
- dst += y.size; memcpy( dst, seed, sizeof(*seed) );
*pubkey = (UCHAR *)hdr; - *pubkey_len = size + p.size + q.size + g.size + y.size; + *pubkey_len = size + bitlen / 8 * 3 + q_size;
free( p.data ); free( q.data ); free( g.data ); free( y.data ); return STATUS_SUCCESS;