--- /dev/null
+/*
+ * Copyright (c) 2009,2012,2014 Apple Inc. All Rights Reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ *
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ *
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ *
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+
+#include <libDER/libDER.h>
+
+
+#define FAST_SET_LOOKUP 1
+
+#ifdef FAST_SET_LOOKUP
+/* state representing a fast by tag set accessor, the caller needs to provide
+ a set large enough to hold all */
+typedef struct {
+ DERTag capacity; /* should be large enough to hold all encountered tags.
+ otherwise DR_UnexpectedTag will be returned, note
+ that only one tag per tag number can exist. */
+ DERByte *end;
+ DERByte *byTag[]; /* maxTag element array of pointers to tag + length
+ of items in set indexed by tagNumber. */
+} DERSet;
+
+/* Iterates over all the tags in the set to build an index returned in
+ derSet. */
+DERReturn DERDecodeSetContentInit(
+ const DERItem *der, /* data to decode */
+ DERSet *derSet); /* IN/OUT, to use in DERDecodeSetTag */
+
+/* Returns DR_UnexpectedTag if the requested tag is not in derSet, returns
+ the content of the decoded item in content otherwise. */
+DERReturn DERDecodeSetTag(
+ DERSet *derSeq, /* data to decode */
+ DERTag tag, /* tag in sequence/set we are looking for. */
+ DERItem *content); /* RETURNED */
+#endif /* FAST_SET_LOOKUP */
+
+
+DERReturn DERSetDecodeItemWithTag(
+ const DERItem *der, /* data to decode */
+ DERTag tag, /* tag in sequence/set we are looking for. */
+ DERItem *content); /* RETURNED */
+
+
+/* Application Processor Ticket */
+typedef struct {
+ DERItem signatureAlgorithm; /* AlgorithmId */
+ DERItem body; /* SET OF OCTECT STRING, DER_DEC_SAVE_DER */
+ DERItem signature; /* OCTET STRING */
+ DERItem certificates; /* SEQUENCE of CERTIFICATE */
+} DERApTicket;
+
+/* DERItemSpecs to decode into a DERApTicket */
+extern const DERItemSpec DERApTicketItemSpecs[];
+extern const DERSize DERNumApTicketItemSpecs;
+
+DERReturn DERDecodeApTicket(
+ const DERItem *contents,
+ DERApTicket *ticket, /* RETURNED */
+ DERSize *numUsedBytes); /* RETURNED */
+
+
+/* Baseband Ticket */
+typedef struct {
+ DERItem signatureAlgorithm; /* AlgorithmId */
+ DERItem body; /* SET OF OCTECT STRING, DER_DEC_SAVE_DER */
+ DERItem signature; /* OCTET STRING */
+ DERItem gpuk; /* OCTET STRING */
+} DERBbTicket;
+
+/* DERItemSpecs to decode into a DERBbTicket */
+extern const DERItemSpec DERBbTicketItemSpecs[];
+extern const DERSize DERNumBbTicketItemSpecs;
+
+DERReturn DERDecodeBbTicket(
+ const DERItem *contents,
+ DERBbTicket *ticket, /* RETURNED */
+ DERSize *numUsedBytes); /* RETURNED */