Beispiel #1
0
        private int GetHighestKeyIndex(SecuritySchemes[] securitySchemes)
        {
            int             ret        = 0;
            SecuritySchemes highScheme = Enums.SecuritySchemes.S0;

            if (securitySchemes.Contains(Enums.SecuritySchemes.S2_ACCESS))
            {
                highScheme = Enums.SecuritySchemes.S2_ACCESS;
            }
            else if (securitySchemes.Contains(Enums.SecuritySchemes.S2_AUTHENTICATED))
            {
                highScheme = Enums.SecuritySchemes.S2_AUTHENTICATED;
            }
            else if (securitySchemes.Contains(Enums.SecuritySchemes.S2_UNAUTHENTICATED))
            {
                highScheme = Enums.SecuritySchemes.S2_UNAUTHENTICATED;
            }
            else if (securitySchemes.Contains(Enums.SecuritySchemes.S0))
            {
                highScheme = Enums.SecuritySchemes.S0;
            }
            else
            {
                highScheme = securitySchemes[0]; // unexpected
            }
            for (int i = 0; i < securitySchemes.Length; i++)
            {
                if (securitySchemes[i] == highScheme)
                {
                    ret = i;
                    break;
                }
            }
            return(ret);
        }
Beispiel #2
0
        public bool IsSecuritySchemeEnabled(SecuritySchemes scheme)
        {
            bool ret = false;

            switch (scheme)
            {
            case SecuritySchemes.NONE:
                ret = true;
                break;

            case SecuritySchemes.S2_UNAUTHENTICATED:
                ret = IsEnabledS2_UNAUTHENTICATED;
                break;

            case SecuritySchemes.S2_AUTHENTICATED:
                ret = IsEnabledS2_AUTHENTICATED;
                break;

            case SecuritySchemes.S2_ACCESS:
                ret = IsEnabledS2_ACCESS;
                break;

            case SecuritySchemes.S0:
                ret = IsEnabledS0;
                break;

            case SecuritySchemes.S2_TEMP:
                ret = true;
                break;

            default:
                break;
            }
            return(ret);
        }
Beispiel #3
0
 public void SetCurrentSecurityScheme(SecuritySchemes securityScheme)
 {
     if (SecuritySchemes != null && SecuritySchemes.Length > 0)
     {
         SecuritySchemeIndex = Array.IndexOf <SecuritySchemes>(SecuritySchemes, securityScheme);
     }
 }
 public SendDataMultiExOperation(byte[] data, TransmitOptions txOptions, SecuritySchemes scheme, byte groupId)
     : base(CommandTypes.CmdSendDataMultiEx)
 {
     Data           = data;
     TxOptions      = txOptions;
     SecurityScheme = scheme;
     GroupId        = groupId;
 }
        public void Should_ReturnEmptyList_WhenSecuritySchemeIsNotOauth2(SecuritySchemes schemes)
        {
            string scopeName = "scopeName";

            var result = builder.SecurityScheme(schemes).SecurityScheme(scopeName).Build();

            Assert.Empty(result.Value);
        }
Beispiel #6
0
        public bool HasSecurityScheme(byte nodeId, SecuritySchemes scheme)
        {
            bool ret =
                IsSecuritySchemeEnabled(scheme) &&
                Nodes[NodeTag].HasSecurityScheme(scheme) &&
                Nodes[nodeId].HasSecurityScheme(scheme);

            return(ret);
        }
Beispiel #7
0
        /// <summary>ZCB_UpdateStatusSuccess</summary>
        private ActionBase SendFwuMdStatusReport(byte nodeId, byte reportStatus, SecuritySchemes scheme)
        {
            var fwuMdRequestReport = new COMMAND_CLASS_FIRMWARE_UPDATE_MD_V5.FIRMWARE_UPDATE_MD_STATUS_REPORT()
            {
                status = reportStatus
            };
            var ret = new SendDataExOperation(nodeId, fwuMdRequestReport, TxOptions, scheme);

            return(ret);
        }
