Encrypting Ed(1)
November 5, 2019
Here’s my program, installed in /usr/local/bin/ed, which comes before /usr/bin/ed in my path:
#! /bin/sh
# ed -- add encryption to ed
CMD="/usr/bin/ed"; ENCRYPT="F"
while [ "$(expr substr $1X 1 1)X" = "-X" ]
do case $1 in
-x) ENCRYPT="T"; shift;;
-p) CMD="$CMD $1 $2"; shift; shift;;
*) CMD="$CMD $1"; shift;;
esac
done
if [ "$ENCRYPT" = "F" ]
then $CMD "$*"
else stty -echo
echo -n "Enter password: "
read PASS1
echo ""
echo -n "Repeat password: "
read PASS2
echo ""
stty echo
if [ "$PASS1" != "$PASS2" -o "X$PASS1" = "X" ]
then echo "Password error" >&2; exit 1
fi
echo $PASS1 | ccdecrypt -k - $1
$CMD $1
echo $PASS2 | ccencrypt -k - $1
mv $1.cpt $(basename $1 .cpt)
fi
I did my own getopts processing because, well why not? There is a subtle problem here: If ed properly took an -x flag, it would be possible to create a new file in the editor. But since there is no way to pass the name of a newly-created file to the encryption wrapper, in my program an encrypted file must already exist before it can be editted; it can’t be created in the editor. Still, it allows me to write an edit script for an encrypted file, which is what I set out to do.
You can see the program at https://ideone.com/Tb9QsN, but there’s no way to run it.
By the way, I still use sh for shell scripts. Has the rest of the world moved on to bash?
[…] task is to enhance ed by adding the -x encryption flag. When you are finished, you are welcome to read or run a suggested solution, or to post your own solution or discuss the exercise in the comments […]