diff options
Diffstat (limited to 'mcs/class/System/System.Security.Cryptography.X509Certificates/X509ChainElement.cs')
-rw-r--r-- | mcs/class/System/System.Security.Cryptography.X509Certificates/X509ChainElement.cs | 79 |
1 files changed, 71 insertions, 8 deletions
diff --git a/mcs/class/System/System.Security.Cryptography.X509Certificates/X509ChainElement.cs b/mcs/class/System/System.Security.Cryptography.X509Certificates/X509ChainElement.cs index 086ce7c8a6c..103f2a11992 100644 --- a/mcs/class/System/System.Security.Cryptography.X509Certificates/X509ChainElement.cs +++ b/mcs/class/System/System.Security.Cryptography.X509Certificates/X509ChainElement.cs @@ -5,7 +5,7 @@ // Sebastien Pouliot <sebastien@ximian.com> // // (C) 2003 Motus Technologies Inc. (http://www.motus.com) -// Copyright (C) 2005 Novell Inc. (http://www.novell.com) +// Copyright (C) 2005-2006 Novell Inc. (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the @@ -33,28 +33,91 @@ namespace System.Security.Cryptography.X509Certificates { public class X509ChainElement { + private X509Certificate2 certificate; + private X509ChainStatus[] status; + private string info; + // constructors // only accessible from X509Chain.ChainElements - internal X509ChainElement () + internal X509ChainElement (X509Certificate2 certificate, X509ChainStatusFlags flags) { + this.certificate = certificate; + + if (flags == X509ChainStatusFlags.NoError) { + status = new X509ChainStatus [0]; + } else { + int size = Count (flags); + status = new X509ChainStatus [size]; + + int n = 0; + // process every possible error
+ Set (status, ref n, flags, X509ChainStatusFlags.UntrustedRoot);
+ Set (status, ref n, flags, X509ChainStatusFlags.NotTimeValid); + // not yet sorted after this... + Set (status, ref n, flags, X509ChainStatusFlags.NotTimeNested); + Set (status, ref n, flags, X509ChainStatusFlags.Revoked); + Set (status, ref n, flags, X509ChainStatusFlags.NotSignatureValid); + Set (status, ref n, flags, X509ChainStatusFlags.NotValidForUsage); + Set (status, ref n, flags, X509ChainStatusFlags.RevocationStatusUnknown); + Set (status, ref n, flags, X509ChainStatusFlags.Cyclic); + Set (status, ref n, flags, X509ChainStatusFlags.InvalidExtension); + Set (status, ref n, flags, X509ChainStatusFlags.InvalidPolicyConstraints); + Set (status, ref n, flags, X509ChainStatusFlags.InvalidBasicConstraints); + Set (status, ref n, flags, X509ChainStatusFlags.InvalidNameConstraints); + Set (status, ref n, flags, X509ChainStatusFlags.HasNotSupportedNameConstraint); + Set (status, ref n, flags, X509ChainStatusFlags.HasNotDefinedNameConstraint); + Set (status, ref n, flags, X509ChainStatusFlags.HasNotPermittedNameConstraint); + Set (status, ref n, flags, X509ChainStatusFlags.HasExcludedNameConstraint); + Set (status, ref n, flags, X509ChainStatusFlags.PartialChain); + Set (status, ref n, flags, X509ChainStatusFlags.CtlNotTimeValid); + Set (status, ref n, flags, X509ChainStatusFlags.CtlNotSignatureValid); + Set (status, ref n, flags, X509ChainStatusFlags.CtlNotValidForUsage); + Set (status, ref n, flags, X509ChainStatusFlags.OfflineRevocation); + Set (status, ref n, flags, X509ChainStatusFlags.NoIssuanceChainPolicy); + } + // so far String.Empty is the only thing I've seen. + // The interesting stuff is inside X509ChainStatus.Information + info = String.Empty; } // properties - [MonoTODO] public X509Certificate2 Certificate { - get { return null; } + get { return certificate; } } - [MonoTODO] public X509ChainStatus[] ChainElementStatus { - get { return null; } + get { return status; } } - [MonoTODO] public string Information { - get { return null; } + get { return info; } + } + + // private stuff + + private int Count (X509ChainStatusFlags flags) + { + int size = 0; + int n = 0; + int f = (int) flags; + int m = 0x1; + while (n++ < 32) { + if ((f & m) == m) + size++; + m <<= 1; + } + return size; + } + + private void Set (X509ChainStatus[] status, ref int position, X509ChainStatusFlags flags, X509ChainStatusFlags mask) + { + if ((flags & mask) != 0) { + status [position].Status = mask; + status [position].StatusInformation = X509ChainStatus.GetInformation (mask); + position++; + } } } } |