1/*
2 * Copyright (c) 2006-2010 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// cdbuilder - constructor for CodeDirectories
26//
27#ifndef _H_CDBUILDER
28#define _H_CDBUILDER
29
30#include "codedirectory.h"
31
32
33namespace Security {
34namespace CodeSigning {
35
36
37//
38// Builder can construct CodeDirectories from pieces:
39//	Builder builder(...);
40//	builder.variousSetters(withSuitableData);
41//  CodeDirectory *result = builder.build();
42// Builder is not reusable.
43//
44class CodeDirectory::Builder {
45public:
46	Builder(HashAlgorithm digestAlgorithm);
47	~Builder();
48
49	void executable(string path, size_t pagesize, size_t offset, size_t length);
50	void reopen(string path, size_t offset, size_t length);
51
52	void specialSlot(SpecialSlot slot, CFDataRef data);
53	void identifier(const std::string &code) { mIdentifier = code; }
54	void teamID(const std::string &team) { mTeamID = team; }
55	void flags(uint32_t f) { mFlags = f; }
56
57	Scatter *scatter(unsigned count);			// allocate that many scatter elements (w/o sentinel)
58	Scatter *scatter() { return mScatter; }		// return already allocated scatter vector
59
60	size_t size(const uint32_t version);		// calculate size
61	CodeDirectory *build();						// build CodeDirectory and return it
62	const size_t fixedSize(const uint32_t version);	// calculate fixed size of the CodeDirectory
63
64	DynamicHash *getHash() const { return CodeDirectory::hashFor(this->mHashType); }
65
66private:
67	Hashing::Byte *specialSlot(SpecialSlot slot)
68		{ assert(slot > 0 && slot <= cdSlotMax); return mSpecial + (slot - 1) * mDigestLength; }
69	Hashing::Byte *specialSlot(SpecialSlot slot) const
70		{ assert(slot > 0 && slot <= cdSlotMax); return mSpecial + (slot - 1) * mDigestLength; }
71
72private:
73	Hashing::Byte *mSpecial;					// array of special slot hashes
74	UnixPlusPlus::AutoFileDesc mExec;			// main executable file
75	size_t mExecOffset;							// starting offset in mExec
76	size_t mExecLength;							// total bytes of file to sign
77	size_t mPageSize;							// page size of executable (bytes)
78	uint32_t mFlags;							// CodeDirectory flags
79	uint32_t mHashType;							// digest algorithm code
80	uint32_t mDigestLength;						// number of bytes in a single glue digest
81	std::string mIdentifier;					// canonical identifier
82	std::string mTeamID;                        // team identifier
83
84	size_t mSpecialSlots;						// highest special slot set
85	size_t mCodeSlots;							// number of code pages (slots)
86
87	Scatter *mScatter;							// scatter vector
88	size_t mScatterSize;						// number of scatter elements allocated (incl. sentinel)
89
90	CodeDirectory *mDir;						// what we're building
91};
92
93
94}	// CodeSigning
95}	// Security
96
97
98#endif //_H_CDBUILDER
99