commit 45bf8e247f48d87831c723ab49f724417fcc0137 Author: John Smith Date: Tue Jan 10 22:18:45 2023 +0100 Add signer code diff --git a/signer.py b/signer.py new file mode 100644 index 0000000..115a5db --- /dev/null +++ b/signer.py @@ -0,0 +1,56 @@ +# coding: utf + +from Crypto.Hash import SHA256 +from Crypto.PublicKey import RSA +from Crypto.Signature import PKCS1_v1_5 + +import pyqrcode +import qrcode + +import base64 +import json + +PRIVATE_KEY_FILE = "domain.key" + +BOX_SIZE = 5 +BORDER = 2 + + +def sign(message, private_key_str): + priv_key = RSA.importKey(private_key_str) + h = SHA256.new(message.encode("utf-8")) + signature = PKCS1_v1_5.new(priv_key).sign(h) + result = base64.b64encode(signature).decode() + return result + + +def create_qr(orderId, skuList, output_filename): + """ + Create a QR code for an order and write it as a PNG. + Params: + * orderId - order identifier. + * skuList - list of SKUs of the order. + * output_filename: the name of the output file. + """ + with open(PRIVATE_KEY_FILE, "r") as file: + key = file.read() + + + # dump to str to avoid ordering issues when verifying signature + order = json.dumps({"i": orderId, "sk": skuList}) + signed_order = sign(order, key) + data = {"o": order, "s": signed_order} + + data_str = json.dumps(data) + + #data_str_compressed = zlib.compress(data_str) + + qr = qrcode.QRCode(version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=BOX_SIZE, border=BORDER) + qr.add_data(data_str) + qr.make(fit=True) + + img = qr.make_image(fill_color="black", back_color="white") + img.save(output_filename) + + +create_qr("1234-5678", ["001", "002", "003", "004", "005", "006", "007", "008", "009"], "output.png")