Package: cryptsetup
Version: 20050111-3
Severity: wishlist
Tags: patch

Hi 

I have prepared some patches to introduce two new option for /etc/crypttab
and /etc/init.d/cryptdisks; this is the explanation from the man page

       check     check the content of the device by suitable program;  if  the
                 check  fails  the  device  is removed; if the retry option is
                 given, the creation is repeated.  If a program is provided as
                 argument,  it  is  run,  using  the decrypted volume as first
                 argument.  The default program  is  /sbin/e2label,  which  is
                 suitable  to  check  that  a  EXT2  or  EXT3  is a accessible
                 throught the device.

       retry     If the device creation fails, or if the check program  fails,
                 remove  the  device,  and  try  again to create it: if key is
                 "none" this will ask  for  the  password  again.  The  option
                 specifies how many times to repeat.


I find the check option very useful: I mount /home from an encrypted device;
when occasionally I typed the wrong password, /etc/rcS.d/S26cryptdisk 
would mount an unusable device, and fsck in /etc/rcS.d/S30checkfs.sh
would stop the boot claiming that the device is damaged
(which is somewhat misleading).

For that reason I used to use the 'verify' option, but I dont find convenient
to type the pass twice: it is very long. Moreover, why should I
verify the password, when a program can verify it?

The retry,check option may be useful also for people who keep the password
in a file, but that access the device from some device which may be temporarily
unavailable (as an externally powered disk): in this case,
cryptdisks would retry until  it can access the disk.

In testing my patches, I found and corrected a bug in the parsing of the
options in crypttab (in version 20050111-2):
 if an option does not have a value, the variable VALUE should be empty,
but it is not.

a.


-- System Information:
Debian Release: 3.1
  APT prefers testing
  APT policy: (650, 'testing')
Architecture: i386 (i686)
Kernel: Linux 2.6.9eta-k7
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)

Versions of packages cryptsetup depends on:
ii  dmsetup                     2:1.00.19-2  The Linux Kernel Device Mapper use
ii  libc6                       2.3.2.ds1-20 GNU C Library: Shared libraries an
ii  libdevmapper1.00            2:1.00.19-2  The Linux Kernel Device Mapper use
ii  libgcrypt11                 1.2.0-4      LGPL Crypto library - runtime libr
ii  libgpg-error0               1.0-1        library for common error values an
ii  libpopt0                    1.7-5        lib for parsing cmdline parameters

-- no debconf information

-- 
Andrea Mennucc
 "E' un mondo difficile. Che vita intensa!" (Tonino Carotone)
Format: 1.0
Source: cryptsetup
Version: 20050111-3
Binary: cryptsetup
Maintainer: Wesley W. Terpstra (Debian) <[EMAIL PROTECTED]>
Architecture: any
Standards-Version: 3.6.1.0
Build-Depends: debhelper (>= 4.0.0), libgcrypt11-dev, libdevmapper-dev, 
libpopt-dev, docbook-to-man, gettext, libtool, autoconf, automake1.8, cvs
Files: 
 956bd7f7d0572341f83c0d8f68bbb095 16690 cryptsetup_20050111.orig.tar.gz
 bb7e23d9e43c6826646f82537258cf52 22606 cryptsetup_20050111-3.diff.gz

Attachment: cryptsetup_20050111-3.diff.gz
Description: Binary data

diff -ur cryptsetup-20050111/debian/changelog 
cryptsetup-20050111-3/debian/changelog
--- cryptsetup-20050111/debian/changelog        2005-01-15 13:06:12.000000000 
+0100
+++ cryptsetup-20050111-3/debian/changelog      2005-01-15 12:26:13.000000000 
+0100
@@ -1,3 +1,10 @@
+cryptsetup (20050111-3) unstable; urgency=low
+
+  * new options check, retry, in crypytab
+  * corrected error in cryptdisks when parsing options w/o values
+
+ -- A Mennucc <[EMAIL PROTECTED]>  Sat, 15 Jan 2005 12:26:13 +0100
+
 cryptsetup (20050111-2) unstable; urgency=low
 
   * autogen.sh calls autopoint (gettext), which needs cvs
