Code Monkey home page Code Monkey logo

send-my's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

send-my's Issues

About the public key rolling

Hi, in your article I noticed that the pairing procedure is:
When paring an AirTag with an Apple Device, an Elliptic Curve key pair is generated and the public key is pushed to the AirTag (and a shared secret to generate rolling public keys)

I’m confused about whether the private key will be stored in the airtag, because from the paper https://arxiv.org/pdf/2103.02282.pdf section 6.1, it seems that if you don’t know the d_i then you can’t calculate the next p_i?

Would be appreciated if you can clarify this 🤣 thanks!

idf.py build fails .

Hello
On Ubuntu with ESP32 WRoom When run idf.py build. I get the following error :

/home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c: In function 'set_addr_and_payload_for_bit': /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:169:40: warning: passing argument 2 of 'copy_4b_big_endian' from incompatible pointer type [-Wincompatible-pointer-types] 169 | copy_4b_big_endian(&public_key[2], &index); | ^~~~~~ | | | uint32_t * {aka long unsigned int *} /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:157:48: note: expected 'uint8_t *' {aka 'unsigned char *'} but argument is of type 'uint32_t *' {aka 'long unsigned int *'} 157 | void copy_4b_big_endian(uint8_t *dst, uint8_t *src) { | ~~~~~~~~~^~~ /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:170:40: warning: passing argument 2 of 'copy_4b_big_endian' from incompatible pointer type [-Wincompatible-pointer-types] 170 | copy_4b_big_endian(&public_key[6], &msg_id); | ^~~~~~~ | | | uint32_t * {aka long unsigned int *} /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:157:48: note: expected 'uint8_t *' {aka 'unsigned char *'} but argument is of type 'uint32_t *' {aka 'long unsigned int *'} 157 | void copy_4b_big_endian(uint8_t *dst, uint8_t *src) { | ~~~~~~~~~^~~ /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:171:41: warning: passing argument 2 of 'copy_4b_big_endian' from incompatible pointer type [-Wincompatible-pointer-types] 171 | copy_4b_big_endian(&public_key[10], &modem_id); | ^~~~~~~~~ | | | const uint32_t * {aka const long unsigned int *} /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:157:48: note: expected 'uint8_t *' {aka 'unsigned char *'} but argument is of type 'const uint32_t *' {aka 'const long unsigned int *'} 157 | void copy_4b_big_endian(uint8_t *dst, uint8_t *src) { | ~~~~~~~~~^~~ /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:174:45: warning: passing argument 2 of 'copy_4b_big_endian' from incompatible pointer type [-Wincompatible-pointer-types] 174 | copy_4b_big_endian(&public_key[14], &valid_key_counter); | ^~~~~~~~~~~~~~~~~~ | | | uint32_t * {aka long unsigned int *} /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:157:48: note: expected 'uint8_t *' {aka 'unsigned char *'} but argument is of type 'uint32_t *' {aka 'long unsigned int *'} 157 | void copy_4b_big_endian(uint8_t *dst, uint8_t *src) { | ~~~~~~~~~^~~ In file included from /home/user/esp/esp-idf/components/log/include/esp_log.h:15, from /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:15: /home/user/esp/esp-idf/components/log/include/esp_log_color.h:43:69: error: format '%d' expects argument of type 'int', but argument 6 has type 'uint32_t' {aka 'long unsigned int'} [-Werror=format=] 43 | #define LOG_ANSI_COLOR(TEXT_COLOR) "\033[" TEXT_COLOR "m" | ^~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:47:69: note: in expansion of macro 'LOG_ANSI_COLOR' 47 | #define LOG_ANSI_COLOR_REGULAR(COLOR) LOG_ANSI_COLOR(LOG_ANSI_COLOR_STYLE_RESET ";" COLOR) | ^~~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:91:31: note: in expansion of macro 'LOG_ANSI_COLOR_REGULAR' 91 | #define LOG_COLOR_E LOG_ANSI_COLOR_REGULAR(LOG_COLOR_RED) | ^~~~~~~~~~~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:62:37: note: in expansion of macro 'LOG_COLOR_E' 62 | #define LOG_FORMAT(letter, format) LOG_COLOR_ ## letter #letter " (%" PRIu32 ") %s: " format LOG_RESET_COLOR "\n" | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:182:86: note: in expansion of macro 'LOG_FORMAT' 182 | if (level==ESP_LOG_ERROR ) { esp_log_write(ESP_LOG_ERROR, tag, LOG_FORMAT(E, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } \ | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:205:38: note: in expansion of macro 'ESP_LOG_LEVEL' 205 | if (_ESP_LOG_ENABLED(level)) ESP_LOG_LEVEL(level, tag, format, ##__VA_ARGS__); \ | ^~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:114:38: note: in expansion of macro 'ESP_LOG_LEVEL_LOCAL' 114 | #define ESP_LOGI( tag, format, ... ) ESP_LOG_LEVEL_LOCAL(ESP_LOG_INFO, tag, format, ##__VA_ARGS__) | ^~~~~~~~~~~~~~~~~~~ /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:178:5: note: in expansion of macro 'ESP_LOGI' 178 | ESP_LOGI(LOG_TAG, " pub key to use (%d. try): %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x ... %02x", valid_key_counter, public_key[0], public_key[1], public_key[2], public_key[3], public_key[4], public_key[5], public_key[6], public_key[7], public_key[8], public_key[9], public_key[10], public_key[11], public_key[12], public_key[13],public_key[14], public_key[15],public_key[16],public_key[17],public_key[19], public_key[19], public_key[20], public_key[21], public_key[22], public_key[23], public_key[24], public_key[25], public_key[26], public_key[27]); | ^~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:43:69: error: format '%d' expects argument of type 'int', but argument 6 has type 'uint32_t' {aka 'long unsigned int'} [-Werror=format=] 43 | #define LOG_ANSI_COLOR(TEXT_COLOR) "\033[" TEXT_COLOR "m" | ^~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:47:69: note: in expansion of macro 'LOG_ANSI_COLOR' 47 | #define LOG_ANSI_COLOR_REGULAR(COLOR) LOG_ANSI_COLOR(LOG_ANSI_COLOR_STYLE_RESET ";" COLOR) | ^~~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:92:31: note: in expansion of macro 'LOG_ANSI_COLOR_REGULAR' 92 | #define LOG_COLOR_W LOG_ANSI_COLOR_REGULAR(LOG_COLOR_YELLOW) | ^~~~~~~~~~~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:62:37: note: in expansion of macro 'LOG_COLOR_W' 62 | #define LOG_FORMAT(letter, format) LOG_COLOR_ ## letter #letter " (%" PRIu32 ") %s: " format LOG_RESET_COLOR "\n" | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:183:86: note: in expansion of macro 'LOG_FORMAT' 183 | else if (level==ESP_LOG_WARN ) { esp_log_write(ESP_LOG_WARN, tag, LOG_FORMAT(W, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } \ | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:205:38: note: in expansion of macro 'ESP_LOG_LEVEL' 205 | if (_ESP_LOG_ENABLED(level)) ESP_LOG_LEVEL(level, tag, format, ##__VA_ARGS__); \ | ^~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:114:38: note: in expansion of macro 'ESP_LOG_LEVEL_LOCAL' 114 | #define ESP_LOGI( tag, format, ... ) ESP_LOG_LEVEL_LOCAL(ESP_LOG_INFO, tag, format, ##__VA_ARGS__) | ^~~~~~~~~~~~~~~~~~~ /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:178:5: note: in expansion of macro 'ESP_LOGI' 178 | ESP_LOGI(LOG_TAG, " pub key to use (%d. try): %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x ... %02x", valid_key_counter, public_key[0], public_key[1], public_key[2], public_key[3], public_key[4], public_key[5], public_key[6], public_key[7], public_key[8], public_key[9], public_key[10], public_key[11], public_key[12], public_key[13],public_key[14], public_key[15],public_key[16],public_key[17],public_key[19], public_key[19], public_key[20], public_key[21], public_key[22], public_key[23], public_key[24], public_key[25], public_key[26], public_key[27]); | ^~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:94:31: error: format '%d' expects argument of type 'int', but argument 6 has type 'uint32_t' {aka 'long unsigned int'} [-Werror=format=] 94 | #define LOG_COLOR_D "" | ^~ /home/user/esp/esp-idf/components/log/include/esp_log.h:62:37: note: in expansion of macro 'LOG_COLOR_D' 62 | #define LOG_FORMAT(letter, format) LOG_COLOR_ ## letter #letter " (%" PRIu32 ") %s: " format LOG_RESET_COLOR "\n" | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:184:86: note: in expansion of macro 'LOG_FORMAT' 184 | else if (level==ESP_LOG_DEBUG ) { esp_log_write(ESP_LOG_DEBUG, tag, LOG_FORMAT(D, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } \ | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:205:38: note: in expansion of macro 'ESP_LOG_LEVEL' 205 | if (_ESP_LOG_ENABLED(level)) ESP_LOG_LEVEL(level, tag, format, ##__VA_ARGS__); \ | ^~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:114:38: note: in expansion of macro 'ESP_LOG_LEVEL_LOCAL' 114 | #define ESP_LOGI( tag, format, ... ) ESP_LOG_LEVEL_LOCAL(ESP_LOG_INFO, tag, format, ##__VA_ARGS__) | ^~~~~~~~~~~~~~~~~~~ /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:178:5: note: in expansion of macro 'ESP_LOGI' 178 | ESP_LOGI(LOG_TAG, " pub key to use (%d. try): %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x ... %02x", valid_key_counter, public_key[0], public_key[1], public_key[2], public_key[3], public_key[4], public_key[5], public_key[6], public_key[7], public_key[8], public_key[9], public_key[10], public_key[11], public_key[12], public_key[13],public_key[14], public_key[15],public_key[16],public_key[17],public_key[19], public_key[19], public_key[20], public_key[21], public_key[22], public_key[23], public_key[24], public_key[25], public_key[26], public_key[27]); | ^~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:95:31: error: format '%d' expects argument of type 'int', but argument 6 has type 'uint32_t' {aka 'long unsigned int'} [-Werror=format=] 95 | #define LOG_COLOR_V "" | ^~ /home/user/esp/esp-idf/components/log/include/esp_log.h:62:37: note: in expansion of macro 'LOG_COLOR_V' 62 | #define LOG_FORMAT(letter, format) LOG_COLOR_ ## letter #letter " (%" PRIu32 ") %s: " format LOG_RESET_COLOR "\n" | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:185:86: note: in expansion of macro 'LOG_FORMAT' 185 | else if (level==ESP_LOG_VERBOSE ) { esp_log_write(ESP_LOG_VERBOSE, tag, LOG_FORMAT(V, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } \ | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:205:38: note: in expansion of macro 'ESP_LOG_LEVEL' 205 | if (_ESP_LOG_ENABLED(level)) ESP_LOG_LEVEL(level, tag, format, ##__VA_ARGS__); \ | ^~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:114:38: note: in expansion of macro 'ESP_LOG_LEVEL_LOCAL' 114 | #define ESP_LOGI( tag, format, ... ) ESP_LOG_LEVEL_LOCAL(ESP_LOG_INFO, tag, format, ##__VA_ARGS__) | ^~~~~~~~~~~~~~~~~~~ /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:178:5: note: in expansion of macro 'ESP_LOGI' 178 | ESP_LOGI(LOG_TAG, " pub key to use (%d. try): %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x ... %02x", valid_key_counter, public_key[0], public_key[1], public_key[2], public_key[3], public_key[4], public_key[5], public_key[6], public_key[7], public_key[8], public_key[9], public_key[10], public_key[11], public_key[12], public_key[13],public_key[14], public_key[15],public_key[16],public_key[17],public_key[19], public_key[19], public_key[20], public_key[21], public_key[22], public_key[23], public_key[24], public_key[25], public_key[26], public_key[27]); | ^~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:43:69: error: format '%d' expects argument of type 'int', but argument 6 has type 'uint32_t' {aka 'long unsigned int'} [-Werror=format=] 43 | #define LOG_ANSI_COLOR(TEXT_COLOR) "\033[" TEXT_COLOR "m" | ^~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:47:69: note: in expansion of macro 'LOG_ANSI_COLOR' 47 | #define LOG_ANSI_COLOR_REGULAR(COLOR) LOG_ANSI_COLOR(LOG_ANSI_COLOR_STYLE_RESET ";" COLOR) | ^~~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:93:31: note: in expansion of macro 'LOG_ANSI_COLOR_REGULAR' 93 | #define LOG_COLOR_I LOG_ANSI_COLOR_REGULAR(LOG_COLOR_GREEN) | ^~~~~~~~~~~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:62:37: note: in expansion of macro 'LOG_COLOR_I' 62 | #define LOG_FORMAT(letter, format) LOG_COLOR_ ## letter #letter " (%" PRIu32 ") %s: " format LOG_RESET_COLOR "\n" | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:186:86: note: in expansion of macro 'LOG_FORMAT' 186 | else { esp_log_write(ESP_LOG_INFO, tag, LOG_FORMAT(I, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } \ | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:205:38: note: in expansion of macro 'ESP_LOG_LEVEL' 205 | if (_ESP_LOG_ENABLED(level)) ESP_LOG_LEVEL(level, tag, format, ##__VA_ARGS__); \ | ^~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:114:38: note: in expansion of macro 'ESP_LOG_LEVEL_LOCAL' 114 | #define ESP_LOGI( tag, format, ... ) ESP_LOG_LEVEL_LOCAL(ESP_LOG_INFO, tag, format, ##__VA_ARGS__) | ^~~~~~~~~~~~~~~~~~~ /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:178:5: note: in expansion of macro 'ESP_LOGI' 178 | ESP_LOGI(LOG_TAG, " pub key to use (%d. try): %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x ... %02x", valid_key_counter, public_key[0], public_key[1], public_key[2], public_key[3], public_key[4], public_key[5], public_key[6], public_key[7], public_key[8], public_key[9], public_key[10], public_key[11], public_key[12], public_key[13],public_key[14], public_key[15],public_key[16],public_key[17],public_key[19], public_key[19], public_key[20], public_key[21], public_key[22], public_key[23], public_key[24], public_key[25], public_key[26], public_key[27]); | ^~~~~~~~ /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c: In function 'send_data_once_blocking': /home/user/esp/esp-idf/components/log/include/esp_log_color.h:43:69: error: format '%d' expects argument of type 'int', but argument 6 has type 'uint32_t' {aka 'long unsigned int'} [-Werror=format=] 43 | #define LOG_ANSI_COLOR(TEXT_COLOR) "\033[" TEXT_COLOR "m" | ^~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:47:69: note: in expansion of macro 'LOG_ANSI_COLOR' 47 | #define LOG_ANSI_COLOR_REGULAR(COLOR) LOG_ANSI_COLOR(LOG_ANSI_COLOR_STYLE_RESET ";" COLOR) | ^~~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:91:31: note: in expansion of macro 'LOG_ANSI_COLOR_REGULAR' 91 | #define LOG_COLOR_E LOG_ANSI_COLOR_REGULAR(LOG_COLOR_RED) | ^~~~~~~~~~~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:62:37: note: in expansion of macro 'LOG_COLOR_E' 62 | #define LOG_FORMAT(letter, format) LOG_COLOR_ ## letter #letter " (%" PRIu32 ") %s: " format LOG_RESET_COLOR "\n" | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:182:86: note: in expansion of macro 'LOG_FORMAT' 182 | if (level==ESP_LOG_ERROR ) { esp_log_write(ESP_LOG_ERROR, tag, LOG_FORMAT(E, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } \ | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:205:38: note: in expansion of macro 'ESP_LOG_LEVEL' 205 | if (_ESP_LOG_ENABLED(level)) ESP_LOG_LEVEL(level, tag, format, ##__VA_ARGS__); \ | ^~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:114:38: note: in expansion of macro 'ESP_LOG_LEVEL_LOCAL' 114 | #define ESP_LOGI( tag, format, ... ) ESP_LOG_LEVEL_LOCAL(ESP_LOG_INFO, tag, format, ##__VA_ARGS__) | ^~~~~~~~~~~~~~~~~~~ /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:198:5: note: in expansion of macro 'ESP_LOGI' 198 | ESP_LOGI(LOG_TAG, "Data to send (msg_id: %d): %s", msg_id, data_to_send); | ^~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:43:69: error: format '%d' expects argument of type 'int', but argument 6 has type 'uint32_t' {aka 'long unsigned int'} [-Werror=format=] 43 | #define LOG_ANSI_COLOR(TEXT_COLOR) "\033[" TEXT_COLOR "m" | ^~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:47:69: note: in expansion of macro 'LOG_ANSI_COLOR' 47 | #define LOG_ANSI_COLOR_REGULAR(COLOR) LOG_ANSI_COLOR(LOG_ANSI_COLOR_STYLE_RESET ";" COLOR) | ^~~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:92:31: note: in expansion of macro 'LOG_ANSI_COLOR_REGULAR' 92 | #define LOG_COLOR_W LOG_ANSI_COLOR_REGULAR(LOG_COLOR_YELLOW) | ^~~~~~~~~~~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:62:37: note: in expansion of macro 'LOG_COLOR_W' 62 | #define LOG_FORMAT(letter, format) LOG_COLOR_ ## letter #letter " (%" PRIu32 ") %s: " format LOG_RESET_COLOR "\n" | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:183:86: note: in expansion of macro 'LOG_FORMAT' 183 | else if (level==ESP_LOG_WARN ) { esp_log_write(ESP_LOG_WARN, tag, LOG_FORMAT(W, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } \ | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:205:38: note: in expansion of macro 'ESP_LOG_LEVEL' 205 | if (_ESP_LOG_ENABLED(level)) ESP_LOG_LEVEL(level, tag, format, ##__VA_ARGS__); \ | ^~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:114:38: note: in expansion of macro 'ESP_LOG_LEVEL_LOCAL' 114 | #define ESP_LOGI( tag, format, ... ) ESP_LOG_LEVEL_LOCAL(ESP_LOG_INFO, tag, format, ##__VA_ARGS__) | ^~~~~~~~~~~~~~~~~~~ /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:198:5: note: in expansion of macro 'ESP_LOGI' 198 | ESP_LOGI(LOG_TAG, "Data to send (msg_id: %d): %s", msg_id, data_to_send); | ^~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:94:31: error: format '%d' expects argument of type 'int', but argument 6 has type 'uint32_t' {aka 'long unsigned int'} [-Werror=format=] 94 | #define LOG_COLOR_D "" | ^~ /home/user/esp/esp-idf/components/log/include/esp_log.h:62:37: note: in expansion of macro 'LOG_COLOR_D' 62 | #define LOG_FORMAT(letter, format) LOG_COLOR_ ## letter #letter " (%" PRIu32 ") %s: " format LOG_RESET_COLOR "\n" | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:184:86: note: in expansion of macro 'LOG_FORMAT' 184 | else if (level==ESP_LOG_DEBUG ) { esp_log_write(ESP_LOG_DEBUG, tag, LOG_FORMAT(D, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } \ | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:205:38: note: in expansion of macro 'ESP_LOG_LEVEL' 205 | if (_ESP_LOG_ENABLED(level)) ESP_LOG_LEVEL(level, tag, format, ##__VA_ARGS__); \ | ^~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:114:38: note: in expansion of macro 'ESP_LOG_LEVEL_LOCAL' 114 | #define ESP_LOGI( tag, format, ... ) ESP_LOG_LEVEL_LOCAL(ESP_LOG_INFO, tag, format, ##__VA_ARGS__) | ^~~~~~~~~~~~~~~~~~~ /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:198:5: note: in expansion of macro 'ESP_LOGI' 198 | ESP_LOGI(LOG_TAG, "Data to send (msg_id: %d): %s", msg_id, data_to_send); | ^~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:95:31: error: format '%d' expects argument of type 'int', but argument 6 has type 'uint32_t' {aka 'long unsigned int'} [-Werror=format=] 95 | #define LOG_COLOR_V "" | ^~ /home/user/esp/esp-idf/components/log/include/esp_log.h:62:37: note: in expansion of macro 'LOG_COLOR_V' 62 | #define LOG_FORMAT(letter, format) LOG_COLOR_ ## letter #letter " (%" PRIu32 ") %s: " format LOG_RESET_COLOR "\n" | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:185:86: note: in expansion of macro 'LOG_FORMAT' 185 | else if (level==ESP_LOG_VERBOSE ) { esp_log_write(ESP_LOG_VERBOSE, tag, LOG_FORMAT(V, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } \ | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:205:38: note: in expansion of macro 'ESP_LOG_LEVEL' 205 | if (_ESP_LOG_ENABLED(level)) ESP_LOG_LEVEL(level, tag, format, ##__VA_ARGS__); \ | ^~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:114:38: note: in expansion of macro 'ESP_LOG_LEVEL_LOCAL' 114 | #define ESP_LOGI( tag, format, ... ) ESP_LOG_LEVEL_LOCAL(ESP_LOG_INFO, tag, format, ##__VA_ARGS__) | ^~~~~~~~~~~~~~~~~~~ /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:198:5: note: in expansion of macro 'ESP_LOGI' 198 | ESP_LOGI(LOG_TAG, "Data to send (msg_id: %d): %s", msg_id, data_to_send); | ^~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:43:69: error: format '%d' expects argument of type 'int', but argument 6 has type 'uint32_t' {aka 'long unsigned int'} [-Werror=format=] 43 | #define LOG_ANSI_COLOR(TEXT_COLOR) "\033[" TEXT_COLOR "m" | ^~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:47:69: note: in expansion of macro 'LOG_ANSI_COLOR' 47 | #define LOG_ANSI_COLOR_REGULAR(COLOR) LOG_ANSI_COLOR(LOG_ANSI_COLOR_STYLE_RESET ";" COLOR) | ^~~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:93:31: note: in expansion of macro 'LOG_ANSI_COLOR_REGULAR' 93 | #define LOG_COLOR_I LOG_ANSI_COLOR_REGULAR(LOG_COLOR_GREEN) | ^~~~~~~~~~~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:62:37: note: in expansion of macro 'LOG_COLOR_I' 62 | #define LOG_FORMAT(letter, format) LOG_COLOR_ ## letter #letter " (%" PRIu32 ") %s: " format LOG_RESET_COLOR "\n" | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:186:86: note: in expansion of macro 'LOG_FORMAT' 186 | else { esp_log_write(ESP_LOG_INFO, tag, LOG_FORMAT(I, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } \ | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:205:38: note: in expansion of macro 'ESP_LOG_LEVEL' 205 | if (_ESP_LOG_ENABLED(level)) ESP_LOG_LEVEL(level, tag, format, ##__VA_ARGS__); \ | ^~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:114:38: note: in expansion of macro 'ESP_LOG_LEVEL_LOCAL' 114 | #define ESP_LOGI( tag, format, ... ) ESP_LOG_LEVEL_LOCAL(ESP_LOG_INFO, tag, format, ##__VA_ARGS__) | ^~~~~~~~~~~~~~~~~~~ /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:198:5: note: in expansion of macro 'ESP_LOGI' 198 | ESP_LOGI(LOG_TAG, "Data to send (msg_id: %d): %s", msg_id, data_to_send); | ^~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:43:69: error: format '%d' expects argument of type 'int', but argument 7 has type 'long unsigned int' [-Werror=format=] 43 | #define LOG_ANSI_COLOR(TEXT_COLOR) "\033[" TEXT_COLOR "m" | ^~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:47:69: note: in expansion of macro 'LOG_ANSI_COLOR' 47 | #define LOG_ANSI_COLOR_REGULAR(COLOR) LOG_ANSI_COLOR(LOG_ANSI_COLOR_STYLE_RESET ";" COLOR) | ^~~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:91:31: note: in expansion of macro 'LOG_ANSI_COLOR_REGULAR' 91 | #define LOG_COLOR_E LOG_ANSI_COLOR_REGULAR(LOG_COLOR_RED) | ^~~~~~~~~~~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:62:37: note: in expansion of macro 'LOG_COLOR_E' 62 | #define LOG_FORMAT(letter, format) LOG_COLOR_ ## letter #letter " (%" PRIu32 ") %s: " format LOG_RESET_COLOR "\n" | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:182:86: note: in expansion of macro 'LOG_FORMAT' 182 | if (level==ESP_LOG_ERROR ) { esp_log_write(ESP_LOG_ERROR, tag, LOG_FORMAT(E, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } \ | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:205:38: note: in expansion of macro 'ESP_LOG_LEVEL' 205 | if (_ESP_LOG_ENABLED(level)) ESP_LOG_LEVEL(level, tag, format, ##__VA_ARGS__); \ | ^~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:114:38: note: in expansion of macro 'ESP_LOG_LEVEL_LOCAL' 114 | #define ESP_LOGI( tag, format, ... ) ESP_LOG_LEVEL_LOCAL(ESP_LOG_INFO, tag, format, ##__VA_ARGS__) | ^~~~~~~~~~~~~~~~~~~ /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:203:9: note: in expansion of macro 'ESP_LOGI' 203 | ESP_LOGI(LOG_TAG, " Sending byte %d/%d (0x%02x)", by_i, len-1, data_to_send[by_i]); | ^~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:43:69: error: format '%d' expects argument of type 'int', but argument 7 has type 'long unsigned int' [-Werror=format=] 43 | #define LOG_ANSI_COLOR(TEXT_COLOR) "\033[" TEXT_COLOR "m" | ^~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:47:69: note: in expansion of macro 'LOG_ANSI_COLOR' 47 | #define LOG_ANSI_COLOR_REGULAR(COLOR) LOG_ANSI_COLOR(LOG_ANSI_COLOR_STYLE_RESET ";" COLOR) | ^~~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:92:31: note: in expansion of macro 'LOG_ANSI_COLOR_REGULAR' 92 | #define LOG_COLOR_W LOG_ANSI_COLOR_REGULAR(LOG_COLOR_YELLOW) | ^~~~~~~~~~~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:62:37: note: in expansion of macro 'LOG_COLOR_W' 62 | #define LOG_FORMAT(letter, format) LOG_COLOR_ ## letter #letter " (%" PRIu32 ") %s: " format LOG_RESET_COLOR "\n" | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:183:86: note: in expansion of macro 'LOG_FORMAT' 183 | else if (level==ESP_LOG_WARN ) { esp_log_write(ESP_LOG_WARN, tag, LOG_FORMAT(W, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } \ | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:205:38: note: in expansion of macro 'ESP_LOG_LEVEL' 205 | if (_ESP_LOG_ENABLED(level)) ESP_LOG_LEVEL(level, tag, format, ##__VA_ARGS__); \ | ^~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:114:38: note: in expansion of macro 'ESP_LOG_LEVEL_LOCAL' 114 | #define ESP_LOGI( tag, format, ... ) ESP_LOG_LEVEL_LOCAL(ESP_LOG_INFO, tag, format, ##__VA_ARGS__) | ^~~~~~~~~~~~~~~~~~~ /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:203:9: note: in expansion of macro 'ESP_LOGI' 203 | ESP_LOGI(LOG_TAG, " Sending byte %d/%d (0x%02x)", by_i, len-1, data_to_send[by_i]); | ^~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:94:31: error: format '%d' expects argument of type 'int', but argument 7 has type 'long unsigned int' [-Werror=format=] 94 | #define LOG_COLOR_D "" | ^~ /home/user/esp/esp-idf/components/log/include/esp_log.h:62:37: note: in expansion of macro 'LOG_COLOR_D' 62 | #define LOG_FORMAT(letter, format) LOG_COLOR_ ## letter #letter " (%" PRIu32 ") %s: " format LOG_RESET_COLOR "\n" | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:184:86: note: in expansion of macro 'LOG_FORMAT' 184 | else if (level==ESP_LOG_DEBUG ) { esp_log_write(ESP_LOG_DEBUG, tag, LOG_FORMAT(D, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } \ | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:205:38: note: in expansion of macro 'ESP_LOG_LEVEL' 205 | if (_ESP_LOG_ENABLED(level)) ESP_LOG_LEVEL(level, tag, format, ##__VA_ARGS__); \ | ^~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:114:38: note: in expansion of macro 'ESP_LOG_LEVEL_LOCAL' 114 | #define ESP_LOGI( tag, format, ... ) ESP_LOG_LEVEL_LOCAL(ESP_LOG_INFO, tag, format, ##__VA_ARGS__) | ^~~~~~~~~~~~~~~~~~~ /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:203:9: note: in expansion of macro 'ESP_LOGI' 203 | ESP_LOGI(LOG_TAG, " Sending byte %d/%d (0x%02x)", by_i, len-1, data_to_send[by_i]); | ^~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:95:31: error: format '%d' expects argument of type 'int', but argument 7 has type 'long unsigned int' [-Werror=format=] 95 | #define LOG_COLOR_V "" | ^~ /home/user/esp/esp-idf/components/log/include/esp_log.h:62:37: note: in expansion of macro 'LOG_COLOR_V' 62 | #define LOG_FORMAT(letter, format) LOG_COLOR_ ## letter #letter " (%" PRIu32 ") %s: " format LOG_RESET_COLOR "\n" | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:185:86: note: in expansion of macro 'LOG_FORMAT' 185 | else if (level==ESP_LOG_VERBOSE ) { esp_log_write(ESP_LOG_VERBOSE, tag, LOG_FORMAT(V, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } \ | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:205:38: note: in expansion of macro 'ESP_LOG_LEVEL' 205 | if (_ESP_LOG_ENABLED(level)) ESP_LOG_LEVEL(level, tag, format, ##__VA_ARGS__); \ | ^~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:114:38: note: in expansion of macro 'ESP_LOG_LEVEL_LOCAL' 114 | #define ESP_LOGI( tag, format, ... ) ESP_LOG_LEVEL_LOCAL(ESP_LOG_INFO, tag, format, ##__VA_ARGS__) | ^~~~~~~~~~~~~~~~~~~ /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:203:9: note: in expansion of macro 'ESP_LOGI' 203 | ESP_LOGI(LOG_TAG, " Sending byte %d/%d (0x%02x)", by_i, len-1, data_to_send[by_i]); | ^~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:43:69: error: format '%d' expects argument of type 'int', but argument 7 has type 'long unsigned int' [-Werror=format=] 43 | #define LOG_ANSI_COLOR(TEXT_COLOR) "\033[" TEXT_COLOR "m" | ^~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:47:69: note: in expansion of macro 'LOG_ANSI_COLOR' 47 | #define LOG_ANSI_COLOR_REGULAR(COLOR) LOG_ANSI_COLOR(LOG_ANSI_COLOR_STYLE_RESET ";" COLOR) | ^~~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log_color.h:93:31: note: in expansion of macro 'LOG_ANSI_COLOR_REGULAR' 93 | #define LOG_COLOR_I LOG_ANSI_COLOR_REGULAR(LOG_COLOR_GREEN) | ^~~~~~~~~~~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:62:37: note: in expansion of macro 'LOG_COLOR_I' 62 | #define LOG_FORMAT(letter, format) LOG_COLOR_ ## letter #letter " (%" PRIu32 ") %s: " format LOG_RESET_COLOR "\n" | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:186:86: note: in expansion of macro 'LOG_FORMAT' 186 | else { esp_log_write(ESP_LOG_INFO, tag, LOG_FORMAT(I, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } \ | ^~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:205:38: note: in expansion of macro 'ESP_LOG_LEVEL' 205 | if (_ESP_LOG_ENABLED(level)) ESP_LOG_LEVEL(level, tag, format, ##__VA_ARGS__); \ | ^~~~~~~~~~~~~ /home/user/esp/esp-idf/components/log/include/esp_log.h:114:38: note: in expansion of macro 'ESP_LOG_LEVEL_LOCAL' 114 | #define ESP_LOGI( tag, format, ... ) ESP_LOG_LEVEL_LOCAL(ESP_LOG_INFO, tag, format, ##__VA_ARGS__) | ^~~~~~~~~~~~~~~~~~~ /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:203:9: note: in expansion of macro 'ESP_LOGI' 203 | ESP_LOGI(LOG_TAG, " Sending byte %d/%d (0x%02x)", by_i, len-1, data_to_send[by_i]); | ^~~~~~~~ /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c: In function 'read_line_or_dismiss': /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:227:77: error: 'portTICK_RATE_MS' undeclared (first use in this function); did you mean 'portTICK_PERIOD_MS'? 227 | size = uart_read_bytes(UART_PORT_NUM, (unsigned char *)ptr, 1, 20 / portTICK_RATE_MS); | ^~~~~~~~~~~~~~~~ | portTICK_PERIOD_MS /home/user/esp/send-my/Firmware/ESP32/main/openhaystack_main.c:227:77: note: each undeclared identifier is reported only once for each function it appears in cc1: some warnings being treated as errors [1244/1252] Building C object esp-idf/...ifi_provisioning.dir/src/manager.c.obj ninja: build stopped: subcommand failed. HINT: You are maybe using pre FreeRTOS V8.0.0 APIs. The backward compatibility of such APIs is no longer enabled by default. Please turn on CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY explicitly to use such APIs. HINT: The issue is better to resolve by replacing format specifiers to 'PRI'-family macros (include <inttypes.h> header file). ninja failed with exit code 1, output of the command is in the /home/user/esp/send-my/Firmware/ESP32/build/log/idf_py_stderr_output_11730 and /home/user/esp/send-my/Firmware/ESP32/build/log/idf_py_stdout_output_11730

I tried fresh installing multiple times. I tried multiple computers and multiple Operating systems ( Ubuntu, Kali, MACOS)

OS X 10.11.6 Compatibility

Is it possible to compile the app with greater compatibility for older versions? I'm running 10.11.6 on an old iMac and when I run the OFFetchReports app it says "The application requires OS X 10.15 or later."

Thanks.

Clarification about the Generated public key tested as invalid

Hello there, I compiled the esp32 project, and also ran the osx project, (just updated to xcode 14.x) both look to be running, however I have my doubts, i see that there are a lot of messages:

[0;32mI (1979) findmy_modem:   pub key to use (3. try): ba be 00 00 00 0d 00 00 00 00 81 81 81 81 00 00 00 02 00 00 00 00 00 00 00 00 00 … 01�[0m
�[0;32mI (2019) findmy_modem:   pub key to use (1. try): ba be 00 00 00 0e 00 00 00 00 81 81 81 81 00 00 00 00 00 00 00 00 00 00 00 00 00 … 00�[0m
�[0;33mW (2059) findmy_modem: Generated public key tested as invalid�[0m
�[0;33mW (2079) findmy_modem: Generated public key tested as invalid�[0m

I noticed that in fact I get the "message" to the other side, so I am wondering this:

  1. the message is sent 1 byte at a time from what i can see in the code, right? so every adv key has let's say 1 letter and it continuously advertises several letters until it fully reads something on the other side?
  2. how come it test keys as invalid, does it need valid keys? (this is the part I didnt quite understand)

and finally thank you for your example, great work!

Reliability of reception of the data

I recently ported your ESP32 Send My firmware to Zephyr and I'm running it on an nRF52832-based RuuviTag, sending the temperature values of the built-in BME280 to the Find My network (see the send-my-sensor project I just published). I'm barely able to receive messages in the DataFetcher, most of the shown characters are ?, with an occasional character coming through completely. I verified that the BLE packet capture is identical to the one sent by the ESP32 firmware for a test message. But my household is very low on Apple devices, just one Mac Mini M1. Does this only work with multiple Apple devices in the neighbourhood?

That's awesome!

Hi,

going beyond starring your repo, to tell you: that's just really amazing example of pwning / abusing Apple protocols :)

You are doing great job! That's also in general about Positive Security !

Best regards,
Peter

Problem Flashing with ESP32 (ESPRESSIF)

I cant flash on my macbook, its the same error as seemoo-lab/openhaystack#66

mac@MacBook-Pro ~/D/s/F/ESP32 (main) [1]> ./flash_esp32.sh -p /dev/cu.usbmodem14101
esptool.py v3.1
Found 2 serial ports
Serial port /dev/cu.usbmodem14101
Connecting......
Detecting chip type... ESP32
Chip is ESP32-D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 3c:61:05:12:48:2c
Uploading stub...

A fatal error occurred: Failed to write to target RAM (result was 01070000)
mac@MacBook-Pro ~/D/s/F/ESP32 (main) [2]>

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.