aboutsummaryrefslogtreecommitdiffstats
path: root/src/libstrongswan/asn1/asn1.c
diff options
context:
space:
mode:
authorAndreas Steffen <andreas.steffen@strongswan.org>2009-07-20 12:53:17 +0200
committerAndreas Steffen <andreas.steffen@strongswan.org>2009-07-20 12:53:17 +0200
commitd3875b13a986dd30d2c281b4f450a4e015e3c7a9 (patch)
tree5c03a52f817db509c807b9a102467588dff94c7c /src/libstrongswan/asn1/asn1.c
parent0fcfd0f5a38ec08417bcf536019d4809f6e672ac (diff)
downloadstrongswan-d3875b13a986dd30d2c281b4f450a4e015e3c7a9.tar.bz2
strongswan-d3875b13a986dd30d2c281b4f450a4e015e3c7a9.tar.xz
The RDN parser vulnerability discovered by Orange Labs research team
was not completely fixed in version 4.2.16. Some more modifications had to be applied to the asn1_length() function.
Diffstat (limited to 'src/libstrongswan/asn1/asn1.c')
-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 e45e6cae9..fb6adcb62 100644
--- a/src/libstrongswan/asn1/asn1.c
+++ b/src/libstrongswan/asn1/asn1.c
@@ -225,25 +225,32 @@ u_int 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;
}