2017-03-24 09:27:49 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* machinarium.
|
|
|
|
*
|
|
|
|
* cooperative multitasking engine.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <machinarium.h>
|
2017-05-17 14:20:04 +00:00
|
|
|
#include <machinarium_private.h>
|
2017-03-24 09:27:49 +00:00
|
|
|
|
2017-06-13 11:38:24 +00:00
|
|
|
MACHINE_API machine_tls_t*
|
2017-05-18 10:18:25 +00:00
|
|
|
machine_tls_create(void)
|
2017-03-24 09:27:49 +00:00
|
|
|
{
|
2017-05-30 14:22:44 +00:00
|
|
|
mm_errno_set(0);
|
2017-03-24 09:27:49 +00:00
|
|
|
mm_tls_t *tls;
|
|
|
|
tls = malloc(sizeof(*tls));
|
2017-05-30 14:22:44 +00:00
|
|
|
if (tls == NULL) {
|
|
|
|
mm_errno_set(ENOMEM);
|
2017-03-24 09:27:49 +00:00
|
|
|
return NULL;
|
2017-05-30 14:22:44 +00:00
|
|
|
}
|
2017-03-30 10:48:03 +00:00
|
|
|
tls->verify = MM_TLS_NONE;
|
2017-04-05 13:54:07 +00:00
|
|
|
tls->server = NULL;
|
2017-03-24 13:31:24 +00:00
|
|
|
tls->protocols = NULL;
|
|
|
|
tls->ca_path = NULL;
|
|
|
|
tls->ca_file = NULL;
|
|
|
|
tls->cert_file = NULL;
|
|
|
|
tls->key_file = NULL;
|
2017-06-13 11:38:24 +00:00
|
|
|
return (machine_tls_t*)tls;
|
2017-03-24 09:27:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
MACHINE_API void
|
2017-06-13 11:38:24 +00:00
|
|
|
machine_tls_free(machine_tls_t *obj)
|
2017-03-24 09:27:49 +00:00
|
|
|
{
|
2017-06-13 11:38:24 +00:00
|
|
|
mm_tls_t *tls = mm_cast(mm_tls_t*, obj);
|
2017-05-30 14:22:44 +00:00
|
|
|
mm_errno_set(0);
|
2017-03-24 13:31:24 +00:00
|
|
|
if (tls->protocols)
|
|
|
|
free(tls->protocols);
|
2017-06-09 11:48:33 +00:00
|
|
|
if (tls->server)
|
|
|
|
free(tls->server);
|
2017-03-24 13:31:24 +00:00
|
|
|
if (tls->ca_path)
|
|
|
|
free(tls->ca_path);
|
|
|
|
if (tls->ca_file)
|
|
|
|
free(tls->ca_file);
|
|
|
|
if (tls->cert_file)
|
|
|
|
free(tls->cert_file);
|
|
|
|
if (tls->key_file)
|
|
|
|
free(tls->key_file);
|
2017-03-24 09:27:49 +00:00
|
|
|
free(tls);
|
|
|
|
}
|
|
|
|
|
2017-03-24 09:55:18 +00:00
|
|
|
MACHINE_API int
|
2017-06-13 11:38:24 +00:00
|
|
|
machine_tls_set_verify(machine_tls_t *obj, char *mode)
|
2017-03-24 09:55:18 +00:00
|
|
|
{
|
2017-06-13 11:38:24 +00:00
|
|
|
mm_tls_t *tls = mm_cast(mm_tls_t*, obj);
|
2017-03-30 10:48:03 +00:00
|
|
|
if (strcasecmp(mode, "none") == 0)
|
|
|
|
tls->verify = MM_TLS_NONE;
|
2017-03-24 09:55:18 +00:00
|
|
|
else
|
2017-03-30 10:48:03 +00:00
|
|
|
if (strcasecmp(mode, "peer") == 0)
|
|
|
|
tls->verify = MM_TLS_PEER;
|
2017-03-24 09:55:18 +00:00
|
|
|
else
|
2017-03-30 10:48:03 +00:00
|
|
|
if (strcasecmp(mode, "peer_strict") == 0)
|
|
|
|
tls->verify = MM_TLS_PEER_STRICT;
|
2017-03-24 09:55:18 +00:00
|
|
|
else
|
|
|
|
return -1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2017-03-30 10:51:52 +00:00
|
|
|
MACHINE_API int
|
2017-06-13 11:38:24 +00:00
|
|
|
machine_tls_set_server(machine_tls_t *obj, char *name)
|
2017-03-30 10:51:52 +00:00
|
|
|
{
|
2017-06-13 11:38:24 +00:00
|
|
|
mm_tls_t *tls = mm_cast(mm_tls_t*, obj);
|
2017-05-30 14:22:44 +00:00
|
|
|
mm_errno_set(0);
|
2017-03-30 10:51:52 +00:00
|
|
|
char *string = strdup(name);
|
2017-05-30 14:22:44 +00:00
|
|
|
if (string == NULL) {
|
|
|
|
mm_errno_set(ENOMEM);
|
2017-03-30 10:51:52 +00:00
|
|
|
return -1;
|
2017-05-30 14:22:44 +00:00
|
|
|
}
|
2017-03-30 10:51:52 +00:00
|
|
|
if (tls->server)
|
|
|
|
free(tls->server);
|
|
|
|
tls->server = string;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2017-03-24 09:27:49 +00:00
|
|
|
MACHINE_API int
|
2017-06-13 11:38:24 +00:00
|
|
|
machine_tls_set_protocols(machine_tls_t *obj, char *protocols)
|
2017-03-24 09:27:49 +00:00
|
|
|
{
|
2017-06-13 11:38:24 +00:00
|
|
|
mm_tls_t *tls = mm_cast(mm_tls_t*, obj);
|
2017-05-30 14:22:44 +00:00
|
|
|
mm_errno_set(0);
|
2017-03-24 13:31:24 +00:00
|
|
|
char *string = strdup(protocols);
|
2017-05-30 14:22:44 +00:00
|
|
|
if (string == NULL) {
|
|
|
|
mm_errno_set(ENOMEM);
|
2017-03-24 13:31:24 +00:00
|
|
|
return -1;
|
2017-05-30 14:22:44 +00:00
|
|
|
}
|
2017-03-24 13:31:24 +00:00
|
|
|
if (tls->protocols)
|
|
|
|
free(tls->protocols);
|
|
|
|
tls->protocols = string;
|
2017-03-24 09:27:49 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
MACHINE_API int
|
2017-06-13 11:38:24 +00:00
|
|
|
machine_tls_set_ca_path(machine_tls_t *obj, char *path)
|
2017-03-24 09:27:49 +00:00
|
|
|
{
|
2017-06-13 11:38:24 +00:00
|
|
|
mm_tls_t *tls = mm_cast(mm_tls_t*, obj);
|
2017-05-30 14:22:44 +00:00
|
|
|
mm_errno_set(0);
|
2017-03-24 13:31:24 +00:00
|
|
|
char *string = strdup(path);
|
2017-05-30 14:22:44 +00:00
|
|
|
if (string == NULL) {
|
|
|
|
mm_errno_set(ENOMEM);
|
2017-03-24 13:31:24 +00:00
|
|
|
return -1;
|
2017-05-30 14:22:44 +00:00
|
|
|
}
|
2017-03-24 13:31:24 +00:00
|
|
|
if (tls->ca_path)
|
|
|
|
free(tls->ca_path);
|
|
|
|
tls->ca_path = string;
|
2017-03-24 13:19:48 +00:00
|
|
|
return 0;
|
2017-03-24 09:27:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
MACHINE_API int
|
2017-06-13 11:38:24 +00:00
|
|
|
machine_tls_set_ca_file(machine_tls_t *obj, char *path)
|
2017-03-24 09:27:49 +00:00
|
|
|
{
|
2017-06-13 11:38:24 +00:00
|
|
|
mm_tls_t *tls = mm_cast(mm_tls_t*, obj);
|
2017-05-30 14:22:44 +00:00
|
|
|
mm_errno_set(0);
|
2017-03-24 13:31:24 +00:00
|
|
|
char *string = strdup(path);
|
2017-05-30 14:22:44 +00:00
|
|
|
if (string == NULL) {
|
|
|
|
mm_errno_set(ENOMEM);
|
2017-03-24 13:31:24 +00:00
|
|
|
return -1;
|
2017-05-30 14:22:44 +00:00
|
|
|
}
|
2017-03-24 13:31:24 +00:00
|
|
|
if (tls->ca_file)
|
|
|
|
free(tls->ca_file);
|
|
|
|
tls->ca_file = string;
|
2017-03-24 13:19:48 +00:00
|
|
|
return 0;
|
2017-03-24 09:27:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
MACHINE_API int
|
2017-06-13 11:38:24 +00:00
|
|
|
machine_tls_set_cert_file(machine_tls_t *obj, char *path)
|
2017-03-24 09:27:49 +00:00
|
|
|
{
|
2017-06-13 11:38:24 +00:00
|
|
|
mm_tls_t *tls = mm_cast(mm_tls_t*, obj);
|
2017-05-30 14:22:44 +00:00
|
|
|
mm_errno_set(0);
|
2017-03-24 13:31:24 +00:00
|
|
|
char *string = strdup(path);
|
2017-05-30 14:22:44 +00:00
|
|
|
if (string == NULL) {
|
|
|
|
mm_errno_set(ENOMEM);
|
2017-03-24 13:31:24 +00:00
|
|
|
return -1;
|
2017-05-30 14:22:44 +00:00
|
|
|
}
|
2017-03-24 13:31:24 +00:00
|
|
|
if (tls->cert_file)
|
|
|
|
free(tls->cert_file);
|
|
|
|
tls->cert_file = string;
|
2017-03-24 13:19:48 +00:00
|
|
|
return 0;
|
2017-03-24 09:27:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
MACHINE_API int
|
2017-06-13 11:38:24 +00:00
|
|
|
machine_tls_set_key_file(machine_tls_t *obj, char *path)
|
2017-03-24 09:27:49 +00:00
|
|
|
{
|
2017-06-13 11:38:24 +00:00
|
|
|
mm_tls_t *tls = mm_cast(mm_tls_t*, obj);
|
2017-05-30 14:22:44 +00:00
|
|
|
mm_errno_set(0);
|
2017-03-24 13:31:24 +00:00
|
|
|
char *string = strdup(path);
|
2017-05-30 14:22:44 +00:00
|
|
|
if (string == NULL) {
|
|
|
|
mm_errno_set(ENOMEM);
|
2017-03-24 13:31:24 +00:00
|
|
|
return -1;
|
2017-05-30 14:22:44 +00:00
|
|
|
}
|
2017-03-24 13:31:24 +00:00
|
|
|
if (tls->key_file)
|
|
|
|
free(tls->key_file);
|
|
|
|
tls->key_file = string;
|
2017-03-24 13:19:48 +00:00
|
|
|
return 0;
|
2017-03-24 09:27:49 +00:00
|
|
|
}
|