예제 #1
0
    def prettyIn(self, value):
        if isinstance(value, RelativeOID):
            return tuple(value)
        elif isStringType(value):
            if '-' in value:
                raise error.PyAsn1Error(
                    'Malformed RELATIVE-OID %s at %s: %s' %
                    (value, self.__class__.__name__, sys.exc_info()[1]))
            try:
                return tuple(
                    [int(subOid) for subOid in value.split('.') if subOid])
            except ValueError:
                raise error.PyAsn1Error(
                    'Malformed RELATIVE-OID %s at %s: %s' %
                    (value, self.__class__.__name__, sys.exc_info()[1]))

        try:
            tupleOfInts = tuple(
                [int(subOid) for subOid in value if subOid >= 0])

        except (ValueError, TypeError):
            raise error.PyAsn1Error(
                'Malformed RELATIVE-OID %s at %s: %s' %
                (value, self.__class__.__name__, sys.exc_info()[1]))

        if len(tupleOfInts) == len(value):
            return tupleOfInts

        raise error.PyAsn1Error('Malformed RELATIVE-OID %s at %s' %
                                (value, self.__class__.__name__))
예제 #2
0
 def _setValues(self, values):
     if len(values) != 2:
         raise error.PyAsn1Error('%s: bad constraint values' %
                                 (self.__class__.__name__, ))
     self.start, self.stop = values
     if self.start > self.stop:
         raise error.PyAsn1Error(
             '%s: screwed constraint values (start > stop): %s > %s' %
             (self.__class__.__name__, self.start, self.stop))
     AbstractConstraint._setValues(self, values)
예제 #3
0
    def valueDecoder(self,
                     substrate,
                     asn1Spec,
                     tagSet=None,
                     length=None,
                     state=None,
                     decodeFun=None,
                     substrateFun=None,
                     **options):
        if tagSet[0].tagFormat != tag.tagFormatSimple:
            raise error.PyAsn1Error('Simple tag format expected')

        for chunk in readFromStream(substrate, length, options):
            if isinstance(chunk, SubstrateUnderrunError):
                yield chunk

        if not chunk:
            raise error.PyAsn1Error('Empty substrate')

        chunk = octs2ints(chunk)

        reloid = ()
        index = 0
        substrateLen = len(chunk)
        while index < substrateLen:
            subId = chunk[index]
            index += 1
            if subId < 128:
                reloid += (subId, )
            elif subId > 128:
                # Construct subid from a number of octets
                nextSubId = subId
                subId = 0
                while nextSubId >= 128:
                    subId = (subId << 7) + (nextSubId & 0x7F)
                    if index >= substrateLen:
                        raise error.SubstrateUnderrunError(
                            'Short substrate for sub-OID past %s' % (reloid, ))
                    nextSubId = chunk[index]
                    index += 1
                reloid += ((subId << 7) + nextSubId, )
            elif subId == 128:
                # ASN.1 spec forbids leading zeros (0x80) in OID
                # encoding, tolerating it opens a vulnerability. See page 7 of
                # https://www.esat.kuleuven.be/cosic/publications/article-1432.pdf
                raise error.PyAsn1Error(
                    'Invalid octet 0x80 in RELATIVE-OID encoding')

        yield self._createComponent(asn1Spec, tagSet, reloid, **options)
예제 #4
0
    def encodeValue(self, value, asn1Spec, encodeFun, **options):
        if asn1Spec is not None:
            value = asn1Spec.clone(value)

        octets = ()

        # Cycle through subIds
        for subOid in value.asTuple():
            if 0 <= subOid <= 127:
                # Optimize for the common case
                octets += (subOid, )

            elif subOid > 127:
                # Pack large Sub-Object IDs
                res = (subOid & 0x7f, )
                subOid >>= 7

                while subOid:
                    res = (0x80 | (subOid & 0x7f), ) + res
                    subOid >>= 7

                # Add packed Sub-Object ID to resulted RELATIVE-OID
                octets += res

            else:
                raise error.PyAsn1Error('Negative RELATIVE-OID arc %s at %s' %
                                        (subOid, value))

        return octets, False, False
예제 #5
0
 def _setValues(self, values):
     if len(values) != 1:
         raise error.PyAsn1Error('Single constraint expected')
     AbstractConstraint._setValues(self, values)
예제 #6
0
    def _setValues(self, values):
        self._values = ('<must be absent>', )

        if values:
            raise error.PyAsn1Error('No arguments expected')