aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Willi <martin@strongswan.org>2009-07-03 09:26:48 +0200
committerMartin Willi <martin@strongswan.org>2009-07-03 09:26:48 +0200
commit90855e965afdce04558383ae221f9cf502560e98 (patch)
treef691c419192b23506dccc951f7611c05f417ecf4 /src
parent00fcc0f8f3c15b436bd8e322cd5d8e200eda9109 (diff)
downloadstrongswan-90855e965afdce04558383ae221f9cf502560e98.tar.bz2
strongswan-90855e965afdce04558383ae221f9cf502560e98.tar.xz
added additional sanity checks to asn1_length() parsing
Diffstat (limited to 'src')
-rw-r--r--src/libstrongswan/asn1/asn1.c25
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;
}