diff -urN strongswan-4.2.15/src/libstrongswan/asn1/asn1.c strongswan-4.2.15_asn1_rdn/src/libstrongswan/asn1/asn1.c
--- strongswan-4.2.15/src/libstrongswan/asn1/asn1.c	2009-05-26 14:15:08.000000000 +0200
+++ strongswan-4.2.15_asn1_rdn/src/libstrongswan/asn1/asn1.c	2009-06-18 22:12:11.000000000 +0200
@@ -261,6 +261,11 @@
 		len = 256*len + *blob->ptr++;
 		blob->len--;
 	}
+	if (len > blob->len)
+	{
+		DBG2("length is larger than remaining blob size");
+		return ASN1_INVALID_LENGTH;
+	}
 	return len;
 }
 
diff -urN strongswan-4.2.15/src/libstrongswan/asn1/asn1_parser.c strongswan-4.2.15_asn1_rdn/src/libstrongswan/asn1/asn1_parser.c
--- strongswan-4.2.15/src/libstrongswan/asn1/asn1_parser.c	2009-05-26 14:15:08.000000000 +0200
+++ strongswan-4.2.15_asn1_rdn/src/libstrongswan/asn1/asn1_parser.c	2009-06-18 22:12:11.000000000 +0200
@@ -160,7 +160,7 @@
 	
 	blob1->len = asn1_length(blob);
 	
-	if (blob1->len == ASN1_INVALID_LENGTH || blob->len < blob1->len)
+	if (blob1->len == ASN1_INVALID_LENGTH)
 	{
 		DBG1("L%d - %s:  length of ASN.1 object invalid or too large", 
 					level, obj.name);
diff -urN strongswan-4.2.15/src/pluto/asn1.c strongswan-4.2.15_asn1_rdn/src/pluto/asn1.c
--- strongswan-4.2.15/src/pluto/asn1.c	2009-05-26 14:15:08.000000000 +0200
+++ strongswan-4.2.15_asn1_rdn/src/pluto/asn1.c	2009-06-18 22:19:53.000000000 +0200
@@ -191,6 +191,13 @@
 	len = 256*len + *blob->ptr++;
 	blob->len--;
     }
+    if (len > blob->len)
+    {
+	DBG(DBG_PARSING,
+	    DBG_log("length is larger than remaining blob size")
+	)
+	return ASN1_INVALID_LENGTH;
+    }
     return len;
 }
 
@@ -592,7 +599,7 @@
 
     blob1->len = asn1_length(blob);
 
-    if (blob1->len == ASN1_INVALID_LENGTH || blob->len < blob1->len)
+    if (blob1->len == ASN1_INVALID_LENGTH)
     {
 	DBG(DBG_PARSING,
 	    DBG_log("L%d - %s:  length of ASN.1 object invalid or too large",
