FreeCalypso > hg > fc-sim-tools
comparison utils/fcsim1-mkprov.c @ 82:28fae57b3e29
fcsim1-mkprov: add OTA_C and OTA_D key generation
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Sat, 10 Apr 2021 23:21:47 +0000 |
| parents | 38c14fa89937 |
| children | 6041c601304d |
comparison
equal
deleted
inserted
replaced
| 81:8c23d2a9c013 | 82:28fae57b3e29 |
|---|---|
| 91 goto usage; | 91 goto usage; |
| 92 set_iccid(argv[optind]); | 92 set_iccid(argv[optind]); |
| 93 set_imsi(argv[optind+1]); | 93 set_imsi(argv[optind+1]); |
| 94 } | 94 } |
| 95 | 95 |
| 96 static unsigned | |
| 97 make_odd_parity(byte) | |
| 98 unsigned byte; | |
| 99 { | |
| 100 unsigned mask, p; | |
| 101 | |
| 102 p = 0; | |
| 103 for (mask = 0x80; mask; mask >>= 1) | |
| 104 if (byte & mask) | |
| 105 p = !p; | |
| 106 if (!p) | |
| 107 byte ^= 0x01; | |
| 108 return byte; | |
| 109 } | |
| 110 | |
| 96 static void | 111 static void |
| 97 get_random_ki(strbuf) | 112 get_random_key(strbuf, oddpar) |
| 98 char *strbuf; | 113 char *strbuf; |
| 99 { | 114 { |
| 100 u_char bin[16]; | 115 u_char bin[16]; |
| 101 char *dp; | 116 char *dp; |
| 102 unsigned n; | 117 unsigned n; |
| 104 | 119 |
| 105 rc = read(random_fd, bin, 16); | 120 rc = read(random_fd, bin, 16); |
| 106 if (rc != 16) { | 121 if (rc != 16) { |
| 107 fprintf(stderr, "error reading from %s\n", random_file); | 122 fprintf(stderr, "error reading from %s\n", random_file); |
| 108 exit(1); | 123 exit(1); |
| 124 } | |
| 125 if (oddpar) { | |
| 126 for (n = 0; n < 16; n++) | |
| 127 bin[n] = make_odd_parity(bin[n]); | |
| 109 } | 128 } |
| 110 dp = strbuf; | 129 dp = strbuf; |
| 111 for (n = 0; n < 16; n++) { | 130 for (n = 0; n < 16; n++) { |
| 112 sprintf(dp, "%02X", bin[n]); | 131 sprintf(dp, "%02X", bin[n]); |
| 113 dp += 2; | 132 dp += 2; |
| 118 static void | 137 static void |
| 119 make_one_card() | 138 make_one_card() |
| 120 { | 139 { |
| 121 unsigned acc_mask; | 140 unsigned acc_mask; |
| 122 char iccid_str[20], imsi_str[16], ki_str[33]; | 141 char iccid_str[20], imsi_str[16], ki_str[33]; |
| 123 char msisdn_str[21]; | 142 char msisdn_str[21], otac_str[33], otad_str[33]; |
| 124 | 143 |
| 125 nibbles_to_ascii(iccid_bin, 19, iccid_str); | 144 nibbles_to_ascii(iccid_bin, 19, iccid_str); |
| 126 nibbles_to_ascii(imsi_bin, 15, imsi_str); | 145 nibbles_to_ascii(imsi_bin, 15, imsi_str); |
| 127 acc_mask = 1 << access_class; | 146 acc_mask = 1 << access_class; |
| 128 get_random_ki(ki_str); | 147 get_random_key(ki_str, 0); |
| 129 printf("ICCID=%s IMSI=%s ACC=%04X Ki=%s", iccid_str, imsi_str, | 148 get_random_key(otac_str, 1); |
| 130 acc_mask, ki_str); | 149 get_random_key(otad_str, 1); |
| 150 printf("ICCID=%s IMSI=%s ACC=%04X Ki=%s OTA_C=%s OTA_D=%s", iccid_str, | |
| 151 imsi_str, acc_mask, ki_str, otac_str, otad_str); | |
| 131 if (msisdn_set) { | 152 if (msisdn_set) { |
| 132 fputs(" MSISDN=", stdout); | 153 fputs(" MSISDN=", stdout); |
| 133 if (msisdn_plus) | 154 if (msisdn_plus) |
| 134 putchar('+'); | 155 putchar('+'); |
| 135 nibbles_to_ascii(msisdn_bin, msisdn_digits, msisdn_str); | 156 nibbles_to_ascii(msisdn_bin, msisdn_digits, msisdn_str); |
