#!/usr/bin/env python3 # Copyright © Albert Lane. All Rights Reserved. # Proprietary and Confidential — Albert Lane Proprietary Software License. # Unauthorized use, copying, modification, or distribution is prohibited. # License inquiries: https://albertlane.net """Build a LanePacket and get Albert's human signature onto it. make_packet.py build spec.json out.bin # spec: {"packet_id":1,"timestamp":...,"code":"MEM_WRITE","operands":[{"ref":7},{"int":42}],"payload_hex":""} make_packet.py digest packet.bin # prints the exact text Albert signs with personal_sign (any Ethereum wallet) make_packet.py attach packet.bin SIGHEX out.bin # attaches Albert's 65-byte signature as human_sig """ import json import sys import os sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "cosigner")) import lane_digest as D # noqa: E402 import lane_isa_pb2 as pb # noqa: E402 def build(spec: dict) -> "pb.LanePacket": p = pb.LanePacket(packet_id=int(spec["packet_id"]), timestamp=int(spec["timestamp"]), payload=bytes.fromhex(spec.get("payload_hex", ""))) p.instr.code = pb.Instruction.OpCode.Value(spec["code"]) for o in spec.get("operands", []): op = p.instr.operands.add() if "int" in o: op.type, op.i_val = pb.Operand.INT, int(o["int"]) elif "float" in o: op.type, op.f_val = pb.Operand.FLOAT, float(o["float"]) elif "str" in o: op.type, op.s_val = pb.Operand.STRING, str(o["str"]) elif "ref" in o: op.type, op.ref_val = pb.Operand.REF, int(o["ref"]) else: raise ValueError(f"bad operand {o}") return p def human_digest(p) -> bytes: return D.h_human(p.packet_id, p.timestamp, D.instr_bytes(p.instr), p.payload) def load(path): p = pb.LanePacket() p.ParseFromString(open(path, "rb").read()) return p if __name__ == "__main__": cmd = sys.argv[1] if len(sys.argv) > 1 else "" if cmd == "build": open(sys.argv[3], "wb").write(build(json.load(open(sys.argv[2]))).SerializeToString()) elif cmd == "digest": print(human_digest(load(sys.argv[2])).hex()) elif cmd == "attach": p = load(sys.argv[2]) sig = bytes.fromhex(sys.argv[3].removeprefix("0x")) p.human_sig = sig print("signer:", D.recover(human_digest(p), sig)) open(sys.argv[4], "wb").write(p.SerializeToString()) else: print(__doc__) sys.exit(2)