Skip to content

Commit 97708a9

Browse files
committed
Internalize transcrypt crypt functions
At the moment, the crypt functions are initialized and permanently set to whatever the version of transcrypt the user is using contains. This means updates to these scripts are never propagated out to existing users. This commit moves the crypt functions into transcrypt itself, which should allow for more transparent updates to the scripts to be propagated out to users.
1 parent 12f2c9d commit 97708a9

File tree

2 files changed

+157
-111
lines changed

2 files changed

+157
-111
lines changed

sensitive_file

Lines changed: 93 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,93 @@
1-
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
40-
L/aeTVBw2BnDs2K48meuFw==
1+
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

transcrypt

Lines changed: 64 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -268,92 +268,68 @@ stage_rekeyed_files() {
268268
fi
269269
}
270270

271-
# save helper scripts under the repository's git directory
272-
save_helper_scripts() {
273-
mkdir -p "${GIT_DIR}/crypt"
274-
275-
# The `decryption -> encryption` process on an unchanged file must be
276-
# deterministic for everything to work transparently. To do that, the same
277-
# salt must be used each time we encrypt the same file. An HMAC has been
278-
# proven to be a PRF, so we generate an HMAC-SHA256 for each decrypted file
279-
# (keyed with a combination of the filename and transcrypt password), and
280-
# then use the last 16 bytes of that HMAC for the file's unique salt.
281-
282-
cat <<-'EOF' >"${GIT_DIR}/crypt/clean"
283-
#!/usr/bin/env bash
284-
filename=$1
285-
# ignore empty files
286-
if [[ -s $filename ]]; then
287-
# cache STDIN to test if it's already encrypted
288-
tempfile=$(mktemp 2>/dev/null || mktemp -t tmp)
289-
trap 'rm -f "$tempfile"' EXIT
290-
tee "$tempfile" &>/dev/null
291-
# the first bytes of an encrypted file are always "Salted" in Base64
292-
read -n 8 firstbytes <"$tempfile"
293-
if [[ $firstbytes == "U2FsdGVk" ]]; then
294-
cat "$tempfile"
295-
else
296-
cipher=$(git config --get --local transcrypt.cipher)
297-
password=$(git config --get --local transcrypt.password)
298-
salt=$(openssl dgst -hmac "${filename}:${password}" -sha256 "$filename" | tr -d '\r\n' | tail -c 16)
299-
ENC_PASS=$password openssl enc -$cipher -md MD5 -pass env:ENC_PASS -e -a -S "$salt" -in "$tempfile"
300-
fi
301-
fi
302-
EOF
303-
304-
cat <<-'EOF' >"${GIT_DIR}/crypt/smudge"
305-
#!/usr/bin/env bash
271+
# The `decryption -> encryption` process on an unchanged file must be
272+
# deterministic for everything to work transparently. To do that, the same
273+
# salt must be used each time we encrypt the same file. An HMAC has been
274+
# proven to be a PRF, so we generate an HMAC-SHA256 for each decrypted file
275+
# (keyed with a combination of the filename and transcrypt password), and
276+
# then use the last 16 bytes of that HMAC for the file's unique salt.
277+
crypt_clean() {
278+
filename=$1
279+
# ignore empty files
280+
if [[ -s $filename ]]; then
281+
# cache STDIN to test if it's already encrypted
306282
tempfile=$(mktemp 2>/dev/null || mktemp -t tmp)
307283
trap 'rm -f "$tempfile"' EXIT
308-
cipher=$(git config --get --local transcrypt.cipher)
309-
password=$(git config --get --local transcrypt.password)
310-
tee "$tempfile" | ENC_PASS=$password openssl enc -$cipher -md MD5 -pass env:ENC_PASS -d -a 2>/dev/null || cat "$tempfile"
311-
EOF
312-
313-
cat <<-'EOF' >"${GIT_DIR}/crypt/textconv"
314-
#!/usr/bin/env bash
315-
filename=$1
316-
# ignore empty files
317-
if [[ -s $filename ]]; then
318-
cipher=$(git config --get --local transcrypt.cipher)
319-
password=$(git config --get --local transcrypt.password)
320-
ENC_PASS=$password openssl enc -$cipher -md MD5 -pass env:ENC_PASS -d -a -in "$filename" 2>/dev/null || cat "$filename"
284+
tee "$tempfile" &>/dev/null
285+
# the first bytes of an encrypted file are always "Salted" in Base64
286+
read -r -n 8 firstbytes <"$tempfile"
287+
if [[ $firstbytes == "U2FsdGVk" ]]; then
288+
cat "$tempfile"
289+
else
290+
cipher=$(git config --get --local transcrypt.cipher)
291+
password=$(git config --get --local transcrypt.password)
292+
salt=$(openssl dgst -hmac "${filename}:${password}" -sha256 "$filename" | tr -d '\r\n' | tail -c 16)
293+
ENC_PASS=$password openssl enc "-${cipher}" -md MD5 -pass env:ENC_PASS -e -a -S "$salt" -in "$tempfile"
321294
fi
322-
EOF
295+
fi
296+
}
323297

324-
# make scripts executable
325-
for script in {clean,smudge,textconv}; do
326-
chmod 0755 "${GIT_DIR}/crypt/${script}"
327-
done
298+
crypt_smudge() {
299+
tempfile=$(mktemp 2>/dev/null || mktemp -t tmp)
300+
trap 'rm -f "$tempfile"' EXIT
301+
cipher=$(git config --get --local transcrypt.cipher)
302+
password=$(git config --get --local transcrypt.password)
303+
tee "$tempfile" | ENC_PASS=$password openssl enc "-${cipher}" -md MD5 -pass env:ENC_PASS -d -a 2>/dev/null || cat "$tempfile"
304+
}
305+
306+
crypt_textconv() {
307+
filename=$1
308+
# ignore empty files
309+
if [[ -s $filename ]]; then
310+
cipher=$(git config --get --local transcrypt.cipher)
311+
password=$(git config --get --local transcrypt.password)
312+
ENC_PASS=$password openssl enc "-${cipher}" -md MD5 -pass env:ENC_PASS -d -a -in "$filename" 2>/dev/null || cat "$filename"
313+
fi
328314
}
329315

330316
# write the configuration to the repository's git config
331317
save_configuration() {
332-
save_helper_scripts
318+
# This directory is used by transcrypt as a working directory.
319+
mkdir -p "${GIT_DIR}/crypt"
333320

334321
# write the encryption info
335322
git config transcrypt.version "$VERSION"
336323
git config transcrypt.cipher "$cipher"
337324
git config transcrypt.password "$password"
338325

339326
# write the filter settings
340-
if [[ -d $(git rev-parse --git-common-dir) ]]; then
341-
# this allows us to support multiple working trees via git-worktree
342-
# ...but the --git-common-dir flag was only added in November 2014
343-
# shellcheck disable=SC2016
344-
git config filter.crypt.clean '"$(git rev-parse --git-common-dir)"/crypt/clean %f'
345-
# shellcheck disable=SC2016
346-
git config filter.crypt.smudge '"$(git rev-parse --git-common-dir)"/crypt/smudge'
347-
# shellcheck disable=SC2016
348-
git config diff.crypt.textconv '"$(git rev-parse --git-common-dir)"/crypt/textconv'
349-
else
350-
# shellcheck disable=SC2016
351-
git config filter.crypt.clean '"$(git rev-parse --git-dir)"/crypt/clean %f'
352-
# shellcheck disable=SC2016
353-
git config filter.crypt.smudge '"$(git rev-parse --git-dir)"/crypt/smudge'
354-
# shellcheck disable=SC2016
355-
git config diff.crypt.textconv '"$(git rev-parse --git-dir)"/crypt/textconv'
356-
fi
327+
# shellcheck disable=SC2016
328+
git config filter.crypt.clean "$0 --crypt-clean %f"
329+
# shellcheck disable=SC2016
330+
git config filter.crypt.smudge "$0 --crypt-smudge"
331+
# shellcheck disable=SC2016
332+
git config diff.crypt.textconv "$0 --crypt-textconv"
357333
git config filter.crypt.required 'true'
358334
git config diff.crypt.cachetextconv 'true'
359335
git config diff.crypt.binary 'true'
@@ -466,6 +442,8 @@ uninstall_transcrypt() {
466442
clean_gitconfig
467443

468444
# remove helper scripts
445+
# This is obsolete, but we should keep it to clean up these
446+
# scripts from old versions of transcrypt.
469447
for script in {clean,smudge,textconv}; do
470448
[[ ! -f "${GIT_DIR}/crypt/${script}" ]] || rm "${GIT_DIR}/crypt/${script}"
471449
done
@@ -800,6 +778,21 @@ while [[ "${1:-}" != '' ]]; do
800778
--import-gpg=*)
801779
gpg_import_file=${1#*=}
802780
;;
781+
--crypt-clean)
782+
shift
783+
crypt_clean "$1"
784+
exit 0
785+
;;
786+
--crypt-smudge)
787+
shift
788+
crypt_smudge
789+
exit 0
790+
;;
791+
--crypt-textconv)
792+
shift
793+
crypt_textconv "$1"
794+
exit 0
795+
;;
803796
-v | --version)
804797
printf 'transcrypt %s\n' "$VERSION"
805798
exit 0

0 commit comments

Comments
 (0)