/// <summary>
        /// Creates a signed CDA package zip file.
        /// </summary>
        /// <param name="package">The CDAPackageBase instance used to generate the zip file content.</param>
        /// <param name="signingCert">The certificate used to sign the CDA root document.</param>
        /// <returns>A byte array of the zip file content.</returns>
        public static byte[] Create(CDAPackage package, X509Certificate2 signingCert)
        {
            // Validation on package
            Validation.ValidateArgumentRequired("package", package);

            // Validate CDAPackage
            CDAPackageValidation.ValidateCDAPackage(package, signingCert != null);

            var ms = new MemoryStream();

            // Generate signature if package operation is ADD or REPLACE
            byte[] signatureContent = null;
            if (signingCert != null)
            {
                signatureContent = CreateSignature(package, signingCert);

                package.CDASignature = new CDAPackageFile();
                package.CDASignature.CDAPackageFileType = CDAPackageFile.FileType.Signature;
                package.CDASignature.FileContent        = signatureContent;
                package.CDASignature.FileName           = "CDA_SIGN.XML";
            }

            using (var zip = new ZipFile(Encoding.Default))
            {
                // Add folder entries
                zip.AddEntry("IHE_XDM/", "");
                zip.AddEntry("IHE_XDM/SUBSET01/", "");

                zip.AddEntry("IHE_XDM/SUBSET01/" + package.CDADocumentRoot.FileName, package.CDADocumentRoot.FileContent);

                // Add signature if present
                if (signatureContent != null)
                {
                    zip.AddEntry("IHE_XDM/SUBSET01/" + package.CDASignature.FileName, signatureContent);
                }

                if (package.CDADocumentAttachments != null)
                {
                    foreach (var file in package.CDADocumentAttachments)
                    {
                        zip.AddEntry("IHE_XDM/SUBSET01/" + file.FileName, file.FileContent);
                    }
                }

                // Save output file
                zip.Save(ms);
            }

            var zipContent = ms.ToArray();

            ms.Close();

            return(zipContent);
        }
Example #2
0
        /// <summary>
        /// Extracts a CDA package zip file and verifies the signature. An exception is thrown if verification fails.
        /// </summary>
        /// <param name="package">A byte array of a CDA package zip file.</param>
        /// <param name="verifyCertificate">An optional delegate to verify the signature certificate (NULL accepted).</param>
        /// <returns>A CDAPackage instance constructed from the CDA package zip file.</returns>
        public static CDAPackage Extract(byte[] package, VerifyCertificateDelegate verifyCertificate)
        {
            // Validation on package
            Validation.ValidateArgumentRequired("package", package);

            var newPackage = ExtractAndIgnoreSignatureVerification(package);

            if (newPackage.CDASignature != null)
            {
                VerifySignature(newPackage, verifyCertificate);
            }

            CDAPackageValidation.ValidateCDAPackage(newPackage, newPackage.SigningTime.HasValue);

            return(newPackage);
        }