]> git.saurik.com Git - apple/security.git/blobdiff - Keychain/TrustedApplication.cpp
Security-54.tar.gz
[apple/security.git] / Keychain / TrustedApplication.cpp
diff --git a/Keychain/TrustedApplication.cpp b/Keychain/TrustedApplication.cpp
new file mode 100644 (file)
index 0000000..b2a532c
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2002 Apple Computer, Inc. All Rights Reserved.
+ * 
+ * The contents of this file constitute Original Code as defined in and are
+ * subject to the Apple Public Source License Version 1.2 (the 'License').
+ * You may not use this file except in compliance with the License. Please obtain
+ * a copy of the License at http://www.apple.com/publicsource and read it before
+ * using this file.
+ * 
+ * This 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.
+ */
+
+//
+// TrustedApplication.cpp
+//
+#include <Security/TrustedApplication.h>
+#include <Security/ACL.h>
+#include <Security/osxsigning.h>
+#include <Security/osxsigner.h>
+#include <Security/trackingallocator.h>
+#include <memory>
+
+using namespace KeychainCore;
+using namespace CodeSigning;
+
+
+//
+// Create a TrustedApplication from a code-signing ACL subject.
+// Throws ACL::ParseError if the subject is unexpected.
+//
+TrustedApplication::TrustedApplication(const TypedList &subject)
+       : mSignature(CssmAllocator::standard()),
+         mData(CssmAllocator::standard())
+{
+       if (subject.type() != CSSM_ACL_SUBJECT_TYPE_CODE_SIGNATURE)
+               throw ACL::ParseError();
+       if (subject[1] != CSSM_ACL_CODE_SIGNATURE_OSX)
+               throw ACL::ParseError();
+       mSignature = subject[2].data();
+       mData = subject[3].data();
+}
+
+
+TrustedApplication::TrustedApplication(const CssmData &signature, const CssmData &data) :
+       mSignature(CssmAllocator::standard(), signature),
+       mData(CssmAllocator::standard(), data)
+{
+}
+
+TrustedApplication::TrustedApplication(const char *path)
+       : mSignature(CssmAllocator::standard()),
+         mData(CssmAllocator::standard())
+{
+       OSXSigner signer;
+       RefPointer<OSXCode> object(OSXCode::at(path));
+       auto_ptr<OSXSigner::OSXSignature> signature(signer.sign(*object));
+       mSignature = *signature;
+       mData = CssmData(const_cast<char *>(path), strlen(path) + 1);
+}
+
+TrustedApplication::TrustedApplication()
+       : mSignature(CssmAllocator::standard()),
+         mData(CssmAllocator::standard())
+{
+       OSXSigner signer;
+       RefPointer<OSXCode> object(OSXCode::main());
+       auto_ptr<OSXSigner::OSXSignature> signature(signer.sign(*object));
+       mSignature = *signature;
+       string path = object->canonicalPath();
+       mData.copy(path.c_str(), path.length() + 1);    // including trailing null
+}
+
+TrustedApplication::~TrustedApplication()
+{
+}
+
+const CssmData &
+TrustedApplication::signature() const
+{
+       return mSignature;
+}
+
+bool
+TrustedApplication::sameSignature(const char *path)
+{
+       // return true if object at given path has same signature
+    CssmAutoData otherSignature(CssmAllocator::standard());
+    calcSignature(path, otherSignature);
+       return (mSignature.get() == otherSignature);
+}
+
+void
+TrustedApplication::calcSignature(const char *path, CssmOwnedData &signature)
+{
+       // generate a signature for the given object
+    RefPointer<CodeSigning::OSXCode> objToVerify(CodeSigning::OSXCode::at(path));
+       CodeSigning::OSXSigner signer;
+    auto_ptr<CodeSigning::OSXSigner::OSXSignature> osxSignature(signer.sign(*objToVerify));
+    signature.copy(osxSignature->data(), osxSignature->length());
+}
+
+
+//
+// Produce a TypedList representing a code-signing ACL subject
+// for this application.
+// Memory is allocated from the allocator given, and belongs to
+// the caller.
+//
+TypedList TrustedApplication::makeSubject(CssmAllocator &allocator)
+{
+       return TypedList(allocator,
+               CSSM_ACL_SUBJECT_TYPE_CODE_SIGNATURE,
+               new(allocator) ListElement(CSSM_ACL_CODE_SIGNATURE_OSX),
+               new(allocator) ListElement(mSignature.get()),
+               new(allocator) ListElement(mData.get()));
+}