// Token: 0x06006CC1 RID: 27841 RVA: 0x001F4B68 File Offset: 0x001F2D68
        private string GetPartExtension(Uri partUri)
        {
            Invariant.Assert(partUri != null);
            string stringForPartUri = PackUriHelper.GetStringForPartUri(partUri);
            string extension        = Path.GetExtension(stringForPartUri);

            if (extension == string.Empty)
            {
                return(null);
            }
            return(extension);
        }
        // Return uri's extension or null if no extension.
        private string GetPartExtension(Uri partUri)
        {
            // partUri is the part's path as exposed by its part uri, so it cannot be null.
            Invariant.Assert(partUri != null);

            string path      = PackUriHelper.GetStringForPartUri(partUri);
            string extension = Path.GetExtension(path);

            if (extension == string.Empty)
            {
                return(null);
            }

            return(extension);
        }
        private static XmlNode GeneratePartSigningReference(
            PackageDigitalSignatureManager manager,
            XmlDocument xDoc,
            HashAlgorithm hashAlgorithm,
            Uri partName)
        {
            PackagePart part = manager.Package.GetPart(partName);

            // <Reference>
            XmlElement reference = xDoc.CreateElement(XTable.Get(XTable.ID.ReferenceTagName), SignedXml.XmlDsigNamespaceUrl);

            // add Uri with content type as Query
            XmlAttribute uriAttr = xDoc.CreateAttribute(XTable.Get(XTable.ID.UriAttrName));

            uriAttr.Value = PackUriHelper.GetStringForPartUri(partName) + _contentTypeQueryStringPrefix + part.ContentType;
            reference.Attributes.Append(uriAttr);

            // add transforms tag if necessary
            String transformName = String.Empty;

            if (manager.TransformMapping.ContainsKey(part.ContentType))
            {
                transformName = manager.TransformMapping[part.ContentType];

                // <Transforms>
                XmlElement transforms = xDoc.CreateElement(XTable.Get(XTable.ID.TransformsTagName), SignedXml.XmlDsigNamespaceUrl);

                // <Transform>
                XmlElement   transform     = xDoc.CreateElement(XTable.Get(XTable.ID.TransformTagName), SignedXml.XmlDsigNamespaceUrl);
                XmlAttribute algorithmAttr = xDoc.CreateAttribute(XTable.Get(XTable.ID.AlgorithmAttrName));
                algorithmAttr.Value = transformName;
                transform.Attributes.Append(algorithmAttr);

                transforms.AppendChild(transform);
                reference.AppendChild(transforms);
            }

            // <DigestMethod>
            reference.AppendChild(GenerateDigestMethod(manager, xDoc));

            // <DigestValue>
            using (Stream s = part.GetStream(FileMode.Open, FileAccess.Read))
            {
                reference.AppendChild(GenerateDigestValueNode(xDoc, hashAlgorithm, s, transformName));
            }

            return(reference);
        }
        /// <summary>
        /// Generates a Reference tag that contains a Relationship transform
        /// </summary>
        /// <param name="manager">manager</param>
        /// <param name="relationshipPartName">name of the relationship part</param>
        /// <param name="xDoc">current xml document</param>
        /// <param name="hashAlgorithm">hash algorithm = digest method</param>
        /// <param name="relationshipSelectors">relationshipSelectors that represent the relationships to sign </param>
        /// <remarks>ContentType is known and part name can be derived from the relationship collection</remarks>
        private static XmlNode GenerateRelationshipSigningReference(
            PackageDigitalSignatureManager manager,
            XmlDocument xDoc,
            HashAlgorithm hashAlgorithm,
            Uri relationshipPartName,
            IEnumerable <PackageRelationshipSelector> relationshipSelectors)
        {
            string relPartContentType = PackagingUtilities.RelationshipPartContentType.ToString();

            // <Reference>
            XmlElement reference = xDoc.CreateElement(XTable.Get(XTable.ID.ReferenceTagName), SignedXml.XmlDsigNamespaceUrl);

            // add Uri
            // persist the Uri of the associated Relationship part
            String relationshipPartString;

            if (PackUriHelper.ComparePartUri(relationshipPartName, PackageRelationship.ContainerRelationshipPartName) == 0)
            {
                relationshipPartString = PackageRelationship.ContainerRelationshipPartName.ToString();
            }
            else
            {
                relationshipPartString = PackUriHelper.GetStringForPartUri(relationshipPartName);
            }

            XmlAttribute uriAttr = xDoc.CreateAttribute(XTable.Get(XTable.ID.UriAttrName));

            uriAttr.Value = relationshipPartString + _contentTypeQueryStringPrefix + relPartContentType;
            reference.Attributes.Append(uriAttr);

            // add transforms tag (always necessary)

            // <Transforms>
            XmlElement transforms = xDoc.CreateElement(XTable.Get(XTable.ID.TransformsTagName), SignedXml.XmlDsigNamespaceUrl);

            // add Relationship transform
            String opcNamespace       = XTable.Get(XTable.ID.OpcSignatureNamespace);
            String opcNamespacePrefix = XTable.Get(XTable.ID.OpcSignatureNamespacePrefix);

            XmlElement   transform     = xDoc.CreateElement(XTable.Get(XTable.ID.TransformTagName), SignedXml.XmlDsigNamespaceUrl);
            XmlAttribute algorithmAttr = xDoc.CreateAttribute(XTable.Get(XTable.ID.AlgorithmAttrName));

            algorithmAttr.Value = XTable.Get(XTable.ID.RelationshipsTransformName);
            transform.Attributes.Append(algorithmAttr);

            // <RelationshipReference SourceId="abc" /> or
            // <RelationshipGroupReference SourceType="xyz" />
            foreach (PackageRelationshipSelector relationshipSelector in relationshipSelectors)
            {
                switch (relationshipSelector.SelectorType)
                {
                case PackageRelationshipSelectorType.Id:
                {
                    XmlNode      relationshipNode = xDoc.CreateElement(opcNamespacePrefix, XTable.Get(XTable.ID.RelationshipReferenceTagName), opcNamespace);
                    XmlAttribute idAttr           = xDoc.CreateAttribute(XTable.Get(XTable.ID.SourceIdAttrName));
                    idAttr.Value = relationshipSelector.SelectionCriteria;
                    relationshipNode.Attributes.Append(idAttr);
                    transform.AppendChild(relationshipNode);
                }
                break;

                case PackageRelationshipSelectorType.Type:
                {
                    XmlNode      relationshipNode = xDoc.CreateElement(opcNamespacePrefix, XTable.Get(XTable.ID.RelationshipsGroupReferenceTagName), opcNamespace);
                    XmlAttribute typeAttr         = xDoc.CreateAttribute(XTable.Get(XTable.ID.SourceTypeAttrName));
                    typeAttr.Value = relationshipSelector.SelectionCriteria;
                    relationshipNode.Attributes.Append(typeAttr);
                    transform.AppendChild(relationshipNode);
                }
                break;

                default:
                    Invariant.Assert(false, "This option should never be executed");
                    break;
                }
            }

            transforms.AppendChild(transform);

            // add non-Relationship transform (if any)
            String transformName = null;

            if (manager.TransformMapping.ContainsKey(relPartContentType))
            {
                transformName = manager.TransformMapping[relPartContentType];       // let them override

                //Currently we only support two transforms and so we validate whether its
                //one of those
                if (transformName == null ||
                    transformName.Length == 0 ||
                    !XmlDigitalSignatureProcessor.IsValidXmlCanonicalizationTransform(transformName))
                {
                    throw new InvalidOperationException(SR.Get(SRID.UnsupportedTransformAlgorithm));
                }

                // <Transform>
                transform           = xDoc.CreateElement(XTable.Get(XTable.ID.TransformTagName), SignedXml.XmlDsigNamespaceUrl);
                algorithmAttr       = xDoc.CreateAttribute(XTable.Get(XTable.ID.AlgorithmAttrName));
                algorithmAttr.Value = transformName;
                transform.Attributes.Append(algorithmAttr);

                transforms.AppendChild(transform);
            }
            reference.AppendChild(transforms);

            // <DigestMethod>
            reference.AppendChild(GenerateDigestMethod(manager, xDoc));

            // <DigestValue> - digest the virtual node list made from these Relationship tags
            using (Stream s = XmlDigitalSignatureProcessor.GenerateRelationshipNodeStream(GetRelationships(manager, relationshipSelectors)))    // serialized node list
            {
                reference.AppendChild(GenerateDigestValueNode(xDoc, hashAlgorithm, s, transformName));
            }

            return(reference);
        }
Exemplo n.º 5
0
 //------------------------------------------------------
 //
 //  Constructors
 //
 //------------------------------------------------------
 /// <summary>
 /// Build a System.IO.Stream on a part that possibly consists of multiple files
 /// An InterleavedZipPartStream gets created by ZipPackagePart.GetStreamCore when the part
 /// is interleaved. It wraps one or more Zip streams (one per piece).
 /// (pieces).
 /// </summary>
 /// <param name="mode">Mode (create, etc.) in which piece streams should be opened</param>
 /// <param name="access">Access (read, write, etc.) with which piece streams should be opened</param>
 /// <param name="owningPart">
 /// The part to build a stream on. It contains all ZipFileInfo descriptors for the part's pieces
 /// (see ZipPackage.GetPartsCore).
 /// </param>
 internal InterleavedZipPartStream(ZipPackagePart owningPart, FileMode mode, FileAccess access)
     : this(PackUriHelper.GetStringForPartUri(owningPart.Uri),
            owningPart.PieceDescriptors,
            mode, access)
 {
 }