| # -*- coding: utf-8 -*- |
| # |
| # SelfTest/Util/test_asn.py: Self-test for the Crypto.Util.asn1 module |
| # |
| # =================================================================== |
| # The contents of this file are dedicated to the public domain. To |
| # the extent that dedication to the public domain is not available, |
| # everyone is granted a worldwide, perpetual, royalty-free, |
| # non-exclusive license to exercise all rights associated with the |
| # contents of this file for any purpose whatsoever. |
| # No rights are reserved. |
| # |
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS |
| # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
| # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
| # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| # SOFTWARE. |
| # =================================================================== |
| |
| """Self-tests for Crypto.Util.asn1""" |
| |
| __revision__ = "$Id$" |
| |
| import unittest |
| import sys |
| |
| from Crypto.Util.py3compat import * |
| from Crypto.Util.asn1 import DerObject, DerSetOf, newDerSetOf, DerInteger,\ |
| DerBitString, newDerBitString, newDerObjectId,\ |
| DerObjectId, DerNull, DerOctetString,\ |
| newDerOctetString, DerSequence, newDerSequence,\ |
| newDerInteger |
| if sys.version_info[0] == 2 and sys.version_info[1] == 1: |
| from Crypto.Util.py21compat import * |
| |
| class DerObjectTests(unittest.TestCase): |
| |
| def testObjInit1(self): |
| # Fail with invalid tag format (must be 1 byte) |
| self.assertRaises(ValueError, DerObject, b('\x00\x99')) |
| # Fail with invalid implicit tag (must be <0x1F) |
| self.assertRaises(ValueError, DerObject, 0x1F) |
| |
| # ------ |
| |
| def testObjEncode1(self): |
| # No payload |
| der = DerObject(b('\x02')) |
| self.assertEquals(der.encode(), b('\x02\x00')) |
| # Small payload (primitive) |
| der.payload = b('\x45') |
| self.assertEquals(der.encode(), b('\x02\x01\x45')) |
| # Invariant |
| self.assertEquals(der.encode(), b('\x02\x01\x45')) |
| # Initialize with numerical tag |
| der = DerObject(0x04) |
| der.payload = b('\x45') |
| self.assertEquals(der.encode(), b('\x04\x01\x45')) |
| # Initialize with constructed type |
| der = DerObject(b('\x10'), constructed=True) |
| self.assertEquals(der.encode(), b('\x30\x00')) |
| |
| def testObjEncode2(self): |
| # Initialize with payload |
| der = DerObject(0x03, b('\x12\x12')) |
| self.assertEquals(der.encode(), b('\x03\x02\x12\x12')) |
| |
| def testObjEncode3(self): |
| # Long payload |
| der = DerObject(b('\x10')) |
| der.payload = b("0")*128 |
| self.assertEquals(der.encode(), b('\x10\x81\x80' + "0"*128)) |
| |
| def testObjEncode4(self): |
| # Implicit tags (constructed) |
| der = DerObject(0x10, implicit=1, constructed=True) |
| der.payload = b('ppll') |
| self.assertEquals(der.encode(), b('\xa1\x04ppll')) |
| # Implicit tags (primitive) |
| der = DerObject(0x02, implicit=0x1E, constructed=False) |
| der.payload = b('ppll') |
| self.assertEquals(der.encode(), b('\x9E\x04ppll')) |
| |
| # ----- |
| |
| def testObjDecode1(self): |
| # Decode short payload |
| der = DerObject(0x02) |
| der.decode(b('\x02\x02\x01\x02')) |
| self.assertEquals(der.payload, b("\x01\x02")) |
| self.assertEquals(der._idOctet, 0x02) |
| |
| def testObjDecode2(self): |
| # Decode long payload |
| der = DerObject(0x02) |
| der.decode(b('\x02\x81\x80' + "1"*128)) |
| self.assertEquals(der.payload, b("1")*128) |
| self.assertEquals(der._idOctet, 0x02) |
| |
| def testObjDecode3(self): |
| # Decode payload with too much data gives error |
| der = DerObject(0x02) |
| self.assertRaises(ValueError, der.decode, b('\x02\x02\x01\x02\xFF')) |
| # Decode payload with too little data gives error |
| der = DerObject(0x02) |
| self.assertRaises(EOFError, der.decode, b('\x02\x02\x01')) |
| |
| def testObjDecode4(self): |
| # Decode implicit tag (primitive) |
| der = DerObject(0x02, constructed=False, implicit=0xF) |
| self.assertRaises(ValueError, der.decode, b('\x02\x02\x01\x02')) |
| der.decode(b('\x8F\x01\x00')) |
| self.assertEquals(der.payload, b('\x00')) |
| # Decode implicit tag (constructed) |
| der = DerObject(0x02, constructed=True, implicit=0xF) |
| self.assertRaises(ValueError, der.decode, b('\x02\x02\x01\x02')) |
| der.decode(b('\xAF\x01\x00')) |
| self.assertEquals(der.payload, b('\x00')) |
| |
| def testObjDecode5(self): |
| # Decode payload with unexpected tag gives error |
| der = DerObject(0x02) |
| self.assertRaises(ValueError, der.decode, b('\x03\x02\x01\x02')) |
| |
| def testObjDecode6(self): |
| # Arbitrary DER object |
| der = DerObject() |
| der.decode(b('\x65\x01\x88')) |
| self.assertEquals(der._idOctet, 0x65) |
| self.assertEquals(der.payload, b('\x88')) |
| |
| class DerIntegerTests(unittest.TestCase): |
| |
| def testInit1(self): |
| der = newDerInteger(1) |
| self.assertEquals(der.encode(), b('\x02\x01\x01')) |
| |
| def testEncode1(self): |
| # Single-byte integers |
| # Value 0 |
| der = DerInteger(0) |
| self.assertEquals(der.encode(), b('\x02\x01\x00')) |
| # Value 1 |
| der = DerInteger(1) |
| self.assertEquals(der.encode(), b('\x02\x01\x01')) |
| # Value 127 |
| der = DerInteger(127) |
| self.assertEquals(der.encode(), b('\x02\x01\x7F')) |
| |
| def testEncode2(self): |
| # Multi-byte integers |
| # Value 128 |
| der = DerInteger(128) |
| self.assertEquals(der.encode(), b('\x02\x02\x00\x80')) |
| # Value 0x180 |
| der = DerInteger(0x180L) |
| self.assertEquals(der.encode(), b('\x02\x02\x01\x80')) |
| # One very long integer |
| der = DerInteger(2L**2048) |
| self.assertEquals(der.encode(), |
| b('\x02\x82\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00')) |
| |
| def testEncode3(self): |
| # Negative integers |
| # Value -1 |
| der = DerInteger(-1) |
| self.assertEquals(der.encode(), b('\x02\x01\xFF')) |
| # Value -128 |
| der = DerInteger(-128) |
| self.assertEquals(der.encode(), b('\x02\x01\x80')) |
| # Value |
| der = DerInteger(-87873) |
| self.assertEquals(der.encode(), b('\x02\x03\xFE\xA8\xBF')) |
| |
| # ----- |
| |
| def testDecode1(self): |
| # Single-byte integer |
| der = DerInteger() |
| # Value 0 |
| der.decode(b('\x02\x01\x00')) |
| self.assertEquals(der.value, 0) |
| # Value 1 |
| der.decode(b('\x02\x01\x01')) |
| self.assertEquals(der.value, 1) |
| # Value 127 |
| der.decode(b('\x02\x01\x7F')) |
| self.assertEquals(der.value, 127) |
| |
| def testDecode2(self): |
| # Multi-byte integer |
| der = DerInteger() |
| # Value 0x180L |
| der.decode(b('\x02\x02\x01\x80')) |
| self.assertEquals(der.value,0x180L) |
| # One very long integer |
| der.decode( |
| b('\x02\x82\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00')) |
| self.assertEquals(der.value,2L**2048) |
| |
| def testDecode3(self): |
| # Negative integer |
| der = DerInteger() |
| # Value -1 |
| der.decode(b('\x02\x01\xFF')) |
| self.assertEquals(der.value, -1) |
| # Value -32768 |
| der.decode(b('\x02\x02\x80\x00')) |
| self.assertEquals(der.value, -32768) |
| |
| def testDecode5(self): |
| # We still accept BER integer format |
| der = DerInteger() |
| # Redundant leading zeroes |
| der.decode(b('\x02\x02\x00\x01')) |
| self.assertEquals(der.value, 1) |
| # Redundant leading 0xFF |
| der.decode(b('\x02\x02\xFF\xFF')) |
| self.assertEquals(der.value, -1) |
| # Empty payload |
| der.decode(b('\x02\x00')) |
| self.assertEquals(der.value, 0) |
| |
| def testErrDecode1(self): |
| # Wide length field |
| der = DerInteger() |
| self.assertRaises(ValueError, der.decode, b('\x02\x81\x01\x01')) |
| |
| class DerSequenceTests(unittest.TestCase): |
| |
| def testInit1(self): |
| der = newDerSequence(1, DerInteger(2), '0\x00') |
| self.assertEquals(der.encode(), b('0\x08\x02\x01\x01\x02\x01\x020\x00')) |
| |
| def testEncode1(self): |
| # Empty sequence |
| der = DerSequence() |
| self.assertEquals(der.encode(), b('0\x00')) |
| self.failIf(der.hasOnlyInts()) |
| # One single-byte integer (zero) |
| der.append(0) |
| self.assertEquals(der.encode(), b('0\x03\x02\x01\x00')) |
| self.assertEquals(der.hasInts(),1) |
| self.assertEquals(der.hasInts(False),1) |
| self.failUnless(der.hasOnlyInts()) |
| self.failUnless(der.hasOnlyInts(False)) |
| # Invariant |
| self.assertEquals(der.encode(), b('0\x03\x02\x01\x00')) |
| |
| def testEncode2(self): |
| # Indexing |
| der = DerSequence() |
| der.append(0) |
| der[0] = 1 |
| self.assertEquals(len(der),1) |
| self.assertEquals(der[0],1) |
| self.assertEquals(der[-1],1) |
| self.assertEquals(der.encode(), b('0\x03\x02\x01\x01')) |
| # |
| der[:] = [1] |
| self.assertEquals(len(der),1) |
| self.assertEquals(der[0],1) |
| self.assertEquals(der.encode(), b('0\x03\x02\x01\x01')) |
| |
| def testEncode3(self): |
| # One multi-byte integer (non-zero) |
| der = DerSequence() |
| der.append(0x180L) |
| self.assertEquals(der.encode(), b('0\x04\x02\x02\x01\x80')) |
| |
| def testEncode4(self): |
| # One very long integer |
| der = DerSequence() |
| der.append(2L**2048) |
| self.assertEquals(der.encode(), b('0\x82\x01\x05')+ |
| b('\x02\x82\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00')) |
| |
| def testEncode5(self): |
| der = DerSequence() |
| der += 1 |
| der += b('\x30\x00') |
| self.assertEquals(der.encode(), b('\x30\x05\x02\x01\x01\x30\x00')) |
| |
| def testEncode6(self): |
| # Two positive integers |
| der = DerSequence() |
| der.append(0x180L) |
| der.append(0xFFL) |
| self.assertEquals(der.encode(), b('0\x08\x02\x02\x01\x80\x02\x02\x00\xff')) |
| self.failUnless(der.hasOnlyInts()) |
| self.failUnless(der.hasOnlyInts(False)) |
| # Two mixed integers |
| der = DerSequence() |
| der.append(2) |
| der.append(-2) |
| self.assertEquals(der.encode(), b('0\x06\x02\x01\x02\x02\x01\xFE')) |
| self.assertEquals(der.hasInts(), 1) |
| self.assertEquals(der.hasInts(False), 2) |
| self.failIf(der.hasOnlyInts()) |
| self.failUnless(der.hasOnlyInts(False)) |
| # |
| der.append(0x01) |
| der[1:] = [9,8] |
| self.assertEquals(len(der),3) |
| self.assertEqual(der[1:],[9,8]) |
| self.assertEqual(der[1:-1],[9]) |
| self.assertEquals(der.encode(), b('0\x09\x02\x01\x02\x02\x01\x09\x02\x01\x08')) |
| |
| def testEncode7(self): |
| # One integer and another type (no matter what it is) |
| der = DerSequence() |
| der.append(0x180L) |
| der.append(b('\x00\x02\x00\x00')) |
| self.assertEquals(der.encode(), b('0\x08\x02\x02\x01\x80\x00\x02\x00\x00')) |
| self.failIf(der.hasOnlyInts()) |
| |
| #### |
| |
| def testDecode1(self): |
| # Empty sequence |
| der = DerSequence() |
| der.decode(b('0\x00')) |
| self.assertEquals(len(der),0) |
| # One single-byte integer (zero) |
| der.decode(b('0\x03\x02\x01\x00')) |
| self.assertEquals(len(der),1) |
| self.assertEquals(der[0],0) |
| # Invariant |
| der.decode(b('0\x03\x02\x01\x00')) |
| self.assertEquals(len(der),1) |
| self.assertEquals(der[0],0) |
| |
| def testDecode2(self): |
| # One single-byte integer (non-zero) |
| der = DerSequence() |
| der.decode(b('0\x03\x02\x01\x7f')) |
| self.assertEquals(len(der),1) |
| self.assertEquals(der[0],127) |
| |
| def testDecode4(self): |
| # One very long integer |
| der = DerSequence() |
| der.decode(b('0\x82\x01\x05')+ |
| b('\x02\x82\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ |
| b('\x00\x00\x00\x00\x00\x00\x00\x00\x00')) |
| self.assertEquals(len(der),1) |
| self.assertEquals(der[0],2L**2048) |
| |
| def testDecode6(self): |
| # Two integers |
| der = DerSequence() |
| der.decode(b('0\x08\x02\x02\x01\x80\x02\x02\x00\xff')) |
| self.assertEquals(len(der),2) |
| self.assertEquals(der[0],0x180L) |
| self.assertEquals(der[1],0xFFL) |
| |
| def testDecode7(self): |
| # One integer and 2 other types |
| der = DerSequence() |
| der.decode(b('0\x0A\x02\x02\x01\x80\x24\x02\xb6\x63\x12\x00')) |
| self.assertEquals(len(der),3) |
| self.assertEquals(der[0],0x180L) |
| self.assertEquals(der[1],b('\x24\x02\xb6\x63')) |
| self.assertEquals(der[2],b('\x12\x00')) |
| |
| def testDecode8(self): |
| # Only 2 other types |
| der = DerSequence() |
| der.decode(b('0\x06\x24\x02\xb6\x63\x12\x00')) |
| self.assertEquals(len(der),2) |
| self.assertEquals(der[0],b('\x24\x02\xb6\x63')) |
| self.assertEquals(der[1],b('\x12\x00')) |
| self.assertEquals(der.hasInts(), 0) |
| self.assertEquals(der.hasInts(False), 0) |
| self.failIf(der.hasOnlyInts()) |
| self.failIf(der.hasOnlyInts(False)) |
| |
| def testErrDecode1(self): |
| # Not a sequence |
| der = DerSequence() |
| self.assertRaises(EOFError, der.decode, b('')) |
| self.assertRaises(ValueError, der.decode, b('\x00')) |
| self.assertRaises(EOFError, der.decode, b('\x30')) |
| |
| def testErrDecode2(self): |
| der = DerSequence() |
| # Too much data |
| self.assertRaises(ValueError, der.decode, b('\x30\x00\x00')) |
| |
| def testErrDecode3(self): |
| # Wrong length format |
| der = DerSequence() |
| # Missing length in sub-item |
| self.assertRaises(EOFError, der.decode, b('\x30\x04\x02\x01\x01\x00')) |
| # Valid BER, but invalid DER length |
| self.assertRaises(ValueError, der.decode, b('\x30\x81\x03\x02\x01\x01')) |
| self.assertRaises(ValueError, der.decode, b('\x30\x04\x02\x81\x01\x01')) |
| |
| class DerOctetStringTests(unittest.TestCase): |
| |
| def testInit1(self): |
| der = newDerOctetString(b('\xFF')) |
| self.assertEquals(der.encode(), b('\x04\x01\xFF')) |
| |
| def testEncode1(self): |
| # Empty sequence |
| der = DerOctetString() |
| self.assertEquals(der.encode(), b('\x04\x00')) |
| # Small payload |
| der.payload = b('\x01\x02') |
| self.assertEquals(der.encode(), b('\x04\x02\x01\x02')) |
| |
| #### |
| |
| def testDecode1(self): |
| # Empty sequence |
| der = DerOctetString() |
| der.decode(b('\x04\x00')) |
| self.assertEquals(der.payload, b('')) |
| # Small payload |
| der.decode(b('\x04\x02\x01\x02')) |
| self.assertEquals(der.payload, b('\x01\x02')) |
| |
| def testErrDecode1(self): |
| # No leftovers allowed |
| der = DerOctetString() |
| self.assertRaises(ValueError, der.decode, b('\x04\x01\x01\xff')) |
| |
| class DerNullTests(unittest.TestCase): |
| |
| def testEncode1(self): |
| der = DerNull() |
| self.assertEquals(der.encode(), b('\x05\x00')) |
| |
| #### |
| |
| def testDecode1(self): |
| # Empty sequence |
| der = DerNull() |
| der.decode(b('\x05\x00')) |
| |
| class DerObjectIdTests(unittest.TestCase): |
| |
| def testInit1(self): |
| der = newDerObjectId("1.1") |
| self.assertEquals(der.encode(), b('\x06\x01)')) |
| |
| def testEncode1(self): |
| der = DerObjectId('1.2.840.113549.1.1.1') |
| self.assertEquals(der.encode(), b('\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01')) |
| # |
| der = DerObjectId() |
| der.value = '1.2.840.113549.1.1.1' |
| self.assertEquals(der.encode(), b('\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01')) |
| |
| #### |
| |
| def testDecode1(self): |
| # Empty sequence |
| der = DerObjectId() |
| der.decode(b('\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01')) |
| self.assertEquals(der.value, '1.2.840.113549.1.1.1') |
| |
| class DerBitStringTests(unittest.TestCase): |
| |
| def testInit1(self): |
| der = newDerBitString(b("\xFF")) |
| self.assertEquals(der.encode(), b('\x03\x02\x00\xFF')) |
| |
| def testEncode1(self): |
| # Empty sequence |
| der = DerBitString() |
| self.assertEquals(der.encode(), b('\x03\x01\x00')) |
| # Small payload |
| der = DerBitString(b('\x01\x02')) |
| self.assertEquals(der.encode(), b('\x03\x03\x00\x01\x02')) |
| # Small payload |
| der = DerBitString() |
| der.value = b('\x01\x02') |
| self.assertEquals(der.encode(), b('\x03\x03\x00\x01\x02')) |
| |
| #### |
| |
| def testDecode1(self): |
| # Empty sequence |
| der = DerBitString() |
| der.decode(b('\x03\x00')) |
| self.assertEquals(der.value, b('')) |
| # Small payload |
| der.decode(b('\x03\x03\x00\x01\x02')) |
| self.assertEquals(der.value, b('\x01\x02')) |
| |
| class DerSetOfTests(unittest.TestCase): |
| |
| def testInit1(self): |
| der = newDerSetOf(DerInteger(1), DerInteger(2)) |
| self.assertEquals(der.encode(), b('1\x06\x02\x01\x01\x02\x01\x02')) |
| |
| def testEncode1(self): |
| # Empty set |
| der = DerSetOf() |
| self.assertEquals(der.encode(), b('1\x00')) |
| # One single-byte integer (zero) |
| der.add(0) |
| self.assertEquals(der.encode(), b('1\x03\x02\x01\x00')) |
| # Invariant |
| self.assertEquals(der.encode(), b('1\x03\x02\x01\x00')) |
| |
| def testEncode2(self): |
| # Two integers |
| der = DerSetOf() |
| der.add(0x180L) |
| der.add(0xFFL) |
| self.assertEquals(der.encode(), b('1\x08\x02\x02\x00\xff\x02\x02\x01\x80')) |
| # Initialize with integers |
| der = DerSetOf([0x180L, 0xFFL]) |
| self.assertEquals(der.encode(), b('1\x08\x02\x02\x00\xff\x02\x02\x01\x80')) |
| |
| def testEncode3(self): |
| # One integer and another type (no matter what it is) |
| der = DerSetOf() |
| der.add(0x180L) |
| self.assertRaises(ValueError, der.add, b('\x00\x02\x00\x00')) |
| |
| def testEncode4(self): |
| # Only non integers |
| der = DerSetOf() |
| der.add(b('\x01\x00')) |
| der.add(b('\x01\x01\x01')) |
| self.assertEquals(der.encode(), b('1\x05\x01\x00\x01\x01\x01')) |
| |
| #### |
| |
| def testDecode1(self): |
| # Empty sequence |
| der = DerSetOf() |
| der.decode(b('1\x00')) |
| self.assertEquals(len(der),0) |
| # One single-byte integer (zero) |
| der.decode(b('1\x03\x02\x01\x00')) |
| self.assertEquals(len(der),1) |
| self.assertEquals(list(der),[0]) |
| |
| def testDecode2(self): |
| # Two integers |
| der = DerSetOf() |
| der.decode(b('1\x08\x02\x02\x01\x80\x02\x02\x00\xff')) |
| self.assertEquals(len(der),2) |
| l = list(der) |
| self.failUnless(0x180 in l) |
| self.failUnless(0xFF in l) |
| |
| def testDecode3(self): |
| # One integer and 2 other types |
| der = DerSetOf() |
| #import pdb; pdb.set_trace() |
| self.assertRaises(ValueError, der.decode, |
| b('0\x0A\x02\x02\x01\x80\x24\x02\xb6\x63\x12\x00')) |
| |
| def testErrDecode1(self): |
| # No leftovers allowed |
| der = DerSetOf() |
| self.assertRaises(ValueError, der.decode, |
| b('1\x08\x02\x02\x01\x80\x02\x02\x00\xff\xAA')) |
| |
| def get_tests(config={}): |
| from Crypto.SelfTest.st_common import list_test_cases |
| listTests = [] |
| listTests += list_test_cases(DerObjectTests) |
| listTests += list_test_cases(DerIntegerTests) |
| listTests += list_test_cases(DerSequenceTests) |
| listTests += list_test_cases(DerOctetStringTests) |
| listTests += list_test_cases(DerNullTests) |
| listTests += list_test_cases(DerObjectIdTests) |
| listTests += list_test_cases(DerBitStringTests) |
| listTests += list_test_cases(DerSetOfTests) |
| return listTests |
| |
| if __name__ == '__main__': |
| suite = lambda: unittest.TestSuite(get_tests()) |
| unittest.main(defaultTest='suite') |
| |
| # vim:set ts=4 sw=4 sts=4 expandtab: |