OSEC

Neohapsis is currently accepting applications for employment. For more information, please visit our website www.neohapsis.com or email hr@neohapsis.com
 
From: Andreas Trink (atrinkutanet.at)
Date: Wed Oct 03 2001 - 15:28:14 CDT

  • Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]

    -----BEGIN PGP SIGNED MESSAGE-----
    Hash: SHA1

    Hi!

    First info: pscs-lite-1.0.0B, towitoko-2.0.4

    I cannot read a memorycard, i always get the message "Transaction failed"
    after calling SCardTransmit.
    Writing to the memorycard goes OK!

    If i use the test-program (ctapi) shipped with the towitoko-driver, reading
    and writing is possible.

    I spent already a lot of time trying to run pcsc with my towitoko-reader, but
    with
    less success. First I struggled with the protocol (SCARD_PROTOCOL_RAW or
    SCARD_PROTOCOL_ANY), now I am hanging with this problem.

    I hope the community can help me.
    Thanks in advance

    Andi

    - -------------------------------------
    #include <stdio.h>
    #include <pcsclite.h>
    #include <winscard.h>
    #include <stdlib.h>
    #include <string.h>

    #define REPEAT_TEST 1

    void printAPDU( char *buf, int len )
    {
      printf( "APDU =" );
      while( len > 0 ) {
        printf( " %02x", (unsigned char)(*buf) );
        buf++;
        len--;
      }
      printf( "\n" );
    }

    long SelectFile( SCARDHANDLE hCard, unsigned int fileid )
    {
      BYTE cmd_buffer[]= { 0x00, 0xa4, 0x00, 0x00, 0x02, 0x3f, 0x00 };
      BYTE rx_buffer[300];
      long rv;
      SCARD_IO_REQUEST pioRecvPci, pioSendPci;
      unsigned long dwRecvLength;

      printf("Selecting MF : ");

      cmd_buffer[5]= (unsigned char)(fileid >> 8);
      cmd_buffer[6]= (unsigned char)(fileid & 255);

      pioSendPci.dwProtocol = pioRecvPci.dwProtocol = SCARD_PROTOCOL_ANY;

      rv = SCardTransmit( hCard,
                          &pioSendPci, cmd_buffer, 7,
                          &pioRecvPci, rx_buffer, &dwRecvLength );

      printf("%s\n", pcsc_stringify_error(rv));

      if ( rv == SCARD_S_SUCCESS ) {
        printAPDU( rx_buffer, dwRecvLength );
      }

      return rv;
    }

    long WriteData( SCARDHANDLE hCard, unsigned int address, unsigned int size,
    unsigned char *data )
    {
      BYTE cmd_buffer[5+256];
      BYTE rx_buffer[300];
      long rv;
      SCARD_IO_REQUEST pioRecvPci, pioSendPci;
      unsigned long dwRecvLength;

      printf("Writing Data : ");

      cmd_buffer[0] = 0x00;
      cmd_buffer[1] = 0xd6;
      cmd_buffer[2] = (unsigned char) (address >> 8);
      cmd_buffer[3] = (unsigned char) (address & 0x00FF);
      cmd_buffer[4] = (unsigned char) (size % 256);

      memcpy( &cmd_buffer[5], data, size );

      pioSendPci.dwProtocol = SCARD_PROTOCOL_ANY;
      pioRecvPci.dwProtocol = SCARD_PROTOCOL_ANY;

      rv = SCardTransmit( hCard,
                          &pioSendPci, cmd_buffer, size+5,
                          &pioRecvPci, rx_buffer, &dwRecvLength );

      printf("%s\n", pcsc_stringify_error(rv));

      if ( rv == SCARD_S_SUCCESS ) {
        printAPDU( rx_buffer, dwRecvLength );
      }

      return rv;
    }

    long ReadData( SCARDHANDLE hCard, unsigned int address, unsigned int size,
    unsigned char *data )
    {
      BYTE cmd_buffer[5];
      BYTE rx_buffer[300];
      long rv;
      SCARD_IO_REQUEST pioRecvPci, pioSendPci;
      unsigned long dwRecvLength;

      printf("Reading Data : ");

      cmd_buffer[0] = 0x00;
      cmd_buffer[1] = 0xb0;
      cmd_buffer[2] = (unsigned char) (address >> 8);
      cmd_buffer[3] = (unsigned char) (address & 0x00ff);
      cmd_buffer[4] = (unsigned char) size;

      pioSendPci.dwProtocol = SCARD_PROTOCOL_ANY;
      pioRecvPci.dwProtocol = SCARD_PROTOCOL_ANY;

      rv = SCardTransmit( hCard,
                          &pioSendPci, cmd_buffer, 5,
                          &pioRecvPci, rx_buffer, &dwRecvLength );

      printf("%s\n", pcsc_stringify_error(rv));

      if ( rv == SCARD_S_SUCCESS ) {
    // memcpy( data, &rx_buffer[2], size );
        printAPDU( rx_buffer, dwRecvLength );
      }

      return rv;
    }

    int main( int argc, char **argv ) {
      SCARDHANDLE hCard;
      SCARDCONTEXT hContext;
      SCARD_READERSTATE_A rgReaderStates[1];
      SCARD_IO_REQUEST pioRecvPci, pioSendPci;
      unsigned long dwReaderLen, dwState, dwProt, dwAtrLen;
      unsigned long dwSendLength, dwRecvLength, dwPref, dwReaders, dwActiveProt;
      char *pcReaders, *mszReaders;
      unsigned char pbAtr[MAX_ATR_SIZE];
      const char * mszGroups;
      long rv;
      int i, p, iReader;
      int iList[16];
      BYTE pbRecvBuffer[300];
      BYTE pbSendBuffer[300];
      int address;
      int size;
      BYTE data[] = {1,2,3,4,5,6,7,8,9,12,11,12,13,14,15,16};
      int t = 0;

      while(1) {

      /*-----------*/
      printf("Testing SCardEstablishContext : ");
      rv = SCardEstablishContext( SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext );

      printf("%s\n", pcsc_stringify_error(rv));

      if ( rv != SCARD_S_SUCCESS ) {
        return -1;
      }

    /*-----------*/
      printf("Testing SCardConnect : ");
      rv = SCardConnect(hContext, "ChipDrive1 0 0",
                        SCARD_SHARE_SHARED,
                        SCARD_PROTOCOL_ANY,
                        &hCard, &dwActiveProt );

      if ( rv != SCARD_S_SUCCESS ) {
        SCardReleaseContext( hContext );
        return -1;
      }

      printf( "ActiveProt=%li\n",dwActiveProt );

    /*------------*/

      rv = SelectFile( hCard, 0x3f00 );
      if ( rv != SCARD_S_SUCCESS ) {
        SCardReleaseContext( hContext );
        return -1;
      }

      rv = WriteData( hCard, 0, 16, data );
      if ( rv != SCARD_S_SUCCESS ) {
        SCardReleaseContext( hContext );
        return -1;
      }

      rv = SelectFile( hCard, 0x3f00 );
      if ( rv != SCARD_S_SUCCESS ) {
        SCardReleaseContext( hContext );
        return -1;
      }

      rv = ReadData( hCard, 0, 16, data );
      if ( rv != SCARD_S_SUCCESS ) {
        SCardReleaseContext( hContext );
        return -1;
      }

    /*--------------*/

      printf("Testing SCardDisconnect : ");
      rv = SCardDisconnect( hCard, SCARD_UNPOWER_CARD );

      printf("%s\n", pcsc_stringify_error(rv));

      if ( rv != SCARD_S_SUCCESS ) {
        SCardReleaseContext( hContext );
        return -1;
      }

      printf("Waiting for card removing \n");
      rgReaderStates[0].dwCurrentState = SCARD_STATE_PRESENT;
      rv = SCardGetStatusChange( hContext, INFINITE, rgReaderStates, 1 );
      printf(" : %s\n", pcsc_stringify_error(rv));

      printf("Testing SCardReleaseContext : ");
      rv = SCardReleaseContext( hContext );

      printf("%s\n", pcsc_stringify_error(rv));

      if ( rv != SCARD_S_SUCCESS ) {
        return -1;
      }

      }

      printf("\n");
      printf("PC/SC Test Completed Successfully !\n");

      return 0;
    }

    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.0.5 (GNU/Linux)
    Comment: For info see http://www.gnupg.org

    iD8DBQE7u3TyLcUxFzy6sSoRAmHSAJ45eeKhNCk3ZUh8K2VTUSwyDxOZXACfcLTH
    l0Cw0UILO3lRhs18qk3cPTM=
    =ySUo
    -----END PGP SIGNATURE-----
    ***************************************************************
    Unix Smart Card Developers - M.U.S.C.L.E.
    (Movement for the Use of Smart Cards in a Linux Environment)
    http://www.linuxnet.com/
    To unsubscribe send an email to majordomolinuxnet.com with
    unsubscribe sclinux
    ***************************************************************