Commit Graph
1557 Commits
Author SHA1 Message Date
Jon Shallow b74aab1971 Support coap-client with no PKI or PSK defined, but using (D)TLS in GnuTLS
To reproduce the issue:

Server session
$ coap-server -v9 -n -k secretPSK -c server.pem -C ca.pem -R /etc/ssl/certs

Client session
$ examples/coap-client -v9  coaps://127.0.0.1/

include/coap2/coap_dtls.h:
src/coap_gnutls.c:

If neither coap_new_client_session_pki() or coap_new_client_session_psk()
is called, but coap_new_client_session() is (as done by coap-client if
no PKI or PSK options set), then set up a default PKI session to be
able to talk to a coap server.
2019-02-16 20:47:13 +00:00
obgm 9ae66a66b4 Merge pull request #299 from mrdeep1/gnutls-io-error
coap-server: GnuTLS does not correctly detect closure by a client using TCP
2019-02-15 20:12:06 +01:00
obgm 4682d951fb Merge pull request #298 from mrdeep1/client-ca
coap-client: Support using CA or Root CAs, but not Cert files
2019-02-15 20:08:33 +01:00
Jon Shallow f54248d3ca coap-server: GnuTLS does not correctly detect closure by a client using TCP
To reproduce:-

Run a GnuTLS-based coap-server with option `-n` and connect with
`openssl s_client` to port 5684. The handshake works and see binary data
(the CoAP/TCP CSM signaling). Now, then interrupt the openssl s_client process
with SIGINT, This generates a lot of these messages:

Feb 14 19:22:39 DEBG ASSERT: ../../lib/record.c[_gnutls_recv_int]:1766
Feb 14 19:22:39 DEBG ASSERT: ../../lib/buffers.c[_gnutls_io_read_buffered]:589
Feb 14 19:22:39 DEBG ASSERT: ../../lib/record.c[_gnutls_recv_int]:1766
Feb 14 19:22:39 DEBG ASSERT: ../../lib/buffers.c[_gnutls_io_read_buffered]:589
Feb 14 19:22:39 DEBG ASSERT: ../../lib/record.c[_gnutls_recv_int]:1766
Feb 14 19:22:39 DEBG ASSERT: ../../lib/buffers.c[_gnutls_io_read_buffered]:589
Feb 14 19:22:39 DEBG ASSERT: ../../lib/record.c[_gnutls_recv_int]:1766
Feb 14 19:22:39 DEBG ASSERT: ../../lib/buffers.c[_gnutls_io_read_buffered]:589

An OpenSSL-based coap-server gets a clean disconnect and closes the session as
expected.

src/coap_gnutls.c:

Return correct response when coap_sock_read() is called by GnuTLS internal
Pull and the TCP session is closed so that the coap session is closed
correctly
2019-02-15 18:08:34 +00:00
Jon Shallow 829145cbba coap-client: Support using CA or Root CAs, but not Cert files
By defining the CA file or Root CAs in the client, the server's certificate
can be validated by the options in coap_dtls_pki_t parameter even if the client
does not define a certificate.
[The server must be configured not to require a Client Cert]

examples/client.c:

Add in the support to the coap-client to allow any of Root CA, CA and Cert
to be defined to set up PKI checking.

src/coap_gnutls.c:
src/coap_openssl.c:

Remove the checks in the OpenSSL and GnuTLS underlying support that previously
used to enforce that both CA and Cert had to be set in the client.

Correct some of the PKI setup error messages to relect whether the failure is
on the client or the server.

include/coap2/coap_dtls.h:
src/coap_gnutls.c:
src/coap_notls.c:
src/coap_openssl.c:
src/coap_tinydtls.c:

Convert COAP_DTLS_ROLE_SERVER and COAP_DTLS_ROLE_CLIENT to enum
coap_dtls_role_t and use as appropriate to differentiate between the roles
in the different DTLS libraries
2019-02-15 18:00:52 +00:00
Olaf Bergmann 459e43a48c coap_openssl.c: bugfix for empty PSK list
In tls_client_hello_call_back():

When SSL_client_hello_get0_ciphers() returns 0, the result parameter
out is not set. SSL_bytes_to_cipher_list() therefore is called only
if len > 0. This function's results parameters peer_ciphers and
scsvc also are accessed only if SSL_bytes_to_cipher_list() has
returned 1.

