pyasn1.type.univ.Choice.getName()   A
last analyzed

Complexity

Conditions 4

Size

Total Lines 9
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 8
nop 2
dl 0
loc 9
rs 10
c 0
b 0
f 0
1
# ASN.1 "universal" data types
2
import operator, sys
3
from pyasn1.type import base, tag, constraint, namedtype, namedval, tagmap
4
from pyasn1.codec.ber import eoo
5
from pyasn1.compat import octets
6
from pyasn1 import error
7
8
# "Simple" ASN.1 types (yet incomplete)
9
10
class Integer(base.AbstractSimpleAsn1Item):
11
    tagSet = baseTagSet = tag.initTagSet(
12
        tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 0x02)
13
        )
14
    namedValues = namedval.NamedValues()
15
    def __init__(self, value=None, tagSet=None, subtypeSpec=None,
16
                 namedValues=None):
17
        if namedValues is None:
18
            self.__namedValues = self.namedValues
19
        else:
20
            self.__namedValues = namedValues
21
        base.AbstractSimpleAsn1Item.__init__(
22
            self, value, tagSet, subtypeSpec
23
            )
24
25
    def __and__(self, value): return self.clone(self._value & value)
26
    def __rand__(self, value): return self.clone(value & self._value)
27
    def __or__(self, value): return self.clone(self._value | value)
28
    def __ror__(self, value): return self.clone(value | self._value)
29
    def __xor__(self, value): return self.clone(self._value ^ value)
30
    def __rxor__(self, value): return self.clone(value ^ self._value)
31
    def __lshift__(self, value): return self.clone(self._value << value)
32
    def __rshift__(self, value): return self.clone(self._value >> value)
33
34
    def __add__(self, value): return self.clone(self._value + value)
35
    def __radd__(self, value): return self.clone(value + self._value)
36
    def __sub__(self, value): return self.clone(self._value - value)
37
    def __rsub__(self, value): return self.clone(value - self._value)
38
    def __mul__(self, value): return self.clone(self._value * value)
39
    def __rmul__(self, value): return self.clone(value * self._value)
40
    def __mod__(self, value): return self.clone(self._value % value)
41
    def __rmod__(self, value): return self.clone(value % self._value)
42
    def __pow__(self, value, modulo=None): return self.clone(pow(self._value, value, modulo))
43
    def __rpow__(self, value): return self.clone(pow(value, self._value))
44
45
    if sys.version_info[0] <= 2:
