Add KDF to Extended Capabilities

This commit is contained in:
Christian Hagau 2020-09-29 00:00:00 +00:00
parent a0a5b63c54
commit 6f41c8d5c7

View file

@ -26,12 +26,20 @@ import androidx.annotation.Nullable;
import com.google.auto.value.AutoValue; 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 @SuppressWarnings("unused") // just expose all included data
@AutoValue @AutoValue
public abstract class OpenPgpCapabilities { 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_SM = 1 << 7;
private final static int MASK_KEY_IMPORT = 1 << 5; private final static int MASK_KEY_IMPORT = 1 << 5;
private final static int MASK_ATTRIBUTES_CHANGABLE = 1 << 2; 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_PW1_LENGTH_INDEX = 1;
private static final int MAX_PW3_LENGTH_INDEX = 3; private static final int MAX_PW3_LENGTH_INDEX = 3;
@ -63,6 +71,7 @@ public abstract class OpenPgpCapabilities {
abstract boolean isHasSM(); abstract boolean isHasSM();
abstract boolean isHasAesSm(); abstract boolean isHasAesSm();
abstract boolean isHasScp11bSm(); abstract boolean isHasScp11bSm();
abstract boolean isHasKdf();
@Nullable @Nullable
abstract Integer getMaxCmdLen(); abstract Integer getMaxCmdLen();
@ -135,6 +144,7 @@ public abstract class OpenPgpCapabilities {
abstract Builder hasSM(boolean hasSm); abstract Builder hasSM(boolean hasSm);
abstract Builder hasAesSm(boolean hasAesSm); abstract Builder hasAesSm(boolean hasAesSm);
abstract Builder hasScp11bSm(boolean hasScp11bSm); abstract Builder hasScp11bSm(boolean hasScp11bSm);
abstract Builder hasKdf(boolean hasKdf);
abstract Builder maxCmdLen(Integer maxCommandLen); abstract Builder maxCmdLen(Integer maxCommandLen);
abstract Builder maxRspLen(Integer MaxResponseLen); abstract Builder maxRspLen(Integer MaxResponseLen);
@ -147,6 +157,7 @@ public abstract class OpenPgpCapabilities {
hasSM(false); hasSM(false);
hasAesSm(false); hasAesSm(false);
hasScp11bSm(false); hasScp11bSm(false);
hasKdf(false);
} }
Builder updateWithTLV(Iso7816TLV[] tlvs) { Builder updateWithTLV(Iso7816TLV[] tlvs) {
@ -243,6 +254,8 @@ public abstract class OpenPgpCapabilities {
hasScp11bSm(smType == 3); hasScp11bSm(smType == 3);
} }
hasKdf((v[0] & MASK_KDF_DO) == 1);
maxCmdLen((v[6] << 8) + v[7]); maxCmdLen((v[6] << 8) + v[7]);
maxRspLen((v[8] << 8) + v[9]); maxRspLen((v[8] << 8) + v[9]);
} }