X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/5c19dc3ae3bd8e40a9c028b0deddd50ff337692c..dd5fb164cf5b32c462296bc65e289e100f74b59a:/OSX/libsecurity_codesigning/lib/signerutils.h?ds=sidebyside diff --git a/OSX/libsecurity_codesigning/lib/signerutils.h b/OSX/libsecurity_codesigning/lib/signerutils.h index 906be1ea..88cb2055 100644 --- a/OSX/libsecurity_codesigning/lib/signerutils.h +++ b/OSX/libsecurity_codesigning/lib/signerutils.h @@ -81,7 +81,7 @@ public: // class ArchEditor : public DiskRep::Writer { public: - ArchEditor(Universal &fat, CodeDirectory::HashAlgorithm hashType, uint32_t attrs); + ArchEditor(Universal &fat, CodeDirectory::HashAlgorithms hashTypes, uint32_t attrs); virtual ~ArchEditor(); public: @@ -93,12 +93,17 @@ public: struct Arch : public BlobWriter { Architecture architecture; // our architecture auto_ptr source; // Mach-O object to be signed - CodeDirectory::Builder cdbuilder; // builder for CodeDirectory + std::map > cdBuilders; InternalRequirements ireqs; // consolidated internal requirements size_t blobSize; // calculated SuperBlob size - Arch(const Architecture &arch, CodeDirectory::HashAlgorithm hashType) - : architecture(arch), cdbuilder(hashType) { } + Arch(const Architecture &arch, CodeDirectory::HashAlgorithms hashTypes); + + void eachDigest(void (^op)(CodeDirectory::Builder& builder)) + { + for (auto type = cdBuilders.begin(); type != cdBuilders.end(); ++type) + op(*type->second); + } }; // @@ -151,7 +156,7 @@ private: // class MachOEditor : public ArchEditor, private UnixPlusPlus::Child { public: - MachOEditor(DiskRep::Writer *w, Universal &code, CodeDirectory::HashAlgorithm hashType, std::string srcPath); + MachOEditor(DiskRep::Writer *w, Universal &code, CodeDirectory::HashAlgorithms hashTypes, std::string srcPath); ~MachOEditor(); const RefPointer writer; @@ -165,6 +170,8 @@ public: void commit(); private: + CodeDirectory::HashAlgorithms mHashTypes; + // fork operation void childAction(); void parentAction(); @@ -193,6 +200,25 @@ public: private: CFRef mCerts; // hold cert chain }; + + +// +// A collector of CodeDirectories for hash-agile construction of signatures. +// +class CodeDirectorySet : public std::map { +public: + CodeDirectorySet() { mPrimary = NULL; } + ~CodeDirectorySet(); + + void add(const CodeDirectory* cd); + void populate(DiskRep::Writer* writer) const; + + const CodeDirectory* primary() const; + CFArrayRef hashBag() const; + +private: + mutable const CodeDirectory* mPrimary; +}; } // end namespace CodeSigning