mirror of
https://github.com/jtesta/ssh-audit.git
synced 2024-12-23 06:27:41 +01:00
Signed mpint.
This commit is contained in:
parent
ddc5ea22f5
commit
fce491767c
@ -390,7 +390,7 @@ class WriteBuf(object):
|
|||||||
return len(bin(n)) - (2 if n > 0 else 3)
|
return len(bin(n)) - (2 if n > 0 else 3)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _create_mpint(cls, n, bits=None):
|
def _create_mpint(cls, n, signed=True, bits=None):
|
||||||
if bits is None:
|
if bits is None:
|
||||||
bits = cls._bitlength(n)
|
bits = cls._bitlength(n)
|
||||||
length = bits // 8 + (1 if n != 0 else 0)
|
length = bits // 8 + (1 if n != 0 else 0)
|
||||||
@ -400,14 +400,16 @@ class WriteBuf(object):
|
|||||||
v2[ql - i - 1] = (n & 0xffffffffffffffff)
|
v2[ql - i - 1] = (n & 0xffffffffffffffff)
|
||||||
n >>= 64
|
n >>= 64
|
||||||
data = bytes(struct.pack(fmt, *v2)[-length:])
|
data = bytes(struct.pack(fmt, *v2)[-length:])
|
||||||
if data.startswith(b'\xff\x80'):
|
if not signed:
|
||||||
|
data = data.lstrip(b'\x00')
|
||||||
|
elif data.startswith(b'\xff\x80'):
|
||||||
data = data[1:]
|
data = data[1:]
|
||||||
return data
|
return data
|
||||||
|
|
||||||
def write_mpint1(self, n):
|
def write_mpint1(self, n):
|
||||||
# NOTE: Data Type Enc @ http://www.snailbook.com/docs/protocol-1.5.txt
|
# NOTE: Data Type Enc @ http://www.snailbook.com/docs/protocol-1.5.txt
|
||||||
bits = self._bitlength(n)
|
bits = self._bitlength(n)
|
||||||
data = self._create_mpint(n, bits)
|
data = self._create_mpint(n, False, bits)
|
||||||
self.write(struct.pack('>H', bits))
|
self.write(struct.pack('>H', bits))
|
||||||
return self.write(data)
|
return self.write(data)
|
||||||
|
|
||||||
|
@ -20,7 +20,8 @@ class TestProtocol(object):
|
|||||||
mpint1r = lambda x: self.rbuf(x).read_mpint1()
|
mpint1r = lambda x: self.rbuf(x).read_mpint1()
|
||||||
tc = [(0x0, '00 00'),
|
tc = [(0x0, '00 00'),
|
||||||
(0x1234, '00 0d 12 34'),
|
(0x1234, '00 0d 12 34'),
|
||||||
(0x12345, '00 11 01 23 45')]
|
(0x12345, '00 11 01 23 45'),
|
||||||
|
(0xdeadbeef, '00 20 de ad be ef')]
|
||||||
for p in tc:
|
for p in tc:
|
||||||
assert mpint1w(p[0]) == self._b(p[1])
|
assert mpint1w(p[0]) == self._b(p[1])
|
||||||
assert mpint1r(self._b(p[1])) == p[0]
|
assert mpint1r(self._b(p[1])) == p[0]
|
||||||
|
Loading…
Reference in New Issue
Block a user