fix confidance/horizontal acc, add mac address

This commit is contained in:
Philip Magyar
2024-11-20 09:04:05 +01:00
parent 12de1db111
commit f45b9723f7
3 changed files with 21 additions and 4 deletions

View File

@@ -12,7 +12,7 @@ from typing import Generator, Generic, TypeVar, overload
from cryptography.hazmat.primitives.asymmetric import ec
from typing_extensions import override
from .util import crypto
from .util import crypto, parsers
class KeyType(Enum):
@@ -70,6 +70,12 @@ class HasPublicKey(HasHashedPublicKey, ABC):
def adv_key_b64(self) -> str:
"""Return the advertised (public) key as a base64-encoded string."""
return base64.b64encode(self.adv_key_bytes).decode("ascii")
@property
def mac_address(self) -> str:
"""Get the mac address from the public key."""
first_hex = self.adv_key_bytes[0] | 0b11000000
return parsers.format_hex_byte(first_hex) + ":" + ":".join([parsers.format_hex_byte(x) for x in self.adv_key_bytes[1:6]])
@property
@override

View File

@@ -121,6 +121,14 @@ class LocationReport(HasHashedPublicKey):
"""The `datetime` when this report was recorded by a device."""
timestamp_int = int.from_bytes(self._payload[0:4], "big") + (60 * 60 * 24 * 11323)
return datetime.fromtimestamp(timestamp_int, tz=timezone.utc).astimezone()
@property
def confidence(self) -> int:
"""Confidence of the location of this report. Int between 1 and 3"""
# If the payload length is 88, the confidence is the 5th byte, otherwise it's the 6th byte
if (len(self._payload) == 88):
return self.payload[4]
return self.payload[5]
@property
def latitude(self) -> float:
@@ -145,10 +153,10 @@ class LocationReport(HasHashedPublicKey):
return struct.unpack(">i", lon_bytes)[0] / 10000000
@property
def confidence(self) -> int:
"""Confidence of the location of this report."""
def horizontal_accuracy(self) -> int:
"""Horizontal accuracy of the location of this report."""
if not self.is_decrypted:
msg = "Confidence is unavailable while the report is encrypted."
msg = "Horizontal accuracy is unavailable while the report is encrypted."
raise RuntimeError(msg)
assert self._decrypted_data is not None

View File

@@ -15,3 +15,6 @@ def decode_plist(data: bytes) -> Any: # noqa: ANN401
data = plist_header + data
return plistlib.loads(data)
def format_hex_byte(byte):
return f'{byte:02x}'.upper()