| /* | |
| * Copyright (C) 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; | |
| import android.annotation.NonNull; | |
| import android.hardware.security.keymint.HardwareAuthToken; | |
| import android.hardware.security.secureclock.Timestamp; | |
| import java.nio.ByteBuffer; | |
| import java.nio.ByteOrder; | |
| /** | |
| * @hide This Utils class provides method(s) for AuthToken conversion. | |
| */ | |
| public class AuthTokenUtils { | |
| private AuthTokenUtils(){ | |
| } | |
| /** | |
| * Build a HardwareAuthToken from a byte array | |
| * @param array byte array representing an auth token | |
| * @return HardwareAuthToken representation of an auth token | |
| */ | |
| public static @NonNull HardwareAuthToken toHardwareAuthToken(@NonNull byte[] array) { | |
| final HardwareAuthToken hardwareAuthToken = new HardwareAuthToken(); | |
| // First byte is version, which does not exist in HardwareAuthToken anymore | |
| // Next 8 bytes is the challenge. | |
| hardwareAuthToken.challenge = | |
| ByteBuffer.wrap(array, 1, 8).order(ByteOrder.nativeOrder()).getLong(); | |
| // Next 8 bytes is the userId | |
| hardwareAuthToken.userId = | |
| ByteBuffer.wrap(array, 9, 8).order(ByteOrder.nativeOrder()).getLong(); | |
| // Next 8 bytes is the authenticatorId. | |
| hardwareAuthToken.authenticatorId = | |
| ByteBuffer.wrap(array, 17, 8).order(ByteOrder.nativeOrder()).getLong(); | |
| // while the other fields are in machine byte order, authenticatorType and timestamp | |
| // are in network byte order. | |
| // Next 4 bytes is the authenticatorType. | |
| hardwareAuthToken.authenticatorType = | |
| ByteBuffer.wrap(array, 25, 4).order(ByteOrder.BIG_ENDIAN).getInt(); | |
| // Next 8 bytes is the timestamp. | |
| final Timestamp timestamp = new Timestamp(); | |
| timestamp.milliSeconds = | |
| ByteBuffer.wrap(array, 29, 8).order(ByteOrder.BIG_ENDIAN).getLong(); | |
| hardwareAuthToken.timestamp = timestamp; | |
| // Last 32 bytes is the mac, 37:69 | |
| hardwareAuthToken.mac = new byte[32]; | |
| System.arraycopy(array, 37 /* srcPos */, | |
| hardwareAuthToken.mac, | |
| 0 /* destPos */, | |
| 32 /* length */); | |
| return hardwareAuthToken; | |
| } | |
| } |