move netstring() and split_netstring() into a separate util.netstring module

This commit is contained in:
Brian Warner 2008-09-25 21:38:24 -07:00
parent 39fa9018ef
commit e8cf581e3f
3 changed files with 33 additions and 29 deletions

View File

@ -14,34 +14,10 @@ from allmydata.checker_results import DeepCheckResults, \
from allmydata.util import hashutil, mathutil, base32, log
from allmydata.util.hashutil import netstring
from allmydata.util.limiter import ConcurrencyLimiter
from allmydata.util.netstring import split_netstring
from allmydata.uri import NewDirectoryURI
from pycryptopp.cipher.aes import AES
def split_netstring(data, numstrings, allow_leftover=False):
"""like string.split(), but extracts netstrings. If allow_leftover=False,
returns numstrings elements, and throws ValueError if there was leftover
data. If allow_leftover=True, returns numstrings+1 elements, in which the
last element is the leftover data (possibly an empty string)"""
elements = []
assert numstrings >= 0
while data:
colon = data.index(":")
length = int(data[:colon])
string = data[colon+1:colon+1+length]
assert len(string) == length
elements.append(string)
assert data[colon+1+length] == ","
data = data[colon+1+length+1:]
if len(elements) == numstrings:
break
if len(elements) < numstrings:
raise ValueError("ran out of netstrings")
if allow_leftover:
return tuple(elements + [data])
if data:
raise ValueError("leftover data in netstrings")
return tuple(elements)
class Deleter:
def __init__(self, node, name, must_exist=True):
self.node = node

View File

@ -1,5 +1,6 @@
from pycryptopp.hash.sha256 import SHA256
import os
from allmydata.util.netstring import netstring
# Be very very cautious when modifying this file. Almost any change will
# cause a compatibility break, invalidating all outstanding URIs and making
@ -15,10 +16,6 @@ CRYPTO_VAL_SIZE=32
class IntegrityCheckError(Exception):
pass
def netstring(s):
assert isinstance(s, str), s # no unicode here
return "%d:%s," % (len(s), s,)
class _SHA256d_Hasher:
# use SHA-256d, as defined by Ferguson and Schneier: hash the output
# again to prevent length-extension attacks

View File

@ -0,0 +1,31 @@
def netstring(s):
assert isinstance(s, str), s # no unicode here
return "%d:%s," % (len(s), s,)
def split_netstring(data, numstrings, allow_leftover=False):
"""like string.split(), but extracts netstrings. If allow_leftover=False,
returns numstrings elements, and throws ValueError if there was leftover
data. If allow_leftover=True, returns numstrings+1 elements, in which the
last element is the leftover data (possibly an empty string)"""
elements = []
assert numstrings >= 0
while data:
colon = data.index(":")
length = int(data[:colon])
string = data[colon+1:colon+1+length]
assert len(string) == length
elements.append(string)
assert data[colon+1+length] == ","
data = data[colon+1+length+1:]
if len(elements) == numstrings:
break
if len(elements) < numstrings:
raise ValueError("ran out of netstrings")
if allow_leftover:
return tuple(elements + [data])
if data:
raise ValueError("leftover data in netstrings")
return tuple(elements)