示例#1
0
void* sockio_test_client(void *arg)
{
  struct sockaddr_in addr;
  char buf[1024];
  int port = 8081;
  int sock, ret;
  FILE *server;
  (void) arg;

  
  // make sure the server is initialized first.  
  // FIXME: cleaner to use a condition var
  thread_usleep(500); 

  output("    client - getting socket\n");
  checkreturn( ((sock = socket(PF_INET, SOCK_STREAM, 0)) == -1), "socket");
  output("    client - got socket\n");

  addr.sin_family      = AF_INET;
  addr.sin_addr.s_addr = INADDR_ANY;
  addr.sin_port        = htons(port);
  output("    client - connecting to server\n");
  checkreturn( ((connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)), "connect");
  output("    client - connection establised\n");

  output("    client - reading\n");
  checkreturn( ((server = fdopen(sock,"r+")) == NULL), "fdopen");
  checkreturn( (ret = fgets(buf, sizeof(buf), server) == NULL), "fgets");
  output("    client - got %d bytes - '%s'\n",ret,buf);

  return NULL;
}
示例#2
0
void* sockio_test_server(void *arg)
{
  struct sockaddr_in sar;
  struct sockaddr_in peer_addr;
  int opt = 1;
  socklen_t optlen = sizeof(opt);
  socklen_t peer_len;
  int sr;
  int port = 8081;
  int sock;
  FILE *client;
  (void) arg;
  
  output("    server - creating socket\n");
  checkreturn( ((sock = socket(PF_INET, SOCK_STREAM, 0)) == -1), "socket");
  setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&opt,optlen);
  output("    server - socket created\n");

  // bind
  sar.sin_family      = AF_INET;
  sar.sin_addr.s_addr = INADDR_ANY;
  sar.sin_port        = htons(port);
  output("    server - calling bind\n");
  checkreturn( (bind(sock, (struct sockaddr *)&sar, sizeof(struct sockaddr_in)) == -1), "bind");
  output("    server - bind succeeded\n");
  
  // start listening on the socket with a queue of 10
  output("    server - calling listen\n");
  checkreturn( (listen(sock, 100) == -1), "listen");
  output("    server - listening on port %d\n", port);

  // accept next connection
  peer_len = sizeof(peer_addr);
  output("    server - waiting for connection\n");
  checkreturn( ((sr = accept(sock, (struct sockaddr *)&peer_addr, &peer_len)) == -1), "accept");
  output("    server - connection established (fd: %d, ip: %s, port: %d)\n",
         sr, inet_ntoa(peer_addr.sin_addr), ntohs(peer_addr.sin_port));

  close(sock);

  // mini session
  checkreturn( ((client = fdopen(sr,"a+")) == NULL), "fdopen");

  output("    server - writing data\n");
  fprintf(client, "hello to you, client!");
  fclose(client);
  close(sr);
  output("    server - data written\n");

  return NULL;
}
示例#3
0
int main( int argc, char *argv[] )
{
	SC_READER_INFO *ri;
	SC_CARD_INFO *ci;
	SC_READER_CONFIG rc;

	int ret;
	int i;
	BYTE buffer[255];
	BYTE rbuffer[256];
	int resplen;

	BYTE acond[4];
	BYTE akeys[3];
	/* Transport key for Aladdin CC4 */
	/* BYTE authkey[]={0x2C,0x15,0xE5,0x26,0xE9,0x3E,0x8A,0x19}; */
	/* Transport key for Schlumberger Cryptoflex */
	BYTE authkey[]={0x47,0x46,0x58,0x49,0x32,0x56,0x78,0x40};

	BYTE pinfile[]={0x01,0xFF,0xFF,0x12,0x34,0x56,0x78,0xFF,0xFF,0xFF,0xFF,
		0x01,0x01,0xAA,0xBB,0xCC,0xDD,0xFF,0xFF,0xFF,0xFF,0x01,0x01};
	BYTE oldpin[]={0x12,0x34,0x56,0x78,0xFF,0xFF,0xFF,0xFF};
	BYTE unblockpin[]={0xAA,0xBB,0xCC,0xDD,0xFF,0xFF,0xFF,0xFF};
	BYTE newpin[]={0x9A,0xBC,0xDE,0x01,0xFF,0xFF,0xFF,0xFF};

	BYTE p1[]={0x6F,0x36,0x32,0x5E,0xA9,0xC0,0xE1,0x0D,0x4F,0x3C,0xC6,
	0x22,0x0C,0xE1,0x86,0xF0,0x09,0xA3,0x07,0x76,0x7B,0x0A,0x44,0xF8,
	0x69,0xF1,0xCA,0x8B,0xAC,0x97,0xEB,0xF3,0xCB,0x02,0x89,0x6B,0xA5,
	0x61,0x80,0xD8,0x20,0x86,0x80,0xA4,0x11,0xAE,0xED,0x9E,0x3D,0x20,
	0x23,0x67,0xFD,0x4A,0x5F,0x45,0x2A,0x9B,0xC3,0x51,0x00,0xC3,0xE2,
	0xBC};
	BYTE q1[]={0x6B,0x60,0xCF,0x47,0x5B,0xBB,0x4E,0xC8,0x51,0x01,0x4B,
	0x2E,0x39,0xAD,0xD4,0xF2,0xF4,0x58,0x43,0x78,0xD1,0xAC,0x35,0x9F,
	0xEB,0x71,0x5B,0x87,0x7F,0x7F,0x49,0x42,0xFD,0x95,0x4B,0x68,0x2B,
	0xF0,0xC1,0x3C,0x3A,0x75,0xDE,0x4F,0x1C,0xA3,0xB8,0x6D,0x9F,0x62,
	0x81,0x20,0x78,0x19,0xD3,0xEC,0x4E,0x9F,0x3E,0x80,0x08,0x16,0xFA,
	0xB8};
	BYTE a1[]={0x2A,0x32,0x26,0xA4,0x73,0x12,0x72,0xB2,0x50,0x7D,0x09,
	0xE1,0xD6,0xE5,0x0C,0xF6,0x22,0x39,0x04,0x6F,0xFD,0xE8,0xA3,0x0A,
	0xDF,0xEC,0xC2,0x53,0xC3,0x89,0xBD,0x38,0xD5,0xDB,0xE5,0xE4,0x17,
	0x1A,0x81,0x7E,0xEF,0x29,0xAE,0xF8,0xB1,0x91,0xF9,0xA4,0xEA,0x50,
	0xBB,0xD0,0x9B,0x03,0x3E,0x47,0xEC,0x96,0x46,0x30,0xDB,0xE6,0x5A,
	0x99};
	BYTE c1[]={0x53,0x78,0x82,0x50,0x39,0x42,0x74,0x8E,0x25,0x88,0x87,
	0x56,0x48,0x5F,0x74,0xBF,0xB3,0xBC,0xE6,0x0B,0x0C,0x7E,0x9C,0xC3,
	0xB2,0x88,0x9E,0x16,0xDF,0x0E,0xA1,0xD2,0x20,0x0A,0xE0,0x2B,0xBB,
	0x1B,0xAA,0xFB,0xED,0xF8,0x61,0xDE,0xE8,0xF6,0x25,0xCE,0xA6,0x32,
	0x9E,0x3F,0x35,0x7C,0x4A,0x7F,0x74,0x94,0x57,0x9F,0x5D,0x98,0xB2,
	0x3D};
	BYTE f1[]={0xB3,0x59,0x6A,0x12,0x53,0x58,0x26,0x9C,0x42,0xBE,0xEB,
	0x15,0xCE,0x84,0xFF,0x8D,0x52,0xD1,0x51,0x03,0x84,0x08,0x95,0x04,
	0xFE,0x2A,0x9F,0x0C,0x89,0xF8,0x0A,0xE5,0xC5,0x4F,0xFB,0x81,0xD6,
	0x92,0xBB,0x0F,0x5F,0x5F,0xD0,0xBF,0x7C,0x77,0xF7,0xF5,0x8A,0xF6,
	0x0E,0x82,0xCF,0x2D,0x34,0xC5,0x17,0x66,0xD4,0x31,0x37,0x04,0x1F,
	0x4A};
#ifdef WITH_FGMP
#endif /* WITH_FGMP */

#ifdef WITH_DES
	BYTE intauth[]={0xFF,0x08,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
		0xFF,0xFF,0x00};
	BYTE ext3auth[]={0xFF,0x10,0x02,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
		0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x03,0x03,0x10,0x02,
		0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,
		0x0E,0x0F,0x10,0x03,0x03,0x00};
	BYTE int3auth[]={0xFF,0x10,0x02,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
		0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0xFF,0xFF,0x00};

	BYTE refkey[]={0x47,0x46,0x58,0x49,0x32,0x56,0x78,0x40};
	BYTE challenge[]={0x64,0x46,0x27,0xE0,0x07,0x9D,0xD8,0x6C};
	BYTE result[]={0x0D,0x31,0xA8,0xF3,0x1C,0xEF};
	BYTE mac[8];
#endif /* WITH_DES */

	if( scInit() ) { printf("Exit.\n"); return(1); }

	rc.type=READER_TYPE;
	rc.slot=READER_SLOT;
	rc.param=READER_PORT;

	ret = scReaderGetConfig( argc, argv, &rc );
	if( ret!=SC_EXIT_OK ) {
		printf( "Error getting reader configuration.\n" );
		scEnd();
		return(1);
	};

	ri = scGeneralNewReader( rc.type, rc.slot );
	if( ri==NULL ) { printf("Exit.\n"); scEnd(); return(1); };

	ci = scGeneralNewCard( );
	if( ci==NULL ) { printf("Exit.\n"); scEnd(); return(1); };

	/* Init Reader */
	ret = scReaderInit( ri, rc.param );
	checkreturn("Error: scReaderInit\n");

	/* Activate Card */
	ret = scReaderActivate( ri );
	checkreturn("Error: scReaderActivate\n");

	/* Get Card Status */
	ret = scReaderCardStatus( ri );
	checkreturn("Error: scReader\n");
	if( !(ri->status&SC_CARD_STATUS_PRESENT) )
	{ printf("Error: No Card.\n"); goto exit; }

	/* Reset Card */
	ret= scReaderResetCard( ri, ci );
	checkreturn("Error: scReaderResetCard\n");

	/* Get Card Type */
	ret = scSmartcardGetCardType( ci );
	checkreturn("Error: scReaderGetCardType\n");
	if( (ci->type&0xFFFFFF00)!=SC_CARD_CRYPTOFLEX )
	{ printf("Error: Wrong Card.\n"); goto exit; }

#if 0
	SIO_SetLogFile( ri->si, "LogCflex.txt" );
#endif

/* Select */

	/* Select MF */
	printf("scCryptoflexCmdSelectFile:");
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x3F00, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }
	printarray( "  rsp:", resplen, rbuffer );

