Exemple #1
0
    def parse(self):
        print("      Parsing xRIT headers...")

        primaryHeader = self.data[:16]

        # Header fields
        self.HEADER_TYPE = get_bits_int(primaryHeader, 0, 8,
                                        128)  # File Counter (always 0x00)
        self.HEADER_LEN = get_bits_int(primaryHeader, 8, 16,
                                       128)  # Header Length (always 0x10)
        self.FILE_TYPE = get_bits_int(primaryHeader, 24, 8, 128)  # File Type
        self.TOTAL_HEADER_LEN = get_bits_int(primaryHeader, 32, 32,
                                             128)  # Total xRIT Header Length
        self.DATA_LEN = get_bits_int(primaryHeader, 64, 64,
                                     128)  # Data Field Length

        if self.FILE_TYPE == 0:
            self.FILE_TYPE = "Image Data"
        elif self.FILE_TYPE == 1:
            self.FILE_TYPE = "GTS Message"
        elif self.FILE_TYPE == 2:
            self.FILE_TYPE = "Alphanumeric Text"
        elif self.FILE_TYPE == 3:
            self.FILE_TYPE = "Encryption Key Message"
        elif self.FILE_TYPE == 128:
            self.FILE_TYPE = "CMDPS Analysis Data"
        elif self.FILE_TYPE == 129:
            self.FILE_TYPE = "NWP Data"
        elif self.FILE_TYPE == 130:
            self.FILE_TYPE = "GOCI Data"
        elif self.FILE_TYPE == 131:
            self.FILE_TYPE = "Typhoon Info"

        print("        TYPE:      {}".format(self.FILE_TYPE))
        #print("        HEADER LENGTH: {} bits".format(self.TOTAL_HEADER_LEN))
        #print("        DATA LENGTH: {} bits".format(self.DATA_LEN))

        # Loop through headers until Annotation Text header (type 4)
        offset = self.HEADER_LEN
        nextHeader = self.get_next_header(offset)

        while nextHeader != 4:
            offset += self.get_header_len(offset)
            nextHeader = self.get_next_header(offset)

        # Parse Annotation Text header (type 4)
        athLen = self.get_header_len(offset)
        self.OUTPUT_FILE_NAME = self.data[offset + 3:offset +
                                          athLen].decode('utf-8')
        print("        FILE NAME: {}".format(self.OUTPUT_FILE_NAME))

        return
Exemple #2
0
    def parse(self):
        """
        Parse TP_File header fields
        """

        header = self.data[:10]

        # Header fields
        self.COUNTER = get_bits_int(header, 0, 16, 80)                # File Counter
        self.LENGTH = int(get_bits_int(header, 16, 64, 80)/8)         # File Length

        # Add post-header data to payload
        self.PAYLOAD = self.data[10:]
Exemple #3
0
    def parse(self):
        """
        Parses xRIT primary and key headers
        """
        
        primaryHeader = self.data[:16]

        # Header fields
        HEADER_TYPE = get_bits_int(primaryHeader, 0, 8, 128)               # File Counter (always 0x00)
        HEADER_LEN = get_bits_int(primaryHeader, 8, 16, 128)               # Header Length (always 0x10)
        FILE_TYPE = get_bits_int(primaryHeader, 24, 8, 128)                # File Type
        TOTAL_HEADER_LEN = get_bits_int(primaryHeader, 32, 32, 128)        # Total xRIT Header Length
        DATA_LEN = get_bits_int(primaryHeader, 64, 64, 128)                # Data Field Length

        #print("  Header Length: {} bits ({} bytes)".format(TOTAL_HEADER_LEN, TOTAL_HEADER_LEN/8))
        #print("  Data Length: {} bits ({} bytes)".format(DATA_LEN, DATA_LEN/8))

        self.headerField = self.data[:TOTAL_HEADER_LEN]
        self.dataField = self.data[TOTAL_HEADER_LEN: TOTAL_HEADER_LEN + DATA_LEN]
        
        # Loop through headers until Key header (type 7)
        offset = 0
        nextHeader = int.from_bytes(self.headerField[offset : offset + 1], byteorder='big')

        while nextHeader != 7:
            offset += int.from_bytes(self.headerField[offset + 1 : offset + 3], byteorder='big')
            nextHeader = int.from_bytes(self.headerField[offset : offset + 1], byteorder='big')

        # Parse Key header (type 7)
        keyHLen = int.from_bytes(self.headerField[offset + 1 : offset + 3], byteorder='big')
        index = self.headerField[offset + 5 : offset + keyHLen]

        # Catch wrong key index
        try:
            self.key = self.keys[index]
        except KeyError:
            if index != b'\x00\x00': print("  UNKNOWN ENCRYPTION KEY INDEX")
            self.key = 0
        
        # Check block length if encryption is applied
        if self.key != 0:
            # Append null bytes to data field to fill last 8 byte DES block
            dFMod8 = len(self.dataField) % 8
            if dFMod8 != 0:
                for i in range(dFMod8):
                    self.dataField += b'x00'
