root/branch/BTSniff/umit/bluetooth/handlers.py @ 5396

Revision 5396, 6.0 kB (checked in by qsy, 4 years ago)

PM updated with new namespace

Line 
1'''
2Created on Jul 22, 2009
3
4@author: qsy
5'''
6
7import  btsniff
8import sniffer
9import crack
10import btlayers
11
12from sniffcommon import * 
13
14
15## This code for taking out of PM, so we do not need to change any code
16try:
17    from packet import BtMetaPacket
18except ImportError:
19    class BtMetaPacket(object):
20       
21        def _init__(self, unit):
22            self.pkt = unit
23
24        def __getattr__(self, name):
25            return getattr(self.pkt, name)
26
27class CollectHandler(btsniff.SniffHandler):
28   
29    def __init__(self):
30        self.data = []
31
32    def recvgenevt(self, unit):
33        self.data.append(BtMetaPacket(unit))
34   
35    def recvlmp(self, unit):
36        self.recvgenevt(unit)
37   
38    def recvdv(self, unit):
39        self.recvgenevt(unit)
40   
41    def recvl2cap(self, unit):
42        self.recvgenevt(unit)
43
44    def clear_data(self):
45        self.data = []
46
47
48class PinCrackCollectHandler(CollectHandler):
49   
50    def __init__(self, master_add, slave_add):
51        super(PinCrackCollectHandler, self).__init__()
52        self._capstate = btsniff.CaptureState()
53        self._pcr = crack.PinCrackRunner(master_add, slave_add, self._capstate)
54        self._pin = None
55   
56    def recvlmp(self, unit):
57         super(PinCrackCollectHandler, self).recvlmp(unit)
58         # Optimize for more speed
59         lmp = unit.payload
60         if lmp.header.op1 in crack.LMP_PINCRACK_OPCODES \
61            and self._pcr.try_crack(lmp):
62             self._pin = self._pcr.getpin()
63   
64    def is_done(self):
65        return self._pcr.is_done()
66   
67    def close(self):
68        self._pcr.terminate()
69   
70    def getpin(self):
71        """
72            @return Pin as a string
73        """
74        return self._pcr.getpin()
75
76class TextHandler(btsniff.SniffHandler):
77    '''
78        This handler duplicates the functionality of Frontline.
79        Allows the calculation of a pin   
80    '''
81    def __init__(self, do_pin = False, 
82                 master_add = None, slave_add = None, writer = None):
83       
84        super(TextHandler, self).__init__()
85        self._state = btsniff.CaptureState()
86        if do_pin:
87            print 'do_pin'
88            self._state.pinstate = 1
89            self._pcr = crack.PinCrackRunner(master_add, slave_add)
90            if master_add is None or slave_add is None:
91                raise Exception('Error: cannot do_pin without master/slave addresses')
92        else:
93            self._pcr = None
94#        if not writer:
95#            writer = sfio.HCIWriter()
96        self._writer = writer
97#        if session:
98#            self._session = session
99#            self._write_file = session.dump
100#        else:
101#            raise sniff.SniffError("FrontlineHandler: Session not given. session is %s"
102#                                   % session)
103         
104
105    def _writetofile(self, type, packet):
106        pass
107#        self._writer.writetofile(hcipkttype = type, llid = self._session.state.llid,
108#                                 ismaster = self._session.state.master, packet = packet, filename = self._write_file)
109       
110    def _printpktdetails(self, packet):
111        """
112            Parameters:
113            packet    -    sniff.SniffPacket
114        """
115        master = not (packet.clock & FP_SLAVE_MASK)
116        header_len = packet.header_len
117        channel = packet.chan
118        clock = packet.clock
119        status = packet.status
120        hdr0 = packet.header_byte0
121        type = packet.type
122        address = packet.address
123        llid = packet.llid
124        length = packet.payload_len
125       
126        print 'PL 0x%.2X Ch %.2d %c Clk 0x%.7X Status 0x%.1X Hdr0 0x%.2X [type: %d addr: %d] LLID %d Len %d' \
127                        % (header_len, 
128                            channel,
129                            'M' if master else 'S',
130                            clock, 
131                            status, 
132                            hdr0,
133                            type,
134                            address,
135                            llid,
136                            length),
137
138    def _printpayload(self, payload):
139        print ' '.join(['%.2x' % d for d in payload.rawdata])
140   
141    def recvlmp(self, packet):
142        self._printpktdetails(packet)
143        lmp = packet.payload
144        if lmp:
145            print 'LMP Tid %d, Op1 %d' % (lmp.header.tid, lmp.header.op1),
146            if lmp.header.op1 >= 124 and lmp.header.op1 <= 127:
147                print ', Op2 %d' % (lmp.header.op2),
148            print ' '.join(['%.2x' % d for d in lmp.payload.rawdata])
149           
150            if self._pcr and self._pcr.try_crack(lmp):
151                print 19 * '='
152                print 'Pin: ', self._pcr.getpin()
153                print 19 * '='
154           
155        else:
156            print
157       
158#            pcd = crack._gen_pincrackdata(self._state, lmp.header.op1, lmp.payload.rawdata,
159#                                 self._session.master, self._session.slave)
160#            print '============== pindata state ============'
161#            print self._session.state.pindata
162#            print '========================================='
163#            if pcd:
164#                if pcd.ready_to_crack():
165#                    print 'Pin: ', self.getpin(pcd)
166#                else:
167#                    raise StandardError('recvlmp: dopin: pairing process complete but no pin crack.')
168   
169    def getpin(self, pincrackdata):
170        import tempfile
171        tmpfile = tempfile.TemporaryFile()
172        pcr = crack._pincrackrunner() # This is a thread. runcrack is actually thread.start()
173        evt = pcr.runcrack(pincrackdata, self._session.master, 
174                           self._session.slave, tmpfile)
175        evt.wait()
176        return pcr.getpin()
177       
178   
179    def recvl2cap(self, packet):
180        self._printpktdetails(packet)
181        print "L2CAP:",
182#        self._printgenpkt(packet.payload)
183        self._printpayload(packet.payload)
184   
185    def recvdv(self, packet):
186        self._printpktdetails(packet)
187        print 'DV:',
188        self._printgenpkt(packet.payload)
189       
190   
191    def recvgenevt(self, packet):
192        self._printpktdetails(packet)
193
194
195
196
Note: See TracBrowser for help on using the browser.