Skip to content

Commit cb4a95b

Browse files
Bluetooth: Add EIR URI (#4617)
* bluetooth: Add EIR URI * bluetooth: Rename EIR_Appearance
1 parent eb279cc commit cb4a95b

File tree

2 files changed

+209
-1
lines changed

2 files changed

+209
-1
lines changed

scapy/layers/bluetooth.py

Lines changed: 201 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1271,7 +1271,7 @@ class EIR_AdvertisingInterval(EIR_Element):
12711271

12721272

12731273
class EIR_Appearance(EIR_Element):
1274-
name = "EIR_Appearance2"
1274+
name = "EIR_Appearance"
12751275
fields_desc = [
12761276
BitEnumField('category', 0, 10, tot_size=-2, enum={
12771277
0x000: 'Unknown',
@@ -1359,6 +1359,205 @@ def extract_padding(self, s):
13591359
return s[:plen], s[plen:]
13601360

13611361

1362+
class EIR_URI(EIR_Element):
1363+
name = 'EIR URI'
1364+
fields_desc = [
1365+
ByteEnumField('scheme', 0, {
1366+
0x01: '',
1367+
0x02: 'aaa:',
1368+
0x03: 'aaas:',
1369+
0x04: 'about:',
1370+
0x05: 'acap:',
1371+
0x06: 'acct:',
1372+
0x07: 'cap:',
1373+
0x08: 'cid:',
1374+
0x09: 'coap:',
1375+
0x0A: 'coaps:',
1376+
0x0B: 'crid:',
1377+
0x0C: 'data:',
1378+
0x0D: 'dav:',
1379+
0x0E: 'dict:',
1380+
0x0F: 'dns:',
1381+
0x10: 'file:',
1382+
0x11: 'ftp:',
1383+
0x12: 'geo:',
1384+
0x13: 'go:',
1385+
0x14: 'gopher:',
1386+
0x15: 'h323:',
1387+
0x16: 'http:',
1388+
0x17: 'https:',
1389+
0x18: 'iax:',
1390+
0x19: 'icap:',
1391+
0x1A: 'im:',
1392+
0x1B: 'imap:',
1393+
0x1C: 'info:',
1394+
0x1D: 'ipp:',
1395+
0x1E: 'ipps:',
1396+
0x1F: 'iris:',
1397+
0x20: 'iris.beep:',
1398+
0x21: 'iris.xpc:',
1399+
0x22: 'iris.xpcs:',
1400+
0x23: 'iris.lwz:',
1401+
0x24: 'jabber:',
1402+
0x25: 'ldap:',
1403+
0x26: 'mailto:',
1404+
0x27: 'mid:',
1405+
0x28: 'msrp:',
1406+
0x29: 'msrps:',
1407+
0x2A: 'mtqp:',
1408+
0x2B: 'mupdate:',
1409+
0x2C: 'news:',
1410+
0x2D: 'nfs:',
1411+
0x2E: 'ni:',
1412+
0x2F: 'nih:',
1413+
0x30: 'nntp:',
1414+
0x31: 'opaquelocktoken:',
1415+
0x32: 'pop:',
1416+
0x33: 'pres:',
1417+
0x34: 'reload:',
1418+
0x35: 'rtsp:',
1419+
0x36: 'rtsps:',
1420+
0x37: 'rtspu:',
1421+
0x38: 'service:',
1422+
0x39: 'session:',
1423+
0x3A: 'shttp:',
1424+
0x3B: 'sieve:',
1425+
0x3C: 'sip:',
1426+
0x3D: 'sips:',
1427+
0x3E: 'sms:',
1428+
0x3F: 'snmp:',
1429+
0x40: 'soap.beep:',
1430+
0x41: 'soap.beeps:',
1431+
0x42: 'stun:',
1432+
0x43: 'stuns:',
1433+
0x44: 'tag:',
1434+
0x45: 'tel:',
1435+
0x46: 'telnet:',
1436+
0x47: 'tftp:',
1437+
0x48: 'thismessage:',
1438+
0x49: 'tn3270:',
1439+
0x4A: 'tip:',
1440+
0x4B: 'turn:',
1441+
0x4C: 'turns:',
1442+
0x4D: 'tv:',
1443+
0x4E: 'urn:',
1444+
0x4F: 'vemmi:',
1445+
0x50: 'ws:',
1446+
0x51: 'wss:',
1447+
0x52: 'xcon:',
1448+
0x53: 'xconuserid:',
1449+
0x54: 'xmlrpc.beep:',
1450+
0x55: 'xmlrpc.beeps:',
1451+
0x56: 'xmpp:',
1452+
0x57: 'z39.50r:',
1453+
0x58: 'z39.50s:',
1454+
0x59: 'acr:',
1455+
0x5A: 'adiumxtra:',
1456+
0x5B: 'afp:',
1457+
0x5C: 'afs:',
1458+
0x5D: 'aim:',
1459+
0x5E: 'apt:',
1460+
0x5F: 'attachment:',
1461+
0x60: 'aw:',
1462+
0x61: 'barion:',
1463+
0x62: 'beshare:',
1464+
0x63: 'bitcoin:',
1465+
0x64: 'bolo:',
1466+
0x65: 'callto:',
1467+
0x66: 'chrome:',
1468+
0x67: 'chromeextension:',
1469+
0x68: 'comeventbriteattendee:',
1470+
0x69: 'content:',
1471+
0x6A: 'cvs:',
1472+
0x6B: 'dlnaplaysingle:',
1473+
0x6C: 'dlnaplaycontainer:',
1474+
0x6D: 'dtn:',
1475+
0x6E: 'dvb:',
1476+
0x6F: 'ed2k:',
1477+
0x70: 'facetime:',
1478+
0x71: 'feed:',
1479+
0x72: 'feedready:',
1480+
0x73: 'finger:',
1481+
0x74: 'fish:',
1482+
0x75: 'gg:',
1483+
0x76: 'git:',
1484+
0x77: 'gizmoproject:',
1485+
0x78: 'gtalk:',
1486+
0x79: 'ham:',
1487+
0x7A: 'hcp:',
1488+
0x7B: 'icon:',
1489+
0x7C: 'ipn:',
1490+
0x7D: 'irc:',
1491+
0x7E: 'irc6:',
1492+
0x7F: 'ircs:',
1493+
0x80: 'itms:',
1494+
0x81: 'jar:',
1495+
0x82: 'jms:',
1496+
0x83: 'keyparc:',
1497+
0x84: 'lastfm:',
1498+
0x85: 'ldaps:',
1499+
0x86: 'magnet:',
1500+
0x87: 'maps:',
1501+
0x88: 'market:',
1502+
0x89: 'message:',
1503+
0x8A: 'mms:',
1504+
0x8B: 'mshelp:',
1505+
0x8C: 'mssettingspower:',
1506+
0x8D: 'msnim:',
1507+
0x8E: 'mumble:',
1508+
0x8F: 'mvn:',
1509+
0x90: 'notes:',
1510+
0x91: 'oid:',
1511+
0x92: 'palm:',
1512+
0x93: 'paparazzi:',
1513+
0x94: 'pkcs11:',
1514+
0x95: 'platform:',
1515+
0x96: 'proxy:',
1516+
0x97: 'psyc:',
1517+
0x98: 'query:',
1518+
0x99: 'res:',
1519+
0x9A: 'resource:',
1520+
0x9B: 'rmi:',
1521+
0x9C: 'rsync:',
1522+
0x9D: 'rtmfp:',
1523+
0x9E: 'rtmp:',
1524+
0x9F: 'secondlife:',
1525+
0xA0: 'sftp:',
1526+
0xA1: 'sgn:',
1527+
0xA2: 'skype:',
1528+
0xA3: 'smb:',
1529+
0xA4: 'smtp:',
1530+
0xA5: 'soldat:',
1531+
0xA6: 'spotify:',
1532+
0xA7: 'ssh:',
1533+
0xA8: 'steam:',
1534+
0xA9: 'submit:',
1535+
0xAA: 'svn:',
1536+
0xAB: 'teamspeak:',
1537+
0xAC: 'teliaeid:',
1538+
0xAD: 'things:',
1539+
0xAE: 'udp:',
1540+
0xAF: 'unreal:',
1541+
0xB0: 'ut2004:',
1542+
0xB1: 'ventrilo:',
1543+
0xB2: 'viewsource:',
1544+
0xB3: 'webcal:',
1545+
0xB4: 'wtai:',
1546+
0xB5: 'wyciwyg:',
1547+
0xB6: 'xfire:',
1548+
0xB7: 'xri:',
1549+
0xB8: 'ymsgr:',
1550+
0xB9: 'example:',
1551+
0xBA: 'mssettingscloudstorage:'
1552+
}),
1553+
StrLenField('uri_hier_part', None, length_from=EIR_Element.length_from)
1554+
]
1555+
1556+
@property
1557+
def uri(self):
1558+
return EIR_URI.scheme.i2s[self.scheme] + self.uri_hier_part.decode('utf-8')
1559+
1560+
13621561
class HCI_Command_Hdr(Packet):
13631562
name = "HCI Command header"
13641563
fields_desc = [XBitField("ogf", 0, 6, tot_size=-2),
@@ -2452,6 +2651,7 @@ class HCI_LE_Meta_Long_Term_Key_Request(Packet):
24522651
bind_layers(EIR_Hdr, EIR_AdvertisingInterval, type=0x1a)
24532652
bind_layers(EIR_Hdr, EIR_ServiceData32BitUUID, type=0x20)
24542653
bind_layers(EIR_Hdr, EIR_ServiceData128BitUUID, type=0x21)
2654+
bind_layers(EIR_Hdr, EIR_URI, type=0x24)
24552655
bind_layers(EIR_Hdr, EIR_Manufacturer_Specific_Data, type=0xff)
24562656
bind_layers(EIR_Hdr, EIR_Raw)
24572657

test/scapy/layers/bluetooth.uts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,14 @@ p = HCI_Hdr(hex_bytes('042fff01c47c80894df801000c0128a269a30c4a125d13f30196894df
494494
assert EIR_ServiceData32BitUUID in p
495495
assert p[EIR_ServiceData32BitUUID].svc_uuid == 0x001a1af6
496496

497+
= Parse EIR_URI
498+
499+
p = HCI_Event_Hdr(hex_bytes('3e2902010301f3c1dad728031d1c24172f2f6669726d776172652e73696c766169722e636f6d2f6f6f62ac'))
500+
assert EIR_URI in p
501+
assert p[EIR_URI].scheme == 0x17
502+
assert p[EIR_URI].uri_hier_part == b'//firmware.silvair.com/oob'
503+
assert p[EIR_URI].uri == 'https://firmware.silvair.com/oob'
504+
497505
= Parse EIR_Flags, EIR_CompleteList16BitServiceUUIDs, EIR_CompleteLocalName and EIR_TX_Power_Level
498506

499507
ad_report_raw_data = \

0 commit comments

Comments
 (0)