diff -ur cryptsetup-20050111/debian/cryptdisks 
cryptsetup-20050111-3/debian/cryptdisks
--- cryptsetup-20050111/debian/cryptdisks       2005-01-15 13:06:12.000000000 
+0100
+++ cryptsetup-20050111-3/debian/cryptdisks     2005-01-15 12:12:49.000000000 
+0100
@@ -57,54 +57,86 @@
                        PARAMS=""
                        MAKESWAP=""
                        SKIP=""
+                       RETRY=no
+                       CHECK=""
 
                        # Parse the options field, convert to cryptsetup 
parameters
                         # and contruct the command line
                        while test "x$opt" != "x" ; do
-                               ARG=`echo $opt | sed "s/,.*//"`
+                               ARG=${opt/,*}
                                opt=${opt##$ARG}
                                opt=${opt##,}
-                               PARAM=`echo $ARG | sed "s/=.*//"`
-                               VALUE=${ARG##$PARAM=}
-                               
-                               case "$PARAM" in 
+                               case $ARG in 
+                                   *=*) 
+                                       OPTION=${ARG/=*}
+                                       VALUE=${ARG##$OPTION=}
+                                       ;;
+                                   *)
+                                       OPTION=$ARG
+                                       VALUE=""
+                               esac
+                               # test: echo OPTION $OPTION  VALUE $VALUE
+                               case "$OPTION" in 
                                        readonly)
-                                               PARAM=-r
-                                               VALUE=""
+                                               PARAMS="$PARAMS -r"
                                                ;;
                                        cipher)
-                                               PARAM=-c
+                                               PARAMS="$PARAMS -c $VALUE"
                                                if test "x$VALUE" = "x" ; then
                                                        echo " - no value for 
cipher option, skipping" >&2
                                                        SKIP="yes"
                                                fi
                                                ;;
                                        size)
-                                               PARAM=-s
+                                               PARAMS="$PARAMS -s $VALUE"
                                                if test "x$VALUE" = "x" ; then
                                                        echo " - no value for 
size option, skipping" >&2
                                                        SKIP="yes"
                                                fi
                                                ;;
                                        hash)
-                                               PARAM=-h
+                                               PARAMS="$PARAMS -h $VALUE"
                                                if test "x$VALUE" = "x" ; then
                                                        echo " - no value for 
hash option, skipping" >&2
                                                        SKIP=yes
                                                fi
                                                ;;
                                        verify)
-                                               PARAM=-y
-                                               VALUE=""
+                                               PARAMS="$PARAMS -y"
+                                               ;;
+                                       check)
+                                               if test "x$VALUE" = "x" ; then
+                                                   CHECK="$CRYPTDISKS_CHECK"
+                                               else
+                                                   CHECK="$VALUE"
+                                               fi
+                                               ;;
+                                       retry)
+                                               if test "x$VALUE" = "x" ; then
+                                                   RETRY="$CRYPTDISKS_RETRY"
+                                               else
+                                                   RETRY="$VALUE"
+                                               fi
                                                ;;
                                        swap)
                                                MAKESWAP=yes
-                                               PARAM=""
-                                               VALUE=""
+                                               ;;
+                                         *)
+                                       echo " - option '$OPTION' unknown, 
skipping $dst -" >&2
+                                       SKIP=yes
                                esac
-                               PARAMS="$PARAMS $PARAM $VALUE"
                        done
 
+                       if [ "$RETRY" != "no" ] ; then
+                           case "$RETRY" in 
+                               [0-9]*) ;;
+                               *)
+                                   echo " - option RETRY is wrongly set to 
$RETRY - forced to 'no' " >&2
+                                   RETRY=no
+                                   ;;
+                           esac
+                       fi
+
                        # Set up loopback devices
                        if test -f "$src" ; then
                                test -d /sys/block/loop0 || modprobe loop || 
SKIP=yes
@@ -127,12 +159,29 @@
                                continue
                        fi
 