46
        def __div__(self, value):  return self.clone(self._value // value)
47
        def __rdiv__(self, value):  return self.clone(value // self._value)
48
    else:
49
        def __truediv__(self, value):  return self.clone(self._value / value)
50
        def __rtruediv__(self, value):  return self.clone(value / self._value)
51
        def __divmod__(self, value):  return self.clone(self._value // value)
52
        def __rdivmod__(self, value):  return self.clone(value // self._value)
53
54
        __hash__ = base.AbstractSimpleAsn1Item.__hash__
55
56
    def __int__(self): return int(self._value)
57
    def __long__(self): return int(self._value)
58
    def __float__(self): return float(self._value)
59
    def __abs__(self): return abs(self._value)
60
    def __index__(self): return int(self._value)
61
62
    def __lt__(self, value): return self._value < value
63
    def __le__(self, value): return self._value <= value
64
    def __eq__(self, value): return self._value == value
65
    def __ne__(self, value): return self._value != value
66
    def __gt__(self, value): return self._value > value
67
    def __ge__(self, value): return self._value >= value
68
69
    def prettyIn(self, value):
70
        if not isinstance(value, str):
71
            return int(value)
72
        r = self.__namedValues.getValue(value)
73
        if r is not None:
74
            return r
75
        try:
76
            return int(value)
77
        except ValueError:
78
            raise error.PyAsn1Error(
79
                'Can\'t coerce %s into integer: %s' % (value, sys.exc_info()[1])
80
                )
81
82
    def prettyOut(self, value):
83
        r = self.__namedValues.getName(value)
84
        if r is not None:
85
            return '%s(%s)' % (r, value)
86
        else:
87
            return str(value)
88
89
    def getNamedValues(self): return self.__namedValues
90
91 View Code Duplication
    def clone(self, value=None, tagSet=None, subtypeSpec=None,
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
92
              namedValues=None):
93
        if value is None and tagSet is None and subtypeSpec is None \
94
               and namedValues is None:
95
            return self
96
        if value is None:
97
            value = self._value
98
        if tagSet is None:
99
            tagSet = self._tagSet
100
        if subtypeSpec is None:
101
            subtypeSpec = self._subtypeSpec
102
        if namedValues is None:
103
            namedValues = self.__namedValues
104
        return self.__class__(value, tagSet, subtypeSpec, namedValues)
105
106 View Code Duplication
    def subtype(self, value=None, implicitTag=None, explicitTag=None,
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
107
                subtypeSpec=None, namedValues=None):
108
        if value is None:
109
            value = self._value
110
        if implicitTag is not None:
111
            tagSet = self._tagSet.tagImplicitly(implicitTag)
112
        elif explicitTag is not None:
113
            tagSet = self._tagSet.tagExplicitly(explicitTag)
114
        else:
115
            tagSet = self._tagSet
116
        if subtypeSpec is None:
117
            subtypeSpec = self._subtypeSpec
118
        else:
119
            subtypeSpec = subtypeSpec + self._subtypeSpec
120
        if namedValues is None:
121
            namedValues = self.__namedValues
122
        else:
123
            namedValues = namedValues + self.__namedValues
124
        return self.__class__(value, tagSet, subtypeSpec, namedValues)
125
126
class Boolean(Integer):
127
    tagSet = baseTagSet = tag.initTagSet(
128
        tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 0x01),
129
        )
130
    subtypeSpec = Integer.subtypeSpec+constraint.SingleValueConstraint(0,1)
131
    namedValues = Integer.namedValues.clone(('False', 0), ('True', 1))
132
133
class BitString(base.AbstractSimpleAsn1Item):
134
    tagSet = baseTagSet = tag.initTagSet(
135
        tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 0x03)
136
        )
137
    namedValues = namedval.NamedValues()
138
    def __init__(self, value=None, tagSet=None, subtypeSpec=None,
139
                 namedValues=None):
140
        if namedValues is None:
141
            self.__namedValues = self.namedValues
142
        else:
143
            self.__namedValues = namedValues
144
        base.AbstractSimpleAsn1Item.__init__(
145
            self, value, tagSet, subtypeSpec
146
            )
147
148 View Code Duplication
    def clone(self, value=None, tagSet=None, subtypeSpec=None,
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
149
              namedValues=None):
150
        if value is None and tagSet is None and subtypeSpec is None \
151
               and namedValues is None:
152
            return self
153
        if value is None:
154
            value = self._value
155
        if tagSet is None:
156
            tagSet = self._tagSet
157
        if subtypeSpec is None:
158
            subtypeSpec = self._subtypeSpec
159
        if namedValues is None:
160
            namedValues = self.__namedValues
161
        return self.__class__(value, tagSet, subtypeSpec, namedValues)
162
163 View Code Duplication
    def subtype(self, value=None, implicitTag=None, explicitTag=None,
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
164
                subtypeSpec=None, namedValues=None):
165
        if value is None:
166
            value = self._value
167
        if implicitTag is not None:
168
            tagSet = self._tagSet.tagImplicitly(implicitTag)
169
        elif explicitTag is not None:
170
            tagSet = self._tagSet.tagExplicitly(explicitTag)
171
        else:
172
            tagSet = self._tagSet
173
        if subtypeSpec is None:
174
            subtypeSpec = self._subtypeSpec
175
        else:
176
            subtypeSpec = subtypeSpec + self._subtypeSpec
177
        if namedValues is None:
178
            namedValues = self.__namedValues
179
        else:
180
            namedValues = namedValues + self.__namedValues
181
        return self.__class__(value, tagSet, subtypeSpec, namedValues)
182
183
    def __str__(self): return str(tuple(self))
184
185
    # Immutable sequence object protocol
186
187
    def __len__(self):
188
        if self._len is None:
189
            self._len = len(self._value)
190
        return self._len
191
    def __getitem__(self, i):
192
        if isinstance(i, slice):
193
            return self.clone(operator.getitem(self._value, i))
194
        else:
195
            return self._value[i]
196
197
    def __add__(self, value): return self.clone(self._value + value)
198
    def __radd__(self, value): return self.clone(value + self._value)
199
    def __mul__(self, value): return self.clone(self._value * value)
200
    def __rmul__(self, value): return self * value
201
202
    def prettyIn(self, value):
203
        r = []
204
        if not value:
205
            return ()
206
        elif isinstance(value, str):
207
            if value[0] == '\'':
208
                if value[-2:] == '\'B':
209
                    for v in value[1:-2]:
210
                        if v == '0':
211
                            r.append(0)
212
                        elif v == '1':
213
                            r.append(1)
214
                        else:
215
                            raise error.PyAsn1Error(
216
                                'Non-binary BIT STRING initializer %s' % (v,)
217
                                )
218
                    return tuple(r)
219
                elif value[-2:] == '\'H':
220
                    for v in value[1:-2]:
221
                        i = 4
222
                        v = int(v, 16)
223
                        while i:
224
                            i = i - 1
225
                            r.append((v>>i)&0x01)
226
                    return tuple(r)
227
                else:
228
                    raise error.PyAsn1Error(
229
                        'Bad BIT STRING value notation %s' % value
230
                        )
231
            else:
232
                for i in value.split(','):
233
                    j = self.__namedValues.getValue(i)
234
                    if j is None:
235
                        raise error.PyAsn1Error(
236
                            'Unknown bit identifier \'%s\'' % i
237
                            )
238
                    if j >= len(r):
239
                        r.extend([0]*(j-len(r)+1))
240
                    r[j] = 1
241
                return tuple(r)
242
        elif isinstance(value, (tuple, list)):
243
            r = tuple(value)
244
            for b in r:
245
                if b and b != 1:
246
                    raise error.PyAsn1Error(
247
                        'Non-binary BitString initializer \'%s\'' % (r,)
248
                        )
249
            return r
250
        elif isinstance(value, BitString):
251
            return tuple(value)
252
        else:
253
            raise error.PyAsn1Error(
254
                'Bad BitString initializer type \'%s\'' % (value,)
255
                )
256
257
    def prettyOut(self, value):
258
        return '\"\'%s\'B\"' % ''.join([str(x) for x in value])
259
260
class OctetString(base.AbstractSimpleAsn1Item):
261
    tagSet = baseTagSet = tag.initTagSet(
262
        tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 0x04)
263
        )
264
    defaultBinValue = defaultHexValue = base.noValue
265
    encoding = 'us-ascii'
266
    def __init__(self, value=None, tagSet=None, subtypeSpec=None,
267
                 encoding=None, binValue=None, hexValue=None):
268
        if encoding is None:
269
            self._encoding = self.encoding
270
        else:
271
            self._encoding = encoding
272
        if binValue is not None:
273
            value = self.fromBinaryString(binValue)
274
        if hexValue is not None:
275
            value = self.fromHexString(hexValue)
276
        if value is None or value is base.noValue:
277
            value = self.defaultHexValue
278
        if value is None or value is base.noValue:
279
            value = self.defaultBinValue
280
        self.__intValue = None
281
        base.AbstractSimpleAsn1Item.__init__(self, value, tagSet, subtypeSpec)
282
283
    def clone(self, value=None, tagSet=None, subtypeSpec=None,
284
              encoding=None, binValue=None, hexValue=None):
285
        if value is None and tagSet is None and subtypeSpec is None and \
286
               encoding is None and binValue is None and hexValue is None:
287
            return self
288
        if value is None and binValue is None and hexValue is None:
289
            value = self._value
290
        if tagSet is None:
291
            tagSet = self._tagSet
292
        if subtypeSpec is None:
293
            subtypeSpec = self._subtypeSpec
294
        if encoding is None:
295
            encoding = self._encoding
296
        return self.__class__(
297
            value, tagSet, subtypeSpec, encoding, binValue, hexValue
298
            )
299
300
    if sys.version_info[0] <= 2:
301
        def prettyIn(self, value):
302
            if isinstance(value, str):
303
                return value
304
            elif isinstance(value, (tuple, list)):
305
                try:
306
                    return ''.join([ chr(x) for x in value ])
307
                except ValueError:
308
                    raise error.PyAsn1Error(
309
                        'Bad OctetString initializer \'%s\'' % (value,)
310
                        )
311
            else:
312
                return str(value)
313
    else:
314
        def prettyIn(self, value):
315
            if isinstance(value, bytes):
316
                return value
317
            elif isinstance(value, OctetString):
318
                return value.asOctets()
319
            elif isinstance(value, (tuple, list, map)):
320
                try:
321
                    return bytes(value)
322
                except ValueError:
323
                    raise error.PyAsn1Error(
324
                        'Bad OctetString initializer \'%s\'' % (value,)
325
                        )
326
            else:
327
                try:
328
                    return str(value).encode(self._encoding)
329
                except UnicodeEncodeError:
330
                    raise error.PyAsn1Error(
331
                        'Can\'t encode string \'%s\' with \'%s\' codec' % (value, self._encoding)
332
                        )
333
334
335
    def fromBinaryString(self, value):
336
        bitNo = 8; byte = 0; r = ()
337
        for v in value:
338
            if bitNo:
339
                bitNo = bitNo - 1
340
            else:
341
                bitNo = 7
342
                r = r + (byte,)
343
                byte = 0
344
            if v == '0':
345
                v = 0
346
            elif v == '1':
347
                v = 1
348
            else:
349
                raise error.PyAsn1Error(
350
                    'Non-binary OCTET STRING initializer %s' % (v,)
351
                    )
352
            byte = byte | (v << bitNo)
353
        return octets.ints2octs(r + (byte,))
354
355
    def fromHexString(self, value):
356
        r = p = ()
357
        for v in value:
358
            if p:
359
                r = r + (int(p+v, 16),)
360
                p = ()
361
            else:
362
                p = v
363
        if p:
364
            r = r + (int(p+'0', 16),)
365
        return octets.ints2octs(r)
366
367
    def prettyOut(self, value):
368
        if sys.version_info[0] <= 2:
369
            numbers = tuple([ ord(x) for x in value ])
370
        else:
371
            numbers = tuple(value)
372
        if [ x for x in numbers if x < 32 or x > 126 ]:
373
            return '0x' + ''.join([ '%x' % x for x in numbers ])
374
        else:
375
            return str(value)
376
377
    def __repr__(self):
378
        if self._value is base.noValue:
379
            return self.__class__.__name__ + '()'
380
        if [ x for x in self.asNumbers() if x < 32 or x > 126 ]:
381
            return self.__class__.__name__ + '(hexValue=\'' + ''.join([ '%x' % x for x in self.asNumbers() ])+'\')'
382
        else:
383
            return self.__class__.__name__ + '(' + self.prettyOut(self._value) + ')'
384
385
    if sys.version_info[0] <= 2:
386
        def __str__(self): return self._value
387
        def __unicode__(self):
388
            return self._value.decode(self._encoding, 'ignore')
389
        def asOctets(self): return self._value
390
        def asNumbers(self):
391
            if self.__intValue is None:
392
                self.__intValue = tuple([ ord(x) for x in self._value ])
393
            return self.__intValue
394
    else:
395
        def __str__(self): return self._value.decode(self._encoding, 'ignore')
396
        def __bytes__(self): return self._value
397
        def asOctets(self): return self._value
398
        def asNumbers(self):
399
            if self.__intValue is None:
400
                self.__intValue = tuple(self._value)
401
            return self.__intValue
402
403
    # Immutable sequence object protocol
404
405
    def __len__(self):
406
        if self._len is None:
407
            self._len = len(self._value)
408
        return self._len
409
    def __getitem__(self, i):
410
        if isinstance(i, slice):
411
            return self.clone(operator.getitem(self._value, i))
412
        else:
413
            return self._value[i]
414
415
    def __add__(self, value): return self.clone(self._value + self.prettyIn(value))
416
    def __radd__(self, value): return self.clone(self.prettyIn(value) + self._value)
417
    def __mul__(self, value): return self.clone(self._value * value)
418
    def __rmul__(self, value): return self * value
419
420
class Null(OctetString):
421
    defaultValue = ''.encode()  # This is tightly constrained
422
    tagSet = baseTagSet = tag.initTagSet(
423
        tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 0x05)
424
        )
