diff --git a/Crypto/src/pkix/PkixCertPathValidatorException.cs b/Crypto/src/pkix/PkixCertPathValidatorException.cs
new file mode 100644
index 000000000..504a3c646
--- /dev/null
+++ b/Crypto/src/pkix/PkixCertPathValidatorException.cs
@@ -0,0 +1,218 @@
+using System;
+using Org.BouncyCastle.Security;
+
+namespace Org.BouncyCastle.Pkix
+{
+ /**
+ * An exception indicating one of a variety of problems encountered when
+ * validating a certification path. <br />
+ * <br />
+ * A <code>CertPathValidatorException</code> provides support for wrapping
+ * exceptions. The {@link #getCause getCause} method returns the throwable,
+ * if any, that caused this exception to be thrown. <br />
+ * <br />
+ * A <code>CertPathValidatorException</code> may also include the
+ * certification path that was being validated when the exception was thrown
+ * and the index of the certificate in the certification path that caused the
+ * exception to be thrown. Use the {@link #getCertPath getCertPath} and
+ * {@link #getIndex getIndex} methods to retrieve this information.<br />
+ * <br />
+ * <b>Concurrent Access</b><br />
+ * <br />
+ * Unless otherwise specified, the methods defined in this class are not
+ * thread-safe. Multiple threads that need to access a single
+ * object concurrently should synchronize amongst themselves and
+ * provide the necessary locking. Multiple threads each manipulating
+ * separate objects need not synchronize.
+ *
+ * @see CertPathValidator
+ **/
+
+ public class PkixCertPathValidatorException : GeneralSecurityException
+ {
+ private Exception cause;
+ private PkixCertPath certPath;
+ private int index = -1;
+
+ public PkixCertPathValidatorException() : base() { }
+
+ /// <summary>
+ /// Creates a <code>PkixCertPathValidatorException</code> with the given detail
+ /// message. A detail message is a <code>String</code> that describes this
+ /// particular exception.
+ /// </summary>
+ /// <param name="message">the detail message</param>
+ public PkixCertPathValidatorException(string message) : base(message) { }
+
+ /// <summary>
+ /// Creates a <code>PkixCertPathValidatorException</code> with the specified
+ /// detail message and cause.
+ /// </summary>
+ /// <param name="message">the detail message</param>
+ /// <param name="cause">the cause (which is saved for later retrieval by the
+ /// {@link #getCause getCause()} method). (A <code>null</code>
+ /// value is permitted, and indicates that the cause is
+ /// nonexistent or unknown.)</param>
+ public PkixCertPathValidatorException(string message, Exception cause) : base(message)
+ {
+ this.cause = cause;
+ }
+
+ /// <summary>
+ /// Creates a <code>PkixCertPathValidatorException</code> with the specified
+ /// detail message, cause, certification path, and index.
+ /// </summary>
+ /// <param name="message">the detail message (or <code>null</code> if none)</param>
+ /// <param name="cause">the cause (or <code>null</code> if none)</param>
+ /// <param name="certPath">the certification path that was in the process of being
+ /// validated when the error was encountered</param>
+ /// <param name="index">the index of the certificate in the certification path that</param> *
+ public PkixCertPathValidatorException(
+ string message,
+ Exception cause,
+ PkixCertPath certPath,
+ int index)
+ : base(message)
+ {
+ if (certPath == null && index != -1)
+ {
+ throw new ArgumentNullException(
+ "certPath = null and index != -1");
+ }
+ if (index < -1
+ || (certPath != null && index >= certPath.Certificates.Count))
+ {
+ throw new IndexOutOfRangeException(
+ " index < -1 or out of bound of certPath.getCertificates()");
+ }
+
+ this.cause = cause;
+ this.certPath = certPath;
+ this.index = index;
+ }
+
+ //
+ // Prints a stack trace to a <code>PrintWriter</code>, including the
+ // backtrace of the cause, if any.
+ //
+ // @param pw
+ // the <code>PrintWriter</code> to use for output
+ //
+ // public void printStackTrace(PrintWriter pw)
+ // {
+ // super.printStackTrace(pw);
+ // if (getCause() != null)
+ // {
+ // getCause().printStackTrace(pw);
+ // }
+ // }
+ //}
+
+
+ // /**
+ // * Creates a <code>CertPathValidatorException</code> that wraps the
+ // * specified throwable. This allows any exception to be converted into a
+ // * <code>CertPathValidatorException</code>, while retaining information
+ // * about the wrapped exception, which may be useful for debugging. The
+ // * detail message is set to (<code>cause==null ? null : cause.toString()
+ // * </code>)
+ // * (which typically contains the class and detail message of cause).
+ // *
+ // * @param cause
+ // * the cause (which is saved for later retrieval by the
+ // * {@link #getCause getCause()} method). (A <code>null</code>
+ // * value is permitted, and indicates that the cause is
+ // * nonexistent or unknown.)
+ // */
+ // public PkixCertPathValidatorException(Throwable cause)
+ // {
+ // this.cause = cause;
+ // }
+ //
+
+ /// <summary>
+ /// Returns the detail message for this <code>CertPathValidatorException</code>.
+ /// </summary>
+ /// <returns>the detail message, or <code>null</code> if neither the message nor cause were specified</returns>
+ public override string Message
+ {
+ get
+ {
+ string message = base.Message;
+
+ if (message != null)
+ {
+ return message;
+ }
+
+ if (cause != null)
+ {
+ return cause.Message;
+ }
+
+ return null;
+ }
+ }
+
+ /**
+ * Returns the certification path that was being validated when the
+ * exception was thrown.
+ *
+ * @return the <code>CertPath</code> that was being validated when the
+ * exception was thrown (or <code>null</code> if not specified)
+ */
+ public PkixCertPath CertPath
+ {
+ get { return certPath; }
+ }
+
+ /**
+ * Returns the index of the certificate in the certification path that
+ * caused the exception to be thrown. Note that the list of certificates in
+ * a <code>CertPath</code> is zero based. If no index has been set, -1 is
+ * returned.
+ *
+ * @return the index that has been set, or -1 if none has been set
+ */
+ public int Index
+ {
+ get { return index; }
+ }
+
+// /**
+// * Returns the cause of this <code>CertPathValidatorException</code> or
+// * <code>null</code> if the cause is nonexistent or unknown.
+// *
+// * @return the cause of this throwable or <code>null</code> if the cause
+// * is nonexistent or unknown.
+// */
+// public Throwable getCause()
+// {
+// return cause;
+// }
+//
+// /**
+// * Returns a string describing this exception, including a description of
+// * the internal (wrapped) cause if there is one.
+// *
+// * @return a string representation of this
+// * <code>CertPathValidatorException</code>
+// */
+// public String toString()
+// {
+// StringBuffer sb = new StringBuffer();
+// String s = getMessage();
+// if (s != null)
+// {
+// sb.append(s);
+// }
+// if (getIndex() >= 0)
+// {
+// sb.append("index in certpath: ").append(getIndex()).append('\n');
+// sb.append(getCertPath());
+// }
+// return sb.toString();
+// }
+
+ }
+}
|