diff --git a/3rdparty/mbedtls/compat.c b/3rdparty/mbedtls/compat.c new file mode 100644 index 00000000..e4a62100 --- /dev/null +++ b/3rdparty/mbedtls/compat.c @@ -0,0 +1,107 @@ +/* +compat.c - mbedTLS platform overrides for targets upstream doesn't cover +Copyright (C) 2026 Xash3D FWGS contributors + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +*/ + +/* +WinXP: legacy CryptGenRandom via advapi32 +Source: ttps://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptgenrandom + +PSVita: sceKernelGetRandomNumber from psp2/kernel/rng.h (64-byte cap). +Source: https://github.com/vitasdk/vita-headers/blob/master/include/psp2/kernel/rng.h + +NSwitch: randomGet from libnx. +Source: https://github.com/switchbrew/libnx/blob/master/nx/include/switch/kernel/random.h +*/ + +#include "mbedtls/platform.h" +#include "psa/crypto.h" + +#if defined( MBEDTLS_PLATFORM_MS_TIME_ALT ) + +mbedtls_ms_time_t mbedtls_ms_time( void ) +{ + extern double Platform_DoubleTime( void ); + + return (mbedtls_ms_time_t)( Platform_DoubleTime() * 1000.0 ); +} + +#endif /* MBEDTLS_PLATFORM_MS_TIME_ALT */ + +#if defined( MBEDTLS_PSA_DRIVER_GET_ENTROPY ) +#if defined( _WIN32 ) && !defined( _WIN64 ) +#include +#include +int mbedtls_platform_get_entropy( psa_driver_get_entropy_flags_t flags, size_t *estimate_bits, unsigned char *output, size_t output_size ) +{ + if( flags != 0 ) + return PSA_ERROR_NOT_SUPPORTED; + + HCRYPTPROV prov; + if( !CryptAcquireContextW( &prov, NULL, NULL, PROV_RSA_FULL, + CRYPT_VERIFYCONTEXT | CRYPT_SILENT )) + return PSA_ERROR_INSUFFICIENT_ENTROPY; + + if( !CryptGenRandom( prov, (DWORD)output_size, output )) + { + CryptReleaseContext( prov, 0 ); + return PSA_ERROR_INSUFFICIENT_ENTROPY; + } + + CryptReleaseContext( prov, 0 ); + *estimate_bits = 8 * output_size; + return 0; +} +#elif defined( __vita__ ) +#include + +int mbedtls_platform_get_entropy( psa_driver_get_entropy_flags_t flags, size_t *estimate_bits, unsigned char *output, size_t output_size ) +{ + if( flags != 0 ) + return PSA_ERROR_NOT_SUPPORTED; + + size_t total = 0; + while( total < output_size ) + { + size_t chunk = output_size - total; + + if( chunk > 64 ) + chunk = 64; + + if( sceKernelGetRandomNumber( output + total, chunk ) != 0 ) + return PSA_ERROR_INSUFFICIENT_ENTROPY; + + total += chunk; + } + + *estimate_bits = 8 * output_size; + return 0; +} + +#elif defined( __SWITCH__ ) +#include + +int mbedtls_platform_get_entropy( psa_driver_get_entropy_flags_t flags, size_t *estimate_bits, unsigned char *output, size_t output_size ) +{ + if( flags != 0 ) + return PSA_ERROR_NOT_SUPPORTED; + + randomGet( output, output_size ); + *estimate_bits = 8 * output_size; + return 0; +} +#else +#error "MBEDTLS_PSA_DRIVER_GET_ENTROPY enabled but no platform impl in compat.c" +#endif + +#endif /* MBEDTLS_PSA_DRIVER_GET_ENTROPY */ diff --git a/3rdparty/mbedtls/psvita_compat.c b/3rdparty/mbedtls/psvita_compat.c deleted file mode 100644 index ff9b5e87..00000000 --- a/3rdparty/mbedtls/psvita_compat.c +++ /dev/null @@ -1,52 +0,0 @@ -/* -psvita_compat.c - mbedTLS platform overrides for PlayStation Vita -Copyright (C) 2026 Xash3D FWGS contributors - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. -*/ - -/* Upstream mbedTLS has no PSVita target, so: - - mbedtls_ms_time() forwards to the engine's Platform_DoubleTime - - mbedtls_platform_get_entropy() uses sceKernelGetRandomNumber - Wired in only when DEST_OS == 'psvita'. */ - -#include - -#include "mbedtls/platform.h" -#include "psa/crypto.h" - -extern double Platform_DoubleTime( void ); - -mbedtls_ms_time_t mbedtls_ms_time( void ) -{ - return (mbedtls_ms_time_t)( Platform_DoubleTime() * 1000.0 ); -} - -int mbedtls_platform_get_entropy( psa_driver_get_entropy_flags_t flags, - size_t *estimate_bits, unsigned char *output, size_t output_size ) -{ - if( flags != 0 ) - return PSA_ERROR_NOT_SUPPORTED; - - size_t total = 0; - while( total < output_size ) - { - size_t chunk = output_size - total; - if( chunk > 64 ) - chunk = 64; - if( sceKernelGetRandomNumber( output + total, chunk ) != 0 ) - return PSA_ERROR_INSUFFICIENT_ENTROPY; - total += chunk; - } - - *estimate_bits = 8 * output_size; - return 0; -} diff --git a/3rdparty/mbedtls/winxp_entropy.c b/3rdparty/mbedtls/winxp_entropy.c deleted file mode 100644 index 6ff657ec..00000000 --- a/3rdparty/mbedtls/winxp_entropy.c +++ /dev/null @@ -1,39 +0,0 @@ -/* -winxp_entropy.c - platform entropy override for mbedTLS on 32-bit Windows -Copyright (C) 2026 Xash3D FWGS contributors - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. -*/ - -#include -#include -#include "mbedtls/platform.h" -#include "psa/crypto.h" - -int mbedtls_platform_get_entropy( psa_driver_get_entropy_flags_t flags, size_t *estimate_bits, unsigned char *output, size_t output_size ) -{ - if( flags != 0 ) - return PSA_ERROR_NOT_SUPPORTED; - - HCRYPTPROV prov; - if( !CryptAcquireContextW( &prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT )) - return PSA_ERROR_INSUFFICIENT_ENTROPY; - - if( !CryptGenRandom( prov, output_size, output )) - { - CryptReleaseContext( prov, 0 ); - return PSA_ERROR_INSUFFICIENT_ENTROPY; - } - - CryptReleaseContext( prov, 0 ); - *estimate_bits = 8 * output_size; - return 0; -} diff --git a/3rdparty/mbedtls/wscript b/3rdparty/mbedtls/wscript index 656102a4..a1ff65e7 100644 --- a/3rdparty/mbedtls/wscript +++ b/3rdparty/mbedtls/wscript @@ -30,11 +30,7 @@ def build(bld): 'mbedtls/tf-psa-crypto/drivers/builtin/src/*.c', ]) - if bld.env.DEST_OS == 'win32' and bld.env.DEST_SIZEOF_VOID_P == 4: - sources += ['winxp_entropy.c'] - - if bld.env.DEST_OS == 'psvita': - sources += ['psvita_compat.c'] + sources += ['compat.c'] defines = [ 'MBEDTLS_USER_CONFIG_FILE="xash_mbedtls_config.h"', diff --git a/3rdparty/mbedtls/xash_mbedtls_config.h b/3rdparty/mbedtls/xash_mbedtls_config.h index bd048ca0..144084a6 100644 --- a/3rdparty/mbedtls/xash_mbedtls_config.h +++ b/3rdparty/mbedtls/xash_mbedtls_config.h @@ -33,9 +33,4 @@ #undef MBEDTLS_X509_CRL_PARSE_C #undef MBEDTLS_VERSION_FEATURES -#if defined( __vita__ ) -/* Upstream has no PSVita support, psvita_compat.c fills in */ -#define MBEDTLS_PLATFORM_MS_TIME_ALT -#endif - #endif /* XASH_MBEDTLS_CONFIG_H */ diff --git a/3rdparty/mbedtls/xash_psa_config.h b/3rdparty/mbedtls/xash_psa_config.h index 7ba9bf92..260fb20b 100644 --- a/3rdparty/mbedtls/xash_psa_config.h +++ b/3rdparty/mbedtls/xash_psa_config.h @@ -1,17 +1,16 @@ #ifndef XASH_PSA_CONFIG_H #define XASH_PSA_CONFIG_H -#if defined( _WIN32 ) && !defined( _WIN64 ) -/* Upstream pulls BCryptGenRandom (Vista+); we still target XP on 32-bit. - winxp_entropy.c provides mbedtls_platform_get_entropy() via advapi32. */ +#if (defined( _WIN32 ) && !defined( _WIN64 )) || defined( __vita__ ) || defined( __SWITCH__ ) +/* WinXP, PSVita and NSwitch use entropy paths upstream doesn't cover. + compat.c provides mbedtls_platform_get_entropy() for all three. */ #undef MBEDTLS_PSA_BUILTIN_GET_ENTROPY #define MBEDTLS_PSA_DRIVER_GET_ENTROPY #endif -#if defined( __vita__ ) -/* Upstream has no PSVita target, psvita_compat.c fills in the missing parts. */ -#undef MBEDTLS_PSA_BUILTIN_GET_ENTROPY -#define MBEDTLS_PSA_DRIVER_GET_ENTROPY +#if defined( __vita__ ) || defined( __SWITCH__ ) +/* Upstream has no Vita/NSW support; compat.c fills in */ +#define MBEDTLS_PLATFORM_MS_TIME_ALT #endif #undef MBEDTLS_FS_IO