425
    subtypeSpec = OctetString.subtypeSpec+constraint.SingleValueConstraint(''.encode())
426
427
if sys.version_info[0] <= 2:
428
    intTypes = (int, long)
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable long does not seem to be defined.
Loading history...
429
else:
430
    intTypes = int
431
432
class ObjectIdentifier(base.AbstractSimpleAsn1Item):
433
    tagSet = baseTagSet = tag.initTagSet(
434
        tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 0x06)
435
        )
436
    def __add__(self, other): return self.clone(self._value + other)
437
    def __radd__(self, other): return self.clone(other + self._value)
438
439
    def asTuple(self): return self._value
440
441
    # Sequence object protocol
442
443
    def __len__(self):
444
        if self._len is None:
445
            self._len = len(self._value)
446
        return self._len
447
    def __getitem__(self, i):
448
        if isinstance(i, slice):
449
            return self.clone(
450
                operator.getitem(self._value, i)
451
                )
452
        else:
453
            return self._value[i]
454
455
    def index(self, suboid): return self._value.index(suboid)
456
457
    def isPrefixOf(self, value):
458
        """Returns true if argument OID resides deeper in the OID tree"""
459
        l = len(self)
460
        if l <= len(value):
461
            if self._value[:l] == value[:l]:
462
                return 1
