Criando um comando APDU ISO7816-4
Para adicionar funcionalidade a um provedor de serviços, você precisa saber como uma APDU ( unidade de dados de protocolo de aplicativo ) ISO7816-4 é criada dentro das DLLs do provedor de serviços base. O procedimento a seguir fornece uma breve visão geral do processo de build.
Observação
O exemplo incluído aqui não está necessariamente completo; para obter mais informações, consulte os aplicativos de exemplo e DLLs.
Para criar um comando APDU ISO7816-4
Crie um objeto ISCardCmd e um objeto ISCardISO7816 .
// Create an ISCardCmd object. HRESULT hresult = CoCreateInstance(CLSID_CSCardCmd, NULL, CLSCTX_ALL, IID_ISCardCmd, (LPVOID*) &g_pISCardCmd); // Create an ISCardISO7816 object. HRESULT hresult = CoCreateInstance(CLSID_CSCardISO7816, NULL, CLSCTX_ALL, IID_ISCardISO7816, (LPVOID*) &g_pISCardISO7816);
A interface ISCardCmd contém dois buffers IByteBuffer . Um buffer contém a cadeia de caracteres de comando APDU real (além de todos os dados a serem enviados com o comando ). O outro contém todas as informações de resposta retornadas pelo cartão após a execução do comando.
Usando esses objetos, crie um comando ISO7816-4 válido da seguinte maneira:
// Do challenge. HRESULT hresult = g_pISCardISO7816->GetChallenge(dwLengthOfChallenge, &g_pISCardCmd);
Este é o código usado no método GetChallenge :
#include <windows.h> STDMETHODIMP CSCardISO7816::GetChallenge(IN DWORD dwBytesExpected /*= 0*/, IN OUT LPSCARDCMD *ppCmd) { // Locals. HRESULT hr = S_OK; try { // Is the ISCardCmd object okay? hr = IsSCardCmdValid(ppCmd); if (FAILED(hr)) throw (hr); // Do it. hr = (*ppCmd)->BuildCmd(m_byClassId, (BYTE) INS_GET_CHALLENGE, (BYTE) INS_NULL, // P1 = 0x00 (BYTE) INS_NULL, // P2 = 0x00 NULL, &dwBytesExpected); if (FAILED(hr)) throw (hr); } }
O método ISCardISO7816::GetChallenge usa o método ISCardCmd::BuildCmd para criar a APDU solicitada. Isso é feito escrevendo as informações apropriadas no buffer DE APDU ISCardCmd na seguinte instrução:
hr = (*ppCmd)->BuildCmd;
Usando o objeto ISCardCmd criado, faça uma transação com o cartão, interprete os resultados e continue.
Expandindo além de ISO7816-4
A maneira recomendada de expandir o processo de compilação/execução do provedor de serviços descrito acima é criar um novo objeto COM. Esse objeto COM deve dar suporte a uma nova interface que permite a criação de comandos não ISO7816-4 e deve agregar a interface ISCardISO7816 .
Exemplo de criação de um comando APDU ISO7816-4
O exemplo a seguir mostra o código usado no procedimento acima.
// Create an ISCardCmd object.
hresult = CoCreateInstance(CLSID_CSCardCmd,
NULL,
CLSCTX_ALL,
IID_ISCardCmd,
(LPVOID*) &g_pISCardCmd);
// Create an ISCardISO7816 object.
hresult = CoCreateInstance(CLSID_CSCardISO7816,
NULL,
CLSCTX_ALL,
IID_ISCardISO7816,
(LPVOID*) &g_pISCardISO7816);
// Do challenge.
hresult = g_pISCardISO7816->GetChallenge(dwLengthOfChallenge,
&g_pISCardCmd);
STDMETHODIMP
CSCardISO7816::GetChallenge(IN DWORD dwBytesExpected /*= 0*/,
IN OUT LPSCARDCMD *ppCmd)
{
// Locals.
HRESULT hr = S_OK;
try
{
// Is the ISCardCmd object okay?
hr = IsSCardCmdValid(ppCmd);
if (FAILED(hr))
throw (hr);
// Do it.
hr = (*ppCmd)->BuildCmd(m_byClassId,
(BYTE) INS_GET_CHALLENGE,
(BYTE) INS_NULL, // P1 = 0x00
(BYTE) INS_NULL, // P2 = 0x00
NULL,
&dwBytesExpected);
if (FAILED(hr))
throw (hr);
}
}