Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Base / MS / Internal / IO / Packaging / CustomSignedXml.cs / 1305600 / CustomSignedXml.cs
//------------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
// Description:
// Wrapper class for existing SignedXml class that works around
// DevDiv Schedule bug: 39530 (mdownen PM)
//
// History:
// 07/08/2005: BruceMac: Initial implementation.
//
//-----------------------------------------------------------------------------
using System;
using System.Xml;
using System.Windows; // for SR
using System.Security.Cryptography.Xml;
using MS.Internal.WindowsBase;
namespace MS.Internal.IO.Packaging
{
///
/// SignedXml wrapper that supports reference targeting of internal ID's
///
/// See: http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/ for details
internal class CustomSignedXml : SignedXml
{
///
/// Returns the XmlElement that matches the given id
///
///
///
/// element if found, otherwise return null
public override XmlElement GetIdElement(XmlDocument document, string idValue)
{
// Always let the base class have a first try at finding the element
XmlElement elem = base.GetIdElement(document, idValue);
// If not found then we will try to find it ourselves
if (elem == null)
{
elem = SelectNodeByIdFromObjects(m_signature, idValue);
}
return elem;
}
///
/// Locate and return the node identified by idValue
///
///
///
/// node if found - else null
/// Tries to match each object in the Object list.
private static XmlElement SelectNodeByIdFromObjects(Signature signature, string idValue)
{
XmlElement node = null;
// enumerate the objects
foreach (DataObject dataObject in signature.ObjectList)
{
// direct reference to Object id - supported for all reference typs
if (String.CompareOrdinal(idValue, dataObject.Id) == 0)
{
// anticipate duplicate ID's and throw if any found
if (node != null)
throw new XmlException(SR.Get(SRID.DuplicateObjectId));
node = dataObject.GetXml();
}
}
// now search for XAdES specific references
if (node == null)
{
// For XAdES we implement special case where the reference may
// be to an internal tag with matching "Id" attribute.
node = SelectSubObjectNodeForXAdES(signature, idValue);
}
return node;
}
///
/// Locate any signed Object tag that matches the XAdES "target type"
///
///
///
/// element if found; null if not found
/// Special purpose code to support Sub-Object signing required by XAdES signatures
private static XmlElement SelectSubObjectNodeForXAdES(Signature signature, string idValue)
{
XmlElement node = null;
// enumerate the References to determine if any are of type XAdES
foreach (Reference reference in signature.SignedInfo.References)
{
// if we get a match by Type?
if (String.CompareOrdinal(reference.Type, _XAdESTargetType) == 0)
{
// now try to match by Uri
// strip off any preceding # mark to facilitate matching
string uri;
if ((reference.Uri.Length > 0) && (reference.Uri[0] == '#'))
uri = reference.Uri.Substring(1);
else
continue; // ignore non-local references
// if we have a XAdES type reference and the ID matches the requested one
// search all object tags for the XML with this ID
if (String.CompareOrdinal(uri, idValue) == 0)
{
node = SelectSubObjectNodeForXAdESInDataObjects(signature, idValue);
break;
}
}
}
return node;
}
///
/// Locates and selects the target XmlElement from all available Object tags
///
///
///
/// element if found; null if not found
/// relies on XPath query to search the Xml in each Object tag
private static XmlElement SelectSubObjectNodeForXAdESInDataObjects(Signature signature, string idValue)
{
XmlElement node = null;
// now find an object tag that includes an element that matches
foreach (DataObject dataObject in signature.ObjectList)
{
// skip the package object
if (String.CompareOrdinal(dataObject.Id, XTable.Get(XTable.ID.OpcAttrValue)) != 0)
{
XmlElement element = dataObject.GetXml();
// NOTE: this is executing an XPath query
XmlElement local = element.SelectSingleNode("//*[@Id='" + idValue + "']") as XmlElement;
if (local == null)
continue;
// node found?
if (local != null)
{
XmlNode temp = local;
// climb the tree towards the root until we find our namespace
while ((temp != null) && (temp.NamespaceURI.Length == 0))
temp = temp.ParentNode;
// only match if the target is in the XAdES namespace
if ((temp != null) && (String.CompareOrdinal(temp.NamespaceURI, _XAdESNameSpace) == 0))
{
node = local as XmlElement;
break;
}
}
}
}
return node;
}
private const string _XAdESNameSpace = @"http://uri.etsi.org/01903/v1.2.2#";
private const string _XAdESTargetType = _XAdESNameSpace + @"SignedProperties";
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- COMException.cs
- BlockUIContainer.cs
- CustomErrorsSection.cs
- Token.cs
- PopupEventArgs.cs
- UserNameSecurityTokenProvider.cs
- PropertyState.cs
- CacheEntry.cs
- DefaultPrintController.cs
- SafeNativeMethods.cs
- FormParameter.cs
- TableColumn.cs
- StaticExtension.cs
- WebPartHeaderCloseVerb.cs
- DocumentXPathNavigator.cs
- NativeMethods.cs
- ProbeMatchesApril2005.cs
- datacache.cs
- WMICapabilities.cs
- CharEntityEncoderFallback.cs
- BitmapMetadataBlob.cs
- StylusPointPropertyInfo.cs
- XPathQueryGenerator.cs
- HMACMD5.cs
- Vector3DAnimation.cs
- DeviceContexts.cs
- CircleEase.cs
- EditorPart.cs
- Math.cs
- TransformedBitmap.cs
- TableLayout.cs
- XmlQueryCardinality.cs
- QuestionEventArgs.cs
- AnnotationHelper.cs
- TypePropertyEditor.cs
- AccessDataSourceWizardForm.cs
- Splitter.cs
- ConfigurationValidatorBase.cs
- TrackingProfile.cs
- sqlmetadatafactory.cs
- Verify.cs
- TimelineGroup.cs
- HttpServerUtilityWrapper.cs
- MailDefinition.cs
- ObjectDataSource.cs
- ReadOnlyHierarchicalDataSource.cs
- TraceListener.cs
- TargetFrameworkAttribute.cs
- CqlIdentifiers.cs
- SystemColors.cs
- InkSerializer.cs
- QueryContinueDragEventArgs.cs
- OutputCacheSettingsSection.cs
- LambdaSerializationException.cs
- FontClient.cs
- CharacterString.cs
- AssemblyResourceLoader.cs
- ConnectionPointGlyph.cs
- DragCompletedEventArgs.cs
- XmlQualifiedName.cs
- FontDriver.cs
- EntityDataSourceWrapperCollection.cs
- CatalogZone.cs
- FixedSOMImage.cs
- NamespaceExpr.cs
- Decorator.cs
- SectionInput.cs
- DataSourceHelper.cs
- FormatStringEditor.cs
- SystemMulticastIPAddressInformation.cs
- ServiceEndpoint.cs
- OleDbException.cs
- DynamicRendererThreadManager.cs
- TypographyProperties.cs
- BinaryParser.cs
- TableParagraph.cs
- ClientSettingsProvider.cs
- RegexReplacement.cs
- RectangleF.cs
- XPathNode.cs
- FontEmbeddingManager.cs
- HttpCachePolicyElement.cs
- HitTestFilterBehavior.cs
- LinkTarget.cs
- ConfigXmlWhitespace.cs
- LineVisual.cs
- Process.cs
- ProxyAttribute.cs
- ApplicationGesture.cs
- Italic.cs
- DataGridTable.cs
- Expression.DebuggerProxy.cs
- JsonServiceDocumentSerializer.cs
- RSAPKCS1SignatureFormatter.cs
- Guid.cs
- CellCreator.cs
- _ProxyRegBlob.cs
- PackageRelationshipSelector.cs
- WebPartActionVerb.cs
- HtmlInputSubmit.cs