Home | History | Annotate | Download | only in utils

Lines Matching refs:scard

252 static int _scard_select_file(struct scard_data *scard, unsigned short file_id,
256 static int scard_select_file(struct scard_data *scard, unsigned short file_id,
258 static int scard_verify_pin(struct scard_data *scard, const char *pin);
259 static int scard_get_record_len(struct scard_data *scard,
261 static int scard_read_record(struct scard_data *scard,
279 wpa_printf(MSG_DEBUG, "SCARD: file header did not "
289 wpa_hexdump(MSG_DEBUG, "SCARD: file header FSP template",
297 wpa_printf(MSG_MSGDUMP, "SCARD: file header TLV 0x%02x len=%d",
306 wpa_hexdump(MSG_MSGDUMP, "SCARD: File Descriptor TLV",
310 wpa_hexdump(MSG_MSGDUMP, "SCARD: File Identifier TLV",
314 wpa_hexdump(MSG_MSGDUMP, "SCARD: DF name (AID) TLV",
318 wpa_hexdump(MSG_MSGDUMP, "SCARD: Proprietary "
322 wpa_hexdump(MSG_MSGDUMP, "SCARD: Life Cycle Status "
326 wpa_hexdump(MSG_MSGDUMP, "SCARD: File size TLV",
333 wpa_printf(MSG_DEBUG, "SCARD: file_size=%d",
338 wpa_hexdump(MSG_MSGDUMP, "SCARD: Total file size TLV",
342 wpa_hexdump(MSG_MSGDUMP, "SCARD: PIN Status Template "
346 wpa_printf(MSG_DEBUG, "SCARD: PS_DO=0x%02x",
352 wpa_hexdump(MSG_MSGDUMP, "SCARD: Short File "
358 wpa_hexdump(MSG_MSGDUMP, "SCARD: Security attribute "
362 wpa_hexdump(MSG_MSGDUMP, "SCARD: Unrecognized TLV",
376 static int scard_pin_needed(struct scard_data *scard,
379 if (scard->sim_type == SCARD_GSM_SIM) {
386 if (scard->sim_type == SCARD_USIM) {
401 static int scard_get_aid(struct scard_data *scard, unsigned char *aid,
420 if (scard_select_file(scard, SCARD_FILE_EF_DIR, buf, &blen)) {
421 wpa_printf(MSG_DEBUG, "SCARD: Failed to read EF_DIR");
424 wpa_hexdump(MSG_DEBUG, "SCARD: EF_DIR select", buf, blen);
427 rlen = scard_get_record_len(scard, rec,
430 wpa_printf(MSG_DEBUG, "SCARD: Failed to get EF_DIR "
436 wpa_printf(MSG_DEBUG, "SCARD: Too long EF_DIR record");
439 if (scard_read_record(scard, buf, rlen, rec,
441 wpa_printf(MSG_DEBUG, "SCARD: Failed to read "
445 wpa_hexdump(MSG_DEBUG, "SCARD: EF_DIR record", buf, rlen);
448 wpa_printf(MSG_DEBUG, "SCARD: Unexpected application "
455 wpa_printf(MSG_DEBUG, "SCARD: Too long application "
462 wpa_printf(MSG_DEBUG, "SCARD: Unexpected application "
469 wpa_printf(MSG_DEBUG, "SCARD: Invalid AID length %u",
474 wpa_hexdump(MSG_DEBUG, "SCARD: AID from EF_DIR record",
479 wpa_printf(MSG_DEBUG, "SCARD: 3G USIM app found from "
486 wpa_printf(MSG_DEBUG, "SCARD: 3G USIM app not found "
492 wpa_printf(MSG_DEBUG, "SCARD: Too long AID");
521 struct scard_data *scard;
532 wpa_printf(MSG_DEBUG, "SCARD: initializing smart card interface");
535 scard = os_zalloc(sizeof(*scard));
536 if (scard == NULL)
540 &scard->ctx);
542 wpa_printf(MSG_DEBUG, "SCARD: Could not establish smart card "
547 ret = SCardListReaders(scard->ctx, NULL, NULL, &len);
549 wpa_printf(MSG_DEBUG, "SCARD: SCardListReaders failed "
559 wpa_printf(MSG_INFO, "SCARD: malloc failed\n");
563 ret = SCardListReaders(scard->ctx, NULL, readers, &len);
565 wpa_printf(MSG_DEBUG, "SCARD: SCardListReaders failed(2) "
570 wpa_printf(MSG_WARNING, "SCARD: No smart card readers "
574 wpa_hexdump_ascii(MSG_DEBUG, "SCARD: Readers", (u8 *) readers, len);
595 wpa_printf(MSG_WARNING, "SCARD: No reader with prefix '%s' "
601 wpa_printf(MSG_DEBUG, "SCARD: Selected reader='%S'", &readers[pos]);
603 wpa_printf(MSG_DEBUG, "SCARD: Selected reader='%s'", &readers[pos]);
606 ret = SCardConnect(scard->ctx, &readers[pos], SCARD_SHARE_SHARED,
608 &scard->card, &scard->protocol);
620 wpa_printf(MSG_DEBUG, "SCARD: card=0x%x active_protocol=%lu (%s)",
621 (unsigned int) scardscard->protocol,
622 scard->protocol == SCARD_PROTOCOL_T0 ? "T0" : "T1");
624 ret = SCardBeginTransaction(scard->card);
626 wpa_printf(MSG_DEBUG, "SCARD: Could not begin transaction: "
634 wpa_printf(MSG_DEBUG, "SCARD: verifying USIM support");
635 if (_scard_select_file(scard, SCARD_FILE_MF, buf, &blen,
637 wpa_printf(MSG_DEBUG, "SCARD: USIM is not supported. Trying to use GSM SIM");
638 scard->sim_type = SCARD_GSM_SIM;
640 wpa_printf(MSG_DEBUG, "SCARD: USIM is supported");
641 scard->sim_type = SCARD_USIM;
644 if (scard->sim_type == SCARD_GSM_SIM) {
646 if (scard_select_file(scard, SCARD_FILE_MF, buf, &blen)) {
647 wpa_printf(MSG_DEBUG, "SCARD: Failed to read MF");
652 if (scard_select_file(scard, SCARD_FILE_GSM_DF, buf, &blen)) {
653 wpa_printf(MSG_DEBUG, "SCARD: Failed to read GSM DF");
660 aid_len = scard_get_aid(scard, aid, sizeof(aid));
662 wpa_printf(MSG_DEBUG, "SCARD: Failed to find AID for "
667 wpa_hexdump(MSG_DEBUG, "SCARD: 3G USIM AID", aid, aid_len);
672 if (_scard_select_file(scard, 0, buf, &blen, scard->sim_type,
674 wpa_printf(MSG_INFO, "SCARD: Failed to read 3G USIM "
676 wpa_hexdump(MSG_INFO, "SCARD: 3G USIM AID",
683 pin_needed = scard_pin_needed(scard, buf, blen);
685 wpa_printf(MSG_DEBUG, "SCARD: Failed to determine whether PIN "
690 scard->pin1_required = 1;
692 "counter=%d)", scard_get_pin_retry_counter(scard));
695 ret = SCardEndTransaction(scard->card, SCARD_LEAVE_CARD);
697 wpa_printf(MSG_DEBUG, "SCARD: Could not end transaction: "
701 return scard;
705 SCardEndTransaction(scard->card, SCARD_LEAVE_CARD);
707 scard_deinit(scard);
714 * @scard: Pointer to private data from scard_init()
718 int scard_set_pin(struct scard_data *scard, const char *pin)
720 if (scard == NULL)
724 if (scard->pin1_required) {
730 if (scard_verify_pin(scard, pin)) {
743 * @scard: Pointer to private data from scard_init()
747 void scard_deinit(struct scard_data *scard)
751 if (scard == NULL)
754 wpa_printf(MSG_DEBUG, "SCARD: deinitializing smart card interface");
755 if (scard->card) {
756 ret = SCardDisconnect(scard->card, SCARD_UNPOWER_CARD);
758 wpa_printf(MSG_DEBUG, "SCARD: Failed to disconnect "
763 if (scard->ctx) {
764 ret = SCardReleaseContext(scard->ctx);
770 os_free(scard);
775 static long scard_transmit(struct scard_data *scard,
786 wpa_hexdump_key(MSG_DEBUG, "SCARD: scard_transmit: send",
789 ret = SCardTransmit(scard->card,
790 scard->protocol == SCARD_PROTOCOL_T1 ?
796 wpa_hexdump(MSG_DEBUG, "SCARD: scard_transmit: recv",
799 wpa_printf(MSG_WARNING, "SCARD: SCardTransmit failed "
806 static int _scard_select_file(struct scard_data *scard, unsigned short file_id,
824 wpa_printf(MSG_DEBUG, "SCARD: select file %04x", file_id);
826 wpa_hexdump(MSG_DEBUG, "SCARD: select file by AID",
840 ret = scard_transmit(scard, cmd, cmdlen, resp, &len);
842 wpa_printf(MSG_WARNING, "SCARD: SCardTransmit failed "
848 wpa_printf(MSG_WARNING, "SCARD: unexpected resp len "
855 wpa_printf(MSG_WARNING, "SCARD: Security status not satisfied "
861 wpa_printf(MSG_DEBUG, "SCARD: used CLA not supported");
866 wpa_printf(MSG_WARNING, "SCARD: unexpected response 0x%02x "
872 wpa_printf(MSG_DEBUG, "SCARD: trying to get response (%d bytes)",
876 ret = scard_transmit(scard, get_resp, sizeof(get_resp), buf, &rlen);
882 wpa_printf(MSG_WARNING, "SCARD: SCardTransmit err=0x%lx\n", ret);
887 static int scard_select_file(struct scard_data *scard, unsigned short file_id,
890 return _scard_select_file(scard, file_id, buf, buf_len,
891 scard->sim_type, NULL, 0);
895 static int scard_get_record_len(struct scard_data *scard, unsigned char recnum,
903 if (scard->sim_type == SCARD_USIM)
910 ret = scard_transmit(scard, cmd, sizeof(cmd), buf, &blen);
912 wpa_printf(MSG_DEBUG, "SCARD: failed to determine file "
917 wpa_hexdump(MSG_DEBUG, "SCARD: file length determination response",
921 wpa_printf(MSG_DEBUG, "SCARD: unexpected response to file "
930 static int scard_read_record(struct scard_data *scard,
939 if (scard->sim_type == SCARD_USIM)
949 ret = scard_transmit(scard, cmd, sizeof(cmd), buf, &blen);
955 wpa_printf(MSG_DEBUG, "SCARD: record read returned unexpected "
963 wpa_printf(MSG_DEBUG, "SCARD: record read returned unexpected "
977 static int scard_read_file(struct scard_data *scard,
991 if (scard->sim_type == SCARD_USIM)
993 ret = scard_transmit(scard, cmd, sizeof(cmd), buf, &blen);
999 wpa_printf(MSG_DEBUG, "SCARD: file read returned unexpected "
1007 wpa_printf(MSG_DEBUG, "SCARD: file read returned unexpected "
1021 static int scard_verify_pin(struct scard_data *scard, const char *pin)
1028 wpa_printf(MSG_DEBUG, "SCARD: verifying PIN");
1033 if (scard->sim_type == SCARD_USIM)
1039 ret = scard_transmit(scard, cmd, sizeof(cmd), resp, &len);
1044 wpa_printf(MSG_WARNING, "SCARD: PIN verification failed");
1048 wpa_printf(MSG_DEBUG, "SCARD: PIN verified successfully");
1053 int scard_get_pin_retry_counter(struct scard_data *scard)
1061 wpa_printf(MSG_DEBUG, "SCARD: fetching PIN retry counter");
1063 if (scard->sim_type == SCARD_USIM)
1068 ret = scard_transmit(scard, cmd, sizeof(cmd), resp, &len);
1073 wpa_printf(MSG_WARNING, "SCARD: failed to fetch PIN retry "
1080 wpa_printf(MSG_DEBUG, "SCARD: PIN has been blocked");
1087 wpa_printf(MSG_DEBUG, "SCARD: Unexpected PIN retry counter response "
1095 * @scard: Pointer to private data from scard_init()
1107 int scard_get_imsi(struct scard_data *scard, char *imsi, size_t *len)
1113 wpa_printf(MSG_DEBUG, "SCARD: reading IMSI from (GSM) EF-IMSI");
1115 if (scard_select_file(scard, SCARD_FILE_GSM_EF_IMSI, buf, &blen))
1118 wpa_printf(MSG_WARNING, "SCARD: too short (GSM) EF-IMSI "
1123 if (scard->sim_type == SCARD_GSM_SIM) {
1132 wpa_printf(MSG_DEBUG, "SCARD: invalid IMSI file length=%ld",
1138 wpa_printf(MSG_DEBUG, "SCARD: IMSI file length=%ld imsilen=%ld",
1145 if (scard_read_file(scard, buf, blen))
1173 * @scard: Pointer to private data from scard_init()
1181 int scard_get_mnc_len(struct scard_data *scard)
1187 wpa_printf(MSG_DEBUG, "SCARD: reading MNC len from (GSM) EF-AD");
1189 if (scard_select_file(scard, SCARD_FILE_GSM_EF_AD, buf, &blen))
1192 wpa_printf(MSG_WARNING, "SCARD: too short (GSM) EF-AD "
1197 if (scard->sim_type == SCARD_GSM_SIM) {
1204 wpa_printf(MSG_DEBUG, "SCARD: MNC length not available");
1208 wpa_printf(MSG_DEBUG, "SCARD: invalid file length=%ld",
1213 if (scard_read_file(scard, buf, file_size))
1217 wpa_printf(MSG_DEBUG, "SCARD: invalid MNC length=%ld",
1221 wpa_printf(MSG_DEBUG, "SCARD: MNC length=%ld", (long) buf[3]);
1228 * @scard: Pointer to private data from scard_init()
1241 int scard_gsm_auth(struct scard_data *scard, const unsigned char *_rand,
1251 if (scard == NULL)
1254 wpa_hexdump(MSG_DEBUG, "SCARD
1255 if (scard->sim_type == SCARD_GSM_SIM) {
1268 ret = scard_transmit(scard, cmd, cmdlen, resp, &len);
1272 if ((scard->sim_type == SCARD_GSM_SIM &&
1274 (scard->sim_type == SCARD_USIM &&
1276 wpa_printf(MSG_WARNING, "SCARD: unexpected response for GSM "
1284 ret = scard_transmit(scard, get_resp, sizeof(get_resp), buf, &len);
1288 if (scard->sim_type == SCARD_GSM_SIM) {
1290 wpa_printf(MSG_WARNING, "SCARD: unexpected data "
1299 wpa_printf(MSG_WARNING, "SCARD: unexpected data "
1305 wpa_printf(MSG_WARNING, "SCARD: unexpected SREC/Kc "
1313 wpa_hexdump(MSG_DEBUG, "SCARD: GSM auth - SRES", sres, 4);
1314 wpa_hexdump(MSG_DEBUG, "SCARD: GSM auth - Kc", kc, 8);
1322 * @scard: Pointer to private data from scard_init()
1340 int scard_umts_auth(struct scard_data *scard, const unsigned char *_rand,
1352 if (scard == NULL)
1355 if (scard->sim_type == SCARD_GSM_SIM) {
1356 wpa_printf(MSG_ERROR, "SCARD: Non-USIM card - cannot do UMTS "
1361 wpa_hexdump(MSG_DEBUG, "SCARD: UMTS auth - RAND", _rand, AKA_RAND_LEN);
1362 wpa_hexdump(MSG_DEBUG, "SCARD: UMTS auth - AUTN", autn, AKA_AUTN_LEN);
1369 ret = scard_transmit(scard, cmd, sizeof(cmd), resp, &len);
1374 wpa_hexdump(MSG_DEBUG, "SCARD: UMTS alg response", resp, len);
1377 wpa_printf(MSG_WARNING, "SCARD: UMTS auth failed - "
1381 wpa_printf(MSG_WARNING, "SCARD: unexpected response for UMTS "
1389 ret = scard_transmit(scard, get_resp, sizeof(get_resp), buf, &len);
1393 wpa_hexdump(MSG_DEBUG, "SCARD: UMTS get response result", buf, len);
1396 wpa_printf(MSG_DEBUG, "SCARD: UMTS Synchronization-Failure");
1398 wpa_hexdump(MSG_DEBUG, "SCARD: AUTS", auts, AKA_AUTS_LEN);
1406 wpa_printf(MSG_DEBUG, "SCARD: Invalid RES");
1412 wpa_hexdump(MSG_DEBUG, "SCARD: RES", res, *res_len);
1416 wpa_printf(MSG_DEBUG, "SCARD: Invalid CK");
1422 wpa_hexdump(MSG_DEBUG, "SCARD: CK", ck, CK_LEN);
1426 wpa_printf(MSG_DEBUG, "SCARD: Invalid IK");
1432 wpa_hexdump(MSG_DEBUG, "SCARD: IK", ik, IK_LEN);
1436 "SCARD: Ignore extra data in end",
1443 wpa_printf(MSG_DEBUG, "SCARD: Unrecognized response");
1448 int scard_supports_umts(struct scard_data *scard)
1450 return scard->sim_type == SCARD_USIM;