diff --git a/configure.ac b/configure.ac index 4d007d83c..9588fae2a 100644 --- a/configure.ac +++ b/configure.ac @@ -1672,6 +1672,20 @@ AC_ARG_ENABLE([psk], [ ENABLED_PSK=no ] ) +# Single PSK identity +AC_ARG_ENABLE([psk-one-id], + [AS_HELP_STRING([--enable-psk-one-id],[Enable PSK (default: disabled)])], + [ ENABLED_PSK_ONE_ID=$enableval ], + [ ENABLED_PSK_ONE_ID=no ] + ) +if test "$ENABLED_PSK_ONE_ID" = "yes" +then + if test "$ENABLED_PSK" = "no" + then + ENABLED_PSK="yes" + fi + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_PSK_ONE_ID" +fi # ERROR STRINGS AC_ARG_ENABLE([errorstrings], diff --git a/src/tls.c b/src/tls.c index be48737fa..5b5ee64b6 100644 --- a/src/tls.c +++ b/src/tls.c @@ -9612,14 +9612,28 @@ int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer) } #endif #ifndef NO_PSK - if (ssl->options.client_psk_cb != NULL) { + if (ssl->options.client_psk_cb != NULL || + ssl->options.client_psk_tls13_cb != NULL) { /* Default ciphersuite. */ byte cipherSuite0 = TLS13_BYTE; byte cipherSuite = WOLFSSL_DEF_PSK_CIPHER; + const char* cipherName = NULL; - ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl, + if (ssl->options.client_psk_tls13_cb != NULL) { + ssl->arrays->psk_keySz = ssl->options.client_psk_tls13_cb( + ssl, ssl->arrays->server_hint, + ssl->arrays->client_identity, MAX_PSK_ID_LEN, + ssl->arrays->psk_key, MAX_PSK_KEY_LEN, &cipherName); + if (GetCipherSuiteFromName(cipherName, &cipherSuite0, + &cipherSuite) != 0) { + return PSK_KEY_ERROR; + } + } + else { + ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl, ssl->arrays->server_hint, ssl->arrays->client_identity, MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN); + } if (ssl->arrays->psk_keySz == 0 || ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) { return PSK_KEY_ERROR; diff --git a/src/tls13.c b/src/tls13.c index 3037caca2..5dae3cd5f 100644 --- a/src/tls13.c +++ b/src/tls13.c @@ -2402,6 +2402,7 @@ static int SetupPskKey(WOLFSSL* ssl, PreSharedKey* psk) #endif #ifndef NO_PSK if (!psk->resumption) { + #ifndef WOLFSSL_PSK_ONE_ID const char* cipherName = NULL; byte cipherSuite0 = TLS13_BYTE, cipherSuite = WOLFSSL_DEF_PSK_CIPHER; @@ -2430,6 +2431,9 @@ static int SetupPskKey(WOLFSSL* ssl, PreSharedKey* psk) psk->cipherSuite != cipherSuite) { return PSK_KEY_ERROR; } + #else + /* PSK information loaded during setting of default TLS extensions. */ + #endif } #endif