]> git.saurik.com Git - apple/security.git/blobdiff - OSX/libsecurity_keychain/libDER/Tests/parseCrl.c
Security-57336.1.9.tar.gz
[apple/security.git] / OSX / libsecurity_keychain / libDER / Tests / parseCrl.c
diff --git a/OSX/libsecurity_keychain/libDER/Tests/parseCrl.c b/OSX/libsecurity_keychain/libDER/Tests/parseCrl.c
new file mode 100644 (file)
index 0000000..4eabc13
--- /dev/null
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2005-2007,2010-2011 Apple Inc. All Rights Reserved.
+ *
+ * parseCrl.c - parse a DER-encoded X509 CRL using libDER. 
+ */
+#include <stdlib.h>
+#include <strings.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <libDER/libDER.h>
+#include <libDER/asn1Types.h>
+#include <libDER/DER_CertCrl.h>
+#include <libDER/DER_Keys.h>
+#include <libDERUtils/fileIo.h>
+#include <libDERUtils/libDERUtils.h>
+#include <libDERUtils/printFields.h>
+
+static void usage(char **argv)
+{
+       printf("usage: %s crlFile [options]\n", argv[0]);
+       printf("Options:\n");
+       printf("  -v     -- verbose \n");
+       /* etc. */
+       exit(1);
+}
+
+/* 
+ * This is a SEQUENCE OF so we use the low-level DERDecodeSeq* routines to snag one entry 
+ * at a time.
+ */
+static void    printRevokedCerts(
+       DERItem *revokedCerts, 
+       int verbose)
+{
+       DERReturn drtn;
+       DERDecodedInfo currItem;
+       DERSequence seq;
+       unsigned certNum;
+       DERRevokedCert revoked;
+       
+       drtn = DERDecodeSeqContentInit(revokedCerts, &seq);
+       if(drtn) {
+               DERPerror("DERDecodeSeqContentInit(revokedCerts)", drtn);
+               return;
+       }
+       
+       for(certNum=0; ; certNum++) {
+               drtn = DERDecodeSeqNext(&seq, &currItem);
+               switch(drtn) {
+                       case DR_EndOfSequence:
+                               /* normal termination */
+                               return;
+                       default:
+                               DERPerror("DERDecodeSeqNext", drtn);
+                               return;
+                       case DR_Success:
+                               doIndent();
+                               printf("revoked cert %u\n", certNum);
+                               incrIndent();
+                               drtn = DERParseSequenceContent(&currItem.content, 
+                                       DERNumRevokedCertItemSpecs, DERRevokedCertItemSpecs,
+                                       &revoked, sizeof(revoked));
+                               if(drtn) {
+                                       DERPerror("DERParseSequenceContent(RevokedCert)", drtn);
+                                       decrIndent();
+                                       return;
+                               }
+                               printItem("serialNum", IT_Leaf, verbose, ASN1_INTEGER, &revoked.serialNum);
+                               decodePrintItem("revocationDate",  IT_Leaf, verbose, &revoked.revocationDate);
+                               printItem("extensions", IT_Branch, verbose, ASN1_CONSTR_SEQUENCE, &revoked.extensions);
+                               decrIndent();
+               }
+       }
+}
+
+int main(int argc, char **argv)
+{
+       unsigned char *crlData = NULL;
+       unsigned crlDataLen = 0;
+       DERSignedCertCrl signedCrl;
+       DERTBSCrl tbs;
+       DERReturn drtn;
+       DERItem item;
+       int verbose = 0;
+       extern char *optarg;
+       int arg;
+       extern int optind;
+       
+       if(argc < 2) {
+               usage(argv);
+       }
+       if(readFile(argv[1], &crlData, &crlDataLen)) {
+               printf("***Error reading CRL from %s. Aborting.\n", argv[1]);
+               exit(1);
+       }
+
+       optind = 2;
+       while ((arg = getopt(argc, argv, "vh")) != -1) {
+               switch (arg) {
+                       case 'v':
+                               verbose = 1;
+                               break;
+                       case 'h':
+                               usage(argv);
+               }
+       }
+       if(optind != argc) {
+               usage(argv);
+       }
+
+       /* Top level decode of signed CRL into 3 components */
+       item.data = crlData;
+       item.length = crlDataLen;
+       drtn = DERParseSequence(&item, DERNumSignedCertCrlItemSpecs, DERSignedCertCrlItemSpecs,
+               &signedCrl, sizeof(signedCrl));
+       if(drtn) {
+               DERPerror("DERParseSequence(SignedCrl)", drtn);
+               exit(1);
+       }
+       printItem("TBSCrl", IT_Branch, verbose, ASN1_CONSTR_SEQUENCE, &signedCrl.tbs);
+       
+       incrIndent();
+       
+       /* decode the TBSCrl - it was saved in full DER form */
+       drtn = DERParseSequence(&signedCrl.tbs, 
+               DERNumTBSCrlItemSpecs, DERTBSCrlItemSpecs,
+               &tbs, sizeof(tbs));
+       if(drtn) {
+               DERPerror("DERParseSequenceContent(TBSCrl)", drtn);
+               exit(1);
+       }
+       if(tbs.version.data) {
+               printItem("version", IT_Leaf, verbose, ASN1_INTEGER, &tbs.version);
+       }
+       
+       printItem("tbsSigAlg", IT_Branch, verbose, ASN1_CONSTR_SEQUENCE, &tbs.tbsSigAlg);
+       incrIndent();
+       printAlgId(&tbs.tbsSigAlg, verbose);
+       decrIndent();
+       
+       printItem("issuer", IT_Leaf, verbose, ASN1_CONSTR_SEQUENCE, &tbs.issuer);
+       
+       decodePrintItem("thisUpdate",  IT_Leaf, verbose, &tbs.thisUpdate);
+       decodePrintItem("nextUpdate",  IT_Leaf, verbose, &tbs.nextUpdate);
+       
+       if(tbs.revokedCerts.data) {
+               printItem("version", IT_Leaf, verbose, ASN1_CONSTR_SEQUENCE, &tbs.revokedCerts);
+               incrIndent();
+               printRevokedCerts(&tbs.revokedCerts, verbose);
+               decrIndent();
+       }
+       
+       if(tbs.extensions.data) {
+               printItem("extensions", IT_Leaf, verbose, ASN1_CONSTRUCTED | ASN1_CONTEXT_SPECIFIC | 3, 
+                       &tbs.extensions);
+       }
+       
+       printItem("sigAlg", IT_Branch, verbose, ASN1_CONSTR_SEQUENCE, &signedCrl.sigAlg);
+       incrIndent();
+       printAlgId(&signedCrl.sigAlg, verbose);
+       decrIndent();
+
+       printItem("sig", IT_Leaf, verbose, ASN1_BIT_STRING, &signedCrl.sig);
+       
+       return 0;
+}