core,cpp: Extend the TOFU information.

* src/gpgme.h.in (struct _gpeme_tofu_info): Rename FIRSTSEEN to
SIGNFIRST and LASTSEEN to SIGNLAST.  Add ENCRFIST and ENCRLAST.
* src/keylist.c (parse_tfs_record): Parse to ENCRFIRST and ENCRLAST.
* src/verify.c (parse_tofu_stats): Ditto.
* tests/run-keylist.c (main): Adjust and print encrypt stats.
* tests/run-verify.c (print_result): Ditto.

* lang/cpp/src/tofuinfo.h (TofuInfo): Rename firstSeen to signFirst
and lastSeen to signLast.  Add encrCount, encrFirst and encrLast.
* lang/cpp/src/tofuinfo.cpp (encrCount, encrFirst, encrLast): New.
--

The latest GnuPG commits have the needed changes but we also allow the
use of currently released GnuPG version.

Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
Werner Koch 2016-09-07 09:26:11 +02:00
parent 151da95470
commit 120b14783c
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
7 changed files with 85 additions and 23 deletions

View File

@ -123,14 +123,29 @@ unsigned short GpgME::TofuInfo::signCount() const
return isNull() ? 0 : d->mInfo->signcount;
}
unsigned long GpgME::TofuInfo::firstSeen() const
unsigned short GpgME::TofuInfo::encrCount() const
{
return isNull() ? 0 : d->mInfo->firstseen;
return isNull() ? 0 : d->mInfo->encrcount;
}
unsigned long GpgME::TofuInfo::lastSeen() const
unsigned long GpgME::TofuInfo::signFirst() const
{
return isNull() ? 0 : d->mInfo->lastseen;
return isNull() ? 0 : d->mInfo->signfirst;
}
unsigned long GpgME::TofuInfo::signLast() const
{
return isNull() ? 0 : d->mInfo->signlast;
}
unsigned long GpgME::TofuInfo::encrFirst() const
{
return isNull() ? 0 : d->mInfo->encrfirst;
}
unsigned long GpgME::TofuInfo::encrLast() const
{
return isNull() ? 0 : d->mInfo->encrlast;
}
std::ostream &GpgME::operator<<(std::ostream &os, const GpgME::TofuInfo &info)
@ -141,8 +156,11 @@ std::ostream &GpgME::operator<<(std::ostream &os, const GpgME::TofuInfo &info)
<< "\n validity: " << info.validity()
<< "\n policy: " << info.policy()
<< "\n signcount: "<< info.signCount()
<< "\n firstseen: "<< info.firstSeen()
<< "\n lastseen: " << info.lastSeen()
<< "\n signfirst: "<< info.signFirst()
<< "\n signlast: " << info.signLast()
<< "\n encrcount: "<< info.encrCount()
<< "\n encrfirst: "<< info.encrFirst()
<< "\n encrlast: " << info.encrLast()
<< '\n';
}
return os << ")";

View File

@ -93,11 +93,20 @@ public:
/* Number of signatures seen for this binding. Capped at USHRT_MAX. */
unsigned short signCount() const;
/* Number of encryption done to this binding. Capped at USHRT_MAX. */
unsigned short encrCount() const;
/** Number of seconds since epoch when the first message was verified */
unsigned long firstSeen() const;
unsigned long signFirst() const;
/** Number of seconds since epoch when the last message was verified */
unsigned long lastSeen() const;
unsigned long signLast() const;
/** Number of seconds since epoch when the first message was encrypted */
unsigned long encrFirst() const;
/** Number of seconds since epoch when the last message was encrypted */
unsigned long encrLast() const;
/* If non-NULL a human readable string summarizing the TOFU data. */
const char *description() const;

View File

@ -650,9 +650,11 @@ struct _gpgme_tofu_info
unsigned short encrcount;
/* Number of seconds since Epoch when the first and the most
* recently seen message were verified. 0 means unknown. */
unsigned long firstseen;
unsigned long lastseen;
* recently seen message were verified/decrypted. 0 means unknown. */
unsigned long signfirst;
unsigned long signlast;
unsigned long encrfirst;
unsigned long encrlast;
/* If non-NULL a human readable string summarizing the TOFU data. */
char *description;

View File

