Skip to content

Instantly share code, notes, and snippets.

@sghctoma
Last active September 19, 2021 18:59

Revisions

  1. sghctoma revised this gist Sep 19, 2021. 2 changed files with 18 additions and 2 deletions.
    10 changes: 9 additions & 1 deletion decode-dgc_hupdf.py
    Original file line number Diff line number Diff line change
    @@ -1,10 +1,12 @@
    #!/usr/bin/env python3

    import binascii
    import json
    import sys
    import zlib

    import base45
    import base64
    import cbor2
    import PyPDF2

    @@ -21,5 +23,11 @@
    decoded = base45.b45decode(qrdata[0].data[4:])
    decompressed = zlib.decompress(decoded)
    cose_message = CoseMessage.decode(decompressed)

    sig = cose_message.signature
    r = int(binascii.hexlify(sig[:32]), 16)
    s = int(binascii.hexlify(sig[32:]), 16)
    print(f"signature: {base64.b64encode(sig).decode('utf-8')}\n\tr: {r}\n\ts: {s}")

    payload = cbor2.loads(cose_message.payload)
    print(json.dumps(payload, indent=4))
    print(f"payload: \n{json.dumps(payload, indent=4)}")
    10 changes: 9 additions & 1 deletion decode-dgc_img.py
    Original file line number Diff line number Diff line change
    @@ -1,10 +1,12 @@
    #!/usr/bin/env python3

    import binascii
    import json
    import sys
    import zlib

    import base45
    import base64
    import cbor2

    from cose.messages import CoseMessage
    @@ -17,5 +19,11 @@
    decoded = base45.b45decode(qrdata[0].data[4:])
    decompressed = zlib.decompress(decoded)
    cose_message = CoseMessage.decode(decompressed)

    sig = cose_message.signature
    r = int(binascii.hexlify(sig[:32]), 16)
    s = int(binascii.hexlify(sig[32:]), 16)
    print(f"signature: {base64.b64encode(sig).decode('utf-8')}\n\tr: {r}\n\ts: {s}")

    payload = cbor2.loads(cose_message.payload)
    print(json.dumps(payload, indent=4))
    print(f"payload: \n{json.dumps(payload, indent=4)}")
  2. sghctoma created this gist Sep 17, 2021.
    25 changes: 25 additions & 0 deletions decode-dgc_hupdf.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,25 @@
    #!/usr/bin/env python3

    import json
    import sys
    import zlib

    import base45
    import cbor2
    import PyPDF2

    from cose.messages import CoseMessage
    from pyzbar import pyzbar
    from PIL import Image


    with open(sys.argv[1], 'rb') as f:
    pdf = PyPDF2.PdfFileReader(f)
    qrobject = pdf.getPage(0)['/Resources']['/XObject']['/Im5']
    qrimage = Image.frombytes('1', (qrobject['/Width'], qrobject['/Height']), qrobject.getData())
    qrdata = pyzbar.decode(qrimage)
    decoded = base45.b45decode(qrdata[0].data[4:])
    decompressed = zlib.decompress(decoded)
    cose_message = CoseMessage.decode(decompressed)
    payload = cbor2.loads(cose_message.payload)
    print(json.dumps(payload, indent=4))
    21 changes: 21 additions & 0 deletions decode-dgc_img.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,21 @@
    #!/usr/bin/env python3

    import json
    import sys
    import zlib

    import base45
    import cbor2

    from cose.messages import CoseMessage
    from pyzbar import pyzbar
    from PIL import Image


    qrimage = Image.open(sys.argv[1])
    qrdata = pyzbar.decode(qrimage)
    decoded = base45.b45decode(qrdata[0].data[4:])
    decompressed = zlib.decompress(decoded)
    cose_message = CoseMessage.decode(decompressed)
    payload = cbor2.loads(cose_message.payload)
    print(json.dumps(payload, indent=4))
    35 changes: 35 additions & 0 deletions generate-invalid-dgc_hupdf.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,35 @@
    #!/usr/bin/env python3

    import json
    import sys
    import zlib

    import base45
    import cbor2
    import PyPDF2
    import qrcode

    from cose.messages import CoseMessage
    from pyzbar import pyzbar
    from PIL import Image


    with open(sys.argv[1], 'rb') as f:
    pdf = PyPDF2.PdfFileReader(f)
    qrobject = pdf.getPage(0)['/Resources']['/XObject']['/Im5']
    qrimage = Image.frombytes('1', (qrobject['/Width'], qrobject['/Height']), qrobject.getData())
    qrdata = pyzbar.decode(qrimage)
    decoded = base45.b45decode(qrdata[0].data[4:])
    decompressed = zlib.decompress(decoded)

    decompressed = decompressed.replace(b'Budapest', b'xxxxxxxx')
    compressed = zlib.compress(decompressed)
    encoded = base45.b45encode(compressed)
    qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_H,
    box_size=10,border=4)
    qr.add_data(b'HC1:' + encoded)
    qr.make(fit=True)
    img = qr.make_image(fill_color="black", back_color="white")
    img.save("wrong.png")