odyssey/sources/scram.h

98 lines
2.6 KiB
C
Raw Normal View History

2019-11-11 09:28:50 +00:00
#ifndef ODYSSEY_SCRAM_H
#define ODYSSEY_SCRAM_H
#if PG_VERSION_NUM >= 120000
2021-04-21 13:11:18 +00:00
#define od_b64_encode(src, src_len, dst, dst_len) \
pg_b64_encode(src, src_len, dst, dst_len);
2021-04-21 13:11:18 +00:00
#define od_b64_decode(src, src_len, dst, dst_len) \
pg_b64_decode(src, src_len, dst, dst_len);
#else
2021-04-21 13:11:18 +00:00
#define od_b64_encode(src, src_len, dst, dst_len) \
pg_b64_encode(src, src_len, dst);
2021-04-21 13:11:18 +00:00
#define od_b64_decode(src, src_len, dst, dst_len) \
pg_b64_decode(src, src_len, dst);
#endif
2019-11-11 09:28:50 +00:00
/*
* Odyssey.
*
* Scalable PostgreSQL connection pooler.
*/
2019-11-11 09:28:50 +00:00
typedef struct od_scram_state od_scram_state_t;
struct od_scram_state {
2019-11-11 09:28:50 +00:00
char *client_nonce;
char *client_first_message;
char *client_final_message;
char *server_nonce;
char *server_first_message;
uint8_t *salted_password;
2019-11-11 09:28:50 +00:00
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)
2019-11-11 09:28:50 +00:00
{
memset(state, 0, sizeof(*state));
}
static inline void od_scram_state_free(od_scram_state_t *state)
2019-11-11 09:28:50 +00:00
{
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);
2019-11-11 09:28:50 +00:00
free(state->salted_password);
free(state->salt);
memset(state, 0, sizeof(*state));
}
machine_msg_t *
2019-11-11 09:28:50 +00:00
od_scram_create_client_first_message(od_scram_state_t *scram_state);
machine_msg_t *
2019-11-11 09:28:50 +00:00
od_scram_create_client_final_message(od_scram_state_t *scram_state,
char *password, char *auth_data,
size_t auth_data_size);
2019-11-11 09:28:50 +00:00
machine_msg_t *
2019-11-11 09:28:50 +00:00
od_scram_create_server_first_message(od_scram_state_t *scram_state);
machine_msg_t *
2019-11-11 09:28:50 +00:00
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);
2019-11-11 09:28:50 +00:00
#endif /* ODYSSEY_SCRAM_H */