/*
    apdu.h
    Definitions for ISO 7816-4 Application Layer PDU's handling

    This file is part of the Unix driver for Towitoko smartcard readers
    Copyright (C) 2000 2001 Carlos Prados <cprados@yahoo.com>

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

#ifndef _APDU_
#define _APDU_

#include "defines.h"

/*
 * Exported constants definiton 
 */

/* Return codes */
#define APDU_OK			0	/* Parsing of APDU OK */
#define APDU_MALFORMED		5	/* Malformed APDU */

/* Types of APDU's */
#define APDU_CASE_1	0x0001	/* Nor send neither receive data */
#define APDU_CASE_2S	0x0002	/* Receive data (1..256) */
#define APDU_CASE_3S	0x0003	/* Send data (1..255) */
#define APDU_CASE_4S	0x0004	/* Send data (1..255) and receive data (1..256) */
#define APDU_CASE_2E	0x0102	/* Receive data (1..65536) */
#define APDU_CASE_3E	0x0103	/* Send data (1..65535) */
#define APDU_CASE_4E	0x0104	/* Send data (1..65535) and receive data (1..65536) */

/* Maximum sizes of buffers */
#define APDU_MAX_CMD_SIZE 	65545	/* Max command size */
#define APDU_MAX_RSP_SIZE 	65538	/* Max response size */

/*
 * Exported macros definition 
 */
#define APDU_CASE_IS_EXTENDED(c)	(((c) & 0x0100) == 0x0100)

/*
 * Exported data types definition
 */

/* Command APDU */
typedef struct
{
  BYTE *command;
  unsigned long length;
}
APDU_Cmd;

/* Response APDU */
typedef struct
{
  BYTE *response;
  unsigned long length;
}
APDU_Rsp;

/* 
 * Exported functions declaration
 */

/* Create a APDU_Cmd */
extern APDU_Cmd *APDU_Cmd_New (BYTE * data, unsigned long length);

/* Delete a APDU_Cmd */
extern void APDU_Cmd_Delete (APDU_Cmd * apdu);

/* Return the case of command */
extern int APDU_Cmd_Case (APDU_Cmd * apdu);

/* Return class of command */
extern BYTE APDU_Cmd_Cla (APDU_Cmd * apdu);

/* Return command instruction */
extern BYTE APDU_Cmd_Ins (APDU_Cmd * apdu);

/* Return first paramenter of command */
extern BYTE APDU_Cmd_P1 (APDU_Cmd * apdu);

/* Return second parameter of command */
extern BYTE APDU_Cmd_P2 (APDU_Cmd * apdu);

/* Return length of data sent */
extern unsigned long APDU_Cmd_Lc (APDU_Cmd * apdu);

/* Return length of data expected */
extern unsigned long APDU_Cmd_Le (APDU_Cmd * apdu);

/* Return TRUE if the command requires all data available */
extern bool APDU_Cmd_Le_Available (APDU_Cmd * apdu);

/* Return a pointer to the header of the command */
extern BYTE *APDU_Cmd_Header (APDU_Cmd * apdu);

/* Return a pointer  to the data of the comamnd */
extern BYTE *APDU_Cmd_Data (APDU_Cmd * apdu);

/* Return a pointer to the whole command */
extern BYTE *APDU_Cmd_Raw (APDU_Cmd * apdu);

/* Return the length of the whole command */
extern unsigned long APDU_Cmd_RawLen (APDU_Cmd * apdu);

/* Create a APDU_Rsp */
extern APDU_Rsp *APDU_Rsp_New (BYTE * data, unsigned long length);

/* Delete a APDU_Rsp */
extern void APDU_Rsp_Delete (APDU_Rsp * apdu);

/* Return fitst status byte */
extern BYTE APDU_Rsp_SW1 (APDU_Rsp * apdu);

/* Return second status byte */
extern BYTE APDU_Rsp_SW2 (APDU_Rsp * apdu);

/* Return length of the data of the response */
extern unsigned long APDU_Rsp_DataLen (APDU_Rsp * apdu);

/* Return a pointer to the data of the response */
extern BYTE *APDU_Rsp_Data (APDU_Rsp * apdu);

/* Return a pointer to the whole response */
extern BYTE *APDU_Rsp_Raw (APDU_Rsp * apdu);

/* Return the length of the whole response */
extern unsigned long APDU_Rsp_RawLen (APDU_Rsp * apdu);

/* Truncate size of response APDU */
extern void APDU_Rsp_TruncateData (APDU_Rsp * apdu, unsigned long length);

/* Adds one APDU at the end of the data bytes of an APDU */
extern int APDU_Rsp_AppendData (APDU_Rsp * apdu1, APDU_Rsp * apdu2);

#endif



syntax highlighted by Code2HTML, v. 0.9.1