From 32763eb99bcd1c85c93c893ac3312931a2c652eb Mon Sep 17 00:00:00 2001 From: kaihs <> Date: Wed, 26 Dec 2018 11:45:15 +0000 Subject: [PATCH] WMBus: handle partially encrypted messages git-svn-id: https://svn.fhem.de/fhem/trunk@18058 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/WMBus.pm | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/fhem/FHEM/WMBus.pm b/fhem/FHEM/WMBus.pm index a41e07c51..337de2320 100644 --- a/fhem/FHEM/WMBus.pm +++ b/fhem/FHEM/WMBus.pm @@ -1453,12 +1453,14 @@ sub decrypt($) { for (1..8) { $initVector .= pack('C',$self->{access_no}); } + if (length($encrypted)%16 == 0) { # no padding if data length is multiple of blocksize $padding = 0; } else { $padding = 2; } + #printf("length encrypted %d padding %d\n", length($encrypted), $padding); my $cipher = Crypt::Mode::CBC->new('AES', $padding); return $cipher->decrypt($encrypted, $self->{aeskey}, $initVector); } @@ -1827,8 +1829,18 @@ sub decodeApplicationLayer($) { if ($self->{aeskey}) { if ($hasCBC) { - #printf("encrypted payload %s\n", unpack("H*", substr($applicationlayer,$offset))); - $payload = $self->decrypt(substr($applicationlayer,$offset)); + my $encrypted_length = $self->{cw_parts}{encrypted_blocks} * 16; + #printf("encrypted payload %s\n", unpack("H*", substr($applicationlayer,$offset, $encrypted_length))); + eval { + $payload = $self->decrypt(substr($applicationlayer, $offset, $encrypted_length)) + . substr($applicationlayer, $offset+$encrypted_length); + }; + if ($@) { + #fatal decryption error occurred + $self->{errormsg} = "fatal decryption error: $@"; + $self->{errorcode} = ERR_DECRYPTION_FAILED; + return 0; + } #printf("decrypted payload %s\n", unpack("H*", $payload)); if (unpack('n', $payload) == 0x2f2f) { $self->{decrypted} = 1;