Идентификатор карты Omnikey 5025CL в PHP7 - PullRequest
0 голосов
/ 30 октября 2019

После нескольких дней поиска и тестирования я решил снова разобраться и попросить помощи в правильном направлении. Я хочу получить ATR или UID моего кард-ридера omnikey 5025CL для PHP.

Я пробовал подключить плагин pc / sc для PHP, но это для PHP5. Я использую PHP7, поэтому эти плагины не работают / доступны.

Кто-нибудь знает другой способ получить эти идентификаторы в браузере?

Надеюсь, это сработает, или мне придется купить новыйи в 3 раза дороже считывателя с клавиатурным интерфейсом.

Пример кода C:

// Sample C code that displays ATR and data from PROX card.
// Link with winscard.lib
#include <stdio.h>
#include <winscard.h>
int main(int argc, char* argv[])
{
    LONG lResult;
    SCARDCONTEXT hContext;
    SCARDHANDLE hCard;
    DWORD dwActiveProtocol;
    DWORD dwLen;
    SCARD_IO_REQUEST pIoReq;
    BYTE pBuffer[32];
    USHORT SW;
    DWORD i;
    //APDU to get data from card
    BYTE GET_DATA[] = {0xFF, 0xCA, 0x00, 0x00, 0x00};
    // First 5025 reader name
    WCHAR szReader[] = L"HID OMNIKEY 5025-CL 0";
    // Establish context
    lResult = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hContext);
    if( SCARD_S_SUCCESS != lResult ){
        printf("SCardEstablishContext failed. Error code 0x%08X.\n", lResult );
        return 1;
    }
    //Connect to card
    lResult = SCardConnect( hContext, 
    szReader,
    SCARD_SHARE_SHARED,
    SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,
    &hCard,
    &dwActiveProtocol);
    if( SCARD_S_SUCCESS != lResult ){
        //release context
        SCardReleaseContext(hContext);
        printf("Can not detect card. Error code 0x%08X.\n", lResult );
        return 1;
    }
    //Select protocol T=1 or T=0
    if( SCARD_PROTOCOL_T1 == dwActiveProtocol ){
        pIoReq = *SCARD_PCI_T1;
    }else{
        pIoReq = *SCARD_PCI_T0;
    }
    //get ATR
    dwLen = sizeof(pBuffer);
    lResult = SCardStatus( hCard,
    NULL,
    NULL,
    NULL,
    NULL,
    pBuffer,
    &dwLen);
    if( SCARD_S_SUCCESS != lResult ){
        //disconnect card
        SCardDisconnect(hCard, SCARD_LEAVE_CARD);
        //release context
        SCardReleaseContext(hContext);
        printf("Can not get card status. Error code 0x%08X.\n", lResult );
        return 1;
    }
    //display ATR
    printf("ATR: ");
    for(i=0;i<dwLen-2;i++){
        printf(" %02X", pBuffer[i]); //print hex digits
    }
    printf("\n"); //end of line
    dwLen = sizeof(pBuffer);
    lResult = SCardTransmit(hCard,
    &pIoReq,
    GET_DATA,
    sizeof(GET_DATA),
    NULL,
    pBuffer,
    &dwLen);
    if( SCARD_S_SUCCESS != lResult ){
        //release context
        SCardReleaseContext(hContext);
        printf("Card not detected. Error code 0x%08X.\n", lResult );
        return 1;
    }

    SW = pBuffer[dwLen-2] << 8 | pBuffer[dwLen-1];
    //response code
    if( SW != 0x9000 ){
        //disconnect card
        SCardDisconnect(hCard, SCARD_LEAVE_CARD);
        //release context
        SCardReleaseContext(hContext);
        printf("Command not accepted. Error code 0x%04X.\n", SW );
        return 1;
    }
    //display response
    printf("Data:");
    for(i=0;i<dwLen-2;i++){
        printf(" %02X", pBuffer[i]); //print hex digits
    }
    printf("\n"); //end of line
    //disconnect card
    SCardDisconnect(hCard, SCARD_LEAVE_CARD);
    //release context
    SCardReleaseContext(hContext);
    return 0;
}

Этот пример взят из https://www.hidglobal.com/doclib/files/resource_files/omnikey_5025_cl_software_developer_guide_mn_en.pdf

Я только учусь, поэтому надеюсь, что выребята, можете указать мне правильный путь!

...