463
        return 0
464
465
    def prettyIn(self, value):
466
        """Dotted -> tuple of numerics OID converter"""
467
        if isinstance(value, tuple):
468
            pass
469
        elif isinstance(value, ObjectIdentifier):
470
            return tuple(value)
471
        elif isinstance(value, str):
472
            r = []
473
            for element in [ x for x in value.split('.') if x != '' ]:
474
                try:
475
                    r.append(int(element, 0))
476
                except ValueError:
477
                    raise error.PyAsn1Error(
478
                        'Malformed Object ID %s at %s: %s' %
479
                        (str(value), self.__class__.__name__, sys.exc_info()[1])
480
                        )
481
            value = tuple(r)
482
483
            pass
484
        else:
485
            value = tuple(value)
486
487
        for x in value:
488
            if not isinstance(x, intTypes) or x < 0:
489
                raise error.PyAsn1Error(
490
                    'Invalid sub-ID in %s at %s' % (value, self.__class__.__name__)
491
                    )
492
493
        return value
494
495
    def prettyOut(self, value):
496
        r = []
497
        for subOid in value:
498
            r.append(str(subOid))
499
            if r[-1] and r[-1][-1] == 'L':
500
                r[-1][-1] = r[-1][:-1]
501
        return '.'.join(r)
502
503
class Real(base.AbstractSimpleAsn1Item):
504
    try:
505
        _plusInf = float('inf')
506
        _minusInf = float('-inf')
507
        _inf = (_plusInf, _minusInf)
508
    except ValueError:
509
        # Infinity support is platform and Python dependent
510
        _plusInf = _minusInf = None
511
        _inf = ()
512
513
    tagSet = baseTagSet = tag.initTagSet(
514
        tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 0x09)
515
        )
516
517
    def __normalizeBase10(self, value):
518
        m, b, e = value
519
        while m and m % 10 == 0:
520
            m = m / 10
521
            e = e + 1
522
        return m, b, e
523
524
    def prettyIn(self, value):
