protected override void SaveDataForRetransmission(InvariantPeerNodeId peerNodeId, byte[] plainData, SubstituteSettings substituteSettings, SecuritySchemes scheme) { var rTable = _securityManagerInfo.RetransmissionTableS2; /* Delete when counter: * 0 - item was retransmitted sucessfully (only one Nonce Report) * 2 - item sent from first try sucessfully (no Nonce Reports were received) */ if (rTable.ContainsKey(peerNodeId) && (rTable[peerNodeId].Counter == 0 || rTable[peerNodeId].Counter == 2)) { rTable.Remove(peerNodeId); } if (!rTable.ContainsKey(peerNodeId)) { rTable.Add(peerNodeId, new RetransmissionRecord(plainData)); rTable[peerNodeId].SubstituteSettings = substituteSettings; rTable[peerNodeId].SecurityScheme = scheme; rTable[peerNodeId].Counter = 2; } else { rTable[peerNodeId].Data = plainData; rTable[peerNodeId].Counter--; } }
/// <summary> /// Activates custom key for specified node /// </summary> /// <param name="nodeId">Node id</param> /// <param name="isTemp">Indicates if temp inclusion key will be activated</param> /// <param name="networkKey">Custom network key</param> public void ActivateNetworkKeyS2CustomForNode(InvariantPeerNodeId peerNodeId, bool isTemp, byte[] networkKey) { byte[] nk = new byte[16]; if (networkKey != null && networkKey.Length > 0) { Array.Copy(networkKey, nk, networkKey.Length > nk.Length ? nk.Length : networkKey.Length); } FireNetworkKeyS2Changed(peerNodeId, nk, isTemp ? SecuritySchemes.S2_TEMP : SecuritySchemes.S2_ACCESS); }
/// <summary> /// Activates network key from with specified security class for specified nodes /// </summary> /// <param name="peerNodeId">MSB is local NodeId, LSB is remote NodeId</param> /// <param name="scheme">scheme</param> public void ActivateNetworkKeyS2ForNode(InvariantPeerNodeId peerNodeId, SecuritySchemes scheme) { byte[] networkKey = null; if (scheme == SecuritySchemes.S2_TEMP) { networkKey = GetActualNetworkKeyS2Temp(); } else { networkKey = GetActualNetworkKey(scheme); } if (peerNodeId.IsEmpty) { _defaultActiveNetworkKeyType = scheme; } FireNetworkKeyS2Changed(peerNodeId, networkKey, scheme); }
internal SendDataSecureS2Task(SecurityManagerInfo securityManagerInfo, SecurityS2CryptoProvider securityS2CryptoProvider, SinglecastKey sckey, SpanTable spanTable, MpanTable mpanTable, byte nodeId, byte[] data, TransmitOptions txOptions) : base(false, null, false) { _securityManagerInfo = securityManagerInfo; _securityS2CryptoProvider = securityS2CryptoProvider; _mpanTable = mpanTable; _spanTable = spanTable; _sckey = sckey; SubstituteSettings.SetFlag(SubstituteFlags.DenySecurity); CommandToSecureSend = data; NodeId = nodeId; _peerNodeId = new InvariantPeerNodeId(_securityManagerInfo.Network.NodeId, NodeId); TxOptions = txOptions; _securityTestSettingsService = new SecurityTestSettingsService(_securityManagerInfo, false); }
private void Network_S2SchemeSettingsChanged(SecuritySchemes scheme, bool isEnabled) { if (SecuritySchemeSet.ALLS2.Contains(scheme)) { var nodeIds = _nodesMask.Where(id => id != Network.NodeId && Network.HasSecurityScheme(id, scheme)).ToList(); var selfNodeId = Network.NodeId; foreach (var id in nodeIds) { var key = new InvariantPeerNodeId(selfNodeId, id); if (ScKeys.ContainsKey(key)) { if ((int)scheme >= (int)ScKeys[key].SecurityScheme) { ScKeys.Remove(key); } } } if (MpanTable != null) { var groups = MpanTable.SelectGroupIds(selfNodeId).Where( groupId => { var container = MpanTable.GetContainer(new NodeGroupId(selfNodeId, groupId)); if (container != null) { return(container.ReceiverGroupHandle.Intersect(nodeIds).Any()); } return(false); }); foreach (var groupId in groups) { var peerGroupId = new NodeGroupId(selfNodeId, groupId); McKeys.Remove(peerGroupId); } } } }
protected override void OnHandledInternal(DataReceivedUnit ou) { var destNodeId = ReceivedAchData.DestNodeId > 0 ? ReceivedAchData.DestNodeId : _securityManagerInfo.Network.NodeId; SecuritySchemes scheme = SecuritySchemes.NONE; InvariantPeerNodeId peerNodeId = new InvariantPeerNodeId(destNodeId, ReceivedAchData.SrcNodeId); ou.SetNextActionItems(); if (!ou.DataFrame.IsSkippedSecurity) { if (_securityManagerInfo.Network.HasSecurityScheme(SecuritySchemeSet.ALLS2) && _securityManagerInfo.IsActive) { byte[] command = ReceivedAchData.Command; bool isNonceReport = false; bool isSupportedReport = false; // Only for test frame Extensions extensions = null; SubstituteSettings substituteSettings = null; if (command != null && command.Length > 1) { bool isSubstituteDenied = false; byte[] dataToSend = null; bool isMulticastFrame = (ou.DataFrame.Data[2] & MULTICAST_MASK) == MULTICAST_MASK; bool isBroadcastFrame = (ou.DataFrame.Data[2] & BROADCAST_MASK) == BROADCAST_MASK; if (command[1] == COMMAND_CLASS_SECURITY_2.SECURITY_2_NONCE_GET.ID && (SecuritySchemes)ReceivedAchData.SecurityScheme == SecuritySchemes.NONE) { byte rxSequenceNumber = command[2]; if (!isMulticastFrame && !isBroadcastFrame) { if (handlingNonceGetFromNode != ReceivedAchData.SrcNodeId) { handlingNonceGetFromNode = ReceivedAchData.SrcNodeId; var currentTxSequenceNumber = _spanTable.GetTxSequenceNumber(peerNodeId); _spanTable.SetNonceFree(peerNodeId); //reset MPAN for owner Id foreach (byte groupId in _mpanTable.SelectGroupIds(ReceivedAchData.SrcNodeId)) { _mpanTable.RemoveRecord(new NodeGroupId(ReceivedAchData.SrcNodeId, groupId)); } dataToSend = _securityS2CryptoProvider.GenerateNonceReport(_spanTable, peerNodeId, ++currentTxSequenceNumber, rxSequenceNumber, true, false); isNonceReport = true; isSubstituteDenied = true; } } } else if (command[1] == COMMAND_CLASS_SECURITY_2.SECURITY_2_MESSAGE_ENCAPSULATION.ID) { byte rxSequenceNumber = command[2]; if (!isMulticastFrame && !isBroadcastFrame && ValidateS2MessageExtensions(command)) { var currentTxSequenceNumber = _spanTable.GetTxSequenceNumber(peerNodeId); _spanTable.SetNonceFree(peerNodeId); var isMos = _securityS2CryptoProvider.CheckMpanMosForOwnerNode(_mpanTable, ReceivedAchData.SrcNodeId); dataToSend = _securityS2CryptoProvider.GenerateNonceReport(_spanTable, peerNodeId, ++currentTxSequenceNumber, rxSequenceNumber, true, isMos); isNonceReport = true; isSubstituteDenied = true; } } else if (command[1] == COMMAND_CLASS_SECURITY_2.SECURITY_2_NONCE_REPORT.ID && (SecuritySchemes)ReceivedAchData.SecurityScheme == SecuritySchemes.NONE) { if (!isMulticastFrame && !isBroadcastFrame) { COMMAND_CLASS_SECURITY_2.SECURITY_2_NONCE_REPORT nonceReportCmd = command; if (_securityManagerInfo.InitializingNodeId != ReceivedAchData.SrcNodeId) // Node must be already initialized. { if (nonceReportCmd.properties1.sos > 0 && // Singlecast out of sync. nonceReportCmd.receiversEntropyInput != null && nonceReportCmd.receiversEntropyInput.Count == 16 ) { var rTable = _securityManagerInfo.RetransmissionTableS2; if (rTable.ContainsKey(peerNodeId)) { if (rTable[peerNodeId].Counter > 0) { _spanTable.AddOrReplace(peerNodeId, nonceReportCmd.receiversEntropyInput.ToArray(), _spanTable.GetTxSequenceNumber(peerNodeId), nonceReportCmd.sequenceNumber); dataToSend = rTable[peerNodeId].Data; scheme = rTable[peerNodeId].SecurityScheme; substituteSettings = rTable[peerNodeId].SubstituteSettings; rTable[peerNodeId].Counter--; } else { rTable.Remove(peerNodeId); _spanTable.SetNonceFree(peerNodeId); } } else { _spanTable.SetNonceFree(peerNodeId); } } if (nonceReportCmd.properties1.mos > 0) // Mutlicast out of sync. { var groupId = _securityS2CryptoProvider.LastSentMulticastGroupId; extensions = new Extensions(); var nodeGroupId = new NodeGroupId(destNodeId, groupId); if (!_mpanTable.CheckMpanExists(nodeGroupId)) { _mpanTable.AddOrReplace(nodeGroupId, 0x55, null, _securityS2CryptoProvider.GetRandomData()); } extensions.AddMpanExtension(_mpanTable.GetContainer(nodeGroupId).MpanState, groupId); } } } } else if (command[1] == COMMAND_CLASS_SECURITY_2.SECURITY_2_COMMANDS_SUPPORTED_GET.ID) { if (!isMulticastFrame && !isBroadcastFrame) { scheme = (SecuritySchemes)ReceivedAchData.SecurityScheme; if (scheme != SecuritySchemes.NONE && scheme != SecuritySchemes.S0 && _securityManagerInfo.Network.HasSecurityScheme(scheme)) { if (!_securityManagerInfo.Network.HasSecurityScheme(ReceivedAchData.SrcNodeId, SecuritySchemeSet.ALLS2) && !_securityManagerInfo.Network.IsSecuritySchemesSpecified(ReceivedAchData.SrcNodeId)) { _securityManagerInfo.Network.SetSecuritySchemes(ReceivedAchData.SrcNodeId, SecuritySchemeSet.ALL); } isSupportedReport = true; var ccReport = new COMMAND_CLASS_SECURITY_2.SECURITY_2_COMMANDS_SUPPORTED_REPORT(); if (ReceivedAchData.CommandType == CommandTypes.CmdApplicationCommandHandler_Bridge && ReceivedAchData.DestNodeId != _securityManagerInfo.Network.NodeId) { ccReport.commandClass = new List <byte>(_securityManagerInfo.Network.GetVirtualSecureCommandClasses()); } else { var secureCommandClasses = _securityManagerInfo.Network.GetSecureCommandClasses(); if (secureCommandClasses != null) { switch (scheme) { case SecuritySchemes.S2_UNAUTHENTICATED: if (!_securityManagerInfo.Network.HasSecurityScheme(SecuritySchemes.S2_ACCESS) && !_securityManagerInfo.Network.HasSecurityScheme(SecuritySchemes.S2_AUTHENTICATED)) { ccReport.commandClass = new List <byte>(_securityManagerInfo.Network.GetSecureCommandClasses()); } break; case SecuritySchemes.S2_AUTHENTICATED: if (!_securityManagerInfo.Network.HasSecurityScheme(SecuritySchemes.S2_ACCESS)) { ccReport.commandClass = new List <byte>(_securityManagerInfo.Network.GetSecureCommandClasses()); } break; case SecuritySchemes.S2_ACCESS: ccReport.commandClass = new List <byte>(secureCommandClasses); break; default: break; } } } dataToSend = ccReport; } } } if (dataToSend != null || extensions != null) { ApiOperation sendData = null; if (SecuritySchemeSet.ALLS2.Contains(scheme)) { sendData = new SendDataExOperation(ReceivedAchData.DestNodeId, ReceivedAchData.SrcNodeId, dataToSend, _securityManagerInfo.TxOptions, scheme); } else { if (ReceivedAchData.DestNodeId > 0) { sendData = new SendDataBridgeOperation(ReceivedAchData.DestNodeId, ReceivedAchData.SrcNodeId, dataToSend, _securityManagerInfo.TxOptions); if (extensions != null) { ((SendDataBridgeOperation)sendData).Extensions = extensions; } } else { sendData = new SendDataOperation(ReceivedAchData.SrcNodeId, dataToSend, _securityManagerInfo.TxOptions); if (extensions != null) { ((SendDataOperation)sendData).Extensions = extensions; } } } if (substituteSettings != null) { sendData.SubstituteSettings = substituteSettings; } if (isSubstituteDenied) { sendData.SubstituteSettings.SetFlag(SubstituteFlags.DenySecurity); } sendData.CompletedCallback = (x) => { var action = x as ActionBase; if (action != null) { handlingNonceGetFromNode = 0; SpecificResult.TotalCount++; if (action.Result.State != ActionStates.Completed) { SpecificResult.FailCount++; } } }; #region TestFrames if (isNonceReport) { _securityTestSettingsService.ActivateTestPropertiesForFrame(SecurityS2TestFrames.NonceReport, sendData); } else if (isSupportedReport) { _securityTestSettingsService.ActivateTestPropertiesForFrame(SecurityS2TestFrames.CommandsSupportedReport, sendData); } #endregion ou.SetNextActionItems(sendData); } else { ou.SetNextActionItems(); } } } else { "REJECT, {0}, {1} (IsNodeSecureS2={2}, IsActive={3}"._DLOG( _securityManagerInfo.IsInclusion, _securityManagerInfo.Network.HasSecurityScheme(ReceivedAchData.SrcNodeId, SecuritySchemeSet.ALLS2), _securityManagerInfo.Network.HasSecurityScheme(SecuritySchemeSet.ALLS2), _securityManagerInfo.IsActive); } } }
protected override void SetStateCompleted(ActionUnit ou) { base.SetStateCompleted(ou); _securityManagerInfo.Network.SetSecuritySchemesSpecified(_nodeInfo.NodeId); List <SecuritySchemes> schemes = new List <SecuritySchemes>(); byte[] secureCommandClasses = null; if (_supportedS2_ACCESS.IsSendDataCompleted()) { if (_supportedS2_ACCESS.Result) { if (_supportedS2_ACCESS.SpecificResult.Command != null) { var commandClasses = ((COMMAND_CLASS_SECURITY_2.SECURITY_2_COMMANDS_SUPPORTED_REPORT)_supportedS2_ACCESS.SpecificResult.Command). commandClass.TakeWhile(x => x != 0xEF).ToArray(); if (commandClasses.Length > 0) { secureCommandClasses = commandClasses; } } schemes.Add(SecuritySchemes.S2_ACCESS); } } else if (Actions.Contains(_supportedS2_ACCESS)) { _supportedS2_AUTHENTICATED.Token.SetCancelled(); _supportedS2_UNAUTHENTICATED.Token.SetCancelled(); } if (_supportedS2_AUTHENTICATED.IsSendDataCompleted()) { if (_supportedS2_AUTHENTICATED.Result) { if (_supportedS2_AUTHENTICATED.SpecificResult.Command != null) { var commandClasses = ((COMMAND_CLASS_SECURITY_2.SECURITY_2_COMMANDS_SUPPORTED_REPORT)_supportedS2_AUTHENTICATED.SpecificResult.Command). commandClass.TakeWhile(x => x != 0xEF).ToArray(); if (commandClasses.Length > 0) { secureCommandClasses = commandClasses; } } schemes.Add(SecuritySchemes.S2_AUTHENTICATED); } else if (_supportedS2_AUTHENTICATED.Result.State == ActionStates.Cancelled && _securityManagerInfo.Network.HasSecurityScheme(_nodeInfo.NodeId, SecuritySchemes.S2_AUTHENTICATED)) { schemes.Add(SecuritySchemes.S2_AUTHENTICATED); } } else if (Actions.Contains(_supportedS2_AUTHENTICATED)) { _supportedS2_UNAUTHENTICATED.Token.SetCancelled(); } if (_supportedS2_UNAUTHENTICATED.IsSendDataCompleted()) { if (_supportedS2_UNAUTHENTICATED.Result) { if (_supportedS2_UNAUTHENTICATED.SpecificResult.Command != null) { var commandClasses = ((COMMAND_CLASS_SECURITY_2.SECURITY_2_COMMANDS_SUPPORTED_REPORT)_supportedS2_UNAUTHENTICATED.SpecificResult.Command). commandClass.TakeWhile(x => x != 0xEF).ToArray(); if (commandClasses.Length > 0) { secureCommandClasses = commandClasses; } } schemes.Add(SecuritySchemes.S2_UNAUTHENTICATED); } else if (_supportedS2_UNAUTHENTICATED.Result.State == ActionStates.Cancelled && _securityManagerInfo.Network.HasSecurityScheme(_nodeInfo.NodeId, SecuritySchemes.S2_UNAUTHENTICATED)) { schemes.Add(SecuritySchemes.S2_UNAUTHENTICATED); } } if (_supportedS0.IsSendDataCompleted()) { if (_supportedS0.Result) { if (_supportedS0.SpecificResult.Command != null) { var commandClasses = ((COMMAND_CLASS_SECURITY.SECURITY_COMMANDS_SUPPORTED_REPORT)_supportedS0.SpecificResult.Command). commandClassSupport.TakeWhile(x => x != 0xEF).ToArray(); if (commandClasses.Length > 0) { secureCommandClasses = commandClasses; } } schemes.Add(SecuritySchemes.S0); } } if (schemes.Count > 0) { if (!_isInclusionTask) { _securityManagerInfo.Network.SetSecuritySchemes(_nodeInfo.NodeId, schemes.ToArray()); } _securityManagerInfo.Network.SetSecureCommandClasses(new NodeTag(_nodeInfo.NodeId), secureCommandClasses); SpecificResult.SecureCommandClasses = secureCommandClasses; if (SecuritySchemeSet.ALLS2.Contains(schemes[0])) { var peerNodeId = new InvariantPeerNodeId(_securityManagerInfo.Network.NodeId, _nodeInfo.NodeId); _securityManagerInfo.ActivateNetworkKeyS2ForNode(peerNodeId, schemes[0]); } } else { if (!_isInclusionTask) { _securityManagerInfo.Network.ResetSecuritySchemes(_nodeInfo.NodeId); SpecificResult.SecureCommandClasses = null; } } }
public byte[] TestOverrideMessageEncapsulation(SinglecastKey sckey, SpanTable spanTable, SecurityS2CryptoProvider _securityS2CryptoProvider, SubstituteSettings substituteSettings, byte nodeId, byte[] data, InvariantPeerNodeId peerNodeId, Extensions extensions, byte[] encryptedMsg, byte[] initData) { byte[] ret = initData; if (TestFramesS2.ContainsKey(SecurityS2TestFrames.MessageEncapsulation)) { var testData = data; var testFrame = TestFramesS2[SecurityS2TestFrames.MessageEncapsulation]; if (testFrame.DelaySpecified && testFrame.Delay > 0) { Thread.Sleep(testFrame.Delay); } if (testFrame.Command != null) { testData = testFrame.Command; } if (!testFrame.IsEncryptedSpecified || testFrame.IsEncrypted) { if (testFrame.IsTemp) { if (testFrame.NetworkKey != null) { ActivateNetworkKeyS2CustomForNode(peerNodeId, testFrame.IsTemp, testFrame.NetworkKey); } else { ActivateNetworkKeyS2CustomForNode(peerNodeId, testFrame.IsTemp, GetActualNetworkKeyS2Temp()); } } else { if (testFrame.NetworkKey != null) { ActivateNetworkKeyS2CustomForNode(peerNodeId, testFrame.IsTemp, testFrame.NetworkKey); } } ret = _securityS2CryptoProvider.EncryptSinglecastCommand(sckey, spanTable, Network.NodeId, nodeId, Network.HomeId, testData, extensions, substituteSettings); } else { var msgEncapCryptedData = (COMMAND_CLASS_SECURITY_2.SECURITY_2_MESSAGE_ENCAPSULATION)encryptedMsg; msgEncapCryptedData.ccmCiphertextObject = new List <byte>(testData); ret = msgEncapCryptedData; } } return(ret); }
private void FireNetworkKeyS2Changed(InvariantPeerNodeId peerNodeId, byte[] networkKey, SecuritySchemes securityScheme) { var mpanKey = new byte[SecurityS2Utils.KEY_SIZE]; var ccmKey = new byte[SecurityS2Utils.KEY_SIZE]; var personalization = new byte[SecurityS2Utils.PERSONALIZATION_SIZE]; if (securityScheme == SecuritySchemes.S2_TEMP) { SecurityS2Utils.TempKeyExpand(networkKey, ccmKey, personalization, mpanKey); } else { SecurityS2Utils.NetworkKeyExpand(networkKey, ccmKey, personalization, mpanKey); } switch (peerNodeId.NodeId2) { case 0: for (int ii = 0; ii <= ushort.MaxValue; ii++) { var index = new InvariantPeerNodeId(ii); if (ScKeys.ContainsKey(index) && !ScKeys[index].CcmKey.SequenceEqual(ccmKey) && ScKeys[index].SecurityScheme == securityScheme) { ScKeys[index].CcmKey = ccmKey; ScKeys[index].Personalization = personalization; if (SpanTable.GetSpanState(index) != SpanStates.ReceiversNonce) { SpanTable.SetNonceFree(index); } } } for (int i = 0; i <= ushort.MaxValue; i++) { var index = new NodeGroupId(i); if (McKeys.ContainsKey(index) && !McKeys[index].CcmKey.SequenceEqual(ccmKey) && McKeys[index].SecurityScheme == securityScheme) { MpanTable.RemoveRecord(index); } } break; case 0xFF: for (int ii = 0; ii <= ushort.MaxValue; ii++) { var i = new InvariantPeerNodeId(ii); if (ScKeys.ContainsKey(i)) { ScKeys[i].CcmKey = ccmKey; ScKeys[i].Personalization = personalization; ScKeys[i].SecurityScheme = securityScheme; } } MpanTable.ClearMpanTable(); SpanTable.ClearNonceTable(); break; default: if (ScKeys.ContainsKey(peerNodeId)) { ScKeys[peerNodeId].CcmKey = ccmKey; ScKeys[peerNodeId].Personalization = personalization; ScKeys[peerNodeId].SecurityScheme = securityScheme; } else { ScKeys.Add(peerNodeId, new SinglecastKey { CcmKey = ccmKey, Personalization = personalization, SecurityScheme = securityScheme }); } if (SpanTable.GetSpanState(peerNodeId) != SpanStates.ReceiversNonce) { SpanTable.SetNonceFree(peerNodeId); } break; } if (IsInclusion && securityScheme == SecuritySchemes.S2_TEMP) { IsTempKeyActivatedOnInclusion = true; } if (NetworkKeyS2Changed != null) { NetworkKeyS2Changed(peerNodeId, networkKey, securityScheme, IsInclusion); } if (peerNodeId.NodeId2 == 0) { for (int ii = 0; ii <= ushort.MaxValue; ii++) { var index = new InvariantPeerNodeId(ii); // TODO S2 if (_scKeys.ContainsKey(index) && !_scKeys[index].CcmKey.SequenceEqual(ccmKey) && _scKeys[index].SecurityScheme == securityScheme) { RetransmissionTableS2.Clear(); } } } else if (peerNodeId.NodeId2 == 0xFF) { RetransmissionTableS2.Clear(); } else { if (RetransmissionTableS2.ContainsKey(peerNodeId)) { RetransmissionTableS2.Remove(peerNodeId); } } }
/// <summary> /// Activates temp key for specified node /// </summary> /// <param name="peerNodeId">MSB is local NodeId, LSB is remote NodeId</param> public void ActivateNetworkKeyS2TempForNode(InvariantPeerNodeId peerNodeId) { byte[] networkKey = GetActualNetworkKeyS2Temp(); FireNetworkKeyS2Changed(peerNodeId, networkKey, SecuritySchemes.S2_TEMP); }
public void ActivateTestPropertiesForFrame(SecurityS2TestFrames testFrameType, ApiOperation apiOperation) { if (_securityManagerInfo.TestFramesS2.ContainsKey(testFrameType)) { var testFrame = _securityManagerInfo.TestFramesS2[testFrameType]; byte nodeId = 0x00; InvariantPeerNodeId peerNodeId; if (apiOperation is RequestDataOperation) { var operation = (apiOperation as RequestDataOperation); nodeId = operation.DestNodeId; operation.Data = testFrame.Command ?? operation.Data; } else if (apiOperation is SendDataOperation) { var operation = (apiOperation as SendDataOperation); nodeId = operation.NodeId; operation.Data = testFrame.Command ?? operation.Data; } else if (apiOperation is SendDataExOperation) { var operation = (apiOperation as SendDataExOperation); nodeId = operation.NodeId; operation.Data = testFrame.Command ?? operation.Data; } else if (apiOperation is SendDataBridgeOperation) { var operation = (apiOperation as SendDataBridgeOperation); nodeId = operation.DestNodeId; operation.Data = testFrame.Command ?? operation.Data; } peerNodeId = new InvariantPeerNodeId(_securityManagerInfo.Network.NodeId, nodeId); if (testFrame.IsEncryptedSpecified) { if (testFrame.IsEncrypted) { apiOperation.SubstituteSettings.ClearFlag(SubstituteFlags.DenySecurity); if (testFrame.IsTemp) { if (testFrame.NetworkKey != null) { _securityManagerInfo.ActivateNetworkKeyS2CustomForNode(peerNodeId, testFrame.IsTemp, testFrame.NetworkKey); } else { _securityManagerInfo.ActivateNetworkKeyS2CustomForNode(peerNodeId, testFrame.IsTemp, _securityManagerInfo.GetActualNetworkKeyS2Temp()); } } else { if (testFrame.NetworkKey != null) { _securityManagerInfo.ActivateNetworkKeyS2CustomForNode(peerNodeId, testFrame.IsTemp, testFrame.NetworkKey); } } } else { apiOperation.SubstituteSettings.SetFlag(SubstituteFlags.DenySecurity); } } if (testFrame.IsMulticastSpecified) { if (testFrame.IsMulticast) { apiOperation.SubstituteSettings.ClearFlag(SubstituteFlags.DenyMulticast); apiOperation.SubstituteSettings.SetFlag(SubstituteFlags.UseMulticast); if (_isInclusionProcesses) { apiOperation.SubstituteSettings.ClearFlag(SubstituteFlags.UseFollowup); apiOperation.SubstituteSettings.SetFlag(SubstituteFlags.DenyFollowup); } } else { apiOperation.SubstituteSettings.ClearFlag(SubstituteFlags.UseMulticast); apiOperation.SubstituteSettings.SetFlag(SubstituteFlags.DenyMulticast); } } if (testFrame.IsBroadcastSpecified) { if (testFrame.IsBroadcast) { apiOperation.SubstituteSettings.ClearFlag(SubstituteFlags.DenyBroadcast); apiOperation.SubstituteSettings.SetFlag(SubstituteFlags.UseBroadcast); if (_isInclusionProcesses) { apiOperation.SubstituteSettings.ClearFlag(SubstituteFlags.UseFollowup); apiOperation.SubstituteSettings.SetFlag(SubstituteFlags.DenyFollowup); } } else { apiOperation.SubstituteSettings.ClearFlag(SubstituteFlags.UseBroadcast); apiOperation.SubstituteSettings.SetFlag(SubstituteFlags.DenyBroadcast); } } if (testFrame.DelaySpecified) { Thread.Sleep(testFrame.Delay); } ; } }
private void OnKEXGet(StartActionUnit ou) { kexReportStart = DateTime.Now; SpecificResult.SubstituteStatus = SubstituteStatuses.Failed; _securityManagerInfo.IsInclusion = true; _KexFailCancel.NodeId = NodeId; _KexFailCancel.BridgeNodeId = VirtualNodeId; _KEXReportKEXSet.DestNodeId = NodeId; _KEXReportKEXSet.SrcNodeId = VirtualNodeId; if (VirtualNodeId == 0) { _peerNodeId = new InvariantPeerNodeId(_securityManagerInfo.Network.NodeId, NodeId); } else { _peerNodeId = new InvariantPeerNodeId(VirtualNodeId, NodeId); } var cmd = new COMMAND_CLASS_SECURITY_2.KEX_REPORT(); _isClientSideAuthRequested = _securityManagerInfo.TestEnableClientSideAuthS2; cmd.properties1 = new COMMAND_CLASS_SECURITY_2.KEX_REPORT.Tproperties1() { requestCsa = _isClientSideAuthRequested ? (byte)1 : (byte)0 }; byte keysToRequest = (byte)(NetworkKeyS2Flags.S2Class0 | NetworkKeyS2Flags.S2Class1 | NetworkKeyS2Flags.S2Class2 | NetworkKeyS2Flags.S0); if (!_securityManagerInfo.Network.IsEnabledS0) { keysToRequest = (byte)(keysToRequest & ~(byte)(NetworkKeyS2Flags.S0)); } if (!_securityManagerInfo.Network.IsEnabledS2_UNAUTHENTICATED) { keysToRequest = (byte)(keysToRequest & ~(byte)(NetworkKeyS2Flags.S2Class0)); } if (!_securityManagerInfo.Network.IsEnabledS2_AUTHENTICATED) { keysToRequest = (byte)(keysToRequest & ~(byte)(NetworkKeyS2Flags.S2Class1)); } if (!_securityManagerInfo.Network.IsEnabledS2_ACCESS) { keysToRequest = (byte)(keysToRequest & ~(byte)(NetworkKeyS2Flags.S2Class2)); } cmd.requestedKeys = keysToRequest; cmd.supportedEcdhProfiles = 1; cmd.supportedKexSchemes = 2; _KEXReportKEXSet.Data = cmd; #region KEXReport if (_securityManagerInfo.TestFramesS2.ContainsKey(SecurityS2TestFrames.KEXReport)) { var testFrame = _securityManagerInfo.TestFramesS2[SecurityS2TestFrames.KEXReport]; if (testFrame.Command != null && testFrame.Command.Length > 5 && testFrame.Command[0] == COMMAND_CLASS_SECURITY_2.ID && testFrame.Command[1] == COMMAND_CLASS_SECURITY_2.KEX_REPORT.ID) { COMMAND_CLASS_SECURITY_2.KEX_REPORT tmp = testFrame.Command; keysToRequest = tmp.requestedKeys; } _securityTestSettingsService.ActivateTestPropertiesForFrame(SecurityS2TestFrames.KEXReport, _KEXReportKEXSet); } #endregion var duration = (int)(DateTime.Now - kexReportStart).TotalMilliseconds; if (duration > InclusionS2TimeoutConstants.Joining.PublicKeyReport) { _KEXReportKEXSet.SetNewExpectTimeout(100); } }