| 115 | |
| 116 | |
| 117 | class sshmessage: |
| 118 | |
| 119 | def __init__(self, rawdata): |
| 120 | self.__parse_raw(rawdata) |
| 121 | |
| 122 | def __parse_raw(self, data): |
| 123 | datalen = len(data) |
| 124 | if datalen < 6: |
| 125 | raise ValueError |
| 126 | |
| 127 | (self.packet_len, self.padding_len, |
| 128 | self.message_code) = struct.unpack(">IBB", data[0:6]) |
| 129 | if datalen < self.packet_len + 4: |
| 130 | raise ValueError |
| 131 | self.body = data[6:4+self.packet_len] |
| 132 | |
| 133 | # ECDH Kex Reply |
| 134 | if self.message_code == 31 or self.message_code == 33: |
| 135 | host_key_len = struct.unpack(">I", self.body[0:4])[0] |
| 136 | full_key_net = self.body[4:4+host_key_len] |
| 137 | key_type_name_len = struct.unpack(">I", full_key_net[0:4])[0] |
| 138 | key_type_name = full_key_net[4:4+key_type_name_len] |
| 139 | key_data = full_key_net[4+key_type_name_len:] |
| 140 | if key_type_name_len > 50: |
| 141 | # something went wrong |
| 142 | # this probably isn't a code 31 |
| 143 | self.message_code = 0 |
| 144 | else: |
| 145 | self.host_pub_key = "%s %s" % (key_type_name.decode( |
| 146 | 'utf-8'), base64.b64encode(full_key_net).decode('utf-8')) |
| 147 | |
| 148 | |
| 149 | def key_fingerprint(ssh_pubkey, hashfunction=hashlib.sha256): |