xref: /aosp_15_r20/hardware/interfaces/biometrics/face/1.0/IBiometricsFace.hal (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker/*
2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker *
4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker *
8*4d7e907cSAndroid Build Coastguard Worker *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker *
10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker */
16*4d7e907cSAndroid Build Coastguard Worker
17*4d7e907cSAndroid Build Coastguard Workerpackage [email protected];
18*4d7e907cSAndroid Build Coastguard Worker
19*4d7e907cSAndroid Build Coastguard Workerimport IBiometricsFaceClientCallback;
20*4d7e907cSAndroid Build Coastguard Worker
21*4d7e907cSAndroid Build Coastguard Worker/**
22*4d7e907cSAndroid Build Coastguard Worker * The HAL interface for biometric face authentication.
23*4d7e907cSAndroid Build Coastguard Worker */
24*4d7e907cSAndroid Build Coastguard Workerinterface IBiometricsFace {
25*4d7e907cSAndroid Build Coastguard Worker
26*4d7e907cSAndroid Build Coastguard Worker    /**
27*4d7e907cSAndroid Build Coastguard Worker     * Sets the current client callback.
28*4d7e907cSAndroid Build Coastguard Worker     *
29*4d7e907cSAndroid Build Coastguard Worker     * Registers a user function that must receive notifications from the HAL.
30*4d7e907cSAndroid Build Coastguard Worker     * There is usually only one client (FaceService). This call must block
31*4d7e907cSAndroid Build Coastguard Worker     * if the HAL state machine is in busy state until the HAL leaves the
32*4d7e907cSAndroid Build Coastguard Worker     * busy state.
33*4d7e907cSAndroid Build Coastguard Worker     *
34*4d7e907cSAndroid Build Coastguard Worker     * All callback methods pass a deviceId to differentiate callback
35*4d7e907cSAndroid Build Coastguard Worker     * invocations in the case where multiple sensors exist.
36*4d7e907cSAndroid Build Coastguard Worker     *
37*4d7e907cSAndroid Build Coastguard Worker     * @param clientCallback The client defined callback to register.
38*4d7e907cSAndroid Build Coastguard Worker     * @return result, with its "value" parameter representing a "deviceId",
39*4d7e907cSAndroid Build Coastguard Worker     *     which must be unique for a given sensor.
40*4d7e907cSAndroid Build Coastguard Worker     */
41*4d7e907cSAndroid Build Coastguard Worker    @callflow(next={"setActiveUser"})
42*4d7e907cSAndroid Build Coastguard Worker    @entry
43*4d7e907cSAndroid Build Coastguard Worker    setCallback(IBiometricsFaceClientCallback clientCallback)
44*4d7e907cSAndroid Build Coastguard Worker        generates (OptionalUint64 result);
45*4d7e907cSAndroid Build Coastguard Worker
46*4d7e907cSAndroid Build Coastguard Worker    /**
47*4d7e907cSAndroid Build Coastguard Worker     * Sets the active user, which all subsequent HAL operations are applied to.
48*4d7e907cSAndroid Build Coastguard Worker     *
49*4d7e907cSAndroid Build Coastguard Worker     * HAL service implementors must ensure that operations are restricted to
50*4d7e907cSAndroid Build Coastguard Worker     * the given user. Clients must not call any part of this interface, except
51*4d7e907cSAndroid Build Coastguard Worker     * for setCallback(), without first having set an active user. The
52*4d7e907cSAndroid Build Coastguard Worker     * implementation is responsible for cancelling the current operation and
53*4d7e907cSAndroid Build Coastguard Worker     * returning to the idle state. Calling this method with the same userId
54*4d7e907cSAndroid Build Coastguard Worker     * should have no effect on the state machine.
55*4d7e907cSAndroid Build Coastguard Worker     *
56*4d7e907cSAndroid Build Coastguard Worker     * Note that onLockoutChanged() MUST be invoked by the implementation in
57*4d7e907cSAndroid Build Coastguard Worker     * response to a user change in order to update the framework with the
58*4d7e907cSAndroid Build Coastguard Worker     * timeout of the new user (or 0 if the user is not locked out).
59*4d7e907cSAndroid Build Coastguard Worker     *
60*4d7e907cSAndroid Build Coastguard Worker     * @param userId A non-negative user identifier that must be unique and
61*4d7e907cSAndroid Build Coastguard Worker     *     persistent for a given user.
62*4d7e907cSAndroid Build Coastguard Worker     * @param storePath absolute filesystem path to the template storage
63*4d7e907cSAndroid Build Coastguard Worker     *     directory. This must be the /data/vendor_de/<user>/facedata
64*4d7e907cSAndroid Build Coastguard Worker     *     directory specified by the SeLinux policy.
65*4d7e907cSAndroid Build Coastguard Worker     */
66*4d7e907cSAndroid Build Coastguard Worker    @callflow(next={"authenticate", "generateChallenge", "enumerate", "remove"})
67*4d7e907cSAndroid Build Coastguard Worker    setActiveUser(int32_t userId, string storePath) generates (Status status);
68*4d7e907cSAndroid Build Coastguard Worker
69*4d7e907cSAndroid Build Coastguard Worker    /**
70*4d7e907cSAndroid Build Coastguard Worker     * Begins a secure transaction request, e.g. enroll() or resetLockout().
71*4d7e907cSAndroid Build Coastguard Worker     *
72*4d7e907cSAndroid Build Coastguard Worker     * Generates a unique and cryptographically secure random token used to
73*4d7e907cSAndroid Build Coastguard Worker     * indicate the start of a secure transaction. generateChallenge() and
74*4d7e907cSAndroid Build Coastguard Worker     * revokeChallenge() specify a window where the resulting HAT that is
75*4d7e907cSAndroid Build Coastguard Worker     * generated in response to checking the user's PIN/pattern/password
76*4d7e907cSAndroid Build Coastguard Worker     * can be used to verify/perform a secure transaction.
77*4d7e907cSAndroid Build Coastguard Worker     *
78*4d7e907cSAndroid Build Coastguard Worker     * generateChallenge() generates a challenge which must then be wrapped by
79*4d7e907cSAndroid Build Coastguard Worker     * gatekeeper after verifying a successful strong authentication attempt,
80*4d7e907cSAndroid Build Coastguard Worker     * which generates a Hardware Authentication Token. The challenge prevents
81*4d7e907cSAndroid Build Coastguard Worker     * spoofing and replay attacks and ensures that only a transaction backed
82*4d7e907cSAndroid Build Coastguard Worker     * by a user authentication (PIN/pattern/password) can proceed.
83*4d7e907cSAndroid Build Coastguard Worker     *
84*4d7e907cSAndroid Build Coastguard Worker     * The implementation should be tolerant of revokeChallenge() being invoked
85*4d7e907cSAndroid Build Coastguard Worker     * after timeout has expired.
86*4d7e907cSAndroid Build Coastguard Worker     *
87*4d7e907cSAndroid Build Coastguard Worker     * @param challengeTimeoutSec A timeout in seconds, after which the driver
88*4d7e907cSAndroid Build Coastguard Worker     *     must invalidate the challenge. This is to prevent bugs or crashes in
89*4d7e907cSAndroid Build Coastguard Worker     *     the system from leaving a challenge enabled indefinitely.
90*4d7e907cSAndroid Build Coastguard Worker     * @return result, with its "value" parameter representing a "challenge": a
91*4d7e907cSAndroid Build Coastguard Worker     *     unique and cryptographically secure random token.
92*4d7e907cSAndroid Build Coastguard Worker     */
93*4d7e907cSAndroid Build Coastguard Worker    @callflow(next={"enroll", "revokeChallenge", "setFeature"})
94*4d7e907cSAndroid Build Coastguard Worker    generateChallenge(uint32_t challengeTimeoutSec)
95*4d7e907cSAndroid Build Coastguard Worker        generates (OptionalUint64 result);
96*4d7e907cSAndroid Build Coastguard Worker
97*4d7e907cSAndroid Build Coastguard Worker    /**
98*4d7e907cSAndroid Build Coastguard Worker     * Enrolls a user's face.
99*4d7e907cSAndroid Build Coastguard Worker     *
100*4d7e907cSAndroid Build Coastguard Worker     * Note that the Hardware Authentication Token must be valid for the
101*4d7e907cSAndroid Build Coastguard Worker     * duration of enrollment and thus should be explicitly invalidated by a
102*4d7e907cSAndroid Build Coastguard Worker     * call to revokeChallenge() when enrollment is complete, to reduce the
103*4d7e907cSAndroid Build Coastguard Worker     * window of opportunity to re-use the challenge and HAT. For example,
104*4d7e907cSAndroid Build Coastguard Worker     * Settings calls generateChallenge() once to allow the user to enroll one
105*4d7e907cSAndroid Build Coastguard Worker     * or more faces or toggle secure settings without having to re-enter the
106*4d7e907cSAndroid Build Coastguard Worker     * PIN/pattern/password. Once the user completes the operation, Settings
107*4d7e907cSAndroid Build Coastguard Worker     * invokes revokeChallenge() to close the transaction. If the HAT is expired,
108*4d7e907cSAndroid Build Coastguard Worker     * the implementation must invoke onError with UNABLE_TO_PROCESS.
109*4d7e907cSAndroid Build Coastguard Worker     *
110*4d7e907cSAndroid Build Coastguard Worker     * This method triggers the IBiometricsFaceClientCallback#onEnrollResult()
111*4d7e907cSAndroid Build Coastguard Worker     * method.
112*4d7e907cSAndroid Build Coastguard Worker     *
113*4d7e907cSAndroid Build Coastguard Worker     * @param hat A valid Hardware Authentication Token, generated as a result
114*4d7e907cSAndroid Build Coastguard Worker     *     of a generateChallenge() challenge being wrapped by the gatekeeper
115*4d7e907cSAndroid Build Coastguard Worker     *     after a successful strong authentication request.
116*4d7e907cSAndroid Build Coastguard Worker     * @param timeoutSec A timeout in seconds, after which this enroll
117*4d7e907cSAndroid Build Coastguard Worker     *     attempt is cancelled. Note that the framework can continue
118*4d7e907cSAndroid Build Coastguard Worker     *     enrollment by calling this again with a valid HAT. This timeout is
119*4d7e907cSAndroid Build Coastguard Worker     *     expected to be used to limit power usage if the device becomes idle
120*4d7e907cSAndroid Build Coastguard Worker     *     during enrollment. The implementation is expected to send
121*4d7e907cSAndroid Build Coastguard Worker     *     ERROR_TIMEOUT if this happens.
122*4d7e907cSAndroid Build Coastguard Worker     * @param disabledFeatures A list of features to be disabled during
123*4d7e907cSAndroid Build Coastguard Worker     *     enrollment. Note that all features are enabled by default.
124*4d7e907cSAndroid Build Coastguard Worker     * @return status The status of this method call.
125*4d7e907cSAndroid Build Coastguard Worker     */
126*4d7e907cSAndroid Build Coastguard Worker    @callflow(next={"cancel", "enroll", "revokeChallenge", "remove"})
127*4d7e907cSAndroid Build Coastguard Worker    enroll(vec<uint8_t> hat, uint32_t timeoutSec, vec<Feature> disabledFeatures)
128*4d7e907cSAndroid Build Coastguard Worker        generates (Status status);
129*4d7e907cSAndroid Build Coastguard Worker
130*4d7e907cSAndroid Build Coastguard Worker    /**
131*4d7e907cSAndroid Build Coastguard Worker     * Finishes the secure transaction by invalidating the challenge generated
132*4d7e907cSAndroid Build Coastguard Worker     * by generateChallenge().
133*4d7e907cSAndroid Build Coastguard Worker     *
134*4d7e907cSAndroid Build Coastguard Worker     * Clients must call this method once the secure transaction (e.g. enroll
135*4d7e907cSAndroid Build Coastguard Worker     * or setFeature) is completed. See generateChallenge().
136*4d7e907cSAndroid Build Coastguard Worker     *
137*4d7e907cSAndroid Build Coastguard Worker     * @return status The status of this method call.
138*4d7e907cSAndroid Build Coastguard Worker     */
139*4d7e907cSAndroid Build Coastguard Worker    @callflow(next={"authenticate", "setActiveUser", "enumerate", "remove"})
140*4d7e907cSAndroid Build Coastguard Worker    revokeChallenge() generates (Status status);
141*4d7e907cSAndroid Build Coastguard Worker
142*4d7e907cSAndroid Build Coastguard Worker    /**
143*4d7e907cSAndroid Build Coastguard Worker     * Changes the state of previous enrollment setting. Because this may
144*4d7e907cSAndroid Build Coastguard Worker     * decrease security, the user must enter their password before this method
145*4d7e907cSAndroid Build Coastguard Worker     * is invoked (see @param HAT). The driver must verify the HAT before
146*4d7e907cSAndroid Build Coastguard Worker     * changing any feature state. This method must return ILLEGAL_ARGUMENT if
147*4d7e907cSAndroid Build Coastguard Worker     * the HAT or faceId is invalid. This must only be invoked after
148*4d7e907cSAndroid Build Coastguard Worker     * setActiveUser() is called.
149*4d7e907cSAndroid Build Coastguard Worker     *
150*4d7e907cSAndroid Build Coastguard Worker     * Note: In some cases it may not be possible to change the state of this
151*4d7e907cSAndroid Build Coastguard Worker     * flag without re-enrolling. For example, if the user didn't provide
152*4d7e907cSAndroid Build Coastguard Worker     * attention during the original enrollment. This flag reflects the same
153*4d7e907cSAndroid Build Coastguard Worker     * persistent state as the one passed to enroll().
154*4d7e907cSAndroid Build Coastguard Worker     *
155*4d7e907cSAndroid Build Coastguard Worker     * Note: This call may block for a short amount of time (few hundred
156*4d7e907cSAndroid Build Coastguard Worker     * milliseconds). Clients are expected to invoke this asynchronously if it
157*4d7e907cSAndroid Build Coastguard Worker     * takes much longer than the above limit. Also note that the result is
158*4d7e907cSAndroid Build Coastguard Worker     * returned solely through Status (and not onError).
159*4d7e907cSAndroid Build Coastguard Worker     *
160*4d7e907cSAndroid Build Coastguard Worker     * @param feature The feature to be enabled or disabled.
161*4d7e907cSAndroid Build Coastguard Worker     * @param enabled True to enable the feature, false to disable.
162*4d7e907cSAndroid Build Coastguard Worker     * @param hat A valid Hardware Authentication Token, generated as a result
163*4d7e907cSAndroid Build Coastguard Worker     *     of getChallenge().
164*4d7e907cSAndroid Build Coastguard Worker     * @param faceId the ID of the enrollment returned by onEnrollResult() for
165*4d7e907cSAndroid Build Coastguard Worker     *     the feature to update.
166*4d7e907cSAndroid Build Coastguard Worker     * @return status The status of this method call.
167*4d7e907cSAndroid Build Coastguard Worker     */
168*4d7e907cSAndroid Build Coastguard Worker    setFeature(Feature feature, bool enabled, vec<uint8_t> hat, uint32_t faceId)
169*4d7e907cSAndroid Build Coastguard Worker        generates(Status status);
170*4d7e907cSAndroid Build Coastguard Worker
171*4d7e907cSAndroid Build Coastguard Worker    /**
172*4d7e907cSAndroid Build Coastguard Worker     * Retrieves the current state of the feature. If the faceId is invalid,
173*4d7e907cSAndroid Build Coastguard Worker     * the implementation must return ILLEGAL_ARGUMENT.
174*4d7e907cSAndroid Build Coastguard Worker     *
175*4d7e907cSAndroid Build Coastguard Worker     * @param faceId the ID of the enrollment returned by enroll().
176*4d7e907cSAndroid Build Coastguard Worker     * @return result with the value set to true if the feature is enabled,
177*4d7e907cSAndroid Build Coastguard Worker     *     false if disabled.
178*4d7e907cSAndroid Build Coastguard Worker     */
179*4d7e907cSAndroid Build Coastguard Worker    getFeature(Feature feature, uint32_t faceId) generates (OptionalBool result);
180*4d7e907cSAndroid Build Coastguard Worker
181*4d7e907cSAndroid Build Coastguard Worker    /**
182*4d7e907cSAndroid Build Coastguard Worker     * Returns an identifier associated with the current face set.
183*4d7e907cSAndroid Build Coastguard Worker     *
184*4d7e907cSAndroid Build Coastguard Worker     * The authenticator ID must change whenever a new face is enrolled. The
185*4d7e907cSAndroid Build Coastguard Worker     * authenticator ID must not be changed when a face is deleted. The
186*4d7e907cSAndroid Build Coastguard Worker     * authenticator ID must be an entropy-encoded random number which all
187*4d7e907cSAndroid Build Coastguard Worker     * current templates are tied to. The authenticator ID must be immutable
188*4d7e907cSAndroid Build Coastguard Worker     * outside of an active enrollment window to prevent replay attacks.
189*4d7e907cSAndroid Build Coastguard Worker     *
190*4d7e907cSAndroid Build Coastguard Worker     * @return result, with its value parameter representing an
191*4d7e907cSAndroid Build Coastguard Worker     *     "authenticatorId": an identifier associated to the user's current
192*4d7e907cSAndroid Build Coastguard Worker     *     face enrollment.
193*4d7e907cSAndroid Build Coastguard Worker     */
194*4d7e907cSAndroid Build Coastguard Worker    @callflow(next={"authenticate"})
195*4d7e907cSAndroid Build Coastguard Worker    getAuthenticatorId() generates (OptionalUint64 result);
196*4d7e907cSAndroid Build Coastguard Worker
197*4d7e907cSAndroid Build Coastguard Worker    /**
198*4d7e907cSAndroid Build Coastguard Worker     * Cancels the current enroll, authenticate, remove, or enumerate operation.
199*4d7e907cSAndroid Build Coastguard Worker     *
200*4d7e907cSAndroid Build Coastguard Worker     * @return status The status of this method call.
201*4d7e907cSAndroid Build Coastguard Worker     */
202*4d7e907cSAndroid Build Coastguard Worker    @callflow(next={"authenticate", "enroll", "enumerate", "remove",
203*4d7e907cSAndroid Build Coastguard Worker        "setActiveUser"})
204*4d7e907cSAndroid Build Coastguard Worker    cancel() generates (Status status);
205*4d7e907cSAndroid Build Coastguard Worker
206*4d7e907cSAndroid Build Coastguard Worker    /**
207*4d7e907cSAndroid Build Coastguard Worker     * Enumerates all face templates associated with the active user.
208*4d7e907cSAndroid Build Coastguard Worker     *
209*4d7e907cSAndroid Build Coastguard Worker     * The onEnumerate() callback method is invoked once for each face template
210*4d7e907cSAndroid Build Coastguard Worker     * found.
211*4d7e907cSAndroid Build Coastguard Worker     *
212*4d7e907cSAndroid Build Coastguard Worker     * @return status The status of this method call.
213*4d7e907cSAndroid Build Coastguard Worker     */
214*4d7e907cSAndroid Build Coastguard Worker    @callflow(next={"remove", "enroll", "authenticate", "setActiveUser"})
215*4d7e907cSAndroid Build Coastguard Worker    enumerate() generates (Status status);
216*4d7e907cSAndroid Build Coastguard Worker
217*4d7e907cSAndroid Build Coastguard Worker    /**
218*4d7e907cSAndroid Build Coastguard Worker     * Removes a face template or all face templates associated with the active
219*4d7e907cSAndroid Build Coastguard Worker     * user.
220*4d7e907cSAndroid Build Coastguard Worker     *
221*4d7e907cSAndroid Build Coastguard Worker     * This method triggers the IBiometricsFaceClientCallback#onRemoved() method.
222*4d7e907cSAndroid Build Coastguard Worker     *
223*4d7e907cSAndroid Build Coastguard Worker     * @param faceId The id correpsonding to the face to be removed; or 0 if all
224*4d7e907cSAndroid Build Coastguard Worker     *    faces are to be removed.
225*4d7e907cSAndroid Build Coastguard Worker     * @return status The status of this method call.
226*4d7e907cSAndroid Build Coastguard Worker     */
227*4d7e907cSAndroid Build Coastguard Worker    @callflow(next={"enumerate", "authenticate", "cancel", "getAuthenticatorId",
228*4d7e907cSAndroid Build Coastguard Worker        "setActiveUser"})
229*4d7e907cSAndroid Build Coastguard Worker    remove(uint32_t faceId) generates (Status status);
230*4d7e907cSAndroid Build Coastguard Worker
231*4d7e907cSAndroid Build Coastguard Worker    /**
232*4d7e907cSAndroid Build Coastguard Worker     * Authenticates the active user.
233*4d7e907cSAndroid Build Coastguard Worker     *
234*4d7e907cSAndroid Build Coastguard Worker     * An optional operationId can be specified as a token from the transaction
235*4d7e907cSAndroid Build Coastguard Worker     * being authorized. The hardware may enter a standby state during
236*4d7e907cSAndroid Build Coastguard Worker     * authentication, where the device is idle to conserve power while
237*4d7e907cSAndroid Build Coastguard Worker     * authenticating, e.g. after 3 seconds without finding a face. See
238*4d7e907cSAndroid Build Coastguard Worker     * IBiometricsFace#userActivity() for more info.
239*4d7e907cSAndroid Build Coastguard Worker     *
240*4d7e907cSAndroid Build Coastguard Worker     * @param operationId A non-zero operation id associated with a crypto
241*4d7e907cSAndroid Build Coastguard Worker     * object instance; or 0 if not being used.
242*4d7e907cSAndroid Build Coastguard Worker     * @return status The status of this method call.
243*4d7e907cSAndroid Build Coastguard Worker     */
244*4d7e907cSAndroid Build Coastguard Worker    @callflow(next={"cancel", "generateChallenge", "remove"})
245*4d7e907cSAndroid Build Coastguard Worker    authenticate(uint64_t operationId) generates (Status status);
246*4d7e907cSAndroid Build Coastguard Worker
247*4d7e907cSAndroid Build Coastguard Worker    /**
248*4d7e907cSAndroid Build Coastguard Worker     * A hint to the HAL to continue looking for faces.
249*4d7e907cSAndroid Build Coastguard Worker     *
250*4d7e907cSAndroid Build Coastguard Worker     * This method should only be used when the HAL is in the authenticating
251*4d7e907cSAndroid Build Coastguard Worker     * or standby state. Using this method when the HAL is not in one of the
252*4d7e907cSAndroid Build Coastguard Worker     * mentioned states must return OPERATION_NOT_SUPPORTED. Calling this
253*4d7e907cSAndroid Build Coastguard Worker     * method while the HAL is already authenticating may extend the duration
254*4d7e907cSAndroid Build Coastguard Worker     * where it's looking for a face.
255*4d7e907cSAndroid Build Coastguard Worker     *
256*4d7e907cSAndroid Build Coastguard Worker     * @return status The status of this method call.
257*4d7e907cSAndroid Build Coastguard Worker     */
258*4d7e907cSAndroid Build Coastguard Worker    userActivity() generates (Status status);
259*4d7e907cSAndroid Build Coastguard Worker
260*4d7e907cSAndroid Build Coastguard Worker    /**
261*4d7e907cSAndroid Build Coastguard Worker     * Reset lockout for the current user.
262*4d7e907cSAndroid Build Coastguard Worker     *
263*4d7e907cSAndroid Build Coastguard Worker     * Note: This call may block for a short amount of time (few hundred
264*4d7e907cSAndroid Build Coastguard Worker     * milliseconds). Clients are expected to invoke this asynchronously if it
265*4d7e907cSAndroid Build Coastguard Worker     * takes much longer than the above limit.
266*4d7e907cSAndroid Build Coastguard Worker     *
267*4d7e907cSAndroid Build Coastguard Worker     * @param hat A valid Hardware Authentication Token, generated when the
268*4d7e907cSAndroid Build Coastguard Worker     *     user authenticates with PIN/pattern/pass. When the Hardware
269*4d7e907cSAndroid Build Coastguard Worker     *     Authentication Token is verified, lockout must be reset and
270*4d7e907cSAndroid Build Coastguard Worker     *     onLockoutChanged must be called with duration 0.
271*4d7e907cSAndroid Build Coastguard Worker     * @return status The status of this method call.
272*4d7e907cSAndroid Build Coastguard Worker     */
273*4d7e907cSAndroid Build Coastguard Worker    resetLockout(vec<uint8_t> hat) generates (Status status);
274*4d7e907cSAndroid Build Coastguard Worker};
275