]>
git.saurik.com Git - apple/libsecurity_codesigning.git/blob - lib/filediskrep.cpp
9fefe6a5575ac9d3b07577f5ddd5685096dd5a0b
2 * Copyright (c) 2006-2007 Apple Inc. All Rights Reserved.
4 * @APPLE_LICENSE_HEADER_START@
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
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.
21 * @APPLE_LICENSE_HEADER_END@
23 #include "filediskrep.h"
24 #include "StaticCode.h"
25 #include "macho++.h" // may perhaps move into security_utilities...
30 namespace CodeSigning
{
32 using namespace UnixPlusPlus
;
36 // Everything's lazy in here
38 FileDiskRep::FileDiskRep(const char *path
)
45 // Produce an extended attribute name from a canonical slot name
47 string
FileDiskRep::attrName(const char *name
)
49 static const char prefix
[] = "com.apple.cs.";
50 return string(prefix
) + name
;
55 // Retrieve an extended attribute by name
57 CFDataRef
FileDiskRep::getAttribute(const char *name
)
59 string aname
= attrName(name
);
60 ssize_t length
= fd().getAttrLength(aname
);
62 return NULL
; // no such attribute
63 CFMallocData
buffer(length
);
64 fd().getAttr(aname
, buffer
, length
);
70 // Extract and return a component by slot number.
71 // If we have a Mach-O binary, use embedded components.
72 // Otherwise, look for and return the extended attribute, if any.
74 CFDataRef
FileDiskRep::component(CodeDirectory::SpecialSlot slot
)
76 if (const char *name
= CodeDirectory::canonicalSlotName(slot
))
77 return getAttribute(name
);
84 // Generate a suggested set of internal requirements.
85 // We don't really have to say much. However, if we encounter a file that
86 // starts with the magic "#!" script marker, we do suggest that this should
87 // be a valid host if we can reasonably make out what that is.
89 const Requirements
*FileDiskRep::defaultRequirements(const Architecture
*)
93 size_t length
= fd().read(buffer
, sizeof(buffer
), 0);
94 if (length
> 3 && buffer
[0] == '#' && buffer
[1] == '!' && buffer
[2] == '/') {
95 // isolate (full) path element in #!/full/path -some -other -stuff
96 if (length
== sizeof(buffer
))
98 buffer
[length
] = '\0';
99 char *path
= buffer
+ 2;
100 path
[strcspn(path
, " \t\n\r\f")] = '\0';
101 secdebug("filediskrep", "looks like a script for %s", path
);
104 // find path on disk, get designated requirement (if signed)
105 if (RefPointer
<DiskRep
> rep
= DiskRep::bestFileGuess(path
))
106 if (SecPointer
<SecStaticCode
> code
= new SecStaticCode(rep
))
107 if (const Requirement
*req
= code
->designatedRequirement()) {
108 // package up as host requirement and return that
109 Requirements::Maker maker
;
110 maker
.add(kSecHostRequirementType
, req
->clone());
111 secdebug("filediskrep", "made a scripting host requirement");
115 secdebug("filediskrep", "exception getting host requirement (ignored)");
122 string
FileDiskRep::format()
129 // FileDiskRep::Writers
131 DiskRep::Writer
*FileDiskRep::writer()
133 return new Writer(this);
138 // Write a component.
139 // Note that this isn't concerned with Mach-O writing; this is handled at
140 // a much higher level. If we're called, it's extended attribute time.
142 void FileDiskRep::Writer::component(CodeDirectory::SpecialSlot slot
, CFDataRef data
)
144 fd().setAttr(attrName(CodeDirectory::canonicalSlotName(slot
)),
145 CFDataGetBytePtr(data
), CFDataGetLength(data
));
150 // We are NOT the preferred store for components because our approach
151 // (extended attributes) suffers from some serious limitations.
153 bool FileDiskRep::Writer::preferredStore()
159 } // end namespace CodeSigning
160 } // end namespace Security