Lines Matching full:scard
220 static int _scard_select_file(struct scard_data *scard, unsigned short file_id,
224 static int scard_select_file(struct scard_data *scard, unsigned short file_id,
226 static int scard_verify_pin(struct scard_data *scard, const char *pin);
227 static int scard_get_record_len(struct scard_data *scard,
229 static int scard_read_record(struct scard_data *scard,
247 wpa_printf(MSG_DEBUG, "SCARD: file header did not "
257 wpa_hexdump(MSG_DEBUG, "SCARD: file header FSP template",
261 wpa_printf(MSG_MSGDUMP, "SCARD: file header TLV "
273 wpa_printf(MSG_DEBUG, "SCARD: file_size=%d",
280 wpa_printf(MSG_DEBUG, "SCARD: PS_DO=0x%02x",
294 static int scard_pin_needed(struct scard_data *scard,
297 if (scard->sim_type == SCARD_GSM_SIM) {
304 if (scard->sim_type == SCARD_USIM) {
319 static int scard_get_aid(struct scard_data *scard, unsigned char *aid,
336 if (scard_select_file(scard, SCARD_FILE_EF_DIR, buf, &blen)) {
337 wpa_printf(MSG_DEBUG, "SCARD: Failed to read EF_DIR");
340 wpa_hexdump(MSG_DEBUG, "SCARD: EF_DIR select", buf, blen);
343 rlen = scard_get_record_len(scard, rec,
346 wpa_printf(MSG_DEBUG, "SCARD: Failed to get EF_DIR "
352 wpa_printf(MSG_DEBUG, "SCARD: Too long EF_DIR record");
355 if (scard_read_record(scard, buf, rlen, rec,
357 wpa_printf(MSG_DEBUG, "SCARD: Failed to read "
361 wpa_hexdump(MSG_DEBUG, "SCARD: EF_DIR record", buf, rlen);
364 wpa_printf(MSG_DEBUG, "SCARD: Unexpected application "
371 wpa_printf(MSG_DEBUG, "SCARD: Too long application "
378 wpa_printf(MSG_DEBUG, "SCARD: Unexpected application "
384 wpa_printf(MSG_DEBUG, "SCARD: Invalid AID length %d",
389 wpa_hexdump(MSG_DEBUG, "SCARD: AID from EF_DIR record",
394 wpa_printf(MSG_DEBUG, "SCARD: 3G USIM app found from "
401 wpa_printf(MSG_DEBUG, "SCARD: 3G USIM app not found "
407 wpa_printf(MSG_DEBUG, "SCARD: Too long AID");
432 struct scard_data *scard;
443 wpa_printf(MSG_DEBUG, "SCARD: initializing smart card interface");
446 scard = os_zalloc(sizeof(*scard));
447 if (scard == NULL)
451 &scard->ctx);
453 wpa_printf(MSG_DEBUG, "SCARD: Could not establish smart card "
458 ret = SCardListReaders(scard->ctx, NULL, NULL, &len);
460 wpa_printf(MSG_DEBUG, "SCARD: SCardListReaders failed "
470 wpa_printf(MSG_INFO, "SCARD: malloc failed\n");
474 ret = SCardListReaders(scard->ctx, NULL, readers, &len);
476 wpa_printf(MSG_DEBUG, "SCARD: SCardListReaders failed(2) "
481 wpa_printf(MSG_WARNING, "SCARD: No smart card readers "
490 wpa_printf(MSG_DEBUG, "SCARD: Selected reader='%S'", readers);
492 wpa_printf(MSG_DEBUG, "SCARD: Selected reader='%s'", readers);
495 ret = SCardConnect(scard->ctx, readers, SCARD_SHARE_SHARED,
496 SCARD_PROTOCOL_T0, &scard->card, &scard->protocol);
508 wpa_printf(MSG_DEBUG, "SCARD: card=0x%x active_protocol=%lu (%s)",
509 (unsigned int) scard->card, scard->protocol,
510 scard->protocol == SCARD_PROTOCOL_T0 ? "T0" : "T1");
512 ret = SCardBeginTransaction(scard->card);
514 wpa_printf(MSG_DEBUG, "SCARD: Could not begin transaction: "
522 scard->sim_type = SCARD_GSM_SIM;
524 wpa_printf(MSG_DEBUG, "SCARD: verifying USIM support");
525 if (_scard_select_file(scard, SCARD_FILE_MF, buf, &blen,
527 wpa_printf(MSG_DEBUG, "SCARD: USIM is not supported");
530 wpa_printf(MSG_DEBUG, "SCARD: Trying to use GSM SIM");
531 scard->sim_type = SCARD_GSM_SIM;
533 wpa_printf(MSG_DEBUG, "SCARD: USIM is supported");
534 scard->sim_type = SCARD_USIM;
538 if (scard->sim_type == SCARD_GSM_SIM) {
540 if (scard_select_file(scard, SCARD_FILE_MF, buf, &blen)) {
541 wpa_printf(MSG_DEBUG, "SCARD: Failed to read MF");
546 if (scard_select_file(scard, SCARD_FILE_GSM_DF, buf, &blen)) {
547 wpa_printf(MSG_DEBUG, "SCARD: Failed to read GSM DF");
554 aid_len = scard_get_aid(scard, aid, sizeof(aid));
556 wpa_printf(MSG_DEBUG, "SCARD: Failed to find AID for "
561 wpa_hexdump(MSG_DEBUG, "SCARD: 3G USIM AID", aid, aid_len);
566 if (_scard_select_file(scard, 0, buf, &blen, scard->sim_type,
568 wpa_printf(MSG_INFO, "SCARD: Failed to read 3G USIM "
570 wpa_hexdump(MSG_INFO, "SCARD: 3G USIM AID",
577 pin_needed = scard_pin_needed(scard, buf, blen);
579 wpa_printf(MSG_DEBUG, "SCARD: Failed to determine whether PIN "
584 scard->pin1_required = 1;
588 ret = SCardEndTransaction(scard->card, SCARD_LEAVE_CARD);
590 wpa_printf(MSG_DEBUG, "SCARD: Could not end transaction: "
594 return scard;
598 SCardEndTransaction(scard->card, SCARD_LEAVE_CARD);
600 scard_deinit(scard);
607 * @scard: Pointer to private data from scard_init()
611 int scard_set_pin(struct scard_data *scard, const char *pin)
613 if (scard == NULL)
617 if (scard->pin1_required) {
623 if (scard_verify_pin(scard, pin)) {
636 * @scard: Pointer to private data from scard_init()
640 void scard_deinit(struct scard_data *scard)
644 if (scard == NULL)
647 wpa_printf(MSG_DEBUG, "SCARD: deinitializing smart card interface");
648 if (scard->card) {
649 ret = SCardDisconnect(scard->card, SCARD_UNPOWER_CARD);
651 wpa_printf(MSG_DEBUG, "SCARD: Failed to disconnect "
656 if (scard->ctx) {
657 ret = SCardReleaseContext(scard->ctx);
663 os_free(scard);
668 static long scard_transmit(struct scard_data *scard,
675 wpa_hexdump_key(MSG_DEBUG, "SCARD: scard_transmit: send",
678 ret = SCardTransmit(scard->card,
679 scard->protocol == SCARD_PROTOCOL_T1 ?
685 wpa_hexdump(MSG_DEBUG, "SCARD: scard_transmit: recv",
688 wpa_printf(MSG_WARNING, "SCARD: SCardTransmit failed "
695 static int _scard_select_file(struct scard_data *scard, unsigned short file_id,
713 wpa_printf(MSG_DEBUG, "SCARD: select file %04x", file_id);
715 wpa_hexdump(MSG_DEBUG, "SCARD: select file by AID",
729 ret = scard_transmit(scard, cmd, cmdlen, resp, &len);
731 wpa_printf(MSG_WARNING, "SCARD: SCardTransmit failed "
737 wpa_printf(MSG_WARNING, "SCARD: unexpected resp len "
744 wpa_printf(MSG_WARNING, "SCARD: Security status not satisfied "
750 wpa_printf(MSG_DEBUG, "SCARD: used CLA not supported");
755 wpa_printf(MSG_WARNING, "SCARD: unexpected response 0x%02x "
761 wpa_printf(MSG_DEBUG, "SCARD: trying to get response (%d bytes)",
765 ret = scard_transmit(scard, get_resp, sizeof(get_resp), buf, &rlen);
771 wpa_printf(MSG_WARNING, "SCARD: SCardTransmit err=0x%lx\n", ret);
776 static int scard_select_file(struct scard_data *scard, unsigned short file_id,
779 return _scard_select_file(scard, file_id, buf, buf_len,
780 scard->sim_type, NULL, 0);
784 static int scard_get_record_len(struct scard_data *scard, unsigned char recnum,
792 if (scard->sim_type == SCARD_USIM)
799 ret = scard_transmit(scard, cmd, sizeof(cmd), buf, &blen);
801 wpa_printf(MSG_DEBUG, "SCARD: failed to determine file "
806 wpa_hexdump(MSG_DEBUG, "SCARD: file length determination response",
810 wpa_printf(MSG_DEBUG, "SCARD: unexpected response to file "
819 static int scard_read_record(struct scard_data *scard,
828 if (scard->sim_type == SCARD_USIM)
838 ret = scard_transmit(scard, cmd, sizeof(cmd), buf, &blen);
844 wpa_printf(MSG_DEBUG, "SCARD: record read returned unexpected "
852 wpa_printf(MSG_DEBUG, "SCARD: record read returned unexpected "
866 static int scard_read_file(struct scard_data *scard,
880 if (scard->sim_type == SCARD_USIM)
882 ret = scard_transmit(scard, cmd, sizeof(cmd), buf, &blen);
888 wpa_printf(MSG_DEBUG, "SCARD: file read returned unexpected "
896 wpa_printf(MSG_DEBUG, "SCARD: file read returned unexpected "
910 static int scard_verify_pin(struct scard_data *scard, const char *pin)
917 wpa_printf(MSG_DEBUG, "SCARD: verifying PIN");
922 if (scard->sim_type == SCARD_USIM)
928 ret = scard_transmit(scard, cmd, sizeof(cmd), resp, &len);
933 wpa_printf(MSG_WARNING, "SCARD: PIN verification failed");
937 wpa_printf(MSG_DEBUG, "SCARD: PIN verified successfully");
944 * @scard: Pointer to private data from scard_init()
956 int scard_get_imsi(struct scard_data *scard, char *imsi, size_t *len)
962 wpa_printf(MSG_DEBUG, "SCARD: reading IMSI from (GSM) EF-IMSI");
964 if (scard_select_file(scard, SCARD_FILE_GSM_EF_IMSI, buf, &blen))
967 wpa_printf(MSG_WARNING, "SCARD: too short (GSM) EF-IMSI "
972 if (scard->sim_type == SCARD_GSM_SIM) {
981 wpa_printf(MSG_DEBUG, "SCARD: invalid IMSI file length=%ld",
987 wpa_printf(MSG_DEBUG, "SCARD: IMSI file length=%ld imsilen=%ld",
994 if (scard_read_file(scard, buf, blen))
1022 * @scard: Pointer to private data from scard_init()
1030 int scard_get_mnc_len(struct scard_data *scard)
1036 wpa_printf(MSG_DEBUG, "SCARD: reading MNC len from (GSM) EF-AD");
1038 if (scard_select_file(scard, SCARD_FILE_GSM_EF_AD, buf, &blen))
1041 wpa_printf(MSG_WARNING, "SCARD: too short (GSM) EF-AD "
1046 if (scard->sim_type == SCARD_GSM_SIM) {
1053 wpa_printf(MSG_DEBUG, "SCARD: MNC length not available");
1057 wpa_printf(MSG_DEBUG, "SCARD: invalid file length=%ld",
1062 if (scard_read_file(scard, buf, file_size))
1066 wpa_printf(MSG_DEBUG, "SCARD: invalid MNC length=%ld",
1070 wpa_printf(MSG_DEBUG, "SCARD: MNC length=%ld", (long) buf[3]);
1077 * @scard: Pointer to private data from scard_init()
1090 int scard_gsm_auth(struct scard_data *scard, const unsigned char *_rand,
1100 if (scard == NULL)
1103 wpa_hexdump(MSG_DEBUG, "SCARD: GSM auth - RAND", _rand, 16);
1104 if (scard->sim_type == SCARD_GSM_SIM) {
1116 ret = scard_transmit(scard, cmd, cmdlen, resp, &len);
1120 if ((scard->sim_type == SCARD_GSM_SIM &&
1122 (scard->sim_type == SCARD_USIM &&
1124 wpa_printf(MSG_WARNING, "SCARD: unexpected response for GSM "
1132 ret = scard_transmit(scard, get_resp, sizeof(get_resp), buf, &len);
1136 if (scard->sim_type == SCARD_GSM_SIM) {
1138 wpa_printf(MSG_WARNING, "SCARD: unexpected data "
1147 wpa_printf(MSG_WARNING, "SCARD: unexpected data "
1153 wpa_printf(MSG_WARNING, "SCARD: unexpected SREC/Kc "
1161 wpa_hexdump(MSG_DEBUG, "SCARD: GSM auth - SRES", sres, 4);
1162 wpa_hexdump(MSG_DEBUG, "SCARD: GSM auth - Kc", kc, 8);
1170 * @scard: Pointer to private data from scard_init()
1188 int scard_umts_auth(struct scard_data *scard, const unsigned char *_rand,
1200 if (scard == NULL)
1203 if (scard->sim_type == SCARD_GSM_SIM) {
1204 wpa_printf(MSG_ERROR, "SCARD: Non-USIM card - cannot do UMTS "
1209 wpa_hexdump(MSG_DEBUG, "SCARD: UMTS auth - RAND", _rand, AKA_RAND_LEN);
1210 wpa_hexdump(MSG_DEBUG, "SCARD: UMTS auth - AUTN", autn, AKA_AUTN_LEN);
1217 ret = scard_transmit(scard, cmd, sizeof(cmd), resp, &len);
1222 wpa_hexdump(MSG_DEBUG, "SCARD: UMTS alg response", resp, len);
1225 wpa_printf(MSG_WARNING, "SCARD: UMTS auth failed - "
1229 wpa_printf(MSG_WARNING, "SCARD: unexpected response for UMTS "
1237 ret = scard_transmit(scard, get_resp, sizeof(get_resp), buf, &len);
1241 wpa_hexdump(MSG_DEBUG, "SCARD: UMTS get response result", buf, len);
1244 wpa_printf(MSG_DEBUG, "SCARD: UMTS Synchronization-Failure");
1246 wpa_hexdump(MSG_DEBUG, "SCARD: AUTS", auts, AKA_AUTS_LEN);
1254 wpa_printf(MSG_DEBUG, "SCARD: Invalid RES");
1260 wpa_hexdump(MSG_DEBUG, "SCARD: RES", res, *res_len);
1264 wpa_printf(MSG_DEBUG, "SCARD: Invalid CK");
1270 wpa_hexdump(MSG_DEBUG, "SCARD: CK", ck, CK_LEN);
1274 wpa_printf(MSG_DEBUG, "SCARD: Invalid IK");
1280 wpa_hexdump(MSG_DEBUG, "SCARD: IK", ik, IK_LEN);
1285 wpa_printf(MSG_DEBUG, "SCARD: Unrecognized response");