525
        if isinstance(value, tuple) and len(value) == 3:
526
            for d in value:
527
                if not isinstance(d, intTypes):
528
                    raise error.PyAsn1Error(
529
                        'Lame Real value syntax: %s' % (value,)
530
                        )
531
            if value[1] not in (2, 10):
532
                raise error.PyAsn1Error(
533
                    'Prohibited base for Real value: %s' % value[1]
534
                    )
535
            if value[1] == 10:
536
                value = self.__normalizeBase10(value)
537
            return value
538
        elif isinstance(value, intTypes):
539
            return self.__normalizeBase10((value, 10, 0))
540
        elif isinstance(value, float):
541
            if self._inf and value in self._inf:
542
                return value
543
            else:
544
                e = 0
545
                while int(value) != value:
546
                    value = value * 10
547
                    e = e - 1
548
                return self.__normalizeBase10((int(value), 10, e))
549
        elif isinstance(value, Real):
550
            return tuple(value)
551
        elif isinstance(value, str):  # handle infinite literal
552
            try:
553
                return float(value)
554
            except ValueError:
555
                pass
556
        raise error.PyAsn1Error(
557
            'Bad real value syntax: %s' % (value,)
558
            )
559
560
    def prettyOut(self, value):
561
        if value in self._inf:
562
            return '\'%s\'' % value
563
        else:
564
            return str(value)
565
566
    def isPlusInfinity(self): return self._value == self._plusInf
567
    def isMinusInfinity(self): return self._value == self._minusInf
568
    def isInfinity(self): return self._value in self._inf
569
570
    def __str__(self): return str(float(self))
571
572
    def __add__(self, value): return self.clone(float(self) + value)
573
    def __radd__(self, value): return self + value
574
    def __mul__(self, value): return self.clone(float(self) * value)
575
    def __rmul__(self, value): return self * value
576
    def __sub__(self, value): return self.clone(float(self) - value)
577
    def __rsub__(self, value): return self.clone(value - float(self))
578
    def __mod__(self, value): return self.clone(float(self) % value)
579
    def __rmod__(self, value): return self.clone(value % float(self))
580
    def __pow__(self, value, modulo=None): return self.clone(pow(float(self), value, modulo))
581
    def __rpow__(self, value): return self.clone(pow(value, float(self)))
582
583
    if sys.version_info[0] <= 2:
584
        def __div__(self, value): return self.clone(float(self) / value)
585
        def __rdiv__(self, value): return self.clone(value / float(self))
586
    else:
587
        def __truediv__(self, value): return self.clone(float(self) / value)
588
        def __rtruediv__(self, value): return self.clone(value / float(self))
