< Summary - CoreWCF Coverage — PR #1766

Information
Class: CoreWCF.IdentityModel.X509Util
Assembly: CoreWCF.Primitives
File(s): /home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/IdentityModel/X509Util.cs
Line coverage
1%
Covered lines: 1
Uncovered lines: 58
Coverable lines: 59
Total lines: 179
Line coverage: 1.6%
Branch coverage
0%
Covered branches: 0
Total branches: 32
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
CreateCertificateValidator(...)100%11100%
GetCertificateId(...)0%440%
GetCertificateIssuerName(...)0%880%
GetClaimsFromCertificate(...)0%20200%

File(s)

/home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/IdentityModel/X509Util.cs

#LineLine coverage
 1// Licensed to the .NET Foundation under one or more agreements.
 2// The .NET Foundation licenses this file to you under the MIT license.
 3
 4using System;
 5using System.Collections.Generic;
 6using System.Collections.ObjectModel;
 7using System.Security.Claims;
 8using System.Security.Cryptography;
 9using System.Security.Cryptography.X509Certificates;
 10using CoreWCF.IdentityModel.Selectors;
 11using CoreWCF.IdentityModel.Tokens;
 12using CoreWCF.Security;
 13using Claim = System.Security.Claims.Claim;
 14
 15namespace CoreWCF.IdentityModel
 16{
 17    internal static class X509Util
 18    {
 19        /// <summary>
 20        /// Creates an X509CertificateValidator using the given parameters.
 21        /// </summary>
 22        /// <param name="certificateValidationMode">The certificate validation mode to use.</param>
 23        /// <param name="revocationMode">The revocation mode to use.</param>
 24        /// <param name="trustedStoreLocation">The store to use.</param>
 25        /// <returns>The X509CertificateValidator.</returns>
 26        /// <remarks>Due to a WCF bug, X509CertificateValidatorEx must be used rather than WCF's validators directly</re
 27        internal static X509CertificateValidator CreateCertificateValidator(
 28            X509CertificateValidationMode certificateValidationMode,
 29            X509RevocationMode revocationMode,
 30            StoreLocation trustedStoreLocation)
 31        {
 232            return new X509CertificateValidatorEx(certificateValidationMode, revocationMode, trustedStoreLocation);
 33        }
 34
 35        internal static string GetCertificateId(X509Certificate2 certificate)
 36        {
 037            if (certificate == null)
 38            {
 039                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(certificate));
 40            }
 41
 042            string certificateId = certificate.SubjectName.Name;
 043            if (string.IsNullOrEmpty(certificateId))
 44            {
 045                certificateId = certificate.Thumbprint;
 46            }
 47
 048            return certificateId;
 49        }
 50
 51        internal static string GetCertificateIssuerName(X509Certificate2 certificate, IssuerNameRegistry issuerNameRegis
 52        {
 053            if (certificate == null)
 54            {
 055                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(certificate));
 56            }
 57
 058            if (issuerNameRegistry == null)
 59            {
 060                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(issuerNameRegistry));
 61            }
 62
 063            X509Chain chain = new X509Chain();
 064            chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
 065            chain.Build(certificate);
 066            X509ChainElementCollection elements = chain.ChainElements;
 67
 068            string issuer = null;
 069            if (elements.Count > 1)
 70            {
 071                using (X509SecurityToken token = new X509SecurityToken(elements[1].Certificate))
 72                {
 073                    issuer = issuerNameRegistry.GetIssuerName(token);
 074                }
 75            }
 76            else
 77            {
 78                // This is a self-issued certificate. Use the thumbprint of the current certificate.
 079                using (X509SecurityToken token = new X509SecurityToken(certificate))
 80                {
 081                    issuer = issuerNameRegistry.GetIssuerName(token);
 082                }
 83            }
 84
 085            for (int i = 1; i < elements.Count; ++i)
 86            {
 87                // Resets the state of the certificate and frees resources associated with it.
 088                elements[i].Certificate.Reset();
 89            }
 90
 091            return issuer;
 92        }
 93
 94        public static IEnumerable<Claim> GetClaimsFromCertificate(X509Certificate2 certificate, string issuer)
 95        {
 096            if (certificate == null)
 97            {
 098                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(certificate));
 99            }
 100
 0101            ICollection<Claim> claimsCollection = new Collection<Claim>();
 102
 0103            string thumbprint = Convert.ToBase64String(certificate.GetCertHash());
 0104            claimsCollection.Add(new Claim(ClaimTypes.Thumbprint, thumbprint, ClaimValueTypes.Base64Binary, issuer));
 105
 0106            string value = certificate.SubjectName.Name;
 0107            if (!string.IsNullOrEmpty(value))
 108            {
 0109                claimsCollection.Add(new Claim(ClaimTypes.X500DistinguishedName, value, ClaimValueTypes.String, issuer))
 110            }
 111
 0112            value = certificate.GetNameInfo(X509NameType.DnsName, false);
 0113            if (!string.IsNullOrEmpty(value))
 114            {
 0115                claimsCollection.Add(new Claim(ClaimTypes.Dns, value, ClaimValueTypes.String, issuer));
 116            }
 117
 0118            value = certificate.GetNameInfo(X509NameType.SimpleName, false);
 0119            if (!string.IsNullOrEmpty(value))
 120            {
 0121                claimsCollection.Add(new Claim(ClaimTypes.Name, value, ClaimValueTypes.String, issuer));
 122            }
 123
 0124            value = certificate.GetNameInfo(X509NameType.EmailName, false);
 0125            if (!string.IsNullOrEmpty(value))
 126            {
 0127                claimsCollection.Add(new Claim(ClaimTypes.Email, value, ClaimValueTypes.String, issuer));
 128            }
 129
 0130            value = certificate.GetNameInfo(X509NameType.UpnName, false);
 0131            if (!string.IsNullOrEmpty(value))
 132            {
 0133                claimsCollection.Add(new Claim(ClaimTypes.Upn, value, ClaimValueTypes.String, issuer));
 134            }
 135
 0136            value = certificate.GetNameInfo(X509NameType.UrlName, false);
 0137            if (!string.IsNullOrEmpty(value))
 138            {
 0139                claimsCollection.Add(new Claim(ClaimTypes.Uri, value, ClaimValueTypes.String, issuer));
 140            }
 141
 142            RSA rsa;
 143           // if (LocalAppContextSwitches.DisableCngCertificates)
 144            {
 0145                rsa = certificate.PublicKey.Key as RSA;
 146            }
 147            //else
 148            //{
 149            //    rsa = CngLightup.GetRSAPublicKey(certificate);
 150            //}
 0151            if (rsa != null)
 152            {
 0153                claimsCollection.Add(new Claim(ClaimTypes.Rsa, rsa.ToXmlString(false), ClaimValueTypes.RsaKeyValue, issu
 154            }
 155
 156            DSA dsa;
 157            //if (LocalAppContextSwitches.DisableCngCertificates)
 158            {
 0159                dsa = certificate.PublicKey.Key as DSA;
 160            }
 161            //else
 162            //{
 163            //    dsa = CngLightup.GetDSAPublicKey(certificate);
 164            //}
 0165            if (dsa != null)
 166            {
 0167                claimsCollection.Add(new Claim(ClaimTypes.Dsa, dsa.ToXmlString(false), ClaimValueTypes.DsaKeyValue, issu
 168            }
 169
 0170            value = certificate.SerialNumber;
 0171            if (!string.IsNullOrEmpty(value))
 172            {
 0173                claimsCollection.Add(new Claim(ClaimTypes.SerialNumber, value, ClaimValueTypes.String, issuer));
 174            }
 175
 0176            return claimsCollection;
 177        }
 178    }
 179}