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

#ifndef __java_security_KeyFactory__
#define __java_security_KeyFactory__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace java
  {
    namespace security
    {
        class Key;
        class KeyFactory;
        class KeyFactorySpi;
        class PrivateKey;
        class Provider;
        class PublicKey;
      namespace spec
      {
          class KeySpec;
      }
    }
  }
}

class java::security::KeyFactory : public ::java::lang::Object
{

public: // actually protected
  KeyFactory(::java::security::KeyFactorySpi *, ::java::security::Provider *, ::java::lang::String *);
public:
  static ::java::security::KeyFactory * getInstance(::java::lang::String *);
  static ::java::security::KeyFactory * getInstance(::java::lang::String *, ::java::lang::String *);
  static ::java::security::KeyFactory * getInstance(::java::lang::String *, ::java::security::Provider *);
  virtual ::java::security::Provider * getProvider();
  virtual ::java::lang::String * getAlgorithm();
  virtual ::java::security::PublicKey * generatePublic(::java::security::spec::KeySpec *);
  virtual ::java::security::PrivateKey * generatePrivate(::java::security::spec::KeySpec *);
  virtual ::java::security::spec::KeySpec * getKeySpec(::java::security::Key *, ::java::lang::Class *);
  virtual ::java::security::Key * translateKey(::java::security::Key *);
private:
  static ::java::lang::String * KEY_FACTORY;
  ::java::security::KeyFactorySpi * __attribute__((aligned(__alignof__( ::java::lang::Object)))) keyFacSpi;
  ::java::security::Provider * provider;
  ::java::lang::String * algorithm;
public:
  static ::java::lang::Class class$;
};

#endif // __java_security_KeyFactory__
