示例#1
0
 protected override byte GetPropertyByte(byte property)
 {
     COMMAND_CLASS_SECURITY.SECURITY_MESSAGE_ENCAPSULATION.Tproperties1 prop = property;
     if (prop.sequenced > 0 && prop.secondFrame > 0 && _securityManagerInfo.TestPropertyByteS0SecondFrame != null)
     {
         return((byte)_securityManagerInfo.TestPropertyByteS0SecondFrame);
     }
     else if (_securityManagerInfo.TestPropertyByteS0 != null)
     {
         return((byte)_securityManagerInfo.TestPropertyByteS0);
     }
     else
     {
         return(base.GetPropertyByte(property));
     }
 }
        public byte[] Encrypt(byte property, byte[] command, byte senderNodeId, byte receiverNodeId, byte[] externalNonce1)
        {
            COMMAND_CLASS_SECURITY.SECURITY_MESSAGE_ENCAPSULATION ret = new COMMAND_CLASS_SECURITY.SECURITY_MESSAGE_ENCAPSULATION();
            COMMAND_CLASS_SECURITY.SECURITY_MESSAGE_ENCAPSULATION.Tproperties1 prop = property;
            byte[] payload = new byte[command.Length + 1];
            payload[0] = GetPropertyByte(property);
            Array.Copy(command, 0, payload, 1, command.Length);
            var internalNonce = GetInternalNonceArray(senderNodeId, receiverNodeId);

            ret.initializationVectorByte = internalNonce;
            var externalNonce = GetExternalNonceArray(externalNonce1);

            if (internalNonce != null && internalNonce.Length == 8 &&
                externalNonce != null && externalNonce.Length == 8)
            {
                byte[] IV = new byte[16];
                Array.Copy(internalNonce, 0, IV, 0, 8);
                Array.Copy(externalNonce, 0, IV, 8, 8);

                SecurityS0Utils.Encrypt(AesEngine, _encKey, IV, ref payload);

                ret.properties1 = payload[0];
                if (payload.Length > 0)
                {
                    ret.commandByte = new List <byte>();
                    for (int i = 1; i < payload.Length; i++)
                    {
                        ret.commandByte.Add(payload[i]);
                    }
                }
                ret.receiversNonceIdentifier = GetNonceIdByte(externalNonce);

                byte cmdId;
                if (prop.sequenced > 0 && prop.secondFrame == 0)
                {
                    cmdId = COMMAND_CLASS_SECURITY.SECURITY_MESSAGE_ENCAPSULATION_NONCE_GET.ID;
                }
                else
                {
                    cmdId = COMMAND_CLASS_SECURITY.SECURITY_MESSAGE_ENCAPSULATION.ID;
                }

                ret.messageAuthenticationCodeByte = GetMacArray(senderNodeId, receiverNodeId, IV, cmdId, payload);
            }
            return(ret);
        }
        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);
            }
        }