forked from aniani/vim
patch 8.2.3245: the crypt key may appear in a swap partition
Problem: The crypt key may appear in a swap partition. Solution: When using xchaha20 use sodium_mlock(). (Christian Brabandt, closes #8657)
This commit is contained in:
@@ -2306,6 +2306,10 @@ free_buf_options(
|
|||||||
clear_string_option(&buf->b_p_fex);
|
clear_string_option(&buf->b_p_fex);
|
||||||
#endif
|
#endif
|
||||||
#ifdef FEAT_CRYPT
|
#ifdef FEAT_CRYPT
|
||||||
|
# ifdef FEAT_SODIUM
|
||||||
|
if (buf->b_p_key != NULL && (crypt_get_method_nr(buf) == CRYPT_M_SOD))
|
||||||
|
sodium_munlock(buf->b_p_key, STRLEN(buf->b_p_key));
|
||||||
|
# endif
|
||||||
clear_string_option(&buf->b_p_key);
|
clear_string_option(&buf->b_p_key);
|
||||||
#endif
|
#endif
|
||||||
clear_string_option(&buf->b_p_kp);
|
clear_string_option(&buf->b_p_kp);
|
||||||
|
17
src/crypt.c
17
src/crypt.c
@@ -12,10 +12,6 @@
|
|||||||
*/
|
*/
|
||||||
#include "vim.h"
|
#include "vim.h"
|
||||||
|
|
||||||
#ifdef FEAT_SODIUM
|
|
||||||
# include <sodium.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(FEAT_CRYPT) || defined(PROTO)
|
#if defined(FEAT_CRYPT) || defined(PROTO)
|
||||||
/*
|
/*
|
||||||
* Optional encryption support.
|
* Optional encryption support.
|
||||||
@@ -447,6 +443,8 @@ crypt_free_state(cryptstate_T *state)
|
|||||||
#ifdef FEAT_SODIUM
|
#ifdef FEAT_SODIUM
|
||||||
if (state->method_nr == CRYPT_M_SOD)
|
if (state->method_nr == CRYPT_M_SOD)
|
||||||
{
|
{
|
||||||
|
sodium_munlock(((sodium_state_T *)state->method_state)->key,
|
||||||
|
crypto_box_SEEDBYTES);
|
||||||
sodium_memzero(state->method_state, sizeof(sodium_state_T));
|
sodium_memzero(state->method_state, sizeof(sodium_state_T));
|
||||||
sodium_free(state->method_state);
|
sodium_free(state->method_state);
|
||||||
}
|
}
|
||||||
@@ -726,6 +724,7 @@ crypt_sodium_init(
|
|||||||
// crypto_box_SEEDBYTES == crypto_secretstream_xchacha20poly1305_KEYBYTES
|
// crypto_box_SEEDBYTES == crypto_secretstream_xchacha20poly1305_KEYBYTES
|
||||||
unsigned char dkey[crypto_box_SEEDBYTES]; // 32
|
unsigned char dkey[crypto_box_SEEDBYTES]; // 32
|
||||||
sodium_state_T *sd_state;
|
sodium_state_T *sd_state;
|
||||||
|
int retval = 0;
|
||||||
|
|
||||||
if (sodium_init() < 0)
|
if (sodium_init() < 0)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@@ -743,6 +742,16 @@ crypt_sodium_init(
|
|||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
memcpy(sd_state->key, dkey, crypto_box_SEEDBYTES);
|
memcpy(sd_state->key, dkey, crypto_box_SEEDBYTES);
|
||||||
|
|
||||||
|
retval += sodium_mlock(sd_state->key, crypto_box_SEEDBYTES);
|
||||||
|
retval += sodium_mlock(key, STRLEN(key));
|
||||||
|
|
||||||
|
if (retval < 0)
|
||||||
|
{
|
||||||
|
emsg(_(e_encryption_sodium_mlock_failed));
|
||||||
|
sodium_free(sd_state);
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
sd_state->count = 0;
|
sd_state->count = 0;
|
||||||
state->method_state = sd_state;
|
state->method_state = sd_state;
|
||||||
|
|
||||||
|
@@ -641,3 +641,5 @@ EXTERN char e_list_or_dict_or_blob_required_for_argument_nr[]
|
|||||||
INIT(= N_("E1228: List or Dictionary or Blob required for argument %d"));
|
INIT(= N_("E1228: List or Dictionary or Blob required for argument %d"));
|
||||||
EXTERN char e_expected_dictionary_for_using_key_str_but_got_str[]
|
EXTERN char e_expected_dictionary_for_using_key_str_but_got_str[]
|
||||||
INIT(= N_("E1229: Expected dictionary for using key \"%s\", but got %s"));
|
INIT(= N_("E1229: Expected dictionary for using key \"%s\", but got %s"));
|
||||||
|
EXTERN char e_encryption_sodium_mlock_failed[]
|
||||||
|
INIT(= N_("E1230: encryption: sodium_mlock() failed"));
|
||||||
|
@@ -13,10 +13,6 @@
|
|||||||
|
|
||||||
#include "vim.h"
|
#include "vim.h"
|
||||||
|
|
||||||
#ifdef FEAT_SODIUM
|
|
||||||
# include <sodium.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__TANDEM)
|
#if defined(__TANDEM)
|
||||||
# include <limits.h> // for SSIZE_MAX
|
# include <limits.h> // for SSIZE_MAX
|
||||||
#endif
|
#endif
|
||||||
|
@@ -48,11 +48,6 @@
|
|||||||
# include <time.h>
|
# include <time.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// for randombytes_buf
|
|
||||||
#ifdef FEAT_SODIUM
|
|
||||||
# include <sodium.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(SASC) || defined(__amigaos4__)
|
#if defined(SASC) || defined(__amigaos4__)
|
||||||
# include <proto/dos.h> // for Open() and Close()
|
# include <proto/dos.h> // for Open() and Close()
|
||||||
#endif
|
#endif
|
||||||
|
@@ -755,6 +755,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
3245,
|
||||||
/**/
|
/**/
|
||||||
3244,
|
3244,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -486,6 +486,10 @@ typedef unsigned int u8char_T; // int is 32 bits or more
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_SODIUM
|
||||||
|
# include <sodium.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
// ================ end of the header file puzzle ===============
|
// ================ end of the header file puzzle ===============
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user