Add CCID_Types containing definitions relevant to USB CCID

This commit is contained in:
Harald Welte 2019-01-13 23:30:15 +01:00
parent 8bdc776047
commit afed7910bf
1 changed files with 452 additions and 0 deletions

452
src/CCID_Types.ttcn Normal file
View File

@ -0,0 +1,452 @@
module CCID_Types {
import from General_Types all;
import from Osmocom_Types all;
/* TTCN-3 data types with TITAN RAW codec annotations for USB CCID
* "Universal Serial Bus - Device Class: Smart Cad - CCID - Specification
* for Integrated Circuit(s) Cards Interface Devices,
* Revision 1.1, April 22nd, 2005"
*
* (C) 2018 by Harald Welte <laforge@gnumonks.org>
*/
/***********************************************************************
* CCID Class Descriptor, See section 5.1, Table 5.1-1
***********************************************************************/
type record CCID_VoltageSupport {
BIT5 RFU,
boolean voltage_1v8,
boolean voltage_3v0,
boolean voltage_5v0
};
type record CCID_Protocols {
BIT30 RFU,
boolean protocol_t1,
boolean protocol_t0
};
type record CCID_SynchProtocols {
BIT29 RFU,
boolean protocol_i2c,
boolean protocol_3wire,
boolean protocol_2wire
};
type record CCID_Mechanical {
BIT28 RFU,
boolean card_lock_unlock,
boolean card_capture,
boolean card_ejection,
boolean card_accept
};
type enumerated CCID_Level {
CCID_LEVEL_CHARACTER (0),
CCID_LEVEL_TPDU (1),
CCID_LEVEL_SHORT_APDU (2),
CCID_LEVEL_SHORT_AND_EXTD_APDU (3)
} with { variant "FIELDLENGTH(3)" };
type record CCID_Features {
BIT13 RFU,
CCID_Level level,
BIT5 RFU2,
boolean automatic_ifsd_t1,
boolean nad_other_than_00_t1,
boolean icc_clock_stop,
boolean automatic_pps_active_pars,
boolean automatic_params,
boolean automatic_baud_active_pars,
boolean automatic_clock,
boolean automatic_voltage,
boolean automatic_activation,
boolean automatic_pars_atr,
BIT1 RFU3
};
type record CCID_ClassDescriptor {
uint8_t bLength,
uint8_t bDescriptorType,
HEX4n bcdCCID,
uint8_t bMaxSlotIndex,
CCID_VoltageSupport bVoltageSupport,
CCID_Protocols dwProtocools,
uint32_t dwDefaultClock,
uint32_t dwMaximumClock,
uint8_t bNumClockSupported,
uint32_t dwDataRate,
uint32_t dwMaxDataRate,
uint8_t bNumDataRatesSupported,
uint32_t dwMaxIFSD,
CCID_Mechanical dwMechanical,
CCID_Features dwFeatures,
uint32_t dwMaxCCIDMessageLength,
uint8_t bClassGetResponse,
uint8_t bClassEnvelope,
uint16_t wLcdLayout,
uint8_t bPINSupport,
uint8_t bMaxCCIDBusySlots
};
/***********************************************************************
* Bulk IN
***********************************************************************/
/* Section 6.1.1 */
type enumerated CCID_PowerSelect {
CCID_PWRSEL_AUTO ('00'H),
CCID_PWRSEL_5V0 ('01'H),
CCID_PWRSEL_3V0 ('02'H),
CCID_PWRSEL_1V8 ('03'H)
} with { variant "FIELDLENGTH(8)" };
/* Section 6.1.1 */
type record CCID_PC_to_RDR_IccPowerOn {
CCID_PowerSelect bPowerSlect,
OCT2 abRFU
};
/* Section 6.1.2 */
type record CCID_PC_to_RDR_IccPowerOff {
OCT3 abRFU
};
/* Section 6.1.3 */
type record CCID_PC_to_RDR_GetSlotStatus {
OCT3 abRFU
};
/* Section 6.1.4 */
type record CCID_PC_to_RDR_XfrBlock {
uint8_t bBWI,
uint16_t wLevelParameter,
octetstring abData
};
/* Section 6.1.5 */
type record CCID_PC_to_RDR_GetParameters {
OCT3 abRFU
};
/* Section 6.1.6 */
type record CCID_PC_to_RDR_ResetParameters {
OCT3 abRFU
};
/* Section 6.1.7 */
type enumerated CCID_ClockStop {
STOPPING_NOT_ALLOWED ('00'H),
STOP_WITH_CLK_LOW ('01'H),
STOP_WITH_CLK_HIGH ('02'H),
STOP_WITH_CLK_EITHER ('03'H)
} with { variant "FIELDLENGTH(8)" };
type record CCID_ProtocolData_T0 {
uint4_t Findex,
uint4_t Dindex,
BIT6 bRFU,
boolean inv_convention,
BIT1 bRFU2,
uint8_t bGuardTimeT0,
uint8_t bWaitingIntegerT0,
CCID_ClockStop bClockStop
};
type record CCID_ProtocolData_T1 {
uint4_t Findex,
uint4_t Dindex,
BIT6 bMagic, /* '000100'B */
boolean inv_convention,
boolean csum_crc, /* LRC otherwise */
uint8_t bGuardTimeT1,
CCID_ClockStop bClockStop
};
type union CCID_ProtocolData {
CCID_ProtocolData_T0 T0,
CCID_ProtocolData_T1 T1
};
type record CCID_PC_to_RDR_SetParameters {
OCT2 abRFU,
CCID_ProtocolData abProtocolData
};
/* Section 6.1.8 */
type record CCID_PC_to_RDR_Escape {
OCT3 abRFU,
octetstring abData
};
/* Section 6.1.9 */
type enumerated CCID_ClockCommand {
CCID_CLOCK_CMD_RESTART ('00'H),
CCID_CLOCK_CMD_STOP ('01'H)
} with { variant "FIELDLENGTH(8)" };
type record CCID_PC_to_RDR_IccClock {
CCID_ClockCommand bClockCommand,
OCT2 abRFU
};
/* Section 6.1.10 */
type record CCID_PC_to_RDR_T0APDU {
uint8_t bmChanges,
uint8_t bClassGetResponse,
uint8_t bClassEnvelope
};
/* Section 6.1.11 */
type record CCID_PC_to_RDR_Secure {
uint8_t bBWI,
uint16_t wLevelParameter,
octetstring abData
};
/* Section 6.1.12 */
type enumerated CCID_MechanicalFunction {
CCID_MECH_FN_ACCEPT_CARD ('01'H),
CCID_MECH_FN_EJECT_CARD ('02'H),
CCID_MECH_FN_CAPTURE_CARD ('03'H),
CCID_MECH_FN_LOCK_CARD ('04'H),
CCID_MECH_FN_UNLOCK_CARD ('05'H)
} with { variant "FIELDLENGTH(8)" };
type record CCID_PC_to_RDR_Mechanical {
CCID_MechanicalFunction bFunction,
OCT2 abRFU
};
/* Section 6.1.13 */
type record CCID_PC_to_RDR_Abort {
OCT3 abRFU
};
/* Section 6.1.14 */
type record CCID_PC_to_RDR_SetRateAndClock {
OCT3 abRFU,
uint32_t dwClockFrequency,
uint32_t dwDataRate
};
/***********************************************************************
* Bulk OUT
***********************************************************************/
/* Section 6.2.1 */
type record CCID_RDR_to_PC_DataBlock {
uint8_t bChainParameter,
octetstring abData
};
/* Section 6.2.2 */
type enumerated CCID_ClockStatus {
CCID_CLOCK_STATUS_RUNNING ('00'H),
CCID_CLOCK_STATUS_STOPPED_L ('01'H),
CCID_CLOCK_STATUS_STOPPED_H ('02'H),
CCID_CLOCK_STATUS_STOPPED_UNKN ('03'H)
} with { variant "FIELDLENGTH(8)" };
type record CCID_RDR_to_PC_SlotStatus {
CCID_ClockStatus bClockStatus
};
/* Section 6.2.3 */
type record CCID_RDR_to_PC_Parameters {
CCID_ProtocolData abProtocolData
};
/* Section 6.2.4 */
type record CCID_RDR_to_PC_Escape {
OCT1 bRFU,
octetstring abData
};
/* Section 6.2.5 */
type record CCID_RDR_to_PC_DataRateAndClock {
OCT1 bRFU,
uint32_t dwClockAndFrequency,
uint32_t dwDataRate
};
/* Section 6.2.6 */
// FIXME
/***********************************************************************
* Interrupt IN
***********************************************************************/
/* Section 6.3.1 */
type record CCID_RDR_to_PC_NotifySlotChange {
bitstring bmSlotCCState
};
/* Section 6.3.2 */
type record CCID_HardwareErrorCode {
BIT7 bRFU,
boolean overcurrent
};
type record CCID_RDR_to_PC_HardwareError {
CCID_HardwareErrorCode bHardwareErrorCode
};
/***********************************************************************
* Stitching it together
***********************************************************************/
type enumerated CCID_MsgType {
/* Section 6.1 */
PC_to_RDR_IccPowerOn ('62'H),
PC_to_RDR_IccPowerOff ('63'H),
PC_to_RDR_GetSlotStatus ('65'H),
PC_to_RDR_XfrBlock ('6f'H),
PC_to_RDR_GetParameters ('6c'H),
PC_to_RDR_ResetParameters ('6d'H),
PC_to_RDR_SetParameters ('61'H),
PC_to_RDR_Escape ('6B'H),
PC_to_RDR_IccClock ('6E'H),
PC_to_RDR_T0APDU ('6A'H),
PC_to_RDR_Secure ('69'H),
PC_to_RDR_Mechanical ('71'H),
PC_to_RDR_Abort ('72'H),
PC_to_RDR_SetRateAndClock ('73'H),
/* Section 6.2 */
RDR_to_PC_DataBlock ('80'H),
RDR_to_PC_SlotStatus ('81'H),
RDR_to_PC_Parameters ('82'H),
RDR_to_PC_Escape ('83'H),
RDR_to_PC_DataRateAndClock ('84'H),
/* Section 6.3 */
RDR_to_PC_NotifySlotChange ('50'H),
RDR_to_PC_HardwareError ('51'H)
} with { variant "FIELDLENGTH(8)" };
type record CCID_Header {
CCID_MsgType bMessageType,
uint32_t dwLength,
uint8_t bSlot,
uint8_t bSeq
};
/* Table 6.2-3 Slot Status Register */
type enumerated CCID_ICC_Status {
CCID_ICC_STATUS_PRES_ACT (0),
CCID_ICC_STATUS_PRES_INACT (1),
CCID_ICC_STATUS_NO_ICC (2),
CCID_ICC_STATUS_RFU (3)
} with { variant "FIELDLENGTH(2)" };
type enumerated CCID_CMD_Status {
CCID_CMD_STATUS_OK (0),
CCID_CMD_STATUS_FAILED (1),
CCID_CMD_STATUS_TIME_EXT (2),
CCID_CMD_STATUS_RFU (3)
} with { variant "FIELDLENGTH(2)" };
type record CCID_SlotStatus {
CCID_ICC_Status bmICCStatus,
BIT4 RFU,
CCID_CMD_Status bmCommandStatus
};
/* Table 6.2-2 Slot erro rregister when bmCommandStatus = 1 */
type enumerated CCID_SlotError {
CCID_ERR_CMD_ABORTED ('FF'H),
CCID_ERR_ICC_MUTE ('FE'H),
CCID_ERR_XFR_PARITY_ERROR ('FD'H),
CCID_ERR_XFR_OVERRUN ('FC'H),
CCID_ERR_HW_ERROR ('FB'H),
CCID_ERR_BAD_ATR_TS ('F8'H),
CCID_ERR_BAD_ATR_TCK ('F7'H),
CCID_ERR_ICC_PROTOCOL_NOT_SUPPORTED ('F6'H),
CCID_ERR_ICC_CLASS_NOT_SUPPORTED ('F5'H),
CCID_ERR_PROCEDURE_BYTE_CONFLICT ('F4'H),
CCID_ERR_DEACTIVATED_PROTOCOL ('F3'H),
CCID_ERR_BUSY_WITH_AUTO_SEQUENCE ('F2'H),
CCID_ERR_PIN_TIMEOUT ('F0'H),
CCID_ERR_PIN_CANCELLED ('EF'H),
CCID_ERR_CMD_SLOT_BUSY ('E0'H),
CCID_ERR_CMD_NOT_SUPPORTED ('00'H)
} with { variant "FIELDLENGTH(8)" };
type record CCID_Header_IN {
CCID_SlotStatus bStatus,
CCID_SlotError bError
};
type union CCID_Union {
CCID_PC_to_RDR_IccPowerOn IccPowerOn,
CCID_PC_to_RDR_IccPowerOff IccPowerOff,
CCID_PC_to_RDR_GetSlotStatus GetSlotStatus,
CCID_PC_to_RDR_XfrBlock XfrBlock,
CCID_PC_to_RDR_GetParameters GetParameters,
CCID_PC_to_RDR_ResetParameters ResetParameters,
CCID_PC_to_RDR_SetParameters SetParameters,
CCID_PC_to_RDR_Escape EscapeOut,
CCID_PC_to_RDR_IccClock IccClock,
CCID_PC_to_RDR_T0APDU T0APDU,
CCID_PC_to_RDR_Secure Secure,
CCID_PC_to_RDR_Mechanical Mechanical,
CCID_PC_to_RDR_Abort Abort,
CCID_PC_to_RDR_SetRateAndClock SetRateAndClock,
CCID_RDR_to_PC_DataBlock DataBlock,
CCID_RDR_to_PC_SlotStatus SlotStatus,
CCID_RDR_to_PC_Parameters Parameters,
CCID_RDR_to_PC_Escape EscapeIn,
CCID_RDR_to_PC_DataRateAndClock DataRateAndClock,
CCID_RDR_to_PC_NotifySlotChange NotifySlotChange,
CCID_RDR_to_PC_HardwareError HardwareError
};
type record CCID_PDU {
CCID_Header hdr,
CCID_Header_IN hdr_in optional,
CCID_Union u
} with { variant (hdr_in) "PRESENCE(hdr.bMessageType = RDR_to_PC_DataBlock,
hdr.bMessageType = RDR_to_PC_SlotStatus,
hdr.bMessageType = RDR_to_PC_Parameters,
hdr.bMessageType = RDR_to_PC_Escape,
hdr.bMessageType = RDR_to_PC_DataRateAndClock)"
variant (u) "CROSSTAG(
IccPowerOn, hdr.bMessageType = PC_to_RDR_IccPowerOn;
IccPowerOff, hdr.bMessageType = PC_to_RDR_IccPowerOff;
GetSlotStatus, hdr.bMessageType = PC_to_RDR_GetSlotStatus;
XfrBlock, hdr.bMessageType = PC_to_RDR_XfrBlock;
GetParameters, hdr.bMessageType = PC_to_RDR_GetParameters;
ResetParameters, hdr.bMessageType = PC_to_RDR_ResetParameters;
SetParameters, hdr.bMessageType = PC_to_RDR_SetParameters;
EscapeOut, hdr.bMessageType = PC_to_RDR_Escape;
IccClock, hdr.bMessageType = PC_to_RDR_IccClock;
T0APDU, hdr.bMessageType = PC_to_RDR_T0APDU;
Secure, hdr.bMessageType = PC_to_RDR_Secure;
Mechanical, hdr.bMessageType = PC_to_RDR_Mechanical;
Abort, hdr.bMessageType = PC_to_RDR_Abort;
SetRateAndClock, hdr.bMessageType = PC_to_RDR_SetRateAndClock;
DataBlock, hdr.bMessageType = RDR_to_PC_DataBlock;
SlotStatus, hdr.bMessageType = RDR_to_PC_SlotStatus;
Parameters, hdr.bMessageType = RDR_to_PC_Parameters;
EscapeIn, hdr.bMessageType = RDR_to_PC_Escape;
DataRateAndClock, hdr.bMessageType = RDR_to_PC_DataRateAndClock;
NotifySlotChange, hdr.bMessageType = RDR_to_PC_NotifySlotChange;
HardwareError, hdr.bMessageType = RDR_to_PC_HardwareError
)"
};
external function enc_CCID_PDU(in CCID_PDU pdu) return octetstring
with { extension "prototype(convert)"
extension "encode(RAW)"
}
external function dec_CCID_PDU(in octetstring stream) return CCID_PDU
with { extension "prototype(convert)"
extension "decode(RAW)"
}
} with { encode "RAW"; variant "FIELDORDER(msb)" }