File: Signing\TrustStore\X509ChainWrapper.cs
Web Access
Project: src\src\nuget-client\src\NuGet.Core\NuGet.Packaging\NuGet.Packaging.csproj (NuGet.Packaging)
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System;
using System.Security.Cryptography.X509Certificates;
using NuGet.Common;

namespace NuGet.Packaging.Signing
{
    internal sealed class X509ChainWrapper : IX509Chain
    {
        private readonly X509Chain _chain;
        private readonly Func<X509Chain, ILogMessage?>? _getAdditionalContext;

        public ILogMessage? AdditionalContext { get; private set; }
        public X509ChainElementCollection ChainElements => _chain.ChainElements;
        public X509ChainPolicy ChainPolicy => _chain.ChainPolicy;
        public X509ChainStatus[] ChainStatus => _chain.ChainStatus;
        public X509Chain PrivateReference => _chain;

        internal X509ChainWrapper(X509Chain chain)
            : this(chain, getAdditionalContext: null)
        {
        }

        internal X509ChainWrapper(X509Chain chain, Func<X509Chain, ILogMessage?>? getAdditionalContext)
        {
            if (chain is null)
            {
                throw new ArgumentNullException(nameof(chain));
            }

            _chain = chain;
            _getAdditionalContext = getAdditionalContext;
        }

        public bool Build(X509Certificate2 certificate)
        {
            if (certificate is null)
            {
                throw new ArgumentNullException(nameof(certificate));
            }

            bool result = _chain.Build(certificate);

            if (!result && _getAdditionalContext is not null)
            {
                AdditionalContext = _getAdditionalContext(_chain);
            }

            return result;
        }

        public void Dispose()
        {
            _chain.Dispose();

            GC.SuppressFinalize(this);
        }
    }
}