Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WCF / IdentityModel / System / IdentityModel / PreDigestedSignedInfo.cs / 1305376 / PreDigestedSignedInfo.cs
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------
namespace System.IdentityModel
{
using System.Diagnostics;
using System.IO;
using System.Security.Cryptography;
using System.IdentityModel.Tokens;
using System.Text;
using System.Xml;
sealed class PreDigestedSignedInfo : SignedInfo
{
const int InitialReferenceArraySize = 8;
bool addEnvelopedSignatureTransform;
int count;
string digestMethod;
XmlDictionaryString digestMethodDictionaryString;
ReferenceEntry[] references;
public PreDigestedSignedInfo(DictionaryManager dictionaryManager)
: base(dictionaryManager)
{
this.references = new ReferenceEntry[InitialReferenceArraySize];
}
public PreDigestedSignedInfo(DictionaryManager dictionaryManager, string canonicalizationMethod, XmlDictionaryString canonicalizationMethodDictionaryString, string digestMethod, XmlDictionaryString digestMethodDictionaryString, string signatureMethod, XmlDictionaryString signatureMethodDictionaryString)
: base(dictionaryManager)
{
this.references = new ReferenceEntry[InitialReferenceArraySize];
this.CanonicalizationMethod = canonicalizationMethod;
this.CanonicalizationMethodDictionaryString = canonicalizationMethodDictionaryString;
this.DigestMethod = digestMethod;
this.digestMethodDictionaryString = digestMethodDictionaryString;
this.SignatureMethod = signatureMethod;
this.SignatureMethodDictionaryString = signatureMethodDictionaryString;
}
public bool AddEnvelopedSignatureTransform
{
get { return this.addEnvelopedSignatureTransform; }
set { this.addEnvelopedSignatureTransform = value; }
}
public string DigestMethod
{
get { return this.digestMethod; }
set { this.digestMethod = value; }
}
public override int ReferenceCount
{
get { return this.count; }
}
public void AddReference(string id, byte[] digest)
{
if (this.count == this.references.Length)
{
ReferenceEntry[] newReferences = new ReferenceEntry[this.references.Length * 2];
Array.Copy(this.references, 0, newReferences, 0, this.count);
this.references = newReferences;
}
this.references[this.count++].Set(id, digest);
}
protected override void ComputeHash(HashStream hashStream)
{
if (this.AddEnvelopedSignatureTransform)
{
base.ComputeHash(hashStream);
}
else
{
SignedInfoCanonicalFormWriter.Instance.WriteSignedInfoCanonicalForm(
hashStream, this.SignatureMethod, this.DigestMethod,
this.references, this.count,
this.ResourcePool.TakeEncodingBuffer(), this.ResourcePool.TakeBase64Buffer());
}
}
public override void ComputeReferenceDigests()
{
// all digests pre-computed
}
public override void ReadFrom(XmlDictionaryReader reader, TransformFactory transformFactory, DictionaryManager dictionaryManager)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException()); // sender side use only
}
public override void EnsureAllReferencesVerified()
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException()); // sender side use only
}
public override bool EnsureDigestValidityIfIdMatches(string id, object resolvedXmlSource)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException()); // sender side use only
}
public override void WriteTo(XmlDictionaryWriter writer, DictionaryManager dictionaryManager)
{
string prefix = XmlSignatureStrings.Prefix;
XmlDictionaryString ns = dictionaryManager.XmlSignatureDictionary.Namespace;
writer.WriteStartElement(prefix, dictionaryManager.XmlSignatureDictionary.SignedInfo, ns);
if (this.Id != null)
{
writer.WriteAttributeString(dictionaryManager.UtilityDictionary.IdAttribute, null, this.Id);
}
WriteCanonicalizationMethod(writer, dictionaryManager);
WriteSignatureMethod(writer, dictionaryManager);
for (int i = 0; i < this.count; i++)
{
writer.WriteStartElement(prefix, dictionaryManager.XmlSignatureDictionary.Reference, ns);
writer.WriteStartAttribute(dictionaryManager.XmlSignatureDictionary.URI, null);
writer.WriteString("#");
writer.WriteString(this.references[i].id);
writer.WriteEndAttribute();
writer.WriteStartElement(prefix, dictionaryManager.XmlSignatureDictionary.Transforms, ns);
if (this.addEnvelopedSignatureTransform)
{
writer.WriteStartElement(prefix, dictionaryManager.XmlSignatureDictionary.Transform, ns);
writer.WriteStartAttribute(dictionaryManager.XmlSignatureDictionary.Algorithm, null);
writer.WriteString(dictionaryManager.XmlSignatureDictionary.EnvelopedSignature);
writer.WriteEndAttribute();
writer.WriteEndElement(); // Transform
}
writer.WriteStartElement(prefix, dictionaryManager.XmlSignatureDictionary.Transform, ns);
writer.WriteStartAttribute(dictionaryManager.XmlSignatureDictionary.Algorithm, null);
writer.WriteString(dictionaryManager.SecurityAlgorithmDictionary.ExclusiveC14n);
writer.WriteEndAttribute();
writer.WriteEndElement(); // Transform
writer.WriteEndElement(); // Transforms
writer.WriteStartElement(prefix, dictionaryManager.XmlSignatureDictionary.DigestMethod, ns);
writer.WriteStartAttribute(dictionaryManager.XmlSignatureDictionary.Algorithm, null);
if (this.digestMethodDictionaryString != null)
{
writer.WriteString(this.digestMethodDictionaryString);
}
else
{
writer.WriteString(this.digestMethod);
}
writer.WriteEndAttribute();
writer.WriteEndElement(); // DigestMethod
byte[] digest = this.references[i].digest;
writer.WriteStartElement(prefix, dictionaryManager.XmlSignatureDictionary.DigestValue, ns);
writer.WriteBase64(digest, 0, digest.Length);
writer.WriteEndElement(); // DigestValue
writer.WriteEndElement(); // Reference
}
writer.WriteEndElement(); // SignedInfo
}
struct ReferenceEntry
{
internal string id;
internal byte[] digest;
public void Set(string id, byte[] digest)
{
this.id = id;
this.digest = digest;
}
}
sealed class SignedInfoCanonicalFormWriter : CanonicalFormWriter
{
const string xml1 = " ";
const string xml3 = "";
const string xml6 = " ";
const string xml7 = " ";
readonly byte[] fragment1;
readonly byte[] fragment2;
readonly byte[] fragment3;
readonly byte[] fragment4;
readonly byte[] fragment5;
readonly byte[] fragment6;
readonly byte[] fragment7;
readonly byte[] sha1Digest;
readonly byte[] sha256Digest;
readonly byte[] hmacSha1Signature;
readonly byte[] rsaSha1Signature;
static readonly SignedInfoCanonicalFormWriter instance = new SignedInfoCanonicalFormWriter();
SignedInfoCanonicalFormWriter()
{
UTF8Encoding encoding = CanonicalFormWriter.Utf8WithoutPreamble;
this.fragment1 = encoding.GetBytes(xml1);
this.fragment2 = encoding.GetBytes(xml2);
this.fragment3 = encoding.GetBytes(xml3);
this.fragment4 = encoding.GetBytes(xml4);
this.fragment5 = encoding.GetBytes(xml5);
this.fragment6 = encoding.GetBytes(xml6);
this.fragment7 = encoding.GetBytes(xml7);
this.sha1Digest = encoding.GetBytes(SecurityAlgorithms.Sha1Digest);
this.sha256Digest = encoding.GetBytes(SecurityAlgorithms.Sha256Digest);
this.hmacSha1Signature = encoding.GetBytes(SecurityAlgorithms.HmacSha1Signature);
this.rsaSha1Signature = encoding.GetBytes(SecurityAlgorithms.RsaSha1Signature);
}
public static SignedInfoCanonicalFormWriter Instance
{
get { return instance; }
}
byte[] EncodeDigestAlgorithm(string algorithm)
{
if (algorithm == SecurityAlgorithms.Sha1Digest)
{
return this.sha1Digest;
}
else if (algorithm == SecurityAlgorithms.Sha256Digest)
{
return this.sha256Digest;
}
else
{
return CanonicalFormWriter.Utf8WithoutPreamble.GetBytes(algorithm);
}
}
byte[] EncodeSignatureAlgorithm(string algorithm)
{
if (algorithm == SecurityAlgorithms.HmacSha1Signature)
{
return this.hmacSha1Signature;
}
else if (algorithm == SecurityAlgorithms.RsaSha1Signature)
{
return this.rsaSha1Signature;
}
else
{
return CanonicalFormWriter.Utf8WithoutPreamble.GetBytes(algorithm);
}
}
public void WriteSignedInfoCanonicalForm(
Stream stream, string signatureMethod, string digestMethod,
ReferenceEntry[] references, int referenceCount,
byte[] workBuffer, char[] base64WorkBuffer)
{
DiagnosticUtility.DebugAssert(XmlSignatureStrings.Prefix.Length == 0, "Update SignedInfoCanonicalFormWriter to match new XmlDSig prefix");
stream.Write(this.fragment1, 0, this.fragment1.Length);
byte[] signatureMethodBytes = EncodeSignatureAlgorithm(signatureMethod);
stream.Write(signatureMethodBytes, 0, signatureMethodBytes.Length);
stream.Write(this.fragment2, 0, this.fragment2.Length);
byte[] digestMethodBytes = EncodeDigestAlgorithm(digestMethod);
for (int i = 0; i < referenceCount; i++)
{
stream.Write(this.fragment3, 0, this.fragment3.Length);
EncodeAndWrite(stream, workBuffer, references[i].id);
stream.Write(this.fragment4, 0, this.fragment4.Length);
stream.Write(digestMethodBytes, 0, digestMethodBytes.Length);
stream.Write(this.fragment5, 0, this.fragment5.Length);
Base64EncodeAndWrite(stream, workBuffer, base64WorkBuffer, references[i].digest);
stream.Write(this.fragment6, 0, this.fragment6.Length);
}
stream.Write(this.fragment7, 0, this.fragment7.Length);
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------
namespace System.IdentityModel
{
using System.Diagnostics;
using System.IO;
using System.Security.Cryptography;
using System.IdentityModel.Tokens;
using System.Text;
using System.Xml;
sealed class PreDigestedSignedInfo : SignedInfo
{
const int InitialReferenceArraySize = 8;
bool addEnvelopedSignatureTransform;
int count;
string digestMethod;
XmlDictionaryString digestMethodDictionaryString;
ReferenceEntry[] references;
public PreDigestedSignedInfo(DictionaryManager dictionaryManager)
: base(dictionaryManager)
{
this.references = new ReferenceEntry[InitialReferenceArraySize];
}
public PreDigestedSignedInfo(DictionaryManager dictionaryManager, string canonicalizationMethod, XmlDictionaryString canonicalizationMethodDictionaryString, string digestMethod, XmlDictionaryString digestMethodDictionaryString, string signatureMethod, XmlDictionaryString signatureMethodDictionaryString)
: base(dictionaryManager)
{
this.references = new ReferenceEntry[InitialReferenceArraySize];
this.CanonicalizationMethod = canonicalizationMethod;
this.CanonicalizationMethodDictionaryString = canonicalizationMethodDictionaryString;
this.DigestMethod = digestMethod;
this.digestMethodDictionaryString = digestMethodDictionaryString;
this.SignatureMethod = signatureMethod;
this.SignatureMethodDictionaryString = signatureMethodDictionaryString;
}
public bool AddEnvelopedSignatureTransform
{
get { return this.addEnvelopedSignatureTransform; }
set { this.addEnvelopedSignatureTransform = value; }
}
public string DigestMethod
{
get { return this.digestMethod; }
set { this.digestMethod = value; }
}
public override int ReferenceCount
{
get { return this.count; }
}
public void AddReference(string id, byte[] digest)
{
if (this.count == this.references.Length)
{
ReferenceEntry[] newReferences = new ReferenceEntry[this.references.Length * 2];
Array.Copy(this.references, 0, newReferences, 0, this.count);
this.references = newReferences;
}
this.references[this.count++].Set(id, digest);
}
protected override void ComputeHash(HashStream hashStream)
{
if (this.AddEnvelopedSignatureTransform)
{
base.ComputeHash(hashStream);
}
else
{
SignedInfoCanonicalFormWriter.Instance.WriteSignedInfoCanonicalForm(
hashStream, this.SignatureMethod, this.DigestMethod,
this.references, this.count,
this.ResourcePool.TakeEncodingBuffer(), this.ResourcePool.TakeBase64Buffer());
}
}
public override void ComputeReferenceDigests()
{
// all digests pre-computed
}
public override void ReadFrom(XmlDictionaryReader reader, TransformFactory transformFactory, DictionaryManager dictionaryManager)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException()); // sender side use only
}
public override void EnsureAllReferencesVerified()
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException()); // sender side use only
}
public override bool EnsureDigestValidityIfIdMatches(string id, object resolvedXmlSource)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException()); // sender side use only
}
public override void WriteTo(XmlDictionaryWriter writer, DictionaryManager dictionaryManager)
{
string prefix = XmlSignatureStrings.Prefix;
XmlDictionaryString ns = dictionaryManager.XmlSignatureDictionary.Namespace;
writer.WriteStartElement(prefix, dictionaryManager.XmlSignatureDictionary.SignedInfo, ns);
if (this.Id != null)
{
writer.WriteAttributeString(dictionaryManager.UtilityDictionary.IdAttribute, null, this.Id);
}
WriteCanonicalizationMethod(writer, dictionaryManager);
WriteSignatureMethod(writer, dictionaryManager);
for (int i = 0; i < this.count; i++)
{
writer.WriteStartElement(prefix, dictionaryManager.XmlSignatureDictionary.Reference, ns);
writer.WriteStartAttribute(dictionaryManager.XmlSignatureDictionary.URI, null);
writer.WriteString("#");
writer.WriteString(this.references[i].id);
writer.WriteEndAttribute();
writer.WriteStartElement(prefix, dictionaryManager.XmlSignatureDictionary.Transforms, ns);
if (this.addEnvelopedSignatureTransform)
{
writer.WriteStartElement(prefix, dictionaryManager.XmlSignatureDictionary.Transform, ns);
writer.WriteStartAttribute(dictionaryManager.XmlSignatureDictionary.Algorithm, null);
writer.WriteString(dictionaryManager.XmlSignatureDictionary.EnvelopedSignature);
writer.WriteEndAttribute();
writer.WriteEndElement(); // Transform
}
writer.WriteStartElement(prefix, dictionaryManager.XmlSignatureDictionary.Transform, ns);
writer.WriteStartAttribute(dictionaryManager.XmlSignatureDictionary.Algorithm, null);
writer.WriteString(dictionaryManager.SecurityAlgorithmDictionary.ExclusiveC14n);
writer.WriteEndAttribute();
writer.WriteEndElement(); // Transform
writer.WriteEndElement(); // Transforms
writer.WriteStartElement(prefix, dictionaryManager.XmlSignatureDictionary.DigestMethod, ns);
writer.WriteStartAttribute(dictionaryManager.XmlSignatureDictionary.Algorithm, null);
if (this.digestMethodDictionaryString != null)
{
writer.WriteString(this.digestMethodDictionaryString);
}
else
{
writer.WriteString(this.digestMethod);
}
writer.WriteEndAttribute();
writer.WriteEndElement(); // DigestMethod
byte[] digest = this.references[i].digest;
writer.WriteStartElement(prefix, dictionaryManager.XmlSignatureDictionary.DigestValue, ns);
writer.WriteBase64(digest, 0, digest.Length);
writer.WriteEndElement(); // DigestValue
writer.WriteEndElement(); // Reference
}
writer.WriteEndElement(); // SignedInfo
}
struct ReferenceEntry
{
internal string id;
internal byte[] digest;
public void Set(string id, byte[] digest)
{
this.id = id;
this.digest = digest;
}
}
sealed class SignedInfoCanonicalFormWriter : CanonicalFormWriter
{
const string xml1 = " ";
const string xml3 = "";
const string xml6 = " ";
const string xml7 = " ";
readonly byte[] fragment1;
readonly byte[] fragment2;
readonly byte[] fragment3;
readonly byte[] fragment4;
readonly byte[] fragment5;
readonly byte[] fragment6;
readonly byte[] fragment7;
readonly byte[] sha1Digest;
readonly byte[] sha256Digest;
readonly byte[] hmacSha1Signature;
readonly byte[] rsaSha1Signature;
static readonly SignedInfoCanonicalFormWriter instance = new SignedInfoCanonicalFormWriter();
SignedInfoCanonicalFormWriter()
{
UTF8Encoding encoding = CanonicalFormWriter.Utf8WithoutPreamble;
this.fragment1 = encoding.GetBytes(xml1);
this.fragment2 = encoding.GetBytes(xml2);
this.fragment3 = encoding.GetBytes(xml3);
this.fragment4 = encoding.GetBytes(xml4);
this.fragment5 = encoding.GetBytes(xml5);
this.fragment6 = encoding.GetBytes(xml6);
this.fragment7 = encoding.GetBytes(xml7);
this.sha1Digest = encoding.GetBytes(SecurityAlgorithms.Sha1Digest);
this.sha256Digest = encoding.GetBytes(SecurityAlgorithms.Sha256Digest);
this.hmacSha1Signature = encoding.GetBytes(SecurityAlgorithms.HmacSha1Signature);
this.rsaSha1Signature = encoding.GetBytes(SecurityAlgorithms.RsaSha1Signature);
}
public static SignedInfoCanonicalFormWriter Instance
{
get { return instance; }
}
byte[] EncodeDigestAlgorithm(string algorithm)
{
if (algorithm == SecurityAlgorithms.Sha1Digest)
{
return this.sha1Digest;
}
else if (algorithm == SecurityAlgorithms.Sha256Digest)
{
return this.sha256Digest;
}
else
{
return CanonicalFormWriter.Utf8WithoutPreamble.GetBytes(algorithm);
}
}
byte[] EncodeSignatureAlgorithm(string algorithm)
{
if (algorithm == SecurityAlgorithms.HmacSha1Signature)
{
return this.hmacSha1Signature;
}
else if (algorithm == SecurityAlgorithms.RsaSha1Signature)
{
return this.rsaSha1Signature;
}
else
{
return CanonicalFormWriter.Utf8WithoutPreamble.GetBytes(algorithm);
}
}
public void WriteSignedInfoCanonicalForm(
Stream stream, string signatureMethod, string digestMethod,
ReferenceEntry[] references, int referenceCount,
byte[] workBuffer, char[] base64WorkBuffer)
{
DiagnosticUtility.DebugAssert(XmlSignatureStrings.Prefix.Length == 0, "Update SignedInfoCanonicalFormWriter to match new XmlDSig prefix");
stream.Write(this.fragment1, 0, this.fragment1.Length);
byte[] signatureMethodBytes = EncodeSignatureAlgorithm(signatureMethod);
stream.Write(signatureMethodBytes, 0, signatureMethodBytes.Length);
stream.Write(this.fragment2, 0, this.fragment2.Length);
byte[] digestMethodBytes = EncodeDigestAlgorithm(digestMethod);
for (int i = 0; i < referenceCount; i++)
{
stream.Write(this.fragment3, 0, this.fragment3.Length);
EncodeAndWrite(stream, workBuffer, references[i].id);
stream.Write(this.fragment4, 0, this.fragment4.Length);
stream.Write(digestMethodBytes, 0, digestMethodBytes.Length);
stream.Write(this.fragment5, 0, this.fragment5.Length);
Base64EncodeAndWrite(stream, workBuffer, base64WorkBuffer, references[i].digest);
stream.Write(this.fragment6, 0, this.fragment6.Length);
}
stream.Write(this.fragment7, 0, this.fragment7.Length);
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- OdbcHandle.cs
- ClientUtils.cs
- Point4D.cs
- HierarchicalDataBoundControlAdapter.cs
- ImageInfo.cs
- DataGridColumnReorderingEventArgs.cs
- PostBackOptions.cs
- FamilyMapCollection.cs
- PageThemeBuildProvider.cs
- GridViewDeletedEventArgs.cs
- Hashtable.cs
- BuildResultCache.cs
- RepeaterItemCollection.cs
- UriParserTemplates.cs
- RSACryptoServiceProvider.cs
- ProfileEventArgs.cs
- ObjectPropertyMapping.cs
- CompModSwitches.cs
- Model3DGroup.cs
- TokenBasedSet.cs
- DomNameTable.cs
- Expander.cs
- CacheOutputQuery.cs
- PropertyChangeTracker.cs
- ListBox.cs
- TemplateControlCodeDomTreeGenerator.cs
- Track.cs
- CodeCastExpression.cs
- COM2IDispatchConverter.cs
- InternalConfigEventArgs.cs
- SignatureHelper.cs
- RepeaterItem.cs
- ObjectSet.cs
- AmbientLight.cs
- _ListenerAsyncResult.cs
- FamilyTypeface.cs
- XamlParser.cs
- UnsignedPublishLicense.cs
- XmlWriter.cs
- Query.cs
- PriorityBinding.cs
- PropertyEntry.cs
- Parameter.cs
- DataGridColumnEventArgs.cs
- BamlVersionHeader.cs
- PersistenceIOParticipant.cs
- ZoneLinkButton.cs
- Semaphore.cs
- _ListenerAsyncResult.cs
- ExecutionEngineException.cs
- httpserverutility.cs
- MDIClient.cs
- SafeBitVector32.cs
- CatalogZoneBase.cs
- FlowLayoutPanelDesigner.cs
- CachedFontFace.cs
- XmlSchemaObject.cs
- ElementAction.cs
- XhtmlBasicSelectionListAdapter.cs
- ObjectManager.cs
- DbConnectionPoolCounters.cs
- ClusterSafeNativeMethods.cs
- EqualityComparer.cs
- WriteableBitmap.cs
- ToolStripPanel.cs
- PropertyGrid.cs
- SqlProviderManifest.cs
- Effect.cs
- TextTreeFixupNode.cs
- Misc.cs
- ClassGenerator.cs
- ProtocolViolationException.cs
- ObjectItemAttributeAssemblyLoader.cs
- TransformerTypeCollection.cs
- CriticalFinalizerObject.cs
- RuleSettings.cs
- LogicalTreeHelper.cs
- Popup.cs
- CompiledRegexRunnerFactory.cs
- WebPartTransformerCollection.cs
- TypeUtil.cs
- ProgressBarBrushConverter.cs
- HideDisabledControlAdapter.cs
- FlatButtonAppearance.cs
- MemoryMappedView.cs
- DoubleLinkList.cs
- SqlDataSource.cs
- ItemCollection.cs
- PermissionSetEnumerator.cs
- ElementUtil.cs
- FrameworkContentElement.cs
- Property.cs
- DbProviderManifest.cs
- StringConcat.cs
- XmlDataSourceNodeDescriptor.cs
- Validator.cs
- SchemaImporter.cs
- CheckedListBox.cs
- RSACryptoServiceProvider.cs
- DataGridViewRowCollection.cs