99
1010#define TAG "SubGhzProtocoAlutech_at_4n"
1111
12- #define SUBGHZ_NO_ALUTECH_AT_4N_RAINBOW_TABLE 0xFFFFFFFF
12+ #define SUBGHZ_NO_ALUTECH_AT_4N_RAINBOW_TABLE 0xFFFFFFFFFFFFFFFF
13+ #define SUBGHZ_ALUTECH_AT_4N_RAINBOW_TABLE_SIZE_BYTES 32
1314
1415static const SubGhzBlockConst subghz_protocol_alutech_at_4n_const = {
1516 .te_short = 400 ,
@@ -140,27 +141,21 @@ LevelDuration subghz_protocol_encoder_alutech_at_4n_yield(void* context) {
140141}
141142
142143/**
143- * Read bytes from rainbow table
144- * @param file_name Full path to rainbow table the file
144+ * Read bytes from buffer array with rainbow table
145+ * @param buffer Pointer to decrypted magic data buffer
145146 * @param number_alutech_at_4n_magic_data number in the array
146147 * @return alutech_at_4n_magic_data
147148 */
148- static uint32_t subghz_protocol_alutech_at_4n_get_magic_data_in_file (
149- const char * file_name ,
149+ static uint32_t subghz_protocol_alutech_at_4n_get_magic_data_from_buffer (
150+ uint8_t * buffer ,
150151 uint8_t number_alutech_at_4n_magic_data ) {
151- if (!strcmp (file_name , "" )) return SUBGHZ_NO_ALUTECH_AT_4N_RAINBOW_TABLE ;
152-
153- uint8_t buffer [sizeof (uint32_t )] = {0 };
154152 uint32_t address = number_alutech_at_4n_magic_data * sizeof (uint32_t );
155153 uint32_t alutech_at_4n_magic_data = 0 ;
156154
157- if (subghz_keystore_raw_get_data (file_name , address , buffer , sizeof (uint32_t ))) {
158- for (size_t i = 0 ; i < sizeof (uint32_t ); i ++ ) {
159- alutech_at_4n_magic_data = (alutech_at_4n_magic_data << 8 ) | buffer [i ];
160- }
161- } else {
162- alutech_at_4n_magic_data = SUBGHZ_NO_ALUTECH_AT_4N_RAINBOW_TABLE ;
155+ for (size_t i = address ; i < (address + sizeof (uint32_t )); i ++ ) {
156+ alutech_at_4n_magic_data = (alutech_at_4n_magic_data << 8 ) | buffer [i ];
163157 }
158+
164159 return alutech_at_4n_magic_data ;
165160}
166161
@@ -195,17 +190,29 @@ static uint8_t subghz_protocol_alutech_at_4n_decrypt_data_crc(uint8_t data) {
195190}
196191
197192static uint64_t subghz_protocol_alutech_at_4n_decrypt (uint64_t data , const char * file_name ) {
193+ // load and decrypt rainbow table from file to buffer array in RAM
194+ if (!file_name ) return SUBGHZ_NO_ALUTECH_AT_4N_RAINBOW_TABLE ;
195+
196+ uint8_t buffer [SUBGHZ_ALUTECH_AT_4N_RAINBOW_TABLE_SIZE_BYTES ] = {0 };
197+ uint8_t * buffer_ptr = (uint8_t * )& buffer ;
198+
199+ if (subghz_keystore_raw_get_data (
200+ file_name , 0 , buffer , SUBGHZ_ALUTECH_AT_4N_RAINBOW_TABLE_SIZE_BYTES )) {
201+ } else {
202+ return SUBGHZ_NO_ALUTECH_AT_4N_RAINBOW_TABLE ;
203+ }
204+
198205 uint8_t * p = (uint8_t * )& data ;
199206 uint32_t data1 = p [0 ] << 24 | p [1 ] << 16 | p [2 ] << 8 | p [3 ];
200207 uint32_t data2 = p [4 ] << 24 | p [5 ] << 16 | p [6 ] << 8 | p [7 ];
201208 uint32_t data3 = 0 ;
202209 uint32_t magic_data [] = {
203- subghz_protocol_alutech_at_4n_get_magic_data_in_file ( file_name , 0 ),
204- subghz_protocol_alutech_at_4n_get_magic_data_in_file ( file_name , 1 ),
205- subghz_protocol_alutech_at_4n_get_magic_data_in_file ( file_name , 2 ),
206- subghz_protocol_alutech_at_4n_get_magic_data_in_file ( file_name , 3 ),
207- subghz_protocol_alutech_at_4n_get_magic_data_in_file ( file_name , 4 ),
208- subghz_protocol_alutech_at_4n_get_magic_data_in_file ( file_name , 5 )};
210+ subghz_protocol_alutech_at_4n_get_magic_data_from_buffer ( buffer_ptr , 0 ),
211+ subghz_protocol_alutech_at_4n_get_magic_data_from_buffer ( buffer_ptr , 1 ),
212+ subghz_protocol_alutech_at_4n_get_magic_data_from_buffer ( buffer_ptr , 2 ),
213+ subghz_protocol_alutech_at_4n_get_magic_data_from_buffer ( buffer_ptr , 3 ),
214+ subghz_protocol_alutech_at_4n_get_magic_data_from_buffer ( buffer_ptr , 4 ),
215+ subghz_protocol_alutech_at_4n_get_magic_data_from_buffer ( buffer_ptr , 5 )};
209216
210217 uint32_t i = magic_data [0 ];
211218 do {
@@ -230,17 +237,29 @@ static uint64_t subghz_protocol_alutech_at_4n_decrypt(uint64_t data, const char*
230237}
231238
232239static uint64_t subghz_protocol_alutech_at_4n_encrypt (uint64_t data , const char * file_name ) {
240+ // load and decrypt rainbow table from file to buffer array in RAM
241+ if (!file_name ) return SUBGHZ_NO_ALUTECH_AT_4N_RAINBOW_TABLE ;
242+
243+ uint8_t buffer [SUBGHZ_ALUTECH_AT_4N_RAINBOW_TABLE_SIZE_BYTES ] = {0 };
244+ uint8_t * buffer_ptr = (uint8_t * )& buffer ;
245+
246+ if (subghz_keystore_raw_get_data (
247+ file_name , 0 , buffer , SUBGHZ_ALUTECH_AT_4N_RAINBOW_TABLE_SIZE_BYTES )) {
248+ } else {
249+ return SUBGHZ_NO_ALUTECH_AT_4N_RAINBOW_TABLE ;
250+ }
251+
233252 uint8_t * p = (uint8_t * )& data ;
234253 uint32_t data1 = 0 ;
235254 uint32_t data2 = p [0 ] << 24 | p [1 ] << 16 | p [2 ] << 8 | p [3 ];
236255 uint32_t data3 = p [4 ] << 24 | p [5 ] << 16 | p [6 ] << 8 | p [7 ];
237256 uint32_t magic_data [] = {
238- subghz_protocol_alutech_at_4n_get_magic_data_in_file ( file_name , 6 ),
239- subghz_protocol_alutech_at_4n_get_magic_data_in_file ( file_name , 4 ),
240- subghz_protocol_alutech_at_4n_get_magic_data_in_file ( file_name , 5 ),
241- subghz_protocol_alutech_at_4n_get_magic_data_in_file ( file_name , 1 ),
242- subghz_protocol_alutech_at_4n_get_magic_data_in_file ( file_name , 2 ),
243- subghz_protocol_alutech_at_4n_get_magic_data_in_file ( file_name , 0 )};
257+ subghz_protocol_alutech_at_4n_get_magic_data_from_buffer ( buffer_ptr , 6 ),
258+ subghz_protocol_alutech_at_4n_get_magic_data_from_buffer ( buffer_ptr , 4 ),
259+ subghz_protocol_alutech_at_4n_get_magic_data_from_buffer ( buffer_ptr , 5 ),
260+ subghz_protocol_alutech_at_4n_get_magic_data_from_buffer ( buffer_ptr , 1 ),
261+ subghz_protocol_alutech_at_4n_get_magic_data_from_buffer ( buffer_ptr , 2 ),
262+ subghz_protocol_alutech_at_4n_get_magic_data_from_buffer ( buffer_ptr , 0 )};
244263
245264 do {
246265 data1 = data1 + magic_data [0 ];
0 commit comments