chiark / gitweb /
cryptop.list: Look for correct delimiter when fixing up key labels.
[distorted-keys] / keys.reveal
index a1c0242..c0b2a58 100755 (executable)
@@ -28,90 +28,76 @@ case "${KEYSLIB+t}" in t) ;; *) echo >&2 "$0: KEYSLIB unset"; exit 1 ;; esac
 . "$KEYSLIB"/keyfunc.sh
 
 defhelp <<HELP
-RECOV KEEPER [NUB]
+[-i INST] RECOV KEEPER
 Reveal a share of a recovery key distributed among keepers.
 
 If enough shares have been revealed, reconstruct the recovery private key.
-The keeper nub is read from NUB, or stdin if NUB is omitted or \`-'.
+The keeper nub is read from stdin.
 HELP
 
 ## Parse the command line.
-case $# in
-  2) if [ -t 0 ]; then echo >&2 "$quis: stdin is a terminal"; exit 1; fi ;;
-  3) ;;
-  *) usage_err ;;
-esac
+inst=current
+while getopts "i:" opt; do
+  case "$opt" in
+    i) inst=$OPTARG ;;
+    *) usage_err ;;
+  esac
+done
+shift $(( $OPTIND - 1 ))
+case $# in 2) ;; *) usage_err ;; esac
 recov=$1 keeper=$2; shift 2
-checklabel "recovery key" "$recov"
-case "$recov" in
-  */*) ;;
-  *) recov=$recov/current ;;
-esac
+checkword "recovery instance" "$inst"
+checkword "recovery key" "$recov"
 checkword "keeper set label" "$keeper"
 
 ## Check that this is a sensible thing to do.
-if [ ! -f $KEYS/keeper/$keeper/meta ]; then
+keepdir=$KEYS/keeper/$keeper
+if [ ! -f $keepdir/meta ]; then
   echo >&2 "$quis: unknown keeper set \`$keeper'"
   exit 1
 fi
-if [ ! -d $KEYS/recov/$recov ]; then
+if [ ! -h $KEYS/recov/$recov/current ]; then
   echo >&2 "$quis: unknown recovery key \`$recov'"
   exit 1
 fi
-if [ ! -f $KEYS/recov/$recov/$keeper.param ]; then
+rdir=$KEYS/recov/$recov/$inst
+if [ ! -f $rdir/$keeper.param ]; then
   echo >&2 "$quis: recovery key \`$recov' not kept by keeper set \`$keeper'"
   exit 1
 fi
 
 ## Grab the key, because we'll need to read it several times.
 mktmp
-cat -- "$@" >$tmp/secret
+cat >$tmp/secret
 
 ## Read the threshold from the recovery metadata.
-read param <$KEYS/recov/$recov/$keeper.param
-case "$param" in
-  shamir-params:*) ;;
-  *)
-    echo >&2 "$quis: secret sharing parameter file damaged (wrong header)"
-    exit 1
-    ;;
-esac
-t=";${param#*:}"
-case "$t" in
-  *";t="*) ;;
-  *)
-    echo >&2 "$quis: secret sharing parameter file damaged (missing t)"
-    exit 1
-    ;;
-esac
-t=${t#*;t=}
-t=${t%%;*}
+t=$(sharethresh $rdir/$keeper.param)
 
 ## Find out which keeper index it corresponds to.
-read n hunoz <$KEYS/keeper/$keeper/meta
+read n hunoz <$keepdir/meta
 i=0
-foundp=nil
+foundnubp=nil
 while [ $i -lt $n ]; do
-  c_sysprepare $KEYS/keeper/$keeper/$i
+  c_sysprepare $keepdir/$i
   nubbin=$(nubid <$tmp/secret)
-  nubid=$(cat $KEYS/keeper/$keeper/$i/nubid)
-  case "$nubbin" in "$nubid") foundp=t; break ;; esac
+  nubid=$(cat $keepdir/$i/nubid)
+  case "$nubbin" in "$nubid") foundnubp=t; break ;; esac
   i=$(( $i + 1 ))
 done
-case $foundp in
+case $foundnubp in
   nil) echo >&2 "$quis: nub doesn't match keeper \`$keeper'"; exit 1 ;;
 esac
 
 ## Establish the recovery staging area.  See whether we've done enough
 ## already.
 reqsafe
-tag=$(echo $recov | tr / .)
+tag=$recov.$inst
 mkdir -p -m700 $SAFE/keys.reveal
 reveal=$SAFE/keys.reveal/$tag
 if [ ! -d $reveal ]; then mkdir -m700 $reveal; fi
 cd $reveal
 if [ -f nub ]; then
-  echo >&2 "$quis: recovery key \`$recov' already revealed"
+  echo >&2 "$quis: recovery key \`$recov/$inst' already revealed"
   exit 1
 fi
 
@@ -120,8 +106,8 @@ umask 077
 if [ -f $keeper.$i.share ]; then
   echo >&2 "$quis: share $i already revealed"
 else
-  c_sysdecrypt $KEYS/keeper/$keeper/$i $tmp/secret \
-    <$KEYS/recov/$recov/$keeper.$i.share \
+  c_sysdecrypt $keepdir/$i $tmp/secret \
+    <$rdir/$keeper.$i.share \
     >$keeper.$i.new
   mv $keeper.$i.new $keeper.$i.share
 fi
@@ -132,11 +118,11 @@ for j in $keeper.*.share; do if [ -f "$j" ]; then n=$(( $n + 1 )); fi; done
 if [ $n -lt $t ]; then
   echo >&2 "$quis: share $i revealed; $(( $t - $n )) more required"
 else
-  cat $KEYS/recov/$recov/$keeper.param $keeper.*.share >$keeper.shares
+  cat $rdir/$keeper.param $keeper.*.share >$keeper.shares
   $bindir/shamir recover <$keeper.shares >nub.new
-  c_sysprepare $KEYS/recov/$recov/store
+  c_sysprepare $rdir/store
   nubbin=$(nubid <nub.new)
-  nubid=$(cat $KEYS/recov/$recov/store/nubid)
+  nubid=$(cat $rdir/store/nubid)
   case "$nubbin" in
     "$nubid") ;;
     *)
@@ -146,7 +132,7 @@ else
   esac
   mv nub.new nub
   rm -f $keeper.*
-  echo >&2 "$quis: recovery key \`$recov' revealed"
+  echo >&2 "$quis: recovery key \`$recov/$inst' revealed"
 fi
 
 ###----- That's all, folks --------------------------------------------------