/* * Copyright 2020 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.identity; import android.annotation.NonNull; import java.security.cert.X509Certificate; /** * A class used to specify access controls. */ public class AccessControlProfile { private AccessControlProfileId mAccessControlProfileId = new AccessControlProfileId(0); private X509Certificate mReaderCertificate = null; private boolean mUserAuthenticationRequired = true; private long mUserAuthenticationTimeout = 0; private AccessControlProfile() { } AccessControlProfileId getAccessControlProfileId() { return mAccessControlProfileId; } long getUserAuthenticationTimeout() { return mUserAuthenticationTimeout; } boolean isUserAuthenticationRequired() { return mUserAuthenticationRequired; } X509Certificate getReaderCertificate() { return mReaderCertificate; } /** * A builder for {@link AccessControlProfile}. */ public static final class Builder { private AccessControlProfile mProfile; /** * Each access control profile has numeric identifier that must be unique within the * context of a Credential and may be used to reference the profile. * *
By default, the resulting {@link AccessControlProfile} will require user * authentication with a timeout of zero, thus requiring the holder to authenticate for * every presentation where data elements using this access control profile is used.
* * @param accessControlProfileId the access control profile identifier. */ public Builder(@NonNull AccessControlProfileId accessControlProfileId) { mProfile = new AccessControlProfile(); mProfile.mAccessControlProfileId = accessControlProfileId; } /** * Set whether user authentication is required. * *This should be used sparingly since disabling user authentication on just a single * data element can easily create a * Relay Attack if the device * on which the credential is stored is compromised.
* * @param userAuthenticationRequired Set to true if user authentication is required, * false otherwise. * @return The builder. */ public @NonNull Builder setUserAuthenticationRequired(boolean userAuthenticationRequired) { mProfile.mUserAuthenticationRequired = userAuthenticationRequired; return this; } /** * Sets the authentication timeout to use. * *The authentication timeout specifies the amount of time, in milliseconds, for which a * user authentication is valid, if user authentication is required (see * {@link #setUserAuthenticationRequired(boolean)}).
* *If the timeout is zero, then authentication is always required for each reader * session.
* * @param userAuthenticationTimeoutMillis the authentication timeout, in milliseconds. * @return The builder. */ public @NonNull Builder setUserAuthenticationTimeout(long userAuthenticationTimeoutMillis) { mProfile.mUserAuthenticationTimeout = userAuthenticationTimeoutMillis; return this; } /** * Sets the reader certificate to use when checking access control. * *If set, this is checked against the certificate chain presented by * reader. The access check is fulfilled only if one of the certificates * in the chain, matches the certificate set by this method.
* * @param readerCertificate the certificate to use for the access control check. * @return The builder. */ public @NonNull Builder setReaderCertificate(@NonNull X509Certificate readerCertificate) { mProfile.mReaderCertificate = readerCertificate; return this; } /** * Creates a new {@link AccessControlProfile} from the data supplied to the builder. * * @return The created {@link AccessControlProfile} object. */ public @NonNull AccessControlProfile build() { return mProfile; } } }