3131import com .yubico .webauthn .StartAssertionOptions ;
3232import com .yubico .webauthn .extension .appid .AppId ;
3333import java .util .HashSet ;
34+ import java .util .Map ;
3435import java .util .Optional ;
3536import java .util .Set ;
3637import lombok .Builder ;
@@ -55,15 +56,18 @@ public class AssertionExtensionInputs implements ExtensionInputs {
5556
5657 private final AppId appid ;
5758 private final Extensions .LargeBlob .LargeBlobAuthenticationInput largeBlob ;
59+ private final Extensions .Prf .PrfAuthenticationInput prf ;
5860 private final Boolean uvm ;
5961
6062 @ JsonCreator
6163 private AssertionExtensionInputs (
6264 @ JsonProperty ("appid" ) AppId appid ,
6365 @ JsonProperty ("largeBlob" ) Extensions .LargeBlob .LargeBlobAuthenticationInput largeBlob ,
66+ @ JsonProperty ("prf" ) Extensions .Prf .PrfAuthenticationInput prf ,
6467 @ JsonProperty ("uvm" ) Boolean uvm ) {
6568 this .appid = appid ;
6669 this .largeBlob = largeBlob ;
70+ this .prf = prf ;
6771 this .uvm = (uvm != null && uvm ) ? true : null ;
6872 }
6973
@@ -78,6 +82,7 @@ public AssertionExtensionInputs merge(AssertionExtensionInputs other) {
7882 return new AssertionExtensionInputs (
7983 this .appid != null ? this .appid : other .appid ,
8084 this .largeBlob != null ? this .largeBlob : other .largeBlob ,
85+ this .prf != null ? this .prf : other .prf ,
8186 this .uvm != null ? this .uvm : other .uvm );
8287 }
8388
@@ -95,6 +100,9 @@ public Set<String> getExtensionIds() {
95100 if (largeBlob != null ) {
96101 ids .add (Extensions .LargeBlob .EXTENSION_ID );
97102 }
103+ if (prf != null ) {
104+ ids .add (Extensions .Prf .EXTENSION_ID );
105+ }
98106 if (getUvm ()) {
99107 ids .add (Extensions .Uvm .EXTENSION_ID );
100108 }
@@ -172,6 +180,37 @@ public AssertionExtensionInputsBuilder largeBlob(
172180 return this ;
173181 }
174182
183+ /**
184+ * Enable the Pseudo-random function extension (<code>prf</code>).
185+ *
186+ * <p>This extension allows a Relying Party to evaluate outputs from a pseudo-random function
187+ * (PRF) associated with a credential.
188+ *
189+ * <p>Use the {@link com.yubico.webauthn.data.Extensions.Prf.PrfAuthenticationInput} factory
190+ * functions to construct the argument:
191+ *
192+ * <ul>
193+ * <li>Use {@link Extensions.Prf.PrfAuthenticationInput#eval(Extensions.Prf.PrfValues)} to use
194+ * the same PRF input for all credentials.
195+ * <li>Use {@link Extensions.Prf.PrfAuthenticationInput#evalByCredential(Map)} to use
196+ * different PRF inputs for different credentials.
197+ * <li>Use {@link Extensions.Prf.PrfAuthenticationInput#evalByCredentialWithFallback(Map,
198+ * Extensions.Prf.PrfValues)} to use different PRF inputs for different credentials, but
199+ * with a "fallback" input for credentials without their own input.
200+ * </ul>
201+ *
202+ * @see Extensions.Prf.PrfAuthenticationInput#eval(Extensions.Prf.PrfValues)
203+ * @see Extensions.Prf.PrfAuthenticationInput#evalByCredential(Map)
204+ * @see Extensions.Prf.PrfAuthenticationInput#evalByCredentialWithFallback(Map,
205+ * Extensions.Prf.PrfValues)
206+ * @see <a href="https://www.w3.org/TR/2025/WD-webauthn-3-20250127/#prf-extension">§10.1.4.
207+ * Pseudo-random function extension (prf)</a>
208+ */
209+ public AssertionExtensionInputsBuilder prf (Extensions .Prf .PrfAuthenticationInput prf ) {
210+ this .prf = prf ;
211+ return this ;
212+ }
213+
175214 /**
176215 * Enable the User Verification Method Extension (<code>uvm</code>).
177216 *
@@ -233,6 +272,31 @@ private Extensions.LargeBlob.LargeBlobAuthenticationInput getLargeBlobJson() {
233272 : null ;
234273 }
235274
275+ /**
276+ * The input to the Pseudo-random function extension (<code>prf</code>), if any.
277+ *
278+ * <p>This extension allows a Relying Party to evaluate outputs from a pseudo-random function
279+ * (PRF) associated with a credential.
280+ *
281+ * @see Extensions.Prf.PrfAuthenticationInput#eval(Extensions.Prf.PrfValues)
282+ * @see Extensions.Prf.PrfAuthenticationInput#evalByCredential(Map)
283+ * @see Extensions.Prf.PrfAuthenticationInput#evalByCredentialWithFallback(Map,
284+ * Extensions.Prf.PrfValues)
285+ * @see <a href="https://www.w3.org/TR/2025/WD-webauthn-3-20250127/#prf-extension">§10.1.4.
286+ * Pseudo-random function extension (prf)</a>
287+ */
288+ public Optional <Extensions .Prf .PrfAuthenticationInput > getPrf () {
289+ return Optional .ofNullable (prf );
290+ }
291+
292+ /** For JSON serialization, to omit false and null values. */
293+ @ JsonProperty ("prf" )
294+ private Extensions .Prf .PrfAuthenticationInput getPrfJson () {
295+ return prf != null && (prf .getEval ().isPresent () || prf .getEvalByCredential ().isPresent ())
296+ ? prf
297+ : null ;
298+ }
299+
236300 /**
237301 * @return <code>true</code> if the User Verification Method Extension (<code>uvm</code>) is
238302 * enabled, <code>false</code> otherwise.
0 commit comments