#ifndef __DOWNLOAD_H__
#define __DOWNLOAD_H__
#include <Security/SecCmsContentInfo.h>
#include <Security/SecCmsDecoder.h>
#include <Security/SecCmsEncoder.h>
#include <Security/SecCmsMessage.h>
#include <Security/SecCmsSignedData.h>
#include <Security/SecCmsSignerInfo.h>
#include <Security/SecTrustPriv.h>
#include <Security/SecCertificatePriv.h>
#include <CommonCrypto/CommonDigest.h>
#include "SecureDownload.h"
typedef u_int8_t Sha256Digest[CC_SHA256_DIGEST_LENGTH];
struct OpaqueSecureDownload
{
};
class Download : public OpaqueSecureDownload
{
protected:
CFDictionaryRef mDict;
CFArrayRef mURLs;
CFStringRef mName;
CFDateRef mDate;
CFDataRef mHashes;
CFIndex mNumHashes, mCurrentHash;
Sha256Digest mCurrentDigest, *mDigests; CFIndex mBytesInCurrentDigest;
CC_SHA256_CTX mSHA256Context;
SInt64 mDownloadSize;
ssize_t mSectorSize;
SecCmsMessageRef GetCmsMessageFromData (CFDataRef data);
void ParseTicket (CFDataRef ticket);
SecPolicyRef GetPolicy ();
void FinalizeDigestAndCompare ();
void GoOrNoGo (SecTrustResultType result);
public:
Download ();
virtual ~Download ();
void Initialize (CFDataRef data,
SecureDownloadTrustSetupCallback setup,
void* setupContext,
SecureDownloadTrustEvaluateCallback evaluate,
void* evaluateContext);
CFArrayRef CopyURLs ();
CFStringRef CopyName ();
CFDateRef CopyDate ();
SInt64 GetDownloadSize () {return mDownloadSize;}
void UpdateWithData (CFDataRef data);
void Finalize ();
};
#endif