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