Beispiel #8
0
        internal bool HasSecurityScheme(SecuritySchemes scheme)
        {
            var ret = false;

            if (SecuritySchemes != null)
            {
                ret = SecuritySchemes.Contains(scheme);
            }
            return(ret);
        }
Beispiel #9
0
        ///// <summary>
        ///// Fills network key S2 table with specified keys (Without activating any of them)
        ///// </summary>
        ///// <param name="networkKeys">Keys table</param>
        //public void SetNetworkKeys(NetworkKey[] networkKeys)
        //{
        //    NetworkKey[] keys = networkKeys ?? new NetworkKey[SecurityManagerInfo.NETWORK_KEYS_COUNT];
        //    if (keys.Length != NETWORK_KEYS_COUNT)
        //        throw new ArgumentException("invalid keys table length");


        //    Array.Copy(keys, _networkKeys, NETWORK_KEYS_COUNT);
        //}

        /// <summary>
        /// Sests network key for specified scheme (wihout activating it)
        /// </summary>
        /// <param name="key">Network key</param>
        /// <param name="scheme">scheme</param>
        public void SetNetworkKey(byte[] key, SecuritySchemes scheme)
        {
            var index = GetNetworkKeyIndex(scheme);

            if (_networkKeys[index] == null)
            {
                _networkKeys[index] = new NetworkKey();
            }
            _networkKeys[index].Value = key;
        }
Beispiel #10
0
 public ResponseDataExOperation(NetworkViewPoint network, List <byte[]> data, TransmitOptions txOptions, TransmitSecurityOptions txSecOptions, SecuritySchemes scheme, TransmitOptions2 txOptions2, byte destNodeId, byte cmdClass, byte cmd)
     : base(destNodeId, 0, new ByteIndex(cmdClass), new ByteIndex(cmd))
 {
     _network                  = network;
     Data                      = data;
     TxOptions                 = txOptions;
     TxSecOptions              = txSecOptions;
     SecurityScheme            = scheme;
     TxOptions2                = txOptions2;
     IsSecuritySchemeSpecified = true;
 }
Beispiel #11
0
 public ResponseDataExOperation(NetworkViewPoint network, ResponseDataDelegate receiveCallback, TransmitOptions txOptions, TransmitSecurityOptions txSecOptions, SecuritySchemes scheme, TransmitOptions2 txOptions2, byte destNodeId, byte cmdClass, byte cmd)
     : base(destNodeId, 0, new ByteIndex(cmdClass), new ByteIndex(cmd))
 {
     _network                  = network;
     ReceiveCallback           = receiveCallback;
     TxOptions                 = txOptions;
     TxSecOptions              = txSecOptions;
     SecurityScheme            = scheme;
     IsSecuritySchemeSpecified = true;
     TxOptions2                = txOptions2;
 }
Beispiel #12
0
 public SendDataExOperation(byte bridgeNodeId, byte nodeId, byte[] data, TransmitOptions txOptions, TransmitSecurityOptions txSecOptions, SecuritySchemes scheme, TransmitOptions2 txOptions2)
     : base(CommandTypes.CmdZWaveSendDataEx)
 {
     BridgeNodeId   = bridgeNodeId;
     NodeId         = nodeId;
     Data           = data;
     TxOptions      = txOptions;
     TxOptions2     = txOptions2;
     TxSecOptions   = txSecOptions;
     SecurityScheme = scheme;
 }
Beispiel #13
0
 public NoiseDataExOperation(byte nodeId, byte[] data, TransmitOptions txOptions, int intervalMs, SecuritySchemes securityScheme, TransmitSecurityOptions txSecOptions, TransmitOptions2 txOptions2)
     : base(false, null, false)
 {
     TxOptions      = txOptions;
     NodeId         = nodeId;
     Data           = data;
     IntervalMs     = intervalMs;
     SecurityScheme = securityScheme;
     TxSecOptions   = txSecOptions;
     TxOptions2     = txOptions2;
 }
