--- /dev/null
+/*
+ * Copyright (c) 2004,2011,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@
+ */
+
+#ifndef _SECURITY_MANIFEST_H_
+#define _SECURITY_MANIFEST_H_
+
+
+#include <Security/Security.h>
+#include <security_utilities/security_utilities.h>
+#include <security_utilities/cfclass.h>
+#include <security_cdsa_client/cspclient.h>
+#include "SecManifest.h"
+#include <vector>
+#include <set>
+
+
+// note: The error range for the file signing library is -22040 through -22079
+
+class ManifestItem;
+
+class CSSMInitializer
+{
+protected:
+ static ModuleNexus<CSSMInitializer> mInstance;
+
+ CssmClient::Module mModule;
+ CssmClient::CSP mCSP;
+
+public:
+ CSSMInitializer ();
+ ~CSSMInitializer ();
+
+ static CssmClient::CSP* GetCSP ();
+};
+
+
+
+const int kSHA1DigestSize = 20;
+typedef unsigned char SHA1Digest[kSHA1DigestSize];
+
+typedef std::set<std::string> StringSet;
+
+class ManifestItemList : private std::vector<ManifestItem*>
+{
+private:
+
+friend class FileSystemItemList;
+
+ typedef std::vector<ManifestItem*> ParentClass;
+
+ void ConvertToStringSet (const char* path, CFArrayRef array, StringSet& stringSet);
+
+protected:
+ void DecodeURL (CFURLRef url, char *pathBuffer, CFIndex maxBufLen);
+ void AddDataObject (CFDataRef data);
+
+public:
+ ManifestItemList ();
+ ~ManifestItemList ();
+
+ void AddFileSystemObject (char* path, StringSet& exceptions, bool isRoot, bool hasAppleDoubleResourceFork);
+ void AddObject (CFTypeRef object, CFArrayRef exceptionList);
+
+ using ParentClass::push_back;
+ using ParentClass::size;
+ // using ParentClass::operator[];
+
+ ManifestItem* operator[] (int n) {return ParentClass::operator[] (n);}
+};
+
+
+
+class FileSystemItemList : public ManifestItemList
+{
+public:
+ void Compare (FileSystemItemList &itemList, bool compareOwnerAndGroup);
+};
+
+
+
+class RootItemList : public ManifestItemList
+{
+public:
+ void Compare (RootItemList& itemList, bool compareOwnerAndGroup);
+};
+
+
+
+class ManifestInternal
+{
+protected:
+ RootItemList mManifestItems;
+
+public:
+ ManifestInternal ();
+
+ virtual ~ManifestInternal ();
+
+ ManifestItemList& GetItemList () {return mManifestItems;}
+
+ static void CompareManifests (ManifestInternal& m1, ManifestInternal& m2, SecManifestCompareOptions options);
+};
+
+
+
+enum ManifestItemType {kManifestDataBlobItemType, kManifestFileItemType, kManifestDirectoryItemType, kManifestSymLinkItemType,
+ kManifestOtherType};
+
+// base class for our internal object representation
+class ManifestItem
+{
+public:
+ virtual ~ManifestItem ();
+
+ virtual ManifestItemType GetItemType () = 0;
+ virtual void Compare (ManifestItem *manifestItem, bool compareOwnerAndGroup) = 0;
+};
+
+
+
+class ManifestDataBlobItem : public ManifestItem
+{
+protected:
+ SHA1Digest mSHA1Digest;
+ size_t mLength;
+
+public:
+ ManifestDataBlobItem ();
+ virtual ~ManifestDataBlobItem ();
+
+ ManifestItemType GetItemType ();
+
+ const SHA1Digest* GetDigest ();
+ void SetDigest (const SHA1Digest *sha1Digest);
+ size_t GetLength ();
+ void SetLength (size_t length);
+ void Compare (ManifestItem* item, bool compareOwnerAndGroup);
+};
+
+
+
+class FileSystemEntryItem : public ManifestItem
+{
+protected:
+ std::string mPath, mName;
+ uid_t mUserID;
+ gid_t mGroupID;
+ mode_t mMode;
+
+public:
+ FileSystemEntryItem ();
+ virtual ~FileSystemEntryItem ();
+
+ void SetName (char* name);
+ void SetPath (char* path);
+ void SetUID (uid_t uid);
+ void SetGID (gid_t gid);
+ void SetMode (mode_t mode);
+
+ const char* GetName () const;
+ const std::string& GetNameAsString () const {return mName;}
+ uid_t GetUID () const;
+ gid_t GetGID () const;
+ mode_t GetMode () const;
+
+ void Compare (ManifestItem *manifestItem, bool compareOwnerAndGroup);
+};
+
+
+
+const int kMaxForks = 2;
+
+class ManifestFileItem : public FileSystemEntryItem
+{
+protected:
+ SHA1Digest mDigest[kMaxForks];
+ size_t mFileLengths[kMaxForks];
+
+ bool FileSystemHasTrueForks (char* pathToFile);
+ bool HasResourceFork (char* path, std::string &pathName, struct stat &st);
+ std::string ResourceFileName (char* path);
+ bool FileIsMachOBinary (char* path);
+ void ComputeDigestForFile (char* path, SHA1Digest &digest, size_t &length, struct stat &st);
+ void ComputeDigestForAppleDoubleResourceFork (char* path, SHA1Digest &digest, size_t &length);
+
+ int mNumForks;
+
+public:
+ ManifestFileItem ();
+ virtual ~ManifestFileItem ();
+
+ u_int32_t GetNumberOfForks ();
+ void SetNumberOfForks (u_int32_t numForks);
+ void ComputeRepresentations (struct stat &st, bool hasAppleDoubleResourceFork);
+ void GetItemRepresentation (int whichFork, void* &itemRep, size_t &size);
+ void SetItemRepresentation (int whichFork, const void* itemRep, size_t size);
+ void SetForkLength (int whichFork, size_t length);
+ size_t GetForkLength (int whichFork);
+
+ ManifestItemType GetItemType ();
+
+ void Compare (ManifestItem *manifestItem, bool compareOwnerAndGroup);
+};
+
+
+
+class ManifestDirectoryItem : public FileSystemEntryItem
+{
+protected:
+ FileSystemItemList mDirectoryItems;
+
+public:
+ ManifestDirectoryItem ();
+ virtual ~ManifestDirectoryItem ();
+
+ void SetPath (char* path, StringSet &exceptions, bool isRoot);
+ ManifestItemType GetItemType ();
+ ManifestItemList& GetItemList () {return mDirectoryItems;}
+
+ void Compare (ManifestItem *manifestItem, bool compareOwnerAndGroup);
+};
+
+
+
+class ManifestSymLinkItem : public FileSystemEntryItem
+{
+protected:
+ std::string mContent;
+ SHA1Digest mDigest;
+
+public:
+ ManifestSymLinkItem ();
+ virtual ~ManifestSymLinkItem ();
+
+ const SHA1Digest* GetDigest ();
+ void SetDigest (const SHA1Digest* sha1Digest);
+ void ComputeRepresentation ();
+ ManifestItemType GetItemType ();
+
+ void Compare (ManifestItem *manifestItem, bool compareOwnerAndGroup);
+};
+
+
+
+class ManifestOtherItem : public FileSystemEntryItem
+{
+protected:
+ std::string mPath, mName;
+
+public:
+ ManifestOtherItem ();
+ virtual ~ManifestOtherItem ();
+
+ ManifestItemType GetItemType ();
+
+ void Compare (ManifestItem *manifestItem, bool compareOwnerAndGroup);
+};
+
+#endif