124 ESP_ERROR_CHECK(esp_netif_init());
125 ESP_ERROR_CHECK(esp_event_loop_create_default());
126 (void)esp_netif_create_default_wifi_sta();
127 wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
128 ESP_ERROR_CHECK(esp_wifi_init(&cfg));
129 esp_event_handler_instance_t h_any;
130 esp_event_handler_instance_t h_ip;
131 ESP_ERROR_CHECK(esp_event_handler_instance_register(
133 ESP_ERROR_CHECK(esp_event_handler_instance_register(
135 wifi_config_t wifi_cfg;
136 (void)memset(&wifi_cfg, 0,
sizeof(wifi_cfg));
137 (void)strncpy((
char *)wifi_cfg.sta.ssid,
WIFI_SSID,
138 sizeof(wifi_cfg.sta.ssid) - 1U);
140 sizeof(wifi_cfg.sta.password) - 1U);
141 wifi_cfg.sta.threshold.authmode = WIFI_AUTH_WPA2_PSK;
142 ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
143 ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_cfg));
144 ESP_ERROR_CHECK(esp_wifi_start());
150 ESP_LOGI(
TAG,
"WiFi connected");
152 ESP_LOGW(
TAG,
"WiFi connect failed — TRNG entropy may be reduced");
154 (void)esp_event_handler_instance_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, h_ip);
155 (void)esp_event_handler_instance_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, h_any);
172 static const uint8_t TEST_HASH[CW_HASH_SIZE] = {
173 0x01U, 0x01U, 0x01U, 0x01U, 0x01U, 0x01U, 0x01U, 0x01U,
174 0x01U, 0x01U, 0x01U, 0x01U, 0x01U, 0x01U, 0x01U, 0x01U,
175 0x01U, 0x01U, 0x01U, 0x01U, 0x01U, 0x01U, 0x01U, 0x01U,
176 0x01U, 0x01U, 0x01U, 0x01U, 0x01U, 0x01U, 0x01U, 0x01U,
179 static const uint8_t DEMO_PIN[CW_MAX_PIN_LENGTH] = {
180 '0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0'
183 bool keep_running =
true;
184 while (keep_running) {
185 CW_SecureSession session{};
186 bool connected = wallet.connect(session);
189 ESP_LOGW(
TAG,
"Card not detected");
193 CW_SignRequest req(session,
195 CW_SIGN_SIG_ECDSA_LOW_S,
197 req.hash = TEST_HASH;
198 req.hashLength =
static_cast<uint8_t
>(CW_HASH_SIZE);
199 (void)CW_Utils::safe_memcpy(req.pin,
sizeof(req.pin),
200 DEMO_PIN, CW_MAX_PIN_LENGTH);
202 CW_SignResult result = wallet.sign(req);
204 if (result.errorCode == CW_OK) {
205 ESP_LOGI(
TAG,
"Sign OK - r:");
206 ESP_LOG_BUFFER_HEX_LEVEL(
TAG, &result.signature[CW_SIG_R_OFFSET],
207 CW_HASH_SIZE, ESP_LOG_INFO);
209 ESP_LOG_BUFFER_HEX_LEVEL(
TAG, &result.signature[CW_SIG_S_OFFSET],
210 CW_HASH_SIZE, ESP_LOG_INFO);
211 }
else if (result.errorCode == CW_SIGN_PIN_INCORRECT) {
215 ESP_LOGE(
TAG,
"Wrong PIN — halting to protect retry counter");
216 keep_running =
false;
218 ESP_LOGE(
TAG,
"Sign failed: 0x%02X",
219 static_cast<unsigned int>(result.errorCode));
223 wallet.disconnect(session);
243 esp_err_t nvs_ret = nvs_flash_init();
244 if ((nvs_ret == ESP_ERR_NVS_NO_FREE_PAGES) ||
245 (nvs_ret == ESP_ERR_NVS_NEW_VERSION_FOUND)) {
246 ESP_ERROR_CHECK(nvs_flash_erase());
247 nvs_ret = nvs_flash_init();
249 ESP_ERROR_CHECK(nvs_ret);
252 spi_bus_config_t buscfg = {};
259 ESP_ERROR_CHECK(spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO));
266 esp_err_t nfc_ret =
pn532_init(&nfc, &nfc_cfg);
268 if (nfc_ret == ESP_OK) {
270 (void)logger.
begin(115200UL);
275 CryptnoxWallet wallet(nfcTransport, logger, cryptoProvider, platform);
277 if (wallet.begin()) {
280 ESP_LOGE(
TAG,
"Wallet init failed");
283 ESP_LOGE(
TAG,
"PN532 init failed");
void app_main(void)
ESP-IDF application entry point.
static EventGroupHandle_t s_wifi_event_group
#define SPI_MAX_TRANSFER_SZ
static const uint32_t LOOP_DELAY_MS
static void wifi_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data)
FreeRTOS event handler driving the Wi-Fi station state machine.
#define WIFI_CONNECTED_BIT
static void wifi_start(void)
Initialise Wi-Fi station mode and block until connected or timeout.
static void run_sign_loop(CryptnoxWallet &wallet)
Main application loop: connect, sign a test hash, and disconnect.