diff options
author | Harald Welte <laforge@osmocom.org> | 2019-11-22 11:18:37 +0100 |
---|---|---|
committer | Harald Welte <laforge@osmocom.org> | 2023-03-11 14:36:51 +0100 |
commit | 8fddbe2c1693581d095f9460b754c38769148bf6 (patch) | |
tree | 9de35493547f4d9f447d430ab0d61913d2bb651e /epan/dissectors/asn1/rspro | |
parent | a329db7dd289d125417d32a2c10379e6a04b99dc (diff) |
WIP: Osmocom RSPRO dissector support
The Osmocom RSPRO protocol is a protocol for remote SIM card access,
i.e. extending the SIM card interface between phone/mdoem (UE) and
a remote SIM card reader. The primary user of this protocol is
osmo-remsim software suite, which can be found at
https://osmocom.org/projects/osmo-remsim/wiki
RSPRO is specified in ASN.1 using BER and runs on top of the IPA
multiplex (protocol-gsm_ipa.c).
Change-Id: Ibcdb2c92281d05c36e3973de4d7ec4aa0cd9b207
Diffstat (limited to 'epan/dissectors/asn1/rspro')
-rw-r--r-- | epan/dissectors/asn1/rspro/CMakeLists.txt | 31 | ||||
-rw-r--r-- | epan/dissectors/asn1/rspro/RSPRO.asn | 347 | ||||
-rw-r--r-- | epan/dissectors/asn1/rspro/packet-rspro-template.c | 95 | ||||
-rw-r--r-- | epan/dissectors/asn1/rspro/packet-rspro-template.h | 16 | ||||
-rw-r--r-- | epan/dissectors/asn1/rspro/rspro.cnf | 28 |
5 files changed, 517 insertions, 0 deletions
diff --git a/epan/dissectors/asn1/rspro/CMakeLists.txt b/epan/dissectors/asn1/rspro/CMakeLists.txt new file mode 100644 index 0000000000..99316d5d92 --- /dev/null +++ b/epan/dissectors/asn1/rspro/CMakeLists.txt @@ -0,0 +1,31 @@ +# CMakeLists.txt +# +# Wireshark - Network traffic analyzer +# By Gerald Combs <gerald@wireshark.org> +# Copyright 1998 Gerald Combs +# +# SPDX-License-Identifier: GPL-2.0-or-later +# + +set( PROTOCOL_NAME rspro ) + +set( PROTO_OPT ) + +set( ASN_FILE_LIST + RSPRO.asn +) + +set( EXTRA_DIST + ${ASN_FILE_LIST} + packet-${PROTOCOL_NAME}-template.c + ${PROTOCOL_NAME}.cnf +) + +set( SRC_FILES + ${EXTRA_DIST} + ${EXT_ASN_FILE_LIST} +) + +set( A2W_FLAGS ) + +ASN2WRS() diff --git a/epan/dissectors/asn1/rspro/RSPRO.asn b/epan/dissectors/asn1/rspro/RSPRO.asn new file mode 100644 index 0000000000..6141c534a6 --- /dev/null +++ b/epan/dissectors/asn1/rspro/RSPRO.asn @@ -0,0 +1,347 @@ +---------------------------------------------------------------------- +-- RSPRO - Remote SIM Protocol, part of Osmocom Remote SIM Suite +-- (C) 2018 by Harald Welte <laforge@gnumonks.org> +-- All Rights Reserved +-- +-- SPDX-License-Identifier: GPL-2.0+ +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 2 of the License, or +-- (at your option) any later version. +-- +-- This program 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 General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License along +-- with this program; if not, write to the Free Software Foundation, Inc., +-- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +-- +---------------------------------------------------------------------- + +RSPRO DEFINITIONS + +IMPLICIT TAGS + +::= + +BEGIN + +EXPORTS + RsproPDU +; + +---------------------------------------------------------------------- +-- Elementary Data Types +---------------------------------------------------------------------- + +-- Some random ID the requestor can chose and which the client echos back in a response. +-- This allows multiple outstanding commands in flight and matching of responses to requests. +OperationTag ::= INTEGER(0..2147483647) + +-- Unique identifier of a given SIM bank +BankId ::= INTEGER(0..1023) + +-- Unique identifier of a given client (modem) +ClientId ::= INTEGER(0..1023) + +ComponentType ::= ENUMERATED { + -- client: Modems / Phones + remsimClient (0), + -- server: Coordination + remsimServer (1), + -- bank daemon: SIM cards + remsimBankd (2) +} +ComponentName ::= IA5String (SIZE (1..32)) +ComponentIdentity ::= SEQUENCE { + type ComponentType, + name ComponentName, + software [0] ComponentName, + swVersion [1] ComponentName, + hwManufacturer [2] ComponentName OPTIONAL, + hwModel [3] ComponentName OPTIONAL, + hwSerialNr [4] ComponentName OPTIONAL, + hwVersion [5] ComponentName OPTIONAL, + fwVersion [6] ComponentName OPTIONAL, + ... +} + +-- IP address / port details +Ipv4Address ::= OCTET STRING (SIZE (4)) +Ipv6Address ::= OCTET STRING (SIZE (16)) +IpAddress ::= CHOICE { + ipv4 [0] Ipv4Address, + ipv6 [1] Ipv6Address +} +PortNumber ::= INTEGER (0..65535) +IpPort ::= SEQUENCE { + ip IpAddress, + port PortNumber +} + +-- Result of a given operation +ResultCode ::= ENUMERATED { + ok (0), + -- client / bank / slot ID not accepted + illegalClientId (1), + illegalBankId (2), + illegalSlotId (3), + unsupportedProtocolVersion (4), + unknownSlotmap (5), + + -- no card is present in given slot + cardNotPresent (100), + -- card is present but unresponsive in given slot + cardUnresponsive (101), + -- unrecoverable transmission errors detected + cardTransmissionError (102), + ... +} + +ErrorCode ::= ENUMERATED { + -- Bankd or Server has received connection form unknown client (no mapping) + unknownClientConnected (1), + -- unexpected disconnect (typically bankd reports client disconnect) + unexpectedDisconnect (2), + unexpectedProtocolVersion (3), + ... +} + +ErrorString ::= IA5String (SIZE (1..255)) + +ErrorSeverity ::= ENUMERATED { + minor (1), + major (2), + fatal (3), + ... +} + +-- Slot number within a SIM bank or a client. +SlotNumber ::= INTEGER(0..1023) + +-- Slot identity on client (modem) side +ClientSlot ::= SEQUENCE { + clientId ClientId, + slotNr SlotNumber, + ... +} + +-- Slot identity on SIM bank side +BankSlot ::= SEQUENCE { + bankId BankId, + slotNr SlotNumber, + ... +} + +ATR ::= OCTET STRING (SIZE (1..55)) + +-- flags related to a TPDU in either of the two directions +TpduFlags ::= SEQUENCE { + -- indicates a TPDU header is present in this message + tpduHeaderPresent BOOLEAN, + -- indicates last part of transmission in this direction + finalPart BOOLEAN, + -- indicates a PB is present and we should continue with TX + procByteContinueTx BOOLEAN, + -- indicates a PB is present and we should continue with RX + procByteContinueRx BOOLEAN, + ... +} + +--- physical state of a given slot +SlotPhysStatus ::= SEQUENCE { + -- is RST activated by the modem? + resetActive [0] BOOLEAN, + -- is VCC applied by the modem? + vccPresent [1] BOOLEAN OPTIONAL, + -- is CLK applied by the modem? + clkActive [2] BOOLEAN OPTIONAL, -- not all hardware supports this + -- is card presence signalled to the modem? + cardPresent [3] BOOLEAN OPTIONAL, + ... +} + +---------------------------------------------------------------------- +-- Messages +---------------------------------------------------------------------- + + +-- BANKD->SERVER: SIM Bank connects to central server +ConnectBankReq ::= SEQUENCE { + -- identity of the bank that is connecting to the server + identity ComponentIdentity, + -- bank number, pre-configured on bank side + bankId BankId, + numberOfSlots SlotNumber, + ... +} +ConnectBankRes ::= SEQUENCE { + -- identity of the server to which the bank is connecting + identity ComponentIdentity, + result ResultCode, + ... +} + +-- CLIENT->SERVER or CLIENT->BANKD +ConnectClientReq ::= SEQUENCE { + -- identity of the client that is connecting to the server/bankd + identity ComponentIdentity, + clientSlot ClientSlot OPTIONAL, -- mandatory for CL->BANKD; CL->SERVER: old identity, if any + ... +} +ConnectClientRes ::= SEQUENCE { + -- identity of the bankd/server to which the client is connecting + identity ComponentIdentity, + result ResultCode, + ... +} + +-- SERVER->BANKD: create a mapping between a given Bank:Slot <-> Client:Slot +CreateMappingReq ::= SEQUENCE { + client ClientSlot, + bank BankSlot, + ... +} +CreateMappingRes ::= SEQUENCE { + result ResultCode, + ... +} + +-- SERVER->BANKD: remove a mapping between a given Bank:Slot <-> Client:Slot +RemoveMappingReq ::= SEQUENCE { + client ClientSlot, + bank BankSlot, + ... +} +RemoveMappingRes ::= SEQUENCE { + result ResultCode, + ... +} + +-- SERVER->CLIENT: set Client ID +ConfigClientIdReq ::= SEQUENCE { + -- server-allocated assignment of a client ID + clientSlot ClientSlot, + ... +} +ConfigClientIdRes ::= SEQUENCE { + result ResultCode, + ... +} + +-- SERVER->CLIENT: set BankId/Slot and IP/Port +ConfigClientBankReq ::= SEQUENCE { + -- server-allocated assignment of a client ID + bankSlot BankSlot, + -- bank to which the client shall connect + bankd IpPort, + ... +} +ConfigClientBankRes ::= SEQUENCE { + result ResultCode, + ... +} + + +-- BANKD->CLIENT: configure the ATR which the card emulator (client) shall send to the modem +SetAtrReq ::= SEQUENCE { + slot ClientSlot, + atr ATR, + ... +} +SetAtrRes ::= SEQUENCE { + result ResultCode, + ... +} + +-- CLIENT->BANKD: TPDU in Modem -> Card direction +TpduModemToCard ::= SEQUENCE { + -- we include fully-qualified bank and client slots for easier debugging + fromClientSlot ClientSlot, + toBankSlot BankSlot, + flags TpduFlags, + data OCTET STRING, + ... +} + +-- BANKD->CLIENT: TPDU in Card -> Modem direction +TpduCardToModem ::= SEQUENCE { + -- we include fully-qualified bank and client slots for easier debugging + fromBankSlot BankSlot, + toClientSlot ClientSlot, + flags TpduFlags, + data OCTET STRING, + ... +} + +-- CLIENT->BANKD: indciation about the current status of a client (modem side) +ClientSlotStatusInd ::= SEQUENCE { + fromClientSlot ClientSlot, + toBankSlot BankSlot, + slotPhysStatus SlotPhysStatus, + ... +} + +-- BANKD->CLIENT: indciation about the current status of a bank (modem side) +BankSlotStatusInd ::= SEQUENCE { + fromBankSlot BankSlot, + toClientSlot ClientSlot, + slotPhysStatus SlotPhysStatus, + ... +} + +-- *->SERVER: indication about some kind of error +ErrorInd ::= SEQUENCE { + -- whoever is detecting + sending us the error + sender ComponentType, + severity ErrorSeverity, + code ErrorCode, + -- any bank-side slot that's affected + bankSlot [0] BankSlot OPTIONAL, + -- any client-side slot that's affected + clientSlot [1] ClientSlot OPTIONAL, + -- any additional textual information + errorString [2] ErrorString OPTIONAL, + ... +} + + +---------------------------------------------------------------------- +-- PDU +---------------------------------------------------------------------- + +RsproPDUchoice ::= CHOICE { + -- configuration + management + connectBankReq [0] ConnectBankReq, + connectBankRes [1] ConnectBankRes, + connectClientReq [2] ConnectClientReq, + connectClientRes [3] ConnectClientRes, + createMappingReq [4] CreateMappingReq, + createMappingRes [5] CreateMappingRes, + removeMappingReq [6] RemoveMappingReq, + removeMappingRes [7] RemoveMappingRes, + configClientIdReq [8] ConfigClientIdReq, + configClientIdRes [9] ConfigClientIdRes, + configClientBankReq [17] ConfigClientBankReq, + configClientBankRes [18] ConfigClientBankRes, + errorInd [16] ErrorInd, + -- APDUs etc. + setAtrReq [10] SetAtrReq, + setAtrRes [11] SetAtrRes, + tpduModemToCard [12] TpduModemToCard, + tpduCardToModem [13] TpduCardToModem, + clientSlotStatusInd [14] ClientSlotStatusInd, + bankSlotStatusInd [15] BankSlotStatusInd, + ... +} + +RsproPDU ::= SEQUENCE { + version [0] INTEGER(0..32), + tag [1] OperationTag, + msg [2] RsproPDUchoice +} + +END diff --git a/epan/dissectors/asn1/rspro/packet-rspro-template.c b/epan/dissectors/asn1/rspro/packet-rspro-template.c new file mode 100644 index 0000000000..24e655e181 --- /dev/null +++ b/epan/dissectors/asn1/rspro/packet-rspro-template.c @@ -0,0 +1,95 @@ +/* packet-rspro.c + * Routines for RSPRO (Remote SIM Protocol) packet dissection + * (C) 2019 by Harald Welte <laforge@gnumonks.org> + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <glib.h> +#include <epan/packet.h> +#include <epan/conversation.h> + +#include <stdio.h> +#include <string.h> + +#include "packet-ber.h" +#include "packet-rspro.h" + +#define PNAME "Remote SIM Protocol" +#define PSNAME "RSPRO" +#define PFNAME "rspro" +#define IPAC_PROTO_EXT_RSPRO 0x07 +static dissector_handle_t rspro_handle=NULL; + +void proto_reg_handoff_rspro(void); +void proto_register_rspro(void); + +/* Initialize the protocol and registered fields */ +static int proto_rspro = -1; + +#include "packet-rspro-hf.c" + +/* Initialize the subtree pointers */ +static int ett_rspro = -1; + +#include "packet-rspro-ett.c" + +#include "packet-rspro-fn.c" + + +static int +dissect_rspro(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) +{ + proto_item *rspro_item = NULL; + proto_tree *rspro_tree = NULL; + + /* make entry in the Protocol column on summary display */ + col_set_str(pinfo->cinfo, COL_PROTOCOL, PNAME); + + /* create the rspro protocol tree */ + if (tree) { + rspro_item = proto_tree_add_item(tree, proto_rspro, tvb, 0, -1, FALSE); + rspro_tree = proto_item_add_subtree(rspro_item, ett_rspro); + + dissect_RsproPDU_PDU(tvb, pinfo, rspro_tree, data); + } + + return tvb_captured_length(tvb); +} + +/*--- proto_register_rspro -------------------------------------------*/ +void proto_register_rspro(void) { + /* List of fields */ + static hf_register_info hf[] = { +#include "packet-rspro-hfarr.c" + }; + + /* List of subtrees */ + static gint *ett[] = { + &ett_rspro, +#include "packet-rspro-ettarr.c" + }; + + /* Register protocol */ + proto_rspro = proto_register_protocol(PNAME, PSNAME, PFNAME); + /* Register fields and subtrees */ + proto_register_field_array(proto_rspro, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); +} + + +/*--- proto_reg_handoff_rspro ---------------------------------------*/ +void +proto_reg_handoff_rspro(void) +{ + rspro_handle = create_dissector_handle(dissect_rspro, proto_rspro); + dissector_add_uint_with_preference("ipa.osmo.protocol", IPAC_PROTO_EXT_RSPRO, rspro_handle); +} diff --git a/epan/dissectors/asn1/rspro/packet-rspro-template.h b/epan/dissectors/asn1/rspro/packet-rspro-template.h new file mode 100644 index 0000000000..7b6f185218 --- /dev/null +++ b/epan/dissectors/asn1/rspro/packet-rspro-template.h @@ -0,0 +1,16 @@ +/* packet-rspro.h + * Routines for RSPRO (remote SIM protocol) packet dissection + * (C) 2019 by Harald Welte <laforge@gnumonks.org> + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef PACKET_RSPRO_H +#define PACKET_RSPRO_H + + +#endif /* PACKET_RSPRO_H */ diff --git a/epan/dissectors/asn1/rspro/rspro.cnf b/epan/dissectors/asn1/rspro/rspro.cnf new file mode 100644 index 0000000000..60ea648a81 --- /dev/null +++ b/epan/dissectors/asn1/rspro/rspro.cnf @@ -0,0 +1,28 @@ +# rspro.cnf +# rspro conformation file +# Copyright 2019 Harald Welte + +#.OPT +BER +#.END + +#.MODULE_IMPORT + +#.EXPORTS + +#.PDU +RsproPDU + +#.NO_EMIT + +#.TYPE_RENAME + +#.FIELD_RENAME + +#.FN_HDR RsproPDUchoice + gint choice_index; +#.FN_BODY RsproPDUchoice VAL_PTR = &choice_index + %(DEFAULT_BODY)s + col_append_str(actx->pinfo->cinfo, COL_INFO, val_to_str(choice_index, rspro_RsproPDUchoice_vals, "Unknown (%%u)")); + +#.END |