333
/* Compute the SHA_1 checksum of teh rawdata in BLOB and aput it into
336
hash_blob_rawdata (KEYBOXBLOB blob, unsigned char *digest)
338
const unsigned char *buffer;
341
ulong rawdata_off, rawdata_len;
343
buffer = _keybox_get_blob_image (blob, &length);
349
length = n; /* Blob larger than length in header - ignore the rest. */
359
case BLOBTYPE_HEADER:
361
memset (digest, 0, 20);
368
rawdata_off = get32 (buffer + 8);
369
rawdata_len = get32 (buffer + 12);
371
if (rawdata_off > length || rawdata_len > length
372
|| rawdata_off+rawdata_off > length)
373
return -1; /* Out of bounds. */
375
gcry_md_hash_buffer (GCRY_MD_SHA1, digest, buffer+rawdata_off, rawdata_len);
326
380
struct file_stats_s
328
382
unsigned long too_short_blobs;
557
unsigned char digest[20];
562
cmp_dupitems (const void *arg_a, const void *arg_b)
564
struct dupitem_s *a = (struct dupitem_s *)arg_a;
565
struct dupitem_s *b = (struct dupitem_s *)arg_b;
567
return memcmp (a->digest, b->digest, 20);
572
_keybox_dump_find_dups (const char *filename, int print_them, FILE *outfp)
577
unsigned long recno = 0;
578
unsigned char zerodigest[20];
579
struct dupitem_s *dupitems;
580
size_t dupitems_size, dupitems_count, lastn, n;
583
memset (zerodigest, 0, sizeof zerodigest);
585
if (!(fp = open_file (&filename, outfp)))
586
return gpg_error_from_syserror ();
588
dupitems_size = 1000;
589
dupitems = malloc (dupitems_size * sizeof *dupitems);
592
gpg_error_t tmperr = gpg_error_from_syserror ();
593
fprintf (outfp, "error allocating array for `%s': %s\n",
594
filename, strerror(errno));
599
while ( !(rc = _keybox_read_blob (&blob, fp)) )
601
unsigned char digest[20];
603
if (hash_blob_rawdata (blob, digest))
604
fprintf (outfp, "error in blob %ld of `%s'\n", recno, filename);
605
else if (memcmp (digest, zerodigest, 20))
607
if (dupitems_count >= dupitems_size)
609
struct dupitem_s *tmp;
611
dupitems_size += 1000;
612
tmp = realloc (dupitems, dupitems_size * sizeof *dupitems);
615
gpg_error_t tmperr = gpg_error_from_syserror ();
616
fprintf (outfp, "error reallocating array for `%s': %s\n",
617
filename, strerror(errno));
623
dupitems[dupitems_count].recno = recno;
624
memcpy (dupitems[dupitems_count].digest, digest, 20);
627
_keybox_release_blob (blob);
633
fprintf (outfp, "error reading `%s': %s\n", filename, gpg_strerror (rc));
637
qsort (dupitems, dupitems_count, sizeof *dupitems, cmp_dupitems);
639
for (lastn=0, n=1; n < dupitems_count; lastn=n, n++)
641
if (!memcmp (dupitems[lastn].digest, dupitems[n].digest, 20))
643
bin2hexcolon (dupitems[lastn].digest, 20, fprbuf);
644
fprintf (outfp, "fpr=%s recno=%lu", fprbuf, dupitems[lastn].recno);
646
fprintf (outfp, " %lu", dupitems[n].recno);
647
while (++n < dupitems_count
648
&& !memcmp (dupitems[lastn].digest, dupitems[n].digest, 20));
660
/* Print records with record numbers FROM to TO to OUTFP. */
662
_keybox_dump_cut_records (const char *filename, unsigned long from,
663
unsigned long to, FILE *outfp)
668
unsigned long recno = 0;
670
if (!(fp = open_file (&filename, stderr)))
671
return gpg_error_from_syserror ();
673
while ( !(rc = _keybox_read_blob (&blob, fp)) )
679
if ((rc = _keybox_write_blob (blob, outfp)))
681
fprintf (stderr, "error writing output: %s\n",
686
_keybox_release_blob (blob);
692
fprintf (stderr, "error reading `%s': %s\n", filename, gpg_strerror (rc));