]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
ktls: flags
authorFrantisek Krenzelok <krenzelok.frantisek@gmail.com>
Thu, 2 Dec 2021 15:35:31 +0000 (16:35 +0100)
committerFrantisek Krenzelok <krenzelok.frantisek@gmail.com>
Thu, 16 Dec 2021 08:36:14 +0000 (09:36 +0100)
ktls enum flags API

Signed-off-by: Frantisek Krenzelok <krenzelok.frantisek@gmail.com>
lib/alert.c
lib/handshake.c
lib/includes/gnutls/socket.h
lib/record.c
lib/system/ktls.c
lib/system/ktls.h
tests/gnutls_ktls.c

index 28ee91b13f2c4ac9dae76db0597e53635db42788..50bd1d3de7cd25dfe72dcfeb6cc2b7f633953ced 100644 (file)
@@ -182,7 +182,7 @@ gnutls_alert_send(gnutls_session_t session, gnutls_alert_level_t level,
                return ret;
        }
 
-       if (IS_KTLS_ENABLED(session, KTLS_SEND)) {
+       if (IS_KTLS_ENABLED(session, GNUTLS_KTLS_SEND)) {
                ret =
                        _gnutls_ktls_send_control_msg(session, GNUTLS_ALERT, data, 2);
        } else {
index 4ddfa66afecb7b0157817b8c5be556d5e1e31901..f65430bbcf4b7183f3cf2b97cce7e56979aee20b 100644 (file)
@@ -2910,7 +2910,7 @@ int gnutls_handshake(gnutls_session_t session)
        }
 
 #ifdef ENABLE_KTLS
-       if (IS_KTLS_ENABLED(session, KTLS_DUPLEX)) {
+       if (IS_KTLS_ENABLED(session, GNUTLS_KTLS_DUPLEX)) {
                _gnutls_ktls_set_keys(session);
        }
 #endif
index 82f8d2f094f6dda8cdd8dd0fe42a82110a29c0e5..8c21b9a38232ded5bb0cee54979db3197e6aa026 100644 (file)
@@ -37,14 +37,32 @@ extern "C" {
 #endif
 /* *INDENT-ON* */
 
+/**
+ * gnutls_transport_ktls_enable_flags_t:
+ * @GNUTLS_KTLS_RECV: ktls enabled for recv function.
+ * @GNUTLS_KTLS_SEND: ktls enabled for send function.
+ * @GNUTLS_KTLS_DUPLEX: ktls enabled for both recv and send functions.
+ *
+ * Flag enumeration of ktls enable status for recv and send functions.
+ * This is used by gnutls_transport_is_ktls_enabled().
+ *
+ * Since: 3.7.3
+ */
+typedef enum {
+       GNUTLS_KTLS_RECV = 1 << 0,
+       GNUTLS_KTLS_SEND = 1 << 1,
+       GNUTLS_KTLS_DUPLEX = GNUTLS_KTLS_RECV | GNUTLS_KTLS_SEND,
+} gnutls_transport_ktls_enable_flags_t;
+
+gnutls_transport_ktls_enable_flags_t
+gnutls_transport_is_ktls_enabled(gnutls_session_t session);
+
 void gnutls_transport_set_fastopen(gnutls_session_t session,
                                    int fd,
                                    struct sockaddr *connect_addr,
                                    socklen_t connect_addrlen,
                                    unsigned int flags);
 
-int gnutls_transport_is_ktls_enabled(gnutls_session_t session);
-
 /* *INDENT-OFF* */
 #ifdef __cplusplus
 }
index d7f8724352a6b89a2ca73fde643045e6db8b912e..ee271b51184629a83fe30ac66de67f4b78a438cc 100644 (file)
@@ -289,7 +289,7 @@ int gnutls_bye(gnutls_session_t session, gnutls_close_request_t how)
 
        switch (BYE_STATE) {
        case BYE_STATE0:
-               if (!IS_KTLS_ENABLED(session, KTLS_SEND))
+               if (!IS_KTLS_ENABLED(session, GNUTLS_KTLS_SEND))
                        ret = _gnutls_io_write_flush(session);
                BYE_STATE = BYE_STATE0;
                if (ret < 0) {
@@ -309,7 +309,7 @@ int gnutls_bye(gnutls_session_t session, gnutls_close_request_t how)
        case BYE_STATE2:
                BYE_STATE = BYE_STATE2;
                if (how == GNUTLS_SHUT_RDWR) {
-                       if (IS_KTLS_ENABLED(session, KTLS_SEND)){
+                       if (IS_KTLS_ENABLED(session, GNUTLS_KTLS_SEND)){
                                do {
                                        ret = _gnutls_ktls_recv_int(session,
                                                        GNUTLS_ALERT, NULL, 0);
@@ -2035,7 +2035,7 @@ gnutls_record_send2(gnutls_session_t session, const void *data,
 
        switch(session->internals.rsend_state) {
                case RECORD_SEND_NORMAL:
-                       if (IS_KTLS_ENABLED(session, KTLS_SEND)) {
+                       if (IS_KTLS_ENABLED(session, GNUTLS_KTLS_SEND)) {
                                return _gnutls_ktls_send(session, data, data_size);
                        } else {
                                return _gnutls_send_tlen_int(session, GNUTLS_APPLICATION_DATA,
@@ -2306,7 +2306,7 @@ gnutls_record_recv(gnutls_session_t session, void *data, size_t data_size)
                        return gnutls_assert_val(GNUTLS_E_UNAVAILABLE_DURING_HANDSHAKE);
        }
 
-       if (IS_KTLS_ENABLED(session, KTLS_RECV)) {
+       if (IS_KTLS_ENABLED(session, GNUTLS_KTLS_RECV)) {
                return _gnutls_ktls_recv(session, data, data_size);
        } else {
                return _gnutls_recv_int(session, GNUTLS_APPLICATION_DATA,
index c54653b49870f219c13ce5288f8fa74756037c46..03c94f6f80d663f524b90ee92ba0b0cf43bbd937 100644 (file)
  *
  * Checks if KTLS is now enabled and was properly inicialized.
  *
- * Returns: 1 for enabled, 0 otherwise
+ * Returns: %GNUTLS_KTLS_RECV, %GNUTLS_KTLS_SEND, %GNUTLS_KTLS_DUPLEX, otherwise 0
  *
- * Since: 3.7.2
+ * Since: 3.7.3
  **/
-int gnutls_transport_is_ktls_enabled(gnutls_session_t session){
-       if (unlikely(!session->internals.initial_negotiation_completed))
-               return gnutls_assert_val(GNUTLS_E_UNAVAILABLE_DURING_HANDSHAKE);
+gnutls_transport_ktls_enable_flags_t
+gnutls_transport_is_ktls_enabled(gnutls_session_t session){
+       if (unlikely(!session->internals.initial_negotiation_completed)){
+               _gnutls_debug_log("Initial negotiation is not yet complete");
+               return 0;
+       }
 
        return session->internals.ktls_enabled;
 }
 
-int _gnutls_ktls_enable(gnutls_session_t session)
+void _gnutls_ktls_enable(gnutls_session_t session)
 {
        int sockin, sockout;
        session->internals.ktls_enabled = 0;
        gnutls_transport_get_int2(session, &sockin, &sockout);
 
        if (setsockopt(sockin, SOL_TCP, TCP_ULP, "tls", sizeof ("tls")) == 0)
-               session->internals.ktls_enabled |= KTLS_RECV;
+               session->internals.ktls_enabled |= GNUTLS_KTLS_RECV;
 
        if (sockin != sockout) {
                if (setsockopt(sockout, SOL_TCP, TCP_ULP, "tls", sizeof ("tls")) == 0)
-                       session->internals.ktls_enabled |= KTLS_SEND;
+                       session->internals.ktls_enabled |= GNUTLS_KTLS_SEND;
        } else
-               session->internals.ktls_enabled |= KTLS_SEND;
-
-       return 0;
+               session->internals.ktls_enabled |= GNUTLS_KTLS_SEND;
 }
 
 int _gnutls_ktls_set_keys(gnutls_session_t session)
@@ -95,7 +96,7 @@ int _gnutls_ktls_set_keys(gnutls_session_t session)
                return ret;
        }
 
-       if(session->internals.ktls_enabled & KTLS_RECV){
+       if(session->internals.ktls_enabled & GNUTLS_KTLS_RECV){
                switch (cipher) {
                        case GNUTLS_CIPHER_AES_128_GCM:
                        {
@@ -128,7 +129,7 @@ int _gnutls_ktls_set_keys(gnutls_session_t session)
 
                                if (setsockopt (sockin, SOL_TLS, TLS_RX,
                                                &crypto_info, sizeof (crypto_info))) {
-                                       session->internals.ktls_enabled ^= KTLS_RECV;
+                                       session->internals.ktls_enabled &= ~GNUTLS_KTLS_RECV;
                                        return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
                                }
                        }
@@ -163,7 +164,7 @@ int _gnutls_ktls_set_keys(gnutls_session_t session)
 
                                if (setsockopt (sockin, SOL_TLS, TLS_RX,
                                                &crypto_info, sizeof (crypto_info))) {
-                                       session->internals.ktls_enabled ^= KTLS_RECV;
+                                       session->internals.ktls_enabled &= ~GNUTLS_KTLS_RECV;
                                        return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
                                }
                        }
@@ -179,7 +180,7 @@ int _gnutls_ktls_set_keys(gnutls_session_t session)
                return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
        }
 
-       if(session->internals.ktls_enabled & KTLS_SEND){
+       if(session->internals.ktls_enabled & GNUTLS_KTLS_SEND){
                switch (cipher) {
                        case GNUTLS_CIPHER_AES_128_GCM:
                        {
@@ -212,7 +213,7 @@ int _gnutls_ktls_set_keys(gnutls_session_t session)
 
                                if (setsockopt (sockout, SOL_TLS, TLS_TX,
                                                &crypto_info, sizeof (crypto_info))) {
-                                       session->internals.ktls_enabled ^= KTLS_SEND;
+                                       session->internals.ktls_enabled &= ~GNUTLS_KTLS_SEND;
                                        return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
                                }
                        }
@@ -247,7 +248,7 @@ int _gnutls_ktls_set_keys(gnutls_session_t session)
 
                                if (setsockopt (sockout, SOL_TLS, TLS_TX,
                                                &crypto_info, sizeof (crypto_info))) {
-                                       session->internals.ktls_enabled ^= KTLS_SEND;
+                                       session->internals.ktls_enabled &= ~GNUTLS_KTLS_SEND;
                                        return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
                                }
                        }
@@ -419,12 +420,13 @@ int _gnutls_ktls_recv_int(gnutls_session_t session, content_type_t type,
 }
 
 #else //ENABLE_KTLS
-int gnutls_transport_is_ktls_enabled(gnutls_session_t session){
+gnutls_transport_ktls_enable_flags_t
+gnutls_transport_is_ktls_enabled(gnutls_session_t session){
        return gnutls_assert_val(GNUTLS_E_UNIMPLEMENTED_FEATURE);
 }
 
-int _gnutls_ktls_enable(gnutls_session_t session){
-       return gnutls_assert_val(GNUTLS_E_UNIMPLEMENTED_FEATURE);
+void _gnutls_ktls_enable(gnutls_session_t session){
+       return;
 }
 
 int _gnutls_ktls_set_keys(gnutls_session_t session) {
@@ -436,7 +438,8 @@ int _gnutls_ktls_send_control_msg(gnutls_session_t session,
        return gnutls_assert_val(GNUTLS_E_UNIMPLEMENTED_FEATURE);
 }
 
-int _gnutls_ktls_recv_int(gnutls_session_t session, content_type_t type, void *data, size_t data_size) {
+int _gnutls_ktls_recv_int(gnutls_session_t session, content_type_t type,
+               void *data, size_t data_size) {
        return gnutls_assert_val(GNUTLS_E_UNIMPLEMENTED_FEATURE);
 }
 
index 829799e21244e0ad40b6380dc28163a2590bdb83..fb5c4eef6b0574d7cbb843ffffc111b9a6792cc6 100644 (file)
@@ -3,13 +3,7 @@
 
 #include "gnutls_int.h"
 
-enum{
-       KTLS_RECV = 1,
-       KTLS_SEND,
-       KTLS_DUPLEX,
-};
-
-int _gnutls_ktls_enable(gnutls_session_t session);
+void _gnutls_ktls_enable(gnutls_session_t session);
 int _gnutls_ktls_set_keys(gnutls_session_t session);
 int _gnutls_ktls_send_control_msg(gnutls_session_t session, unsigned char record_type,
                const void *data, size_t data_size);
index 364f010d04fd2f9fefca45a1227553f08629d9ce..07fd4d8adb78439da73957a47c8bd9c1db401732 100644 (file)
@@ -43,7 +43,7 @@ static void client_log_func(int level, const char *str)
 }
 
 #define MAX_BUF 1024
-#define MSG "Hello world!\0"
+#define MSG "Hello world!"
 
 
 static void client(int fd, const char *prio)
@@ -84,7 +84,7 @@ static void client(int fd, const char *prio)
                success("client: Handshake was completed\n");
 
        ret = gnutls_transport_is_ktls_enabled(session);
-       if (ret != 3){
+       if (!(ret & GNUTLS_KTLS_RECV)){
                fail("client: KTLS was not properly inicialized\n");
                goto end;
        }
@@ -184,7 +184,7 @@ static void server(int fd, const char *prio)
                success("server: Handshake was completed\n");
 
        ret = gnutls_transport_is_ktls_enabled(session);
-       if (ret != 3){
+       if (!(ret & GNUTLS_KTLS_SEND)){
                fail("server: KTLS was not properly inicialized\n");
                goto end;
        }