Beispiel #14
0
        private void AddSecurityScheme(SecuritySchemes addScheme)
        {
            var schemes = GetSecuritySchemes();

            if (schemes != null)
            {
                SetSecuritySchemes(schemes.Union(new[] { addScheme }).ToArray());
            }
            else
            {
                SetSecuritySchemes(new[] { addScheme });
            }
        }
Beispiel #15
0
        /// <summary>handleCommandClassFWUpdate</summary>
        private ActionBase SendFwuMdReport(byte nodeId, SecuritySchemes scheme)
        {
            var fwuMdReport = new COMMAND_CLASS_FIRMWARE_UPDATE_MD_V5.FIRMWARE_MD_REPORT()
            {
                manufacturerId     = MANUFACTURE_ID,
                firmware0Id        = FIRMWARE_ID,
                firmwareUpgradable = 0xFF,
                maxFragmentSize    = Tools.GetBytes(MAX_FRAGMENT_SIZE).Skip(2).ToArray(),
            };
            var ret = new SendDataExOperation(nodeId, fwuMdReport, TxOptions, scheme);

            return(ret);
        }
Beispiel #16
0
        public SecuritySchemes GetCurrentSecurityScheme()
        {
            SecuritySchemes ret = Enums.SecuritySchemes.NONE;

            if (SecuritySchemes != null && SecuritySchemes.Length > 0)
            {
                if (SecuritySchemeIndex < 0 || SecuritySchemeIndex >= SecuritySchemes.Length)
                {
                    SecuritySchemeIndex = GetHighestKeyIndex(SecuritySchemes);
                }
                return(SecuritySchemes[SecuritySchemeIndex]);
            }
            return(ret);
        }
Beispiel #17
0
 public RequestDataExOperation(byte srcNodeId, byte destNodeId, byte[] data, TransmitOptions txOptions, TransmitSecurityOptions txSecOptions, SecuritySchemes scheme, TransmitOptions2 txOptions2, byte cmdClass, byte cmd, int timeoutMs)
     : base(false, null, false)
 {
     SrcNodeId      = srcNodeId;
     DestNodeId     = destNodeId;
     Data           = data;
     TxOptions      = txOptions;
     TxSecOptions   = txSecOptions;
     SecurityScheme = scheme;
     TxOptions2     = txOptions2;
     CmdClass       = cmdClass;
     Cmd            = cmd;
     TimeoutMs      = timeoutMs;
 }
Beispiel #18
0
        /// <summary>Indicates whether the current object is equal to another object of the same type.</summary>
        /// <param name="other">An object to compare with this object.</param>
        /// <returns>true if the current object is equal to the <paramref name="other">other</paramref> parameter; otherwise, false.</returns>
        public virtual bool Equals(Components other)
        {
            if (other is null)
            {
                return(false);
            }
            if (ReferenceEquals(this, other))
            {
                return(true);
            }

            if (!Schemas.NullableDictionaryEquals(other.Schemas))
            {
                return(false);
            }
            if (!Responses.NullableDictionaryEquals(other.Responses))
            {
                return(false);
            }
            if (!Parameters.NullableDictionaryEquals(other.Parameters))
            {
                return(false);
            }
            if (!Examples.NullableDictionaryEquals(other.Examples))
            {
                return(false);
            }
            if (!RequestBodies.NullableDictionaryEquals(other.RequestBodies))
            {
                return(false);
            }
            if (!Headers.NullableDictionaryEquals(other.Headers))
            {
                return(false);
            }
            if (!SecuritySchemes.NullableDictionaryEquals(other.SecuritySchemes))
            {
                return(false);
            }
            if (!Links.NullableDictionaryEquals(other.Links))
            {
                return(false);
            }
            if (!Callbacks.NullableDictionaryEquals(other.Callbacks))
            {
                return(false);
            }

            return(true);
        }
