mirror of
https://github.com/PurpleI2P/pyseeder
synced 2025-03-13 05:41:23 +00:00
calculate identity size from certificate. Recognize yggdrasil
This commit is contained in:
parent
1c1ca86a7b
commit
ce391cb92c
@ -1,11 +1,14 @@
|
|||||||
class RouterInfo:
|
class RouterInfo:
|
||||||
|
|
||||||
def __init__(self, filename):
|
def __init__(self, filename):
|
||||||
|
self.yggdrasil = False
|
||||||
with open(filename, 'rb') as f:
|
with open(filename, 'rb') as f:
|
||||||
buf = f.read()
|
buf = f.read()
|
||||||
if len(buf) < 391: # TODO: parse identity
|
if len(buf) < 387:
|
||||||
return
|
return
|
||||||
offset = 391
|
offset = 384 # crypto and signing keys
|
||||||
|
offset += int.from_bytes(buf[offset + 1: offset + 3], byteorder='big') # size from certificate
|
||||||
|
offset += 3 # certificate
|
||||||
self.timestamp = int.from_bytes(buf[offset: offset + 8], byteorder='big') # 8 bytes timestamp
|
self.timestamp = int.from_bytes(buf[offset: offset + 8], byteorder='big') # 8 bytes timestamp
|
||||||
offset += 8
|
offset += 8
|
||||||
offset += self.readaddresses(buf[offset:]) # addresses
|
offset += self.readaddresses(buf[offset:]) # addresses
|
||||||
@ -19,9 +22,25 @@ class RouterInfo:
|
|||||||
for i in range(0, numaddresses):
|
for i in range(0, numaddresses):
|
||||||
offset += 1 # cost
|
offset += 1 # cost
|
||||||
offset += 8 # date
|
offset += 8 # date
|
||||||
offset += len(self.readstring(buf[offset:])) + 1 # style string
|
style = self.readstring(buf[offset:]) # transport style
|
||||||
size = int.from_bytes(buf[offset:offset+2], byteorder='big') # properties
|
offset += len(style) + 1 # style string
|
||||||
offset += size + 2
|
size = int.from_bytes(buf[offset:offset+2], byteorder='big') # size of properties
|
||||||
|
offset += 2
|
||||||
|
if not self.yggdrasil and style == 'NTCP2': # possible yggdrasil?
|
||||||
|
r = offset
|
||||||
|
while r < size + offset:
|
||||||
|
key = self.readstring(buf[r:])
|
||||||
|
r += len(key) + 2 # length and =
|
||||||
|
if key == 'host':
|
||||||
|
value = self.readstring(buf[r:])
|
||||||
|
firstcolon = value.find(':')
|
||||||
|
if firstcolon > 0: # ipv6 address
|
||||||
|
first = int(value[0:firstcolon], 16) # first segment of ipv6 address
|
||||||
|
if first >= 0x0200 and first <= 0x03FF: # yggdrasil range
|
||||||
|
self.yggdrasil = True
|
||||||
|
break
|
||||||
|
r += len(self.readstring(buf[r:])) + 2 # length and ;
|
||||||
|
offset += size
|
||||||
return offset
|
return offset
|
||||||
|
|
||||||
def readproperties(self, buf):
|
def readproperties(self, buf):
|
||||||
@ -57,3 +76,6 @@ class RouterInfo:
|
|||||||
def isvalid(self):
|
def isvalid(self):
|
||||||
return self.getversion() >= 959 and not self.hasinvalidcaps() # version >= 0.9.59 and no 'U', 'D', 'E' or 'G' caps
|
return self.getversion() >= 959 and not self.hasinvalidcaps() # version >= 0.9.59 and no 'U', 'D', 'E' or 'G' caps
|
||||||
|
|
||||||
|
def isyggdrasil(self):
|
||||||
|
return self.yggdrasil
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user