CredentialRecord.java

1
package com.yubico.webauthn;
2
3
import com.yubico.webauthn.data.AttestedCredentialData;
4
import com.yubico.webauthn.data.AuthenticatorAssertionResponse;
5
import com.yubico.webauthn.data.AuthenticatorAttestationResponse;
6
import com.yubico.webauthn.data.AuthenticatorData;
7
import com.yubico.webauthn.data.AuthenticatorTransport;
8
import com.yubico.webauthn.data.ByteArray;
9
import com.yubico.webauthn.data.PublicKeyCredentialCreationOptions;
10
import com.yubico.webauthn.data.PublicKeyCredentialDescriptor;
11
import com.yubico.webauthn.data.PublicKeyCredentialRequestOptions;
12
import com.yubico.webauthn.data.UserIdentity;
13
import java.util.Optional;
14
import java.util.Set;
15
import lombok.NonNull;
16
17
/**
18
 * An abstraction of properties of a stored WebAuthn credential.
19
 *
20
 * @see <a href="https://w3c.github.io/webauthn/#credential-record">Credential Record</a> in Web
21
 *     Authentication Level 3 (Editor's Draft)
22
 * @deprecated EXPERIMENTAL: This is an experimental feature. It is likely to change or be deleted
23
 *     before reaching a mature release.
24
 */
