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

#ifndef __javax_crypto_CipherSpi__
#define __javax_crypto_CipherSpi__

#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 SecureRandom;
      namespace spec
      {
          class AlgorithmParameterSpec;
      }
    }
  }
  namespace javax
  {
    namespace crypto
    {
        class CipherSpi;
    }
  }
}

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

public:
  CipherSpi();
public: // actually protected
  virtual JArray< jbyte > * engineDoFinal(JArray< jbyte > *, jint, jint) = 0;
  virtual jint engineDoFinal(JArray< jbyte > *, jint, jint, JArray< jbyte > *, jint) = 0;
  virtual jint engineDoFinal(::java::nio::ByteBuffer *, ::java::nio::ByteBuffer *);
  virtual jint engineGetBlockSize() = 0;
  virtual JArray< jbyte > * engineGetIV() = 0;
  virtual jint engineGetKeySize(::java::security::Key *);
  virtual jint engineGetOutputSize(jint) = 0;
  virtual ::java::security::AlgorithmParameters * engineGetParameters() = 0;
  virtual void engineInit(jint, ::java::security::Key *, ::java::security::SecureRandom *) = 0;
  virtual void engineInit(jint, ::java::security::Key *, ::java::security::AlgorithmParameters *, ::java::security::SecureRandom *) = 0;
  virtual void engineInit(jint, ::java::security::Key *, ::java::security::spec::AlgorithmParameterSpec *, ::java::security::SecureRandom *) = 0;
  virtual void engineSetMode(::java::lang::String *) = 0;
  virtual void engineSetPadding(::java::lang::String *) = 0;
  virtual ::java::security::Key * engineUnwrap(JArray< jbyte > *, ::java::lang::String *, jint);
  virtual JArray< jbyte > * engineUpdate(JArray< jbyte > *, jint, jint) = 0;
  virtual jint engineUpdate(JArray< jbyte > *, jint, jint, JArray< jbyte > *, jint) = 0;
  virtual jint engineUpdate(::java::nio::ByteBuffer *, ::java::nio::ByteBuffer *);
  virtual JArray< jbyte > * engineWrap(::java::security::Key *);
public:
  static ::java::lang::Class class$;
};

#endif // __javax_crypto_CipherSpi__
