RegistrationResult.java

1
// Copyright (c) 2018, Yubico AB
2
// All rights reserved.
3
//
4
// Redistribution and use in source and binary forms, with or without
5
// modification, are permitted provided that the following conditions are met:
6
//
7
// 1. Redistributions of source code must retain the above copyright notice, this
8
//    list of conditions and the following disclaimer.
9
//
10
// 2. Redistributions in binary form must reproduce the above copyright notice,
11
//    this list of conditions and the following disclaimer in the documentation
12
//    and/or other materials provided with the distribution.
13
//
14
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
18
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
20
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
21
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
22
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
25
package com.yubico.webauthn;
26
27
import com.fasterxml.jackson.annotation.JsonCreator;
28
import com.fasterxml.jackson.annotation.JsonIgnore;
29
import com.fasterxml.jackson.annotation.JsonProperty;
30
import com.yubico.internal.util.CertificateParser;
31
import com.yubico.webauthn.RelyingParty.RelyingPartyBuilder;
32
import com.yubico.webauthn.attestation.AttestationTrustSource;
33
import com.yubico.webauthn.data.AttestationType;
34
import com.yubico.webauthn.data.AuthenticatorAttachment;
35
import com.yubico.webauthn.data.AuthenticatorAttestationResponse;
36
import com.yubico.webauthn.data.AuthenticatorData;
37
import com.yubico.webauthn.data.AuthenticatorDataFlags;
38
import com.yubico.webauthn.data.AuthenticatorRegistrationExtensionOutputs;
39
import com.yubico.webauthn.data.AuthenticatorResponse;
40
import com.yubico.webauthn.data.ByteArray;
41
import com.yubico.webauthn.data.ClientRegistrationExtensionOutputs;
42
import com.yubico.webauthn.data.PublicKeyCredential;
43
import com.yubico.webauthn.data.PublicKeyCredentialDescriptor;
44
import java.io.IOException;
45
import java.security.NoSuchAlgorithmException;
46
import java.security.PublicKey;
47
import java.security.cert.CertificateEncodingException;
48
import java.security.cert.CertificateException;
49
import java.security.cert.X509Certificate;
50
import java.security.spec.InvalidKeySpecException;
51
import java.util.List;
52
import java.util.Optional;
53
import java.util.stream.Collectors;
54
import lombok.AccessLevel;
55
import lombok.Getter;
56
import lombok.NonNull;
57
import lombok.Value;
58
59
/** The result of a call to {@link RelyingParty#finishRegistration(FinishRegistrationOptions)}. */
60
@Value
61
public class RegistrationResult {
62
63
  @JsonProperty
64
  @Getter(AccessLevel.NONE)
65
  private final PublicKeyCredential<
66
          AuthenticatorAttestationResponse, ClientRegistrationExtensionOutputs>
67
      credential;
68
69
  /**
70
   * <code>true</code> if and only if the attestation signature was successfully linked to a trusted
71
   * attestation root.
72
   *
73
   * <p>This will always be <code>false</code> unless the {@link
74
   * RelyingPartyBuilder#attestationTrustSource(AttestationTrustSource) attestationTrustSource}
75
   * setting was configured on the {@link RelyingParty} instance.
76
   *
77
   * <p>You can ignore this if authenticator attestation is not relevant to your application.
78
   */
79
  private final boolean attestationTrusted;
80
81
  /**
82
   * The <a
83
   * href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#sctn-attestation-types">attestation
84
   * type</a> that was used for the created credential.
85
   *
86
   * <p>You can ignore this if authenticator attestation is not relevant to your application.
87
   *
88
   * @see <a
89
   *     href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#sctn-attestation-types">§6.4.3.
90
   *     Attestation Types</a>
91
   */
92
  @NonNull private final AttestationType attestationType;
93
94
  // JavaDoc on getter
95
  private final List<X509Certificate> attestationTrustPath;
96
97
  RegistrationResult(
98
      PublicKeyCredential<AuthenticatorAttestationResponse, ClientRegistrationExtensionOutputs>
99
          credential,
100
      boolean attestationTrusted,
101 1 1. <init> : negated conditional → KILLED
      @NonNull AttestationType attestationType,
102
      Optional<List<X509Certificate>> attestationTrustPath) {
103
    this.credential = credential;
104
    this.attestationTrusted = attestationTrusted;
105
    this.attestationType = attestationType;
106
    this.attestationTrustPath = attestationTrustPath.orElse(null);
107
  }
108
109
  @JsonCreator
110
  private static RegistrationResult fromJson(
111 1 1. fromJson : negated conditional → KILLED
      @NonNull @JsonProperty("credential")
112
          PublicKeyCredential<AuthenticatorAttestationResponse, ClientRegistrationExtensionOutputs>
113
              credential,
114
      @JsonProperty("attestationTrusted") boolean attestationTrusted,
115 1 1. fromJson : negated conditional → KILLED
      @NonNull @JsonProperty("attestationType") AttestationType attestationType,
116 1 1. fromJson : negated conditional → KILLED
      @NonNull @JsonProperty("attestationTrustPath") Optional<List<String>> attestationTrustPath) {
117 1 1. fromJson : replaced return value with null for com/yubico/webauthn/RegistrationResult::fromJson → KILLED
    return new RegistrationResult(
118
        credential,
119
        attestationTrusted,
120
        attestationType,
121
        attestationTrustPath.map(
122
            atp ->
123
                atp.stream()
124
                    .map(
125
                        pem -> {
126
                          try {
127 1 1. lambda$fromJson$0 : replaced return value with null for com/yubico/webauthn/RegistrationResult::lambda$fromJson$0 → KILLED
                            return CertificateParser.parsePem(pem);
128
                          } catch (CertificateException e) {
129
                            throw new RuntimeException(e);
130
                          }
131
                        })
132 1 1. lambda$fromJson$1 : replaced return value with Collections.emptyList for com/yubico/webauthn/RegistrationResult::lambda$fromJson$1 → KILLED
                    .collect(Collectors.toList())));
133
  }
134
135
  /**
136
   * Check whether the <a href="https://www.w3.org/TR/webauthn/#user-verification">user
137
   * verification</a> as performed during the registration ceremony.
138
   *
139
   * <p>This flag is also available via <code>
140
   * {@link PublicKeyCredential}.{@link PublicKeyCredential#getResponse() getResponse()}.{@link AuthenticatorResponse#getParsedAuthenticatorData() getParsedAuthenticatorData()}.{@link AuthenticatorData#getFlags() getFlags()}.{@link AuthenticatorDataFlags#UV UV}
141
   * </code>.
142
   *
143
   * @return <code>true</code> if and only if the authenticator claims to have performed user
144
   *     verification during the registration ceremony.
145
   * @see <a href="https://www.w3.org/TR/webauthn/#user-verification">User Verification</a>
146
   * @see <a href="https://w3c.github.io/webauthn/#authdata-flags-uv">UV flag in §6.1. Authenticator
147
   *     Data</a>
148
   */
149
  @JsonIgnore
150
  public boolean isUserVerified() {
151 2 1. isUserVerified : replaced boolean return with false for com/yubico/webauthn/RegistrationResult::isUserVerified → KILLED
2. isUserVerified : replaced boolean return with true for com/yubico/webauthn/RegistrationResult::isUserVerified → KILLED
    return credential.getResponse().getParsedAuthenticatorData().getFlags().UV;
152
  }
153
154
  /**
155
   * Check whether the created credential is <a
156
   * href="https://w3c.github.io/webauthn/#backup-eligible">backup eligible</a>, using the <a
157
   * href="https://w3c.github.io/webauthn/#authdata-flags-be">BE flag</a> in the authenticator data.
158
   *
159
   * <p>You SHOULD store this value in your representation of a {@link RegisteredCredential}. {@link
160
   * CredentialRepository} implementations SHOULD set this value as the {@link
161
   * RegisteredCredential.RegisteredCredentialBuilder#backupEligible(Boolean)
162
   * backupEligible(Boolean)} value when reconstructing that {@link RegisteredCredential}.
163
   *
164
   * @return <code>true</code> if and only if the created credential is backup eligible. NOTE that
165
   *     this is only a hint and not a guarantee, unless backed by a trusted authenticator
166
   *     attestation.
167
   * @see <a href="https://w3c.github.io/webauthn/#backup-eligible">Backup Eligible in §4.
168
   *     Terminology</a>
169
   * @see <a href="https://w3c.github.io/webauthn/#authdata-flags-be">BE flag in §6.1. Authenticator
170
   *     Data</a>
171
   * @deprecated EXPERIMENTAL: This feature is from a not yet mature standard; it could change as
172
   *     the standard matures.
173
   */
174
  @Deprecated
175
  @JsonIgnore
176
  public boolean isBackupEligible() {
177 2 1. isBackupEligible : replaced boolean return with true for com/yubico/webauthn/RegistrationResult::isBackupEligible → KILLED
2. isBackupEligible : replaced boolean return with false for com/yubico/webauthn/RegistrationResult::isBackupEligible → KILLED
    return credential.getResponse().getParsedAuthenticatorData().getFlags().BE;
178
  }
179
180
  /**
181
   * Get the current <a href="https://w3c.github.io/webauthn/#backup-state">backup state</a> of the
182
   * created credential, using the <a href="https://w3c.github.io/webauthn/#authdata-flags-bs">BS
183
   * flag</a> in the authenticator data.
184
   *
185
   * <p>You SHOULD store this value in your representation of a {@link RegisteredCredential}. {@link
186
   * CredentialRepository} implementations SHOULD set this value as the {@link
187
   * RegisteredCredential.RegisteredCredentialBuilder#backupState(Boolean) backupState(Boolean)}
188
   * value when reconstructing that {@link RegisteredCredential}.
189
   *
190
   * @return <code>true</code> if and only if the created credential is believed to currently be
191
   *     backed up. NOTE that this is only a hint and not a guarantee, unless backed by a trusted
192
   *     authenticator attestation.
193
   * @see <a href="https://w3c.github.io/webauthn/#backup-state">Backup State in §4. Terminology</a>
194
   * @see <a href="https://w3c.github.io/webauthn/#authdata-flags-bs">BS flag in §6.1. Authenticator
195
   *     Data</a>
196
   * @deprecated EXPERIMENTAL: This feature is from a not yet mature standard; it could change as
197
   *     the standard matures.
198
   */
199
  @Deprecated
200
  @JsonIgnore
201
  public boolean isBackedUp() {
202 2 1. isBackedUp : replaced boolean return with true for com/yubico/webauthn/RegistrationResult::isBackedUp → KILLED
2. isBackedUp : replaced boolean return with false for com/yubico/webauthn/RegistrationResult::isBackedUp → KILLED
    return credential.getResponse().getParsedAuthenticatorData().getFlags().BS;
203
  }
204
205
  /**
206
   * The <a href="https://w3c.github.io/webauthn/#authenticator-attachment-modality">authenticator
207
   * attachment modality</a> in effect at the time the credential was created.
208
   *
209
   * @see PublicKeyCredential#getAuthenticatorAttachment()
210
   * @deprecated EXPERIMENTAL: This feature is from a not yet mature standard; it could change as
211
   *     the standard matures.
212
   */
213
  @Deprecated
214
  @JsonIgnore
215
  public Optional<AuthenticatorAttachment> getAuthenticatorAttachment() {
216 1 1. getAuthenticatorAttachment : replaced return value with Optional.empty for com/yubico/webauthn/RegistrationResult::getAuthenticatorAttachment → KILLED
    return credential.getAuthenticatorAttachment();
217
  }
218
219
  /**
220
   * The signature count returned with the created credential.
221
   *
222
   * <p>This is used in {@link RelyingParty#finishAssertion(FinishAssertionOptions)} to verify the
223
   * validity of future signature counter values.
224
   *
225
   * @see RegisteredCredential#getSignatureCount()
226
   */
227
  @JsonIgnore
228
  public long getSignatureCount() {
229 1 1. getSignatureCount : replaced long return with 0 for com/yubico/webauthn/RegistrationResult::getSignatureCount → KILLED
    return credential.getResponse().getParsedAuthenticatorData().getSignatureCounter();
230
  }
231
232
  /**
233
   * The <a href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#credential-id">credential
234
   * ID</a> and <a
235
   * href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#dom-publickeycredentialdescriptor-transports">transports</a>
236
   * of the created credential.
237
   *
238
   * @see <a href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#credential-id">Credential
239
   *     ID</a>
240
   * @see <a
241
   *     href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#dictionary-credential-descriptor">5.8.3.
242
   *     Credential Descriptor (dictionary PublicKeyCredentialDescriptor)</a>
243
   * @see PublicKeyCredential#getId()
244
   */
245
  @JsonIgnore
246
  public PublicKeyCredentialDescriptor getKeyId() {
247 1 1. getKeyId : replaced return value with null for com/yubico/webauthn/RegistrationResult::getKeyId → KILLED
    return PublicKeyCredentialDescriptor.builder()
248
        .id(credential.getId())
249
        .type(credential.getType())
250
        .transports(credential.getResponse().getTransports())
251
        .build();
252
  }
253
254
  /**
255
   * The <a href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#aaguid"><code>aaguid</code>
256
   * </a> reported in the <a
257
   * href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#sctn-authenticator-data">of the
258
   * created credential.</a>
259
   *
260
   * <p>This MAY be an AAGUID consisting of only zeroes.
261
   */
262
  @JsonIgnore
263
  public ByteArray getAaguid() {
264 1 1. getAaguid : replaced return value with null for com/yubico/webauthn/RegistrationResult::getAaguid → KILLED
    return credential
265
        .getResponse()
266
        .getAttestation()
267
        .getAuthenticatorData()
268
        .getAttestedCredentialData()
269
        .get()
270
        .getAaguid();
271
  }
272
273
  /**
274
   * The public key of the created credential.
275
   *
276
   * <p>This is used in {@link RelyingParty#finishAssertion(FinishAssertionOptions)} to verify the
277
   * authentication signatures.
278
   *
279
   * @see RegisteredCredential#getPublicKeyCose()
280
   */
281
  @JsonIgnore
282
  public ByteArray getPublicKeyCose() {
283 1 1. getPublicKeyCose : replaced return value with null for com/yubico/webauthn/RegistrationResult::getPublicKeyCose → KILLED
    return credential
284
        .getResponse()
285
        .getAttestation()
286
        .getAuthenticatorData()
287
        .getAttestedCredentialData()
288
        .get()
289
        .getCredentialPublicKey();
290
  }
291
292
  /**
293
   * The public key of the created credential, parsed as a {@link PublicKey} object.
294
   *
295
   * @see #getPublicKeyCose()
296
   * @see RegisteredCredential#getParsedPublicKey()
297
   */
298
  @NonNull
299
  @JsonIgnore
300
  public PublicKey getParsedPublicKey()
301
      throws InvalidKeySpecException, NoSuchAlgorithmException, IOException {
302 1 1. getParsedPublicKey : replaced return value with null for com/yubico/webauthn/RegistrationResult::getParsedPublicKey → NO_COVERAGE
    return WebAuthnCodecs.importCosePublicKey(getPublicKeyCose());
303
  }
304
305
  /**
306
   * The <a
307
   * href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#client-extension-output">client
308
   * extension outputs</a>, if any.
309
   *
310
   * <p>This is present if and only if at least one extension output is present in the return value.
311
   *
312
   * @see <a
313
   *     href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#sctn-client-extension-processing">§9.4.
314
   *     Client Extension Processing</a>
315
   * @see ClientRegistrationExtensionOutputs
316
   * @see #getAuthenticatorExtensionOutputs() ()
317
   */
318
  @JsonIgnore
319
  public Optional<ClientRegistrationExtensionOutputs> getClientExtensionOutputs() {
320 1 1. getClientExtensionOutputs : replaced return value with Optional.empty for com/yubico/webauthn/RegistrationResult::getClientExtensionOutputs → KILLED
    return Optional.ofNullable(credential.getClientExtensionResults())
321 2 1. lambda$getClientExtensionOutputs$2 : replaced boolean return with true for com/yubico/webauthn/RegistrationResult::lambda$getClientExtensionOutputs$2 → SURVIVED
2. lambda$getClientExtensionOutputs$2 : negated conditional → KILLED
        .filter(ceo -> !ceo.getExtensionIds().isEmpty());
322
  }
323
324
  /**
325
   * The <a
326
   * href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#authenticator-extension-output">authenticator
327
   * extension outputs</a>, if any.
328
   *
329
   * <p>This is present if and only if at least one extension output is present in the return value.
330
   *
331
   * @see <a
332
   *     href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#sctn-authenticator-extension-processing">§9.5.
333
   *     Authenticator Extension Processing</a>
334
   * @see AuthenticatorRegistrationExtensionOutputs
335
   * @see #getClientExtensionOutputs()
336
   */
337
  @JsonIgnore
338
  public Optional<AuthenticatorRegistrationExtensionOutputs> getAuthenticatorExtensionOutputs() {
339 1 1. getAuthenticatorExtensionOutputs : replaced return value with Optional.empty for com/yubico/webauthn/RegistrationResult::getAuthenticatorExtensionOutputs → KILLED
    return AuthenticatorRegistrationExtensionOutputs.fromAuthenticatorData(
340
        credential.getResponse().getParsedAuthenticatorData());
341
  }
342
343
  /**
344
   * Try to determine whether the created credential is a <a
345
   * href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#discoverable-credential">discoverable
346
   * credential</a>, also called a <i>passkey</i>, using the output from the <a
347
   * href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#sctn-authenticator-credential-properties-extension">
348
   * <code>credProps</code></a> extension.
349
   *
350
   * @return A present <code>true</code> if the created credential is a passkey (discoverable). A
351
   *     present <code>
352
   *     false</code> if the created credential is not a passkey. An empty value if it is not known
353
   *     whether the created credential is a passkey.
354
   * @see <a
355
   *     href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#dom-credentialpropertiesoutput-rk">§10.4.
356
   *     Credential Properties Extension (credProps), "rk" output</a>
357
   * @see <a
358
   *     href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#discoverable-credential">Discoverable
359
   *     Credential</a>
360
   * @see <a href="https://passkeys.dev/docs/reference/terms/#passkey">Passkey</a> in <a
361
   *     href="https://passkeys.dev">passkeys.dev</a> reference
362
   */
363
  @JsonIgnore
364
  public Optional<Boolean> isDiscoverable() {
365 1 1. isDiscoverable : replaced return value with Optional.empty for com/yubico/webauthn/RegistrationResult::isDiscoverable → KILLED
    return getClientExtensionOutputs()
366 1 1. lambda$isDiscoverable$3 : replaced return value with Optional.empty for com/yubico/webauthn/RegistrationResult::lambda$isDiscoverable$3 → KILLED
        .flatMap(outputs -> outputs.getCredProps())
367 1 1. lambda$isDiscoverable$4 : replaced return value with Optional.empty for com/yubico/webauthn/RegistrationResult::lambda$isDiscoverable$4 → KILLED
        .flatMap(credProps -> credProps.getRk());
368
  }
369
370
  /**
371
   * The <a
372
   * href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#attestation-trust-path">attestation
373
   * trust path</a> for the created credential, if any.
374
   *
375
   * <p>If present, this may be useful for looking up attestation metadata from external sources.
376
   * The attestation trust path has been successfully verified as trusted if and only if {@link
377
   * #isAttestationTrusted()} is <code>true</code>.
378
   *
379
   * <p>You can ignore this if authenticator attestation is not relevant to your application.
380
   *
381
   * @see <a
382
   *     href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#attestation-trust-path">Attestation
383
   *     trust path</a>
384
   */
385
  @JsonIgnore
386
  public Optional<List<X509Certificate>> getAttestationTrustPath() {
387 1 1. getAttestationTrustPath : replaced return value with Optional.empty for com/yubico/webauthn/RegistrationResult::getAttestationTrustPath → KILLED
    return Optional.ofNullable(attestationTrustPath);
388
  }
389
390
  @JsonProperty("attestationTrustPath")
391
  private Optional<List<String>> getAttestationTrustPathJson() {
392 1 1. getAttestationTrustPathJson : replaced return value with Optional.empty for com/yubico/webauthn/RegistrationResult::getAttestationTrustPathJson → KILLED
    return getAttestationTrustPath()
393
        .map(
394
            x5c ->
395
                x5c.stream()
396
                    .map(
397
                        cert -> {
398
                          try {
399 1 1. lambda$getAttestationTrustPathJson$5 : replaced return value with "" for com/yubico/webauthn/RegistrationResult::lambda$getAttestationTrustPathJson$5 → KILLED
                            return new ByteArray(cert.getEncoded()).getBase64();
400
                          } catch (CertificateEncodingException e) {
401
                            throw new RuntimeException(e);
402
                          }
403
                        })
404 1 1. lambda$getAttestationTrustPathJson$6 : replaced return value with Collections.emptyList for com/yubico/webauthn/RegistrationResult::lambda$getAttestationTrustPathJson$6 → KILLED
                    .collect(Collectors.toList()));
405
  }
406
}

