Commit 8f3b506a authored by Lev Walkin's avatar Lev Walkin

even better

parent b2ce577f
...@@ -17,7 +17,7 @@ ber_fetch_tag(void *ptr, size_t size, ber_tlv_tag_t *tag_r) { ...@@ -17,7 +17,7 @@ ber_fetch_tag(void *ptr, size_t size, ber_tlv_tag_t *tag_r) {
val = *(uint8_t *)ptr; val = *(uint8_t *)ptr;
tclass = (val >> 6); tclass = (val >> 6);
if((val &= 31) != 31) { if((val &= 0x1F) != 0x1F) {
/* /*
* Simple form: everything encoded in a single octet. * Simple form: everything encoded in a single octet.
* Tag Class is encoded using two least significant bits. * Tag Class is encoded using two least significant bits.
...@@ -31,8 +31,8 @@ ber_fetch_tag(void *ptr, size_t size, ber_tlv_tag_t *tag_r) { ...@@ -31,8 +31,8 @@ ber_fetch_tag(void *ptr, size_t size, ber_tlv_tag_t *tag_r) {
* The MSB is 0 if it is the last octet of the tag. * The MSB is 0 if it is the last octet of the tag.
*/ */
for(val = 0, ((char *)ptr)++, skipped = 2; for(val = 0, ((char *)ptr)++, skipped = 2;
skipped < size; ((char *)ptr)++, skipped++) { skipped <= size; ((char *)ptr)++, skipped++) {
unsigned oct = *(uint8_t *)ptr; unsigned int oct = *(uint8_t *)ptr;
if(oct & 0x80) { if(oct & 0x80) {
val = (val << 7) | (oct & 0x7F); val = (val << 7) | (oct & 0x7F);
/* /*
...@@ -47,7 +47,8 @@ ber_fetch_tag(void *ptr, size_t size, ber_tlv_tag_t *tag_r) { ...@@ -47,7 +47,8 @@ ber_fetch_tag(void *ptr, size_t size, ber_tlv_tag_t *tag_r) {
return -1; return -1;
} }
} else { } else {
*tag_r = (val << 9) | (oct << 2) | tclass; val = (val << 7) | oct;
*tag_r = (val << 2) | tclass;
return skipped; return skipped;
} }
} }
...@@ -105,7 +106,7 @@ der_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) { ...@@ -105,7 +106,7 @@ der_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) {
uint8_t *buf = (uint8_t *)bufp; uint8_t *buf = (uint8_t *)bufp;
uint8_t *end; uint8_t *end;
size_t required_size; size_t required_size;
int i; size_t i;
if(tval <= 30) { if(tval <= 30) {
/* Encoded in 1 octet */ /* Encoded in 1 octet */
...@@ -119,8 +120,8 @@ der_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) { ...@@ -119,8 +120,8 @@ der_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) {
/* /*
* Compute the size of the subsequent bytes. * Compute the size of the subsequent bytes.
*/ */
for(required_size = 1, i = 7; i < 8 * sizeof(tag); i += 7) { for(required_size = 1, i = 7; i < 8 * sizeof(tval); i += 7) {
if(tag >> i) if(tval >> i)
required_size++; required_size++;
else else
break; break;
...@@ -133,10 +134,9 @@ der_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) { ...@@ -133,10 +134,9 @@ der_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) {
* Fill in the buffer, space permitting. * Fill in the buffer, space permitting.
*/ */
end = buf + required_size - 1; end = buf + required_size - 1;
for(i -= 7; buf <= end; i -= 7, buf++) { for(i -= 7; buf < end; i -= 7, buf++)
*buf = 0x80 | ((tval >> i) & 0x7F); *buf = 0x80 | ((tval >> i) & 0x7F);
} *buf = (tval & 0x7F); /* Last octet without high bit */
*end &= 0x7F; /* Clear the last high bit */
return required_size + 1; return required_size + 1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment