esp32_bluetooth_classic_sni.../libs/scapy/contrib/sdnv.py
Matheus Eduardo Garbelini 86890704fd initial commit
todo: add documentation & wireshark dissector
2021-08-31 19:51:03 +08:00

109 lines
3.2 KiB
Python
Executable file

# This file is part of Scapy
# Scapy is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# any later version.
#
# Scapy is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Scapy. If not, see <http://www.gnu.org/licenses/>.
"""
Copyright 2012, The MITRE Corporation::
NOTICE
This software/technical data was produced for the U.S. Government
under Prime Contract No. NASA-03001 and JPL Contract No. 1295026
and is subject to FAR 52.227-14 (6/87) Rights in Data General,
and Article GP-51, Rights in Data General, respectively.
This software is publicly released under MITRE case #12-3054
"""
# scapy.contrib.description = Self-Delimiting Numeric Values (SDNV)
# scapy.contrib.status = library
from scapy.fields import Field, FieldLenField, LenField
from scapy.compat import raw
# SDNV definitions
class SDNVValueError(Exception):
def __init__(self, maxValue):
self.maxValue = maxValue
class SDNV:
def __init__(self, maxValue=2**32 - 1):
self.maxValue = maxValue
return
def setMax(self, maxValue):
self.maxValue = maxValue
def getMax(self):
return self.maxValue
def encode(self, number):
if number > self.maxValue:
raise SDNVValueError(self.maxValue)
foo = bytearray()
foo.append(number & 0x7F)
number = number >> 7
while (number > 0):
thisByte = number & 0x7F
thisByte |= 0x80
number = number >> 7
temp = bytearray()
temp.append(thisByte)
foo = temp + foo
return(foo)
def decode(self, ba, offset):
number = 0
numBytes = 1
b = ba[offset]
number = (b & 0x7F)
while (b & 0x80 == 0x80):
number = number << 7
if (number > self.maxValue):
raise SDNVValueError(self.maxValue)
b = ba[offset + numBytes]
number += (b & 0x7F)
numBytes += 1
if (number > self.maxValue):
raise SDNVValueError(self.maxValue)
return(number, numBytes)
SDNVUtil = SDNV()
class SDNV2(Field):
""" SDNV2 field """
def addfield(self, pkt, s, val):
return s + raw(SDNVUtil.encode(val))
def getfield(self, pkt, s):
b = bytearray(s)
val, len = SDNVUtil.decode(b, 0)
return s[len:], val
class SDNV2FieldLenField(FieldLenField, SDNV2):
def addfield(self, pkt, s, val):
return s + raw(SDNVUtil.encode(FieldLenField.i2m(self, pkt, val)))
class SDNV2LenField(LenField, SDNV2):
def addfield(self, pkt, s, val):
return s + raw(SDNVUtil.encode(LenField.i2m(self, pkt, val)))