def __generate_ePass(self): """Generate the MF and SAM of an ICAO passport. This method is responsible for generating the filesystem and filling it with content. Therefore it must interact with the user by prompting for the MRZ and optionally for the path to a photo.""" from PIL import Image from virtualsmartcard.cards.ePass import PassportSAM # TODO: Sanity checks MRZ = raw_input("Please enter the MRZ as one string: ") readline.set_completer_delims("") readline.parse_and_bind("tab: complete") picturepath = raw_input("Please enter the path to an image: ") picturepath = picturepath.strip() # MRZ1 = "P<UTOERIKSSON<<ANNA<MARIX<<<<<<<<<<<<<<<<<<<" # MRZ2 = "L898902C<3UTO6908061F9406236ZE184226B<<<<<14" # MRZ = MRZ1 + MRZ2 try: im = Image.open(picturepath) pic_width, pic_height = im.size fd = open(picturepath, "rb") picture = fd.read() fd.close() except IOError: logging.warning("Failed to open file: " + picturepath) pic_width = 0 pic_height = 0 picture = None mf = MF() # We need a MF with Application DF \xa0\x00\x00\x02G\x10\x01 df = DF(parent=mf, fid=4, dfname='\xa0\x00\x00\x02G\x10\x01', bertlv_data=[]) # EF.COM COM = pack([(0x5F01, 4, "0107"), (0x5F36, 6, "040000"), (0x5C, 2, "6175")]) COM = pack(((0x60, len(COM), COM),)) df.append(TransparentStructureEF(parent=df, fid=0x011E, filedescriptor=0, data=COM)) # EF.DG1 DG1 = pack([(0x5F1F, len(MRZ), MRZ)]) DG1 = pack([(0x61, len(DG1), DG1)]) df.append(TransparentStructureEF(parent=df, fid=0x0101, filedescriptor=0, data=DG1)) # EF.DG2 if picture is not None: IIB = "\x00\x01" + inttostring(pic_width, 2) +\ inttostring(pic_height, 2) + 6 * "\x00" length = 32 + len(picture) # 32 is the length of IIB + FIB FIB = inttostring(length, 4) + 16 * "\x00" FRH = "FAC" + "\x00" + "010" + "\x00" +\ inttostring(14 + length, 4) + inttostring(1, 2) picture = FRH + FIB + IIB + picture DG2 = pack([(0xA1, 8, "\x87\x02\x01\x01\x88\x02\x05\x01"), (0x5F2E, len(picture), picture)]) DG2 = pack([(0x02, 1, "\x01"), (0x7F60, len(DG2), DG2)]) DG2 = pack([(0x7F61, len(DG2), DG2)]) else: DG2 = "" df.append(TransparentStructureEF(parent=df, fid=0x0102, filedescriptor=0, data=DG2)) # EF.SOD df.append(TransparentStructureEF(parent=df, fid=0x010D, filedescriptor=0, data="")) mf.append(df) self.mf = mf self.sam = PassportSAM(self.mf)