]> git.saurik.com Git - apple/security.git/blob - cdsa/cdsa_client/osxsigner.cpp
Security-54.1.tar.gz
[apple/security.git] / cdsa / cdsa_client / osxsigner.cpp
1 /*
2 * Copyright (c) 2000-2001 Apple Computer, Inc. All Rights Reserved.
3 *
4 * The contents of this file constitute Original Code as defined in and are
5 * subject to the Apple Public Source License Version 1.2 (the 'License').
6 * You may not use this file except in compliance with the License. Please obtain
7 * a copy of the License at http://www.apple.com/publicsource and read it before
8 * using this file.
9 *
10 * This Original Code and all software distributed under the License are
11 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
12 * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
13 * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14 * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the
15 * specific language governing rights and limitations under the License.
16 */
17
18
19 //
20 // osxsigner - MacOS X's standard code signing algorithm.
21 //
22 #ifdef __MWERKS__
23 #define _CPP_OSXSIGNER
24 #endif
25
26 #include <Security/osxsigner.h>
27 #include <Security/cssmdata.h>
28 #include <Security/debugging.h>
29
30
31 namespace Security
32 {
33
34 namespace CodeSigning
35 {
36
37 //
38 // Construct an OSXSigner
39 //
40 OSXSigner::OSXSigner() : csp(gGuidAppleCSP)
41 {
42 }
43
44
45 //
46 // Signing/verification implementation
47 //
48 OSXSigner::OSXSignature *OSXSigner::sign(const Signable &target)
49 {
50 Digester digester(*this);
51 scanContents(digester, target);
52 DataBuffer<OSXSignature::hashLength> hash;
53 digester(hash);
54 IFDUMPING("codesign", Debug::dumpData("sign", hash));
55 return new OSXSignature(hash);
56 }
57
58 bool OSXSigner::verify(const Signable &target, const Signature *signature)
59 {
60 if (const OSXSignature *sig = dynamic_cast<const OSXSignature *>(signature)) {
61 Digester digester(*this);
62 scanContents(digester, target);
63 DataBuffer<OSXSignature::hashLength> hash;
64 digester(hash);
65 IFDUMPING("codesign", Debug::dumpData("verify", hash));
66 return (*sig) == hash;
67 }
68 return false;
69 }
70
71 void OSXSigner::Digester::enumerateContents(const void *data, size_t length)
72 {
73 digest(CssmData(const_cast<void *>(data), length));
74 }
75
76
77 //
78 // Re-create a Signature object from its external representation
79 //
80 OSXSigner::OSXSignature *OSXSigner::restore(uint32 type, const void *data, size_t length)
81 {
82 switch (type) {
83 case CSSM_ACL_CODE_SIGNATURE_OSX:
84 if (length != OSXSignature::hashLength)
85 CssmError::throwMe(CSSM_ERRCODE_INVALID_DATA);
86 return new OSXSignature(data);
87 default:
88 CssmError::throwMe(CSSM_ERRCODE_UNKNOWN_FORMAT);
89 }
90 }
91
92
93 }; // end namespace CodeSigning
94
95 } // end namespace Security