Пример #1
0
 def prettyIn(self, value):
     if not has_ipv6:
         raise error.PySnmpError('IPv6 not supported by platform')
     if isinstance(value, tuple):
         value = inet_pton(socket.AF_INET6, value[0]) + int2oct(
             (value[1] >> 8) & 0xff) + int2oct(value[1] & 0xff)
     return OctetString.prettyIn(self, value)
Пример #2
0
 def prettyIn(self, value):
     if isinstance(value, tuple):
         # Wild hack -- need to implement TextualConvention.prettyIn
         value = inet_pton(AF_INET, value[0]) + \
                 int2oct((value[1] >> 8) & 0xff) + \
                 int2oct(value[1] & 0xff)
     return OctetString.prettyIn(self, value)
Пример #3
0
 def prettyIn(self, value):
     if AF_INET6 is None:
         raise error.PySnmpError('IPv6 not supported by platform')
     if isinstance(value, tuple):
         value = inet_pton(AF_INET6, value[0]) + \
                 int2oct((value[1] >> 8) & 0xff) + \
                 int2oct(value[1] & 0xff)
     return OctetString.prettyIn(self, value)
Пример #4
0
 def encodeTag(self, t, isConstructed):
     tagClass, tagFormat, tagId = t.asTuple()  # this is a hotspot
     v = tagClass | tagFormat
     if isConstructed:
         v = v|tag.tagFormatConstructed
     if tagId < 31:
         return int2oct(v|tagId)
     else:
         s = int2oct(tagId&0x7f)
         tagId = tagId >> 7
         while tagId:
             s = int2oct(0x80|(tagId&0x7f)) + s
             tagId = tagId >> 7
         return int2oct(v|0x1F) + s
Пример #5
0
 def encodeLength(self, length, defMode):
     if not defMode and self.supportIndefLenMode:
         return int2oct(0x80)
     if length < 0x80:
         return int2oct(length)
     else:
         substrate = null
         while length:
             substrate = int2oct(length&0xff) + substrate
             length = length >> 8
         substrateLen = len(substrate)
         if substrateLen > 126:
             raise Error('Length octets overflow (%d)' % substrateLen)
         return int2oct(0x80 | substrateLen) + substrate
Пример #6
0
 def encodeTag(self, t, isConstructed):
     tagClass, tagFormat, tagId = t.asTuple()  # this is a hotspot
     v = tagClass | tagFormat
     if isConstructed:
         v = v | tag.tagFormatConstructed
     if tagId < 31:
         return int2oct(v | tagId)
     else:
         s = int2oct(tagId & 0x7f)
         tagId = tagId >> 7
         while tagId:
             s = int2oct(0x80 | (tagId & 0x7f)) + s
             tagId = tagId >> 7
         return int2oct(v | 0x1F) + s
Пример #7
0
 def encodeLength(self, length, defMode):
     if not defMode and self.supportIndefLenMode:
         return int2oct(0x80)
     if length < 0x80:
         return int2oct(length)
     else:
         substrate = null
         while length:
             substrate = int2oct(length & 0xff) + substrate
             length = length >> 8
         substrateLen = len(substrate)
         if substrateLen > 126:
             raise Error('Length octets overflow (%d)' % substrateLen)
         return int2oct(0x80 | substrateLen) + substrate
Пример #8
0
    def encodeValue(self, value, asn1Spec, encodeFun, **options):
        if asn1Spec is not None:
            # TODO: try to avoid ASN.1 schema instantiation
            value = asn1Spec.clone(value)

        valueLength = len(value)
        if valueLength % 8:
            alignedValue = value << (8 - valueLength % 8)
        else:
            alignedValue = value

        maxChunkSize = options.get('maxChunkSize', 0)
        if not maxChunkSize or len(alignedValue) <= maxChunkSize * 8:
            substrate = alignedValue.asOctets()
            return int2oct(len(substrate) * 8 - valueLength) + substrate, False, True

        baseTag = value.tagSet.baseTag

        # strip off explicit tags
        if baseTag:
            tagSet = tag.TagSet(baseTag, baseTag)
        else:
            tagSet = tag.TagSet()

        alignedValue = alignedValue.clone(tagSet=tagSet)

        stop = 0
        substrate = null
        while stop < valueLength:
            start = stop
            stop = min(start + maxChunkSize * 8, valueLength)
            substrate += encodeFun(alignedValue[start:stop], asn1Spec, **options)

        return substrate, True, True