Mutations

101

1.1
Location : <init>
Killed by : com.yubico.webauthn.RelyingPartyCeremoniesSpec
negated conditional → KILLED

111

1.1
Location : fromJson
Killed by : com.yubico.webauthn.data.JsonIoSpec
negated conditional → KILLED

115

1.1
Location : fromJson
Killed by : com.yubico.webauthn.data.JsonIoSpec
negated conditional → KILLED

116

1.1
Location : fromJson
Killed by : com.yubico.webauthn.data.JsonIoSpec
negated conditional → KILLED

117

1.1
Location : fromJson
Killed by : com.yubico.webauthn.data.JsonIoSpec
replaced return value with null for com/yubico/webauthn/RegistrationResult::fromJson → KILLED

127

1.1
Location : lambda$fromJson$0
Killed by : com.yubico.webauthn.data.JsonIoSpec
replaced return value with null for com/yubico/webauthn/RegistrationResult::lambda$fromJson$0 → KILLED

132

1.1
Location : lambda$fromJson$1
Killed by : com.yubico.webauthn.data.JsonIoSpec
replaced return value with Collections.emptyList for com/yubico/webauthn/RegistrationResult::lambda$fromJson$1 → KILLED

151

1.1
Location : isUserVerified
Killed by : com.yubico.webauthn.RelyingPartyV2RegistrationSpec
replaced boolean return with false for com/yubico/webauthn/RegistrationResult::isUserVerified → KILLED

