File: System\IdentityModel\Tokens\BinaryKeyIdentifierClause.cs
Project: ndp\cdf\src\WCF\IdentityModel\System.IdentityModel.csproj (System.IdentityModel)
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//------------------------------------------------------------
 
namespace System.IdentityModel.Tokens
{
    using System.Globalization;
    using HexBinary = System.Runtime.Remoting.Metadata.W3cXsd2001.SoapHexBinary;
 
    public abstract class BinaryKeyIdentifierClause : SecurityKeyIdentifierClause
    {
        readonly byte[] identificationData;
 
        protected BinaryKeyIdentifierClause(string clauseType, byte[] identificationData, bool cloneBuffer)
            : this(clauseType, identificationData, cloneBuffer, null, 0)
        {
        }
 
        protected BinaryKeyIdentifierClause(string clauseType, byte[] identificationData, bool cloneBuffer, byte[] derivationNonce, int derivationLength)
            : base(clauseType, derivationNonce, derivationLength)
        {
            if (identificationData == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("identificationData"));
            }
            if (identificationData.Length == 0)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("identificationData", SR.GetString(SR.LengthMustBeGreaterThanZero)));
            }
 
            if (cloneBuffer)
            {
                this.identificationData = SecurityUtils.CloneBuffer(identificationData);
            }
            else
            {
                this.identificationData = identificationData;
            }
        }
 
        public byte[] GetBuffer()
        {
            return SecurityUtils.CloneBuffer(this.identificationData);
        }
 
        protected byte[] GetRawBuffer()
        {
            return this.identificationData;
        }
 
        public override bool Matches(SecurityKeyIdentifierClause keyIdentifierClause)
        {
            BinaryKeyIdentifierClause that = keyIdentifierClause as BinaryKeyIdentifierClause;
 
            // 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.identificationData));
        }
 
        public bool Matches(byte[] data)
        {
            return Matches(data, 0);
        }
 
        public bool Matches(byte[] data, int offset)
        {
            if (offset < 0)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("offset", SR.GetString(SR.ValueMustBeNonNegative)));
            }
            return SecurityUtils.MatchesBuffer(this.identificationData, 0, data, offset);
        }
 
        internal string ToBase64String()
        {
            return Convert.ToBase64String(this.identificationData);
        }
 
        internal string ToHexString()
        {
            return new HexBinary(this.identificationData).ToString();
        }
    }
}