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

#ifndef __gnu_javax_crypto_jce_cipher_ARCFourSpi__
#define __gnu_javax_crypto_jce_cipher_ARCFourSpi__

#pragma interface

#include <javax/crypto/CipherSpi.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace security
      {
        namespace prng
        {
            class IRandom;
        }
      }
    }
    namespace javax
    {
      namespace crypto
      {
        namespace jce
        {
          namespace cipher
          {
              class ARCFourSpi;
          }
        }
      }
    }
  }
  namespace java
  {
    namespace security
    {
        class AlgorithmParameters;
        class Key;
        class SecureRandom;
      namespace spec
      {
          class AlgorithmParameterSpec;
      }
    }
  }
}

class gnu::javax::crypto::jce::cipher::ARCFourSpi : public ::javax::crypto::CipherSpi
{

public:
  ARCFourSpi();
public: // actually protected
  virtual jint engineGetBlockSize();
  virtual void engineSetMode(::java::lang::String *);
  virtual void engineSetPadding(::java::lang::String *);
  virtual JArray< jbyte > * engineGetIV();
  virtual jint engineGetOutputSize(jint);
  virtual ::java::security::AlgorithmParameters * engineGetParameters();
  virtual void engineInit(jint, ::java::security::Key *, ::java::security::SecureRandom *);
  virtual void engineInit(jint, ::java::security::Key *, ::java::security::spec::AlgorithmParameterSpec *, ::java::security::SecureRandom *);
  virtual void engineInit(jint, ::java::security::Key *, ::java::security::AlgorithmParameters *, ::java::security::SecureRandom *);
  virtual JArray< jbyte > * engineUpdate(JArray< jbyte > *, jint, jint);
  virtual jint engineUpdate(JArray< jbyte > *, jint, jint, JArray< jbyte > *, jint);
  virtual JArray< jbyte > * engineDoFinal(JArray< jbyte > *, jint, jint);
  virtual jint engineDoFinal(JArray< jbyte > *, jint, jint, JArray< jbyte > *, jint);
private:
  ::gnu::java::security::prng::IRandom * __attribute__((aligned(__alignof__( ::javax::crypto::CipherSpi)))) keystream;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_javax_crypto_jce_cipher_ARCFourSpi__
