summaryrefslogtreecommitdiff
path: root/paramiko/ber.py
diff options
context:
space:
mode:
Diffstat (limited to 'paramiko/ber.py')
-rw-r--r--paramiko/ber.py44
1 files changed, 24 insertions, 20 deletions
diff --git a/paramiko/ber.py b/paramiko/ber.py
index 3941581..0515230 100644
--- a/paramiko/ber.py
+++ b/paramiko/ber.py
@@ -15,9 +15,10 @@
# You should have received a copy of the GNU Lesser General Public License
# along with Paramiko; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+from paramiko.common import max_byte, zero_byte
+from paramiko.py3compat import b, byte_ord, byte_chr, long
-
-import util
+import paramiko.util as util
class BERException (Exception):
@@ -29,13 +30,16 @@ class BER(object):
Robey's tiny little attempt at a BER decoder.
"""
- def __init__(self, content=''):
- self.content = content
+ def __init__(self, content=bytes()):
+ self.content = b(content)
self.idx = 0
- def __str__(self):
+ def asbytes(self):
return self.content
+ def __str__(self):
+ return self.asbytes()
+
def __repr__(self):
return 'BER(\'' + repr(self.content) + '\')'
@@ -45,13 +49,13 @@ class BER(object):
def decode_next(self):
if self.idx >= len(self.content):
return None
- ident = ord(self.content[self.idx])
+ ident = byte_ord(self.content[self.idx])
self.idx += 1
if (ident & 31) == 31:
# identifier > 30
ident = 0
while self.idx < len(self.content):
- t = ord(self.content[self.idx])
+ t = byte_ord(self.content[self.idx])
self.idx += 1
ident = (ident << 7) | (t & 0x7f)
if not (t & 0x80):
@@ -59,7 +63,7 @@ class BER(object):
if self.idx >= len(self.content):
return None
# now fetch length
- size = ord(self.content[self.idx])
+ size = byte_ord(self.content[self.idx])
self.idx += 1
if size & 0x80:
# more complimicated...
@@ -67,12 +71,12 @@ class BER(object):
t = size & 0x7f
if self.idx + t > len(self.content):
return None
- size = util.inflate_long(self.content[self.idx : self.idx + t], True)
+ size = util.inflate_long(self.content[self.idx: self.idx + t], True)
self.idx += t
if self.idx + size > len(self.content):
# can't fit
return None
- data = self.content[self.idx : self.idx + size]
+ data = self.content[self.idx: self.idx + size]
self.idx += size
# now switch on id
if ident == 0x30:
@@ -87,9 +91,9 @@ class BER(object):
def decode_sequence(data):
out = []
- b = BER(data)
+ ber = BER(data)
while True:
- x = b.decode_next()
+ x = ber.decode_next()
if x is None:
break
out.append(x)
@@ -98,20 +102,20 @@ class BER(object):
def encode_tlv(self, ident, val):
# no need to support ident > 31 here
- self.content += chr(ident)
+ self.content += byte_chr(ident)
if len(val) > 0x7f:
lenstr = util.deflate_long(len(val))
- self.content += chr(0x80 + len(lenstr)) + lenstr
+ self.content += byte_chr(0x80 + len(lenstr)) + lenstr
else:
- self.content += chr(len(val))
+ self.content += byte_chr(len(val))
self.content += val
def encode(self, x):
if type(x) is bool:
if x:
- self.encode_tlv(1, '\xff')
+ self.encode_tlv(1, max_byte)
else:
- self.encode_tlv(1, '\x00')
+ self.encode_tlv(1, zero_byte)
elif (type(x) is int) or (type(x) is long):
self.encode_tlv(2, util.deflate_long(x))
elif type(x) is str:
@@ -122,8 +126,8 @@ class BER(object):
raise BERException('Unknown type for encoding: %s' % repr(type(x)))
def encode_sequence(data):
- b = BER()
+ ber = BER()
for item in data:
- b.encode(item)
- return str(b)
+ ber.encode(item)
+ return ber.asbytes()
encode_sequence = staticmethod(encode_sequence)