You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by rn...@apache.org on 2022/06/13 18:04:43 UTC
[couchdb] 05/05: include filepath in key manager callbacks
This is an automated email from the ASF dual-hosted git repository.
rnewson pushed a commit to branch database_encryption
in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit 64a8bb3b07c80ad1885af325c4f03762895d02a4
Author: Robert Newson <rn...@apache.org>
AuthorDate: Tue May 24 16:06:35 2022 +0100
include filepath in key manager callbacks
---
src/aegis/src/aegis_key_manager.erl | 16 ++++++++--------
src/aegis/src/aegis_key_manager_config.erl | 12 +++++++-----
src/aegis/src/aegis_key_manager_noop.erl | 8 ++++----
src/couch/src/couch_file.erl | 21 +++++++++++++--------
4 files changed, 32 insertions(+), 25 deletions(-)
diff --git a/src/aegis/src/aegis_key_manager.erl b/src/aegis/src/aegis_key_manager.erl
index 353b3cd65..de7bf3808 100644
--- a/src/aegis/src/aegis_key_manager.erl
+++ b/src/aegis/src/aegis_key_manager.erl
@@ -13,24 +13,24 @@
-module(aegis_key_manager).
-export([
- wrap_key/1,
- unwrap_key/1
+ wrap_key/2,
+ unwrap_key/2
]).
-type dek() :: binary().
-type wek() :: binary().
--callback wrap_key(DataEncryptionKey :: dek()) ->
+-callback wrap_key(Filepath :: binary(), DataEncryptionKey :: dek()) ->
{ok, WrappedKey :: wek()}
| dont_encrypt
| {error, Reason :: term()}.
--callback unwrap_key(WrappedKey :: wek()) ->
+-callback unwrap_key(Filepath :: binary(), WrappedKey :: wek()) ->
{ok, DataEncryptionKey :: dek()}
| {error, Reason :: term()}.
-wrap_key(DataEncryptionKey) ->
- ?AEGIS_KEY_MANAGER:wrap_key(DataEncryptionKey).
+wrap_key(Filepath, DataEncryptionKey) ->
+ ?AEGIS_KEY_MANAGER:wrap_key(Filepath, DataEncryptionKey).
-unwrap_key(WrappedKey) ->
- ?AEGIS_KEY_MANAGER:unwrap_key(WrappedKey).
+unwrap_key(Filepath, WrappedKey) ->
+ ?AEGIS_KEY_MANAGER:unwrap_key(Filepath, WrappedKey).
diff --git a/src/aegis/src/aegis_key_manager_config.erl b/src/aegis/src/aegis_key_manager_config.erl
index a52de335a..a1c8cefbf 100644
--- a/src/aegis/src/aegis_key_manager_config.erl
+++ b/src/aegis/src/aegis_key_manager_config.erl
@@ -14,16 +14,18 @@
-behaviour(aegis_key_manager).
-export([
- wrap_key/1,
- unwrap_key/1
+ wrap_key/2,
+ unwrap_key/2
]).
-wrap_key(DataEncryptionKey) when is_binary(DataEncryptionKey) ->
+wrap_key(_Filepath, DataEncryptionKey) when is_binary(DataEncryptionKey) ->
{ok, WrappingKeyId, WrappingKey} = current_wrapping_key(),
WrappedKey = aegis:wrap_key(WrappingKey, [WrappingKeyId], DataEncryptionKey),
{ok, <<(byte_size(WrappingKeyId)):8, WrappingKeyId/binary, WrappedKey/binary>>}.
-unwrap_key(<<WrappingKeyIdLen:8, WrappingKeyId:WrappingKeyIdLen/binary, WrappedKey/binary>>) ->
+unwrap_key(
+ _Filepath, <<WrappingKeyIdLen:8, WrappingKeyId:WrappingKeyIdLen/binary, WrappedKey/binary>>
+) ->
case wrapping_key(WrappingKeyId) of
{ok, WrappingKeyId, WrappingKey} ->
case aegis:unwrap_key(WrappingKey, [WrappingKeyId], WrappedKey) of
@@ -35,7 +37,7 @@ unwrap_key(<<WrappingKeyIdLen:8, WrappingKeyId:WrappingKeyIdLen/binary, WrappedK
{error, Reason} ->
{error, Reason}
end;
-unwrap_key(_) ->
+unwrap_key(_, _) ->
{error, invalid_key}.
current_wrapping_key() ->
diff --git a/src/aegis/src/aegis_key_manager_noop.erl b/src/aegis/src/aegis_key_manager_noop.erl
index 757dfd183..8e1a3f540 100644
--- a/src/aegis/src/aegis_key_manager_noop.erl
+++ b/src/aegis/src/aegis_key_manager_noop.erl
@@ -14,12 +14,12 @@
-behaviour(aegis_key_manager).
-export([
- wrap_key/1,
- unwrap_key/1
+ wrap_key/2,
+ unwrap_key/2
]).
-wrap_key(_DataEncryptionKey) ->
+wrap_key(_Filepath, _DataEncryptionKey) ->
dont_encrypt.
-unwrap_key(_DataEncryptionKey) ->
+unwrap_key(_Filepath, _DataEncryptionKey) ->
{error, encryption_not_supported}.
diff --git a/src/couch/src/couch_file.erl b/src/couch/src/couch_file.erl
index 888c665ea..153dbd422 100644
--- a/src/couch/src/couch_file.erl
+++ b/src/couch/src/couch_file.erl
@@ -469,7 +469,9 @@ init({Filepath, Options, ReturnPid, Ref}) ->
ok = file:sync(Fd),
maybe_track_open_os_files(Options),
erlang:send_after(?INITIAL_WAIT, self(), maybe_close),
- init_crypto(#file{fd = Fd, is_sys = IsSys, pread_limit = Limit});
+ init_crypto(Filepath, #file{
+ fd = Fd, is_sys = IsSys, pread_limit = Limit
+ });
false ->
ok = file:close(Fd),
init_status_error(ReturnPid, Ref, {error, eexist})
@@ -477,7 +479,9 @@ init({Filepath, Options, ReturnPid, Ref}) ->
false ->
maybe_track_open_os_files(Options),
erlang:send_after(?INITIAL_WAIT, self(), maybe_close),
- init_crypto(#file{fd = Fd, is_sys = IsSys, pread_limit = Limit})
+ init_crypto(Filepath, #file{
+ fd = Fd, is_sys = IsSys, pread_limit = Limit
+ })
end;
Error ->
init_status_error(ReturnPid, Ref, Error)
@@ -494,7 +498,7 @@ init({Filepath, Options, ReturnPid, Ref}) ->
maybe_track_open_os_files(Options),
{ok, Eof} = file:position(Fd, eof),
erlang:send_after(?INITIAL_WAIT, self(), maybe_close),
- init_crypto(#file{
+ init_crypto(Filepath, #file{
fd = Fd, eof = Eof, is_sys = IsSys, pread_limit = Limit
});
Error ->
@@ -599,7 +603,8 @@ handle_call({truncate, Pos}, _From, #file{fd = Fd} = File) ->
{ok, Pos} = file:position(Fd, Pos),
case file:truncate(Fd) of
ok ->
- case init_crypto(File#file{eof = Pos}) of
+ {_Fd, Filepath} = get(couch_file_fd),
+ case init_crypto(Filepath, File#file{eof = Pos}) of
{ok, File1} ->
{reply, ok, File1};
{error, Reason} ->
@@ -943,10 +948,10 @@ reset_eof(#file{} = File) ->
File#file{eof = Eof}.
%% new file or we've wiped all the data, including the wrapped key, so we need a new one.
-init_crypto(#file{eof = 0} = File0) ->
+init_crypto(Filepath, #file{eof = 0} = File0) ->
DataEncryptionKey = crypto:strong_rand_bytes(32),
IV = crypto:strong_rand_bytes(16),
- case aegis_key_manager:wrap_key(DataEncryptionKey) of
+ case aegis_key_manager:wrap_key(Filepath, DataEncryptionKey) of
{ok, WrappedKey} ->
case write_encryption_header(File0, WrappedKey, IV) of
{ok, File1} ->
@@ -961,10 +966,10 @@ init_crypto(#file{eof = 0} = File0) ->
{error, Reason}
end;
%% we're opening an existing file and need to unwrap the key if file is encrypted.
-init_crypto(#file{eof = Pos, key = undefined} = File) when Pos > 0 ->
+init_crypto(Filepath, #file{eof = Pos, key = undefined} = File) when Pos > 0 ->
case read_encryption_header(File) of
{ok, WrappedKey, IV} ->
- case aegis_key_manager:unwrap_key(WrappedKey) of
+ case aegis_key_manager:unwrap_key(Filepath, WrappedKey) of
{ok, DataEncryptionKey} ->
{ok, init_crypto(File, DataEncryptionKey, IV)};
{error, Reason} ->