MCPcopy
hub / github.com/jtesta/ssh-audit / read_packet

Method read_packet

src/ssh_audit/ssh_socket.py:257–306  ·  view source on GitHub ↗
(self, sshv: int = 2)

Source from the content-addressed store, hash-verified

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()

Callers 5

auditFunction · 0.95
reconnectMethod · 0.80
recv_replyMethod · 0.80
send_init_gexMethod · 0.80
perform_testMethod · 0.80

Calls 12

ensure_readMethod · 0.95
write_intMethod · 0.95
writeMethod · 0.95
write_byteMethod · 0.95
write_flushMethod · 0.95
WriteBufClass · 0.90
read_intMethod · 0.80
readMethod · 0.80
read_byteMethod · 0.80
failMethod · 0.80
crc32Method · 0.80
writeMethod · 0.45

Tested by 2

reconnectMethod · 0.64
perform_testMethod · 0.64