#ifndef __APPLE_MANIFEST__
#define __APPLE_MANIFEST__
#include "ManifestSigner.h"
#include <Security/SecCmsBase.h>
#include <vector>
typedef std::vector<SecIdentityRef> SignerList;
class AppleManifest : public ManifestSigner
{
protected:
void AddDataBlobToManifest (CFMutableDataRef manifest, ManifestDataBlobItem* db);
void AddDirectoryToManifest (CFMutableDataRef manifest, ManifestDirectoryItem* directory);
void AddFileToManifest (CFMutableDataRef manifest, ManifestFileItem* file);
void AddSymLinkToManifest (CFMutableDataRef manifest, ManifestSymLinkItem* file);
void AddOtherToManifest (CFMutableDataRef manifest, ManifestOtherItem* other);
void AddManifestItemListToManifest (CFMutableDataRef manifest, ManifestItemList &itemList);
void CreateManifest (CFMutableDataRef manifest, ManifestInternal& internalManifest);
void AddSignersToCmsMessage (SecCmsMessageRef cmsMessage, SecCmsSignedDataRef signedData);
void ReconstructDataBlob (uint32& finger, const uint8* data, ManifestDataBlobItem*& db);
void ReconstructDirectory (uint32& finger, const uint8* data, ManifestDirectoryItem*& directory);
void ReconstructFile (uint32& finger, const uint8* data, ManifestFileItem *& file);
void ReconstructSymLink (uint32& finger, const uint8* data, ManifestSymLinkItem*& file);
void ReconstructOther (uint32& finger, const uint8* data, ManifestOtherItem*& other);
void ReconstructManifestItemList (uint32 &finger, const uint8* data, ManifestItemList &itemList);
void ReconstructManifest (uint8* data, uint32 length, ManifestInternal& manifest);
SignerList mSignerList;
SecCmsMessageRef GetCmsMessageFromData (CFDataRef data);
public:
AppleManifest ();
virtual ~AppleManifest ();
virtual CFDataRef Export (ManifestInternal& manifest);
void Verify (CFDataRef data, SecManifestTrustSetupCallback setupCallback, void* setupContext,
SecManifestTrustEvaluateCallback evaluateCallback, void* evaluateContext,
SecPolicyRef policyRef, ManifestInternal *manifest);
virtual void AddSigner (SecIdentityRef identityRef);
};
#endif