diff --git a/collect_nonces.py b/collect_nonces.py new file mode 100644 index 0000000..08d602e --- /dev/null +++ b/collect_nonces.py @@ -0,0 +1,61 @@ +import sys +import subprocess +import time +import json +import requests +import random + + +def collect_nonces(target_key_names): + uid = None + while uid is None: + output = subprocess.check_output( + "nfc-list", shell=True).decode('utf-8') + for line in output.split('\n'): + if 'UID (NFCID1):' in line: + uid = line.split(':')[1].strip().replace(' ', '') + break + if uid is None: + print(output) + time.sleep(1) + + print(f"Call API for getting known keys of {uid}...") + response = requests.get(f'https://holycard.pinlin.me/card/{uid}') + if response.status_code == 404: + raise Exception("Card not found") + card = json.loads(response.text) + + key_names = set(target_key_names) + for sector in card['sectors']: + index = sector['index'] + if sector['keyA'] is not None and f'{index}A' in key_names: + key_names.remove(f'{index}A') + if sector['keyB'] is not None and f'{index}B' in key_names: + key_names.remove(f'{index}B') + + print("Collect nonces for these keys:", list(key_names)) + known_sector = random.choice(card['sectors']) + known_block_index = int(known_sector['index']) * 4 + known_block_key_type = 'A' if known_sector['keyA'] is not None else 'B' + known_block_key = known_sector['keyA'] if known_block_key_type == 'A' else known_sector['keyB'] + + executed_key_names = [] + for key_name in key_names: + block_index = int(key_name[:-1]) * 4 + block_key_type = key_name[-1] + cmd = f'crypto1_bs/holycard_collect {known_block_key} {known_block_index} {known_block_key_type} {block_index} {block_key_type}' + proc = subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=1, universal_newlines=True) + for line in proc.stdout: + print(line, end='') + for line in proc.stderr: + print(line, end='', file=sys.stderr) + print() + executed_key_names.append(key_name) + + return executed_key_names + + +if __name__ == '__main__': + executed_key_names = collect_nonces(['2A', '7A', '8A', '11A']) + print(f"Executed key_names: {list(executed_key_names)}") diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..f229360 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +requests