[PATCH 4/7] bcrypt: Pad exported datums in export_gnutls_pubkey_dsa_capi().
Paul Gofman
pgofman at codeweavers.com
Fri Jan 15 05:44:42 CST 2021
Signed-off-by: Paul Gofman <pgofman at 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;
--
2.29.2
More information about the wine-devel
mailing list