├── LICENSE ├── README.md ├── cryptomnesia.sh ├── cryptomnesiaFull.sh ├── deadc0de.hex ├── deadc0de.ino ├── logo.png └── setup ├── Attiny85pins.jpg ├── connection.jpg ├── programmer.jpg └── soic.jpg /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Maksym Zaitsev 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # cryptomnesia 2 | 3 | Linux deniable cryptographic storage eraser based on hardware USB trigger for self-destruction in a case of emergency 4 | 5 | (hard to find an acronym for that one huh?) 6 | 7 | ![](https://github.com/cryptolok/cryptomnesia/raw/master/logo.png) 8 | 9 | Quick demo: 10 | 11 | [![](https://img.youtube.com/vi/eTOwVK--qHo/0.jpg)](https://youtu.be/eTOwVK--qHo) 12 | 13 | Dependencies: 14 | * **LUKS** - Linux Unified Key Setup, widely used nowadays for disk encryption 15 | - cryptsetup - its main CLI, works both for version 1 and 2 16 | * **DigiSpark** - a cheap piece of hardware for USB simulation, used as a trigger 17 | - Arduino IDE and AVRDUDE - used to upload the code 18 | - AVR ISP programmer with SOIC8 clips and micronucleus, plus some jumper wires - optional, allows firmware reprogramming to achieve significantly faster USB detection 19 | * **root shell** - the whole script with some basic commands (dd, fdisk, df, sync, lsusb, update-grub) 20 | 21 | ## Intro and Insights 22 | 23 | OK, I think that everyone felt a little pressure from government in the beginning of 2020 for [obvious reasons](https://en.wikipedia.org/wiki/2019%E2%80%9320_coronavirus_pandemic). Now, I'm not saying that cyberpunk dystopia is right here (even if I think so), but that we have to be ready for it. You might say "no worries dude, I'm a 1337 h4x0r, I use full disk crypto and staff, my data is 144% safe" and you will be right... almost. You see, although, disk encryption protects your data from theft and the password may be difficult to crack, you're still human that can gently give the key if asked "nicely". And I'm not just speaking about [rubber-hose cryptanalysis](https://imgs.xkcd.com/comics/security.png), but there are actual [laws](https://en.wikipedia.org/wiki/Key_disclosure_law) that force you to give the key (or any decryption meaning) if needed in almost any "civilized" country (unless they are busy stealing toilet paper or face masks from each other). 24 | 25 | **Self-destruction as a last resort** 26 | 27 | So, what can you do in a scenario where SWAT or Russian mafia breaks into your door? Well, you will probably will not have enough time to run "rm" or "dd" command (considering the fact that some deleted data can still be [recovered](https://en.wikipedia.org/wiki/Data_recovery)) and just powering off the PC will still leave you as a key/password holder. You can always destroy the PC or the disk itself (or even a dedicated device to encrypt or/and hold keys), but you can't be sure that the damage will be sufficient (unless you use EMP or something). Of course, if you're using [deniable encryption](https://security.stackexchange.com/questions/87153/linux-plausibly-deniable-file-system) or [steganographic storage](https://cryptolok.blogspot.com/2017/12/skyrimcrypt-deniable-encryption-and.html) already, then you just swaped one problem for another, but I won't talk about those solutions since they are quite separate topics. Thus, the poor-man's solution is just to soft self-destruct, to erase the keys, to make the encrypted storage undecryptable and unreadable even by your-self, once and for all, irreversibly. Sounds pretty scary and challenging, I know, but let's look at technical details right now. 28 | 29 | (yeah, that was kind of a rant blog, but anyway) 30 | 31 | **Full Disk Encryption?** 32 | 33 | Basically, when a PC is powered up, the BIOS will check if everything is OK and if there is a disk to boot. If it's the case it will search for a bootable code that contains partitions (like MBR or GPT) and passes the control to it. If there is a partition containing a bootloader (like GRUB) it will pass the control to it next. The bootloader will search for a kernel (vmlinuz) and a file system (initrd) to boot, then it will load the rest of your files and data, hence the whole system is booted and you have your shell (or KDE environment). The whole process is a bit more complicated (like shadow memory, inithooks, etc), but it will be enough to understand the rest. Now, if your disk is encrypted (using LUKS for instance), it's actually isn't encrypted completely, the MBR/GPT and bootloader are still [stored in clear](https://viktorbarzin.me/images/11-booting-into-trouble-1-22-53-54.png) (which is a [HUGE](https://en.wikipedia.org/wiki/Evil_maid_attack) security issue, but that's another problem), otherwise the PC won't boot. Moreover, the disk even isn't encrypted with your password, it's encrypted with a randomly generated key that is stored encrypted with your password in a pretty [descent way](https://irq5.files.wordpress.com/2014/11/luks-encryption-flowchart.png?w=640&h=211). So, when you enter your password, it decrypts the key which goes to memory and [stays there](http://i.stack.imgur.com/KuoSQ.png) to encrypt and decrypt the data from and to your disk on the fly. Such system [isn't perfect](https://en.wikipedia.org/wiki/Cold_boot_attack) and has its own [flaws](https://github.com/cryptolok/AES-REX), but again, we're dealing with a different issue here. Another important thing to mention is that all this metadata (ciphers, hashes, etc) and additional passphrases are stored in a specific location on the encrypted partition, called [header](https://i.stack.imgur.com/CYUGV.png). 34 | 35 | (I actually considered making a blog about it, but since there are plenty of info already on this topic, I just decided to make an overview) 36 | 37 | **Delete all the things!** 38 | 39 | Now, the question is, how we can erase our data quickly and certainly? Well, first of all, why to erase all of it if we can just erase the key since it's needed for decryption? That could be done with just one command, but that will still leave the whole header, proving that your disk was indeed encrypted (and prompting for password at boot), which could cause you some (even more) troubles. Thus, it is better to erase (or even write random data to) the whole header, in order for the partition to look like empty or corrupted. But even so, you still have your bootloader and everything else showing that you at least have an operational disk (or had sda2_crypt partition in /boot/grub/menu.lst, that also has to be replaced if not using LVM), so why not to delete (or randomly overwrite) it all, making it look like a complete rubbish? Well, it's a good idea at first sight, but your boot partition could be pretty big (especially if using LVM/RAID) and you may not have SSD but HDD, which will perform write operation much slower. At the same time, if you can just trigger the event and launch it in the background with fewer possibilities to cancel it (assuming the attacker will not instantly perform cold-boot), that would work. However, even if we delete the key from the storage, it is still in the live memory, so we have to instantly power off the PC just after erasing the key, which will empty our memory and make the key unrecoverable (or at least difficult to recover, especially with DDR3L or DDR4 RAMs nowadays). If you have a laptop, don't worry, there is a Linux command to do it (yes, it's basically like cutting power cord, even quicker than pressing the power button), but I mean, it's pretty much like a rule 34 for Linux, if it's possible there is a shell command for it, if not start coding. 40 | 41 | **The Red Button (or USB)** 42 | 43 | Alright, jokes aside, we still have to resolve one more issue, and that's how you're going to trigger such event. You can simply assign a keyboard shortcut for it, but you may forget it or accidentally type it. Another solution is to make an alias or just double click the script, but still, you will have to remember what they are and where they are, as well as be careful not to launch them by error. That's why, a hardware USB solution is preferable InMyHackishOpition, unless you don't insert a specific device, nothing bad will (should) happen and in case of an emergency you don't have to think, but to act directly and simply. 44 | 45 | **Happy end?** 46 | 47 | Finally, what if you still want your data afterwards? Well, if you just erased the header, you can make a backup of it somewhere to restore it and the same goes to full wipe (booloader and all), as well as having a full backup of your disk is not a bad idea either. You can say that if the attacker know that the backup exist, they will go after it and you will be right, but even if there is no backup, it's unlikely that the attacker will believe it, so you still will have to say that there is no backup regardless of it being true or not and accept all the consequences, but if the data is deleted and you can't recover it, you become useless for the attacker whatsoever and if he/she/it wants the backup, he/she/it can't harm you (or at least won't end). 48 | 49 | Anyway, let's conclude this pretty long talk before it gets too geo-political/phylosophical and do some practice, but just before that, few demonstrations: 50 | 51 | Quick erase the header with customized hardware: 52 | 53 | [![](https://img.youtube.com/vi/B8eeKmVKVDw/0.jpg)](https://youtu.be/B8eeKmVKVDw) 54 | 55 | Full erase the disk with customized hardware or quick erase the header with stock hardware: 56 | [![](https://img.youtube.com/vi/JawzFsdEXXc/0.jpg)](https://youtu.be/JawzFsdEXXc) 57 | 58 | ### HowTo 59 | 60 | **!!! WARNING !!!** be very attentive and cautious with this guide and code, one error could cost you all data, so please be careful 61 | 62 | First things first, make sure that cryptsetup, dd, fdisk, df, sync, lsusb and update-grub commands are available to you and installed as well as your disk in encrypted with LUKS. 63 | 64 | As I mentioned, the solution can be used without any additional hardware, but is intended to, so you will also need a [DigiSpark USB](http://digistump.com/products/1), those are pretty cheap in any online shop. 65 | 66 | Now, there are 2 solutions: easy, but slow, and hard, but fast. 67 | 68 | **EASY** 69 | 70 | 1 - Plug your GigiSpark 71 | 72 | 2 - [Configure](https://digistump.com/wiki/digispark/tutorials/connecting) it using default proposed settings (requires to install Arduino IDE) 73 | 74 | 3 - Modify (by commenting) lines 256 and 265 in ~/.arduino*/packages/digistump/hardware/avr/*/libraries/DigisparkCDC/usbconfig.h (requires IDE restart): 75 | 76 | Replace "0xd0, 0x16" with "0xad, 0xde" 77 | 78 | Replace "0x7e, 0x08" with "0xde, 0xc0" 79 | 80 | The first one is simulated USB vendor ID in little-endian, which is "0xdead" 81 | 82 | The second one is simulated USB device ID in little-endian, which is "0xc0de" 83 | 84 | You may notice that I use CDC library (serial) and not the default USB library, mainly because it's more easy and quick 85 | 86 | 4 - Open [my code](https://github.com/cryptolok/cryptomnesia/blob/master/deadc0de.ino) with IDE 87 | 88 | 5 - Compile and upload 89 | 90 | 6 - When typing "lsusb" you should see something like "Bus 001 Device 003: ID dead:c0de" after about 7-10 seconds plugging the device 91 | 92 | The "dead:c0de" is the trigger USB device code used by the scripts. You can (and even should) replace it by your own code and don't forget to restore usbconfig.h with its original values. The total number of possibilities for the whole ID is (2^8)^4 = over 4 billion possibilities to bruteforce, if you chose it randomly, it is strongly advised that you change it though, which will prevent someone pluggging the same device to your computer without your permission, optionally, you can even use your own USB device. 93 | 94 | As you can see, this is pretty easy setup, but you will have to wait a little bit before the USB code is changed and thus triggered, so just to delete the header you will have to wait about 10s without unplugging the USB and even more if you wish to erase bootloader (may even take up to a minute depending on your setup). 95 | 96 | **HARD** (requires some electronics tools and skills) 97 | 98 | 1 - Plug an AVR ISP USB programmer (any USBasp, those are easily found online) 99 | 100 | 2 - Connect SOIC8 clip (also found online) on DigiSpark chip (SOP8 Attiny85) and its pins to your programmer using jumper wires 101 | 102 | 3 - Set the fuses and upload modified [firmware](https://github.com/cryptolok/cryptomnesia/blob/master/deadc0de.hex): 103 | 104 | ```bash 105 | sudo apt-get install avrdude 106 | avrdude -c USBasp -p attiny85 -U lfuse:w:0xe1:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m -B 20 107 | avrdude -c USBasp -p attiny85 -U flash:w:deadc0de.hex:i -B 20 108 | ``` 109 | 110 | 4 - When typing "lsusb" you should see something like "Bus 001 Device 003: ID dead:c0de" almost immediately after plugging the device 111 | 112 | As an alternative to SOIC pins, you can connect programmer directly to DigiSpark pins, but that would require soldering them in the first place and then desoldering in order to make the device more or less usable, so I'm not considering it as a good option. Instead of jumpers you can directly reconnect pins on SOIC clip. 113 | 114 | Check-out my [setup](https://github.com/cryptolok/cryptomnesia/tree/master/setup). 115 | 116 | ![](https://github.com/cryptolok/cryptomnesia/raw/master/setup/connection.jpg) 117 | 118 | You can see what those fuse values are for and what they do [here](http://www.engbedded.com/fusecalc). You can also adapt them to suit your needs. 119 | 120 | If you don't trust my firmware or/and want to modify the USB IDs, you can compile [micronucleus](https://github.com/micronucleus/micronucleus) yourself by modifying associated [file](https://github.com/micronucleus/micronucleus/blob/master/firmware/usbconfig.h#L209), or you can also reverse it if you want. 121 | 122 | As you can see, it's not that easy to do on your own, but the advantage is that the USB ID recognition is almost instant and deleting just the header will take few seconds. Deleting the bootloader will take some time, but you can just plug the USB to activate the task which can be run in background and then the PC will automatically shutdown, so it's also a realistic usage. 123 | 124 | Nonetheless, if you really need a reprogrammed DigiSpark USB with a custom ID, you can just ask me to send you one (not for free of course). 125 | 126 | **CONFIG** 127 | 128 | OK, the software part is pretty straight forward. 129 | 130 | There is a [quick version](https://github.com/cryptolok/cryptomnesia/blob/master/cryptomnesia.sh) of wipe, so just the header will be erased and /boot/grub/menu.lst file will be overwritten to hide the presence of encrypted partition (if not using LVM). 131 | 132 | There is is a [full version](https://github.com/cryptolok/cryptomnesia/blob/master/cryptomnesiaFull.sh), thus deleting MBR/GPT, bootloader and the header. However, this could make much time, at least 5s, based on your /boot size and disk speed (~10 MB/s for SSD and much slower for HDD), thus it's not a bad idea to just go after the encryption keys and metadata, to make the partition unencryptable, since the real key is password protected and stored encrypted itself on the disk (LUKS header), but you can also shrink your /boot partition to it's actual size (about 50-100 MB) to win some time. Anyway, count at least 5-10s in best case to do everything. 133 | 134 | You can launch the script with autostart or crontab (as root), so it will be launched at boot and monitor for a given USB ID (deadc0de by default, but you can modify it). 135 | 136 | Note that notification of launch is optional, I didn't implement it in the code, but you can easily add it if you wish (like a buzz or a popup or maybe you want it to be stealthy, it's up to you). One may say it's better to know what's happening, but maybe you don't want anyone to know what's happening at all. Ideally, you can just use multiple devices, one for stealth and quick execution and another one with fancy skull ASCII art and 8-bit synthwave, it depends on what you want and not for me to decide. 137 | 138 | Also, read both scripts, they are pretty self-explanatory, small and well commented. 139 | 140 | At the same time, I made a killswitch in the beginning to exit the script, just in case you will launch them in YOLO mode, so you will have to remove that line as well. 141 | 142 | Lastly, before doing anything, please make sure that you understand what you are doing, make some tests with half of code and make some backups beforehead. 143 | 144 | #### Notes 145 | 146 | [Cryptomnesia](https://en.wikipedia.org/wiki/Cryptomnesia) is actually a known memory dysfunction. 147 | 148 | The name was also partially inspired by an upcoming [Amnesia game](https://store.steampowered.com/app/999220/Amnesia_Rebirth/). 149 | 150 | Theoretically, same thing can be done for mobiles, but in practice it's not that easy and requires too much things to be done correctly. So it's a subject for further research. 151 | 152 | Please feel free to contribute and make tests. 153 | 154 | This solution alone will not solve all your problems, but may prevent from having others. 155 | 156 | Security and freedom have to coexist and not to be privileged one over another. 157 | 158 | Cypherpunks don't fight, they don't cry, they write code. 159 | 160 | > "A nation that forgets its past can function no better than an individual with amnesia." 161 | 162 | David McCullough 163 | 164 | -------------------------------------------------------------------------------- /cryptomnesia.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # KILLSWITCH prevents from accidental execution, please remove this code in order to use the script 4 | exit 5 | 6 | ID="dead:c0de" 7 | # USB vendor_id:device_id that should be replaced 8 | 9 | DEVICE=/dev/$(ls /dev/mapper | grep crypt | cut -d '_' -f 1) 10 | # this is (suppose to be) your encrypted LUKS partition, usually sda2 or vda5 (LVM), please check if it's the case 11 | DISK=$(echo -n ${DEVICE##*/} | head -c -1) 12 | SIZE=$(cat /sys/block/$DISK/queue/logical_block_size) 13 | # logical (used by the kernel) storage block size, usually 512 bytes 14 | OFFSET=$(cryptsetup luksDump $DEVICE | grep Payload | cut -d ':' -f 2 | tr -d ' \t') 15 | # LUKS header offset (before encrypted data), usually 4096 blocks, although the actual data is smaller in size (1 MB for LUKSv1 (the rest isn't used, but marked as reserved) and 2 MB for LUKSv2), this is the total length of the header 16 | BOOTLOADER=/boot/grub/menu.lst 17 | # this is the default boot list for GRUB 2 (non-LVM) 18 | CRYPT=/dev/mapper/$(ls /dev/mapper | grep crypt) 19 | # typical location of an encrypted partition 20 | # all these values are determined automatically, but it is recommended to check them manually or even specify depending on your particular case 21 | 22 | while true 23 | do 24 | lsusb -d "$ID" >/dev/null 25 | # compatible with my USBlock solution (https://github.com/cryptolok/USBlok) 26 | if [[ $? -eq 0 ]] 27 | then 28 | # TODO add a notifier, maybe an 8-bit sound, maybe a blink, or a skull ASCII art 29 | if [[ -f "$BOOTLOADER" ]] 30 | then 31 | sed -i s:$CRYPT:$DEVICE:g $BOOTLOADER 32 | update-grub 33 | fi 34 | # hide the fact that the bootloader was used for an encrypted partition, this will make the encrypted partition to look like a simple one (non-LVM) 35 | dd if=/dev/urandom of=$DEVICE bs=$SIZE count=$OFFSET 36 | # this will put pseudo-random data (secure and fast enough) to the LUKS header entirely (and not just the key, about 2 MB), making the partition look like it's corrupted or broken and contains nothing (except some entropic data that can be anything) 37 | # echo 'YES' | cryptsetup luksErase $DEVICE - this will only erase the keys, but not the header 38 | sync 39 | # flushing data to disk is necessary, since performing a hard poweroff just after and in order to be sure of change 40 | echo o > /proc/sysrq-trigger 41 | # systemctl --force --force poweroff 42 | # this will immediately shutdown the PC, losing all data 43 | fi 44 | sleep 1 45 | done 46 | 47 | -------------------------------------------------------------------------------- /cryptomnesiaFull.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # KILLSWITCH prevents from accidental execution, please remove this code in order to use the script 4 | exit 5 | 6 | ID="dead:c0de" 7 | # USB vendor_id:device_id that should be replaced 8 | 9 | DISK=$(ls /dev/mapper | grep crypt | cut -d '_' -f 1 | head -c -2) 10 | DEVICE=/dev/$DISK 11 | # this is (suppose to be) your disk, usually sda or vda (LVM), please check if it's the case 12 | BLOCKS=$(cat /sys/block/$DISK/queue/logical_block_size) 13 | # logical (used by the kernel) storage block size, usually 512 bytes 14 | START=$(fdisk -l $DEVICE | grep -A1 Start | tr -s ' ' | cut -d ' ' -f 3 | tail -n 1) 15 | # these are the first bytes of your disk, usually containing partition table (MBR/GPT alike) of 1 MB 16 | PARTS=$[$BLOCKS*$START/2**10/2**10] 17 | LOADER=$(df /boot | cut -d ' ' -f 1 | tail -n 1) 18 | SECTORS=$(fdisk -l $LOADER | grep sectors | cut -d ',' -f 3 | cut -d ' ' -f 2 | head -n 1) 19 | # this is your /boot partition (bootloader, like GRUB), usually 50-100 MB of used size, but the partition itself could be larger (up to 1 GB), so you can shrink it to its actual size to win some time 20 | BOOT=$[$BLOCKS*$SECTORS/2**10/2**10] 21 | CRYPT=/dev/$(ls /dev/mapper | grep crypt | cut -d '_' -f 1) 22 | # this is (suppose to be) your encrypted LUKS partition, usually sda2 or vda5 (LVM), please check if it's the case 23 | OFFSET=$(cryptsetup luksDump $CRYPT | grep Payload | cut -d ':' -f 2 | tr -d ' \t') 24 | # LUKS header offset (before encrypted data), usually 4096 blocks, although the actual data is smaller in size (1 MB for LUKSv1 (the rest isn't used, but marked as reserved) and 2 MB for LUKSv2), this is the total length of the header 25 | HEADER=$[$BLOCKS*$OFFSET/2**10/2**10] 26 | SIZE=$[$PARTS+$BOOT+$HEADER] 27 | # the total size would be at least 50 MB, assuming you don't have multiple disks or other encrypted partitions 28 | # for LVM, there will be an additional partition (like sda2p1) for about 1 KB, so the script will not write the same size at the end of LUKS header, but since we calculate its whole offset and not just the data containing inside, this error is tolerable and should not impact the keys within the header, but if in doubt, you can adjust everything you need by yourself 29 | # all these values are determined automatically, but it is recommended to check them manually or even specify depending on your particular case 30 | 31 | while true 32 | do 33 | lsusb -d "$ID" >/dev/null 34 | # compatible with my USBlock solution (https://github.com/cryptolok/USBlok) 35 | if [[ $? -eq 0 ]] 36 | then 37 | # TODO add a notifier, maybe an 8-bit sound, maybe a blink, or a skull ASCII art 38 | dd if=/dev/urandom of=$DEVICE bs=1M count=$SIZE 39 | # this will put pseudo-random data (secure and fast enough) to the LUKS header entirely (and not just the key), plus the bootloader (/boot) and MBR/GPT partitions table, making the whole disk look like it's corrupted or broken and contains nothing (except some entropic data that can be anything) 40 | sync 41 | # flushing data to disk is necessary, since performing a hard poweroff just after and in order to be sure of change 42 | echo o > /proc/sysrq-trigger 43 | # systemctl --force --force poweroff 44 | # this will immediately shutdown the PC, losing all data 45 | fi 46 | sleep 1 47 | done 48 | 49 | -------------------------------------------------------------------------------- /deadc0de.hex: -------------------------------------------------------------------------------- 1 | :101A400017C01A3A4005930B0902120001010080E9 2 | :101A50003209040000000000000012011001FF0024 3 | :101A60000008ADDEDEC0040200000001040309042A 4 | :101A7000112420E0A0E6B0E001C01D92AC38B2070E 5 | :101A8000E1F776C1A82FB92F80E090E041E050EA5D 6 | :101A9000609530E009C02D9182279795879510F0C9 7 | :101AA00084279527305EC8F36F5FA8F30895EADFB7 8 | :101AB0008D939D930895CF93CFB7CF93DF93C39525 9 | :101AC000B39BE9F7B39B0BC0B39B09C0B39B07C0A3 10 | :101AD000B39B05C0B39B03C0B39B01C08FC06F9382 11 | :101AE000C0916E00DD27CA58DF4F2F9365E5B39B89 12 | :101AF00003C02F916F91E6CF0F931F934F9320E078 13 | :101B000040E15F9306B3087103FB27F93F9350E070 14 | :101B10003BE039C0187140642F77012F5F5F1EC012 15 | :101B2000406816B318712F7752501FC0406406B337 16 | :101B30002F770871D1F15F5F00C023C0406216B3F8 17 | :101B40002F77187191F15F5F00C025C008711027D1 18 | :101B5000515012F45D5F0000115027952C3F16B3D1 19 | :101B6000C8F618710127015027952C3FC8F6422767 20 | :101B7000499306B3087110274F73115027952C3FD6 21 | :101B8000A8F64695469516B3187179F001270150CD 22 | :101B900027952C3F98F66B5A60F3315006B3B0F698 23 | :101BA00000C010E21ABF00271DC03B503195C31B77 24 | :101BB000D04010E21ABF0881033C29F10B3419F11F 25 | :101BC00020916C001981110F1213EDCF093651F1DC 26 | :101BD0000D3211F0013E39F7CAE01AB715FD02C007 27 | :101BE000CA95D9F7009374003F915F914F911F916F 28 | :101BF0000F912F916F91CAB7C5FD61CFDF91CF9142 29 | :101C0000CFBFCF91089520917400222369F31091E2 30 | :101C10007200112309F534300AF1309372002093D9 31 | :101C20006D001CC0009172000130B4F40AE53091DF 32 | :101C30006F0034FD14C000936F00C1E6D0E013C004 33 | :101C4000052710E000C0000008BB1AC0052710E0FF 34 | :101C5000221F1DC010E021C04AE502C032ED432F13 35 | :101C6000C4E1D0E032E017B31861C39A08B317BBE0 36 | :101C700058E120E865E320FF052708BB2795179565 37 | :101C80001C3FF0F66695B8F7B1F720FF052708BBB3 38 | :101C9000279517951C3FD0F62795179517FF052711 39 | :101CA00000001C3F08BBB0F629913A9519F7077E52 40 | :101CB00010917300110FC651D04008BB11F0109362 41 | :101CC0006C0010E21ABF086017B3177E402F477EE2 42 | :101CD00054E05A95F1F708BB17BB48BB85CF2FEFEF 43 | :101CE000B0E8A0E04AE0B1BF00008DE79CE0B39906 44 | :101CF000FECFB39BFECF0197B399FDCF97FF03C0F3 45 | :101D0000BA1B819501C0BA0FA69539F4A0E428F456 46 | :101D1000281710F031B7282FA1E0415021F731BF2B 47 | :101D200000000895F20121E00C0120935700E8958E 48 | :101D30001124C20102962C01089514BE88E181BDD0 49 | :101D400087E081BDBB9A2FEF85EA9EE0215080405D 50 | :101D50009040E1F700C00000BB988AE580936F00D7 51 | :101D60008FEF80936000AC9A8BB780628BBF089531 52 | :101D7000E4DF712C312C412C512C14E6C5EDD4E15B 53 | :101D800086B3887109F014E6115029F4109273009B 54 | :101D900010926C00A4DF0AB605FE04C08CDE80E25F 55 | :101DA0008ABF03C02197209759F7A89522E03212E5 56 | :101DB0000CC0E0E4FAE1E054F10983E080935700BD 57 | :101DC000E8953097C1F7412C512C832D803459F47C 58 | :101DD000F2013297E0348AE1F80750F485E080930D 59 | :101DE0005700E89505C0843019F4CD2B11F4EDC0EF 60 | :101DF000312C80917200835087FD9CC090916D00C2 61 | :101E00009D3209F095C0883009F092C083EC809330 62 | :101E100061008AE580936F009091770090768091C1 63 | :101E20007800992381F1712C811108C082E49AE134 64 | :101E3000909371008093700026E06FC0813071F440 65 | :101E40004114510409F44FC080917B00807C482EDE 66 | :101E500050907C0081E187BFE89545C0833081F4D4 67 | :101E60008091790090917A005DDF80917B00909164 68 | :101E70007C0058DF842D8F73B1F580E4382E33C099 69 | :101E80008F73382E30C09091790010926A008111C2 70 | :101E900006C010926B008AE690E022E03AC08530DE 71 | :101EA00019F49093730027C08630F9F480917A007A 72 | :101EB000813019F48AE59AE104C0823041F488E463 73 | :101EC0009AE1909371008093700022E126C08330E4 74 | :101ED00051F4911108C08CE69AE1909371008093BF 75 | :101EE000700024E01AC020E018C0883079F08930F2 76 | :101EF00031F4909375008AE690E020E00AC021E07A 77 | :101F00008A3009F020E08AE690E003C085E790E09F 78 | :101F100021E0909371008093700080917E00811188 79 | :101F200005C080917D00821708F4282F209360005F 80 | :101F30001092720080916F0084FF31C08091600028 81 | :101F40008F3F69F1C82F893008F0C8E08C1B80935F 82 | :101F500060008091610098E8892780936100CC231C 83 | :101F600091F0E0917000F091710082E690E0DC0168 84 | :101F700024912D9331962C2F280F2A13F9CFF0930B 85 | :101F80007100E09370006C2F82E690E090DDCC5FF2 86 | :101F9000CC3019F08FEF80936000C0936F00C301C5 87 | :101FA00001963C01803B944029F4EDE3FAE1E49191 88 | :101FB000EF3F59F40AB605FEE0CE8CE1B39B8CE10D 89 | :101FC0008150E1F780E28ABFD8CEB7DE1BBE15BADA 90 | :041FD00035CDFFCF3D 91 | :0400000300001A409F 92 | :00000001FF 93 | -------------------------------------------------------------------------------- /deadc0de.ino: -------------------------------------------------------------------------------- 1 | #include 2 | void setup(){SerialUSB.begin();} 3 | void loop(){} 4 | -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cryptolok/cryptomnesia/82ab7852e836a67b58388f5e55f97b018e1a78c8/logo.png -------------------------------------------------------------------------------- /setup/Attiny85pins.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cryptolok/cryptomnesia/82ab7852e836a67b58388f5e55f97b018e1a78c8/setup/Attiny85pins.jpg -------------------------------------------------------------------------------- /setup/connection.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cryptolok/cryptomnesia/82ab7852e836a67b58388f5e55f97b018e1a78c8/setup/connection.jpg -------------------------------------------------------------------------------- /setup/programmer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cryptolok/cryptomnesia/82ab7852e836a67b58388f5e55f97b018e1a78c8/setup/programmer.jpg -------------------------------------------------------------------------------- /setup/soic.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cryptolok/cryptomnesia/82ab7852e836a67b58388f5e55f97b018e1a78c8/setup/soic.jpg --------------------------------------------------------------------------------