To avoid freeing invalid pointers by sk_SSL_CIPHER_free(), peer_ciphers
and scsvc have been initialized with NULL.
2019-02-14 18:51:19 +01:00
Olaf Bergmann 8dbc02d525 ChangeLog: added summary of changes in version 4.2.0 2019-02-13 10:54:51 +01:00
Carsten Schoenert aa802b3789 spelling: fix funtion -> function 2019-02-10 14:47:23 +01:00
Carsten Schoenert a54cd26c85 spelling: fix Addtional -> Additional 2019-02-10 14:47:20 +01:00
Olaf Bergmann afb0d954ed coap_gnutls.c: Fixed NULL pointer dereference
Avoid calling gnutls_transport_get_ptr() on a NULL pointer. The
crash can be reproduced by sending an invalid CA certificate.
2019-02-09 13:31:50 +01:00
obgm 7b98419dae Merge pull request #297 from mrdeep1/client-certs
coap-server: Make requirement for clients to have certificates configurable
2019-02-09 13:30:57 +01:00
Jon Shallow 037fd4395e coap-server: Make requirement for clients to have certificates configurable
Add in -n option to support making require_peer_cert configurable, by default
it is enabled unless -n is set.

examples/coap-server.c:
Code changes.

man/coap-server.txt.in
Update documentation
2019-02-07 12:03:09 +00:00
obgm 102836ce98 Merge pull request #296 from yr2004/patch-1
Update configure.ac
2019-02-04 16:53:52 +01:00
yr2004 fe92eb7d23 Update configure.ac
fix a configure.ac error for tinydtls
2019-02-02 10:33:22 +08:00
Olaf Bergmann 76daa297cd pdu.[hc]: make argument of coap_new_pdu() const
As the session object passed to coap_new_pdu() is not modified
it should be const.
2019-01-30 20:29:08 +01:00
Olaf Bergmann 48b1eff004 coap_session.[hc]: make argument of coap_session_max_pdu_size() const
As the session object passed to coap_session_max_pdu_size() is not
modified it should be const.
2019-01-30 20:27:10 +01:00
obgm 144ec406ac Merge pull request #294 from mrdeep1/identifiers
Reserved Identifier fixes
2019-01-29 17:50:00 +01:00
Jon Shallow 55d579449c Reserved Identifier fixes
include/coap2/libcoap.h
_LIBCOAP_H_ to COAP_LIBCOAP_H_
src/coap_session.c
_COAP_SESSION_H_ to COAP_SESSION_C_
include/coap2/coap_session.h
_SESSION_H_ to COAP_SESSION_H_

otherwise, all #define _COAP_xxxxx wrappers are now COAP_xxxxx

Fixes #291
2019-01-29 15:30:42 +00:00
Olaf Bergmann bcff6dec61 configure.ac: bounce version number to 4.2.0rc4 v4.2.0-rc4 2019-01-29 11:04:56 +01:00
Olaf Bergmann c0ab893666 coap-server.c: add ct to description of new resources
When a new resource is created with PUT, the given Content-Format is
stored as parameter ct with the resource description.

This change is based on a fix provided by Peter van der Stok.
2019-01-18 15:05:15 +01:00
obgm 23a01f8132 Merge pull request #289 from mrdeep1/clarify-usage-coap_add_data_blocked_response
Clarify coap_add_data_blocked_response() usage
2019-01-14 14:12:16 +01:00
Jon Shallow a6ff63b159 coap_gnutls.c: enable cipher suites required by RFC 7252
As discussed in issue #286 [1], the mandatory-to-implement
cipher suites TLS_PSK_WITH_AES_128_CCM_8 and TLS_ECDHE_ECDSA_AES_128_CCM_8
should be enabled if possible.

[1] https://github.com/obgm/libcoap/issues/286

Signed-off-by: Olaf Bergmann <bergmann@tzi.org>
2019-01-11 17:49:32 +01:00
Jon Shallow 164eef538b Clarify coap_add_data_blocked_response() usage
include/coap2/block.h
man/coap_pdu_setup.txt.in

Update documentation on coap_add_data_blocked_response() usage.
2019-01-11 16:39:02 +00:00
Olaf Bergmann 5a8c59e5aa Makefile.libcoap: rename debug.c to coap_debug.c for Contiki 2019-01-07 10:05:44 +01:00
Olaf Bergmann 29d62a2e3f examples/contiki/coap-observer.c: do not include debug.h explicitly 2019-01-07 10:04:59 +01:00
Olaf Bergmann 50c892fc81 lwip/Makefile: renamed debug.c to coap_debug.c 2019-01-07 09:56:12 +01:00
Olaf Bergmann 0388bb9e38 Renamed debug.[hc] to coap_debug.[hc]
Prefixing the file name with "coap_" helps avoiding a name clash
when libcoap is included as package in RIOT [1].

