1. wpa_supplicant
During the process of EAP-SIM Authentication, wpa_supplicant will send APDU-Command:"SELECT" to ApduService.
-
The "SELECT" Command means to select one file from the file system of SIM Card
-
The right APDU-Response is 0x61, or 0x6c, or 0x9f, which means the APDU-Command executed successfully;
-
The wrong APDU-Response is 0x6a82, which means "Selected file not found", according to the protocol: ETSI GSM 11.11
scard_get_imsi()
|-->scard_select_file()
|-->_scard_select_file()
|-->scard_transmit()
|-->SCardTransmit()
|-->(1)socket_local_client()-->open socket and connect
| |-->socket()
| |-->socket_local_client_connect()
| |-->connect()
|-->(2)send()
|-->(3)select()
|-->(4)recv()
2. ApduService
The ApduService is responsible for setting up a Unix socket when Wifi starts and listening for incoming connections.
Data read from the socket will be parsed and transmitted as a APDU Command to Telephony.
The response will be sent back over the socket. The socket's name is sent to the wpa supplicant.
frameworks/opt/net/wifi/service/java/com/android/server/wifi/ApduService.java
runService()
|-->(1)waitForConnection()
| |-->ServerSocket.accept()
|-->(2)communicationWithClient()
|-->ConnectionSocket.getInputStream()
|-->ConnectionSocket.getOutputStream()
|-->phone.iccTransmitApduBasicChannel()
3. PhoneInterfaceManager
/packages/services/Telephony/src/com/android/phone/PhoneInterfaceManager.java
(1) important events:
EVENT_TRANSMIT_APDU_LOGIC_CHANNEL_DONE
EVENT_TRANSMIT_APDU_BASIC_CHANNEL_DONE
(2) important commands:
CMD_TRANSMIT_APDU_LOGIC_CHANNEL
CMD_TRANSMIT_APDU_BASIC_CHANNEL
(3) important methods:
iccTransmitApduLogicalChannel()
iccTransmitApduBasicChannel()
(4) related System Property:
[gsm.sim.operator.numeric]