memcpy(p, b, blen);
else {
/* Begin at the end of the encoding */
- n = b + blen - 1;
- p += blen - 1;
+ n = b + blen;
+ p += blen;
i = blen;
/* Copy zeros to destination as long as source is zero */
- while (!*n && i > 1) {
- *(p--) = 0;
+ while (!n[-1] && i > 1) {
+ *(--p) = 0;
n--;
i--;
}
/* Complement and increment next octet */
- *(p--) = ((*(n--)) ^ 0xff) + 1;
+ *(--p) = ((*(--n)) ^ 0xff) + 1;
i--;
/* Complement any octets left */
for (; i > 0; i--)
- *(p--) = *(n--) ^ 0xff;
+ *(--p) = *(--n) ^ 0xff;
}
*pp += ret;
/* Must be negative: calculate twos complement */
if (b) {
const unsigned char *from = p + plen - 1 + pad;
- unsigned char *to = b + plen - 1;
+ unsigned char *to = b + plen;
i = plen;
while (*from == 0 && i) {
- *to-- = 0;
+ *--to = 0;
i--;
from--;
}
- *to-- = (*from-- ^ 0xff) + 1;
+ *--to = (*from-- ^ 0xff) + 1;
OPENSSL_assert(i != 0);
i--;
for (; i > 0; i--)
- *to-- = *from-- ^ 0xff;
+ *--to = *from-- ^ 0xff;
}
return plen;
}
ASN1err(ASN1_F_ASN1_GET_INT64, ASN1_R_TOO_SMALL);
return 0;
}
- *pr = -(int64_t)r;
+ *pr = -(uint64_t)r;
} else {
if (r > INT64_MAX) {
ASN1err(ASN1_F_ASN1_GET_INT64, ASN1_R_TOO_LARGE);
return ASN1_ENUMERATED_set_int64(a, v);
}
-long ASN1_ENUMERATED_get(ASN1_ENUMERATED *a)
+long ASN1_ENUMERATED_get(const ASN1_ENUMERATED *a)
{
int i;
int64_t r;