hap.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #include <string.h>
  2. #include "hap.h"
  3. #include "esp_log.h"
  4. #include "nvs.h"
  5. #include "nvs_flash.h"
  6. #include "sodium.h"
  7. #include "srp.h"
  8. static const char *TAG = "hap";
  9. #define NVS_NAMESPACE "airplay"
  10. #define NVS_KEY_PUBLIC "ed25519_pub"
  11. #define NVS_KEY_SECRET "ed25519_sec"
  12. static uint8_t g_device_public_key[HAP_ED25519_PUBLIC_KEY_SIZE];
  13. static uint8_t g_device_secret_key[HAP_ED25519_SECRET_KEY_SIZE];
  14. static bool g_initialized = false;
  15. esp_err_t hap_init(void) {
  16. if (g_initialized) {
  17. return ESP_OK;
  18. }
  19. if (sodium_init() < 0) {
  20. ESP_LOGE(TAG, "Failed to initialize libsodium");
  21. return ESP_FAIL;
  22. }
  23. nvs_handle_t nvs;
  24. esp_err_t err = nvs_open(NVS_NAMESPACE, NVS_READWRITE, &nvs);
  25. if (err != ESP_OK) {
  26. ESP_LOGE(TAG, "Failed to open NVS: %s", esp_err_to_name(err));
  27. return err;
  28. }
  29. size_t pub_len = HAP_ED25519_PUBLIC_KEY_SIZE;
  30. size_t sec_len = HAP_ED25519_SECRET_KEY_SIZE;
  31. err = nvs_get_blob(nvs, NVS_KEY_PUBLIC, g_device_public_key, &pub_len);
  32. if (err == ESP_OK) {
  33. err = nvs_get_blob(nvs, NVS_KEY_SECRET, g_device_secret_key, &sec_len);
  34. }
  35. if (err != ESP_OK || pub_len != HAP_ED25519_PUBLIC_KEY_SIZE ||
  36. sec_len != HAP_ED25519_SECRET_KEY_SIZE) {
  37. crypto_sign_keypair(g_device_public_key, g_device_secret_key);
  38. err = nvs_set_blob(nvs, NVS_KEY_PUBLIC, g_device_public_key,
  39. HAP_ED25519_PUBLIC_KEY_SIZE);
  40. if (err == ESP_OK) {
  41. err = nvs_set_blob(nvs, NVS_KEY_SECRET, g_device_secret_key,
  42. HAP_ED25519_SECRET_KEY_SIZE);
  43. }
  44. if (err == ESP_OK) {
  45. err = nvs_commit(nvs);
  46. }
  47. if (err != ESP_OK) {
  48. ESP_LOGE(TAG, "Failed to store keypair in NVS: %s", esp_err_to_name(err));
  49. nvs_close(nvs);
  50. return err;
  51. }
  52. }
  53. nvs_close(nvs);
  54. g_initialized = true;
  55. return ESP_OK;
  56. }
  57. const uint8_t *hap_get_public_key(void) {
  58. return g_device_public_key;
  59. }
  60. hap_session_t *hap_session_create(void) {
  61. hap_session_t *session = calloc(1, sizeof(hap_session_t));
  62. if (!session) {
  63. return NULL;
  64. }
  65. memcpy(session->device_public_key, g_device_public_key,
  66. HAP_ED25519_PUBLIC_KEY_SIZE);
  67. memcpy(session->device_secret_key, g_device_secret_key,
  68. HAP_ED25519_SECRET_KEY_SIZE);
  69. crypto_box_keypair(session->session_public_key, session->session_secret_key);
  70. session->pair_verify_state = 0;
  71. session->session_established = false;
  72. session->pair_setup_transient = false;
  73. session->encrypt_nonce = 0;
  74. session->decrypt_nonce = 0;
  75. return session;
  76. }
  77. void hap_session_free(hap_session_t *session) {
  78. if (!session) {
  79. return;
  80. }
  81. if (session->srp) {
  82. srp_session_free(session->srp);
  83. session->srp = NULL;
  84. }
  85. sodium_memzero(session->device_secret_key,
  86. sizeof(session->device_secret_key));
  87. sodium_memzero(session->session_secret_key,
  88. sizeof(session->session_secret_key));
  89. sodium_memzero(session->shared_secret, sizeof(session->shared_secret));
  90. sodium_memzero(session->encrypt_key, sizeof(session->encrypt_key));
  91. sodium_memzero(session->decrypt_key, sizeof(session->decrypt_key));
  92. free(session);
  93. }