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

#ifndef __gnu_javax_net_ssl_provider_TLSRandom__
#define __gnu_javax_net_ssl_provider_TLSRandom__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace javax
    {
      namespace crypto
      {
        namespace mac
        {
            class IMac;
        }
      }
      namespace net
      {
        namespace ssl
        {
          namespace provider
          {
              class TLSRandom;
          }
        }
      }
    }
  }
}

class gnu::javax::net::ssl::provider::TLSRandom : public ::java::lang::Object
{

public: // actually package-private
  TLSRandom();
public:
  virtual ::java::lang::Object * clone();
  virtual void init(::java::util::Map *);
  virtual ::java::lang::String * name();
  virtual jbyte nextByte();
  virtual void nextBytes(JArray< jbyte > *, jint, jint);
  virtual void addRandomByte(jbyte);
  virtual void addRandomBytes(JArray< jbyte > *);
  virtual void addRandomBytes(JArray< jbyte > *, jint, jint);
private:
  void fillBuffer();
public: // actually package-private
  static ::java::lang::String * SECRET;
  static ::java::lang::String * SEED;
private:
  ::gnu::javax::crypto::mac::IMac * __attribute__((aligned(__alignof__( ::java::lang::Object)))) hmac_sha;
  ::gnu::javax::crypto::mac::IMac * hmac_md5;
  JArray< jbyte > * sha_a;
  JArray< jbyte > * md5_a;
  JArray< jbyte > * seed;
  JArray< jbyte > * buffer;
  jint idx;
  jboolean init__;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_javax_net_ssl_provider_TLSRandom__
