X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/distorted-keys/blobdiff_plain/5c30c6e62b52a66d5c5f33a6adb81bb882e88339..f8e6a4ac12a167cdcc07efd086fdbb870b72d89f:/keys.reveal?ds=sidebyside diff --git a/keys.reveal b/keys.reveal index a1c0242..c0b2a58 100755 --- a/keys.reveal +++ b/keys.reveal @@ -28,90 +28,76 @@ case "${KEYSLIB+t}" in t) ;; *) echo >&2 "$0: KEYSLIB unset"; exit 1 ;; esac . "$KEYSLIB"/keyfunc.sh defhelp <&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 &2 "$quis: recovery key \`$recov' revealed" + echo >&2 "$quis: recovery key \`$recov/$inst' revealed" fi ###----- That's all, folks --------------------------------------------------