def network_info(node_info): return app_state.NetworkInfo( extended_pan_id=t.ExtendedPanId.convert("0D:49:91:99:AE:CD:3C:35"), pan_id=t.PanId(0x9BB0), nwk_update_id=0x12, nwk_manager_id=t.NWK(0x0000), channel=t.uint8_t(15), channel_mask=t.Channels.from_channel_list([15, 20, 25]), security_level=t.uint8_t(5), network_key=app_state.Key( key=t.KeyData.convert( "9A:79:D6:9A:DA:EC:45:C6:F2:EF:EB:AF:DA:A3:07:B6"), seq=108, tx_counter=39009277, ), tc_link_key=app_state.Key( key=t.KeyData(b"ZigBeeAlliance09"), partner_ieee=node_info.ieee, tx_counter=8712428, ), key_table=[], children=[], nwk_addresses={}, stack_specific={}, source=f"zigpy-deconz@{zigpy_deconz.__version__}", metadata={"deconz": { "version": 0, }}, )
def test_keydata(): data = b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" extra = b"extra" key, rest = t.KeyData.deserialize(data + extra) assert rest == extra assert key == t.KeyData.convert("00:01:02:03:04:05:06:07:08:09:0a:0b:0c:0d:0e:0f") assert repr(key) == "00:01:02:03:04:05:06:07:08:09:0a:0b:0c:0d:0e:0f" assert list(key) == list(data) assert key.serialize() == data assert t.KeyData(key) == key
def cv_key(key: List[int]) -> t.KeyData: """Validate a key.""" if not isinstance(key, list) or not all(isinstance(v, int) for v in key): raise vol.Invalid("key must be a list of integers") if len(key) != 16: raise vol.Invalid("key length must be 16") if not all((0 <= e <= 255 for e in key)): raise vol.Invalid("Key bytes must be within (0..255) range") return t.KeyData(key)
def aes_mmo_hash(data: bytes) -> t.KeyData: block_size = AES.block_size // 8 result_len = 0 remaining_length = 0 length = len(data) result = bytearray([0] * block_size) temp = bytearray([0] * block_size) if data and length > 0: remaining_length = length & (block_size - 1) if length >= block_size: # Mask out the lower byte since hash update will hash # everything except the last piece, if the last piece # is less than 16 bytes. hashed_length = length & ~(block_size - 1) (result_len, result) = aes_mmo_hash_update(result_len, result, data) data = data[hashed_length:] for i in range(remaining_length): temp[i] = data[i] # Per the spec, Concatenate a 1 bit followed by all zero bits # (previous memset() on temp[] set the rest of the bits to zero) temp[remaining_length] = 0x80 result_len += remaining_length # If appending the bit string will push us beyond the 16-byte boundary # we must hash that block and append another 16-byte block. if (block_size - remaining_length) < 3: (result_len, result) = aes_mmo_hash_update(result_len, result, temp) # Since this extra data is due to the concatenation, # we remove that length. We want the length of data only # and not the padding. result_len -= block_size temp = bytearray([0] * block_size) bit_size = result_len * 8 temp[block_size - 2] = (bit_size >> 8) & 0xFF temp[block_size - 1] = (bit_size) & 0xFF (result_len, result) = aes_mmo_hash_update(result_len, result, temp) return t.KeyData(result)
CONF_NWK_CHANNELS_DEFAULT = [15, 20, 25] CONF_NWK_EXTENDED_PAN_ID_DEFAULT = None CONF_NWK_PAN_ID_DEFAULT = None CONF_NWK_KEY_DEFAULT = None CONF_NWK_KEY_SEQ_DEFAULT = 0x00 CONF_NWK_TC_ADDRESS_DEFAULT = None CONF_NWK_TC_LINK_KEY_DEFAULT = t.KeyData( [ 0x5A, 0x69, 0x67, 0x42, 0x65, 0x65, 0x41, 0x6C, 0x6C, 0x69, 0x61, 0x6E, 0x63, 0x65, 0x30, 0x39, ] ) CONF_NWK_UPDATE_ID_DEFAULT = 0x00 CONF_OTA_IKEA_DEFAULT = False CONF_OTA_LEDVANCE_DEFAULT = False CONF_OTA_SALUS_DEFAULT = False CONF_OTA_OTAU_DIR_DEFAULT = None CONF_TOPO_SCAN_PERIOD_DEFAULT = 240 # 4 hours