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

#ifndef __javax_crypto_Cipher__
#define __javax_crypto_Cipher__

#pragma interface

#include <java/lang/Object.h>
#include <gcj/array.h>

extern "Java"
{
  namespace java
  {
    namespace nio
    {
        class ByteBuffer;
    }
    namespace security
    {
        class AlgorithmParameters;
        class Key;
        class Provider;
        class SecureRandom;
      namespace cert
      {
          class Certificate;
      }
      namespace spec
      {
          class AlgorithmParameterSpec;
      }
    }
  }
  namespace javax
  {
    namespace crypto
    {
        class Cipher;
        class CipherSpi;
        class ExemptionMechanism;
    }
  }
}

class javax::crypto::Cipher : public ::java::lang::Object
{

public:
  static ::javax::crypto::Cipher * getInstance(::java::lang::String *);
  static ::javax::crypto::Cipher * getInstance(::java::lang::String *, ::java::lang::String *);
  static ::javax::crypto::Cipher * getInstance(::java::lang::String *, ::java::security::Provider *);
public: // actually protected
  Cipher(::javax::crypto::CipherSpi *, ::java::security::Provider *, ::java::lang::String *);
public:
  virtual ::java::lang::String * getAlgorithm();
  virtual jint getBlockSize();
  virtual ::javax::crypto::ExemptionMechanism * getExemptionMechanism();
  virtual JArray< jbyte > * getIV();
  virtual ::java::security::AlgorithmParameters * getParameters();
  virtual ::java::security::Provider * getProvider();
  virtual JArray< jbyte > * doFinal();
  virtual JArray< jbyte > * doFinal(JArray< jbyte > *);
  virtual JArray< jbyte > * doFinal(JArray< jbyte > *, jint, jint);
  virtual jint doFinal(JArray< jbyte > *, jint);
  virtual jint doFinal(JArray< jbyte > *, jint, jint, JArray< jbyte > *, jint);
  virtual jint doFinal(JArray< jbyte > *, jint, jint, JArray< jbyte > *);
  virtual jint doFinal(::java::nio::ByteBuffer *, ::java::nio::ByteBuffer *);
  virtual jint getOutputSize(jint);
  virtual void init(jint, ::java::security::cert::Certificate *);
  virtual void init(jint, ::java::security::Key *);
  virtual void init(jint, ::java::security::cert::Certificate *, ::java::security::SecureRandom *);
  virtual void init(jint, ::java::security::Key *, ::java::security::SecureRandom *);
  virtual void init(jint, ::java::security::Key *, ::java::security::AlgorithmParameters *);
  virtual void init(jint, ::java::security::Key *, ::java::security::spec::AlgorithmParameterSpec *);
  virtual void init(jint, ::java::security::Key *, ::java::security::AlgorithmParameters *, ::java::security::SecureRandom *);
  virtual void init(jint, ::java::security::Key *, ::java::security::spec::AlgorithmParameterSpec *, ::java::security::SecureRandom *);
  virtual ::java::security::Key * unwrap(JArray< jbyte > *, ::java::lang::String *, jint);
  virtual JArray< jbyte > * update(JArray< jbyte > *);
  virtual JArray< jbyte > * update(JArray< jbyte > *, jint, jint);
  virtual jint update(JArray< jbyte > *, jint, jint, JArray< jbyte > *);
  virtual jint update(JArray< jbyte > *, jint, jint, JArray< jbyte > *, jint);
  virtual jint update(::java::nio::ByteBuffer *, ::java::nio::ByteBuffer *);
  virtual JArray< jbyte > * wrap(::java::security::Key *);
private:
  static ::java::lang::String * SERVICE;
public:
  static const jint DECRYPT_MODE = 2;
  static const jint ENCRYPT_MODE = 1;
  static const jint PRIVATE_KEY = 2;
  static const jint PUBLIC_KEY = 1;
  static const jint SECRET_KEY = 3;
  static const jint UNWRAP_MODE = 4;
  static const jint WRAP_MODE = 3;
private:
  static const jint INITIAL_STATE = 0;
  ::javax::crypto::CipherSpi * __attribute__((aligned(__alignof__( ::java::lang::Object)))) cipherSpi;
  ::java::security::Provider * provider;
  ::java::lang::String * transformation;
  jint state;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_crypto_Cipher__
