INNER CODE UNIT · Java
AttestationProtocol
GrapheneOS/AttestationServer · src/main/java/app/attestation/server/AttestationProtocol.java:42
class AttestationProtocol {
private static final Logger logger = Logger.getLogger(AttestationProtocol.class.getName());
static final int RANDOM_TOKEN_LENGTH = 32;
private static final String SIGNATURE_ALGORITHM = "SHA256WithECDSA";
private static final HashFunction FINGERPRINT_HASH_FUNCTION = Hashing.sha256();
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