Article View: sci.crypt
Article #1835csh script for interfacing encryption to Mail
From: Carl Ellison
Date: Tue, 17 Nov 1992 21:16
Date: Tue, 17 Nov 1992 21:16
171 lines
5167 bytes
5167 bytes
The following csh script edits an encrypted file, with or without making a
backup copy (<fname>~). I use it with my own private encryption program
(imaginatively named encr and decr). qdecr is a version of decr which
prefixes decrypted lines with ">" quotes. gpw is a small program which
gets a typed password from the terminal (with echo off) and echos it to
stdout.
My decr knows an encrypted portion of a file from a plaintext portion
(eg., like UUDECODE does) -- so decr will decrypt a mixed file (or one
with no encryption). encr, however, encrypts the whole file -- so this
script doesn't re-encrypt just portions of the file.
In my .mailrc, I have the lines:
set EDITOR=mail_eedit
set VISUAL=emacs
so that I can invoke encryption with ~e and straight editing with ~v.
Of course, you don't have to use this for encryption. You can compress
mail or uncompress it at these points, or do any other transformation
you want to on the mail file (as long as it remains transmittable via
SMTP).
Enjoy,
Carl
P.S. I'm not posting my private encryption program but even if I did so,
it would probably be a disservice. Much better secret-key systems are
freely available.
=========================== cut here =======================================
#!/bin/csh -f
# edit an encrypted file, reencrypting the output, possibly with a
# separate password
# if this is called mail_eedit, then don't make the backup copy of $ofile
# before writing it.
# This script uses md5d for verifying password spelling. md5d is md5driver.c
# a public domain wrapper for the
# RSA Data Security, Inc. Message Digest Algorithm # 5
set prog_name = "`echo $0 | sed -e 's,^.*/,,'`"
if ($prog_name == "mail_eedit") then
set decr_name = "qdecr"
else
set decr_name = "decr"
endif
# Use any directory for cryptdir which you protect well enough
# for it to contain temporary copies of plaintext files
set cryptdir = ~/crypt
set passwords = ${cryptdir}/passwords
set tmpfile = ${cryptdir}/cr$$.tmp
set cpyfile = ${cryptdir}/cr$$.cpy
if ($#argv == 0) goto usage_message
if ($argv[1] == "-c") then
switch ($#argv)
case 3:
set ofile = $argv[3]
set ifile = $argv[2]
breaksw
case 2:
set ifile = $argv[2]
set ofile = $ifile
breaksw
default:
goto usage_message
endsw
else
switch ($#argv)
case 2:
set ofile = $argv[2]
set ifile = $argv[1]
breaksw
case 1:
set ifile = $argv[1]
set ofile = $ifile
breaksw
default:
goto usage_message
endsw
endif
# check password against the file of message digests of all passwords
set pw = "`gpw`"
if ("$pw" == "") goto found
set md = `md5d -s"$pw"`
set okm = `cat ${passwords}`
foreach ok ($okm)
if ($md[1] == $ok) goto found
end
echo "Password not known. Re-type it to record it; <CR> to abort."
set pw2 = "`gpw`"
if ("$pw" == "$pw2") goto addit
echo "Mismatch. Password not added."
exit(1)
addit:
echo "$md[1]" >> ${passwords}
found:
if ("$pw" == "") then
cp $ifile ${tmpfile}
else
$decr_name "$pw" <$ifile > ${tmpfile}
endif
cp ${tmpfile} ${cpyfile}
$EEDITOR ${tmpfile}
if ($#argv > 1) goto changeout
if { cmp -s ${tmpfile} ${cpyfile} } goto fini
changeout:
# either $#argv > 1, in which case I'm changing passwords or writing to a
# different file, or the file was changed by the editor
set pwold = "$pw"
if ($argv[1] == "-c") set pw = "`gpw`"
if ("$pw" == "") goto foundout
set md = `md5d -s"$pw"`
set okm = `cat ${passwords}`
foreach ok ($okm)
if ($md[1] == $ok) goto foundout
end
echo "Password not known. Re-type it to record it; <CR> to abort."
set pw2 = "`gpw`"
if ("$pw" == "$pw2") goto additout
echo "Mismatch. Password not added. Using the input password."
set pw = "$pwold"
goto foundout
additout:
echo "$md[1]" >> ${passwords}
foundout:
# we're going to write the $ofile. make a copy first, by renaming it.
# unless this is the mail_eedit version
if ($prog_name != "mail_eedit") mv -f ${ofile} ${ofile}~
if ("$pw" == "") then
cp ${tmpfile} $ofile
else
encr "$pw" < ${tmpfile} >$ofile
endif
fini:
rm ${cryptdir}/cr$$.*
exit(0)
usage_message:
echo "usage: $prog_name [-c] ifile [ofile]"
echo " where -c calls for changing the password"
exit(0)
============================ end of enclosure ===============================
--
-- <<Disclaimer: All opinions expressed are my own, of course.>>
-- Carl Ellison cme@sw.stratus.com
-- Stratus Computer Inc. M3-2-BKW TEL: (508)460-2783
-- 55 Fairbanks Boulevard ; Marlborough MA 01752-1298 FAX: (508)624-7488
Technical Details
Message-ID:
<1ebneoINNn5q@transfer.stratus.com>Path:
arc1-ca.pugleaf.net!sparky!uunet!charon.amdahl.com!pacbell.com!sgiblab!zaphod.mps.ohio-state.edu!pacific.mps.ohio-state.edu!linac!att!bu.edu!transfer.stratus.com!ellisun.sw.stratus.com!cmeShow Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!sparky!uunet!charon.amdahl.com!pacbell.com!sgiblab!zaphod.mps.ohio-state.edu!pacific.mps.ohio-state.edu!linac!att!bu.edu!transfer.stratus.com!ellisun.sw.stratus.com!cme From: cme@ellisun.sw.stratus.com (Carl Ellison) Newsgroups: sci.crypt Subject: csh script for interfacing encryption to Mail Message-ID: <1ebneoINNn5q@transfer.stratus.com> Date: 17 Nov 92 21:16:08 GMT Organization: Stratus Computer, Software Engineering Lines: 171 NNTP-Posting-Host: ellisun.sw.stratus.com