Encryption OpenPGP加密密钥-isValidForEncrypting()?

Encryption OpenPGP加密密钥-isValidForEncrypting()?,encryption,signature,openpgp,Encryption,Signature,Openpgp,我正在检查OpenPGP密钥是否对加密有效。RFC4880帮助我稍微理解了代码。但是,鉴于我对签名类型没有很好的理解,我无法清楚地理解以下代码段: private static boolean hasKeyFlags(PGPPublicKey key, int keyUsage) { if (key.isMasterKey()) { for (int certificationType : MASTER_KEY_CERTIFICATION_TYPES) {

我正在检查OpenPGP密钥是否对加密有效。RFC4880帮助我稍微理解了代码。但是,鉴于我对签名类型没有很好的理解,我无法清楚地理解以下代码段:

 private static boolean hasKeyFlags(PGPPublicKey key, int keyUsage) {
    if (key.isMasterKey()) {
        for (int certificationType : MASTER_KEY_CERTIFICATION_TYPES) {
            Iterator eIt = key.getSignaturesOfType(certificationType);
            while (eIt.hasNext()) {
                PGPSignature signature = (PGPSignature) eIt.next();
                if (!isMatchingUsage(signature, keyUsage))
                    return false;
            }
        }
    } else {
        Iterator eIt = key.getSignaturesOfType(PGPSignature.SUBKEY_BINDING);
        while (eIt.hasNext()) {
            PGPSignature signature = (PGPSignature) eIt.next();
            if (!isMatchingUsage(signature, keyUsage))
                return false;
        }
    }
    return true;
   }
在哪里

我不知道为什么我们要寻找主密钥的特定签名类型,为什么要寻找子密钥绑定。

密钥使用标志和自签名 主(“主”)和子密钥的使用标志在自签名中定义,自签名可以是不同的签名类型(从:

有三种类型的自签名 证书签名(类型0x10-0x13),直接密钥签名 (类型0x1F)和子密钥绑定签名(类型0x18)

代码 对于主键,使用类型0x10-0x13(这是函数第一个分支中的循环
MASTER\u KEY\u CERTIFICATION\u types
)。对于子键,使用标志始终存储在类型0x18的子键绑定签名中。该签名在第二个分支中检查

由于可以有多个自签名,作者循环了所有的自签名。我没有完全阅读代码,但我不确定他是否符合RFC 4880,我认为他应该使用最新的未撤销的自签名;可能是他使用了第一个匹配的自签名(无论它是被取代还是被撤销)

看着钥匙 您可以使用以下命令验证密钥使用标志的存储位置:

gpg --export-options export-minimal --export 0xdeadbeef | gpg --list-packets

查找以
hashed subpkt 27
开头的行,这些行表示关键用法标志设置。
sigclass
列在稍上方。
gpg--list packets
输出几乎不可读,并且包含大量要在RFC 4880中查找的数字引用,但您似乎已经对RFC有点熟悉了

非常感谢。这确实帮助了我。顺便说一句,代码作者在调用此函数之前正在检查密钥是否已吊销。因此,看起来她/他已经处理了吊销的自签名。0x133在“对于主键,键入0x10-0x133”应该是0x13。我无法编辑它,因为它至少需要6个字符的更改,我不想更改其他内容。事实上,我已经修复了它。
gpg --export-options export-minimal --export 0xdeadbeef | gpg --list-packets