odyssey/sources/scram.h

98 lines
2.6 KiB
C

#ifndef ODYSSEY_SCRAM_H
#define ODYSSEY_SCRAM_H
#if PG_VERSION_NUM >= 120000
#define od_b64_encode(src, src_len, dst, dst_len) \
pg_b64_encode(src, src_len, dst, dst_len);
#define od_b64_decode(src, src_len, dst, dst_len) \
pg_b64_decode(src, src_len, dst, dst_len);
#else
#define od_b64_encode(src, src_len, dst, dst_len) \
pg_b64_encode(src, src_len, dst);
#define od_b64_decode(src, src_len, dst, dst_len) \
pg_b64_decode(src, src_len, dst);
#endif
/*
* Odyssey.
*
* Scalable PostgreSQL connection pooler.
*/
typedef struct od_scram_state od_scram_state_t;
struct od_scram_state {
char *client_nonce;
char *client_first_message;
char *client_final_message;
char *server_nonce;
char *server_first_message;
uint8_t *salted_password;
int iterations;
char *salt;
uint8_t stored_key[32];
uint8_t server_key[32];
};
static inline void od_scram_state_init(od_scram_state_t *state)
{
memset(state, 0, sizeof(*state));
}
static inline void od_scram_state_free(od_scram_state_t *state)
{
free(state->client_nonce);
free(state->client_first_message);
free(state->client_final_message);
if (state->server_nonce)
free(state->server_nonce);
if (state->server_first_message)
free(state->server_first_message);
free(state->salted_password);
free(state->salt);
memset(state, 0, sizeof(*state));
}
machine_msg_t *
od_scram_create_client_first_message(od_scram_state_t *scram_state);
machine_msg_t *
od_scram_create_client_final_message(od_scram_state_t *scram_state,
char *password, char *auth_data,
size_t auth_data_size);
machine_msg_t *
od_scram_create_server_first_message(od_scram_state_t *scram_state);
machine_msg_t *
od_scram_create_server_final_message(od_scram_state_t *scram_state);
int od_scram_verify_server_signature(od_scram_state_t *scram_state,
char *auth_data, size_t auth_data_size);
int od_scram_verify_final_nonce(od_scram_state_t *scram_state,
char *final_nonce, size_t final_nonce_size);
int od_scram_verify_client_proof(od_scram_state_t *scram_state,
char *client_proof);
int od_scram_parse_verifier(od_scram_state_t *scram_state, char *verifier);
int od_scram_init_from_plain_password(od_scram_state_t *scram_state,
char *plain_password);
int od_scram_read_client_first_message(od_scram_state_t *scram_state,
char *auth_data, size_t auth_data_size);
int od_scram_read_client_final_message(od_scram_state_t *scram_state,
char *auth_data, size_t auth_data_size,
char **final_nonce_ptr,
size_t *final_nonce_size_ptr,
char **proof_ptr);
#endif /* ODYSSEY_SCRAM_H */