2.2
Location : isUserVerified
Killed by : com.yubico.webauthn.RelyingPartyV2RegistrationSpec
replaced boolean return with true for com/yubico/webauthn/RegistrationResult::isUserVerified → KILLED

177

1.1
Location : isBackupEligible
Killed by : com.yubico.webauthn.RelyingPartyV2RegistrationSpec
replaced boolean return with true for com/yubico/webauthn/RegistrationResult::isBackupEligible → KILLED

2.2
Location : isBackupEligible
Killed by : com.yubico.webauthn.RelyingPartyV2RegistrationSpec
replaced boolean return with false for com/yubico/webauthn/RegistrationResult::isBackupEligible → KILLED

202

1.1
Location : isBackedUp
Killed by : com.yubico.webauthn.RelyingPartyV2RegistrationSpec
replaced boolean return with true for com/yubico/webauthn/RegistrationResult::isBackedUp → KILLED

2.2
Location : isBackedUp
Killed by : com.yubico.webauthn.RelyingPartyV2RegistrationSpec
replaced boolean return with false for com/yubico/webauthn/RegistrationResult::isBackedUp → KILLED

216

1.1
Location : getAuthenticatorAttachment
Killed by : com.yubico.webauthn.RelyingPartyV2RegistrationSpec
replaced return value with Optional.empty for com/yubico/webauthn/RegistrationResult::getAuthenticatorAttachment → KILLED

