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;
 }