diff --git a/3rdparty/mbedtls/psvita_compat.c b/3rdparty/mbedtls/psvita_compat.c new file mode 100644 index 00000000..ff9b5e87 --- /dev/null +++ b/3rdparty/mbedtls/psvita_compat.c @@ -0,0 +1,52 @@ +/* +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/wscript b/3rdparty/mbedtls/wscript index 6851a1b0..656102a4 100644 --- a/3rdparty/mbedtls/wscript +++ b/3rdparty/mbedtls/wscript @@ -33,6 +33,9 @@ def build(bld): 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'] + defines = [ 'MBEDTLS_USER_CONFIG_FILE="xash_mbedtls_config.h"', 'TF_PSA_CRYPTO_USER_CONFIG_FILE="xash_psa_config.h"', diff --git a/3rdparty/mbedtls/xash_mbedtls_config.h b/3rdparty/mbedtls/xash_mbedtls_config.h index 144084a6..bd048ca0 100644 --- a/3rdparty/mbedtls/xash_mbedtls_config.h +++ b/3rdparty/mbedtls/xash_mbedtls_config.h @@ -33,4 +33,9 @@ #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 02d473d8..7ba9bf92 100644 --- a/3rdparty/mbedtls/xash_psa_config.h +++ b/3rdparty/mbedtls/xash_psa_config.h @@ -8,6 +8,12 @@ #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 +#endif + #undef MBEDTLS_FS_IO #undef MBEDTLS_PSA_ITS_FILE_C #undef MBEDTLS_PSA_CRYPTO_STORAGE_C