|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"""Self-tests for Crypto.Util.asn1""" |
|
|
|
|
|
import unittest |
|
|
|
|
|
from Crypto.Util.py3compat import * |
|
|
from Crypto.Util.asn1 import (DerObject, DerSetOf, DerInteger, |
|
|
DerBitString, |
|
|
DerObjectId, DerNull, DerOctetString, |
|
|
DerSequence, DerBoolean) |
|
|
|
|
|
class DerObjectTests(unittest.TestCase): |
|
|
|
|
|
def testObjInit1(self): |
|
|
|
|
|
self.assertRaises(ValueError, DerObject, b('\x00\x99')) |
|
|
|
|
|
self.assertRaises(ValueError, DerObject, 0x1F) |
|
|
|
|
|
|
|
|
|
|
|
def testObjEncode1(self): |
|
|
|
|
|
der = DerObject(b('\x02')) |
|
|
self.assertEqual(der.encode(), b('\x02\x00')) |
|
|
|
|
|
der.payload = b('\x45') |
|
|
self.assertEqual(der.encode(), b('\x02\x01\x45')) |
|
|
|
|
|
self.assertEqual(der.encode(), b('\x02\x01\x45')) |
|
|
|
|
|
der = DerObject(0x04) |
|
|
der.payload = b('\x45') |
|
|
self.assertEqual(der.encode(), b('\x04\x01\x45')) |
|
|
|
|
|
der = DerObject(b('\x10'), constructed=True) |
|
|
self.assertEqual(der.encode(), b('\x30\x00')) |
|
|
|
|
|
def testObjEncode2(self): |
|
|
|
|
|
der = DerObject(0x03, b('\x12\x12')) |
|
|
self.assertEqual(der.encode(), b('\x03\x02\x12\x12')) |
|
|
|
|
|
def testObjEncode3(self): |
|
|
|
|
|
der = DerObject(b('\x10')) |
|
|
der.payload = b("0")*128 |
|
|
self.assertEqual(der.encode(), b('\x10\x81\x80' + "0"*128)) |
|
|
|
|
|
def testObjEncode4(self): |
|
|
|
|
|
der = DerObject(0x10, implicit=1, constructed=True) |
|
|
der.payload = b('ppll') |
|
|
self.assertEqual(der.encode(), b('\xa1\x04ppll')) |
|
|
|
|
|
der = DerObject(0x02, implicit=0x1E, constructed=False) |
|
|
der.payload = b('ppll') |
|
|
self.assertEqual(der.encode(), b('\x9E\x04ppll')) |
|
|
|
|
|
def testObjEncode5(self): |
|
|
|
|
|
der = DerObject(0x10, explicit=5) |
|
|
der.payload = b("xxll") |
|
|
self.assertEqual(der.encode(), b("\xa5\x06\x10\x04xxll")) |
|
|
|
|
|
|
|
|
|
|
|
def testObjDecode1(self): |
|
|
|
|
|
der = DerObject(0x02) |
|
|
der.decode(b('\x02\x02\x01\x02')) |
|
|
self.assertEqual(der.payload, b("\x01\x02")) |
|
|
self.assertEqual(der._tag_octet, 0x02) |
|
|
|
|
|
def testObjDecode2(self): |
|
|
|
|
|
der = DerObject(0x02) |
|
|
der.decode(b('\x02\x81\x80' + "1"*128)) |
|
|
self.assertEqual(der.payload, b("1")*128) |
|
|
self.assertEqual(der._tag_octet, 0x02) |
|
|
|
|
|
def testObjDecode3(self): |
|
|
|
|
|
der = DerObject(0x02) |
|
|
self.assertRaises(ValueError, der.decode, b('\x02\x02\x01\x02\xFF')) |
|
|
|
|
|
der = DerObject(0x02) |
|
|
self.assertRaises(ValueError, der.decode, b('\x02\x02\x01')) |
|
|
|
|
|
def testObjDecode4(self): |
|
|
|
|
|
der = DerObject(0x02, constructed=False, implicit=0xF) |
|
|
self.assertRaises(ValueError, der.decode, b('\x02\x02\x01\x02')) |
|
|
der.decode(b('\x8F\x01\x00')) |
|
|
self.assertEqual(der.payload, b('\x00')) |
|
|
|
|
|
der = DerObject(0x02, constructed=True, implicit=0xF) |
|
|
self.assertRaises(ValueError, der.decode, b('\x02\x02\x01\x02')) |
|
|
der.decode(b('\xAF\x01\x00')) |
|
|
self.assertEqual(der.payload, b('\x00')) |
|
|
|
|
|
def testObjDecode5(self): |
|
|
|
|
|
der = DerObject(0x02) |
|
|
self.assertRaises(ValueError, der.decode, b('\x03\x02\x01\x02')) |
|
|
|
|
|
def testObjDecode6(self): |
|
|
|
|
|
der = DerObject() |
|
|
der.decode(b('\x65\x01\x88')) |
|
|
self.assertEqual(der._tag_octet, 0x65) |
|
|
self.assertEqual(der.payload, b('\x88')) |
|
|
|
|
|
def testObjDecode7(self): |
|
|
|
|
|
der = DerObject(0x10, explicit=5) |
|
|
der.decode(b("\xa5\x06\x10\x04xxll")) |
|
|
self.assertEqual(der._inner_tag_octet, 0x10) |
|
|
self.assertEqual(der.payload, b('xxll')) |
|
|
|
|
|
|
|
|
der = DerObject(0x10, explicit=0) |
|
|
der.decode(b("\xa0\x06\x10\x04xxll")) |
|
|
self.assertEqual(der._inner_tag_octet, 0x10) |
|
|
self.assertEqual(der.payload, b('xxll')) |
|
|
|
|
|
def testObjDecode8(self): |
|
|
|
|
|
der = DerObject(0x02) |
|
|
self.assertEqual(der, der.decode(b('\x02\x02\x01\x02'))) |
|
|
|
|
|
class DerIntegerTests(unittest.TestCase): |
|
|
|
|
|
def testInit1(self): |
|
|
der = DerInteger(1) |
|
|
self.assertEqual(der.encode(), b('\x02\x01\x01')) |
|
|
|
|
|
def testEncode1(self): |
|
|
|
|
|
|
|
|
der = DerInteger(0) |
|
|
self.assertEqual(der.encode(), b('\x02\x01\x00')) |
|
|
|
|
|
der = DerInteger(1) |
|
|
self.assertEqual(der.encode(), b('\x02\x01\x01')) |
|
|
|
|
|
der = DerInteger(127) |
|
|
self.assertEqual(der.encode(), b('\x02\x01\x7F')) |
|
|
|
|
|
def testEncode2(self): |
|
|
|
|
|
|
|
|
der = DerInteger(128) |
|
|
self.assertEqual(der.encode(), b('\x02\x02\x00\x80')) |
|
|
|
|
|
der = DerInteger(0x180) |
|
|
self.assertEqual(der.encode(), b('\x02\x02\x01\x80')) |
|
|
|
|
|
der = DerInteger(2**2048) |
|
|
self.assertEqual(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): |
|
|
|
|
|
|
|
|
der = DerInteger(-1) |
|
|
self.assertEqual(der.encode(), b('\x02\x01\xFF')) |
|
|
|
|
|
der = DerInteger(-128) |
|
|
self.assertEqual(der.encode(), b('\x02\x01\x80')) |
|
|
|
|
|
der = DerInteger(-87873) |
|
|
self.assertEqual(der.encode(), b('\x02\x03\xFE\xA8\xBF')) |
|
|
|
|
|
def testEncode4(self): |
|
|
|
|
|
number = DerInteger(0x34, explicit=3) |
|
|
self.assertEqual(number.encode(), b('\xa3\x03\x02\x01\x34')) |
|
|
|
|
|
|
|
|
|
|
|
def testDecode1(self): |
|
|
|
|
|
der = DerInteger() |
|
|
|
|
|
der.decode(b('\x02\x01\x00')) |
|
|
self.assertEqual(der.value, 0) |
|
|
|
|
|
der.decode(b('\x02\x01\x01')) |
|
|
self.assertEqual(der.value, 1) |
|
|
|
|
|
der.decode(b('\x02\x01\x7F')) |
|
|
self.assertEqual(der.value, 127) |
|
|
|
|
|
def testDecode2(self): |
|
|
|
|
|
der = DerInteger() |
|
|
|
|
|
der.decode(b('\x02\x02\x01\x80')) |
|
|
self.assertEqual(der.value,0x180) |
|
|
|
|
|
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.assertEqual(der.value,2**2048) |
|
|
|
|
|
def testDecode3(self): |
|
|
|
|
|
der = DerInteger() |
|
|
|
|
|
der.decode(b('\x02\x01\xFF')) |
|
|
self.assertEqual(der.value, -1) |
|
|
|
|
|
der.decode(b('\x02\x02\x80\x00')) |
|
|
self.assertEqual(der.value, -32768) |
|
|
|
|
|
def testDecode5(self): |
|
|
|
|
|
der = DerInteger() |
|
|
|
|
|
der.decode(b('\x02\x02\x00\x01')) |
|
|
self.assertEqual(der.value, 1) |
|
|
|
|
|
der.decode(b('\x02\x02\xFF\xFF')) |
|
|
self.assertEqual(der.value, -1) |
|
|
|
|
|
der.decode(b('\x02\x00')) |
|
|
self.assertEqual(der.value, 0) |
|
|
|
|
|
def testDecode6(self): |
|
|
|
|
|
number = DerInteger(explicit=3) |
|
|
number.decode(b('\xa3\x03\x02\x01\x34')) |
|
|
self.assertEqual(number.value, 0x34) |
|
|
|
|
|
def testDecode7(self): |
|
|
|
|
|
der = DerInteger() |
|
|
self.assertEqual(der, der.decode(b('\x02\x01\x7F'))) |
|
|
|
|
|
|
|
|
|
|
|
def testStrict1(self): |
|
|
number = DerInteger() |
|
|
|
|
|
number.decode(b'\x02\x02\x00\x01') |
|
|
number.decode(b'\x02\x02\x00\x7F') |
|
|
self.assertRaises(ValueError, number.decode, b'\x02\x02\x00\x01', strict=True) |
|
|
self.assertRaises(ValueError, number.decode, b'\x02\x02\x00\x7F', strict=True) |
|
|
|
|
|
|
|
|
|
|
|
def testErrDecode1(self): |
|
|
|
|
|
der = DerInteger() |
|
|
self.assertRaises(ValueError, der.decode, b('\x02\x81\x01\x01')) |
|
|
|
|
|
|
|
|
class DerSequenceTests(unittest.TestCase): |
|
|
|
|
|
def testInit1(self): |
|
|
der = DerSequence([1, DerInteger(2), b('0\x00')]) |
|
|
self.assertEqual(der.encode(), b('0\x08\x02\x01\x01\x02\x01\x020\x00')) |
|
|
|
|
|
def testEncode1(self): |
|
|
|
|
|
der = DerSequence() |
|
|
self.assertEqual(der.encode(), b('0\x00')) |
|
|
self.assertFalse(der.hasOnlyInts()) |
|
|
|
|
|
der.append(0) |
|
|
self.assertEqual(der.encode(), b('0\x03\x02\x01\x00')) |
|
|
self.assertEqual(der.hasInts(),1) |
|
|
self.assertEqual(der.hasInts(False),1) |
|
|
self.assertTrue(der.hasOnlyInts()) |
|
|
self.assertTrue(der.hasOnlyInts(False)) |
|
|
|
|
|
self.assertEqual(der.encode(), b('0\x03\x02\x01\x00')) |
|
|
|
|
|
def testEncode2(self): |
|
|
|
|
|
der = DerSequence() |
|
|
der.append(0) |
|
|
der[0] = 1 |
|
|
self.assertEqual(len(der),1) |
|
|
self.assertEqual(der[0],1) |
|
|
self.assertEqual(der[-1],1) |
|
|
self.assertEqual(der.encode(), b('0\x03\x02\x01\x01')) |
|
|
|
|
|
der[:] = [1] |
|
|
self.assertEqual(len(der),1) |
|
|
self.assertEqual(der[0],1) |
|
|
self.assertEqual(der.encode(), b('0\x03\x02\x01\x01')) |
|
|
|
|
|
def testEncode3(self): |
|
|
|
|
|
der = DerSequence() |
|
|
der.append(0x180) |
|
|
self.assertEqual(der.encode(), b('0\x04\x02\x02\x01\x80')) |
|
|
|
|
|
def testEncode4(self): |
|
|
|
|
|
der = DerSequence() |
|
|
der.append(2**2048) |
|
|
self.assertEqual(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.assertEqual(der.encode(), b('\x30\x05\x02\x01\x01\x30\x00')) |
|
|
|
|
|
def testEncode6(self): |
|
|
|
|
|
der = DerSequence() |
|
|
der.append(0x180) |
|
|
der.append(0xFF) |
|
|
self.assertEqual(der.encode(), b('0\x08\x02\x02\x01\x80\x02\x02\x00\xff')) |
|
|
self.assertTrue(der.hasOnlyInts()) |
|
|
self.assertTrue(der.hasOnlyInts(False)) |
|
|
|
|
|
der = DerSequence() |
|
|
der.append(2) |
|
|
der.append(-2) |
|
|
self.assertEqual(der.encode(), b('0\x06\x02\x01\x02\x02\x01\xFE')) |
|
|
self.assertEqual(der.hasInts(), 1) |
|
|
self.assertEqual(der.hasInts(False), 2) |
|
|
self.assertFalse(der.hasOnlyInts()) |
|
|
self.assertTrue(der.hasOnlyInts(False)) |
|
|
|
|
|
der.append(0x01) |
|
|
der[1:] = [9,8] |
|
|
self.assertEqual(len(der),3) |
|
|
self.assertEqual(der[1:],[9,8]) |
|
|
self.assertEqual(der[1:-1],[9]) |
|
|
self.assertEqual(der.encode(), b('0\x09\x02\x01\x02\x02\x01\x09\x02\x01\x08')) |
|
|
|
|
|
def testEncode7(self): |
|
|
|
|
|
der = DerSequence() |
|
|
der.append(0x180) |
|
|
der.append(b('0\x03\x02\x01\x05')) |
|
|
self.assertEqual(der.encode(), b('0\x09\x02\x02\x01\x800\x03\x02\x01\x05')) |
|
|
self.assertFalse(der.hasOnlyInts()) |
|
|
|
|
|
def testEncode8(self): |
|
|
|
|
|
der = DerSequence() |
|
|
der.append(0x180) |
|
|
der.append(DerSequence([5])) |
|
|
self.assertEqual(der.encode(), b('0\x09\x02\x02\x01\x800\x03\x02\x01\x05')) |
|
|
self.assertFalse(der.hasOnlyInts()) |
|
|
|
|
|
|
|
|
|
|
|
def testDecode1(self): |
|
|
|
|
|
der = DerSequence() |
|
|
der.decode(b('0\x00')) |
|
|
self.assertEqual(len(der),0) |
|
|
|
|
|
der.decode(b('0\x03\x02\x01\x00')) |
|
|
self.assertEqual(len(der),1) |
|
|
self.assertEqual(der[0],0) |
|
|
|
|
|
der.decode(b('0\x03\x02\x01\x00')) |
|
|
self.assertEqual(len(der),1) |
|
|
self.assertEqual(der[0],0) |
|
|
|
|
|
def testDecode2(self): |
|
|
|
|
|
der = DerSequence() |
|
|
der.decode(b('0\x03\x02\x01\x7f')) |
|
|
self.assertEqual(len(der),1) |
|
|
self.assertEqual(der[0],127) |
|
|
|
|
|
def testDecode4(self): |
|
|
|
|
|
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.assertEqual(len(der),1) |
|
|
self.assertEqual(der[0],2**2048) |
|
|
|
|
|
def testDecode6(self): |
|
|
|
|
|
der = DerSequence() |
|
|
der.decode(b('0\x08\x02\x02\x01\x80\x02\x02\x00\xff')) |
|
|
self.assertEqual(len(der),2) |
|
|
self.assertEqual(der[0],0x180) |
|
|
self.assertEqual(der[1],0xFF) |
|
|
|
|
|
def testDecode7(self): |
|
|
|
|
|
der = DerSequence() |
|
|
der.decode(b('0\x0A\x02\x02\x01\x80\x24\x02\xb6\x63\x12\x00')) |
|
|
self.assertEqual(len(der),3) |
|
|
self.assertEqual(der[0],0x180) |
|
|
self.assertEqual(der[1],b('\x24\x02\xb6\x63')) |
|
|
self.assertEqual(der[2],b('\x12\x00')) |
|
|
|
|
|
def testDecode8(self): |
|
|
|
|
|
der = DerSequence() |
|
|
der.decode(b('0\x06\x24\x02\xb6\x63\x12\x00')) |
|
|
self.assertEqual(len(der),2) |
|
|
self.assertEqual(der[0],b('\x24\x02\xb6\x63')) |
|
|
self.assertEqual(der[1],b('\x12\x00')) |
|
|
self.assertEqual(der.hasInts(), 0) |
|
|
self.assertEqual(der.hasInts(False), 0) |
|
|
self.assertFalse(der.hasOnlyInts()) |
|
|
self.assertFalse(der.hasOnlyInts(False)) |
|
|
|
|
|
def testDecode9(self): |
|
|
|
|
|
der = DerSequence() |
|
|
self.assertEqual(der, der.decode(b('0\x06\x24\x02\xb6\x63\x12\x00'))) |
|
|
|
|
|
|
|
|
|
|
|
def testErrDecode1(self): |
|
|
|
|
|
der = DerSequence() |
|
|
self.assertRaises(ValueError, der.decode, b('')) |
|
|
self.assertRaises(ValueError, der.decode, b('\x00')) |
|
|
self.assertRaises(ValueError, der.decode, b('\x30')) |
|
|
|
|
|
def testErrDecode2(self): |
|
|
der = DerSequence() |
|
|
|
|
|
self.assertRaises(ValueError, der.decode, b('\x30\x00\x00')) |
|
|
|
|
|
def testErrDecode3(self): |
|
|
|
|
|
der = DerSequence() |
|
|
|
|
|
self.assertRaises(ValueError, der.decode, b('\x30\x04\x02\x01\x01\x00')) |
|
|
|
|
|
self.assertRaises(ValueError, der.decode, b('\x30\x81\x03\x02\x01\x01')) |
|
|
self.assertRaises(ValueError, der.decode, b('\x30\x04\x02\x81\x01\x01')) |
|
|
|
|
|
def test_expected_nr_elements(self): |
|
|
der_bin = DerSequence([1, 2, 3]).encode() |
|
|
|
|
|
DerSequence().decode(der_bin, nr_elements=3) |
|
|
DerSequence().decode(der_bin, nr_elements=(2,3)) |
|
|
self.assertRaises(ValueError, DerSequence().decode, der_bin, nr_elements=1) |
|
|
self.assertRaises(ValueError, DerSequence().decode, der_bin, nr_elements=(4,5)) |
|
|
|
|
|
def test_expected_only_integers(self): |
|
|
|
|
|
der_bin1 = DerSequence([1, 2, 3]).encode() |
|
|
der_bin2 = DerSequence([1, 2, DerSequence([3, 4])]).encode() |
|
|
|
|
|
DerSequence().decode(der_bin1, only_ints_expected=True) |
|
|
DerSequence().decode(der_bin1, only_ints_expected=False) |
|
|
DerSequence().decode(der_bin2, only_ints_expected=False) |
|
|
self.assertRaises(ValueError, DerSequence().decode, der_bin2, only_ints_expected=True) |
|
|
|
|
|
|
|
|
class DerOctetStringTests(unittest.TestCase): |
|
|
|
|
|
def testInit1(self): |
|
|
der = DerOctetString(b('\xFF')) |
|
|
self.assertEqual(der.encode(), b('\x04\x01\xFF')) |
|
|
|
|
|
def testEncode1(self): |
|
|
|
|
|
der = DerOctetString() |
|
|
self.assertEqual(der.encode(), b('\x04\x00')) |
|
|
|
|
|
der.payload = b('\x01\x02') |
|
|
self.assertEqual(der.encode(), b('\x04\x02\x01\x02')) |
|
|
|
|
|
|
|
|
|
|
|
def testDecode1(self): |
|
|
|
|
|
der = DerOctetString() |
|
|
der.decode(b('\x04\x00')) |
|
|
self.assertEqual(der.payload, b('')) |
|
|
|
|
|
der.decode(b('\x04\x02\x01\x02')) |
|
|
self.assertEqual(der.payload, b('\x01\x02')) |
|
|
|
|
|
def testDecode2(self): |
|
|
|
|
|
der = DerOctetString() |
|
|
self.assertEqual(der, der.decode(b('\x04\x00'))) |
|
|
|
|
|
def testErrDecode1(self): |
|
|
|
|
|
der = DerOctetString() |
|
|
self.assertRaises(ValueError, der.decode, b('\x04\x01\x01\xff')) |
|
|
|
|
|
class DerNullTests(unittest.TestCase): |
|
|
|
|
|
def testEncode1(self): |
|
|
der = DerNull() |
|
|
self.assertEqual(der.encode(), b('\x05\x00')) |
|
|
|
|
|
|
|
|
|
|
|
def testDecode1(self): |
|
|
|
|
|
der = DerNull() |
|
|
self.assertEqual(der, der.decode(b('\x05\x00'))) |
|
|
|
|
|
class DerObjectIdTests(unittest.TestCase): |
|
|
|
|
|
def testInit1(self): |
|
|
der = DerObjectId("1.1") |
|
|
self.assertEqual(der.encode(), b'\x06\x01)') |
|
|
|
|
|
def testEncode1(self): |
|
|
der = DerObjectId('1.2.840.113549.1.1.1') |
|
|
self.assertEqual(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.assertEqual(der.encode(), b'\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01') |
|
|
|
|
|
der = DerObjectId('2.999.1234') |
|
|
self.assertEqual(der.encode(), b'\x06\x04\x88\x37\x89\x52') |
|
|
|
|
|
def testEncode2(self): |
|
|
der = DerObjectId('3.4') |
|
|
self.assertRaises(ValueError, der.encode) |
|
|
|
|
|
der = DerObjectId('1.40') |
|
|
self.assertRaises(ValueError, der.encode) |
|
|
|
|
|
|
|
|
|
|
|
def testDecode1(self): |
|
|
|
|
|
der = DerObjectId() |
|
|
der.decode(b'\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01') |
|
|
self.assertEqual(der.value, '1.2.840.113549.1.1.1') |
|
|
|
|
|
def testDecode2(self): |
|
|
|
|
|
der = DerObjectId() |
|
|
self.assertEqual(der, |
|
|
der.decode(b'\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01')) |
|
|
|
|
|
def testDecode3(self): |
|
|
der = DerObjectId() |
|
|
der.decode(b'\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x00\x01') |
|
|
self.assertEqual(der.value, '1.2.840.113549.1.0.1') |
|
|
|
|
|
def testDecode4(self): |
|
|
der = DerObjectId() |
|
|
der.decode(b'\x06\x04\x88\x37\x89\x52') |
|
|
self.assertEqual(der.value, '2.999.1234') |
|
|
|
|
|
|
|
|
class DerBitStringTests(unittest.TestCase): |
|
|
|
|
|
def testInit1(self): |
|
|
der = DerBitString(b("\xFF")) |
|
|
self.assertEqual(der.encode(), b('\x03\x02\x00\xFF')) |
|
|
|
|
|
def testInit2(self): |
|
|
der = DerBitString(DerInteger(1)) |
|
|
self.assertEqual(der.encode(), b('\x03\x04\x00\x02\x01\x01')) |
|
|
|
|
|
def testEncode1(self): |
|
|
|
|
|
der = DerBitString() |
|
|
self.assertEqual(der.encode(), b('\x03\x01\x00')) |
|
|
|
|
|
der = DerBitString(b('\x01\x02')) |
|
|
self.assertEqual(der.encode(), b('\x03\x03\x00\x01\x02')) |
|
|
|
|
|
der = DerBitString() |
|
|
der.value = b('\x01\x02') |
|
|
self.assertEqual(der.encode(), b('\x03\x03\x00\x01\x02')) |
|
|
|
|
|
|
|
|
|
|
|
def testDecode1(self): |
|
|
|
|
|
der = DerBitString() |
|
|
der.decode(b('\x03\x00')) |
|
|
self.assertEqual(der.value, b('')) |
|
|
|
|
|
der.decode(b('\x03\x03\x00\x01\x02')) |
|
|
self.assertEqual(der.value, b('\x01\x02')) |
|
|
|
|
|
def testDecode2(self): |
|
|
|
|
|
der = DerBitString() |
|
|
self.assertEqual(der, der.decode(b('\x03\x00'))) |
|
|
|
|
|
|
|
|
class DerSetOfTests(unittest.TestCase): |
|
|
|
|
|
def testInit1(self): |
|
|
der = DerSetOf([DerInteger(1), DerInteger(2)]) |
|
|
self.assertEqual(der.encode(), b('1\x06\x02\x01\x01\x02\x01\x02')) |
|
|
|
|
|
def testEncode1(self): |
|
|
|
|
|
der = DerSetOf() |
|
|
self.assertEqual(der.encode(), b('1\x00')) |
|
|
|
|
|
der.add(0) |
|
|
self.assertEqual(der.encode(), b('1\x03\x02\x01\x00')) |
|
|
|
|
|
self.assertEqual(der.encode(), b('1\x03\x02\x01\x00')) |
|
|
|
|
|
def testEncode2(self): |
|
|
|
|
|
der = DerSetOf() |
|
|
der.add(0x180) |
|
|
der.add(0xFF) |
|
|
self.assertEqual(der.encode(), b('1\x08\x02\x02\x00\xff\x02\x02\x01\x80')) |
|
|
|
|
|
der = DerSetOf([0x180, 0xFF]) |
|
|
self.assertEqual(der.encode(), b('1\x08\x02\x02\x00\xff\x02\x02\x01\x80')) |
|
|
|
|
|
def testEncode3(self): |
|
|
|
|
|
der = DerSetOf() |
|
|
der.add(0x180) |
|
|
self.assertRaises(ValueError, der.add, b('\x00\x02\x00\x00')) |
|
|
|
|
|
def testEncode4(self): |
|
|
|
|
|
der = DerSetOf() |
|
|
der.add(b('\x01\x00')) |
|
|
der.add(b('\x01\x01\x01')) |
|
|
self.assertEqual(der.encode(), b('1\x05\x01\x00\x01\x01\x01')) |
|
|
|
|
|
|
|
|
|
|
|
def testDecode1(self): |
|
|
|
|
|
der = DerSetOf() |
|
|
der.decode(b('1\x00')) |
|
|
self.assertEqual(len(der),0) |
|
|
|
|
|
der.decode(b('1\x03\x02\x01\x00')) |
|
|
self.assertEqual(len(der),1) |
|
|
self.assertEqual(list(der),[0]) |
|
|
|
|
|
def testDecode2(self): |
|
|
|
|
|
der = DerSetOf() |
|
|
der.decode(b('1\x08\x02\x02\x01\x80\x02\x02\x00\xff')) |
|
|
self.assertEqual(len(der),2) |
|
|
l = list(der) |
|
|
self.assertTrue(0x180 in l) |
|
|
self.assertTrue(0xFF in l) |
|
|
|
|
|
def testDecode3(self): |
|
|
|
|
|
der = DerSetOf() |
|
|
|
|
|
self.assertRaises(ValueError, der.decode, |
|
|
b('0\x0A\x02\x02\x01\x80\x24\x02\xb6\x63\x12\x00')) |
|
|
|
|
|
def testDecode4(self): |
|
|
|
|
|
der = DerSetOf() |
|
|
self.assertEqual(der, |
|
|
der.decode(b('1\x08\x02\x02\x01\x80\x02\x02\x00\xff'))) |
|
|
|
|
|
|
|
|
|
|
|
def testErrDecode1(self): |
|
|
|
|
|
der = DerSetOf() |
|
|
self.assertRaises(ValueError, der.decode, |
|
|
b('1\x08\x02\x02\x01\x80\x02\x02\x00\xff\xAA')) |
|
|
|
|
|
|
|
|
class DerBooleanTests(unittest.TestCase): |
|
|
|
|
|
def testEncode1(self): |
|
|
der = DerBoolean(False) |
|
|
self.assertEqual(der.encode(), b'\x01\x01\x00') |
|
|
|
|
|
def testEncode2(self): |
|
|
der = DerBoolean(True) |
|
|
self.assertEqual(der.encode(), b'\x01\x01\xFF') |
|
|
|
|
|
def testEncode3(self): |
|
|
der = DerBoolean(False, implicit=0x12) |
|
|
self.assertEqual(der.encode(), b'\x92\x01\x00') |
|
|
|
|
|
def testEncode4(self): |
|
|
der = DerBoolean(False, explicit=0x05) |
|
|
self.assertEqual(der.encode(), b'\xA5\x03\x01\x01\x00') |
|
|
|
|
|
|
|
|
def testDecode1(self): |
|
|
der = DerBoolean() |
|
|
der.decode(b'\x01\x01\x00') |
|
|
self.assertEqual(der.value, False) |
|
|
|
|
|
def testDecode2(self): |
|
|
der = DerBoolean() |
|
|
der.decode(b'\x01\x01\xFF') |
|
|
self.assertEqual(der.value, True) |
|
|
|
|
|
def testDecode3(self): |
|
|
der = DerBoolean(implicit=0x12) |
|
|
der.decode(b'\x92\x01\x00') |
|
|
self.assertEqual(der.value, False) |
|
|
|
|
|
def testDecode4(self): |
|
|
der = DerBoolean(explicit=0x05) |
|
|
der.decode(b'\xA5\x03\x01\x01\x00') |
|
|
self.assertEqual(der.value, False) |
|
|
|
|
|
def testErrorDecode1(self): |
|
|
der = DerBoolean() |
|
|
|
|
|
self.assertRaises(ValueError, der.decode, b'\x02\x01\x00') |
|
|
|
|
|
def testErrorDecode2(self): |
|
|
der = DerBoolean() |
|
|
|
|
|
self.assertRaises(ValueError, der.decode, b'\x01\x01\x00\xFF') |
|
|
|
|
|
|
|
|
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) |
|
|
listTests += list_test_cases(DerBooleanTests) |
|
|
return listTests |
|
|
|
|
|
if __name__ == '__main__': |
|
|
suite = lambda: unittest.TestSuite(get_tests()) |
|
|
unittest.main(defaultTest='suite') |
|
|
|
|
|
|
|
|
|