public KeyInfoX509Data(X509Certificate cert, IEnumerable <X509Certificate> additional, X509IncludeOption includeOption) { if (cert == null) { throw new ArgumentNullException(nameof(cert)); } X509Certificate certificate = CryptoUtils.CloneCertificate(cert); IList <X509Certificate> chain = null; switch (includeOption) { case X509IncludeOption.ExcludeRoot: chain = CryptoUtils.BuildCertificateChain(cert, additional); for (int index = 0; index < (CryptoUtils.IsSelfSigned(chain) ? 1 : chain.Count - 1); index++) { AddCertificate(chain[index]); } break; case X509IncludeOption.EndCertOnly: AddCertificate(certificate); break; case X509IncludeOption.WholeChain: chain = CryptoUtils.BuildCertificateChain(cert, additional); foreach (var element in chain) { AddCertificate(element); } break; } }