/**********************************************************************
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@
//
**********************************************************************/

#ifndef keyh
#define keyh

#include "openssl/evp.h"
#include "openssl/ossl_typ.h"
#include "openssl/rsa.h"
#include "openssl/hmac.h"
#include "openssl/x509.h"
#include "openssl/x509v3.h"
#include "openssl/pem.h"
#include "secdefsCommon.h"
#include "securityException.h"

#ifdef _WINDOWS
class __declspec( dllexport ) Key
#else 
class Key 
#endif
{
   public:
      //enum KeyType{PUBLIC, PRIVATE};

      // Ctor
      // ktype - PUBLIC or PRIVATE key
	  Key();

      ~Key();

      // gets the public/private key from the certificate file
	  // Sets m_keyLen and m_certExpDate
      // keyFile - Certificate file contains the key
      void getPubKeyFromFile(const char *keyFile) throw (SecurityException); 

      // gets the private key from the input file
      // inFile - input file contains the key
	  // priv_key - points to key storage addr
      // Returs pointer to the ENV_PKEY structure in which the key is stored 
      static EVP_PKEY* getPrivKeyFromFile(const char *inFile,
		                         EVP_PKEY *priv_key) throw (SecurityException); 

      // returns key
      EVP_PKEY *getKey();

	  // Set m_key
	  void setKey(EVP_PKEY* key);

      // returns the length of the public key 
      int getKeyLen();

      // returns type of key
	  //Key::KeyType getKType();

	  // get m_certExpDate
	  unsigned char* getCertExpDate();

	  // get expiration date fron the certificate (used by server code)
	  // certFile - fully qualified certificate file name
	  // Returns string in YYMMDDHHMMSSZ format 
      static unsigned char* getCertExpDate(const char* certFile) throw (SecurityException);

   private:
	  // open the certificate file
	  // cert_file - certificate file name
	  // returns the certificate
      static X509* openCertFile(const char* cert_file)  throw (SecurityException);

      EVP_PKEY *m_key;
	  //Key::KeyType m_kType;
	  int m_keyLen;
	  unsigned char m_certExpDate[EXPDATESIZE + 1]; 
};
#endif
