#include "TokenType.h"
#include "Pkcs11Exceptions.h"


/********************************************************************************************
	Constructor.
	
	Parámetros:
		- string sName: Nombre del tipo de tarjeta.
********************************************************************************************/
CTokenType::CTokenType(string sName)
{
	DBG_TRACE(( "Constructor CTokenType(%s) [0x%08x]\n", sName.c_str(), this ));
	m_sName			= sName;
	m_commType		= COMM_TYPE_PLAIN;
	m_iASN1Flags	= ASN1TYPE_ISO|PATHENC_BIN;
}


/********************************************************************************************
	Destructor
********************************************************************************************/
CTokenType::~CTokenType(void)
{
	DBG_TRACE(( "Destructor CTokenType() [0x%08x]\n", this ));
}


/********************************************************************************************
	Método que obtiene el nombre del tipo de tarjeta.

	Devuelve: string con el nombre del tipo de tarjeta.
********************************************************************************************/
string CTokenType::GetName() const
{
	return m_sName;
}


/********************************************************************************************
	Método que obtiene el número de distintos ATRs que tiene el tipo de tarjeta.

	Devuelve: unsigned int con el número de distintos ATRs que tiene el tipo de tarjeta.
********************************************************************************************/
unsigned int CTokenType::GetNumberOfAtrs() const
{
	return (unsigned int)m_vecAtrs.size();
}

//
// Método para comprobar si un ATR encaja con los registrados
//
/********************************************************************************************
	Método para comprobar si un ATR encaja con los registrados

	Parámetros:
		- byte * pAtr:	Puntero al ATR
		- ulong size:	Tamaño del ATR en bytes

	Devuelve: pair<string, string> con el ATR y su máscara asociada.
********************************************************************************************/

bool CTokenType::IsValidAtr( byte * pAtr, ulong size )
{
	ulong idxAtr;
	ulong idx;

	for( idxAtr=0; idxAtr<m_vecAtrs.size(); ++ idxAtr )
	{
		pair<byteBuffer, byteBuffer>	& atr = m_vecAtrs.at(idxAtr);
		if( atr.first.size() != size )
			continue;

		for( idx=0; idx<size; ++idx )
		{
			if( (atr.first[idx] & atr.second[idx]) != (pAtr[idx] & atr.second[idx]) )
				break;
		}

		if( idx >= size )
			return true;
	}

	return false;
}

/********************************************************************************************
	Método que añade un ATR y su máscara asociada a la lista de ATRs.

	Parámetros:
		- string sAtr: ATR
		- string sAtrMask: Máscara asociada al ATR

	Devuelve: pair<string, string> con el ATR y su máscara asociada.
********************************************************************************************/
void CTokenType::AddAtr(byteBuffer & sAtr, byteBuffer & sAtrMask)
{

	// El ATR y su máscara asociada deben tener la misma longitud
	if (sAtr.size() != sAtrMask.size())
	{
		throw Pkcs11Exception(CKR_ARGUMENTS_BAD);
	}

//	m_vecAtrs.push_back (pair<string, string>(sAtr, sAtrMask));
	m_vecAtrs.push_back( pair<byteBuffer,byteBuffer>(sAtr,sAtrMask) );
//		byteBuffer((byte *)sAtr.c_str(),sAtr.size()),
//		byteBuffer((byte *)sAtrMask.c_str(),sAtrMask.size())) );
}


void CTokenType::setCommType( int commType, byte * pParams, int size )
{
	m_commType = commType;

	if( pParams )
		m_params.assign( pParams, size );
}


void CTokenType::setPinParams( byte * pParams, int size )
{
	m_paramsPIN.assign( pParams, size );
}