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); |