blob: 10e451c977077fecd62b64dd506c5090bdc313e8 [file] [log] [blame]
/*
* 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.
*
* <p>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.</p>
*
* @param accessControlProfileId the access control profile identifier.
*/
public Builder(@NonNull AccessControlProfileId accessControlProfileId) {
mProfile = new AccessControlProfile();
mProfile.mAccessControlProfileId = accessControlProfileId;
}
/**
* Set whether user authentication is required.
*
* <p>This should be used sparingly since disabling user authentication on just a single
* data element can easily create a
* <a href="https://en.wikipedia.org/wiki/Relay_attack">Relay Attack</a> if the device
* on which the credential is stored is compromised.</p>
*
* @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.
*
* <p>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)}).</p>
*
* <p>If the timeout is zero, then authentication is always required for each reader
* session.</p>
*
* @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.
*
* <p>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.</p>
*
* @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;
}
}
}