#!/usr/bin/python

"""
pyfsig - file signatures
------------------------
file header signatures
"""


# Wikipedia License
# -----------------
#
# This Library uses material from the Wikipedia article
# https://en.wikipedia.org/wiki/List_of_file_signatures, which is released
# under the Creative Commons Attribution-Share-Alike License 3.0


from typing import List, Optional


signatures = [
    {
        "ascii": "....",
        "description": "RedHat Package Manager (RPM) package",
        "file_extension": "rpm",
        "hex": "ed ab ee db",
        "offset": "0",
    },
    {
        "ascii": "SP01",
        "description": "Amazon Kindle Update Package",
        "file_extension": "bin",
        "hex": "53 50 30 31",
        "offset": "0",
    },
    {
        "ascii": ".",
        "description": "WindowsProgram Information File",
        "file_extension": "PIF",
        "hex": "00 nn",
        "offset": "0",
    },
    {
        "ascii": ".",
        "description": "MacStuffit Self-Extracting Archive",
        "file_extension": "SEA",
        "hex": "00 nn",
        "offset": "0",
    },
    {
        "ascii": ".",
        "description": "IRISOCR data file",
        "file_extension": "YTR",
        "hex": "00 nn",
        "offset": "0",
    },
    {
        "ascii": ".",
        "description": "IBM Storyboard bitmap file",
        "file_extension": "PIC",
        "hex": "00 nn",
        "offset": "0",
    },
    {
        "ascii": "........ ........ ........",
        "description": "PalmPilot Database/Document File",
        "file_extension": "PDB",
        "hex": "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00",
        "offset": "11",
    },
    {
        "ascii": "...",
        "description": "Palm Desktop Calendar Archive",
        "file_extension": "DBA",
        "hex": "BE BA FE CA",
        "offset": "0",
    },
    {
        "ascii": "..BD",
        "description": "Palm Desktop To Do Archive",
        "file_extension": "DBA",
        "hex": "00 01 42 44",
        "offset": "0",
    },
    {
        "ascii": "..DT",
        "description": "Palm Desktop Calendar Archive",
        "file_extension": "TDA",
        "hex": "00 01 44 54",
        "offset": "0",
    },
    {
        "ascii": "...",
        "description": "Palm Desktop Data File (Access format)",
        "file_extension": "",
        "hex": "00 01 00 00",
        "offset": "0",
    },
    {
        "ascii": "....",
        "description": "Computer icon encoded inICO file format",
        "file_extension": "ico",
        "hex": "00 00 01 00",
        "offset": "0",
    },
    {
        "ascii": "ftyp 3g",
        "description": "3rd Generation Partnership Project3GPP",
        "file_extension": "3gp",
        "hex": "66 74 79 70 33 67",
        "offset": "4",
    },
    {
        "ascii": "ftyp 3g",
        "description": "3GPP2 multimedia files",
        "file_extension": "3g2",
        "hex": "66 74 79 70 33 67",
        "offset": "4",
    },
    {
        "ascii": "..",
        "description": "compressed file (often tar zip)",
        "file_extension": "z",
        "hex": "1F 9D",
        "offset": "0",
    },
    {
        "ascii": "..",
        "description": "usingLempel-Ziv-Welch algorithm",
        "file_extension": "tar.z",
        "hex": "1F 9D",
        "offset": "0",
    },
    {
        "ascii": "..",
        "description": "Compressed file (often tar zip)",
        "file_extension": "z",
        "hex": "1F A0",
        "offset": "0",
    },
    {
        "ascii": "..",
        "description": "usingLZH algorithm",
        "file_extension": "tar.z",
        "hex": "1F A0",
        "offset": "0",
    },
    {
        "ascii": "BACKMIKE DISK",
        "description": "File ortape containing abackup done withAmiBack on an Amiga. "
        "It typically is paired with an index file (idx) with the "
        "table of contents.",
        "file_extension": "bac",
        "hex": "42 41 43 4B 4D 49 4B 45 44 49 53 4B",
        "offset": "0",
    },
    {
        "ascii": "BZh",
        "description": "Compressed file usingBzip2 algorithm",
        "file_extension": "bz2",
        "hex": "42 5A 68",
        "offset": "0",
    },
    {
        "ascii": "GIF87a",
        "description": "Image file encoded in theGraphics Interchange Format (GIF)",
        "file_extension": "gif",
        "hex": "47 49 46 38 37 61",
        "offset": "0",
    },
    {
        "ascii": "GIF89a",
        "description": "Image file encoded in theGraphics Interchange Format (GIF)",
        "file_extension": "gif",
        "hex": "47 49 46 38 39 61",
        "offset": "0",
    },
    {
        "ascii": "II*.MM.*",
        "description": "Tagged Image File Format (little endian format)",
        "file_extension": "tif",
        "hex": "49 49 2A 00",
        "offset": "0",
    },
    {
        "ascii": "II*.MM.*",
        "description": "Tagged Image File Format (little endian format)",
        "file_extension": "tiff",
        "hex": "49 49 2A 00",
        "offset": "0",
    },
    {
        "ascii": "II*.MM.*",
        "description": "Tagged Image File Format (big endian format)",
        "file_extension": "tif",
        "hex": "4D 4D 00 2A",
        "offset": "0",
    },
    {
        "ascii": "II*.MM.*",
        "description": "Tagged Image File Format (big endian format)",
        "file_extension": "tiff",
        "hex": "4D 4D 00 2A",
        "offset": "0",
    },
    {
        "ascii": "II*..... CR",
        "description": "Canon's RAW format is based on the TIFF file format",
        "file_extension": "cr2",
        "hex": "49 49 2A 00 10 00 00 00 43 52",
        "offset": "0",
    },
    {
        "ascii": "II*..... CR",
        "description": "Canon RAW Format Version 2",
        "file_extension": "cr2",
        "hex": "49 49 2A 00 10 00 00 00 43 52",
        "offset": "0",
    },
    {
        "ascii": ".*_.",
        "description": "KodakCineon image",
        "file_extension": "cin",
        "hex": "80 2A 5F D7",
        "offset": "0",
    },
    {
        "ascii": "RNC.",
        "description": "Compressed file usingRob Northen Compression (version 1 and "
        "2) algorithm",
        "file_extension": "",
        "hex": "52 4E 43 01 52 4E 43 02",
        "offset": "0",
    },
    {
        "ascii": "SDPXXPDS",
        "description": "SMPTEDPX image (big endian format)",
        "file_extension": "dpx",
        "hex": "53 44 50 58",
        "offset": "0",
    },
    {
        "ascii": "SDPXXPDS",
        "description": "SMPTEDPX image (little endian format)",
        "file_extension": "dpx",
        "hex": "58 50 44 53",
        "offset": "0",
    },
    {
        "ascii": "v/1.",
        "description": "OpenEXR image",
        "file_extension": "exr",
        "hex": "76 2F 31 01",
        "offset": "0",
    },
    {
        "ascii": "BPGû",
        "description": "Better Portable Graphics format",
        "file_extension": "bpg",
        "hex": "42 50 47 FB",
        "offset": "0",
    },
    {
        "ascii": "ÿØÿÛ",
        "description": "JPEG raw or in theJFIF orExif file format",
        "file_extension": "jpg",
        "hex": "FF D8 FF DB",
        "offset": "0",
    },
    {
        "ascii": "ÿØÿÛ",
        "description": "JPEG raw or in theJFIF orExif file format",
        "file_extension": "jpeg",
        "hex": "FF D8 FF DB",
        "offset": "0",
    },
    {
        "ascii": "ÿØÿà ..J F IF..",
        "description": "JPEG raw or in theJFIF orExif file format",
        "file_extension": "jpg",
        "hex": "FF D8 FF E0 nn nn 4A 46 49 46 00 01",
        "offset": "0",
    },
    {
        "ascii": "ÿØÿà ..J F IF..",
        "description": "JPEG raw or in theJFIF orExif file format",
        "file_extension": "jpeg",
        "hex": "FF D8 FF E0 nn nn 4A 46 49 46 00 01",
        "offset": "0",
    },
    {
        "ascii": "ÿØÿá ..E x if..",
        "description": "JPEG raw or in theJFIF orExif file format",
        "file_extension": "jpg",
        "hex": "FF D8 FF E1 nn nn 45 78 69 66 00 00",
        "offset": "0",
    },
    {
        "ascii": "ÿØÿá ..E x if..",
        "description": "JPEG raw or in theJFIF orExif file format",
        "file_extension": "jpeg",
        "hex": "FF D8 FF E1 nn nn 45 78 69 66 00 00",
        "offset": "0",
    },
    {
        "ascii": "FORM.... ILBM",
        "description": "IFFInterleaved Bitmap Image",
        "file_extension": "ilbm",
        "hex": "46 4F 52 4D nn nn nn nn 49 4C 42 4D",
        "offset": "any",
    },
    {
        "ascii": "FORM.... ILBM",
        "description": "IFFInterleaved Bitmap Image",
        "file_extension": "lbm",
        "hex": "46 4F 52 4D nn nn nn nn 49 4C 42 4D",
        "offset": "any",
    },
    {
        "ascii": "FORM.... ILBM",
        "description": "IFFInterleaved Bitmap Image",
        "file_extension": "ibm",
        "hex": "46 4F 52 4D nn nn nn nn 49 4C 42 4D",
        "offset": "any",
    },
    {
        "ascii": "FORM.... ILBM",
        "description": "IFFInterleaved Bitmap Image",
        "file_extension": "iff",
        "hex": "46 4F 52 4D nn nn nn nn 49 4C 42 4D",
        "offset": "any",
    },
    {
        "ascii": "FORM.... 8SVX",
        "description": "IFF8-Bit Sampled Voice",
        "file_extension": "8svx",
        "hex": "46 4F 52 4D nn nn nn nn 38 53 56 58",
        "offset": "any",
    },
    {
        "ascii": "FORM.... 8SVX",
        "description": "IFF8-Bit Sampled Voice",
        "file_extension": "8sv",
        "hex": "46 4F 52 4D nn nn nn nn 38 53 56 58",
        "offset": "any",
    },
    {
        "ascii": "FORM.... 8SVX",
        "description": "IFF8-Bit Sampled Voice",
        "file_extension": "svx",
        "hex": "46 4F 52 4D nn nn nn nn 38 53 56 58",
        "offset": "any",
    },
    {
        "ascii": "FORM.... 8SVX",
        "description": "IFF8-Bit Sampled Voice",
        "file_extension": "snd",
        "hex": "46 4F 52 4D nn nn nn nn 38 53 56 58",
        "offset": "any",
    },
    {
        "ascii": "FORM.... 8SVX",
        "description": "IFF8-Bit Sampled Voice",
        "file_extension": "iff",
        "hex": "46 4F 52 4D nn nn nn nn 38 53 56 58",
        "offset": "any",
    },
    {
        "ascii": "FORM.... ACBM",
        "description": "Amiga Contiguous Bitmap",
        "file_extension": "acbm",
        "hex": "46 4F 52 4D nn nn nn nn 41 43 42 4D",
        "offset": "any",
    },
    {
        "ascii": "FORM.... ACBM",
        "description": "Amiga Contiguous Bitmap",
        "file_extension": "iff",
        "hex": "46 4F 52 4D nn nn nn nn 41 43 42 4D",
        "offset": "any",
    },
    {
        "ascii": "FORM.... ANBM",
        "description": "IFFAnimated Bitmap",
        "file_extension": "anbm",
        "hex": "46 4F 52 4D nn nn nn nn 41 4E 42 4D",
        "offset": "any",
    },
    {
        "ascii": "FORM.... ANBM",
        "description": "IFFAnimated Bitmap",
        "file_extension": "iff",
        "hex": "46 4F 52 4D nn nn nn nn 41 4E 42 4D",
        "offset": "any",
    },
    {
        "ascii": "FORM.... ANIM",
        "description": "IFFCEL Animation",
        "file_extension": "anim",
        "hex": "46 4F 52 4D nn nn nn nn 41 4E 49 4D",
        "offset": "any",
    },
    {
        "ascii": "FORM.... ANIM",
        "description": "IFFCEL Animation",
        "file_extension": "iff",
        "hex": "46 4F 52 4D nn nn nn nn 41 4E 49 4D",
        "offset": "any",
    },
    {
        "ascii": "FORM.... FAXX",
        "description": "IFFFacsimile Image",
        "file_extension": "faxx",
        "hex": "46 4F 52 4D nn nn nn nn 46 41 58 58",
        "offset": "any",
    },
    {
        "ascii": "FORM.... FAXX",
        "description": "IFFFacsimile Image",
        "file_extension": "faxx",
        "hex": "46 4F 52 4D nn nn nn nn 46 41 58 58",
        "offset": "any",
    },
    {
        "ascii": "FORM.... FAXX",
        "description": "IFFFacsimile Image",
        "file_extension": "iff",
        "hex": "46 4F 52 4D nn nn nn nn 46 41 58 58",
        "offset": "any",
    },
    {
        "ascii": "FORM.... FTXT",
        "description": "IFFFormatted Text",
        "file_extension": "ftxt",
        "hex": "46 4F 52 4D nn nn nn nn 46 54 58 54",
        "offset": "any",
    },
    {
        "ascii": "FORM.... FTXT",
        "description": "IFFFormatted Text",
        "file_extension": "txt",
        "hex": "46 4F 52 4D nn nn nn nn 46 54 58 54",
        "offset": "any",
    },
    {
        "ascii": "FORM.... FTXT",
        "description": "IFFFormatted Text",
        "file_extension": "iff",
        "hex": "46 4F 52 4D nn nn nn nn 46 54 58 54",
        "offset": "any",
    },
    {
        "ascii": "FORM.... SMUS",
        "description": "IFFSimple Musical Score",
        "file_extension": "smus",
        "hex": "46 4F 52 4D nn nn nn nn 53 4D 55 53",
        "offset": "any",
    },
    {
        "ascii": "FORM.... SMUS",
        "description": "IFFSimple Musical Score",
        "file_extension": "smu",
        "hex": "46 4F 52 4D nn nn nn nn 53 4D 55 53",
        "offset": "any",
    },
    {
        "ascii": "FORM.... SMUS",
        "description": "IFFSimple Musical Score",
        "file_extension": "mus",
        "hex": "46 4F 52 4D nn nn nn nn 53 4D 55 53",
        "offset": "any",
    },
    {
        "ascii": "FORM.... SMUS",
        "description": "IFFSimple Musical Score",
        "file_extension": "iff",
        "hex": "46 4F 52 4D nn nn nn nn 53 4D 55 53",
        "offset": "any",
    },
    {
        "ascii": "FORM.... CMUS",
        "description": "IFFMusical Score",
        "file_extension": "cmus",
        "hex": "46 4F 52 4D nn nn nn nn 43 4D 55 53",
        "offset": "any",
    },
    {
        "ascii": "FORM.... CMUS",
        "description": "IFFMusical Score",
        "file_extension": "mus",
        "hex": "46 4F 52 4D nn nn nn nn 43 4D 55 53",
        "offset": "any",
    },
    {
        "ascii": "FORM.... CMUS",
        "description": "IFFMusical Score",
        "file_extension": "iff",
        "hex": "46 4F 52 4D nn nn nn nn 43 4D 55 53",
        "offset": "any",
    },
    {
        "ascii": "FORM.... YUVN",
        "description": "IFFYUV Image",
        "file_extension": "yuvn",
        "hex": "46 4F 52 4D nn nn nn nn 59 55 56 4E",
        "offset": "any",
    },
    {
        "ascii": "FORM.... YUVN",
        "description": "IFFYUV Image",
        "file_extension": "yuv",
        "hex": "46 4F 52 4D nn nn nn nn 59 55 56 4E",
        "offset": "any",
    },
    {
        "ascii": "FORM.... YUVN",
        "description": "IFFYUV Image",
        "file_extension": "iff",
        "hex": "46 4F 52 4D nn nn nn nn 59 55 56 4E",
        "offset": "any",
    },
    {
        "ascii": "FORM.... FANT",
        "description": "AmigaFantavision Movie",
        "file_extension": "iff",
        "hex": "46 4F 52 4D nn nn nn nn 46 41 4E 54",
        "offset": "any",
    },
    {
        "ascii": "FORM.... AIFF",
        "description": "Audio Interchange File Format",
        "file_extension": "aiff",
        "hex": "46 4F 52 4D nn nn nn nn 41 49 46 46",
        "offset": "any",
    },
    {
        "ascii": "FORM.... AIFF",
        "description": "Audio Interchange File Format",
        "file_extension": "aif",
        "hex": "46 4F 52 4D nn nn nn nn 41 49 46 46",
        "offset": "any",
    },
    {
        "ascii": "FORM.... AIFF",
        "description": "Audio Interchange File Format",
        "file_extension": "aifc",
        "hex": "46 4F 52 4D nn nn nn nn 41 49 46 46",
        "offset": "any",
    },
    {
        "ascii": "FORM.... AIFF",
        "description": "Audio Interchange File Format",
        "file_extension": "snd",
        "hex": "46 4F 52 4D nn nn nn nn 41 49 46 46",
        "offset": "any",
    },
    {
        "ascii": "FORM.... AIFF",
        "description": "Audio Interchange File Format",
        "file_extension": "iff",
        "hex": "46 4F 52 4D nn nn nn nn 41 49 46 46",
        "offset": "any",
    },
    {
        "ascii": "INDX",
        "description": "Index file to a file ortape containing abackup done "
        "withAmiBack on anAmiga.",
        "file_extension": "idx",
        "hex": "49 4E 44 58",
        "offset": "0",
    },
    {
        "ascii": "LZIP",
        "description": "lzip compressed file",
        "file_extension": "lz",
        "hex": "4C 5A 49 50",
        "offset": "0",
    },
    {
        "ascii": "MZ",
        "description": "DOS MZ executable file format and its descendants "
        "(includingNE andPE)",
        "file_extension": "exe",
        "hex": "4D 5A",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML",
        "file_extension": "zip",
        "hex": "50 4B 03 04",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML",
        "file_extension": "jar",
        "hex": "50 4B 03 04",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML",
        "file_extension": "odt",
        "hex": "50 4B 03 04",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML",
        "file_extension": "ods",
        "hex": "50 4B 03 04",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML",
        "file_extension": "odp",
        "hex": "50 4B 03 04",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML",
        "file_extension": "docx",
        "hex": "50 4B 03 04",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML",
        "file_extension": "xlsx",
        "hex": "50 4B 03 04",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML",
        "file_extension": "pptx",
        "hex": "50 4B 03 04",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML",
        "file_extension": "vsdx",
        "hex": "50 4B 03 04",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML",
        "file_extension": "apk",
        "hex": "50 4B 03 04",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML "
        "(empty archive)",
        "file_extension": "zip",
        "hex": "50 4B 05 06",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML "
        "(empty archive)",
        "file_extension": "jar",
        "hex": "50 4B 05 06",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML "
        "(empty archive)",
        "file_extension": "odt",
        "hex": "50 4B 05 06",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML "
        "(empty archive)",
        "file_extension": "ods",
        "hex": "50 4B 05 06",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML "
        "(empty archive)",
        "file_extension": "odp",
        "hex": "50 4B 05 06",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML "
        "(empty archive)",
        "file_extension": "docx",
        "hex": "50 4B 05 06",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML "
        "(empty archive)",
        "file_extension": "xlsx",
        "hex": "50 4B 05 06",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML "
        "(empty archive)",
        "file_extension": "pptx",
        "hex": "50 4B 05 06",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML "
        "(empty archive)",
        "file_extension": "vsdx",
        "hex": "50 4B 05 06",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML "
        "(empty archive)",
        "file_extension": "apk",
        "hex": "50 4B 05 06",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML "
        "(spanned archive)",
        "file_extension": "zip",
        "hex": "50 4B 07 08",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML "
        "(spanned archive)",
        "file_extension": "jar",
        "hex": "50 4B 07 08",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML "
        "(spanned archive)",
        "file_extension": "odt",
        "hex": "50 4B 07 08",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML "
        "(spanned archive)",
        "file_extension": "ods",
        "hex": "50 4B 07 08",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML "
        "(spanned archive)",
        "file_extension": "odp",
        "hex": "50 4B 07 08",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML "
        "(spanned archive)",
        "file_extension": "docx",
        "hex": "50 4B 07 08",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML "
        "(spanned archive)",
        "file_extension": "xlsx",
        "hex": "50 4B 07 08",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML "
        "(spanned archive)",
        "file_extension": "pptx",
        "hex": "50 4B 07 08",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML "
        "(spanned archive)",
        "file_extension": "vsdx",
        "hex": "50 4B 07 08",
        "offset": "0",
    },
    {
        "ascii": "PK..",
        "description": "zip file format and formats based on it, such asJAR,ODF,OOXML "
        "(spanned archive)",
        "file_extension": "apk",
        "hex": "50 4B 07 08",
        "offset": "0",
    },
    {
        "ascii": "Rar!...",
        "description": "RAR archive version 1.50 onwards",
        "file_extension": "rar",
        "hex": "52 61 72 21 1A 07 00",
        "offset": "0",
    },
    {
        "ascii": "Rar!....",
        "description": "RAR archive version 5.0 onwards",
        "file_extension": "rar",
        "hex": "52 61 72 21 1A 07 01 00",
        "offset": "0",
    },
    {
        "ascii": ".ELF",
        "description": "Executable and Linkable Format",
        "file_extension": "",
        "hex": "7F 45 4C 46",
        "offset": "0",
    },
    {
        "ascii": ".PNG....",
        "description": "Image encoded in thePortable Network Graphics format",
        "file_extension": "png",
        "hex": "89 50 4E 47 0D 0A 1A 0A",
        "offset": "0",
    },
    {
        "ascii": "Êþº¾",
        "description": "Java class file,Mach-O Fat Binary",
        "file_extension": "class",
        "hex": "CA FE BA BE",
        "offset": "0",
    },
    {
        "ascii": "ï»¿",
        "description": "UTF-8 encodedUnicodebyte order mark, commonly seen in text "
        "files.",
        "file_extension": "",
        "hex": "EF BB BF",
        "offset": "0",
    },
    {
        "ascii": "........",
        "description": "Mach-O binary (32-bit)",
        "file_extension": "",
        "hex": "FE ED FA CE",
        "offset": "0",
    },
    {
        "ascii": "........",
        "description": "Mach-O binary (32-bit)",
        "file_extension": "",
        "hex": "FE ED FA CE",
        "offset": "0x1000",
    },
    {
        "ascii": "........",
        "description": "Mach-O binary (64-bit)",
        "file_extension": "",
        "hex": "FE ED FA CF",
        "offset": "0",
    },
    {
        "ascii": "........",
        "description": "Mach-O binary (64-bit)",
        "file_extension": "",
        "hex": "FE ED FA CF",
        "offset": "0x1000",
    },
    {
        "ascii": "........",
        "description": "Mach-O binary (reverse byte ordering scheme, 32-bit)",
        "file_extension": "",
        "hex": "CE FA ED FE",
        "offset": "0",
    },
    {
        "ascii": "........",
        "description": "Mach-O binary (reverse byte ordering scheme, 64-bit)",
        "file_extension": "",
        "hex": "CF FA ED FE",
        "offset": "0",
    },
    {
        "ascii": "..",
        "description": "Byte-order mark for text file encoded inlittle-endian16-bit "
        "Unicode Transfer Format",
        "file_extension": "",
        "hex": "FF FE",
        "offset": "0",
    },
    {
        "ascii": "....",
        "description": "Byte-order mark for text file encoded in little-endian32-bit "
        "Unicode Transfer Format",
        "file_extension": "",
        "hex": "FF FE 00 00",
        "offset": "0",
    },
    {
        "ascii": "%!PS",
        "description": "PostScript document",
        "file_extension": "ps",
        "hex": "25 21 50 53",
        "offset": "0",
    },
    {
        "ascii": "%PDF",
        "description": "PDF document",
        "file_extension": "pdf",
        "hex": "25 50 44 46",
        "offset": "0",
    },
    {
        "ascii": "0&²u.fÏ .¦Ù.ª.bÎl",
        "description": "Advanced Systems Format",
        "file_extension": "asf",
        "hex": "30 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C",
        "offset": "0",
    },
    {
        "ascii": "0&²u.fÏ .¦Ù.ª.bÎl",
        "description": "Advanced Systems Format",
        "file_extension": "wma",
        "hex": "30 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C",
        "offset": "0",
    },
    {
        "ascii": "0&²u.fÏ .¦Ù.ª.bÎl",
        "description": "Advanced Systems Format",
        "file_extension": "wmv",
        "hex": "30 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C",
        "offset": "0",
    },
    {
        "ascii": "$SDI0001",
        "description": "System Deployment Image, a disk image format used byMicrosoft",
        "file_extension": "",
        "hex": "24 53 44 49 30 30 30 31",
        "offset": "0",
    },
    {
        "ascii": "OggS",
        "description": "Ogg, anopen source media container format",
        "file_extension": "ogg",
        "hex": "4F 67 67 53",
        "offset": "0",
    },
    {
        "ascii": "OggS",
        "description": "Ogg, anopen source media container format",
        "file_extension": "oga",
        "hex": "4F 67 67 53",
        "offset": "0",
    },
    {
        "ascii": "OggS",
        "description": "Ogg, anopen source media container format",
        "file_extension": "ogv",
        "hex": "4F 67 67 53",
        "offset": "0",
    },
    {
        "ascii": "8BPS",
        "description": "Photoshop Document file,Adobe Photoshop's native file format",
        "file_extension": "psd",
        "hex": "38 42 50 53",
        "offset": "0",
    },
    {
        "ascii": "RIFF.... WAVE",
        "description": "Waveform Audio File Format",
        "file_extension": "wav",
        "hex": "52 49 46 46 nn nn nn nn 57 41 56 45",
        "offset": "0",
    },
    {
        "ascii": "RIFF.... AVI.",
        "description": "Audio Video Interleave video format",
        "file_extension": "avi",
        "hex": "52 49 46 46 nn nn nn nn 41 56 49 20",
        "offset": "0",
    },
    {
        "ascii": "ÿû",
        "description": "MPEG-1 Layer 3 file without anID3 tag or with anID3v1 tag "
        "(which's appended at the end of the file)",
        "file_extension": "mp3",
        "hex": "FF FB",
        "offset": "0",
    },
    {
        "ascii": "ID3",
        "description": "MP3 file with an ID3v2 container",
        "file_extension": "mp3",
        "hex": "49 44 33",
        "offset": "0",
    },
    {
        "ascii": "BM",
        "description": "BMP file, abitmap format used mostly in theWindows world",
        "file_extension": "bmp",
        "hex": "42 4D",
        "offset": "0",
    },
    {
        "ascii": "BM",
        "description": "BMP file, abitmap format used mostly in theWindows world",
        "file_extension": "dib",
        "hex": "42 4D",
        "offset": "0",
    },
    {
        "ascii": "BM",
        "description": "BMP file, abitmap format used mostly in theWindows world",
        "file_extension": "bmp",
        "hex": "42 4D",
        "offset": "0",
    },
    {
        "ascii": "BM",
        "description": "BMP file, abitmap format used mostly in theWindows world",
        "file_extension": "dib",
        "hex": "42 4D",
        "offset": "0",
    },
    {
        "ascii": "CD001",
        "description": "ISO9660 CD/DVD image file",
        "file_extension": "iso",
        "hex": "43 44 30 30 31",
        "offset": "0x8001",
    },
    {
        "ascii": "CD001",
        "description": "ISO9660 CD/DVD image file",
        "file_extension": "iso",
        "hex": "43 44 30 30 31",
        "offset": "0x8801",
    },
    {
        "ascii": "CD001",
        "description": "ISO9660 CD/DVD image file",
        "file_extension": "iso",
        "hex": "43 44 30 30 31",
        "offset": "0x9001",
    },
    {
        "ascii": "SIMPLE   =         T",
        "description": "Flexible Image Transport System (FITS)",
        "file_extension": "fits",
        "hex": "53 49 4D 50 4C 45 20 20 3D 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54",
        "offset": "0",
    },
    {
        "ascii": "fLaC",
        "description": "Free Lossless Audio Codec",
        "file_extension": "flac",
        "hex": "66 4C 61 43",
        "offset": "0",
    },
    {
        "ascii": "MThd",
        "description": "MIDI sound file",
        "file_extension": "mid",
        "hex": "4D 54 68 64",
        "offset": "0",
    },
    {
        "ascii": "MThd",
        "description": "MIDI sound file",
        "file_extension": "midi",
        "hex": "4D 54 68 64",
        "offset": "0",
    },
    {
        "ascii": "",
        "description": "Compound File Binary Format, a container format used for "
        "document by older versions ofMicrosoft Office.It is however "
        "an open format used by other programs as well.",
        "file_extension": "doc",
        "hex": "D0 CF 11 E0 A1 B1 1A E1",
        "offset": "",
    },
    {
        "ascii": "",
        "description": "Compound File Binary Format, a container format used for "
        "document by older versions ofMicrosoft Office.It is however "
        "an open format used by other programs as well.",
        "file_extension": "xls",
        "hex": "D0 CF 11 E0 A1 B1 1A E1",
        "offset": "",
    },
    {
        "ascii": "",
        "description": "Compound File Binary Format, a container format used for "
        "document by older versions ofMicrosoft Office.It is however "
        "an open format used by other programs as well.",
        "file_extension": "ppt",
        "hex": "D0 CF 11 E0 A1 B1 1A E1",
        "offset": "",
    },
    {
        "ascii": "",
        "description": "Compound File Binary Format, a container format used for "
        "document by older versions ofMicrosoft Office.It is however "
        "an open format used by other programs as well.",
        "file_extension": "msg",
        "hex": "D0 CF 11 E0 A1 B1 1A E1",
        "offset": "",
    },
    {
        "ascii": "dex.035.",
        "description": "Dalvik Executable",
        "file_extension": "dex",
        "hex": "64 65 78 0A 30 33 35 00",
        "offset": "0",
    },
    {
        "ascii": "KDM",
        "description": "VMDK files",
        "file_extension": "vmdk",
        "hex": "4B 44 4D",
        "offset": "0",
    },
    {
        "ascii": "Cr24",
        "description": "Google Chrome extensionor packaged app",
        "file_extension": "crx",
        "hex": "43 72 32 34",
        "offset": "0",
    },
    {
        "ascii": "AGD3",
        "description": "FreeHand 8 document",
        "file_extension": "fh8",
        "hex": "41 47 44 33",
        "offset": "0",
    },
    {
        "ascii": "....BOBO ........ ....",
        "description": "AppleWorks 5 document",
        "file_extension": "cwk",
        "hex": "05 07 00 00 42 4F 42 4F 05 07 00 00 00 00 00 00 00 00 00 00 00 01",
        "offset": "0",
    },
    {
        "ascii": "....BOBO ........ ....",
        "description": "AppleWorks 6 document",
        "file_extension": "cwk",
        "hex": "06 07 E1 00 42 4F 42 4F 06 07 E1 00 00 00 00 00 00 00 00 00 00 01",
        "offset": "0",
    },
    {
        "ascii": "ER....ãER....",
        "description": "RoxioToast disc image file, also some .dmg-files begin with "
        "same bytes",
        "file_extension": "toast",
        "hex": "45 52 02 00 00 00 8B 45 52 02 00 00 00",
        "offset": "0",
    },
    {
        "ascii": "x.s.bb`",
        "description": "Apple Disk Image file",
        "file_extension": "dmg",
        "hex": "78 01 73 0D 62 62 60",
        "offset": "0",
    },
    {
        "ascii": "xar!",
        "description": "eXtensible Archive format",
        "file_extension": "xar",
        "hex": "78 61 72 21",
        "offset": "0",
    },
    {
        "ascii": "PMOCCMOC",
        "description": "Windows Files And Settings Transfer Repository, See also USMT "
        "3.0 (Win XP) and USMT 4.0 (Win 7) User Guides",
        "file_extension": "dat",
        "hex": "50 4D 4F 43 43 4D 4F 43",
        "offset": "0",
    },
    {
        "ascii": "NES",
        "description": "Nintendo Entertainment System ROM file",
        "file_extension": "nes",
        "hex": "4E 45 53 1A",
        "offset": "0",
    },
    {
        "ascii": "ustar.00ustar  .",
        "description": "tar archive",
        "file_extension": "tar",
        "hex": "75 73 74 61 72 00 30 30 75 73 74 61 72 20 20 00",
        "offset": "0x101",
    },
    {
        "ascii": "TOX",
        "description": "Open source portable voxel file",
        "file_extension": "tox",
        "hex": "74 6F 78 33",
        "offset": "0",
    },
    {
        "ascii": "MLVI",
        "description": "Magic Lantern Video file",
        "file_extension": "MLV",
        "hex": "4D 4C 56 49",
        "offset": "0",
    },
    {
        "ascii": "DCM PA30",
        "description": "Windows UpdateBinary Delta Compression",
        "file_extension": "",
        "hex": "44 43 4D 01 50 41 33 30",
        "offset": "0",
    },
    {
        "ascii": "7z¼¯'",
        "description": "7-Zip File Format",
        "file_extension": "7z",
        "hex": "37 7A BC AF 27 1C",
        "offset": "0",
    },
    {
        "ascii": "..",
        "description": "GZIP",
        "file_extension": "gz",
        "hex": "1F 8B",
        "offset": "0",
    },
    {
        "ascii": "..",
        "description": "GZIP",
        "file_extension": "tar.gz",
        "hex": "1F 8B",
        "offset": "0",
    },
    {
        "ascii": '."M.',
        "description": "LZ4 Frame Format, LZ4 block format does not offer any magic "
        "bytes.",
        "file_extension": "lz4",
        "hex": "04 22 4D 18",
        "offset": "0",
    },
    {
        "ascii": "MSCF",
        "description": "Microsoft Cabinet file",
        "file_extension": "cab",
        "hex": "4D 53 43 46",
        "offset": "0",
    },
    {
        "ascii": "FLIF",
        "description": "Free Lossless Image Format",
        "file_extension": "flif",
        "hex": "46 4C 49 46",
        "offset": "0",
    },
    {
        "ascii": ".Eß£",
        "description": "Matroska media container, includingWebM",
        "file_extension": "mkv",
        "hex": "1A 45 DF A3",
        "offset": "0",
    },
    {
        "ascii": ".Eß£",
        "description": "Matroska media container, includingWebM",
        "file_extension": "mka",
        "hex": "1A 45 DF A3",
        "offset": "0",
    },
    {
        "ascii": ".Eß£",
        "description": "Matroska media container, includingWebM",
        "file_extension": "mks",
        "hex": "1A 45 DF A3",
        "offset": "0",
    },
    {
        "ascii": ".Eß£",
        "description": "Matroska media container, includingWebM",
        "file_extension": "mk3d",
        "hex": "1A 45 DF A3",
        "offset": "0",
    },
    {
        "ascii": ".Eß£",
        "description": "Matroska media container, includingWebM",
        "file_extension": "webm",
        "hex": "1A 45 DF A3",
        "offset": "0",
    },
    {
        "ascii": "MIL",
        "description": '"SEAN\xa0: Session Analysis" Training file. Also used in '
        'compatible software "Rpw\xa0:Rowperfect for Windows" and '
        '"RP3W\xa0: ROWPERFECT3 for Windows".',
        "file_extension": "stg",
        "hex": "4D 49 4C 20",
        "offset": "0",
    },
    {
        "ascii": "AT&TFORM....DJV",
        "description": "DjVu document. The following byte is either55 (U) for "
        "single-page or4D (M) for multi-page documents.",
        "file_extension": "['djvu', 'djv']",
        "hex": "41 54 26 54 46 4F 52 4D nn nn nn nn 44 4A 56",
        "offset": "0",
    },
    {
        "ascii": "AT&TFORM....DJV",
        "description": "DjVu document. The following byte is either55 (U) for "
        "single-page or4D (M) for multi-page documents.",
        "file_extension": "djvu",
        "hex": "41 54 26 54 46 4F 52 4D nn nn nn nn 44 4A 56",
        "offset": "0",
    },
    {
        "ascii": "AT&TFORM....DJV",
        "description": "DjVu document. The following byte is either55 (U) for "
        "single-page or4D (M) for multi-page documents.",
        "file_extension": "djv",
        "hex": "41 54 26 54 46 4F 52 4D nn nn nn nn 44 4A 56",
        "offset": "0",
    },
    {
        "ascii": "0.",
        "description": "DER encoded X.509 certificate",
        "file_extension": "der",
        "hex": "30 82",
        "offset": "0",
    },
    {
        "ascii": "DICM",
        "description": "DICOM Medical File Format",
        "file_extension": "dcm",
        "hex": "44 49 43 4D",
        "offset": "0x80",
    },
    {
        "ascii": "wOFF",
        "description": "WOFF File Format 1.0",
        "file_extension": "woff",
        "hex": "77 4F 46 46",
        "offset": "0",
    },
    {
        "ascii": "wOF2",
        "description": "WOFF File Format 2.0",
        "file_extension": "woff2",
        "hex": "77 4F 46 32",
        "offset": "0",
    },
    {
        "ascii": "<?xml",
        "description": "eXtensible Markup Language when using theASCII character "
        "encoding",
        "file_extension": "XML",
        "hex": "3c 3f 78 6d 6c 20",
        "offset": "0",
    },
    {
        "ascii": "\\0asm",
        "description": "WebAssembly binary format",
        "file_extension": "wasm",
        "hex": "6d 73 61 00",
        "offset": "0",
    },
    {
        "ascii": "",
        "description": "Lepton compressed JPEG image",
        "file_extension": "lep",
        "hex": "cf 84 01",
        "offset": "0",
    },
    {
        "ascii": "CWS",
        "description": "flash .swf",
        "file_extension": "swf",
        "hex": "43 57 53",
        "offset": "0",
    },
    {
        "ascii": "EWS",
        "description": "flash .swf",
        "file_extension": "swf",
        "hex": "46 57 53",
        "offset": "0",
    },
    {
        "ascii": "!<arch>.",
        "description": "linux deb file",
        "file_extension": "deb",
        "hex": "21 3C 61 72 63 68 3E",
        "offset": "0",
    },
    {
        "ascii": "RIFF....",
        "description": "Google WebP image file",
        "file_extension": "webp",
        "hex": "52 49 46 46 nn nn nn nn",
        "offset": "0",
    },
    {
        "ascii": "WEBP",
        "description": "",
        "file_extension": "",
        "hex": "57 45 42 50",
        "offset": "",
    },
    {
        "ascii": "'..V",
        "description": "U-Boot / uImage.Das_U-Boot Universal Boot Loader.",
        "file_extension": "",
        "hex": "27 05 19 56",
        "offset": "0",
    },
]


