aboutsummaryrefslogtreecommitdiffstats
path: root/src/libstrongswan/asn1
diff options
context:
space:
mode:
authorMartin Willi <martin@strongswan.org>2009-04-14 13:50:23 +0000
committerMartin Willi <martin@strongswan.org>2009-04-14 13:50:23 +0000
commit56807f35b959bb7d342da994b10eba087eddecfd (patch)
tree45a3173d17c81d5f2f7cdb4f7d7c4549987b9f1b /src/libstrongswan/asn1
parent9c4387edcd61739b6647053f1361d4c7201881f3 (diff)
downloadstrongswan-56807f35b959bb7d342da994b10eba087eddecfd.tar.bz2
strongswan-56807f35b959bb7d342da994b10eba087eddecfd.tar.xz
implemented asn1_get_known_oid(), mapping OID index to ASN1 OID
Diffstat (limited to 'src/libstrongswan/asn1')
-rw-r--r--src/libstrongswan/asn1/asn1.c29
-rw-r--r--src/libstrongswan/asn1/asn1.h8
-rw-r--r--src/libstrongswan/asn1/oid.pl6
3 files changed, 42 insertions, 1 deletions
diff --git a/src/libstrongswan/asn1/asn1.c b/src/libstrongswan/asn1/asn1.c
index 85695bbea..ee11f013b 100644
--- a/src/libstrongswan/asn1/asn1.c
+++ b/src/libstrongswan/asn1/asn1.c
@@ -220,6 +220,35 @@ int asn1_known_oid(chunk_t object)
/*
* Defined in header.
*/
+chunk_t asn1_get_known_oid(int n)
+{
+ chunk_t oid;
+ int i;
+
+ if (n < 0 || n >= OID_MAX)
+ {
+ return chunk_empty;
+ }
+
+ i = oid_names[n].level + 1;
+ oid = chunk_alloc(i);
+ do
+ {
+ if (oid_names[n].level >= i)
+ {
+ n--;
+ continue;
+ }
+ oid.ptr[--i] = oid_names[n--].octet;
+ }
+ while (i > 0);
+
+ return oid;
+}
+
+/*
+ * Defined in header.
+ */
u_int asn1_length(chunk_t *blob)
{
u_char n;
diff --git a/src/libstrongswan/asn1/asn1.h b/src/libstrongswan/asn1/asn1.h
index eb039665c..1ff9fcbce 100644
--- a/src/libstrongswan/asn1/asn1.h
+++ b/src/libstrongswan/asn1/asn1.h
@@ -107,6 +107,14 @@ chunk_t asn1_algorithmIdentifier(int oid);
int asn1_known_oid(chunk_t object);
/**
+ * Converts an known OID index to ASN.1 OID
+ *
+ * @param n index into the oid_names[] table
+ * @return allocated OID chunk, chunk_empty if index out of range
+ */
+chunk_t asn1_get_known_oid(int n);
+
+/**
* Returns the length of an ASN.1 object
* The blob pointer is advanced past the tag length fields
*
diff --git a/src/libstrongswan/asn1/oid.pl b/src/libstrongswan/asn1/oid.pl
index 373101cc0..027a850fd 100644
--- a/src/libstrongswan/asn1/oid.pl
+++ b/src/libstrongswan/asn1/oid.pl
@@ -38,6 +38,7 @@ print OID_H "/* Object identifiers (OIDs) used by strongSwan\n",
" u_char octet;\n",
" u_int next;\n",
" u_int down;\n",
+ " u_int level;\n",
" const u_char *name;\n",
"} oid_t;\n",
"\n",
@@ -77,6 +78,8 @@ while ($line = <SRC>)
$counter++;
}
+printf OID_H "\n#define OID_MAX%s%d\n", "\t" x 8, $counter;
+
print OID_H "\n#endif /* OID_H_ */\n";
close SRC;
@@ -113,12 +116,13 @@ for ($c = 0; $c < $counter; $c++)
}
}
- printf OID_C " {%s%s,%s%3d, %d, %s%s}%s /* %3d */\n"
+ printf OID_C " {%s%s,%s%3d, %d, %2d, %s%s}%s /* %3d */\n"
,' ' x @order[$c]
, @octet[$c]
, ' ' x (1 + $max_order - @order[$c])
, @next[$c]
, @order[$c+1] > @order[$c]
+ , @order[$c] / 2
, @name[$c]
, ' ' x ($max_name - length(@name[$c]))
, $c != $counter-1 ? "," : " "