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

#ifndef __javax_crypto_NullCipherImpl__
#define __javax_crypto_NullCipherImpl__

#pragma interface

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

extern "Java"
{
  namespace java
  {
    namespace security
    {
        class AlgorithmParameters;
        class Key;
        class SecureRandom;
      namespace spec
      {
          class AlgorithmParameterSpec;
      }
    }
  }
  namespace javax
  {
    namespace crypto
    {
        class NullCipherImpl;
    }
  }
}

class javax::crypto::NullCipherImpl : public ::javax::crypto::CipherSpi
{

public: // actually package-private
  NullCipherImpl();
public: // actually protected
  void engineSetMode(::java::lang::String *);
  void engineSetPadding(::java::lang::String *);
  jint engineGetBlockSize();
  jint engineGetOutputSize(jint);
  JArray< jbyte > * engineGetIV();
  ::java::security::AlgorithmParameters * engineGetParameters();
  void engineInit(jint, ::java::security::Key *, ::java::security::SecureRandom *);
  void engineInit(jint, ::java::security::Key *, ::java::security::spec::AlgorithmParameterSpec *, ::java::security::SecureRandom *);
  void engineInit(jint, ::java::security::Key *, ::java::security::AlgorithmParameters *, ::java::security::SecureRandom *);
  JArray< jbyte > * engineUpdate(JArray< jbyte > *, jint, jint);
  jint engineUpdate(JArray< jbyte > *, jint, jint, JArray< jbyte > *, jint);
  JArray< jbyte > * engineDoFinal(JArray< jbyte > *, jint, jint);
  jint engineDoFinal(JArray< jbyte > *, jint, jint, JArray< jbyte > *, jint);
public:
  static ::java::lang::Class class$;
};

#endif // __javax_crypto_NullCipherImpl__