229

1.1
Location : getSignatureCount
Killed by : com.yubico.webauthn.RelyingPartyV2RegistrationSpec
replaced long return with 0 for com/yubico/webauthn/RegistrationResult::getSignatureCount → KILLED

247

1.1
Location : getKeyId
Killed by : com.yubico.webauthn.RelyingPartyCeremoniesSpec
replaced return value with null for com/yubico/webauthn/RegistrationResult::getKeyId → KILLED

264

1.1
Location : getAaguid
Killed by : com.yubico.webauthn.RelyingPartyV2RegistrationSpec
replaced return value with null for com/yubico/webauthn/RegistrationResult::getAaguid → KILLED

283

1.1
Location : getPublicKeyCose
Killed by : com.yubico.webauthn.RelyingPartyCeremoniesSpec
replaced return value with null for com/yubico/webauthn/RegistrationResult::getPublicKeyCose → KILLED

302

1.1
Location : getParsedPublicKey
Killed by : none
replaced return value with null for com/yubico/webauthn/RegistrationResult::getParsedPublicKey → NO_COVERAGE

320

1.1
Location : getClientExtensionOutputs
Killed by : com.yubico.webauthn.RelyingPartyV2RegistrationSpec
replaced return value with Optional.empty for com/yubico/webauthn/RegistrationResult::getClientExtensionOutputs → KILLED

