d593db
diff -up ldns-1.6.16/keys.c.dsa ldns-1.6.16/keys.c
d593db
--- ldns-1.6.16/keys.c.dsa	2012-08-31 14:03:18.000000000 +0200
d593db
+++ ldns-1.6.16/keys.c	2014-03-18 17:48:57.474128661 +0100
d593db
@@ -1314,7 +1314,6 @@ ldns_key_dsa2bin(unsigned char *data, DS
d593db
 	/* See RFC2536 */
d593db
 	*size = (uint16_t)BN_num_bytes(k->p);
d593db
 	T = (*size - 64) / 8;
d593db
-	memcpy(data, &T, 1);
d593db
 
d593db
 	if (T > 8) {
d593db
 		fprintf(stderr, "DSA key with T > 8 (ie. > 1024 bits)");
d593db
@@ -1323,12 +1322,13 @@ ldns_key_dsa2bin(unsigned char *data, DS
d593db
 	}
d593db
 
d593db
 	/* size = 64 + (T * 8); */
d593db
+	memset(data, 0, 21 + *size * 3);
d593db
 	data[0] = (unsigned char)T;
d593db
 	BN_bn2bin(k->q, data + 1 ); 		/* 20 octects */
d593db
 	BN_bn2bin(k->p, data + 21 ); 		/* offset octects */
d593db
-	BN_bn2bin(k->g, data + 21 + *size); 	/* offset octets */
d593db
-	BN_bn2bin(k->pub_key, data + 21 + *size + *size); /* offset octets */
d593db
-	*size = 21 + (*size * 3);
d593db
+	BN_bn2bin(k->g, data + 21 + *size * 2 - BN_num_bytes(k->g));
d593db
+	BN_bn2bin(k->pub_key,data + 21 + *size * 3 - BN_num_bytes(k->pub_key));
d593db
+	*size = 21 + *size * 3;
d593db
 	return true;
d593db
 }
d593db