| 255 | raise SSH_Socket.InsufficientReadException(e) |
| 256 | |
| 257 | def read_packet(self, sshv: int = 2) -> Tuple[int, bytes]: |
| 258 | try: |
| 259 | header = WriteBuf() |
| 260 | self.ensure_read(4) |
| 261 | packet_length = self.read_int() |
| 262 | header.write_int(packet_length) |
| 263 | # XXX: validate length |
| 264 | if sshv == 1: |
| 265 | padding_length = 8 - packet_length % 8 |
| 266 | self.ensure_read(padding_length) |
| 267 | padding = self.read(padding_length) |
| 268 | header.write(padding) |
| 269 | payload_length = packet_length |
| 270 | check_size = padding_length + payload_length |
| 271 | else: |
| 272 | self.ensure_read(1) |
| 273 | padding_length = self.read_byte() |
| 274 | header.write_byte(padding_length) |
| 275 | payload_length = packet_length - padding_length - 1 |
| 276 | check_size = 4 + 1 + payload_length + padding_length |
| 277 | if check_size % self.__block_size != 0: |
| 278 | self.__outputbuffer.fail('[exception] invalid ssh packet (block size)').write() |
| 279 | sys.exit(exitcodes.CONNECTION_ERROR) |
| 280 | self.ensure_read(payload_length) |
| 281 | if sshv == 1: |
| 282 | payload = self.read(payload_length - 4) |
| 283 | header.write(payload) |
| 284 | crc = self.read_int() |
| 285 | header.write_int(crc) |
| 286 | else: |
| 287 | payload = self.read(payload_length) |
| 288 | header.write(payload) |
| 289 | packet_type = ord(payload[0:1]) |
| 290 | if sshv == 1: |
| 291 | rcrc = SSH1.crc32(padding + payload) |
| 292 | if crc != rcrc: |
| 293 | self.__outputbuffer.fail('[exception] packet checksum CRC32 mismatch.').write() |
| 294 | sys.exit(exitcodes.CONNECTION_ERROR) |
| 295 | else: |
| 296 | self.ensure_read(padding_length) |
| 297 | padding = self.read(padding_length) |
| 298 | payload = payload[1:] |
| 299 | return packet_type, payload |
| 300 | except SSH_Socket.InsufficientReadException as ex: |
| 301 | if ex.args[0] is None: |
| 302 | header.write(self.read(self.unread_len)) |
| 303 | e = header.write_flush().strip() |
| 304 | else: |
| 305 | e = ex.args[0].encode('utf-8') |
| 306 | return -1, e |
| 307 | |
| 308 | def send_packet(self) -> Tuple[int, Optional[str]]: |
| 309 | payload = self.write_flush() |