1/*
2 * Copyright (c) 2009,2012,2014 Apple Inc. All Rights Reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24
25#include <libDER/libDER.h>
26
27
28#define FAST_SET_LOOKUP     1
29
30#ifdef FAST_SET_LOOKUP
31/* state representing a fast by tag set accessor, the caller needs to provide
32   a set large enough to hold all */
33typedef struct {
34	DERTag	capacity;   /* should be large enough to hold all encountered tags.
35                           otherwise DR_UnexpectedTag will be returned, note
36                           that only one tag per tag number can exist. */
37	DERByte	*end;
38	DERByte	*byTag[];   /* maxTag element array of pointers to tag + length
39                           of items in set indexed by tagNumber. */
40} DERSet;
41
42/* Iterates over all the tags in the set to build an index returned in
43   derSet. */
44DERReturn DERDecodeSetContentInit(
45	const DERItem   *der,			/* data to decode */
46	DERSet          *derSet);		/* IN/OUT, to use in DERDecodeSetTag */
47
48/* Returns DR_UnexpectedTag if the requested tag is not in derSet, returns
49   the content of the decoded item in content otherwise. */
50DERReturn DERDecodeSetTag(
51	DERSet          *derSeq,		/* data to decode */
52	DERTag			tag,			/* tag in sequence/set we are looking for. */
53	DERItem         *content);		/* RETURNED */
54#endif /* FAST_SET_LOOKUP */
55
56
57DERReturn DERSetDecodeItemWithTag(
58	const DERItem	*der,			/* data to decode */
59	DERTag			tag,			/* tag in sequence/set we are looking for. */
60	DERItem         *content);		/* RETURNED */
61
62
63/* Application Processor Ticket */
64typedef struct {
65	DERItem		signatureAlgorithm;     /* AlgorithmId */
66	DERItem		body;                   /* SET OF OCTECT STRING, DER_DEC_SAVE_DER */
67	DERItem		signature;              /* OCTET STRING */
68	DERItem		certificates;            /* SEQUENCE of CERTIFICATE */
69} DERApTicket;
70
71/* DERItemSpecs to decode into a DERApTicket */
72extern const DERItemSpec DERApTicketItemSpecs[];
73extern const DERSize DERNumApTicketItemSpecs;
74
75DERReturn DERDecodeApTicket(
76	const DERItem	*contents,
77	DERApTicket		*ticket,            /* RETURNED */
78	DERSize			*numUsedBytes);     /* RETURNED */
79
80
81/* Baseband Ticket */
82typedef struct {
83	DERItem		signatureAlgorithm;     /* AlgorithmId */
84	DERItem		body;                   /* SET OF OCTECT STRING, DER_DEC_SAVE_DER */
85	DERItem		signature;              /* OCTET STRING */
86	DERItem		gpuk;                   /* OCTET STRING */
87} DERBbTicket;
88
89/* DERItemSpecs to decode into a DERBbTicket */
90extern const DERItemSpec DERBbTicketItemSpecs[];
91extern const DERSize DERNumBbTicketItemSpecs;
92
93DERReturn DERDecodeBbTicket(
94	const DERItem	*contents,
95	DERBbTicket		*ticket,            /* RETURNED */
96	DERSize			*numUsedBytes);     /* RETURNED */
97