class NoMatchException(Exception):
    """Raise for no matching byte signature exception"""

    def __init__(self, *arg, **kw):
        message = "There was no matching byte string/signature found!"
        super(NoMatchException, self).__init__(message, *arg, **kw)


class Matches(list):
    """a list of matching signatures"""

    def __init__(self, *arg, header=None, ext=None, **kw):
        super(Matches, self).__init__(*arg, **kw)
        if header is not None:
            self._set_from_sig(header)
        elif ext is not None:
            self._set_from_ext(ext)

    def _set_from_sig(self, _header):
        for test_sig in signatures:
            if compare_sig(_header, test_sig["hex"]):
                self.append(test_sig)

    def _set_from_ext(self, _ext):
        for test_sig in signatures:
            if _ext == test_sig["file_extension"]:
                self.append(test_sig)


class Signature(dict):
    "a signature dictionary"

    def __init__(self, signature, *arg, **kw):
        super(Signature, self).__init__(*arg, **kw)
        self.__dict__ = signature


def compare_sig(file_header, test_hex_string) -> bool:
    file_header = list(file_header)

    test_hex: List[Optional[int]] = []
    for _byte in test_hex_string.strip().split(" "):
        if _byte != "nn":
            test_hex.append(ord(bytes.fromhex(_byte)))
        else:
            test_hex.append(None)

    for _loc, _byte in enumerate(test_hex):
        if _byte is None:
            continue
        if _byte != file_header[_loc]:
            return False
    return True


def get_from_file(f, max_header=32) -> Matches:
    header = f.read(max_header)
    return Matches(header=header)


def get_from_path(path, max_header=32) -> Matches:
    with open(path, "rb") as f:
        header = f.read(max_header)
    return Matches(header=header)
