public void CreateCadesManifest()
        {
            var cadesManifestCreator = CadesManifestCreator.CreateWithoutSignatureFile();
            var digestAlgorithm      = MessageDigestAlgorithm.SHA256Desig;
            var fileEntry            = new AsicePackageEntry("my.pdf", MimeType.ForString("application/pdf"), digestAlgorithm);

            fileEntry.Digest = new DigestContainer(new byte[] { 0, 0, 1 }, digestAlgorithm);
            var entries  = new[] { fileEntry };
            var manifest = cadesManifestCreator.CreateManifest(entries);

            manifest.Should().NotBeNull()
            .And
            .BeOfType <ManifestContainer>();
            manifest.Data.Should().NotBeNull();
            manifest.FileName.Should().Be(AsiceConstants.CadesManifestFilename);

            var xmlManifest = DeserializeManifest(manifest.Data.ToArray());

            xmlManifest.Should().NotBeNull();
            xmlManifest.SigReference.Should().BeNull();
            xmlManifest.DataObjectReference.Should().HaveCount(1);
            var dataObjectRef = xmlManifest.DataObjectReference[0];

            dataObjectRef.Should().NotBeNull();
            dataObjectRef.MimeType.Should().Be(fileEntry.Type.ToString());
            dataObjectRef.DigestValue.Should().Equal(fileEntry.Digest.GetDigest());
            dataObjectRef.URI.Should().Be(fileEntry.FileName);
        }
Beispiel #2
0
        /// <summary>
        /// Create builder
        /// </summary>
        /// <param name="stream">The stream where the ASiC-E data will be written. Can not be null and must be writable</param>
        /// <param name="messageDigestAlgorithm">The digest algorithm to use. Not nullable</param>
        /// <param name="signCertificate">A private/public keypair to use for signing. May be null</param>
        /// <returns>A builder that may be used to construct a ASiC-E package</returns>
        /// <exception cref="ArgumentException">If the provided stream is not writable</exception>
        public static AsiceBuilder Create(
            Stream stream,
            MessageDigestAlgorithm messageDigestAlgorithm,
            ICertificateHolder signCertificate)
        {
            var outStream = stream ?? throw new ArgumentNullException(nameof(stream));
            var algorithm = messageDigestAlgorithm ?? throw new ArgumentNullException(nameof(messageDigestAlgorithm));

            if (!outStream.CanWrite)
            {
                throw new ArgumentException("The provided Stream must be writable", nameof(stream));
            }

            var cadesManifestCreator = signCertificate == null
                ? CadesManifestCreator.CreateWithoutSignatureFile()
                : CadesManifestCreator.CreateWithSignatureFile();

            return(new AsiceBuilder(AsiceArchive.Create(outStream, cadesManifestCreator, signCertificate), algorithm));
        }
Beispiel #3
0
        public void CreateCadesManifestIncludingSignature()
        {
            var cadesManifestCreator = CadesManifestCreator.CreateWithSignatureFile();
            var fileEntry            = new AsicePackageEntry("my.pdf", MimeType.ForString("application/pdf"), MessageDigestAlgorithm.SHA256);

            fileEntry.Digest = new DigestContainer(new byte[] { 0, 0, 1 }, MessageDigestAlgorithm.SHA256);
            var manifest = cadesManifestCreator.CreateManifest(new[] { fileEntry });

            manifest.Should().NotBeNull()
            .And
            .BeOfType <ManifestContainer>();
            manifest.FileName.Should().Be(AsiceConstants.CadesManifestFilename);
            var xmlManifest = DeserializeManifest(manifest.Data.ToArray());

            xmlManifest.Should().NotBeNull();
            xmlManifest.SigReference.Should().NotBeNull();
            xmlManifest.SigReference.MimeType.Should().Be(AsiceConstants.ContentTypeSignature);
            xmlManifest.DataObjectReference.Should().HaveCount(1);
        }
        public void CreateCadesManifestIncludingSignature()
        {
            var cadesManifestCreator = CadesManifestCreator.CreateWithSignatureFile();
            var fileEntry            = new AsicePackageEntry("P.00987654321.001.P001.65013_File1.xml", MimeType.ForString("application/xml"), MessageDigestAlgorithm.SHA256Enc);

            fileEntry.Digest = new DigestContainer(new byte[] { 0, 0, 1 }, MessageDigestAlgorithm.SHA256Enc);
            var fileEntry2 = new AsicePackageEntry("ApprovalData/ApprovalData1.xml", MimeType.ForString("application/xml"), MessageDigestAlgorithm.SHA256Desig);

            fileEntry2.Digest = new DigestContainer(new byte[] { 0, 0, 1 }, MessageDigestAlgorithm.SHA256Desig);
            var manifest = cadesManifestCreator.CreateManifest(new[] { fileEntry, fileEntry2 });

            manifest.Should().NotBeNull()
            .And
            .BeOfType <ManifestContainer>();
            manifest.FileName.Should().Be(AsiceConstants.CadesManifestFilename);

            File.WriteAllBytes(@"c:\temp\manifest.xml", manifest.Data.ToArray());
            var xmlManifest = DeserializeManifest(manifest.Data.ToArray());

            xmlManifest.Should().NotBeNull();
            xmlManifest.SigReference.Should().NotBeNull();
            xmlManifest.SigReference.MimeType.Should().Be(AsiceConstants.ContentTypeSignature);
            xmlManifest.DataObjectReference.Should().HaveCount(2);
        }
