/// <summary> /// Calculates the signature for this package. /// </summary> /// <param name="package"> /// The package for whcih to calculate the signature. /// </param> /// <param name="signer"> /// The signer to use. /// </param> /// <param name="compressedPayloadStream"> /// The compressed payload. /// </param> public void CalculateSignature(RpmPackage package, IPackageSigner signer, Stream compressedPayloadStream) { RpmSignature signature = new RpmSignature(package); using (MemoryStream headerStream = this.GetHeaderStream(package)) using (ConcatStream headerAndPayloadStream = new ConcatStream(leaveOpen: true, streams: new Stream[] { headerStream, compressedPayloadStream })) { SHA1 sha = SHA1.Create(); signature.Sha1Hash = sha.ComputeHash(headerStream); MD5 md5 = MD5.Create(); signature.MD5Hash = md5.ComputeHash(headerAndPayloadStream); // Verify the PGP signatures // 3 for the header headerStream.Position = 0; signature.HeaderPgpSignature = signer.Sign(headerStream); headerAndPayloadStream.Position = 0; signature.HeaderAndPayloadPgpSignature = signer.Sign(headerAndPayloadStream); // Verify the signature size (header + compressed payload) signature.HeaderAndPayloadSize = (int)headerAndPayloadStream.Length; } // Verify the payload size (header + uncompressed payload) using (Stream payloadStream = RpmPayloadReader.GetDecompressedPayloadStream(package, compressedPayloadStream)) { signature.UncompressedPayloadSize = (int)payloadStream.Length; } }
/// <summary> /// Determines the offsets for all records in the signature of a package. /// </summary> /// <param name="package"> /// The package for which to generate the offsets. /// </param> public void CalculateSignatureOffsets(RpmPackage package) { var signature = new RpmSignature(package); signature.ImmutableRegionSize = -1 * Marshal.SizeOf <IndexHeader>() * package.Signature.Records.Count; this.CalculateSectionOffsets(package.Signature, k => (int)k); }