public static byte[] DecryptPayload(byte[] externalNonce, byte[] internalNonce, byte[] securityKey, byte[] message) { ZWaveAES AES = new ZWaveAES(); byte[] _authKey = new byte[16]; byte[] _encKey = new byte[16]; SecurityS0Utils.LoadKeys(AES, securityKey, out _authKey, out _encKey); byte[] _IV = new byte[16]; Array.Copy(internalNonce, 0, _IV, 0, internalNonce.Length); Array.Copy(externalNonce, 0, _IV, 8, externalNonce.Length); SecurityS0Utils.Decrypt(AES, _encKey, _IV, ref message); return(message); }
public static byte[] EncryptCommand(byte property, byte[] command, byte senderNodeId, byte receiverNodeId, byte[] internalNonce, byte[] externalNonce, byte[] networkKey, bool isWithNonceGet) { byte[] _authKey = new byte[16]; byte[] _encKey = new byte[16]; COMMAND_CLASS_SECURITY.SECURITY_MESSAGE_ENCAPSULATION.Tproperties1 prop = property; COMMAND_CLASS_SECURITY.SECURITY_MESSAGE_ENCAPSULATION ret = new COMMAND_CLASS_SECURITY.SECURITY_MESSAGE_ENCAPSULATION(); ret.initializationVectorByte = internalNonce; byte[] payload = new byte[command.Length + 1]; payload[0] = prop; Array.Copy(command, 0, payload, 1, command.Length); byte[] IV = new byte[16]; Array.Copy(internalNonce, 0, IV, 0, 8); Array.Copy(externalNonce, 0, IV, 8, 8); ZWaveAES _aesEngine = new ZWaveAES(); SecurityS0Utils.LoadKeys(_aesEngine, networkKey, out _authKey, out _encKey); 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 = externalNonce[0]; byte[] header = new byte[20]; Array.Copy(IV, 0, header, 0, IV.Length); header[16] = COMMAND_CLASS_SECURITY.SECURITY_MESSAGE_ENCAPSULATION.ID; if (isWithNonceGet) { header[16] = COMMAND_CLASS_SECURITY.SECURITY_MESSAGE_ENCAPSULATION_NONCE_GET.ID; } else { header[16] = COMMAND_CLASS_SECURITY.SECURITY_MESSAGE_ENCAPSULATION.ID; } header[17] = senderNodeId; header[18] = receiverNodeId; header[19] = (byte)payload.Length; ret.messageAuthenticationCodeByte = SecurityS0Utils.MakeAuthTag(_aesEngine, _authKey, header, payload); return(ret); }
public void OnNetworkKeyS0Changed(byte[] networkKey) { SecurityS0Utils.LoadKeys(AesEngine, networkKey, out _authKey, out _encKey); }