@zwave-js/cc 14.1.0 → 14.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/cc/AlarmSensorCC.js.map +2 -2
- package/build/cjs/cc/AssociationCC.d.ts +2 -0
- package/build/cjs/cc/AssociationCC.js +5 -0
- package/build/cjs/cc/AssociationCC.js.map +2 -2
- package/build/cjs/cc/AssociationGroupInfoCC.js.map +2 -2
- package/build/cjs/cc/BarrierOperatorCC.js.map +2 -2
- package/build/cjs/cc/BasicCC.js.map +2 -2
- package/build/cjs/cc/BatteryCC.js.map +2 -2
- package/build/cjs/cc/BinarySensorCC.js.map +2 -2
- package/build/cjs/cc/BinarySwitchCC.js.map +2 -2
- package/build/cjs/cc/CRC16CC.d.ts +4 -0
- package/build/cjs/cc/CRC16CC.js +23 -0
- package/build/cjs/cc/CRC16CC.js.map +2 -2
- package/build/cjs/cc/CentralSceneCC.js.map +2 -2
- package/build/cjs/cc/ClimateControlScheduleCC.js.map +2 -2
- package/build/cjs/cc/ClockCC.js.map +2 -2
- package/build/cjs/cc/ColorSwitchCC.js.map +2 -2
- package/build/cjs/cc/ConfigurationCC.d.ts +4 -0
- package/build/cjs/cc/ConfigurationCC.js +10 -0
- package/build/cjs/cc/ConfigurationCC.js.map +2 -2
- package/build/cjs/cc/DoorLockCC.js.map +2 -2
- package/build/cjs/cc/DoorLockLoggingCC.js.map +2 -2
- package/build/cjs/cc/EnergyProductionCC.js.map +2 -2
- package/build/cjs/cc/EntryControlCC.js.map +2 -2
- package/build/cjs/cc/FirmwareUpdateMetaDataCC.js.map +2 -2
- package/build/cjs/cc/HumidityControlModeCC.js.map +2 -2
- package/build/cjs/cc/HumidityControlSetpointCC.js.map +2 -2
- package/build/cjs/cc/InclusionControllerCC.js.map +2 -2
- package/build/cjs/cc/IndicatorCC.js.map +2 -2
- package/build/cjs/cc/IrrigationCC.js.map +2 -2
- package/build/cjs/cc/LanguageCC.js.map +2 -2
- package/build/cjs/cc/LockCC.js.map +2 -2
- package/build/cjs/cc/ManufacturerProprietaryCC.js.map +2 -2
- package/build/cjs/cc/ManufacturerSpecificCC.js.map +2 -2
- package/build/cjs/cc/MeterCC.js.map +2 -2
- package/build/cjs/cc/MultiChannelAssociationCC.d.ts +2 -0
- package/build/cjs/cc/MultiChannelAssociationCC.js +6 -0
- package/build/cjs/cc/MultiChannelAssociationCC.js.map +2 -2
- package/build/cjs/cc/MultiChannelCC.d.ts +10 -0
- package/build/cjs/cc/MultiChannelCC.js +65 -0
- package/build/cjs/cc/MultiChannelCC.js.map +2 -2
- package/build/cjs/cc/MultiCommandCC.d.ts +4 -0
- package/build/cjs/cc/MultiCommandCC.js +34 -1
- package/build/cjs/cc/MultiCommandCC.js.map +2 -2
- package/build/cjs/cc/MultilevelSensorCC.js.map +2 -2
- package/build/cjs/cc/MultilevelSwitchCC.js.map +2 -2
- package/build/cjs/cc/NodeNamingCC.js.map +2 -2
- package/build/cjs/cc/NotificationCC.js.map +2 -2
- package/build/cjs/cc/PowerlevelCC.js.map +2 -2
- package/build/cjs/cc/ProtectionCC.js.map +2 -2
- package/build/cjs/cc/SceneActivationCC.js.map +2 -2
- package/build/cjs/cc/SceneActuatorConfigurationCC.js.map +2 -2
- package/build/cjs/cc/SceneControllerConfigurationCC.js.map +2 -2
- package/build/cjs/cc/ScheduleEntryLockCC.js.map +2 -2
- package/build/cjs/cc/Security2CC.d.ts +4 -0
- package/build/cjs/cc/Security2CC.js +215 -0
- package/build/cjs/cc/Security2CC.js.map +2 -2
- package/build/cjs/cc/SecurityCC.d.ts +6 -0
- package/build/cjs/cc/SecurityCC.js +53 -0
- package/build/cjs/cc/SecurityCC.js.map +2 -2
- package/build/cjs/cc/SoundSwitchCC.js.map +2 -2
- package/build/cjs/cc/SupervisionCC.d.ts +4 -0
- package/build/cjs/cc/SupervisionCC.js +25 -0
- package/build/cjs/cc/SupervisionCC.js.map +2 -2
- package/build/cjs/cc/ThermostatFanModeCC.js.map +2 -2
- package/build/cjs/cc/ThermostatModeCC.js.map +2 -2
- package/build/cjs/cc/ThermostatSetbackCC.js.map +2 -2
- package/build/cjs/cc/ThermostatSetpointCC.js.map +2 -2
- package/build/cjs/cc/TimeCC.js.map +2 -2
- package/build/cjs/cc/TimeParametersCC.js.map +2 -2
- package/build/cjs/cc/TransportServiceCC.d.ts +5 -0
- package/build/cjs/cc/TransportServiceCC.js +13 -0
- package/build/cjs/cc/TransportServiceCC.js.map +2 -2
- package/build/cjs/cc/UserCodeCC.js.map +2 -2
- package/build/cjs/cc/VersionCC.js.map +2 -2
- package/build/cjs/cc/WakeUpCC.js.map +2 -2
- package/build/cjs/cc/WindowCoveringCC.js.map +2 -2
- package/build/cjs/cc/ZWavePlusCC.js.map +2 -2
- package/build/cjs/cc/ZWaveProtocolCC.js.map +2 -2
- package/build/cjs/cc/manufacturerProprietary/Decorators.js +6 -5
- package/build/cjs/cc/manufacturerProprietary/Decorators.js.map +2 -2
- package/build/cjs/cc/manufacturerProprietary/FibaroCC.js.map +2 -2
- package/build/cjs/lib/CommandClass.d.ts +15 -1
- package/build/cjs/lib/CommandClass.js +56 -1
- package/build/cjs/lib/CommandClass.js.map +2 -2
- package/build/cjs/lib/CommandClassDecorators.js +7 -6
- package/build/cjs/lib/CommandClassDecorators.js.map +2 -2
- package/build/cjs/lib/Security2/Extension.js +2 -2
- package/build/cjs/lib/Security2/Extension.js.map +2 -2
- package/build/esm/cc/AlarmSensorCC.d.ts.map +1 -1
- package/build/esm/cc/AlarmSensorCC.js +1 -0
- package/build/esm/cc/AlarmSensorCC.js.map +1 -1
- package/build/esm/cc/AssociationCC.d.ts +2 -0
- package/build/esm/cc/AssociationCC.d.ts.map +1 -1
- package/build/esm/cc/AssociationCC.js +14 -0
- package/build/esm/cc/AssociationCC.js.map +1 -1
- package/build/esm/cc/AssociationGroupInfoCC.d.ts.map +1 -1
- package/build/esm/cc/AssociationGroupInfoCC.js +6 -0
- package/build/esm/cc/AssociationGroupInfoCC.js.map +1 -1
- package/build/esm/cc/BarrierOperatorCC.d.ts.map +1 -1
- package/build/esm/cc/BarrierOperatorCC.js +3 -0
- package/build/esm/cc/BarrierOperatorCC.js.map +1 -1
- package/build/esm/cc/BasicCC.d.ts.map +1 -1
- package/build/esm/cc/BasicCC.js +2 -0
- package/build/esm/cc/BasicCC.js.map +1 -1
- package/build/esm/cc/BatteryCC.d.ts.map +1 -1
- package/build/esm/cc/BatteryCC.js +1 -0
- package/build/esm/cc/BatteryCC.js.map +1 -1
- package/build/esm/cc/BinarySensorCC.d.ts.map +1 -1
- package/build/esm/cc/BinarySensorCC.js +3 -0
- package/build/esm/cc/BinarySensorCC.js.map +1 -1
- package/build/esm/cc/BinarySwitchCC.d.ts.map +1 -1
- package/build/esm/cc/BinarySwitchCC.js +2 -0
- package/build/esm/cc/BinarySwitchCC.js.map +1 -1
- package/build/esm/cc/CRC16CC.d.ts +4 -0
- package/build/esm/cc/CRC16CC.d.ts.map +1 -1
- package/build/esm/cc/CRC16CC.js +30 -0
- package/build/esm/cc/CRC16CC.js.map +1 -1
- package/build/esm/cc/CentralSceneCC.d.ts.map +1 -1
- package/build/esm/cc/CentralSceneCC.js +1 -0
- package/build/esm/cc/CentralSceneCC.js.map +1 -1
- package/build/esm/cc/ClimateControlScheduleCC.d.ts.map +1 -1
- package/build/esm/cc/ClimateControlScheduleCC.js +3 -0
- package/build/esm/cc/ClimateControlScheduleCC.js.map +1 -1
- package/build/esm/cc/ClockCC.d.ts.map +1 -1
- package/build/esm/cc/ClockCC.js +1 -0
- package/build/esm/cc/ClockCC.js.map +1 -1
- package/build/esm/cc/ColorSwitchCC.d.ts.map +1 -1
- package/build/esm/cc/ColorSwitchCC.js +6 -0
- package/build/esm/cc/ColorSwitchCC.js.map +1 -1
- package/build/esm/cc/ConfigurationCC.d.ts +4 -0
- package/build/esm/cc/ConfigurationCC.d.ts.map +1 -1
- package/build/esm/cc/ConfigurationCC.js +27 -0
- package/build/esm/cc/ConfigurationCC.js.map +1 -1
- package/build/esm/cc/DoorLockCC.d.ts.map +1 -1
- package/build/esm/cc/DoorLockCC.js +2 -0
- package/build/esm/cc/DoorLockCC.js.map +1 -1
- package/build/esm/cc/DoorLockLoggingCC.d.ts.map +1 -1
- package/build/esm/cc/DoorLockLoggingCC.js +1 -0
- package/build/esm/cc/DoorLockLoggingCC.js.map +1 -1
- package/build/esm/cc/EnergyProductionCC.d.ts.map +1 -1
- package/build/esm/cc/EnergyProductionCC.js +2 -0
- package/build/esm/cc/EnergyProductionCC.js.map +1 -1
- package/build/esm/cc/EntryControlCC.d.ts.map +1 -1
- package/build/esm/cc/EntryControlCC.js +1 -0
- package/build/esm/cc/EntryControlCC.js.map +1 -1
- package/build/esm/cc/FirmwareUpdateMetaDataCC.d.ts.map +1 -1
- package/build/esm/cc/FirmwareUpdateMetaDataCC.js +5 -0
- package/build/esm/cc/FirmwareUpdateMetaDataCC.js.map +1 -1
- package/build/esm/cc/HumidityControlModeCC.d.ts.map +1 -1
- package/build/esm/cc/HumidityControlModeCC.js +1 -0
- package/build/esm/cc/HumidityControlModeCC.js.map +1 -1
- package/build/esm/cc/HumidityControlSetpointCC.d.ts.map +1 -1
- package/build/esm/cc/HumidityControlSetpointCC.js +4 -0
- package/build/esm/cc/HumidityControlSetpointCC.js.map +1 -1
- package/build/esm/cc/InclusionControllerCC.d.ts.map +1 -1
- package/build/esm/cc/InclusionControllerCC.js +2 -0
- package/build/esm/cc/InclusionControllerCC.js.map +1 -1
- package/build/esm/cc/IndicatorCC.d.ts.map +1 -1
- package/build/esm/cc/IndicatorCC.js +7 -0
- package/build/esm/cc/IndicatorCC.js.map +1 -1
- package/build/esm/cc/IrrigationCC.d.ts.map +1 -1
- package/build/esm/cc/IrrigationCC.js +9 -0
- package/build/esm/cc/IrrigationCC.js.map +1 -1
- package/build/esm/cc/LanguageCC.d.ts.map +1 -1
- package/build/esm/cc/LanguageCC.js +1 -0
- package/build/esm/cc/LanguageCC.js.map +1 -1
- package/build/esm/cc/LockCC.d.ts.map +1 -1
- package/build/esm/cc/LockCC.js +1 -0
- package/build/esm/cc/LockCC.js.map +1 -1
- package/build/esm/cc/ManufacturerProprietaryCC.d.ts.map +1 -1
- package/build/esm/cc/ManufacturerProprietaryCC.js +2 -0
- package/build/esm/cc/ManufacturerProprietaryCC.js.map +1 -1
- package/build/esm/cc/ManufacturerSpecificCC.d.ts.map +1 -1
- package/build/esm/cc/ManufacturerSpecificCC.js +2 -0
- package/build/esm/cc/ManufacturerSpecificCC.js.map +1 -1
- package/build/esm/cc/MeterCC.d.ts.map +1 -1
- package/build/esm/cc/MeterCC.js +4 -0
- package/build/esm/cc/MeterCC.js.map +1 -1
- package/build/esm/cc/MultiChannelAssociationCC.d.ts +2 -0
- package/build/esm/cc/MultiChannelAssociationCC.d.ts.map +1 -1
- package/build/esm/cc/MultiChannelAssociationCC.js +17 -0
- package/build/esm/cc/MultiChannelAssociationCC.js.map +1 -1
- package/build/esm/cc/MultiChannelCC.d.ts +10 -0
- package/build/esm/cc/MultiChannelCC.d.ts.map +1 -1
- package/build/esm/cc/MultiChannelCC.js +94 -0
- package/build/esm/cc/MultiChannelCC.js.map +1 -1
- package/build/esm/cc/MultiCommandCC.d.ts +4 -0
- package/build/esm/cc/MultiCommandCC.d.ts.map +1 -1
- package/build/esm/cc/MultiCommandCC.js +35 -1
- package/build/esm/cc/MultiCommandCC.js.map +1 -1
- package/build/esm/cc/MultilevelSensorCC.d.ts.map +1 -1
- package/build/esm/cc/MultilevelSensorCC.js +5 -0
- package/build/esm/cc/MultilevelSensorCC.js.map +1 -1
- package/build/esm/cc/MultilevelSwitchCC.d.ts.map +1 -1
- package/build/esm/cc/MultilevelSwitchCC.js +4 -0
- package/build/esm/cc/MultilevelSwitchCC.js.map +1 -1
- package/build/esm/cc/NodeNamingCC.d.ts.map +1 -1
- package/build/esm/cc/NodeNamingCC.js +2 -0
- package/build/esm/cc/NodeNamingCC.js.map +1 -1
- package/build/esm/cc/NotificationCC.d.ts.map +1 -1
- package/build/esm/cc/NotificationCC.js +9 -0
- package/build/esm/cc/NotificationCC.js.map +1 -1
- package/build/esm/cc/PowerlevelCC.d.ts.map +1 -1
- package/build/esm/cc/PowerlevelCC.js +4 -0
- package/build/esm/cc/PowerlevelCC.js.map +1 -1
- package/build/esm/cc/ProtectionCC.d.ts.map +1 -1
- package/build/esm/cc/ProtectionCC.js +3 -0
- package/build/esm/cc/ProtectionCC.js.map +1 -1
- package/build/esm/cc/SceneActivationCC.d.ts.map +1 -1
- package/build/esm/cc/SceneActivationCC.js +1 -0
- package/build/esm/cc/SceneActivationCC.js.map +1 -1
- package/build/esm/cc/SceneActuatorConfigurationCC.d.ts.map +1 -1
- package/build/esm/cc/SceneActuatorConfigurationCC.js +2 -0
- package/build/esm/cc/SceneActuatorConfigurationCC.js.map +1 -1
- package/build/esm/cc/SceneControllerConfigurationCC.d.ts.map +1 -1
- package/build/esm/cc/SceneControllerConfigurationCC.js +2 -0
- package/build/esm/cc/SceneControllerConfigurationCC.js.map +1 -1
- package/build/esm/cc/ScheduleEntryLockCC.d.ts.map +1 -1
- package/build/esm/cc/ScheduleEntryLockCC.js +14 -0
- package/build/esm/cc/ScheduleEntryLockCC.js.map +1 -1
- package/build/esm/cc/Security2CC.d.ts +4 -0
- package/build/esm/cc/Security2CC.d.ts.map +1 -1
- package/build/esm/cc/Security2CC.js +301 -0
- package/build/esm/cc/Security2CC.js.map +1 -1
- package/build/esm/cc/SecurityCC.d.ts +6 -0
- package/build/esm/cc/SecurityCC.d.ts.map +1 -1
- package/build/esm/cc/SecurityCC.js +73 -0
- package/build/esm/cc/SecurityCC.js.map +1 -1
- package/build/esm/cc/SoundSwitchCC.d.ts.map +1 -1
- package/build/esm/cc/SoundSwitchCC.js +7 -0
- package/build/esm/cc/SoundSwitchCC.js.map +1 -1
- package/build/esm/cc/SupervisionCC.d.ts +4 -0
- package/build/esm/cc/SupervisionCC.d.ts.map +1 -1
- package/build/esm/cc/SupervisionCC.js +30 -0
- package/build/esm/cc/SupervisionCC.js.map +1 -1
- package/build/esm/cc/ThermostatFanModeCC.d.ts.map +1 -1
- package/build/esm/cc/ThermostatFanModeCC.js +1 -0
- package/build/esm/cc/ThermostatFanModeCC.js.map +1 -1
- package/build/esm/cc/ThermostatModeCC.d.ts.map +1 -1
- package/build/esm/cc/ThermostatModeCC.js +3 -0
- package/build/esm/cc/ThermostatModeCC.js.map +1 -1
- package/build/esm/cc/ThermostatSetbackCC.d.ts.map +1 -1
- package/build/esm/cc/ThermostatSetbackCC.js +2 -0
- package/build/esm/cc/ThermostatSetbackCC.js.map +1 -1
- package/build/esm/cc/ThermostatSetpointCC.d.ts.map +1 -1
- package/build/esm/cc/ThermostatSetpointCC.js +6 -0
- package/build/esm/cc/ThermostatSetpointCC.js.map +1 -1
- package/build/esm/cc/TimeCC.d.ts.map +1 -1
- package/build/esm/cc/TimeCC.js +4 -0
- package/build/esm/cc/TimeCC.js.map +1 -1
- package/build/esm/cc/TimeParametersCC.d.ts.map +1 -1
- package/build/esm/cc/TimeParametersCC.js +1 -0
- package/build/esm/cc/TimeParametersCC.js.map +1 -1
- package/build/esm/cc/TransportServiceCC.d.ts +5 -0
- package/build/esm/cc/TransportServiceCC.d.ts.map +1 -1
- package/build/esm/cc/TransportServiceCC.js +24 -0
- package/build/esm/cc/TransportServiceCC.js.map +1 -1
- package/build/esm/cc/UserCodeCC.d.ts.map +1 -1
- package/build/esm/cc/UserCodeCC.js +12 -0
- package/build/esm/cc/UserCodeCC.js.map +1 -1
- package/build/esm/cc/VersionCC.d.ts.map +1 -1
- package/build/esm/cc/VersionCC.js +4 -0
- package/build/esm/cc/VersionCC.js.map +1 -1
- package/build/esm/cc/WakeUpCC.d.ts.map +1 -1
- package/build/esm/cc/WakeUpCC.js +1 -0
- package/build/esm/cc/WakeUpCC.js.map +1 -1
- package/build/esm/cc/WindowCoveringCC.d.ts.map +1 -1
- package/build/esm/cc/WindowCoveringCC.js +5 -0
- package/build/esm/cc/WindowCoveringCC.js.map +1 -1
- package/build/esm/cc/ZWavePlusCC.d.ts.map +1 -1
- package/build/esm/cc/ZWavePlusCC.js +1 -0
- package/build/esm/cc/ZWavePlusCC.js.map +1 -1
- package/build/esm/cc/ZWaveProtocolCC.d.ts.map +1 -1
- package/build/esm/cc/ZWaveProtocolCC.js +27 -0
- package/build/esm/cc/ZWaveProtocolCC.js.map +1 -1
- package/build/esm/cc/manufacturerProprietary/Decorators.d.ts.map +1 -1
- package/build/esm/cc/manufacturerProprietary/Decorators.js +2 -1
- package/build/esm/cc/manufacturerProprietary/Decorators.js.map +1 -1
- package/build/esm/cc/manufacturerProprietary/FibaroCC.d.ts.map +1 -1
- package/build/esm/cc/manufacturerProprietary/FibaroCC.js +3 -0
- package/build/esm/cc/manufacturerProprietary/FibaroCC.js.map +1 -1
- package/build/esm/lib/CommandClass.d.ts +15 -1
- package/build/esm/lib/CommandClass.d.ts.map +1 -1
- package/build/esm/lib/CommandClass.js +94 -1
- package/build/esm/lib/CommandClass.js.map +1 -1
- package/build/esm/lib/CommandClassDecorators.d.ts.map +1 -1
- package/build/esm/lib/CommandClassDecorators.js +2 -1
- package/build/esm/lib/CommandClassDecorators.js.map +1 -1
- package/build/esm/lib/Security2/Extension.js +1 -1
- package/build/esm/lib/Security2/Extension.js.map +1 -1
- package/package.json +4 -4
|
@@ -832,6 +832,7 @@ let Security2CCMessageEncapsulation = (() => {
|
|
|
832
832
|
throw new import_core.ZWaveError("Multicast Security S2 encapsulation requires the MGRP extension", import_core.ZWaveErrorCodes.Security2CC_MissingExtension);
|
|
833
833
|
}
|
|
834
834
|
}
|
|
835
|
+
/** @deprecated Use {@link fromAsync} instead */
|
|
835
836
|
static from(raw, ctx) {
|
|
836
837
|
const securityManager = assertSecurityRX(ctx);
|
|
837
838
|
(0, import_core.validatePayload)(raw.payload.length >= 2);
|
|
@@ -997,6 +998,171 @@ let Security2CCMessageEncapsulation = (() => {
|
|
|
997
998
|
ret.plaintext = decryptedCCBytes;
|
|
998
999
|
return ret;
|
|
999
1000
|
}
|
|
1001
|
+
static async fromAsync(raw, ctx) {
|
|
1002
|
+
const securityManager = assertSecurityRX(ctx);
|
|
1003
|
+
(0, import_core.validatePayload)(raw.payload.length >= 2);
|
|
1004
|
+
const sequenceNumber = raw.payload[0];
|
|
1005
|
+
import_core.validatePayload.withReason("No security class granted")(ctx.getHighestSecurityClass(ctx.sourceNodeId) !== import_core.SecurityClass.None);
|
|
1006
|
+
const hasExtensions = !!(raw.payload[1] & 1);
|
|
1007
|
+
const hasEncryptedExtensions = !!(raw.payload[1] & 2);
|
|
1008
|
+
let offset = 2;
|
|
1009
|
+
const extensions = [];
|
|
1010
|
+
let mustDiscardCommand = false;
|
|
1011
|
+
const parseExtensions = (buffer, wasEncrypted) => {
|
|
1012
|
+
while (true) {
|
|
1013
|
+
if (buffer.length < offset + 2) {
|
|
1014
|
+
mustDiscardCommand = true;
|
|
1015
|
+
return;
|
|
1016
|
+
}
|
|
1017
|
+
const { actual: actualLength, expected: expectedLength } = import_Extension.Security2Extension.getExtensionLength(buffer.subarray(offset));
|
|
1018
|
+
const extensionLength = expectedLength ?? actualLength;
|
|
1019
|
+
if (extensionLength < 2) {
|
|
1020
|
+
mustDiscardCommand = true;
|
|
1021
|
+
return;
|
|
1022
|
+
} else if (extensionLength > buffer.length - offset - (wasEncrypted ? 0 : import_core.SECURITY_S2_AUTH_TAG_LENGTH)) {
|
|
1023
|
+
mustDiscardCommand = true;
|
|
1024
|
+
return;
|
|
1025
|
+
}
|
|
1026
|
+
const extensionData = buffer.subarray(offset, offset + extensionLength);
|
|
1027
|
+
offset += extensionLength;
|
|
1028
|
+
const ext = import_Extension.Security2Extension.parse(extensionData);
|
|
1029
|
+
switch ((0, import_Extension.validateS2Extension)(ext, wasEncrypted)) {
|
|
1030
|
+
case import_Extension.ValidateS2ExtensionResult.OK:
|
|
1031
|
+
if (expectedLength != void 0 && actualLength !== expectedLength) {
|
|
1032
|
+
} else {
|
|
1033
|
+
extensions.push(ext);
|
|
1034
|
+
}
|
|
1035
|
+
break;
|
|
1036
|
+
case import_Extension.ValidateS2ExtensionResult.DiscardExtension:
|
|
1037
|
+
break;
|
|
1038
|
+
case import_Extension.ValidateS2ExtensionResult.DiscardCommand:
|
|
1039
|
+
mustDiscardCommand = true;
|
|
1040
|
+
break;
|
|
1041
|
+
}
|
|
1042
|
+
if (!ext.moreToFollow)
|
|
1043
|
+
break;
|
|
1044
|
+
}
|
|
1045
|
+
};
|
|
1046
|
+
if (hasExtensions)
|
|
1047
|
+
parseExtensions(raw.payload, false);
|
|
1048
|
+
const mcctx = (() => {
|
|
1049
|
+
const multicastGroupId = getMulticastGroupId(extensions);
|
|
1050
|
+
if (ctx.frameType === "multicast" || ctx.frameType === "broadcast") {
|
|
1051
|
+
if (multicastGroupId == void 0) {
|
|
1052
|
+
import_core.validatePayload.fail("Multicast frames without MGRP extension");
|
|
1053
|
+
}
|
|
1054
|
+
return {
|
|
1055
|
+
isMulticast: true,
|
|
1056
|
+
groupId: multicastGroupId
|
|
1057
|
+
};
|
|
1058
|
+
} else {
|
|
1059
|
+
return { isMulticast: false, groupId: multicastGroupId };
|
|
1060
|
+
}
|
|
1061
|
+
})();
|
|
1062
|
+
if (mustDiscardCommand) {
|
|
1063
|
+
if (mcctx.isMulticast) {
|
|
1064
|
+
securityManager.nextPeerMPAN(ctx.sourceNodeId, mcctx.groupId);
|
|
1065
|
+
} else {
|
|
1066
|
+
securityManager.nextNonce(ctx.sourceNodeId);
|
|
1067
|
+
}
|
|
1068
|
+
import_core.validatePayload.fail("Invalid S2 extension");
|
|
1069
|
+
}
|
|
1070
|
+
let prevSequenceNumber;
|
|
1071
|
+
let mpanState;
|
|
1072
|
+
if (mcctx.isMulticast) {
|
|
1073
|
+
mpanState = securityManager.getPeerMPAN(ctx.sourceNodeId, mcctx.groupId);
|
|
1074
|
+
} else {
|
|
1075
|
+
prevSequenceNumber = validateSequenceNumber(securityManager, ctx.sourceNodeId, sequenceNumber);
|
|
1076
|
+
if (mcctx.groupId == void 0) {
|
|
1077
|
+
securityManager.resetOutOfSyncMPANs(ctx.sourceNodeId);
|
|
1078
|
+
}
|
|
1079
|
+
}
|
|
1080
|
+
const unencryptedPayload = raw.payload.subarray(0, offset);
|
|
1081
|
+
const ciphertext = raw.payload.subarray(offset, -import_core.SECURITY_S2_AUTH_TAG_LENGTH);
|
|
1082
|
+
const authTag = raw.payload.subarray(-import_core.SECURITY_S2_AUTH_TAG_LENGTH);
|
|
1083
|
+
const messageLength = 2 + raw.payload.length;
|
|
1084
|
+
const authData = getAuthenticationData(ctx.sourceNodeId, getDestinationIDRX(ctx, extensions), ctx.homeId, messageLength, unencryptedPayload);
|
|
1085
|
+
let decrypt;
|
|
1086
|
+
if (mcctx.isMulticast) {
|
|
1087
|
+
if (mpanState?.type !== import_core.MPANState.MPAN) {
|
|
1088
|
+
securityManager.storePeerMPAN(ctx.sourceNodeId, mcctx.groupId, { type: import_core.MPANState.OutOfSync });
|
|
1089
|
+
failNoMPAN();
|
|
1090
|
+
}
|
|
1091
|
+
decrypt = () => decryptMulticast(ctx.sourceNodeId, securityManager, mcctx.groupId, ciphertext, authData, authTag);
|
|
1092
|
+
} else {
|
|
1093
|
+
const spanState = securityManager.getSPANState(ctx.sourceNodeId);
|
|
1094
|
+
if (spanState.type === import_core.SPANState.None) {
|
|
1095
|
+
failNoSPAN();
|
|
1096
|
+
} else if (spanState.type === import_core.SPANState.RemoteEI) {
|
|
1097
|
+
failNoSPAN();
|
|
1098
|
+
}
|
|
1099
|
+
decrypt = () => decryptSinglecast(ctx, securityManager, ctx.sourceNodeId, sequenceNumber, prevSequenceNumber, ciphertext, authData, authTag, spanState, extensions);
|
|
1100
|
+
}
|
|
1101
|
+
let plaintext;
|
|
1102
|
+
let authOK = false;
|
|
1103
|
+
let key;
|
|
1104
|
+
let iv;
|
|
1105
|
+
let decryptionSecurityClass;
|
|
1106
|
+
const decryptAttempts = mcctx.isMulticast ? MAX_DECRYPT_ATTEMPTS_MULTICAST : mcctx.groupId != void 0 ? MAX_DECRYPT_ATTEMPTS_SC_FOLLOWUP : MAX_DECRYPT_ATTEMPTS_SINGLECAST;
|
|
1107
|
+
for (let i = 0; i < decryptAttempts; i++) {
|
|
1108
|
+
({
|
|
1109
|
+
plaintext,
|
|
1110
|
+
authOK,
|
|
1111
|
+
key,
|
|
1112
|
+
iv,
|
|
1113
|
+
securityClass: decryptionSecurityClass
|
|
1114
|
+
} = decrypt());
|
|
1115
|
+
if (!!authOK && !!plaintext)
|
|
1116
|
+
break;
|
|
1117
|
+
if (!!getSenderEI(extensions))
|
|
1118
|
+
break;
|
|
1119
|
+
}
|
|
1120
|
+
if (!authOK || !plaintext) {
|
|
1121
|
+
if (mcctx.isMulticast) {
|
|
1122
|
+
securityManager.storePeerMPAN(ctx.sourceNodeId, mcctx.groupId, { type: import_core.MPANState.OutOfSync });
|
|
1123
|
+
import_core.validatePayload.fail(import_core.ZWaveErrorCodes.Security2CC_CannotDecodeMulticast);
|
|
1124
|
+
} else {
|
|
1125
|
+
import_core.validatePayload.fail(import_core.ZWaveErrorCodes.Security2CC_CannotDecode);
|
|
1126
|
+
}
|
|
1127
|
+
} else if (!mcctx.isMulticast && mcctx.groupId != void 0) {
|
|
1128
|
+
securityManager.tryIncrementPeerMPAN(ctx.sourceNodeId, mcctx.groupId);
|
|
1129
|
+
}
|
|
1130
|
+
const securityClass = decryptionSecurityClass;
|
|
1131
|
+
offset = 0;
|
|
1132
|
+
if (hasEncryptedExtensions)
|
|
1133
|
+
parseExtensions(plaintext, true);
|
|
1134
|
+
if (mustDiscardCommand) {
|
|
1135
|
+
import_core.validatePayload.fail("Invalid extension");
|
|
1136
|
+
}
|
|
1137
|
+
if (!mcctx.isMulticast) {
|
|
1138
|
+
const mpanExtension = extensions.find((e) => e instanceof import_Extension.MPANExtension);
|
|
1139
|
+
if (mpanExtension) {
|
|
1140
|
+
securityManager.storePeerMPAN(ctx.sourceNodeId, mpanExtension.groupId, {
|
|
1141
|
+
type: import_core.MPANState.MPAN,
|
|
1142
|
+
currentMPAN: mpanExtension.innerMPANState
|
|
1143
|
+
});
|
|
1144
|
+
}
|
|
1145
|
+
}
|
|
1146
|
+
const decryptedCCBytes = plaintext.subarray(offset);
|
|
1147
|
+
let encapsulated;
|
|
1148
|
+
if (decryptedCCBytes.length > 0) {
|
|
1149
|
+
(0, import_core.validatePayload)(decryptedCCBytes.length >= 2);
|
|
1150
|
+
encapsulated = await import_CommandClass.CommandClass.parseAsync(decryptedCCBytes, ctx);
|
|
1151
|
+
}
|
|
1152
|
+
const ret = new Security2CCMessageEncapsulation2({
|
|
1153
|
+
nodeId: ctx.sourceNodeId,
|
|
1154
|
+
sequenceNumber,
|
|
1155
|
+
securityClass,
|
|
1156
|
+
extensions,
|
|
1157
|
+
encapsulated
|
|
1158
|
+
});
|
|
1159
|
+
ret.key = key;
|
|
1160
|
+
ret.iv = iv;
|
|
1161
|
+
ret.authData = authData;
|
|
1162
|
+
ret.authTag = authTag;
|
|
1163
|
+
ret.plaintext = decryptedCCBytes;
|
|
1164
|
+
return ret;
|
|
1165
|
+
}
|
|
1000
1166
|
securityClass;
|
|
1001
1167
|
// Only used for testing/debugging purposes
|
|
1002
1168
|
key;
|
|
@@ -1062,6 +1228,7 @@ let Security2CCMessageEncapsulation = (() => {
|
|
|
1062
1228
|
}
|
|
1063
1229
|
}
|
|
1064
1230
|
}
|
|
1231
|
+
/** @deprecated Use {@link serializeAsync} instead */
|
|
1065
1232
|
serialize(ctx) {
|
|
1066
1233
|
const securityManager = assertSecurityTX(ctx, this.nodeId);
|
|
1067
1234
|
this.ensureSequenceNumber(securityManager);
|
|
@@ -1110,6 +1277,54 @@ let Security2CCMessageEncapsulation = (() => {
|
|
|
1110
1277
|
]);
|
|
1111
1278
|
return super.serialize(ctx);
|
|
1112
1279
|
}
|
|
1280
|
+
async serializeAsync(ctx) {
|
|
1281
|
+
const securityManager = assertSecurityTX(ctx, this.nodeId);
|
|
1282
|
+
this.ensureSequenceNumber(securityManager);
|
|
1283
|
+
this.maybeAddSPANExtension(ctx, securityManager);
|
|
1284
|
+
const unencryptedExtensions = this.extensions.filter((e) => !e.isEncrypted());
|
|
1285
|
+
const encryptedExtensions = this.extensions.filter((e) => e.isEncrypted());
|
|
1286
|
+
const unencryptedPayload = import_safe2.Bytes.concat([
|
|
1287
|
+
import_safe2.Bytes.from([
|
|
1288
|
+
this.sequenceNumber,
|
|
1289
|
+
(encryptedExtensions.length > 0 ? 2 : 0) | (unencryptedExtensions.length > 0 ? 1 : 0)
|
|
1290
|
+
]),
|
|
1291
|
+
...unencryptedExtensions.map((e, index) => e.serialize(index < unencryptedExtensions.length - 1))
|
|
1292
|
+
]);
|
|
1293
|
+
const serializedCC = await this.encapsulated?.serializeAsync(ctx) ?? new import_safe2.Bytes();
|
|
1294
|
+
const plaintextPayload = import_safe2.Bytes.concat([
|
|
1295
|
+
...encryptedExtensions.map((e, index) => e.serialize(index < encryptedExtensions.length - 1)),
|
|
1296
|
+
serializedCC
|
|
1297
|
+
]);
|
|
1298
|
+
const destinationTag = getDestinationIDTX.call(this);
|
|
1299
|
+
const messageLength = this.computeEncapsulationOverhead() + serializedCC.length;
|
|
1300
|
+
const authData = getAuthenticationData(ctx.ownNodeId, destinationTag, ctx.homeId, messageLength, unencryptedPayload);
|
|
1301
|
+
let key;
|
|
1302
|
+
let iv;
|
|
1303
|
+
if (this.isSinglecast()) {
|
|
1304
|
+
iv = securityManager.nextNonce(this.nodeId, true);
|
|
1305
|
+
const { keyCCM } = (
|
|
1306
|
+
// Prefer the overridden security class if it was given
|
|
1307
|
+
this.securityClass != void 0 ? securityManager.getKeysForSecurityClass(this.securityClass) : securityManager.getKeysForNode(this.nodeId)
|
|
1308
|
+
);
|
|
1309
|
+
key = keyCCM;
|
|
1310
|
+
} else {
|
|
1311
|
+
const keyAndIV = securityManager.getMulticastKeyAndIV(destinationTag);
|
|
1312
|
+
key = keyAndIV.key;
|
|
1313
|
+
iv = keyAndIV.iv;
|
|
1314
|
+
}
|
|
1315
|
+
const { ciphertext: ciphertextPayload, authTag } = (0, import_core.encryptAES128CCM)(key, iv, plaintextPayload, authData, import_core.SECURITY_S2_AUTH_TAG_LENGTH);
|
|
1316
|
+
this.key = key;
|
|
1317
|
+
this.iv = iv;
|
|
1318
|
+
this.authData = authData;
|
|
1319
|
+
this.authTag = authTag;
|
|
1320
|
+
this.ciphertext = ciphertextPayload;
|
|
1321
|
+
this.payload = import_safe2.Bytes.concat([
|
|
1322
|
+
unencryptedPayload,
|
|
1323
|
+
ciphertextPayload,
|
|
1324
|
+
authTag
|
|
1325
|
+
]);
|
|
1326
|
+
return super.serializeAsync(ctx);
|
|
1327
|
+
}
|
|
1113
1328
|
computeEncapsulationOverhead() {
|
|
1114
1329
|
const extensionBytes = this.extensions.map((e) => e.computeLength()).reduce((a, b) => a + b, 0);
|
|
1115
1330
|
return super.computeEncapsulationOverhead() + 2 + import_core.SECURITY_S2_AUTH_TAG_LENGTH + extensionBytes;
|