164 lines
5.4 KiB
Markdown
164 lines
5.4 KiB
Markdown
## API Reference (from API.py)
|
|
|
|
This section details the programmatic functions available in `API.py` for integrating smart card functionality into your own Python applications.
|
|
|
|
### Reader Management
|
|
|
|
#### `list_readers()`
|
|
Returns a list of available smart card reader objects.
|
|
|
|
**Returns:**
|
|
- `List`: List of reader objects. Returns an empty list if no readers are found or if an error occurs.
|
|
|
|
**Example:**
|
|
```python
|
|
from API import list_readers
|
|
|
|
readers = list_readers()
|
|
for reader in readers:
|
|
print(reader)
|
|
```
|
|
|
|
### Command Processing
|
|
|
|
#### `parse_command_string(hex_string)`
|
|
Converts a hexadecimal string into a list of integers representing bytes.
|
|
|
|
**Parameters:**
|
|
- `hex_string` (str): Hexadecimal string with optional spaces (e.g., "FF CA 00 00" or "FFCA0000")
|
|
|
|
**Returns:**
|
|
- `List[int]`: List of integers representing bytes
|
|
|
|
**Raises:**
|
|
- `ValueError`: If string contains invalid characters or has odd length
|
|
|
|
**Example:**
|
|
```python
|
|
from API import parse_command_string
|
|
|
|
bytes_list = parse_command_string("FF CA 00 00")
|
|
# Returns: [255, 202, 0, 0]
|
|
```
|
|
|
|
### Connection Management
|
|
|
|
#### `connect_to_reader(reader, mode='share', protocol='auto')`
|
|
Establishes a connection to a specified smart card reader.
|
|
|
|
**Parameters:**
|
|
- `reader`: Reader object from `list_readers()` or reader name string
|
|
- `mode` (str): Connection mode
|
|
- `'share'` (default): For APDU communication with a smart card
|
|
- `'direct'`: For sending low-level escape commands directly to the reader hardware
|
|
- `protocol` (str): Communication protocol specification
|
|
- `'auto'` (default): Automatically selects protocol based on platform
|
|
- `'t0t1'`: T=0 or T=1 protocol
|
|
- `'undefined'`: Undefined protocol
|
|
|
|
**Returns:**
|
|
- `tuple`: `(connection_object, error_message, context_handle)`
|
|
- `connection_object`: CardConnection object (APDU mode) or card handle (escape mode), or `None` on failure
|
|
- `error_message`: Error message string or `None` on success
|
|
- `context_handle`: Context handle for direct connections, or `None` for shared connections
|
|
|
|
**Example:**
|
|
```python
|
|
from API import list_readers, connect_to_reader
|
|
|
|
readers = list_readers()
|
|
if readers:
|
|
connection, error, context = connect_to_reader(readers[0], mode='share')
|
|
if connection:
|
|
print("Connected successfully")
|
|
else:
|
|
print(f"Connection failed: {error}")
|
|
```
|
|
|
|
#### `disconnect_reader(connection, hcontext=None)`
|
|
Disconnects from a smart card reader and releases context if applicable.
|
|
|
|
**Parameters:**
|
|
- `connection`: CardConnection object (APDU mode) or card handle (escape mode)
|
|
- `hcontext`: The established context handle for direct connections (optional, only needed for escape mode)
|
|
|
|
**Example:**
|
|
```python
|
|
from API import connect_to_reader, disconnect_reader
|
|
|
|
# For APDU mode
|
|
connection, error, _ = connect_to_reader(reader, mode='share')
|
|
# ... use connection ...
|
|
disconnect_reader(connection)
|
|
|
|
# For escape mode
|
|
hcard, error, hcontext = connect_to_reader(reader, mode='direct')
|
|
# ... use hcard ...
|
|
disconnect_reader(hcard, hcontext)
|
|
```
|
|
|
|
### Unified Command Interface
|
|
|
|
#### `send_command(connection, command, mode='apdu', ioctl_code=3500)`
|
|
Sends a command to a connected smart card or reader.
|
|
|
|
**Parameters:**
|
|
- `connection`: CardConnection object (APDU mode) or card handle (escape mode)
|
|
- `command`:
|
|
- For APDU mode: Hex string (e.g., "FF CA 00 00 00")
|
|
- For escape mode: Byte array/list or hex string
|
|
- `mode` (str): Command mode
|
|
- `'apdu'` (default): For sending APDU commands to a smart card
|
|
- `'escape'`: For sending escape commands to a reader in direct mode
|
|
- `ioctl_code` (int): IOCTL code for escape commands (default: 3500 - CCID escape)
|
|
|
|
**Returns:**
|
|
- For APDU mode: `(success, response_data, SW1, SW2, error_message)`
|
|
- `success` (bool): True if command was sent successfully
|
|
- `response_data` (list): Response data bytes
|
|
- `SW1` (int): Status word 1
|
|
- `SW2` (int): Status word 2
|
|
- `error_message` (str): Error message or None on success
|
|
|
|
- For escape mode: `(success, response_data, error_message)`
|
|
- `success` (bool): True if command was sent successfully
|
|
- `response_data` (list): Response data bytes
|
|
- `error_message` (str): Error message or None on success
|
|
|
|
**Example - APDU Mode:**
|
|
```python
|
|
from API import list_readers, connect_to_reader, send_command, disconnect_reader
|
|
|
|
readers = list_readers()
|
|
if readers:
|
|
connection, error, _ = connect_to_reader(readers[0], mode='share')
|
|
if connection:
|
|
success, response, sw1, sw2, error_msg = send_command(
|
|
connection,
|
|
"FF CA 00 00 00",
|
|
mode='apdu'
|
|
)
|
|
if success:
|
|
print(f"Response: {response}, SW1: {sw1:02X}, SW2: {sw2:02X}")
|
|
disconnect_reader(connection)
|
|
```
|
|
|
|
**Example - Escape Mode:**
|
|
```python
|
|
from API import list_readers, connect_to_reader, send_command, disconnect_reader, parse_command_string
|
|
|
|
readers = list_readers()
|
|
if readers:
|
|
hcard, error, hcontext = connect_to_reader(readers[0], mode='direct')
|
|
if hcard:
|
|
command_bytes = parse_command_string("E0 00 00 18 00")
|
|
success, response, error_msg = send_command(
|
|
hcard,
|
|
command_bytes,
|
|
mode='escape'
|
|
)
|
|
if success:
|
|
print(f"Response: {response}")
|
|
disconnect_reader(hcard, hcontext)
|
|
```
|