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__))
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)
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)
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
def _setValues(self, values): if len(values) != 1: raise error.PyAsn1Error('Single constraint expected') AbstractConstraint._setValues(self, values)
def _setValues(self, values): self._values = ('<must be absent>', ) if values: raise error.PyAsn1Error('No arguments expected')