Beispiel #5
0
        public void CreateArchive()
        {
            byte[] zippedData;
            using (var zippedOutStream = new MemoryStream())
            {
                using (var archive = AsiceArchive.Create(
                           zippedOutStream,
                           CadesManifestCreator.CreateWithSignatureFile(),
                           TestdataLoader.ReadCertificatesForTest(),
                           MessageDigestAlgorithm.SHA256Desig))
                    using (var fileStream = File.OpenRead(FileNameTestPdf))
                    {
                        archive.AddEntry(
                            fileStream,
                            new FileRef(FileNameTestPdf, MimeType.ForString(MimeTypes.GetMimeType(FileNameTestPdf))));
                    }

                zippedData = zippedOutStream.ToArray();
                zippedData.Should().NotBeNull();
                zippedData.Should().HaveCountGreaterThan(0);
            }

            using (var zipInput = new MemoryStream(zippedData))
                using (var zippedArchive = new ZipArchive(zipInput, ZipArchiveMode.Read))
                {
                    zippedArchive.Entries.Should().HaveCount(4);
                    zippedArchive.Entries.First(e => e.FullName.Equals(FileNameTestPdf, StringComparison.CurrentCulture)).Should().NotBeNull();
                    zippedArchive.Entries.First(e => e.FullName.Equals(AsiceConstants.CadesManifestFilename, StringComparison.CurrentCulture)).Should().NotBeNull();
                    zippedArchive.Entries.First(e => e.FullName.Equals(AsiceConstants.FileNameMimeType, StringComparison.CurrentCulture)).Should()
                    .NotBeNull();

                    var mimeTypeEntry = zippedArchive.GetEntry(AsiceConstants.FileNameMimeType);
                    using (var entryStream = mimeTypeEntry.Open())
                        using (var copyStream = new MemoryStream())
                        {
                            entryStream.CopyTo(copyStream);
                            Encoding.UTF8.GetString(copyStream.ToArray()).Should().Be(AsiceConstants.ContentTypeASiCe);
                        }

                    // Verifies that a CADES manifest has been generated
                    using (var entryStream = zippedArchive.GetEntry(AsiceConstants.CadesManifestFilename).Open())
                        using (var copyStream = new MemoryStream())
                        {
                            entryStream.CopyTo(copyStream);

                            var manifestXml = Encoding.UTF8.GetString(copyStream.ToArray());
                            manifestXml.Should().NotBeNull();
                            this.log.Info($"Manifest: {manifestXml}");
                        }

                    var signatureFile = zippedArchive.Entries
                                        .First(e => e.FullName.StartsWith("META-INF", StringComparison.CurrentCulture) &&
                                               e.FullName.EndsWith(".p7s", StringComparison.CurrentCulture));
                    signatureFile.Should().NotBeNull();

                    // Verifies the signature file
                    using (var entryStream = signatureFile.Open())
                        using (var copyStream = new MemoryStream())
                        {
                            entryStream.CopyTo(copyStream);
                            var signatureContent = copyStream.ToArray();
                            signatureContent.Should().HaveCountGreaterThan(0);
                        }
                }

            var tempFileName = Path.GetTempFileName();

            using (var zippedStream = new MemoryStream(zippedData))
                using (var outputFileStream = File.OpenWrite(tempFileName))
                {
                    zippedStream.CopyTo(outputFileStream);
                }

            this.log.Info($"Wrote package to '{tempFileName}'");
        }