fixed asn1_oid_from_string(), allowing it to handle up to 32 bit node numbers
This commit is contained in:
@@ -129,10 +129,10 @@ chunk_t asn1_build_known_oid(int n)
|
|||||||
chunk_t asn1_oid_from_string(char *str)
|
chunk_t asn1_oid_from_string(char *str)
|
||||||
{
|
{
|
||||||
enumerator_t *enumerator;
|
enumerator_t *enumerator;
|
||||||
u_char buf[32];
|
u_char buf[64];
|
||||||
char *end;
|
char *end;
|
||||||
int i = 0, pos = 0;
|
int i = 0, pos = 0, shift;
|
||||||
u_int val, first = 0;
|
u_int val, shifted_val, first = 0;
|
||||||
|
|
||||||
enumerator = enumerator_create_token(str, ".", "");
|
enumerator = enumerator_create_token(str, ".", "");
|
||||||
while (enumerator->enumerate(enumerator, &str))
|
while (enumerator->enumerate(enumerator, &str))
|
||||||
@@ -152,16 +152,17 @@ chunk_t asn1_oid_from_string(char *str)
|
|||||||
buf[pos++] = first * 40 + val;
|
buf[pos++] = first * 40 + val;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (val < 128)
|
shift = 28; /* sufficient to handle 32 bit node numbers */
|
||||||
|
while (shift)
|
||||||
{
|
{
|
||||||
buf[pos++] = val;
|
shifted_val = val >> shift;
|
||||||
|
shift -= 7;
|
||||||
|
if (shifted_val) /* do not encode leading zeroes */
|
||||||
|
{
|
||||||
|
buf[pos++] = 0x80 | (shifted_val & 0x7F);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
buf[pos++] = val & 0x7F;
|
||||||
{
|
|
||||||
buf[pos++] = 128 | (val >> 7);
|
|
||||||
buf[pos++] = (val % 256) & 0x7F;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
enumerator->destroy(enumerator);
|
enumerator->destroy(enumerator);
|
||||||
|
|||||||
Reference in New Issue
Block a user