/* Verify Key */

	/* Verify transport key */
	printf("scCryptoflexCmdVerifyKey:");
	ret = scCryptoflexCmdVerifyKey( ri, ci, 1, authkey, 8 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

/* Dir */

	/* Dir */
	printf("scCryptoflexCmdDirectory:");
	ret = scCryptoflexCmdDirectory( ri, ci, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }
	printarray( "  rsp:", resplen, rbuffer );

	/* Delete directory file 2000 */
	ret = scCryptoflexCmdDeleteFile( ri, ci, 0x2000 );
	if(ret!=0) { printf(" Error deleting 2000.\n"); goto exit; }

/* Create */

	/* Create Directory 2000 */
	acond[0]=0xFF; acond[1]=0x4F; acond[2]=0x44; acond[3]=0x44;
	akeys[0]=0x1F; akeys[1]=0x11; akeys[2]=0x11;
	printf("scCryptoflexCmdCreateFile(Directory File):");
	ret = scCryptoflexCmdCreateFile( ri, ci, 0x2000,
		600, SC_CRYPTOFLEX_FILE_DIRECTORY, 0x00, SC_CRYPTOFLEX_UNBLOCKED,
		0, 0, acond, akeys );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Select DF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x2000, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }
	printarray( "  rsp:", resplen, rbuffer );