Beispiel #19
0
        /// <summary>CmdClassFirmwareUpdateMdGet</summary>
        private ActionBase SendFwuMdGet(byte nodeId, ushort fwuReportNumber, SecuritySchemes scheme)
        {
            _lastUsedReportNumber = fwuReportNumber;
            var reportNumber = Tools.GetBytes(fwuReportNumber);
            var fwuMdGet     = new COMMAND_CLASS_FIRMWARE_UPDATE_MD_V5.FIRMWARE_UPDATE_MD_GET()
            {
                numberOfReports = 0x01,
                reportNumber2   = reportNumber[1],
                properties1     = new COMMAND_CLASS_FIRMWARE_UPDATE_MD_V5.FIRMWARE_UPDATE_MD_GET.Tproperties1()
                {
                    reportNumber1 = reportNumber[0]
                }
            };
            var ret = new SendDataExOperation(nodeId, fwuMdGet, TxOptions, scheme);

            return(ret);
        }
Beispiel #20
0
        protected bool IsSupportedScheme(NetworkViewPoint network, byte[] command, SecuritySchemes scheme)
        {
            bool ret = false;

            if (command != null && command.Length > 0)
            {
                if (scheme == SecuritySchemes.NONE && !network.HasNetworkAwareCommandClass(command[0]) && network.HasSecurityScheme(SecuritySchemeSet.ALL))
                {
                    ret = !network.HasSecureCommandClass(command[0]);
                }
                else
                {
                    ret = true;
                }
            }
            return(ret);
        }
Beispiel #21
0
        public Components Clone()
        {
            var clone = new Components();

            clone.Schemas           = Schemas.ToDictionary(p => p.Key, p => p.Value);
            clone.Messages          = Messages.ToDictionary(p => p.Key, p => p.Value);
            clone.SecuritySchemes   = SecuritySchemes.ToDictionary(p => p.Key, p => p.Value);
            clone.Parameters        = Parameters.ToDictionary(p => p.Key, p => p.Value);
            clone.CorrelationIds    = CorrelationIds.ToDictionary(p => p.Key, p => p.Value);
            clone.ServerBindings    = ServerBindings.ToDictionary(p => p.Key, p => p.Value);
            clone.ChannelBindings   = ChannelBindings.ToDictionary(p => p.Key, p => p.Value);
            clone.OperationBindings = OperationBindings.ToDictionary(p => p.Key, p => p.Value);
            clone.MessageBindings   = MessageBindings.ToDictionary(p => p.Key, p => p.Value);
            clone.OperationTraits   = OperationTraits.ToDictionary(p => p.Key, p => p.Value);
            clone.MessageTraits     = MessageTraits.ToDictionary(p => p.Key, p => p.Value);

            return(clone);
        }
Beispiel #22
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);
        }
Beispiel #23
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);
                    }
                }
            }
        }
Beispiel #24
0
        /// <summary>
        /// Returns index of the Network key of the specified security scheme
        /// in the network keys array
        /// </summary>
        /// <param name="scheme">scheme</param>
        /// <returns>index</returns>
        public static int GetNetworkKeyIndex(SecuritySchemes scheme)
        {
            int ret = -1;

            switch (scheme)
            {
            case SecuritySchemes.S2_UNAUTHENTICATED:
                ret = NetworkKeyS2Flags.S2Class0.GetByteFlagIndex();
                break;

            case SecuritySchemes.S2_AUTHENTICATED:
                ret = NetworkKeyS2Flags.S2Class1.GetByteFlagIndex();
                break;

            case SecuritySchemes.S2_ACCESS:
                ret = NetworkKeyS2Flags.S2Class2.GetByteFlagIndex();
                break;

            case SecuritySchemes.S0:
                ret = NetworkKeyS2Flags.S0.GetByteFlagIndex();
                break;
            }
            return(ret);
        }