321

1.1
Location : lambda$getClientExtensionOutputs$2
Killed by : com.yubico.webauthn.RelyingPartyV2RegistrationSpec
negated conditional → KILLED

2.2
Location : lambda$getClientExtensionOutputs$2
Killed by : none
replaced boolean return with true for com/yubico/webauthn/RegistrationResult::lambda$getClientExtensionOutputs$2 → SURVIVED

339

1.1
Location : getAuthenticatorExtensionOutputs
Killed by : com.yubico.webauthn.RelyingPartyV2RegistrationSpec
replaced return value with Optional.empty for com/yubico/webauthn/RegistrationResult::getAuthenticatorExtensionOutputs → KILLED

365

1.1
Location : isDiscoverable
Killed by : com.yubico.webauthn.RelyingPartyV2RegistrationSpec
replaced return value with Optional.empty for com/yubico/webauthn/RegistrationResult::isDiscoverable → KILLED

366

1.1
Location : lambda$isDiscoverable$3
Killed by : com.yubico.webauthn.RelyingPartyV2RegistrationSpec
replaced return value with Optional.empty for com/yubico/webauthn/RegistrationResult::lambda$isDiscoverable$3 → KILLED

367

1.1
Location : lambda$isDiscoverable$4
Killed by : com.yubico.webauthn.RelyingPartyV2RegistrationSpec
replaced return value with Optional.empty for com/yubico/webauthn/RegistrationResult::lambda$isDiscoverable$4 → KILLED

387

1.1
Location : getAttestationTrustPath
Killed by : com.yubico.webauthn.RelyingPartyV2RegistrationSpec
replaced return value with Optional.empty for com/yubico/webauthn/RegistrationResult::getAttestationTrustPath → KILLED

392

1.1
Location : getAttestationTrustPathJson
Killed by : com.yubico.webauthn.data.JsonIoSpec
replaced return value with Optional.empty for com/yubico/webauthn/RegistrationResult::getAttestationTrustPathJson → KILLED

399

1.1
Location : lambda$getAttestationTrustPathJson$5
Killed by : com.yubico.webauthn.data.JsonIoSpec
replaced return value with "" for com/yubico/webauthn/RegistrationResult::lambda$getAttestationTrustPathJson$5 → KILLED

404

1.1
Location : lambda$getAttestationTrustPathJson$6
Killed by : com.yubico.webauthn.data.JsonIoSpec
replaced return value with Collections.emptyList for com/yubico/webauthn/RegistrationResult::lambda$getAttestationTrustPathJson$6 → KILLED

Active mutators

Tests examined


Report generated by PIT 1.15.0