Пример #1
0
        /// <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;
            }
        }
Пример #2
0
        /// <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);
        }