我正在查看some code of MyPGP以检查OpenPGP密钥是否对加密有效。 RFC 4880帮助我理解了代码。但鉴于我对签名类型没有很好的理解,我无法清楚地理解以下代码:
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;
}
,其中
private static final int[] MASTER_KEY_CERTIFICATION_TYPES = new int[]{
PGPSignature.POSITIVE_CERTIFICATION,
PGPSignature.CASUAL_CERTIFICATION,
PGPSignature.NO_CERTIFICATION,
PGPSignature.DEFAULT_CERTIFICATION
};
我不确定为什么我们要为主密钥寻找特定的签名类型,以及为什么要查看SUBKEY_BINDING
。
答案 0 :(得分:1)
主要(" master")和子项在自签名中定义了使用标记,自签名可以是不同的签名类型(来自RFC 4880, 5.2.3.3. Notes on Self-Signatures:
有三种类型的自签名, 认证签名(类型0x10-0x13),直接密钥签名 (类型0x1F)和子键绑定签名(类型0x18)。
对于主键,使用类型0x10-0x13(这是函数的第一个分支中的MASTER_KEY_CERTIFICATION_TYPES
上的循环)。对于子键,usage标记始终存储在0x18类型的子键绑定签名中。在第二个分支中检查。
由于可以存在多个自签名,因此作者会遍历所有签名。我没有完全阅读代码,但我不确定他是否符合RFC 4880,我认为他应该使用最新未撤销的自签名;可能是他使用了第一个匹配的(无论是被取代还是被撤销)。
您可以使用
之类的命令验证密钥使用标记的存储位置gpg --export-options export-minimal --export 0xdeadbeef | gpg --list-packets
查找以hashed subpkt 27
开头的行,这些行表示密钥用法标记设置。 sigclass
列在上面。 gpg --list-packets
输出几乎不可读,并且包含许多要在RFC 4880中查找的数字引用,但似乎您已经熟悉了RFC。