public static int GetSignatureCentralDirectoryIndex(SignedPackageArchiveMetadata metadata, SigningSpecifications signingSpecification) { var centralDirectoryRecords = metadata.CentralDirectoryHeaders; var centralDirectoryRecordsCount = centralDirectoryRecords.Count; for (var centralDirectoryRecordIndex = 0; centralDirectoryRecordIndex < centralDirectoryRecordsCount; centralDirectoryRecordIndex++) { var record = centralDirectoryRecords[centralDirectoryRecordIndex]; if (record.IsPackageSignatureFile) { return(centralDirectoryRecordIndex); } } return(-1); }
public static int GetSignatureCentralDirectoryIndex(SignedPackageArchiveMetadata metadata, SigningSpecifications signingSpecification) { var centralDirectoryRecords = metadata.CentralDirectoryHeaders; var centralDirectoryRecordsCount = centralDirectoryRecords.Count; for (var centralDirectoryRecordIndex = 0; centralDirectoryRecordIndex < centralDirectoryRecordsCount; centralDirectoryRecordIndex++) { var record = centralDirectoryRecords[centralDirectoryRecordIndex]; if (StringComparer.Ordinal.Equals(record.Filename, signingSpecification.SignaturePath)) { return(centralDirectoryRecordIndex); } } return(-1); }
private static List <CentralDirectoryHeaderMetadata> ShiftMetadata( SigningSpecifications spec, SignedPackageArchiveMetadata metadata, int newSignatureFileEntryIndex, int newSignatureCentralDirectoryRecordIndex) { var shiftedCdr = new List <CentralDirectoryHeaderMetadata>(metadata.CentralDirectoryHeaders); // Sort Central Directory records in the order the file entries appear in the original archive shiftedCdr.Sort((x, y) => x.OffsetToFileHeader.CompareTo(y.OffsetToFileHeader)); // Shift Central Directory records to the desired position. // Because we sorted in the file entry order this will shift // the file entries ShiftSignatureToIndex(spec, shiftedCdr, newSignatureFileEntryIndex); // Calculate the change in offsets for the shifted file entries var lastEntryEnd = 0L; foreach (var cdr in shiftedCdr) { cdr.ChangeInOffset = lastEntryEnd - cdr.OffsetToFileHeader; lastEntryEnd = cdr.OffsetToFileHeader + cdr.FileEntryTotalSize + cdr.ChangeInOffset; } // Now we sort the central directory records in the order thecentral directory records appear in the original archive shiftedCdr.Sort((x, y) => x.Position.CompareTo(y.Position)); // Shift Central Directory records to the desired position. // Because we sorted in the central directory records order this will shift // the central directory records ShiftSignatureToIndex(spec, shiftedCdr, newSignatureCentralDirectoryRecordIndex); // Calculate the new indexes for each central directory record var lastIndex = 0; foreach (var cdr in shiftedCdr) { cdr.IndexInHeaders = lastIndex; lastIndex++; } return(shiftedCdr); }