예제 #1
0
        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--;
            }
        }
예제 #2
0
 /// <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);
 }
예제 #3
0
        /// <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);
        }
예제 #4
0
 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);
 }
예제 #5
0
        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);
                    }
                }
            }
        }
예제 #6
0
        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);
                }
            }
        }
예제 #7
0
        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;
                }
            }
        }
예제 #8
0
 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);
 }
예제 #9
0
        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);
                }
            }
        }
예제 #10
0
 /// <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);
 }
예제 #11
0
        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);
                }
                ;
            }
        }
예제 #12
0
        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);
            }
        }