Exemple #4
0
    def parse(self):
        """
        Parse CP_PDU header fields
        """

        header = self.data[:6]

        # Header fields
        self.VER = get_bits(header, 0, 3, 48)                   # Version (always b000)
        self.TYPE = get_bits(header, 3, 1, 48)                  # Type (always b0)
        self.SHF = get_bits(header, 4, 1, 48)                   # Secondary Header Flag
        self.APID = get_bits_int(header, 5, 11, 48)             # Application Process ID
        self.SEQ = get_bits_int(header, 16, 2, 48)              # Sequence Flag
        self.COUNTER = get_bits_int(header, 18, 14, 48)         # Packet Sequence Counter
        self.LENGTH = get_bits_int(header, 32, 16, 48) + 1      # Packet Length

        # Parse sequence flag
        seqn = ["CONTINUE", "FIRST", "LAST", "SINGLE"]
        self.SEQ = seqn[self.SEQ]

        # Add post-header data to payload
        self.PAYLOAD = self.data[6:]
Exemple #5
0
    def parse(self):
        header = self.data[:2]

        # Header fields
        self.SPARE = get_bits(header, 0, 5, 16)             # Spare Field (always b00000)
        self.POINTER = get_bits_int(header, 5, 11, 16)      # First Pointer Header

        # Detect if M_PDU contains CP_PDU header
        if self.POINTER != 2047:  # 0x07FF
            self.HEADER = True
        else:
            self.HEADER = False
        
        self.FRAME = self.data[2:]
Exemple #6
0
    def parse(self):
        header = self.data[self.offset:self.offset + 6]

        # Header fields
        self.VER = get_bits(header, 0, 3, 48)  # Version (always b000)
        self.TYPE = get_bits(header, 3, 1, 48)  # Type (always b0)
        self.SHF = get_bits(header, 4, 1, 48)  # Secondary Header Flag
        self.APID = get_bits_int(header, 5, 11, 48)  # Application Process ID
        self.SEQ = get_bits_int(header, 16, 2, 48)  # Sequence Flag
        self.COUNTER = get_bits_int(header, 18, 14,
                                    48)  # Packet Sequence Counter
        self.LENGTH = get_bits_int(header, 32, 16, 48) + 1  # Packet Length

        if self.SEQ == 0:
            self.SEQ = "CONTINUE"
        elif self.SEQ == 1:
            self.SEQ = "FIRST"
        elif self.SEQ == 2:
            self.SEQ = "LAST"
        elif self.SEQ == 3:
            self.SEQ = "SINGLE"

        self.PRE_HEADER_DATA = self.data[0:self.offset]
        self.POST_HEADER_DATA = self.data[self.offset + 6:]
Exemple #7
0
    def parse(self):
        header = self.data[:6]

        # Header fields
        self.VER = get_bits_int(header, 0, 2, 48)          # Virtual Channel Version
        self.SCID = get_bits_int(header, 2, 8, 48)         # Spacecraft ID
        self.VCID = get_bits_int(header, 10, 6, 48)        # Virtual Channel ID
        self.COUNT = get_bits_int(header, 16, 24, 48)      # VCDU Counter
        self.REPLAY = get_bits_int(header, 40, 1, 48)      # Replay Flag
        self.SPARE = get_bits_int(header, 41, 7, 48)       # Spare (always b0000000)

        self.get_SC_name()
        self.get_VC_name()

        self.MPDU = self.data[6:]
Exemple #8
0
    def parse(self):
        """
        Parse VCDU header fields
        """

        header = self.data[:6]

        # Header fields
        self.VER = get_bits_int(header, 0, 2, 48)          # Virtual Channel Version
        self.SCID = get_bits_int(header, 2, 8, 48)         # Spacecraft ID
        self.VCID = get_bits_int(header, 10, 6, 48)        # Virtual Channel ID
        self.COUNT = get_bits_int(header, 16, 24, 48)      # VCDU Counter
        self.REPLAY = get_bits_int(header, 40, 1, 48)      # Replay Flag
        self.SPARE = get_bits_int(header, 41, 7, 48)       # Spare (always b0000000)

        # Spacecraft and virtual channel names
        self.SC = self.get_SC(self.SCID)
        self.VC = self.get_VC(self.VCID)

        # M_PDU contained in VCDU
        self.MPDU = self.data[6:]
    def parse(self):
        header = self.data[:10]

        # Header fields
        self.COUNTER = get_bits_int(header, 0, 16, 80)  # File Counter
        self.LENGTH = get_bits_int(header, 16, 64, 80)  # File Length