X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/fhem-stuff/blobdiff_plain/8fc5602ac4ca60bb35f22c2e212479daa6266e13..7836eda2dea521f15eb59b08e940719790c74349:/HMLAN/HMLAN_CRYPT.pm diff --git a/HMLAN/HMLAN_CRYPT.pm b/HMLAN/HMLAN_CRYPT.pm new file mode 100644 index 0000000..12604b1 --- /dev/null +++ b/HMLAN/HMLAN_CRYPT.pm @@ -0,0 +1,86 @@ +package HMLAN_CRYPT; + +use Crypt::Rijndael; + +sub decrypt(@) +{ + my ($self, $ciphertext) = @_; + my $plaintext = ''; + + while($ciphertext) { + if($self->{'keystream'}) { + my $len; + + if (length($self->{'keystream'}) > length($ciphertext)) { + $len = length($ciphertext); + } else { + $len = length($self->{'keystream'}); + } + + my $cpart = substr($ciphertext, 0, $len); + my $kpart = substr($self->{'keystream'}, 0, $len); + + $ciphertext = substr($ciphertext, $len); + $self->{'keystream'} = substr($self->{'keystream'}, $len); + + $self->{'ciphertext'} .= $cpart; + + $plaintext .= $cpart ^ $kpart; + } else { + $self->{'keystream'} = $self->{'cipher'}->encrypt($self->{'ciphertext'}); + $self->{'ciphertext'}=''; + } + } + + $plaintext; +} + +sub encrypt(@) +{ + my ($self, $plaintext) = @_; + my $ciphertext = ''; + + while($plaintext) { + if($self->{'keystream'}) { + my $len; + + if (length($self->{'keystream'}) > length($plaintext)) { + $len = length($plaintext); + } else { + $len = length($self->{'keystream'}); + } + + my $ppart = substr($plaintext, 0, $len); + my $kpart = substr($self->{'keystream'}, 0, $len); + + $plaintext = substr($plaintext, $len); + $self->{'keystream'} = substr($self->{'keystream'}, $len); + + $self->{'ciphertext'} .= $ppart ^ $kpart; + + $ciphertext .= $ppart ^ $kpart; + } else { + $self->{'keystream'} = $self->{'cipher'}->encrypt($self->{'ciphertext'}); + $self->{'ciphertext'}=''; + } + } + + $ciphertext; +} + +sub new +{ + my $class = shift; + my $key = shift; + my $iv = shift; + + my $self = { + cipher => Crypt::Rijndael->new($key, Crypt::Rijndael::MODE_ECB()), + keystream => '', + ciphertext => $iv, + }; + + bless $self, $class; +} + +1;