Display signature and public key internals, calculate SHA1 digest as well.
authorjbj <devnull@localhost>
Mon, 1 Oct 2001 17:40:12 +0000 (17:40 +0000)
committerjbj <devnull@localhost>
Mon, 1 Oct 2001 17:40:12 +0000 (17:40 +0000)
Display private signature internals in tkey.
Add dumpasn to rpmio jfor reference.

CVS patchset: 5091
CVS date: 2001/10/01 17:40:12

lib/formats.c
lib/rpmchecksig.c
lib/signature.c
po/rpm.pot
rpmio/Makefile.am
rpmio/dumpasn1.c [new file with mode: 0644]
rpmio/dumpasn1.cfg [new file with mode: 0644]
rpmio/rpmpgp.c
rpmio/rpmpgp.h
rpmio/tkey.c

index 010b889..44df032 100644 (file)
@@ -108,6 +108,38 @@ static /*@only@*/ char * fflagsFormat(int_32 type, const void * data,
     return val;
 }
 
+#ifdef NOTYET
+/**
+ * @param type         tag type
+ * @param data         tag value
+ * @param formatPrefix
+ * @param padding
+ * @param element      (unused)
+ * @return             formatted string
+ */
+static /*@only@*/ char * base64Format(int_32 type, const void * data, 
+       char * formatPrefix, int padding, /*@unused@*/ int element)
+               /*@modifies formatPrefix @*/
+{
+    char * val;
+    char buf[10];
+
+    if (type != RPM_BIN_TYPE) {
+       val = xstrdup(_("(not a blob)"));
+    } else {
+       buf[0] = '\0';
+
+       val = xmalloc(5 + padding);
+       strcat(formatPrefix, "s");
+       /*@-formatconst@*/
+       sprintf(val, formatPrefix, buf);
+       /*@=formatconst@*/
+    }
+
+    return val;
+}
+#endif
+
 /**
  * @param type         tag type
  * @param data         tag value
@@ -556,6 +588,9 @@ const struct headerSprintfExtension_s rpmHeaderFormats[] = {
     { HEADER_EXT_TAG, "RPMTAG_INSTALLPREFIX", { instprefixTag } },
     { HEADER_EXT_TAG, "RPMTAG_TRIGGERCONDS", { triggercondsTag } },
     { HEADER_EXT_TAG, "RPMTAG_TRIGGERTYPE", { triggertypeTag } },
+#ifdef NOTYET
+    { HEADER_EXT_FORMAT, "base64", { base64Format } },
+#endif
     { HEADER_EXT_FORMAT, "depflags", { depflagsFormat } },
     { HEADER_EXT_FORMAT, "fflags", { fflagsFormat } },
     { HEADER_EXT_FORMAT, "perms", { permsFormat } },
index 7163c89..51c45f8 100644 (file)
@@ -5,6 +5,7 @@
 
 #include "system.h"
 
+#include "rpmio_internal.h"
 #include <rpmcli.h>
 
 #include "rpmlead.h"
@@ -69,8 +70,8 @@ static int manageFile(FD_t *fdp, const char **fnp, int flags,
 }
 
 static int copyFile(FD_t *sfdp, const char **sfnp,
-       FD_t *tfdp, const char **tfnp)
-       /*@modifies *sfdp, *sfnp, *tfdp, *tfnp, fileSystem @*/
+       FD_t *tfdp, const char **tfnp, void **sdigest)
+       /*@modifies *sfdp, *sfnp, *tfdp, *tfnp, *sidgest, fileSystem @*/
 {
     unsigned char buffer[BUFSIZ];
     ssize_t count;
@@ -81,6 +82,9 @@ static int copyFile(FD_t *sfdp, const char **sfnp,
     if (manageFile(tfdp, tfnp, O_WRONLY|O_CREAT|O_TRUNC, 0))
        goto exit;
 
+    if (sdigest != NULL)
+       (void) fdInitSHA1(*sfdp, 0);
+
     while ((count = Fread(buffer, sizeof(buffer[0]), sizeof(buffer), *sfdp)) > 0) {
        if (Fwrite(buffer, sizeof(buffer[0]), count, *tfdp) != count) {
            rpmError(RPMERR_FWRITE, _("%s: Fwrite failed: %s\n"), *tfnp,
@@ -93,6 +97,15 @@ static int copyFile(FD_t *sfdp, const char **sfnp,
        goto exit;
     }
 
+    if (sdigest != NULL) {
+       (void) fdFiniSHA1(*sfdp, sdigest, NULL, 1);
+if (rpmIsVerbose()) {
+fprintf(stderr, "========================= Package SHA1 Digest\n");
+fprintf(stderr, "%s\n", (const char *) (*sdigest));
+}
+       *sdigest = _free(*sdigest);
+    }
+
     rc = 0;
 
 exit:
@@ -153,7 +166,7 @@ int rpmReSign(rpmResignFlags flags, char * passPhrase, const char ** argv)
 
        /* Write the header and archive to a temp file */
        /* ASSERT: ofd == NULL && sigtarget == NULL */
-       if (copyFile(&fd, &rpm, &ofd, &sigtarget))
+       if (copyFile(&fd, &rpm, &ofd, &sigtarget, NULL))
            goto exit;
        /* Both fd and ofd are now closed. sigtarget contains tempfile name. */
        /* ASSERT: fd == NULL && ofd == NULL */
@@ -193,7 +206,7 @@ int rpmReSign(rpmResignFlags flags, char * passPhrase, const char ** argv)
 
        /* Append the header and archive from the temp file */
        /* ASSERT: fd == NULL && ofd != NULL */
-       if (copyFile(&fd, &sigtarget, &ofd, &trpm))
+       if (copyFile(&fd, &sigtarget, &ofd, &trpm, NULL))
            goto exit;
        /* Both fd and ofd are now closed. */
        /* ASSERT: fd == NULL && ofd == NULL */
@@ -245,6 +258,7 @@ int rpmCheckSig(rpmCheckSigFlags flags, const char ** argv)
     int_32 tag, type, count;
     const void * ptr;
     int res = 0;
+    void * sdigest = NULL;
     rpmRC rc;
 
     if (argv)
@@ -284,7 +298,7 @@ int rpmCheckSig(rpmCheckSigFlags flags, const char ** argv)
        }
        /* Write the header and archive to a temp file */
        /* ASSERT: ofd == NULL && sigtarget == NULL */
-       if (copyFile(&fd, &rpm, &ofd, &sigtarget)) {
+       if (copyFile(&fd, &rpm, &ofd, &sigtarget, &sdigest)) {
            res++;
            goto bottom;
        }
@@ -459,7 +473,9 @@ int rpmCheckSig(rpmCheckSigFlags flags, const char ** argv)
            (void) unlink(sigtarget);
            sigtarget = _free(sigtarget);
        }
+       sdigest = _free(sdigest);
     }
 
+    sdigest = _free(sdigest);
     return res;
 }
index ea1c802..0de81a2 100644 (file)
@@ -534,8 +534,21 @@ verifyPGPSignature(const char * datafile, const void * sig, int count,
     if (pgpVer == PGP_5)
        res = RPMSIG_BAD;
 
-    if (rpmIsVerbose())
-       (void) pgpPrtPkt(sig);
+if (rpmIsVerbose())
+{   static const char * pubkey = NULL;
+    static unsigned int pklen = 0;
+
+    if (pubkey == NULL) {
+       if (!b64decode(redhatPubKeyRSA, (void **)&pubkey, &pklen)) {
+fprintf(stderr, "========================= Red Hat RSA Public Key\n");
+           (void) pgpPrtPkts(pubkey, pklen);
+       }
+    }
+fprintf(stderr, "========================= Package RSA Signature\n");
+    (void) pgpPrtPkts(sig, count);
+
+    pubkey = _free(pubkey);
+}
 
     /* Write out the signature */
 #ifdef DYING
@@ -649,8 +662,21 @@ verifyGPGSignature(const char * datafile, const void * sig, int count,
     FILE *file;
     int res = RPMSIG_OK;
   
-    if (rpmIsVerbose())
-       (void) pgpPrtPkt(sig);
+if (rpmIsVerbose())
+{   static const char * pubkey = NULL;
+    static unsigned int pklen = 0;
+
+    if (pubkey == NULL) {
+       if (!b64decode(redhatPubKeyDSA, (void **)&pubkey, &pklen)) {
+fprintf(stderr, "========================= Red Hat DSA Public Key\n");
+           (void) pgpPrtPkts(pubkey, pklen);
+       }
+    }
+fprintf(stderr, "========================= Package DSA Signature\n");
+    (void) pgpPrtPkts(sig, count);
+
+    pubkey = _free(pubkey);
+}
 
     /* Write out the signature */
 #ifdef DYING
index c279925..b746409 100644 (file)
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2001-09-29 13:34-0400\n"
+"POT-Creation-Date: 2001-10-01 13:31-0400\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -2168,11 +2168,15 @@ msgstr ""
 msgid "========== continuing tsort ...\n"
 msgstr ""
 
-#: lib/formats.c:28 lib/formats.c:54 lib/formats.c:85 lib/formats.c:128
+#: lib/formats.c:28 lib/formats.c:54 lib/formats.c:85 lib/formats.c:160
 #: lib/header.c:2623 lib/header.c:2644 lib/header.c:2666
 msgid "(not a number)"
 msgstr ""
 
+#: lib/formats.c:128
+msgid "(not a blob)"
+msgstr ""
+
 #: lib/fs.c:70
 #, c-format
 msgid "mntctl() failed to return size: %s\n"
@@ -2983,86 +2987,86 @@ msgstr ""
 msgid "package %s is not installed\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:40
+#: lib/rpmchecksig.c:41
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:52
+#: lib/rpmchecksig.c:53
 msgid "makeTempFile failed\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:86
+#: lib/rpmchecksig.c:90
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:92
+#: lib/rpmchecksig.c:96
 #, c-format
 msgid "%s: Fread failed: %s\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:128 lib/rpmchecksig.c:260
+#: lib/rpmchecksig.c:141 lib/rpmchecksig.c:274
 #, c-format
 msgid "%s: readLead failed\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:133
+#: lib/rpmchecksig.c:146
 #, c-format
 msgid "%s: Can't sign v1.0 RPM\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:137
+#: lib/rpmchecksig.c:150
 #, c-format
 msgid "%s: Can't re-sign v2.0 RPM\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:146 lib/rpmchecksig.c:276
+#: lib/rpmchecksig.c:159 lib/rpmchecksig.c:290
 #, c-format
 msgid "%s: rpmReadSignature failed\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:150 lib/rpmchecksig.c:281
+#: lib/rpmchecksig.c:163 lib/rpmchecksig.c:295
 #, c-format
 msgid "%s: No signature available\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:183
+#: lib/rpmchecksig.c:196
 #, c-format
 msgid "%s: writeLead failed: %s\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:189
+#: lib/rpmchecksig.c:202
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:266
+#: lib/rpmchecksig.c:280
 #, c-format
 msgid "%s: No signature available (v1.0 RPM)\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:431
+#: lib/rpmchecksig.c:445
 msgid "NOT OK"
 msgstr ""
 
-#: lib/rpmchecksig.c:432 lib/rpmchecksig.c:446
+#: lib/rpmchecksig.c:446 lib/rpmchecksig.c:460
 msgid " (MISSING KEYS:"
 msgstr ""
 
-#: lib/rpmchecksig.c:434 lib/rpmchecksig.c:448
+#: lib/rpmchecksig.c:448 lib/rpmchecksig.c:462
 msgid ") "
 msgstr ""
 
-#: lib/rpmchecksig.c:435 lib/rpmchecksig.c:449
+#: lib/rpmchecksig.c:449 lib/rpmchecksig.c:463
 msgid " (UNTRUSTED KEYS:"
 msgstr ""
 
-#: lib/rpmchecksig.c:437 lib/rpmchecksig.c:451
+#: lib/rpmchecksig.c:451 lib/rpmchecksig.c:465
 msgid ")"
 msgstr ""
 
-#: lib/rpmchecksig.c:445
+#: lib/rpmchecksig.c:459
 msgid "OK"
 msgstr ""
 
@@ -3318,7 +3322,7 @@ msgstr ""
 msgid "Got %d bytes of PGP sig\n"
 msgstr ""
 
-#: lib/signature.c:366 lib/signature.c:760
+#: lib/signature.c:366 lib/signature.c:786
 msgid "Couldn't exec gpg\n"
 msgstr ""
 
@@ -3350,31 +3354,31 @@ msgstr ""
 msgid "Generating signature using GPG.\n"
 msgstr ""
 
-#: lib/signature.c:526 lib/signature.c:604
+#: lib/signature.c:526 lib/signature.c:617
 msgid "Could not run pgp.  Use --nopgp to skip PGP checks.\n"
 msgstr ""
 
-#: lib/signature.c:697
+#: lib/signature.c:723
 msgid "Could not run gpg.  Use --nogpg to skip GPG checks.\n"
 msgstr ""
 
-#: lib/signature.c:789
+#: lib/signature.c:815
 msgid "Couldn't exec pgp\n"
 msgstr ""
 
 #. @notreached@
 #. This case should have been screened out long ago.
-#: lib/signature.c:793 lib/signature.c:846
+#: lib/signature.c:819 lib/signature.c:872
 #, c-format
 msgid "Invalid %%_signature spec in macro file\n"
 msgstr ""
 
-#: lib/signature.c:826
+#: lib/signature.c:852
 #, c-format
 msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr ""
 
-#: lib/signature.c:838
+#: lib/signature.c:864
 #, c-format
 msgid "You must set \"%%_pgp_name\" in your macro file\n"
 msgstr ""
index cec28c8..dd48d4f 100644 (file)
@@ -4,7 +4,7 @@ AUTOMAKE_OPTIONS = 1.4 foreign
 
 EXTRA_DIST = tdigest.c tficl.c tkey.c trpmio.c
 
-EXTRA_PROGRAMS = tdigest tkey trpmio
+EXTRA_PROGRAMS = tdigest tkey trpmio dumpasn1
 
 INCLUDES = \
        -I$(top_srcdir) \
@@ -57,6 +57,8 @@ trpmio_LDADD += librpmio.la $(top_builddir)/popt/libpopt.la
 tkey_SOURCES = tkey.c
 tkey_LDADD += librpmio.la $(top_builddir)/popt/libpopt.la
 
+dumpasn1_SOURCES = dumpasn1.c
+
 .PHONY:        sources
 sources:
        @echo $(librpmio_la_SOURCES:%=rpmio/%)
diff --git a/rpmio/dumpasn1.c b/rpmio/dumpasn1.c
new file mode 100644 (file)
index 0000000..b0354c1
--- /dev/null
@@ -0,0 +1,1936 @@
+/* ASN.1 object dumping code, copyright Peter Gutmann
+   <pgut001@cs.auckland.ac.nz>, based on ASN.1 dump program by David Kemp
+   <dpkemp@missi.ncsc.mil>, with contributions from various people including
+   Matthew Hamrick <hamrick@rsa.com>, Bruno Couillard
+   <bcouillard@chrysalis-its.com>, Hallvard Furuseth
+   <h.b.furuseth@usit.uio.no>, Geoff Thorpe <geoff@raas.co.nz>, David Boyce
+   <d.boyce@isode.com>, John Hughes <john.hughes@entegrity.com>, Life is
+   hard, and then you die <ronald@trustpoint.com>, and several other people
+   whose names I've misplaced.
+
+   Available from http://www.cs.auckland.ac.nz/~pgut001/dumpasn1.c.
+   Last updated 21 November 2000.
+
+   This version of dumpasn1 requires a config file dumpasn1.cfg to be present
+   in the same location as the program itself or in a standard directory
+   where binaries live (it will run without it but will display a warning
+   message, you can configure the path either by hardcoding it in or using an
+   environment variable as explained further down).  The config file is
+   available from http://www.cs.auckland.ac.nz/~pgut001/dumpasn1.cfg.
+
+   This code assumes that the input data is binary, having come from a MIME-
+   aware mailer or been piped through a decoding utility if the original
+   format used base64 encoding.  Bruno Couillard has created a modified
+   version which will read raw base64-encoded data (ie without any MIME
+   encapsulation or other headers) directly, at the expense of being somewhat
+   non-portable.  Alternatively, you can use utilities like uudeview (which
+   will strip virtually any kind of encoding, MIME, PEM, PGP, whatever) to
+   recover the binary original.
+
+   You can use this code in whatever way you want, as long as you don't try
+   to claim you wrote it.
+
+   Editing notes: Tabs to 4, phasers to stun */
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Useful defines */
+
+#ifndef TRUE
+  #define FALSE        0
+  #define TRUE ( !FALSE )
+#endif /* TRUE */
+
+/* SunOS 4.x doesn't define seek codes or exit codes or FILENAME_MAX (it does
+   define _POSIX_MAX_PATH, but in funny locations and to different values
+   depending on which include file you use).  Some OS's also define
+   FILENAME_MAX to silly values (eg 14 bytes), so we replace it with a more
+   sensible setting if necessary */
+
+#ifndef SEEK_SET
+  #define SEEK_SET     0
+  #define SEEK_CUR     2
+#endif /* No fseek() codes defined */
+#ifndef EXIT_FAILURE
+  #define EXIT_FAILURE 1
+  #define EXIT_SUCCESS ( !EXIT_FAILURE )
+#endif /* No exit() codes defined */
+#ifndef FILENAME_MAX
+  #define FILENAME_MAX 512
+#else
+  #if FILENAME_MAX < 128
+       #undef FILENAME_MAX
+       #define FILENAME_MAX    512
+  #endif /* FILENAME_MAX < 128 */
+#endif /* FILENAME_MAX */
+
+/* Under Windows we can do special-case handling for things like BMPStrings */
+
+#if ( defined( _WINDOWS ) || defined( WIN32 ) || defined( _WIN32 ) || \
+         defined( __WIN32__ ) )
+  #define __WIN32__
+#endif /* Win32 */
+
+/* Some OS's don't define the min() macro */
+
+#ifndef min
+  #define min(a,b)             ( ( a ) < ( b ) ? ( a ) : ( b ) )
+#endif /* !min */
+
+/* The level of recursion can get scary for deeply-nested structures so we
+   use a larger-than-normal stack under DOS */
+
+#ifdef  __TURBOC__
+  extern unsigned _stklen = 16384;
+#endif /* __TURBOC__ */
+
+/* When we dump a nested data object encapsulated within a larger object, the
+   length is initially set to a magic value which is adjusted to the actual
+   length once we start parsing the object */
+
+#define LENGTH_MAGIC   177545L
+
+/* Tag classes */
+
+#define CLASS_MASK             0xC0    /* Bits 8 and 7 */
+#define UNIVERSAL              0x00    /* 0 = Universal (defined by ITU X.680) */
+#define APPLICATION            0x40    /* 1 = Application */
+#define CONTEXT                        0x80    /* 2 = Context-specific */
+#define PRIVATE                        0xC0    /* 3 = Private */
+
+/* Encoding type */
+
+#define FORM_MASK              0x20    /* Bit 6 */
+#define PRIMITIVE              0x00    /* 0 = primitive */
+#define CONSTRUCTED            0x20    /* 1 = constructed */
+
+/* Universal tags */
+
+#define TAG_MASK               0x1F    /* Bits 5 - 1 */
+#define EOC                            0x00    /*  0: End-of-contents octets */
+#define BOOLEAN                        0x01    /*  1: Boolean */
+#define INTEGER                        0x02    /*  2: Integer */
+#define BITSTRING              0x03    /*  2: Bit string */
+#define OCTETSTRING            0x04    /*  4: Byte string */
+#define NULLTAG                        0x05    /*  5: NULL */
+#define OID                            0x06    /*  6: Object Identifier */
+#define OBJDESCRIPTOR  0x07    /*  7: Object Descriptor */
+#define EXTERNAL               0x08    /*  8: External */
+#define REAL                   0x09    /*  9: Real */
+#define ENUMERATED             0x0A    /* 10: Enumerated */
+#define EMBEDDED_PDV   0x0B    /* 11: Embedded Presentation Data Value */
+#define UTF8STRING             0x0C    /* 12: UTF8 string */
+#define SEQUENCE               0x10    /* 16: Sequence/sequence of */
+#define SET                            0x11    /* 17: Set/set of */
+#define NUMERICSTRING  0x12    /* 18: Numeric string */
+#define PRINTABLESTRING        0x13    /* 19: Printable string (ASCII subset) */
+#define T61STRING              0x14    /* 20: T61/Teletex string */
+#define VIDEOTEXSTRING 0x15    /* 21: Videotex string */
+#define IA5STRING              0x16    /* 22: IA5/ASCII string */
+#define UTCTIME                        0x17    /* 23: UTC time */
+#define GENERALIZEDTIME        0x18    /* 24: Generalized time */
+#define GRAPHICSTRING  0x19    /* 25: Graphic string */
+#define VISIBLESTRING  0x1A    /* 26: Visible string (ASCII subset) */
+#define GENERALSTRING  0x1B    /* 27: General string */
+#define UNIVERSALSTRING        0x1C    /* 28: Universal string */
+#define BMPSTRING              0x1E    /* 30: Basic Multilingual Plane/Unicode string */
+
+/* Length encoding */
+
+#define LEN_XTND  0x80         /* Indefinite or long form */
+#define LEN_MASK  0x7F         /* Bits 7 - 1 */
+
+/* Various special-case operations to perform on strings */
+
+typedef enum {
+       STR_NONE,                               /* No special handling */
+       STR_UTCTIME,                    /* Check it's UTCTime */
+       STR_PRINTABLE,                  /* Check it's a PrintableString */
+       STR_IA5,                                /* Check it's an IA5String */
+       STR_BMP                                 /* Read and display string as Unicode */
+       } STR_OPTION;
+
+/* Structure to hold info on an ASN.1 item */
+
+typedef struct {
+       int id;                                         /* Identifier */
+       int tag;                                        /* Tag */
+       long length;                            /* Data length */
+       int indefinite;                         /* Item has indefinite length */
+       int headerSize;                         /* Size of tag+length */
+       unsigned char header[ 8 ];      /* Tag+length data */
+       } ASN1_ITEM;
+
+/* Config options */
+
+static int printDots = FALSE;          /* Whether to print dots to align columns */
+static int doPure = FALSE;                     /* Print data without LHS info column */
+static int doDumpHeader = FALSE;       /* Dump tag+len in hex (level = 0, 1, 2) */
+static int extraOIDinfo = FALSE;       /* Print extra information about OIDs */
+static int doHexValues = FALSE;                /* Display size, offset in hex not dec.*/
+static int useStdin = FALSE;           /* Take input from stdin */
+static int zeroLengthAllowed = FALSE;/* Zero-length items allowed */
+static int dumpText = FALSE;           /* Dump text alongside hex data */
+static int printAllData = FALSE;       /* Whether to print all data in long blocks */
+static int checkEncaps = TRUE;         /* Print encaps.data in BIT/OCTET STRINGs */
+
+/* Error and warning information */
+
+static int noErrors = 0;                       /* Number of errors found */
+static int noWarnings = 0;                     /* Number of warnings */
+
+/* Position in the input stream */
+
+static int fPos = 0;                           /* Absolute position in data */
+
+/* The output stream */
+
+static FILE *output;                           /* Output stream */
+
+/* Information on an ASN.1 Object Identifier */
+
+#define MAX_OID_SIZE   32
+
+typedef struct tagOIDINFO {
+       struct tagOIDINFO *next;                /* Next item in list */
+       char oid[ MAX_OID_SIZE ], *comment, *description;
+       int oidLength;                                  /* Name, rank, serial number */
+       int warn;                                               /* Whether to warn if OID encountered */
+       } OIDINFO;
+
+static OIDINFO *oidList = NULL;
+
+/* If the config file isn't present in the current directory, we search the
+   following paths (this is needed for Unix with dumpasn1 somewhere in the
+   path, since this doesn't set up argv[0] to the full path).  Anything
+   beginning with a '$' uses the appropriate environment variable */
+
+#define CONFIG_NAME            "dumpasn1.cfg"
+
+static const char *configPaths[] = {
+       /* Unix absolute paths */
+       "/bin/", "/usr/bin/", "/usr/local/bin/",
+
+       /* Windoze absolute paths.  Usually things are on C:, but older NT setups
+          are easier to do on D: if the initial copy is done to C: */
+       "c:\\dos\\", "d:\\dos\\", "c:\\windows\\", "d:\\windows\\",
+       "c:\\winnt\\", "d:\\winnt\\",
+
+       /* It's my program, I'm allowed to hardcode in strange paths which noone
+          else uses */
+       "$HOME/BIN/", "c:\\program files\\bin\\",
+
+       /* Unix environment-based paths */
+       "$HOME/", "$HOME/bin/",
+
+       /* General environment-based paths */
+       "$DUMPASN1_PATH/",
+
+       NULL
+       };
+
+#define isEnvTerminator( c )   \
+       ( ( ( c ) == '/' ) || ( ( c ) == '.' ) || ( ( c ) == '$' ) || \
+         ( ( c ) == '\0' ) || ( ( c ) == '~' ) )
+
+/****************************************************************************
+*                                                                                                                                                      *
+*                                      Object Identification/Description Routines                              *
+*                                                                                                                                                      *
+****************************************************************************/
+
+/* Return descriptive strings for universal tags */
+
+char *idstr( const int tagID )
+       {
+       switch( tagID )
+               {
+               case EOC:
+                       return( "End-of-contents octets" );
+               case BOOLEAN:
+                       return( "BOOLEAN" );
+               case INTEGER:
+                       return( "INTEGER" );
+               case BITSTRING:
+                       return( "BIT STRING" );
+               case OCTETSTRING:
+                       return( "OCTET STRING" );
+               case NULLTAG:
+                       return( "NULL" );
+               case OID:
+                       return( "OBJECT IDENTIFIER" );
+               case OBJDESCRIPTOR:
+                       return( "ObjectDescriptor" );
+               case EXTERNAL:
+                       return( "EXTERNAL" );
+               case REAL:
+                       return( "REAL" );
+               case ENUMERATED:
+                       return( "ENUMERATED" );
+               case EMBEDDED_PDV:
+                       return( "EMBEDDED PDV" );
+               case UTF8STRING:
+                       return( "UTF8String" );
+               case SEQUENCE:
+                       return( "SEQUENCE" );
+               case SET:
+                       return( "SET" );
+               case NUMERICSTRING:
+                       return( "NumericString" );
+               case PRINTABLESTRING:
+                       return( "PrintableString" );
+               case T61STRING:
+                       return( "TeletexString" );
+               case VIDEOTEXSTRING:
+                       return( "VideotexString" );
+               case IA5STRING:
+                       return( "IA5String" );
+               case UTCTIME:
+                       return( "UTCTime" );
+               case GENERALIZEDTIME:
+                       return( "GeneralizedTime" );
+               case GRAPHICSTRING:
+                       return( "GraphicString" );
+               case VISIBLESTRING:
+                       return( "VisibleString" );
+               case GENERALSTRING:
+                       return( "GeneralString" );
+               case UNIVERSALSTRING:
+                       return( "UniversalString" );
+               case BMPSTRING:
+                       return( "BMPString" );
+               default:
+                       return( "Unknown (Reserved)" );
+               }
+       }
+
+/* Return information on an object identifier */
+
+static OIDINFO *getOIDinfo( char *oid, const int oidLength )
+       {
+       OIDINFO *oidPtr;
+
+       memset( oid + oidLength, 0, 2 );
+       for( oidPtr = oidList; oidPtr != NULL; oidPtr = oidPtr->next )
+               if( oidLength == oidPtr->oidLength - 2 && \
+                       !memcmp( oidPtr->oid + 2, oid, oidLength ) )
+                       return( oidPtr );
+
+       return( NULL );
+       }
+
+/* Add an OID attribute */
+
+static int addAttribute( char **buffer, char *attribute )
+       {
+       if( ( *buffer = ( char * ) malloc( strlen( attribute ) + 1 ) ) == NULL )
+               {
+               puts( "Out of memory." );
+               return( FALSE );
+               }
+       strcpy( *buffer, attribute );
+       return( TRUE );
+       }
+
+/* Table to identify valid string chars (taken from cryptlib) */
+
+#define P      1                                               /* PrintableString */
+#define I      2                                               /* IA5String */
+#define PI     3                                               /* IA5String and PrintableString */
+
+static int charFlags[] = {
+       /* 00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F */
+               0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,
+       /* 10  11  12  13  14  15  16  17  18  19  1A  1B  1C  1D  1E  1F */
+               0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,
+       /*              !       "       #       $       %       &       '       (       )       *       +       ,       -       .       / */
+          PI,  I,      I,      I,      I,      I,      I, PI, PI, PI,  I, PI, PI, PI, PI, PI,
+       /*      0       1       2       3       4       5       6       7       8       9       :       ;       <       =       >       ? */
+          PI, PI, PI, PI, PI, PI, PI, PI, PI, PI, PI,  I,      I, PI,  I, PI,
+       /*      @       A       B       C       D       E       F       G       H       I       J       K       L       M       N       O */
+               I, PI, PI, PI, PI, PI, PI, PI, PI, PI, PI, PI, PI, PI, PI, PI,
+       /*      P       Q       R       S       T       U       V       W       X       Y       Z       [       \       ]       ^ _ */
+          PI, PI, PI, PI, PI, PI, PI, PI, PI, PI, PI,  I,      I,      I,      I,      I,
+       /*      `       a       b       c       d       e       f       g       h       i       j       k       l       m       n       o */
+               I, PI, PI, PI, PI, PI, PI, PI, PI, PI, PI, PI, PI, PI, PI, PI,
+       /*      p       q       r       s       t       u       v       w       x       y       z       {       |       }       ~  DL */
+          PI, PI, PI, PI, PI, PI, PI, PI, PI, PI, PI,  I,      I,      I,      I,      0
+       };
+
+static int isPrintable( int ch )
+       {
+       if( ch >= 128 || !( charFlags[ ch ] & P ) )
+               return( FALSE );
+       return( TRUE );
+       }
+
+static int isIA5( int ch )
+       {
+       if( ch >= 128 || !( charFlags[ ch ] & I ) )
+               return( FALSE );
+       return( TRUE );
+       }
+
+/****************************************************************************
+*                                                                                                                                                      *
+*                                                      Config File Read Routines                                               *
+*                                                                                                                                                      *
+****************************************************************************/
+
+/* Files coming from DOS/Windows systems may have a ^Z (the CP/M EOF char)
+   at the end, so we need to filter this out */
+
+#define CPM_EOF        0x1A            /* ^Z = CPM EOF char */
+
+/* The maximum input line length */
+
+#define MAX_LINESIZE   512
+
+/* Read a line of text from the config file */
+
+static int lineNo;
+
+static int readLine( FILE *file, char *buffer )
+       {
+       int bufCount = 0, ch;
+
+       /* Skip whitespace */
+       while( ( ( ch = getc( file ) ) == ' ' || ch == '\t' ) && !feof( file ) );
+
+       /* Get a line into the buffer */
+       while( ch != '\r' && ch != '\n' && ch != CPM_EOF && !feof( file ) )
+               {
+               /* Check for an illegal char in the data.  Note that we don't just
+                  check for chars with high bits set because these are legal in
+                  non-ASCII strings */
+               if( ( ch & 0x7F ) < ' ' )
+                       {
+                       printf( "Bad character '%c' in config file line %d.\n",
+                                       ch, lineNo );
+                       return( FALSE );
+                       }
+
+               /* Check to see if it's a comment line */
+               if( ch == '#' && !bufCount )
+                       {
+                       /* Skip comment section and trailing whitespace */
+                       while( ch != '\r' && ch != '\n' && ch != CPM_EOF && !feof( file ) )
+                               ch = getc( file );
+                       break;
+                       }
+
+               /* Make sure the line is of the correct length */
+               if( bufCount > MAX_LINESIZE )
+                       {
+                       printf( "Config file line %d too long.\n", lineNo );
+                       return( FALSE );
+                       }
+               else
+                       if( ch )        /* Can happen if we read a binary file */
+                               buffer[ bufCount++ ] = ch;
+
+               /* Get next character */
+               ch = getc( file );
+               }
+
+       /* If we've just passed a CR, check for a following LF */
+       if( ch == '\r' )
+               if( ( ch = getc( file ) ) != '\n' )
+                       ungetc( ch, file );
+
+       /* Skip trailing whitespace and add der terminador */
+       while( bufCount > 0 &&
+                  ( ( ch = buffer[ bufCount - 1 ] ) == ' ' || ch == '\t' ) )
+               bufCount--;
+       buffer[ bufCount ] = '\0';
+
+       /* Handle special-case of ^Z if file came off an MSDOS system */
+       if( ch == CPM_EOF )
+               while( !feof( file ) )
+                       /* Keep going until we hit the true EOF (or some sort of error) */
+                       ch = getc( file );
+
+       return( ferror( file ) ? FALSE : TRUE );
+       }
+
+/* Process an OID specified as space-separated hex digits */
+
+static int processHexOID( OIDINFO *oidInfo, char *string )
+       {
+       int value, index = 0;
+
+       while( *string && index < MAX_OID_SIZE - 1 )
+               {
+               if( sscanf( string, "%x", &value ) != 1 || value > 255 )
+                       {
+                       printf( "Invalid hex value in config file line %d.\n", lineNo );
+                       return( FALSE );
+                       }
+               oidInfo->oid[ index++ ] = value;
+               string += 2;
+               if( *string && *string++ != ' ' )
+                       {
+                       printf( "Invalid hex string in config file line %d.\n", lineNo );
+                       return( FALSE );
+                       }
+               }
+       oidInfo->oid[ index ] = 0;
+       oidInfo->oidLength = index;
+       if( index >= MAX_OID_SIZE - 1 )
+               {
+               printf( "OID value in config file line %d too long.\n", lineNo );
+               return( FALSE );
+               }
+       return( TRUE );
+       }
+
+/* Read a config file */
+
+static int readConfig( const char *path, const int isDefaultConfig )
+       {
+       OIDINFO dummyOID = { NULL, "Dummy", "Dummy", "Dummy", 1 }, *oidPtr;
+       FILE *file;
+       char buffer[ MAX_LINESIZE ];
+       int status;
+
+       /* Try and open the config file */
+       if( ( file = fopen( path, "rb" ) ) == NULL )
+               {
+               /* If we can't open the default config file, issue a warning but
+                  continue anyway */
+               if( isDefaultConfig )
+                       {
+                       puts( "Cannot open config file 'dumpasn1.cfg', which should be in the same" );
+                       puts( "directory as the dumpasn1 program.  Operation will continue without" );
+                       puts( "the ability to display Object Identifier information." );
+                       puts( "" );
+                       puts( "If the config file is located elsewhere, you can set the environment" );
+                       puts( "variable DUMPASN1_CFG to the path to the file." );
+                       return( TRUE );
+                       }
+
+               printf( "Cannot open config file '%s'.\n", path );
+               return( FALSE );
+               }
+
+       /* Add the new config entries at the appropriate point in the OID list */
+       if( oidList == NULL )
+               oidPtr = &dummyOID;
+       else
+               for( oidPtr = oidList; oidPtr->next != NULL; oidPtr = oidPtr->next );
+
+       /* Read each line in the config file */
+       lineNo = 1;
+       while( ( status = readLine( file, buffer ) ) == TRUE && !feof( file ) )
+               {
+               /* If it's a comment line, skip it */
+               if( !*buffer )
+                       {
+                       lineNo++;
+                       continue;
+                       }
+
+               /* Check for an attribute tag */
+               if( !strncmp( buffer, "OID = ", 6 ) )
+                       {
+                       /* Make sure all the required attributes for the current OID are
+                          present */
+                       if( oidPtr->description == NULL )
+                               {
+                               printf( "OID ending on config file line %d has no "
+                                               "description attribute.\n", lineNo - 1 );
+                               return( FALSE );
+                               }
+
+                       /* Allocate storage for the new OID */
+                       if( ( oidPtr->next = ( struct tagOIDINFO * ) \
+                                                                malloc( sizeof( OIDINFO ) ) ) == NULL )
+                               {
+                               puts( "Out of memory." );
+                               return( FALSE );
+                               }
+                       oidPtr = oidPtr->next;
+                       if( oidList == NULL )
+                               oidList = oidPtr;
+                       memset( oidPtr, 0, sizeof( OIDINFO ) );
+
+                       /* Add the new OID */
+                       if( !processHexOID( oidPtr, buffer + 6 ) )
+                               return( FALSE );
+                       }
+               else if( !strncmp( buffer, "Description = ", 14 ) )
+                       {
+                       if( oidPtr->description != NULL )
+                               {
+                               printf( "Duplicate OID description in config file line %d.\n",
+                                               lineNo );
+                               return( FALSE );
+                               }
+                       if( !addAttribute( &oidPtr->description, buffer + 14 ) )
+                               return( FALSE );
+                       }
+               else if( !strncmp( buffer, "Comment = ", 10 ) )
+                       {
+                       if( oidPtr->comment != NULL )
+                               {
+                               printf( "Duplicate OID comment in config file line %d.\n",
+                                               lineNo );
+                               return( FALSE );
+                               }
+                       if( !addAttribute( &oidPtr->comment, buffer + 10 ) )
+                               return( FALSE );
+                       }
+               else if( !strncmp( buffer, "Warning", 7 ) )
+                       {
+                       if( oidPtr->warn )
+                               {
+                               printf( "Duplicate OID warning in config file line %d.\n",
+                                               lineNo );
+                               return( FALSE );
+                               }
+                       oidPtr->warn = TRUE;
+                       }
+               else
+                       {
+                       printf( "Unrecognised attribute '%s', line %d.\n", buffer,
+                                       lineNo );
+                       return( FALSE );
+                       }
+
+               lineNo++;
+               }
+       fclose( file );
+
+       return( status );
+       }
+
+/* Check for the existence of a config file path */
+
+static int testConfigPath( const char *path )
+       {
+       FILE *file;
+
+       /* Try and open the config file */
+       if( ( file = fopen( path, "rb" ) ) == NULL )
+               return( FALSE );
+       fclose( file );
+
+       return( TRUE );
+       }
+
+/* Build a config path by substituting environment strings for $NAMEs */
+
+static void buildConfigPath( char *path, const char *pathTemplate )
+       {
+       char pathBuffer[ FILENAME_MAX ], newPath[ FILENAME_MAX ];
+       int pathLen, pathPos = 0, newPathPos = 0;
+
+       /* Add the config file name at the end */
+       strcpy( pathBuffer, pathTemplate );
+       strcat( pathBuffer, CONFIG_NAME );
+       pathLen = strlen( pathBuffer );
+
+       while( pathPos < pathLen )
+               {
+               char *strPtr;
+               int substringSize;
+
+               /* Find the next $ and copy the data before it to the new path */
+               if( ( strPtr = strstr( pathBuffer + pathPos, "$" ) ) != NULL )
+                       substringSize = ( int ) ( ( strPtr - pathBuffer ) - pathPos );
+               else
+                       substringSize = pathLen - pathPos;
+               if( substringSize > 0 )
+                       memcpy( newPath + newPathPos, pathBuffer + pathPos,
+                                       substringSize );
+               newPathPos += substringSize;
+               pathPos += substringSize;
+
+               /* Get the environment string for the $NAME */
+               if( strPtr != NULL )
+                       {
+                       char envName[ MAX_LINESIZE ], *envString;
+                       int i;
+
+                       /* Skip the '$', find the end of the $NAME, and copy the name
+                          into an internal buffer */
+                       pathPos++;      /* Skip the $ */
+                       for( i = 0; !isEnvTerminator( pathBuffer[ pathPos + i ] ); i++ );
+                       memcpy( envName, pathBuffer + pathPos, i );
+                       envName[ i ] = '\0';
+
+                       /* Get the env.string and copy it over */
+                       if( ( envString = getenv( envName ) ) != NULL )
+                               {
+                               const int envStrLen = strlen( envString );
+
+                               if( newPathPos + envStrLen < FILENAME_MAX - 2 )
+                                       {
+                                       memcpy( newPath + newPathPos, envString, envStrLen );
+                                       newPathPos += envStrLen;
+                                       }
+                               }
+                       pathPos += i;
+                       }
+               }
+       newPath[ newPathPos ] = '\0';   /* Add der terminador */
+
+       /* Copy the new path to the output */
+       strcpy( path, newPath );
+       }
+
+/* Read the global config file */
+
+static int readGlobalConfig( const char *path )
+       {
+       char buffer[ FILENAME_MAX ], *namePos;
+       int i;
+
+       /* First, try and find the config file in the same directory as the
+          executable.  This requires that argv[0] be set up properly, which
+          isn't the case if Unix search paths are being used, and seems to be
+          pretty broken under Windows */
+       namePos = strstr( path, "dumpasn1" );
+       if( namePos == NULL )
+               namePos = strstr( path, "DUMPASN1" );
+       if( strlen( path ) < FILENAME_MAX - 13 && namePos != NULL )
+               {
+               strcpy( buffer, path );
+               strcpy( buffer + ( int ) ( namePos - ( char * ) path ), CONFIG_NAME );
+               if( testConfigPath( buffer ) )
+                       return( readConfig( buffer, TRUE ) );
+               }
+
+       /* Now try each of the possible absolute locations for the config file */
+       for( i = 0; configPaths[ i ] != NULL; i++ )
+               {
+               buildConfigPath( buffer, configPaths[ i ] );
+               if( testConfigPath( buffer ) )
+                       return( readConfig( buffer, TRUE ) );
+               }
+
+       /* Default out to just the config name (which should fail as it was the
+          first entry in configPaths[]).  readConfig() will display the
+          appropriate warning */
+       return( readConfig( CONFIG_NAME, TRUE ) );
+       }
+
+/****************************************************************************
+*                                                                                                                                                      *
+*                                                      Output/Formatting Routines                                              *
+*                                                                                                                                                      *
+****************************************************************************/
+
+/* Indent a string by the appropriate amount */
+
+static void doIndent( const int level )
+       {
+       int i;
+
+       for( i = 0; i < level; i++ )
+               fprintf( output, ( printDots ) ? ". " : "  " );
+       }
+
+/* Complain about an error in the ASN.1 object */
+
+static void complain( const char *message, const int level )
+       {
+       if( !doPure )
+               fprintf( output, "            : " );
+       doIndent( level + 1 );
+       fprintf( output, "Error: %s.\n", message );
+       noErrors++;
+       }
+
+/* Dump data as a string of hex digits up to a maximum of 128 bytes */
+
+static void dumpHex( FILE *inFile, long length, int level, int isInteger )
+       {
+       const int lineLength = ( dumpText ) ? 8 : 16;
+       char printable[ 9 ];
+       long noBytes = length;
+       int zeroPadded = FALSE, warnPadding = FALSE, warnNegative = isInteger;
+       int maxLevel = ( doPure ) ? 15 : 8, i;
+
+       if( noBytes > 128 && !printAllData )
+               noBytes = 128;  /* Only output a maximum of 128 bytes */
+       if( level > maxLevel )
+               level = maxLevel;       /* Make sure we don't go off edge of screen */
+       printable[ 8 ] = printable[ 0 ] = '\0';
+       for( i = 0; i < noBytes; i++ )
+               {
+               int ch;
+
+               if( !( i % lineLength ) )
+                       {
+                       if( dumpText )
+                               {
+                               /* If we're dumping text alongside the hex data, print the
+                                  accumulated text string */
+                               fputs( "    ", output );
+                               fputs( printable, output );
+                               }
+                       fputc( '\n', output );
+                       if( !doPure )
+                               fprintf( output, "            : " );
+                       doIndent( level + 1 );
+                       }
+               ch = getc( inFile );
+               fprintf( output, "%s%02X", i % lineLength ? " " : "", ch );
+               printable[ i % 8 ] = ( ch >= ' ' && ch < 127 ) ? ch : '.';
+               fPos++;
+
+               /* If we need to check for negative values and zero padding, check
+                  this now */
+               if( !i )
+                       {
+                       if( !ch )
+                               zeroPadded = TRUE;
+                       if( !( ch & 0x80 ) )
+                               warnNegative = FALSE;
+                       }
+               if( i == 1 && zeroPadded && ch < 0x80 )
+                       warnPadding = TRUE;
+               }
+       if( dumpText )
+               {
+               /* Print any remaining text */
+               i %= lineLength;
+               printable[ i ] = '\0';
+               while( i < lineLength )
+                       {
+                       fprintf( output, "   " );
+                       i++;
+                       }
+               fputs( "    ", output );
+               fputs( printable, output );
+               }
+       if( length > 128 && !printAllData )
+               {
+               length -= 128;
+               fputc( '\n', output );
+               if( !doPure )
+                       fprintf( output, "            : " );
+               doIndent( level + 5 );
+               fprintf( output, "[ Another %ld bytes skipped ]", length );
+               if( useStdin )
+                       {
+                       while( length-- )
+                               getc( inFile );
+                       }
+               else
+                       fseek( inFile, length, SEEK_CUR );
+               fPos += length;
+               }
+       fputs( "\n", output );
+
+       if( isInteger )
+               {
+               if( warnPadding )
+                       complain( "Integer has non-DER encoding", level );
+               if( warnNegative )
+                       complain( "Integer has a negative value", level );
+               }
+       }
+
+/* Dump a bitstring, reversing the bits into the standard order in the
+   process */
+
+static void dumpBitString( FILE *inFile, const int length, const int unused,
+                                                  const int level )
+       {
+       unsigned int bitString = 0, currentBitMask = 0x80, remainderMask = 0xFF;
+       int bitFlag, value = 0, noBits, bitNo = -1, i;
+       char *errorStr = NULL;
+
+       if( unused < 0 || unused > 7 )
+               complain( "Invalid number of unused bits", level );
+       noBits = ( length * 8 ) - unused;
+
+       /* ASN.1 bitstrings start at bit 0, so we need to reverse the order of
+          the bits */
+       if( length )
+               {
+               bitString = fgetc( inFile );
+               fPos++;
+               }
+       for( i = noBits - 8; i > 0; i -= 8 )
+               {
+               bitString = ( bitString << 8 ) | fgetc( inFile );
+               currentBitMask <<= 8;
+               remainderMask = ( remainderMask << 8 ) | 0xFF;
+               fPos++;
+               }
+       for( i = 0, bitFlag = 1; i < noBits; i++ )
+               {
+               if( bitString & currentBitMask )
+                       value |= bitFlag;
+               if( !( bitString & remainderMask ) )
+                       /* The last valid bit should be a one bit */
+                       errorStr = "Spurious zero bits in bitstring";
+               bitFlag <<= 1;
+               bitString <<= 1;
+               }
+       if( ( remainderMask << noBits ) & value )
+               /* There shouldn't be any bits set after the last valid one */
+               errorStr = "Spurious one bits in bitstring";
+
+       /* Now that it's in the right order, dump it.  If there's only one
+          bit set (which is often the case for bit flags) we also print the
+          bit number to save users having to count the zeroes to figure out
+          which flag is set */
+       fputc( '\n', output );
+       if( !doPure )
+               fprintf( output, "            : " );
+       doIndent( level + 1 );
+       fputc( '\'', output );
+       currentBitMask = 1 << ( noBits - 1 );
+       for( i = 0; i < noBits; i++ )
+               {
+               if( value & currentBitMask )
+                       {
+                       bitNo = ( bitNo == -1 ) ? ( noBits - 1 ) - i : -2;
+                       fputc( '1', output );
+                       }
+               else
+                       fputc( '0', output );
+               currentBitMask >>= 1;
+               }
+       if( bitNo >= 0 )
+               fprintf( output, "'B (bit %d)\n", bitNo );
+       else
+               fputs( "'B\n", output );
+
+       if( errorStr != NULL )
+               complain( errorStr, level );
+       }
+
+/* Display data as a text string up to a maximum of 240 characters (8 lines
+   of 48 chars to match the hex limit of 8 lines of 16 bytes) with special
+   treatement for control characters and other odd things which can turn up
+   in BMPString and UniversalString types.
+
+   If the string is less than 40 chars in length, we try to print it on the
+   same line as the rest of the text (even if it wraps), otherwise we break
+   it up into 48-char chunks in a somewhat less nice text-dump format */
+
+static void displayString( FILE *inFile, long length, int level,
+                                                  STR_OPTION strOption )
+       {
+       long noBytes = ( length > 384 ) ? 384 : length;
+       int lineLength = 48;
+       int maxLevel = ( doPure ) ? 15 : 8, firstTime = TRUE, i;
+       int warnIA5 = FALSE, warnPrintable = FALSE, warnUTC = FALSE;
+       int warnBMP = FALSE;
+
+       if( strOption == STR_UTCTIME && length != 13 )
+               warnUTC = TRUE;
+       if( length <= 40 )
+               fprintf( output, " '" );                /* Print string on same line */
+       if( level > maxLevel )
+               level = maxLevel;       /* Make sure we don't go off edge of screen */
+       for( i = 0; i < noBytes; i++ )
+               {
+               int ch;
+
+               /* If the string is longer than 40 chars, break it up into multiple
+                  sections */
+               if( length > 40 && !( i % lineLength ) )
+                       {
+                       if( !firstTime )
+                               fputc( '\'', output );
+                       fputc( '\n', output );
+                       if( !doPure )
+                               fprintf( output, "            : " );
+                       doIndent( level + 1 );
+                       fputc( '\'', output );
+                       firstTime = FALSE;
+                       }
+               ch = getc( inFile );
+#ifdef __WIN32__
+               if( strOption == STR_BMP )
+                       {
+                       if( i == noBytes - 1 && ( noBytes & 1 ) )
+                               /* Odd-length BMP string, complain */
+                               warnBMP = TRUE;
+                       else
+                               {
+                               wchar_t wCh = ( ch << 8 ) | getc( inFile );
+                               unsigned char outBuf[ 8 ];
+                               int outLen;
+
+                               /* Attempting to display Unicode characters is pretty hit and
+                                  miss, and if it fails nothing is displayed.  To try and
+                                  detect this we use wcstombs() to see if anything can be
+                                  displayed, if it can't we drop back to trying to display
+                                  the data as non-Unicode */
+                               outLen = wcstombs( outBuf, &wCh, 1 );
+                               if( outLen < 1 )
+                                       {
+                                       /* Can't be displayed as Unicode, fall back to
+                                          displaying it as normal text */
+                                       ungetc( wCh & 0xFF, inFile );
+                                       }
+                               else
+                                       {
+                                       lineLength++;
+                                       i++;    /* We've read two characters for a wchar_t */
+                                       wprintf( L"%c", wCh );
+                                       fPos += 2;
+                                       continue;
+                                       }
+                               }
+                       }
+#endif /* __WIN32__ */
+               if( strOption == STR_PRINTABLE || strOption == STR_IA5 )
+                       {
+                       if( strOption == STR_PRINTABLE && !isPrintable( ch ) )
+                               warnPrintable = TRUE;
+                       if( strOption == STR_IA5 && !isIA5( ch ) )
+                               warnIA5 = TRUE;
+                       if( ch < ' ' || ch >= 0x7F )
+                               ch = '.';               /* Convert non-ASCII to placeholders */
+                       }
+               else
+                       if( strOption == STR_UTCTIME )
+                               {
+                               if( !isdigit( ch ) && ch != 'Z' )
+                                       {
+                                       warnUTC = TRUE;
+                                       ch = '.';       /* Convert non-numeric to placeholders */
+                                       }
+                               }
+                       else
+                               if( ( ch & 0x7F ) < ' ' || ch == 0xFF )
+                                       ch = '.';       /* Convert control chars to placeholders */
+               fputc( ch, output );
+               fPos++;
+               }
+       if( length > 384 )
+               {
+               length -= 384;
+               fprintf( output, "'\n" );
+               if( !doPure )
+                       fprintf( output, "            : " );
+               doIndent( level + 5 );
+               fprintf( output, "[ Another %ld characters skipped ]", length );
+               fPos += length;
+               while( length-- )
+                       {
+                       int ch = getc( inFile );
+
+                       if( strOption == STR_PRINTABLE && !isPrintable( ch ) )
+                               warnPrintable = TRUE;
+                       if( strOption == STR_IA5 && !isIA5( ch ) )
+                               warnIA5 = TRUE;
+                       }
+               }
+       else
+               fputc( '\'', output );
+       fputc( '\n', output );
+
+       /* Display any problems we encountered */
+       if( warnPrintable )
+               complain( "PrintableString contains illegal character(s)", level );
+       if( warnIA5 )
+               complain( "IA5String contains illegal character(s)", level );
+       if( warnUTC )
+               complain( "UTCTime is encoded incorrectly", level );
+       if( warnBMP )
+               complain( "BMPString has missing final byte/half character", level );
+       }
+
+/****************************************************************************
+*                                                                                                                                                      *
+*                                                              ASN.1 Parsing Routines                                          *
+*                                                                                                                                                      *
+****************************************************************************/
+
+/* Get an integer value */
+
+static long getValue( FILE *inFile, const long length )
+       {
+       long value;
+       char ch;
+       int i;
+
+       ch = getc( inFile );
+       value = ch;
+       for( i = 0; i < length - 1; i++ )
+               value = ( value << 8 ) | getc( inFile );
+       fPos += length;
+
+       return( value );
+       }
+
+/* Get an ASN.1 objects tag and length */
+
+int getItem( FILE *inFile, ASN1_ITEM *item )
+       {
+       int tag, length, index = 0;
+
+       memset( item, 0, sizeof( ASN1_ITEM ) );
+       item->indefinite = FALSE;
+       tag = item->header[ index++ ] = fgetc( inFile );
+       item->id = tag & ~TAG_MASK;
+       tag &= TAG_MASK;
+       if( tag == TAG_MASK )
+               {
+               int value;
+
+               /* Long tag encoded as sequence of 7-bit values.  This doesn't try to
+                  handle tags > INT_MAX, it'd be pretty peculiar ASN.1 if it had to
+                  use tags this large */
+               tag = 0;
+               do
+                       {
+                       value = fgetc( inFile );
+                       tag = ( tag << 7 ) | ( value & 0x7F );
+                       item->header[ index++ ] = value;
+                       fPos++;
+                       }
+               while( value & LEN_XTND && !feof( inFile ) );
+               }
+       item->tag = tag;
+       if( feof( inFile ) )
+               {
+               fPos++;
+               return( FALSE );
+               }
+       fPos += 2;                      /* Tag + length */
+       length = item->header[ index++ ] = fgetc( inFile );
+       item->headerSize = index;
+       if( length & LEN_XTND )
+               {
+               int i;
+
+               length &= LEN_MASK;
+               if( length > 4 )
+                       /* Impossible length value, probably because we've run into
+                          the weeds */
+                       return( -1 );
+               item->headerSize += length;
+               item->length = 0;
+               if( !length )
+                       item->indefinite = TRUE;
+               for( i = 0; i < length; i++ )
+                       {
+                       int ch = fgetc( inFile );
+
+                       item->length = ( item->length << 8 ) | ch;
+                       item->header[ i + index ] = ch;
+                       }
+               fPos += length;
+               }
+       else
+               item->length = length;
+
+       return( TRUE );
+       }
+
+/* Check whether a BIT STRING or OCTET STRING encapsulates another object */
+
+static int checkEncapsulate( FILE *inFile, const int tag, const int length )
+       {
+       ASN1_ITEM nestedItem;
+       const int currentPos = fPos;
+       int diffPos;
+
+       /* If we're not looking for encapsulated objects, return */
+       if( !checkEncaps )
+               return( FALSE );
+
+#if 1
+       /* Read the details of the next item in the input stream */
+       getItem( inFile, &nestedItem );
+       diffPos = fPos - currentPos;
+       fPos = currentPos;
+       fseek( inFile, -diffPos, SEEK_CUR );
+
+       /* If it fits exactly within the current item and has a valid-looking
+          tag, treat it as nested data */
+       if( ( ( nestedItem.id & CLASS_MASK ) == UNIVERSAL || \
+                 ( nestedItem.id & CLASS_MASK ) == CONTEXT ) && \
+               ( nestedItem.tag > 0 && nestedItem.tag <= 0x31 ) && \
+               nestedItem.length == length - diffPos )
+               return( TRUE );
+#else
+       /* Older code which used heuristics but was actually less accurate than
+          the above code */
+       int ch;
+
+       /* Get the first character and see if it's an INTEGER or SEQUENCE */
+       ch = getc( inFile );
+       ungetc( ch, inFile );
+       if( ch == INTEGER || ch == ( SEQUENCE | CONSTRUCTED ) )
+               return( TRUE );
+
+       /* All sorts of weird things get bundled up in octet strings in
+          certificate extensions */
+       if( tag == OCTETSTRING && ch == BITSTRING )
+               return( TRUE );
+
+       /* If we're looking for all sorts of things which might be encapsulated,
+          check for these as well.  At the moment we only check for a small
+          number of possibilities, this list will probably change as more
+          oddities are discovered, the idea is to keep the amount of burrowing
+          we do to a minimum in order to reduce problems with false positives */
+       if( level > 1 && tag == OCTETSTRING )
+               {
+               int length;
+
+               if( ch == IA5STRING )
+                       /* Verisign extensions */
+                       return( TRUE );
+
+               /* For the following possibilities we have to look ahead a bit
+                  further and check the length as well */
+               getc( inFile );
+               length = getc( inFile );
+               fseek( inFile, -2, SEEK_CUR );
+               if( ( ch == OID && length < 9 ) || \
+                       ( ch == ENUMERATED && length == 1 ) || \
+                       ( ch == GENERALIZEDTIME && length == 15 ) )
+                       /* CRL per-entry extensions */
+                       return( TRUE );
+               }
+#endif /* 0 */
+
+       return( FALSE );
+       }
+
+/* Check whether a zero-length item is OK */
+
+int zeroLengthOK( const ASN1_ITEM *item )
+       {
+       /* If we can't recognise the type from the tag, reject it */
+       if( ( item->id & CLASS_MASK ) != UNIVERSAL )
+               return( FALSE );
+
+       /* The following types are zero-length by definition */
+       if( item->tag == EOC || item->tag == NULLTAG )
+               return( TRUE );
+
+       /* A real with a value of zero has zero length */
+       if( item->tag == REAL )
+               return( TRUE );
+
+       /* Everything after this point requires input from the user to say that
+          zero-length data is OK (usually it's not, so we flag it as a
+          problem) */
+       if( !zeroLengthAllowed )
+               return( FALSE );
+
+       /* String types can have zero length except for the Unrestricted
+          Character String type ([UNIVERSAL 29]) which has to have at least one
+          octet for the CH-A/CH-B index */
+       if( item->tag == OCTETSTRING || item->tag == NUMERICSTRING || \
+               item->tag == PRINTABLESTRING || item->tag == T61STRING || \
+               item->tag == VIDEOTEXSTRING || item->tag == VISIBLESTRING || \
+               item->tag == IA5STRING || item->tag == GRAPHICSTRING || \
+               item->tag == GENERALSTRING || item->tag == UNIVERSALSTRING || \
+               item->tag == BMPSTRING || item->tag == UTF8STRING || \
+               item->tag == OBJDESCRIPTOR )
+               return( TRUE );
+
+       /* SEQUENCE and SET can be zero if there are absent optional/default
+          components */
+       if( item->tag == SEQUENCE || item->tag == SET )
+               return( TRUE );
+
+       return( FALSE );
+       }
+
+/* Check whether the next item looks like text */
+
+static int looksLikeText( FILE *inFile, const int length )
+       {
+       char buffer[ 16 ];
+       int sampleLength = min( length, 16 ), i;
+
+       /* If the sample size is too small, don't try anything */
+       if( sampleLength < 4 )
+               return( FALSE );
+
+       /* Check for ASCII-looking text */
+       sampleLength = fread( buffer, 1, sampleLength, inFile );
+       fseek( inFile, -sampleLength, SEEK_CUR );
+       for( i = 0; i < sampleLength; i++ )
+               {
+               if( !( i & 1 ) && !buffer[ i ] )
+                       /* If even bytes are zero, it could be a BMPString */
+                       continue;
+               if( buffer[ i ] < 0x20 || buffer[ i ] > 0x7E )
+                       return( FALSE );
+               }
+
+       /* It looks like a text string */
+       return( TRUE);
+       }
+
+/* Dump the header bytes for an object, useful for vgrepping the original
+   object from a hex dump */
+
+static void dumpHeader( FILE *inFile, const ASN1_ITEM *item )
+       {
+       int extraLen = 24 - item->headerSize, i;
+
+       /* Dump the tag and length bytes */
+       if( !doPure )
+               fprintf( output, "    " );
+       fprintf( output, "<%02X", *item->header );
+       for( i = 1; i < item->headerSize; i++ )
+               fprintf( output, " %02X", item->header[ i ] );
+
+       /* If we're asked for more, dump enough extra data to make up 24 bytes.
+          This is somewhat ugly since it assumes we can seek backwards over the
+          data, which means it won't always work on streams */
+       if( extraLen > 0 && doDumpHeader > 1 )
+               {
+               /* Make sure we don't print too much data.  This doesn't work for
+                  indefinite-length data, we don't try and guess the length with
+                  this since it involves picking apart what we're printing */
+               if( extraLen > item->length && !item->indefinite )
+                       extraLen = ( int ) item->length;
+
+               for( i = 0; i < extraLen; i++ )
+                       {
+                       int ch = fgetc( inFile );
+
+                       if( feof( inFile ) )
+                               extraLen = i;   /* Exit loop and get fseek() correct */
+                       else
+                               fprintf( output, " %02X", ch );
+                       }
+               fseek( inFile, -extraLen, SEEK_CUR );
+               }
+
+       fputs( ">\n", output );
+       }
+
+/* Print a constructed ASN.1 object */
+
+int printAsn1( FILE *inFile, const int level, long length, const int isIndefinite );
+
+static void printConstructed( FILE *inFile, int level, const ASN1_ITEM *item )
+       {
+       int result;
+
+       /* Special case for zero-length objects */
+       if( !item->length && !item->indefinite )
+               {
+               fputs( " {}\n", output );
+               return;
+               }
+
+       fputs( " {\n", output );
+       result = printAsn1( inFile, level + 1, item->length, item->indefinite );
+       if( result )
+               {
+               fprintf( output, "Error: Inconsistent object length, %d byte%s "
+                                "difference.\n", result, ( result > 1 ) ? "s" : "" );
+               noErrors++;
+               }
+       if( !doPure )
+               fprintf( output, "            : " );
+       fprintf( output, ( printDots ) ? ". " : "  " );
+       doIndent( level );
+       fputs( "}\n", output );
+       }
+
+/* Print a single ASN.1 object */
+
+void printASN1object( FILE *inFile, ASN1_ITEM *item, int level )
+       {
+       OIDINFO *oidInfo;
+       char buffer[ MAX_OID_SIZE ];
+       long value;
+       int x, y;
+
+       if( ( item->id & CLASS_MASK ) != UNIVERSAL )
+               {
+               static const char *const classtext[] =
+                       { "UNIVERSAL ", "APPLICATION ", "", "PRIVATE " };
+
+               /* Print the object type */
+               fprintf( output, "[%s%d]",
+                                classtext[ ( item->id & CLASS_MASK ) >> 6 ], item->tag );
+
+               /* Perform a sanity check */
+               if( ( item->tag != NULLTAG ) && ( item->length < 0 ) )
+                       {
+                       int i;
+
+                       fprintf( stderr, "\nError: Object has bad length field, tag = %02X, "
+                                        "length = %lX, value =", item->tag, item->length );
+                       fprintf( stderr, "<%02X", *item->header );
+                       for( i = 1; i < item->headerSize; i++ )
+                               fprintf( stderr, " %02X", item->header[ i ] );
+                       fputs( ">.\n", stderr );
+                       exit( EXIT_FAILURE );
+                       }
+
+               if( !item->length && !item->indefinite )
+                       {
+                       fputc( '\n', output );
+                       complain( "Object has zero length", level );
+                       return;
+                       }
+
+               /* If it's constructed, print the various fields in it */
+               if( ( item->id & FORM_MASK ) == CONSTRUCTED )
+                       {
+                       printConstructed( inFile, level, item );
+                       return;
+                       }
+
+               /* It's primitive, if it's a seekable stream try and determine
+                  whether it's text so we can display it as such */
+               if( !useStdin && looksLikeText( inFile, item->length ) )
+                       {
+                       /* It looks like a text string, dump it as text */
+                       displayString( inFile, item->length, level, STR_NONE );
+                       return;
+                       }
+
+               /* This could be anything, dump it as hex data */
+               dumpHex( inFile, item->length, level, FALSE );
+
+               return;
+               }
+
+       /* Print the object type */
+       fprintf( output, "%s", idstr( item->tag ) );
+
+       /* Perform a sanity check */
+       if( ( item->tag != NULLTAG ) && ( item->length < 0 ) )
+               {
+               int i;
+
+               fprintf( stderr, "\nError: Object has bad length field, tag = %02X, "
+                                "length = %lX, value =", item->tag, item->length );
+               fprintf( stderr, "<%02X", *item->header );
+               for( i = 1; i < item->headerSize; i++ )
+                       fprintf( stderr, " %02X", item->header[ i ] );
+               fputs( ">.\n", stderr );
+               exit( EXIT_FAILURE );
+               }
+
+       /* If it's constructed, print the various fields in it */
+       if( ( item->id & FORM_MASK ) == CONSTRUCTED )
+               {
+               printConstructed( inFile, level, item );
+               return;
+               }
+
+       /* It's primitive */
+       if( !item->length && !zeroLengthOK( item ) )
+               {
+               fputc( '\n', output );
+               complain( "Object has zero length", level );
+               return;
+               }
+       switch( item->tag )
+               {
+               case BOOLEAN:
+                       x = getc( inFile );
+                       fprintf( output, " %s\n", x ? "TRUE" : "FALSE" );
+                       if( x != 0 && x != 0xFF )
+                               complain( "BOOLEAN has non-DER encoding", level );
+                       fPos++;
+                       break;
+
+               case INTEGER:
+               case ENUMERATED:
+                       if( item->length > 4 )
+                               dumpHex( inFile, item->length, level, TRUE );
+                       else
+                               {
+                               value = getValue( inFile, item->length );
+                               fprintf( output, " %ld\n", value );
+                               if( value < 0 )
+                                       complain( "Integer has a negative value", level );
+                               }
+                       break;
+
+               case BITSTRING:
+                       fprintf( output, " %d unused bits", x = getc( inFile ) );
+                       fPos++;
+                       if( !--item->length && !x )
+                               {
+                               fputc( '\n', output );
+                               complain( "Object has zero length", level );
+                               return;
+                               }
+                       if( item->length <= sizeof( int ) )
+                               {
+                               /* It's short enough to be a bit flag, dump it as a sequence
+                                  of bits */
+                               dumpBitString( inFile, ( int ) item->length, x, level );
+                               break;
+                               }
+               case OCTETSTRING:
+                       if( checkEncapsulate( inFile, item->tag, item->length ) )
+                               {
+                               /* It's something encapsulated inside the string, print it as
+                                  a constructed item */
+                               fprintf( output, ", encapsulates" );
+                               printConstructed( inFile, level + 1, item );
+                               break;
+                               }
+                       if( !useStdin && !dumpText && \
+                               looksLikeText( inFile, item->length ) )
+                               {
+                               /* If we'd be doing a straight hex dump and it looks like
+                                  encapsulated text, display it as such */
+                               displayString( inFile, item->length, level, STR_NONE );
+                               return;
+                               }
+                       dumpHex( inFile, item->length, level, FALSE );
+                       break;
+
+               case OID:
+                       /* Hierarchical Object Identifier: The first two levels are
+                          encoded into one byte, since the root level has only 3 nodes
+                          (40*x + y).  However if x = joint-iso-itu-t(2) then y may be
+                          > 39, so we have to add special-case handling for this */
+                       if( item->length > MAX_OID_SIZE )
+                               {
+                               fprintf( stderr, "\nError: Object identifier length %ld too "
+                                                "large.\n", item->length );
+                               exit( EXIT_FAILURE );
+                               }
+                       fread( buffer, 1, ( size_t ) item->length, inFile );
+                       fPos += item->length;
+                       if( ( oidInfo = getOIDinfo( buffer, ( int ) item->length ) ) != NULL )
+                               {
+                               int lhsSize = ( doPure ) ? 0 : 14;
+
+                               /* Check if LHS status info + indent + "OID " string + oid
+                                  name will wrap */
+                               if( lhsSize + ( level * 2 ) + 18 + strlen( oidInfo->description ) >= 80 )
+                                       {
+                                       fputc( '\n', output );
+                                       if( !doPure )
+                                               fprintf( output, "            : " );
+                                       doIndent( level + 1 );
+                                       }
+                               else
+                                       fputc( ' ', output );
+                               fprintf( output, "%s\n", oidInfo->description );
+
+                               /* Display extra comments about the OID if required */
+                               if( extraOIDinfo && oidInfo->comment != NULL )
+                                       {
+                                       if( !doPure )
+                                               fprintf( output, "            : " );
+                                       doIndent( level + 1 );
+                                       fprintf( output, "(%s)\n", oidInfo->comment );
+                                       }
+
+                               /* If there's a warning associated with this OID, remember
+                                  that there was a problem */
+                               if( oidInfo->warn )
+                                       noWarnings++;
+
+                               break;
+                               }
+
+                       /* Pick apart the OID */
+                       x = ( unsigned char ) buffer[ 0 ] / 40;
+                       y = ( unsigned char ) buffer[ 0 ] % 40;
+                       if( x > 2 )
+                               {
+                               /* Handle special case for large y if x = 2 */
+                               y += ( x - 2 ) * 40;
+                               x = 2;
+                               }
+                       fprintf( output, " '%d %d", x, y );
+                       value = 0;
+                       for( x = 1; x < item->length; x++ )
+                               {
+                               value = ( value << 7 ) | ( buffer[ x ] & 0x7F );
+                               if( !( buffer[ x ] & 0x80 ) )
+                                       {
+                                       fprintf( output, " %ld", value );
+                                       value = 0;
+                                       }
+                               }
+                       fprintf( output, "'\n" );
+                       break;
+
+               case EOC:
+               case NULLTAG:
+                       fputc( '\n', output );
+                       break;
+
+               case OBJDESCRIPTOR:
+               case GENERALIZEDTIME:
+               case GRAPHICSTRING:
+               case VISIBLESTRING:
+               case GENERALSTRING:
+               case UNIVERSALSTRING:
+               case NUMERICSTRING:
+               case T61STRING:
+               case VIDEOTEXSTRING:
+               case UTF8STRING:
+                       displayString( inFile, item->length, level, STR_NONE );
+                       break;
+               case PRINTABLESTRING:
+                       displayString( inFile, item->length, level, STR_PRINTABLE );
+                       break;
+               case BMPSTRING:
+                       displayString( inFile, item->length, level, STR_BMP );
+                       break;
+               case UTCTIME:
+                       displayString( inFile, item->length, level, STR_UTCTIME );
+                       break;
+               case IA5STRING:
+                       displayString( inFile, item->length, level, STR_IA5 );
+                       break;
+
+               default:
+                       fputc( '\n', output );
+                       if( !doPure )
+                               fprintf( output, "            : " );
+                       doIndent( level + 1 );
+                       fprintf( output, "Unrecognised primitive, hex value is:");
+                       dumpHex( inFile, item->length, level, FALSE );
+                       noErrors++;             /* Treat it as an error */
+               }
+       }
+
+/* Print a complex ASN.1 object */
+
+int printAsn1( FILE *inFile, const int level, long length,
+                          const int isIndefinite )
+       {
+       ASN1_ITEM item;
+       long lastPos = fPos;
+       int seenEOC = FALSE, status;
+
+       /* Special-case for zero-length objects */
+       if( !length && !isIndefinite )
+               return( 0 );
+
+       while( ( status = getItem( inFile, &item ) ) > 0 )
+               {
+               /* If the length isn't known and the item has a definite length, set
+                  the length to the items length */
+               if( length == LENGTH_MAGIC && !item.indefinite )
+                       length = item.headerSize + item.length;
+
+               /* Dump the header as hex data if requested */
+               if( doDumpHeader )
+                       dumpHeader( inFile, &item );
+
+               /* Print offset into buffer, tag, and length */
+               if( !doPure )
+                       if( item.indefinite )
+                               fprintf( output, ( doHexValues ) ? "%04lX %02X NDEF: " :
+                                                "%4ld %02X NDEF: ", lastPos, item.id | item.tag );
+                       else
+                               if( ( item.id | item.tag ) == EOC )
+                                       seenEOC = TRUE;
+                               else
+                                       fprintf( output, ( doHexValues ) ? "%04lX %02X %4lX: " :
+                                                        "%4ld %02X %4ld: ", lastPos, item.id | item.tag,
+                                                        item.length );
+
+               /* Print details on the item */
+               if( !seenEOC )
+                       {
+                       doIndent( level );
+                       printASN1object( inFile, &item, level );
+                       }
+
+               /* If it was an indefinite-length object (no length was ever set) and
+                  we've come back to the top level, exit */
+               if( length == LENGTH_MAGIC )
+                       return( 0 );
+
+               length -= fPos - lastPos;
+               lastPos = fPos;
+               if( isIndefinite )
+                       {
+                       if( seenEOC )
+                               return( 0 );
+                       }
+               else
+                       if( length <= 0 )
+                               {
+                               if( length < 0 )
+                                       return( ( int ) -length );
+                               return( 0 );
+                               }
+                       else
+                               if( length == 1 )
+                                       {
+                                       const int ch = fgetc( inFile );
+
+                                       /* No object can be one byte long, try and recover.  This
+                                          only works sometimes because it can be caused by
+                                          spurious data in an OCTET STRING hole or an incorrect
+                                          length encoding.  The following workaround tries to
+                                          recover from spurious data by skipping the byte if
+                                          it's zero or a non-basic-ASN.1 tag, but keeping it if
+                                          it could be valid ASN.1 */
+                                       if( ch && ch <= 0x31 )
+                                               ungetc( ch, inFile );
+                                       else
+                                               {
+                                               fPos++;
+                                               return( 1 );
+                                               }
+                                       }
+               }
+       if( status == -1 )
+               {
+               fprintf( stderr, "\nError: Invalid data encountered at position "
+                                "%d.\n", fPos );
+               exit( EXIT_FAILURE );
+               }
+
+       /* If we see an EOF and there's supposed to be more data present,
+          complain */
+       if( length && length != LENGTH_MAGIC )
+               {
+               fprintf( output, "Error: Inconsistent object length, %ld byte%s "
+                                "difference.\n", length, ( length > 1 ) ? "s" : "" );
+               noErrors++;
+               }
+       return( 0 );
+       }
+
+/* Show usage and exit */
+
+void usageExit( void )
+       {
+       puts( "DumpASN1 - ASN.1 object dump/syntax check program." );
+       puts( "Copyright Peter Gutmann 1997 - 2000.  Last updated 21 November 2000." );
+       puts( "" );
+       puts( "Usage: dumpasn1 [-acdefhlpsxz] <file>" );
+       puts( "       - = Take input from stdin (some options may not work properly)" );
+       puts( "       -<number> = Start <number> bytes into the file" );
+       puts( "       -- = End of arg list" );
+       puts( "       -a = Print all data in long data blocks, not just the first 128 bytes" );
+       puts( "       -c<file> = Read Object Identifier info from alternate config file" );
+       puts( "            (values will override equivalents in global config file)" );
+       puts( "       -d = Print dots to show column alignment" );
+       puts( "       -e = Don't print encapsulated data inside OCTET/BIT STRINGs" );
+       puts( "       -f<file> = Dump object at offset -<number> to file (allows data to be" );
+       puts( "            extracted from encapsulating objects)" );
+       puts( "       -h = Hex dump object header (tag+length) before the decoded output" );
+       puts( "       -hh = Same as -h but display more of the object as hex data" );
+       puts( "       -l = Long format, display extra info about Object Identifiers" );
+       puts( "       -p = Pure ASN.1 output without encoding information" );
+       puts( "       -s = Syntax check only, don't dump ASN.1 structures" );
+       puts( "       -t = Display text values next to hex dump of data" );
+       puts( "       -x = Display size and offset in hex not decimal" );
+       puts( "       -z = Allow zero-length items" );
+       puts( "" );
+       puts( "Warnings generated by deprecated OIDs require the use of '-l' to be displayed." );
+       puts( "Program return code is the number of errors found or EXIT_SUCCESS." );
+       exit( EXIT_FAILURE );
+       }
+
+int main( int argc, char *argv[] )
+       {
+       FILE *inFile, *outFile = NULL;
+       char *pathPtr = argv[ 0 ];
+       long offset = 0;
+       int moreArgs = TRUE, doCheckOnly = FALSE;
+
+       /* Skip the program name */
+       argv++; argc--;
+
+       /* Display usage if no args given */
+       if( argc < 1 )
+               usageExit();
+       output = stdout;        /* Needs to be assigned at runtime */
+
+       /* Check for arguments */
+       while( argc && *argv[ 0 ] == '-' && moreArgs )
+               {
+               char *argPtr = argv[ 0 ] + 1;
+
+               if( !*argPtr )
+                       useStdin = TRUE;
+               while( *argPtr )
+                       {
+                       if( isdigit( *argPtr ) )
+                               {
+                               offset = atol( argPtr );
+                               break;
+                               }
+                       switch( toupper( *argPtr ) )
+                               {
+                               case '-':
+                                       moreArgs = FALSE;       /* GNU-style end-of-args flag */
+                                       break;
+
+                               case 'A':
+                                       printAllData = TRUE;
+                                       break;
+
+                               case 'C':
+                                       if( !readConfig( argPtr + 1, FALSE ) )
+                                               exit( EXIT_FAILURE );
+                                       while( argPtr[ 1 ] )
+                                               argPtr++;       /* Skip rest of arg */
+                                       break;
+
+                               case 'D':
+                                       printDots = TRUE;
+                                       break;
+
+                               case 'E':
+                                       checkEncaps = FALSE;
+                                       break;
+
+                               case 'F':
+                                       if( ( outFile = fopen( argPtr + 1, "wb" ) ) == NULL )
+                                               {
+                                               perror( argPtr + 1 );
+                                               exit( EXIT_FAILURE );
+                                               }
+                                       while( argPtr[ 1 ] )
+                                               argPtr++;       /* Skip rest of arg */
+                                       break;
+
+                               case 'L':
+                                       extraOIDinfo = TRUE;
+                                       break;
+
+                               case 'H':
+                                       doDumpHeader++;
+                                       break;
+
+                               case 'P':
+                                       doPure = TRUE;
+                                       break;
+
+                               case 'S':
+                                       doCheckOnly = TRUE;
+#ifdef __WIN32__
+                                       /* Under Windows we can't fclose( stdout ) because the
+                                          VC++ runtime reassigns the stdout handle to the next
+                                          open file (which is valid) but then scribbles stdout
+                                          garbage all over it for files larger than about 16K
+                                          (which isn't), so we have to make sure that the
+                                          stdout is handle pointed to something somewhere */
+                                       freopen( "nul", "w", stdout );
+#else
+                                       /* If we know we're running under Unix we can also
+                                          freopen( "/dev/null", "w", stdout ); */
+                                       fclose( stdout );
+#endif /* __WIN32__ */
+                                       break;
+
+                               case 'T':
+                                       dumpText = TRUE;
+                                       break;
+
+                               case 'X':
+                                       doHexValues = TRUE;
+                                       break;
+
+                               case 'Z':
+                                       zeroLengthAllowed = TRUE;
+                                       break;
+
+                               default:
+                                       printf( "Unknown argument '%c'.\n", *argPtr );
+                                       return( EXIT_SUCCESS );
+                               }
+                       argPtr++;
+                       }
+               argv++;
+               argc--;
+               }
+
+       /* We can't use options which perform an fseek() if reading from stdin */
+       if( useStdin && ( doDumpHeader || outFile != NULL ) )
+               {
+               puts( "Can't use -f or -h when taking input from stdin" );
+               exit( EXIT_FAILURE );
+               }
+
+       /* Check args and read the config file.  We don't bother weeding out
+          dups during the read because (a) the linear search would make the
+          process n^2, (b) during the dump process the search will terminate on
+          the first match so dups aren't that serious, and (c) there should be
+          very few dups present */
+       if( argc != 1 && !useStdin )
+               usageExit();
+       if( !readGlobalConfig( pathPtr ) )
+               exit( EXIT_FAILURE );
+
+       /* Dump the given file */
+       if( useStdin )
+               inFile = stdin;
+       else
+               if( ( inFile = fopen( argv[ 0 ], "rb" ) ) == NULL )
+                       {
+                       perror( argv[ 0 ] );
+                       exit( EXIT_FAILURE );
+                       }
+       if( useStdin )
+               {
+               while( offset-- )
+                       getc( inFile );
+               }
+       else
+               fseek( inFile, offset, SEEK_SET );
+       if( outFile != NULL )
+               {
+               ASN1_ITEM item;
+               long length;
+               int i, status;
+
+               /* Make sure there's something there, and that it has a definite
+                  length */
+               status = getItem( inFile, &item );
+               if( status == -1 )
+                       {
+                       puts( "Non-ASN.1 data encountered." );
+                       exit( EXIT_FAILURE );
+                       }
+               if( status == 0 )
+                       {
+                       puts( "Nothing to read." );
+                       exit( EXIT_FAILURE );
+                       }
+               if( item.indefinite )
+                       {
+                       puts( "Cannot process indefinite-length item." );
+                       exit( EXIT_FAILURE );
+                       }
+
+               /* Copy the item across, first the header and then the data */
+               for( i = 0; i < item.headerSize; i++ )
+                       putc( item.header[ i ], outFile );
+               for( length = 0; length < item.length && !feof( inFile ); length++ )
+                       putc( getc( inFile ), outFile );
+               fclose( outFile );
+
+               fseek( inFile, offset, SEEK_SET );
+               }
+       printAsn1( inFile, 0, LENGTH_MAGIC, 0 );
+       fclose( inFile );
+
+       /* Print a summary of warnings/errors if it's required or appropriate */
+       if( !doPure )
+               {
+               if( !doCheckOnly )
+                       fputc( '\n', stderr );
+               fprintf( stderr, "%d warning%s, %d error%s.\n", noWarnings,
+                               ( noWarnings != 1 ) ? "s" : "", noErrors,
+                               ( noErrors != 1 ) ? "s" : "" );
+               }
+
+       return( ( noErrors ) ? noErrors : EXIT_SUCCESS );
+       }
diff --git a/rpmio/dumpasn1.cfg b/rpmio/dumpasn1.cfg
new file mode 100644 (file)
index 0000000..39dad37
--- /dev/null
@@ -0,0 +1,4973 @@
+# dumpasn1 Object Identifier configuration file, available from
+# http://www.cs.auckland.ac.nz/~pgut001/dumpasn1.cfg.  This is read by
+# dumpasn1.c and is used to display information on Object Identifiers found in
+# ASN.1 objects. This is merely a list of things which you might conceivably
+# find in use somewhere, and should in no way be taken as a guide to which OIDs
+# to use - many of these will never been seen in the wild, or should be shot on
+# sight if encountered.
+#
+# The format of this file is as follows:
+#
+# - All blank lines and lines beginning with a '#' are ignored.
+# - OIDs are described by a set of attributes, of which at least the 'OID' and
+#   'Description' must be present.  Optional attributes are a 'Comment' and a
+#   'Warning' (to indicate that dumpasn1 will display a warning if this OID is
+#   encountered).
+# - Attributes are listed one per line.  The first attribute should be an 'OID'
+#   attribute since this is used to denote the start of a new OID description.
+#   The other attributes may be given in any order.
+#
+# See the rest of this file for examples of what an OID description should look
+# like.
+
+# Deutsche Telekom/Telesec
+
+OID = 06 05 02 82 06 01 0A
+Comment = Deutsche Telekom
+Description = Telesec (0 2 262 1 10)
+
+OID = 06 06 02 82 06 01 0A 00
+Comment = Telesec
+Description = extension (0 2 262 1 10 0)
+
+OID = 06 06 02 82 06 01 0A 01
+Comment = Telesec
+Description = mechanism (0 2 262 1 10 1)
+
+OID = 06 07 02 82 06 01 0A 01 00
+Comment = Telesec mechanism
+Description = authentication (0 2 262 1 10 1 0)
+
+OID = 06 08 02 82 06 01 0A 01 00 01
+Comment = Telesec authentication
+Description = passwordAuthentication (0 2 262 1 10 1 0 1)
+
+OID = 06 08 02 82 06 01 0A 01 00 02
+Comment = Telesec authentication
+Description = protectedPasswordAuthentication (0 2 262 1 10 1 0 2)
+
+OID = 06 08 02 82 06 01 0A 01 00 03
+Comment = Telesec authentication
+Description = oneWayX509Authentication (0 2 262 1 10 1 0 3)
+
+OID = 06 08 02 82 06 01 0A 01 00 04
+Comment = Telesec authentication
+Description = twoWayX509Authentication (0 2 262 1 10 1 0 4)
+
+OID = 06 08 02 82 06 01 0A 01 00 05
+Comment = Telesec authentication
+Description = threeWayX509Authentication (0 2 262 1 10 1 0 5)
+
+OID = 06 08 02 82 06 01 0A 01 00 06
+Comment = Telesec authentication
+Description = oneWayISO9798Authentication (0 2 262 1 10 1 0 6)
+
+OID = 06 08 02 82 06 01 0A 01 00 07
+Comment = Telesec authentication
+Description = twoWayISO9798Authentication (0 2 262 1 10 1 0 7)
+
+OID = 06 08 02 82 06 01 0A 01 00 08
+Comment = Telesec authentication
+Description = telekomAuthentication (0 2 262 1 10 1 0 8)
+
+OID = 06 07 02 82 06 01 0A 01 01
+Comment = Telesec mechanism
+Description = signature (0 2 262 1 10 1 1)
+
+OID = 06 08 02 82 06 01 0A 01 01 01
+Comment = Telesec mechanism
+Description = md4WithRSAAndISO9697 (0 2 262 1 10 1 1 1)
+
+OID = 06 08 02 82 06 01 0A 01 01 02
+Comment = Telesec mechanism
+Description = md4WithRSAAndTelesecSignatureStandard (0 2 262 1 10 1 1 2)
+
+OID = 06 08 02 82 06 01 0A 01 01 03
+Comment = Telesec mechanism
+Description = md5WithRSAAndISO9697 (0 2 262 1 10 1 1 3)
+
+OID = 06 08 02 82 06 01 0A 01 01 04
+Comment = Telesec mechanism
+Description = md5WithRSAAndTelesecSignatureStandard (0 2 262 1 10 1 1 4)
+
+# PKCS #1 signature with RIPEMD-160
+OID = 06 08 02 82 06 01 0A 01 01 05
+Comment = Telesec mechanism
+Description = ripemd160WithRSAAndTelekomSignatureStandard (0 2 262 1 10 1 1 5)
+
+# RIPEMD-160 with raw RSA (ie no padding, just 160 bytes encrypted) signature
+OID = 06 08 02 82 06 01 0A 01 01 09
+Comment = Telesec signature
+Description = hbciRsaSignature (0 2 262 1 10 1 1 9)
+
+OID = 06 07 02 82 06 01 0A 01 02
+Comment = Telesec mechanism
+Description = encryption (0 2 262 1 10 1 2)
+
+# Specially recommended by the NSA for German use
+OID = 06 08 02 82 06 01 0A 01 02 00
+Comment = Telesec encryption
+Description = none (0 2 262 1 10 1 2 0)
+
+OID = 06 08 02 82 06 01 0A 01 02 01
+Comment = Telesec encryption
+Description = rsaTelesec (0 2 262 1 10 1 2 1)
+
+OID = 06 08 02 82 06 01 0A 01 02 02
+Comment = Telesec encryption
+Description = des (0 2 262 1 10 1 2 2)
+
+OID = 06 09 02 82 06 01 0A 01 02 02 01
+Comment = Telesec encryption
+Description = desECB (0 2 262 1 10 1 2 2 1)
+
+OID = 06 09 02 82 06 01 0A 01 02 02 02
+Comment = Telesec encryption
+Description = desCBC (0 2 262 1 10 1 2 2 2)
+
+OID = 06 09 02 82 06 01 0A 01 02 02 03
+Comment = Telesec encryption
+Description = desOFB (0 2 262 1 10 1 2 2 3)
+
+OID = 06 09 02 82 06 01 0A 01 02 02 04
+Comment = Telesec encryption
+Description = desCFB8 (0 2 262 1 10 1 2 2 4)
+
+OID = 06 09 02 82 06 01 0A 01 02 02 05
+Comment = Telesec encryption
+Description = desCFB64 (0 2 262 1 10 1 2 2 5)
+
+OID = 06 08 02 82 06 01 0A 01 02 03
+Comment = Telesec encryption
+Description = des3 (0 2 262 1 10 1 2 3)
+
+OID = 06 09 02 82 06 01 0A 01 02 03 01
+Comment = Telesec encryption
+Description = des3ECB (0 2 262 1 10 1 2 3 1)
+
+OID = 06 09 02 82 06 01 0A 01 02 03 02
+Comment = Telesec encryption
+Description = des3CBC (0 2 262 1 10 1 2 3 2)
+
+OID = 06 09 02 82 06 01 0A 01 02 03 03
+Comment = Telesec encryption
+Description = des3OFB (0 2 262 1 10 1 2 3 3)
+
+OID = 06 09 02 82 06 01 0A 01 02 03 04
+Comment = Telesec encryption
+Description = des3CFB8 (0 2 262 1 10 1 2 3 4)
+
+OID = 06 09 02 82 06 01 0A 01 02 03 05
+Comment = Telesec encryption
+Description = des3CFB64 (0 2 262 1 10 1 2 3 5)
+
+OID = 06 08 02 82 06 01 0A 01 02 04
+Comment = Telesec encryption
+Description = magenta (0 2 262 1 10 1 2 4)
+
+OID = 06 08 02 82 06 01 0A 01 02 05
+Comment = Telesec encryption
+Description = idea (0 2 262 1 10 1 2 5)
+
+OID = 06 09 02 82 06 01 0A 01 02 05 01
+Comment = Telesec encryption
+Description = ideaECB (0 2 262 1 10 1 2 5 1)
+
+OID = 06 09 02 82 06 01 0A 01 02 05 02
+Comment = Telesec encryption
+Description = ideaCBC (0 2 262 1 10 1 2 5 2)
+
+OID = 06 09 02 82 06 01 0A 01 02 05 03
+Comment = Telesec encryption
+Description = ideaOFB (0 2 262 1 10 1 2 5 3)
+
+OID = 06 09 02 82 06 01 0A 01 02 05 04
+Comment = Telesec encryption
+Description = ideaCFB8 (0 2 262 1 10 1 2 5 4)
+
+OID = 06 09 02 82 06 01 0A 01 02 05 05
+Comment = Telesec encryption
+Description = ideaCFB64 (0 2 262 1 10 1 2 5 5)
+
+OID = 06 07 02 82 06 01 0A 01 03
+Comment = Telesec mechanism
+Description = oneWayFunction (0 2 262 1 10 1 3)
+
+OID = 06 08 02 82 06 01 0A 01 03 01
+Comment = Telesec one-way function
+Description = md4 (0 2 262 1 10 1 3 1)
+
+OID = 06 08 02 82 06 01 0A 01 03 02
+Comment = Telesec one-way function
+Description = md5 (0 2 262 1 10 1 3 2)
+
+OID = 06 08 02 82 06 01 0A 01 03 03
+Comment = Telesec one-way function
+Description = sqModNX509 (0 2 262 1 10 1 3 3)
+
+OID = 06 08 02 82 06 01 0A 01 03 04
+Comment = Telesec one-way function
+Description = sqModNISO (0 2 262 1 10 1 3 4)
+
+OID = 06 08 02 82 06 01 0A 01 03 05
+Comment = Telesec one-way function
+Description = ripemd128 (0 2 262 1 10 1 3 5)
+
+OID = 06 08 02 82 06 01 0A 01 03 06
+Comment = Telesec one-way function
+Description = hashUsingBlockCipher (0 2 262 1 10 1 3 6)
+
+OID = 06 08 02 82 06 01 0A 01 03 07
+Comment = Telesec one-way function
+Description = mac (0 2 262 1 10 1 3 7)
+
+OID = 06 08 02 82 06 01 0A 01 03 08
+Comment = Telesec one-way function
+Description = ripemd160 (0 2 262 1 10 1 3 8)
+
+OID = 06 07 02 82 06 01 0A 01 04
+Comment = Telesec mechanism
+Description = fecFunction (0 2 262 1 10 1 4)
+
+OID = 06 08 02 82 06 01 0A 01 04 01
+Comment = Telesec mechanism
+Description = reedSolomon (0 2 262 1 10 1 4 1)
+
+OID = 06 06 02 82 06 01 0A 02
+Comment = Telesec
+Description = module (0 2 262 1 10 2)
+
+OID = 06 07 02 82 06 01 0A 02 00
+Comment = Telesec module
+Description = algorithms (0 2 262 1 10 2 0)
+
+OID = 06 07 02 82 06 01 0A 02 01
+Comment = Telesec module
+Description = attributeTypes (0 2 262 1 10 2 1)
+
+OID = 06 07 02 82 06 01 0A 02 02
+Comment = Telesec module
+Description = certificateTypes (0 2 262 1 10 2 2)
+
+OID = 06 07 02 82 06 01 0A 02 03
+Comment = Telesec module
+Description = messageTypes (0 2 262 1 10 2 3)
+
+OID = 06 07 02 82 06 01 0A 02 04
+Comment = Telesec module
+Description = plProtocol (0 2 262 1 10 2 4)
+
+OID = 06 07 02 82 06 01 0A 02 05
+Comment = Telesec module
+Description = smeAndComponentsOfSme (0 2 262 1 10 2 5)
+
+OID = 06 07 02 82 06 01 0A 02 06
+Comment = Telesec module
+Description = fec (0 2 262 1 10 2 6)
+
+OID = 06 07 02 82 06 01 0A 02 07
+Comment = Telesec module
+Description = usefulDefinitions (0 2 262 1 10 2 7)
+
+OID = 06 07 02 82 06 01 0A 02 08
+Comment = Telesec module
+Description = stefiles (0 2 262 1 10 2 8)
+
+OID = 06 07 02 82 06 01 0A 02 09
+Comment = Telesec module
+Description = sadmib (0 2 262 1 10 2 9)
+
+OID = 06 07 02 82 06 01 0A 02 0A
+Comment = Telesec module
+Description = electronicOrder (0 2 262 1 10 2 10)
+
+OID = 06 07 02 82 06 01 0A 02 0B
+Comment = Telesec module
+Description = telesecTtpAsymmetricApplication (0 2 262 1 10 2 11)
+
+OID = 06 07 02 82 06 01 0A 02 0C
+Comment = Telesec module
+Description = telesecTtpBasisApplication (0 2 262 1 10 2 12)
+
+OID = 06 07 02 82 06 01 0A 02 0D
+Comment = Telesec module
+Description = telesecTtpMessages (0 2 262 1 10 2 13)
+
+OID = 06 07 02 82 06 01 0A 02 0E
+Comment = Telesec module
+Description = telesecTtpTimeStampApplication (0 2 262 1 10 2 14)
+
+OID = 06 06 02 82 06 01 0A 03
+Comment = Telesec
+Description = objectClass (0 2 262 1 10 3)
+
+OID = 06 07 02 82 06 01 0A 03 00
+Comment = Telesec object class
+Description = telesecOtherName (0 2 262 1 10 3 0)
+
+OID = 06 07 02 82 06 01 0A 03 01
+Comment = Telesec object class
+Description = directory (0 2 262 1 10 3 1)
+
+OID = 06 07 02 82 06 01 0A 03 02
+Comment = Telesec object class
+Description = directoryType (0 2 262 1 10 3 2)
+
+OID = 06 07 02 82 06 01 0A 03 03
+Comment = Telesec object class
+Description = directoryGroup (0 2 262 1 10 3 3)
+
+OID = 06 07 02 82 06 01 0A 03 04
+Comment = Telesec object class
+Description = directoryUser (0 2 262 1 10 3 4)
+
+OID = 06 07 02 82 06 01 0A 03 05
+Comment = Telesec object class
+Description = symmetricKeyEntry (0 2 262 1 10 3 5)
+
+OID = 06 06 02 82 06 01 0A 04
+Comment = Telesec
+Description = package (0 2 262 1 10 4)
+
+OID = 06 06 02 82 06 01 0A 05
+Comment = Telesec
+Description = parameter (0 2 262 1 10 5)
+
+OID = 06 06 02 82 06 01 0A 06
+Comment = Telesec
+Description = nameBinding (0 2 262 1 10 6)
+
+OID = 06 06 02 82 06 01 0A 07
+Comment = Telesec
+Description = attribute (0 2 262 1 10 7)
+
+OID = 06 07 02 82 06 01 0A 07 00
+Comment = Telesec attribute
+Description = applicationGroupIdentifier (0 2 262 1 10 7 0)
+
+OID = 06 07 02 82 06 01 0A 07 01
+Comment = Telesec attribute
+Description = certificateType (0 2 262 1 10 7 1)
+
+OID = 06 07 02 82 06 01 0A 07 02
+Comment = Telesec attribute
+Description = telesecCertificate (0 2 262 1 10 7 2)
+
+OID = 06 07 02 82 06 01 0A 07 03
+Comment = Telesec attribute
+Description = certificateNumber (0 2 262 1 10 7 3)
+
+OID = 06 07 02 82 06 01 0A 07 04
+Comment = Telesec attribute
+Description = certificateRevocationList (0 2 262 1 10 7 4)
+
+OID = 06 07 02 82 06 01 0A 07 05
+Comment = Telesec attribute
+Description = creationDate (0 2 262 1 10 7 5)
+
+OID = 06 07 02 82 06 01 0A 07 06
+Comment = Telesec attribute
+Description = issuer (0 2 262 1 10 7 6)
+
+OID = 06 07 02 82 06 01 0A 07 07
+Comment = Telesec attribute
+Description = namingAuthority (0 2 262 1 10 7 7)
+
+OID = 06 07 02 82 06 01 0A 07 08
+Comment = Telesec attribute
+Description = publicKeyDirectory (0 2 262 1 10 7 8)
+
+OID = 06 07 02 82 06 01 0A 07 09
+Comment = Telesec attribute
+Description = securityDomain (0 2 262 1 10 7 9)
+
+OID = 06 07 02 82 06 01 0A 07 0A
+Comment = Telesec attribute
+Description = subject (0 2 262 1 10 7 10)
+
+OID = 06 07 02 82 06 01 0A 07 0B
+Comment = Telesec attribute
+Description = timeOfRevocation (0 2 262 1 10 7 11)
+
+OID = 06 07 02 82 06 01 0A 07 0C
+Comment = Telesec attribute
+Description = userGroupReference (0 2 262 1 10 7 12)
+
+OID = 06 07 02 82 06 01 0A 07 0D
+Comment = Telesec attribute
+Description = validity (0 2 262 1 10 7 13)
+
+OID = 06 07 02 82 06 01 0A 07 0E
+Comment = Telesec attribute
+Description = zert93 (0 2 262 1 10 7 14)
+
+# It really is called that
+OID = 06 07 02 82 06 01 0A 07 0F
+Comment = Telesec attribute
+Description = securityMessEnv (0 2 262 1 10 7 15)
+
+OID = 06 07 02 82 06 01 0A 07 10
+Comment = Telesec attribute
+Description = anonymizedPublicKeyDirectory (0 2 262 1 10 7 16)
+
+OID = 06 07 02 82 06 01 0A 07 11
+Comment = Telesec attribute
+Description = telesecGivenName (0 2 262 1 10 7 17)
+
+OID = 06 07 02 82 06 01 0A 07 12
+Comment = Telesec attribute
+Description = nameAdditions (0 2 262 1 10 7 18)
+
+OID = 06 07 02 82 06 01 0A 07 13
+Comment = Telesec attribute
+Description = telesecPostalCode (0 2 262 1 10 7 19)
+
+OID = 06 07 02 82 06 01 0A 07 14
+Comment = Telesec attribute
+Description = nameDistinguisher (0 2 262 1 10 7 20)
+
+OID = 06 07 02 82 06 01 0A 07 15
+Comment = Telesec attribute
+Description = telesecCertificateList (0 2 262 1 10 7 21)
+
+OID = 06 07 02 82 06 01 0A 07 16
+Comment = Telesec attribute
+Description = teletrustCertificateList (0 2 262 1 10 7 22)
+
+OID = 06 07 02 82 06 01 0A 07 17
+Comment = Telesec attribute
+Description = x509CertificateList (0 2 262 1 10 7 23)
+
+OID = 06 07 02 82 06 01 0A 07 18
+Comment = Telesec attribute
+Description = timeOfIssue (0 2 262 1 10 7 24)
+
+OID = 06 07 02 82 06 01 0A 07 19
+Comment = Telesec attribute
+Description = physicalCardNumber (0 2 262 1 10 7 25)
+
+OID = 06 07 02 82 06 01 0A 07 1A
+Comment = Telesec attribute
+Description = fileType (0 2 262 1 10 7 26)
+
+OID = 06 07 02 82 06 01 0A 07 1B
+Comment = Telesec attribute
+Description = ctlFileIsArchive (0 2 262 1 10 7 27)
+
+OID = 06 07 02 82 06 01 0A 07 1C
+Comment = Telesec attribute
+Description = emailAddress (0 2 262 1 10 7 28)
+
+OID = 06 07 02 82 06 01 0A 07 1D
+Comment = Telesec attribute
+Description = certificateTemplateList (0 2 262 1 10 7 29)
+
+OID = 06 07 02 82 06 01 0A 07 1E
+Comment = Telesec attribute
+Description = directoryName (0 2 262 1 10 7 30)
+
+OID = 06 07 02 82 06 01 0A 07 1F
+Comment = Telesec attribute
+Description = directoryTypeName (0 2 262 1 10 7 31)
+
+OID = 06 07 02 82 06 01 0A 07 20
+Comment = Telesec attribute
+Description = directoryGroupName (0 2 262 1 10 7 32)
+
+OID = 06 07 02 82 06 01 0A 07 21
+Comment = Telesec attribute
+Description = directoryUserName (0 2 262 1 10 7 33)
+
+OID = 06 07 02 82 06 01 0A 07 22
+Comment = Telesec attribute
+Description = revocationFlag (0 2 262 1 10 7 34)
+
+OID = 06 07 02 82 06 01 0A 07 23
+Comment = Telesec attribute
+Description = symmetricKeyEntryName (0 2 262 1 10 7 35)
+
+OID = 06 07 02 82 06 01 0A 07 24
+Comment = Telesec attribute
+Description = glNumber (0 2 262 1 10 7 36)
+
+OID = 06 07 02 82 06 01 0A 07 25
+Comment = Telesec attribute
+Description = goNumber (0 2 262 1 10 7 37)
+
+OID = 06 07 02 82 06 01 0A 07 26
+Comment = Telesec attribute
+Description = gKeyData (0 2 262 1 10 7 38)
+
+OID = 06 07 02 82 06 01 0A 07 27
+Comment = Telesec attribute
+Description = zKeyData (0 2 262 1 10 7 39)
+
+OID = 06 07 02 82 06 01 0A 07 28
+Comment = Telesec attribute
+Description = ktKeyData (0 2 262 1 10 7 40)
+
+OID = 06 07 02 82 06 01 0A 07 2A
+Comment = Telesec attribute
+Description = ktKeyNumber (0 2 262 1 10 7 41)
+
+OID = 06 07 02 82 06 01 0A 07 33
+Comment = Telesec attribute
+Description = timeOfRevocationGen (0 2 262 1 10 7 51)
+
+OID = 06 07 02 82 06 01 0A 07 34
+Comment = Telesec attribute
+Description = liabilityText (0 2 262 1 10 7 52)
+
+OID = 06 06 02 82 06 01 0A 08
+Comment = Telesec
+Description = attributeGroup (0 2 262 1 10 8)
+
+OID = 06 06 02 82 06 01 0A 09
+Comment = Telesec
+Description = action (0 2 262 1 10 9)
+
+OID = 06 06 02 82 06 01 0A 0A
+Comment = Telesec
+Description = notification (0 2 262 1 10 10)
+
+OID = 06 06 02 82 06 01 0A 0B
+Comment = Telesec
+Description = snmp-mibs (0 2 262 1 10 11)
+
+OID = 06 07 02 82 06 01 0A 0B 01
+Comment = Telesec SNMP MIBs
+Description = securityApplication (0 2 262 1 10 11 1)
+
+OID = 06 06 02 82 06 01 0A 0C
+Comment = Telesec
+Description = certAndCrlExtensionDefinitions (0 2 262 1 10 12)
+
+OID = 06 07 02 82 06 01 0A 0C 00
+Comment = Telesec cert/CRL extension
+Description = certExtensionLiabilityLimitationExt (0 2 262 1 10 12 0)
+
+OID = 06 07 02 82 06 01 0A 0C 01
+Comment = Telesec cert/CRL extension
+Description = telesecCertIdExt (0 2 262 1 10 12 1)
+
+OID = 06 07 02 82 06 01 0A 0C 02
+Comment = Telesec cert/CRL extension
+Description = telesecPolicyIdentifier (0 2 262 1 10 12 2)
+
+OID = 06 07 02 82 06 01 0A 0C 03
+Comment = Telesec cert/CRL extension
+Description = telesecPolicyQualifierID (0 2 262 1 10 12 3)
+
+OID = 06 07 02 82 06 01 0A 0C 04
+Comment = Telesec cert/CRL extension
+Description = telesecCRLFilteredExt (0 2 262 1 10 12 4)
+
+OID = 06 07 02 82 06 01 0A 0C 05
+Comment = Telesec cert/CRL extension
+Description = telesecCRLFilterExt (0 2 262 1 10 12 5)
+
+OID = 06 07 02 82 06 01 0A 0C 06
+Comment = Telesec cert/CRL extension
+Description = telesecNamingAuthorityExt (0 2 262 1 10 12 6)
+
+# Some LDAP draft from the UK
+
+OID = 06 0A 09 92 26 89 93 F2 2C 64 01 01
+Comment = Some oddball LDAP attribute collection
+Description = uniqueID (0 9 2342 19200300 100 1 1)
+
+# Some unknown X.500 attributes spec from the UK
+
+OID = 06 0A 09 92 26 89 93 F2 2C 64 01 03
+Comment = Some oddball X.500 attribute collection
+Description = rfc822Mailbox (0 9 2342 19200300 100 1 3)
+
+# RFC 2247, How to Kludge an FQDN as a DN (or words to that effect), another
+# fine product of the UK.
+
+OID = 06 0A 09 92 26 89 93 F2 2C 64 01 19
+Comment = Men are from Mars, this OID is from Pluto
+Description = domainComponent (0 9 2342 19200300 100 1 25)
+
+# Certificates Australia
+
+OID = 06 0A 2A 24 A4 97 A3 53 01 64 01 01
+Comment = Certificates Australia CA
+Description = Certificates Australia policyIdentifier (1 2 36 75878867 1 100 1 1)
+
+# Signet
+
+OID = 06 09 2A 24 A0 F2 A0 7D 01 01 02
+Comment = Signet CA
+Description = Signet personal (1 2 36 68980861 1 1 2)
+
+OID = 06 09 2A 24 A0 F2 A0 7D 01 01 03
+Comment = Signet CA
+Description = Signet business (1 2 36 68980861 1 1 3)
+
+OID = 06 09 2A 24 A0 F2 A0 7D 01 01 04
+Comment = Signet CA
+Description = Signet legal (1 2 36 68980861 1 1 4)
+
+OID = 06 09 2A 24 A0 F2 A0 7D 01 01 0A
+Comment = Signet CA
+Description = Signet pilot (1 2 36 68980861 1 1 10)
+
+OID = 06 09 2A 24 A0 F2 A0 7D 01 01 0B
+Comment = Signet CA
+Description = Signet intraNet (1 2 36 68980861 1 1 11)
+
+OID = 06 09 2A 24 A0 F2 A0 7D 01 01 14
+Comment = Signet CA
+Description = Signet securityPolicy (1 2 36 68980861 1 1 20)
+
+# Mitsubishi
+
+OID = 06 0B 2A 83 08 8C 1A 4B 3D 01 01 01
+Comment = Mitsubishi security algorithm
+Description = symmetric-encryption-algorithm (1 2 392 200011 61 1 1 1)
+
+OID = 06 0C 2A 83 08 8C 9A 4B 3D 01 01 01 01
+Comment = Mitsubishi security algorithm
+Description = misty1-cbc (1 2 392 200011 61 1 1 1 1)
+
+# SEIS
+
+OID = 06 05 2A 85 70 22 01
+Comment = SEIS Project
+Description = seis-cp (1 2 752 34 1)
+
+OID = 06 06 2A 85 70 22 01 01
+Comment = SEIS Project certificate policies
+Description = SEIS high-assurnace certificatePolicy (1 2 752 34 1 1)
+
+OID = 06 06 2A 85 70 22 01 02
+Comment = SEIS Project certificate policies
+Description = SEIS GAK certificatePolicy (1 2 752 34 1 2)
+
+OID = 06 05 2A 85 70 22 02
+Comment = SEIS Project
+Description = SEIS pe (1 2 752 34 2)
+
+OID = 06 05 2A 85 70 22 03
+Comment = SEIS Project
+Description = SEIS at (1 2 752 34 3)
+
+OID = 06 06 2A 85 70 22 03 01
+Comment = SEIS Project attribute
+Description = SEIS at-personalIdentifier (1 2 752 34 3 1)
+
+# ANSI X9.57
+
+OID = 06 06 2A 86 48 CE 38 01
+Comment = ANSI X9.57
+Description = module (1 2 840 10040 1)
+
+OID = 06 07 2A 86 48 CE 38 01 01
+Comment = ANSI X9.57 module
+Description = x9f1-cert-mgmt (1 2 840 10040 1 1)
+
+OID = 06 06 2A 86 48 CE 38 02
+Comment = ANSI X9.57
+Description = holdinstruction (1 2 840 10040 2)
+
+OID = 06 07 2A 86 48 CE 38 02 01
+Comment = ANSI X9.57 hold instruction
+Description = holdinstruction-none (1 2 840 10040 2 1)
+
+OID = 06 07 2A 86 48 CE 38 02 02
+Comment = ANSI X9.57 hold instruction
+Description = callissuer (1 2 840 10040 2 2)
+
+OID = 06 07 2A 86 48 CE 38 02 03
+Comment = ANSI X9.57 hold instruction
+Description = reject (1 2 840 10040 2 3)
+
+OID = 06 07 2A 86 48 CE 38 02 04
+Comment = ANSI X9.57 hold instruction
+Description = pickupToken (1 2 840 10040 2 4)
+
+OID = 06 06 2A 86 48 CE 38 03
+Comment = ANSI X9.57
+Description = attribute (1 2 840 10040 3)
+
+OID = 06 06 2A 86 48 CE 38 03 01
+Comment = ANSI X9.57 attribute
+Description = countersignature (1 2 840 10040 3 1)
+
+OID = 06 06 2A 86 48 CE 38 03 02
+Comment = ANSI X9.57 attribute
+Description = attribute-cert (1 2 840 10040 3 2)
+
+OID = 06 06 2A 86 48 CE 38 04
+Comment = ANSI X9.57
+Description = algorithm (1 2 840 10040 4)
+
+OID = 06 07 2A 86 48 CE 38 04 01
+Comment = ANSI X9.57 algorithm
+Description = dsa (1 2 840 10040 4 1)
+
+OID = 06 07 2A 86 48 CE 38 04 02
+Comment = ANSI X9.57 algorithm
+Description = dsa-match (1 2 840 10040 4 2)
+
+OID = 06 07 2A 86 48 CE 38 04 03
+Comment = ANSI X9.57 algorithm
+Description = dsaWithSha1 (1 2 840 10040 4 3)
+
+# ANSI X9.62
+
+OID = 06 06 2A 86 48 CE 3D 01
+Comment = ANSI X9.62.  This OID is also assigned as ecdsa-with-SHA1
+Description = fieldType (1 2 840 10045 1)
+
+OID = 06 07 2A 86 48 CE 3D 01 01
+Comment = ANSI X9.62 field type
+Description = prime-field (1 2 840 10045 1 1)
+
+OID = 06 07 2A 86 48 CE 3D 01 02
+Comment = ANSI X9.62 field type
+Description = characteristic-two-field (1 2 840 10045 1 2)
+
+OID = 06 09 2A 86 48 CE 3D 01 02 03
+Comment = ANSI X9.62 field type
+Description = characteristic-two-basis (1 2 840 10045 1 2 3)
+
+OID = 06 0A 2A 86 48 CE 3D 01 02 03 01
+Comment = ANSI X9.62 field basis
+Description = onBasis (1 2 840 10045 1 2 3 1)
+
+OID = 06 0A 2A 86 48 CE 3D 01 02 03 02
+Comment = ANSI X9.62 field basis
+Description = tpBasis (1 2 840 10045 1 2 3 2)
+
+OID = 06 0A 2A 86 48 CE 3D 01 02 03 03
+Comment = ANSI X9.62 field basis
+Description = ppBasis (1 2 840 10045 1 2 3 3)
+
+# The definition for the following OID is somewhat confused, and is given as
+# keyType, publicKeyType, and public-key-type, all within 4 lines of text.
+# ecPublicKey is defined using the ID publicKeyType, so this is what's used
+# here.
+OID = 06 06 2A 86 48 CE 3D 02
+Comment = ANSI X9.62
+Description = publicKeyType (1 2 840 10045 2)
+
+OID = 06 07 2A 86 48 CE 3D 02 01
+Comment = ANSI X9.62 public key type
+Description = ecPublicKey (1 2 840 10045 2 1)
+
+# ANSI X9.42
+
+OID = 06 06 2A 86 48 CE 3E 01
+Comment = ANSI X9.42
+Description = fieldType (1 2 840 10046 1)
+
+OID = 06 07 2A 86 48 CE 3E 01 01
+Comment = ANSI X9.42 field type
+Description = gf-prime (1 2 840 10046 1 1)
+
+OID = 06 06 2A 86 48 CE 3E 02
+Comment = ANSI X9.42
+Description = numberType (1 2 840 10046 2)
+
+OID = 06 07 2A 86 48 CE 3E 02 01
+Comment = ANSI X9.42 number type
+Description = dhPublicKey (1 2 840 10046 2 1)
+
+OID = 06 06 2A 86 48 CE 3E 03
+Comment = ANSI X9.42
+Description = scheme (1 2 840 10046 3)
+
+OID = 06 07 2A 86 48 CE 3E 03 01
+Comment = ANSI X9.42 scheme
+Description = dhStatic (1 2 840 10046 3 1)
+
+OID = 06 07 2A 86 48 CE 3E 03 02
+Comment = ANSI X9.42 scheme
+Description = dhEphem (1 2 840 10046 3 2)
+
+OID = 06 07 2A 86 48 CE 3E 03 03
+Comment = ANSI X9.42 scheme
+Description = dhHybrid1 (1 2 840 10046 3 3)
+
+OID = 06 07 2A 86 48 CE 3E 03 04
+Comment = ANSI X9.42 scheme
+Description = dhHybrid2 (1 2 840 10046 3 4)
+
+OID = 06 07 2A 86 48 CE 3E 03 05
+Comment = ANSI X9.42 scheme
+Description = mqv2 (1 2 840 10046 3 5)
+
+OID = 06 07 2A 86 48 CE 3E 03 06
+Comment = ANSI X9.42 scheme
+Description = mqv1 (1 2 840 10046 3 6)
+
+# Nortel Secure Networks/Entrust
+
+OID = 06 07 2A 86 48 86 F6 7D 07
+Description = nsn (1 2 840 113533 7)
+
+OID = 06 08 2A 86 48 86 F6 7D 07 41
+Description = nsn-ce (1 2 840 113533 7 65)
+
+OID = 06 09 2A 86 48 86 F6 7D 07 41 00
+Comment = Nortel Secure Networks ce (1 2 840 113533 7 65)
+Description = entrustVersInfo (1 2 840 113533 7 65 0)
+
+OID = 06 08 2A 86 48 86 F6 7D 07 42
+Description = nsn-alg (1 2 840 113533 7 66)
+
+OID = 06 09 2A 86 48 86 F6 7D 07 42 03
+Comment = Nortel Secure Networks alg (1 2 840 113533 7 66)
+Description = cast3CBC (1 2 840 113533 7 66 3)
+
+OID = 06 09 2A 86 48 86 F6 7D 07 42 0A
+Comment = Nortel Secure Networks alg (1 2 840 113533 7 66)
+Description = cast5CBC (1 2 840 113533 7 66 10)
+
+OID = 06 09 2A 86 48 86 F6 7D 07 42 0B
+Comment = Nortel Secure Networks alg (1 2 840 113533 7 66)
+Description = cast5MAC (1 2 840 113533 7 66 11)
+
+OID = 06 09 2A 86 48 86 F6 7D 07 42 0C
+Comment = Nortel Secure Networks alg (1 2 840 113533 7 66)
+Description = pbeWithMD5AndCAST5-CBC (1 2 840 113533 7 66 12)
+
+OID = 06 09 2A 86 48 86 F6 7D 07 42 0D
+Comment = Nortel Secure Networks alg (1 2 840 113533 7 66)
+Description = passwordBasedMac (1 2 840 113533 7 66 13)
+
+OID = 06 08 2A 86 48 86 F6 7D 07 43
+Description = nsn-oc (1 2 840 113533 7 67)
+
+OID = 06 09 2A 86 48 86 F6 7D 07 43 0C
+Comment = Nortel Secure Networks oc (1 2 840 113533 7 67)
+Description = entrustUser (1 2 840 113533 7 67 0)
+
+OID = 06 08 2A 86 48 86 F6 7D 07 44
+Description = nsn-at (1 2 840 113533 7 68)
+
+OID = 06 09 2A 86 48 86 F6 7D 07 44 00
+Comment = Nortel Secure Networks at (1 2 840 113533 7 68)
+Description = entrustCAInfo (1 2 840 113533 7 68 0)
+
+OID = 06 09 2A 86 48 86 F6 7D 07 44 0A
+Comment = Nortel Secure Networks at (1 2 840 113533 7 68)
+Description = attributeCertificate (1 2 840 113533 7 68 10)
+
+# PKCS #1
+
+OID = 06 08 2A 86 48 86 F7 0D 01 01
+Description = pkcs-1 (1 2 840 113549 1 1)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 01 01
+Comment = PKCS #1
+Description = rsaEncryption (1 2 840 113549 1 1 1)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 01 02
+Comment = PKCS #1
+Description = md2withRSAEncryption (1 2 840 113549 1 1 2)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 01 03
+Comment = PKCS #1
+Description = md4withRSAEncryption (1 2 840 113549 1 1 3)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 01 04
+Comment = PKCS #1
+Description = md5withRSAEncryption (1 2 840 113549 1 1 4)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 01 05
+Comment = PKCS #1
+Description = sha1withRSAEncryption (1 2 840 113549 1 1 5)
+
+# There is some confusion over the identity of the following OID.  The OAEP
+# one is more recent, but independant vendors have already used the RIPEMD
+# one, however it's likely that SET will be a bigger hammer (at least as a
+# standard) so we report it as that.
+OID = 06 09 2A 86 48 86 F7 0D 01 01 06
+Comment = PKCS #1.  This OID may also be assigned as ripemd160WithRSAEncryption
+Description = rsaOAEPEncryptionSET (1 2 840 113549 1 1 6)
+# ripemd160WithRSAEncryption (1 2 840 113549 1 1 6)
+
+# BSAFE/PKCS #2 (obsolete)
+
+OID = 06 08 2A 86 48 86 F7 0D 01 01
+Comment = Obsolete BSAFE OID
+Description = bsafeRsaEncr (1 2 840 113549 1 2)
+Warning
+
+# PKCS #3
+
+OID = 06 08 2A 86 48 86 F7 0D 01 03
+Description = pkcs-3 (1 2 840 113549 1 3)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 03 01
+Comment = PKCS #3
+Description = dhKeyAgreement (1 2 840 113549 1 3 1)
+
+# PKCS #5
+
+OID = 06 09 2A 86 48 86 F7 0D 01 05
+Description = pkcs-5 (1 2 840 113549 1 5)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 05 01
+Comment = PKCS #5
+Description = pbeWithMD2AndDES-CBC (1 2 840 113549 1 5 1)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 05 03
+Comment = PKCS #5
+Description = pbeWithMD5AndDES-CBC (1 2 840 113549 1 5 3)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 05 04
+Comment = PKCS #5
+Description = pbeWithMD2AndRC2-CBC (1 2 840 113549 1 5 4)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 05 06
+Comment = PKCS #5
+Description = pbeWithMD5AndRC2-CBC (1 2 840 113549 1 5 6)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 05 09
+Comment = PKCS #5, used in BSAFE only
+Description = pbeWithMD5AndXOR (1 2 840 113549 1 5 9)
+Warning
+
+OID = 06 09 2A 86 48 86 F7 0D 01 05 0A
+Comment = PKCS #5
+Description = pbeWithSHAAndDES-CBC (1 2 840 113549 1 5 10)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 05 0C
+Comment = PKCS #5 v2.0
+Description = pkcs5PBKDF2 (1 2 840 113549 1 5 12)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 05 0D
+Comment = PKCS #5 v2.0
+Description = pkcs5PBES2 (1 2 840 113549 1 5 13)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 05 0E
+Comment = PKCS #5 v2.0
+Description = pkcs5PBMAC1 (1 2 840 113549 1 5 14)
+
+# PKCS #7
+
+OID = 06 09 2A 86 48 86 F7 0D 01 07
+Description = pkcs-7 (1 2 840 113549 1 7)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 07 01
+Comment = PKCS #7
+Description = data (1 2 840 113549 1 7 1)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 07 02
+Comment = PKCS #7
+Description = signedData (1 2 840 113549 1 7 2)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 07 03
+Comment = PKCS #7
+Description = envelopedData (1 2 840 113549 1 7 3)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 07 04
+Comment = PKCS #7
+Description = signedAndEnvelopedData (1 2 840 113549 1 7 4)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 07 05
+Comment = PKCS #7
+Description = digestedData (1 2 840 113549 1 7 5)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 07 06
+Comment = PKCS #7
+Description = encryptedData (1 2 840 113549 1 7 6)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 07 07
+Comment = PKCS #7 experimental
+Description = dataWithAttributes (1 2 840 113549 1 7 7)
+Warning
+
+OID = 06 09 2A 86 48 86 F7 0D 01 07 08
+Comment = PKCS #7 experimental
+Description = encryptedPrivateKeyInfo (1 2 840 113549 1 7 8)
+Warning
+
+# PKCS #9
+
+OID = 06 09 2A 86 48 86 F7 0D 01 09
+Description = pkcs-9 (1 2 840 113549 1 9)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 09 01
+Comment = PKCS #9 (1 2 840 113549 1 9).  Deprecated, use an altName extension instead
+Description = emailAddress (1 2 840 113549 1 9 1)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 09 02
+Comment = PKCS #9 (1 2 840 113549 1 9)
+Description = unstructuredName (1 2 840 113549 1 9 2)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 09 03
+Comment = PKCS #9 (1 2 840 113549 1 9)
+Description = contentType (1 2 840 113549 1 9 3)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 09 04
+Comment = PKCS #9 (1 2 840 113549 1 9)
+Description = messageDigest (1 2 840 113549 1 9 4)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 09 05
+Comment = PKCS #9 (1 2 840 113549 1 9)
+Description = signingTime (1 2 840 113549 1 9 5)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 09 06
+Comment = PKCS #9 (1 2 840 113549 1 9)
+Description = countersignature (1 2 840 113549 1 9 6)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 09 07
+Comment = PKCS #9 (1 2 840 113549 1 9)
+Description = challengePassword (1 2 840 113549 1 9 7)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 09 08
+Comment = PKCS #9 (1 2 840 113549 1 9)
+Description = unstructuredAddress (1 2 840 113549 1 9 8)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 09 09
+Comment = PKCS #9 (1 2 840 113549 1 9)
+Description = extendedCertificateAttributes (1 2 840 113549 1 9 9)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 09 0A
+Comment = PKCS #9 (1 2 840 113549 1 9) experimental
+Description = issuerAndSerialNumber (1 2 840 113549 1 9 10)
+Warning
+
+OID = 06 09 2A 86 48 86 F7 0D 01 09 0B
+Comment = PKCS #9 (1 2 840 113549 1 9) experimental
+Description = passwordCheck (1 2 840 113549 1 9 11)
+Warning
+
+OID = 06 09 2A 86 48 86 F7 0D 01 09 0C
+Comment = PKCS #9 (1 2 840 113549 1 9) experimental
+Description = publicKey (1 2 840 113549 1 9 12)
+Warning
+
+OID = 06 09 2A 86 48 86 F7 0D 01 09 0D
+Comment = PKCS #9 (1 2 840 113549 1 9) experimental
+Description = signingDescription (1 2 840 113549 1 9 13)
+Warning
+
+OID = 06 09 2A 86 48 86 F7 0D 01 09 0E
+Comment = PKCS #9 (1 2 840 113549 1 9) experimental
+Description = extensionReq (1 2 840 113549 1 9 14)
+
+# PKCS #9 for use with S/MIME
+
+OID = 06 09 2A 86 48 86 F7 0D 01 09 0F
+Comment = PKCS #9 (1 2 840 113549 1 9).  This OID was formerly assigned as symmetricCapabilities, then reassigned as SMIMECapabilities, then renamed to the current name
+Description = sMIMECapabilities (1 2 840 113549 1 9 15)
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 09 0F 01
+Comment = sMIMECapabilities (1 2 840 113549 1 9 15)
+Description = preferSignedData (1 2 840 113549 1 9 15 1)
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 09 0F 02
+Comment = sMIMECapabilities (1 2 840 113549 1 9 15)
+Description = canNotDecryptAny (1 2 840 113549 1 9 15 2)
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 09 0F 03
+Comment = sMIMECapabilities (1 2 840 113549 1 9 15).  Deprecated, use (1 2 840 113549 1 9 16 2 1) instead
+Description = receiptRequest (1 2 840 113549 1 9 15 3)
+Warning
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 09 0F 04
+Comment = sMIMECapabilities (1 2 840 113549 1 9 15).  Deprecated, use (1 2 840 113549 1 9 16 1 1) instead
+Description = receipt (1 2 840 113549 1 9 15 4)
+Warning
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 09 0F 05
+Comment = sMIMECapabilities (1 2 840 113549 1 9 15).  Deprecated, use (1 2 840 113549 1 9 16 2 4) instead
+Description = contentHints (1 2 840 113549 1 9 15 5)
+Warning
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 09 0F 06
+Comment = sMIMECapabilities (1 2 840 113549 1 9 15).  Deprecated, use (1 2 840 113549 1 9 16 2 3) instead
+Description = mlExpansionHistory (1 2 840 113549 1 9 15 6)
+Warning
+
+OID = 06 09 2A 86 48 86 F7 0D 01 09 10
+Comment = PKCS #9 (1 2 840 113549 1 9)
+Description = id-sMIME (1 2 840 113549 1 9 16)
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 09 10 00
+Comment = id-sMIME (1 2 840 113549 1 9 16)
+Description = id-mod (1 2 840 113549 1 9 16 0)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 00 01
+Comment = S/MIME Modules (1 2 840 113549 1 9 16 0)
+Description = id-mod-cms (1 2 840 113549 1 9 16 0 1)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 00 02
+Comment = S/MIME Modules (1 2 840 113549 1 9 16 0)
+Description = id-mod-ess (1 2 840 113549 1 9 16 0 2)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 00 03
+Comment = S/MIME Modules (1 2 840 113549 1 9 16 0)
+Description = id-mod-oid (1 2 840 113549 1 9 16 0 3)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 00 04
+Comment = S/MIME Modules (1 2 840 113549 1 9 16 0)
+Description = id-mod-msg-v3 (1 2 840 113549 1 9 16 0 4)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 00 05
+Comment = S/MIME Modules (1 2 840 113549 1 9 16 0)
+Description = id-mod-ets-eSignature-88 (1 2 840 113549 1 9 16 0 5)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 00 06
+Comment = S/MIME Modules (1 2 840 113549 1 9 16 0)
+Description = id-mod-ets-eSignature-97 (1 2 840 113549 1 9 16 0 6)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 00 07
+Comment = S/MIME Modules (1 2 840 113549 1 9 16 0)
+Description = id-mod-ets-eSigPolicy-88 (1 2 840 113549 1 9 16 0 7)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 00 08
+Comment = S/MIME Modules (1 2 840 113549 1 9 16 0)
+Description = id-mod-ets-eSigPolicy-88 (1 2 840 113549 1 9 16 0 8)
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 09 10 01
+Comment = id-sMIME (1 2 840 113549 1 9 16)
+Description = id-ct (1 2 840 113549 1 9 16 1)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 01 01
+Comment = S/MIME Content Types (1 2 840 113549 1 9 16 1)
+Description = id-ct-receipt (1 2 840 113549 1 9 16 1 1)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 01 02
+Comment = S/MIME Content Types (1 2 840 113549 1 9 16 1)
+Description = id-ct-authData (1 2 840 113549 1 9 16 1 2)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 01 03
+Comment = S/MIME Content Types (1 2 840 113549 1 9 16 1)
+Description = id-ct-publishCert (1 2 840 113549 1 9 16 1 3)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 01 04
+Comment = S/MIME Content Types (1 2 840 113549 1 9 16 1)
+Description = id-ct-TSTInfo (1 2 840 113549 1 9 16 1 4)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 01 05
+Comment = S/MIME Content Types (1 2 840 113549 1 9 16 1)
+Description = id-ct-TDTInfo (1 2 840 113549 1 9 16 1 5)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 01 06
+Comment = S/MIME Content Types (1 2 840 113549 1 9 16 1)
+Description = id-ct-contentInfo (1 2 840 113549 1 9 16 1 6)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 01 07
+Comment = S/MIME Content Types (1 2 840 113549 1 9 16 1)
+Description = id-ct-DVCSRequestData (1 2 840 113549 1 9 16 1 7)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 01 08
+Comment = S/MIME Content Types (1 2 840 113549 1 9 16 1)
+Description = id-ct-DVCSResponseData (1 2 840 113549 1 9 16 1 8)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 01 07
+Comment = S/MIME Content Types (1 2 840 113549 1 9 16 1)
+Description = id-ct-compressedData (1 2 840 113549 1 9 16 1 9)
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 09 10 02
+Comment = id-sMIME (1 2 840 113549 1 9 16)
+Description = id-aa (1 2 840 113549 1 9 16 2)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 01
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-receiptRequest (1 2 840 113549 1 9 16 2 1)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 02
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-securityLabel (1 2 840 113549 1 9 16 2 2)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 03
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-mlExpandHistory (1 2 840 113549 1 9 16 2 3)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 04
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-contentHint (1 2 840 113549 1 9 16 2 4)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 05
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-msgSigDigest (1 2 840 113549 1 9 16 2 5)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 06
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2).  Obsolete
+Description = id-aa-encapContentType (1 2 840 113549 1 9 16 2 6)
+Warning
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 07
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-contentIdentifier (1 2 840 113549 1 9 16 2 7)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 08
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2).  Obsolete
+Description = id-aa-macValue (1 2 840 113549 1 9 16 2 8)
+Warning
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 09
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-equivalentLabels (1 2 840 113549 1 9 16 2 9)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 0A
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-contentReference (1 2 840 113549 1 9 16 2 10)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 0B
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-encrypKeyPref (1 2 840 113549 1 9 16 2 11)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 0C
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-signingCertificate (1 2 840 113549 1 9 16 2 12)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 0D
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-smimeEncryptCerts (1 2 840 113549 1 9 16 2 13)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 0E
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-timeStampToken (1 2 840 113549 1 9 16 2 14)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 0F
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-ets-sigPolicyId (1 2 840 113549 1 9 16 2 15)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 10
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-ets-commitmentType (1 2 840 113549 1 9 16 2 16)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 11
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-ets-signerLocation (1 2 840 113549 1 9 16 2 17)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 12
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-ets-signerAttr (1 2 840 113549 1 9 16 2 18)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 13
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-ets-otherSigCert (1 2 840 113549 1 9 16 2 19)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 14
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-ets-contentTimestamp (1 2 840 113549 1 9 16 2 20)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 15
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-ets-CertificateRefs (1 2 840 113549 1 9 16 2 21)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 16
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-ets-RevocationRefs (1 2 840 113549 1 9 16 2 22)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 17
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-ets-certValues (1 2 840 113549 1 9 16 2 23)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 18
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-ets-revocationValues (1 2 840 113549 1 9 16 2 24)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 19
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-ets-escTimeStamp (1 2 840 113549 1 9 16 2 25)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 1A
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-ets-certCRLTimestamp (1 2 840 113549 1 9 16 2 26)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 1B
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-ets-archiveTimeStamp (1 2 840 113549 1 9 16 2 27)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 1C
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-signatureType (1 2 840 113549 1 9 16 2 28)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 02 1D
+Comment = S/MIME Authenticated Attributes (1 2 840 113549 1 9 16 2)
+Description = id-aa-dvcs-dvc (1 2 840 113549 1 9 16 2 29)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 03 01
+Comment = S/MIME Algorithms (1 2 840 113549 1 9 16 3).  Obsolete
+Description = id-alg-ESDHwith3DES (1 2 840 113549 1 9 16 3 1)
+Warning
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 03 02
+Comment = S/MIME Algorithms (1 2 840 113549 1 9 16 3).  Obsolete
+Description = id-alg-ESDHwithRC2 (1 2 840 113549 1 9 16 3 2)
+Warning
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 03 03
+Comment = S/MIME Algorithms (1 2 840 113549 1 9 16 3).  Obsolete
+Description = id-alg-3DESwrap (1 2 840 113549 1 9 16 3 3)
+Warning
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 03 04
+Comment = S/MIME Algorithms (1 2 840 113549 1 9 16 3).  Obsolete
+Description = id-alg-RC2wrap (1 2 840 113549 1 9 16 3 4)
+Warning
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 03 05
+Comment = S/MIME Algorithms (1 2 840 113549 1 9 16 3)
+Description = id-alg-ESDH (1 2 840 113549 1 9 16 3 5)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 03 06
+Comment = S/MIME Algorithms (1 2 840 113549 1 9 16 3)
+Description = id-alg-CMS3DESwrap (1 2 840 113549 1 9 16 3 6)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 03 07
+Comment = S/MIME Algorithms (1 2 840 113549 1 9 16 3)
+Description = id-alg-CMSRC2wrap (1 2 840 113549 1 9 16 3 7)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 03 08
+Comment = S/MIME Algorithms (1 2 840 113549 1 9 16 3)
+Description = id-alg-zlib (1 2 840 113549 1 9 16 3 8)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 04 01
+Comment = S/MIME Certificate Distribution (1 2 840 113549 1 9 16 4)
+Description = id-cd-ldap (1 2 840 113549 1 9 16 4 1)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 05 01
+Comment = S/MIME Signature Policy Qualifier (1 2 840 113549 1 9 16 5)
+Description = id-spq-ets-sqt-uri (1 2 840 113549 1 9 16 5 1)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 05 02
+Comment = S/MIME Signature Policy Qualifier (1 2 840 113549 1 9 16 5)
+Description = id-spq-ets-sqt-unotice (1 2 840 113549 1 9 16 5 2)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 06 01
+Comment = S/MIME Signature Policy Qualifier (1 2 840 113549 1 9 16 6)
+Description = id-cti-ets-proofOfOrigin (1 2 840 113549 1 9 16 6 1)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 06 02
+Comment = S/MIME Signature Policy Qualifier (1 2 840 113549 1 9 16 6)
+Description = id-cti-ets-proofOfReceipt (1 2 840 113549 1 9 16 6 2)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 06 03
+Comment = S/MIME Signature Policy Qualifier (1 2 840 113549 1 9 16 6)
+Description = id-cti-ets-proofOfDelivery (1 2 840 113549 1 9 16 6 3)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 06 04
+Comment = S/MIME Signature Policy Qualifier (1 2 840 113549 1 9 16 6)
+Description = id-cti-ets-proofOfSender (1 2 840 113549 1 9 16 6 4)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 06 05
+Comment = S/MIME Signature Policy Qualifier (1 2 840 113549 1 9 16 6)
+Description = id-cti-ets-proofOfApproval (1 2 840 113549 1 9 16 6 5)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 09 10 06 06
+Comment = S/MIME Signature Policy Qualifier (1 2 840 113549 1 9 16 6)
+Description = id-cti-ets-proofOfCreation (1 2 840 113549 1 9 16 6 6)
+
+# PKCS #9 for use with PKCS #12
+
+OID = 06 09 2A 86 48 86 F7 0D 01 09 14
+Comment = PKCS #9 (1 2 840 113549 1 9)
+Description = friendlyName (for PKCS #12) (1 2 840 113549 1 9 20)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 09 15
+Comment = PKCS #9 (1 2 840 113549 1 9)
+Description = localKeyID (for PKCS #12) (1 2 840 113549 1 9 21)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 09 16
+Comment = PKCS #9 (1 2 840 113549 1 9)
+Description = certTypes (for PKCS #12) (1 2 840 113549 1 9 22)
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 09 16 01
+Comment = PKCS #9 (1 2 840 113549 1 9)
+Description = x509Certificate (for PKCS #12) (1 2 840 113549 1 9 22 1)
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 09 16 02
+Comment = PKCS #9 (1 2 840 113549 1 9)
+Description = sdsiCertificate (for PKCS #12) (1 2 840 113549 1 9 22 2)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 09 17
+Comment = PKCS #9 (1 2 840 113549 1 9)
+Description = crlTypes (for PKCS #12) (1 2 840 113549 1 9 23)
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 09 17 01
+Comment = PKCS #9 (1 2 840 113549 1 9)
+Description = x509Crl (for PKCS #12) (1 2 840 113549 1 9 23 1)
+
+# PKCS #12.  Note that current PKCS #12 implementations tend to be strange and
+# peculiar, with implementors misusing OIDs or basing their work on earlier PFX
+# drafts or defining their own odd OIDs.  In addition the PFX/PKCS #12 spec
+# itself is full of errors and inconsistencies, and a number of OIDs have been
+# redefined in different drafts (often multiple times), which doesn't make the
+# implementors job any easier.
+
+OID = 06 08 2A 86 48 86 F7 0D 01 0C
+Description = pkcs-12 (1 2 840 113549 1 12)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 0C 01
+Comment = This OID was formerly assigned as PKCS #12 modeID
+Description = pkcs-12-PbeIds (1 2 840 113549 1 12 1)
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 0C 01 01
+Comment = PKCS #12 PbeIds (1 2 840 113549 1 12 1). This OID was formerly assigned as pkcs-12-OfflineTransportMode
+Description = pbeWithSHAAnd128BitRC4 (1 2 840 113549 1 12 1 1)
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 0C 01 02
+Comment = PKCS #12 PbeIds (1 2 840 113549 1 12 2). This OID was formerly assigned as pkcs-12-OnlineTransportMode
+Description = pbeWithSHAAnd40BitRC4 (1 2 840 113549 1 12 1 2)
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 0C 01 03
+Comment = PKCS #12 PbeIds (1 2 840 113549 1 12 3)
+Description = pbeWithSHAAnd3-KeyTripleDES-CBC (1 2 840 113549 1 12 1 3)
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 0C 01 04
+Comment = PKCS #12 PbeIds (1 2 840 113549 1 12 3)
+Description = pbeWithSHAAnd2-KeyTripleDES-CBC (1 2 840 113549 1 12 1 4)
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 0C 01 05
+Comment = PKCS #12 PbeIds (1 2 840 113549 1 12 3)
+Description = pbeWithSHAAnd128BitRC2-CBC (1 2 840 113549 1 12 1 5)
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 0C 01 06
+Comment = PKCS #12 PbeIds (1 2 840 113549 1 12 3)
+Description = pbeWithSHAAnd40BitRC2-CBC (1 2 840 113549 1 12 1 6)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 0C 02
+Comment = Deprecated
+Description = pkcs-12-ESPVKID (1 2 840 113549 1 12 2)
+Warning
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 0C 02 01
+Comment = PKCS #12 ESPVKID (1 2 840 113549 1 12 2). Deprecated, use (1 2 840 113549 1 12 3 5) instead
+Description = pkcs-12-PKCS8KeyShrouding (1 2 840 113549 1 12 2 1)
+Warning
+
+# The following appear to have been redefined yet again at 12 10 in the latest
+# PKCS #12 spec.
+OID = 06 09 2A 86 48 86 F7 0D 01 0C 03
+Description = pkcs-12-BagIds (1 2 840 113549 1 12 3)
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 0C 03 01
+Comment = PKCS #12 BagIds (1 2 840 113549 1 12 3)
+Description = pkcs-12-keyBagId (1 2 840 113549 1 12 3 1)
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 0C 03 02
+Comment = PKCS #12 BagIds (1 2 840 113549 1 12 3)
+Description = pkcs-12-certAndCRLBagId (1 2 840 113549 1 12 3 2)
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 0C 03 03
+Comment = PKCS #12 BagIds (1 2 840 113549 1 12 3)
+Description = pkcs-12-secretBagId (1 2 840 113549 1 12 3 3)
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 0C 03 04
+Comment = PKCS #12 BagIds (1 2 840 113549 1 12 3)
+Description = pkcs-12-safeContentsId (1 2 840 113549 1 12 3 4)
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 0C 03 05
+Comment = PKCS #12 BagIds (1 2 840 113549 1 12 3)
+Description = pkcs-12-pkcs-8ShroudedKeyBagId (1 2 840 113549 1 12 3 5)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 0C 04
+Comment = Deprecated
+Description = pkcs-12-CertBagID (1 2 840 113549 1 12 4)
+Warning
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 0C 04 01
+Comment = PKCS #12 CertBagID (1 2 840 113549 1 12 4).  This OID was formerly assigned as pkcs-12-X509CertCRLBag
+Description = pkcs-12-X509CertCRLBagID (1 2 840 113549 1 12 4 1)
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 0C 04 02
+Comment = PKCS #12 CertBagID (1 2 840 113549 1 12 4).  This OID was formerly assigned as pkcs-12-SDSICertBag
+Description = pkcs-12-SDSICertBagID (1 2 840 113549 1 12 4 2)
+
+# The following are from PFX.  The ... 5 1 values have been reassigned to OIDs
+# with incompatible algorithms at ... 1, the 5 2 values seem to have vanished.
+OID = 06 09 2A 86 48 86 F7 0D 01 0C 05
+Description = pkcs-12-OID (1 2 840 113549 1 12 5)
+Warning
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 0C 05 01
+Comment = PKCS #12 OID (1 2 840 113549 1 12 5).  Deprecated, use the partially compatible (1 2 840 113549 1 12 1) OIDs instead
+Description = pkcs-12-PBEID (1 2 840 113549 1 12 5 1)
+Warning
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 0C 05 01 01
+Comment = PKCS #12 OID PBEID (1 2 840 113549 1 12 5 1).  Deprecated, use (1 2 840 113549 1 12 1 1) instead
+Description = pkcs-12-PBEWithSha1And128BitRC4 (1 2 840 113549 1 12 5 1 1)
+Warning
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 0C 05 01 02
+Comment = PKCS #12 OID PBEID (1 2 840 113549 1 12 5 1).  Deprecated, use (1 2 840 113549 1 12 1 2) instead
+Description = pkcs-12-PBEWithSha1And40BitRC4 (1 2 840 113549 1 12 5 1 2)
+Warning
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 0C 05 01 03
+Comment = PKCS #12 OID PBEID (1 2 840 113549 1 12 5 1).  Deprecated, use the incompatible but similar (1 2 840 113549 1 12 1 3) or (1 2 840 113549 1 12 1 4) instead
+Description = pkcs-12-PBEWithSha1AndTripleDESCBC (1 2 840 113549 1 12 5 1 3)
+Warning
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 0C 05 01 04
+Comment = PKCS #12 OID PBEID (1 2 840 113549 1 12 5 1).  Deprecated, use (1 2 840 113549 1 12 1 5) instead
+Description = pkcs-12-PBEWithSha1And128BitRC2CBC (1 2 840 113549 1 12 5 1 4)
+Warning
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 0C 05 01 05
+Comment = PKCS #12 OID PBEID (1 2 840 113549 1 12 5 1).  Deprecated, use (1 2 840 113549 1 12 1 6) instead
+Description = pkcs-12-PBEWithSha1And40BitRC2CBC (1 2 840 113549 1 12 5 1 5)
+Warning
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 0C 05 01 06
+Comment = PKCS #12 OID PBEID (1 2 840 113549 1 12 5 1).  Deprecated, use the incompatible but similar (1 2 840 113549 1 12 1 1) or (1 2 840 113549 1 12 1 2) instead
+Description = pkcs-12-PBEWithSha1AndRC4 (1 2 840 113549 1 12 5 1 6)
+Warning
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 0C 05 01 07
+Comment = PKCS #12 OID PBEID (1 2 840 113549 1 12 5 1).  Deprecated, use the incompatible but similar (1 2 840 113549 1 12 1 5) or (1 2 840 113549 1 12 1 6) instead
+Description = pkcs-12-PBEWithSha1AndRC2CBC (1 2 840 113549 1 12 5 1 7)
+Warning
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 0C 05 02
+Description = pkcs-12-EnvelopingID (1 2 840 113549 1 12 5 2).  Deprecated, use the conventional PKCS #1 OIDs instead
+Warning
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 0C 05 02 01
+Comment = PKCS #12 OID EnvelopingID (1 2 840 113549 1 12 5 2).  Deprecated, use the conventional PKCS #1 OIDs instead
+Description = pkcs-12-RSAEncryptionWith128BitRC4 (1 2 840 113549 1 12 5 2 1)
+Warning
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 0C 05 02 02
+Comment = PKCS #12 OID EnvelopingID (1 2 840 113549 1 12 5 2).  Deprecated, use the conventional PKCS #1 OIDs instead
+Description = pkcs-12-RSAEncryptionWith40BitRC4 (1 2 840 113549 1 12 5 2 2)
+Warning
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 0C 05 02 03
+Comment = PKCS #12 OID EnvelopingID (1 2 840 113549 1 12 5 2).  Deprecated, use the conventional PKCS #1 OIDs instead
+Description = pkcs-12-RSAEncryptionWithTripleDES (1 2 840 113549 1 12 5 2 3)
+Warning
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 0C 05 03
+Description = pkcs-12-SignatureID (1 2 840 113549 1 12 5 3).  Deprecated, use the conventional PKCS #1 OIDs instead
+Warning
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 0C 05 03 01
+Comment = PKCS #12 OID SignatureID (1 2 840 113549 1 12 5 3).  Deprecated, use the conventional PKCS #1 OIDs instead
+Description = pkcs-12-RSASignatureWithSHA1Digest (1 2 840 113549 1 12 5 3 1)
+Warning
+
+# Yet *another* redefinition of the PKCS #12 "bag" ID's, now in a different
+# order than the last redefinition at ... 12 3.
+OID = 06 09 2A 86 48 86 F7 0D 01 0C 0A
+Description = pkcs-12Version1 (1 2 840 113549 1 12 10)
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 0C 0A 01
+Description = pkcs-12BadIds (1 2 840 113549 1 12 10 1)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 0C 0A 01 01
+Comment = PKCS #12 BagIds (1 2 840 113549 1 12 10 1)
+Description = pkcs-12-keyBag (1 2 840 113549 1 12 10 1 1)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 0C 0A 01 02
+Comment = PKCS #12 BagIds (1 2 840 113549 1 12 10 1)
+Description = pkcs-12-pkcs-8ShroudedKeyBag (1 2 840 113549 1 12 10 1 2)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 0C 0A 01 03
+Comment = PKCS #12 BagIds (1 2 840 113549 1 12 10 1)
+Description = pkcs-12-certBag (1 2 840 113549 1 12 10 1 3)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 0C 0A 01 04
+Comment = PKCS #12 BagIds (1 2 840 113549 1 12 10 1)
+Description = pkcs-12-crlBag (1 2 840 113549 1 12 10 1 4)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 0C 0A 01 05
+Comment = PKCS #12 BagIds (1 2 840 113549 1 12 10 1)
+Description = pkcs-12-secretBag (1 2 840 113549 1 12 10 1 5)
+
+OID = 06 0B 2A 86 48 86 F7 0D 01 0C 0A 01 06
+Comment = PKCS #12 BagIds (1 2 840 113549 1 12 10 1)
+Description = pkcs-12-safeContentsBag (1 2 840 113549 1 12 10 1 6)
+
+# PKCS #15
+
+OID = 06 09 2A 86 48 86 F7 0D 01 0F 01
+Comment = PKCS #15
+Description = pkcs15modules (1 2 840 113549 1 15 1)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 0F 02
+Comment = PKCS #15
+Description = pkcs15attributes (1 2 840 113549 1 15 2)
+
+OID = 06 09 2A 86 48 86 F7 0D 01 0F 03
+Comment = PKCS #15
+Description = pkcs15contentType (1 2 840 113549 1 15 3)
+
+OID = 06 0A 2A 86 48 86 F7 0D 01 0F 03 01
+Comment = PKCS #15 content type
+Description = pkcs15content (1 2 840 113549 1 15 3 1)
+
+# RSADSI digest algorithms
+
+OID = 06 08 2A 86 48 86 F7 0D 02
+Description = digestAlgorithm (1 2 840 113549 2)
+
+OID = 06 08 2A 86 48 86 F7 0D 02 02
+Comment = RSADSI digestAlgorithm (1 2 840 113549 2)
+Description = md2 (1 2 840 113549 2 2)
+
+OID = 06 08 2A 86 48 86 F7 0D 02 04
+Comment = RSADSI digestAlgorithm (1 2 840 113549 2)
+Description = md4 (1 2 840 113549 2 4)
+
+OID = 06 08 2A 86 48 86 F7 0D 02 05
+Comment = RSADSI digestAlgorithm (1 2 840 113549 2)
+Description = md5 (1 2 840 113549 2 5)
+
+# RSADSI encryption algorithms
+
+OID = 06 08 2A 86 48 86 F7 0D 03
+Description = encryptionAlgorithm (1 2 840 113549 3)
+
+OID = 06 08 2A 86 48 86 F7 0D 03 02
+Comment = RSADSI encryptionAlgorithm (1 2 840 113549 3)
+Description = rc2CBC (1 2 840 113549 3 2)
+
+OID = 06 08 2A 86 48 86 F7 0D 03 03
+Comment = RSADSI encryptionAlgorithm (1 2 840 113549 3)
+Description = rc2ECB (1 2 840 113549 3 3)
+
+OID = 06 08 2A 86 48 86 F7 0D 03 04
+Comment = RSADSI encryptionAlgorithm (1 2 840 113549 3)
+Description = rc4 (1 2 840 113549 3 4)
+
+OID = 06 08 2A 86 48 86 F7 0D 03 05
+Comment = RSADSI encryptionAlgorithm (1 2 840 113549 3)
+Description = rc4WithMAC (1 2 840 113549 3 5)
+
+OID = 06 08 2A 86 48 86 F7 0D 03 06
+Comment = RSADSI encryptionAlgorithm (1 2 840 113549 3)
+Description = desx-CBC (1 2 840 113549 3 6)
+
+OID = 06 08 2A 86 48 86 F7 0D 03 07
+Comment = RSADSI encryptionAlgorithm (1 2 840 113549 3)
+Description = des-EDE3-CBC (1 2 840 113549 3 7)
+
+OID = 06 08 2A 86 48 86 F7 0D 03 08
+Comment = RSADSI encryptionAlgorithm (1 2 840 113549 3)
+Description = rc5CBC (1 2 840 113549 3 8)
+
+OID = 06 08 2A 86 48 86 F7 0D 03 09
+Comment = RSADSI encryptionAlgorithm (1 2 840 113549 3)
+Description = rc5-CBCPad (1 2 840 113549 3 9)
+
+OID = 06 08 2A 86 48 86 F7 0D 03 0A
+Comment = RSADSI encryptionAlgorithm (1 2 840 113549 3).  Formerly called CDMFCBCPad
+Description = desCDMF (1 2 840 113549 3 10)
+
+# Ascom Systech
+
+OID = 06 0A 2B 06 01 04 01 81 3C 07 01 01
+Comment = Ascom Systech
+Description = ascom (1 3 6 1 4 1 188 7 1 1)
+
+OID = 06 0B 2B 06 01 04 01 81 3C 07 01 01 01
+Comment = Ascom Systech
+Description = ideaECB (1 3 6 1 4 1 188 7 1 1 1)
+
+OID = 06 0B 2B 06 01 04 01 81 3C 07 01 01 02
+Comment = Ascom Systech
+Description = ideaCBC (1 3 6 1 4 1 188 7 1 1 2)
+
+OID = 06 0B 2B 06 01 04 01 81 3C 07 01 01 03
+Comment = Ascom Systech
+Description = ideaCFB (1 3 6 1 4 1 188 7 1 1 3)
+
+OID = 06 0B 2B 06 01 04 01 81 3C 07 01 01 04
+Comment = Ascom Systech
+Description = ideaOFB (1 3 6 1 4 1 188 7 1 1 4)
+
+# Microsoft
+
+OID = 06 09 2A 86 48 86 F7 14 01 03 00
+Comment = Microsoft Exchange Server - object class
+Description = site-Addressing (1 2 840 113556 1 3 00)
+
+OID = 06 09 2A 86 48 86 F7 14 01 03 0D
+Comment = Microsoft Exchange Server - object class
+Description = classSchema (1 2 840 113556 1 3 13)
+
+OID = 06 09 2A 86 48 86 F7 14 01 03 0E
+Comment = Microsoft Exchange Server - object class
+Description = attributeSchema (1 2 840 113556 1 3 14)
+
+OID = 06 09 2A 86 48 86 F7 14 01 03 11
+Comment = Microsoft Exchange Server - object class
+Description = mailbox-Agent (1 2 840 113556 1 3 174)
+
+OID = 06 09 2A 86 48 86 F7 14 01 03 16
+Comment = Microsoft Exchange Server - object class
+Description = mailbox (1 2 840 113556 1 3 22)
+
+OID = 06 09 2A 86 48 86 F7 14 01 03 17
+Comment = Microsoft Exchange Server - object class
+Description = container (1 2 840 113556 1 3 23)
+
+OID = 06 09 2A 86 48 86 F7 14 01 03 2E
+Comment = Microsoft Exchange Server - object class
+Description = mailRecipient (1 2 840 113556 1 3 46)
+
+OID = 06 09 2A 86 48 86 F7 14 01 02 81 71
+Comment = Microsoft Exchange Server - attribute
+Description = deliveryMechanism (1 2 840 113556 1 2 241)
+
+OID = 06 08 2A 86 48 86 F7 14 04 03
+Comment = Microsoft
+Description = microsoftExcel (1 2 840 113556 4 3)
+
+OID = 06 08 2A 86 48 86 F7 14 04 04
+Comment = Microsoft
+Description = titledWithOID (1 2 840 113556 4 4)
+
+OID = 06 08 2A 86 48 86 F7 14 04 05
+Comment = Microsoft
+Description = microsoftPowerPoint (1 2 840 113556 4 5)
+
+OID = 06 0A 2B 06 01 04 01 82 37 02 01 04
+Comment = Microsoft code signing
+Description = spcIndirectDataContext (1 3 6 1 4 1 311 2 1 4)
+
+OID = 06 0A 2B 06 01 04 01 82 37 02 01 0A
+Comment = Microsoft code signing.  Also known as policyLink
+Description = spcAgencyInfo (1 3 6 1 4 1 311 2 1 10)
+
+OID = 06 0A 2B 06 01 04 01 82 37 02 01 0B
+Comment = Microsoft code signing
+Description = spcStatementType (1 3 6 1 4 1 311 2 1 11)
+
+OID = 06 0A 2B 06 01 04 01 82 37 02 01 0C
+Comment = Microsoft code signing
+Description = spcSpOpusInfo (1 3 6 1 4 1 311 2 1 12)
+
+OID = 06 0A 2B 06 01 04 01 82 37 02 01 0E
+Comment = Microsoft
+Description = certReqExtensions (1 3 6 1 4 1 311 2 1 14)
+
+OID = 06 0A 2B 06 01 04 01 82 37 02 01 0F
+Comment = Microsoft code signing
+Description = spcPelmageData (1 3 6 1 4 1 311 2 1 15)
+
+OID = 06 0A 2B 06 01 04 01 82 37 02 01 14
+Comment = Microsoft code signing.  Also known as "glue extension"
+Description = spcLink (type 1) (1 3 6 1 4 1 311 2 1 20)
+
+OID = 06 0A 2B 06 01 04 01 82 37 02 01 15
+Comment = Microsoft
+Description = individualCodeSigning (1 3 6 1 4 1 311 2 1 21)
+
+OID = 06 0A 2B 06 01 04 01 82 37 02 01 16
+Comment = Microsoft
+Description = commercialCodeSigning (1 3 6 1 4 1 311 2 1 22)
+
+OID = 06 0A 2B 06 01 04 01 82 37 02 01 19
+Comment = Microsoft code signing.  Also known as "glue extension"
+Description = spcLink (type 2) (1 3 6 1 4 1 311 2 1 25)
+
+OID = 06 0A 2B 06 01 04 01 82 37 02 01 1A
+Comment = Microsoft code signing
+Description = spcMinimalCriteriaInfo (1 3 6 1 4 1 311 2 1 26)
+
+OID = 06 0A 2B 06 01 04 01 82 37 02 01 1B
+Comment = Microsoft code signing
+Description = spcFinancialCriteriaInfo (1 3 6 1 4 1 311 2 1 27)
+
+OID = 06 0A 2B 06 01 04 01 82 37 02 01 1C
+Comment = Microsoft code signing.  Also known as "glue extension"
+Description = spcLink (type 3) (1 3 6 1 4 1 311 2 1 28)
+
+OID = 06 0A 2B 06 01 04 01 82 37 03 02 01
+Comment = Microsoft code signing
+Description = timestampCountersignature (1 3 6 1 4 1 311 3 2 1)
+
+OID = 06 0A 2B 06 01 04 01 82 37 0A 01
+Comment = Microsoft PKCS #7 contentType
+Description = certTrustList (1 3 6 1 4 1 311 10 1)
+
+OID = 06 0A 2B 06 01 04 01 82 37 0A 02
+Comment = Microsoft
+Description = nextUpdateLocation (1 3 6 1 4 1 311 10 2)
+
+OID = 06 0A 2B 06 01 04 01 82 37 0A 03 01
+Comment = Microsoft enhanced key usage
+Description = certTrustListSigning (1 3 6 1 4 1 311 10 3 1)
+
+OID = 06 0A 2B 06 01 04 01 82 37 0A 03 02
+Comment = Microsoft enhanced key usage
+Description = timeStampSigning (1 3 6 1 4 1 311 10 3 2)
+
+OID = 06 0A 2B 06 01 04 01 82 37 0A 03 03
+Comment = Microsoft enhanced key usage
+Description = serverGatedCrypto (1 3 6 1 4 1 311 10 3 3)
+
+OID = 06 0A 2B 06 01 04 01 82 37 0A 03 04
+Comment = Microsoft enhanced key usage
+Description = encryptedFileSystem (1 3 6 1 4 1 311 10 3 4)
+
+OID = 06 0A 2B 06 01 04 01 82 37 0A 04 01
+Comment = Microsoft attribute
+Description = yesnoTrustAttr (1 3 6 1 4 1 311 10 4 1)
+
+# Something related to CAPI, contains a BMPString describing the CAPI level and
+# a BIT STRING blob
+OID = 06 0A 2B 06 01 04 01 82 37 0D 02 02
+Comment = Microsoft attribute
+Description = Unknown MS CryptoAPI-related extension (1 3 6 1 4 1 311 13 2 2)
+
+# This is just the normal issuerAndSerialNumber but with a MS-specific OID.
+# Apparently it's used for CryptEncode/DecodeObject, whatever that is.
+OID = 06 0A 2B 06 01 04 01 82 37 10 04
+Comment = Microsoft attribute
+Description = microsoftRecipientInfo (1 3 6 1 4 1 311 16 4)
+
+# Win2K CA certificate key/cert counter, high 16 bits = key index, low 16 bits
+# = cert index.  Key index is inc'd when a CA gets a new key, cert index is
+# inc'd when a CA gets a new cert (ie recertifies a current key).  This
+# extension has two purposes, as a hint to rebuild key/cert lists when a Win2K
+# CA is restored, and as a poster boy for the kind of crap which people are
+# shovelling into certs which has no place there
+OID = 06 09 2B 06 01 04 01 82 37 15 01
+Comment = Microsoft attribute
+Description = cAKeyCertIndexPair (1 3 6 1 4 1 311 21 1)
+
+# UNINETT
+
+OID = 06 0A 2B 06 01 04 01 92 7C 0A 01 01
+Comment = UNINETT PCA
+Description = UNINETT policyIdentifier (1 3 6 1 4 1 2428 10 1 1)
+
+# ICE-TEL
+
+OID = 06 08 2B 06 01 04 01 95 18 0A
+Comment = ICE-TEL CA
+Description = ICE-TEL policyIdentifier (1 3 6 1 4 1 2712 10)
+
+OID = 06 0A 2B 06 01 04 01 95 62 01 01 01
+Comment = ICE-TEL CA policy
+Description = ICE-TEL Italian policyIdentifier (1 3 6 1 4 1 2786 1 1 1)
+
+# cryptlib
+
+OID = 06 0A 2B 06 01 04 01 97 55 01 01 01
+Comment = cryptlib encryption algorithm
+Description = blowfishECB (1 3 6 1 4 1 3029 1 1 1)
+
+OID = 06 0A 2B 06 01 04 01 97 55 01 01 02
+Comment = cryptlib encryption algorithm
+Description = blowfishCBC (1 3 6 1 4 1 3029 1 1 2)
+
+OID = 06 0A 2B 06 01 04 01 97 55 01 01 03
+Comment = cryptlib encryption algorithm
+Description = blowfishCFB (1 3 6 1 4 1 3029 1 1 3)
+
+OID = 06 0A 2B 06 01 04 01 97 55 01 01 04
+Comment = cryptlib encryption algorithm
+Description = blowfishOFB (1 3 6 1 4 1 3029 1 1 4)
+
+OID = 06 0A 2B 06 01 04 01 97 55 01 02 01
+Comment = cryptlib public-key algorithm
+Description = elgamal (1 3 6 1 4 1 3029 1 2 1)
+
+OID = 06 0B 2B 06 01 04 01 97 55 01 02 01 01
+Comment = cryptlib public-key algorithm
+Description = elgamalWithSHA-1 (1 3 6 1 4 1 3029 1 2 1 1)
+
+OID = 06 0B 2B 06 01 04 01 97 55 01 02 01 02
+Comment = cryptlib public-key algorithm
+Description = elgamalWithRIPEMD-160 (1 3 6 1 4 1 3029 1 2 1 2)
+
+OID = 06 09 2B 06 01 04 01 97 55 04 01
+Comment = cryptlib
+Description = cryptlibContent (1 3 6 1 4 1 3029 4 1)
+
+OID = 06 0A 2B 06 01 04 01 97 55 04 01 01
+Comment = cryptlib content type
+Description = cryptlibConfigData (1 3 6 1 4 1 3029 4 1 1)
+
+OID = 06 0A 2B 06 01 04 01 97 55 04 01 02
+Comment = cryptlib content type
+Description = cryptlibUserIndex (1 3 6 1 4 1 3029 4 1 2)
+
+OID = 06 0A 2B 06 01 04 01 97 55 04 01 03
+Comment = cryptlib content type
+Description = cryptlibUserInfo (1 3 6 1 4 1 3029 4 1 3)
+
+OID = 06 0B 2B 06 01 04 01 97 55 2A D7 24 01
+Comment = cryptlib special MPEG-of-cat OID
+Description = mpeg-1 (1 3 6 1 4 1 3029 42 11172 1)
+
+# PKIX
+
+OID = 06 06 2B 06 01 05 05 07
+Description = pkix (1 3 6 1 5 5 7)
+
+OID = 06 06 2B 06 01 05 05 07
+Comment = PKIX
+Description = attributeCert (1 3 6 1 5 5 7 0 12)
+
+OID = 06 07 2B 06 01 05 05 07 01
+Comment = PKIX
+Description = privateExtension (1 3 6 1 5 5 7 1)
+
+OID = 06 08 2B 06 01 05 05 07 01 01
+Comment = PKIX private extension
+Description = authorityInfoAccess (1 3 6 1 5 5 7 1 1)
+
+OID = 06 08 2B 06 01 05 05 07 01 04
+Comment = PKIX private extension
+Description = acAuditIdentity (1 3 6 1 5 5 7 1 4)
+
+OID = 06 08 2B 06 01 05 05 07 01 05
+Comment = PKIX private extension
+Description = acTargeting (1 3 6 1 5 5 7 1 5)
+
+OID = 06 08 2B 06 01 05 05 07 01 06
+Comment = PKIX private extension
+Description = acAaControls (1 3 6 1 5 5 7 1 6)
+
+OID = 06 08 2B 06 01 05 05 07 01 07
+Comment = PKIX private extension
+Description = acProxying (1 3 6 1 5 5 7 1 7)
+
+OID = 06 07 2B 06 01 05 05 07 02
+Comment = PKIX
+Description = policyQualifierIds (1 3 6 1 5 5 7 2)
+
+OID = 06 08 2B 06 01 05 05 07 02 01
+Comment = PKIX policy qualifier
+Description = cps (1 3 6 1 5 5 7 2 1)
+
+OID = 06 08 2B 06 01 05 05 07 02 02
+Comment = PKIX policy qualifier
+Description = unotice (1 3 6 1 5 5 7 2 2)
+
+OID = 06 07 2B 06 01 05 05 07 03
+Comment = PKIX
+Description = keyPurpose (1 3 6 1 5 5 7 3)
+
+OID = 06 08 2B 06 01 05 05 07 03 01
+Comment = PKIX key purpose
+Description = serverAuth (1 3 6 1 5 5 7 3 1)
+
+OID = 06 08 2B 06 01 05 05 07 03 02
+Comment = PKIX key purpose
+Description = clientAuth (1 3 6 1 5 5 7 3 2)
+
+OID = 06 08 2B 06 01 05 05 07 03 03
+Comment = PKIX key purpose
+Description = codeSigning (1 3 6 1 5 5 7 3 3)
+
+OID = 06 08 2B 06 01 05 05 07 03 04
+Comment = PKIX key purpose
+Description = emailProtection (1 3 6 1 5 5 7 3 4)
+
+OID = 06 08 2B 06 01 05 05 07 03 05
+Comment = PKIX key purpose
+Description = ipsecEndSystem (1 3 6 1 5 5 7 3 5)
+
+OID = 06 08 2B 06 01 05 05 07 03 06
+Comment = PKIX key purpose
+Description = ipsecTunnel (1 3 6 1 5 5 7 3 6)
+
+OID = 06 08 2B 06 01 05 05 07 03 07
+Comment = PKIX key purpose
+Description = ipsecUser (1 3 6 1 5 5 7 3 7)
+
+OID = 06 08 2B 06 01 05 05 07 03 08
+Comment = PKIX key purpose
+Description = timeStamping (1 3 6 1 5 5 7 3 8)
+
+OID = 06 08 2B 06 01 05 05 07 03 09
+Comment = PKIX key purpose
+Description = ocspSigning (1 3 6 1 5 5 7 3 9)
+
+OID = 06 07 2B 06 01 05 05 07 04
+Comment = PKIX
+Description = cmpInformationTypes (1 3 6 1 5 5 7 4)
+
+OID = 06 08 2B 06 01 05 05 07 04 01
+Comment = PKIX CMP information
+Description = caProtEncCert (1 3 6 1 5 5 7 4 1)
+
+OID = 06 08 2B 06 01 05 05 07 04 02
+Comment = PKIX CMP information
+Description = signKeyPairTypes (1 3 6 1 5 5 7 4 2)
+
+OID = 06 08 2B 06 01 05 05 07 04 03
+Comment = PKIX CMP information
+Description = encKeyPairTypes (1 3 6 1 5 5 7 4 3)
+
+OID = 06 08 2B 06 01 05 05 07 04 04
+Comment = PKIX CMP information
+Description = preferredSymmAlg (1 3 6 1 5 5 7 4 4)
+
+OID = 06 08 2B 06 01 05 05 07 04 05
+Comment = PKIX CMP information
+Description = caKeyUpdateInfo (1 3 6 1 5 5 7 4 5)
+
+OID = 06 08 2B 06 01 05 05 07 04 06
+Comment = PKIX CMP information
+Description = currentCRL (1 3 6 1 5 5 7 4 6)
+
+OID = 06 08 2B 06 01 05 05 07 04 07
+Comment = PKIX CMP information
+Description = unsupportedOIDs (1 3 6 1 5 5 7 4 7)
+
+OID = 06 08 2B 06 01 05 05 07 04 0A
+Comment = PKIX CMP information
+Description = keyPairParamReq (1 3 6 1 5 5 7 4 10)
+
+OID = 06 08 2B 06 01 05 05 07 04 0B
+Comment = PKIX CMP information
+Description = keyPairParamRep (1 3 6 1 5 5 7 4 11)
+
+OID = 06 08 2B 06 01 05 05 07 04 0C
+Comment = PKIX CMP information
+Description = revPassphrase (1 3 6 1 5 5 7 4 12)
+
+OID = 06 08 2B 06 01 05 05 07 04 0D
+Comment = PKIX CMP information
+Description = implicitConfirm (1 3 6 1 5 5 7 4 13)
+
+OID = 06 08 2B 06 01 05 05 07 04 0E
+Comment = PKIX CMP information
+Description = confirmWaitTime (1 3 6 1 5 5 7 4 14)
+
+OID = 06 08 2B 06 01 05 05 07 04 0F
+Comment = PKIX CMP information
+Description = origPKIMessage (1 3 6 1 5 5 7 4 15)
+
+OID = 06 08 2B 06 01 05 05 07 06 03
+Comment = PKIX algorithm
+Description = dh-sig-hmac-sha1 (1 3 6 1 5 5 7 6 3)
+
+OID = 06 08 2B 06 01 05 05 07 06 04
+Comment = PKIX algorithm
+Description = dh-pop (1 3 6 1 5 5 7 6 4)
+
+# Attribute certificates
+
+OID = 06 08 2B 06 01 05 05 07 0A 01
+Comment = PKIX attribute certificate extension
+Description = authenticationInfo (1 3 6 1 5 5 7 10 1)
+
+OID = 06 08 2B 06 01 05 05 07 0A 02
+Comment = PKIX attribute certificate extension
+Description = accessIdentity (1 3 6 1 5 5 7 10 2)
+
+OID = 06 08 2B 06 01 05 05 07 0A 03
+Comment = PKIX attribute certificate extension
+Description = chargingIdentity (1 3 6 1 5 5 7 10 3)
+
+OID = 06 08 2B 06 01 05 05 07 0A 04
+Comment = PKIX attribute certificate extension
+Description = group (1 3 6 1 5 5 7 10 4)
+
+OID = 06 08 2B 06 01 05 05 07 0A 06
+Comment = PKIX attribute certificate extension
+Description = encAttrs (1 3 6 1 5 5 7 10 6)
+
+# OCSP
+
+OID = 06 08 2B 06 01 05 05 07 30 01
+Comment = PKIX
+Description = ocsp (1 3 6 1 5 5 7 48 1)
+
+OID = 06 09 2B 06 01 05 05 07 30 01 01
+Comment = OCSP
+Description = ocspBasic (1 3 6 1 5 5 7 48 1 1)
+
+OID = 06 09 2B 06 01 05 05 07 30 01 02
+Comment = OCSP
+Description = ocspNonce (1 3 6 1 5 5 7 48 1 2)
+
+OID = 06 09 2B 06 01 05 05 07 30 01 03
+Comment = OCSP
+Description = ocspCRL (1 3 6 1 5 5 7 48 1 3)
+
+OID = 06 09 2B 06 01 05 05 07 30 01 04
+Comment = OCSP
+Description = ocspResponse (1 3 6 1 5 5 7 48 1 4)
+
+OID = 06 09 2B 06 01 05 05 07 30 01 05
+Comment = OCSP
+Description = ocspNoCheck (1 3 6 1 5 5 7 48 1 5)
+
+OID = 06 09 2B 06 01 05 05 07 30 01 06
+Comment = OCSP
+Description = ocspArchiveCutoff (1 3 6 1 5 5 7 48 1 6)
+
+OID = 06 09 2B 06 01 05 05 07 30 01 07
+Comment = OCSP
+Description = ocspServiceLocator (1 3 6 1 5 5 7 48 1 7)
+
+# Some PKIX usage
+
+OID = 06 08 2B 06 01 05 05 07 30 02
+Comment = PKIX authority info access descriptor
+Description = caIssuers (1 3 6 1 5 5 7 48 2)
+
+# ISAKMP
+
+OID = 06 08 2B 06 01 05 05 08 01 01
+Comment = ISAKMP HMAC algorithm
+Description = hmacMD5 (1 3 6 1 5 5 8 1 1)
+
+OID = 06 08 2B 06 01 05 05 08 01 02
+Comment = ISAKMP HMAC algorithm
+Description = hmacSHA (1 3 6 1 5 5 8 1 2)
+
+OID = 06 08 2B 06 01 05 05 08 01 03
+Comment = ISAKMP HMAC algorithm
+Description = hmacTiger (1 3 6 1 5 5 8 1 3)
+
+OID = 06 08 2B 06 01 05 05 08 02 02
+Comment = IKE ???
+Description = iKEIntermediate (1 3 6 1 5 5 8 2 2)
+
+# DEC (via ECMA)
+
+OID = 06 07 2B 0C 02 87 73 07 01
+Comment = DASS algorithm
+Description = decEncryptionAlgorithm (1 3 12 2 1011 7 1)
+
+OID = 06 08 2B 0C 02 87 73 07 01 02
+Comment = DASS encryption algorithm
+Description = decDEA (1 3 12 2 1011 7 1 2)
+
+OID = 06 07 2B 0C 02 87 73 07 02
+Comment = DASS algorithm
+Description = decHashAlgorithm (1 3 12 2 1011 7 2)
+
+OID = 06 07 2B 0C 02 87 73 07 02 01
+Comment = DASS hash algorithm
+Description = decMD2 (1 3 12 2 1011 7 2 1)
+
+OID = 06 07 2B 0C 02 87 73 07 02 02
+Comment = DASS hash algorithm
+Description = decMD4 (1 3 12 2 1011 7 2 2)
+
+OID = 06 07 2B 0C 02 87 73 07 03
+Comment = DASS algorithm
+Description = decSignatureAlgorithm (1 3 12 2 1011 7 3)
+
+OID = 06 07 2B 0C 02 87 73 07 03 01
+Comment = DASS signature algorithm
+Description = decMD2withRSA (1 3 12 2 1011 7 3 1)
+
+OID = 06 07 2B 0C 02 87 73 07 03 02
+Comment = DASS signature algorithm
+Description = decMD4withRSA (1 3 12 2 1011 7 3 2)
+
+OID = 06 07 2B 0C 02 87 73 07 03 03
+Comment = DASS signature algorithm
+Description = decDEAMAC (1 3 12 2 1011 7 3 3)
+
+# NIST Open Systems Environment (OSE) Implementor's Workshop (OIW),
+# specialising in oddball and partially-defunct OIDs
+
+OID = 06 05 2B 0E 02 1A 05
+Comment = Unsure about this OID
+Description = sha (1 3 14 2 26 5)
+
+OID = 06 06 2B 0E 03 02 01 01
+Comment = X.509.  Unsure about this OID
+Description = rsa (1 3 14 3 2 1 1)
+
+OID = 06 05 2B 0E 03 02 02
+Comment = Oddball OIW OID
+Description = md4WitRSA (1 3 14 3 2 2)
+
+OID = 06 05 2B 0E 03 02 03
+Comment = Oddball OIW OID
+Description = md5WithRSA (1 3 14 3 2 3)
+
+OID = 06 05 2B 0E 03 02 04
+Comment = Oddball OIW OID
+Description = md4WithRSAEncryption (1 3 14 3 2 4)
+
+OID = 06 06 2B 0E 03 02 02 01
+Comment = X.509.  Deprecated
+Description = sqmod-N (1 3 14 3 2 2 1)
+Warning
+
+OID = 06 06 2B 0E 03 02 03 01
+Comment = X.509.  Deprecated
+Description = sqmod-NwithRSA (1 3 14 3 2 3 1)
+Warning
+
+OID = 06 05 2B 0E 03 02 06
+Description = desECB (1 3 14 3 2 6)
+
+OID = 06 05 2B 0E 03 02 07
+Description = desCBC (1 3 14 3 2 7)
+
+OID = 06 05 2B 0E 03 02 08
+Description = desOFB (1 3 14 3 2 8)
+
+OID = 06 05 2B 0E 03 02 09
+Description = desCFB (1 3 14 3 2 9)
+
+OID = 06 05 2B 0E 03 02 0A
+Description = desMAC (1 3 14 3 2 10)
+
+OID = 06 05 2B 0E 03 02 0B
+Comment = ISO 9796-2, also X9.31 Part 1
+Description = rsaSignature (1 3 14 3 2 11)
+
+OID = 06 05 2B 0E 03 02 0C
+Comment = OIW?, supposedly from an incomplete version of SDN.701 (doesn't match final SDN.701)
+Description = dsa (1 3 14 3 2 12)
+Warning
+
+OID = 06 05 2B 0E 03 02 0D
+Comment = Oddball OIW OID.  Incorrectly used by JDK 1.1 in place of (1 3 14 3 2 27)
+# Their response was that they know it's wrong, but noone uses SHA0 so it won't
+# cause any problems, right?
+Description = dsaWithSHA (1 3 14 3 2 13)
+Warning
+
+# The various md<x>WithRSASIsignature OIDs are for the ANSI X9.31 draft and use
+# ISO 9796-2 padding rules.  This work was derailed during the PKP brouhaha and
+# is still in progress
+OID = 06 05 2B 0E 03 02 0E
+Comment = Oddball OIW OID using 9796-2 padding rules
+Description = mdc2WithRSASignature (1 3 14 3 2 14)
+
+OID = 06 05 2B 0E 03 02 0F
+Comment = Oddball OIW OID using 9796-2 padding rules
+Description = shaWithRSASignature (1 3 14 3 2 15)
+
+OID = 06 05 2B 0E 03 02 10
+Comment = Oddball OIW OID.  Deprecated, use a plain DH OID instead
+Description = dhWithCommonModulus (1 3 14 3 2 16)
+Warning
+
+OID = 06 05 2B 0E 03 02 11
+Comment = Oddball OIW OID.  Mode is ECB
+Description = desEDE (1 3 14 3 2 17)
+
+OID = 06 05 2B 0E 03 02 12
+Comment = Oddball OIW OID
+Description = sha (1 3 14 3 2 18)
+
+OID = 06 05 2B 0E 03 02 13
+Comment = Oddball OIW OID, DES-based hash, planned for X9.31 Part 2
+Description = mdc-2 (1 3 14 3 2 19)
+
+OID = 06 05 2B 0E 03 02 14
+Comment = Oddball OIW OID.  Deprecated, use a plain DSA OID instead
+Description = dsaCommon (1 3 14 3 2 20)
+Warning
+
+OID = 06 05 2B 0E 03 02 15
+Comment = Oddball OIW OID.  Deprecated, use a plain dsaWithSHA OID instead
+Description = dsaCommonWithSHA (1 3 14 3 2 21)
+Warning
+
+OID = 06 05 2B 0E 03 02 16
+Comment = Oddball OIW OID
+Description = rsaKeyTransport (1 3 14 3 2 22)
+
+OID = 06 05 2B 0E 03 02 17
+Comment = Oddball OIW OID
+Description = keyed-hash-seal (1 3 14 3 2 23)
+
+OID = 06 05 2B 0E 03 02 18
+Comment = Oddball OIW OID using 9796-2 padding rules
+Description = md2WithRSASignature (1 3 14 3 2 24)
+
+OID = 06 05 2B 0E 03 02 19
+Comment = Oddball OIW OID using 9796-2 padding rules
+Description = md5WithRSASignature (1 3 14 3 2 25)
+
+OID = 06 05 2B 0E 03 02 1A
+Comment = OIW
+Description = sha1 (1 3 14 3 2 26)
+
+# Yet another multiply-assigned OID
+OID = 06 05 2B 0E 03 02 1B
+Comment = OIW.  This OID may also be assigned as ripemd-160
+Description = dsaWithSHA1 (1 3 14 3 2 27)
+
+OID = 06 05 2B 0E 03 02 1C
+Comment = OIW
+Description = dsaWithCommonSHA1 (1 3 14 3 2 28)
+
+OID = 06 05 2B 0E 03 02 1D
+Comment = Oddball OIW OID
+Description = sha-1WithRSAEncryption (1 3 14 3 2 29)
+
+OID = 06 05 2B 0E 03 03 01
+Comment = Oddball OIW OID
+Description = simple-strong-auth-mechanism (1 3 14 3 3 1)
+
+OID = 06 06 2B 0E 07 02 01 01
+Comment = Unsure about this OID
+Description = ElGamal (1 3 14 7 2 1 1)
+
+OID = 06 06 2B 0E 07 02 03 01
+Comment = Unsure about this OID
+Description = md2WithRSA (1 3 14 7 2 3 1)
+
+OID = 06 06 2B 0E 07 02 03 02
+Comment = Unsure about this OID
+Description = md2WithElGamal (1 3 14 7 2 3 2)
+
+# Teletrust
+
+OID = 06 03 2B 24 01
+Comment = Teletrust document
+Description = document (1 3 36 1)
+
+OID = 06 04 2B 24 01 01
+Comment = Teletrust document
+Description = finalVersion (1 3 36 1 1)
+
+OID = 06 04 2B 24 01 02
+Comment = Teletrust document
+Description = draft (1 3 36 1 2)
+
+OID = 06 03 2B 24 02
+Comment = Teletrust sio
+Description = sio (1 3 36 2)
+
+OID = 06 04 2B 24 02 01
+Comment = Teletrust sio
+Description = sedu (1 3 36 2 1)
+
+OID = 06 03 2B 24 03
+Comment = Teletrust algorithm
+Description = algorithm (1 3 36 3)
+
+OID = 06 04 2B 24 03 01
+Comment = Teletrust algorithm
+Description = encryptionAlgorithm (1 3 36 3 1)
+
+OID = 06 05 2B 24 03 01 01
+Comment = Teletrust encryption algorithm
+Description = des (1 3 36 3 1 1)
+
+OID = 06 06 2B 24 03 01 01 01
+Comment = Teletrust encryption algorithm
+Description = desECB_pad (1 3 36 3 1 1 1)
+
+OID = 06 07 2B 24 03 01 01 01 01
+Comment = Teletrust encryption algorithm
+Description = desECB_ISOpad (1 3 36 3 1 1 1 1)
+
+OID = 06 07 2B 24 03 01 01 02 01
+Comment = Teletrust encryption algorithm
+Description = desCBC_pad (1 3 36 3 1 1 2 1)
+
+OID = 06 08 2B 24 03 01 01 02 01 01
+Comment = Teletrust encryption algorithm
+Description = desCBC_ISOpad (1 3 36 3 1 1 2 1 1)
+
+OID = 06 05 2B 24 03 01 03
+Comment = Teletrust encryption algorithm
+Description = des_3 (1 3 36 3 1 3)
+
+OID = 06 07 2B 24 03 01 03 01 01
+Comment = Teletrust encryption algorithm.  EDE triple DES
+Description = des_3ECB_pad (1 3 36 3 1 3 1 1)
+
+OID = 06 08 2B 24 03 01 03 01 01 01
+Comment = Teletrust encryption algorithm.  EDE triple DES
+Description = des_3ECB_ISOpad (1 3 36 3 1 3 1 1 1)
+
+OID = 06 07 2B 24 03 01 03 02 01
+Comment = Teletrust encryption algorithm.  EDE triple DES
+Description = des_3CBC_pad (1 3 36 3 1 3 2 1)
+
+OID = 06 08 2B 24 03 01 03 02 01 01
+Comment = Teletrust encryption algorithm.  EDE triple DES
+Description = des_3CBC_ISOpad (1 3 36 3 1 3 2 1 1)
+
+OID = 06 05 2B 24 03 01 02
+Comment = Teletrust encryption algorithm
+Description = idea (1 3 36 3 1 2)
+
+OID = 06 06 2B 24 03 01 02 01
+Comment = Teletrust encryption algorithm
+Description = ideaECB (1 3 36 3 1 2 1)
+
+OID = 06 07 2B 24 03 01 02 01 01
+Comment = Teletrust encryption algorithm
+Description = ideaECB_pad (1 3 36 3 1 2 1 1)
+
+OID = 06 08 2B 24 03 01 02 01 01 01
+Comment = Teletrust encryption algorithm
+Description = ideaECB_ISOpad (1 3 36 3 1 2 1 1 1)
+
+OID = 06 06 2B 24 03 01 02 02
+Comment = Teletrust encryption algorithm
+Description = ideaCBC (1 3 36 3 1 2 2)
+
+OID = 06 07 2B 24 03 01 02 02 01
+Comment = Teletrust encryption algorithm
+Description = ideaCBC_pad (1 3 36 3 1 2 2 1)
+
+OID = 06 08 2B 24 03 01 02 02 01 01
+Comment = Teletrust encryption algorithm
+Description = ideaCBC_ISOpad (1 3 36 3 1 2 2 1 1)
+
+OID = 06 06 2B 24 03 01 02 03
+Comment = Teletrust encryption algorithm
+Description = ideaOFB (1 3 36 3 1 2 3)
+
+OID = 06 06 2B 24 03 01 02 04
+Comment = Teletrust encryption algorithm
+Description = ideaCFB (1 3 36 3 1 2 4)
+
+OID = 06 05 2B 24 03 01 04
+Comment = Teletrust encryption algorithm
+Description = rsaEncryption (1 3 36 3 1 4)
+
+OID = 06 08 2B 24 03 01 04 84 00 11
+Comment = Teletrust encryption algorithm
+Description = rsaEncryptionWithlmod512expe17 (1 3 36 3 1 4 512 17)
+
+OID = 06 05 2B 24 03 01 05
+Comment = Teletrust encryption algorithm
+Description = bsi-1 (1 3 36 3 1 5)
+
+OID = 06 06 2B 24 03 01 05 01
+Comment = Teletrust encryption algorithm
+Description = bsi_1ECB_pad (1 3 36 3 1 5 1)
+
+OID = 06 06 2B 24 03 01 05 02
+Comment = Teletrust encryption algorithm
+Description = bsi_1CBC_pad (1 3 36 3 1 5 2)
+
+OID = 06 07 2B 24 03 01 05 02 01
+Comment = Teletrust encryption algorithm
+Description = bsi_1CBC_PEMpad (1 3 36 3 1 5 2 1)
+
+OID = 06 04 2B 24 03 02
+Comment = Teletrust algorithm
+Description = hashAlgorithm (1 3 36 3 2)
+
+OID = 06 05 2B 24 03 02 01
+Comment = Teletrust hash algorithm
+Description = ripemd160 (1 3 36 3 2 1)
+
+OID = 06 05 2B 24 03 02 02
+Comment = Teletrust hash algorithm
+Description = ripemd128 (1 3 36 3 2 2)
+
+OID = 06 05 2B 24 03 02 03
+Comment = Teletrust hash algorithm
+Description = ripemd256 (1 3 36 3 2 3)
+
+OID = 06 05 2B 24 03 02 04
+Comment = Teletrust hash algorithm
+Description = mdc2singleLength (1 3 36 3 2 4)
+
+OID = 06 05 2B 24 03 02 05
+Comment = Teletrust hash algorithm
+Description = mdc2doubleLength (1 3 36 3 2 5)
+
+OID = 06 04 2B 24 03 03
+Comment = Teletrust algorithm
+Description = signatureAlgorithm (1 3 36 3 3)
+
+OID = 06 05 2B 24 03 03 01
+Comment = Teletrust signature algorithm
+Description = rsaSignature (1 3 36 3 3 1)
+
+OID = 06 06 2B 24 03 03 01 01
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1 (1 3 36 3 3 1 1)
+
+# What *were* they thinking?
+OID = 06 09 2B 24 03 03 01 01 84 00 02
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l512_l2 (1 3 36 3 3 1 1 512 2)
+OID = 06 09 2B 24 03 03 01 01 85 00 02
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l640_l2 (1 3 36 3 3 1 1 640 2)
+OID = 06 09 2B 24 03 03 01 01 86 00 02
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l768_l2 (1 3 36 3 3 1 1 768 2)
+OID = 06 09 2B 24 03 03 01 01 87 00 02
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l896_l2 (1 3 36 3 3 1 1 892 2)
+OID = 06 09 2B 24 03 03 01 01 88 00 02
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l1024_l2 (1 3 36 3 3 1 1 1024 2)
+OID = 06 09 2B 24 03 03 01 01 84 00 03
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l512_l3 (1 3 36 3 3 1 1 512 3)
+OID = 06 09 2B 24 03 03 01 01 85 00 03
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l640_l3 (1 3 36 3 3 1 1 640 3)
+OID = 06 09 2B 24 03 03 01 01 86 00 03
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l768_l3 (1 3 36 3 3 1 1 768 3)
+OID = 06 09 2B 24 03 03 01 01 87 00 03
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l896_l3 (1 3 36 3 3 1 1 896 3)
+OID = 06 09 2B 24 03 03 01 01 88 00 03
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l1024_l3 (1 3 36 3 3 1 1 1024 3)
+OID = 06 09 2B 24 03 03 01 01 84 00 05
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l512_l5 (1 3 36 3 3 1 1 512 5)
+OID = 06 09 2B 24 03 03 01 01 85 00 05
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l640_l5 (1 3 36 3 3 1 1 640 5)
+OID = 06 09 2B 24 03 03 01 01 86 00 05
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l768_l5 (1 3 36 3 3 1 1 768 5)
+OID = 06 09 2B 24 03 03 01 01 87 00 05
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l896_l5 (1 3 36 3 3 1 1 896 5)
+OID = 06 09 2B 24 03 03 01 01 88 00 05
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l1024_l5 (1 3 36 3 3 1 1 1024 5)
+OID = 06 09 2B 24 03 03 01 01 84 00 09
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l512_l9 (1 3 36 3 3 1 1 512 9)
+OID = 06 09 2B 24 03 03 01 01 85 00 09
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l640_l9 (1 3 36 3 3 1 1 640 9)
+OID = 06 09 2B 24 03 03 01 01 86 00 09
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l768_l9 (1 3 36 3 3 1 1 768 9)
+OID = 06 09 2B 24 03 03 01 01 87 00 09
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l896_l9 (1 3 36 3 3 1 1 896 9)
+OID = 06 09 2B 24 03 03 01 01 88 00 09
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l1024_l9 (1 3 36 3 3 1 1 1024 9)
+OID = 06 09 2B 24 03 03 01 01 84 00 11
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l512_l11 (1 3 36 3 3 1 1 512 11)
+OID = 06 09 2B 24 03 03 01 01 85 00 11
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l640_l11 (1 3 36 3 3 1 1 640 11)
+OID = 06 09 2B 24 03 03 01 01 86 00 11
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l768_l11 (1 3 36 3 3 1 1 768 11)
+OID = 06 09 2B 24 03 03 01 01 87 00 11
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l896_l11 (1 3 36 3 3 1 1 896 11)
+OID = 06 09 2B 24 03 03 01 01 88 00 11
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithsha1_l1024_l11 (1 3 36 3 3 1 1 1024 11)
+
+OID = 06 06 2B 24 03 03 01 02
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160 (1 3 36 3 3 1 2)
+
+OID = 06 09 2B 24 03 03 01 02 84 00 02
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l512_l2 (1 3 36 3 3 1 2 512 2)
+OID = 06 09 2B 24 03 03 01 02 85 00 02
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l640_l2 (1 3 36 3 3 1 2 640 2)
+OID = 06 09 2B 24 03 03 01 02 86 00 02
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l768_l2 (1 3 36 3 3 1 2 768 2)
+OID = 06 09 2B 24 03 03 01 02 87 00 02
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l896_l2 (1 3 36 3 3 1 2 892 2)
+OID = 06 09 2B 24 03 03 01 02 88 00 02
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l1024_l2 (1 3 36 3 3 1 2 1024 2)
+OID = 06 09 2B 24 03 03 01 02 84 00 03
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l512_l3 (1 3 36 3 3 1 2 512 3)
+OID = 06 09 2B 24 03 03 01 02 85 00 03
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l640_l3 (1 3 36 3 3 1 2 640 3)
+OID = 06 09 2B 24 03 03 01 02 86 00 03
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l768_l3 (1 3 36 3 3 1 2 768 3)
+OID = 06 09 2B 24 03 03 01 02 87 00 03
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l896_l3 (1 3 36 3 3 1 2 896 3)
+OID = 06 09 2B 24 03 03 01 02 88 00 03
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l1024_l3 (1 3 36 3 3 1 2 1024 3)
+OID = 06 09 2B 24 03 03 01 02 84 00 05
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l512_l5 (1 3 36 3 3 1 2 512 5)
+OID = 06 09 2B 24 03 03 01 02 85 00 05
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l640_l5 (1 3 36 3 3 1 2 640 5)
+OID = 06 09 2B 24 03 03 01 02 86 00 05
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l768_l5 (1 3 36 3 3 1 2 768 5)
+OID = 06 09 2B 24 03 03 01 02 87 00 05
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l896_l5 (1 3 36 3 3 1 2 896 5)
+OID = 06 09 2B 24 03 03 01 02 88 00 05
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l1024_l5 (1 3 36 3 3 1 2 1024 5)
+OID = 06 09 2B 24 03 03 01 02 84 00 09
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l512_l9 (1 3 36 3 3 1 2 512 9)
+OID = 06 09 2B 24 03 03 01 02 85 00 09
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l640_l9 (1 3 36 3 3 1 2 640 9)
+OID = 06 09 2B 24 03 03 01 02 86 00 09
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l768_l9 (1 3 36 3 3 1 2 768 9)
+OID = 06 09 2B 24 03 03 01 02 87 00 09
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l896_l9 (1 3 36 3 3 1 2 896 9)
+OID = 06 09 2B 24 03 03 01 02 88 00 09
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l1024_l9 (1 3 36 3 3 1 2 1024 9)
+OID = 06 09 2B 24 03 03 01 02 84 00 11
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l512_l11 (1 3 36 3 3 1 2 512 11)
+OID = 06 09 2B 24 03 03 01 02 85 00 11
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l640_l11 (1 3 36 3 3 1 2 640 11)
+OID = 06 09 2B 24 03 03 01 02 86 00 11
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l768_l11 (1 3 36 3 3 1 2 768 11)
+OID = 06 09 2B 24 03 03 01 02 87 00 11
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l896_l11 (1 3 36 3 3 1 2 896 11)
+OID = 06 09 2B 24 03 03 01 02 88 00 11
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithripemd160_l1024_l11 (1 3 36 3 3 1 2 1024 11)
+
+OID = 06 06 2B 24 03 03 01 03
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithrimpemd128 (1 3 36 3 3 1 3)
+
+OID = 06 06 2B 24 03 03 01 04
+Comment = Teletrust signature algorithm
+Description = rsaSignatureWithrimpemd256 (1 3 36 3 3 1 4)
+
+OID = 06 05 2B 24 03 03 02
+Comment = Teletrust signature algorithm
+Description = ecsieSign (1 3 36 3 3 2)
+
+OID = 06 06 2B 24 03 03 02 01
+Comment = Teletrust signature algorithm
+Description = ecsieSignWithsha1 (1 3 36 3 3 2 1)
+
+OID = 06 06 2B 24 03 03 02 02
+Comment = Teletrust signature algorithm
+Description = ecsieSignWithripemd160 (1 3 36 3 3 2 2)
+
+OID = 06 06 2B 24 03 03 02 03
+Comment = Teletrust signature algorithm
+Description = ecsieSignWithmd2 (1 3 36 3 3 2 3)
+
+OID = 06 06 2B 24 03 03 02 04
+Comment = Teletrust signature algorithm
+Description = ecsieSignWithmd5 (1 3 36 3 3 2 4)
+
+OID = 06 04 2B 24 03 04
+Comment = Teletrust algorithm
+Description = signatureScheme (1 3 36 3 4)
+
+OID = 06 05 2B 24 03 04 01
+Comment = Teletrust signature scheme
+Description = sigS_ISO9796-1 (1 3 36 3 4 1)
+
+OID = 06 05 2B 24 03 04 02
+Comment = Teletrust signature scheme
+Description = sigS_ISO9796-2 (1 3 36 3 4 2)
+
+OID = 06 05 2B 24 03 04 02 01
+Comment = Teletrust signature scheme.  Unsure what this is supposed to be
+Description = sigS_ISO9796-2Withred (1 3 36 3 4 2 1)
+
+OID = 06 06 2B 24 03 04 02 02
+Comment = Teletrust signature scheme.  Unsure what this is supposed to be
+Description = sigS_ISO9796-2Withrsa (1 3 36 3 4 2 2)
+
+OID = 06 06 2B 24 03 04 02 03
+Comment = Teletrust signature scheme.  9796-2 with random number in padding field
+Description = sigS_ISO9796-2Withrnd (1 3 36 3 4 2 3)
+
+OID = 06 03 2B 24 04
+Comment = Teletrust attribute
+Description = attribute (1 3 36 4)
+
+OID = 06 03 2B 24 05
+Comment = Teletrust policy
+Description = policy (1 3 36 5)
+
+OID = 06 03 2B 24 06
+Comment = Teletrust API
+Description = api (1 3 36 6)
+
+OID = 06 04 2B 24 06 01
+Comment = Teletrust API
+Description = manufacturer-specific_api (1 3 36 6 1)
+
+OID = 06 05 2B 24 06 01 01
+Comment = Teletrust API
+Description = utimaco-api (1 3 36 6 1 1)
+
+OID = 06 04 2B 24 06 02
+Comment = Teletrust API
+Description = functionality-specific_api (1 3 36 6 2)
+
+OID = 06 03 2B 24 07
+Comment = Teletrust key management
+Description = keymgmnt (1 3 36 7)
+
+OID = 06 04 2B 24 07 01
+Comment = Teletrust key management
+Description = keyagree (1 3 36 7 1)
+
+OID = 06 05 2B 24 07 01 01
+Comment = Teletrust key management
+Description = bsiPKE (1 3 36 7 1 1)
+
+OID = 06 04 2B 24 07 02
+Comment = Teletrust key management
+Description = keytrans (1 3 36 7 2)
+
+OID = 06 05 2B 24 07 02 01
+Comment = Teletrust key management.  9796-2 with key stored in hash field
+Description = encISO9796-2Withrsa (1 3 36 7 2 1)
+
+OID = 06 05 2B 24 08 01 01
+Comment = Teletrust policy
+Description = sigiSigConform (1 3 36 8 1 1)
+
+OID = 06 05 2B 24 08 02 01
+Comment = Teletrust extended key usage
+Description = directoryService (1 3 36 8 2 1)
+
+OID = 06 05 2B 24 08 03 01
+Comment = Teletrust attribute
+Description = dateOfCertGen (1 3 36 8 3 1)
+
+OID = 06 05 2B 24 08 03 02
+Comment = Teletrust attribute
+Description = procuration (1 3 36 8 3 2)
+
+OID = 06 05 2B 24 08 03 03
+Comment = Teletrust attribute
+Description = admission (1 3 36 8 3 3)
+
+OID = 06 05 2B 24 08 03 04
+Comment = Teletrust attribute
+Description = monetaryLimit (1 3 36 8 3 4)
+
+OID = 06 05 2B 24 08 03 05
+Comment = Teletrust attribute
+Description = declarationOfMajority (1 3 36 8 3 5)
+
+OID = 06 05 2B 24 08 03 06
+Comment = Teletrust attribute
+Description = integratedCircuitCardSerialNumber (1 3 36 8 3 6)
+
+OID = 06 05 2B 24 08 03 07
+Comment = Teletrust attribute
+Description = pKReference (1 3 36 8 3 7)
+
+OID = 06 05 2B 24 08 03 08
+Comment = Teletrust attribute
+Description = restriction (1 3 36 8 3 8)
+
+OID = 06 05 2B 24 08 03 09
+Comment = Teletrust attribute
+Description = retrieveIfAllowed (1 3 36 8 3 9)
+
+OID = 06 05 2B 24 08 03 0A
+Comment = Teletrust attribute
+Description = requestedCertificate (1 3 36 8 3 10)
+
+OID = 06 05 2B 24 08 03 0B
+Comment = Teletrust attribute
+Description = namingAuthorities (1 3 36 8 3 11)
+
+OID = 06 05 2B 24 08 03 0C
+Comment = Teletrust attribute
+Description = certInDirSince (1 3 36 8 3 12)
+
+OID = 06 05 2B 24 08 03 0D
+Comment = Teletrust attribute
+Description = certHash (1 3 36 8 3 13)
+
+OID = 06 05 2B 24 08 04 01
+Comment = Teletrust OtherName attribute
+Description = personalData (1 3 36 8 4 1)
+
+OID = 06 05 2B 24 08 04 08
+Comment = Teletrust attribute certificate attribute
+Description = restriction (1 3 36 8 4 8)
+
+OID = 06 07 2B 24 08 05 01 01 01
+Comment = Teletrust signature algorithm
+Description = rsaIndicateSHA1 (1 3 36 8 5 1 1 1)
+
+OID = 06 07 2B 24 08 05 01 01 02
+Comment = Teletrust signature algorithm
+Description = rsaIndicateRIPEMD160 (1 3 36 8 5 1 1 2)
+
+OID = 06 07 2B 24 08 05 01 01 03
+Comment = Teletrust signature algorithm
+Description = rsaWithSHA1 (1 3 36 8 5 1 1 3)
+
+OID = 06 07 2B 24 08 05 01 01 04
+Comment = Teletrust signature algorithm
+Description = rsaWithRIPEMD160 (1 3 36 8 5 1 1 4)
+
+OID = 06 07 2B 24 08 05 01 02 01
+Comment = Teletrust signature algorithm
+Description = dsaExtended (1 3 36 8 5 1 2 1)
+
+OID = 06 07 2B 24 08 05 01 02 02
+Comment = Teletrust signature algorithm
+Description = dsaWithRIPEMD160 (1 3 36 8 5 1 2 2)
+
+OID = 06 05 2B 24 08 06 01
+Comment = Teletrust signature attributes
+Description = cert (1 3 36 8 6 1)
+
+OID = 06 05 2B 24 08 06 02
+Comment = Teletrust signature attributes
+Description = certRef (1 3 36 8 6 2)
+
+OID = 06 05 2B 24 08 06 03
+Comment = Teletrust signature attributes
+Description = attrCert (1 3 36 8 6 3)
+
+OID = 06 05 2B 24 08 06 04
+Comment = Teletrust signature attributes
+Description = attrRef (1 3 36 8 6 4)
+
+OID = 06 05 2B 24 08 06 05
+Comment = Teletrust signature attributes
+Description = fileName (1 3 36 8 6 5)
+
+OID = 06 05 2B 24 08 06 06
+Comment = Teletrust signature attributes
+Description = storageTime (1 3 36 8 6 6)
+
+OID = 06 05 2B 24 08 06 07
+Comment = Teletrust signature attributes
+Description = fileSize (1 3 36 8 6 7)
+
+OID = 06 05 2B 24 08 06 08
+Comment = Teletrust signature attributes
+Description = location (1 3 36 8 6 8)
+
+OID = 06 05 2B 24 08 06 09
+Comment = Teletrust signature attributes
+Description = sigNumber (1 3 36 8 6 9)
+
+OID = 06 05 2B 24 08 06 0A
+Comment = Teletrust signature attributes
+Description = autoGen (1 3 36 8 6 10)
+
+OID = 06 06 2B 24 08 07 01 01
+Comment = Teletrust presentation types
+Description = ptAdobeILL (1 3 36 8 7 1 1)
+
+OID = 06 06 2B 24 08 07 01 02
+Comment = Teletrust presentation types
+Description = ptAmiPro (1 3 36 8 7 1 2)
+
+OID = 06 06 2B 24 08 07 01 03
+Comment = Teletrust presentation types
+Description = ptAutoCAD (1 3 36 8 7 1 3)
+
+OID = 06 06 2B 24 08 07 01 04
+Comment = Teletrust presentation types
+Description = ptBinary (1 3 36 8 7 1 4)
+
+OID = 06 06 2B 24 08 07 01 05
+Comment = Teletrust presentation types
+Description = ptBMP (1 3 36 8 7 1 5)
+
+OID = 06 06 2B 24 08 07 01 06
+Comment = Teletrust presentation types
+Description = ptCGM (1 3 36 8 7 1 6)
+
+OID = 06 06 2B 24 08 07 01 07
+Comment = Teletrust presentation types
+Description = ptCorelCRT (1 3 36 8 7 1 7)
+
+OID = 06 06 2B 24 08 07 01 08
+Comment = Teletrust presentation types
+Description = ptCorelDRW (1 3 36 8 7 1 8)
+
+OID = 06 06 2B 24 08 07 01 09
+Comment = Teletrust presentation types
+Description = ptCorelEXC (1 3 36 8 7 1 9)
+
+OID = 06 06 2B 24 08 07 01 0A
+Comment = Teletrust presentation types
+Description = ptCorelPHT (1 3 36 8 7 1 10)
+
+OID = 06 06 2B 24 08 07 01 0B
+Comment = Teletrust presentation types
+Description = ptDraw (1 3 36 8 7 1 11)
+
+OID = 06 06 2B 24 08 07 01 0C
+Comment = Teletrust presentation types
+Description = ptDVI (1 3 36 8 7 1 12)
+
+OID = 06 06 2B 24 08 07 01 0D
+Comment = Teletrust presentation types
+Description = ptEPS (1 3 36 8 7 1 13)
+
+OID = 06 06 2B 24 08 07 01 0E
+Comment = Teletrust presentation types
+Description = ptExcel (1 3 36 8 7 1 14)
+
+OID = 06 06 2B 24 08 07 01 0F
+Comment = Teletrust presentation types
+Description = ptGEM (1 3 36 8 7 1 15)
+
+OID = 06 06 2B 24 08 07 01 10
+Comment = Teletrust presentation types
+Description = ptGIF (1 3 36 8 7 1 16)
+
+OID = 06 06 2B 24 08 07 01 11
+Comment = Teletrust presentation types
+Description = ptHPGL (1 3 36 8 7 1 17)
+
+OID = 06 06 2B 24 08 07 01 12
+Comment = Teletrust presentation types
+Description = ptJPEG (1 3 36 8 7 1 18)
+
+OID = 06 06 2B 24 08 07 01 13
+Comment = Teletrust presentation types
+Description = ptKodak (1 3 36 8 7 1 19)
+
+OID = 06 06 2B 24 08 07 01 14
+Comment = Teletrust presentation types
+Description = ptLaTeX (1 3 36 8 7 1 20)
+
+OID = 06 06 2B 24 08 07 01 15
+Comment = Teletrust presentation types
+Description = ptLotus (1 3 36 8 7 1 21)
+
+OID = 06 06 2B 24 08 07 01 16
+Comment = Teletrust presentation types
+Description = ptLotusPIC (1 3 36 8 7 1 22)
+
+OID = 06 06 2B 24 08 07 01 17
+Comment = Teletrust presentation types
+Description = ptMacPICT (1 3 36 8 7 1 23)
+
+OID = 06 06 2B 24 08 07 01 18
+Comment = Teletrust presentation types
+Description = ptMacWord (1 3 36 8 7 1 24)
+
+OID = 06 06 2B 24 08 07 01 19
+Comment = Teletrust presentation types
+Description = ptMSWfD (1 3 36 8 7 1 25)
+
+OID = 06 06 2B 24 08 07 01 1A
+Comment = Teletrust presentation types
+Description = ptMSWord (1 3 36 8 7 1 26)
+
+OID = 06 06 2B 24 08 07 01 1B
+Comment = Teletrust presentation types
+Description = ptMSWord2 (1 3 36 8 7 1 27)
+
+OID = 06 06 2B 24 08 07 01 1C
+Comment = Teletrust presentation types
+Description = ptMSWord6 (1 3 36 8 7 1 28)
+
+OID = 06 06 2B 24 08 07 01 1D
+Comment = Teletrust presentation types
+Description = ptMSWord8 (1 3 36 8 7 1 29)
+
+OID = 06 06 2B 24 08 07 01 1E
+Comment = Teletrust presentation types
+Description = ptPDF (1 3 36 8 7 1 30)
+
+OID = 06 06 2B 24 08 07 01 1F
+Comment = Teletrust presentation types
+Description = ptPIF (1 3 36 8 7 1 31)
+
+OID = 06 06 2B 24 08 07 01 20
+Comment = Teletrust presentation types
+Description = ptPostscript (1 3 36 8 7 1 32)
+
+OID = 06 06 2B 24 08 07 01 21
+Comment = Teletrust presentation types
+Description = ptRTF (1 3 36 8 7 1 33)
+
+OID = 06 06 2B 24 08 07 01 22
+Comment = Teletrust presentation types
+Description = ptSCITEX (1 3 36 8 7 1 34)
+
+OID = 06 06 2B 24 08 07 01 23
+Comment = Teletrust presentation types
+Description = ptTAR (1 3 36 8 7 1 35)
+
+OID = 06 06 2B 24 08 07 01 24
+Comment = Teletrust presentation types
+Description = ptTarga (1 3 36 8 7 1 36)
+
+OID = 06 06 2B 24 08 07 01 25
+Comment = Teletrust presentation types
+Description = ptTeX (1 3 36 8 7 1 37)
+
+OID = 06 06 2B 24 08 07 01 26
+Comment = Teletrust presentation types
+Description = ptText (1 3 36 8 7 1 38)
+
+OID = 06 06 2B 24 08 07 01 27
+Comment = Teletrust presentation types
+Description = ptTIFF (1 3 36 8 7 1 39)
+
+OID = 06 06 2B 24 08 07 01 28
+Comment = Teletrust presentation types
+Description = ptTIFF-FC (1 3 36 8 7 1 40)
+
+OID = 06 06 2B 24 08 07 01 29
+Comment = Teletrust presentation types
+Description = ptUID (1 3 36 8 7 1 41)
+
+OID = 06 06 2B 24 08 07 01 2A
+Comment = Teletrust presentation types
+Description = ptUUEncode (1 3 36 8 7 1 42)
+
+OID = 06 06 2B 24 08 07 01 2B
+Comment = Teletrust presentation types
+Description = ptWMF (1 3 36 8 7 1 43)
+
+OID = 06 06 2B 24 08 07 01 2C
+Comment = Teletrust presentation types
+Description = ptWordPerfect (1 3 36 8 7 1 44)
+
+OID = 06 06 2B 24 08 07 01 2D
+Comment = Teletrust presentation types
+Description = ptWPGrph (1 3 36 8 7 1 45)
+
+# Thawte
+
+OID = 06 04 2B 65 01 04
+Comment = Thawte
+Description = thawte-ce (1 3 101 1 4)
+
+OID = 06 05 2B 65 01 04 01
+Comment = Thawte certificate extension
+Description = strongExtranet (1 3 101 1 4 1)
+
+# X.520
+
+OID = 06 03 55 04 00
+Comment = X.520 id-at (2 5 4)
+Description = objectClass (2 5 4 0)
+
+OID = 06 03 55 04 01
+Comment = X.520 id-at (2 5 4)
+Description = aliasedEntryName (2 5 4 1)
+
+OID = 06 03 55 04 02
+Comment = X.520 id-at (2 5 4)
+Description = knowledgeInformation (2 5 4 2)
+
+OID = 06 03 55 04 03
+Comment = X.520 id-at (2 5 4)
+Description = commonName (2 5 4 3)
+
+OID = 06 03 55 04 04
+Comment = X.520 id-at (2 5 4)
+Description = surname (2 5 4 4)
+
+OID = 06 03 55 04 05
+Comment = X.520 id-at (2 5 4)
+Description = serialNumber (2 5 4 5)
+
+OID = 06 03 55 04 06
+Comment = X.520 id-at (2 5 4)
+Description = countryName (2 5 4 6)
+
+OID = 06 03 55 04 07
+Comment = X.520 id-at (2 5 4)
+Description = localityName (2 5 4 7)
+
+OID = 06 04 55 04 07 01
+Comment = X.520 id-at (2 5 4)
+Description = collectiveLocalityName (2 5 4 7 1)
+
+OID = 06 03 55 04 08
+Comment = X.520 id-at (2 5 4)
+Description = stateOrProvinceName (2 5 4 8)
+
+OID = 06 04 55 04 08 01
+Comment = X.520 id-at (2 5 4)
+Description = collectiveStateOrProvinceName (2 5 4 8 1)
+
+OID = 06 03 55 04 09
+Comment = X.520 id-at (2 5 4)
+Description = streetAddress (2 5 4 9)
+
+OID = 06 04 55 04 09 01
+Comment = X.520 id-at (2 5 4)
+Description = collectiveStreetAddress (2 5 4 9 1)
+
+OID = 06 03 55 04 0A
+Comment = X.520 id-at (2 5 4)
+Description = organizationName (2 5 4 10)
+
+OID = 06 04 55 04 0A 01
+Comment = X.520 id-at (2 5 4)
+Description = collectiveOrganizationName (2 5 4 10 1)
+
+OID = 06 03 55 04 0B
+Comment = X.520 id-at (2 5 4)
+Description = organizationalUnitName (2 5 4 11)
+
+OID = 06 04 55 04 0B 01
+Comment = X.520 id-at (2 5 4)
+Description = collectiveOrganizationalUnitName (2 5 4 11 1)
+
+OID = 06 03 55 04 0C
+Comment = X.520 id-at (2 5 4)
+Description = title (2 5 4 12)
+
+OID = 06 03 55 04 0D
+Comment = X.520 id-at (2 5 4)
+Description = description (2 5 4 13)
+
+OID = 06 03 55 04 0E
+Comment = X.520 id-at (2 5 4)
+Description = searchGuide (2 5 4 14)
+
+OID = 06 03 55 04 0F
+Comment = X.520 id-at (2 5 4)
+Description = businessCategory (2 5 4 15)
+
+OID = 06 03 55 04 10
+Comment = X.520 id-at (2 5 4)
+Description = postalAddress (2 5 4 16)
+
+OID = 06 04 55 04 10 01
+Comment = X.520 id-at (2 5 4)
+Description = collectivePostalAddress (2 5 4 16 1)
+
+OID = 06 03 55 04 11
+Comment = X.520 id-at (2 5 4)
+Description = postalCode (2 5 4 17)
+
+OID = 06 04 55 04 11 01
+Comment = X.520 id-at (2 5 4)
+Description = collectivePostalCode (2 5 4 17 1)
+
+OID = 06 03 55 04 12
+Comment = X.520 id-at (2 5 4)
+Description = postOfficeBox (2 5 4 18)
+
+OID = 06 04 55 04 12 01
+Comment = X.520 id-at (2 5 4)
+Description = collectivePostOfficeBox (2 5 4 18 1)
+
+OID = 06 03 55 04 13
+Comment = X.520 id-at (2 5 4)
+Description = physicalDeliveryOfficeName (2 5 4 19)
+
+OID = 06 04 55 04 13 01
+Comment = X.520 id-at (2 5 4)
+Description = collectivePhysicalDeliveryOfficeName (2 5 4 19 1)
+
+OID = 06 03 55 04 14
+Comment = X.520 id-at (2 5 4)
+Description = telephoneNumber (2 5 4 20)
+
+OID = 06 04 55 04 14 01
+Comment = X.520 id-at (2 5 4)
+Description = collectiveTelephoneNumber (2 5 4 20 1)
+
+OID = 06 03 55 04 15
+Comment = X.520 id-at (2 5 4)
+Description = telexNumber (2 5 4 21)
+
+OID = 06 04 55 04 15 01
+Comment = X.520 id-at (2 5 4)
+Description = collectiveTelexNumber (2 5 4 21 1)
+
+OID = 06 03 55 04 16
+Comment = X.520 id-at (2 5 4)
+Description = teletexTerminalIdentifier (2 5 4 22)
+
+OID = 06 04 55 04 16 01
+Comment = X.520 id-at (2 5 4)
+Description = collectiveTeletexTerminalIdentifier (2 5 4 22 1)
+
+OID = 06 03 55 04 17
+Comment = X.520 id-at (2 5 4)
+Description = facsimileTelephoneNumber (2 5 4 23)
+
+OID = 06 04 55 04 17 01
+Comment = X.520 id-at (2 5 4)
+Description = collectiveFacsimileTelephoneNumber (2 5 4 23 1)
+
+OID = 06 03 55 04 18
+Comment = X.520 id-at (2 5 4)
+Description = x121Address (2 5 4 24)
+
+OID = 06 03 55 04 19
+Comment = X.520 id-at (2 5 4)
+Description = internationalISDNNumber (2 5 4 25)
+
+OID = 06 04 55 04 19 01
+Comment = X.520 id-at (2 5 4)
+Description = collectiveInternationalISDNNumber (2 5 4 25 1)
+
+OID = 06 03 55 04 1A
+Comment = X.520 id-at (2 5 4)
+Description = registeredAddress (2 5 4 26)
+
+OID = 06 03 55 04 1B
+Comment = X.520 id-at (2 5 4)
+Description = destinationIndicator (2 5 4 27)
+
+OID = 06 03 55 04 1C
+Comment = X.520 id-at (2 5 4)
+Description = preferredDeliveryMehtod (2 5 4 28)
+
+OID = 06 03 55 04 1D
+Comment = X.520 id-at (2 5 4)
+Description = presentationAddress (2 5 4 29)
+
+OID = 06 03 55 04 1E
+Comment = X.520 id-at (2 5 4)
+Description = supportedApplicationContext (2 5 4 30)
+
+OID = 06 03 55 04 1F
+Comment = X.520 id-at (2 5 4)
+Description = member (2 5 4 31)
+
+OID = 06 03 55 04 20
+Comment = X.520 id-at (2 5 4)
+Description = owner (2 5 4 32)
+
+OID = 06 03 55 04 21
+Comment = X.520 id-at (2 5 4)
+Description = roleOccupant (2 5 4 33)
+
+OID = 06 03 55 04 22
+Comment = X.520 id-at (2 5 4)
+Description = seeAlso (2 5 4 34)
+
+OID = 06 03 55 04 23
+Comment = X.520 id-at (2 5 4)
+Description = userPassword (2 5 4 35)
+
+OID = 06 03 55 04 24
+Comment = X.520 id-at (2 5 4)
+Description = userCertificate (2 5 4 36)
+
+OID = 06 03 55 04 25
+Comment = X.520 id-at (2 5 4)
+Description = caCertificate (2 5 4 37)
+
+OID = 06 03 55 04 26
+Comment = X.520 id-at (2 5 4)
+Description = authorityRevocationList (2 5 4 38)
+
+OID = 06 03 55 04 27
+Comment = X.520 id-at (2 5 4)
+Description = certificateRevocationList (2 5 4 39)
+
+OID = 06 03 55 04 28
+Comment = X.520 id-at (2 5 4)
+Description = crossCertificatePair (2 5 4 40)
+
+OID = 06 03 55 04 29
+Comment = X.520 id-at (2 5 4)
+Description = name (2 5 4 41)
+
+OID = 06 03 55 04 2A
+Comment = X.520 id-at (2 5 4)
+Description = givenName (2 5 4 42)
+
+OID = 06 03 55 04 2B
+Comment = X.520 id-at (2 5 4)
+Description = initials (2 5 4 43)
+
+OID = 06 03 55 04 2C
+Comment = X.520 id-at (2 5 4)
+Description = generationQualifier (2 5 4 44)
+
+OID = 06 03 55 04 2D
+Comment = X.520 id-at (2 5 4)
+Description = uniqueIdentifier (2 5 4 45)
+
+OID = 06 03 55 04 2E
+Comment = X.520 id-at (2 5 4)
+Description = dnQualifier (2 5 4 46)
+
+OID = 06 03 55 04 2F
+Comment = X.520 id-at (2 5 4)
+Description = enhancedSearchGuide (2 5 4 47)
+
+OID = 06 03 55 04 30
+Comment = X.520 id-at (2 5 4)
+Description = protocolInformation (2 5 4 48)
+
+OID = 06 03 55 04 31
+Comment = X.520 id-at (2 5 4)
+Description = distinguishedName (2 5 4 49)
+
+OID = 06 03 55 04 32
+Comment = X.520 id-at (2 5 4)
+Description = uniqueMember (2 5 4 50)
+
+OID = 06 03 55 04 33
+Comment = X.520 id-at (2 5 4)
+Description = houseIdentifier (2 5 4 51)
+
+OID = 06 03 55 04 34
+Comment = X.520 id-at (2 5 4)
+Description = supportedAlgorithms (2 5 4 52)
+
+OID = 06 03 55 04 35
+Comment = X.520 id-at (2 5 4)
+Description = deltaRevocationList (2 5 4 53)
+
+OID = 06 03 55 04 36
+Comment = X.520 id-at (2 5 4)
+Description = clearance (2 5 4 55)
+
+OID = 06 03 55 04 3A
+Comment = X.520 id-at (2 5 4)
+Description = crossCertificatePair (2 5 4 58)
+
+# X.500 object classes
+
+OID = 06 03 55 06 00
+Comment = X.520 objectClass (2 5 6)
+Description = top (2 5 6 0)
+
+OID = 06 03 55 06 01
+Comment = X.520 objectClass (2 5 6)
+Description = alias (2 5 6 1)
+
+OID = 06 03 55 06 02
+Comment = X.520 objectClass (2 5 6)
+Description = country (2 5 6 2)
+
+OID = 06 03 55 06 03
+Comment = X.520 objectClass (2 5 6)
+Description = locality (2 5 6 3)
+
+OID = 06 03 55 06 04
+Comment = X.520 objectClass (2 5 6)
+Description = organization (2 5 6 4)
+
+OID = 06 03 55 06 05
+Comment = X.520 objectClass (2 5 6)
+Description = organizationalUnit (2 5 6 5)
+
+OID = 06 03 55 06 06
+Comment = X.520 objectClass (2 5 6)
+Description = person (2 5 6 6)
+
+OID = 06 03 55 06 07
+Comment = X.520 objectClass (2 5 6)
+Description = organizationalPerson (2 5 6 7)
+
+OID = 06 03 55 06 08
+Comment = X.520 objectClass (2 5 6)
+Description = organizationalRole (2 5 6 8)
+
+OID = 06 03 55 06 09
+Comment = X.520 objectClass (2 5 6)
+Description = groupOfNames (2 5 6 9)
+
+OID = 06 03 55 06 0A
+Comment = X.520 objectClass (2 5 6)
+Description = residentialPerson (2 5 6 10)
+
+OID = 06 03 55 06 0B
+Comment = X.520 objectClass (2 5 6)
+Description = applicationProcess (2 5 6 11)
+
+OID = 06 03 55 06 0C
+Comment = X.520 objectClass (2 5 6)
+Description = applicationEntity (2 5 6 12)
+
+OID = 06 03 55 06 0D
+Comment = X.520 objectClass (2 5 6)
+Description = dSA (2 5 6 13)
+
+OID = 06 03 55 06 0E
+Comment = X.520 objectClass (2 5 6)
+Description = device (2 5 6 14)
+
+OID = 06 03 55 06 0F
+Comment = X.520 objectClass (2 5 6)
+Description = strongAuthenticationUser (2 5 6 15)
+
+OID = 06 03 55 06 10
+Comment = X.520 objectClass (2 5 6)
+Description = certificateAuthority (2 5 6 16)
+
+OID = 06 03 55 06 11
+Comment = X.520 objectClass (2 5 6)
+Description = groupOfUniqueNames (2 5 6 17)
+
+OID = 06 03 55 06 15
+Comment = X.520 objectClass (2 5 6)
+Description = pkiUser (2 5 6 21)
+
+OID = 06 03 55 06 16
+Comment = X.520 objectClass (2 5 6)
+Description = pkiCA (2 5 6 22)
+
+# X.500 algorithms
+
+OID = 06 02 55 08
+Description = X.500-Algorithms (2 5 8)
+
+OID = 06 03 55 08 01
+Description = X.500-Alg-Encryption (2 5 8 1)
+
+OID = 06 04 55 08 01 01
+Comment = X.500 algorithms.  Ambiguous, since no padding rules specified
+Description = rsa (2 5 8 1 1)
+Warning
+
+# X.509.  Some of the smaller values are from early X.509 drafts with
+# cross-pollination from X9.55 and are now deprecated.  Alternative OIDs are
+# marked if these are known.  In some cases there are multiple generations of
+# superseded OIDs
+
+OID = 06 03 55 1D 01
+Comment = X.509 id-ce (2 5 29).  Deprecated, use (2 5 29 35) instead
+Description = authorityKeyIdentifier (2 5 29 1)
+Warning
+
+OID = 06 03 55 1D 02
+Comment = X.509 id-ce (2 5 29).  Obsolete, use keyUsage/extKeyUsage instead
+Description = keyAttributes (2 5 29 2)
+Warning
+
+OID = 06 03 55 1D 03
+Comment = X.509 id-ce (2 5 29).  Deprecated, use (2 5 29 32) instead
+Description = certificatePolicies (2 5 29 3)
+Warning
+
+OID = 06 03 55 1D 04
+Comment = X.509 id-ce (2 5 29).  Obsolete, use keyUsage/extKeyUsage instead
+Description = keyUsageRestriction (2 5 29 4)
+Warning
+
+OID = 06 03 55 1D 05
+Comment = X.509 id-ce (2 5 29).  Deprecated, use (2 5 29 33) instead
+Description = policyMapping (2 5 29 5)
+Warning
+
+OID = 06 03 55 1D 06
+Comment = X.509 id-ce (2 5 29).  Obsolete, use nameConstraints instead
+Description = subtreesConstraint (2 5 29 6)
+Warning
+
+OID = 06 03 55 1D 07
+Comment = X.509 id-ce (2 5 29).  Deprecated, use (2 5 29 17) instead
+Description = subjectAltName (2 5 29 7)
+Warning
+
+OID = 06 03 55 1D 08
+Comment = X.509 id-ce (2 5 29).  Deprecated, use (2 5 29 18) instead
+Description = issuerAltName (2 5 29 8)
+Warning
+
+OID = 06 03 55 1D 09
+Comment = X.509 id-ce (2 5 29)
+Description = subjectDirectoryAttributes (2 5 29 9)
+
+OID = 06 03 55 1D 0A
+Comment = X.509 id-ce (2 5 29).  Deprecated, use (2 5 29 19) instead
+Description = basicConstraints (2 5 29 10)
+Warning
+
+OID = 06 03 55 1D 0B
+Comment = X.509 id-ce (2 5 29).  Deprecated, use (2 5 29 30) instead
+Description = nameConstraints (2 5 29 11)
+Warning
+
+OID = 06 03 55 1D 0C
+Comment = X.509 id-ce (2 5 29).  Deprecated, use (2 5 29 36) instead
+Description = policyConstraints (2 5 29 12)
+Warning
+
+OID = 06 03 55 1D 0D
+Comment = X.509 id-ce (2 5 29).  Deprecated, use (2 5 29 19) instead
+Description = basicConstraints (2 5 29 13)
+Warning
+
+OID = 06 03 55 1D 0E
+Comment = X.509 id-ce (2 5 29)
+Description = subjectKeyIdentifier (2 5 29 14)
+
+OID = 06 03 55 1D 0F
+Comment = X.509 id-ce (2 5 29)
+Description = keyUsage (2 5 29 15)
+
+OID = 06 03 55 1D 10
+Comment = X.509 id-ce (2 5 29)
+Description = privateKeyUsagePeriod (2 5 29 16)
+
+OID = 06 03 55 1D 11
+Comment = X.509 id-ce (2 5 29)
+Description = subjectAltName (2 5 29 17)
+
+OID = 06 03 55 1D 12
+Comment = X.509 id-ce (2 5 29)
+Description = issuerAltName (2 5 29 18)
+
+OID = 06 03 55 1D 13
+Comment = X.509 id-ce (2 5 29)
+Description = basicConstraints (2 5 29 19)
+
+OID = 06 03 55 1D 14
+Comment = X.509 id-ce (2 5 29)
+Description = cRLNumber (2 5 29 20)
+
+OID = 06 03 55 1D 15
+Comment = X.509 id-ce (2 5 29)
+Description = cRLReason (2 5 29 21)
+
+OID = 06 03 55 1D 16
+Comment = X.509 id-ce (2 5 29).  Deprecated, alternative OID uncertain
+Description = expirationDate (2 5 29 22)
+Warning
+
+OID = 06 03 55 1D 17
+Comment = X.509 id-ce (2 5 29)
+Description = instructionCode (2 5 29 23)
+
+OID = 06 03 55 1D 18
+Comment = X.509 id-ce (2 5 29)
+Description = invalidityDate (2 5 29 24)
+
+OID = 06 03 55 1D 19
+Comment = X.509 id-ce (2 5 29).  Deprecated, use (2 5 29 31) instead
+Description = cRLDistributionPoints (2 5 29 25)
+Warning
+
+OID = 06 03 55 1D 1A
+Comment = X.509 id-ce (2 5 29).  Deprecated, use (2 5 29 28) instead
+Description = issuingDistributionPoint (2 5 29 26)
+Warning
+
+OID = 06 03 55 1D 1B
+Comment = X.509 id-ce (2 5 29)
+Description = deltaCRLIndicator (2 5 29 27)
+
+OID = 06 03 55 1D 1C
+Comment = X.509 id-ce (2 5 29)
+Description = issuingDistributionPoint (2 5 29 28)
+
+OID = 06 03 55 1D 1D
+Comment = X.509 id-ce (2 5 29)
+Description = certificateIssuer (2 5 29 29)
+
+OID = 06 03 55 1D 1E
+Comment = X.509 id-ce (2 5 29)
+Description = nameConstraints (2 5 29 30)
+
+OID = 06 03 55 1D 1F
+Comment = X.509 id-ce (2 5 29)
+Description = cRLDistributionPoints (2 5 29 31)
+
+OID = 06 03 55 1D 20
+Comment = X.509 id-ce (2 5 29)
+Description = certificatePolicies (2 5 29 32)
+
+OID = 06 03 55 1D 21
+Comment = X.509 id-ce (2 5 29)
+Description = policyMappings (2 5 29 33)
+
+OID = 06 03 55 1D 22
+Comment = X.509 id-ce (2 5 29).  Deprecated, use (2 5 29 36) instead
+Description = policyConstraints (2 5 29 34)
+Warning
+
+OID = 06 03 55 1D 23
+Comment = X.509 id-ce (2 5 29)
+Description = authorityKeyIdentifier (2 5 29 35)
+
+OID = 06 03 55 1D 24
+Comment = X.509 id-ce (2 5 29)
+Description = policyConstraints (2 5 29 36)
+
+OID = 06 03 55 1D 25
+Comment = X.509 id-ce (2 5 29)
+Description = extKeyUsage (2 5 29 37)
+
+# DMS
+
+OID = 06 09 60 86 48 01 65 02 01 01 01
+Comment = SDN.700 INFOSEC algorithms
+Description = sdnsSignatureAlgorithm (2 16 840 1 101 2 1 1 1)
+
+OID = 06 09 60 86 48 01 65 02 01 01 02
+Comment = SDN.700 INFOSEC algorithms.  Formerly known as mosaicSignatureAlgorithm, this OID is better known as dsaWithSHA-1.
+Description = fortezzaSignatureAlgorithm (2 16 840 1 101 2 1 1 2)
+
+OID = 06 09 60 86 48 01 65 02 01 01 03
+Comment = SDN.700 INFOSEC algorithms
+Description = sdnsConfidentialityAlgorithm (2 16 840 1 101 2 1 1 3)
+
+OID = 06 09 60 86 48 01 65 02 01 01 04
+Comment = SDN.700 INFOSEC algorithms.  Formerly known as mosaicConfidentialityAlgorithm
+Description = fortezzaConfidentialityAlgorithm (2 16 840 1 101 2 1 1 4)
+
+OID = 06 09 60 86 48 01 65 02 01 01 05
+Comment = SDN.700 INFOSEC algorithms
+Description = sdnsIntegrityAlgorithm (2 16 840 1 101 2 1 1 5)
+
+OID = 06 09 60 86 48 01 65 02 01 01 06
+Comment = SDN.700 INFOSEC algorithms.  Formerly known as mosaicIntegrityAlgorithm
+Description = fortezzaIntegrityAlgorithm (2 16 840 1 101 2 1 1 6)
+
+OID = 06 09 60 86 48 01 65 02 01 01 07
+Comment = SDN.700 INFOSEC algorithms
+Description = sdnsTokenProtectionAlgorithm (2 16 840 1 101 2 1 1 7)
+
+OID = 06 09 60 86 48 01 65 02 01 01 08
+Comment = SDN.700 INFOSEC algorithms.  Formerly know as mosaicTokenProtectionAlgorithm
+Description = fortezzaTokenProtectionAlgorithm (2 16 840 1 101 2 1 1 8)
+
+OID = 06 09 60 86 48 01 65 02 01 01 09
+Comment = SDN.700 INFOSEC algorithms
+Description = sdnsKeyManagementAlgorithm (2 16 840 1 101 2 1 1 9)
+
+OID = 06 09 60 86 48 01 65 02 01 01 0A
+Comment = SDN.700 INFOSEC algorithms.  Formerly known as mosaicKeyManagementAlgorithm
+Description = fortezzaKeyManagementAlgorithm (2 16 840 1 101 2 1 1 10)
+
+OID = 06 09 60 86 48 01 65 02 01 01 0B
+Comment = SDN.700 INFOSEC algorithms
+Description = sdnsKMandSigAlgorithm (2 16 840 1 101 2 1 1 11)
+
+OID = 06 09 60 86 48 01 65 02 01 01 0C
+Comment = SDN.700 INFOSEC algorithms.  Formerly known as mosaicKMandSigAlgorithm
+Description = fortezzaKMandSigAlgorithm (2 16 840 1 101 2 1 1 12)
+
+OID = 06 09 60 86 48 01 65 02 01 01 0D
+Comment = SDN.700 INFOSEC algorithms
+Description = suiteASignatureAlgorithm (2 16 840 1 101 2 1 1 13)
+
+OID = 06 09 60 86 48 01 65 02 01 01 0E
+Comment = SDN.700 INFOSEC algorithms
+Description = suiteAConfidentialityAlgorithm (2 16 840 1 101 2 1 1 14)
+
+OID = 06 09 60 86 48 01 65 02 01 01 0F
+Comment = SDN.700 INFOSEC algorithms
+Description = suiteAIntegrityAlgorithm (2 16 840 1 101 2 1 1 15)
+
+OID = 06 09 60 86 48 01 65 02 01 01 10
+Comment = SDN.700 INFOSEC algorithms
+Description = suiteATokenProtectionAlgorithm (2 16 840 1 101 2 1 1 16)
+
+OID = 06 09 60 86 48 01 65 02 01 01 11
+Comment = SDN.700 INFOSEC algorithms
+Description = suiteAKeyManagementAlgorithm (2 16 840 1 101 2 1 1 17)
+
+OID = 06 09 60 86 48 01 65 02 01 01 12
+Comment = SDN.700 INFOSEC algorithms
+Description = suiteAKMandSigAlgorithm (2 16 840 1 101 2 1 1 18)
+
+OID = 06 09 60 86 48 01 65 02 01 01 13
+Comment = SDN.700 INFOSEC algorithms.  Formerly known as mosaicUpdatedSigAlgorithm
+Description = fortezzaUpdatedSigAlgorithm (2 16 840 1 101 2 1 1 19)
+
+OID = 06 09 60 86 48 01 65 02 01 01 14
+Comment = SDN.700 INFOSEC algorithms.  Formerly known as mosaicKMandUpdSigAlgorithms
+Description = fortezzaKMandUpdSigAlgorithms (2 16 840 1 101 2 1 1 20)
+
+OID = 06 09 60 86 48 01 65 02 01 01 15
+Comment = SDN.700 INFOSEC algorithms.  Formerly known as mosaicUpdatedIntegAlgorithm
+Description = fortezzaUpdatedIntegAlgorithm (2 16 840 1 101 2 1 1 21)
+
+OID = 06 09 60 86 48 01 65 02 01 01 16
+Comment = SDN.700 INFOSEC algorithms.  Formerly known as mosaicKeyEncryptionAlgorithm
+Description = keyExchangeAlgorithm (2 16 840 1 101 2 1 1 22)
+
+OID = 06 09 60 86 48 01 65 02 01 01 17
+Comment = SDN.700 INFOSEC algorithms
+Description = fortezzaWrap80Algorithm (2 16 840 1 101 2 1 1 23)
+
+OID = 06 09 60 86 48 01 65 02 01 01 18
+Comment = SDN.700 INFOSEC algorithms
+Description = kEAKeyEncryptionAlgorithm (2 16 840 1 101 2 1 1 24)
+
+OID = 06 09 60 86 48 01 65 02 01 02 01
+Comment = SDN.700 INFOSEC format
+Description = rfc822MessageFormat (2 16 840 1 101 2 1 2 1)
+
+OID = 06 09 60 86 48 01 65 02 01 02 02
+Comment = SDN.700 INFOSEC format
+Description = emptyContent (2 16 840 1 101 2 1 2 2)
+
+OID = 06 09 60 86 48 01 65 02 01 02 03
+Comment = SDN.700 INFOSEC format
+Description = cspContentType (2 16 840 1 101 2 1 2 3)
+
+OID = 06 09 60 86 48 01 65 02 01 02 2A
+Comment = SDN.700 INFOSEC format
+Description = mspRev3ContentType (2 16 840 1 101 2 1 2 42)
+
+OID = 06 09 60 86 48 01 65 02 01 02 30
+Comment = SDN.700 INFOSEC format
+Description = mspContentType (2 16 840 1 101 2 1 2 48)
+
+OID = 06 09 60 86 48 01 65 02 01 02 31
+Comment = SDN.700 INFOSEC format
+Description = mspRekeyAgentProtocol (2 16 840 1 101 2 1 2 49)
+
+OID = 06 09 60 86 48 01 65 02 01 02 32
+Comment = SDN.700 INFOSEC format
+Description = mspMMP (2 16 840 1 101 2 1 2 50)
+
+OID = 06 09 60 86 48 01 65 02 01 02 42
+Comment = SDN.700 INFOSEC format
+Description = mspRev3-1ContentType (2 16 840 1 101 2 1 2 66)
+
+OID = 06 09 60 86 48 01 65 02 01 02 48
+Comment = SDN.700 INFOSEC format
+Description = forwardedMSPMessageBodyPart (2 16 840 1 101 2 1 2 72)
+
+OID = 06 09 60 86 48 01 65 02 01 02 49
+Comment = SDN.700 INFOSEC format
+Description = mspForwardedMessageParameters (2 16 840 1 101 2 1 2 73)
+
+OID = 06 09 60 86 48 01 65 02 01 02 50
+Comment = SDN.700 INFOSEC format
+Description = forwardedCSPMsgBodyPart (2 16 840 1 101 2 1 2 74)
+
+OID = 06 09 60 86 48 01 65 02 01 02 51
+Comment = SDN.700 INFOSEC format
+Description = cspForwardedMessageParameters (2 16 840 1 101 2 1 2 75)
+
+OID = 06 09 60 86 48 01 65 02 01 02 52
+Comment = SDN.700 INFOSEC format
+Description = mspMMP2 (2 16 840 1 101 2 1 2 76)
+
+OID = 06 09 60 86 48 01 65 02 01 03 01
+Comment = SDN.700 INFOSEC policy
+Description = sdnsSecurityPolicy (2 16 840 1 101 2 1 3 1)
+
+OID = 06 09 60 86 48 01 65 02 01 03 02
+Comment = SDN.700 INFOSEC policy
+Description = sdnsPRBAC (2 16 840 1 101 2 1 3 2)
+
+OID = 06 09 60 86 48 01 65 02 01 03 03
+Comment = SDN.700 INFOSEC policy
+Description = mosaicPRBAC (2 16 840 1 101 2 1 3 3)
+
+OID = 06 09 60 86 48 01 65 02 01 03 0A
+Comment = SDN.700 INFOSEC policy
+Description = siSecurityPolicy (2 16 840 1 101 2 1 3 10)
+
+OID = 06 0A 60 86 48 01 65 02 01 03 0A 00
+Comment = SDN.700 INFOSEC policy (obsolete)
+Description = siNASP (2 16 840 1 101 2 1 3 10 0)
+Warning
+
+OID = 06 0A 60 86 48 01 65 02 01 03 0A 01
+Comment = SDN.700 INFOSEC policy (obsolete)
+Description = siELCO (2 16 840 1 101 2 1 3 10 1)
+Warning
+
+OID = 06 0A 60 86 48 01 65 02 01 03 0A 02
+Comment = SDN.700 INFOSEC policy (obsolete)
+Description = siTK (2 16 840 1 101 2 1 3 10 2)
+Warning
+
+OID = 06 0A 60 86 48 01 65 02 01 03 0A 03
+Comment = SDN.700 INFOSEC policy (obsolete)
+Description = siDSAP (2 16 840 1 101 2 1 3 10 3)
+Warning
+
+OID = 06 0A 60 86 48 01 65 02 01 03 0A 04
+Comment = SDN.700 INFOSEC policy (obsolete)
+Description = siSSSS (2 16 840 1 101 2 1 3 10 4)
+Warning
+
+OID = 06 0A 60 86 48 01 65 02 01 03 0A 05
+Comment = SDN.700 INFOSEC policy (obsolete)
+Description = siDNASP (2 16 840 1 101 2 1 3 10 5)
+Warning
+
+OID = 06 0A 60 86 48 01 65 02 01 03 0A 06
+Comment = SDN.700 INFOSEC policy (obsolete)
+Description = siBYEMAN (2 16 840 1 101 2 1 3 10 6)
+Warning
+
+OID = 06 0A 60 86 48 01 65 02 01 03 0A 07
+Comment = SDN.700 INFOSEC policy (obsolete)
+Description = siREL-US (2 16 840 1 101 2 1 3 10 7)
+Warning
+
+OID = 06 0A 60 86 48 01 65 02 01 03 0A 08
+Comment = SDN.700 INFOSEC policy (obsolete)
+Description = siREL-AUS (2 16 840 1 101 2 1 3 10 8)
+Warning
+
+OID = 06 0A 60 86 48 01 65 02 01 03 0A 09
+Comment = SDN.700 INFOSEC policy (obsolete)
+Description = siREL-CAN (2 16 840 1 101 2 1 3 10 9)
+Warning
+
+OID = 06 0A 60 86 48 01 65 02 01 03 0A 0A
+Comment = SDN.700 INFOSEC policy (obsolete)
+Description = siREL_UK (2 16 840 1 101 2 1 3 10 10)
+Warning
+
+OID = 06 0A 60 86 48 01 65 02 01 03 0A 0B
+Comment = SDN.700 INFOSEC policy (obsolete)
+Description = siREL-NZ (2 16 840 1 101 2 1 3 10 11)
+Warning
+
+OID = 06 0A 60 86 48 01 65 02 01 03 0A 0C
+Comment = SDN.700 INFOSEC policy (obsolete)
+Description = siGeneric (2 16 840 1 101 2 1 3 10 12)
+Warning
+
+OID = 06 09 60 86 48 01 65 02 01 03 0B
+Comment = SDN.700 INFOSEC policy
+Description = genser (2 16 840 1 101 2 1 3 11)
+
+OID = 06 0A 60 86 48 01 65 02 01 03 0B 00
+Comment = SDN.700 INFOSEC policy (obsolete)
+Description = genserNations (2 16 840 1 101 2 1 3 11 0)
+Warning
+
+OID = 06 0A 60 86 48 01 65 02 01 03 0B 01
+Comment = SDN.700 INFOSEC policy (obsolete)
+Description = genserComsec (2 16 840 1 101 2 1 3 11 1)
+Warning
+
+OID = 06 0A 60 86 48 01 65 02 01 03 0B 02
+Comment = SDN.700 INFOSEC policy (obsolete)
+Description = genserAcquisition (2 16 840 1 101 2 1 3 11 2)
+Warning
+
+OID = 06 0A 60 86 48 01 65 02 01 03 0B 03
+Comment = SDN.700 INFOSEC policy
+Description = genserSecurityCategories (2 16 840 1 101 2 1 3 11 3)
+
+OID = 06 0B 60 86 48 01 65 02 01 03 0B 03 00
+Comment = SDN.700 INFOSEC GENSER policy
+Description = genserTagSetName (2 16 840 1 101 2 1 3 11 3 0)
+
+OID = 06 09 60 86 48 01 65 02 01 03 0C
+Comment = SDN.700 INFOSEC policy
+Description = defaultSecurityPolicy (2 16 840 1 101 2 1 3 12)
+
+OID = 06 09 60 86 48 01 65 02 01 03 0D
+Comment = SDN.700 INFOSEC policy
+Description = capcoMarkings (2 16 840 1 101 2 1 3 13)
+
+OID = 06 0A 60 86 48 01 65 02 01 03 0D 00
+Comment = SDN.700 INFOSEC policy CAPCO markings
+Description = capcoSecurityCategories (2 16 840 1 101 2 1 3 13 0)
+
+OID = 06 0B 60 86 48 01 65 02 01 03 0D 00 01
+Comment = SDN.700 INFOSEC policy CAPCO markings
+Description = capcoTagSetName1 (2 16 840 1 101 2 1 3 13 0 1)
+
+OID = 06 0B 60 86 48 01 65 02 01 03 0D 00 02
+Comment = SDN.700 INFOSEC policy CAPCO markings
+Description = capcoTagSetName2 (2 16 840 1 101 2 1 3 13 0 2)
+
+OID = 06 0B 60 86 48 01 65 02 01 03 0D 00 03
+Comment = SDN.700 INFOSEC policy CAPCO markings
+Description = capcoTagSetName3 (2 16 840 1 101 2 1 3 13 0 3)
+
+OID = 06 0B 60 86 48 01 65 02 01 03 0D 00 04
+Comment = SDN.700 INFOSEC policy CAPCO markings
+Description = capcoTagSetName4 (2 16 840 1 101 2 1 3 13 0 4)
+
+OID = 06 09 60 86 48 01 65 02 01 05 01
+Comment = SDN.700 INFOSEC attributes (superseded)
+Description = sdnsKeyManagementCertificate (2 16 840 1 101 2 1 5 1)
+Warning
+
+OID = 06 09 60 86 48 01 65 02 01 05 02
+Comment = SDN.700 INFOSEC attributes (superseded)
+Description = sdnsUserSignatureCertificate (2 16 840 1 101 2 1 5 2)
+Warning
+
+OID = 06 09 60 86 48 01 65 02 01 05 03
+Comment = SDN.700 INFOSEC attributes (superseded)
+Description = sdnsKMandSigCertificate (2 16 840 1 101 2 1 5 3)
+Warning
+
+OID = 06 09 60 86 48 01 65 02 01 05 04
+Comment = SDN.700 INFOSEC attributes (superseded)
+Description = fortezzaKeyManagementCertificate (2 16 840 1 101 2 1 5 4)
+Warning
+
+OID = 06 09 60 86 48 01 65 02 01 05 05
+Comment = SDN.700 INFOSEC attributes (superseded)
+Description = fortezzaKMandSigCertificate (2 16 840 1 101 2 1 5 5)
+Warning
+
+OID = 06 09 60 86 48 01 65 02 01 05 06
+Comment = SDN.700 INFOSEC attributes (superseded)
+Description = fortezzaUserSignatureCertificate (2 16 840 1 101 2 1 5 6)
+Warning
+
+OID = 06 09 60 86 48 01 65 02 01 05 07
+Comment = SDN.700 INFOSEC attributes (superseded)
+Description = fortezzaCASignatureCertificate (2 16 840 1 101 2 1 5 7)
+Warning
+
+OID = 06 09 60 86 48 01 65 02 01 05 08
+Comment = SDN.700 INFOSEC attributes (superseded)
+Description = sdnsCASignatureCertificate (2 16 840 1 101 2 1 5 8)
+Warning
+
+OID = 06 09 60 86 48 01 65 02 01 05 0A
+Comment = SDN.700 INFOSEC attributes (superseded)
+Description = auxiliaryVector (2 16 840 1 101 2 1 5 10)
+Warning
+
+OID = 06 09 60 86 48 01 65 02 01 05 0B
+Comment = SDN.700 INFOSEC attributes
+Description = mlReceiptPolicy (2 16 840 1 101 2 1 5 11)
+
+OID = 06 09 60 86 48 01 65 02 01 05 0C
+Comment = SDN.700 INFOSEC attributes
+Description = mlMembership (2 16 840 1 101 2 1 5 12)
+
+OID = 06 09 60 86 48 01 65 02 01 05 0D
+Comment = SDN.700 INFOSEC attributes
+Description = mlAdministrators (2 16 840 1 101 2 1 5 13)
+
+OID = 06 09 60 86 48 01 65 02 01 05 0E
+Comment = SDN.700 INFOSEC attributes
+Description = alid (2 16 840 1 101 2 1 5 14)
+
+OID = 06 09 60 86 48 01 65 02 01 05 14
+Comment = SDN.700 INFOSEC attributes
+Description = janUKMs (2 16 840 1 101 2 1 5 20)
+
+OID = 06 09 60 86 48 01 65 02 01 05 15
+Comment = SDN.700 INFOSEC attributes
+Description = febUKMs (2 16 840 1 101 2 1 5 21)
+
+OID = 06 09 60 86 48 01 65 02 01 05 16
+Comment = SDN.700 INFOSEC attributes
+Description = marUKMs (2 16 840 1 101 2 1 5 22)
+
+OID = 06 09 60 86 48 01 65 02 01 05 17
+Comment = SDN.700 INFOSEC attributes
+Description = aprUKMs (2 16 840 1 101 2 1 5 23)
+
+OID = 06 09 60 86 48 01 65 02 01 05 18
+Comment = SDN.700 INFOSEC attributes
+Description = mayUKMs (2 16 840 1 101 2 1 5 24)
+
+OID = 06 09 60 86 48 01 65 02 01 05 19
+Comment = SDN.700 INFOSEC attributes
+Description = junUKMs (2 16 840 1 101 2 1 5 25)
+
+OID = 06 09 60 86 48 01 65 02 01 05 1A
+Comment = SDN.700 INFOSEC attributes
+Description = julUKMs (2 16 840 1 101 2 1 5 26)
+
+OID = 06 09 60 86 48 01 65 02 01 05 1B
+Comment = SDN.700 INFOSEC attributes
+Description = augUKMs (2 16 840 1 101 2 1 5 27)
+
+OID = 06 09 60 86 48 01 65 02 01 05 1C
+Comment = SDN.700 INFOSEC attributes
+Description = sepUKMs (2 16 840 1 101 2 1 5 28)
+
+OID = 06 09 60 86 48 01 65 02 01 05 1D
+Comment = SDN.700 INFOSEC attributes
+Description = octUKMs (2 16 840 1 101 2 1 5 29)
+
+OID = 06 09 60 86 48 01 65 02 01 05 1E
+Comment = SDN.700 INFOSEC attributes
+Description = novUKMs (2 16 840 1 101 2 1 5 30)
+
+OID = 06 09 60 86 48 01 65 02 01 05 1F
+Comment = SDN.700 INFOSEC attributes
+Description = decUKMs (2 16 840 1 101 2 1 5 31)
+
+OID = 06 09 60 86 48 01 65 02 01 05 28
+Comment = SDN.700 INFOSEC attributes
+Description = metaSDNSckl (2 16 840 1 101 2 1 5 40)
+
+OID = 06 09 60 86 48 01 65 02 01 05 29
+Comment = SDN.700 INFOSEC attributes
+Description = sdnsCKL (2 16 840 1 101 2 1 5 41)
+
+OID = 06 09 60 86 48 01 65 02 01 05 2A
+Comment = SDN.700 INFOSEC attributes
+Description = metaSDNSsignatureCKL (2 16 840 1 101 2 1 5 42)
+
+OID = 06 09 60 86 48 01 65 02 01 05 2B
+Comment = SDN.700 INFOSEC attributes
+Description = sdnsSignatureCKL (2 16 840 1 101 2 1 5 43)
+
+OID = 06 09 60 86 48 01 65 02 01 05 2C
+Comment = SDN.700 INFOSEC attributes
+Description = sdnsCertificateRevocationList (2 16 840 1 101 2 1 5 44)
+
+OID = 06 09 60 86 48 01 65 02 01 05 2D
+Comment = SDN.700 INFOSEC attributes (superseded)
+Description = fortezzaCertificateRevocationList (2 16 840 1 101 2 1 5 45)
+Warning
+
+OID = 06 09 60 86 48 01 65 02 01 05 2E
+Comment = SDN.700 INFOSEC attributes
+Description = fortezzaCKL (2 16 840 1 101 2 1 5 46)
+
+OID = 06 09 60 86 48 01 65 02 01 05 2F
+Comment = SDN.700 INFOSEC attributes
+Description = alExemptedAddressProcessor (2 16 840 1 101 2 1 5 47)
+
+OID = 06 09 60 86 48 01 65 02 01 05 30
+Comment = SDN.700 INFOSEC attributes (obsolete)
+Description = guard (2 16 840 1 101 2 1 5 48)
+Warning
+
+OID = 06 09 60 86 48 01 65 02 01 05 31
+Comment = SDN.700 INFOSEC attributes (obsolete)
+Description = algorithmsSupported (2 16 840 1 101 2 1 5 49)
+Warning
+
+OID = 06 09 60 86 48 01 65 02 01 05 32
+Comment = SDN.700 INFOSEC attributes (obsolete)
+Description = suiteAKeyManagementCertificate (2 16 840 1 101 2 1 5 50)
+Warning
+
+OID = 06 09 60 86 48 01 65 02 01 05 33
+Comment = SDN.700 INFOSEC attributes (obsolete)
+Description = suiteAKMandSigCertificate (2 16 840 1 101 2 1 5 51)
+Warning
+
+OID = 06 09 60 86 48 01 65 02 01 05 34
+Comment = SDN.700 INFOSEC attributes (obsolete)
+Description = suiteAUserSignatureCertificate (2 16 840 1 101 2 1 5 52)
+Warning
+
+OID = 06 09 60 86 48 01 65 02 01 05 35
+Comment = SDN.700 INFOSEC attributes
+Description = prbacInfo (2 16 840 1 101 2 1 5 53)
+
+OID = 06 09 60 86 48 01 65 02 01 05 36
+Comment = SDN.700 INFOSEC attributes
+Description = prbacCAConstraints (2 16 840 1 101 2 1 5 54)
+
+OID = 06 09 60 86 48 01 65 02 01 05 37
+Comment = SDN.700 INFOSEC attributes
+Description = sigOrKMPrivileges (2 16 840 1 101 2 1 5 55)
+
+OID = 06 09 60 86 48 01 65 02 01 05 38
+Comment = SDN.700 INFOSEC attributes
+Description = commPrivileges (2 16 840 1 101 2 1 5 56)
+
+OID = 06 09 60 86 48 01 65 02 01 05 39
+Comment = SDN.700 INFOSEC attributes
+Description = labeledAttribute (2 16 840 1 101 2 1 5 57)
+
+OID = 06 09 60 86 48 01 65 02 01 05 3A
+Comment = SDN.700 INFOSEC attributes (obsolete)
+Description = policyInformationFile (2 16 840 1 101 2 1 5 58)
+Warning
+
+OID = 06 09 60 86 48 01 65 02 01 05 3B
+Comment = SDN.700 INFOSEC attributes
+Description = secPolicyInformationFile (2 16 840 1 101 2 1 5 59)
+
+OID = 06 09 60 86 48 01 65 02 01 05 3C
+Comment = SDN.700 INFOSEC attributes
+Description = cAClearanceConstraint (2 16 840 1 101 2 1 5 60)
+
+OID = 06 09 60 86 48 01 65 02 01 07 01
+Comment = SDN.700 INFOSEC extensions
+Description = cspExtns (2 16 840 1 101 2 1 7 1)
+
+OID = 06 0A 60 86 48 01 65 02 01 07 01 00
+Comment = SDN.700 INFOSEC extensions
+Description = cspCsExtn (2 16 840 1 101 2 1 7 1 0)
+
+OID = 06 09 60 86 48 01 65 02 01 08 01
+Comment = SDN.700 INFOSEC security category
+Description = mISSISecurityCategories (2 16 840 1 101 2 1 8 1)
+
+OID = 06 09 60 86 48 01 65 02 01 08 02
+Comment = SDN.700 INFOSEC security category
+Description = standardSecurityLabelPrivileges (2 16 840 1 101 2 1 8 2)
+
+OID = 06 09 60 86 48 01 65 02 01 0A 01
+Comment = SDN.700 INFOSEC privileges
+Description = sigPrivileges (2 16 840 1 101 2 1 10 1)
+
+OID = 06 09 60 86 48 01 65 02 01 0A 02
+Comment = SDN.700 INFOSEC privileges
+Description = kmPrivileges (2 16 840 1 101 2 1 10 2)
+
+OID = 06 09 60 86 48 01 65 02 01 0A 03
+Comment = SDN.700 INFOSEC privileges
+Description = namedTagSetPrivilege (2 16 840 1 101 2 1 10 3)
+
+OID = 06 09 60 86 48 01 65 02 01 0B 01
+Comment = SDN.700 INFOSEC certificate policy
+Description = ukDemo (2 16 840 1 101 2 1 11 1)
+
+OID = 06 09 60 86 48 01 65 02 01 0B 02
+Comment = SDN.700 INFOSEC certificate policy
+Description = usDODClass2 (2 16 840 1 101 2 1 11 2)
+
+OID = 06 09 60 86 48 01 65 02 01 0B 03
+Comment = SDN.700 INFOSEC certificate policy
+Description = usMediumPilot (2 16 840 1 101 2 1 11 3)
+
+OID = 06 09 60 86 48 01 65 02 01 0B 04
+Comment = SDN.700 INFOSEC certificate policy
+Description = usDODClass4 (2 16 840 1 101 2 1 11 4)
+
+OID = 06 09 60 86 48 01 65 02 01 0B 05
+Comment = SDN.700 INFOSEC certificate policy
+Description = usDODClass3 (2 16 840 1 101 2 1 11 5)
+
+OID = 06 09 60 86 48 01 65 02 01 0B 06
+Comment = SDN.700 INFOSEC certificate policy
+Description = usDODClass5 (2 16 840 1 101 2 1 11 6)
+
+OID = 06 09 60 86 48 01 65 02 01 0C 00
+Comment = SDN.700 INFOSEC test objects
+Description = testSecurityPolicy (2 16 840 1 101 2 1 12 0)
+
+OID = 06 0A 60 86 48 01 65 02 01 0C 00 01
+Comment = SDN.700 INFOSEC test objects
+Description = tsp1 (2 16 840 1 101 2 1 12 0 1)
+
+OID = 06 0B 60 86 48 01 65 02 01 0C 00 01 00
+Comment = SDN.700 INFOSEC test objects
+Description = tsp1SecurityCategories (2 16 840 1 101 2 1 12 0 1 0)
+
+OID = 06 0B 60 86 48 01 65 02 01 0C 00 01 00 00
+Comment = SDN.700 INFOSEC test objects
+Description = tsp1TagSetZero (2 16 840 1 101 2 1 12 0 1 0 0)
+
+OID = 06 0B 60 86 48 01 65 02 01 0C 00 01 00 01
+Comment = SDN.700 INFOSEC test objects
+Description = tsp1TagSetOne (2 16 840 1 101 2 1 12 0 1 0 1)
+
+OID = 06 0B 60 86 48 01 65 02 01 0C 00 01 00 02
+Comment = SDN.700 INFOSEC test objects
+Description = tsp1TagSetTwo (2 16 840 1 101 2 1 12 0 1 0 2)
+
+OID = 06 0A 60 86 48 01 65 02 01 0C 00 02
+Comment = SDN.700 INFOSEC test objects
+Description = tsp2 (2 16 840 1 101 2 1 12 0 2)
+
+OID = 06 0B 60 86 48 01 65 02 01 0C 00 02 00
+Comment = SDN.700 INFOSEC test objects
+Description = tsp2SecurityCategories (2 16 840 1 101 2 1 12 0 2 0)
+
+OID = 06 0B 60 86 48 01 65 02 01 0C 00 02 00 00
+Comment = SDN.700 INFOSEC test objects
+Description = tsp2TagSetZero (2 16 840 1 101 2 1 12 0 2 0 0)
+
+OID = 06 0B 60 86 48 01 65 02 01 0C 00 02 00 01
+Comment = SDN.700 INFOSEC test objects
+Description = tsp2TagSetOne (2 16 840 1 101 2 1 12 0 2 0 1)
+
+OID = 06 0B 60 86 48 01 65 02 01 0C 00 02 00 02
+Comment = SDN.700 INFOSEC test objects
+Description = tsp2TagSetTwo (2 16 840 1 101 2 1 12 0 2 0 2)
+
+# At least someone there has a sense of humour :-)
+OID = 06 0A 60 86 48 01 65 02 01 0C 00 03
+Comment = SDN.700 INFOSEC test objects
+Description = kafka (2 16 840 1 101 2 1 12 0 3)
+
+OID = 06 0B 60 86 48 01 65 02 01 0C 00 03 00
+Comment = SDN.700 INFOSEC test objects
+Description = kafkaSecurityCategories (2 16 840 1 101 2 1 12 0 3 0)
+
+OID = 06 0B 60 86 48 01 65 02 01 0C 00 03 00 01
+Comment = SDN.700 INFOSEC test objects
+Description = kafkaTagSetName1 (2 16 840 1 101 2 1 12 0 3 0 1)
+
+OID = 06 0B 60 86 48 01 65 02 01 0C 00 03 00 02
+Comment = SDN.700 INFOSEC test objects
+Description = kafkaTagSetName2 (2 16 840 1 101 2 1 12 0 3 0 2)
+
+OID = 06 0B 60 86 48 01 65 02 01 0C 00 03 00 03
+Comment = SDN.700 INFOSEC test objects
+Description = kafkaTagSetName3 (2 16 840 1 101 2 1 12 0 3 0 3)
+
+OID = 06 0A 60 86 48 01 65 02 01 0C 01 01
+Comment = SDN.700 INFOSEC test objects
+Description = tcp1 (2 16 840 1 101 2 1 12 1 1)
+
+# CSOR GAK-FIPS
+
+OID = 06 07 60 86 48 01 65 03 01
+Comment = CSOR GAK
+Description = slabel (2 16 840 1 101 3 1)
+Warning
+
+OID = 06 07 60 86 48 01 65 03 02
+Comment = CSOR GAK
+Description = pki (2 16 840 1 101 3 2)
+Warning
+
+OID = 06 08 60 86 48 01 65 03 02 01
+Comment = CSOR GAK policy
+Description = GAK policyIdentifier (2 16 840 1 101 3 2 1)
+Warning
+
+OID = 06 08 60 86 48 01 65 03 02 02
+Comment = CSOR GAK extended key usage
+Description = GAK (2 16 840 1 101 3 2 2)
+Warning
+
+OID = 06 09 60 86 48 01 65 03 02 02 01
+Comment = CSOR GAK extended key usage
+Description = kRAKey (2 16 840 1 101 3 2 2 1)
+Warning
+
+OID = 06 08 60 86 48 01 65 03 02 03
+Comment = CSOR GAK extensions
+Description = extensions (2 16 840 1 101 3 2 3)
+Warning
+
+OID = 06 09 60 86 48 01 65 03 02 03 01
+Comment = CSOR GAK extensions
+Description = kRTechnique (2 16 840 1 101 3 2 3 1)
+Warning
+
+OID = 06 09 60 86 48 01 65 03 02 03 02
+Comment = CSOR GAK extensions
+Description = kRecoveryCapable (2 16 840 1 101 3 2 3 2)
+Warning
+
+OID = 06 09 60 86 48 01 65 03 02 03 03
+Comment = CSOR GAK extensions
+Description = kR (2 16 840 1 101 3 2 3 3)
+Warning
+
+OID = 06 08 60 86 48 01 65 03 02 04
+Comment = CSOR GAK
+Description = keyrecoveryschemes (2 16 840 1 101 3 2 4)
+Warning
+
+OID = 06 08 60 86 48 01 65 03 02 05
+Comment = CSOR GAK
+Description = krapola (2 16 840 1 101 3 2 5)
+Warning
+
+OID = 06 07 60 86 48 01 65 03 03
+Comment = CSOR GAK
+Description = arpa (2 16 840 1 101 3 3)
+Warning
+
+# CSOR (NIST) Algorithms
+
+OID = 06 07 60 86 48 01 65 03 04
+Comment = NIST Algorithm
+Description = nistAlgorithm (2 16 840 1 101 3 4)
+
+OID = 06 08 60 86 48 01 65 03 04 01
+Comment = NIST Algorithm
+Description = aes (2 16 840 1 101 3 4 1)
+
+OID = 06 09 60 86 48 01 65 03 04 01 01
+Comment = NIST Algorithm
+Description = aes128-ECB (2 16 840 1 101 3 4 1 1)
+
+OID = 06 09 60 86 48 01 65 03 04 01 02
+Comment = NIST Algorithm
+Description = aes128-CBC (2 16 840 1 101 3 4 1 2)
+
+OID = 06 09 60 86 48 01 65 03 04 01 03
+Comment = NIST Algorithm
+Description = aes128-OFB (2 16 840 1 101 3 4 1 3)
+
+OID = 06 09 60 86 48 01 65 03 04 01 04
+Comment = NIST Algorithm
+Description = aes128-CFB (2 16 840 1 101 3 4 1 4)
+
+OID = 06 09 60 86 48 01 65 03 04 01 15
+Comment = NIST Algorithm
+Description = aes192-ECB (2 16 840 1 101 3 4 1 21)
+
+OID = 06 09 60 86 48 01 65 03 04 01 16
+Comment = NIST Algorithm
+Description = aes192-CBC (2 16 840 1 101 3 4 1 22)
+
+OID = 06 09 60 86 48 01 65 03 04 01 17
+Comment = NIST Algorithm
+Description = aes192-OFB (2 16 840 1 101 3 4 1 23)
+
+OID = 06 09 60 86 48 01 65 03 04 01 18
+Comment = NIST Algorithm
+Description = aes192-CFB (2 16 840 1 101 3 4 1 24)
+
+OID = 06 09 60 86 48 01 65 03 04 01 29
+Comment = NIST Algorithm
+Description = aes256-ECB (2 16 840 1 101 3 4 1 41)
+
+OID = 06 09 60 86 48 01 65 03 04 01 2A
+Comment = NIST Algorithm
+Description = aes256-CBC (2 16 840 1 101 3 4 1 42)
+
+OID = 06 09 60 86 48 01 65 03 04 01 2B
+Comment = NIST Algorithm
+Description = aes256-OFB (2 16 840 1 101 3 4 1 43)
+
+OID = 06 09 60 86 48 01 65 03 04 01 2C
+Comment = NIST Algorithm
+Description = aes256-CFB (2 16 840 1 101 3 4 1 44)
+
+# Novell
+
+OID = 06 0A 60 86 48 01 86 F8 37 01 02 08
+Comment = Novell
+Description = novellAlgorithm (2 16 840 1 113719 1 2 8)
+
+OID = 06 0B 60 86 48 01 86 F8 37 01 02 08 16
+Comment = Novell encryption algorithm
+Description = desCbcIV8 (2 16 840 1 113719 1 2 8 22)
+
+OID = 06 0B 60 86 48 01 86 F8 37 01 02 08 17
+Comment = Novell encryption algorithm
+Description = desCbcPadIV8 (2 16 840 1 113719 1 2 8 23)
+
+OID = 06 0B 60 86 48 01 86 F8 37 01 02 08 18
+Comment = Novell encryption algorithm
+Description = desEDE2CbcIV8 (2 16 840 1 113719 1 2 8 24)
+
+OID = 06 0B 60 86 48 01 86 F8 37 01 02 08 19
+Comment = Novell encryption algorithm
+Description = desEDE2CbcPadIV8 (2 16 840 1 113719 1 2 8 25)
+
+OID = 06 0B 60 86 48 01 86 F8 37 01 02 08 1A
+Comment = Novell encryption algorithm
+Description = desEDE3CbcIV8 (2 16 840 1 113719 1 2 8 26)
+
+OID = 06 0B 60 86 48 01 86 F8 37 01 02 08 1B
+Comment = Novell encryption algorithm
+Description = desEDE3CbcPadIV8 (2 16 840 1 113719 1 2 8 27)
+
+OID = 06 0B 60 86 48 01 86 F8 37 01 02 08 1C
+Comment = Novell encryption algorithm
+Description = rc5CbcPad (2 16 840 1 113719 1 2 8 28)
+
+OID = 06 0B 60 86 48 01 86 F8 37 01 02 08 1D
+Comment = Novell signature algorithm
+Description = md2WithRSAEncryptionBSafe1 (2 16 840 1 113719 1 2 8 29)
+
+OID = 06 0B 60 86 48 01 86 F8 37 01 02 08 1E
+Comment = Novell signature algorithm
+Description = md5WithRSAEncryptionBSafe1 (2 16 840 1 113719 1 2 8 30)
+
+OID = 06 0B 60 86 48 01 86 F8 37 01 02 08 1F
+Comment = Novell signature algorithm
+Description = sha1WithRSAEncryptionBSafe1 (2 16 840 1 113719 1 2 8 31)
+
+OID = 06 0B 60 86 48 01 86 F8 37 01 02 08 20
+Comment = Novell digest algorithm
+Description = LMDigest (2 16 840 1 113719 1 2 8 32)
+
+OID = 06 0B 60 86 48 01 86 F8 37 01 02 08 28
+Comment = Novell digest algorithm
+Description = MD2 (2 16 840 1 113719 1 2 8 40)
+
+OID = 06 0B 60 86 48 01 86 F8 37 01 02 08 32
+Comment = Novell digest algorithm
+Description = MD5 (2 16 840 1 113719 1 2 8 50)
+
+OID = 06 0B 60 86 48 01 86 F8 37 01 02 08 33
+Comment = Novell signature algorithm
+Description = IKEhmacWithSHA1-RSA (2 16 840 1 113719 1 2 8 51)
+
+OID = 06 0B 60 86 48 01 86 F8 37 01 02 08 34
+Comment = Novell signature algorithm
+Description = IKEhmacWithMD5-RSA (2 16 840 1 113719 1 2 8 52)
+
+OID = 06 0B 60 86 48 01 86 F8 37 01 02 08 45
+Comment = Novell encryption algorithm
+Description = rc2CbcPad (2 16 840 1 113719 1 2 8 69)
+
+OID = 06 0B 60 86 48 01 86 F8 37 01 02 08 52
+Comment = Novell digest algorithm
+Description = SHA-1 (2 16 840 1 113719 1 2 8 82)
+
+OID = 06 0B 60 86 48 01 86 F8 37 01 02 08 5C
+Comment = Novell encryption algorithm
+Description = rc2BSafe1Cbc (2 16 840 1 113719 1 2 8 92)
+
+OID = 06 0B 60 86 48 01 86 F8 37 01 02 08 5F
+Comment = Novell digest algorithm
+Description = MD4 (2 16 840 1 113719 1 2 8 95)
+
+OID = 06 0B 60 86 48 01 86 F8 37 01 02 08 81 02
+Comment = Novell keyed hash
+Description = MD4Packet (2 16 840 1 113719 1 2 8 130)
+
+OID = 06 0C 60 86 48 01 86 F8 37 01 02 08 81 03
+Comment = Novell encryption algorithm
+Description = rsaEncryptionBsafe1 (2 16 840 1 113719 1 2 8 131)
+
+OID = 06 0C 60 86 48 01 86 F8 37 01 02 08 81 04
+Comment = Novell encryption algorithm
+Description = NWPassword (2 16 840 1 113719 1 2 8 132)
+
+OID = 06 0B 60 86 48 01 86 F8 37 01 02 08 81 05
+Comment = Novell encryption algorithm
+Description = novellObfuscate-1 (2 16 840 1 113719 1 2 8 133)
+
+OID = 06 09 60 86 48 01 86 F8 37 01 09
+Comment = Novell
+Description = pki (2 16 840 1 113719 1 9)
+
+OID = 06 0A 60 86 48 01 86 F8 37 01 09 04
+Comment = Novell PKI
+Description = pkiAttributeType (2 16 840 1 113719 1 9 4)
+
+OID = 06 0B 60 86 48 01 86 F8 37 01 09 04 01
+Comment = Novell PKI attribute type
+Description = securityAttributes (2 16 840 1 113719 1 9 4 1)
+
+OID = 06 0B 60 86 48 01 86 F8 37 01 09 04 02
+Comment = Novell PKI attribute type
+Description = relianceLimit (2 16 840 1 113719 1 9 4 2)
+
+# Netscape
+
+OID = 06 08 60 86 48 01 86 F8 42 01
+Comment = Netscape
+Description = cert-extension (2 16 840 1 113730 1)
+
+OID = 06 09 60 86 48 01 86 F8 42 01 01
+Comment = Netscape certificate extension
+Description = netscape-cert-type (2 16 840 1 113730 1 1)
+
+OID = 06 09 60 86 48 01 86 F8 42 01 02
+Comment = Netscape certificate extension
+Description = netscape-base-url (2 16 840 1 113730 1 2)
+
+OID = 06 09 60 86 48 01 86 F8 42 01 03
+Comment = Netscape certificate extension
+Description = netscape-revocation-url (2 16 840 1 113730 1 3)
+
+OID = 06 09 60 86 48 01 86 F8 42 01 04
+Comment = Netscape certificate extension
+Description = netscape-ca-revocation-url (2 16 840 1 113730 1 4)
+
+OID = 06 09 60 86 48 01 86 F8 42 01 07
+Comment = Netscape certificate extension
+Description = netscape-cert-renewal-url (2 16 840 1 113730 1 7)
+
+OID = 06 09 60 86 48 01 86 F8 42 01 08
+Comment = Netscape certificate extension
+Description = netscape-ca-policy-url (2 16 840 1 113730 1 8)
+
+OID = 06 09 60 86 48 01 86 F8 42 01 09
+Comment = Netscape certificate extension
+Description = HomePage-url (2 16 840 1 113730 1 9)
+
+OID = 06 09 60 86 48 01 86 F8 42 01 0A
+Comment = Netscape certificate extension
+Description = EntityLogo (2 16 840 1 113730 1 10)
+
+OID = 06 09 60 86 48 01 86 F8 42 01 0B
+Comment = Netscape certificate extension
+Description = UserPicture (2 16 840 1 113730 1 11)
+
+OID = 06 09 60 86 48 01 86 F8 42 01 0C
+Comment = Netscape certificate extension
+Description = netscape-ssl-server-name (2 16 840 1 113730 1 12)
+
+OID = 06 09 60 86 48 01 86 F8 42 01 0D
+Comment = Netscape certificate extension
+Description = netscape-comment (2 16 840 1 113730 1 13)
+
+OID = 06 08 60 86 48 01 86 F8 42 02
+Comment = Netscape
+Description = data-type (2 16 840 1 113730 2)
+
+OID = 06 09 60 86 48 01 86 F8 42 02 01
+Comment = Netscape data type
+Description = dataGIF (2 16 840 1 113730 2 1)
+
+OID = 06 09 60 86 48 01 86 F8 42 02 02
+Comment = Netscape data type
+Description = dataJPEG (2 16 840 1 113730 2 2)
+
+OID = 06 09 60 86 48 01 86 F8 42 02 03
+Comment = Netscape data type
+Description = dataURL (2 16 840 1 113730 2 3)
+
+OID = 06 09 60 86 48 01 86 F8 42 02 04
+Comment = Netscape data type
+Description = dataHTML (2 16 840 1 113730 2 4)
+
+OID = 06 09 60 86 48 01 86 F8 42 02 05
+Comment = Netscape data type
+Description = certSequence (2 16 840 1 113730 2 5)
+
+OID = 06 09 60 86 48 01 86 F8 42 02 06
+Comment = Netscape certificate extension
+Description = certURL (2 16 840 1 113730 2 6)
+
+OID = 06 08 60 86 48 01 86 F8 42 03
+Comment = Netscape
+Description = directory (2 16 840 1 113730 3)
+
+OID = 06 09 60 86 48 01 86 F8 42 03 01
+Comment = Netscape directory
+Description = ldapDefinitions (2 16 840 1 113730 3 1)
+
+OID = 06 0A 60 86 48 01 86 F8 42 03 01 01
+Comment = Netscape LDAP definitions
+Description = carLicense (2 16 840 1 113730 3 1 1)
+
+OID = 06 0A 60 86 48 01 86 F8 42 03 01 02
+Comment = Netscape LDAP definitions
+Description = departmentNumber (2 16 840 1 113730 3 1 2)
+
+OID = 06 0A 60 86 48 01 86 F8 42 03 01 03
+Comment = Netscape LDAP definitions
+Description = employeeNumber (2 16 840 1 113730 3 1 3)
+
+OID = 06 0A 60 86 48 01 86 F8 42 03 01 04
+Comment = Netscape LDAP definitions
+Description = employeeType (2 16 840 1 113730 3 1 4)
+
+OID = 06 0A 60 86 48 01 86 F8 42 03 02 02
+Comment = Netscape LDAP definitions
+Description = inetOrgPerson (2 16 840 1 113730 3 2 2)
+
+OID = 06 09 60 86 48 01 86 F8 42 04 01
+Comment = Netscape
+Description = serverGatedCrypto (2 16 840 1 113730 4 1)
+
+# Verisign
+
+# Country, zip, date of birth (age), and gender of cert owner (CZAG) in
+# obfuscated form
+OID = 06 0A 60 86 48 01 86 F8 45 01 06 03
+Comment = Verisign
+Description = verisignCZAG (2 16 840 1 113733 1 6 3)
+
+# Text string used in certs issued to Netscape InBox customers
+OID = 06 0A 60 86 48 01 86 F8 45 01 06 06
+Comment = Verisign
+Description = verisignInBox (2 16 840 1 113733 1 6 6)
+
+OID = 06 0A 60 86 48 01 86 F8 45 01 06 0B
+Comment = Verisign
+Description = Unknown Verisign VPN extension (2 16 840 1 113733 1 6 11)
+
+OID = 06 0A 60 86 48 01 86 F8 45 01 06 0D
+Comment = Verisign
+Description = Unknown Verisign VPN extension (2 16 840 1 113733 1 6 13)
+
+OID = 06 0B 60 86 48 01 86 F8 45 01 07 01 01
+Comment = Verisign
+Description = Verisign certificatePolicy (2 16 840 1 113733 1 7 1 1)
+
+OID = 06 0C 60 86 48 01 86 F8 45 01 07 01 01 01
+Comment = Verisign (obsolete)
+Description = verisignCPSv1notice (2 16 840 1 113733 1 7 1 1 1)
+
+# DN contains non-verified subscriber information
+OID = 06 0C 60 86 48 01 86 F8 45 01 07 01 01 02
+Comment = Verisign (obsolete)
+Description = verisignCPSv1nsi (2 16 840 1 113733 1 7 1 1 2)
+
+OID = 06 0A 60 86 48 01 86 F8 45 01 08 01
+Comment = Verisign
+Description = Verisign SGC CA? (2 16 840 1 113733 1 8 1)
+
+# SET
+
+OID = 06 03 67 2A 00
+Comment = SET
+Description = contentType (2 23 42 0)
+
+OID = 06 04 67 2A 00 00
+Comment = SET contentType
+Description = PANData (2 23 42 0 0)
+
+OID = 06 04 67 2A 00 01
+Comment = SET contentType
+Description = PANToken (2 23 42 0 1)
+
+OID = 06 04 67 2A 00 02
+Comment = SET contentType
+Description = PANOnly (2 23 42 0 2)
+
+# And on and on and on for another 80-odd OIDs which I'm not going to type in
+
+OID = 06 03 67 2A 01
+Comment = SET
+Description = msgExt (2 23 42 1)
+
+OID = 06 03 67 2A 02
+Comment = SET
+Description = field (2 23 42 2)
+
+OID = 06 04 67 2A 02 00
+Comment = SET field
+Description = fullName (2 23 42 2 0)
+
+OID = 06 04 67 2A 02 01
+Comment = SET field
+Description = givenName (2 23 42 2 1)
+
+OID = 06 04 67 2A 02 02
+Comment = SET field
+Description = familyName (2 23 42 2 2)
+
+OID = 06 04 67 2A 02 03
+Comment = SET field
+Description = birthFamilyName (2 23 42 2 3)
+
+OID = 06 04 67 2A 02 04
+Comment = SET field
+Description = placeName (2 23 42 2 4)
+
+OID = 06 04 67 2A 02 05
+Comment = SET field
+Description = identificationNumber (2 23 42 2 5)
+
+OID = 06 04 67 2A 02 06
+Comment = SET field
+Description = month (2 23 42 2 6)
+
+OID = 06 04 67 2A 02 07
+Comment = SET field
+Description = date (2 23 42 2 7)
+
+OID = 06 04 67 2A 02 08
+Comment = SET field
+Description = address (2 23 42 2 8)
+
+OID = 06 04 67 2A 02 09
+Comment = SET field
+Description = telephone (2 23 42 2 9)
+
+OID = 06 04 67 2A 02 0A
+Comment = SET field
+Description = amount (2 23 42 2 10)
+
+OID = 06 04 67 2A 02 0B
+Comment = SET field
+Description = accountNumber (2 23 42 2 7 11)
+
+OID = 06 04 67 2A 02 0C
+Comment = SET field
+Description = passPhrase (2 23 42 2 7 12)
+
+OID = 06 03 67 2A 03
+Comment = SET
+Description = attribute (2 23 42 3)
+
+OID = 06 04 67 2A 03 00
+Comment = SET attribute
+Description = cert (2 23 42 3 0)
+
+OID = 06 05 67 2A 03 00 00
+Comment = SET cert attribute
+Description = rootKeyThumb (2 23 42 3 0 0)
+
+OID = 06 05 67 2A 03 00 01
+Comment = SET cert attribute
+Description = additionalPolicy (2 23 42 3 0 1)
+
+OID = 06 03 67 2A 04
+Comment = SET
+Description = algorithm (2 23 42 4)
+
+OID = 06 03 67 2A 05
+Comment = SET
+Description = policy (2 23 42 5)
+
+OID = 06 04 67 2A 05 00
+Comment = SET policy
+Description = root (2 23 42 5 0)
+
+OID = 06 03 67 2A 06
+Comment = SET
+Description = module (2 23 42 6)
+
+OID = 06 03 67 2A 07
+Comment = SET
+Description = certExt (2 23 42 7)
+
+OID = 06 04 67 2A 07 00
+Comment = SET cert extension
+Description = hashedRootKey (2 23 42 7 0)
+
+OID = 06 04 67 2A 07 01
+Comment = SET cert extension
+Description = certificateType (2 23 42 7 1)
+
+OID = 06 04 67 2A 07 02
+Comment = SET cert extension
+Description = merchantData (2 23 42 7 2)
+
+OID = 06 04 67 2A 07 03
+Comment = SET cert extension
+Description = cardCertRequired (2 23 42 7 3)
+
+OID = 06 04 67 2A 07 04
+Comment = SET cert extension
+Description = tunneling (2 23 42 7 4)
+
+OID = 06 04 67 2A 07 05
+Comment = SET cert extension
+Description = setExtensions (2 23 42 7 5)
+
+OID = 06 04 67 2A 07 06
+Comment = SET cert extension
+Description = setQualifier (2 23 42 7 6)
+
+OID = 06 03 67 2A 08
+Comment = SET
+Description = brand (2 23 42 8)
+
+OID = 06 04 67 2A 08 01
+Comment = SET brand
+Description = IATA-ATA (2 23 42 8 1)
+
+OID = 06 04 67 2A 08 04
+Comment = SET brand
+Description = VISA (2 23 42 8 4)
+
+OID = 06 04 67 2A 08 05
+Comment = SET brand
+Description = MasterCard (2 23 42 8 5)
+
+OID = 06 04 67 2A 08 1E
+Comment = SET brand
+Description = Diners (2 23 42 8 30)
+
+OID = 06 04 67 2A 08 22
+Comment = SET brand
+Description = AmericanExpress (2 23 42 8 34)
+
+OID = 06 05 67 2A 08 AE 7B
+Comment = SET brand
+Description = Novus (2 23 42 8 6011)
+
+OID = 06 03 67 2A 09
+Comment = SET
+Description = vendor (2 23 42 9)
+
+OID = 06 04 67 2A 09 00
+Comment = SET vendor
+Description = GlobeSet (2 23 42 9 0)
+
+OID = 06 04 67 2A 09 01
+Comment = SET vendor
+Description = IBM (2 23 42 9 1)
+
+OID = 06 04 67 2A 09 02
+Comment = SET vendor
+Description = CyberCash (2 23 42 9 2)
+
+OID = 06 04 67 2A 09 03
+Comment = SET vendor
+Description = Terisa (2 23 42 9 3)
+
+OID = 06 04 67 2A 09 04
+Comment = SET vendor
+Description = RSADSI (2 23 42 9 4)
+
+OID = 06 04 67 2A 09 05
+Comment = SET vendor
+Description = VeriFone (2 23 42 9 5)
+
+OID = 06 04 67 2A 09 06
+Comment = SET vendor
+Description = TrinTech (2 23 42 9 6)
+
+OID = 06 04 67 2A 09 07
+Comment = SET vendor
+Description = BankGate (2 23 42 9 7)
+
+OID = 06 04 67 2A 09 08
+Comment = SET vendor
+Description = GTE (2 23 42 9 8)
+
+OID = 06 04 67 2A 09 09
+Comment = SET vendor
+Description = CompuSource (2 23 42 9 9)
+
+OID = 06 04 67 2A 09 0A
+Comment = SET vendor
+Description = Griffin (2 23 42 9 10)
+
+OID = 06 04 67 2A 09 0B
+Comment = SET vendor
+Description = Certicom (2 23 42 9 11)
+
+OID = 06 04 67 2A 09 0C
+Comment = SET vendor
+Description = OSS (2 23 42 9 12)
+
+OID = 06 04 67 2A 09 0D
+Comment = SET vendor
+Description = TenthMountain (2 23 42 9 13)
+
+OID = 06 04 67 2A 09 0E
+Comment = SET vendor
+Description = Antares (2 23 42 9 14)
+
+OID = 06 04 67 2A 09 0F
+Comment = SET vendor
+Description = ECC (2 23 42 9 15)
+
+OID = 06 04 67 2A 09 10
+Comment = SET vendor
+Description = Maithean (2 23 42 9 16)
+
+OID = 06 04 67 2A 09 11
+Comment = SET vendor
+Description = Netscape (2 23 42 9 17)
+
+OID = 06 04 67 2A 09 12
+Comment = SET vendor
+Description = Verisign (2 23 42 9 18)
+
+OID = 06 04 67 2A 09 13
+Comment = SET vendor
+Description = BlueMoney (2 23 42 9 19)
+
+OID = 06 04 67 2A 09 14
+Comment = SET vendor
+Description = Lacerte (2 23 42 9 20)
+
+OID = 06 04 67 2A 09 15
+Comment = SET vendor
+Description = Fujitsu (2 23 42 9 21)
+
+OID = 06 04 67 2A 09 16
+Comment = SET vendor
+Description = eLab (2 23 42 9 22)
+
+OID = 06 04 67 2A 09 17
+Comment = SET vendor
+Description = Entrust (2 23 42 9 23)
+
+OID = 06 04 67 2A 09 18
+Comment = SET vendor
+Description = VIAnet (2 23 42 9 24)
+
+OID = 06 04 67 2A 09 19
+Comment = SET vendor
+Description = III (2 23 42 9 25)
+
+OID = 06 04 67 2A 09 1A
+Comment = SET vendor
+Description = OpenMarket (2 23 42 9 26)
+
+OID = 06 04 67 2A 09 1B
+Comment = SET vendor
+Description = Lexem (2 23 42 9 27)
+
+OID = 06 04 67 2A 09 1C
+Comment = SET vendor
+Description = Intertrader (2 23 42 9 28)
+
+OID = 06 04 67 2A 09 1D
+Comment = SET vendor
+Description = Persimmon (2 23 42 9 29)
+
+OID = 06 04 67 2A 09 1E
+Comment = SET vendor
+Description = NABLE (2 23 42 9 30)
+
+OID = 06 04 67 2A 09 1F
+Comment = SET vendor
+Description = espace-net (2 23 42 9 31)
+
+OID = 06 04 67 2A 09 20
+Comment = SET vendor
+Description = Hitachi (2 23 42 9 32)
+
+OID = 06 04 67 2A 09 21
+Comment = SET vendor
+Description = Microsoft (2 23 42 9 33)
+
+OID = 06 04 67 2A 09 22
+Comment = SET vendor
+Description = NEC (2 23 42 9 34)
+
+OID = 06 04 67 2A 09 23
+Comment = SET vendor
+Description = Mitsubishi (2 23 42 9 35)
+
+OID = 06 04 67 2A 09 24
+Comment = SET vendor
+Description = NCR (2 23 42 9 36)
+
+OID = 06 04 67 2A 09 25
+Comment = SET vendor
+Description = e-COMM (2 23 42 9 37)
+
+OID = 06 04 67 2A 09 26
+Comment = SET vendor
+Description = Gemplus (2 23 42 9 38)
+
+OID = 06 03 67 2A 0A
+Comment = SET
+Description = national (2 23 42 10)
+
+OID = 06 05 67 2A 0A 81 40
+Comment = SET national
+Description = Japan (2 23 42 10 192)
+
+# Draft SET.  These were invented for testing in pre-1.0 drafts, but have
+# been used nonetheless by implementors
+
+OID = 06 04 86 8D 6F 02
+Comment = SET.  Deprecated, use (2 23 42 7 0) instead
+Description = hashedRootKey (2 54 1775 2)
+Warning
+
+OID = 06 04 86 8D 6F 03
+Comment = SET.  Deprecated, use (2 23 42 7 0) instead
+Description = certificateType (2 54 1775 3)
+Warning
+
+OID = 06 04 86 8D 6F 04
+Comment = SET.  Deprecated, use (2 23 42 7 0) instead
+Description = merchantData (2 54 1775 4)
+Warning
+
+OID = 06 04 86 8D 6F 05
+Comment = SET.  Deprecated, use (2 23 42 7 0) instead
+Description = cardCertRequired (2 54 1775 5)
+Warning
+
+OID = 06 04 86 8D 6F 06
+Comment = SET.  Deprecated, use (2 23 42 7 0) instead
+Description = tunneling (2 54 1775 6)
+Warning
+
+OID = 06 04 86 8D 6F 07
+Comment = SET.  Deprecated, use (2 23 42 7 0) instead
+Description = setQualifier (2 54 1775 7)
+Warning
+
+OID = 06 04 86 8D 6F 63
+Comment = SET.  Deprecated, use (2 23 42 7 0) instead
+Description = set-data (2 54 1775 99)
+Warning
+
+# End of Fahnenstange
index 2290ef5..7689229 100644 (file)
@@ -7,6 +7,8 @@
 #include "rpmpgp.h"
 #include "debug.h"
 
+static int _debug = 0;
+
 /*@-readonlytrans@*/
 /* This is the unarmored RPM-GPG-KEY public key. */
 const char * redhatPubKeyDSA = "\
@@ -78,8 +80,8 @@ z15FuA==\n\
 ";
 
 struct pgpValTbl_s pgpSigTypeTbl[] = {
-    { PGPSIGTYPE_BINARY,       "Signature of a binary document" },
-    { PGPSIGTYPE_TEXT,         "Signature of a canonical text document" },
+    { PGPSIGTYPE_BINARY,       "Binary document signature" },
+    { PGPSIGTYPE_TEXT,         "Text document signature" },
     { PGPSIGTYPE_STANDALONE,   "Standalone signature" },
     { PGPSIGTYPE_GENERIC_CERT, "Generic certification of a User ID and Public Key" },
     { PGPSIGTYPE_PERSONA_CERT, "Persona certification of a User ID and Public Key" },
@@ -110,7 +112,7 @@ struct pgpValTbl_s pgpPubkeyTbl[] = {
 struct pgpValTbl_s pgpSymkeyTbl[] = {
     { PGPSYMKEYALGO_PLAINTEXT, "Plaintext" },
     { PGPSYMKEYALGO_IDEA,      "IDEA" },
-    { PGPSYMKEYALGO_TRIPLE_DES,        "Triple-DES" },
+    { PGPSYMKEYALGO_TRIPLE_DES,        "3DES" },
     { PGPSYMKEYALGO_CAST5,     "CAST5" },
     { PGPSYMKEYALGO_BLOWFISH,  "BLOWFISH" },
     { PGPSYMKEYALGO_SAFER,     "SAFER" },
@@ -197,10 +199,14 @@ struct pgpValTbl_s pgpPktTbl[] = {
     { PGPPKT_TRUST,            "Trust" },
     { PGPPKT_USER_ID,          "User ID" },
     { PGPPKT_PUBLIC_SUBKEY,    "Public Subkey" },
+    { PGPPKT_COMMENT_OLD,      "Comment (from OpenPGP draft)" },
+    { PGPPKT_PHOTOID,          "PGP's pgoto ID" },
+    { PGPPKT_ENCRYPTED_MDC,    "Integrity protected encrypted data" },
+    { PGPPKT_MDC,              "Manipulaion detection code packet" },
     { PGPPKT_PRIVATE_60,       "Private #60" },
-    { PGPPKT_PRIVATE_61,       "Private #61" },
+    { PGPPKT_COMMENT,          "Comment" },
     { PGPPKT_PRIVATE_62,       "Private #62" },
-    { PGPPKT_PRIVATE_63,       "Private #63" },
+    { PGPPKT_CONTROL,          "Control (GPG)" },
     { -1,                      "Unknown packet tag" },
 };
 /*@=readonlytrans@*/
@@ -212,6 +218,16 @@ void pgpPrtVal(const char * pre, pgpValTbl vs, byte val)
     fprintf(stderr, "%s(%u)", pgpValStr(vs, val), (unsigned)val);
 }
 
+static const char * pgpSigRSA[] = {
+    " m**d =",
+    NULL,
+};
+
+static const char * pgpSigDSA[] = {
+    "    r =",
+    "    s =",
+    NULL,
+};
 
 int pgpPrtPktSigV3(pgpPkt pkt, const byte *h, unsigned int hlen)
 {
@@ -234,9 +250,11 @@ int pgpPrtPktSigV3(pgpPkt pkt, const byte *h, unsigned int hlen)
     pgpPrtVal(" ", pgpHashTbl, v->hash_algo);
 
     pgpPrtVal(" ", pgpSigTypeTbl, v->sigtype);
+fprintf(stderr, "\n");
 
     t = pgpGrab(v->time, sizeof(v->time));
-fprintf(stderr, " time %08x %-24.24s", (unsigned)t, ctime(&t));
+fprintf(stderr, " %-24.24s(0x%08x)", ctime(&t), (unsigned)t);
+fprintf(stderr, "\n");
 fprintf(stderr, " signer keyid %02x%02x%02x%02x%02x%02x%02x%02x",
        (unsigned)v->signer[0], (unsigned)v->signer[1],
        (unsigned)v->signer[2], (unsigned)v->signer[3],
@@ -247,8 +265,17 @@ fprintf(stderr, " signhash16 %04x", plen);
 fprintf(stderr, "\n");
 
     p = &v->data[0];
-    for (i = 0; p < &h[hlen]; i++, p += pgpMpiLen(p))
-       fprintf(stderr, "%7d %s\n", i, pgpMpiStr(p));
+    for (i = 0; p < &h[hlen]; i++, p += pgpMpiLen(p)) {
+       if (v->pubkey_algo == PGPPUBKEYALGO_RSA) {
+           if (pgpSigRSA[i] == NULL) break;
+           fprintf(stderr, "%7.7s", pgpSigRSA[i]);
+       } else if (v->pubkey_algo == PGPPUBKEYALGO_DSA) {
+           if (pgpSigDSA[i] == NULL) break;
+           fprintf(stderr, "%7.7s", pgpSigDSA[i]);
+       } else
+           fprintf(stderr, "%7d", i);
+       fprintf(stderr, " %s\n", pgpMpiStr(p));
+    }
 
     return 0;
 }
@@ -260,6 +287,7 @@ int pgpPrtSubType(const byte *h, unsigned int hlen)
     int i;
 
     while (hlen > 0) {
+#ifdef DYING
        if (*p < 192) {
            plen = *p++;
            hlen -= 1;
@@ -273,6 +301,11 @@ int pgpPrtSubType(const byte *h, unsigned int hlen)
            p += 4;
            hlen -= 5;
        }
+#else
+       i = pgpLen(p, &plen);
+       p += i;
+       hlen -= i;
+#endif
        pgpPrtVal("    ", pgpSubTypeTbl, p[0]);
        switch (*p) {
        case PGPSUBTYPE_PREFER_SYMKEY:  /* preferred symmetric algorithms */
@@ -298,11 +331,11 @@ int pgpPrtSubType(const byte *h, unsigned int hlen)
        case PGPSUBTYPE_SIG_CREATE_TIME:
        case PGPSUBTYPE_SIG_EXPIRE_TIME:
        case PGPSUBTYPE_KEY_EXPIRE_TIME:
-           fprintf(stderr, " %s", pgpHexStr(p+1, plen-1));
            if ((plen - 1) == 4) {
                time_t t = pgpGrab(p+1, plen-1);
-               fprintf(stderr, " %-24.24s", ctime(&t));
-           }
+               fprintf(stderr, " %-24.24s(0x%08x)", ctime(&t), (unsigned)t);
+           } else
+               fprintf(stderr, " %s", pgpHexStr(p+1, plen-1));
            fprintf(stderr, "\n");
            break;
 
@@ -362,21 +395,36 @@ fprintf(stderr, "\n");
 
     p = &v->hashlen[0];
     plen = pgpGrab(v->hashlen, sizeof(v->hashlen));
-    p += 2;
+    p += sizeof(v->hashlen);
+
+if (_debug)
 fprintf(stderr, "   hash[%u] -- %s\n", plen, pgpHexStr(p, plen));
     (void) pgpPrtSubType(p, plen);
     p += plen;
+
     plen = pgpGrab(p,2);
     p += 2;
+
+if (_debug)
 fprintf(stderr, " unhash[%u] -- %s\n", plen, pgpHexStr(p, plen));
     (void) pgpPrtSubType(p, plen);
     p += plen;
+
     plen = pgpGrab(p,2);
     p += 2;
 fprintf(stderr, " signhash16 %04x\n", plen);
 
-    for (i = 0; p < &h[hlen]; i++, p += pgpMpiLen(p))
-       fprintf(stderr, "%7d %s\n", i, pgpMpiStr(p));
+    for (i = 0; p < &h[hlen]; i++, p += pgpMpiLen(p)) {
+       if (v->pubkey_algo == PGPPUBKEYALGO_RSA) {
+           if (pgpSigRSA[i] == NULL) break;
+           fprintf(stderr, "%7.7s", pgpSigRSA[i]);
+       } else if (v->pubkey_algo == PGPPUBKEYALGO_DSA) {
+           if (pgpSigDSA[i] == NULL) break;
+           fprintf(stderr, "%7.7s", pgpSigDSA[i]);
+       } else
+           fprintf(stderr, "%7d", i);
+       fprintf(stderr, " %s\n", pgpMpiStr(p));
+    }
 
     return 0;
 }
@@ -395,6 +443,45 @@ int pgpPrtPktSig(pgpPkt pkt, const byte *h, unsigned int hlen)
     return 0;
 }
 
+static const char * pgpPublicRSA[] = {
+    "    n =",
+    "    e =",
+    NULL,
+};
+
+static const char * pgpSecretRSA[] = {
+    "    d =",
+    "    p =",
+    "    q =",
+    "    u =",
+    NULL,
+};
+
+static const char * pgpPublicDSA[] = {
+    "    p =",
+    "    q =",
+    "    g =",
+    "    y =",
+    NULL,
+};
+
+static const char * pgpSecretDSA[] = {
+    "    x =",
+    NULL,
+};
+
+static const char * pgpPublicELGAMAL[] = {
+    "    p =",
+    "    g =",
+    "    y =",
+    NULL,
+};
+
+static const char * pgpSecretELGAMAL[] = {
+    "    x =",
+    NULL,
+};
+
 int pgpPrtKeyV3(pgpPkt pkt, const byte *h, unsigned int hlen)
 {
     pgpPktKeyV3 v = (pgpPktKeyV3)h;
@@ -408,9 +495,9 @@ int pgpPrtKeyV3(pgpPkt pkt, const byte *h, unsigned int hlen)
        fprintf(stderr, " version(%u) != 3\n", (unsigned)v->version);
        return 1;
     }
-    t = pgpGrab(v->time, sizeof(v->time));
-fprintf(stderr, " time %08x %-24.24s", (unsigned)t, ctime(&t));
     pgpPrtVal(" ", pgpPubkeyTbl, v->pubkey_algo);
+    t = pgpGrab(v->time, sizeof(v->time));
+fprintf(stderr, " %-24.24s(0x%08x)", ctime(&t), (unsigned)t);
 
     plen = pgpGrab(v->valid, sizeof(v->valid));
     if (plen != 0)
@@ -419,8 +506,20 @@ fprintf(stderr, " time %08x %-24.24s", (unsigned)t, ctime(&t));
 fprintf(stderr, "\n");
 
     p = &v->data[0];
-    for (i = 0; p < &h[hlen]; i++, p += pgpMpiLen(p))
-       fprintf(stderr, "%7d %s\n", i, pgpMpiStr(p));
+    for (i = 0; p < &h[hlen]; i++, p += pgpMpiLen(p)) {
+       if (v->pubkey_algo == PGPPUBKEYALGO_RSA) {
+           if (pgpPublicRSA[i] == NULL) break;
+           fprintf(stderr, "%7.7s", pgpPublicRSA[i]);
+       } else if (v->pubkey_algo == PGPPUBKEYALGO_DSA) {
+           if (pgpPublicDSA[i] == NULL) break;
+           fprintf(stderr, "%7.7s", pgpPublicDSA[i]);
+       } else if (v->pubkey_algo == PGPPUBKEYALGO_ELGAMAL_ENCRYPT) {
+           if (pgpPublicELGAMAL[i] == NULL) break;
+           fprintf(stderr, "%7.7s", pgpPublicELGAMAL[i]);
+       } else
+           fprintf(stderr, "%7d", i);
+       fprintf(stderr, " %s\n", pgpMpiStr(p));
+    }
 
     return 0;
 }
@@ -437,14 +536,87 @@ int pgpPrtKeyV4(pgpPkt pkt, const byte *h, unsigned int hlen)
        fprintf(stderr, " version(%u) != 4\n", (unsigned)v->version);
        return 1;
     }
-    t = pgpGrab(v->time, sizeof(v->time));
-fprintf(stderr, " time %08x %-24.24s", (unsigned)t, ctime(&t));
     pgpPrtVal(" ", pgpPubkeyTbl, v->pubkey_algo);
+    t = pgpGrab(v->time, sizeof(v->time));
+fprintf(stderr, " %-24.24s(0x%08x)", ctime(&t), (unsigned)t);
 fprintf(stderr, "\n");
 
     p = &v->data[0];
-    for (i = 0; p < &h[hlen]; i++, p += pgpMpiLen(p))
-       fprintf(stderr, "%7d %s\n", i, pgpMpiStr(p));
+    for (i = 0; p < &h[hlen]; i++, p += pgpMpiLen(p)) {
+       if (v->pubkey_algo == PGPPUBKEYALGO_RSA) {
+           if (pgpPublicRSA[i] == NULL) break;
+           fprintf(stderr, "%7.7s", pgpPublicRSA[i]);
+       } else if (v->pubkey_algo == PGPPUBKEYALGO_DSA) {
+           if (pgpPublicDSA[i] == NULL) break;
+           fprintf(stderr, "%7.7s", pgpPublicDSA[i]);
+       } else if (v->pubkey_algo == PGPPUBKEYALGO_ELGAMAL_ENCRYPT) {
+           if (pgpPublicELGAMAL[i] == NULL) break;
+           fprintf(stderr, "%7.7s", pgpPublicELGAMAL[i]);
+       } else
+           fprintf(stderr, "%7d", i);
+       fprintf(stderr, " %s\n", pgpMpiStr(p));
+    }
+
+    if (pkt == PGPPKT_PUBLIC_KEY || pkt == PGPPKT_PUBLIC_SUBKEY)
+       return 0;
+
+    switch (*p) {
+    case 0:
+       pgpPrtVal(" ", pgpSymkeyTbl, *p);
+       break;
+    case 255:
+       p++;
+       pgpPrtVal(" ", pgpSymkeyTbl, *p);
+       switch (p[1]) {
+       case 0x00:
+           pgpPrtVal(" simple ", pgpHashTbl, p[2]);
+           p += 2;
+           break;
+       case 0x01:
+           pgpPrtVal(" salted ", pgpHashTbl, p[2]);
+fprintf(stderr, " %s", pgpHexStr(p+3, 8));
+           p += 10;
+           break;
+       case 0x03:
+           pgpPrtVal(" iterated/salted ", pgpHashTbl, p[2]);
+           i = (16 + (p[11] & 0xf)) << ((p[11] >> 4) + 6);
+fprintf(stderr, " %s iter %d", pgpHexStr(p+3, 8), i);
+           p += 11;
+           break;
+       }
+       break;
+    default:
+       pgpPrtVal(" ", pgpSymkeyTbl, *p);
+fprintf(stderr, " IV %s", pgpHexStr(p+1, 8));
+       p += 8;
+       break;
+    }
+fprintf(stderr, "\n");
+
+    p++;
+
+#ifdef NOTYET  /* XXX encrypted MPI's need to be handled. */
+    for (i = 0; p < &h[hlen]; i++, p += pgpMpiLen(p)) {
+       if (v->pubkey_algo == PGPPUBKEYALGO_RSA) {
+           if (pgpSecretRSA[i] == NULL) break;
+           fprintf(stderr, "%7.7s", pgpSecretRSA[i]);
+       } else if (v->pubkey_algo == PGPPUBKEYALGO_DSA) {
+           if (pgpSecretDSA[i] == NULL) break;
+           fprintf(stderr, "%7.7s", pgpSecretDSA[i]);
+       } else if (v->pubkey_algo == PGPPUBKEYALGO_ELGAMAL_ENCRYPT) {
+           if (pgpSecretELGAMAL[i] == NULL) break;
+           fprintf(stderr, "%7.7s", pgpSecretELGAMAL[i]);
+       } else
+           fprintf(stderr, "%7d", i);
+       fprintf(stderr, " %s\n", pgpMpiStr(p));
+    }
+#else
+fprintf(stderr, " secret %s", pgpHexStr(p, (hlen - (p - h) - 2)));
+fprintf(stderr, "\n");
+    p += (hlen - (p - h) - 2);
+#endif
+fprintf(stderr, " checksum %s", pgpHexStr(p, 2));
+fprintf(stderr, "\n");
 
     return 0;
 }
@@ -470,25 +642,52 @@ fprintf(stderr, " \"%*s\"\n", (int)hlen, (const char *)h);
     return 0;
 }
 
+int pgpPrtComment(pgpPkt pkt, const byte *h, unsigned int hlen)
+{
+    int i = hlen;
+
+    pgpPrtVal("", pgpPktTbl, pkt);
+    fprintf(stderr, " ");
+    while (i > 0) {
+       int j;
+       if (*h >= ' ' && *h <= 'z') {
+           fprintf(stderr, "%s", (const char *)h);
+           j = strlen(h);
+           while (h[j] == '\0')
+               j++;
+       } else {
+           fprintf(stderr, " %s", pgpHexStr(h, i));
+           j = i;
+       }
+       i -= j;
+       h += j;
+    }
+    fprintf(stderr, "\n");
+    return 0;
+}
+
 int pgpPrtPkt(const byte *p)
 {
-    unsigned int val = *p;
-    unsigned int mark = (val >> 7) & 0x1;
-    unsigned int nmark = (val >> 6) & 0x1;
-    pgpPkt pkt = (val >> 2) & 0xf;
-    unsigned int plen = (1 << (val & 0x3));
+    unsigned int val = *p++;
+    pgpPkt pkt;
+    unsigned int plen;
     const byte *h;
     unsigned int hlen = 0;
-    unsigned int i;
 
     /* XXX can't deal with these. */
-    if (!mark || nmark || plen > 8)
+    if (!(val & 0x80))
        return -1;
 
-    for (i = 1; i <= plen; i++)
-       hlen = (hlen << 8) | p[i];
+    if (val & 0x40) {
+       pkt = (val & 0x3f);
+       plen = pgpLen(p, &hlen);
+    } else {
+       pkt = (val >> 2) & 0xf;
+       plen = (1 << (val & 0x3));
+       hlen = pgpGrab(p, plen);
+    }
 
-    h = p + plen + 1;
+    h = p + plen;
     switch (pkt) {
     case PGPPKT_SIGNATURE:
        (void) pgpPrtPktSig(pkt, h, hlen);
@@ -500,8 +699,15 @@ int pgpPrtPkt(const byte *p)
        (void) pgpPrtKey(pkt, h, hlen);
        break;
     case PGPPKT_USER_ID:
+#ifdef DYING
        (void) pgpPrtUserID(pkt, h, hlen);
        break;
+#endif
+    case PGPPKT_COMMENT:
+    case PGPPKT_COMMENT_OLD:
+       (void) pgpPrtComment(pkt, h, hlen);
+       break;
+
     case PGPPKT_RESERVED:
     case PGPPKT_PUBLIC_SESSION_KEY:
     case PGPPKT_SYMMETRIC_SESSION_KEY:
@@ -510,15 +716,36 @@ int pgpPrtPkt(const byte *p)
     case PGPPKT_MARKER:
     case PGPPKT_LITERAL_DATA:
     case PGPPKT_TRUST:
+    case PGPPKT_PHOTOID:
+    case PGPPKT_ENCRYPTED_MDC:
+    case PGPPKT_MDC:
     case PGPPKT_PRIVATE_60:
-    case PGPPKT_PRIVATE_61:
     case PGPPKT_PRIVATE_62:
-    case PGPPKT_PRIVATE_63:
+    case PGPPKT_CONTROL:
     default:
        pgpPrtVal("", pgpPktTbl, pkt);
-       fprintf(stderr, " plen %02x hlen %x\n", plen, hlen);
+       fprintf(stderr, " plen %02x hlen %x", plen, hlen);
+#if 0
+       fprintf(stderr, " %s", pgpHexStr(h, hlen));
+#else
+       fprintf(stderr, " %s", (const char *)h);
+#endif
+       fprintf(stderr, "\n");
        break;
     }
 
     return plen+hlen+1;
 }
+
+int pgpPrtPkts(const byte *pkts, unsigned int plen)
+{
+    const byte *p;
+    int len;
+
+    for (p = pkts; p < (pkts + plen); p += len) {
+       len = pgpPrtPkt(p);
+        if (len <= 0)
+           return len;
+    }
+    return 0;
+}
index fbb14ec..13fe082 100644 (file)
@@ -11,6 +11,7 @@
  */
 
 #include "beecrypt.h"
+#include "base64.h"
 
 /*@-typeuse -fielduse@*/
 /**
@@ -43,10 +44,14 @@ typedef enum pgpPkt_e {
     PGPPKT_TRUST               = 12, /*!< Trust */
     PGPPKT_USER_ID             = 13, /*!< User ID */
     PGPPKT_PUBLIC_SUBKEY       = 14, /*!< Public Subkey */
+    PGPPKT_COMMENT_OLD         = 16, /*!< Comment (from OpenPGP draft) */
+    PGPPKT_PHOTOID             = 17, /*!< PGP's photo ID */
+    PGPPKT_ENCRYPTED_MDC       = 18, /*!< Integrity protected encrypted data */
+    PGPPKT_MDC                 = 19, /*!< Manipulaion detection code packet */
     PGPPKT_PRIVATE_60          = 60, /*!< Private or Experimental Values */
-    PGPPKT_PRIVATE_61          = 61, /*!< Private or Experimental Values */
+    PGPPKT_COMMENT             = 61, /*!< Comment */
     PGPPKT_PRIVATE_62          = 62, /*!< Private or Experimental Values */
-    PGPPKT_PRIVATE_63          = 63, /*!< Private or Experimental Values */
+    PGPPKT_CONTROL             = 63, /*!< Control (GPG) */
 } pgpPkt;
 
 /**
@@ -194,7 +199,7 @@ extern struct pgpValTbl_s pgpPubkeyTbl[];
 typedef enum pgpSymkeyAlgo_e {
     PGPSYMKEYALGO_PLAINTEXT    =  0,   /*!< Plaintext */
     PGPSYMKEYALGO_IDEA         =  1,   /*!< IDEA */
-    PGPSYMKEYALGO_TRIPLE_DES   =  2,   /*!< Triple-DES */
+    PGPSYMKEYALGO_TRIPLE_DES   =  2,   /*!< 3DES */
     PGPSYMKEYALGO_CAST5                =  3,   /*!< CAST5 */
     PGPSYMKEYALGO_BLOWFISH     =  4,   /*!< BLOWFISH */
     PGPSYMKEYALGO_SAFER                =  5,   /*!< SAFER */
@@ -868,6 +873,24 @@ unsigned int pgpGrab(const byte *s, int nbytes)
 /**
  */
 /*@unused@*/ static inline
+int pgpLen(const byte *s, unsigned int *lenp)
+       /*@*/
+{
+    if (*s < 192) {
+       (*lenp) = *s++;
+       return 1;
+    } else if (*s < 255) {
+       (*lenp) = ((s[0] - 192) << 8) + s[1] + 192;
+       return 2;
+    } else {
+       (*lenp) = pgpGrab(s+1, 4);
+       return 5;
+    }
+}
+
+/**
+ */
+/*@unused@*/ static inline
 unsigned int pgpMpiBits(const byte *p)
        /*@*/
 {
@@ -988,6 +1011,16 @@ int pgpPrtUserID(pgpPkt pkt, const byte *h, unsigned int hlen)
 
 /**
  */
+int pgpPrtComment(pgpPkt pkt, const byte *h, unsigned int hlen)
+       /*@modifies fileSystem @*/;
+
+/**
+ */
+int pgpPrtPkts(const byte *pkts, unsigned int plen)
+       /*@modifies fileSystem @*/;
+
+/**
+ */
 int pgpPrtPkt(const byte *p);
 
 #ifdef __cplusplus
index dc25e36..7c39bdc 100644 (file)
@@ -7,8 +7,12 @@ static int _debug = 0;
 
 #include "system.h"
 #include "rpmio.h"
+
 #include "rpmpgp.h"
-#include "base64.h"
+#include "rsapk.h"
+#include "rsa.h"
+#include "dsa.h"
+
 #include "debug.h"
 
 #include <stdio.h>
@@ -17,29 +21,27 @@ static int doit(const char *sig)
 {
     const char *s, *t;
     unsigned char * dec;
-    unsigned char * d;
     size_t declen;
     char * enc;
     int rc;
-    int len = 0;
     int i;
 
 if (_debug)
 fprintf(stderr, "*** sig is\n%s\n", sig);
 
     if ((rc = b64decode(sig, (void **)&dec, &declen)) != 0) {
-       fprintf(stderr, "*** B64decode returns %d\n", rc);
+       fprintf(stderr, "*** b64decode returns %d\n", rc);
        exit(rc);
     }
 
-    for (d = dec; d < (dec + declen); d += len) {
-       len = pgpPrtPkt(d);
-       if (len <= 0)
-           exit(len);
+    rc = pgpPrtPkts(dec, declen);
+    if (rc < 0) {
+       fprintf(stderr, "*** pgpPrtPkts returns %d\n", rc);
+       exit(rc);
     }
 
     if ((enc = b64encode(dec, declen)) == NULL) {
-       fprintf(stderr, "*** B64encode returns %d\n", rc);
+       fprintf(stderr, "*** b64encode failed\n");
        exit(4);
     }
 
@@ -58,18 +60,130 @@ fprintf(stderr, "??? %5d %02x != %02x '%c' != '%c'\n", i, (*s & 0xff), (*t & 0xf
     return rc;
 }
 
+/* DSA verification from Red Hat 7.0 time-1.7-12.i386.rpm */
+static const char * dsa_pkgfn = "7.0/i386/time-1.7-12.i386.rpm";
+static const char * dsa_hm = "2de2a0ca8c289ea5add64f8cf64e0b5893d0607b";
+static const char * dsa_r = "2247352810d76f6273b4e8d906f5ddfa7fcd4c45";
+static const char * dsa_s = "02275c68fcf18edb272a019309c8c81e2e4998bf";
+
+static const char * dsa_p = "c12abdc197a3cef014341fcb09a03ea9f54ed8ca5ee98ed66a8a8be23f05cff83096778bbc1d0cdcc40679ee6f2cb00d4b2b5171f777282610f3335df4fa9e411bd9984964a12da6d1dcdd4a5dd5d0618728c1338c1b17706111abd52a70f10c9d2e18d57d4d554a5e31b7a6eea4f6d625bca3920e59dcfec1954394266af1df";
+
+static const char * dsa_q = "a1b35510319a59825c721e73e41d687ffe351bc9";
+
+static const char * dsa_g = "a8a2eaaec6bbfbe15d79cb4ba9b5e683673d5c9bca7822c3fdb774a8d26551bbaca00d10ada6c60d5507ebdcfee51ce24e3d5312497c2660d60bb5b0f155dc649af98ffb8ec88b92d42f0a22cf967710b75755f843661d1e417480cf583cca0556e05a74839ea43a2ab67b4fa02567be153298c6c7191653abd5db1b165c22cf";
+
+static const char * dsa_y = "4ffefb48980f0264dde3c4682d2b9186b43349fdc32186ebf9b677f0160e1bfd51a8d89afc9a12d4aa821b13acde1809996d4a5d7240dca3c0f97e2166a937f9fbefa9084a492c9924cde97fdf6376c38ab33eb7113028815111123e308b778639acfa14f04e2438773fe01b8737dd37b620ac08f9680ab5ac419ed47717d0e4";
+
+/* RSA verification from Red Hat 5.2 time-1.7-6.i386.rpm */
+static const char * rsa_pkgfn = "5.2/i386/time-1.7-6.i386.rpm";
+static const char * rsa_m = "f0bd35cbeb3870b5c7c283a7e1e76c42";
+static const char * rsa_n = "a1b8fd5f6851288373dc0881ee819a0e9eac31822f3985ca2a00868f240c8252adc9a217da9374fabe7e3ef6ea9816d6249bd18eecc999fd636960426e4790f3837cd8bc796c93152c5bafcca0a2c2d10a54cfc6a1d586d2271ab7d934ba12a6fd4b7563a67b4c8ea4e4099e085d38ccca5e981fe60f38bda520e8f1cba29bf9";
+static const char * rsa_e = "11";
+
+static const char * rsa_c = "5075c56cbbde79bd5c990e4f2ebce5d65745f7be84fd077698305be350d1d40fa175545aeec101d529b18912ad68e4c380e8e5ca477bc9652b5710c178ed359725f41a7e5825f32c194c7e56f9e32529abba36bd2569b515de59ac004e15b20bbc34293322ba76c0d55b796d99017b6b2acc15fab79f2eab94869ee5c0ca47f4";
+
+static const char * gpg_private = "\
+lQHPBDtnFRoRBADyRAlldI9km29INDTX82Sz5jXrsCcS93rzV66BcKQTcP+CPL1p\n\
+kBDaQwf0asQiWr4uaPPUtWj0urSVz7obzyGdILyf/2XVFJWUU9xGtFFEFKMHwdSZ\n\
+yGRpyTsd+jsUVPIR9X/fjJDvufuvcKtFHLU+F28nWv7C47rURAXEAoYCewCg5qDr\n\
+4fEr1kT3ACg4T1e98QlTRfsD/RDZCp5wSGa5hp4YtoDPza5cTrYopGJSXAXuQVi7\n\
+dGqTrAE3hdbWUmbG5hNerJRwOA0DK74Tn38/xoY091q3nH2UlEd3zLhoueOt6apa\n\
+VY98UmOaG+Ef5QGd2edHn26kSQq1N8P73FQ3+34ICoRwq+hNNi9cENWiuudi6PKs\n\
+eJlmA/sHR8dzcXSuwda8u2r2PvsqAu66pdA1gMdCdwSs3dtJTro3apXvASJDFqkN\n\
+y9Vbo6GZ8wmpWYYHM3Xd00rLPTZFzc+F0rBiGscyIZOTDyx8ofK30DHrRfMKytSm\n\
+K7TSCWmzKFDTSQxAUQd74qi6dJCVQ0dTuHWmXc1cKPvMEm6IWf8DAwIaLXrq0DYP\n\
+j2AdZ4iCkENxNzK2k3OzIsJvaYGuJAhmujAtkS03LLs89/0mIzpEU0FfZmFjdG9y\n\
+OgAAr0yL/JSDBRJlphGoWiOVfPhNpGFzHm/9JiM6RFNBX2ZhY3RvcjoAAK93Twk1\n\
+SRG6vnHwq6211cGbSUnr28JF/SYjOkRTQV9mYWN0b3I6AACvVJWEWQPciRahMYqY\n\
+Bq0a7YgA3QB3w7QpSmVmZiBKb2huc29uIChBUlMgTjNOUFEpIDxqYmpAcmVkaGF0\n\
+LmNvbT6IVwQTEQIAFwUCO2cVGgULBwoDBAMVAwIDFgIBAheAAAoJEKNiNe+PnmDb\n\
+sM4AmwTaY99wLwi9VE8tML5AS2gn89lIAJ4+BgiRQydv3L404qLZHVoq0KOkbp0B\n\
+RgQ7ZxUeEAQAx1F12EdF0NMS1D78hPYKaKxhCkCs9KDgDRfvX4kUBm0Omy/LjvSD\n\
+K6ol2k4CUgdHDI1DZwUB+g+zbpWP/osKah5pusNjf6rKUfeYSClOs1TqomMa4ur6\n\
+FAnFqjm6rMiptTEb40FWQKDZG+iiLj/m3DrRzETvlAhEkBSuWdLCHcMAAwUEALt6\n\
+Mo9BRDOgsZgC4gr+BFj1qj3UkpujduIrojdedVENzc9cvbxZ0uv762mt/TWkoVsd\n\
+QPNe+Qh9UjBBchZQYBPjNSJumDyxZa9vk4yaBG+ekZW+qsz8IjuFhA4uCY3u2FoA\n\
+Y9Sa7Gs4EKO1OnGuuCtpe5IPfqFolz55rlK/dbJj/wMDAhoteurQNg+PYKaUPggu\n\
+Pw3pzYAm1keoYnJNGesJ6CxS6C77eJ2betFwgIeLtevzwmnFejCo/SYjOkVMR19m\n\
+YWN0b3I6AACrBQvdBi1eWnh99itbVASMBUFew+yXAf0mIzpFTEdfZmFjdG9yOgAA\n\
+qwavqmFHo+0ebuTE/7oFpE5qqh1hZEn9JiM6RUxHX2ZhY3RvcjoAAKsE0zE2Kw1N\n\
+zwiX22mx1hjFTJ5AHhPd/SYjOkVMR19mYWN0b3I6AACrB+yUJFgU+djqGspx0xjx\n\
+/gz7sIH/e/0mIzpFTEdfZmFjdG9yOgAAqwcV+xN8WTB/A0d2FbLBgH9taqf3TteI\n\
+RgQYEQIABgUCO2cVHgAKCRCjYjXvj55g2+kGAKCh1/9z5GrteLdQcoduM7EBhmXD\n\
+HwCeKBfXD33WreQdRYpOxNX9cRgOAQE=\n\
+";
+
+
 int
 main (int argc, char *argv[])
 {
+    mp32barrett p;
+    mp32barrett q;
+    mp32number g;
+    mp32number y;
+    mp32number hm;
+    mp32number r;
+    mp32number s;
+
+    rsapk rsa_pk;
+    mp32number m;
+    mp32number c;
+
     int rc;
 
-fprintf(stderr, "============================================== RPM-GPG-KEY\n");
+fprintf(stderr, "=============================== Red Hat DSA Public Key\n");
     if ((rc = doit(redhatPubKeyDSA)) != 0)
        return rc;
 
-fprintf(stderr, "============================================== RPM-PGP-KEY\n");
+    mp32bzero(&p);     mp32bsethex(&p, dsa_p);
+    mp32bzero(&q);     mp32bsethex(&q, dsa_q);
+    mp32nzero(&g);     mp32nsethex(&g, dsa_g);
+    mp32nzero(&y);     mp32nsethex(&y, dsa_y);
+
+    mp32nzero(&hm);    mp32nsethex(&hm, dsa_hm);
+    mp32nzero(&r);     mp32nsethex(&r, dsa_r);
+    mp32nzero(&s);     mp32nsethex(&s, dsa_s);
+
+    rc = dsavrfy(&p, &q, &g, &hm, &y, &r, &s);
+
+fprintf(stderr, "=============================== DSA verify %s: rc %d\n",
+       dsa_pkgfn, rc);
+
+    mp32bfree(&p);
+    mp32bfree(&q);
+    mp32nfree(&g);
+    mp32nfree(&y);
+
+    mp32nfree(&hm);
+    mp32nfree(&r);
+    mp32nfree(&s);
+
+fprintf(stderr, "=============================== Red Hat RSA Public Key\n");
     if ((rc = doit(redhatPubKeyRSA)) != 0)
        return rc;
 
+    rsapkInit(&rsa_pk);
+
+    mp32bzero(&rsa_pk.n);      mp32bsethex(&rsa_pk.n, rsa_n);
+    mp32nzero(&rsa_pk.e);      mp32nsethex(&rsa_pk.e, rsa_e);
+
+    mp32nzero(&m);     mp32nsethex(&m, rsa_m);
+    mp32nzero(&c);     mp32nsethex(&s, rsa_c);
+
+#if 0
+    rc = rsavrfy(&rsa_pk, &m, &c);
+#else
+    rc = 1;
+#endif
+
+fprintf(stderr, "=============================== RSA verify %s: rc %d\n",
+       rsa_pkgfn, rc);
+
+    rsapkFree(&rsa_pk);
+
+fprintf(stderr, "=============================== A DSA Private Key\n");
+    if ((rc = doit(gpg_private)) != 0)
+       return rc;
+
     return rc;
 }