summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelie <elie>2015-06-21 20:33:56 +0000
committerelie <elie>2015-06-21 20:33:56 +0000
commite0e25b8d99bdffcc26faf48982c7aa993f261379 (patch)
treea35cf813ad56458e205b9a9414884a763d7c7009
parentfe784bc6e56bcd75d613b01f9d2d912a32f2dce2 (diff)
downloadpyasn1-e0e25b8d99bdffcc26faf48982c7aa993f261379.tar.gz
CER/DER Time types encoding restrictions relaxed
-rw-r--r--pyasn1/codec/cer/encoder.py19
-rw-r--r--test/codec/cer/test_encoder.py18
2 files changed, 19 insertions, 18 deletions
diff --git a/pyasn1/codec/cer/encoder.py b/pyasn1/codec/cer/encoder.py
index 2dd928a..61ce8a1 100644
--- a/pyasn1/codec/cer/encoder.py
+++ b/pyasn1/codec/cer/encoder.py
@@ -34,32 +34,33 @@ class RealEncoder(encoder.RealEncoder):
class GeneralizedTimeEncoder(OctetStringEncoder):
zchar = str2octs('Z')
+ pluschar = str2octs('+')
+ minuschar = str2octs('-')
zero = str2octs('0')
def encodeValue(self, encodeFun, client, defMode, maxChunkSize):
octets = client.asOctets()
- if '+' in octets:
- raise error.PyAsn1Error('Must be UTC time: %r' % octets)
# This breaks too many existing data items
# if '.' not in octets:
# raise error.PyAsn1Error('Format must include fraction of second: %r' % octets)
- if octets and octets[-1] != self.zchar:
- raise error.PyAsn1Error('Missing timezone specifier: %r' % octets)
if len(octets) < 15:
raise error.PyAsn1Error('Bad UTC time length: %r' % octets)
- if octets[-2] == self.zero or \
- octets[-3] != self.zero and octets[-2] == self.zero:
- raise error.PyAsn1Error('Meningless zero in fraction of second: %r' % octets)
+ if self.pluschar in octets or self.minuschar in octets:
+ raise error.PyAsn1Error('Must be UTC time: %r' % octets)
+ if octets[-1] != self.zchar[0]:
+ raise error.PyAsn1Error('Missing timezone specifier: %r' % octets)
return encoder.OctetStringEncoder.encodeValue(
self, encodeFun, client, defMode, 1000
)
class UTCTimeEncoder(encoder.OctetStringEncoder):
zchar = str2octs('Z')
+ pluschar = str2octs('+')
+ minuschar = str2octs('-')
def encodeValue(self, encodeFun, client, defMode, maxChunkSize):
octets = client.asOctets()
- if '+' in octets:
+ if self.pluschar in octets or self.minuschar in octets:
raise error.PyAsn1Error('Must be UTC time: %r' % octets)
- if octets and octets[-1] != self.zchar:
+ if octets and octets[-1] != self.zchar[0]:
client = client.clone(octets + self.zchar)
if len(client) != 13:
raise error.PyAsn1Error('Bad UTC time length: %r' % client)
diff --git a/test/codec/cer/test_encoder.py b/test/codec/cer/test_encoder.py
index b64cc1b..4ce0ffd 100644
--- a/test/codec/cer/test_encoder.py
+++ b/test/codec/cer/test_encoder.py
@@ -105,15 +105,15 @@ class SetWithChoiceEncoderTestCase(unittest.TestCase):
assert encoder.encode(self.s) == ints2octs((49, 128, 1, 1, 255, 5, 0, 0, 0))
class GeneralizedTimeEncoderTestCase(unittest.TestCase):
- def testExtraZeroInSeconds(self):
- try:
- assert encoder.encode(
- useful.GeneralizedTime('20150501120112.10Z')
- )
- except PyAsn1Error:
- pass
- else:
- assert 0, 'Meaningless trailing zero in fraction part tolerated'
+# def testExtraZeroInSeconds(self):
+# try:
+# assert encoder.encode(
+# useful.GeneralizedTime('20150501120112.10Z')
+# )
+# except PyAsn1Error:
+# pass
+# else:
+# assert 0, 'Meaningless trailing zero in fraction part tolerated'
def testLocalTimezone(self):
try: