Lines Matching full:scard
244 static int _scard_select_file(struct scard_data *scard, unsigned short file_id,
248 static int scard_select_file(struct scard_data *scard, unsigned short file_id,
250 static int scard_verify_pin(struct scard_data *scard, const char *pin);
251 static int scard_get_record_len(struct scard_data *scard,
253 static int scard_read_record(struct scard_data *scard,
271 wpa_printf(MSG_DEBUG, "SCARD: file header did not "
281 wpa_hexdump(MSG_DEBUG, "SCARD: file header FSP template",
285 wpa_printf(MSG_MSGDUMP, "SCARD: file header TLV 0x%02x len=%d",
292 wpa_hexdump(MSG_MSGDUMP, "SCARD: File Descriptor TLV",
296 wpa_hexdump(MSG_MSGDUMP, "SCARD: File Identifier TLV",
300 wpa_hexdump(MSG_MSGDUMP, "SCARD: DF name (AID) TLV",
304 wpa_hexdump(MSG_MSGDUMP, "SCARD: Proprietary "
308 wpa_hexdump(MSG_MSGDUMP, "SCARD: Life Cycle Status "
312 wpa_hexdump(MSG_MSGDUMP, "SCARD: File size TLV",
320 wpa_printf(MSG_DEBUG, "SCARD: file_size=%d",
325 wpa_hexdump(MSG_MSGDUMP, "SCARD: Total file size TLV",
329 wpa_hexdump(MSG_MSGDUMP, "SCARD: PIN Status Template "
333 wpa_printf(MSG_DEBUG, "SCARD: PS_DO=0x%02x",
339 wpa_hexdump(MSG_MSGDUMP, "SCARD: Short File "
345 wpa_hexdump(MSG_MSGDUMP, "SCARD: Security attribute "
349 wpa_hexdump(MSG_MSGDUMP, "SCARD: Unrecognized TLV",
363 static int scard_pin_needed(struct scard_data *scard,
366 if (scard->sim_type == SCARD_GSM_SIM) {
373 if (scard->sim_type == SCARD_USIM) {
388 static int scard_get_aid(struct scard_data *scard, unsigned char *aid,
405 if (scard_select_file(scard, SCARD_FILE_EF_DIR, buf, &blen)) {
406 wpa_printf(MSG_DEBUG, "SCARD: Failed to read EF_DIR");
409 wpa_hexdump(MSG_DEBUG, "SCARD: EF_DIR select", buf, blen);
412 rlen = scard_get_record_len(scard, rec,
415 wpa_printf(MSG_DEBUG, "SCARD: Failed to get EF_DIR "
421 wpa_printf(MSG_DEBUG, "SCARD: Too long EF_DIR record");
424 if (scard_read_record(scard, buf, rlen, rec,
426 wpa_printf(MSG_DEBUG, "SCARD: Failed to read "
430 wpa_hexdump(MSG_DEBUG, "SCARD: EF_DIR record", buf, rlen);
433 wpa_printf(MSG_DEBUG, "SCARD: Unexpected application "
440 wpa_printf(MSG_DEBUG, "SCARD: Too long application "
447 wpa_printf(MSG_DEBUG, "SCARD: Unexpected application "
453 wpa_printf(MSG_DEBUG, "SCARD: Invalid AID length %d",
458 wpa_hexdump(MSG_DEBUG, "SCARD: AID from EF_DIR record",
463 wpa_printf(MSG_DEBUG, "SCARD: 3G USIM app found from "
470 wpa_printf(MSG_DEBUG, "SCARD: 3G USIM app not found "
476 wpa_printf(MSG_DEBUG, "SCARD: Too long AID");
502 struct scard_data *scard;
513 wpa_printf(MSG_DEBUG, "SCARD: initializing smart card interface");
516 scard = os_zalloc(sizeof(*scard));
517 if (scard == NULL)
521 &scard->ctx);
523 wpa_printf(MSG_DEBUG, "SCARD: Could not establish smart card "
528 ret = SCardListReaders(scard->ctx, NULL, NULL, &len);
530 wpa_printf(MSG_DEBUG, "SCARD: SCardListReaders failed "
540 wpa_printf(MSG_INFO, "SCARD: malloc failed\n");
544 ret = SCardListReaders(scard->ctx, NULL, readers, &len);
546 wpa_printf(MSG_DEBUG, "SCARD: SCardListReaders failed(2) "
551 wpa_printf(MSG_WARNING, "SCARD: No smart card readers "
555 wpa_hexdump_ascii(MSG_DEBUG, "SCARD: Readers", (u8 *) readers, len);
576 wpa_printf(MSG_WARNING, "SCARD: No reader with prefix '%s' "
582 wpa_printf(MSG_DEBUG, "SCARD: Selected reader='%S'", &readers[pos]);
584 wpa_printf(MSG_DEBUG, "SCARD: Selected reader='%s'", &readers[pos]);
587 ret = SCardConnect(scard->ctx, &readers[pos], SCARD_SHARE_SHARED,
589 &scard->card, &scard->protocol);
601 wpa_printf(MSG_DEBUG, "SCARD: card=0x%x active_protocol=%lu (%s)",
602 (unsigned int) scard->card, scard->protocol,
603 scard
605 ret = SCardBeginTransaction(scard->card);
607 wpa_printf(MSG_DEBUG, "SCARD: Could not begin transaction: "
615 scard->sim_type = SCARD_GSM_SIM;
617 wpa_printf(MSG_DEBUG, "SCARD: verifying USIM support");
618 if (_scard_select_file(scard, SCARD_FILE_MF, buf, &blen,
620 wpa_printf(MSG_DEBUG, "SCARD: USIM is not supported");
623 wpa_printf(MSG_DEBUG, "SCARD: Trying to use GSM SIM");
624 scard->sim_type = SCARD_GSM_SIM;
626 wpa_printf(MSG_DEBUG, "SCARD: USIM is supported");
627 scard->sim_type = SCARD_USIM;
631 if (scard->sim_type == SCARD_GSM_SIM) {
633 if (scard_select_file(scard, SCARD_FILE_MF, buf, &blen)) {
634 wpa_printf(MSG_DEBUG, "SCARD: Failed to read MF");
639 if (scard_select_file(scard, SCARD_FILE_GSM_DF, buf, &blen)) {
640 wpa_printf(MSG_DEBUG, "SCARD: Failed to read GSM DF");
647 aid_len = scard_get_aid(scard, aid, sizeof(aid));
649 wpa_printf(MSG_DEBUG, "SCARD: Failed to find AID for "
654 wpa_hexdump(MSG_DEBUG, "SCARD: 3G USIM AID", aid, aid_len);
659 if (_scard_select_file(scard, 0, buf, &blen, scard->sim_type,
661 wpa_printf(MSG_INFO, "SCARD: Failed to read 3G USIM "
663 wpa_hexdump(MSG_INFO, "SCARD: 3G USIM AID",
670 pin_needed = scard_pin_needed(scard, buf, blen);
672 wpa_printf(MSG_DEBUG, "SCARD: Failed to determine whether PIN "
677 scard->pin1_required = 1;
679 "counter=%d)", scard_get_pin_retry_counter(scard));
682 ret = SCardEndTransaction(scard->card, SCARD_LEAVE_CARD);
684 wpa_printf(MSG_DEBUG, "SCARD: Could not end transaction: "
688 return scard;
692 SCardEndTransaction(scard->card, SCARD_LEAVE_CARD);
694 scard_deinit(scard);
701 * @scard: Pointer to private data from scard_init()
705 int scard_set_pin(struct scard_data *scard, const char *pin)
707 if (scard == NULL)
711 if (scard->pin1_required) {
717 if (scard_verify_pin(scard, pin)) {
730 * @scard: Pointer to private data from scard_init()
734 void scard_deinit(struct scard_data *scard)
738 if (scard == NULL)
741 wpa_printf(MSG_DEBUG, "SCARD: deinitializing smart card interface");
742 if (scard->card) {
743 ret = SCardDisconnect(scard->card, SCARD_UNPOWER_CARD);
745 wpa_printf(MSG_DEBUG, "SCARD: Failed to disconnect "
750 if (scard->ctx) {
751 ret = SCardReleaseContext(scard->ctx);
757 os_free(scard);
762 static long scard_transmit(struct scard_data *scard,
769 wpa_hexdump_key(MSG_DEBUG, "SCARD: scard_transmit: send",
772 ret = SCardTransmit(scard->card,
773 scard->protocol == SCARD_PROTOCOL_T1 ?
779 wpa_hexdump(MSG_DEBUG, "SCARD: scard_transmit: recv",
782 wpa_printf(MSG_WARNING, "SCARD: SCardTransmit failed "
789 static int _scard_select_file(struct scard_data *scard, unsigned short file_id,
807 wpa_printf(MSG_DEBUG, "SCARD: select file %04x", file_id);
809 wpa_hexdump(MSG_DEBUG, "SCARD: select file by AID",
823 ret = scard_transmit(scard, cmd, cmdlen, resp, &len);
825 wpa_printf(MSG_WARNING, "SCARD: SCardTransmit failed "
831 wpa_printf(MSG_WARNING, "SCARD: unexpected resp len "
838 wpa_printf(MSG_WARNING, "SCARD: Security status not satisfied "
844 wpa_printf(MSG_DEBUG, "SCARD: used CLA not supported");
849 wpa_printf(MSG_WARNING, "SCARD: unexpected response 0x%02x "
855 wpa_printf(MSG_DEBUG, "SCARD: trying to get response (%d bytes)",
859 ret = scard_transmit(scard, get_resp, sizeof(get_resp), buf, &rlen);
865 wpa_printf(MSG_WARNING, "SCARD: SCardTransmit err=0x%lx\n", ret);
870 static int scard_select_file(struct scard_data *scard, unsigned short file_id,
873 return _scard_select_file(scard, file_id, buf, buf_len,
874 scard->sim_type, NULL, 0);
878 static int scard_get_record_len(struct scard_data *scard, unsigned char recnum,
886 if (scard->sim_type == SCARD_USIM)
893 ret = scard_transmit(scard, cmd, sizeof(cmd), buf, &blen);
895 wpa_printf(MSG_DEBUG, "SCARD: failed to determine file "
900 wpa_hexdump(MSG_DEBUG, "SCARD: file length determination response",
904 wpa_printf(MSG_DEBUG, "SCARD: unexpected response to file "
913 static int scard_read_record(struct scard_data *scard,
922 if (scard->sim_type == SCARD_USIM)
932 ret = scard_transmit(scard, cmd, sizeof(cmd), buf, &blen);
938 wpa_printf(MSG_DEBUG, "SCARD: record read returned unexpected "
946 wpa_printf(MSG_DEBUG, "SCARD: record read returned unexpected "
960 static int scard_read_file(struct scard_data *scard,
974 if (scard->sim_type == SCARD_USIM)
976 ret = scard_transmit(scard, cmd, sizeof(cmd), buf, &blen);
982 wpa_printf(MSG_DEBUG, "SCARD: file read returned unexpected "
990 wpa_printf(MSG_DEBUG, "SCARD: file read returned unexpected "
1004 static int scard_verify_pin(struct scard_data *scard, const char *pin)
1011 wpa_printf(MSG_DEBUG, "SCARD: verifying PIN");
1016 if (scard->sim_type == SCARD_USIM)
1022 ret = scard_transmit(scard, cmd, sizeof(cmd), resp, &len);
1027 wpa_printf(MSG_WARNING, "SCARD: PIN verification failed");
1031 wpa_printf(MSG_DEBUG, "SCARD: PIN verified successfully");
1036 int scard_get_pin_retry_counter(struct scard_data *scard)
1044 wpa_printf(MSG_DEBUG, "SCARD: fetching PIN retry counter");
1046 if (scard->sim_type == SCARD_USIM)
1051 ret = scard_transmit(scard, cmd, sizeof(cmd), resp, &len);
1056 wpa_printf(MSG_WARNING, "SCARD: failed to fetch PIN retry "
1063 wpa_printf(MSG_DEBUG, "SCARD: PIN has been blocked");
1070 wpa_printf(MSG_DEBUG, "SCARD: Unexpected PIN retry counter response "
1078 * @scard: Pointer to private data from scard_init()
1090 int scard_get_imsi(struct scard_data *scard, char *imsi, size_t *len)
1096 wpa_printf(MSG_DEBUG, "SCARD: reading IMSI from (GSM) EF-IMSI");
1098 if (scard_select_file(scard, SCARD_FILE_GSM_EF_IMSI, buf, &blen))
1101 wpa_printf(MSG_WARNING, "SCARD: too short (GSM) EF-IMSI "
1106 if (scard->sim_type == SCARD_GSM_SIM) {
1115 wpa_printf(MSG_DEBUG, "SCARD: invalid IMSI file length=%ld",
1121 wpa_printf(MSG_DEBUG, "SCARD: IMSI file length=%ld imsilen=%ld",
1128 if (scard_read_file(scard, buf, blen))
1156 * @scard: Pointer to private data from scard_init()
1164 int scard_get_mnc_len(struct scard_data *scard)
1170 wpa_printf(MSG_DEBUG, "SCARD: reading MNC len from (GSM) EF-AD");
1172 if (scard_select_file(scard, SCARD_FILE_GSM_EF_AD, buf, &blen))
1175 wpa_printf(MSG_WARNING, "SCARD: too short (GSM) EF-AD "
1180 if (scard->sim_type == SCARD_GSM_SIM) {
1187 wpa_printf(MSG_DEBUG, "SCARD: MNC length not available");
1191 wpa_printf(MSG_DEBUG, "SCARD: invalid file length=%ld",
1196 if (scard_read_file(scard, buf, file_size))
1200 wpa_printf(MSG_DEBUG, "SCARD: invalid MNC length=%ld",
1204 wpa_printf(MSG_DEBUG, "SCARD: MNC length=%ld", (long) buf[3]);
1211 * @scard: Pointer to private data from scard_init()
1224 int scard_gsm_auth(struct scard_data *scard, const unsigned char *_rand,
1234 if (scard == NULL)
1237 wpa_hexdump(MSG_DEBUG, "SCARD: GSM auth - RAND", _rand, 16);
1238 if (scard->sim_type == SCARD_GSM_SIM) {
1250 ret = scard_transmit(scard, cmd, cmdlen, resp, &len);
1254 if ((scard->sim_type == SCARD_GSM_SIM &&
1256 (scard->sim_type == SCARD_USIM &&
1258 wpa_printf(MSG_WARNING, "SCARD: unexpected response for GSM "
1266 ret = scard_transmit(scard, get_resp, sizeof(get_resp), buf, &len);
1270 if (scard->sim_type == SCARD_GSM_SIM) {
1272 wpa_printf(MSG_WARNING, "SCARD: unexpected data "
1281 wpa_printf(MSG_WARNING, "SCARD: unexpected data "
1287 wpa_printf(MSG_WARNING, "SCARD: unexpected SREC/Kc "
1295 wpa_hexdump(MSG_DEBUG, "SCARD: GSM auth - SRES", sres, 4);
1296 wpa_hexdump(MSG_DEBUG, "SCARD: GSM auth - Kc", kc, 8);
1304 * @scard: Pointer to private data from scard_init()
1322 int scard_umts_auth(struct scard_data *scard, const unsigned char *_rand,
1334 if (scard == NULL)
1337 if (scard->sim_type == SCARD_GSM_SIM) {
1338 wpa_printf(MSG_ERROR, "SCARD: Non-USIM card - cannot do UMTS "
1343 wpa_hexdump(MSG_DEBUG, "SCARD: UMTS auth - RAND", _rand, AKA_RAND_LEN);
1344 wpa_hexdump(MSG_DEBUG, "SCARD: UMTS auth - AUTN", autn, AKA_AUTN_LEN);
1351 ret = scard_transmit(scard, cmd, sizeof(cmd), resp, &len);
1356 wpa_hexdump(MSG_DEBUG, "SCARD: UMTS alg response", resp, len);
1359 wpa_printf(MSG_WARNING, "SCARD: UMTS auth failed - "
1363 wpa_printf(MSG_WARNING, "SCARD: unexpected response for UMTS "
1371 ret = scard_transmit(scard, get_resp, sizeof(get_resp), buf, &len);
1375 wpa_hexdump(MSG_DEBUG, "SCARD: UMTS get response result", buf, len);
1378 wpa_printf(MSG_DEBUG, "SCARD: UMTS Synchronization-Failure");
1380 wpa_hexdump(MSG_DEBUG, "SCARD: AUTS", auts, AKA_AUTS_LEN);
1388 wpa_printf(MSG_DEBUG, "SCARD: Invalid RES");
1394 wpa_hexdump(MSG_DEBUG, "SCARD: RES", res, *res_len);
1398 wpa_printf(MSG_DEBUG, "SCARD: Invalid CK");
1404 wpa_hexdump(MSG_DEBUG, "SCARD: CK", ck, CK_LEN);
1408 wpa_printf(MSG_DEBUG, "SCARD: Invalid IK");
1414 wpa_hexdump(MSG_DEBUG, "SCARD: IK", ik, IK_LEN);
1419 wpa_printf(MSG_DEBUG, "SCARD: Unrecognized response");
1424 int scard_supports_umts(struct scard_data *scard)
1426 return scard->sim_type == SCARD_USIM;