On Wed, 18 Nov 2009 at 14:22:38 +0000, Daniel Silverstone wrote:
> Indeed, the zero-share is not useful since in theory it'd be the data
> unchanged.

Thankfully, due to an implementation quirk, the share 000 output is a copy
of share 001, so the only differences are:

* it's mislabelled and won't combine correctly
* if you already had a share 001, you have one less share than you thought

> The software should reject zero-share instances, and not create them.

I attach a bzr bundle, also available from
<https://code.launchpad.net/~smcv/libgfshare/deb556939>, which has passed
2500 consecutive 3-of-5 tests using the script attached previously.

I'll patch this in Debian shortly.

Thanks,
    S
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: s...@debian.org-20091118233654-w132cs2v7b6l2616
# target_branch: http://bzr.digital-scurf.org/trees/dsilvers\
#   /libgfshare/devel/
# testament_sha1: 3c1dbfd53a2fb94a67045adafc50f56d5794dd8f
# timestamp: 2009-11-18 23:42:16 +0000
# base_revision_id: dsilv...@digital-scurf.org-20070822194948-\
#   63piocp89ra6ld7b
# 
# Begin patch
=== modified file 'README'
--- README	2006-01-15 17:58:21 +0000
+++ README	2009-11-18 23:36:39 +0000
@@ -28,4 +28,29 @@
 
  -- Daniel Silverstone. 2006-01-15
 
-
+Recovering from previous versions of gfsplit producing foo.000
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The quick version: if you have split a secret into shares and one
+of them is numbered 000, recover the secret by re-labelling it to
+001 (i.e. rename the file, if you're using gfcombine).
+
+Previous versions of libgfshare could incorrectly produce a share
+numbered 000, and the gfsplit utility would produce such a share
+sometimes (with the default settings, a 3-of-5 share, this will
+happen about 2% of the time). In gfsplit this produces filenames
+ending with ".000".
+
+Mathematically, the "share" numbered 0 would be the secret itself,
+which is why it shouldn't be used. However, due to the way libgfshare
+implements multiplication via exp/log tables, the output will
+actually be a copy of the data that would appear in share number 001,
+so the secret is not actually leaked.
+
+Recombining shares that include share number 000 doesn't work: it's
+silently ignored. If share 000 is renamed to share 001, recombination
+should work; the exception is if you already had a copy of share 001,
+in which case you can only recover the secret by having one extra share
+above the normal threshold.
+
+ -- Simon McVittie. 2009-11-18

=== modified file 'src/libgfshare.c'
--- src/libgfshare.c	2006-02-26 14:01:53 +0000
+++ src/libgfshare.c	2009-11-18 23:35:57 +0000
@@ -27,6 +27,7 @@
 #include "libgfshare.h"
 #include "libgfshare_tables.h"
 
+#include <errno.h>
 #include <stdlib.h>
 #include <string.h>
 
@@ -65,7 +66,20 @@
                       unsigned char threshold,
                       unsigned int size )
 {
-  gfshare_ctx *ctx = XMALLOC( sizeof(struct _gfshare_ctx) );
+  gfshare_ctx *ctx;
+  unsigned int i;
+
+  for (i = 0; i < sharecount; i++) {
+    if (sharenrs[i] == 0) {
+      /* can't have x[i] = 0 - that would just be a copy of the secret, in
+       * theory (in fact, due to the way we use exp/log for multiplication and
+       * treat log(0) as 0, it ends up as a copy of x[i] = 1) */
+      errno = EINVAL;
+      return NULL;
+    }
+  }
+
+  ctx = XMALLOC( sizeof(struct _gfshare_ctx) );
   ctx->sharecount = sharecount;
   ctx->threshold = threshold;
   ctx->size = size;

=== modified file 'tools/gfcombine.c'
--- tools/gfcombine.c	2006-02-26 14:01:53 +0000
+++ tools/gfcombine.c	2009-11-18 23:36:54 +0000
@@ -52,6 +52,12 @@
   fprintf( stderr, "%s: %s: bad filename\nInput files should be called <name>.NNN\n", progname, fname );
 }
 
+static void
+zero_filename( char* fname )
+{
+  fprintf( stderr, "%s: %s: input files <name>.000 don't work, see README\n", progname, fname );
+}
+
 static int
 check_filenames( char **filenames, int count )
 {
@@ -73,6 +79,12 @@
       bad_filename(filenames[i]);
       return 1;
     }
+    if( filenames[i][nlen-3] == '0' &&
+        filenames[i][nlen-2] == '0' &&
+        filenames[i][nlen-1] == '0') {
+      zero_filename(filenames[i]);
+      return 1;
+    }
   }
   return 0;
 }

=== modified file 'tools/gfsplit.c'
--- tools/gfsplit.c	2006-07-29 12:32:31 +0000
+++ tools/gfsplit.c	2009-11-18 23:35:36 +0000
@@ -92,6 +92,9 @@
   }
   for( i = 0; i < sharecount; ++i ) {
     unsigned char proposed = (random() & 0xff00) >> 8;
+    if( proposed == 0 ) {
+      proposed = 1;
+    }
     SHARENR_TRY_AGAIN:
     for( j = 0; j < i; ++j ) {
       if( sharenrs[j] == proposed ) {

# Begin bundle
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

Attachment: signature.asc
Description: Digital signature

Reply via email to