1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
/* ****************************************************************************
* eID Middleware Project.
* Copyright (C) 2008-2009 FedICT.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License version
* 3.0 as published by the Free Software Foundation.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, see
* http://www.gnu.org/licenses/.
**************************************************************************** */
#include "EmulationSISCard.h"
// taken from WinError.h
#if (!defined WIN32) && (!defined SCARD_E_COMM_DATA_LOST)
#define SCARD_E_COMM_DATA_LOST ((DWORD)0x8010002F)
#endif
using namespace eIDMW;
CEmulationSISCard::CEmulationSISCard(const CByteArray & oData)
{
m_oData = oData;
}
LONG CEmulationSISCard::SCardTransmitInternal(
IN LPCBYTE pbSendBuffer,
IN DWORD cbSendLength,
OUT LPBYTE pbRecvBuffer,
IN OUT LPDWORD pcbRecvLength)
{
long lRet = SCARD_E_COMM_DATA_LOST;
// First check if it's an ACR38U 'control' command on Mac
if (cbSendLength == 8 && memcmp(pbSendBuffer, "\x00\x00\x00\x00", 4) == 0)
{
if (*pcbRecvLength < 2)
return SCARD_E_INSUFFICIENT_BUFFER;
pbRecvBuffer[0] = 0x90;
pbRecvBuffer[1] = 0x00;
*pcbRecvLength = 2;
return SCARD_S_SUCCESS;
}
if (cbSendLength == 5 && pbSendBuffer[0] == 0xFF && pbSendBuffer[1] == 0xB2)
{
unsigned long ulOffset = 256 * pbSendBuffer[2] + pbSendBuffer[3];
unsigned long ulLen = pbSendBuffer[4];
if (*pcbRecvLength < ulLen + 2)
return SCARD_E_INSUFFICIENT_BUFFER;
memcpy(pbRecvBuffer, m_oData.GetBytes() + ulOffset, ulLen);
pbRecvBuffer[ulLen] = 0x90;
pbRecvBuffer[ulLen + 1] = 0x00;
*pcbRecvLength = ulLen + 2;
lRet = SCARD_S_SUCCESS;
}
return lRet;
}
|