25
@Deprecated
26
public interface CredentialRecord extends ToPublicKeyCredentialDescriptor {
27
28
  /**
29
   * The <a href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#credential-id">credential
30
   * ID</a> of the credential.
31
   *
32
   * <p>Implementations MUST NOT return null.
33
   *
34
   * @see <a href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#credential-id">Credential
35
   *     ID</a>
36
   * @see RegistrationResult#getKeyId()
37
   * @see PublicKeyCredentialDescriptor#getId()
38
   * @deprecated EXPERIMENTAL: This is an experimental feature. It is likely to change or be deleted
39
   *     before reaching a mature release.
40
   */
41
  @Deprecated
42
  @NonNull
43
  ByteArray getCredentialId();
44
45
  /**
46
   * The <a href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#user-handle">user handle</a>
47
   * of the user the credential is registered to.
48
   *
49
   * <p>Implementations MUST NOT return null.
50
   *
51
   * @see <a href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#user-handle">User Handle</a>
52
   * @see UserIdentity#getId()
53
   * @deprecated EXPERIMENTAL: This is an experimental feature. It is likely to change or be deleted
54
   *     before reaching a mature release.
55
   */
56
  @Deprecated
57
  @NonNull
58
  ByteArray getUserHandle();
59
60
  /**
61
   * The credential public key encoded in COSE_Key format, as defined in Section 7 of <a
62
   * href="https://tools.ietf.org/html/rfc8152">RFC 8152</a>.
63
   *
64
   * <p>This is used to verify the {@link AuthenticatorAssertionResponse#getSignature() signature}
65
   * in authentication assertions.
66
   *
67
   * <p>If your database has credentials encoded in U2F (raw) format, you may need to use {@link
68
   * #cosePublicKeyFromEs256Raw(ByteArray)} to convert them before returning them in this method.
69
   *
70
   * <p>Implementations MUST NOT return null.
71
   *
72
   * @see AttestedCredentialData#getCredentialPublicKey()
73
   * @see RegistrationResult#getPublicKeyCose()
74
   * @deprecated EXPERIMENTAL: This is an experimental feature. It is likely to change or be deleted
75
   *     before reaching a mature release.
76
   */
77
  @Deprecated
78
  @NonNull
79
  ByteArray getPublicKeyCose();
80
81
  /**
82
   * The stored <a href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#signcount">signature
83
   * count</a> of the credential.
84
   *
85
   * <p>This is used to validate the {@link AuthenticatorData#getSignatureCounter() signature
86
   * counter} in authentication assertions.
87
   *
88
   * @see <a
89
   *     href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#sctn-authenticator-data">§6.1.
90
   *     Authenticator Data</a>
91
   * @see AuthenticatorData#getSignatureCounter()
92
   * @see AssertionResult#getSignatureCount()
93
   * @deprecated EXPERIMENTAL: This is an experimental feature. It is likely to change or be deleted
94
   *     before reaching a mature release.
95
   */
96
  @Deprecated
97
  long getSignatureCount();
98
99
  /**
100
   * Transport hints as to how the client might communicate with the authenticator this credential
101
   * is bound to.
102
   *
103
   * <p>Implementations SHOULD return the value returned by {@link
104
   * AuthenticatorAttestationResponse#getTransports()} when the credential was created. That value
105
   * SHOULD NOT be modified.
106
   *
107
   * <p>Implementations MUST NOT return null.
108
   *
109
   * <p>This is used to set {@link PublicKeyCredentialDescriptor#getTransports()} in {@link
110
   * PublicKeyCredentialCreationOptions#getExcludeCredentials() excludeCredentials} in {@link
111
   * RelyingParty#startRegistration(StartRegistrationOptions)} and and {@link
112
   * PublicKeyCredentialRequestOptions#getAllowCredentials() allowCredentials} in {@link
113
   * RelyingParty#startAssertion(StartAssertionOptions)}.
114
   *
115
   * @see <a
116
   *     href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#dom-authenticatorattestationresponse-gettransports">getTransports()
117
   *     in 5.2.1. Information About Public Key Credential (interface
118
   *     AuthenticatorAttestationResponse)</a>
119
   * @see <a
120
   *     href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#dom-publickeycredentialdescriptor-transports">transports
121
   *     in 5.8.3. Credential Descriptor (dictionary PublicKeyCredentialDescriptor)</a>
122
   * @see AuthenticatorAttestationResponse#getTransports()
123
   * @see PublicKeyCredentialDescriptor#getTransports()
124
   * @deprecated EXPERIMENTAL: This is an experimental feature. It is likely to change or be deleted
125
   *     before reaching a mature release.
126
   */
127
  @Deprecated
128
  Optional<Set<AuthenticatorTransport>> getTransports();
129
130
  // boolean isUvInitialized();
131
132
  /**
133
   * The state of the <a href="https://w3c.github.io/webauthn/#authdata-flags-be">BE flag</a> when
134
   * this credential was registered, if known.
135
   *
136
   * <p>If absent, it is not known whether or not this credential is backup eligible.
137
   *
138
   * <p>If present and <code>true</code>, the credential is backup eligible: it can be backed up in
139
   * some way, most commonly by syncing the private key to a cloud account.
140
   *
141
   * <p>If present and <code>false</code>, the credential is not backup eligible: it cannot be
142
   * backed up in any way.
143
   *
144
   * <p>{@link CredentialRecord} implementations SHOULD return the first known value returned by
145
   * {@link RegistrationResult#isBackupEligible()} or {@link AssertionResult#isBackupEligible()}, if
146
   * known. If unknown, {@link CredentialRecord} implementations SHOULD return <code>
147
   * Optional.empty()</code>.
148
   *
149
   * <p>Implementations MUST NOT return null.
150
   *
151
   * @deprecated EXPERIMENTAL: This is an experimental feature. It is likely to change or be deleted
152
   *     before reaching a mature release. EXPERIMENTAL: This feature is from a not yet mature
153
   *     standard; it could change as the standard matures.
154
   */
155
  @Deprecated
156
  Optional<Boolean> isBackupEligible();
157
158
  /**
159
   * The last known state of the <a href="https://w3c.github.io/webauthn/#authdata-flags-bs">BS
160
   * flag</a> for this credential, if known.
161
   *
162
   * <p>If absent, the backup state of the credential is not known.
163
   *
164
   * <p>If present and <code>true</code>, the credential is believed to be currently backed up.
165
   *
166
   * <p>If present and <code>false</code>, the credential is believed to not be currently backed up.
167
   *
168
   * <p>{@link CredentialRecord} implementations SHOULD return the most recent value returned by
169
   * {@link AssertionResult#isBackedUp()} or {@link RegistrationResult#isBackedUp()}, if known. If
170
   * unknown, {@link CredentialRecord} implementations SHOULD return <code>Optional.empty()</code>.
171
   *
172
   * <p>Implementations MUST NOT return null.
173
   *
174
   * @deprecated EXPERIMENTAL: This is an experimental feature. It is likely to change or be deleted
175
   *     before reaching a mature release. EXPERIMENTAL: This feature is from a not yet mature
176
   *     standard; it could change as the standard matures.
177
   */
178
  @Deprecated
179
  Optional<Boolean> isBackedUp();
180
181
  /**
182
   * This default implementation of {@link
183
   * ToPublicKeyCredentialDescriptor#toPublicKeyCredentialDescriptor()} sets the {@link
184
   * PublicKeyCredentialDescriptor.PublicKeyCredentialDescriptorBuilder#id(ByteArray) id} field to
185
   * the return value of {@link #getCredentialId()} and the {@link
186
   * PublicKeyCredentialDescriptor.PublicKeyCredentialDescriptorBuilder#transports(Optional)
187
   * transports} field to the return value of {@link #getTransports()}.
188
   *
189
   * @see <a
190
   *     href="https://w3c.github.io/webauthn/#credential-descriptor-for-a-credential-record">credential
191
   *     descriptor for a credential record</a> in Web Authentication Level 3 (Editor's Draft)
192
   */
193
  @Override
194
  default PublicKeyCredentialDescriptor toPublicKeyCredentialDescriptor() {
195 1 1. toPublicKeyCredentialDescriptor : replaced return value with null for com/yubico/webauthn/CredentialRecord::toPublicKeyCredentialDescriptor → KILLED
    return PublicKeyCredentialDescriptor.builder()
196
        .id(getCredentialId())
197
        .transports(getTransports())
198
        .build();
199
  }
200
201
  /**
202
   * Convert a credential public key from U2F format to COSE_Key format.
203
   *
204
   * <p>The U2F JavaScript API encoded credential public keys in <code>ALG_KEY_ECC_X962_RAW</code>
205
   * format as specified in <a
206
   * href="https://fidoalliance.org/specs/fido-v2.0-id-20180227/fido-registry-v2.0-id-20180227.html#public-key-representation-formats">FIDO
207
   * Registry §3.6.2 Public Key Representation Formats</a>. If your database has credential public
208
   * keys stored in this format, those public keys need to be converted to COSE_Key format before
209
   * they can be used by a {@link CredentialRecord} instance. This function performs the conversion.
210
   *
211
   * <p>If your application has only used the <code>navigator.credentials.create()</code> API to
212
   * register credentials, you likely do not need this function.
213
   *
214
   * @param es256RawKey a credential public key in <code>ALG_KEY_ECC_X962_RAW</code> format as
215
   *     specified in <a
216
   *     href="https://fidoalliance.org/specs/fido-v2.0-id-20180227/fido-registry-v2.0-id-20180227.html#public-key-representation-formats">FIDO
217
   *     Registry §3.6.2 Public Key Representation Formats</a>.
218
   * @return a credential public key in COSE_Key format, suitable to be returned by {@link
219
   *     CredentialRecord#getPublicKeyCose()}.
220
   * @see RegisteredCredential.RegisteredCredentialBuilder#publicKeyEs256Raw(ByteArray)
221
   */
222
  static ByteArray cosePublicKeyFromEs256Raw(final ByteArray es256RawKey) {
223 1 1. cosePublicKeyFromEs256Raw : replaced return value with null for com/yubico/webauthn/CredentialRecord::cosePublicKeyFromEs256Raw → KILLED
    return WebAuthnCodecs.rawEcKeyToCose(es256RawKey);
224
  }
225
}

Mutations

195

1.1
Location : toPublicKeyCredentialDescriptor
Killed by : com.yubico.webauthn.RelyingPartyUserIdentificationSpec
replaced return value with null for com/yubico/webauthn/CredentialRecord::toPublicKeyCredentialDescriptor → KILLED

223

1.1
Location : cosePublicKeyFromEs256Raw
Killed by : com.yubico.webauthn.RelyingPartyV2AssertionSpec
replaced return value with null for com/yubico/webauthn/CredentialRecord::cosePublicKeyFromEs256Raw → KILLED

Active mutators

Tests examined


Report generated by PIT 1.15.0