public static void ResignExecutable(MachObjectFile file, string bundleIdentifier, List <X509Certificate> certificateChain, AsymmetricKeyEntry privateKey, byte[] infoFileBytes, byte[] codeResourcesBytes, EntitlementsFile entitlements) { X509Certificate signingCertificate = certificateChain[certificateChain.Count - 1]; string certificateCN = CertificateHelper.GetCertificateCommonName(signingCertificate); string teamID = CertificateHelper.GetCertificateOrganizationalUnit(signingCertificate); SegmentCommand linkEditSegment = SegmentCommandHelper.FindLinkEditSegment(file.LoadCommands); if (linkEditSegment == null) { throw new InvalidDataException("LinkEdit segment was not found"); } if (file.LoadCommands[file.LoadCommands.Count - 1].CommandType != LoadCommandType.CodeSignature) { throw new NotImplementedException("The last LoadCommand entry is not CodeSignature"); } CodeSignatureCommand command = (CodeSignatureCommand)file.LoadCommands[file.LoadCommands.Count - 1]; int codeLength = (int)command.DataOffset; CodeDirectoryBlob codeDirectory = CreateCodeDirectoryBlob(codeLength, bundleIdentifier, teamID, HashType.SHA1); AttributeTable signedAttributesTable = null; #if ALT_CODE_DIRECTORY_SHA256 CodeDirectoryBlob alternativeCodeDirectory1 = CreateCodeDirectoryBlob(codeLength, bundleIdentifier, teamID, HashType.SHA256); signedAttributesTable = GenerateSignedAttributesTable(codeDirectory.GetBytes(), alternativeCodeDirectory1.GetBytes()); #endif CodeRequirementsBlob codeRequirements = CreateCodeRequirementsBlob(bundleIdentifier, certificateCN); EntitlementsBlob entitlementsBlob = CreateEntitlementsBlob(entitlements); CmsSignatureBlob cmsSignature = new CmsSignatureBlob(); // We create a dummy signature to determine the length required cmsSignature.Data = CMSHelper.GenerateSignature(certificateChain, privateKey, codeDirectory.GetBytes(), signedAttributesTable); CodeSignatureSuperBlob codeSignature = new CodeSignatureSuperBlob(); codeSignature.Entries.Add(CodeSignatureEntryType.CodeDirectory, codeDirectory); codeSignature.Entries.Add(CodeSignatureEntryType.Requirements, codeRequirements); codeSignature.Entries.Add(CodeSignatureEntryType.Entitlements, entitlementsBlob); #if ALT_CODE_DIRECTORY_SHA256 codeSignature.Entries.Add(CodeSignatureEntryType.AlternateCodeDirectory1, alternativeCodeDirectory1); #endif codeSignature.Entries.Add(CodeSignatureEntryType.CmsSignature, cmsSignature); command.DataSize = (uint)codeSignature.Length; uint finalFileSize = command.DataOffset + command.DataSize; SegmentCommandHelper.SetEndOffset(linkEditSegment, finalFileSize); byte[] codeToHash = ByteReader.ReadBytes(file.GetBytes(), 0, codeLength); UpdateSpecialHashes(codeDirectory, codeToHash, infoFileBytes, codeRequirements, codeResourcesBytes, entitlementsBlob); #if ALT_CODE_DIRECTORY_SHA256 UpdateSpecialHashes(alternativeCodeDirectory1, codeToHash, infoFileBytes, codeRequirements, codeResourcesBytes, entitlementsBlob); signedAttributesTable = GenerateSignedAttributesTable(codeDirectory.GetBytes(), alternativeCodeDirectory1.GetBytes()); #endif cmsSignature.Data = CMSHelper.GenerateSignature(certificateChain, privateKey, codeDirectory.GetBytes(), signedAttributesTable); // Store updated code signature: byte[] codeSignatureBytes = codeSignature.GetBytes(); Array.Resize <byte>(ref file.Data, (codeLength - file.DataOffset) + (int)command.DataSize); ByteWriter.WriteBytes(file.Data, (int)command.DataOffset - file.DataOffset, codeSignatureBytes); }
// Use this for initialization void Start() { this.lsys = new LSystem.LSystem(); lsys.Rules = new Dictionary <string, string> { { "1", "FF-[1]++F+F" } }; // lsys.Rules = new Dictionary<string, string> { { "1", "FF-[1]++F+F+1" } }; // lsys.Rules = new Dictionary<string, string> { { "1", "F+F-F([1]" } }; // lsys.Rules = new Dictionary<string, string> { // { "1", "FFF+[2]F+(>[---1]" }, // { "2", "FFF[1]+[1]+[1]+[1]" } // }; lsys.Angle = this.angle; lsys.SegmentLength = this.segmentLength; var cmd = new CommonCommands(); cmd.Angle = this.angle; cmd.AngleAxis = this.angleAxis; cmd.SegmentAxis = this.segmentAxis; cmd.SegmentLength = this.segmentLength; lsys.AddCommand(cmd); this.segmentDrawer = new VectorLineSegmentDrawer(); var segCmd = new SegmentCommand(); segCmd.Segment = this.segmentDrawer; segCmd.SegmentAxis = this.segmentAxis; lsys.AddCommand(segCmd); this.totalTime = lsys.Duration(this.generations); Debug.Log(string.Format("totalTime = {0}", this.totalTime)); // lsys.Draw(Vector3.zero, this.generations); }
public SegmentController(SegmentCommand segmentCommand) { _segmentCommand = segmentCommand; }