/**********************************************************************
// @@@ 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 @@@
//
**********************************************************************/

#include "Key.h"
#include "StaticLocking.h"

Key::Key()
{
   m_key = NULL;
   //m_kType = PUBLIC;
   m_keyLen = 0;
}

Key::~Key() 
{
	if (m_key)
		EVP_PKEY_free(m_key);
}

void Key::getPubKeyFromFile(const char *cert_file) throw (SecurityException)
{
   X509* cert = openCertFile(cert_file);
   
   if (!cert)
       throw SecurityException(ERR_OPEN_INPUT_FILE, (char*)cert_file);

   //Get expiration date of the certificate
   strncpy((char*) m_certExpDate, (char*) (X509_get_notAfter(cert)->data), EXPDATESIZE);
   m_certExpDate[EXPDATESIZE] = '\0';

   m_key = X509_extract_key(cert);

   if (!m_key)
   {
     X509_free(cert);
	 throw SecurityException(ERR_RETRIEVE_KEY_FROM_FILE, (char* )cert_file);
   }

//   m_kType = PUBLIC;
   m_keyLen = EVP_PKEY_size(m_key);
   X509_free(cert);
}

X509* Key::openCertFile(const char* certFile) throw (SecurityException)
{
   if (!certFile)
   {
	   throw SecurityException(INPUT_PARAMETER_IS_NULL, " - certFile.");
	   return NULL;
   }

   FILE* inFile=fopen(certFile, "r");
   if (!inFile)
   {
	   throw SecurityException(FILE_NOTFOUND, (char* )certFile);
	   return NULL;
   }

   getMutex();
   X509 *certificate = PEM_read_X509(inFile, NULL, 0, NULL);
   releaseMutex();
   if (!certificate)
   {
	   fclose(inFile);
	   throw SecurityException(ERR_READ_CERT_FILE, (char* )certFile);
	   return NULL;
   }  

   fclose(inFile);

   return certificate;
}

EVP_PKEY* Key::getPrivKeyFromFile(const char* inFile,
								  EVP_PKEY *priv_key) throw (SecurityException)
{
   if (!inFile)
	 throw SecurityException(INPUT_PARAMETER_IS_NULL, " - inFile.");

   FILE* file=fopen(inFile, "r");
   if (!file)
      throw SecurityException(FILE_NOTFOUND, (char *)inFile);

   EVP_PKEY* key = PEM_read_PrivateKey(file, &priv_key, 0, NULL);

   fclose (file);
   if (!key)
      throw SecurityException(ERR_RETRIEVE_KEY_FROM_FILE, (char *)inFile);

   return key;
}

unsigned char* Key::getCertExpDate(const char* certFile) throw (SecurityException)
{
   X509* cert = openCertFile(certFile);
   
   if (!cert)
	   throw SecurityException(ERR_OPEN_INPUT_FILE, " - cert.");

   unsigned char* date = X509_get_notAfter(cert)->data;

   X509_free(cert);

   return date;
}


EVP_PKEY* Key::getKey()
{
   return m_key;
}

void Key::setKey(EVP_PKEY* key)
{
	m_key = key;
}

int Key::getKeyLen() 
{
   return m_keyLen;
}

unsigned char* Key::getCertExpDate() 
{
   return m_certExpDate;
}

