PHP的GnuPG文档确实缺乏相关信息。查看源代码和GPGME手册及源代码,您可以得出相关信息。
免责声明:答案包含一些猜测,但如果在此基础上进行构建,您肯定会对正在发生的事情有一个合理的感觉,并且可以随时提供反馈!
为什么有效性总是0?
要验证签名的有效性
,您需要分配信任(以便GnuPG能够计算信任链)。 有效性在以下GPGME枚举中定义:
/* The available validities for a trust item or key. */
typedef enum
{
GPGME_VALIDITY_UNKNOWN = 0,
GPGME_VALIDITY_UNDEFINED = 1,
GPGME_VALIDITY_NEVER = 2,
GPGME_VALIDITY_MARGINAL = 3,
GPGME_VALIDITY_FULL = 4,
GPGME_VALIDITY_ULTIMATE = 5
}
gpgme_validity_t;
时间戳的值是什么?消息签名时的时间?
是的,这是签名创建的时间戳。请注意,时间戳通常由签名者定义,可以伪造为任意日期。
摘要中值为4代表什么?
根据文档 (gpgme_error_t status
), 状态在 gpg-error.h
中定义。这是一个非常长的列表,托管在GnuPG的git存储库中。
然而,在您的问题中定义的状态对我来说没有意义。
为什么第二个案例中状态值如此之大?这只是随机值还是特定的错误代码?
这是有关签名的摘要。同样,摘要在GPGME枚举中定义:
/* Flags used for the SUMMARY field in a gpgme_signature_t. */
typedef enum
{
GPGME_SIGSUM_VALID = 0x0001, /* The signature is fully valid. */
GPGME_SIGSUM_GREEN = 0x0002, /* The signature is good. */
GPGME_SIGSUM_RED = 0x0004, /* The signature is bad. */
GPGME_SIGSUM_KEY_REVOKED = 0x0010, /* One key has been revoked. */
GPGME_SIGSUM_KEY_EXPIRED = 0x0020, /* One key has expired. */
GPGME_SIGSUM_SIG_EXPIRED = 0x0040, /* The signature has expired. */
GPGME_SIGSUM_KEY_MISSING = 0x0080, /* Can't verify: key missing. */
GPGME_SIGSUM_CRL_MISSING = 0x0100, /* CRL not available. */
GPGME_SIGSUM_CRL_TOO_OLD = 0x0200, /* Available CRL is too old. */
GPGME_SIGSUM_BAD_POLICY = 0x0400, /* A policy was not met. */
GPGME_SIGSUM_SYS_ERROR = 0x0800 /* A system error occured. */
}
gpgme_sigsum_t;
468F82339FC55DE5CAFD71BB63DD32AE1308A57F
生成的,是正确的签名,但无法验证密钥(缺少信任路径)。summary
的第4位是否设置。如果设置了,您就有一个错误的签名。不要将其与4进行比较,而是使用位操作来对单个位进行测试:($summary & 0x04) == 0x04