21using MLFSR48 = m5::utility::FibonacciLFSR_Left<48, 5, 6, 7, 9, 13, 19, 21, 23, 24, 29, 31, 33, 34, 36, 38, 39, 43, 48>;
32 explicit Crypto1(
const uint64_t key48) noexcept : MLFSR48(0)
37 void init(
const uint64_t key48)
noexcept
39 _state = state_type_t{};
41 for (
int i = 0; i < 48; ++i) {
42 int byte_index = i >> 3;
43 int bit_index = i & 0x07;
44 int reversed = (byte_index << 3) + (bit_index ^ 7);
45 bool bit = (key48 >> reversed) & 1ULL;
51 inline uint32_t inject(uint32_t uid, uint32_t Nt,
const bool encrypted =
false)
noexcept
53 return step32(uid ^ Nt, encrypted);
56 bool step_with(
const bool in,
const bool enc =
false)
noexcept
62 const bool ext = in ^ (enc ? z : 0);
63 _state[0] = _state[0] ^ ext;
67 uint8_t step8(
const uint8_t in,
const bool enc =
false)
noexcept
70 for (uint_fast8_t i = 0; i < 8; ++i) {
71 v |= step_with((in >> i) & 1, enc) << i;
76 uint32_t step32(
const uint32_t in,
const bool enc =
false)
noexcept
79 for (uint32_t i = 0; i < 32; ++i) {
80 bool t = step_with((in >> (i ^ 24)) & 1u, enc);
86 static inline uint8_t oddparity8(uint8_t x)
noexcept
88 return !__builtin_parity(x);
91 uint8_t encrypt(uint8_t buf[8],
const uint32_t Nr,
const uint32_t Ar)
noexcept
94 for (uint_fast8_t i = 0; i < 4; ++i) {
95 const uint8_t
v = ((Nr >> ((i ^ 0x03) << 3)) & 0xFF);
96 buf[i] = step8(
v) ^
v;
97 const uint8_t z = filter();
98 parity |=
static_cast<uint8_t
>((z ^ oddparity8(
v)) & 0x01) << i;
101 for (uint_fast8_t pos = 4; pos < 8; ++pos) {
102 const uint8_t i = pos - 4;
104 const uint8_t
v = (Ar >> (i << 3)) & 0xFF;
105 const uint8_t ks = step8(0x00);
107 const uint8_t z = filter();
108 parity |=
static_cast<uint8_t
>((z ^ oddparity8(
v)) & 0x01) << pos;
113 uint32_t encrypt(uint8_t* out,
const uint8_t* in,
const uint8_t in_len )
116 for (uint_fast8_t i = 0; i < in_len; ++i) {
117 uint8_t ks = step8(0);
119 parity |= ((filter() ^ oddparity8(in[i])) & 1) << i;
124 inline bool filter()
const noexcept
126 const state_type_t& s = state();
127 const bool b5 = fb(s[6], s[4], s[2], s[0]);
128 const bool a4 = fa(s[14], s[12], s[10], s[8]);
129 const bool b3 = fb(s[22], s[20], s[18], s[16]);
130 const bool b2 = fb(s[30], s[28], s[26], s[24]);
131 const bool a1 = fa(s[38], s[36], s[34], s[32]);
132 return fc(a1, b2, b3, a4, b5);
135 inline static bool fa(
bool a,
bool b,
bool c,
bool d)
noexcept
137 return ((
a ||
b) ^ (
a && d)) ^ (c && ((
a ^
b) || d));
140 inline static bool fb(
bool a,
bool b,
bool c,
bool d)
noexcept
142 return ((
a &&
b) || c) ^ ((
a ^
b) && (c || d));
145 inline static bool fc(
bool a,
bool b,
bool c,
bool d,
bool e)
noexcept
147 return (
a || ((
b || e) && (d ^ e))) ^ ((
a ^ (
b && d)) && ((c ^ d) || (
b && e)));