protected override ISignatureValueSecurityElement CreateSupportingSignature(SecurityToken token, SecurityKeyIdentifier identifier, ISecurityElement elementToSign) { string str; XmlDictionaryString str2; SecurityKey key; SecurityAlgorithmSuite algorithmSuite = base.AlgorithmSuite; algorithmSuite.GetSignatureAlgorithmAndKey(token, out str, out key, out str2); SignedXml xml = new SignedXml(ServiceModelDictionaryManager.Instance, base.StandardsManager.SecurityTokenSerializer); SignedInfo signedInfo = xml.Signature.SignedInfo; signedInfo.CanonicalizationMethod = algorithmSuite.DefaultCanonicalizationAlgorithm; signedInfo.CanonicalizationMethodDictionaryString = algorithmSuite.DefaultCanonicalizationAlgorithmDictionaryString; signedInfo.SignatureMethod = str; signedInfo.SignatureMethodDictionaryString = str2; if (elementToSign.Id == null) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(System.ServiceModel.SR.GetString("ElementToSignMustHaveId"))); } Reference reference = new Reference(ServiceModelDictionaryManager.Instance, "#" + elementToSign.Id, elementToSign) { DigestMethod = algorithmSuite.DefaultDigestAlgorithm, DigestMethodDictionaryString = algorithmSuite.DefaultDigestAlgorithmDictionaryString }; reference.AddTransform(new ExclusiveCanonicalizationTransform()); ((StandardSignedInfo) signedInfo).AddReference(reference); xml.ComputeSignature(key); if (identifier != null) { xml.Signature.KeyIdentifier = identifier; } return xml; }
private void ComputeSignature() { PreDigestedSignedInfo signedInfo = new PreDigestedSignedInfo(_dictionaryManager); signedInfo.AddEnvelopedSignatureTransform = true; signedInfo.CanonicalizationMethod = XD.ExclusiveC14NDictionary.Namespace.Value; signedInfo.SignatureMethod = _signingCreds.SignatureAlgorithm; signedInfo.DigestMethod = _signingCreds.DigestAlgorithm; signedInfo.AddReference(_referenceId, _hashStream.FlushHashAndGetValue(_preCanonicalTracingStream)); SignedXml signedXml = new SignedXml(signedInfo, _dictionaryManager, _tokenSerializer); signedXml.ComputeSignature(_signingCreds.SigningKey); signedXml.Signature.KeyIdentifier = _signingCreds.SigningKeyIdentifier; signedXml.WriteTo(base.InnerWriter); ((IDisposable)_hashStream).Dispose(); _hashStream = null; }
void ICanonicalWriterEndRootElementCallback.OnEndOfRootElement(XmlDictionaryWriter dictionaryWriter) { byte[] hashValue = this.hashStream.FlushHashAndGetValue(); PreDigestedSignedInfo signedInfo = new PreDigestedSignedInfo(this.dictionaryManager); signedInfo.AddEnvelopedSignatureTransform = true; signedInfo.CanonicalizationMethod = SecurityAlgorithms.ExclusiveC14n; signedInfo.SignatureMethod = this.signingCredentials.SignatureAlgorithm; signedInfo.DigestMethod = this.signingCredentials.DigestAlgorithm; signedInfo.AddReference(this.assertionId, hashValue); SignedXml signedXml = new SignedXml(signedInfo, this.dictionaryManager, this.keyInfoSerializer); signedXml.ComputeSignature(this.signingCredentials.SigningKey); signedXml.Signature.KeyIdentifier = this.signingCredentials.SigningKeyIdentifier; signedXml.WriteTo(dictionaryWriter); }
void ICanonicalWriterEndRootElementCallback.OnEndOfRootElement(XmlDictionaryWriter dictionaryWriter) { byte[] digest = this.hashStream.FlushHashAndGetValue(); PreDigestedSignedInfo signedInfo = new PreDigestedSignedInfo(this.dictionaryManager) { AddEnvelopedSignatureTransform = true, CanonicalizationMethod = "http://www.w3.org/2001/10/xml-exc-c14n#", SignatureMethod = this.signingCredentials.SignatureAlgorithm, DigestMethod = this.signingCredentials.DigestAlgorithm }; signedInfo.AddReference(this.assertionId, digest); SignedXml xml = new SignedXml(signedInfo, this.dictionaryManager, this.keyInfoSerializer); xml.ComputeSignature(this.signingCredentials.SigningKey); xml.Signature.KeyIdentifier = this.signingCredentials.SigningKeyIdentifier; xml.WriteTo(dictionaryWriter); }