]> git.saurik.com Git - apple/security.git/blobdiff - securityd/src/acl_partition.cpp
Security-57337.40.85.tar.gz
[apple/security.git] / securityd / src / acl_partition.cpp
diff --git a/securityd/src/acl_partition.cpp b/securityd/src/acl_partition.cpp
new file mode 100644 (file)
index 0000000..056743b
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2000-2006,2011-2012,2014 Apple Inc. All Rights Reserved.
+ * 
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The 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.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+
+//
+// acl_partition - partition identifier store
+//
+// This ACL subject stores keychain partition data.
+// When evaluated, it always fails. Securityd explicitly
+//
+#include "acl_partition.h"
+#include <security_cdsa_utilities/cssmwalkers.h>
+#include <security_cdsa_utilities/cssmlist.h>
+#include <algorithm>
+
+using namespace DataWalkers;
+
+
+//
+// The dictionaryPayload is the payload blob interpreted as an XML dictionary, or NULL if that didn't work.
+//
+CFDictionaryRef PartitionAclSubject::createDictionaryPayload() const
+{
+       return makeCFDictionaryFrom(CFTempData(this->payload));
+}
+
+void PartitionAclSubject::setDictionaryPayload(Allocator& alloc, CFDictionaryRef dict)
+{
+       CFRef<CFDataRef> xmlData = makeCFData(dict);
+       this->payload = CssmAutoData(alloc, CFDataGetBytePtr(xmlData), CFDataGetLength(xmlData));
+}
+
+
+//
+// The partition subject matches nothing, no matter how pretty.
+//
+bool PartitionAclSubject::validates(const AclValidationContext &) const
+{
+       return false;
+}
+
+
+//
+// The list form has a simple CssmData payload.
+//
+CssmList PartitionAclSubject::toList(Allocator &alloc) const
+{
+       return TypedList(Allocator::standard(), CSSM_ACL_SUBJECT_TYPE_PARTITION,
+                                        new(alloc) ListElement(alloc, this->payload));
+}
+
+
+//
+// Set payload from list input.
+//
+PartitionAclSubject *PartitionAclSubject::Maker::make(const TypedList &list) const
+{
+       Allocator &alloc = Allocator::standard();
+       if (list.length() != 2)
+               CssmError::throwMe(CSSM_ERRCODE_INVALID_ACL_SUBJECT_VALUE);
+       ListElement *payloadItem;
+       crack(list, 1, &payloadItem, CSSM_LIST_ELEMENT_DATUM);
+       return new PartitionAclSubject(alloc, payloadItem->data());
+}
+
+
+//
+// A PartitionAclSubject is a "null" subject that contains out of band data
+// for further security evaluation. When evaluated as an ACL subject, it always fails.
+//
+PartitionAclSubject *PartitionAclSubject::Maker::make(Version, Reader &pub, Reader &) const
+{
+       Allocator& alloc = Allocator::standard();
+       const void* data; size_t length;
+       pub.countedData(data, length);
+       CssmAutoData payloadData(alloc, data, length);
+       return new PartitionAclSubject(alloc, payloadData);
+}
+
+
+//
+// Export to blob form.
+// This simply writes the smallest form consistent with the heuristic above.
+//
+void PartitionAclSubject::exportBlob(Writer::Counter &pub, Writer::Counter &)
+{
+       pub.countedData(this->payload);
+}
+
+void PartitionAclSubject::exportBlob(Writer &pub, Writer &)
+{
+       pub.countedData(this->payload);
+}