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

#ifndef __gnu_java_security_x509_X509CRL__
#define __gnu_java_security_x509_X509CRL__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace security
      {
          class OID;
        namespace x509
        {
            class X500DistinguishedName;
            class X509CRL;
          namespace ext
          {
              class Extension;
          }
        }
      }
    }
  }
  namespace java
  {
    namespace math
    {
        class BigInteger;
    }
    namespace security
    {
        class Principal;
        class PublicKey;
        class Signature;
      namespace cert
      {
          class Certificate;
          class X509CRLEntry;
      }
    }
  }
  namespace javax
  {
    namespace security
    {
      namespace auth
      {
        namespace x500
        {
            class X500Principal;
        }
      }
    }
  }
}

class gnu::java::security::x509::X509CRL : public ::java::security::cert::X509CRL
{

public:
  X509CRL(::java::io::InputStream *);
  virtual jboolean equals(::java::lang::Object *);
  virtual jint hashCode();
  virtual JArray< jbyte > * getEncoded();
  virtual void verify(::java::security::PublicKey *);
  virtual void verify(::java::security::PublicKey *, ::java::lang::String *);
  virtual jint getVersion();
  virtual ::java::security::Principal * getIssuerDN();
  virtual ::javax::security::auth::x500::X500Principal * getIssuerX500Principal();
  virtual ::java::util::Date * getThisUpdate();
  virtual ::java::util::Date * getNextUpdate();
  virtual ::java::security::cert::X509CRLEntry * getRevokedCertificate(::java::math::BigInteger *);
  virtual ::java::util::Set * getRevokedCertificates();
  virtual JArray< jbyte > * getTBSCertList();
  virtual JArray< jbyte > * getSignature();
  virtual ::java::lang::String * getSigAlgName();
  virtual ::java::lang::String * getSigAlgOID();
  virtual JArray< jbyte > * getSigAlgParams();
  virtual jboolean hasUnsupportedCriticalExtension();
  virtual ::java::util::Set * getCriticalExtensionOIDs();
  virtual ::java::util::Set * getNonCriticalExtensionOIDs();
  virtual JArray< jbyte > * getExtensionValue(::java::lang::String *);
  virtual ::gnu::java::security::x509::ext::Extension * getExtension(::gnu::java::security::OID *);
  virtual ::java::util::Collection * getExtensions();
  virtual ::java::lang::String * toString();
  virtual jboolean isRevoked(::java::security::cert::Certificate *);
private:
  void doVerify(::java::security::Signature *, ::java::security::PublicKey *);
  void parse(::java::io::InputStream *);
  static ::java::util::logging::Logger * log;
  static ::gnu::java::security::OID * ID_DSA;
  static ::gnu::java::security::OID * ID_DSA_WITH_SHA1;
  static ::gnu::java::security::OID * ID_RSA;
  static ::gnu::java::security::OID * ID_RSA_WITH_MD2;
  static ::gnu::java::security::OID * ID_RSA_WITH_MD5;
  static ::gnu::java::security::OID * ID_RSA_WITH_SHA1;
  JArray< jbyte > * __attribute__((aligned(__alignof__( ::java::security::cert::X509CRL)))) encoded;
  JArray< jbyte > * tbsCRLBytes;
  jint version;
  ::gnu::java::security::OID * algId;
  JArray< jbyte > * algParams;
  ::java::util::Date * thisUpdate;
  ::java::util::Date * nextUpdate;
  ::gnu::java::security::x509::X500DistinguishedName * issuerDN;
  ::java::util::HashMap * revokedCerts;
  ::java::util::HashMap * extensions;
  ::gnu::java::security::OID * sigAlg;
  JArray< jbyte > * sigAlgParams;
  JArray< jbyte > * rawSig;
  JArray< jbyte > * signature;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_security_x509_X509CRL__
