From e8cf581e3f9141a1d2ef4c8fddb9f5f3b2066f41 Mon Sep 17 00:00:00 2001 From: Brian Warner Date: Thu, 25 Sep 2008 21:38:24 -0700 Subject: [PATCH] move netstring() and split_netstring() into a separate util.netstring module --- src/allmydata/dirnode.py | 26 +------------------------- src/allmydata/util/hashutil.py | 5 +---- src/allmydata/util/netstring.py | 31 +++++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 29 deletions(-) create mode 100644 src/allmydata/util/netstring.py diff --git a/src/allmydata/dirnode.py b/src/allmydata/dirnode.py index 6945bdec..58245100 100644 --- a/src/allmydata/dirnode.py +++ b/src/allmydata/dirnode.py @@ -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 diff --git a/src/allmydata/util/hashutil.py b/src/allmydata/util/hashutil.py index 4e762ecf..750543c7 100644 --- a/src/allmydata/util/hashutil.py +++ b/src/allmydata/util/hashutil.py @@ -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 diff --git a/src/allmydata/util/netstring.py b/src/allmydata/util/netstring.py new file mode 100644 index 00000000..70a14e01 --- /dev/null +++ b/src/allmydata/util/netstring.py @@ -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) + -- 2.45.2