From a6d89fd9a347f5dcb41c2e003cad2fa2528f4889 Mon Sep 17 00:00:00 2001 From: Emil Lundberg Date: Thu, 10 Nov 2022 18:20:56 +0100 Subject: [PATCH] Optimize getParsedAuthenticatorData() --- .../webauthn/data/AuthenticatorAssertionResponse.java | 6 ++++++ .../webauthn/data/AuthenticatorAttestationResponse.java | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/webauthn-server-core/src/main/java/com/yubico/webauthn/data/AuthenticatorAssertionResponse.java b/webauthn-server-core/src/main/java/com/yubico/webauthn/data/AuthenticatorAssertionResponse.java index f4925bff6..f168f9a9b 100644 --- a/webauthn-server-core/src/main/java/com/yubico/webauthn/data/AuthenticatorAssertionResponse.java +++ b/webauthn-server-core/src/main/java/com/yubico/webauthn/data/AuthenticatorAssertionResponse.java @@ -72,6 +72,11 @@ public class AuthenticatorAssertionResponse implements AuthenticatorResponse { */ private final ByteArray userHandle; + // This overrides the default getter in AuthenticatorResponse which re-parses the authenticator + // data on every invocation. This "optimization" has no measurable impact on performance, but it + // seems rude to obviously waste cycles for nothing. + private final transient AuthenticatorData parsedAuthenticatorData; + @NonNull @Getter(onMethod = @__({@Override})) private final transient CollectedClientData clientData; @@ -85,6 +90,7 @@ private AuthenticatorAssertionResponse( @JsonProperty("userHandle") final ByteArray userHandle) throws IOException, Base64UrlException { this.authenticatorData = authenticatorData; + this.parsedAuthenticatorData = new AuthenticatorData(authenticatorData); this.clientDataJSON = clientDataJSON; this.signature = signature; this.userHandle = userHandle; diff --git a/webauthn-server-core/src/main/java/com/yubico/webauthn/data/AuthenticatorAttestationResponse.java b/webauthn-server-core/src/main/java/com/yubico/webauthn/data/AuthenticatorAttestationResponse.java index 918ca1f3a..22ba3bce3 100644 --- a/webauthn-server-core/src/main/java/com/yubico/webauthn/data/AuthenticatorAttestationResponse.java +++ b/webauthn-server-core/src/main/java/com/yubico/webauthn/data/AuthenticatorAttestationResponse.java @@ -113,6 +113,14 @@ private AuthenticatorAttestationResponse( this.clientData = new CollectedClientData(clientDataJSON); } + // The default getter in AuthenticatorResponse re-parses the authenticator data on every + // invocation. This "optimization" override has no measurable impact on performance, but it seems + // rude to obviously waste cycles for nothing. + @Override + public AuthenticatorData getParsedAuthenticatorData() { + return attestation.getAuthenticatorData(); + } + public static AuthenticatorAttestationResponseBuilder.MandatoryStages builder() { return new AuthenticatorAttestationResponseBuilder.MandatoryStages(); }