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