text, string formatter, and something still complains in the GH actions

This commit is contained in:
iceman1001 2024-09-06 10:47:08 +02:00
commit b05ccae642
5 changed files with 55 additions and 17 deletions

View file

@ -96,7 +96,7 @@ static bool search_match(const NtData *pND, const NtData *pND0, uint64_t key) {
struct Crypto1State *s; struct Crypto1State *s;
s = crypto1_create(0); s = crypto1_create(0);
if (s == NULL) { if (s == NULL) {
fprintf(stderr, "\nMalloc error in search_match!\n"); fprintf(stderr, "\nCalloc error in search_match!\n");
return 0; return 0;
} }
crypto1_init(s, key); crypto1_init(s, key);
@ -167,7 +167,7 @@ static void *generate_and_intersect_keys(void *threadarg) {
revstate = lfsr_recovery32(ks1, nt_probe); revstate = lfsr_recovery32(ks1, nt_probe);
if (revstate == NULL) { if (revstate == NULL) {
fprintf(stderr, "\nMalloc error in generate_and_intersect_keys!\n"); fprintf(stderr, "\nCalloc error in generate_and_intersect_keys!\n");
pthread_exit(NULL); pthread_exit(NULL);
} }
@ -367,6 +367,7 @@ static void analyze_keys(uint64_t **keys, uint32_t keyCounts[MAX_NR_NONCES], uin
} }
int main(int argc, char *const argv[]) { int main(int argc, char *const argv[]) {
if (argc < 2) { if (argc < 2) {
int cmdlen = strlen(argv[0]); int cmdlen = strlen(argv[0]);
printf("Usage:\n %s <uid1> <nt_enc1> <nt_par_err1> <uid2> <nt_enc2> <nt_par_err2> ...\n", argv[0]); printf("Usage:\n %s <uid1> <nt_enc1> <nt_par_err1> <uid2> <nt_enc2> <nt_par_err2> ...\n", argv[0]);
@ -379,10 +380,12 @@ int main(int argc, char *const argv[]) {
printf(" %*s +nt_par_err1 +nt_par_err2 +nt_par_err3\n", cmdlen, ""); printf(" %*s +nt_par_err1 +nt_par_err2 +nt_par_err3\n", cmdlen, "");
return 1; return 1;
} }
if (argc < 1 + 2 * 3) { if (argc < 1 + 2 * 3) {
fprintf(stderr, "Too few nonces, abort. Need 2 nonces min.\n"); fprintf(stderr, "Too few nonces, abort. Need 2 nonces min.\n");
return 1; return 1;
} }
if (argc > 1 + MAX_NR_NONCES * 3) { if (argc > 1 + MAX_NR_NONCES * 3) {
fprintf(stderr, "Too many nonces, abort. Choose max %i nonces.\n", MAX_NR_NONCES); fprintf(stderr, "Too many nonces, abort. Choose max %i nonces.\n", MAX_NR_NONCES);
return 1; return 1;
@ -393,29 +396,37 @@ int main(int argc, char *const argv[]) {
uint32_t keyCounts[MAX_NR_NONCES] = {0}; uint32_t keyCounts[MAX_NR_NONCES] = {0};
uint32_t authuid = hex_to_uint32(argv[1]); uint32_t authuid = hex_to_uint32(argv[1]);
// process all args. // process all args.
printf("Generating nonce candidates...\n"); printf("Generating nonce candidates...\n");
for (uint32_t i = 1; i < argc; i += 3) { for (uint32_t i = 1; i < argc; i += 3) {
// uid + ntEnc + parEnc // uid + ntEnc + parEnc
if (strcmp(argv[i], ".") != 0) { if (strcmp(argv[i], ".") != 0) {
authuid = hex_to_uint32(argv[i]); authuid = hex_to_uint32(argv[i]);
} }
uint32_t nt_enc = hex_to_uint32(argv[i + 1]); uint32_t nt_enc = hex_to_uint32(argv[i + 1]);
uint8_t nt_par_err_arr[4]; uint8_t nt_par_err_arr[4];
if (bin_to_uint8_arr(argv[i + 2], nt_par_err_arr, 4)) { if (bin_to_uint8_arr(argv[i + 2], nt_par_err_arr, 4)) {
return 1; return 1;
} }
uint8_t nt_par_enc = ((nt_par_err_arr[0] ^ oddparity8((nt_enc >> 24) & 0xFF)) << 3) | uint8_t nt_par_enc = ((nt_par_err_arr[0] ^ oddparity8((nt_enc >> 24) & 0xFF)) << 3) |
((nt_par_err_arr[1] ^ oddparity8((nt_enc >> 16) & 0xFF)) << 2) | ((nt_par_err_arr[1] ^ oddparity8((nt_enc >> 16) & 0xFF)) << 2) |
((nt_par_err_arr[2] ^ oddparity8((nt_enc >> 8) & 0xFF)) << 1) | ((nt_par_err_arr[2] ^ oddparity8((nt_enc >> 8) & 0xFF)) << 1) |
((nt_par_err_arr[3] ^ oddparity8((nt_enc >> 0) & 0xFF)) << 0); ((nt_par_err_arr[3] ^ oddparity8((nt_enc >> 0) & 0xFF)) << 0);
NtData *pNtData = &NKL.NtDataList[NKL.nr_nonces]; NtData *pNtData = &NKL.NtDataList[NKL.nr_nonces];
// Try to recover the keystream1 // Try to recover the keystream1
uint32_t nttest = prng_successor(1, 16); // a first valid nonce uint32_t nttest = prng_successor(1, 16); // a first valid nonce
pNtData->pNK = (NtpKs1 *)calloc(8192, sizeof(NtpKs1)); // 2**16 filtered with 3 parity bits => 2**13 pNtData->pNK = (NtpKs1 *)calloc(8192, sizeof(NtpKs1)); // 2**16 filtered with 3 parity bits => 2**13
if (pNtData->pNK == NULL) { if (pNtData->pNK == NULL) {
return 1; return 1;
} }
uint32_t j = 0; uint32_t j = 0;
for (uint16_t m = 1; m; m++) { for (uint16_t m = 1; m; m++) {
uint32_t ks1 = nt_enc ^ nttest; uint32_t ks1 = nt_enc ^ nttest;
@ -426,6 +437,7 @@ int main(int argc, char *const argv[]) {
} }
nttest = prng_successor(nttest, 1); nttest = prng_successor(nttest, 1);
} }
printf("uid=%08x nt_enc=%08x nt_par_err=%i%i%i%i nt_par_enc=%i%i%i%i %u/%i: %u\n" printf("uid=%08x nt_enc=%08x nt_par_err=%i%i%i%i nt_par_enc=%i%i%i%i %u/%i: %u\n"
, authuid , authuid
, nt_enc , nt_enc
@ -448,12 +460,15 @@ int main(int argc, char *const argv[]) {
printf("Finding key candidates...\n"); printf("Finding key candidates...\n");
keys = unpredictable_nested(&NKL, keyCounts); keys = unpredictable_nested(&NKL, keyCounts);
printf("\n\nFinding phase complete.\n"); printf("\n\nFinding phase complete.\n");
for (uint32_t k = 0; k < NKL.nr_nonces; k++) for (uint32_t k = 0; k < NKL.nr_nonces; k++) {
free(NKL.NtDataList[k].pNK); free(NKL.NtDataList[k].pNK);
}
analyze_keys(keys, keyCounts, NKL.nr_nonces); analyze_keys(keys, keyCounts, NKL.nr_nonces);
FILE *fptr; FILE *fptr;
// opening the file in read mode // opening the file in read mode
fptr = fopen("keys.dic", "w"); fptr = fopen("keys.dic", "w");
@ -469,11 +484,13 @@ int main(int argc, char *const argv[]) {
} else { } else {
fprintf(stderr, "Warning: Cannot save keys in keys.dic\n"); fprintf(stderr, "Warning: Cannot save keys in keys.dic\n");
} }
for (uint32_t i = 1; i < NKL.nr_nonces; i++) { for (uint32_t i = 1; i < NKL.nr_nonces; i++) {
if (keys[i] != NULL) { if (keys[i] != NULL) {
free(keys[i]); free(keys[i]);
} }
} }
if (keys != NULL) { if (keys != NULL) {
free(keys); free(keys);
} }

View file

@ -54,7 +54,7 @@ static uint64_t *generate_keys(uint64_t authuid, uint32_t nt, uint32_t nt_enc, u
uint64_t *result_keys = (uint64_t *)calloc(1, KEY_SPACE_SIZE * sizeof(uint64_t)); uint64_t *result_keys = (uint64_t *)calloc(1, KEY_SPACE_SIZE * sizeof(uint64_t));
if (result_keys == NULL) { if (result_keys == NULL) {
fprintf(stderr, "\nMalloc error in generate_and_intersect_keys!\n"); fprintf(stderr, "\nCalloc error in generate_and_intersect_keys!\n");
return NULL; return NULL;
} }
@ -64,7 +64,7 @@ static uint64_t *generate_keys(uint64_t authuid, uint32_t nt, uint32_t nt_enc, u
revstate = lfsr_recovery32(ks1, nt ^ authuid); revstate = lfsr_recovery32(ks1, nt ^ authuid);
if (revstate == NULL) { if (revstate == NULL) {
fprintf(stderr, "\nMalloc error in generate_keys!\n"); fprintf(stderr, "\nCalloc error in generate_keys!\n");
free(result_keys); free(result_keys);
return NULL; return NULL;
} }
@ -73,7 +73,7 @@ static uint64_t *generate_keys(uint64_t authuid, uint32_t nt, uint32_t nt_enc, u
s = crypto1_create(0); s = crypto1_create(0);
if (s == NULL) { if (s == NULL) {
fprintf(stderr, "\nMalloc error in generate_keys!\n"); fprintf(stderr, "\nCalloc error in generate_keys!\n");
free(result_keys); free(result_keys);
crypto1_destroy(revstate_start); crypto1_destroy(revstate_start);
return 0; return 0;
@ -109,6 +109,7 @@ static uint64_t *generate_keys(uint64_t authuid, uint32_t nt, uint32_t nt_enc, u
} }
int main(int argc, char *const argv[]) { int main(int argc, char *const argv[]) {
if (argc != 6) { if (argc != 6) {
int cmdlen = strlen(argv[0]); int cmdlen = strlen(argv[0]);
printf("Usage:\n %s <uid:hex> <sector:dec> <nt:hex> <nt_enc:hex> <nt_par_err:bin>\n" printf("Usage:\n %s <uid:hex> <sector:dec> <nt:hex> <nt_enc:hex> <nt_par_err:bin>\n"
@ -120,6 +121,7 @@ int main(int argc, char *const argv[]) {
argv[0], cmdlen, argv[0], cmdlen, ""); argv[0], cmdlen, argv[0], cmdlen, "");
return 1; return 1;
} }
uint64_t *keys = NULL; uint64_t *keys = NULL;
uint32_t keyCount = 0; uint32_t keyCount = 0;
@ -127,22 +129,36 @@ int main(int argc, char *const argv[]) {
uint32_t sector = atoi(argv[2]); uint32_t sector = atoi(argv[2]);
uint32_t nt = hex_to_uint32(argv[3]); uint32_t nt = hex_to_uint32(argv[3]);
uint32_t nt_enc = hex_to_uint32(argv[4]); uint32_t nt_enc = hex_to_uint32(argv[4]);
uint8_t nt_par_err_arr[4]; uint8_t nt_par_err_arr[4];
if (bin_to_uint8_arr(argv[5], nt_par_err_arr, 4)) { if (bin_to_uint8_arr(argv[5], nt_par_err_arr, 4)) {
return 1; return 1;
} }
uint8_t nt_par_enc = ((nt_par_err_arr[0] ^ oddparity8((nt_enc >> 24) & 0xFF)) << 3) | uint8_t nt_par_enc = ((nt_par_err_arr[0] ^ oddparity8((nt_enc >> 24) & 0xFF)) << 3) |
((nt_par_err_arr[1] ^ oddparity8((nt_enc >> 16) & 0xFF)) << 2) | ((nt_par_err_arr[1] ^ oddparity8((nt_enc >> 16) & 0xFF)) << 2) |
((nt_par_err_arr[2] ^ oddparity8((nt_enc >> 8) & 0xFF)) << 1) | ((nt_par_err_arr[2] ^ oddparity8((nt_enc >> 8) & 0xFF)) << 1) |
((nt_par_err_arr[3] ^ oddparity8((nt_enc >> 0) & 0xFF)) << 0); ((nt_par_err_arr[3] ^ oddparity8((nt_enc >> 0) & 0xFF)) << 0);
printf("uid=%08x nt=%08x nt_enc=%08x nt_par_err=%i%i%i%i nt_par_enc=%i%i%i%i ks1=%08x\n", authuid, nt, nt_enc,
nt_par_err_arr[0], nt_par_err_arr[1], nt_par_err_arr[2], nt_par_err_arr[3], printf("uid=%08x nt=%08x nt_enc=%08x nt_par_err=%u%u%u%u nt_par_enc=%u%u%u%u ks1=%08x\n"
(nt_par_enc >> 3) & 1, (nt_par_enc >> 2) & 1, (nt_par_enc >> 1) & 1, nt_par_enc & 1, , authuid
nt ^ nt_enc); , nt
, nt_enc
, nt_par_err_arr[0]
, nt_par_err_arr[1]
, nt_par_err_arr[2]
, nt_par_err_arr[3]
, (nt_par_enc >> 3) & 1
, (nt_par_enc >> 2) & 1
, (nt_par_enc >> 1) & 1
, nt_par_enc & 1
, nt ^ nt_enc
);
printf("Finding key candidates...\n"); printf("Finding key candidates...\n");
keys = generate_keys(authuid, nt, nt_enc, nt_par_enc, &keyCount); keys = generate_keys(authuid, nt, nt_enc, nt_par_enc, &keyCount);
printf("Finding phase complete, found %u keys\n", keyCount); printf("Finding phase complete, found %u keys\n", keyCount);
FILE *fptr; FILE *fptr;
@ -160,6 +176,7 @@ int main(int argc, char *const argv[]) {
} else { } else {
fprintf(stderr, "Warning: Cannot save keys in %s\n", filename); fprintf(stderr, "Warning: Cannot save keys in %s\n", filename);
} }
if (keys != NULL) { if (keys != NULL) {
free(keys); free(keys);
} }

View file

@ -107,12 +107,14 @@ static void pm3_staticnested(uint32_t uid, uint32_t nt1, uint32_t ks1, uint32_t
pthread_t thread_id[2]; pthread_t thread_id[2];
// create and run worker threads // create and run worker threads
for (uint8_t i = 0; i < 2; i++) for (uint8_t i = 0; i < 2; i++) {
pthread_create(thread_id + i, NULL, nested_worker_thread, &statelists[i]); pthread_create(thread_id + i, NULL, nested_worker_thread, &statelists[i]);
}
// wait for threads to terminate: // wait for threads to terminate:
for (uint8_t i = 0; i < 2; i++) for (uint8_t i = 0; i < 2; i++) {
pthread_join(thread_id[i], (void *)&statelists[i].head.slhead); pthread_join(thread_id[i], (void *)&statelists[i].head.slhead);
}
// the first 16 Bits of the cryptostate already contain part of our key. // the first 16 Bits of the cryptostate already contain part of our key.
// Create the intersection of the two lists based on these 16 Bits and // Create the intersection of the two lists based on these 16 Bits and
@ -125,6 +127,7 @@ static void pm3_staticnested(uint32_t uid, uint32_t nt1, uint32_t ks1, uint32_t
struct Crypto1State savestate; struct Crypto1State savestate;
savestate = *p1; savestate = *p1;
while (compare16Bits(p1, &savestate) == 0 && p1 <= statelists[0].tail.sltail) { while (compare16Bits(p1, &savestate) == 0 && p1 <= statelists[0].tail.sltail) {
*p3 = *p1; *p3 = *p1;
lfsr_rollback_word(p3, statelists[0].nt_enc ^ statelists[0].uid, 0); lfsr_rollback_word(p3, statelists[0].nt_enc ^ statelists[0].uid, 0);
@ -132,6 +135,7 @@ static void pm3_staticnested(uint32_t uid, uint32_t nt1, uint32_t ks1, uint32_t
p1++; p1++;
} }
savestate = *p2; savestate = *p2;
while (compare16Bits(p2, &savestate) == 0 && p2 <= statelists[1].tail.sltail) { while (compare16Bits(p2, &savestate) == 0 && p2 <= statelists[1].tail.sltail) {
*p4 = *p2; *p4 = *p2;
lfsr_rollback_word(p4, statelists[1].nt_enc ^ statelists[1].uid, 0); lfsr_rollback_word(p4, statelists[1].nt_enc ^ statelists[1].uid, 0);
@ -219,6 +223,7 @@ int main(int argc, char *const argv[]) {
uint32_t key_count = 0; uint32_t key_count = 0;
uint64_t *keys = nested(pNK, 2, uid, &key_count); uint64_t *keys = nested(pNK, 2, uid, &key_count);
if (key_count) { if (key_count) {
printf("Ultra Static nested --> Found " _YELLOW_("%u") " key candidates\n", key_count); printf("Ultra Static nested --> Found " _YELLOW_("%u") " key candidates\n", key_count);
for (uint32_t k = 0; k < key_count; k++) { for (uint32_t k = 0; k < key_count; k++) {

View file

@ -78,14 +78,13 @@ int main(int argc, char *const argv[]) {
uint32_t uid1, sector1, nt1, uid2, sector2, nt2; uint32_t uid1, sector1, nt1, uid2, sector2, nt2;
char *filename1 = argv[1], *filename2 = argv[2]; char *filename1 = argv[1], *filename2 = argv[2];
int result; int result = sscanf(filename1, "keys_%8x_%2u_%8x.dic", &uid1, &sector1, &nt1);
result = sscanf(filename1, "keys_%8x_%2d_%8x.dic", &uid1, &sector1, &nt1);
if (result != 3) { if (result != 3) {
fprintf(stderr, "Error: Failed to parse the filename %s.\n", filename1); fprintf(stderr, "Error: Failed to parse the filename %s.\n", filename1);
return 1; return 1;
} }
result = sscanf(filename2, "keys_%8x_%2d_%8x.dic", &uid2, &sector2, &nt2); result = sscanf(filename2, "keys_%8x_%2u_%8x.dic", &uid2, &sector2, &nt2);
if (result != 3) { if (result != 3) {
fprintf(stderr, "Error: Failed to parse the filename %s.\n", filename2); fprintf(stderr, "Error: Failed to parse the filename %s.\n", filename2);
return 1; return 1;

View file

@ -92,7 +92,7 @@ int main(int argc, char *const argv[]) {
char *filename = argv[3]; char *filename = argv[3];
uint32_t uid, sector, nt2; uint32_t uid, sector, nt2;
int result = sscanf(filename, "keys_%8x_%2d_%8x.dic", &uid, &sector, &nt2); int result = sscanf(filename, "keys_%8x_%2u_%8x.dic", &uid, &sector, &nt2);
if (result != 3) { if (result != 3) {
fprintf(stderr, "Error: Failed to parse the filename %s.\n", filename); fprintf(stderr, "Error: Failed to parse the filename %s.\n", filename);
return 1; return 1;
@ -116,7 +116,7 @@ int main(int argc, char *const argv[]) {
keycount2++; keycount2++;
} }
keys2 = (uint64_t *)malloc(keycount2 * sizeof(uint64_t)); keys2 = (uint64_t *)calloc(1, keycount2 * sizeof(uint64_t));
if (keys2 == NULL) { if (keys2 == NULL) {
perror("Failed to allocate memory"); perror("Failed to allocate memory");
fclose(fptr); fclose(fptr);