-                       if test "x$INTERACTIVE" = "xyes" ; then
+                       while [ "x$RETRY" = xno ]  || [ "$RETRY" -gt 0 ] ; do
+                         if test "x$INTERACTIVE" = "xyes" ; then
                                $CRYPTCMD $PARAMS create $dst $src <&1
-                       else
+                               RESULT=$?
+                         else
                                $CRYPTCMD $PARAMS -d $key create $dst $src
-                       fi
-
+                               RESULT=$?
+                         fi
+                         # test : echo RESULT $RESULT
+                         if [ $RESULT = 0 ] ; then
+                             [ "$CHECK" = ""  ] && break  
+                             if  $CHECK $MAPPER/$dst ; then
+                                 break
+                             else
+                                 $CRYPTCMD  remove $dst
+                                 echo " - '$CHECK $MAPPER/$dst' failed - the 
device $dst is removed. " >&2
+                                 sleep 1
+                             fi
+                         fi
+                         test "x$RETRY" = xno && break
+                         RETRY=`expr $RETRY - 1`
+                         [ $RETRY -gt 0 ] && echo " - retrying for $dst - "
+                       done
                        if test "x$MAKESWAP" = "xyes" && test -b $MAPPER/$dst; 
then
                                mkswap $MAPPER/$dst 2>/dev/null >/dev/null
                        fi
diff -ur cryptsetup-20050111/debian/cryptdisks.default 
cryptsetup-20050111-3/debian/cryptdisks.default
--- cryptsetup-20050111/debian/cryptdisks.default       2005-01-15 
13:06:12.000000000 +0100
+++ cryptsetup-20050111-3/debian/cryptdisks.default     2005-01-14 
14:18:43.000000000 +0100
@@ -1,2 +1,6 @@
 # Run cryptdisks at startup ?
 CRYPTDISKS_ENABLE=Yes
+# Default check program
+CRYPTDISKS_CHECK=/sbin/e2label
+# How many times to ask for the password if the check fails
+CRYPTDISKS_RETRY=3
diff -ur cryptsetup-20050111/debian/crypttab.sgml 
cryptsetup-20050111-3/debian/crypttab.sgml
--- cryptsetup-20050111/debian/crypttab.sgml    2005-01-15 13:06:12.000000000 
+0100
+++ cryptsetup-20050111-3/debian/crypttab.sgml  2005-01-15 12:43:54.000000000 
+0100
@@ -84,7 +84,8 @@
 
 If the <replaceable>key file</replaceable> is empty or the string
 <literal>none</literal>, the key data (ie. a password) will be read
-interactively from the console.
+interactively from the console. In this case, the options 
+<literal>check</literal> and <literal>retry</literal> may be quite useful.
     </para>
 
     <para>The fourth field <replaceable>options</replaceable>
@@ -119,6 +120,31 @@
         </listitem>
       </varlistentry>
       <varlistentry>
+        <term><literal>check</literal></term>
+        <listitem>
+          <para>check the content of the device by suitable program;
+         if the check fails the device is removed; if the
+         <literal>retry</literal> option is given, the 
+         creation is repeated.
+          If a program is provided as argument, it is run, 
+         using the decrypted volume as first argument.
+         The default program is /sbin/e2label,
+         which is suitable to check that a EXT2 or EXT3 is a accessible
+         throught the device.
+         </para>
+        </listitem>
+       </varlistentry>
+      <varlistentry>
+        <term><literal>retry</literal></term>
+       <listitem><para>
+       If the device creation fails, or if the check program fails,
+       remove the device, and try again to
+       create it: if <literal>key</literal> is "none"
+       this will ask for the password again. The 
+       option specifies how many times to repeat.</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
         <term><literal>readonly</literal></term>
         <listitem>
           <para>The backing device is read-only (eg: a dvd).</para>
Only in cryptsetup-20050111-3/lib: .deps
Only in cryptsetup-20050111-3: manifest
Only in cryptsetup-20050111-3/po: cryptsetup.pot
Only in cryptsetup-20050111-3/po: stamp-po
Only in cryptsetup-20050111-3/src: .deps

Attachment: signature.asc
Description: Digital signature

Reply via email to