/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.security.keystore;

/**
 * @hide
 *
 * This is an interface to encapsulate the user authentication arguments that
 * are passed to KeymasterUtils.addUserAuthArgs. Classes that represent
 * authorization characteristics for new or imported keys can implement this
 * interface to be passed to that method.
 */
public interface UserAuthArgs {

    boolean isUserAuthenticationRequired();
    int getUserAuthenticationValidityDurationSeconds();
    @KeyProperties.AuthEnum int getUserAuthenticationType();
    boolean isUserAuthenticationValidWhileOnBody();
    boolean isInvalidatedByBiometricEnrollment();
    boolean isUserConfirmationRequired();
    long getBoundToSpecificSecureUserId();
    boolean isUserPresenceRequired();
    boolean isUnlockedDeviceRequired();
}
