From e0e25b8d99bdffcc26faf48982c7aa993f261379 Mon Sep 17 00:00:00 2001 From: elie Date: Sun, 21 Jun 2015 20:33:56 +0000 Subject: CER/DER Time types encoding restrictions relaxed --- pyasn1/codec/cer/encoder.py | 19 ++++++++++--------- test/codec/cer/test_encoder.py | 18 +++++++++--------- 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: -- cgit v1.2.1