Partager via


Génération d’une commande APDU ISO7816-4

Pour ajouter des fonctionnalités à un fournisseur de services, vous devez savoir comment une unité de données de protocole d’application (APDU) ISO7816-4 est générée dans les DLL du fournisseur de services de base. La procédure suivante donne une brève vue d’ensemble du processus de génération.

Notes

L’exemple inclus ici n’est pas nécessairement complet; Pour plus d’informations, consultez les exemples d’applications et de DLL.

 

Pour générer une commande APDU ISO7816-4

  1. Créez un objet ISCardCmd et un objet 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);
    

    L’interface ISCardCmd contient deux mémoires tampons IByteBuffer. Une mémoire tampon contient la chaîne de commande APDU réelle (plus les données à envoyer avec la commande). L’autre contient les informations de réponse retournées par le carte après l’exécution de la commande.

  2. À l’aide de ces objets, créez une commande ISO7816-4 valide comme suit :

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

    Voici le code utilisé dans la méthode 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);
        }
    }
    

    La méthode ISCardISO7816::GetChallenge utilise la méthode ISCardCmd::BuildCmd pour générer l’APDU demandé. Pour ce faire, écrivez les informations appropriées dans la mémoire tampon APDU ISCardCmd dans l’instruction suivante :

    hr = (*ppCmd)->BuildCmd;
    
  3. À l’aide de l’objet ISCardCmd généré, effectuez une transaction avec le carte, interprétez les résultats et continuez.

Développement au-delà de la norme ISO7816-4

La méthode recommandée pour développer le processus de génération/exécution du fournisseur de services décrit ci-dessus consiste à créer un objet COM. Cet objet COM doit prendre en charge une nouvelle interface qui permet la création de commandes non-ISO7816-4 et doit agréger l’interface ISCardISO7816 .

Exemple de création d’une commande APDU ISO7816-4

L’exemple suivant montre le code utilisé dans la procédure ci-dessus.

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