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

#ifndef __gnu_javax_net_ssl_provider_AbstractHandshake__
#define __gnu_javax_net_ssl_provider_AbstractHandshake__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace classpath
    {
      namespace debug
      {
          class SystemLogger;
      }
    }
    namespace javax
    {
      namespace net
      {
        namespace ssl
        {
          namespace provider
          {
              class AbstractHandshake;
              class CompressionMethod;
              class InputSecurityParameters;
              class OutputSecurityParameters;
              class Random;
              class SSLEngineImpl;
              class SessionImpl;
          }
        }
      }
    }
  }
  namespace java
  {
    namespace nio
    {
        class ByteBuffer;
    }
    namespace security
    {
        class MessageDigest;
        class SecureRandom;
    }
  }
  namespace javax
  {
    namespace crypto
    {
        class KeyAgreement;
      namespace interfaces
      {
          class DHPrivateKey;
      }
    }
    namespace net
    {
      namespace ssl
      {
          class SSLEngineResult$HandshakeStatus;
      }
    }
  }
}

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

public: // actually protected
  AbstractHandshake(::gnu::javax::net::ssl::provider::SSLEngineImpl *);
public:
  virtual ::javax::net::ssl::SSLEngineResult$HandshakeStatus * handleInput(::java::nio::ByteBuffer *);
public: // actually protected
  virtual ::javax::net::ssl::SSLEngineResult$HandshakeStatus * implHandleInput() = 0;
public:
  virtual ::javax::net::ssl::SSLEngineResult$HandshakeStatus * handleOutput(::java::nio::ByteBuffer *);
public: // actually protected
  virtual ::javax::net::ssl::SSLEngineResult$HandshakeStatus * implHandleOutput(::java::nio::ByteBuffer *) = 0;
public: // actually package-private
  virtual ::gnu::javax::net::ssl::provider::InputSecurityParameters * getInputParams();
  virtual ::gnu::javax::net::ssl::provider::OutputSecurityParameters * getOutputParams();
  virtual ::java::lang::Runnable * getTask();
  virtual ::javax::net::ssl::SSLEngineResult$HandshakeStatus * status() = 0;
  virtual void checkKeyExchange() = 0;
  virtual void handleV2Hello(::java::nio::ByteBuffer *) = 0;
public: // actually protected
  virtual jboolean pollHandshake(::java::nio::ByteBuffer *);
  virtual jboolean doHash();
  virtual jboolean hasMessage();
private:
  void reallocateBuffer(jint);
public: // actually protected
  virtual JArray< jbyte > * genV3CertificateVerify(::java::security::MessageDigest *, ::java::security::MessageDigest *, ::gnu::javax::net::ssl::provider::SessionImpl *);
  virtual JArray< JArray< jbyte > * > * generateKeys(::gnu::javax::net::ssl::provider::Random *, ::gnu::javax::net::ssl::provider::Random *, ::gnu::javax::net::ssl::provider::SessionImpl *);
  virtual ::java::nio::ByteBuffer * generateFinished(::java::security::MessageDigest *, ::java::security::MessageDigest *, jboolean, ::gnu::javax::net::ssl::provider::SessionImpl *);
  virtual void initDiffieHellman(::javax::crypto::interfaces::DHPrivateKey *, ::java::security::SecureRandom *);
  virtual void generateMasterSecret(::gnu::javax::net::ssl::provider::Random *, ::gnu::javax::net::ssl::provider::Random *, ::gnu::javax::net::ssl::provider::SessionImpl *);
  virtual void setupSecurityParameters(JArray< JArray< jbyte > * > *, jboolean, ::gnu::javax::net::ssl::provider::SSLEngineImpl *, ::gnu::javax::net::ssl::provider::CompressionMethod *);
  virtual void generatePSKSecret(::java::lang::String *, JArray< jbyte > *, jboolean);
  static ::gnu::classpath::debug::SystemLogger * logger;
  static JArray< jbyte > * SERVER_FINISHED;
  static JArray< jbyte > * CLIENT_FINISHED;
private:
  static JArray< jbyte > * KEY_EXPANSION;
  static JArray< jbyte > * MASTER_SECRET;
  static JArray< jbyte > * CLIENT_WRITE_KEY;
  static JArray< jbyte > * SERVER_WRITE_KEY;
  static JArray< jbyte > * IV_BLOCK;
  static JArray< jbyte > * SENDER_CLIENT;
  static JArray< jbyte > * SENDER_SERVER;
public: // actually protected
  static JArray< jbyte > * PAD1;
  static JArray< jbyte > * PAD2;
  ::java::nio::ByteBuffer * __attribute__((aligned(__alignof__( ::java::lang::Object)))) handshakeBuffer;
  jint handshakeOffset;
  ::java::security::MessageDigest * sha;
  ::java::security::MessageDigest * md5;
  ::gnu::javax::net::ssl::provider::SSLEngineImpl * engine;
  ::javax::crypto::KeyAgreement * keyAgreement;
  JArray< jbyte > * preMasterSecret;
  ::gnu::javax::net::ssl::provider::InputSecurityParameters * inParams;
  ::gnu::javax::net::ssl::provider::OutputSecurityParameters * outParams;
  ::java::util::LinkedList * tasks;
  ::gnu::javax::net::ssl::provider::Random * serverRandom;
  ::gnu::javax::net::ssl::provider::Random * clientRandom;
  ::gnu::javax::net::ssl::provider::CompressionMethod * compression;
public: // actually package-private
  static jboolean $assertionsDisabled;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_javax_net_ssl_provider_AbstractHandshake__
