Ejemplo n.º 1
0
def test_per_sequence(print_info=True):
    
    ASN1.ASN1Obj._SAFE = True
    ASN1.ASN1Obj._RET_STRUCT = True
    ASN1.ASN1Obj.CODEC = PER
    #
    PER._REPR_INT = 'bin'
    PER._REPR_ENUM = 'bin'
    PER._SAFE = True
    #
    PER.VARIANT = 'A'
    
    if print_info: print('testing OCTET STRING and SEQUENCE encoding / decoding (PER aligned)')
    PER.VARIANT = 'A'
    a = inline('''
        A ::= SEQUENCE {
            s1  INTEGER (1..50, ...),
            s2  ENUMERATED {first, second, third},
            s3  BOOLEAN OPTIONAL,
            s4  INTEGER (-10..20) DEFAULT 5,
            s5  OCTET STRING (SIZE(2..10, ...)),
            ...,
            s8  INTEGER,
            s9  BOOLEAN
            }
        ''')
    b = a.clone()
    
    a.encode({'s1':2, 's2':'second', 's3':True, 's4':2, 's5':'abcdef'})
    #print('a (2, second, True, 2, abcdef): %s' % a._msg.show())
    assert(a._msg.__hex__() == '605b08616263646566')
    b.decode(str(a))
    assert(a._msg.__hex__() == b._msg.__hex__() and a() == b())
    a.encode({'s1':2, 's2':'second', 's5':'abcdef'})
    #print('a (2, second, abcdef): %s' % a._msg.show())
    assert(a._msg.__hex__() == '005200616263646566')
    b.decode(str(a))
    assert(a._msg.__hex__() == b._msg.__hex__() and a() == b())
    a.encode({'s1':2, 's2':'second', 's5':'a', 's8':500000})
    #print('a (2, second, a, 500000): %s' % a._msg.show())
    assert(a._msg.__hex__() == '805801610300040307a120')
    b.decode(str(a))
    assert(a._msg.__hex__() == b._msg.__hex__() and a() == b())
    a.encode({'s1':200, 's2':'third', 's3':False, 's5':'', 's8':5000000, 's9':True})
    #print('a (200, third, False, , 5000000, True): %s' % a._msg.show())
    assert(a._msg.__hex__() == 'd00200c89000038004034c4b400180')
    b.decode(str(a))
    assert(a._msg.__hex__() == b._msg.__hex__() and a() == b())
    a.encode({'s1':200, 's2':'third', 's3':False, 's5':300*'A', 's8':-10, 's9':True})
    #print('a (200, third, False, , 300*A, -10, True): %s' % a.show())
    assert(a._msg.__hex__() == 'd00200c890812c41414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414103800201f60180')
    b.decode(str(a))
    assert(a._msg.__hex__() == b._msg.__hex__() and a() == b())
    
    if print_info: print('testing OCTET STRING and SEQUENCE encoding (PER unaligned)')
    PER.VARIANT = 'U'
    a.encode({'s1':2, 's2':'second', 's3':True, 's4':2, 's5':'abcdef'})
    #print('a (2, second, True, 2, abcdef): %s' % a._msg.show())
    assert(a._msg.__bin__() == '01100000010110110000100011000010110001001100011011001000110010101100110')
    b.decode(str(a))
    assert(a._msg.__hex__() == b._msg.__hex__() and a() == b())
    a.encode({'s1':2, 's2':'second', 's5':'abcdef'})
    #print('a (2, second, abcdef): %s' % a._msg.show())
    assert(a._msg.__bin__() == '00000000010100100011000010110001001100011011001000110010101100110')
    b.decode(str(a))
    assert(a._msg.__hex__() == b._msg.__hex__() and a() == b())
    a.encode({'s1':2, 's2':'second', 's5':'a', 's8':500000})
    #print('a (2, second, a, 500000): %s' % a._msg.show())
    assert(a._msg.__bin__() == '100000000101100000001011000010000001100000010000000011000001111010000100100000')
    b.decode(str(a))
    assert(a._msg.__hex__() == b._msg.__hex__() and a() == b())
    a.encode({'s1':200, 's2':'third', 's3':False, 's5':'', 's8':5000000, 's9':True})
    #print('a (200, third, False, , 5000000, True): %s' % a._msg.show())
    assert(a._msg.__bin__() == '110100000010000000001100100010010000000000000011100000100000000110100110001001011010000000000000110000000')
    b.decode(str(a))
    assert(a._msg.__hex__() == b._msg.__hex__() and a() == b())
    a.encode({'s1':200, 's2':'third', 's3':False, 's5':300*'A', 's8':-10, 's9':True})
    #print('a (200, third, False, , 300*A, -10, True): %s' % a._msg.show())
    assert(a._msg.__hex__() == 'd0200c89812c414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141038100fb00c00')
    b.decode(str(a))
    assert(a._msg.__hex__() == b._msg.__hex__() and a() == b())
    
    PER.VARIANT = 'A'
    a = inline('''
        A ::= SEQUENCE {
            s1  INTEGER {first(1), second(2)} (1..50, ...),
            s2  ENUMERATED {first, second, third},
            s3  SEQUENCE { s31  BOOLEAN,
                           s32  NULL,
                           s33  BIT STRING (SIZE(56..64)),
                           s34  BOOLEAN DEFAULT FALSE},
            ...,
            s4  NULL OPTIONAL,
            s5  CHOICE { s51  INTEGER (-20..50),
                         s52  BOOLEAN,
                         s53  NULL,
                         s54  BOOLEAN }
            }
    ''')
    b = a.clone()
    
    a.encode({'s1':-5000,
              's2':'third',
              's3':{'s31':True, 's32':None, 's33':(1, 64), 's34':False},
              's4':None,
              's5':('s52', True)
              })
    #print('a (-5000, third, {True, None, (1, 64), False}, None, (s52, True)): %s' % a._msg.show())
    assert(a._msg.__hex__() == 'c002ec78980000000000000001038001000160')
    b.decode(str(a))
    assert(a._msg.__hex__() == b._msg.__hex__() and a() == b())
    
    PER.VARIANT = 'U'
    a.encode({'s1':-5000,
              's2':'third',
              's3':{'s31':True, 's32':None, 's33':(1, 64), 's34':False},
              's4':None,
              's5':('s52', True)
              })
    #print('a (-5000, third, {True, None, (1, 64), False}, None, (s52, True)): %s' % a._msg.show())
    assert(a._msg.__hex__() == 'c0bb1e26000000000000000040e020002c0' and a._msg.bit_len() == 139)
    b.decode(str(a))
    assert(a._msg.__hex__() == b._msg.__hex__() and a() == b())
    
    if print_info: print('testing SEQUENCE OF encoding / decoding (PER aligned)')
    PER.VARIANT = 'A'
    a = inline('''
        A ::= SEQUENCE (SIZE(2..10, ...)) OF OCTET STRING (SIZE(0..10, ...))
        ''')
    b = a.clone()
    
    a.encode(['abc', '', 5*'a', 11*'A', 25*'B'])    
    #print('a (abc, , 5*a, 11*A, 25*B): %s' % a._msg.show())
    assert(a._msg.__hex__() == '18c061626301406161616161800b4141414141414141414141801942424242424242424242424242424242424242424242424242')
    b.decode(str(a))
    assert(a._msg.__hex__() == b._msg.__hex__() and a() == b())
    a.encode([13*'XY'])
    #print('a (13*XY): %s' % a._msg.show())
    assert(a._msg.__hex__() == '8001801a5859585958595859585958595859585958595859585958595859')
    b.decode(str(a))
    assert(a._msg.__hex__() == b._msg.__hex__() and a() == b())
    #
    a = inline('''
        A ::= SEQUENCE SIZE(2..10, ...) OF INTEGER (0..300)
        ''')
    b = a.clone()
    a.encode(range(300))
    assert(a.__hex__() == '80812c0000000100020003000400050006000700080009000a000b000c000d000e000f0010001100120013001400150016001700180019001a001b001c001d001e001f0020002100220023002400250026002700280029002a002b002c002d002e002f0030003100320033003400350036003700380039003a003b003c003d003e003f0040004100420043004400450046004700480049004a004b004c004d004e004f0050005100520053005400550056005700580059005a005b005c005d005e005f0060006100620063006400650066006700680069006a006b006c006d006e006f0070007100720073007400750076007700780079007a007b007c007d007e007f0080008100820083008400850086008700880089008a008b008c008d008e008f0090009100920093009400950096009700980099009a009b009c009d009e009f00a000a100a200a300a400a500a600a700a800a900aa00ab00ac00ad00ae00af00b000b100b200b300b400b500b600b700b800b900ba00bb00bc00bd00be00bf00c000c100c200c300c400c500c600c700c800c900ca00cb00cc00cd00ce00cf00d000d100d200d300d400d500d600d700d800d900da00db00dc00dd00de00df00e000e100e200e300e400e500e600e700e800e900ea00eb00ec00ed00ee00ef00f000f100f200f300f400f500f600f700f800f900fa00fb00fc00fd00fe00ff0100010101020103010401050106010701080109010a010b010c010d010e010f0110011101120113011401150116011701180119011a011b011c011d011e011f0120012101220123012401250126012701280129012a012b')
    b.decode(str(a))
    assert(a() == b())
    
    if print_info: print('testing SEQUENCE OF encoding / decoding (PER unaligned)')
    PER.VARIANT = 'U'
    a = inline('''
        A ::= SEQUENCE (SIZE(2..10, ...)) OF OCTET STRING (SIZE(0..10, ...))
        ''')
    b = a.clone()
    
    a.encode(['abc', '', 5*'a', 11*'A', 25*'B'])    
    #print('a (abc, , 5*a, 11*A, 25*B): %s' % a._msg.show())
    assert(a._msg.__hex__() == '18d85898c05616161616185a0a0a0a0a0a0a0a0a0a0a0c6509090909090909090909090909090909090909090909090908' and a._msg.bit_len() == 390)
    b.decode(str(a))
    assert(a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode([13*'XY'])
    #print('a (13*XY): %s' % a._msg.show())
    assert(a._msg.__hex__() == '80c696165616561656165616561656165616561656165616561656164' and a._msg.bit_len() == 226)
    b.decode(str(a))
    assert(a._msg.__bin__() == b._msg.__bin__() and a() == b())
    
    a = inline('''
        A ::= SEQUENCE SIZE(2..10, ...) OF INTEGER (0..300)
        ''')
    b = a.clone()
    a.encode(range(300))
    assert(a.__hex__() == 'c0960000202018100a0603820120a058301a0e078402212098502a160b860321a0d8703a1e0f8804222118904a26138a0522a158b05a2e178c06232198d06a361b8e0723a1d8f07a3e1f9008242219108a4623920924a259309a4e27940a25229950aa562b960b25a2d970ba5e2f980c26231990ca66339a0d26a359b0da6e379c0e272399d0ea763b9e0f27a3d9f0fa7e3fa01028241a110a8643a21128a45a311a8e47a41229249a512a964ba61329a4da713a9e4fa8142a251a914aa653aa152aa55ab15aae57ac162b259ad16ab65bae172ba5daf17abe5fb0182c261b118ac663b2192ca65b319ace67b41a2d269b51aad66bb61b2da6db71bade6fb81c2e271b91cae673ba1d2ea75bb1daee77bc1e2f279bd1eaf67bbe1f2fa7dbf1fafe7fc02030281c120b0683c22130a85c321b0e87c42231289c522b168bc62331a8dc723b1e8fc82432291c924b2693ca2532a958' and a._msg.bit_len() == 2717)
    b.decode(str(a))
    assert(a() == b())
Ejemplo n.º 2
0
def test_def(print_info=True):
    
    ASN1.ASN1Obj._SAFE = True
    ASN1.ASN1Obj._RET_STRUCT = True
    
    MODULE_OPT.TAG = TAG_AUTO
    
    if print_info: print('testing NULL definition')
    A = ASN1.ASN1Obj(name='A', type=TYPE_NULL)
    A.set_val(None)
    
    if print_info: print('testing BOOLEAN definition')
    A = ASN1.ASN1Obj(name='A', type=TYPE_BOOL)
    A.set_val(False)
    A.set_val(True)
    
    if print_info: print('testing INTEGER definition')
    A = ASN1.ASN1Obj(name='A', type=TYPE_INTEGER)
    A.set_val(0)
    A.set_val(-999999999999999999999999999)
    A.set_val(111999999999999999999999999999111)
    
    if print_info: print('testing ENUMERATED definition')
    A = ASN1.ASN1Obj(name='A', type=TYPE_ENUM)
    A._cont = OD([('un', 1), ('deux', 2), ('trois', 3)])
    A.set_val('un') # parce qu'un tien vaut mieux que deux tu l'auras 
    
    if print_info: print('testing BIT STRING definition')
    A = ASN1.ASN1Obj(name='A', type=TYPE_BIT_STR)
    A.set_val((0b11001100111000, 16))
    A.parse_value("'0011001100111000'B")
    A.parse_value("'3338'H")
    
    if print_info: print('testing OCTET STRING definition')
    A = ASN1.ASN1Obj(name='A', type=TYPE_OCTET_STR)
    A.set_val('la grande truite')
    A.parse_value("'11001100111000'B")
    A.parse_value("'3338'H")
    
    if print_info: print('testing CHOICE definition')
    A = inline('''
        A ::= CHOICE {
            a1 BOOLEAN,
            a2 INTEGER (0..20),
            a3 NULL,
            a4 INTEGER(MIN..100, ...),
            ...,
            a5 BIT STRING (SIZE(0..80))
            }''')
    A.set_val( ('a1', True) )
    A.set_val( ('a2', 12) )
    A.set_val( ('a3', None) )
    A.set_val( ('a4', -50000000) )
    A.set_val( ('a5', (1000000000000000000001, 70)) )
    
    A = inline('''
        A ::= CHOICE {
            c1  INTEGER {first(1), second(2)} (1..50, ...),
            c2  ENUMERATED {first, second, third, ..., fourth},
            c3  BIT STRING {first-bit(1), second-bit(2)} (SIZE(8..16, ...)),
            c4  OCTET STRING (SIZE(10..20)),
            c5  CHOICE { c51  INTEGER (-20..50),
                         c52  BOOLEAN,
                         c53  NULL,
                         c54  BOOLEAN },
            ...,
            c6  OBJECT IDENTIFIER,
            c7  BOOLEAN
            }
    ''')
    A.set_val( ('c1', 500) )
    A.set_val( ('c2', 'fourth') )
    A.set_val( ('c3', (0b10100000, 12)) )
    A.set_val( ('c4', 'abcdefghijklmn') )
    A.set_val( ('c5', ('c54', True)) )
    A.set_val( ('c6', (1, 2, 3)) )
    A.set_val( ('c7', False) )
    
    if print_info: print('testing SEQUENCE definition')
    A = inline('''
        A ::= SEQUENCE {
            s1  INTEGER {first(1), second(2)} (1..50, ...),
            s2  ENUMERATED {first, second, third},
            s3  SEQUENCE { s31  BOOLEAN,
                           s32  NULL,
                           s33  BIT STRING (SIZE(56..64)),
                           s34  BOOLEAN DEFAULT FALSE},
            ...,
            s4  NULL OPTIONAL,
            s5  CHOICE { s51  INTEGER (-20..50),
                         s52  BOOLEAN,
                         s53  NULL,
                         s54  BOOLEAN }
            }
    ''')
    A.set_val({'s1':50,
               's2':'third',
               's3':{'s31':True, 's32':None, 's33':(1, 64)}
               })
    A.set_val({'s1':-5000,
               's2':'third',
               's3':{'s31':True, 's32':None, 's33':(1, 64), 's34':False},
               's4':None,
               's5':('s52', True)
               })
    
    if print_info: print('testing SEQUENCE OF definition')
    A = inline('''
        A ::= SEQUENCE (SIZE(1..5, ...)) OF INTEGER (0..MAX)
        ''')
    A.set_val([1, 2, 5, 41, 566321564])
    A = inline('''
        A ::= SEQUENCE (SIZE(1..3, ...)) OF OCTET STRING (SIZE(0..10, ...))
        ''')
    A.set_val(['a', 'abcdef', 'abcdef'*50])
    
    if print_info: print('testing CLASS definition')
    C3 = inline('''
        C3 ::= INTEGER
        ''')
    C3.set_val(230000)
    A = inline('''
        A ::= CLASS {
            &c1 INTEGER UNIQUE,
            &c2 ENUMERATED {first},
            &C3,
            &c4 INTEGER } WITH SYNTAX {
            IDENT &c1 PLACE &c2 TYPE &C3 VALUE &c4 }
        ''')
    A.set_val({'c1':10,
               'c2':'first',
               'C3':('C3', 23000),
               'c4':1
               })
Ejemplo n.º 3
0
def test_per_choice(print_info=True):
    
    ASN1.ASN1Obj._SAFE = True
    ASN1.ASN1Obj._RET_STRUCT = True
    ASN1.ASN1Obj.CODEC = PER
    #
    PER._REPR_INT = 'bin'
    PER._REPR_ENUM = 'bin'
    PER._SAFE = True
    #
    PER.VARIANT = 'A'
    
    if print_info: print('testing BIT STRING and CHOICE encoding /decoding (PER aligned)')
    PER.VARIANT = 'A'
    a = inline('''
        A ::= CHOICE {
            a1 BIT STRING (SIZE(4..8)),
            a2 BIT STRING (SIZE(5..10, ...)),
            ...,
            a3 BIT STRING,
            a4 BIT STRING (SIZE(4..8, ...))
            }
        ''')
    b = a.clone()
    #
    a.encode(('a1', (0b111000, 6)))
    #print('a1 (0b111000): %s' % a._msg.show())
    assert(a._msg.__hex__() == '10e0')
    b.decode( str(a) )
    assert(a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode(('a2', (0b10101, 5)))
    #print('a2 (0b10101): %s' % a._msg.show())
    assert(a._msg.__hex__() == '40a8')
    b.decode( str(a) )
    assert(a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode(('a2', (0b111111111111111111111, 21)))
    #print('a2 (0x1fffff): %s' % a._msg.show())
    assert(a._msg.__hex__() == '6015fffff8')
    b.decode( str(a) )
    assert(a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode(('a3', (1, 1)))
    #print('a3 (0b1): %s' % a._msg.show())
    assert(a._msg.__hex__() == '80020180')
    b.decode( str(a) )
    assert(a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode(('a3', (0x617a6572747975696f70617a6572747975696f70, 160)))
    #print('a3 (azertyuiopazertyuiop): %s' % a._msg.show())
    assert(a._msg.__hex__() == '801680a0617a6572747975696f70617a6572747975696f70')
    b.decode( str(a) )
    assert(a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode(('a4', (0, 0)))
    #print('a4 (0): %s' % a._msg.show())
    assert(a._msg.__hex__() == '81028000')
    b.decode( str(a) )
    assert(a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode(('a4', (0x4141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141, 4000)))
    #print('a5 (500*"A"): %s' % a._msg.show())
    assert(str(a) == '\x81\x81\xf7\x80\x8f\xa0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA')
    b.decode( str(a) )
    assert(a._msg.__bin__() == b._msg.__bin__() and a() == b())
    
    if print_info: print('testing BIT STRING and CHOICE encoding / decoding (PER unaligned)')
    PER.VARIANT = 'U'
    #
    a.encode(('a1', (0b111000, 6)))
    #print('a1 (0b111000): %s' % a._msg.show())
    assert(a._msg.__bin__() == '00010111000')
    b.decode( str(a) )
    assert(a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode(('a2', (0b10101, 5)))
    #print('a2 (0b10101): %s' % a._msg.show())
    assert(a._msg.__bin__() == '01000010101')
    b.decode( str(a) )
    assert(a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode(('a2', (0b111111111111111111111, 21)))
    #print('a2 (0x1fffff): %s' % a._msg.show())
    assert(a._msg.__bin__() == '01100010101111111111111111111111')
    b.decode( str(a) )
    assert(a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode(('a3', (1, 1)))
    #print('a3 (0b1): %s' % a._msg.show())
    assert(a._msg.__bin__() == '10000000000000100000000110000000')
    b.decode( str(a) )
    assert(a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode(('a3', (0x617a6572747975696f70617a6572747975696f70, 160)))
    #print('a3 (azertyuiopazertyuiop): %s' % a._msg.show())
    assert(a._msg.__hex__() == '801680a0617a6572747975696f70617a6572747975696f70')
    b.decode( str(a) )
    assert(a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode(('a4', (0, 0)))
    #print('a4 (0): %s' % a._msg.show())
    assert(a.__bin__() == '10000001000000101000000000000000')
    b.decode( str(a) )
    assert(a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode(('a4', (0x4141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141, 4000)))
    #print('a5 (500*"A"): %s' % a._msg.show())
    assert(a.__hex__() == '8181f7c7d020a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a080')
    b.decode( str(a) )
    assert(a._msg.__bin__() == b._msg.__bin__() and a() == b())
Ejemplo n.º 4
0
def test_per_integer(print_info=True):
    
    ASN1.ASN1Obj._SAFE = True
    ASN1.ASN1Obj._RET_STRUCT = True
    ASN1.ASN1Obj.CODEC = PER
    #
    PER._REPR_INT = 'bin'
    PER._REPR_ENUM = 'bin'
    #
    PER.VARIANT = 'A'
    PER._SAFE = True
    
    if print_info: print('testing unconstrained INTEGER encoding / decoding (PER)')
    i1 = inline('I1 ::= INTEGER')
    i1.encode(4096)
    #print('i1:\n%s' % i1._msg.show())
    assert(str(i1) == '\x02\x10\x00')
    i1d = inline('I1D ::= INTEGER')
    buf = i1d.decode(str(i1))
    assert(str(i1d) == str(i1) and i1d() == i1())
    
    i2 = inline('I2 ::= INTEGER (MIN..65535)')
    i2.encode(127)
    #print('i2:\n%s' % i2._msg.show())
    assert(str(i2) == '\x01\x7f')
    i2d = inline('I2D ::= INTEGER (MIN..65535)')
    buf = i2d.decode(str(i2))
    assert(str(i2d) == str(i2) and i2d() == i2())
    
    i3 = inline('I3 ::= INTEGER (MIN..65535)')
    i3.encode(-128)
    #print('i3:\n%s' % i3._msg.show())
    assert(str(i3) == '\x01\x80')
    i3d = inline('I3D ::= INTEGER (MIN..65535)')
    buf = i3d.decode(str(i3))
    assert(str(i3d) == str(i3) and i3d() == i3())
    
    i4 = inline('I4 ::= INTEGER (MIN..65535)')
    i4.encode(128)
    #print('i4:\n%s' % i4._msg.show())
    assert(str(i4) == '\x02\x00\x80')
    i4d = inline('I4D ::= INTEGER (MIN..65535)')
    buf =  i4d.decode(str(i4))
    assert(str(i4d) == str(i4) and i4d() == i4())
    #return i1, i2, i3, i4
    
    if print_info: print('testing semi-constrained INTEGER encoding / decoding (PER)')
    i5 = inline('I5 ::= INTEGER (-1..MAX)')
    i5.encode(4096)
    #print('i5: %s' % i5._msg.show())
    assert(str(i5) == '\x02\x10\x01')
    i5d = inline('I5D ::= INTEGER (-1..MAX)')
    buf = i5d.decode(str(i5))
    assert(str(i5d) == str(i5) and i5d() == i5())
    
    i6 = inline('I6 ::= INTEGER (1..MAX)')
    i6.encode(127)
    #print('i6: %s' % i6._msg.show())
    assert(str(i6) == '\x01~')
    i6d = inline('I6D ::= INTEGER (1..MAX)')
    buf = i6d.decode(str(i6))
    assert(str(i6d) == str(i6) and i6d() == i6())
    
    i7 = inline('I7 ::= INTEGER (0..MAX)')
    i7.encode(128)
    #print('i7: %s' % i7._msg.show())
    assert(str(i7) == '\x01\x80')
    i7d = inline('I7D ::= INTEGER (0..MAX)')
    buf = i7d.decode(str(i7))
    assert(str(i7d) == str(i7) and i7d() == i7())
    #return i1, i2, i3, i4, i5, i6, i7
    
    if print_info: print('testing constrained INTEGER encoding / decoding (PER aligned / unaligned)')
    i8 = inline('I8 ::= INTEGER(3..6)')
    i8.encode(3)
    assert(i8._msg.__bin__() == '00')
    i8d = inline('I8D ::= INTEGER(3..6)')
    buf = i8d.decode(str(i8))
    assert(str(i8d) == str(i8) and i8d() == i8())
    i8.encode(4)
    assert(i8._msg.__bin__() == '01')
    buf = i8d.decode(str(i8))
    assert(str(i8d) == str(i8) and i8d() == i8())
    i8.encode(5)
    assert(i8._msg.__bin__() == '10')
    buf = i8d.decode(str(i8))
    assert(str(i8d) == str(i8) and i8d() == i8())
    i8.encode(6)
    assert(i8._msg.__bin__() == '11')
    buf = i8d.decode(str(i8))
    assert(str(i8d) == str(i8) and i8d() == i8())
    #print('i8 (6): %s' % i8._msg.show())
    
    i9 = inline('I9 ::= INTEGER (4000..4254)')
    i9.encode(4002)
    assert(str(i9) == '\x02')
    i9d = inline('I9D ::= INTEGER (4000..4254)')
    buf = i9d.decode(str(i9))
    assert(str(i9d) == str(i9) and i9d() == i9())
    i9.encode(4006)
    assert(str(i9) == '\x06')
    buf = i9d.decode(str(i9))
    assert(str(i9d) == str(i9) and i9d() == i9())
    #print('i9 (4006): %s' % i9._msg.show())
    
    i10 = inline('I10 ::= INTEGER (4000..4255)')
    i10.encode(4002)
    assert(str(i10) == '\x02')
    i10d = inline('I10D ::= INTEGER (4000..4255)')
    buf = i10d.decode(str(i10))
    assert(str(i10d) == str(i10) and i10d() == i10())
    i10.encode(4006)
    assert(str(i10) == '\x06')
    buf = i10d.decode(str(i10))
    assert(str(i10d) == str(i10) and i10d() == i10())
    #print('i10 (4006): %s' % i10._msg.show())
    
    i11 = inline('I11 ::= INTEGER (0..32000)')
    i11.encode(0)
    assert(str(i11) == '\0\0')
    i11d = inline('I11D ::= INTEGER (0..32000)')
    buf = i11d.decode(str(i11))
    assert(str(i11d) == str(i11) and i11d() == i11())
    i11.encode(31000)
    assert(str(i11) == '\x79\x18')
    buf = i11d.decode(str(i11))
    assert(str(i11d) == str(i11) and i11d() == i11())
    #print('i11 (31000): %s' % i11._msg.show())
    
    i12 = inline('I12 ::= INTEGER (1..65538)')
    i12.encode(1)
    assert(str(i12) == '\0\0')
    i12d = inline('I12D ::= INTEGER (1..65538)')
    buf = i12d.decode(str(i12))
    assert(str(i12d) == str(i12) and i12d() == i12())
    i12.encode(257)
    assert(str(i12) == '@\x01\x00')
    buf = i12d.decode(str(i12))
    assert(str(i12d) == str(i12) and i12d() == i12())
    i12.encode(65538)
    assert(str(i12) == '\x80\x01\x00\x01')
    buf = i12d.decode(str(i12))
    assert(str(i12d) == str(i12) and i12d() == i12())
    #print('i12 (65538 - aligned): %s' % i12._msg.show())
    
    PER.VARIANT = 'U'
    i12.encode(1)
    assert(i12._msg.__bin__() == '00000000000000000')
    buf = i12d.decode(str(i12))
    assert(i12d() == i12())
    i12.encode(257)
    assert(i12._msg.__bin__() == '00000000100000000')
    buf = i12d.decode(str(i12))
    assert(i12d() == i12())
    i12.encode(65538)
    assert(i12._msg.__bin__() == '10000000000000001')
    buf = i12d.decode(str(i12))
    assert(i12d() == i12())
    #print('i12 (65538 - unaligned): %s' % i12._msg.show())
    #return i8, i9, i10, i11, i12
    
    PER.VARIANT = 'A'
    if print_info: print('testing extended INTEGER encoding / decoding (PER aligned / unaligned)')
    i13 = inline('I13 ::= INTEGER(MIN..65535, ...)')
    i13.encode(127)
    assert(str(i13) == '\x00\x01\x7f')
    i13d = inline('I13D ::= INTEGER(MIN..65535, ...)')
    buf = i13d.decode(str(i13))
    assert(str(i13d) == str(i13) and i13d() == i13())
    i13.encode(65536)
    assert(str(i13) == '\x80\x03\x01\x00\x00')
    buf = i13d.decode(str(i13))
    assert(str(i13d) == str(i13) and i13d() == i13())
    #print('i13 (65536): %s' % i13._msg.show())
    
    i14 = inline('I14 ::= INTEGER (-1..MAX, ...)')
    i14.encode(4096)
    assert(str(i14) == '\x00\x02\x10\x01')
    i14d = inline('I14D ::= INTEGER (-1..MAX, ...)')
    buf = i14d.decode(str(i14))
    assert(str(i14d) == str(i14) and i14d() == i14())
    i14.encode(-8)
    assert(str(i14) == '\x80\x01\xf8')
    buf = i14d.decode(str(i14))
    assert(str(i14d) == str(i14) and i14d() == i14())
    #print('i14 (-8): %s' % i14._msg.show())
    
    i15 = inline('I15 ::= INTEGER (3..6, ...)')
    i15.encode(4)
    assert(i15._msg.__bin__() == '001')
    i15d = inline('I15D ::= INTEGER (3..6, ...)')
    buf = i15d.decode(str(i15))
    assert(str(i15d) == str(i15) and i15d() == i15())
    i15.encode(8)
    assert(str(i15) == '\x80\x01\x08')
    buf = i15d.decode(str(i15))
    assert(str(i15d) == str(i15) and i15d() == i15())
    #print('i15 (8): %s' % i15._msg.show())
    
    i16 = inline('I16 ::= INTEGER (1..65538, ...)')
    i16.encode(257)
    assert(str(i16) == ' \x01\x00')
    i16d = inline('I16D ::= INTEGER (1..65538, ...)')
    buf = i16d.decode(str(i16))
    assert(str(i16d) == str(i16) and i16d() == i16())
    i16.encode(65539)
    assert(str(i16) == '\x80\x03\x01\x00\x03')
    buf = i16d.decode(str(i16))
    assert(str(i16d) == str(i16) and i16d() == i16())
    #print('i16 (65539 - aligned): %s' % i16._msg.show())
    #
    PER.VARIANT = 'U'
    i16.encode(257)
    assert(i16._msg.__bin__() == '000000000100000000')
    buf = i16d.decode(str(i16))
    assert(i16d() == i16())
    i16.encode(65539)
    assert(i16._msg.__bin__() == '100000011000000010000000000000011')
    buf = i16d.decode(str(i16))
    assert(i16d() == i16())
    #print('i16 (65539 - unaligned): %s' % i16._msg.show())
    #return i13, i14, i15, i16
    
    PER.VARIANT = 'A'
Ejemplo n.º 5
0
def test_per_sequence(print_info=True):

    ASN1.ASN1Obj._SAFE = True
    ASN1.ASN1Obj._RET_STRUCT = True
    ASN1.ASN1Obj.CODEC = PER
    #
    PER._REPR_INT = 'bin'
    PER._REPR_ENUM = 'bin'
    PER._SAFE = True
    #
    PER.VARIANT = 'A'

    if print_info:
        print(
            'testing OCTET STRING and SEQUENCE encoding / decoding (PER aligned)'
        )
    PER.VARIANT = 'A'
    a = inline('''
        A ::= SEQUENCE {
            s1  INTEGER (1..50, ...),
            s2  ENUMERATED {first, second, third},
            s3  BOOLEAN OPTIONAL,
            s4  INTEGER (-10..20) DEFAULT 5,
            s5  OCTET STRING (SIZE(2..10, ...)),
            ...,
            s8  INTEGER,
            s9  BOOLEAN
            }
        ''')
    b = a.clone()

    a.encode({'s1': 2, 's2': 'second', 's3': True, 's4': 2, 's5': 'abcdef'})
    #print('a (2, second, True, 2, abcdef): %s' % a._msg.show())
    assert (a._msg.__hex__() == '605b08616263646566')
    b.decode(str(a))
    assert (a._msg.__hex__() == b._msg.__hex__() and a() == b())
    a.encode({'s1': 2, 's2': 'second', 's5': 'abcdef'})
    #print('a (2, second, abcdef): %s' % a._msg.show())
    assert (a._msg.__hex__() == '005200616263646566')
    b.decode(str(a))
    assert (a._msg.__hex__() == b._msg.__hex__() and a() == b())
    a.encode({'s1': 2, 's2': 'second', 's5': 'a', 's8': 500000})
    #print('a (2, second, a, 500000): %s' % a._msg.show())
    assert (a._msg.__hex__() == '805801610300040307a120')
    b.decode(str(a))
    assert (a._msg.__hex__() == b._msg.__hex__() and a() == b())
    a.encode({
        's1': 200,
        's2': 'third',
        's3': False,
        's5': '',
        's8': 5000000,
        's9': True
    })
    #print('a (200, third, False, , 5000000, True): %s' % a._msg.show())
    assert (a._msg.__hex__() == 'd00200c89000038004034c4b400180')
    b.decode(str(a))
    assert (a._msg.__hex__() == b._msg.__hex__() and a() == b())
    a.encode({
        's1': 200,
        's2': 'third',
        's3': False,
        's5': 300 * 'A',
        's8': -10,
        's9': True
    })
    #print('a (200, third, False, , 300*A, -10, True): %s' % a.show())
    assert (
        a._msg.__hex__() ==
        'd00200c890812c41414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414103800201f60180'
    )
    b.decode(str(a))
    assert (a._msg.__hex__() == b._msg.__hex__() and a() == b())

    if print_info:
        print('testing OCTET STRING and SEQUENCE encoding (PER unaligned)')
    PER.VARIANT = 'U'
    a.encode({'s1': 2, 's2': 'second', 's3': True, 's4': 2, 's5': 'abcdef'})
    #print('a (2, second, True, 2, abcdef): %s' % a._msg.show())
    assert (
        a._msg.__bin__() ==
        '01100000010110110000100011000010110001001100011011001000110010101100110'
    )
    b.decode(str(a))
    assert (a._msg.__hex__() == b._msg.__hex__() and a() == b())
    a.encode({'s1': 2, 's2': 'second', 's5': 'abcdef'})
    #print('a (2, second, abcdef): %s' % a._msg.show())
    assert (a._msg.__bin__(
    ) == '00000000010100100011000010110001001100011011001000110010101100110')
    b.decode(str(a))
    assert (a._msg.__hex__() == b._msg.__hex__() and a() == b())
    a.encode({'s1': 2, 's2': 'second', 's5': 'a', 's8': 500000})
    #print('a (2, second, a, 500000): %s' % a._msg.show())
    assert (
        a._msg.__bin__() ==
        '100000000101100000001011000010000001100000010000000011000001111010000100100000'
    )
    b.decode(str(a))
    assert (a._msg.__hex__() == b._msg.__hex__() and a() == b())
    a.encode({
        's1': 200,
        's2': 'third',
        's3': False,
        's5': '',
        's8': 5000000,
        's9': True
    })
    #print('a (200, third, False, , 5000000, True): %s' % a._msg.show())
    assert (
        a._msg.__bin__() ==
        '110100000010000000001100100010010000000000000011100000100000000110100110001001011010000000000000110000000'
    )
    b.decode(str(a))
    assert (a._msg.__hex__() == b._msg.__hex__() and a() == b())
    a.encode({
        's1': 200,
        's2': 'third',
        's3': False,
        's5': 300 * 'A',
        's8': -10,
        's9': True
    })
    #print('a (200, third, False, , 300*A, -10, True): %s' % a._msg.show())
    assert (
        a._msg.__hex__() ==
        'd0200c89812c414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141038100fb00c00'
    )
    b.decode(str(a))
    assert (a._msg.__hex__() == b._msg.__hex__() and a() == b())

    PER.VARIANT = 'A'
    a = inline('''
        A ::= SEQUENCE {
            s1  INTEGER {first(1), second(2)} (1..50, ...),
            s2  ENUMERATED {first, second, third},
            s3  SEQUENCE { s31  BOOLEAN,
                           s32  NULL,
                           s33  BIT STRING (SIZE(56..64)),
                           s34  BOOLEAN DEFAULT FALSE},
            ...,
            s4  NULL OPTIONAL,
            s5  CHOICE { s51  INTEGER (-20..50),
                         s52  BOOLEAN,
                         s53  NULL,
                         s54  BOOLEAN }
            }
    ''')
    b = a.clone()

    a.encode({
        's1': -5000,
        's2': 'third',
        's3': {
            's31': True,
            's32': None,
            's33': (1, 64),
            's34': False
        },
        's4': None,
        's5': ('s52', True)
    })
    #print('a (-5000, third, {True, None, (1, 64), False}, None, (s52, True)): %s' % a._msg.show())
    assert (a._msg.__hex__() == 'c002ec78980000000000000001038001000160')
    b.decode(str(a))
    assert (a._msg.__hex__() == b._msg.__hex__() and a() == b())

    PER.VARIANT = 'U'
    a.encode({
        's1': -5000,
        's2': 'third',
        's3': {
            's31': True,
            's32': None,
            's33': (1, 64),
            's34': False
        },
        's4': None,
        's5': ('s52', True)
    })
    #print('a (-5000, third, {True, None, (1, 64), False}, None, (s52, True)): %s' % a._msg.show())
    assert (a._msg.__hex__() == 'c0bb1e26000000000000000040e020002c0'
            and a._msg.bit_len() == 139)
    b.decode(str(a))
    assert (a._msg.__hex__() == b._msg.__hex__() and a() == b())

    if print_info:
        print('testing SEQUENCE OF encoding / decoding (PER aligned)')
    PER.VARIANT = 'A'
    a = inline('''
        A ::= SEQUENCE (SIZE(2..10, ...)) OF OCTET STRING (SIZE(0..10, ...))
        ''')
    b = a.clone()

    a.encode(['abc', '', 5 * 'a', 11 * 'A', 25 * 'B'])
    #print('a (abc, , 5*a, 11*A, 25*B): %s' % a._msg.show())
    assert (
        a._msg.__hex__() ==
        '18c061626301406161616161800b4141414141414141414141801942424242424242424242424242424242424242424242424242'
    )
    b.decode(str(a))
    assert (a._msg.__hex__() == b._msg.__hex__() and a() == b())
    a.encode([13 * 'XY'])
    #print('a (13*XY): %s' % a._msg.show())
    assert (a._msg.__hex__() ==
            '8001801a5859585958595859585958595859585958595859585958595859')
    b.decode(str(a))
    assert (a._msg.__hex__() == b._msg.__hex__() and a() == b())
    #
    a = inline('''
        A ::= SEQUENCE SIZE(2..10, ...) OF INTEGER (0..300)
        ''')
    b = a.clone()
    a.encode(range(300))
    assert (
        a.__hex__() ==
        '80812c0000000100020003000400050006000700080009000a000b000c000d000e000f0010001100120013001400150016001700180019001a001b001c001d001e001f0020002100220023002400250026002700280029002a002b002c002d002e002f0030003100320033003400350036003700380039003a003b003c003d003e003f0040004100420043004400450046004700480049004a004b004c004d004e004f0050005100520053005400550056005700580059005a005b005c005d005e005f0060006100620063006400650066006700680069006a006b006c006d006e006f0070007100720073007400750076007700780079007a007b007c007d007e007f0080008100820083008400850086008700880089008a008b008c008d008e008f0090009100920093009400950096009700980099009a009b009c009d009e009f00a000a100a200a300a400a500a600a700a800a900aa00ab00ac00ad00ae00af00b000b100b200b300b400b500b600b700b800b900ba00bb00bc00bd00be00bf00c000c100c200c300c400c500c600c700c800c900ca00cb00cc00cd00ce00cf00d000d100d200d300d400d500d600d700d800d900da00db00dc00dd00de00df00e000e100e200e300e400e500e600e700e800e900ea00eb00ec00ed00ee00ef00f000f100f200f300f400f500f600f700f800f900fa00fb00fc00fd00fe00ff0100010101020103010401050106010701080109010a010b010c010d010e010f0110011101120113011401150116011701180119011a011b011c011d011e011f0120012101220123012401250126012701280129012a012b'
    )
    b.decode(str(a))
    assert (a() == b())

    if print_info:
        print('testing SEQUENCE OF encoding / decoding (PER unaligned)')
    PER.VARIANT = 'U'
    a = inline('''
        A ::= SEQUENCE (SIZE(2..10, ...)) OF OCTET STRING (SIZE(0..10, ...))
        ''')
    b = a.clone()

    a.encode(['abc', '', 5 * 'a', 11 * 'A', 25 * 'B'])
    #print('a (abc, , 5*a, 11*A, 25*B): %s' % a._msg.show())
    assert (
        a._msg.__hex__() ==
        '18d85898c05616161616185a0a0a0a0a0a0a0a0a0a0a0c6509090909090909090909090909090909090909090909090908'
        and a._msg.bit_len() == 390)
    b.decode(str(a))
    assert (a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode([13 * 'XY'])
    #print('a (13*XY): %s' % a._msg.show())
    assert (a._msg.__hex__()
            == '80c696165616561656165616561656165616561656165616561656164'
            and a._msg.bit_len() == 226)
    b.decode(str(a))
    assert (a._msg.__bin__() == b._msg.__bin__() and a() == b())

    a = inline('''
        A ::= SEQUENCE SIZE(2..10, ...) OF INTEGER (0..300)
        ''')
    b = a.clone()
    a.encode(range(300))
    assert (
        a.__hex__() ==
        'c0960000202018100a0603820120a058301a0e078402212098502a160b860321a0d8703a1e0f8804222118904a26138a0522a158b05a2e178c06232198d06a361b8e0723a1d8f07a3e1f9008242219108a4623920924a259309a4e27940a25229950aa562b960b25a2d970ba5e2f980c26231990ca66339a0d26a359b0da6e379c0e272399d0ea763b9e0f27a3d9f0fa7e3fa01028241a110a8643a21128a45a311a8e47a41229249a512a964ba61329a4da713a9e4fa8142a251a914aa653aa152aa55ab15aae57ac162b259ad16ab65bae172ba5daf17abe5fb0182c261b118ac663b2192ca65b319ace67b41a2d269b51aad66bb61b2da6db71bade6fb81c2e271b91cae673ba1d2ea75bb1daee77bc1e2f279bd1eaf67bbe1f2fa7dbf1fafe7fc02030281c120b0683c22130a85c321b0e87c42231289c522b168bc62331a8dc723b1e8fc82432291c924b2693ca2532a958'
        and a._msg.bit_len() == 2717)
    b.decode(str(a))
    assert (a() == b())
Ejemplo n.º 6
0
def test_per_choice(print_info=True):

    ASN1.ASN1Obj._SAFE = True
    ASN1.ASN1Obj._RET_STRUCT = True
    ASN1.ASN1Obj.CODEC = PER
    #
    PER._REPR_INT = 'bin'
    PER._REPR_ENUM = 'bin'
    PER._SAFE = True
    #
    PER.VARIANT = 'A'

    if print_info:
        print('testing BIT STRING and CHOICE encoding /decoding (PER aligned)')
    PER.VARIANT = 'A'
    a = inline('''
        A ::= CHOICE {
            a1 BIT STRING (SIZE(4..8)),
            a2 BIT STRING (SIZE(5..10, ...)),
            ...,
            a3 BIT STRING,
            a4 BIT STRING (SIZE(4..8, ...))
            }
        ''')
    b = a.clone()
    #
    a.encode(('a1', (0b111000, 6)))
    #print('a1 (0b111000): %s' % a._msg.show())
    assert (a._msg.__hex__() == '10e0')
    b.decode(str(a))
    assert (a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode(('a2', (0b10101, 5)))
    #print('a2 (0b10101): %s' % a._msg.show())
    assert (a._msg.__hex__() == '40a8')
    b.decode(str(a))
    assert (a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode(('a2', (0b111111111111111111111, 21)))
    #print('a2 (0x1fffff): %s' % a._msg.show())
    assert (a._msg.__hex__() == '6015fffff8')
    b.decode(str(a))
    assert (a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode(('a3', (1, 1)))
    #print('a3 (0b1): %s' % a._msg.show())
    assert (a._msg.__hex__() == '80020180')
    b.decode(str(a))
    assert (a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode(('a3', (0x617a6572747975696f70617a6572747975696f70, 160)))
    #print('a3 (azertyuiopazertyuiop): %s' % a._msg.show())
    assert (
        a._msg.__hex__() == '801680a0617a6572747975696f70617a6572747975696f70')
    b.decode(str(a))
    assert (a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode(('a4', (0, 0)))
    #print('a4 (0): %s' % a._msg.show())
    assert (a._msg.__hex__() == '81028000')
    b.decode(str(a))
    assert (a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode(('a4', (
        0x4141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141,
        4000)))
    #print('a5 (500*"A"): %s' % a._msg.show())
    assert (
        str(a) ==
        '\x81\x81\xf7\x80\x8f\xa0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
    )
    b.decode(str(a))
    assert (a._msg.__bin__() == b._msg.__bin__() and a() == b())

    if print_info:
        print(
            'testing BIT STRING and CHOICE encoding / decoding (PER unaligned)'
        )
    PER.VARIANT = 'U'
    #
    a.encode(('a1', (0b111000, 6)))
    #print('a1 (0b111000): %s' % a._msg.show())
    assert (a._msg.__bin__() == '00010111000')
    b.decode(str(a))
    assert (a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode(('a2', (0b10101, 5)))
    #print('a2 (0b10101): %s' % a._msg.show())
    assert (a._msg.__bin__() == '01000010101')
    b.decode(str(a))
    assert (a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode(('a2', (0b111111111111111111111, 21)))
    #print('a2 (0x1fffff): %s' % a._msg.show())
    assert (a._msg.__bin__() == '01100010101111111111111111111111')
    b.decode(str(a))
    assert (a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode(('a3', (1, 1)))
    #print('a3 (0b1): %s' % a._msg.show())
    assert (a._msg.__bin__() == '10000000000000100000000110000000')
    b.decode(str(a))
    assert (a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode(('a3', (0x617a6572747975696f70617a6572747975696f70, 160)))
    #print('a3 (azertyuiopazertyuiop): %s' % a._msg.show())
    assert (
        a._msg.__hex__() == '801680a0617a6572747975696f70617a6572747975696f70')
    b.decode(str(a))
    assert (a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode(('a4', (0, 0)))
    #print('a4 (0): %s' % a._msg.show())
    assert (a.__bin__() == '10000001000000101000000000000000')
    b.decode(str(a))
    assert (a._msg.__bin__() == b._msg.__bin__() and a() == b())
    a.encode(('a4', (
        0x4141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141,
        4000)))
    #print('a5 (500*"A"): %s' % a._msg.show())
    assert (
        a.__hex__() ==
        '8181f7c7d020a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a080'
    )
    b.decode(str(a))
    assert (a._msg.__bin__() == b._msg.__bin__() and a() == b())
Ejemplo n.º 7
0
def test_def(print_info=True):

    ASN1.ASN1Obj._SAFE = True
    ASN1.ASN1Obj._RET_STRUCT = True

    MODULE_OPT.TAG = TAG_AUTO

    if print_info: print('testing NULL definition')
    A = ASN1.ASN1Obj(name='A', type=TYPE_NULL)
    A.set_val(None)

    if print_info: print('testing BOOLEAN definition')
    A = ASN1.ASN1Obj(name='A', type=TYPE_BOOL)
    A.set_val(False)
    A.set_val(True)

    if print_info: print('testing INTEGER definition')
    A = ASN1.ASN1Obj(name='A', type=TYPE_INTEGER)
    A.set_val(0)
    A.set_val(-999999999999999999999999999)
    A.set_val(111999999999999999999999999999111)

    if print_info: print('testing ENUMERATED definition')
    A = ASN1.ASN1Obj(name='A', type=TYPE_ENUM)
    A._cont = OD([('un', 1), ('deux', 2), ('trois', 3)])
    A.set_val('un')  # parce qu'un tien vaut mieux que deux tu l'auras

    if print_info: print('testing BIT STRING definition')
    A = ASN1.ASN1Obj(name='A', type=TYPE_BIT_STR)
    A.set_val((0b11001100111000, 16))
    A.parse_value("'0011001100111000'B")
    A.parse_value("'3338'H")

    if print_info: print('testing OCTET STRING definition')
    A = ASN1.ASN1Obj(name='A', type=TYPE_OCTET_STR)
    A.set_val('la grande truite')
    A.parse_value("'11001100111000'B")
    A.parse_value("'3338'H")

    if print_info: print('testing CHOICE definition')
    A = inline('''
        A ::= CHOICE {
            a1 BOOLEAN,
            a2 INTEGER (0..20),
            a3 NULL,
            a4 INTEGER(MIN..100, ...),
            ...,
            a5 BIT STRING (SIZE(0..80))
            }''')
    A.set_val(('a1', True))
    A.set_val(('a2', 12))
    A.set_val(('a3', None))
    A.set_val(('a4', -50000000))
    A.set_val(('a5', (1000000000000000000001, 70)))

    A = inline('''
        A ::= CHOICE {
            c1  INTEGER {first(1), second(2)} (1..50, ...),
            c2  ENUMERATED {first, second, third, ..., fourth},
            c3  BIT STRING {first-bit(1), second-bit(2)} (SIZE(8..16, ...)),
            c4  OCTET STRING (SIZE(10..20)),
            c5  CHOICE { c51  INTEGER (-20..50),
                         c52  BOOLEAN,
                         c53  NULL,
                         c54  BOOLEAN },
            ...,
            c6  OBJECT IDENTIFIER,
            c7  BOOLEAN
            }
    ''')
    A.set_val(('c1', 500))
    A.set_val(('c2', 'fourth'))
    A.set_val(('c3', (0b10100000, 12)))
    A.set_val(('c4', 'abcdefghijklmn'))
    A.set_val(('c5', ('c54', True)))
    A.set_val(('c6', (1, 2, 3)))
    A.set_val(('c7', False))

    if print_info: print('testing SEQUENCE definition')
    A = inline('''
        A ::= SEQUENCE {
            s1  INTEGER {first(1), second(2)} (1..50, ...),
            s2  ENUMERATED {first, second, third},
            s3  SEQUENCE { s31  BOOLEAN,
                           s32  NULL,
                           s33  BIT STRING (SIZE(56..64)),
                           s34  BOOLEAN DEFAULT FALSE},
            ...,
            s4  NULL OPTIONAL,
            s5  CHOICE { s51  INTEGER (-20..50),
                         s52  BOOLEAN,
                         s53  NULL,
                         s54  BOOLEAN }
            }
    ''')
    A.set_val({
        's1': 50,
        's2': 'third',
        's3': {
            's31': True,
            's32': None,
            's33': (1, 64)
        }
    })
    A.set_val({
        's1': -5000,
        's2': 'third',
        's3': {
            's31': True,
            's32': None,
            's33': (1, 64),
            's34': False
        },
        's4': None,
        's5': ('s52', True)
    })

    if print_info: print('testing SEQUENCE OF definition')
    A = inline('''
        A ::= SEQUENCE (SIZE(1..5, ...)) OF INTEGER (0..MAX)
        ''')
    A.set_val([1, 2, 5, 41, 566321564])
    A = inline('''
        A ::= SEQUENCE (SIZE(1..3, ...)) OF OCTET STRING (SIZE(0..10, ...))
        ''')
    A.set_val(['a', 'abcdef', 'abcdef' * 50])

    if print_info: print('testing CLASS definition')
    C3 = inline('''
        C3 ::= INTEGER
        ''')
    C3.set_val(230000)
    A = inline('''
        A ::= CLASS {
            &c1 INTEGER UNIQUE,
            &c2 ENUMERATED {first},
            &C3,
            &c4 INTEGER } WITH SYNTAX {
            IDENT &c1 PLACE &c2 TYPE &C3 VALUE &c4 }
        ''')
    A.set_val({'c1': 10, 'c2': 'first', 'C3': ('C3', 23000), 'c4': 1})
Ejemplo n.º 8
0
def test_per_integer(print_info=True):

    ASN1.ASN1Obj._SAFE = True
    ASN1.ASN1Obj._RET_STRUCT = True
    ASN1.ASN1Obj.CODEC = PER
    #
    PER._REPR_INT = 'bin'
    PER._REPR_ENUM = 'bin'
    #
    PER.VARIANT = 'A'
    PER._SAFE = True

    if print_info:
        print('testing unconstrained INTEGER encoding / decoding (PER)')
    i1 = inline('I1 ::= INTEGER')
    i1.encode(4096)
    #print('i1:\n%s' % i1._msg.show())
    assert (str(i1) == '\x02\x10\x00')
    i1d = inline('I1D ::= INTEGER')
    buf = i1d.decode(str(i1))
    assert (str(i1d) == str(i1) and i1d() == i1())

    i2 = inline('I2 ::= INTEGER (MIN..65535)')
    i2.encode(127)
    #print('i2:\n%s' % i2._msg.show())
    assert (str(i2) == '\x01\x7f')
    i2d = inline('I2D ::= INTEGER (MIN..65535)')
    buf = i2d.decode(str(i2))
    assert (str(i2d) == str(i2) and i2d() == i2())

    i3 = inline('I3 ::= INTEGER (MIN..65535)')
    i3.encode(-128)
    #print('i3:\n%s' % i3._msg.show())
    assert (str(i3) == '\x01\x80')
    i3d = inline('I3D ::= INTEGER (MIN..65535)')
    buf = i3d.decode(str(i3))
    assert (str(i3d) == str(i3) and i3d() == i3())

    i4 = inline('I4 ::= INTEGER (MIN..65535)')
    i4.encode(128)
    #print('i4:\n%s' % i4._msg.show())
    assert (str(i4) == '\x02\x00\x80')
    i4d = inline('I4D ::= INTEGER (MIN..65535)')
    buf = i4d.decode(str(i4))
    assert (str(i4d) == str(i4) and i4d() == i4())
    #return i1, i2, i3, i4

    if print_info:
        print('testing semi-constrained INTEGER encoding / decoding (PER)')
    i5 = inline('I5 ::= INTEGER (-1..MAX)')
    i5.encode(4096)
    #print('i5: %s' % i5._msg.show())
    assert (str(i5) == '\x02\x10\x01')
    i5d = inline('I5D ::= INTEGER (-1..MAX)')
    buf = i5d.decode(str(i5))
    assert (str(i5d) == str(i5) and i5d() == i5())

    i6 = inline('I6 ::= INTEGER (1..MAX)')
    i6.encode(127)
    #print('i6: %s' % i6._msg.show())
    assert (str(i6) == '\x01~')
    i6d = inline('I6D ::= INTEGER (1..MAX)')
    buf = i6d.decode(str(i6))
    assert (str(i6d) == str(i6) and i6d() == i6())

    i7 = inline('I7 ::= INTEGER (0..MAX)')
    i7.encode(128)
    #print('i7: %s' % i7._msg.show())
    assert (str(i7) == '\x01\x80')
    i7d = inline('I7D ::= INTEGER (0..MAX)')
    buf = i7d.decode(str(i7))
    assert (str(i7d) == str(i7) and i7d() == i7())
    #return i1, i2, i3, i4, i5, i6, i7

    if print_info:
        print(
            'testing constrained INTEGER encoding / decoding (PER aligned / unaligned)'
        )
    i8 = inline('I8 ::= INTEGER(3..6)')
    i8.encode(3)
    assert (i8._msg.__bin__() == '00')
    i8d = inline('I8D ::= INTEGER(3..6)')
    buf = i8d.decode(str(i8))
    assert (str(i8d) == str(i8) and i8d() == i8())
    i8.encode(4)
    assert (i8._msg.__bin__() == '01')
    buf = i8d.decode(str(i8))
    assert (str(i8d) == str(i8) and i8d() == i8())
    i8.encode(5)
    assert (i8._msg.__bin__() == '10')
    buf = i8d.decode(str(i8))
    assert (str(i8d) == str(i8) and i8d() == i8())
    i8.encode(6)
    assert (i8._msg.__bin__() == '11')
    buf = i8d.decode(str(i8))
    assert (str(i8d) == str(i8) and i8d() == i8())
    #print('i8 (6): %s' % i8._msg.show())

    i9 = inline('I9 ::= INTEGER (4000..4254)')
    i9.encode(4002)
    assert (str(i9) == '\x02')
    i9d = inline('I9D ::= INTEGER (4000..4254)')
    buf = i9d.decode(str(i9))
    assert (str(i9d) == str(i9) and i9d() == i9())
    i9.encode(4006)
    assert (str(i9) == '\x06')
    buf = i9d.decode(str(i9))
    assert (str(i9d) == str(i9) and i9d() == i9())
    #print('i9 (4006): %s' % i9._msg.show())

    i10 = inline('I10 ::= INTEGER (4000..4255)')
    i10.encode(4002)
    assert (str(i10) == '\x02')
    i10d = inline('I10D ::= INTEGER (4000..4255)')
    buf = i10d.decode(str(i10))
    assert (str(i10d) == str(i10) and i10d() == i10())
    i10.encode(4006)
    assert (str(i10) == '\x06')
    buf = i10d.decode(str(i10))
    assert (str(i10d) == str(i10) and i10d() == i10())
    #print('i10 (4006): %s' % i10._msg.show())

    i11 = inline('I11 ::= INTEGER (0..32000)')
    i11.encode(0)
    assert (str(i11) == '\0\0')
    i11d = inline('I11D ::= INTEGER (0..32000)')
    buf = i11d.decode(str(i11))
    assert (str(i11d) == str(i11) and i11d() == i11())
    i11.encode(31000)
    assert (str(i11) == '\x79\x18')
    buf = i11d.decode(str(i11))
    assert (str(i11d) == str(i11) and i11d() == i11())
    #print('i11 (31000): %s' % i11._msg.show())

    i12 = inline('I12 ::= INTEGER (1..65538)')
    i12.encode(1)
    assert (str(i12) == '\0\0')
    i12d = inline('I12D ::= INTEGER (1..65538)')
    buf = i12d.decode(str(i12))
    assert (str(i12d) == str(i12) and i12d() == i12())
    i12.encode(257)
    assert (str(i12) == '@\x01\x00')
    buf = i12d.decode(str(i12))
    assert (str(i12d) == str(i12) and i12d() == i12())
    i12.encode(65538)
    assert (str(i12) == '\x80\x01\x00\x01')
    buf = i12d.decode(str(i12))
    assert (str(i12d) == str(i12) and i12d() == i12())
    #print('i12 (65538 - aligned): %s' % i12._msg.show())

    PER.VARIANT = 'U'
    i12.encode(1)
    assert (i12._msg.__bin__() == '00000000000000000')
    buf = i12d.decode(str(i12))
    assert (i12d() == i12())
    i12.encode(257)
    assert (i12._msg.__bin__() == '00000000100000000')
    buf = i12d.decode(str(i12))
    assert (i12d() == i12())
    i12.encode(65538)
    assert (i12._msg.__bin__() == '10000000000000001')
    buf = i12d.decode(str(i12))
    assert (i12d() == i12())
    #print('i12 (65538 - unaligned): %s' % i12._msg.show())
    #return i8, i9, i10, i11, i12

    PER.VARIANT = 'A'
    if print_info:
        print(
            'testing extended INTEGER encoding / decoding (PER aligned / unaligned)'
        )
    i13 = inline('I13 ::= INTEGER(MIN..65535, ...)')
    i13.encode(127)
    assert (str(i13) == '\x00\x01\x7f')
    i13d = inline('I13D ::= INTEGER(MIN..65535, ...)')
    buf = i13d.decode(str(i13))
    assert (str(i13d) == str(i13) and i13d() == i13())
    i13.encode(65536)
    assert (str(i13) == '\x80\x03\x01\x00\x00')
    buf = i13d.decode(str(i13))
    assert (str(i13d) == str(i13) and i13d() == i13())
    #print('i13 (65536): %s' % i13._msg.show())

    i14 = inline('I14 ::= INTEGER (-1..MAX, ...)')
    i14.encode(4096)
    assert (str(i14) == '\x00\x02\x10\x01')
    i14d = inline('I14D ::= INTEGER (-1..MAX, ...)')
    buf = i14d.decode(str(i14))
    assert (str(i14d) == str(i14) and i14d() == i14())
    i14.encode(-8)
    assert (str(i14) == '\x80\x01\xf8')
    buf = i14d.decode(str(i14))
    assert (str(i14d) == str(i14) and i14d() == i14())
    #print('i14 (-8): %s' % i14._msg.show())

    i15 = inline('I15 ::= INTEGER (3..6, ...)')
    i15.encode(4)
    assert (i15._msg.__bin__() == '001')
    i15d = inline('I15D ::= INTEGER (3..6, ...)')
    buf = i15d.decode(str(i15))
    assert (str(i15d) == str(i15) and i15d() == i15())
    i15.encode(8)
    assert (str(i15) == '\x80\x01\x08')
    buf = i15d.decode(str(i15))
    assert (str(i15d) == str(i15) and i15d() == i15())
    #print('i15 (8): %s' % i15._msg.show())

    i16 = inline('I16 ::= INTEGER (1..65538, ...)')
    i16.encode(257)
    assert (str(i16) == ' \x01\x00')
    i16d = inline('I16D ::= INTEGER (1..65538, ...)')
    buf = i16d.decode(str(i16))
    assert (str(i16d) == str(i16) and i16d() == i16())
    i16.encode(65539)
    assert (str(i16) == '\x80\x03\x01\x00\x03')
    buf = i16d.decode(str(i16))
    assert (str(i16d) == str(i16) and i16d() == i16())
    #print('i16 (65539 - aligned): %s' % i16._msg.show())
    #
    PER.VARIANT = 'U'
    i16.encode(257)
    assert (i16._msg.__bin__() == '000000000100000000')
    buf = i16d.decode(str(i16))
    assert (i16d() == i16())
    i16.encode(65539)
    assert (i16._msg.__bin__() == '100000011000000010000000000000011')
    buf = i16d.decode(str(i16))
    assert (i16d() == i16())
    #print('i16 (65539 - unaligned): %s' % i16._msg.show())
    #return i13, i14, i15, i16

    PER.VARIANT = 'A'