OpenPGP加密密钥 - isValidForEncrypting()?

时间:2015-02-19 16:47:21

标签: encryption signature openpgp

我正在查看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

1 个答案:

答案 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。