mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-20 21:33:47 -07:00
text, string formatter, and something still complains in the GH actions
This commit is contained in:
parent
0509755e3c
commit
b05ccae642
5 changed files with 55 additions and 17 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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++) {
|
||||||
|
|
|
@ -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, §or1, &nt1);
|
||||||
result = sscanf(filename1, "keys_%8x_%2d_%8x.dic", &uid1, §or1, &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, §or2, &nt2);
|
result = sscanf(filename2, "keys_%8x_%2u_%8x.dic", &uid2, §or2, &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;
|
||||||
|
|
|
@ -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, §or, &nt2);
|
int result = sscanf(filename, "keys_%8x_%2u_%8x.dic", &uid, §or, &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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue