FreeCalypso > hg > fc-pcsc-tools
view simtool/grcard2.c @ 127:08ba6a5d8a3f
doc/Low-level-commands: INVALIDATE and REHABILITATE documented
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 20 Feb 2021 19:53:08 +0000 |
parents | 8562d8508cf2 |
children | 8a5c132fe871 |
line wrap: on
line source
/* * I, Mother Mychaela, am hoping to get some SIM cards from Grcard * that follow the protocol which the Osmocom community has nicknamed * GrcardSIM2: * * https://osmocom.org/projects/cellular-infrastructure/wiki/GrcardSIM2 * * I haven't got these cards yet and may not get them for a long time, * hence the following code has been written blindly, untested. * If anyone in the community happens to have a sysmoSIM-GR2 card * that was once (aeons ago) sold by Sysmocom, please test this code! */ #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_adm(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_adm_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); }