#ifndef BSSPEKE_H #define BSSPEKE_H #define BSSPEKE_VERIFY_CLIENT_MODIFIER "client" #define BSSPEKE_VERIFY_CLIENT_MODIFIER_LEN 6 #define BSSPEKE_VERIFY_SERVER_MODIFIER "server" #define BSSPEKE_VERIFY_SERVER_MODIFIER_LEN 6 #define BSSPEKE_MIN_PHF_BLOCKS 100000 #define BSSPEKE_MIN_PHF_ITERATIONS 3 typedef struct { // Login credentials uint8_t *client_id; size_t client_id_len; uint8_t *password; size_t password_len; // Server identifier uint8_t *server_id; size_t server_id_len; // Random number to blind the password in the OPRF uint8_t r[32]; // Server's ephemeral public key uint8_t B[32]; // Ephemeral keypair uint8_t a[32]; //uint8_t A[32]; // Session key uint8_t K_c[32]; } bsspeke_client_ctx; typedef struct { uint8_t *server_id; size_t server_id_len; uint8_t *client_id; size_t client_id_len; // Stored ECDH parameters for the given user //uint8_t P[32]; // Base point uint8_t V[32]; // User's long-term public key // Ephemeral keypair uint8_t b[32]; uint8_t B[32]; // User's ephemeral public key uint8_t A[32]; // Session key uint8_t K_s[32]; } bsspeke_server_ctx; typedef struct { char *client_id; uint8_t *blind; } bsspeke_msg1_t; typedef struct { uint8_t blind_salt[32]; uint8_t B[32]; uint32_t phf_blocks; uint32_t phf_iterations; } bsspeke_msg2_t; typedef struct { uint8_t A[32]; uint8_t client_verifier[32]; } bsspeke_msg3_t; typedef struct { uint8_t server_verifier[32]; } bsspeke_msg4_t; #endif