[1] https://github.com/RIOT-OS/RIOT
2019-01-07 00:51:10 +01:00
Olaf Bergmann ca1c8255a2 debug.c: Fix printf format specifiers and arguments
Version numbers in coap_tls_version_t are represented as uint64_t.
This change fixes a couple of compiler warnings raised when passing
these to %ld.
2019-01-07 00:12:58 +01:00
Olaf Bergmann 15c7f28a18 block.c: Fix printf format specifier for size_t argument 2019-01-07 00:01:40 +01:00
Olaf Bergmann 045c724ee8 address.c: [RIOT] added stub for IN_MULTICAST
On platform RIOT, the IN_MULTICAST macro is missing. This change
therefore adds a stub to prevent build errors. (WIP)
2019-01-06 23:07:07 +01:00
obgm 0b7fb3cf25 Merge pull request #285 from mrdeep1/delete_str
Remove deprecated str typedef to remove namespace pollution
2018-12-29 15:17:13 +01:00
Jon Shallow 371c295fce Remove deprecated str typedef to remove namespace pollution
As str structure has been replaced by coap_string_t, remove it from the code
as it is no longer required, has been deprecated for some time and can cause
clashes with other str definitions.

Tidy up comment referring to str.
2018-12-27 11:51:42 +00:00
Olaf Bergmann 23c60dee6f client.c: remove trailing newline from output for '-o -'
The CLI option '-o file' redirects the received payload into the
given file, where '-' denotes stdout. As the function close_output()
used to append a newline to the end of the output, certain tools
such as cbor2pretty.rb have failed, complaining about the trailing
character.

This change now writes the newline if only if option '-o' was not
specified.
2018-12-20 17:57:16 +01:00
Olaf Bergmann d52de2b8e9 configure.ac: set release state to rc3 v4.2.0-rc3 2018-12-20 14:29:08 +01:00
obgm 49e8e43eeb Merge pull request #283 from mrdeep1/mem_leak_hello
Possible to crash coap-server with uncompleted (D)TLS handshakes
2018-12-18 17:45:04 +01:00
obgm 092bc021b4 Merge pull request #282 from mrdeep1/endpoint_free_hello_leak
endpoint->hello information memory leak when coap_free_endpoint() called
2018-12-18 17:32:51 +01:00
Jon Shallow 15b42e9faa Possible to crash coap-server with uncompleted (D)TLS handshakes
For any TLS implementation, it is possible to crash the coap-server by
initiating (D)TLS handshakes but never completing them, thus continuing to use
more RAM.  Each partially completed handshake is left in the endpoint->sessions
chain in a state of COAP_SESSION_STATE_HANDSHAKE and unless
endpoint->max_idle_sessions is deliberately configured, these sessions will
never get deleted.

A cause of partially completed handshakes is when there is a PSK mismatch.

Furthermore, unnecessary CPU usage is used to search down long lists held in
endpoint->sessions.

This fix limits the  number of these sessions in a handshake state to the
number defined by endpoint->max_handshake_sessions if non zero or 100 to prevent
memory exhaustion.  By default, endpoint->max_handshake_sessions is 0.

Sessions in state COAP_SESSION_STATE_HANDSHAKE will get timed out after 30
seconds of inactivity.

This does not prevent a DOS attack by creating max_handshake_sessions as a
genuine new session will fail to get responded to until the number of current
COAP_SESSION_STATE_HANDSHAKE sessions drop.  However, the use of Cookie
exchanges by the underlying TLS library prior to a new session being created
and added into endpoint->sessions will filter out a lot of the DOS attacks.

include/coap2/coap_session.h

New default definition for COAP_DEFAULT_MAX_HANDSHAKE_SESSIONS
New default definition for COAP_PARTIAL_SESSION_TIMEOUT_TICKS

include/coap2/net.h

Include max_handshake_sessions in coap_context_t

src/coap_session.c

In coap_endpoint_get_session() check the number of sessions in
COAP_SESSION_STATE_HANDSHAKE and handle accordingly when limits are hit, or
they need to be timed out.
2018-12-18 16:14:03 +00:00
obgm 11a688760d Merge pull request #284 from mrdeep1/client_server_documentation
coap-client/coap-server help documentation splitting out PSK and PKI options
2018-12-18 17:04:11 +01:00
Jon Shallow 8dcdbfb477 endpoint->hello information memory leak when coap_free_endpoint() called
Information set up in the pseudo session held in endpoint->hello is not freed
off when coap_free_endpoint() is called.

A solution is to split coap_session_free() into two parts with
coap_session_free() calling a new function coap_session_mfree().

Then coap_mfree_endpoint() can call coap_session_mfree() to free off the
endpoint specific hello information.