Пример #9
0
    def encodeValue(self,
                    encodeFun,
                    value,
                    defMode,
                    maxChunkSize,
                    ifNotEmpty=False):
        valueLength = len(value)
        if valueLength % 8:
            alignedValue = value << (8 - valueLength % 8)
        else:
            alignedValue = value

        if not maxChunkSize or len(alignedValue) <= maxChunkSize * 8:
            substrate = alignedValue.asOctets()
            return int2oct(len(substrate) * 8 -
                           valueLength) + substrate, False, True

        stop = 0
        substrate = null
        while stop < valueLength:
            start = stop
            stop = min(start + maxChunkSize * 8, valueLength)
            substrate += encodeFun(alignedValue[start:stop],
                                   defMode,
                                   maxChunkSize,
                                   ifNotEmpty=ifNotEmpty)

        return substrate, True, True
Пример #10
0
    def encodeValue(self, value, encodeFun, **options):
        valueLength = len(value)
        if valueLength % 8:
            alignedValue = value << (8 - valueLength % 8)
        else:
            alignedValue = value

        maxChunkSize = options.get('maxChunkSize', 0)
        if not maxChunkSize or len(alignedValue) <= maxChunkSize * 8:
            substrate = alignedValue.asOctets()
            return int2oct(len(substrate) * 8 - valueLength) + substrate, False, True

        # strip off explicit tags
        alignedValue = alignedValue.clone(
            tagSet=tag.TagSet(value.tagSet.baseTag, value.tagSet.baseTag)
        )

        stop = 0
        substrate = null
        while stop < valueLength:
            start = stop
            stop = min(start + maxChunkSize * 8, valueLength)
            substrate += encodeFun(alignedValue[start:stop], **options)

        return substrate, True, True
Пример #11
0
    def encodeValue(self, value, asn1Spec, encodeFun, **options):
        if asn1Spec is not None:
            # TODO: try to avoid ASN.1 schema instantiation
            value = asn1Spec.clone(value)

        valueLength = len(value)
        if valueLength % 8:
            alignedValue = value << (8 - valueLength % 8)
        else:
            alignedValue = value

        maxChunkSize = options.get('maxChunkSize', 0)
        if not maxChunkSize or len(alignedValue) <= maxChunkSize * 8:
            substrate = alignedValue.asOctets()
            return int2oct(len(substrate) * 8 -
                           valueLength) + substrate, False, True

        tagSet = value.tagSet

        # strip off explicit tags
        alignedValue = alignedValue.clone(
            tagSet=tag.TagSet(tagSet.baseTag, tagSet.baseTag))

        stop = 0
        substrate = null
        while stop < valueLength:
            start = stop
            stop = min(start + maxChunkSize * 8, valueLength)
            substrate += encodeFun(alignedValue[start:stop], asn1Spec,
                                   **options)

        return substrate, True, True
