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

1"""Set Identity Resolving Key characteristic (0x2B84). 

2 

3Type (1 byte) + 16-byte Set Identity Resolving Key (SIRK) for CSIP. 

4 

5References: 

6 Bluetooth SIG Coordinated Set Identification Service 1.0, Section 3.1 

7""" 

8 

9from __future__ import annotations 

10 

11from enum import IntEnum 

12 

13import msgspec 

14 

15from ..context import CharacteristicContext 

16from .base import BaseCharacteristic 

17from .utils import DataParser 

18 

19 

20class SIRKType(IntEnum): 

21 """SIRK type as per CSIS 1.0, Section 3.1.""" 

22 

23 ENCRYPTED = 0x00 

24 PLAIN_TEXT = 0x01 

25 

26 

27class SetIdentityResolvingKeyData(msgspec.Struct, frozen=True, kw_only=True): 

28 """Parsed data from Set Identity Resolving Key characteristic.""" 

29 

30 sirk_type: SIRKType 

31 value: bytes 

32 

33 

34class SetIdentityResolvingKeyCharacteristic(BaseCharacteristic[SetIdentityResolvingKeyData]): 

35 """Set Identity Resolving Key characteristic (0x2B84). 

36 

37 org.bluetooth.characteristic.set_identity_resolving_key 

38 

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 """ 

43 

44 expected_length = 17 

45 

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]) 

51 

52 return SetIdentityResolvingKeyData(sirk_type=sirk_type, value=value) 

53 

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