
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __gnu_java_security_provider_PKIXCertPathValidatorImpl__
#define __gnu_java_security_provider_PKIXCertPathValidatorImpl__

#pragma interface

#include <java/security/cert/CertPathValidatorSpi.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace security
      {
        namespace provider
        {
            class PKIXCertPathValidatorImpl;
        }
        namespace x509
        {
            class PolicyNodeImpl;
        }
      }
    }
  }
  namespace java
  {
    namespace security
    {
        class PublicKey;
      namespace cert
      {
          class CertPath;
          class CertPathParameters;
          class CertPathValidatorResult;
          class PKIXParameters;
          class X509CRL;
          class X509Certificate;
      }
    }
  }
}

class gnu::java::security::provider::PKIXCertPathValidatorImpl : public ::java::security::cert::CertPathValidatorSpi
{

public:
  PKIXCertPathValidatorImpl();
  virtual ::java::security::cert::CertPathValidatorResult * engineValidate(::java::security::cert::CertPath *, ::java::security::cert::CertPathParameters *);
private:
  static jboolean checkCRL(::java::security::cert::X509CRL *, JArray< ::java::security::cert::X509Certificate * > *, ::java::util::Date *, ::java::security::cert::X509Certificate *, ::java::security::PublicKey *, ::java::util::List *);
  static ::java::util::Set * getCritExts(::java::security::cert::X509Certificate *);
  static void basicSanity(JArray< ::java::security::cert::X509Certificate * > *, jint);
  static void updatePolicyTree(::java::security::cert::X509Certificate *, ::gnu::java::security::x509::PolicyNodeImpl *, jint, ::java::security::cert::PKIXParameters *, jboolean);
  jboolean checkExplicitPolicy(jint, ::java::util::List *);
  static ::java::util::logging::Logger * log;
public:
  static ::java::lang::String * ANY_POLICY;
  static ::java::lang::Class class$;
};

#endif // __gnu_java_security_provider_PKIXCertPathValidatorImpl__
