@@ -110,12 +110,7 @@ static void init_opt_select_LUT(void) {
110
110
}
111
111
***********************************************************************************/
112
112
113
- #define loclass_opt__select (x , y , r ) \
114
- (4 & ((((r) & ((r) << 2)) >> 5) ^ (((r) & ~((r) << 2)) >> 4) ^ (((r) | (r) << 2) >> 3))) | \
115
- (2 & ((((r) | (r) << 2) >> 6) ^ (((r) | (r) << 2) >> 1) ^ ((r) >> 5) ^ (r) ^ (((x) ^ (y)) << 1))) | \
116
- (1 & ((((r) & ~((r) << 2)) >> 4) ^ (((r) & ((r) << 2)) >> 3) ^ (r) ^ (x)))
117
-
118
- static void loclass_opt_successor (const uint8_t * k , LoclassState_t * s , uint8_t y ) {
113
+ static inline void loclass_opt_successor (const uint8_t * k , LoclassState_t * s , uint8_t y ) {
119
114
uint16_t Tt = s -> t & 0xc533 ;
120
115
Tt = Tt ^ (Tt >> 1 );
121
116
Tt = Tt ^ (Tt >> 4 );
@@ -133,38 +128,38 @@ static void loclass_opt_successor(const uint8_t* k, LoclassState_t* s, uint8_t y
133
128
s -> b = s -> b >> 1 ;
134
129
s -> b |= (opt_B ^ s -> r ) << 7 ;
135
130
136
- uint8_t opt_select = loclass_opt_select_LUT [s -> r ] & 0x04 ;
137
- opt_select |= (loclass_opt_select_LUT [s -> r ] ^ ((Tt ^ y ) << 1 )) & 0x02 ;
138
- opt_select |= (loclass_opt_select_LUT [s -> r ] ^ Tt ) & 0x01 ;
131
+ uint8_t Tt1 = Tt & 0x01 ;
132
+ uint8_t opt_select = loclass_opt_select_LUT [s -> r ] ^ Tt1 ^ ((Tt1 ^ (y & 0x01 )) << 1 );
139
133
140
134
uint8_t r = s -> r ;
141
135
s -> r = (k [opt_select ] ^ s -> b ) + s -> l ;
142
136
s -> l = s -> r + r ;
143
137
}
144
138
145
- static void loclass_opt_suc (
139
+ static inline void loclass_opt_suc (
146
140
const uint8_t * k ,
147
141
LoclassState_t * s ,
148
142
const uint8_t * in ,
149
143
uint8_t length ,
150
144
bool add32Zeroes ) {
151
145
for (int i = 0 ; i < length ; i ++ ) {
152
146
uint8_t head = in [i ];
147
+ #pragma GCC unroll 8
153
148
for (int j = 0 ; j < 8 ; j ++ ) {
154
149
loclass_opt_successor (k , s , head );
155
150
head >>= 1 ;
156
151
}
157
152
}
158
- //For tag MAC, an additional 32 zeroes
153
+ // For tag MAC, an additional 32 zeroes
159
154
if (add32Zeroes ) {
160
- for (int i = 0 ; i < 16 ; i ++ ) {
161
- loclass_opt_successor (k , s , 0 );
155
+ for (int i = 0 ; i < 32 ; i ++ ) {
162
156
loclass_opt_successor (k , s , 0 );
163
157
}
164
158
}
165
159
}
166
160
167
- static void loclass_opt_output (const uint8_t * k , LoclassState_t * s , uint8_t * buffer ) {
161
+ static inline void loclass_opt_output (const uint8_t * k , LoclassState_t * s , uint8_t * buffer ) {
162
+ #pragma GCC unroll 4
168
163
for (uint8_t times = 0 ; times < 4 ; times ++ ) {
169
164
uint8_t bout = 0 ;
170
165
bout |= (s -> r & 0x4 ) >> 2 ;
@@ -280,19 +275,25 @@ void loclass_opt_doTagMAC_2(
280
275
loclass_opt_output (div_key_p , & _init , mac );
281
276
}
282
277
278
+ /**
279
+ * The second part of the tag MAC calculation, since the CC is already calculated into the state,
280
+ * this function is fed only the NR, and generates both the reader and tag MACs.
281
+ * @param _init - precalculated cipher state
282
+ * @param nr - the reader challenge
283
+ * @param rmac - where to store the reader MAC
284
+ * @param tmac - where to store the tag MAC
285
+ * @param div_key_p - the key to use
286
+ */
283
287
void loclass_opt_doBothMAC_2 (
284
288
LoclassState_t _init ,
285
289
uint8_t * nr ,
286
290
uint8_t rmac [4 ],
287
291
uint8_t tmac [4 ],
288
292
const uint8_t * div_key_p ) {
289
- loclass_opt_suc (div_key_p , & _init , nr , 4 , false);
290
- // Save internal state for reuse before outputting
291
- LoclassState_t nr_state = _init ;
292
- loclass_opt_output (div_key_p , & _init , rmac );
293
- // Feed the 32 0 bits for the tag mac
294
- loclass_opt_suc (div_key_p , & nr_state , NULL , 0 , true);
295
- loclass_opt_output (div_key_p , & nr_state , tmac );
293
+ LoclassState_t * s = & _init ;
294
+ loclass_opt_suc (div_key_p , s , nr , 4 , false);
295
+ loclass_opt_output (div_key_p , s , rmac );
296
+ loclass_opt_output (div_key_p , s , tmac );
296
297
}
297
298
298
299
void loclass_iclass_calc_div_key (uint8_t * csn , const uint8_t * key , uint8_t * div_key , bool elite ) {
0 commit comments