Coverage for src / bluetooth_sig / gatt / characteristics / set_identity_resolving_key.py: 100%
23 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-03 16:41 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-03 16:41 +0000
1"""Set Identity Resolving Key characteristic (0x2B84).
3Type (1 byte) + 16-byte Set Identity Resolving Key (SIRK) for CSIP.
5References:
6 Bluetooth SIG Coordinated Set Identification Service 1.0, Section 3.1
7"""
9from __future__ import annotations
11from enum import IntEnum
13import msgspec
15from ..context import CharacteristicContext
16from .base import BaseCharacteristic
17from .utils import DataParser
20class SIRKType(IntEnum):
21 """SIRK type as per CSIS 1.0, Section 3.1."""
23 ENCRYPTED = 0x00
24 PLAIN_TEXT = 0x01
27class SetIdentityResolvingKeyData(msgspec.Struct, frozen=True, kw_only=True):
28 """Parsed data from Set Identity Resolving Key characteristic."""
30 sirk_type: SIRKType
31 value: bytes
34class SetIdentityResolvingKeyCharacteristic(BaseCharacteristic[SetIdentityResolvingKeyData]):
35 """Set Identity Resolving Key characteristic (0x2B84).
37 org.bluetooth.characteristic.set_identity_resolving_key
39 Type (uint8: 0x00=Encrypted, 0x01=Plain text) followed by
40 16-byte Set Identity Resolving Key used by the Coordinated Set
41 Identification Service for set member resolution.
42 """
44 expected_length = 17
46 def _decode_value(
47 self, data: bytearray, ctx: CharacteristicContext | None = None, *, validate: bool = True
48 ) -> SetIdentityResolvingKeyData:
49 sirk_type = SIRKType(DataParser.parse_int8(data, 0, signed=False))
50 value = bytes(data[1:17])
52 return SetIdentityResolvingKeyData(sirk_type=sirk_type, value=value)
54 def _encode_value(self, data: SetIdentityResolvingKeyData) -> bytearray:
55 result = bytearray()
56 result.extend(DataParser.encode_int8(int(data.sirk_type), signed=False))
57 result.extend(data.value[:16].ljust(16, b"\x00"))
58 return result