Makefile.am

Add coap_mfree_endpoint and coap_session_mfree to the CTAGS_IGNORE list.

libcoap-2.{map|sym}

Remove coap_mfree_endpoint as it is not a public function

include/coap2/coap_session.h

Add in new coap_session_mfree() function definition

src/coap_io.c

Call coap_session_mfree() from within coap_mfree_endpoint()

src/coap_session.c

Move some of the functionality out of coap_session_free() into a new
function coap_session_mfree() and  call coap_session_mfree().
2018-12-18 15:56:48 +00:00
obgm 4626dea3a6 Merge pull request #281 from mrdeep1/duplicate_gnutls_handshake
GnuTLS If a bad key was used, it is not possible to get a new session
2018-12-18 16:41:56 +01:00
Jon Shallow 1e06285b2b GnuTLS If a bad key was used, it is not possible to get a new session
src/coap_gnutls.c:

The GnuTLS server session information held in endpoint->hello was getting
polluted when a bad PSK was being used, and so a new session attempt with a
good PSK would fail. The only way to get around this was to restart the
coap-server.

OpenSSL handles this by initiating the handshake response (DTLSv1_listen()),
creating a new coap session and then using the new session to continue with
the SSL handshake (SSL_accept()) until the SSL session is set up.

For GnuTLS, there is no initial handshake initiation as everything is done
inside gnutls_handshake().  To get around this, in the post_client_hello
function a flag is set in g_env->seen_client_hello so that coap_dtls_hello()
knows that that a SSL session is being set up, but not yet complete.
This flag is cleared when coap_dtls_hello() returns 1 indicating that the
interim client_hello has been seen and it is safe to duplicate the session.

The do_gnutls_handshake() function has been cleaned up.

The coap_dtls_send() function has been updated to send any outstanding data
if the SSL session has just completed.
2018-12-18 15:07:48 +00:00
obgm ed9e8da5ac Merge pull request #279 from mrdeep1/gnutls_tls_read
coap_gnutls.c: coap_tls_read() support retrying the read
2018-12-13 17:27:20 +01:00
Olaf Bergmann 167ce8b144 coap_io.c: set send address when IP_PKTINFO is missing
Try IP_SENDSRCADDR to set the address of the sending interface for
sendmsg() on platforms that do not provide IP_PKTINFO (such as
FreeBSD).
2018-12-13 17:08:11 +01:00
Jon Shallow 26a045ba3d coap-client/coap-server help documentation splitting out PSK and PKI options
Re-organize usage() and man pages to seperate out the PSK and PKI options
for clarity - as they may not be available for all TLS library versions

examples/client.c
examples/coap-server.c
man/coap-client.txt.in
man/coap-server.txt.in
2018-12-12 11:23:49 +00:00
Jon Shallow e6661fbdfc Support FreeBSD 11.2 builds
src/coap_io.c:
ifdef out IPv4 struct in_pktinfo code that does not compile, copying what
has been done later in the same coap_network_send() function.

tests/test_session.c
Correctly reverse the parameters to coap_new_client_session() in t_session6()
so that the test application does not bind to local-address, port 5683 twice.
[It seems that other distrubutions are happy with this when just SO_REUSEADDR
is used on the socket, but FreeBSD needs SO_REUSEPORT enabled as well.]

BUILDING
Record that gmake is required to build TinyDTLS for FreeBSD, not make.
2018-12-10 20:15:25 +00:00
Jon Shallow 0e0c7ba1d4 coap_gnutls.c: coap_tls_read() support retrying the read
Support the case of GNUTLS_E_AGAIN for retrying the read at a
later point
2018-12-10 15:09:55 +00:00
obgm 19822b5765 Merge pull request #275 from mrdeep1/etsi_iot_01
Update etsi_iot_01 and tiny examples to build with current API
2018-12-08 14:41:50 +01:00
Jon Shallow 0bcbd3fb5c Update scripts/build.sh to build coap-etsi_iot_01 and coap-tiny examples
Travis now checks exmples continue to build, even if there is an API
change.
2018-12-07 20:22:56 +00:00
Jon Shallow c216a8801d Update the etsi test cases in the examples directory
examples/etsi_coaptest.sh
examples/etsi_testcases.sh

Minor corrections to the scripts to get them working
2018-12-07 20:22:56 +00:00
Jon Shallow 78c59ff300 Add in support for building coap-etsi_iot_01 and coap-tiny examples
examples/Makefile.am

Support building the additional examples using 'make check'.

.gitignore

Ignore the new examples executables.
2018-12-07 20:22:56 +00:00