Blame tools/parser/sap.c

Packit 34410b
/*
Packit 34410b
 *
Packit 34410b
 *  BlueZ - Bluetooth protocol stack for Linux
Packit 34410b
 *
Packit 34410b
 *  Copyright (C) 2012  Tieto Poland
Packit 34410b
 *
Packit 34410b
 *
Packit 34410b
 *  This program is free software; you can redistribute it and/or modify
Packit 34410b
 *  it under the terms of the GNU General Public License as published by
Packit 34410b
 *  the Free Software Foundation; either version 2 of the License, or
Packit 34410b
 *  (at your option) any later version.
Packit 34410b
 *
Packit 34410b
 *  This program is distributed in the hope that it will be useful,
Packit 34410b
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 34410b
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 34410b
 *  GNU General Public License for more details.
Packit 34410b
 *
Packit 34410b
 *  You should have received a copy of the GNU General Public License
Packit 34410b
 *  along with this program; if not, write to the Free Software
Packit 34410b
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
Packit 34410b
 *
Packit 34410b
 */
Packit 34410b
Packit 34410b
#ifdef HAVE_CONFIG_H
Packit 34410b
#include <config.h>
Packit 34410b
#endif
Packit 34410b
Packit 34410b
#define _GNU_SOURCE
Packit 34410b
#include <stdio.h>
Packit 34410b
#include <errno.h>
Packit 34410b
#include <unistd.h>
Packit 34410b
#include <stdlib.h>
Packit 34410b
#include <string.h>
Packit 34410b
Packit 34410b
#include "parser.h"
Packit 34410b
Packit 34410b
#define PADDING4(x) ((4 - ((x) & 0x03)) & 0x03)
Packit 34410b
Packit 34410b
#define SAP_CONNECT_REQ				0x00
Packit 34410b
#define SAP_CONNECT_RESP			0x01
Packit 34410b
#define SAP_DISCONNECT_REQ			0x02
Packit 34410b
#define SAP_DISCONNECT_RESP			0x03
Packit 34410b
#define SAP_DISCONNECT_IND			0x04
Packit 34410b
#define SAP_TRANSFER_APDU_REQ			0x05
Packit 34410b
#define SAP_TRANSFER_APDU_RESP			0x06
Packit 34410b
#define SAP_TRANSFER_ATR_REQ			0x07
Packit 34410b
#define SAP_TRANSFER_ATR_RESP			0x08
Packit 34410b
#define SAP_POWER_SIM_OFF_REQ			0x09
Packit 34410b
#define SAP_POWER_SIM_OFF_RESP			0x0A
Packit 34410b
#define SAP_POWER_SIM_ON_REQ			0x0B
Packit 34410b
#define SAP_POWER_SIM_ON_RESP			0x0C
Packit 34410b
#define SAP_RESET_SIM_REQ			0x0D
Packit 34410b
#define SAP_RESET_SIM_RESP			0x0E
Packit 34410b
#define SAP_TRANSFER_CARD_READER_STATUS_REQ	0x0F
Packit 34410b
#define SAP_TRANSFER_CARD_READER_STATUS_RESP	0x10
Packit 34410b
#define SAP_STATUS_IND				0x11
Packit 34410b
#define SAP_ERROR_RESP				0x12
Packit 34410b
#define SAP_SET_TRANSPORT_PROTOCOL_REQ		0x13
Packit 34410b
#define SAP_SET_TRANSPORT_PROTOCOL_RESP		0x14
Packit 34410b
Packit 34410b
#define SAP_PARAM_ID_MAX_MSG_SIZE	0x00
Packit 34410b
#define SAP_PARAM_ID_CONN_STATUS	0x01
Packit 34410b
#define SAP_PARAM_ID_RESULT_CODE	0x02
Packit 34410b
#define SAP_PARAM_ID_DISCONNECT_IND	0x03
Packit 34410b
#define SAP_PARAM_ID_COMMAND_APDU	0x04
Packit 34410b
#define SAP_PARAM_ID_COMMAND_APDU7816	0x10
Packit 34410b
#define SAP_PARAM_ID_RESPONSE_APDU	0x05
Packit 34410b
#define SAP_PARAM_ID_ATR		0x06
Packit 34410b
#define SAP_PARAM_ID_CARD_READER_STATUS	0x07
Packit 34410b
#define SAP_PARAM_ID_STATUS_CHANGE	0x08
Packit 34410b
#define SAP_PARAM_ID_TRANSPORT_PROTOCOL	0x09
Packit 34410b
Packit 34410b
#define SAP_STATUS_OK				0x00
Packit 34410b
#define SAP_STATUS_CONNECTION_FAILED		0x01
Packit 34410b
#define SAP_STATUS_MAX_MSG_SIZE_NOT_SUPPORTED	0x02
Packit 34410b
#define SAP_STATUS_MAX_MSG_SIZE_TOO_SMALL	0x03
Packit 34410b
#define SAP_STATUS_OK_ONGOING_CALL		0x04
Packit 34410b
Packit 34410b
#define SAP_DISCONNECTION_TYPE_GRACEFUL		0x00
Packit 34410b
#define SAP_DISCONNECTION_TYPE_IMMEDIATE	0x01
Packit 34410b
#define SAP_DISCONNECTION_TYPE_CLIENT		0xFF
Packit 34410b
Packit 34410b
#define SAP_RESULT_OK			0x00
Packit 34410b
#define SAP_RESULT_ERROR_NO_REASON	0x01
Packit 34410b
#define SAP_RESULT_ERROR_NOT_ACCESSIBLE	0x02
Packit 34410b
#define SAP_RESULT_ERROR_POWERED_OFF	0x03
Packit 34410b
#define SAP_RESULT_ERROR_CARD_REMOVED	0x04
Packit 34410b
#define SAP_RESULT_ERROR_POWERED_ON	0x05
Packit 34410b
#define SAP_RESULT_ERROR_NO_DATA	0x06
Packit 34410b
#define SAP_RESULT_NOT_SUPPORTED	0x07
Packit 34410b
Packit 34410b
#define SAP_STATUS_CHANGE_UNKNOWN_ERROR		0x00
Packit 34410b
#define SAP_STATUS_CHANGE_CARD_RESET		0x01
Packit 34410b
#define SAP_STATUS_CHANGE_CARD_NOT_ACCESSIBLE	0x02
Packit 34410b
#define SAP_STATUS_CHANGE_CARD_REMOVED		0x03
Packit 34410b
#define SAP_STATUS_CHANGE_CARD_INSERTED		0x04
Packit 34410b
#define SAP_STATUS_CHANGE_CARD_RECOVERED	0x05
Packit 34410b
Packit 34410b
#define SAP_TRANSPORT_PROTOCOL_T0	0x00
Packit 34410b
#define SAP_TRANSPORT_PROTOCOL_T1	0x01
Packit 34410b
Packit 34410b
static const char *msg2str(uint8_t msg)
Packit 34410b
{
Packit 34410b
	switch (msg) {
Packit 34410b
	case SAP_CONNECT_REQ:
Packit 34410b
		return "Connect Req";
Packit 34410b
	case SAP_CONNECT_RESP:
Packit 34410b
		return "Connect Resp";
Packit 34410b
	case SAP_DISCONNECT_REQ:
Packit 34410b
		return "Disconnect Req";
Packit 34410b
	case SAP_DISCONNECT_RESP:
Packit 34410b
		return "Disconnect Resp";
Packit 34410b
	case SAP_DISCONNECT_IND:
Packit 34410b
		return "Disconnect Ind";
Packit 34410b
	case SAP_TRANSFER_APDU_REQ:
Packit 34410b
		return "Transfer APDU Req";
Packit 34410b
	case SAP_TRANSFER_APDU_RESP:
Packit 34410b
		return "Transfer APDU Resp";
Packit 34410b
	case SAP_TRANSFER_ATR_REQ:
Packit 34410b
		return "Transfer ATR Req";
Packit 34410b
	case SAP_TRANSFER_ATR_RESP:
Packit 34410b
		return "Transfer ATR Resp";
Packit 34410b
	case SAP_POWER_SIM_OFF_REQ:
Packit 34410b
		return "Power SIM Off Req";
Packit 34410b
	case SAP_POWER_SIM_OFF_RESP:
Packit 34410b
		return "Power SIM Off Resp";
Packit 34410b
	case SAP_POWER_SIM_ON_REQ:
Packit 34410b
		return "Power SIM On Req";
Packit 34410b
	case SAP_POWER_SIM_ON_RESP:
Packit 34410b
		return "Power SIM On Resp";
Packit 34410b
	case SAP_RESET_SIM_REQ:
Packit 34410b
		return "Reset SIM Req";
Packit 34410b
	case SAP_RESET_SIM_RESP:
Packit 34410b
		return "Reset SIM Resp";
Packit 34410b
	case SAP_TRANSFER_CARD_READER_STATUS_REQ:
Packit 34410b
		return "Transfer Card Reader Status Req";
Packit 34410b
	case SAP_TRANSFER_CARD_READER_STATUS_RESP:
Packit 34410b
		return "Transfer Card Reader Status Resp";
Packit 34410b
	case SAP_STATUS_IND:
Packit 34410b
		return "Status Ind";
Packit 34410b
	case SAP_ERROR_RESP:
Packit 34410b
		return "Error Resp";
Packit 34410b
	case SAP_SET_TRANSPORT_PROTOCOL_REQ:
Packit 34410b
		return "Set Transport Protocol Req";
Packit 34410b
	case SAP_SET_TRANSPORT_PROTOCOL_RESP:
Packit 34410b
		return "Set Transport Protocol Resp";
Packit 34410b
	default:
Packit 34410b
		return "Reserved";
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static const char *param2str(uint8_t param)
Packit 34410b
{
Packit 34410b
	switch (param) {
Packit 34410b
	case SAP_PARAM_ID_MAX_MSG_SIZE:
Packit 34410b
		return "MaxMsgSize";
Packit 34410b
	case SAP_PARAM_ID_CONN_STATUS:
Packit 34410b
		return "ConnectionStatus";
Packit 34410b
	case SAP_PARAM_ID_RESULT_CODE:
Packit 34410b
		return "ResultCode";
Packit 34410b
	case SAP_PARAM_ID_DISCONNECT_IND:
Packit 34410b
		return "DisconnectionType";
Packit 34410b
	case SAP_PARAM_ID_COMMAND_APDU:
Packit 34410b
		return "CommandAPDU";
Packit 34410b
	case SAP_PARAM_ID_COMMAND_APDU7816:
Packit 34410b
		return "CommandAPDU7816";
Packit 34410b
	case SAP_PARAM_ID_RESPONSE_APDU:
Packit 34410b
		return "ResponseAPDU";
Packit 34410b
	case SAP_PARAM_ID_ATR:
Packit 34410b
		return "ATR";
Packit 34410b
	case SAP_PARAM_ID_CARD_READER_STATUS:
Packit 34410b
		return "CardReaderStatus";
Packit 34410b
	case SAP_PARAM_ID_STATUS_CHANGE:
Packit 34410b
		return "StatusChange";
Packit 34410b
	case SAP_PARAM_ID_TRANSPORT_PROTOCOL:
Packit 34410b
		return "TransportProtocol";
Packit 34410b
	default:
Packit 34410b
		return "Reserved";
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static const char *status2str(uint8_t status)
Packit 34410b
{
Packit 34410b
	switch (status) {
Packit 34410b
	case  SAP_STATUS_OK:
Packit 34410b
		return "OK, Server can fulfill requirements";
Packit 34410b
	case  SAP_STATUS_CONNECTION_FAILED:
Packit 34410b
		return "Error, Server unable to establish connection";
Packit 34410b
	case  SAP_STATUS_MAX_MSG_SIZE_NOT_SUPPORTED:
Packit 34410b
		return "Error, Server does not support maximum message size";
Packit 34410b
	case  SAP_STATUS_MAX_MSG_SIZE_TOO_SMALL:
Packit 34410b
		return "Error, maximum message size by Client is too small";
Packit 34410b
	case  SAP_STATUS_OK_ONGOING_CALL:
Packit 34410b
		return "OK, ongoing call";
Packit 34410b
	default:
Packit 34410b
		return "Reserved";
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static const char *disctype2str(uint8_t disctype)
Packit 34410b
{
Packit 34410b
	switch (disctype) {
Packit 34410b
	case  SAP_DISCONNECTION_TYPE_GRACEFUL:
Packit 34410b
		return "Graceful";
Packit 34410b
	case  SAP_DISCONNECTION_TYPE_IMMEDIATE:
Packit 34410b
		return "Immediate";
Packit 34410b
	default:
Packit 34410b
		return "Reserved";
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static const char *result2str(uint8_t result)
Packit 34410b
{
Packit 34410b
	switch (result) {
Packit 34410b
	case  SAP_RESULT_OK:
Packit 34410b
		return "OK, request processed correctly";
Packit 34410b
	case  SAP_RESULT_ERROR_NO_REASON:
Packit 34410b
		return "Error, no reason defined";
Packit 34410b
	case SAP_RESULT_ERROR_NOT_ACCESSIBLE:
Packit 34410b
		return "Error, card not accessible";
Packit 34410b
	case  SAP_RESULT_ERROR_POWERED_OFF:
Packit 34410b
		return "Error, card (already) powered off";
Packit 34410b
	case  SAP_RESULT_ERROR_CARD_REMOVED:
Packit 34410b
		return "Error, card removed";
Packit 34410b
	case  SAP_RESULT_ERROR_POWERED_ON:
Packit 34410b
		return "Error, card already powered on";
Packit 34410b
	case  SAP_RESULT_ERROR_NO_DATA:
Packit 34410b
		return "Error, data not available";
Packit 34410b
	case  SAP_RESULT_NOT_SUPPORTED:
Packit 34410b
		return "Error, not supported";
Packit 34410b
	default:
Packit 34410b
		return "Reserved";
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static const char *statuschg2str(uint8_t statuschg)
Packit 34410b
{
Packit 34410b
	switch (statuschg) {
Packit 34410b
	case  SAP_STATUS_CHANGE_UNKNOWN_ERROR:
Packit 34410b
		return "Unknown Error";
Packit 34410b
	case  SAP_STATUS_CHANGE_CARD_RESET:
Packit 34410b
		return "Card reset";
Packit 34410b
	case  SAP_STATUS_CHANGE_CARD_NOT_ACCESSIBLE:
Packit 34410b
		return "Card not accessible";
Packit 34410b
	case  SAP_STATUS_CHANGE_CARD_REMOVED:
Packit 34410b
		return "Card removed";
Packit 34410b
	case  SAP_STATUS_CHANGE_CARD_INSERTED:
Packit 34410b
		return "Card inserted";
Packit 34410b
	case  SAP_STATUS_CHANGE_CARD_RECOVERED:
Packit 34410b
		return "Card recovered";
Packit 34410b
	default:
Packit 34410b
		return "Reserved";
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static const char *prot2str(uint8_t prot)
Packit 34410b
{
Packit 34410b
	switch (prot) {
Packit 34410b
	case SAP_TRANSPORT_PROTOCOL_T0:
Packit 34410b
		return "T=0";
Packit 34410b
	case SAP_TRANSPORT_PROTOCOL_T1:
Packit 34410b
		return "T=1";
Packit 34410b
	default:
Packit 34410b
		return "Reserved";
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static void parse_parameters(int level, struct frame *frm)
Packit 34410b
{
Packit 34410b
	uint8_t param;
Packit 34410b
	uint16_t len;
Packit 34410b
	uint8_t pv8;
Packit 34410b
Packit 34410b
	while (frm->len > 3) {
Packit 34410b
		p_indent(level, frm);
Packit 34410b
Packit 34410b
		param = p_get_u8(frm);
Packit 34410b
		p_get_u8(frm);
Packit 34410b
		len = p_get_u16(frm);
Packit 34410b
Packit 34410b
		printf("%s (0x%02x) len %d = ", param2str(param), param, len);
Packit 34410b
Packit 34410b
		switch (param) {
Packit 34410b
		case SAP_PARAM_ID_MAX_MSG_SIZE:
Packit 34410b
			printf("%d\n", p_get_u16(frm));
Packit 34410b
			break;
Packit 34410b
		case SAP_PARAM_ID_CONN_STATUS:
Packit 34410b
			pv8 = p_get_u8(frm);
Packit 34410b
			printf("0x%02x (%s)\n", pv8, status2str(pv8));
Packit 34410b
			break;
Packit 34410b
		case SAP_PARAM_ID_RESULT_CODE:
Packit 34410b
		case SAP_PARAM_ID_CARD_READER_STATUS:
Packit 34410b
			pv8 = p_get_u8(frm);
Packit 34410b
			printf("0x%02x (%s)\n", pv8, result2str(pv8));
Packit 34410b
			break;
Packit 34410b
		case SAP_PARAM_ID_DISCONNECT_IND:
Packit 34410b
			pv8 = p_get_u8(frm);
Packit 34410b
			printf("0x%02x (%s)\n", pv8, disctype2str(pv8));
Packit 34410b
			break;
Packit 34410b
		case SAP_PARAM_ID_STATUS_CHANGE:
Packit 34410b
			pv8 = p_get_u8(frm);
Packit 34410b
			printf("0x%02x (%s)\n", pv8, statuschg2str(pv8));
Packit 34410b
			break;
Packit 34410b
		case SAP_PARAM_ID_TRANSPORT_PROTOCOL:
Packit 34410b
			pv8 = p_get_u8(frm);
Packit 34410b
			printf("0x%02x (%s)\n", pv8, prot2str(pv8));
Packit 34410b
			break;
Packit 34410b
		default:
Packit 34410b
			printf("\n");
Packit 34410b
			raw_ndump(level + 1, frm, len);
Packit 34410b
			frm->ptr += len;
Packit 34410b
			frm->len -= len;
Packit 34410b
		}
Packit 34410b
Packit 34410b
		/* Skip padding */
Packit 34410b
		frm->ptr += PADDING4(len);
Packit 34410b
		frm->len -= PADDING4(len);
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
void sap_dump(int level, struct frame *frm)
Packit 34410b
{
Packit 34410b
	uint8_t msg, params;
Packit 34410b
Packit 34410b
	msg = p_get_u8(frm);
Packit 34410b
	params = p_get_u8(frm);
Packit 34410b
Packit 34410b
	/* Skip reserved field */
Packit 34410b
	p_get_u16(frm);
Packit 34410b
Packit 34410b
	p_indent(level, frm);
Packit 34410b
Packit 34410b
	printf("SAP: %s: params %d\n", msg2str(msg), params);
Packit 34410b
Packit 34410b
	parse_parameters(level, frm);
Packit 34410b
}