589
        def __divmod__(self, value): return self.clone(float(self) // value)
590
        def __rdivmod__(self, value): return self.clone(value // float(self))
591
592
    def __int__(self): return int(float(self))
593
    def __long__(self): return int(float(self))
594
    def __float__(self):
595
        if self._value in self._inf:
596
            return self._value
597
        else:
598
            return float(
599
                self._value[0] * pow(self._value[1], self._value[2])
600
                )
601
    def __abs__(self): return abs(float(self))
602
603
    def __lt__(self, value): return float(self) < value
604
    def __le__(self, value): return float(self) <= value
605
    def __eq__(self, value): return float(self) == value
606
    def __ne__(self, value): return float(self) != value
607
    def __gt__(self, value): return float(self) > value
608
    def __ge__(self, value): return float(self) >= value
609
610
    if sys.version_info[0] <= 2:
611
        def __nonzero__(self): return bool(float(self))
612
    else:
613
        def __bool__(self): return bool(float(self))
614
        __hash__ = base.AbstractSimpleAsn1Item.__hash__
615
616
    def __getitem__(self, idx):
617
        if self._value in self._inf:
618
            raise error.PyAsn1Error('Invalid infinite value operation')
619
        else:
620
            return self._value[idx]
621
622
class Enumerated(Integer):
623
    tagSet = baseTagSet = tag.initTagSet(
624
        tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 0x0A)
625
        )
626
627
# "Structured" ASN.1 types
628
629
class SetOf(base.AbstractConstructedAsn1Item):
630
    componentType = None
631
    tagSet = baseTagSet = tag.initTagSet(
632
        tag.Tag(tag.tagClassUniversal, tag.tagFormatConstructed, 0x11)
633
        )
634
    typeId = 1
635
636 View Code Duplication
    def _cloneComponentValues(self, myClone, cloneValueFlag):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
637
        idx = 0; l = len(self._componentValues)
638
        while idx < l:
639
            c = self._componentValues[idx]
640
            if c is not None:
641
                if isinstance(c, base.AbstractConstructedAsn1Item):
642
                    myClone.setComponentByPosition(
643
                        idx, c.clone(cloneValueFlag=cloneValueFlag)
644
                        )
645
                else:
646
                    myClone.setComponentByPosition(idx, c.clone())
647
            idx = idx + 1
648
649
    def _verifyComponent(self, idx, value):
650
        if self._componentType is not None and \
651
               not self._componentType.isSuperTypeOf(value):
652
            raise error.PyAsn1Error('Component type error %s' % value)
653
654
    def getComponentByPosition(self, idx): return self._componentValues[idx]
655
    def setComponentByPosition(self, idx, value=None, verifyConstraints=True):
656
        l = len(self._componentValues)
657
        if idx >= l:
658
            self._componentValues = self._componentValues + (idx-l+1)*[None]
659
        if value is None:
660
            if self._componentValues[idx] is None:
661
                if self._componentType is None:
662
                    raise error.PyAsn1Error('Component type not defined')
663
                self._componentValues[idx] = self._componentType.clone()
664
                self._componentValuesSet = self._componentValuesSet + 1
665
            return self
666
        elif not isinstance(value, base.Asn1Item):
667
            if self._componentType is None:
668
                raise error.PyAsn1Error('Component type not defined')
669
            if isinstance(self._componentType, base.AbstractSimpleAsn1Item):
670
                value = self._componentType.clone(value=value)
671
            else:
672
                raise error.PyAsn1Error('Instance value required')
673
        if verifyConstraints:
674
            if self._componentType is not None:
675
                self._verifyComponent(idx, value)
676
            self._verifySubtypeSpec(value, idx)
677
        if self._componentValues[idx] is None:
678
            self._componentValuesSet = self._componentValuesSet + 1
679
        self._componentValues[idx] = value
680
        return self
681
682
    def getComponentTagMap(self):
683
        if self._componentType is not None:
684
            return self._componentType.getTagMap()
685
686
    def prettyPrint(self, scope=0):
687
        scope = scope + 1
688
        r = self.__class__.__name__ + ':\n'
689
        for idx in range(len(self._componentValues)):
690
            r = r + ' '*scope
691
            if self._componentValues[idx] is None:
692
                r = r + '<empty>'
693
            else:
694
                r = r + self._componentValues[idx].prettyPrint(scope)
695
        return r
696
697
class SequenceOf(SetOf):
698
    tagSet = baseTagSet = tag.initTagSet(
699
        tag.Tag(tag.tagClassUniversal, tag.tagFormatConstructed, 0x10)
700
        )
701
    typeId = 2
702
703
class SequenceAndSetBase(base.AbstractConstructedAsn1Item):
704
    componentType = namedtype.NamedTypes()
705
    def __init__(self, componentType=None, tagSet=None,
706
                 subtypeSpec=None, sizeSpec=None):
707
        base.AbstractConstructedAsn1Item.__init__(
708
            self, componentType, tagSet, subtypeSpec, sizeSpec
709
            )
710
        if self._componentType is None:
711
            self._componentTypeLen = 0
712
        else:
713
            self._componentTypeLen = len(self._componentType)
714
715
    def __getitem__(self, idx):
716
        if isinstance(idx, str):
717
            return self.getComponentByName(idx)
718
        else:
719
            return base.AbstractConstructedAsn1Item.__getitem__(self, idx)
720
721
    def __setitem__(self, idx, value):
722
        if isinstance(idx, str):
723
            self.setComponentByName(idx, value)
724
        else:
725
            base.AbstractConstructedAsn1Item.__setitem__(self, idx, value)
726
727 View Code Duplication
    def _cloneComponentValues(self, myClone, cloneValueFlag):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
728
        idx = 0; l = len(self._componentValues)
729
        while idx < l:
730
            c = self._componentValues[idx]
731
            if c is not None:
732
                if isinstance(c, base.AbstractConstructedAsn1Item):
733
                    myClone.setComponentByPosition(
734
                        idx, c.clone(cloneValueFlag=cloneValueFlag)
735
                        )
736
                else:
737
                    myClone.setComponentByPosition(idx, c.clone())
738
            idx = idx + 1
739
740
    def _verifyComponent(self, idx, value):
741
        if idx >= self._componentTypeLen:
742
            raise error.PyAsn1Error(
743
                'Component type error out of range'
744
                )
745
        t = self._componentType[idx].getType()
746
        if not t.isSuperTypeOf(value):
747
            raise error.PyAsn1Error('Component type error %s vs %s' %
748
                                    (repr(t), repr(value)))
749
750
    def getComponentByName(self, name):
751
        return self.getComponentByPosition(
752
            self._componentType.getPositionByName(name)
753
            )
754
    def setComponentByName(self, name, value=None, verifyConstraints=True):
755
        return self.setComponentByPosition(
756
            self._componentType.getPositionByName(name), value,
757
            verifyConstraints
758
            )
759
760
    def getComponentByPosition(self, idx):
761
        try:
762
            return self._componentValues[idx]
763
        except IndexError:
764
            if idx < self._componentTypeLen:
765
                return
766
            raise
767
    def setComponentByPosition(self, idx, value=None, verifyConstraints=True):
768
        l = len(self._componentValues)
769
        if idx >= l:
770
            self._componentValues = self._componentValues + (idx-l+1)*[None]
771
        if value is None:
772
            if self._componentValues[idx] is None:
773
                self._componentValues[idx] = self._componentType.getTypeByPosition(idx).clone()
774
                self._componentValuesSet = self._componentValuesSet + 1
775
            return self
776
        elif not isinstance(value, base.Asn1Item):
777
            t = self._componentType.getTypeByPosition(idx)
778
            if isinstance(t, base.AbstractSimpleAsn1Item):
779
                value = t.clone(value=value)
780
            else:
781
                raise error.PyAsn1Error('Instance value required')
782
        if verifyConstraints:
783
            if self._componentTypeLen:
784
                self._verifyComponent(idx, value)
785
            self._verifySubtypeSpec(value, idx)
786
        if self._componentValues[idx] is None:
787
            self._componentValuesSet = self._componentValuesSet + 1
788
        self._componentValues[idx] = value
789
        return self
790
791
    def getNameByPosition(self, idx):
792
        if self._componentTypeLen:
793
            return self._componentType.getNameByPosition(idx)
794
795
    def getDefaultComponentByPosition(self, idx):
796
        if self._componentTypeLen and self._componentType[idx].isDefaulted:
797
            return self._componentType[idx].getType()
798
799
    def getComponentType(self):
800
        if self._componentTypeLen:
801
            return self._componentType
802
803
    def setDefaultComponents(self):
804
        if self._componentTypeLen == self._componentValuesSet:
805
            return
806
        idx = self._componentTypeLen
807
        while idx:
808
            idx = idx - 1
809
            if self._componentType[idx].isDefaulted:
810
                if self.getComponentByPosition(idx) is None:
811
                    self.setComponentByPosition(idx)
812
            elif not self._componentType[idx].isOptional:
813
                if self.getComponentByPosition(idx) is None:
814
                    raise error.PyAsn1Error(
815
                        'Uninitialized component #%s at %s' % (idx, repr(self))
816
                        )
817
818
    def prettyPrint(self, scope=0):
819
        scope = scope + 1
820
        r = self.__class__.__name__ + ':\n'
821
        for idx in range(len(self._componentValues)):
822
            if self._componentValues[idx] is not None:
823
                r = r + ' '*scope
824
                componentType = self.getComponentType()
825
                if componentType is None:
826
                    r = r + '<no-name>'
827
                else:
828
                    r = r + componentType.getNameByPosition(idx)
829
                r = '%s=%s\n' % (
830
                    r, self._componentValues[idx].prettyPrint(scope)
831
                    )
832
        return r
833
834
class Sequence(SequenceAndSetBase):
835
    tagSet = baseTagSet = tag.initTagSet(
836
        tag.Tag(tag.tagClassUniversal, tag.tagFormatConstructed, 0x10)
837
        )
838
    typeId = 3
839
840
    def getComponentTagMapNearPosition(self, idx):
841
        if self._componentType:
842
            return self._componentType.getTagMapNearPosition(idx)
843
844
    def getComponentPositionNearType(self, tagSet, idx):
845
        if self._componentType:
846
            return self._componentType.getPositionNearType(tagSet, idx)
847
        else:
848
            return idx
849
850
class Set(SequenceAndSetBase):
851
    tagSet = baseTagSet = tag.initTagSet(
852
        tag.Tag(tag.tagClassUniversal, tag.tagFormatConstructed, 0x11)
853
        )
854
    typeId = 4
855
856
    def getComponent(self, innerFlag=0): return self
857
858
    def getComponentByType(self, tagSet, innerFlag=0):
859
        c = self.getComponentByPosition(
860
            self._componentType.getPositionByType(tagSet)
861
            )
862
        if innerFlag and isinstance(c, Set):
863
            # get inner component by inner tagSet
864
            return c.getComponent(1)
865
        else:
866
            # get outer component by inner tagSet
867
            return c
868
869
    def setComponentByType(self, tagSet, value=None, innerFlag=0,
870
                           verifyConstraints=True):
871
        idx = self._componentType.getPositionByType(tagSet)
872
        t = self._componentType.getTypeByPosition(idx)
873
        if innerFlag:  # set inner component by inner tagSet
874
            if t.getTagSet():
875
                return self.setComponentByPosition(
876
                    idx, value, verifyConstraints
877
                    )
878
            else:
879
                t = self.setComponentByPosition(idx).getComponentByPosition(idx)
880
                return t.setComponentByType(
881
                    tagSet, value, innerFlag, verifyConstraints
882
                    )
883
        else:  # set outer component by inner tagSet
884
            return self.setComponentByPosition(
885
                idx, value, verifyConstraints
886
                )
887
888
    def getComponentTagMap(self):
889
        if self._componentType:
890
            return self._componentType.getTagMap(True)
891
892
    def getComponentPositionByType(self, tagSet):
893
        if self._componentType:
894
            return self._componentType.getPositionByType(tagSet)
895
896
class Choice(Set):
897
    tagSet = baseTagSet = tag.TagSet()  # untagged
898
    sizeSpec = constraint.ConstraintsIntersection(
899
        constraint.ValueSizeConstraint(1, 1)
900
        )
901
    typeId = 5
902
    _currentIdx = None
903
904
    def __eq__(self, other):
905
        if self._componentValues:
906
            return self._componentValues[self._currentIdx] == other
907
        return NotImplemented
908
    def __ne__(self, other):
909
        if self._componentValues:
910
            return self._componentValues[self._currentIdx] != other
911
        return NotImplemented
912
    def __lt__(self, other):
913
        if self._componentValues:
914
            return self._componentValues[self._currentIdx] < other
915
        return NotImplemented
916
    def __le__(self, other):
917
        if self._componentValues:
918
            return self._componentValues[self._currentIdx] <= other
919
        return NotImplemented
920
    def __gt__(self, other):
921
        if self._componentValues:
922
            return self._componentValues[self._currentIdx] > other
923
        return NotImplemented
924
    def __ge__(self, other):
925
        if self._componentValues:
926
            return self._componentValues[self._currentIdx] >= other
927
        return NotImplemented
928
    if sys.version_info[0] <= 2:
929
        def __nonzero__(self, other): return bool(self._componentValues)
930
    else:
931
        def __bool__(self, other): return bool(self._componentValues)
932
933
    def __len__(self): return self._currentIdx is not None and 1 or 0
934
935
    def verifySizeSpec(self):
936
        if self._currentIdx is None:
937
            raise error.PyAsn1Error('Component not chosen')
938
        else:
939
            self._sizeSpec(' ')
940
941
    def _cloneComponentValues(self, myClone, cloneValueFlag):
942
        try:
943
            c = self.getComponent()
944
        except error.PyAsn1Error:
945
            pass
946
        else:
947
            if isinstance(c, Choice):
948
                tagSet = c.getEffectiveTagSet()
949
            else:
950
                tagSet = c.getTagSet()
951
            if isinstance(c, base.AbstractConstructedAsn1Item):
952
                myClone.setComponentByType(
953
                    tagSet, c.clone(cloneValueFlag=cloneValueFlag)
954
                    )
955
            else:
956
                myClone.setComponentByType(tagSet, c.clone())
957
958
    def setComponentByPosition(self, idx, value=None, verifyConstraints=True):
959
        l = len(self._componentValues)
960
        if idx >= l:
961
            self._componentValues = self._componentValues + (idx-l+1)*[None]
962
        if self._currentIdx is not None:
963
            self._componentValues[self._currentIdx] = None
964
        if value is None:
965
            if self._componentValues[idx] is None:
966
                self._componentValues[idx] = self._componentType.getTypeByPosition(idx).clone()
967
                self._componentValuesSet = 1
968
                self._currentIdx = idx
969
            return self
970
        elif not isinstance(value, base.Asn1Item):
971
            value = self._componentType.getTypeByPosition(idx).clone(
972
                value=value
973
                )
974
        if verifyConstraints:
975
            if self._componentTypeLen:
976
                self._verifyComponent(idx, value)
977
            self._verifySubtypeSpec(value, idx)
978
        self._componentValues[idx] = value
979
        self._currentIdx = idx
980
        self._componentValuesSet = 1
981
        return self
982
983
    def getMinTagSet(self):
984
        if self._tagSet:
985
            return self._tagSet
986
        else:
987
            return self._componentType.genMinTagSet()
988
989
    def getEffectiveTagSet(self):
990
        if self._tagSet:
991
            return self._tagSet
992
        else:
993
            c = self.getComponent()
994
            if isinstance(c, Choice):
995
                return c.getEffectiveTagSet()
996
            else:
997
                return c.getTagSet()
998
999
    def getTagMap(self):
1000
        if self._tagSet:
1001
            return Set.getTagMap(self)
1002
        else:
1003
            return Set.getComponentTagMap(self)
1004
1005
    def getComponent(self, innerFlag=0):
1006
        if self._currentIdx is None:
1007
            raise error.PyAsn1Error('Component not chosen')
1008
        else:
1009
            c = self._componentValues[self._currentIdx]
1010
            if innerFlag and isinstance(c, Choice):
1011
                return c.getComponent(innerFlag)
1012
            else:
1013
                return c
1014
1015
    def getName(self, innerFlag=0):
1016
        if self._currentIdx is None:
1017
            raise error.PyAsn1Error('Component not chosen')
1018
        else:
1019
            if innerFlag:
1020
                c = self._componentValues[self._currentIdx]
1021
                if isinstance(c, Choice):
1022
                    return c.getName(innerFlag)
1023
            return self._componentType.getNameByPosition(self._currentIdx)
1024
1025
    def setDefaultComponents(self): pass
1026
1027
class Any(OctetString):
1028
    tagSet = baseTagSet = tag.TagSet()  # untagged
1029
    typeId = 6
1030
1031
    def getTagMap(self):
1032
        return tagmap.TagMap(
1033
            { self.getTagSet(): self },
1034
            { eoo.endOfOctets.getTagSet(): eoo.endOfOctets },
1035
            self
1036
            )
1037
1038
# XXX
1039
# coercion rules?
1040