From 6f41c8d5c76559f8114143869ac285f120fc8030 Mon Sep 17 00:00:00 2001 From: Christian Hagau Date: Tue, 29 Sep 2020 00:00:00 +0000 Subject: [PATCH] Add KDF to Extended Capabilities --- .../keychain/securitytoken/OpenPgpCapabilities.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/OpenPgpCapabilities.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/OpenPgpCapabilities.java index 74067dfba..84f2b578e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/OpenPgpCapabilities.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/OpenPgpCapabilities.java @@ -26,12 +26,20 @@ import androidx.annotation.Nullable; import com.google.auto.value.AutoValue; +/** + * References: + * [0] `Functional Specification of the OpenPGP application on ISO Smart Card Operating Systems` + * version 3.4.1 + * https://gnupg.org/ftp/specs/OpenPGP-smart-card-application-3.4.1.pdf + */ @SuppressWarnings("unused") // just expose all included data @AutoValue public abstract class OpenPgpCapabilities { + // Extended Capabilites flag bit offsets are defined on page 32 of [0] private final static int MASK_SM = 1 << 7; private final static int MASK_KEY_IMPORT = 1 << 5; private final static int MASK_ATTRIBUTES_CHANGABLE = 1 << 2; + private final static int MASK_KDF_DO = 1; private static final int MAX_PW1_LENGTH_INDEX = 1; private static final int MAX_PW3_LENGTH_INDEX = 3; @@ -63,6 +71,7 @@ public abstract class OpenPgpCapabilities { abstract boolean isHasSM(); abstract boolean isHasAesSm(); abstract boolean isHasScp11bSm(); + abstract boolean isHasKdf(); @Nullable abstract Integer getMaxCmdLen(); @@ -135,6 +144,7 @@ public abstract class OpenPgpCapabilities { abstract Builder hasSM(boolean hasSm); abstract Builder hasAesSm(boolean hasAesSm); abstract Builder hasScp11bSm(boolean hasScp11bSm); + abstract Builder hasKdf(boolean hasKdf); abstract Builder maxCmdLen(Integer maxCommandLen); abstract Builder maxRspLen(Integer MaxResponseLen); @@ -147,6 +157,7 @@ public abstract class OpenPgpCapabilities { hasSM(false); hasAesSm(false); hasScp11bSm(false); + hasKdf(false); } Builder updateWithTLV(Iso7816TLV[] tlvs) { @@ -243,6 +254,8 @@ public abstract class OpenPgpCapabilities { hasScp11bSm(smType == 3); } + hasKdf((v[0] & MASK_KDF_DO) == 1); + maxCmdLen((v[6] << 8) + v[7]); maxRspLen((v[8] << 8) + v[9]); }