Cryptography Reference
In-Depth Information
const unsigned char *ptr_begin;
struct asn1struct *token;
ptr = buffer;
token = top_level_token;
while ( length )
{
ptr_begin = ptr;
tag = *ptr;
ptr++;
length--;
// High tag # form (bits 5-1 all == “1”), to encode tags > 31. Not used
// in X.509
if ( ( tag & 0x1F ) == 0x1F )
{
tag = 0;
while ( *ptr & 0x80 )
{
tag <<= 8;
tag |= *ptr & 0x7F;
}
}
tag_length_byte = *ptr;
ptr++;
length--;
// TODO this doesn't handle indefinite-length encodings (according to
// ITU-T X.690, this never occurs in DER, only in BER, which X.509 doesn't
// use)
if ( tag_length_byte & 0x80 )
{
const unsigned char *len_ptr = ptr;
tag_length = 0;
while ( ( len_ptr - ptr ) < ( tag_length_byte & 0x7F ) )
{
tag_length <<= 8;
tag_length |= *(len_ptr++);
length--;
}
ptr = len_ptr;
}
else
{
tag_length = tag_length_byte;
}
// TODO deal with “high tag numbers”
token->constructed = tag & 0x20;
(Continued)
Search WWH ::




Custom Search