Commit b1a323f4ea for strongswan.org
commit b1a323f4ea3b31f23f36b7960246bfe9c73e5563
Author: Tobias Brunner <tobias@strongswan.org>
Date: Wed Feb 25 16:55:38 2026 +0100
scripts: Add some debugging output for known OIDs to stderr
diff --git a/scripts/oid2der.c b/scripts/oid2der.c
index 6fab63cd87..5d046b11be 100644
--- a/scripts/oid2der.c
+++ b/scripts/oid2der.c
@@ -15,20 +15,80 @@
*/
#include <stdio.h>
+#include <asn1/oid.h>
#include <asn1/asn1.h>
/**
- * convert string OID to DER encoding
+ * Print the path for the given OID
*/
+static void print_path(FILE *out, int oid)
+{
+ if (oid == OID_UNKNOWN)
+ {
+ fprintf(out, "<unknown OID>\n");
+ }
+ else
+ {
+ static const char *sep = " › ", *unnamed = "…";
+ const char *name, *prev = NULL;
+ int level = oid_names[oid].level, path[level+1];
+ bool first = TRUE;
+
+ path[level] = oid;
+ while (level > 0)
+ {
+ if (oid_names[oid].level < level)
+ {
+ path[--level] = oid;
+ }
+ oid--;
+ }
+ for (level = 0; level < countof(path); level++)
+ {
+ name = oid_names[path[level]].name;
+ if (*name)
+ {
+ if (prev && !*prev)
+ {
+ fprintf(out, "%s%s", first ? "" : sep, unnamed);
+ first = FALSE;
+ }
+ fprintf(out, "%s%s", first ? "" : sep, name);
+ first = FALSE;
+ }
+ prev = name;
+ }
+ fprintf(out, "\n");
+ }
+}
+
+/**
+ * Print usage output
+ */
+static int usage(char *cmd)
+{
+ fprintf(stderr, "%s <dot oid>|-d <hex oid>\n", cmd);
+ return 1;
+}
+
int main(int argc, char *argv[])
{
- int i, nr = 0;
+ int i, nr = 0, known;
chunk_t oid;
char *decoded;
bool decode = FALSE;
+ if (argc < 2)
+ {
+ return usage(argv[0]);
+ }
+
if (streq(argv[1], "-d"))
{
+ if (argc < 3)
+ {
+ return usage(argv[0]);
+ }
decode = TRUE;
nr++;
}
@@ -38,26 +98,45 @@ int main(int argc, char *argv[])
if (decode)
{
oid = chunk_from_hex(chunk_from_str(argv[nr]), NULL);
- decoded = asn1_oid_to_string(oid);
- printf("%s\n", decoded);
- free(decoded);
- free(oid.ptr);
- continue;
}
- oid = asn1_oid_from_string(argv[nr]);
+ else
+ {
+ oid = asn1_oid_from_string(argv[nr]);
+ }
+
if (oid.len)
{
- for (i = 0; i < oid.len; i++)
+ known = asn1_known_oid(oid);
+ print_path(stderr, known);
+ }
+ else
+ {
+ free(oid.ptr);
+ return 1;
+ }
+
+ if (decode)
+ {
+ decoded = asn1_oid_to_string(oid);
+ if (decoded)
{
- printf("0x%02x,", oid.ptr[i]);
+ printf("%s\n", decoded);
+ free(decoded);
+ }
+ else
+ {
+ fprintf(stderr, "<unable to encode OID>\n");
}
- printf("\n");
- free(oid.ptr);
}
else
{
- return 1;
+ for (i = 0; i < oid.len; i++)
+ {
+ printf("0x%02x,", oid.ptr[i]);
+ }
+ printf("\n");
}
+ free(oid.ptr);
}
return 0;
}