#ifndef _H_SIGNER
#define _H_SIGNER
#include "CodeSigner.h"
#include "cdbuilder.h"
#include "signerutils.h"
#include "StaticCode.h"
#include <security_utilities/utilities.h>
namespace Security {
namespace CodeSigning {
class SecCodeSigner::Signer {
public:
Signer(SecCodeSigner &s, SecStaticCode *c) : state(s), code(c), requirements(NULL) { }
~Signer() { ::free((Requirements *)requirements); }
void sign(SecCSFlags flags);
void remove(SecCSFlags flags);
SecCodeSigner &state;
SecStaticCode * const code;
CodeDirectory::HashAlgorithm digestAlgorithm() const { return state.mDigestAlgorithm; }
std::string path() const { return cfString(rep->canonicalPath()); }
SecIdentityRef signingIdentity() const { return state.mSigner; }
std::string signingIdentifier() const { return identifier; }
protected:
void prepare(SecCSFlags flags); void signMachO(Universal *fat, const Requirement::Context &context); void signArchitectureAgnostic(const Requirement::Context &context);
void populate(DiskRep::Writer &writer); void populate(CodeDirectory::Builder &builder, DiskRep::Writer &writer,
InternalRequirements &ireqs, size_t offset = 0, size_t length = 0); CFDataRef signCodeDirectory(const CodeDirectory *cd);
uint32_t cdTextFlags(std::string text); std::string uniqueName() const;
protected:
void buildResources(std::string root, CFDictionaryRef rules);
CFMutableDictionaryRef signNested(FTSENT *ent, const char *relpath);
CFDataRef hashFile(const char *path);
private:
RefPointer<DiskRep> rep; CFRef<CFDictionaryRef> resourceDirectory; CFRef<CFDataRef> resourceDictData; std::string identifier; CFRef<CFDataRef> entitlements; uint32_t cdFlags; const Requirements *requirements; size_t pagesize; CFAbsoluteTime signingTime; };
} }
#endif // !_H_CODESIGNER