@@ -1332,6 +1332,7 @@ if not meson.is_cross_build() and fs.exists('/dev/tty')
1332
1332
libgit_c_args += ' -DHAVE_DEV_TTY'
1333
1333
endif
1334
1334
1335
+ csprng_backend = get_option (' csprng_backend' )
1335
1336
https_backend = get_option (' https_backend' )
1336
1337
sha1_backend = get_option (' sha1_backend' )
1337
1338
sha1_unsafe_backend = get_option (' sha1_unsafe_backend' )
@@ -1343,7 +1344,7 @@ if https_backend == 'auto' and security_framework.found()
1343
1344
https_backend = ' CommonCrypto'
1344
1345
endif
1345
1346
1346
- openssl_required = ' openssl' in [https_backend, sha1_backend, sha1_unsafe_backend, sha256_backend]
1347
+ openssl_required = ' openssl' in [csprng_backend, https_backend, sha1_backend, sha1_unsafe_backend, sha256_backend]
1347
1348
openssl = dependency (' openssl' , required : openssl_required, default_options : [' default_library=static' ])
1348
1349
if https_backend == ' auto' and openssl.found()
1349
1350
https_backend = ' openssl'
@@ -1428,18 +1429,30 @@ else
1428
1429
error (' Unhandled SHA256 backend ' + sha256_backend)
1429
1430
endif
1430
1431
1431
- if compiler.has_header_symbol(' stdlib.h' , ' arc4random_buf' )
1432
+ # Backends are ordered to reflect our preference for more secure and faster
1433
+ # ones over the ones that are less so.
1434
+ if csprng_backend in [' auto' , ' arc4random' ] and compiler.has_header_symbol(' stdlib.h' , ' arc4random_buf' , required : csprng_backend == ' arc4random' )
1432
1435
libgit_c_args += ' -DHAVE_ARC4RANDOM'
1433
- elif compiler.has_header_symbol(' bsd/stdlib.h' , ' arc4random_buf' )
1436
+ csprng_backend = ' arc4random'
1437
+ elif csprng_backend in [' auto' , ' arc4random_bsd' ] and compiler.has_header_symbol(' bsd/stdlib.h' , ' arc4random_buf' , required : csprng_backend == ' arc4random_bsd' )
1434
1438
libgit_c_args += ' -DHAVE_ARC4RANDOM_BSD'
1435
- elif compiler.has_function(' getrandom' , prefix : ' #include <sys/random.h>' )
1439
+ csprng_backend = ' arc4random_bsd'
1440
+ elif csprng_backend in [' auto' , ' getrandom' ] and compiler.has_header_symbol(' sys/random.h' , ' getrandom' , required : csprng_backend == ' getrandom' )
1436
1441
libgit_c_args += ' -DHAVE_GETRANDOM'
1437
- elif compiler.has_function(' getentropy' , prefix : ' #include <unistd.h>' )
1442
+ csprng_backend = ' getrandom'
1443
+ elif csprng_backend in [' auto' , ' getentropy' ] and compiler.has_header_symbol(' unistd.h' , ' getentropy' , required : csprng_backend == ' getentropy' )
1438
1444
libgit_c_args += ' -DHAVE_GETENTROPY'
1439
- elif compiler.has_function(' RtlGenRandom' , prefix : ' #include <windows.h>\n #include <ntsecapi.h>' )
1445
+ csprng_backend = ' getentropy'
1446
+ elif csprng_backend in [' auto' , ' rtlgenrandom' ] and compiler.has_header_symbol(' ntsecapi.h' , ' RtlGenRandom' , prefix : ' #include <windows.h>' , required : csprng_backend == ' rtlgenrandom' )
1440
1447
libgit_c_args += ' -DHAVE_RTLGENRANDOM'
1441
- elif openssl.found()
1448
+ csprng_backend = ' rtlgenrandom'
1449
+ elif csprng_backend in [' auto' , ' openssl' ] and openssl.found()
1442
1450
libgit_c_args += ' -DHAVE_OPENSSL_CSPRNG'
1451
+ csprng_backend = ' openssl'
1452
+ elif csprng_backend in [' auto' , ' urandom' ]
1453
+ csprng_backend = ' urandom'
1454
+ else
1455
+ error (' Unsupported CSPRNG backend: ' + csprng_backend)
1443
1456
endif
1444
1457
1445
1458
if get_option (' runtime_prefix' )
@@ -1977,6 +1990,7 @@ summary({
1977
1990
}, section : ' Auto-detected features' )
1978
1991
1979
1992
summary ({
1993
+ ' csprng' : csprng_backend,
1980
1994
' https' : https_backend,
1981
1995
' sha1' : sha1_backend,
1982
1996
' sha1_unsafe' : sha1_unsafe_backend,
0 commit comments