aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES.rst6
-rw-r--r--pyasn1/__init__.py2
-rw-r--r--pyasn1/type/char.py69
-rw-r--r--pyasn1/type/univ.py4
-rw-r--r--tests/type/test_char.py5
5 files changed, 42 insertions, 44 deletions
diff --git a/CHANGES.rst b/CHANGES.rst
index ec0f303..92c7a67 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -1,4 +1,10 @@
+Revision 0.3.4, released XX-08-2017
+-----------------------------------
+
+- Fixed Character types instantiation from OctetString type -- double
+ unicode decoding may have scrambled the data
+
Revision 0.3.3, released 27-08-2017
-----------------------------------
diff --git a/pyasn1/__init__.py b/pyasn1/__init__.py
index 5dd7945..8b713b4 100644
--- a/pyasn1/__init__.py
+++ b/pyasn1/__init__.py
@@ -1,7 +1,7 @@
import sys
# http://www.python.org/dev/peps/pep-0396/
-__version__ = '0.3.3'
+__version__ = '0.3.4'
if sys.version_info[:2] < (2, 4):
raise RuntimeError('PyASN1 requires Python 2.4 or later')
diff --git a/pyasn1/type/char.py b/pyasn1/type/char.py
index b95e9a7..155af21 100644
--- a/pyasn1/type/char.py
+++ b/pyasn1/type/char.py
@@ -53,36 +53,29 @@ class AbstractCharacterString(univ.OctetString):
return self._value.encode(self.encoding)
except UnicodeEncodeError:
raise error.PyAsn1Error(
- 'Can\'t encode string \'%s\' with \'%s\' codec' % (self._value, self.encoding)
+ "Can't encode string '%s' with codec %s" % (self._value, self.encoding)
)
def __unicode__(self):
- return unicode(self._value)
+ return self._value
def prettyIn(self, value):
- if isinstance(value, unicode):
- return value
- elif isinstance(value, str):
- try:
+ try:
+ if isinstance(value, unicode):
+ return value
+ elif isinstance(value, str):
return value.decode(self.encoding)
- except (LookupError, UnicodeDecodeError):
- raise error.PyAsn1Error(
- 'Can\'t decode string \'%s\' with \'%s\' codec' % (value, self.encoding)
- )
- elif isinstance(value, (tuple, list)):
- try:
+ elif isinstance(value, (tuple, list)):
return self.prettyIn(''.join([chr(x) for x in value]))
- except ValueError:
- raise error.PyAsn1Error(
- 'Bad %s initializer \'%s\'' % (self.__class__.__name__, value)
- )
- else:
- try:
+ elif isinstance(value, univ.OctetString):
+ return value.asOctets().decode(self.encoding)
+ else:
return unicode(value)
- except UnicodeDecodeError:
- raise error.PyAsn1Error(
- 'Can\'t turn object \'%s\' into unicode' % (value,)
- )
+
+ except (UnicodeDecodeError, LookupError):
+ raise error.PyAsn1Error(
+ "Can't decode string '%s' with codec %s" % (value, self.encoding)
+ )
def asOctets(self, padding=True):
return str(self)
@@ -99,28 +92,26 @@ class AbstractCharacterString(univ.OctetString):
return self._value.encode(self.encoding)
except UnicodeEncodeError:
raise error.PyAsn1Error(
- 'Can\'t encode string \'%s\' with \'%s\' codec' % (self._value, self.encoding)
+ "Can't encode string '%s' with codec %s" % (self._value, self.encoding)
)
def prettyIn(self, value):
- if isinstance(value, str):
- return value
- elif isinstance(value, bytes):
- try:
+ try:
+ if isinstance(value, str):
+ return value
+ elif isinstance(value, bytes):
return value.decode(self.encoding)
- except UnicodeDecodeError:
- raise error.PyAsn1Error(
- 'Can\'t decode string \'%s\' with \'%s\' codec' % (value, self.encoding)
- )
- elif isinstance(value, (tuple, list)):
- return self.prettyIn(bytes(value))
- else:
- try:
+ elif isinstance(value, (tuple, list)):
+ return self.prettyIn(bytes(value))
+ elif isinstance(value, univ.OctetString):
+ return value.asOctets().decode(self.encoding)
+ else:
return str(value)
- except (UnicodeDecodeError, ValueError):
- raise error.PyAsn1Error(
- 'Can\'t turn object \'%s\' into unicode' % (value,)
- )
+
+ except (UnicodeDecodeError, LookupError):
+ raise error.PyAsn1Error(
+ "Can't decode string '%s' with codec %s" % (value, self.encoding)
+ )
def asOctets(self, padding=True):
return bytes(self)
diff --git a/pyasn1/type/univ.py b/pyasn1/type/univ.py
index 98c6204..b9b8fa0 100644
--- a/pyasn1/type/univ.py
+++ b/pyasn1/type/univ.py
@@ -921,7 +921,7 @@ class OctetString(base.AbstractSimpleAsn1Item):
return value.encode(self.encoding)
except (LookupError, UnicodeEncodeError):
raise error.PyAsn1Error(
- 'Can\'t encode string \'%s\' with \'%s\' codec' % (value, self.encoding)
+ "Can't encode string '%s' with codec %s" % (value, self.encoding)
)
elif isinstance(value, (tuple, list)):
try:
@@ -942,7 +942,7 @@ class OctetString(base.AbstractSimpleAsn1Item):
except UnicodeDecodeError:
raise error.PyAsn1Error(
- 'Can\'t decode string \'%s\' with \'%s\' codec' % (self._value, self.encoding)
+ "Can't decode string '%s' with codec %s" % (self._value, self.encoding)
)
def asOctets(self):
diff --git a/tests/type/test_char.py b/tests/type/test_char.py
index 4b17127..82b612b 100644
--- a/tests/type/test_char.py
+++ b/tests/type/test_char.py
@@ -61,11 +61,12 @@ class AbstractStringTestCase:
def testInit(self):
assert self.asn1Type(self.pythonString) == self.pythonString
assert self.asn1Type(self.pythonString.encode(self.encoding)) == self.pythonString
+ assert self.asn1Type(univ.OctetString(self.pythonString.encode(self.encoding))) == self.pythonString
assert self.asn1Type(self.initializer, encoding=self.encoding) == self.pythonString
def testInitFromAsn1(self):
- assert self.asn1Type(self.asn1Type(self.pythonString)) == self.pythonString
- assert self.asn1Type(univ.OctetString(self.pythonString.encode(self.encoding), encoding=self.encoding)) == self.pythonString
+ assert self.asn1Type(self.asn1Type(self.pythonString)) == self.pythonString
+ assert self.asn1Type(univ.OctetString(self.pythonString.encode(self.encoding), encoding=self.encoding)) == self.pythonString
def testAsOctets(self):
assert self.asn1String.asOctets() == self.pythonString.encode(self.encoding), 'testAsOctets() fails'