Beispiel #25
0
        internal static SecuritySchemes ConvertToSecurityScheme(NetworkKeyS2Flags verifyKey)
        {
            SecuritySchemes ret = SecuritySchemes.NONE;

            switch (verifyKey)
            {
            case NetworkKeyS2Flags.S2Class0:
                ret = SecuritySchemes.S2_UNAUTHENTICATED;
                break;

            case NetworkKeyS2Flags.S2Class1:
                ret = SecuritySchemes.S2_AUTHENTICATED;
                break;

            case NetworkKeyS2Flags.S2Class2:
                ret = SecuritySchemes.S2_ACCESS;
                break;

            case NetworkKeyS2Flags.S0:
                ret = SecuritySchemes.S0;
                break;
            }
            return(ret);
        }
Beispiel #26
0
        public static SecurityClasses GetSecurityClass(SecuritySchemes scheme)
        {
            SecurityClasses ret = SecurityClasses.None;

            switch (scheme)
            {
            case SecuritySchemes.S2_UNAUTHENTICATED:
                ret = SecurityClasses.S2Class0;
                break;

            case SecuritySchemes.S2_AUTHENTICATED:
                ret = SecurityClasses.S2Class1;
                break;

            case SecuritySchemes.S2_ACCESS:
                ret = SecurityClasses.S2Class2;
                break;

            case SecuritySchemes.S0:
                ret = SecurityClasses.S0;
                break;
            }
            return(ret);
        }
Beispiel #27
0
        public static SecuritySchemes GetSecurityScheme(SecurityClasses securityClass)
        {
            SecuritySchemes ret = SecuritySchemes.NONE;

            switch (securityClass)
            {
            case SecurityClasses.S2Class0:
                ret = SecuritySchemes.S2_UNAUTHENTICATED;
                break;

            case SecurityClasses.S2Class1:
                ret = SecuritySchemes.S2_AUTHENTICATED;
                break;

            case SecurityClasses.S2Class2:
                ret = SecuritySchemes.S2_ACCESS;
                break;

            case SecurityClasses.S0:
                ret = SecuritySchemes.S0;
                break;
            }
            return(ret);
        }
Beispiel #28
0
 /// <summary>
 /// Shortcut to add a security requirement that is not <see cref="SecuritySchemes.Oauth2"/>
 /// </summary>
 /// <param name="securityScheme">
 /// The security scheme.
 /// </param>
 /// <returns>
 /// The <see cref="SwaggerRootBuilder"/>.
 /// </returns>
 public SwaggerRootBuilder SecurityRequirement(SecuritySchemes securityScheme)
 {
     return(this.SecurityRequirement(new SecurityRequirementBuilder().SecurityScheme(securityScheme).Build()));
 }
 /// <summary>
 /// The security scheme.
 /// </summary>
 /// <param name="scheme">
 /// The scheme.
 /// </param>
 /// <returns>
 /// The <see cref="SecurityRequirementBuilder"/>.
 /// </returns>
 public SecurityRequirementBuilder SecurityScheme(SecuritySchemes scheme)
 {
     this.scheme = scheme;
     return this;
 }
 protected virtual void SaveDataForRetransmission(InvariantPeerNodeId peerNodeId, byte[] plainData, SubstituteSettings substituteSettings, SecuritySchemes scheme)
 {
 }
Beispiel #31
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);
                }
            }
        }
 /// <summary>
 /// Shortcut to add a security requirement that is not <see cref="SecuritySchemes.Oauth2"/>
 /// </summary>
 /// <param name="securityScheme">
 /// The security scheme.
 /// </param>
 /// <returns>
 /// The <see cref="OperationBuilder"/>.
 /// </returns>
 public OperationBuilder SecurityRequirement(SecuritySchemes securityScheme)
 {
     return this.SecurityRequirement(new SecurityRequirementBuilder().SecurityScheme(securityScheme).Build());
 }