public static OpenXmlPowerToolsDocument Insert(OpenXmlPowerToolsDocument doc, IEnumerable<string> certificateList) { using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(doc)) { using (Package package = streamDoc.GetPackage()) { foreach (string digitalCertificate in certificateList) { X509Certificate x509Certificate = X509Certificate2.CreateFromCertFile(digitalCertificate); PackageDigitalSignatureManager digitalSigntaureManager = new PackageDigitalSignatureManager(package); digitalSigntaureManager.CertificateOption = CertificateEmbeddingOption.InSignaturePart; System.Collections.Generic.List<Uri> partsToSign = new System.Collections.Generic.List<Uri>(); //Adds each part to the list, except relationships parts. foreach (PackagePart openPackagePart in package.GetParts()) { if (!PackUriHelper.IsRelationshipPartUri(openPackagePart.Uri)) partsToSign.Add(openPackagePart.Uri); } List<PackageRelationshipSelector> relationshipSelectors = new List<PackageRelationshipSelector>(); //Creates one selector for each package-level relationship, based on id foreach (PackageRelationship relationship in package.GetRelationships()) { PackageRelationshipSelector relationshipSelector = new PackageRelationshipSelector(relationship.SourceUri, PackageRelationshipSelectorType.Id, relationship.Id); relationshipSelectors.Add(relationshipSelector); } digitalSigntaureManager.Sign(partsToSign, x509Certificate, relationshipSelectors); } } return streamDoc.GetModifiedDocument(); } }
private static void AddSignableItems(PackageRelationship relationship, ICollection<Uri> partsToSign, ICollection<PackageRelationshipSelector> relationshipsToSign) { var selector = new PackageRelationshipSelector(relationship.SourceUri, PackageRelationshipSelectorType.Id, relationship.Id); relationshipsToSign.Add(selector); if (relationship.TargetMode != TargetMode.Internal) { return; } var part = relationship.Package.GetPart( PackUriHelper.ResolvePartUri( relationship.SourceUri, relationship.TargetUri)); if (partsToSign.Contains(part.Uri)) { return; } partsToSign.Add(part.Uri); foreach (var childRelationship in part.GetRelationships()) { AddSignableItems(childRelationship, partsToSign, relationshipsToSign); } }