FreeCalypso > hg > fc-sim-tools
view simtool/grcard2pins.c @ 102:c2f18d7b0a1e
doc/Admin-write-commands: document write-hplmn-timer command
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 14 May 2022 23:20:38 +0000 |
parents | a5cfe5135701 |
children |
line wrap: on
line source
/* * This module implements special commands for the grcard.cn card model * which is known in the Osmocom community as GrcardSIM2: * * https://osmocom.org/projects/cellular-infrastructure/wiki/GrcardSIM2 * * FreeCalypso Community SIM model FCSIM1 is GrcardSIM2, and so are * historical sysmoSIM-GR2 and 30C3 cards. */ #include <sys/types.h> #include <stdio.h> #include "simresp.h" cmd_grcard2_set_pin(argc, argv) char **argv; { u_char cmd[13]; int rc; /* Grcard2 proprietary command APDU */ cmd[0] = 0xA0; cmd[1] = 0xD4; cmd[2] = 0x3A; switch (argv[0][15]) { case '1': cmd[3] = 0x01; break; case '2': cmd[3] = 0x02; break; default: fprintf(stderr, "BUG in grcard2-set-pinN 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_grcard2_set_puk(argc, argv) char **argv; { u_char cmd[13]; int rc; /* Grcard2 proprietary command APDU */ cmd[0] = 0xA0; cmd[1] = 0xD4; cmd[2] = 0x3B; switch (argv[0][15]) { case '1': cmd[3] = 0x00; break; case '2': cmd[3] = 0x02; break; default: fprintf(stderr, "BUG in grcard2-set-pukN 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_grcard2_set_adm5(argc, argv) char **argv; { u_char cmd[13]; int rc; /* Grcard2 proprietary command APDU */ cmd[0] = 0xA0; cmd[1] = 0xD4; cmd[2] = 0x3A; cmd[3] = 0x05; 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_grcard2_set_adm5_hex(argc, argv) char **argv; { u_char cmd[13]; int rc; /* Grcard2 proprietary command APDU */ cmd[0] = 0xA0; cmd[1] = 0xD4; cmd[2] = 0x3A; cmd[3] = 0x05; cmd[4] = 8; rc = decode_hex_data_from_string(argv[1], cmd + 5, 8, 8); 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_grcard2_set_super(argc, argv) char **argv; { u_char cmd[13]; int rc; /* Grcard2 proprietary command APDU */ cmd[0] = 0xA0; cmd[1] = 0xD4; cmd[2] = 0x3A; cmd[3] = 0x0B; 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_grcard2_set_super_hex(argc, argv) char **argv; { u_char cmd[13]; int rc; /* Grcard2 proprietary command APDU */ cmd[0] = 0xA0; cmd[1] = 0xD4; cmd[2] = 0x3A; cmd[3] = 0x0B; cmd[4] = 8; rc = decode_hex_data_from_string(argv[1], cmd + 5, 8, 8); 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); }