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

#ifndef __gnu_java_security_hash_Haval__
#define __gnu_java_security_hash_Haval__

#pragma interface

#include <gnu/java/security/hash/BaseHash.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace security
      {
        namespace hash
        {
            class Haval;
        }
      }
    }
  }
}

class gnu::java::security::hash::Haval : public ::gnu::java::security::hash::BaseHash
{

public:
  Haval();
  Haval(jint);
  Haval(jint, jint);
private:
  Haval(::gnu::java::security::hash::Haval *);
public:
  virtual ::java::lang::Object * clone();
public: // actually protected
  virtual void transform(JArray< jbyte > *, jint);
  virtual JArray< jbyte > * padBuffer();
  virtual JArray< jbyte > * getResult();
  virtual void resetContext();
public:
  virtual jboolean selfTest();
private:
  void tailorDigestBits();
  jint FF1(jint, jint, jint, jint, jint, jint, jint, jint, jint);
  jint FF2(jint, jint, jint, jint, jint, jint, jint, jint, jint, jint);
  jint FF3(jint, jint, jint, jint, jint, jint, jint, jint, jint, jint);
  jint FF4(jint, jint, jint, jint, jint, jint, jint, jint, jint, jint);
  jint FF5(jint, jint, jint, jint, jint, jint, jint, jint, jint, jint);
  jint f1(jint, jint, jint, jint, jint, jint, jint);
  jint f2(jint, jint, jint, jint, jint, jint, jint);
  jint f3(jint, jint, jint, jint, jint, jint, jint);
  jint f4(jint, jint, jint, jint, jint, jint, jint);
  jint f5(jint, jint, jint, jint, jint, jint, jint);
public:
  static const jint HAVAL_VERSION = 1;
  static const jint HAVAL_128_BIT = 16;
  static const jint HAVAL_160_BIT = 20;
  static const jint HAVAL_192_BIT = 24;
  static const jint HAVAL_224_BIT = 28;
  static const jint HAVAL_256_BIT = 32;
  static const jint HAVAL_3_ROUND = 3;
  static const jint HAVAL_4_ROUND = 4;
  static const jint HAVAL_5_ROUND = 5;
private:
  static const jint BLOCK_SIZE = 128;
  static ::java::lang::String * DIGEST0;
  static ::java::lang::Boolean * valid;
  jint __attribute__((aligned(__alignof__( ::gnu::java::security::hash::BaseHash)))) rounds;
  jint h0;
  jint h1;
  jint h2;
  jint h3;
  jint h4;
  jint h5;
  jint h6;
  jint h7;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_security_hash_Haval__
