diff --git a/Pipfile b/Pipfile index f5f6286..9aaf126 100644 --- a/Pipfile +++ b/Pipfile @@ -14,6 +14,7 @@ name = "pypi" bpylist = "==0.1.4" click = "==6.7" pycrypto = "==2.6.1" +pyqrcode = "==1.2.1" [requires] diff --git a/Pipfile.lock b/Pipfile.lock index d242f4e..5f223ce 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "0b92a1b04112e0b557c968c57e6236924878f55115d37dfc4a170fb7a98969bd" + "sha256": "81d534465fc2e9af42dacab3d37d305414bfe0fb1642f22fb3142ffebf745505" }, "host-environment-markers": { "implementation_name": "cpython", @@ -47,6 +47,13 @@ "sha256:f2ce1e989b272cfcb677616763e0a2e7ec659effa67a88aa92b3a65528f60a3c" ], "version": "==2.6.1" + }, + "pyqrcode": { + "hashes": [ + "sha256:fdbf7634733e56b72e27f9bce46e4550b75a3a2c420414035cae9d9d26b234d5", + "sha256:1b2812775fa6ff5c527977c4cd2ccb07051ca7d0bc0aecf937a43864abe5eff6" + ], + "version": "==1.2.1" } }, "develop": {} diff --git a/decrypt_otpauth.py b/decrypt_otpauth.py index 5199177..1883551 100644 --- a/decrypt_otpauth.py +++ b/decrypt_otpauth.py @@ -1,14 +1,19 @@ +import base64 import click import getpass +import hashlib from enum import Enum +from itertools import chain +from urllib.parse import quote -from Crypto.Cipher import AES -import hashlib +import pyqrcode from bpylist import archiver from bpylist.archive_types import uid +from Crypto.Cipher import AES + class Type(Enum): Unknown = 0 @@ -156,7 +161,27 @@ def main(encrypted_otpauth_backup): # Decode actual archive archive = DangerousUnarchive(data).top_object() - print(archive) + + accounts = [account for folder in archive['Folders'] for account in folder.accounts] + for account in accounts: + otp_type = account.type + otp_label = quote(f'{account.issuer}:{account.label}') + otp_parameters = { + 'secret': base64.b32encode(account.secret).decode("utf-8"), + 'algorithm': account.algorithm, + 'period': account.period, + 'digits': account.digits, + 'issuer': account.issuer, + 'counter': account.counter, + } + otp_parameters = '&'.join([f'{str(k)}={quote(str(v))}' for (k, v) in otp_parameters.items() if v]) + otp_uri = f'otpauth://{otp_type}/{otp_label}?{otp_parameters}' + qr = pyqrcode.create(otp_uri, error="L") + click.echo("") + click.echo(f'{account.type}: {account.issuer} - {account.label}') + click.echo(qr.terminal(quiet_zone=4)) + click.echo("") + input("Press Enter to continue...") if __name__ == '__main__':