#ifndef _H_CSUTILS
#define _H_CSUTILS
#include <cstdio>
#include <string>
#include <getopt.h>
#include <Security/Security.h>
#include <Security/CodeSigning.h>
#include <Security/SecRequirementPriv.h>
#include <security_utilities/unix++.h>
#include <security_utilities/errors.h>
#include <security_utilities/hashing.h>
#include <security_utilities/cfutilities.h>
enum {
exitSuccess = 0,
exitFailure = 1,
exitUsage = 2,
exitNoverify = 3
};
void fail(const char *format, ...);
void note(unsigned level, const char *format, ...);
void diagnose(const char *context = NULL, int stop = 0);
void diagnose(const char *context, CFErrorRef err);
void diagnose(const char *context, OSStatus rc, CFDictionaryRef info);
struct Fail : public std::exception { Fail(int c) : code(c) { }
const int code;
};
class ErrorCheck {
public:
ErrorCheck() : mError(NULL) { }
operator CFErrorRef * () { return &mError; }
void operator () (OSStatus rc);
public:
struct Error {
Error(CFErrorRef e) : error(e) { }
CFErrorRef error;
};
private:
CFErrorRef mError;
};
std::string keychainPath(CFTypeRef whatever);
SecIdentityRef findIdentity(SecKeychainRef keychain, const char *name);
CFTypeRef readRequirement(const std::string &source, SecCSFlags flags);
inline SecRequirementRef readRequirement(const std::string &source)
{ return SecRequirementRef(readRequirement(source, kSecCSParseRequirement)); }
inline CFDataRef readRequirements(const std::string &source)
{ return CFDataRef(readRequirement(source, kSecCSParseRequirementSet)); }
uint32_t parseCdFlags(const char *string);
CFDateRef parseDate(const char *string);
std::string hashString(const SHA1::Byte *hash);
std::string hashString(SHA1 &hash);
void writeFileList(CFArrayRef list, const char *destination, const char *mode);
void writeDictionary(CFDictionaryRef dict, const char *destination, const char *mode);
void writeData(CFDataRef data, const char *destination, const char *mode);
SecCodeRef codePath(const char *target);
extern unsigned verbose; extern bool force; extern bool continueOnError;
extern int exitcode;
#endif //_H_CSUTILS