/// <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); }
/// <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); }