diff options
author | Martin Willi <martin@strongswan.org> | 2009-04-14 13:50:23 +0000 |
---|---|---|
committer | Martin Willi <martin@strongswan.org> | 2009-04-14 13:50:23 +0000 |
commit | 56807f35b959bb7d342da994b10eba087eddecfd (patch) | |
tree | 45a3173d17c81d5f2f7cdb4f7d7c4549987b9f1b /src/libstrongswan/asn1 | |
parent | 9c4387edcd61739b6647053f1361d4c7201881f3 (diff) | |
download | strongswan-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.c | 29 | ||||
-rw-r--r-- | src/libstrongswan/asn1/asn1.h | 8 | ||||
-rw-r--r-- | src/libstrongswan/asn1/oid.pl | 6 |
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 ? "," : " " |