Пример #12
0
 def encodeValue(self, encodeFun, value, defMode, maxChunkSize):
     if value.isPlusInfinity():
         return int2oct(0x40), 0
     if value.isMinusInfinity():
         return int2oct(0x41), 0
     m, b, e = value
     if not m:
         return null, 0
     if b == 10:
         return str2octs('\x03%dE%s%d' % (m, e == 0 and '+' or '', e)), 0
     elif b == 2:
         fo = 0x80  # binary enoding
         if m < 0:
             fo = fo | 0x40  # sign bit
             m = -m
         while int(m) != m:  # drop floating point
             m *= 2
             e -= 1
         while m & 0x1 == 0:  # mantissa normalization
             m >>= 1
             e += 1
         eo = null
         while e not in (0, -1):
             eo = int2oct(e & 0xff) + eo
             e >>= 8
         if e == 0 and eo and oct2int(eo[0]) & 0x80:
             eo = int2oct(0) + eo
         n = len(eo)
         if n > 0xff:
             raise error.PyAsn1Error('Real exponent overflow')
         if n == 1:
             pass
         elif n == 2:
             fo |= 1
         elif n == 3:
             fo |= 2
         else:
             fo |= 3
             eo = int2oct(n // 0xff + 1) + eo
         po = null
         while m:
             po = int2oct(m & 0xff) + po
             m >>= 8
         substrate = int2oct(fo) + eo + po
         return substrate, 0
     else:
         raise error.PyAsn1Error('Prohibited Real base %s' % b)
Пример #13
0
 def encodeValue(self, encodeFun, value, defMode, maxChunkSize):
     if value.isPlusInfinity():
         return int2oct(0x40), 0
     if value.isMinusInfinity():
         return int2oct(0x41), 0
     m, b, e = value
     if not m:
         return null, 0
     if b == 10:
         return str2octs('\x03%dE%s%d' % (m, e == 0 and '+' or '', e)), 0
     elif b == 2:
         fo = 0x80                 # binary enoding
         if m < 0:
             fo = fo | 0x40  # sign bit
             m = -m
         while int(m) != m: # drop floating point
             m *= 2
             e -= 1
         while m & 0x1 == 0: # mantissa normalization
             m >>= 1
             e += 1
         eo = null
         while e not in (0, -1):
             eo = int2oct(e&0xff) + eo
             e >>= 8
         if e == 0 and eo and oct2int(eo[0]) & 0x80:
             eo = int2oct(0) + eo
         n = len(eo)
         if n > 0xff:
             raise error.PyAsn1Error('Real exponent overflow')
         if n == 1:
             pass
         elif n == 2:
             fo |= 1
         elif n == 3:
             fo |= 2
         else:
             fo |= 3
             eo = int2oct(n//0xff+1) + eo
         po = null
         while m:
             po = int2oct(m&0xff) + po
             m >>= 8
         substrate = int2oct(fo) + eo + po
         return substrate, 0
     else:
         raise error.PyAsn1Error('Prohibited Real base %s' % b)
Пример #14
0
    def encodeValue(self, encodeFun, value, defMode, maxChunkSize):
        if len(value) % 8:
            alignedValue = value << (8 - len(value) % 8)
        else:
            alignedValue = value

        if not maxChunkSize or len(alignedValue) <= maxChunkSize * 8:
            substrate = alignedValue.asOctets()
            return int2oct(len(substrate) * 8 - len(value)) + substrate, 0

        stop = 0
        substrate = null
        while stop < len(value):
            start = stop
            stop = min(start + maxChunkSize * 8, len(value))
            substrate += encodeFun(alignedValue[start:stop], defMode,
                                   maxChunkSize)
        return substrate, 1
Пример #15
0
 def encodeValue(self, encodeFun, value, defMode, maxChunkSize):
     if not maxChunkSize or len(value) <= maxChunkSize*8:
         r = {}; l = len(value); p = 0; j = 7
         while p < l:
             i, j = divmod(p, 8)
             r[i] = r.get(i,0) | value[p]<<(7-j)
             p = p + 1
         keys = list(r); keys.sort()
         return int2oct(7-j) + ints2octs([r[k] for k in keys]), 0
     else:
         pos = 0; substrate = null
         while 1:
             # count in octets
             v = value.clone(value[pos*8:pos*8+maxChunkSize*8])
             if not v:
                 break
             substrate = substrate + encodeFun(v, defMode, maxChunkSize)
             pos = pos + maxChunkSize
         return substrate, 1
Пример #16
0
 def encodeValue(self, encodeFun, value, defMode, maxChunkSize):
     if not maxChunkSize or len(value) <= maxChunkSize*8:
         r = {}; l = len(value); p = 0; j = 7
         while p < l:
             i, j = divmod(p, 8)
             r[i] = r.get(i,0) | value[p]<<(7-j)
             p = p + 1
         keys = list(r); keys.sort()
         return int2oct(7-j) + ints2octs([r[k] for k in keys]), 0
     else:
         pos = 0; substrate = null
         while 1:
             # count in octets
             v = value.clone(value[pos*8:pos*8+maxChunkSize*8])
             if not v:
                 break
             substrate = substrate + encodeFun(v, defMode, maxChunkSize)
             pos = pos + maxChunkSize
         return substrate, 1
Пример #17
0
    def encodeValue(self, encodeFun, value, defMode, maxChunkSize):
        valueLength = len(value)
        if valueLength % 8:
            alignedValue = value << (8 - valueLength % 8)
        else:
            alignedValue = value

        if not maxChunkSize or len(alignedValue) <= maxChunkSize * 8:
            substrate = alignedValue.asOctets()
            return int2oct(len(substrate) * 8 - valueLength) + substrate, False, True

        stop = 0
        substrate = null
        while stop < valueLength:
            start = stop
            stop = min(start + maxChunkSize * 8, valueLength)
            substrate += encodeFun(alignedValue[start:stop], defMode, maxChunkSize)

        return substrate, True, True
Пример #18
0
 def encodeValue(self, encodeFun, value, defMode, maxChunkSize):
     if not maxChunkSize or len(value) <= maxChunkSize*8:
         out_len = (len(value) + 7) // 8
         out_list = out_len * [0]
         j = 7
         i = -1
         for val in value:
             j += 1
             if j == 8:
                 i += 1
                 j = 0
             out_list[i] = out_list[i] | val << (7-j)
         return int2oct(7-j) + ints2octs(out_list), 0
     else:
         pos = 0; substrate = null
         while 1:
             # count in octets
             v = value.clone(value[pos*8:pos*8+maxChunkSize*8])
             if not v:
                 break
             substrate = substrate + encodeFun(v, defMode, maxChunkSize)
             pos = pos + maxChunkSize
         return substrate, 1
Пример #19
0
 def encodeValue(self, encodeFun, value, defMode, maxChunkSize):
     if not maxChunkSize or len(value) <= maxChunkSize * 8:
         out_len = (len(value) + 7) // 8
         out_list = out_len * [0]
         j = 7
         i = -1
         for val in value:
             j += 1
             if j == 8:
                 i += 1
                 j = 0
             out_list[i] = out_list[i] | val << (7 - j)
         return int2oct(7 - j) + ints2octs(out_list), 0
     else:
         pos = 0
         substrate = null
         while 1:
             # count in octets
             v = value.clone(value[pos * 8:pos * 8 + maxChunkSize * 8])
             if not v:
                 break
             substrate = substrate + encodeFun(v, defMode, maxChunkSize)
             pos = pos + maxChunkSize
         return substrate, 1
Пример #20
0
 def test_int2oct(self):
     assert [12] == list(octets.int2oct(12))
Пример #21
0
 def prettyIn(self, value):
     if not has_ipv6:
         raise error.PySnmpError("IPv6 not supported by platform")
     if isinstance(value, tuple):
         value = inet_pton(socket.AF_INET6, value[0]) + int2oct((value[1] >> 8) & 0xFF) + int2oct(value[1] & 0xFF)
     return OctetString.prettyIn(self, value)
Пример #22
0
 def encodeValue(self, encodeFun, value, defMode, maxChunkSize):
     if value.isPlusInfinity():
         return int2oct(0x40), 0
     if value.isMinusInfinity():
         return int2oct(0x41), 0
     m, b, e = value
     if not m:
         return null, 0
     if b == 10:
         return str2octs('\x03%dE%s%d' % (m, e == 0 and '+' or '', e)), 0
     elif b == 2:
         fo = 0x80  # binary encoding
         ms, m, encbase, e = self._chooseEncBase(value)
         if ms < 0:  # mantissa sign
             fo = fo | 0x40  # sign bit
         # exponenta & mantissa normalization
         if encbase == 2:
             while m & 0x1 == 0:
                 m >>= 1
                 e += 1
         elif encbase == 8:
             while m & 0x7 == 0:
                 m >>= 3
                 e += 1
             fo |= 0x10
         else:  # encbase = 16
             while m & 0xf == 0:
                 m >>= 4
                 e += 1
             fo |= 0x20
         sf = 0  # scale factor
         while m & 0x1 == 0:
             m >>= 1
             sf += 1
         if sf > 3:
             raise error.PyAsn1Error(
                 'Scale factor overflow')  # bug if raised
         fo |= sf << 2
         eo = null
         if e == 0 or e == -1:
             eo = int2oct(e & 0xff)
         else:
             while e not in (0, -1):
                 eo = int2oct(e & 0xff) + eo
                 e >>= 8
             if e == 0 and eo and oct2int(eo[0]) & 0x80:
                 eo = int2oct(0) + eo
             if e == -1 and eo and not (oct2int(eo[0]) & 0x80):
                 eo = int2oct(0xff) + eo
         n = len(eo)
         if n > 0xff:
             raise error.PyAsn1Error('Real exponent overflow')
         if n == 1:
             pass
         elif n == 2:
             fo |= 1
         elif n == 3:
             fo |= 2
         else:
             fo |= 3
             eo = int2oct(n & 0xff) + eo
         po = null
         while m:
             po = int2oct(m & 0xff) + po
             m >>= 8
         substrate = int2oct(fo) + eo + po
         return substrate, 0
     else:
         raise error.PyAsn1Error('Prohibited Real base %s' % b)
Пример #23
0
 def pad(self, s, BS=16):
     return s + (BS - len(s) % BS) * int2oct(BS - len(s) % BS)
Пример #24
0
 def encodeValue(self, encodeFun, client, defMode, maxChunkSize):
     if client == 0:
         substrate = int2oct(0)
     else:
         substrate = int2oct(255)
     return substrate, 0
Пример #25
0
    def encodeValue(self, value, asn1Spec, encodeFun, **options):
        if asn1Spec is not None:
            value = asn1Spec.clone(value)

        if value.isPlusInf:
            return (0x40, ), False, False

        if value.isMinusInf:
            return (0x41, ), False, False

        m, b, e = value

        if not m:
            return null, False, True

        if b == 10:
            if LOG:
                LOG('encoding REAL into character form')

            return str2octs('\x03%dE%s%d' %
                            (m, e == 0 and '+' or '', e)), False, True

        elif b == 2:
            fo = 0x80  # binary encoding
            ms, m, encbase, e = self._chooseEncBase(value)

            if ms < 0:  # mantissa sign
                fo |= 0x40  # sign bit

            # exponent & mantissa normalization
            if encbase == 2:
                while m & 0x1 == 0:
                    m >>= 1
                    e += 1

            elif encbase == 8:
                while m & 0x7 == 0:
                    m >>= 3
                    e += 1
                fo |= 0x10

            else:  # encbase = 16
                while m & 0xf == 0:
                    m >>= 4
                    e += 1
                fo |= 0x20

            sf = 0  # scale factor

            while m & 0x1 == 0:
                m >>= 1
                sf += 1

            if sf > 3:
                raise error.PyAsn1Error(
                    'Scale factor overflow')  # bug if raised

            fo |= sf << 2
            eo = null
            if e == 0 or e == -1:
                eo = int2oct(e & 0xff)

            else:
                while e not in (0, -1):
                    eo = int2oct(e & 0xff) + eo
                    e >>= 8

                if e == 0 and eo and oct2int(eo[0]) & 0x80:
                    eo = int2oct(0) + eo

                if e == -1 and eo and not (oct2int(eo[0]) & 0x80):
                    eo = int2oct(0xff) + eo

            n = len(eo)
            if n > 0xff:
                raise error.PyAsn1Error('Real exponent overflow')

            if n == 1:
                pass

            elif n == 2:
                fo |= 1

            elif n == 3:
                fo |= 2

            else:
                fo |= 3
                eo = int2oct(n & 0xff) + eo

            po = null

            while m:
                po = int2oct(m & 0xff) + po
                m >>= 8

            substrate = int2oct(fo) + eo + po

            return substrate, False, True

        else:
            raise error.PyAsn1Error('Prohibited Real base %s' % b)
Пример #26
0
 def test_int2oct(self):
     assert [12] == list(octets.int2oct(12))
Пример #27
0
 def encodeValue(self, encodeFun, value, defMode, maxChunkSize):
     if value.isPlusInfinity():
         return int2oct(0x40), 0
     if value.isMinusInfinity():
         return int2oct(0x41), 0
     m, b, e = value
     if not m:
         return null, 0
     if b == 10:
         return str2octs('\x03%dE%s%d' % (m, e == 0 and '+' or '', e)), 0
     elif b == 2:
         fo = 0x80 # binary encoding
         ms, m, encbase, e = self._chooseEncBase(value)
         if ms < 0: # mantissa sign
             fo = fo | 0x40 # sign bit
         # exponenta & mantissa normalization
         if encbase == 2:
             while m & 0x1 == 0:
                 m >>= 1
                 e += 1
         elif encbase == 8:
             while m & 0x7 == 0:
                 m >>= 3
                 e += 1
             fo |= 0x10
         else: # encbase = 16
             while m & 0xf == 0:
                 m >>= 4
                 e += 1
             fo |= 0x20
         sf = 0 # scale factor
         while m & 0x1 == 0:
             m >>= 1
             sf += 1
         if sf > 3:
             raise error.PyAsn1Error('Scale factor overflow') # bug if raised
         fo |= sf << 2
         eo = null
         if e == 0 or e == -1:
             eo = int2oct(e&0xff)
         else: 
             while e not in (0, -1):
                 eo = int2oct(e&0xff) + eo
                 e >>= 8
             if e == 0 and eo and oct2int(eo[0]) & 0x80:
                 eo = int2oct(0) + eo
             if e == -1 and eo and not (oct2int(eo[0]) & 0x80):
                 eo = int2oct(0xff) + eo
         n = len(eo)
         if n > 0xff:
             raise error.PyAsn1Error('Real exponent overflow')
         if n == 1:
             pass
         elif n == 2:
             fo |= 1
         elif n == 3:
             fo |= 2
         else:
             fo |= 3
             eo = int2oct(n&0xff) + eo
         po = null
         while m:
             po = int2oct(m&0xff) + po
             m >>= 8
         substrate = int2oct(fo) + eo + po
         return substrate, 0
     else:
         raise error.PyAsn1Error('Prohibited Real base %s' % b)
Пример #28
0
 def test_int2oct(self):
     assert '\x0c' == octets.int2oct(12)
Пример #29
0
    def encodeValue(self, value, asn1Spec, encodeFun, **options):
        if asn1Spec is not None:
            value = asn1Spec.clone(value)

        if value.isPlusInf:
            return (0x40,), False, False

        if value.isMinusInf:
            return (0x41,), False, False

        m, b, e = value

        if not m:
            return null, False, True

        if b == 10:
            if LOG:
                LOG('encoding REAL into character form')

            return str2octs('\x03%dE%s%d' % (m, e == 0 and '+' or '', e)), False, True

        elif b == 2:
            fo = 0x80  # binary encoding
            ms, m, encbase, e = self._chooseEncBase(value)

            if ms < 0:  # mantissa sign
                fo |= 0x40  # sign bit

            # exponent & mantissa normalization
            if encbase == 2:
                while m & 0x1 == 0:
                    m >>= 1
                    e += 1

            elif encbase == 8:
                while m & 0x7 == 0:
                    m >>= 3
                    e += 1
                fo |= 0x10

            else:  # encbase = 16
                while m & 0xf == 0:
                    m >>= 4
                    e += 1
                fo |= 0x20

            sf = 0  # scale factor

            while m & 0x1 == 0:
                m >>= 1
                sf += 1

            if sf > 3:
                raise error.PyAsn1Error('Scale factor overflow')  # bug if raised

            fo |= sf << 2
            eo = null
            if e == 0 or e == -1:
                eo = int2oct(e & 0xff)

            else:
                while e not in (0, -1):
                    eo = int2oct(e & 0xff) + eo
                    e >>= 8

                if e == 0 and eo and oct2int(eo[0]) & 0x80:
                    eo = int2oct(0) + eo

                if e == -1 and eo and not (oct2int(eo[0]) & 0x80):
                    eo = int2oct(0xff) + eo

            n = len(eo)
            if n > 0xff:
                raise error.PyAsn1Error('Real exponent overflow')

            if n == 1:
                pass

            elif n == 2:
                fo |= 1

            elif n == 3:
                fo |= 2

            else:
                fo |= 3
                eo = int2oct(n & 0xff) + eo

            po = null

            while m:
                po = int2oct(m & 0xff) + po
                m >>= 8

            substrate = int2oct(fo) + eo + po

            return substrate, False, True

        else:
            raise error.PyAsn1Error('Prohibited Real base %s' % b)
Пример #30
0
 def __bitsFilter(value):
     return ''.join([int2oct(int(y, 16)) for y in value.split(' ')])
Пример #31
0
 def test_int2oct(self):
     assert '\x0c' == octets.int2oct(12)