/* Create fixed-record files 2001 */

	/* Create fixed-record file 2001 */
	acond[0]=0x3F; acond[1]=0x44; acond[2]=0xF4; acond[3]=0x44;
	akeys[0]=0x11; akeys[1]=0xF1; akeys[2]=0x11;
	printf("scCryptoflexCmdCreateFile(Fixed-Record File):");
	ret = scCryptoflexCmdCreateFile( ri, ci, 0x2001,
		36, SC_CRYPTOFLEX_FILE_FIXED, 0x00, SC_CRYPTOFLEX_UNBLOCKED,
		6, 5, acond, akeys );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Select EF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x2001, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }
	printarray( "  rsp:", resplen, rbuffer );

/* Update Record */

	/* Update Record */
	printf("scCryptoflexCmdUpdateRecord:");
	ret = scCryptoflexCmdUpdateRecord( ri, ci, 0, 0, "Kleo  ", 6 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }
	ret = scCryptoflexCmdUpdateRecord( ri, ci, 0, 2, "Sonja ", 6 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }
	ret = scCryptoflexCmdUpdateRecord( ri, ci, 0, 2, "Madam ", 6 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }
	ret = scCryptoflexCmdUpdateRecord( ri, ci, 0, 2, "Isabel", 6 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }
	ret = scCryptoflexCmdUpdateRecord( ri, ci, 0, 2, "Gina  ", 6 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

/* Create Record */

	/* Create Record */
	printf("scCryptoflexCmdCreateRecord:");
	ret = scCryptoflexCmdCreateRecord( ri, ci, "Valeri", 6 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

/* Seek */

	/* Seek */
	printf("scCryptoflexCmdSeek:");
	ret = scCryptoflexCmdSeek( ri, ci, 0, 0, "M", 1 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

/* Read Record */

	/* Read Record */
	printf("scCryptoflexCmdReadRecord");
	resplen=6;
	ret = scCryptoflexCmdReadRecord( ri, ci, 0, 4, buffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }
	printarray( "  rsp:", resplen, buffer );

	/* Select DF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x2000, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

/* Create transparent file */

	/* Create transparent file 0000 */
	acond[0]=0x3F; acond[1]=0x44; acond[2]=0xFF; acond[3]=0x44;
	akeys[0]=0x11; akeys[1]=0xFF; akeys[2]=0x11;
	printf("scCryptoflexCmdCreateFile(Transparent File):");
	ret = scCryptoflexCmdCreateFile( ri, ci, 0x0000,
		23, SC_CRYPTOFLEX_FILE_TRANSPARENT, 0x00, SC_CRYPTOFLEX_UNBLOCKED,
		0, 0, acond, akeys );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Select EF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x0000, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }
	printarray( "  rsp:", resplen, rbuffer );

/* Update Binary */

	/* Write PIN */
	resplen=0x17;
	printf("scCryptoflexCmdUpdateBinary:");
	ret = scCryptoflexCmdUpdateBinary( ri, ci, 0, pinfile, resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

/* Verify PIN */

	/* Verify PIN */
	printf("scCryptoflexCmdVerifyPIN:");
	ret = scCryptoflexCmdVerifyPIN( ri, ci, 1, oldpin );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

#ifdef WITH_DES

/* Update Enciphered */

	/* Update Enciphered */
	printf("scCryptoflexCmdUpdateEnc:");
	ret = scCryptoflexCmdUpdateEnc( ri, ci, 0, pinfile, 16, authkey,
		SC_CRYPTOFLEX_ALGO_DES );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

#endif /* WITH_DES */

/* Change PIN */

	/* Change PIN */
	printf("scCryptoflexCmdChangePIN:");
	ret = scCryptoflexCmdChangePIN( ri, ci, 1, oldpin, newpin );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Verify PIN */
	printf("scCryptoflexCmdVerifyPIN:");
	ret = scCryptoflexCmdVerifyPIN( ri, ci, 1, newpin );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Verify PIN */
	printf("scCryptoflexCmdVerifyPIN(should fail):");
	ret = scCryptoflexCmdVerifyPIN( ri, ci, 1, oldpin );
	if( (ret==0) && (ci->sw[0]==0x69) && (ci->sw[1]==0x83) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Verify PIN */
	printf("scCryptoflexCmdVerifyPIN(should fail too):");
	ret = scCryptoflexCmdVerifyPIN( ri, ci, 1, newpin );
	if( (ret==0) && (ci->sw[0]==0x69) && (ci->sw[1]==0x83) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

/* Unblock PIN */

	/* Unblock PIN */
	printf("scCryptoflexCmdUnblockPIN:");
	ret = scCryptoflexCmdUnblockPIN( ri, ci, 1, unblockpin, oldpin );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Verify PIN */
	printf("scCryptoflexCmdVerifyPIN:");
	ret = scCryptoflexCmdVerifyPIN( ri, ci, 1, oldpin );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

/* Read Binary */

	/* Read Binary */
	resplen=8;
	printf("scCryptoflexCmdReadBinary:");
	ret = scCryptoflexCmdReadBinary( ri, ci, 3, buffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }
	printarray( "  rsp:", 8, buffer );

	/* Select DF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x2000, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

/* Create cyclic file */

	/* Create cyclic file */
	acond[0]=0xFF; acond[1]=0x44; acond[2]=0x44; acond[3]=0x44;
	akeys[0]=0x11; akeys[1]=0x11; akeys[2]=0x11;
	printf("scCryptoflexCmdCreateFile(Cyclic File):");
	ret = scCryptoflexCmdCreateFile( ri, ci, 0x2003,
		12, SC_CRYPTOFLEX_FILE_CYCLIC, 0x00, SC_CRYPTOFLEX_UNBLOCKED,
		3, 4, acond, akeys );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Select EF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x2003, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }
	printarray( "  rsp:", resplen, rbuffer );

/* Increase */

	/* Increase */
	buffer[0]=0x01;buffer[1]=0x23;buffer[2]=0x45;
	printf("scCryptoflexCmdIncrease:");
	ret = scCryptoflexCmdIncrease( ri, ci, buffer, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }
	printarray( "  rsp:", resplen, rbuffer );

/* Decrease */

	/* Decrease */
	buffer[0]=0x01;buffer[1]=0x12;buffer[2]=0x34;
	printf("scCryptoflexCmdDecrease:");
	ret = scCryptoflexCmdDecrease( ri, ci, buffer, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }
	printarray( "  rsp:", resplen, rbuffer );

/* Invalidate */

	/* Invalidate */
	printf("scCryptoflexCmdInvalidate:");
	ret = scCryptoflexCmdInvalidate( ri, ci );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Increase */
	buffer[0]=0x01;buffer[1]=0x23;buffer[2]=0x45;
	printf("scCryptoflexCmdIncrease(Should fail):");
	ret = scCryptoflexCmdIncrease( ri, ci, buffer, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x62) && (ci->sw[1]==0x83) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

/* Rehabilitate */

	/* Rehabilitate */
	printf("scCryptoflexCmdRehabilitate:");
	ret = scCryptoflexCmdRehabilitate( ri, ci );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Increase */
	buffer[0]=0x01;buffer[1]=0x23;buffer[2]=0x45;
	printf("scCryptoflexCmdIncrease:");
	ret = scCryptoflexCmdIncrease( ri, ci, buffer, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }
	printarray( "  rsp:", resplen, rbuffer );

	/* Select DF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x2000, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Create transparent file 0001 */
	acond[0]=0x3F; acond[1]=0xF4; acond[2]=0xFF; acond[3]=0x44;
	akeys[0]=0x11; akeys[1]=0xFF; akeys[2]=0x11;
	ret = scCryptoflexCmdCreateFile( ri, ci, 0x0001,
		14, SC_CRYPTOFLEX_FILE_TRANSPARENT, 0x00, SC_CRYPTOFLEX_UNBLOCKED,
		0, 0, acond, akeys );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

#ifdef WITH_DES
	/* Select EF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x0001, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Write IntAuth */
	resplen=14;
	ret = scCryptoflexCmdUpdateBinary( ri, ci, 0, intauth, resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

/* Int Auth */

	/* Int Auth */
	mac[0]=0x00;mac[1]=0x01;mac[2]=0x02;mac[3]=0x03;
	mac[4]=0x04;mac[5]=0x05;mac[6]=0x06;mac[7]=0x07;
	printf("scCryptoflexCmdIntAuth:");
	ret = scCryptoflexCmdIntAuth( ri, ci, 0, mac, intauth+3,
		SC_CRYPTOFLEX_ALGO_DES );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	if( ci->type!=SC_CARD_CRYPTOFLEX ) {
/* Des Crypt */

		/* Des Crypt */
		memset( buffer, 0x33, 8 );
		printf("scCryptoflexCmdDesCrypt(Enc):");
		ret = scCryptoflexCmdDesCrypt( ri, ci, 0, SC_CRYPTOFLEX_MODE_ENCRYPT,
			buffer, rbuffer, &resplen );
		if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
		{ printf(" OK\n"); } else
		{ printf(" Error.\n"); goto exit; }
		printarray( "  rsp:", resplen, rbuffer );
   
		/* Des Crypt */
		memcpy( buffer, rbuffer, 8 );
		printf("scCryptoflexCmdDesCrypt(Dec):");
		ret = scCryptoflexCmdDesCrypt( ri, ci, 0, SC_CRYPTOFLEX_MODE_DECRYPT,
			buffer, rbuffer, &resplen );
		if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
		{ printf(" OK\n"); } else
		{ printf(" Error.\n"); goto exit; }
		printarray( "  rsp:", resplen, rbuffer );
	}

#endif /* WITH_DES */

	/* Select DF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x2000, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

/* Delete */

	/* Delete file */
	printf("scCryptoflexCmdDeleteFile:");
	ret = scCryptoflexCmdDeleteFile( ri, ci, 0x0001 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Delete transparent file 2003 */
	ret = scCryptoflexCmdDeleteFile( ri, ci, 0x2003 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

#ifdef WITH_DES

	/* Verify PIN */
	printf("scCryptoflexCmdVerifyPIN:");
	ret = scCryptoflexCmdVerifyPIN( ri, ci, 1, oldpin );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Create transparent file 0001 */
	acond[0]=0x3F; acond[1]=0xF4; acond[2]=0xFF; acond[3]=0x44;
	akeys[0]=0x11; akeys[1]=0xFF; akeys[2]=0x11;
	ret = scCryptoflexCmdCreateFile( ri, ci, 0x0001,
		22, SC_CRYPTOFLEX_FILE_TRANSPARENT, 0x00, SC_CRYPTOFLEX_UNBLOCKED,
		0, 0, acond, akeys );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Select EF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x0001, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Write Int3Auth */
	resplen=22;
	ret = scCryptoflexCmdUpdateBinary( ri, ci, 0, int3auth, resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

/* Int Auth */

	/* Int Auth */
	mac[0]=0x00;mac[1]=0x01;mac[2]=0x02;mac[3]=0x03;
	mac[4]=0x04;mac[5]=0x05;mac[6]=0x06;mac[7]=0x07;
	printf("scCryptoflexCmdIntAuth(3DES):");
	ret = scCryptoflexCmdIntAuth( ri, ci, 0, mac, int3auth+3,
		SC_CRYPTOFLEX_ALGO_3DES );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	if( ci->type!=SC_CARD_CRYPTOFLEX ) {
/* Des Crypt */

		/* Des Crypt */
		memset( buffer, 0x33, 8 );
		printf("scCryptoflexCmdDesCrypt(Enc):");
		ret = scCryptoflexCmdDesCrypt( ri, ci, 0, SC_CRYPTOFLEX_MODE_ENCRYPT,
			buffer, rbuffer, &resplen );
		if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
		{ printf(" OK\n"); } else
		{ printf(" Error.\n"); goto exit; }
		printarray( "  rsp:", resplen, rbuffer );
   
		/* Des Crypt */
		memcpy( buffer, rbuffer, 8 );
		printf("scCryptoflexCmdDesCrypt(Dec):");
		ret = scCryptoflexCmdDesCrypt( ri, ci, 0, SC_CRYPTOFLEX_MODE_DECRYPT,
			buffer, rbuffer, &resplen );
		if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
		{ printf(" OK\n"); } else
		{ printf(" Error.\n"); goto exit; }
		printarray( "  rsp:", resplen, rbuffer );
	}

	/* Select DF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x2000, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Delete file */
	ret = scCryptoflexCmdDeleteFile( ri, ci, 0x0001 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Create transparent file 0011 */
	acond[0]=0x3F; acond[1]=0xF4; acond[2]=0xFF; acond[3]=0x44;
	akeys[0]=0x11; akeys[1]=0xFF; akeys[2]=0x11;
	ret = scCryptoflexCmdCreateFile( ri, ci, 0x0011,
		42, SC_CRYPTOFLEX_FILE_TRANSPARENT, 0x00, SC_CRYPTOFLEX_UNBLOCKED,
		0, 0, acond, akeys );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Select EF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x0011, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Write Ext3Auth */
	resplen=42;
	ret = scCryptoflexCmdUpdateBinary( ri, ci, 0, ext3auth, resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

/* 3DES Verify */

	/* Verify transport key */
	printf("scCryptoflexCmdVerifyKey(3DES):");
	ret = scCryptoflexCmdVerifyKey( ri, ci, 1, ext3auth+23, 16 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Get Challenge */
	resplen=8;
	ret = scCryptoflexCmdGetChall( ri, ci, buffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

/* 3DES ExtAuth */

	/* External Authenticate */
	printf("scCryptoflexCmdExtAuth(3DES):");
	ret = scCryptoflexCmdExtAuth( ri, ci, 1, ext3auth+23, buffer,
		SC_CRYPTOFLEX_ALGO_3DES );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Select EF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x0000, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

#if 0
	/* Select MF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x2000, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Verify transport key */
	ret = scCryptoflexCmdVerifyKey( ri, ci, 1, ext3auth+23, 16 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Create transparent file 2004 */
	acond[0]=0x3F; acond[1]=0x33; acond[2]=0xFF; acond[3]=0x33;
	akeys[0]=0x11; akeys[1]=0xFF; akeys[2]=0x11;
	ret = scCryptoflexCmdCreateFile( ri, ci, 0x2004,
		23, SC_CRYPTOFLEX_FILE_TRANSPARENT, 0x00, SC_CRYPTOFLEX_UNBLOCKED,
		0, 0, acond, akeys );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Select EF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x2004, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Get Challenge */
	resplen=8;
	ret = scCryptoflexCmdGetChall( ri, ci, mac, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

/* Update Binary */

	/* Write PIN */
	printf("scCryptoflexCmdUpdateBinaryMAC(3DES):");
	ret = scCryptoflexCmdUpdateBinaryMAC( ri, ci, 0, pinfile, 1,
		(ext3auth+23), mac, SC_CRYPTOFLEX_ALGO_3DES );
printf("ret: %d: %.2X%.2X\n",ret,ci->sw[0],ci->sw[1]);
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }
#endif /* 0 */

/**********************/

	/* Select DF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x2000, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Verify transport key */
	ret = scCryptoflexCmdVerifyKey( ri, ci, 1, ext3auth+23, 16 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Verify PIN */
	ret = scCryptoflexCmdVerifyPIN( ri, ci, 1, oldpin );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Create transparent file 0012 */
	acond[0]=0x3F; acond[1]=0xF4; acond[2]=0xFF; acond[3]=0x44;
	akeys[0]=0x11; akeys[1]=0xFF; akeys[2]=0x11;
	ret = scCryptoflexCmdCreateFile( ri, ci, 0x0012,
		326, SC_CRYPTOFLEX_FILE_TRANSPARENT, 0x00, SC_CRYPTOFLEX_UNBLOCKED,
		0, 0, acond, akeys );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Select EF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x0012, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Write Secret Key File */
	ret = scCryptoflexCmdUpdateBinary( ri, ci, 0, "\x01\x43\x01", 3 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

/* Update Enciphered */

	/* Update Enciphered */
	printf("scCryptoflexCmdUpdateEnc(3DES - not!):");
	ret = scCryptoflexCmdUpdateEnc( ri, ci, 3, p1, 64, ext3auth+23,
		SC_CRYPTOFLEX_ALGO_DES );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

#if 0
	ret = scCryptoflexCmdUpdateBinary( ri, ci, 3, p1, 64 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }
#endif /* 0 */

	ret = scCryptoflexCmdUpdateBinary( ri, ci, 3+64, q1, 64 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	ret = scCryptoflexCmdUpdateBinary( ri, ci, 3+128, a1, 64 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	ret = scCryptoflexCmdUpdateBinary( ri, ci, 3+128+64, c1, 64 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	ret = scCryptoflexCmdUpdateBinary( ri, ci, 3+256, f1, 64 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	ret = scCryptoflexCmdUpdateBinary( ri, ci, 3+256+64, "\x00\x00\x00", 3 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

/* RSA Sign */
	/* RSA Sign */
	memset( buffer, 0x6A, sizeof(buffer) );
	printf("scCryptoflexCmdRsaSign:");
	ret = scCryptoflexCmdRsaSign( ri, ci, 0x00, buffer, rbuffer,
		&resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }
	printarray( "  rsp:", resplen, rbuffer );
	printf("  should be: B6 DA 2A 3A 13 75 25 1F ...\n");

#endif /* WITH_DES */

	/* Select MF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x3F00, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Verify transport key */
	ret = scCryptoflexCmdVerifyKey( ri, ci, 1, authkey, 8 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Delete DF 2000 */
	ret = scCryptoflexCmdDeleteFile( ri, ci, 0x2000 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

#ifdef WITH_DES

	/* Test MAC commands */

	printf("scCryptoflexGenerateAuth:");
	scCryptoflexGenerateAuth( refkey, challenge, mac,
		SC_CRYPTOFLEX_ALGO_DES );
	if( memcmp( mac, result, 6 ) ) { printf(" Error\n"); goto exit; }
	printf(" OK\n");

	/* Reset Card */
	printf("scReaderResetCard:");
	ret= scReaderResetCard( ri, ci );
	if( ret!=0 ) { printf(" Error.\n"); goto exit; }
	printf(" OK.\n");

	/* Get Challenge */
	printf("scCryptoflexCmdGetChall:");
	resplen=8;
	ret = scCryptoflexCmdGetChall( ri, ci, buffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }
	printarray( "  rsp:", 8, buffer );

	/* External Authenticate */
	printf("scCryptoflexCmdExtAuth:");
	ret = scCryptoflexCmdExtAuth( ri, ci, 0x01, authkey, buffer,
		SC_CRYPTOFLEX_ALGO_DES );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Verify transport key */
	/* Just in case to prevent blocking of key */
	ret = scCryptoflexCmdVerifyKey( ri, ci, 1, authkey, 8 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Create Directory 2000 */
	acond[0]=0xFF; acond[1]=0x3F; acond[2]=0x33; acond[3]=0x33;
	akeys[0]=0x1F; akeys[1]=0x11; akeys[2]=0x11;
	ret = scCryptoflexCmdCreateFile( ri, ci, 0x2000,
		200, SC_CRYPTOFLEX_FILE_DIRECTORY, 0x00, SC_CRYPTOFLEX_UNBLOCKED,
		0, 0, acond, akeys );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Reset Card */
	printf("scReaderResetCard:");
	ret= scReaderResetCard( ri, ci );
	if( ret!=0 ) { printf(" Error.\n"); goto exit; }
	printf(" OK.\n");

	/* Select DF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x2000, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Get Challenge */
	resplen=8;
	ret = scCryptoflexCmdGetChall( ri, ci, mac, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

/* Create fixed-record file 2001 */

	/* Create fixed-record file 2001 */
	acond[0]=0x3F; acond[1]=0x33; acond[2]=0xF3; acond[3]=0x33;
	akeys[0]=0x11; akeys[1]=0xF1; akeys[2]=0x11;
	printf("scCryptoflexCmdCreateFileMAC(Fixed-Record File):");
	ret = scCryptoflexCmdCreateFileMAC( ri, ci, 0x2001,
		36, SC_CRYPTOFLEX_FILE_FIXED, 0x00, SC_CRYPTOFLEX_UNBLOCKED,
		6, 5, acond, akeys, authkey, mac, SC_CRYPTOFLEX_ALGO_DES );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Select EF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x2001, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }
	printarray( "  rsp:", resplen, rbuffer );

	/* Get Challenge */
	resplen=8;
	ret = scCryptoflexCmdGetChall( ri, ci, mac, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

/* Update Record */

	/* Update Record */
	printf("scCryptoflexCmdUpdateRecordMAC:");
	ret = scCryptoflexCmdUpdateRecordMAC( ri, ci, 0, 0, "Kleo  ", 6,
		authkey, mac, SC_CRYPTOFLEX_ALGO_DES );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Get Challenge */
	resplen=8;
	ret = scCryptoflexCmdGetChall( ri, ci, mac, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

/* Create Record */

	/* Create Record */
	printf("scCryptoflexCmdCreateRecordMAC:");
	ret = scCryptoflexCmdCreateRecordMAC( ri, ci, "Valeri", 6,
		authkey, mac, SC_CRYPTOFLEX_ALGO_DES );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Select DF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x2000, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Get Challenge */
	resplen=8;
	ret = scCryptoflexCmdGetChall( ri, ci, mac, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

/* Create transparent file */

	/* Create transparent file 0000 */
	acond[0]=0x3F; acond[1]=0x33; acond[2]=0xFF; acond[3]=0x33;
	akeys[0]=0x11; akeys[1]=0xFF; akeys[2]=0x11;
	printf("scCryptoflexCmdCreateFileMAC(Transparent File):");
	ret = scCryptoflexCmdCreateFileMAC( ri, ci, 0x0000,
		23, SC_CRYPTOFLEX_FILE_TRANSPARENT, 0x00, SC_CRYPTOFLEX_UNBLOCKED,
		0, 0, acond, akeys, authkey, mac, SC_CRYPTOFLEX_ALGO_DES );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Select EF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x0000, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }
	printarray( "  rsp:", resplen, rbuffer );

	/* Get Challenge */
	resplen=8;
	ret = scCryptoflexCmdGetChall( ri, ci, mac, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

/* Update Binary */

	/* Write PIN */
	resplen=13;
	printf("scCryptoflexCmdUpdateBinaryMAC:");
	ret = scCryptoflexCmdUpdateBinaryMAC( ri, ci, 0, pinfile, resplen,
		authkey, mac, SC_CRYPTOFLEX_ALGO_DES );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Get Challenge */
	resplen=8;
	ret = scCryptoflexCmdGetChall( ri, ci, mac, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Write PIN */
	resplen=10;
	ret = scCryptoflexCmdUpdateBinaryMAC( ri, ci, 13, pinfile, resplen,
		authkey, mac, SC_CRYPTOFLEX_ALGO_DES );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Select DF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x2000, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Get Challenge */
	resplen=8;
	ret = scCryptoflexCmdGetChall( ri, ci, mac, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

/* Create cyclic file */

	/* Create cyclic file */
	acond[0]=0xFF; acond[1]=0x33; acond[2]=0x33; acond[3]=0x33;
	akeys[0]=0x11; akeys[1]=0x11; akeys[2]=0x11;
	printf("scCryptoflexCmdCreateFileMAC(Cyclic File):");
	ret = scCryptoflexCmdCreateFileMAC( ri, ci, 0x2003,
		12, SC_CRYPTOFLEX_FILE_CYCLIC, 0x00, SC_CRYPTOFLEX_UNBLOCKED,
		3, 4, acond, akeys, authkey, mac, SC_CRYPTOFLEX_ALGO_DES );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Select EF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x2003, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }
	printarray( "  rsp:", resplen, rbuffer );

	/* Get Challenge */
	resplen=8;
	ret = scCryptoflexCmdGetChall( ri, ci, mac, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

/* Increase */

	/* Increase */
	buffer[0]=0x01;buffer[1]=0x23;buffer[2]=0x45;
	printf("scCryptoflexCmdIncreaseMAC:");
	ret = scCryptoflexCmdIncreaseMAC( ri, ci, buffer, authkey, mac,
		SC_CRYPTOFLEX_ALGO_DES, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }
	printarray( "  rsp:", resplen, rbuffer );

	/* Get Challenge */
	resplen=8;
	ret = scCryptoflexCmdGetChall( ri, ci, mac, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

/* Decrease */

	/* Decrease */
	buffer[0]=0x01;buffer[1]=0x12;buffer[2]=0x34;
	printf("scCryptoflexCmdDecreaseMAC:");
	ret = scCryptoflexCmdDecreaseMAC( ri, ci, buffer, authkey, mac,
		SC_CRYPTOFLEX_ALGO_DES, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }
	printarray( "  rsp:", resplen, rbuffer );

	/* Get Challenge */
	resplen=8;
	ret = scCryptoflexCmdGetChall( ri, ci, mac, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

/* Invalidate */

	/* Invalidate */
	printf("scCryptoflexCmdInvalidateMAC:");
	ret = scCryptoflexCmdInvalidateMAC( ri, ci, authkey, mac,
		SC_CRYPTOFLEX_ALGO_DES );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Get Challenge */
	resplen=8;
	ret = scCryptoflexCmdGetChall( ri, ci, mac, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Increase */
	buffer[0]=0x01;buffer[1]=0x23;buffer[2]=0x45;
	printf("scCryptoflexCmdIncreaseMAC(Should fail):");
	ret = scCryptoflexCmdIncreaseMAC( ri, ci, buffer, authkey, mac,
		SC_CRYPTOFLEX_ALGO_DES, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x62) && (ci->sw[1]==0x83) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Get Challenge */
	resplen=8;
	ret = scCryptoflexCmdGetChall( ri, ci, mac, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

/* Rehabilitate */

	/* Rehabilitate */
	printf("scCryptoflexCmdRehabilitateMAC:");
	ret = scCryptoflexCmdRehabilitateMAC( ri, ci, authkey, mac,
		SC_CRYPTOFLEX_ALGO_DES );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Get Challenge */
	resplen=8;
	ret = scCryptoflexCmdGetChall( ri, ci, mac, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Increase */
	buffer[0]=0x01;buffer[1]=0x23;buffer[2]=0x45;
	printf("scCryptoflexCmdIncreaseMAC:");
	ret = scCryptoflexCmdIncreaseMAC( ri, ci, buffer, authkey, mac,
		SC_CRYPTOFLEX_ALGO_DES, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }
	printarray( "  rsp:", resplen, rbuffer );

	/* Select DF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x2000, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Get Challenge */
	resplen=8;
	ret = scCryptoflexCmdGetChall( ri, ci, mac, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

/* Delete */

	/* Delete file */
	printf("scCryptoflexCmdDeleteFileMAC:");
	ret = scCryptoflexCmdDeleteFileMAC( ri, ci, 0x2003, authkey, mac,
		SC_CRYPTOFLEX_ALGO_DES );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ printf(" OK\n"); } else
	{ printf(" Error.\n"); goto exit; }

	/* Get Challenge */
	resplen=8;
	ret = scCryptoflexCmdGetChall( ri, ci, mac, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Delete transparent file 0000 */
	ret = scCryptoflexCmdDeleteFileMAC( ri, ci, 0x0000, authkey, mac,
		SC_CRYPTOFLEX_ALGO_DES );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Get Challenge */
	resplen=8;
	ret = scCryptoflexCmdGetChall( ri, ci, mac, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Delete transparent file */
	ret = scCryptoflexCmdDeleteFileMAC( ri, ci, 0x2001, authkey, mac,
		SC_CRYPTOFLEX_ALGO_DES );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Select MF */
	ret = scCryptoflexCmdSelectFile( ri, ci, 0x3F00, rbuffer, &resplen );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Verify transport key */
	ret = scCryptoflexCmdVerifyKey( ri, ci, 1, authkey, 8 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

	/* Delete DF 2000 */
	ret = scCryptoflexCmdDeleteFile( ri, ci, 0x2000 );
	if( (ret==0) && (ci->sw[0]==0x90) && (ci->sw[1]==0x00) )
	{ } else
	{ printf(" Error.\n"); goto exit; }

#endif /* WITH_DES */

exit:
    printf("ret: %d, SW: %.2X%.2X\n",ret,ci->sw[0],ci->sw[1]);

	ret = scReaderDeactivate( ri );
	if( ret!=0 ) printf("Error: scReaderDeactivate\n");

	ret = scReaderShutdown( ri );
	if( ret!=0 ) printf("Error: scReaderShutdown\n");

	scGeneralFreeCard( &ci );
	scGeneralFreeReader( &ri );

	scEnd();

	return(0);
}