]> git.saurik.com Git - apple/security.git/blobdiff - Security/libsecurity_manifest/lib/ManifestInternal.h
Security-57031.1.35.tar.gz
[apple/security.git] / Security / libsecurity_manifest / lib / ManifestInternal.h
diff --git a/Security/libsecurity_manifest/lib/ManifestInternal.h b/Security/libsecurity_manifest/lib/ManifestInternal.h
new file mode 100644 (file)
index 0000000..a6fcc09
--- /dev/null
@@ -0,0 +1,279 @@
+/*
+ *  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