From a8cdb4eef83bce8614991f1191f8c8879fda4dc1 Mon Sep 17 00:00:00 2001 From: "K.Takata" Date: Tue, 6 Dec 2022 16:17:01 +0000 Subject: [PATCH] patch 9.0.1023: MS-Windows: dynamic loading of libsodium doesn't work Problem: MS-Windows: dynamic loading of libsodium doesn't work. Solution: Add "randombytes_random". (Ken Takata, closes #11667) --- src/crypt.c | 21 ++++++++++++++++++--- src/evalfunc.c | 4 ++-- src/proto/crypt.pro | 2 ++ src/version.c | 2 ++ 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/crypt.c b/src/crypt.c index b2b50d463..a2740c98a 100644 --- a/src/crypt.c +++ b/src/crypt.c @@ -73,7 +73,7 @@ typedef struct { char_u *p2, int last); } cryptmethod_T; -static int crypt_sodium_init(cryptstate_T *state, char_u *key, char_u *salt, int salt_len, char_u *seed, int seed_len); +static int crypt_sodium_init_(cryptstate_T *state, char_u *key, char_u *salt, int salt_len, char_u *seed, int seed_len); static long crypt_sodium_buffer_decode(cryptstate_T *state, char_u *from, size_t len, char_u **buf_out, int last); static long crypt_sodium_buffer_encode(cryptstate_T *state, char_u *from, size_t len, char_u **buf_out, int last); @@ -145,7 +145,7 @@ static cryptmethod_T cryptmethods[CRYPT_M_COUNT] = { #endif FALSE, NULL, - crypt_sodium_init, + crypt_sodium_init_, NULL, NULL, crypt_sodium_buffer_encode, crypt_sodium_buffer_decode, NULL, NULL, @@ -198,6 +198,7 @@ typedef struct { dll_crypto_secretstream_xchacha20poly1305_pull # define crypto_pwhash dll_crypto_pwhash # define randombytes_buf dll_randombytes_buf +# define randombytes_random dll_randombytes_random static int (*dll_sodium_init)(void) = NULL; static void (*dll_sodium_free)(void *) = NULL; @@ -231,6 +232,7 @@ static int (*dll_crypto_pwhash)(unsigned char * const out, unsigned long long opslimit, size_t memlimit, int alg) = NULL; static void (*dll_randombytes_buf)(void * const buf, const size_t size); +static uint32_t (*dll_randombytes_random)(void); static struct { const char *name; @@ -248,6 +250,7 @@ static struct { {"crypto_secretstream_xchacha20poly1305_pull", (SODIUM_PROC*)&dll_crypto_secretstream_xchacha20poly1305_pull}, {"crypto_pwhash", (SODIUM_PROC*)&dll_crypto_pwhash}, {"randombytes_buf", (SODIUM_PROC*)&dll_randombytes_buf}, + {"randombytes_random", (SODIUM_PROC*)&dll_randombytes_random}, {NULL, NULL} }; @@ -855,7 +858,7 @@ crypt_append_msg( } static int -crypt_sodium_init( +crypt_sodium_init_( cryptstate_T *state UNUSED, char_u *key UNUSED, char_u *salt UNUSED, @@ -1143,6 +1146,18 @@ crypt_sodium_randombytes_buf(void *const buf, const size_t size) { randombytes_buf(buf, size); } + + int +crypt_sodium_init(void) +{ + return sodium_init(); +} + + uint32_t +crypt_sodium_randombytes_random(void) +{ + return randombytes_random(); +} # endif #endif // FEAT_CRYPT diff --git a/src/evalfunc.c b/src/evalfunc.c index 428c4cb2b..84df6a62a 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -8166,8 +8166,8 @@ init_srand(UINT32_T *x) // - reltime() or time() // - XOR with process ID #if defined(FEAT_SODIUM) - if (sodium_init() >= 0) - *x = randombytes_random(); + if (crypt_sodium_init() >= 0) + *x = crypt_sodium_randombytes_random(); else #endif { diff --git a/src/proto/crypt.pro b/src/proto/crypt.pro index 791369491..560e30b8d 100644 --- a/src/proto/crypt.pro +++ b/src/proto/crypt.pro @@ -26,4 +26,6 @@ char_u *crypt_get_key(int store, int twice); void crypt_append_msg(buf_T *buf); int crypt_sodium_munlock(void *const addr, const size_t len); void crypt_sodium_randombytes_buf(void *const buf, const size_t size); +int crypt_sodium_init(void); +uint32_t crypt_sodium_randombytes_random(void); /* vim: set ft=c : */ diff --git a/src/version.c b/src/version.c index d4a3b1bf2..5db72d20d 100644 --- a/src/version.c +++ b/src/version.c @@ -695,6 +695,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1023, /**/ 1022, /**/ -- 2.40.0