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); } }