다음을 통해 공유


ISO7816-4 APDU 명령 빌드

서비스 공급자에 기능을 추가하려면 기본 서비스 공급자 DLL 내에서 ISO7816-4 APDU( 애플리케이션 프로토콜 데이터 단위 )를 빌드하는 방법을 알고 있어야 합니다. 다음 절차에서는 빌드 프로세스에 대한 간략한 개요를 제공합니다.

참고

여기에 포함된 예제가 반드시 완료된 것은 아닙니다. 자세한 내용은 샘플 애플리케이션 및 DLL을 참조하세요.

 

ISO7816-4 APDU 명령을 빌드하려면

  1. ISCardCmd 개체와 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);
    

    ISCardCmd 인터페이스에는 두 개의 IByteBuffer 버퍼가 포함되어 있습니다. 하나의 버퍼에는 실제 APDU 명령 문자열(명령과 함께 보낼 모든 데이터)이 포함됩니다. 다른 하나는 명령 실행 후 카드 반환된 회신 정보를 포함합니다.

  2. 이러한 개체를 사용하여 다음과 같이 유효한 ISO7816-4 명령을 만듭니다.

    //  Do challenge.
    HRESULT hresult = g_pISCardISO7816->GetChallenge(dwLengthOfChallenge,
                                             &g_pISCardCmd);
    

    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);
        }
    }
    

    ISCardISO7816::GetChallenge 메서드는 ISCardCmd::BuildCmd 메서드를 사용하여 요청된 APDU를 빌드합니다. 이 작업은 다음 문의 ISCardCmd APDU 버퍼에 적절한 정보를 작성하여 수행합니다.

    hr = (*ppCmd)->BuildCmd;
    
  3. 빌드된 ISCardCmd 개체를 사용하여 카드 트랜잭션을 수행하고 결과를 해석한 후 계속합니다.

ISO7816-4 이상으로 확장

위에서 설명한 서비스 공급자 빌드/실행 프로세스를 확장하는 권장 방법은 새 COM 개체를 만드는 것입니다. 이 COM 개체는 ISO7816-4가 아닌 명령을 만들 수 있는 새 인터페이스를 지원해야 하며 ISCardISO7816 인터페이스를 집계해야 합니다.

ISO7816-4 APDU 명령 빌드 예제

다음 예제에서는 위의 프로시저에 사용된 코드를 보여줍니다.

//  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);
    }
}