INNER CODE UNIT · Java
FINGERPRINT_LENGTH
GrapheneOS/AttestationServer · src/main/java/app/attestation/server/AttestationProtocol.java:48
private static final int FINGERPRINT_LENGTH = FINGERPRINT_HASH_FUNCTION.bits() / 8;
// Challenge message:
//
// byte maxVersion = PROTOCOL_VERSION
// byte[] challenge index (length: RANDOM_TOKEN_LENGTH)
// byte[] challenge (length: RANDOM_TOKEN_LENGTH)
//
// The challenge index is randomly generated by Auditor and used for all future challenge
// messages from that Auditor. It's used on the Auditee as an index to choose the correct
// persistent key to satisfy the Auditor, rather than only supporting pairing with one. In
// theory, the Auditor could authenticate to the Auditee, but this app already provides a
// better way to do that by doing the same process in reverse for a supported device.
//
// The challenge is randomly generated by the Auditor and serves the security function of
// enforcing that the results are fresh. It's returned inside the attestation certificate
// which has a signature from the device's provisioned key (not usable by the OS) and the
// outer signature from the hardware-backed key generated for the initial pairing.