+ // the first 16 Bits of the cryptostate already contain part of our key.\r
+ // Create the intersection of the two lists based on these 16 Bits and\r
+ // roll back the cryptostate\r
+ p1 = p3 = statelists[0].head.slhead;\r
+ p2 = p4 = statelists[1].head.slhead;\r
+ while (p1 <= statelists[0].tail.sltail && p2 <= statelists[1].tail.sltail) {\r
+ if (Compare16Bits(p1, p2) == 0) {\r
+ struct Crypto1State savestate, *savep = &savestate;\r
+ savestate = *p1;\r
+ while(Compare16Bits(p1, savep) == 0 && p1 <= statelists[0].tail.sltail) {\r
+ *p3 = *p1;\r
+ lfsr_rollback_word(p3, statelists[0].nt ^ statelists[0].uid, 0);\r
+ p3++;\r
+ p1++;\r
+ }\r
+ savestate = *p2;\r
+ while(Compare16Bits(p2, savep) == 0 && p2 <= statelists[1].tail.sltail) {\r
+ *p4 = *p2;\r
+ lfsr_rollback_word(p4, statelists[1].nt ^ statelists[1].uid, 0);\r
+ p4++;\r
+ p2++;\r
+ }\r
+ }\r
+ else {\r
+ while (Compare16Bits(p1, p2) == -1) p1++;\r
+ while (Compare16Bits(p1, p2) == 1) p2++;\r
+ }\r
+ }\r
+ *(uint64_t*)p3 = -1;\r
+ *(uint64_t*)p4 = -1;\r
+ statelists[0].len = p3 - statelists[0].head.slhead;\r
+ statelists[1].len = p4 - statelists[1].head.slhead;\r
+ statelists[0].tail.sltail=--p3;\r
+ statelists[1].tail.sltail=--p4;\r
+\r
+ // the statelists now contain possible keys. The key we are searching for must be in the\r
+ // intersection of both lists. Create the intersection:\r
+ qsort(statelists[0].head.keyhead, statelists[0].len, sizeof(uint64_t), compare_uint64);\r
+ qsort(statelists[1].head.keyhead, statelists[1].len, sizeof(uint64_t), compare_uint64);\r
+ statelists[0].len = intersection(statelists[0].head.keyhead, statelists[1].head.keyhead);\r
+\r
+ memset(resultKey, 0, 6);\r
+ // The list may still contain several key candidates. Test each of them with mfCheckKeys\r
+ for (i = 0; i < statelists[0].len; i++) {\r
+ uint8_t keyBlock[6];\r
+ uint64_t key64;\r
+ crypto1_get_lfsr(statelists[0].head.slhead + i, &key64);\r
+ num_to_bytes(key64, 6, keyBlock);\r
+ key64 = 0;\r
+ if (!mfCheckKeys(statelists[0].blockNo, statelists[0].keyType, false, 1, keyBlock, &key64)) {\r
+ num_to_bytes(key64, 6, resultKey);\r
+ break;\r
+ }\r
+ }\r
+\r
+ free(statelists[0].head.slhead);\r
+ free(statelists[1].head.slhead);\r
+\r