@ -466,11 +466,25 @@ parse_tfs_record (gpgme_user_id_t uid, char **field, int nfield)
err = _gpgme_strtoul_field (field[6], &uval);
if (err)
goto inv_engine;
ti->firstseen = uval;
ti->signfirst = uval;
err = _gpgme_strtoul_field (field[7], &uval);
if (err)
goto inv_engine;
ti->lastseen = uval;
ti->signlast = uval;
if (nfield > 9)
{
/* This condition is only to allow for gpg 2.1.15 - can
* eventually be removed. */
err = _gpgme_strtoul_field (field[8], &uval);
if (err)
goto inv_engine;
ti->encrfirst = uval;
err = _gpgme_strtoul_field (field[9], &uval);
if (err)
goto inv_engine;
ti->encrlast = uval;
}
/* Ready. */
uid->tofu = ti;

View File

@ -755,20 +755,21 @@ parse_tofu_user (gpgme_signature_t sig, char *args, gpgme_protocol_t protocol)
/* Parse a TOFU_STATS line and store it in the last tofu info of SIG.
*
* TOFU_STATS <validity> <sign-count> <encr-count> [<policy> [<tm1> <tm2>]]
* TOFU_STATS <validity> <sign-count> <encr-count> \
* [<policy> [<tm1> <tm2> <tm3> <tm4>]]
*/
static gpgme_error_t
parse_tofu_stats (gpgme_signature_t sig, char *args)
{
gpgme_error_t err;
gpgme_tofu_info_t ti;
char *field[6];
char *field[8];
int nfields;
unsigned long uval;
if (!sig->key || !sig->key->_last_uid || !(ti = sig->key->_last_uid->tofu))
return trace_gpg_error (GPG_ERR_INV_ENGINE); /* No TOFU_USER seen. */
if (ti->firstseen || ti->signcount || ti->validity || ti->policy)
if (ti->signfirst || ti->signcount || ti->validity || ti->policy)
return trace_gpg_error (GPG_ERR_INV_ENGINE); /* Already set. */
nfields = _gpgme_split_fields (args, field, DIM (field));
@ -824,11 +825,24 @@ parse_tofu_stats (gpgme_signature_t sig, char *args)
err = _gpgme_strtoul_field (field[4], &uval);
if (err)
return trace_gpg_error (GPG_ERR_INV_ENGINE);
ti->firstseen = uval;
ti->signfirst = uval;
err = _gpgme_strtoul_field (field[5], &uval);
if (err)
return trace_gpg_error (GPG_ERR_INV_ENGINE);
ti->lastseen = uval;
ti->signlast = uval;
if (nfields > 7)
{
/* This condition is only to allow for gpg 2.1.15 - can
* eventually be removed. */
err = _gpgme_strtoul_field (field[6], &uval);
if (err)
return trace_gpg_error (GPG_ERR_INV_ENGINE);
ti->encrfirst = uval;
err = _gpgme_strtoul_field (field[7], &uval);
if (err)
return trace_gpg_error (GPG_ERR_INV_ENGINE);
ti->encrlast = uval;
}
return 0;
}

View File

@ -291,9 +291,11 @@ main (int argc, char **argv)
ti->policy == GPGME_TOFU_POLICY_BAD? "bad" :
ti->policy == GPGME_TOFU_POLICY_ASK? "ask" : "?");
printf (" nsigs: %hu\n", ti->signcount);
printf (" first: %s\n", isotimestr (ti->signfirst));
printf (" last: %s\n", isotimestr (ti->signlast));
printf (" nencr: %hu\n", ti->encrcount);
printf (" first: %s\n", isotimestr (ti->firstseen));
printf (" last: %s\n", isotimestr (ti->lastseen));
printf (" first: %s\n", isotimestr (ti->encrfirst));
printf (" last: %s\n", isotimestr (ti->encrlast));
}
}

View File

@ -197,9 +197,12 @@ print_result (gpgme_verify_result_t result)
ti->policy == GPGME_TOFU_POLICY_UNKNOWN? "unknown" :
ti->policy == GPGME_TOFU_POLICY_BAD? "bad" :
ti->policy == GPGME_TOFU_POLICY_ASK? "ask" : "?");
printf (" sigcount : %hu\n", ti->signcount);
printf (" firstseen: %s\n", isotimestr (ti->firstseen));
printf (" lastseen : %s\n", isotimestr (ti->lastseen));
printf (" signcount: %hu\n", ti->signcount);
printf (" first..: %s\n", isotimestr (ti->signfirst));
printf (" last ..: %s\n", isotimestr (ti->signlast));
printf (" encrcount: %hu\n", ti->encrcount);
printf (" first..: %s\n", isotimestr (ti->encrfirst));
printf (" last ..: %s\n", isotimestr (ti->encrlast));
printf (" desc ....: ");
print_description (nonnull (ti->description), 15);
}