private void OnExpectSchemeGetCompleted(ActionCompletedUnit unit) { if (_learnMode.Result && _memoryGetId.Result && _serialApiGetInitData.Result) { if (_expectSchemeGet.Result) { _expectKexGet.Token.SetCancelled(); _learnModeS0.NodeId = _expectSchemeGet.SpecificResult.SrcNodeId; if (_learnMode is SetSlaveLearnModeOperation) { _learnModeS0.VirtualNodeId = _expectSchemeGet.SpecificResult.DestNodeId; } else { _learnModeS0.IsController = _learnMode is SetLearnModeControllerOperation; _securityManagerInfo.Network.ResetAndEnableAndSelfRestore(); } COMMAND_CLASS_SECURITY.SECURITY_SCHEME_GET cmd = _expectSchemeGet.SpecificResult.Command; _learnModeS0.SupportedSecuritySchemes = cmd.supportedSecuritySchemes; unit.SetNextActionItems(_learnModeS0); } else if (_expectSchemeGet.Result.State == ActionStates.Expired) { SpecificResult.SubstituteStatus = SubstituteStatuses.Failed; _securityManagerInfo.Network.ResetSecuritySchemes(); _securityManagerInfo.Network.ResetSecuritySchemes(_expectSchemeGet.SpecificResult.SrcNodeId); SetStateCompleted(unit); } } }
private void OnRequestCompleted(ActionCompletedUnit tu) { OnOperationCompletedBefore(tu); RequestDataExOperation op = new RequestDataExOperation(0, NodeId, Data, TxOptions, TxSecOptions, SecurityScheme, TxOptions2, CmdClass, Cmd, TimeoutMs); OnOperationCompletedAfter(tu, requestCompleted, op); }
private void OnSchemeReport(ActionCompletedUnit ou) { if (requestScheme.Result.State == ActionStates.Completed) { SecurityManagerInfo.Network.SetSecuritySchemes(SpecificResult.Id, SecuritySchemeSet.S0); COMMAND_CLASS_SECURITY.SECURITY_SCHEME_REPORT command = requestScheme.SpecificResult.Command; //TO# 07122 accourding to SDS12652-11 section 3.29.2.3, an including controller must not verify the reported scheme. sendNetworkKeySet.NodeId = SpecificResult.Id; expectNetworkKeyVerify.SrcNodeId = SpecificResult.Id; var networkKey = SecurityManagerInfo.GetActualNetworkKey(SecuritySchemes.S0); if (SecurityManagerInfo.TestNetworkKeyS0InSet != null) { networkKey = SecurityManagerInfo.TestNetworkKeyS0InSet; } sendNetworkKeySet.Data = new COMMAND_CLASS_SECURITY.NETWORK_KEY_SET() { networkKeyByte = new List <byte>(networkKey) }; SecurityManagerInfo.ActivateNetworkKeyS0Temp(); if (SecurityManagerInfo.DelaysS0.ContainsKey(SecurityS0Delays.NetworkKeySet)) { sendNetworkKeySet.DataDelay = SecurityManagerInfo.DelaysS0[SecurityS0Delays.NetworkKeySet]; } } else { SetStateCompletedSecurityFailed(ou); } }
private void OnSendCompleted(ActionCompletedUnit tu) { OnOperationCompletedBefore(tu); SendDataExOperation op = new SendDataExOperation(NodeId, Data, TxOptions, TxSecOptions, SecurityScheme, TxOptions2); OnOperationCompletedAfter(tu, sendCompleted, op); }
private void OnNonceReport(ActionCompletedUnit ou) { AddTraceLogItems(requestNonce.SpecificResult.TraceLog); if (requestNonce.Result.State == ActionStates.Completed) { COMMAND_CLASS_SECURITY.SECURITY_NONCE_REPORT cmd = requestNonce.SpecificResult.Command; "NONCE REPORT {0}"._DLOG(requestNonce.SpecificResult.Command.GetHex()); if (cmd.nonceByte != null && cmd.nonceByte.Count == 8) { byte[] msg = _securityS0CryptoProvider.Encrypt(0, CommandToSecureSend, SrcNodeId, DestNodeId, cmd.nonceByte.ToArray()); sendEncData.Data = msg; //sendEncData.OnHandledCallback = OnHandledCallback; if (_securityManagerInfo.DelaysS0.ContainsKey(SecurityS0Delays.Command)) { Thread.Sleep(_securityManagerInfo.DelaysS0[SecurityS0Delays.Command]); } } else { SetStateFailed(ou); } } else { SetStateFailed(ou); } }
private void OnRequestFirstEncData(ActionCompletedUnit ou) { AddTraceLogItems(sendFirstEncData.SpecificResult.TraceLog); if (sendFirstEncData.Result.State == ActionStates.Completed) { COMMAND_CLASS_SECURITY.SECURITY_NONCE_REPORT cmd = sendFirstEncData.SpecificResult.Command; if (cmd.nonceByte != null && cmd.nonceByte.Count == 8) { byte[] secondFragmentCmd = CommandToSecureSend.Skip(MaxBytesPerFrameSize).Take(MaxBytesPerFrameSize).ToArray(); COMMAND_CLASS_SECURITY.SECURITY_MESSAGE_ENCAPSULATION.Tproperties1 property = 0; property.sequenceCounter = SequenceCounter; property.sequenced = 1; property.secondFrame = 1; byte[] msg = _securityS0CryptoProvider.Encrypt(property, secondFragmentCmd, _securityManagerInfo.Network.NodeId, NodeId, cmd.nonceByte.ToArray()); COMMAND_CLASS_SECURITY.SECURITY_MESSAGE_ENCAPSULATION msgCmd = msg; sendSecondEncData.Data = msgCmd; //sendSecondEncData.OnHandledCallback = OnHandledCallback; if (_securityManagerInfo.DelaysS0.ContainsKey(SecurityS0Delays.Command)) { Thread.Sleep(_securityManagerInfo.DelaysS0[SecurityS0Delays.Command]); } } else { SetStateFailed(ou); } } else { SetStateFailed(ou); } }
private void OnSchemeInherit(ActionCompletedUnit ou) { if (requestSchemeInherit.Result.State == ActionStates.Completed) { COMMAND_CLASS_SECURITY.SECURITY_SCHEME_INHERIT cmd = requestSchemeInherit.SpecificResult.Command; if ((cmd.supportedSecuritySchemes & 0xFE) == 0) { sendSecureSchemeReport.NodeId = NodeId; sendSecureSchemeReport.BridgeNodeId = VirtualNodeId; if (_securityManagerInfo.DelaysS0.ContainsKey(SecurityS0Delays.SchemeReportEnc)) { sendSecureSchemeReport.DataDelay = _securityManagerInfo.DelaysS0[SecurityS0Delays.SchemeReportEnc]; } } else { SpecificResult.SubstituteStatus = SubstituteStatuses.Failed; SetStateCompletedSecurityFailed(ou); } } else { SpecificResult.SubstituteStatus = SubstituteStatuses.Failed; SetStateCompletedSecurityFailed(ou); } }
private void OnExpectKexGetCompleted(ActionCompletedUnit unit) { if (_learnMode.Result && _memoryGetId.Result && _serialApiGetInitData.Result) { if (_expectKexGet.Result) { _expectSchemeGet.Token.SetCancelled(); _learnModeS2.NodeId = _expectKexGet.SpecificResult.SrcNodeId; if (_learnMode is SetSlaveLearnModeOperation) { _learnModeS2.VirtualNodeId = _expectKexGet.SpecificResult.DestNodeId; } else { _securityManagerInfo.Network.ResetAndEnableAndSelfRestore(); } unit.SetNextActionItems(_learnModeS2); } else if (_expectKexGet.Result.State == ActionStates.Expired) { SpecificResult.SubstituteStatus = SubstituteStatuses.Failed; _securityManagerInfo.Network.ResetSecuritySchemes(); _securityManagerInfo.Network.ResetSecuritySchemes(_expectKexGet.SpecificResult.SrcNodeId); SetStateCompleted(unit); } } }
private void OnSendNextSegment(ActionCompletedUnit actionUnit) { if ((TxOptions & TransmitOptions.TransmitOptionAcknowledge) == TransmitOptions.TransmitOptionAcknowledge) { var sendData = actionUnit.Action as SendDataOperation; if (sendData.SpecificResult.TransmitStatus == TransmitStatuses.CompleteNoAcknowledge) { SpecificResult.SubstituteStatus = SubstituteStatuses.Failed; SetStateFailed(actionUnit); } } Thread.Sleep(RELAXED_TIMING_DELAY); if (_dataOffset < _data.Length) { _nextSegmentSendOperation.NewToken(); _nextSegmentSendOperation.Data = CreateSubsequentSegmentCmd(_data, _dataOffset); if (_dataOffset + _subsequentSegmentPayloadSize >= _data.Length) { if (_segmentCompleteExpect.Token.State == ActionStates.Running) { _segmentCompleteExpect.Token.Reset(SEGMENT_COMPLETE_TIMEOUT); } else { _segmentCompleteExpect.NewToken(); actionUnit.AddFirstNextActionItems(_segmentCompleteExpect); } } _dataOffset += _subsequentSegmentPayloadSize; } }
private void OnTestCompleted(ActionCompletedUnit ou) { _testIteration++; if (_sendTest.SpecificResult.TransmitStatus != TransmitStatuses.CompleteOk) { _failIterations++; } if (_testIteration >= _testFrameCount) { _sendPowerLevelTestNodeReport.NewToken(); _sendPowerLevelTestNodeReport.NodeId = _testFromNodeId; _sendPowerLevelTestNodeReport.Data = new COMMAND_CLASS_POWERLEVEL.POWERLEVEL_TEST_NODE_REPORT() { statusOfOperation = _failIterations == 0 ? (byte)0x01 : (byte)0x00, testFrameCount = new byte[] { (byte)(_testIteration << 8), (byte)_testIteration }, testNodeid = _sendTest.NodeId }; ou.SetNextActionItems(_sendPowerLevelTestNodeReport); } else { _sendTest.NewToken(); ou.SetNextActionItems(_sendTest); } }
private void OnPowerLevelGet(ActionCompletedUnit ou) { _sendPowerLevelReport.Data = new COMMAND_CLASS_POWERLEVEL.POWERLEVEL_REPORT() { powerLevel = _powerLevelGet.SpecificResult.PowerLevel }; }
private void OnMemoryGetIdCompleted(ActionCompletedUnit unit) { if (_memoryGetId.Result) { var lmc = _learnMode as SetLearnModeControllerOperation; var lms = _learnMode as SetLearnModeSlaveOperation; var lmv = _learnMode as SetSlaveLearnModeOperation; if ((lmc != null && lmc.SpecificResult.NodeId == 0) || (lms != null && lms.SpecificResult.NodeId == 0) || (lmv != null && lmv.SpecificResult.NodeId == 0)) { SpecificResult.LearnModeStatus = LearnModeStatuses.Removed; } else if (lmc != null && _memoryGetId.SpecificResult.HomeId.SequenceEqual(_previousHomeId)) { SpecificResult.LearnModeStatus = LearnModeStatuses.Replicated; } else { SpecificResult.LearnModeStatus = LearnModeStatuses.Added; } if (lmc != null) { SpecificResult.NodeId = _memoryGetId.SpecificResult.NodeId; _securityManagerInfo.Network.NodeId = _memoryGetId.SpecificResult.NodeId; _securityManagerInfo.Network.HomeId = _memoryGetId.SpecificResult.HomeId; } else if (lmv != null) { SpecificResult.NodeId = lmv.SpecificResult.NodeId; } } }
private void SetStateCompletedSecurityDone(ActionCompletedUnit ou) { SpecificResult.SubstituteStatus = SubstituteStatuses.Done; SpecificResult.SecuritySchemes = SecuritySchemeSet.S0; SecurityManagerInfo.Network.SetSecuritySchemes(SpecificResult.Id, SecuritySchemeSet.S0); SecurityManagerInfo.Network.SetSecuritySchemesSpecified(SpecificResult.Id); SetStateCompleted(ou); }
private void OnPKReport(ActionCompletedUnit ou) { _PkReportReceivedTimeStamp = DateTime.Now; if (_PKReportPKReport.Result.State == ActionStates.Completed && _PKReportPKReport.SpecificResult.Command != null && _PKReportPKReport.SpecificResult.Command.Length > 2) { COMMAND_CLASS_SECURITY_2.PUBLIC_KEY_REPORT rpt = _PKReportPKReport.SpecificResult.Command; if (rpt.properties1.includingNode == 1) { var receiverPublicKey = ((List <byte>)rpt.ecdhPublicKey).ToArray(); if (receiverPublicKey != null && receiverPublicKey.Length == 32 && ValidatePublicKeyReport(receiverPublicKey)) { var senderPublicKey = _securityManagerInfo.GetJoinPublicKeyS2(); if (_isClientSideAuthRequested && _KEX_SET.properties1.requestCsa > 0 && _securityManagerInfo.DSKVerificationOnReceiverCallback != null) { byte[] senderDSK = _securityManagerInfo.DSKVerificationOnReceiverCallback(); if (senderDSK != null && senderDSK.Length == 4) { Array.Copy(senderDSK, 0, receiverPublicKey, 0, 4); } } _securityManagerInfo.SetNetworkKeyS2Temp(_securityManagerInfo.CalculateTempNetworkKeyS2(receiverPublicKey, false)); _securityManagerInfo.ActivateNetworkKeyS2TempForNode(_peerNodeId); var kexSetEcho = _KEX_SET; kexSetEcho.properties1.echo = 1; _KEXSetEchoKEXReportEcho.DestNodeId = NodeId; _KEXSetEchoKEXReportEcho.SrcNodeId = VirtualNodeId; _KEXSetEchoKEXReportEcho.Data = kexSetEcho; _isWaitingForKexReportEcho = true; #region KEXSetEcho _securityTestSettingsService.ActivateTestPropertiesForFrame(SecurityS2TestFrames.KEXSetEcho, _KEXSetEchoKEXReportEcho); #endregion } else { _KexFail.Data = new COMMAND_CLASS_SECURITY_2.KEX_FAIL { kexFailType = 0x00 }; _KexFail.NodeId = NodeId; _KexFail.BridgeNodeId = VirtualNodeId; ou.SetNextActionItems(_KexFail); } } else { SetStateCompletedSecurityFailed(ou); } } else { SetStateCompletedSecurityFailed(ou); } }
protected override void CreateInstance() { sendFirst = new SendDataExOperation(NodeId, Data, TxOptions, TxSecOptions, SecurityScheme, TxOptions2); sendFirst.SubstituteSettings = SubstituteSettings; sendCompleted = new ActionCompletedUnit(sendFirst, OnSendCompleted); requestFirst = new RequestDataExOperation(0, NodeId, Data, TxOptions, TxSecOptions, SecurityScheme, TxOptions2, CmdClass, Cmd, TimeoutMs); requestFirst.SubstituteSettings = SubstituteSettings; requestCompleted = new ActionCompletedUnit(requestFirst, OnRequestCompleted); }
private void OnSchemeInheritReport(ActionCompletedUnit ou) { if (requestSchemeInherit.Result.State == ActionStates.Completed) { SetStateCompletedSecurityDone(ou); } else { SetStateCompletedSecurityFailed(ou); } }
private void OnSendEncData(ActionCompletedUnit ou) { AddTraceLogItems(sendEncData.SpecificResult.TraceLog); if (sendEncData.Result.State == ActionStates.Completed) { SetStateCompleted(ou); } else { SetStateFailed(ou); } }
private void OnOperationCompletedBefore(ActionCompletedUnit tu) { if (IntervalMs > 0) { Thread.Sleep(IntervalMs); } SpecificResult.TotalCount++; if (!tu.Action.IsStateCompleted) { SpecificResult.FailCount++; } }
private void OnSendCompleted(ActionCompletedUnit ou) { AddTraceLogItems(ou.Action.Result.TraceLog); if (ou.Action.Result.State == ActionStates.Completed) { SetStateCompleted(ou); } else { SetStateFailed(ou); } }
private void OnDone(ActionCompletedUnit tu) { if (tu.Action.Result.State == ActionStates.Completed) { SpecificResult.SubstituteStatus = SubstituteStatuses.Done; SetStateCompletedSecurityDone(tu); } else { SetStateCompletedSecurityFailed(tu); } }
private void OnComplete(ActionCompletedUnit ou) { SpecificResult.Command = _requestInclusionSupport.SpecificResult.Command; SpecificResult.IsBroadcast = _requestInclusionSupport.SpecificResult.IsBroadcast; SpecificResult.NodeId = _requestInclusionSupport.SpecificResult.NodeId; SpecificResult.RxRssi = _requestInclusionSupport.SpecificResult.RxRssi; SpecificResult.RxSecurityScheme = _requestInclusionSupport.SpecificResult.RxSecurityScheme; SpecificResult.RxSubstituteStatus = _requestInclusionSupport.SpecificResult.RxSubstituteStatus; SpecificResult.TransmitStatus = _requestInclusionSupport.SpecificResult.TransmitStatus; SpecificResult.TxSubstituteStatus = _requestInclusionSupport.SpecificResult.TxSubstituteStatus; SetStateCompleted(ou); }
private void OnSendOnlyFirstCompleted(ActionCompletedUnit ou) { //OnHandledCallback(ou); AddTraceLogItems(ou.Action.Result.TraceLog); if (ou.Action.Result.State == ActionStates.Completed) { SetStateCompleting(ou); } else { SetStateFailed(ou); } }
private void OnSendEncData(ActionCompletedUnit ou) { AddTraceLogItems(_sendEncData.SpecificResult.TraceLog); if (_sendEncData.Result.State == ActionStates.Completed) { SpecificResult.SubstituteStatus = SubstituteStatuses.Done; SetStateCompleted(ou); } else { SpecificResult.SubstituteStatus = SubstituteStatuses.Failed; SetStateFailed(ou); } }
protected void OnSecurityMessageReceived(ActionCompletedUnit ou) { if (_SecurityMessageReceived.Result) { if (_isWaitingForKexReportEcho) { Thread.Sleep(3000); _KexFail.SubstituteSettings.ClearFlag(SubstituteFlags.DenySecurity); } _KexFail.Data = new COMMAND_CLASS_SECURITY_2.KEX_FAIL { kexFailType = 0x05 }; _KexFail.NodeId = NodeId; _KexFail.BridgeNodeId = VirtualNodeId; ou.SetNextActionItems(_KexFail); } }
private void OnSendTransferEnd(ActionCompletedUnit tu) { if (tu.Action.Result.State == ActionStates.Completed) { if (_grantedSchemes.Count > 0) { SetStateCompletedSecurityDone(tu); } else { SetStateCompletedSecurityNone(tu); } } else { SetStateCompletedSecurityFailed(tu); } }
private void OnNetworkKeySet(ActionCompletedUnit ou) { const byte keyLength = 16; if (requestNetworkKey.Result.State == ActionStates.Completed) { COMMAND_CLASS_SECURITY.NETWORK_KEY_SET cmd = requestNetworkKey.SpecificResult.Command; byte[] key = new byte[keyLength]; if (cmd.networkKeyByte != null && cmd.networkKeyByte.Count() == keyLength) { Array.Copy(cmd.networkKeyByte.ToArray(), 0, key, 0, Math.Min(cmd.networkKeyByte.Count, keyLength)); _securityManagerInfo.SetNetworkKey(key, SecuritySchemes.S0); _securityManagerInfo.ActivateNetworkKeyS0(); if (VirtualNodeId > 0 || !IsController) { sendNetworkKeyVerify.NodeId = NodeId; sendNetworkKeyVerify.BridgeNodeId = VirtualNodeId; ou.SetNextActionItems(sendNetworkKeyVerify); } else { requestSchemeInherit.DestNodeId = NodeId; requestSchemeInherit.SrcNodeId = VirtualNodeId; ou.SetNextActionItems(requestSchemeInherit); if (_securityManagerInfo.DelaysS0.ContainsKey(SecurityS0Delays.NetworkKeyVerify)) { requestSchemeInherit.DataDelay = _securityManagerInfo.DelaysS0[SecurityS0Delays.NetworkKeyVerify]; } } } else { SpecificResult.SubstituteStatus = SubstituteStatuses.Failed; SetStateCompletedSecurityFailed(ou); } } else { SpecificResult.SubstituteStatus = SubstituteStatuses.Failed; SetStateCompletedSecurityFailed(ou); } }
protected override void CreateWorkflow() { ActionUnits.Add(new StartActionUnit(null, 0, new ActionBase[] { _segmentRequestResponse, _waitSegmentResponse, _firstSegmentSendOperation })); ActionUnits.Add(new ActionCompletedUnit(_firstSegmentSendOperation, OnFirstSegment, _nextSegmentSendOperation) { Name = "_firstSegmentSendOperation" }); _sendNextSegmentCompletedUnit = new ActionCompletedUnit(_nextSegmentSendOperation, OnSendNextSegment, _nextSegmentSendOperation) { Name = "_nextSegmentSendOperation" }; ActionUnits.Add(_sendNextSegmentCompletedUnit); ActionUnits.Add(new ActionCompletedUnit(_segmentCompleteExpect, OnSegmentComplete) { Name = "_segmentCompleteExpect" }); ActionUnits.Add(new TimeElapsedUnit(Id, OnTimeElapsed, 0) { Name = "_timeElapsed" }); }
private void OnCompleted(ActionCompletedUnit ou) { Result.InnerResults.Add(ou.Action.Result); if (IsWaitingForAllActions) { CompletedOoperations++; if (CompletedOoperations == Actions.Length) { if (ou.Action.Result.State == ActionStates.Failed) { SetStateFailed(ou); } else if (ou.Action.Result.State == ActionStates.Expired) { SetStateExpired(ou); } else { SetStateCompleted(ou); } } } else { if (ou.Action.Result.State == ActionStates.Failed) { SetStateFailed(ou); } else if (ou.Action.Result.State == ActionStates.Expired) { SetStateExpired(ou); } else { SetStateCompleted(ou); } } }
private void OnSendDataComleted(ActionCompletedUnit ou) { AddTraceLogItems(ou.Action.Result.TraceLog); SpecificResult.TransmitStatus = ((SendDataResult)ou.Action.Result).TransmitStatus; SpecificResult.TxSubstituteStatus = ((SendDataResult)ou.Action.Result).SubstituteStatus; if (ou.Action.Result.State == ActionStates.Completed) { if (ExpectData.Result) { SpecificResult.NodeId = ExpectData.SpecificResult.SrcNodeId; SpecificResult.Command = ExpectData.SpecificResult.Command; SpecificResult.RxRssi = ExpectData.SpecificResult.Rssi; SpecificResult.RxSecurityScheme = ExpectData.SpecificResult.SecurityScheme; SpecificResult.RxSubstituteStatus = ExpectData.SpecificResult.SubstituteStatus; SetStateCompleted(ou); } } else { ExpectData.Token.SetCancelled(); SetStateFailed(ou); } }
private void OnNetworkKeyVerify(ActionCompletedUnit ou) { if (expectNetworkKeyVerify.Result.State == ActionStates.Completed) { if (SpecificResult.IsSlave) { SetStateCompletedSecurityDone(ou); } else { requestSchemeInherit.DestNodeId = SpecificResult.Id; ou.SetNextActionItems(requestSchemeInherit); if (SecurityManagerInfo.DelaysS0.ContainsKey(SecurityS0Delays.SchemeInherit)) { requestSchemeInherit.DataDelay = SecurityManagerInfo.DelaysS0[SecurityS0Delays.SchemeInherit]; } } } else { SetStateCompletedSecurityFailed(ou); } }