diff options
author | Martin Willi <martin@strongswan.org> | 2009-07-03 09:26:48 +0200 |
---|---|---|
committer | Martin Willi <martin@strongswan.org> | 2009-07-03 09:26:48 +0200 |
commit | 90855e965afdce04558383ae221f9cf502560e98 (patch) | |
tree | f691c419192b23506dccc951f7611c05f417ecf4 /src/libstrongswan/asn1 | |
parent | 00fcc0f8f3c15b436bd8e322cd5d8e200eda9109 (diff) | |
download | strongswan-90855e965afdce04558383ae221f9cf502560e98.tar.bz2 strongswan-90855e965afdce04558383ae221f9cf502560e98.tar.xz |
added additional sanity checks to asn1_length() parsing
Diffstat (limited to 'src/libstrongswan/asn1')
-rw-r--r-- | src/libstrongswan/asn1/asn1.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/src/libstrongswan/asn1/asn1.c b/src/libstrongswan/asn1/asn1.c index d2078cbbc..ee91c14e1 100644 --- a/src/libstrongswan/asn1/asn1.c +++ b/src/libstrongswan/asn1/asn1.c @@ -260,25 +260,32 @@ size_t asn1_length(chunk_t *blob) u_char n; size_t len; - /* advance from tag field on to length field */ - blob->ptr++; - blob->len--; + if (blob->len < 2) + { + DBG2("insufficient number of octets to parse ASN.1 length"); + return ASN1_INVALID_LENGTH; + } - /* read first octet of length field */ - n = *blob->ptr++; - blob->len--; + /* read length field, skip tag and length */ + n = blob->ptr[1]; + *blob = chunk_skip(*blob, 2); if ((n & 0x80) == 0) - {/* single length octet */ + { /* single length octet */ + if (n > blob->len) + { + DBG2("length is larger than remaining blob size"); + return ASN1_INVALID_LENGTH; + } return n; } /* composite length, determine number of length octets */ n &= 0x7f; - if (n > blob->len) + if (n == 0 || n > blob->len) { - DBG2("number of length octets is larger than ASN.1 object"); + DBG2("number of length octets invalid"); return ASN1_INVALID_LENGTH; } |