1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------
namespace System.IdentityModel.Tokens
{
using System.Globalization;
using System.Security.Cryptography;
using System.Xml;
public class RsaKeyIdentifierClause : SecurityKeyIdentifierClause
{
static string clauseType = XmlSignatureStrings.Namespace + XmlSignatureStrings.RsaKeyValue;
readonly RSA rsa;
readonly RSAParameters rsaParameters;
RsaSecurityKey rsaSecurityKey;
public RsaKeyIdentifierClause(RSA rsa)
: base(clauseType)
{
if (rsa == null)
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("rsa");
this.rsa = rsa;
this.rsaParameters = rsa.ExportParameters(false);
}
public override bool CanCreateKey
{
get { return true; }
}
public RSA Rsa
{
get { return this.rsa; }
}
public override SecurityKey CreateKey()
{
if (this.rsaSecurityKey == null)
{
this.rsaSecurityKey = new RsaSecurityKey(this.rsa);
}
return this.rsaSecurityKey;
}
public byte[] GetExponent()
{
return SecurityUtils.CloneBuffer(this.rsaParameters.Exponent);
}
public byte[] GetModulus()
{
return SecurityUtils.CloneBuffer(this.rsaParameters.Modulus);
}
public override bool Matches(SecurityKeyIdentifierClause keyIdentifierClause)
{
RsaKeyIdentifierClause that = keyIdentifierClause as RsaKeyIdentifierClause;
// PreSharp Bug: Parameter 'that' to this public method must be validated: A null-dereference can occur here.
#pragma warning suppress 56506
return ReferenceEquals(this, that) || (that != null && that.Matches(this.rsa));
}
public bool Matches(RSA rsa)
{
if (rsa == null)
return false;
RSAParameters rsaParameters = rsa.ExportParameters(false);
return SecurityUtils.MatchesBuffer(this.rsaParameters.Modulus, rsaParameters.Modulus) &&
SecurityUtils.MatchesBuffer(this.rsaParameters.Exponent, rsaParameters.Exponent);
}
public override string ToString()
{
return string.Format(CultureInfo.InvariantCulture, "RsaKeyIdentifierClause(Modulus = {0}, Exponent = {1})",
Convert.ToBase64String(this.rsaParameters.Modulus),
Convert.ToBase64String(this.rsaParameters.Exponent));
}
public void WriteExponentAsBase64(XmlWriter writer)
{
if (writer == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("writer");
}
writer.WriteBase64(this.rsaParameters.Exponent, 0, this.rsaParameters.Exponent.Length);
}
public void WriteModulusAsBase64(XmlWriter writer)
{
if (writer == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("writer");
}
writer.WriteBase64(this.rsaParameters.Modulus, 0, this.rsaParameters.Modulus.Length);
}
}
}
|