coap_session.c: Support PSK new function and PKI

Update coap_new_client_session_psk() to clean up and return on error.  Add in
call to coap_dtls_context_set_psk()

Add in new function coap_new_client_session_pki()

Additional check for a call of coap_new_client_session_*() in
coap_new_endpoint()
This commit is contained in:
Jon Shallow committed 2018-02-12 10:15:22 +00:00
1 parent c4840b7ce1
commit 7ae49c3b41
1 file changed
+41 -1
+41 -1
View File
@@ -12,7 +12,6 @@
#include "coap_config.h"
#include "coap_io.h"
#include "coap_dtls.h"
#include "coap_session.h"
#include "net.h"
#include "debug.h"
@@ -568,6 +567,8 @@ coap_session_t *coap_new_client_session_psk(
session->psk_identity_len = identity_len;
} else {
coap_log(LOG_WARNING, "Cannot store session PSK identity");
coap_session_release(session);
return NULL;
}
}
@@ -578,13 +579,45 @@ coap_session_t *coap_new_client_session_psk(
session->psk_key_len = key_len;
} else {
coap_log(LOG_WARNING, "Cannot store session PSK key");
coap_session_release(session);
return NULL;
}
}
if (coap_dtls_is_supported()) {
if (!coap_dtls_context_set_psk(ctx, NULL, key, key_len)) {
coap_session_release(session);
return NULL;
}
}
debug("*** %s: new outgoing session\n", coap_session_str(session));
return coap_session_connect(session);
}
coap_session_t *coap_new_client_session_pki(
struct coap_context_t *ctx,
const coap_address_t *local_if,
const coap_address_t *server,
coap_proto_t proto,
coap_dtls_security_setup_t setup_callback,
coap_dtls_pki_t* setup_data
) {
coap_session_t *session = coap_session_create_client(ctx, local_if, server, proto);
if (!session)
return NULL;
if (coap_dtls_is_supported()) {
if (!coap_dtls_context_set_pki(ctx, setup_callback, setup_data)) {
coap_session_release(session);
return NULL;
}
}
debug("*** %s: new outgoing session\n", coap_session_str(session));
return coap_session_connect(session);
}
coap_session_t *coap_new_server_session(
struct coap_context_t *ctx,
coap_endpoint_t *ep
@@ -630,6 +663,13 @@ coap_new_endpoint(coap_context_t *context, const coap_address_t *listen_addr, co
goto error;
}
if (proto == COAP_PROTO_DTLS || proto == COAP_PROTO_TLS) {
if (!coap_dtls_context_check_keys_enabled(context)) {
coap_log(LOG_INFO, "coap_new_endpoint: one of coap_dtls_context_set_psk() or coap_dtls_context_set_pki() not called\n");
goto error;
}
}
ep = coap_malloc_endpoint();
if (!ep) {
coap_log(LOG_WARNING, "coap_new_endpoint: malloc");