// Decompiled with JetBrains decompiler
// Type: Microsoft.InfoCards.X509RecipientIdentity
// Assembly: infocard, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// MVID: 516D8B44-4448-4D2C-8B8E-FFBB3FFE472B
// Assembly location: C:\Users\Administrateur\Downloads\Virusshare-00000-msil\Virus.Win32.Expiro.w-69bb73081eac86b8cf86f45e33515d0095855636967076e2b593d7a30cd80a07.exe

using Microsoft.InfoCards.Diagnostics;
using System;
using System.IdentityModel.Tokens;
using System.Security.Cryptography.X509Certificates;
using System.ServiceModel;

namespace Microsoft.InfoCards
{
  internal class X509RecipientIdentity : RecipientIdentity
  {
    private X509Certificate2Collection m_certificates;
    private Recipient.RecipientCertParameters m_recipientParams;
    private bool isChainTrusted;

    public Recipient.RecipientCertParameters RecipientParams => this.m_recipientParams;

    public X509Certificate2 LeafCertificate => this.m_certificates[0];

    public X509RecipientIdentity(EndpointAddress epr, X509Certificate2Collection certificates)
      : base(epr)
    {
      this.m_certificates = certificates;
    }

    public override void Validate()
    {
      if (this.HasBeenValidated)
        return;
      this.isChainTrusted = this.ValidateCertificate();
      this.Identifier = Recipient.CertGetRecipientIdHash(this.LeafCertificate, this.m_certificates, this.isChainTrusted, out this.m_recipientParams);
      this.OrganizationIdentifier = Recipient.CertGetRecipientOrganizationIdHash(this.LeafCertificate, this.m_certificates, this.ValidateCertificate());
      this.OrganizationPPIDIdentifier = Recipient.CertGetRecipientOrganizationPPIDSeedHash(this.LeafCertificate, this.m_certificates, this.ValidateCertificate());
      this.HasBeenValidated = true;
    }

    public override string GetName()
    {
      string name = this.LeafCertificate.FriendlyName;
      if (string.IsNullOrEmpty(name))
        name = this.LeafCertificate.GetNameInfo(X509NameType.SimpleName, false);
      return name;
    }

    private bool ValidateCertificate()
    {
      bool chainTrustPassed = false;
      try
      {
        InfoCardX509Validator.ValidateChainOrPeer(this.LeafCertificate, this.m_certificates, out chainTrustPassed);
      }
      catch (SecurityTokenValidationException ex)
      {
        throw InfoCardTrace.ThrowHelperError((Exception) new IdentityValidationException(SR.GetString("RecipientCertificateNotValid"), (Exception) ex));
      }
      return chainTrustPassed;
    }
  }
}