Tasmota/lib/KeeloqLib/src/KeeloqLib.cpp
2020-02-24 19:23:57 +01:00

59 lines
1.4 KiB
C++

/*
Keeloq.cpp - Keeloq encryption/decryption
Written by Frank Kienast in November, 2010
*/
#include "KeeloqLib.h"
#define KeeLoq_NLF (0x3A5C742EUL)
Keeloq::Keeloq(const unsigned long keyHigh, const unsigned long keyLow) :
_keyHigh( keyHigh ),
_keyLow( keyLow )
{
}
unsigned long Keeloq::encrypt( const unsigned long data )
{
unsigned long x = data;
unsigned long r;
int keyBitNo, index;
unsigned long keyBitVal,bitVal;
for ( r = 0; r < 528; r++ )
{
keyBitNo = r & 63;
if(keyBitNo < 32)
keyBitVal = bitRead(_keyLow,keyBitNo);
else
keyBitVal = bitRead(_keyHigh, keyBitNo - 32);
index = 1 * bitRead(x,1) + 2 * bitRead(x,9) + 4 * bitRead(x,20) + 8 * bitRead(x,26) + 16 * bitRead(x,31);
bitVal = bitRead(x,0) ^ bitRead(x, 16) ^ bitRead(KeeLoq_NLF,index) ^ keyBitVal;
x = (x>>1) ^ bitVal<<31;
}
return x;
}
unsigned long Keeloq::decrypt( const unsigned long data )
{
unsigned long x = data;
unsigned long r;
int keyBitNo, index;
unsigned long keyBitVal,bitVal;
for (r = 0; r < 528; r++)
{
keyBitNo = (15-r) & 63;
if(keyBitNo < 32)
keyBitVal = bitRead(_keyLow,keyBitNo);
else
keyBitVal = bitRead(_keyHigh, keyBitNo - 32);
index = 1 * bitRead(x,0) + 2 * bitRead(x,8) + 4 * bitRead(x,19) + 8 * bitRead(x,25) + 16 * bitRead(x,30);
bitVal = bitRead(x,31) ^ bitRead(x, 15) ^ bitRead(KeeLoq_NLF,index) ^ keyBitVal;
x = (x<<1) ^ bitVal;
}
return x;
}