# HG changeset patch # User Mychaela Falconia # Date 1618096907 0 # Node ID 28fae57b3e29e2af5d20b8f95668bbe7c3b81560 # Parent 8c23d2a9c013ce4499553927b026e2e1543c229f fcsim1-mkprov: add OTA_C and OTA_D key generation diff -r 8c23d2a9c013 -r 28fae57b3e29 utils/fcsim1-mkprov.c --- a/utils/fcsim1-mkprov.c Fri Apr 09 08:35:54 2021 +0000 +++ b/utils/fcsim1-mkprov.c Sat Apr 10 23:21:47 2021 +0000 @@ -93,8 +93,23 @@ set_imsi(argv[optind+1]); } +static unsigned +make_odd_parity(byte) + unsigned byte; +{ + unsigned mask, p; + + p = 0; + for (mask = 0x80; mask; mask >>= 1) + if (byte & mask) + p = !p; + if (!p) + byte ^= 0x01; + return byte; +} + static void -get_random_ki(strbuf) +get_random_key(strbuf, oddpar) char *strbuf; { u_char bin[16]; @@ -107,6 +122,10 @@ fprintf(stderr, "error reading from %s\n", random_file); exit(1); } + if (oddpar) { + for (n = 0; n < 16; n++) + bin[n] = make_odd_parity(bin[n]); + } dp = strbuf; for (n = 0; n < 16; n++) { sprintf(dp, "%02X", bin[n]); @@ -120,14 +139,16 @@ { unsigned acc_mask; char iccid_str[20], imsi_str[16], ki_str[33]; - char msisdn_str[21]; + char msisdn_str[21], otac_str[33], otad_str[33]; nibbles_to_ascii(iccid_bin, 19, iccid_str); nibbles_to_ascii(imsi_bin, 15, imsi_str); acc_mask = 1 << access_class; - get_random_ki(ki_str); - printf("ICCID=%s IMSI=%s ACC=%04X Ki=%s", iccid_str, imsi_str, - acc_mask, ki_str); + get_random_key(ki_str, 0); + get_random_key(otac_str, 1); + get_random_key(otad_str, 1); + printf("ICCID=%s IMSI=%s ACC=%04X Ki=%s OTA_C=%s OTA_D=%s", iccid_str, + imsi_str, acc_mask, ki_str, otac_str, otad_str); if (msisdn_set) { fputs(" MSISDN=", stdout); if (msisdn_plus)