> * remove unnecessary temp variable d
> * move loop counter j in for() header
> * fix prototype for memcpy
> * make calculation of actual length in BN_to_ASN1_ENUMERATED
> more transparent
>
> This code still looks rather odd, it uses a temporary buffer to first
> convert the number into a minimal little endian representation and then
> reverts the bytes to minimal big endian representation. A simple clz()
> could have revealed the number of bytes necessary to encode. I will fix
> this later.
I'm not too fond of this kind of change - the compiler does a good job
at merging or optimizing temporary variables.
On the other hand, I think this subset of your diff is worth putting in:
Index: a_enum.c
===================================================================
RCS file: /cvs/src/lib/libssl/src/crypto/asn1/a_enum.c,v
retrieving revision 1.12
diff -u -p -r1.12 a_enum.c
--- a_enum.c 21 Apr 2014 11:37:41 -0000 1.12
+++ a_enum.c 28 Apr 2014 21:03:56 -0000
@@ -152,9 +152,9 @@ BN_to_ASN1_ENUMERATED(BIGNUM *bn, ASN1_E
else
ret->type = V_ASN1_ENUMERATED;
j = BN_num_bits(bn);
- len = ((j == 0) ? 0 : ((j / 8) + 1));
- if (ret->length < len + 4) {
- unsigned char *new_data = realloc(ret->data, len + 4);
+ len = 4 + ((j == 0) ? 0 : ((j / 8) + 1));
+ if (ret->length < len) {
+ unsigned char *new_data = realloc(ret->data, len);
if (!new_data) {
ASN1err(ASN1_F_BN_TO_ASN1_ENUMERATED,
ERR_R_MALLOC_FAILURE);
goto err;
Index: a_int.c
===================================================================
RCS file: /cvs/src/lib/libssl/src/crypto/asn1/a_int.c,v
retrieving revision 1.18
diff -u -p -r1.18 a_int.c
--- a_int.c 21 Apr 2014 11:37:41 -0000 1.18
+++ a_int.c 28 Apr 2014 21:03:56 -0000
@@ -159,7 +159,7 @@ i2c_ASN1_INTEGER(ASN1_INTEGER *a, unsign
if (a->length == 0)
*(p++) = 0;
else if (!neg)
- memcpy(p, a->data, (unsigned int)a->length);
+ memcpy(p, a->data, (size_t)a->length);
else {
/* Begin at the end of the encoding */
n = a->data + a->length - 1;
@@ -426,9 +426,9 @@ BN_to_ASN1_INTEGER(const BIGNUM *bn, ASN
else
ret->type = V_ASN1_INTEGER;
j = BN_num_bits(bn);
- len = ((j == 0) ? 0 : ((j / 8) + 1));
- if (ret->length < len + 4) {
- unsigned char *new_data = realloc(ret->data, len + 4);
+ len = 4 + ((j == 0) ? 0 : ((j / 8) + 1));
+ if (ret->length < len) {
+ unsigned char *new_data = realloc(ret->data, len);
if (!new_data) {
ASN1err(ASN1_F_BN_TO_ASN1_INTEGER,
ERR_R_MALLOC_FAILURE);
goto err;