FreeCalypso > hg > fc-pcsc-tools
view simtool/chv.c @ 228:a93de68711b8
original README is now README.old
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 14 Mar 2021 18:16:27 +0000 |
parents | afd6a805c518 |
children |
line wrap: on
line source
/* * This module implements the standard set of CHV commands * for GSM 11.11 SIMs. */ #include <sys/types.h> #include <stdio.h> #include "simresp.h" cmd_verify_chv(argc, argv) char **argv; { u_char cmd[13]; int rc; /* VERIFY CHV command APDU */ cmd[0] = 0xA0; cmd[1] = 0x20; cmd[2] = 0x00; switch (argv[0][10]) { case '1': cmd[3] = 0x01; break; case '2': cmd[3] = 0x02; break; default: fprintf(stderr, "BUG in verify-chvN command\n"); return(-1); } cmd[4] = 8; rc = encode_pin_entry(argv[1], cmd + 5); if (rc < 0) return(rc); rc = apdu_exchange(cmd, 13); if (rc < 0) return(rc); if (sim_resp_sw != 0x9000) { fprintf(stderr, "bad SW response: %04X\n", sim_resp_sw); return(-1); } return(0); } cmd_change_chv(argc, argv) char **argv; { u_char cmd[21]; int rc; /* CHANGE CHV command APDU */ cmd[0] = 0xA0; cmd[1] = 0x24; cmd[2] = 0x00; switch (argv[0][10]) { case '1': cmd[3] = 0x01; break; case '2': cmd[3] = 0x02; break; default: fprintf(stderr, "BUG in change-chvN command\n"); return(-1); } cmd[4] = 16; rc = encode_pin_entry(argv[1], cmd + 5); if (rc < 0) return(rc); rc = encode_pin_entry(argv[2], cmd + 13); if (rc < 0) return(rc); rc = apdu_exchange(cmd, 21); if (rc < 0) return(rc); if (sim_resp_sw != 0x9000) { fprintf(stderr, "bad SW response: %04X\n", sim_resp_sw); return(-1); } return(0); } cmd_disable_chv1(argc, argv) char **argv; { u_char cmd[13]; int rc; /* DISABLE CHV command APDU */ cmd[0] = 0xA0; cmd[1] = 0x26; cmd[2] = 0x00; cmd[3] = 0x01; cmd[4] = 8; rc = encode_pin_entry(argv[1], cmd + 5); if (rc < 0) return(rc); rc = apdu_exchange(cmd, 13); if (rc < 0) return(rc); if (sim_resp_sw != 0x9000) { fprintf(stderr, "bad SW response: %04X\n", sim_resp_sw); return(-1); } return(0); } cmd_disable_chv1_rpt(argc, argv) char **argv; { u_char cmd[13]; int rc; /* DISABLE CHV command APDU */ cmd[0] = 0xA0; cmd[1] = 0x26; cmd[2] = 0x00; cmd[3] = 0x01; cmd[4] = 8; rc = encode_pin_entry(argv[1], cmd + 5); if (rc < 0) return(rc); rc = apdu_exchange(cmd, 13); if (rc < 0) return(rc); if (sim_resp_sw != 0x9000 && sim_resp_sw != 0x9808) { fprintf(stderr, "bad SW response: %04X\n", sim_resp_sw); return(-1); } return(0); } cmd_enable_chv1(argc, argv) char **argv; { u_char cmd[13]; int rc; /* ENABLE CHV command APDU */ cmd[0] = 0xA0; cmd[1] = 0x28; cmd[2] = 0x00; cmd[3] = 0x01; cmd[4] = 8; rc = encode_pin_entry(argv[1], cmd + 5); if (rc < 0) return(rc); rc = apdu_exchange(cmd, 13); if (rc < 0) return(rc); if (sim_resp_sw != 0x9000) { fprintf(stderr, "bad SW response: %04X\n", sim_resp_sw); return(-1); } return(0); } cmd_enable_chv1_rpt(argc, argv) char **argv; { u_char cmd[13]; int rc; /* ENABLE CHV command APDU */ cmd[0] = 0xA0; cmd[1] = 0x28; cmd[2] = 0x00; cmd[3] = 0x01; cmd[4] = 8; rc = encode_pin_entry(argv[1], cmd + 5); if (rc < 0) return(rc); rc = apdu_exchange(cmd, 13); if (rc < 0) return(rc); if (sim_resp_sw != 0x9000 && sim_resp_sw != 0x9808) { fprintf(stderr, "bad SW response: %04X\n", sim_resp_sw); return(-1); } return(0); } cmd_unblock_chv(argc, argv) char **argv; { u_char cmd[21]; int rc; /* UNBLOCK CHV command APDU */ cmd[0] = 0xA0; cmd[1] = 0x2C; cmd[2] = 0x00; switch (argv[0][11]) { case '1': cmd[3] = 0x00; break; case '2': cmd[3] = 0x02; break; default: fprintf(stderr, "BUG in unblock-chvN command\n"); return(-1); } cmd[4] = 16; rc = encode_pin_entry(argv[1], cmd + 5); if (rc < 0) return(rc); rc = encode_pin_entry(argv[2], cmd + 13); if (rc < 0) return(rc); rc = apdu_exchange(cmd, 21); if (rc < 0) return(rc); if (sim_resp_sw != 0x9000) { fprintf(stderr, "bad SW response: %04X\n", sim_resp_sw); return(-1); } return(0); }