blob: 5e823c253820eeb0c31f407fb3bfe01572ad13b6 [file] [log] [blame]
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +00001// Copyright 2022, The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15//! This module implements test utils to generate various types of keys.
16
David Drysdale79092242024-06-18 13:13:43 +010017use crate::authorizations::AuthSetBuilder;
18use crate::ffi_test_utils::{
19 get_os_patchlevel, get_os_version, get_value_from_attest_record, get_vendor_patchlevel,
20 validate_certchain_with_strict_issuer_check,
21};
22use crate::SecLevel;
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +000023use android_hardware_security_keymint::aidl::android::hardware::security::keymint::{
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +000024 Algorithm::Algorithm, BlockMode::BlockMode, Digest::Digest, EcCurve::EcCurve,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +000025 ErrorCode::ErrorCode, HardwareAuthenticatorType::HardwareAuthenticatorType,
26 KeyOrigin::KeyOrigin, KeyParameter::KeyParameter, KeyParameterValue::KeyParameterValue,
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +000027 KeyPurpose::KeyPurpose, PaddingMode::PaddingMode, SecurityLevel::SecurityLevel, Tag::Tag,
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +000028};
29use android_system_keystore2::aidl::android::system::keystore2::{
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +000030 AuthenticatorSpec::AuthenticatorSpec, Authorization::Authorization,
David Drysdale79092242024-06-18 13:13:43 +010031 CreateOperationResponse::CreateOperationResponse, Domain::Domain, KeyDescriptor::KeyDescriptor,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +000032 KeyMetadata::KeyMetadata, ResponseCode::ResponseCode,
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +000033};
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +000034use android_system_keystore2::binder::{ExceptionCode, Result as BinderResult};
David Drysdale79092242024-06-18 13:13:43 +010035use anyhow::Result;
36use binder::ThreadState;
37use core::ops::Range;
38use nix::unistd::getuid;
39use std::collections::HashSet;
40use std::fmt::Write;
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +000041use std::path::PathBuf;
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +000042
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +000043/// Shell namespace.
44pub const SELINUX_SHELL_NAMESPACE: i64 = 1;
Rajesh Nyamagouddc6fb232021-12-08 21:27:15 +000045/// Vold namespace.
46pub const SELINUX_VOLD_NAMESPACE: i64 = 100;
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +000047
Rajesh Nyamagoudfa7c0f12021-12-02 17:15:48 +000048/// SU context.
49pub const TARGET_SU_CTX: &str = "u:r:su:s0";
50
51/// Vold context
52pub const TARGET_VOLD_CTX: &str = "u:r:vold:s0";
53
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +000054const TEE_KEYMINT_RKP_ONLY: &str = "remote_provisioning.tee.rkp_only";
55
56const STRONGBOX_KEYMINT_RKP_ONLY: &str = "remote_provisioning.strongbox.rkp_only";
57
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +000058/// Allowed tags in generated/imported key authorizations.
59/// See hardware/interfaces/security/keymint/aidl/android/hardware/security/keymint/Tag.aidl for the
60/// list feature tags.
61/// Note: This list need to be updated whenever a new Tag is introduced and is expected to be added
62/// in key authorizations.
63pub const ALLOWED_TAGS_IN_KEY_AUTHS: &[Tag] = &[
64 Tag::ACTIVE_DATETIME,
65 Tag::ALGORITHM,
66 Tag::ALLOW_WHILE_ON_BODY,
67 Tag::AUTH_TIMEOUT,
68 Tag::BLOCK_MODE,
69 Tag::BOOTLOADER_ONLY,
70 Tag::BOOT_PATCHLEVEL,
71 Tag::CALLER_NONCE,
72 Tag::CREATION_DATETIME,
73 Tag::DIGEST,
74 Tag::EARLY_BOOT_ONLY,
75 Tag::EC_CURVE,
76 Tag::IDENTITY_CREDENTIAL_KEY,
77 Tag::INCLUDE_UNIQUE_ID,
78 Tag::KEY_SIZE,
79 Tag::MAX_BOOT_LEVEL,
80 Tag::MAX_USES_PER_BOOT,
81 Tag::MIN_MAC_LENGTH,
82 Tag::NO_AUTH_REQUIRED,
83 Tag::ORIGIN,
84 Tag::ORIGINATION_EXPIRE_DATETIME,
85 Tag::OS_PATCHLEVEL,
86 Tag::OS_VERSION,
87 Tag::PADDING,
88 Tag::PURPOSE,
89 Tag::ROLLBACK_RESISTANCE,
90 Tag::RSA_OAEP_MGF_DIGEST,
91 Tag::RSA_PUBLIC_EXPONENT,
92 Tag::STORAGE_KEY,
93 Tag::TRUSTED_CONFIRMATION_REQUIRED,
94 Tag::TRUSTED_USER_PRESENCE_REQUIRED,
95 Tag::UNLOCKED_DEVICE_REQUIRED,
96 Tag::USAGE_COUNT_LIMIT,
97 Tag::USAGE_EXPIRE_DATETIME,
98 Tag::USER_AUTH_TYPE,
99 Tag::USER_ID,
100 Tag::USER_SECURE_ID,
101 Tag::VENDOR_PATCHLEVEL,
102];
103
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000104/// Key parameters to generate a key.
105pub struct KeyParams {
106 /// Key Size.
107 pub key_size: i32,
108 /// Key Purposes.
109 pub purpose: Vec<KeyPurpose>,
110 /// Padding Mode.
111 pub padding: Option<PaddingMode>,
112 /// Digest.
113 pub digest: Option<Digest>,
114 /// MFG Digest.
115 pub mgf_digest: Option<Digest>,
116 /// Block Mode.
117 pub block_mode: Option<BlockMode>,
118 /// Attestation challenge.
119 pub att_challenge: Option<Vec<u8>>,
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000120}
121
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000122/// DER-encoded PKCS#8 format RSA key. Generated using:
123/// openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -outform der | hexdump -e '30/1 "%02X" "\n"'
124pub static RSA_2048_KEY: &[u8] = &[
125 0x30, 0x82, 0x04, 0xBD, 0x02, 0x01, 0x00, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7,
126 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x04, 0xA7, 0x30, 0x82, 0x04, 0xA3, 0x02, 0x01,
127 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, 0xE5, 0x14, 0xE3, 0xC2, 0x43, 0xF3, 0x0F, 0xCC, 0x22, 0x73,
128 0x9C, 0x84, 0xCC, 0x1B, 0x6C, 0x97, 0x4B, 0xC9, 0xDF, 0x1F, 0xE2, 0xB8, 0x80, 0x85, 0xF9, 0x27,
129 0xAB, 0x97, 0x94, 0x58, 0x4B, 0xC9, 0x40, 0x94, 0x5A, 0xB4, 0xD4, 0xF8, 0xD0, 0x36, 0xC4, 0x86,
130 0x17, 0x7D, 0xA2, 0x48, 0x6D, 0x40, 0xF0, 0xB9, 0x61, 0x4F, 0xCE, 0x65, 0x80, 0x88, 0x81, 0x59,
131 0x95, 0x11, 0x24, 0xF4, 0x36, 0xB7, 0xB7, 0x37, 0x44, 0xF4, 0x6C, 0x1C, 0xEB, 0x04, 0x19, 0x78,
132 0xB2, 0x29, 0x4D, 0x21, 0x44, 0x16, 0x57, 0x58, 0x6D, 0x7D, 0x56, 0xB5, 0x99, 0xDD, 0xD2, 0xAD,
133 0x02, 0x9A, 0x72, 0x16, 0x67, 0xD6, 0x00, 0x9F, 0x69, 0xE0, 0x25, 0xEE, 0x7C, 0x86, 0x54, 0x27,
134 0x4B, 0x50, 0xEF, 0x60, 0x52, 0x60, 0x82, 0xAA, 0x09, 0x15, 0x72, 0xD2, 0xEB, 0x01, 0x52, 0x04,
135 0x39, 0x60, 0xBC, 0x5E, 0x95, 0x07, 0xC8, 0xC2, 0x3A, 0x3A, 0xE2, 0xA4, 0x99, 0x6B, 0x27, 0xE3,
136 0xA3, 0x55, 0x69, 0xC4, 0xB3, 0x2D, 0x19, 0xC4, 0x34, 0x76, 0xFC, 0x27, 0xDA, 0x22, 0xB2, 0x62,
137 0x69, 0x25, 0xDE, 0x0D, 0xE7, 0x54, 0x3C, 0xBB, 0x61, 0xD2, 0x20, 0xDA, 0x7B, 0x6E, 0x63, 0xBD,
138 0x9A, 0x4B, 0xCD, 0x75, 0xC6, 0xA1, 0x5E, 0x1C, 0x3E, 0xD5, 0x63, 0x59, 0x22, 0x7E, 0xE0, 0x6C,
139 0x98, 0x25, 0x63, 0x97, 0x56, 0xDF, 0x71, 0xF5, 0x4C, 0x78, 0xE9, 0xE1, 0xD5, 0xFC, 0xF8, 0x5A,
140 0x5B, 0xF6, 0x1D, 0xFA, 0x5A, 0x99, 0x4C, 0x99, 0x19, 0x21, 0x1D, 0xF5, 0x24, 0x07, 0xEF, 0x8A,
141 0xC9, 0x9F, 0xE7, 0x3F, 0xBB, 0x46, 0x1A, 0x16, 0x96, 0xC6, 0xD6, 0x12, 0x7E, 0xDA, 0xCB, 0xEB,
142 0x2F, 0x1D, 0x3B, 0x31, 0xCC, 0x55, 0x63, 0xA2, 0x6F, 0x8A, 0xDE, 0x35, 0x52, 0x40, 0x04, 0xBF,
143 0xE0, 0x82, 0x32, 0xE1, 0x6D, 0x8B, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, 0x00, 0x2D,
144 0x1F, 0x71, 0x41, 0x79, 0xBA, 0xED, 0xD8, 0xAA, 0xCC, 0x94, 0xFE, 0xFF, 0x69, 0x43, 0x79, 0x85,
145 0xBF, 0x2C, 0xC9, 0x0E, 0x12, 0x83, 0x96, 0x60, 0x1E, 0x75, 0x49, 0x35, 0x3A, 0x33, 0x2B, 0x60,
146 0x22, 0x18, 0xBF, 0xD7, 0xD7, 0x6E, 0xC3, 0xEA, 0xEF, 0xF2, 0xBE, 0x97, 0x71, 0xA6, 0xBB, 0x8C,
147 0xEF, 0x27, 0x00, 0xDE, 0x49, 0xD6, 0x08, 0x8D, 0x5A, 0x04, 0xE7, 0xCC, 0x9C, 0xA2, 0x0E, 0x8B,
148 0xF3, 0x42, 0x0C, 0xD7, 0x22, 0xD7, 0x14, 0x06, 0xA4, 0x64, 0x8B, 0x88, 0x1A, 0xCE, 0x5B, 0x8C,
149 0x36, 0xE9, 0xD2, 0x2F, 0x7B, 0x33, 0xE4, 0xA2, 0xB3, 0xDB, 0x78, 0x6A, 0x92, 0x89, 0x3F, 0x78,
150 0xFD, 0xED, 0x8F, 0xEE, 0x48, 0xCC, 0x94, 0x75, 0x0D, 0x0C, 0x63, 0xD3, 0xD2, 0xE8, 0x47, 0x04,
151 0x55, 0xD3, 0xD6, 0x3A, 0xB8, 0xDA, 0xFB, 0x76, 0x99, 0x48, 0x68, 0x0A, 0x92, 0xA2, 0xCD, 0xF7,
152 0x45, 0x8B, 0x50, 0xFE, 0xF9, 0x1A, 0x33, 0x24, 0x3C, 0x2E, 0xDE, 0x88, 0xAD, 0xB2, 0x5B, 0x9F,
153 0x44, 0xEA, 0xD1, 0x9F, 0xC7, 0x9F, 0x02, 0x5E, 0x31, 0x61, 0xB3, 0xD6, 0xE2, 0xE1, 0xBC, 0xFB,
154 0x1C, 0xDB, 0xBD, 0xB2, 0x9A, 0xE5, 0xEF, 0xDA, 0xCD, 0x29, 0xA5, 0x45, 0xCC, 0x67, 0x01, 0x8B,
155 0x1C, 0x1D, 0x0E, 0x8F, 0x73, 0x69, 0x4D, 0x4D, 0xF6, 0x9D, 0xA6, 0x6C, 0x9A, 0x1C, 0xF4, 0x5C,
156 0xE4, 0x83, 0x9A, 0x77, 0x12, 0x01, 0xBD, 0xCE, 0x66, 0x3A, 0x4B, 0x3D, 0x6E, 0xE0, 0x6E, 0x82,
157 0x98, 0xDE, 0x74, 0x11, 0x47, 0xEC, 0x7A, 0x3A, 0xA9, 0xD8, 0x48, 0x00, 0x26, 0x64, 0x47, 0x7B,
158 0xAE, 0x55, 0x9D, 0x29, 0x22, 0xB4, 0xB3, 0xB9, 0xB1, 0x64, 0xEA, 0x3B, 0x5A, 0xD3, 0x3F, 0x8D,
159 0x0F, 0x14, 0x7E, 0x4E, 0xB8, 0x1B, 0x06, 0xFC, 0xB1, 0x7E, 0xCD, 0xB9, 0x1A, 0x4E, 0xA1, 0x02,
160 0x81, 0x81, 0x00, 0xF9, 0xDE, 0xEE, 0xED, 0x13, 0x2F, 0xBB, 0xE7, 0xE2, 0xB3, 0x2D, 0x98, 0xD2,
161 0xE8, 0x25, 0x07, 0x5A, 0x1E, 0x51, 0x0A, 0xC8, 0xAD, 0x50, 0x4B, 0x80, 0xC6, 0x22, 0xF5, 0x9B,
162 0x08, 0xE6, 0x3D, 0x01, 0xC6, 0x3E, 0xC8, 0xD2, 0x54, 0x9F, 0x91, 0x77, 0x95, 0xCD, 0xCA, 0xC7,
163 0xE7, 0x47, 0x94, 0xA9, 0x5F, 0x4E, 0xBE, 0x31, 0x3D, 0xB4, 0xAF, 0x43, 0x0F, 0xDC, 0x8D, 0x9C,
164 0x1E, 0x52, 0x7B, 0x72, 0x21, 0x34, 0xB3, 0x96, 0x7C, 0x9C, 0xB8, 0x51, 0x65, 0x60, 0xAC, 0x3D,
165 0x11, 0x32, 0xB8, 0xD6, 0x34, 0x35, 0x66, 0xD0, 0x30, 0xB9, 0xE9, 0x67, 0x2C, 0x87, 0x73, 0x43,
166 0x9C, 0x12, 0x16, 0x7D, 0x4A, 0xD9, 0xA3, 0x4C, 0x24, 0x64, 0x6A, 0x32, 0x8E, 0xC3, 0xD8, 0x00,
167 0x90, 0x5C, 0x4D, 0x65, 0x01, 0x53, 0x8A, 0xD0, 0x87, 0xCE, 0x96, 0xEF, 0xFA, 0x73, 0x03, 0xF1,
168 0xDC, 0x1B, 0x9B, 0x02, 0x81, 0x81, 0x00, 0xEA, 0xB3, 0x69, 0x00, 0x11, 0x0E, 0x50, 0xAA, 0xD3,
169 0x22, 0x51, 0x78, 0x9D, 0xFF, 0x05, 0x62, 0xBC, 0x9A, 0x67, 0x86, 0xE1, 0xC5, 0x02, 0x2D, 0x14,
170 0x11, 0x29, 0x30, 0xE7, 0x90, 0x5D, 0x72, 0x6F, 0xC5, 0x62, 0xEB, 0xD4, 0xB0, 0x3F, 0x3D, 0xDC,
171 0xB9, 0xFC, 0x2B, 0x5C, 0xBD, 0x9E, 0x71, 0x81, 0x5C, 0xC5, 0xFE, 0xDF, 0x69, 0x73, 0x12, 0x66,
172 0x92, 0x06, 0xD4, 0xD5, 0x8F, 0xDF, 0x14, 0x2E, 0x9C, 0xD0, 0x4C, 0xC2, 0x4D, 0x31, 0x2E, 0x47,
173 0xA5, 0xDC, 0x8A, 0x83, 0x7B, 0xE8, 0xA5, 0xC3, 0x03, 0x98, 0xD8, 0xBF, 0xF4, 0x7D, 0x6E, 0x87,
174 0x55, 0xE4, 0x0F, 0x15, 0x10, 0xC8, 0x76, 0x4F, 0xAD, 0x1D, 0x1C, 0x95, 0x41, 0x9D, 0x88, 0xEC,
175 0x8C, 0xDA, 0xBA, 0x90, 0x7F, 0x8D, 0xD9, 0x8B, 0x47, 0x6C, 0x0C, 0xFF, 0xBA, 0x73, 0x00, 0x20,
176 0x1F, 0xF7, 0x7E, 0x5F, 0xF4, 0xEC, 0xD1, 0x02, 0x81, 0x80, 0x16, 0xB7, 0x43, 0xB5, 0x5D, 0xD7,
177 0x2B, 0x18, 0x0B, 0xAE, 0x0A, 0x69, 0x28, 0x53, 0x5E, 0x7A, 0x6A, 0xA0, 0xF2, 0xF1, 0x2E, 0x09,
178 0x43, 0x91, 0x79, 0xA5, 0x89, 0xAC, 0x16, 0x6A, 0x1A, 0xB4, 0x55, 0x22, 0xF6, 0xB6, 0x3F, 0x18,
179 0xDE, 0x60, 0xD5, 0x24, 0x53, 0x4F, 0x2A, 0x19, 0x46, 0x92, 0xA7, 0x4B, 0x38, 0xD7, 0x65, 0x96,
180 0x9C, 0x84, 0x8A, 0x6E, 0x38, 0xB8, 0xCF, 0x06, 0x9A, 0xAD, 0x0A, 0x55, 0x26, 0x7B, 0x65, 0x24,
181 0xF3, 0x02, 0x76, 0xB3, 0xE6, 0xB4, 0x01, 0xE1, 0x3C, 0x61, 0x3D, 0x68, 0x05, 0xAA, 0xD1, 0x26,
182 0x7C, 0xE0, 0x51, 0x36, 0xE5, 0x21, 0x7F, 0x76, 0x02, 0xD6, 0xF4, 0x91, 0x07, 0x74, 0x27, 0x09,
183 0xEF, 0xEF, 0x0F, 0xA5, 0x96, 0xFC, 0x5E, 0x20, 0xC1, 0xA3, 0x6F, 0x99, 0x4D, 0x45, 0x03, 0x6C,
184 0x35, 0x45, 0xD7, 0x8F, 0x47, 0x41, 0x86, 0x8D, 0x62, 0x1D, 0x02, 0x81, 0x81, 0x00, 0xC3, 0x93,
185 0x85, 0xA7, 0xFC, 0x8E, 0x85, 0x42, 0x14, 0x76, 0xC0, 0x95, 0x56, 0x73, 0xB0, 0xB5, 0x3A, 0x9D,
186 0x20, 0x30, 0x11, 0xEA, 0xED, 0x89, 0x4A, 0xF3, 0x91, 0xF3, 0xA2, 0xC3, 0x76, 0x5B, 0x6A, 0x30,
187 0x7D, 0xE2, 0x2F, 0x76, 0x3E, 0xFC, 0xF9, 0xF6, 0x31, 0xE0, 0xA0, 0x83, 0x92, 0x88, 0xDB, 0x57,
188 0xC7, 0xD6, 0x3F, 0xAD, 0xCB, 0xAA, 0x45, 0xB6, 0xE1, 0xE2, 0x71, 0xA4, 0x56, 0x2C, 0xA7, 0x3B,
189 0x1D, 0x89, 0x19, 0x50, 0xE1, 0xEE, 0xC2, 0xDD, 0xC0, 0x0D, 0xDC, 0xCB, 0x60, 0x6E, 0xE1, 0x37,
190 0x1A, 0x23, 0x64, 0xB2, 0x03, 0xE4, 0x1A, 0xFA, 0xC3, 0xF4, 0x9D, 0x85, 0x42, 0xC6, 0xF4, 0x56,
191 0x39, 0xB0, 0x1B, 0xE0, 0x75, 0xBA, 0x28, 0x04, 0xA8, 0x30, 0x57, 0x41, 0x33, 0x9F, 0x58, 0xA4,
192 0xC7, 0xB1, 0x7D, 0x58, 0x8D, 0x84, 0x49, 0x40, 0xDA, 0x28, 0x81, 0x25, 0xC4, 0x41, 0x02, 0x81,
193 0x80, 0x13, 0x20, 0x65, 0xD5, 0x96, 0x98, 0x8D, 0x16, 0x73, 0xA1, 0x31, 0x73, 0x79, 0xBA, 0xEC,
194 0xB0, 0xD9, 0x0C, 0xF6, 0xEF, 0x2F, 0xC2, 0xE7, 0x96, 0x9B, 0xA1, 0x2D, 0xE9, 0xFB, 0x45, 0xB9,
195 0xD0, 0x30, 0xE2, 0xBD, 0x30, 0x4F, 0xB6, 0xFE, 0x24, 0x02, 0xCF, 0x8D, 0x51, 0x48, 0x45, 0xD9,
196 0xF7, 0x20, 0x53, 0x1C, 0x0B, 0xA9, 0x7E, 0xC2, 0xA2, 0x65, 0xCC, 0x3E, 0x0E, 0x0D, 0xF1, 0x62,
197 0xDD, 0x5F, 0xBC, 0x55, 0x9B, 0x58, 0x26, 0x40, 0x6A, 0xEE, 0x02, 0x55, 0x36, 0xE9, 0xBA, 0x82,
198 0x5A, 0xFD, 0x3C, 0xDF, 0xA6, 0x26, 0x32, 0x81, 0xA9, 0x5E, 0x46, 0xBE, 0xBA, 0xDC, 0xD3, 0x2A,
199 0x3A, 0x3B, 0xC1, 0x4E, 0xF7, 0x1A, 0xDC, 0x4B, 0xAF, 0x67, 0x1B, 0x3A, 0x83, 0x0D, 0x04, 0xDE,
200 0x27, 0x47, 0xFC, 0xE6, 0x39, 0x89, 0x7B, 0x66, 0xF9, 0x50, 0x4D, 0xF1, 0xAC, 0x20, 0x43, 0x7E,
201 0xEE,
202];
203
204/// DER-encoded PKCS#8 format EC key. Generated using:
205/// openssl ecparam -name prime256v1 -genkey | openssl pkcs8 -topk8 -nocrypt -outform der | hexdump -e '30/1 "%02X" "\n"'
206pub static EC_P_256_KEY: &[u8] = &[
207 0x30, 0x81, 0x87, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02,
208 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07, 0x04, 0x6D, 0x30, 0x6B, 0x02,
209 0x01, 0x01, 0x04, 0x20, 0xB9, 0x1D, 0xAF, 0x50, 0xFD, 0xD8, 0x6A, 0x40, 0xAB, 0x2C, 0xCB, 0x54,
210 0x4E, 0xED, 0xF1, 0x64, 0xBC, 0x30, 0x25, 0xFB, 0xC4, 0x69, 0x00, 0x34, 0x1A, 0x82, 0xA3, 0x72,
211 0x5D, 0xC7, 0xA9, 0x85, 0xA1, 0x44, 0x03, 0x42, 0x00, 0x04, 0xE8, 0x53, 0x0A, 0xF2, 0xD3, 0x68,
212 0x40, 0x48, 0x8C, 0xB4, 0x2F, 0x11, 0x34, 0xD7, 0xF4, 0x4A, 0x5C, 0x33, 0xFF, 0xF6, 0x2B, 0xF7,
213 0x98, 0x0F, 0x02, 0xA5, 0xD7, 0x4F, 0xF9, 0xDE, 0x60, 0x9C, 0x6E, 0xB0, 0x45, 0xDA, 0x3F, 0xF4,
214 0x34, 0x23, 0x9B, 0x4C, 0x3A, 0x09, 0x9C, 0x5E, 0x5D, 0x37, 0x96, 0xAC, 0x4A, 0xE7, 0x65, 0x2B,
215 0xD6, 0x84, 0x98, 0xEA, 0x96, 0x91, 0xFB, 0x78, 0xED, 0x86,
216];
217
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +0000218/// DER-encoded PKCS#8 format RSA key -
219/// Size: 2048
220/// Public Exponent: 65537
221/// Purpose: WRAP_KEY, ENCRYPT, DECRYPT
222/// Encryption scheme: RSAES-PKCS1-v1_5
223/// Digest: SHA_2_256
224/// Padding: RSA_OAEP
225/// This sample wrapping_key is taken from KeyMint tests
226/// (see hardware/interfaces/security/keymint/aidl/vts/functional/KeyMintTest.cpp).
227/// Similarly more test keys can be generated with below command -
228/// openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -outform der | hexdump -e '30/1 "%02X" "\n"'
229pub static WRAPPING_KEY: &[u8] = &[
230 0x30, 0x82, 0x04, 0xbe, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
231 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x04, 0xa8, 0x30, 0x82, 0x04, 0xa4, 0x02, 0x01,
232 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, 0xae, 0xc3, 0x67, 0x93, 0x1d, 0x89, 0x00, 0xce, 0x56, 0xb0,
233 0x06, 0x7f, 0x7d, 0x70, 0xe1, 0xfc, 0x65, 0x3f, 0x3f, 0x34, 0xd1, 0x94, 0xc1, 0xfe, 0xd5, 0x00,
234 0x18, 0xfb, 0x43, 0xdb, 0x93, 0x7b, 0x06, 0xe6, 0x73, 0xa8, 0x37, 0x31, 0x3d, 0x56, 0xb1, 0xc7,
235 0x25, 0x15, 0x0a, 0x3f, 0xef, 0x86, 0xac, 0xbd, 0xdc, 0x41, 0xbb, 0x75, 0x9c, 0x28, 0x54, 0xea,
236 0xe3, 0x2d, 0x35, 0x84, 0x1e, 0xfb, 0x5c, 0x18, 0xd8, 0x2b, 0xc9, 0x0a, 0x1c, 0xb5, 0xc1, 0xd5,
237 0x5a, 0xdf, 0x24, 0x5b, 0x02, 0x91, 0x1f, 0x0b, 0x7c, 0xda, 0x88, 0xc4, 0x21, 0xff, 0x0e, 0xba,
238 0xfe, 0x7c, 0x0d, 0x23, 0xbe, 0x31, 0x2d, 0x7b, 0xd5, 0x92, 0x1f, 0xfa, 0xea, 0x13, 0x47, 0xc1,
239 0x57, 0x40, 0x6f, 0xef, 0x71, 0x8f, 0x68, 0x26, 0x43, 0xe4, 0xe5, 0xd3, 0x3c, 0x67, 0x03, 0xd6,
240 0x1c, 0x0c, 0xf7, 0xac, 0x0b, 0xf4, 0x64, 0x5c, 0x11, 0xf5, 0xc1, 0x37, 0x4c, 0x38, 0x86, 0x42,
241 0x74, 0x11, 0xc4, 0x49, 0x79, 0x67, 0x92, 0xe0, 0xbe, 0xf7, 0x5d, 0xec, 0x85, 0x8a, 0x21, 0x23,
242 0xc3, 0x67, 0x53, 0xe0, 0x2a, 0x95, 0xa9, 0x6d, 0x7c, 0x45, 0x4b, 0x50, 0x4d, 0xe3, 0x85, 0xa6,
243 0x42, 0xe0, 0xdf, 0xc3, 0xe6, 0x0a, 0xc3, 0xa7, 0xee, 0x49, 0x91, 0xd0, 0xd4, 0x8b, 0x01, 0x72,
244 0xa9, 0x5f, 0x95, 0x36, 0xf0, 0x2b, 0xa1, 0x3c, 0xec, 0xcc, 0xb9, 0x2b, 0x72, 0x7d, 0xb5, 0xc2,
245 0x7e, 0x5b, 0x2f, 0x5c, 0xec, 0x09, 0x60, 0x0b, 0x28, 0x6a, 0xf5, 0xcf, 0x14, 0xc4, 0x20, 0x24,
246 0xc6, 0x1d, 0xdf, 0xe7, 0x1c, 0x2a, 0x8d, 0x74, 0x58, 0xf1, 0x85, 0x23, 0x4c, 0xb0, 0x0e, 0x01,
247 0xd2, 0x82, 0xf1, 0x0f, 0x8f, 0xc6, 0x72, 0x1d, 0x2a, 0xed, 0x3f, 0x48, 0x33, 0xcc, 0xa2, 0xbd,
248 0x8f, 0xa6, 0x28, 0x21, 0xdd, 0x55, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, 0x00, 0x43,
249 0x14, 0x47, 0xb6, 0x25, 0x19, 0x08, 0x11, 0x2b, 0x1e, 0xe7, 0x6f, 0x99, 0xf3, 0x71, 0x1a, 0x52,
250 0xb6, 0x63, 0x09, 0x60, 0x04, 0x6c, 0x2d, 0xe7, 0x0d, 0xe1, 0x88, 0xd8, 0x33, 0xf8, 0xb8, 0xb9,
251 0x1e, 0x4d, 0x78, 0x5c, 0xae, 0xee, 0xaf, 0x4f, 0x0f, 0x74, 0x41, 0x4e, 0x2c, 0xda, 0x40, 0x64,
252 0x1f, 0x7f, 0xe2, 0x4f, 0x14, 0xc6, 0x7a, 0x88, 0x95, 0x9b, 0xdb, 0x27, 0x76, 0x6d, 0xf9, 0xe7,
253 0x10, 0xb6, 0x30, 0xa0, 0x3a, 0xdc, 0x68, 0x3b, 0x5d, 0x2c, 0x43, 0x08, 0x0e, 0x52, 0xbe, 0xe7,
254 0x1e, 0x9e, 0xae, 0xb6, 0xde, 0x29, 0x7a, 0x5f, 0xea, 0x10, 0x72, 0x07, 0x0d, 0x18, 0x1c, 0x82,
255 0x2b, 0xcc, 0xff, 0x08, 0x7d, 0x63, 0xc9, 0x40, 0xba, 0x8a, 0x45, 0xf6, 0x70, 0xfe, 0xb2, 0x9f,
256 0xb4, 0x48, 0x4d, 0x1c, 0x95, 0xe6, 0xd2, 0x57, 0x9b, 0xa0, 0x2a, 0xae, 0x0a, 0x00, 0x90, 0x0c,
257 0x3e, 0xbf, 0x49, 0x0e, 0x3d, 0x2c, 0xd7, 0xee, 0x8d, 0x0e, 0x20, 0xc5, 0x36, 0xe4, 0xdc, 0x5a,
258 0x50, 0x97, 0x27, 0x28, 0x88, 0xcd, 0xdd, 0x7e, 0x91, 0xf2, 0x28, 0xb1, 0xc4, 0xd7, 0x47, 0x4c,
259 0x55, 0xb8, 0xfc, 0xd6, 0x18, 0xc4, 0xa9, 0x57, 0xbb, 0xdd, 0xd5, 0xad, 0x74, 0x07, 0xcc, 0x31,
260 0x2d, 0x8d, 0x98, 0xa5, 0xca, 0xf7, 0xe0, 0x8f, 0x4a, 0x0d, 0x6b, 0x45, 0xbb, 0x41, 0xc6, 0x52,
261 0x65, 0x9d, 0x5a, 0x5b, 0xa0, 0x5b, 0x66, 0x37, 0x37, 0xa8, 0x69, 0x62, 0x81, 0x86, 0x5b, 0xa2,
262 0x0f, 0xbd, 0xd7, 0xf8, 0x51, 0xe6, 0xc5, 0x6e, 0x8c, 0xbe, 0x0d, 0xdb, 0xbf, 0x24, 0xdc, 0x03,
263 0xb2, 0xd2, 0xcb, 0x4c, 0x3d, 0x54, 0x0f, 0xb0, 0xaf, 0x52, 0xe0, 0x34, 0xa2, 0xd0, 0x66, 0x98,
264 0xb1, 0x28, 0xe5, 0xf1, 0x01, 0xe3, 0xb5, 0x1a, 0x34, 0xf8, 0xd8, 0xb4, 0xf8, 0x61, 0x81, 0x02,
265 0x81, 0x81, 0x00, 0xde, 0x39, 0x2e, 0x18, 0xd6, 0x82, 0xc8, 0x29, 0x26, 0x6c, 0xc3, 0x45, 0x4e,
266 0x1d, 0x61, 0x66, 0x24, 0x2f, 0x32, 0xd9, 0xa1, 0xd1, 0x05, 0x77, 0x75, 0x3e, 0x90, 0x4e, 0xa7,
267 0xd0, 0x8b, 0xff, 0x84, 0x1b, 0xe5, 0xba, 0xc8, 0x2a, 0x16, 0x4c, 0x59, 0x70, 0x00, 0x70, 0x47,
268 0xb8, 0xc5, 0x17, 0xdb, 0x8f, 0x8f, 0x84, 0xe3, 0x7b, 0xd5, 0x98, 0x85, 0x61, 0xbd, 0xf5, 0x03,
269 0xd4, 0xdc, 0x2b, 0xdb, 0x38, 0xf8, 0x85, 0x43, 0x4a, 0xe4, 0x2c, 0x35, 0x5f, 0x72, 0x5c, 0x9a,
270 0x60, 0xf9, 0x1f, 0x07, 0x88, 0xe1, 0xf1, 0xa9, 0x72, 0x23, 0xb5, 0x24, 0xb5, 0x35, 0x7f, 0xdf,
271 0x72, 0xe2, 0xf6, 0x96, 0xba, 0xb7, 0xd7, 0x8e, 0x32, 0xbf, 0x92, 0xba, 0x8e, 0x18, 0x64, 0xea,
272 0xb1, 0x22, 0x9e, 0x91, 0x34, 0x61, 0x30, 0x74, 0x8a, 0x6e, 0x3c, 0x12, 0x4f, 0x91, 0x49, 0xd7,
273 0x1c, 0x74, 0x35, 0x02, 0x81, 0x81, 0x00, 0xc9, 0x53, 0x87, 0xc0, 0xf9, 0xd3, 0x5f, 0x13, 0x7b,
274 0x57, 0xd0, 0xd6, 0x5c, 0x39, 0x7c, 0x5e, 0x21, 0xcc, 0x25, 0x1e, 0x47, 0x00, 0x8e, 0xd6, 0x2a,
275 0x54, 0x24, 0x09, 0xc8, 0xb6, 0xb6, 0xac, 0x7f, 0x89, 0x67, 0xb3, 0x86, 0x3c, 0xa6, 0x45, 0xfc,
276 0xce, 0x49, 0x58, 0x2a, 0x9a, 0xa1, 0x73, 0x49, 0xdb, 0x6c, 0x4a, 0x95, 0xaf, 0xfd, 0xae, 0x0d,
277 0xae, 0x61, 0x2e, 0x1a, 0xfa, 0xc9, 0x9e, 0xd3, 0x9a, 0x2d, 0x93, 0x4c, 0x88, 0x04, 0x40, 0xae,
278 0xd8, 0x83, 0x2f, 0x98, 0x43, 0x16, 0x3a, 0x47, 0xf2, 0x7f, 0x39, 0x21, 0x99, 0xdc, 0x12, 0x02,
279 0xf9, 0xa0, 0xf9, 0xbd, 0x08, 0x30, 0x80, 0x07, 0xcb, 0x1e, 0x4e, 0x7f, 0x58, 0x30, 0x93, 0x66,
280 0xa7, 0xde, 0x25, 0xf7, 0xc3, 0xc9, 0xb8, 0x80, 0x67, 0x7c, 0x06, 0x8e, 0x1b, 0xe9, 0x36, 0xe8,
281 0x12, 0x88, 0x81, 0x52, 0x52, 0xa8, 0xa1, 0x02, 0x81, 0x80, 0x57, 0xff, 0x8c, 0xa1, 0x89, 0x50,
282 0x80, 0xb2, 0xca, 0xe4, 0x86, 0xef, 0x0a, 0xdf, 0xd7, 0x91, 0xfb, 0x02, 0x35, 0xc0, 0xb8, 0xb3,
283 0x6c, 0xd6, 0xc1, 0x36, 0xe5, 0x2e, 0x40, 0x85, 0xf4, 0xea, 0x5a, 0x06, 0x32, 0x12, 0xa4, 0xf1,
284 0x05, 0xa3, 0x76, 0x47, 0x43, 0xe5, 0x32, 0x81, 0x98, 0x8a, 0xba, 0x07, 0x3f, 0x6e, 0x00, 0x27,
285 0x29, 0x8e, 0x1c, 0x43, 0x78, 0x55, 0x6e, 0x0e, 0xfc, 0xa0, 0xe1, 0x4e, 0xce, 0x1a, 0xf7, 0x6a,
286 0xd0, 0xb0, 0x30, 0xf2, 0x7a, 0xf6, 0xf0, 0xab, 0x35, 0xfb, 0x73, 0xa0, 0x60, 0xd8, 0xb1, 0xa0,
287 0xe1, 0x42, 0xfa, 0x26, 0x47, 0xe9, 0x3b, 0x32, 0xe3, 0x6d, 0x82, 0x82, 0xae, 0x0a, 0x4d, 0xe5,
288 0x0a, 0xb7, 0xaf, 0xe8, 0x55, 0x00, 0xa1, 0x6f, 0x43, 0xa6, 0x47, 0x19, 0xd6, 0xe2, 0xb9, 0x43,
289 0x98, 0x23, 0x71, 0x9c, 0xd0, 0x8b, 0xcd, 0x03, 0x17, 0x81, 0x02, 0x81, 0x81, 0x00, 0xba, 0x73,
290 0xb0, 0xbb, 0x28, 0xe3, 0xf8, 0x1e, 0x9b, 0xd1, 0xc5, 0x68, 0x71, 0x3b, 0x10, 0x12, 0x41, 0xac,
291 0xc6, 0x07, 0x97, 0x6c, 0x4d, 0xdc, 0xcc, 0x90, 0xe6, 0x5b, 0x65, 0x56, 0xca, 0x31, 0x51, 0x60,
292 0x58, 0xf9, 0x2b, 0x6e, 0x09, 0xf3, 0xb1, 0x60, 0xff, 0x0e, 0x37, 0x4e, 0xc4, 0x0d, 0x78, 0xae,
293 0x4d, 0x49, 0x79, 0xfd, 0xe6, 0xac, 0x06, 0xa1, 0xa4, 0x00, 0xc6, 0x1d, 0xd3, 0x12, 0x54, 0x18,
294 0x6a, 0xf3, 0x0b, 0x22, 0xc1, 0x05, 0x82, 0xa8, 0xa4, 0x3e, 0x34, 0xfe, 0x94, 0x9c, 0x5f, 0x3b,
295 0x97, 0x55, 0xba, 0xe7, 0xba, 0xa7, 0xb7, 0xb7, 0xa6, 0xbd, 0x03, 0xb3, 0x8c, 0xef, 0x55, 0xc8,
296 0x68, 0x85, 0xfc, 0x6c, 0x19, 0x78, 0xb9, 0xce, 0xe7, 0xef, 0x33, 0xda, 0x50, 0x7c, 0x9d, 0xf6,
297 0xb9, 0x27, 0x7c, 0xff, 0x1e, 0x6a, 0xaa, 0x5d, 0x57, 0xac, 0xa5, 0x28, 0x46, 0x61, 0x02, 0x81,
298 0x81, 0x00, 0xc9, 0x31, 0x61, 0x7c, 0x77, 0x82, 0x9d, 0xfb, 0x12, 0x70, 0x50, 0x2b, 0xe9, 0x19,
299 0x5c, 0x8f, 0x28, 0x30, 0x88, 0x5f, 0x57, 0xdb, 0xa8, 0x69, 0x53, 0x68, 0x11, 0xe6, 0x86, 0x42,
300 0x36, 0xd0, 0xc4, 0x73, 0x6a, 0x00, 0x08, 0xa1, 0x45, 0xaf, 0x36, 0xb8, 0x35, 0x7a, 0x7c, 0x3d,
301 0x13, 0x99, 0x66, 0xd0, 0x4c, 0x4e, 0x00, 0x93, 0x4e, 0xa1, 0xae, 0xde, 0x3b, 0xb6, 0xb8, 0xec,
302 0x84, 0x1d, 0xc9, 0x5e, 0x3f, 0x57, 0x97, 0x51, 0xe2, 0xbf, 0xdf, 0xe2, 0x7a, 0xe7, 0x78, 0x98,
303 0x3f, 0x95, 0x93, 0x56, 0x21, 0x07, 0x23, 0x28, 0x7b, 0x0a, 0xff, 0xcc, 0x9f, 0x72, 0x70, 0x44,
304 0xd4, 0x8c, 0x37, 0x3f, 0x1b, 0xab, 0xde, 0x07, 0x24, 0xfa, 0x17, 0xa4, 0xfd, 0x4d, 0xa0, 0x90,
305 0x2c, 0x7c, 0x9b, 0x9b, 0xf2, 0x7b, 0xa6, 0x1b, 0xe6, 0xad, 0x02, 0xdf, 0xdd, 0xda, 0x8f, 0x4e,
306 0x68, 0x22,
307];
308
309/// WrappedKeyData as ASN.1 DER-encoded data corresponding to the `SecureKeyWrapper` schema
310/// specified in IKeyMintDevice.aidl. Wrapped key parameters are -
311/// Algorithm: AES
312/// Key size: 256
313/// Block mode: ECB
314/// Padding mode: PKCS7
315/// This sample wrapped_key is taken from KeyMint tests (see KeyMintTest.cpp).
316pub static WRAPPED_KEY: &[u8] = &[
317 0x30, 0x82, 0x01, 0x79, 0x02, 0x01, 0x00, 0x04, 0x82, 0x01, 0x00, 0x93, 0x4b, 0xf9, 0x4e, 0x2a,
318 0xa2, 0x8a, 0x3f, 0x83, 0xc9, 0xf7, 0x92, 0x97, 0x25, 0x02, 0x62, 0xfb, 0xe3, 0x27, 0x6b, 0x5a,
319 0x1c, 0x91, 0x15, 0x9b, 0xbf, 0xa3, 0xef, 0x89, 0x57, 0xaa, 0xc8, 0x4b, 0x59, 0xb3, 0x0b, 0x45,
320 0x5a, 0x79, 0xc2, 0x97, 0x34, 0x80, 0x82, 0x3d, 0x8b, 0x38, 0x63, 0xc3, 0xde, 0xef, 0x4a, 0x8e,
321 0x24, 0x35, 0x90, 0x26, 0x8d, 0x80, 0xe1, 0x87, 0x51, 0xa0, 0xe1, 0x30, 0xf6, 0x7c, 0xe6, 0xa1,
322 0xac, 0xe9, 0xf7, 0x9b, 0x95, 0xe0, 0x97, 0x47, 0x4f, 0xeb, 0xc9, 0x81, 0x19, 0x5b, 0x1d, 0x13,
323 0xa6, 0x90, 0x86, 0xc0, 0x86, 0x3f, 0x66, 0xa7, 0xb7, 0xfd, 0xb4, 0x87, 0x92, 0x22, 0x7b, 0x1a,
324 0xc5, 0xe2, 0x48, 0x9f, 0xeb, 0xdf, 0x08, 0x7a, 0xb5, 0x48, 0x64, 0x83, 0x03, 0x3a, 0x6f, 0x00,
325 0x1c, 0xa5, 0xd1, 0xec, 0x1e, 0x27, 0xf5, 0xc3, 0x0f, 0x4c, 0xec, 0x26, 0x42, 0x07, 0x4a, 0x39,
326 0xae, 0x68, 0xae, 0xe5, 0x52, 0xe1, 0x96, 0x62, 0x7a, 0x8e, 0x3d, 0x86, 0x7e, 0x67, 0xa8, 0xc0,
327 0x1b, 0x11, 0xe7, 0x5f, 0x13, 0xcc, 0xa0, 0xa9, 0x7a, 0xb6, 0x68, 0xb5, 0x0c, 0xda, 0x07, 0xa8,
328 0xec, 0xb7, 0xcd, 0x8e, 0x3d, 0xd7, 0x00, 0x9c, 0x96, 0x36, 0x53, 0x4f, 0x6f, 0x23, 0x9c, 0xff,
329 0xe1, 0xfc, 0x8d, 0xaa, 0x46, 0x6f, 0x78, 0xb6, 0x76, 0xc7, 0x11, 0x9e, 0xfb, 0x96, 0xbc, 0xe4,
330 0xe6, 0x9c, 0xa2, 0xa2, 0x5d, 0x0b, 0x34, 0xed, 0x9c, 0x3f, 0xf9, 0x99, 0xb8, 0x01, 0x59, 0x7d,
331 0x52, 0x20, 0xe3, 0x07, 0xea, 0xa5, 0xbe, 0xe5, 0x07, 0xfb, 0x94, 0xd1, 0xfa, 0x69, 0xf9, 0xe5,
332 0x19, 0xb2, 0xde, 0x31, 0x5b, 0xac, 0x92, 0xc3, 0x6f, 0x2e, 0xa1, 0xfa, 0x1d, 0xf4, 0x47, 0x8c,
333 0x0d, 0xde, 0xde, 0xae, 0x8c, 0x70, 0xe0, 0x23, 0x3c, 0xd0, 0x98, 0x04, 0x0c, 0xd7, 0x96, 0xb0,
334 0x2c, 0x37, 0x0f, 0x1f, 0xa4, 0xcc, 0x01, 0x24, 0xf1, 0x30, 0x2e, 0x02, 0x01, 0x03, 0x30, 0x29,
335 0xa1, 0x08, 0x31, 0x06, 0x02, 0x01, 0x00, 0x02, 0x01, 0x01, 0xa2, 0x03, 0x02, 0x01, 0x20, 0xa3,
336 0x04, 0x02, 0x02, 0x01, 0x00, 0xa4, 0x05, 0x31, 0x03, 0x02, 0x01, 0x01, 0xa6, 0x05, 0x31, 0x03,
337 0x02, 0x01, 0x40, 0xbf, 0x83, 0x77, 0x02, 0x05, 0x00, 0x04, 0x20, 0xcc, 0xd5, 0x40, 0x85, 0x5f,
338 0x83, 0x3a, 0x5e, 0x14, 0x80, 0xbf, 0xd2, 0xd3, 0x6f, 0xaf, 0x3a, 0xee, 0xe1, 0x5d, 0xf5, 0xbe,
339 0xab, 0xe2, 0x69, 0x1b, 0xc8, 0x2d, 0xde, 0x2a, 0x7a, 0xa9, 0x10, 0x04, 0x10, 0x64, 0xc9, 0xf6,
340 0x89, 0xc6, 0x0f, 0xf6, 0x22, 0x3a, 0xb6, 0xe6, 0x99, 0x9e, 0x0e, 0xb6, 0xe5,
341];
342
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000343/// To map Keystore errors.
344#[derive(thiserror::Error, Debug, Eq, PartialEq)]
345pub enum Error {
346 /// Keystore2 error code
347 #[error("ResponseCode {0:?}")]
348 Rc(ResponseCode),
349 /// Keymint error code
350 #[error("ErrorCode {0:?}")]
351 Km(ErrorCode),
352 /// Exception
353 #[error("Binder exception {0:?}")]
354 Binder(ExceptionCode),
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000355 /// This is returned if the C implementation of extractSubjectFromCertificate failed.
356 #[error("Failed to validate certificate chain.")]
357 ValidateCertChainFailed,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +0000358 /// Error code to indicate error in ASN.1 DER-encoded data creation.
359 #[error("Failed to create and encode ASN.1 data.")]
360 DerEncodeFailed,
Rajesh Nyamagoud28abde62023-04-01 01:32:32 +0000361 /// Error code to indicate error while using keystore-engine API.
362 #[error("Failed to perform crypto op using keystore-engine APIs.")]
363 Keystore2EngineOpFailed,
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +0000364 /// Error code to indicate error in attestation-id validation.
365 #[error("Failed to validate attestation-id.")]
366 ValidateAttestIdFailed,
367 /// Error code to indicate error in getting value from attest record.
368 #[error("Failed to get value from attest record.")]
369 AttestRecordGetValueFailed,
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000370}
371
372/// Keystore2 error mapping.
373pub fn map_ks_error<T>(r: BinderResult<T>) -> Result<T, Error> {
374 r.map_err(|s| {
375 match s.exception_code() {
376 ExceptionCode::SERVICE_SPECIFIC => {
377 match s.service_specific_error() {
378 se if se < 0 => {
379 // Negative service specific errors are KM error codes.
380 Error::Km(ErrorCode(se))
381 }
382 se => {
383 // Positive service specific errors are KS response codes.
384 Error::Rc(ResponseCode(se))
385 }
386 }
387 }
388 // We create `Error::Binder` to preserve the exception code
389 // for logging.
390 e_code => Error::Binder(e_code),
391 }
392 })
393}
394
David Drysdale89e87d52024-10-04 13:07:43 +0100395/// Check for a specific KeyMint error.
David Drysdale9f0007e2024-10-04 18:58:11 +0100396#[macro_export]
397macro_rules! expect_km_error {
398 { $result:expr, $want:expr } => {
399 match $result {
400 Ok(_) => return Err(format!(
401 "{}:{}: Expected KeyMint error {:?}, found success",
402 file!(),
403 line!(),
404 $want
405 ).into()),
406 Err(s) if s.exception_code() == ExceptionCode::SERVICE_SPECIFIC
407 && s.service_specific_error() == $want.0 => {}
408 Err(e) => return Err(format!(
409 "{}:{}: Expected KeyMint service-specific error {:?}, got {e:?}",
410 file!(),
411 line!(),
412 $want
413 ).into()),
David Drysdale89e87d52024-10-04 13:07:43 +0100414 }
David Drysdale9f0007e2024-10-04 18:58:11 +0100415
416 };
David Drysdale89e87d52024-10-04 13:07:43 +0100417}
418
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000419/// Get the value of the given system property, if the given system property doesn't exist
420/// then returns an empty byte vector.
421pub fn get_system_prop(name: &str) -> Vec<u8> {
422 match rustutils::system_properties::read(name) {
423 Ok(Some(value)) => value.as_bytes().to_vec(),
424 _ => vec![],
425 }
426}
427
428/// Determines whether test is running on GSI.
429pub fn is_gsi() -> bool {
430 // This file is only present on GSI builds.
431 PathBuf::from("/system/system_ext/etc/init/init.gsi.rc").as_path().is_file()
432}
433
434/// Determines whether the test is on a GSI build where the rkp-only status of the device is
435/// unknown. GSI replaces the values for remote_prov_prop properties (since they’re
436/// system_internal_prop properties), so on GSI the properties are not reliable indicators of
437/// whether StrongBox/TEE is RKP-only or not.
438pub fn is_rkp_only_unknown_on_gsi(sec_level: SecurityLevel) -> bool {
439 if sec_level == SecurityLevel::TRUSTED_ENVIRONMENT {
440 is_gsi() && get_system_prop(TEE_KEYMINT_RKP_ONLY).is_empty()
441 } else {
442 is_gsi() && get_system_prop(STRONGBOX_KEYMINT_RKP_ONLY).is_empty()
443 }
444}
445
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000446/// Verify that given key param is listed in given authorizations list.
447pub fn check_key_param(authorizations: &[Authorization], key_param: &KeyParameter) -> bool {
448 authorizations.iter().any(|auth| &auth.keyParameter == key_param)
449}
450
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000451/// Verify the given key authorizations with the expected authorizations.
452pub fn check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +0100453 sl: &SecLevel,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000454 authorizations: &[Authorization],
455 expected_params: &[KeyParameter],
456 expected_key_origin: KeyOrigin,
457) {
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000458 // Make sure key authorizations contains only `ALLOWED_TAGS_IN_KEY_AUTHS`
459 authorizations.iter().all(|auth| {
Rajesh Nyamagoud19236362024-07-10 20:52:28 +0000460 // Ignore `INVALID` tag
461 if auth.keyParameter.tag == Tag::INVALID {
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000462 return true;
463 }
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000464 assert!(
465 ALLOWED_TAGS_IN_KEY_AUTHS.contains(&auth.keyParameter.tag),
466 "key authorization is not allowed: {:#?}",
467 auth.keyParameter
468 );
469 true
470 });
471
David Drysdale79092242024-06-18 13:13:43 +0100472 // Check allowed-expected-key-parameters are present in given key authorizations list.
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000473 expected_params.iter().all(|key_param| {
Rajesh Nyamagoud17a92612023-10-17 16:15:05 +0000474 // `INCLUDE_UNIQUE_ID` is not strictly expected to be in key authorizations but has been
475 // put there by some implementations so cope with that.
476 if key_param.tag == Tag::INCLUDE_UNIQUE_ID
477 && !authorizations.iter().any(|auth| auth.keyParameter.tag == key_param.tag)
478 {
479 return true;
480 }
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000481
David Drysdale83153592024-07-16 10:25:08 +0100482 // `Tag::RSA_OAEP_MGF_DIGEST` was added in KeyMint 1.0, but the KeyMint VTS tests didn't
483 // originally check for its presence and so some implementations of early versions (< 3) of
484 // the KeyMint HAL don't include it (cf. b/297306437 and aosp/2758513).
485 //
486 // Given that Keymaster implementations will also omit this tag, skip the check for it
487 // altogether (and rely on the updated KeyMint VTS tests to ensure that up-level KeyMint
488 // implementations correctly populate this tag).
489 if matches!(key_param.tag, Tag::RSA_OAEP_MGF_DIGEST) {
490 return true;
491 }
492
Rajesh Nyamagoudc63a83d2024-09-04 16:48:10 +0000493 // Don't check these parameters if the underlying device is a Keymaster implementation.
David Drysdale79092242024-06-18 13:13:43 +0100494 if sl.is_keymaster() {
Rajesh Nyamagoudc63a83d2024-09-04 16:48:10 +0000495 if matches!(
496 key_param.tag,
497 // `Tag::USAGE_COUNT_LIMIT` was added in KeyMint 1.0.
498 Tag::USAGE_COUNT_LIMIT |
499 // Keymaster implementations may not consistently include `Tag::VENDOR_PATCHLEVEL`
500 // in generated key characteristics.
501 Tag::VENDOR_PATCHLEVEL
502 ) {
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000503 return true;
504 }
Rajesh Nyamagoudc63a83d2024-09-04 16:48:10 +0000505 // `KeyPurpose::ATTEST_KEY` was added in KeyMint 1.0.
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000506 if key_param.tag == Tag::PURPOSE
507 && key_param.value == KeyParameterValue::KeyPurpose(KeyPurpose::ATTEST_KEY)
508 {
509 return true;
510 }
511 }
512
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000513 if ALLOWED_TAGS_IN_KEY_AUTHS.contains(&key_param.tag) {
514 assert!(
515 check_key_param(authorizations, key_param),
516 "Key parameter not found: {:#?}",
517 key_param
518 );
519 }
520 true
521 });
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000522
David Drysdale79092242024-06-18 13:13:43 +0100523 check_common_auths(sl, authorizations, expected_key_origin);
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000524}
525
526/// Verify common key authorizations.
David Drysdale79092242024-06-18 13:13:43 +0100527fn check_common_auths(
528 sl: &SecLevel,
529 authorizations: &[Authorization],
530 expected_key_origin: KeyOrigin,
531) {
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000532 assert!(check_key_param(
533 authorizations,
534 &KeyParameter {
535 tag: Tag::OS_VERSION,
536 value: KeyParameterValue::Integer(get_os_version().try_into().unwrap())
537 }
538 ));
539 assert!(check_key_param(
540 authorizations,
541 &KeyParameter {
542 tag: Tag::OS_PATCHLEVEL,
543 value: KeyParameterValue::Integer(get_os_patchlevel().try_into().unwrap())
544 }
545 ));
546
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000547 assert!(check_key_param(
548 authorizations,
549 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(expected_key_origin) }
550 ));
551 assert!(check_key_param(
552 authorizations,
553 &KeyParameter {
554 tag: Tag::USER_ID,
555 value: KeyParameterValue::Integer(
556 rustutils::users::multiuser_get_user_id(ThreadState::get_calling_uid())
557 .try_into()
558 .unwrap()
559 )
560 }
561 ));
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +0000562
David Drysdale79092242024-06-18 13:13:43 +0100563 if sl.is_keymint() {
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +0000564 assert!(authorizations
565 .iter()
566 .map(|auth| &auth.keyParameter)
567 .any(|key_param| key_param.tag == Tag::CREATION_DATETIME));
Rajesh Nyamagoudfcae6fd2024-09-11 16:10:16 +0000568
569 // Access denied for finding vendor-patch-level ("ro.vendor.build.security_patch") property
570 // in a test running with `untrusted_app` context. Keeping this check to verify
571 // vendor-patch-level in tests running with `su` context.
572 if getuid().is_root() {
573 // Keymaster implementations may not consistently include `Tag::VENDOR_PATCHLEVEL`
574 // in generated key characteristics. So, checking this if the underlying device is a
575 // KeyMint implementation.
576 assert!(check_key_param(
577 authorizations,
578 &KeyParameter {
579 tag: Tag::VENDOR_PATCHLEVEL,
580 value: KeyParameterValue::Integer(get_vendor_patchlevel().try_into().unwrap())
581 }
582 ));
583 }
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +0000584 }
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000585}
586
Rajesh Nyamagoudf436a932023-05-12 01:16:07 +0000587/// Get the key `Authorization` for the given auth `Tag`.
588pub fn get_key_auth(authorizations: &[Authorization], tag: Tag) -> Option<&Authorization> {
589 let auths: Vec<&Authorization> =
590 authorizations.iter().filter(|auth| auth.keyParameter.tag == tag).collect();
591
592 if !auths.is_empty() {
593 Some(auths[0])
594 } else {
595 None
596 }
597}
598
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000599/// Generate EC Key using given security level and domain with below key parameters and
600/// optionally allow the generated key to be attested with factory provisioned attest key using
601/// given challenge and application id -
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000602/// Purposes: SIGN and VERIFY
603/// Digest: SHA_2_256
604/// Curve: P_256
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000605pub fn generate_ec_p256_signing_key(
David Drysdale79092242024-06-18 13:13:43 +0100606 sl: &SecLevel,
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000607 domain: Domain,
608 nspace: i64,
609 alias: Option<String>,
610 att_challenge: Option<&[u8]>,
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000611) -> binder::Result<KeyMetadata> {
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000612 let mut key_attest = false;
613 let mut gen_params = AuthSetBuilder::new()
Rajesh Nyamagoudc7d064d2022-08-20 01:45:17 +0000614 .no_auth_required()
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000615 .algorithm(Algorithm::EC)
616 .purpose(KeyPurpose::SIGN)
617 .purpose(KeyPurpose::VERIFY)
618 .digest(Digest::SHA_2_256)
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000619 .ec_curve(EcCurve::P_256);
620
621 if let Some(challenge) = att_challenge {
622 key_attest = true;
623 gen_params = gen_params.clone().attestation_challenge(challenge.to_vec());
624 }
625
David Drysdale79092242024-06-18 13:13:43 +0100626 match sl.binder.generateKey(
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000627 &KeyDescriptor { domain, nspace, alias, blob: None },
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000628 None,
629 &gen_params,
630 0,
631 b"entropy",
632 ) {
633 Ok(key_metadata) => {
634 assert!(key_metadata.certificate.is_some());
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000635 if key_attest {
636 assert!(key_metadata.certificateChain.is_some());
637 }
638 if domain == Domain::BLOB {
639 assert!(key_metadata.key.blob.is_some());
640 }
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000641
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000642 check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +0100643 sl,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000644 &key_metadata.authorizations,
645 &gen_params,
646 KeyOrigin::GENERATED,
647 );
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000648 Ok(key_metadata)
649 }
650 Err(e) => Err(e),
651 }
652}
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000653
654/// Generate EC signing key.
Rajesh Nyamagoudc7d064d2022-08-20 01:45:17 +0000655pub fn generate_ec_key(
David Drysdale79092242024-06-18 13:13:43 +0100656 sl: &SecLevel,
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000657 domain: Domain,
658 nspace: i64,
659 alias: Option<String>,
660 ec_curve: EcCurve,
661 digest: Digest,
662) -> binder::Result<KeyMetadata> {
663 let gen_params = AuthSetBuilder::new()
664 .no_auth_required()
665 .algorithm(Algorithm::EC)
666 .purpose(KeyPurpose::SIGN)
667 .purpose(KeyPurpose::VERIFY)
668 .digest(digest)
669 .ec_curve(ec_curve);
670
David Drysdale79092242024-06-18 13:13:43 +0100671 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000672 &KeyDescriptor { domain, nspace, alias, blob: None },
673 None,
674 &gen_params,
675 0,
676 b"entropy",
677 )?;
678
679 // Must have a public key.
680 assert!(key_metadata.certificate.is_some());
681
682 // Should not have an attestation record.
683 assert!(key_metadata.certificateChain.is_none());
684
685 if domain == Domain::BLOB {
686 assert!(key_metadata.key.blob.is_some());
687 } else {
688 assert!(key_metadata.key.blob.is_none());
689 }
David Drysdale79092242024-06-18 13:13:43 +0100690 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000691 Ok(key_metadata)
692}
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000693
694/// Generate a RSA key with the given key parameters, alias, domain and namespace.
695pub fn generate_rsa_key(
David Drysdale79092242024-06-18 13:13:43 +0100696 sl: &SecLevel,
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000697 domain: Domain,
698 nspace: i64,
699 alias: Option<String>,
700 key_params: &KeyParams,
701 attest_key: Option<&KeyDescriptor>,
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000702) -> binder::Result<Option<KeyMetadata>> {
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000703 let mut gen_params = AuthSetBuilder::new()
704 .no_auth_required()
705 .algorithm(Algorithm::RSA)
706 .rsa_public_exponent(65537)
707 .key_size(key_params.key_size);
708
709 for purpose in &key_params.purpose {
710 gen_params = gen_params.purpose(*purpose);
711 }
712 if let Some(value) = key_params.digest {
713 gen_params = gen_params.digest(value)
714 }
715 if let Some(value) = key_params.padding {
716 gen_params = gen_params.padding_mode(value);
717 }
718 if let Some(value) = key_params.mgf_digest {
719 gen_params = gen_params.mgf_digest(value);
720 }
721 if let Some(value) = key_params.block_mode {
722 gen_params = gen_params.block_mode(value)
723 }
724 if let Some(value) = &key_params.att_challenge {
725 gen_params = gen_params.attestation_challenge(value.to_vec())
726 }
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000727
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000728 let key_metadata = match sl.binder.generateKey(
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000729 &KeyDescriptor { domain, nspace, alias, blob: None },
730 attest_key,
731 &gen_params,
732 0,
733 b"entropy",
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000734 ) {
735 Ok(metadata) => metadata,
736 Err(e) => {
737 return if is_rkp_only_unknown_on_gsi(sl.level)
738 && e.service_specific_error() == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED.0
739 {
740 // GSI replaces the values for remote_prov_prop properties (since they’re
741 // system_internal_prop properties), so on GSI the properties are not
742 // reliable indicators of whether StrongBox/TEE are RKP-only or not.
743 // Test can be skipped if it generates a key with attestation but doesn't provide
744 // an ATTEST_KEY and rkp-only property is undetermined.
745 Ok(None)
746 } else {
747 Err(e)
748 };
749 }
750 };
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000751
752 // Must have a public key.
753 assert!(key_metadata.certificate.is_some());
754
David Drysdale38f2ca32023-01-10 13:10:51 +0000755 if attest_key.is_none() && key_params.att_challenge.is_some() {
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000756 // Should have an attestation record.
757 assert!(key_metadata.certificateChain.is_some());
758 } else {
759 // Should not have an attestation record.
760 assert!(key_metadata.certificateChain.is_none());
761 }
762
763 assert!(
764 (domain == Domain::BLOB && key_metadata.key.blob.is_some())
765 || key_metadata.key.blob.is_none()
766 );
767
David Drysdale79092242024-06-18 13:13:43 +0100768 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000769 // If `RSA_OAEP_MGF_DIGEST` tag is not mentioned explicitly while generating/importing a key,
770 // then make sure `RSA_OAEP_MGF_DIGEST` tag with default value (SHA1) must not be included in
771 // key authorization list.
772 if key_params.mgf_digest.is_none() {
773 assert!(!check_key_param(
774 &key_metadata.authorizations,
775 &KeyParameter {
776 tag: Tag::RSA_OAEP_MGF_DIGEST,
777 value: KeyParameterValue::Digest(Digest::SHA1)
778 }
779 ));
780 }
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000781 Ok(Some(key_metadata))
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000782}
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000783
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000784/// Generate AES/3DES key.
785pub fn generate_sym_key(
David Drysdale79092242024-06-18 13:13:43 +0100786 sl: &SecLevel,
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000787 algorithm: Algorithm,
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000788 size: i32,
789 alias: &str,
790 padding_mode: &PaddingMode,
791 block_mode: &BlockMode,
792 min_mac_len: Option<i32>,
793) -> binder::Result<KeyMetadata> {
794 let mut gen_params = AuthSetBuilder::new()
795 .no_auth_required()
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000796 .algorithm(algorithm)
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000797 .purpose(KeyPurpose::ENCRYPT)
798 .purpose(KeyPurpose::DECRYPT)
799 .key_size(size)
800 .padding_mode(*padding_mode)
801 .block_mode(*block_mode);
802
803 if let Some(val) = min_mac_len {
804 gen_params = gen_params.min_mac_length(val);
805 }
806
David Drysdale79092242024-06-18 13:13:43 +0100807 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000808 &KeyDescriptor {
809 domain: Domain::APP,
810 nspace: -1,
811 alias: Some(alias.to_string()),
812 blob: None,
813 },
814 None,
815 &gen_params,
816 0,
817 b"entropy",
818 )?;
819
820 // Should not have public certificate.
821 assert!(key_metadata.certificate.is_none());
822
823 // Should not have an attestation record.
824 assert!(key_metadata.certificateChain.is_none());
David Drysdale79092242024-06-18 13:13:43 +0100825 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000826 Ok(key_metadata)
827}
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000828
829/// Generate HMAC key.
830pub fn generate_hmac_key(
David Drysdale79092242024-06-18 13:13:43 +0100831 sl: &SecLevel,
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000832 alias: &str,
833 key_size: i32,
834 min_mac_len: i32,
835 digest: Digest,
836) -> binder::Result<KeyMetadata> {
837 let gen_params = AuthSetBuilder::new()
838 .no_auth_required()
839 .algorithm(Algorithm::HMAC)
840 .purpose(KeyPurpose::SIGN)
841 .purpose(KeyPurpose::VERIFY)
842 .key_size(key_size)
843 .min_mac_length(min_mac_len)
844 .digest(digest);
845
David Drysdale79092242024-06-18 13:13:43 +0100846 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000847 &KeyDescriptor {
848 domain: Domain::APP,
849 nspace: -1,
850 alias: Some(alias.to_string()),
851 blob: None,
852 },
853 None,
854 &gen_params,
855 0,
856 b"entropy",
857 )?;
858
859 // Should not have public certificate.
860 assert!(key_metadata.certificate.is_none());
861
862 // Should not have an attestation record.
863 assert!(key_metadata.certificateChain.is_none());
864
David Drysdale79092242024-06-18 13:13:43 +0100865 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000866 Ok(key_metadata)
867}
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000868
869/// Generate RSA or EC attestation keys using below parameters -
870/// Purpose: ATTEST_KEY
871/// Digest: Digest::SHA_2_256
872/// Padding: PaddingMode::RSA_PKCS1_1_5_SIGN
873/// RSA-Key-Size: 2048
874/// EC-Curve: EcCurve::P_256
875pub fn generate_attestation_key(
David Drysdale79092242024-06-18 13:13:43 +0100876 sl: &SecLevel,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000877 algorithm: Algorithm,
878 att_challenge: &[u8],
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000879) -> binder::Result<Option<KeyMetadata>> {
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000880 assert!(algorithm == Algorithm::RSA || algorithm == Algorithm::EC);
881
882 if algorithm == Algorithm::RSA {
883 let alias = "ks_rsa_attest_test_key";
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000884 generate_rsa_key(
David Drysdale79092242024-06-18 13:13:43 +0100885 sl,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000886 Domain::APP,
887 -1,
888 Some(alias.to_string()),
889 &KeyParams {
890 key_size: 2048,
891 purpose: vec![KeyPurpose::ATTEST_KEY],
892 padding: Some(PaddingMode::RSA_PKCS1_1_5_SIGN),
893 digest: Some(Digest::SHA_2_256),
894 mgf_digest: None,
895 block_mode: None,
896 att_challenge: Some(att_challenge.to_vec()),
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000897 },
898 None,
899 )
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000900 } else {
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000901 generate_ec_attestation_key(sl, att_challenge, Digest::SHA_2_256, EcCurve::P_256)
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000902 }
903}
904
905/// Generate EC attestation key with the given
906/// curve, attestation-challenge and attestation-app-id.
907pub fn generate_ec_attestation_key(
David Drysdale79092242024-06-18 13:13:43 +0100908 sl: &SecLevel,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000909 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000910 digest: Digest,
911 ec_curve: EcCurve,
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000912) -> binder::Result<Option<KeyMetadata>> {
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000913 let alias = "ks_attest_ec_test_key";
914 let gen_params = AuthSetBuilder::new()
915 .no_auth_required()
916 .algorithm(Algorithm::EC)
917 .purpose(KeyPurpose::ATTEST_KEY)
918 .ec_curve(ec_curve)
919 .digest(digest)
David Drysdale38f2ca32023-01-10 13:10:51 +0000920 .attestation_challenge(att_challenge.to_vec());
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000921
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000922 let attestation_key_metadata = match sl.binder.generateKey(
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000923 &KeyDescriptor {
924 domain: Domain::APP,
925 nspace: -1,
926 alias: Some(alias.to_string()),
927 blob: None,
928 },
929 None,
930 &gen_params,
931 0,
932 b"entropy",
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000933 ) {
934 Ok(metadata) => metadata,
935 Err(e) => {
936 return if is_rkp_only_unknown_on_gsi(sl.level)
937 && e.service_specific_error() == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED.0
938 {
939 // GSI replaces the values for remote_prov_prop properties (since they’re
940 // system_internal_prop properties), so on GSI the properties are not
941 // reliable indicators of whether StrongBox/TEE are RKP-only or not.
942 // Test can be skipped if it generates a key with attestation but doesn't provide
943 // an ATTEST_KEY and rkp-only property is undetermined.
944 Ok(None)
945 } else {
946 Err(e)
947 };
948 }
949 };
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000950
951 // Should have public certificate.
952 assert!(attestation_key_metadata.certificate.is_some());
953 // Should have an attestation record.
954 assert!(attestation_key_metadata.certificateChain.is_some());
955
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000956 check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +0100957 sl,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000958 &attestation_key_metadata.authorizations,
959 &gen_params,
960 KeyOrigin::GENERATED,
961 );
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000962 Ok(Some(attestation_key_metadata))
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000963}
964
965/// Generate EC-P-256 key and attest it with given attestation key.
966pub fn generate_ec_256_attested_key(
David Drysdale79092242024-06-18 13:13:43 +0100967 sl: &SecLevel,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000968 alias: Option<String>,
969 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000970 attest_key: &KeyDescriptor,
971) -> binder::Result<KeyMetadata> {
972 let ec_gen_params = AuthSetBuilder::new()
973 .no_auth_required()
974 .algorithm(Algorithm::EC)
975 .purpose(KeyPurpose::SIGN)
976 .purpose(KeyPurpose::VERIFY)
977 .digest(Digest::SHA_2_256)
978 .ec_curve(EcCurve::P_256)
David Drysdale38f2ca32023-01-10 13:10:51 +0000979 .attestation_challenge(att_challenge.to_vec());
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000980
David Drysdale79092242024-06-18 13:13:43 +0100981 let ec_key_metadata = sl
982 .binder
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000983 .generateKey(
984 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: None },
985 Some(attest_key),
986 &ec_gen_params,
987 0,
988 b"entropy",
989 )
990 .unwrap();
991
992 // Should have public certificate.
993 assert!(ec_key_metadata.certificate.is_some());
994 // Shouldn't have an attestation record.
995 assert!(ec_key_metadata.certificateChain.is_none());
996
David Drysdale79092242024-06-18 13:13:43 +0100997 check_key_authorizations(
998 sl,
999 &ec_key_metadata.authorizations,
1000 &ec_gen_params,
1001 KeyOrigin::GENERATED,
1002 );
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +00001003 Ok(ec_key_metadata)
1004}
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001005
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001006/// Imports above defined RSA key - `RSA_2048_KEY` and validates imported key parameters.
1007pub fn import_rsa_2048_key(
David Drysdale79092242024-06-18 13:13:43 +01001008 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001009 domain: Domain,
1010 nspace: i64,
1011 alias: Option<String>,
1012 import_params: AuthSetBuilder,
1013) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +01001014 let key_metadata = sl
1015 .binder
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001016 .importKey(
1017 &KeyDescriptor { domain, nspace, alias, blob: None },
1018 None,
1019 &import_params,
1020 0,
1021 RSA_2048_KEY,
1022 )
1023 .unwrap();
1024
1025 assert!(key_metadata.certificate.is_some());
1026 assert!(key_metadata.certificateChain.is_none());
1027
David Drysdale79092242024-06-18 13:13:43 +01001028 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001029
1030 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001031 assert!(check_key_param(
1032 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001033 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::RSA) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001034 ));
1035
1036 assert!(check_key_param(
1037 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001038 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(2048) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001039 ));
1040
1041 assert!(check_key_param(
1042 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001043 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001044 ));
1045
1046 assert!(check_key_param(
1047 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001048 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001049 tag: Tag::RSA_PUBLIC_EXPONENT,
1050 value: KeyParameterValue::LongInteger(65537)
1051 }
1052 ));
1053
1054 assert!(check_key_param(
1055 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001056 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001057 tag: Tag::PADDING,
1058 value: KeyParameterValue::PaddingMode(PaddingMode::RSA_PSS)
1059 }
1060 ));
1061
1062 assert!(check_key_param(
1063 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001064 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001065 ));
1066
1067 Ok(key_metadata)
1068}
1069
1070/// Imports above defined EC key - `EC_P_256_KEY` and validates imported key parameters.
1071pub fn import_ec_p_256_key(
David Drysdale79092242024-06-18 13:13:43 +01001072 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001073 domain: Domain,
1074 nspace: i64,
1075 alias: Option<String>,
1076 import_params: AuthSetBuilder,
1077) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +01001078 let key_metadata = sl
1079 .binder
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001080 .importKey(
1081 &KeyDescriptor { domain, nspace, alias, blob: None },
1082 None,
1083 &import_params,
1084 0,
1085 EC_P_256_KEY,
1086 )
1087 .unwrap();
1088
1089 assert!(key_metadata.certificate.is_some());
1090 assert!(key_metadata.certificateChain.is_none());
1091
David Drysdale79092242024-06-18 13:13:43 +01001092 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001093
1094 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001095 assert!(check_key_param(
1096 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001097 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::EC) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001098 ));
1099
1100 assert!(check_key_param(
1101 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001102 &KeyParameter { tag: Tag::EC_CURVE, value: KeyParameterValue::EcCurve(EcCurve::P_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001103 ));
1104
1105 assert!(check_key_param(
1106 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001107 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001108 ));
1109 assert!(check_key_param(
1110 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001111 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001112 ));
1113
1114 Ok(key_metadata)
1115}
1116
1117/// Import sample AES key and validate its key parameters.
1118pub fn import_aes_key(
David Drysdale79092242024-06-18 13:13:43 +01001119 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001120 domain: Domain,
1121 nspace: i64,
1122 alias: Option<String>,
1123) -> binder::Result<KeyMetadata> {
1124 static AES_KEY: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
1125 let key_size = AES_KEY.len() * 8;
1126
1127 let import_params = AuthSetBuilder::new()
1128 .no_auth_required()
1129 .algorithm(Algorithm::AES)
1130 .block_mode(BlockMode::ECB)
1131 .key_size(key_size.try_into().unwrap())
1132 .purpose(KeyPurpose::ENCRYPT)
1133 .purpose(KeyPurpose::DECRYPT)
1134 .padding_mode(PaddingMode::PKCS7);
1135
David Drysdale79092242024-06-18 13:13:43 +01001136 let key_metadata = sl.binder.importKey(
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001137 &KeyDescriptor { domain, nspace, alias, blob: None },
1138 None,
1139 &import_params,
1140 0,
1141 AES_KEY,
1142 )?;
1143
David Drysdale79092242024-06-18 13:13:43 +01001144 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001145
1146 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001147 assert!(check_key_param(
1148 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001149 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::AES) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001150 ));
1151 assert!(check_key_param(
1152 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001153 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(128) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001154 ));
1155 assert!(check_key_param(
1156 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001157 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001158 tag: Tag::PADDING,
1159 value: KeyParameterValue::PaddingMode(PaddingMode::PKCS7)
1160 }
1161 ));
1162 assert!(check_key_param(
1163 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001164 &KeyParameter { tag: Tag::BLOCK_MODE, value: KeyParameterValue::BlockMode(BlockMode::ECB) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001165 ));
1166 assert!(check_key_param(
1167 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001168 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001169 ));
1170
1171 Ok(key_metadata)
1172}
1173
1174/// Import sample 3DES key and validate its key parameters.
1175pub fn import_3des_key(
David Drysdale79092242024-06-18 13:13:43 +01001176 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001177 domain: Domain,
1178 nspace: i64,
1179 alias: Option<String>,
1180) -> binder::Result<KeyMetadata> {
1181 static TRIPLE_DES_KEY: &[u8] = &[
1182 0xa4, 0x9d, 0x75, 0x64, 0x19, 0x9e, 0x97, 0xcb, 0x52, 0x9d, 0x2c, 0x9d, 0x97, 0xbf, 0x2f,
1183 0x98, 0xd3, 0x5e, 0xdf, 0x57, 0xba, 0x1f, 0x73, 0x58,
1184 ];
1185
1186 let import_params = AuthSetBuilder::new()
1187 .no_auth_required()
1188 .algorithm(Algorithm::TRIPLE_DES)
1189 .block_mode(BlockMode::ECB)
1190 .key_size(168)
1191 .purpose(KeyPurpose::ENCRYPT)
1192 .purpose(KeyPurpose::DECRYPT)
1193 .padding_mode(PaddingMode::PKCS7);
1194
David Drysdale79092242024-06-18 13:13:43 +01001195 let key_metadata = sl.binder.importKey(
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001196 &KeyDescriptor { domain, nspace, alias, blob: None },
1197 None,
1198 &import_params,
1199 0,
1200 TRIPLE_DES_KEY,
1201 )?;
1202
David Drysdale79092242024-06-18 13:13:43 +01001203 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001204
1205 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001206 assert!(check_key_param(
1207 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001208 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001209 tag: Tag::ALGORITHM,
1210 value: KeyParameterValue::Algorithm(Algorithm::TRIPLE_DES)
1211 }
1212 ));
1213 assert!(check_key_param(
1214 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001215 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(168) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001216 ));
1217 assert!(check_key_param(
1218 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001219 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001220 tag: Tag::PADDING,
1221 value: KeyParameterValue::PaddingMode(PaddingMode::PKCS7)
1222 }
1223 ));
1224 assert!(check_key_param(
1225 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001226 &KeyParameter { tag: Tag::BLOCK_MODE, value: KeyParameterValue::BlockMode(BlockMode::ECB) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001227 ));
1228 assert!(check_key_param(
1229 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001230 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001231 ));
1232
1233 Ok(key_metadata)
1234}
1235
1236/// Import sample HMAC key and validate its key parameters.
1237pub fn import_hmac_key(
David Drysdale79092242024-06-18 13:13:43 +01001238 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001239 domain: Domain,
1240 nspace: i64,
1241 alias: Option<String>,
1242) -> binder::Result<KeyMetadata> {
1243 static HMAC_KEY: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
1244 let key_size = HMAC_KEY.len() * 8;
1245
1246 let import_params = AuthSetBuilder::new()
1247 .no_auth_required()
1248 .algorithm(Algorithm::HMAC)
1249 .key_size(key_size.try_into().unwrap())
1250 .purpose(KeyPurpose::SIGN)
1251 .purpose(KeyPurpose::VERIFY)
1252 .digest(Digest::SHA_2_256)
1253 .min_mac_length(256);
1254
David Drysdale79092242024-06-18 13:13:43 +01001255 let key_metadata = sl.binder.importKey(
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001256 &KeyDescriptor { domain, nspace, alias, blob: None },
1257 None,
1258 &import_params,
1259 0,
1260 HMAC_KEY,
1261 )?;
1262
David Drysdale79092242024-06-18 13:13:43 +01001263 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001264
1265 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001266 assert!(check_key_param(
1267 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001268 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::HMAC) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001269 ));
1270 assert!(check_key_param(
1271 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001272 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(128) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001273 ));
1274 assert!(check_key_param(
1275 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001276 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001277 ));
1278 assert!(check_key_param(
1279 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001280 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001281 ));
1282
1283 Ok(key_metadata)
1284}
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001285
1286/// Imports RSA encryption key with WRAP_KEY purpose.
1287pub fn import_wrapping_key(
David Drysdale79092242024-06-18 13:13:43 +01001288 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001289 wrapping_key_data: &[u8],
1290 wrapping_key_alias: Option<String>,
1291) -> binder::Result<KeyMetadata> {
1292 let wrapping_key_params = AuthSetBuilder::new()
1293 .no_auth_required()
1294 .algorithm(Algorithm::RSA)
1295 .digest(Digest::SHA_2_256)
1296 .purpose(KeyPurpose::ENCRYPT)
1297 .purpose(KeyPurpose::DECRYPT)
1298 .purpose(KeyPurpose::WRAP_KEY)
1299 .padding_mode(PaddingMode::RSA_OAEP)
1300 .key_size(2048)
1301 .rsa_public_exponent(65537)
1302 .cert_not_before(0)
1303 .cert_not_after(253402300799000);
1304
David Drysdale79092242024-06-18 13:13:43 +01001305 sl.binder.importKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001306 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias: wrapping_key_alias, blob: None },
1307 None,
1308 &wrapping_key_params,
1309 0,
1310 wrapping_key_data,
1311 )
1312}
1313
1314/// Import wrapped key using given wrapping key.
1315pub fn import_wrapped_key(
David Drysdale79092242024-06-18 13:13:43 +01001316 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001317 alias: Option<String>,
1318 wrapping_key_metadata: &KeyMetadata,
1319 wrapped_key: Option<Vec<u8>>,
1320) -> binder::Result<KeyMetadata> {
1321 let unwrap_params =
1322 AuthSetBuilder::new().digest(Digest::SHA_2_256).padding_mode(PaddingMode::RSA_OAEP);
1323
1324 let authenticator_spec: &[AuthenticatorSpec] = &[AuthenticatorSpec {
1325 authenticatorType: HardwareAuthenticatorType::NONE,
1326 authenticatorId: 0,
1327 }];
1328
David Drysdale79092242024-06-18 13:13:43 +01001329 let key_metadata = sl.binder.importWrappedKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001330 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: wrapped_key },
1331 &wrapping_key_metadata.key,
1332 None,
1333 &unwrap_params,
1334 authenticator_spec,
1335 )?;
1336
1337 Ok(key_metadata)
1338}
1339
1340/// Import wrapping key and then import wrapped key using wrapping key.
1341pub fn import_wrapping_key_and_wrapped_key(
David Drysdale79092242024-06-18 13:13:43 +01001342 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001343 domain: Domain,
1344 nspace: i64,
1345 alias: Option<String>,
1346 wrapping_key_alias: Option<String>,
1347 wrapping_key_params: AuthSetBuilder,
1348) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +01001349 let wrapping_key_metadata = sl.binder.importKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001350 &KeyDescriptor { domain, nspace, alias: wrapping_key_alias, blob: None },
1351 None,
1352 &wrapping_key_params,
1353 0,
1354 WRAPPING_KEY,
1355 )?;
1356
David Drysdale79092242024-06-18 13:13:43 +01001357 import_wrapped_key(sl, alias, &wrapping_key_metadata, Some(WRAPPED_KEY.to_vec()))
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001358}
1359
1360/// Import given key material as AES-256-GCM-NONE transport key.
1361pub fn import_transport_key(
David Drysdale79092242024-06-18 13:13:43 +01001362 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001363 transport_key_alias: Option<String>,
1364 transport_key: &[u8],
1365) -> binder::Result<KeyMetadata> {
1366 let transport_key_params = AuthSetBuilder::new()
1367 .no_auth_required()
1368 .algorithm(Algorithm::AES)
1369 .block_mode(BlockMode::GCM)
1370 .padding_mode(PaddingMode::NONE)
1371 .key_size(256)
1372 .caller_nonce()
1373 .min_mac_length(128)
1374 .purpose(KeyPurpose::ENCRYPT)
1375 .purpose(KeyPurpose::DECRYPT);
1376
David Drysdale79092242024-06-18 13:13:43 +01001377 sl.binder.importKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001378 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias: transport_key_alias, blob: None },
1379 None,
1380 &transport_key_params,
1381 0,
1382 transport_key,
1383 )
1384}
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001385
1386/// Generate EC key with purpose AGREE_KEY.
1387pub fn generate_ec_agree_key(
David Drysdale79092242024-06-18 13:13:43 +01001388 sl: &SecLevel,
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001389 ec_curve: EcCurve,
1390 digest: Digest,
1391 domain: Domain,
1392 nspace: i64,
1393 alias: Option<String>,
1394) -> binder::Result<KeyMetadata> {
1395 let gen_params = AuthSetBuilder::new()
1396 .no_auth_required()
1397 .algorithm(Algorithm::EC)
1398 .purpose(KeyPurpose::AGREE_KEY)
1399 .digest(digest)
1400 .ec_curve(ec_curve);
1401
David Drysdale79092242024-06-18 13:13:43 +01001402 match sl.binder.generateKey(
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001403 &KeyDescriptor { domain, nspace, alias, blob: None },
1404 None,
1405 &gen_params,
1406 0,
1407 b"entropy",
1408 ) {
1409 Ok(key_metadata) => {
1410 assert!(key_metadata.certificate.is_some());
1411 if domain == Domain::BLOB {
1412 assert!(key_metadata.key.blob.is_some());
1413 }
1414
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001415 check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +01001416 sl,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001417 &key_metadata.authorizations,
1418 &gen_params,
1419 KeyOrigin::GENERATED,
1420 );
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001421 Ok(key_metadata)
1422 }
1423 Err(e) => Err(e),
1424 }
1425}
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001426
1427/// Helper method to import AES keys `total_count` of times.
1428pub fn import_aes_keys(
David Drysdale79092242024-06-18 13:13:43 +01001429 sl: &SecLevel,
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001430 alias_prefix: String,
1431 total_count: Range<i32>,
1432) -> binder::Result<HashSet<String>> {
1433 let mut imported_key_aliases = HashSet::new();
1434
1435 // Import Total number of keys with given alias prefix.
1436 for count in total_count {
1437 let mut alias = String::new();
1438 write!(alias, "{}_{}", alias_prefix, count).unwrap();
1439 imported_key_aliases.insert(alias.clone());
1440
David Drysdale79092242024-06-18 13:13:43 +01001441 import_aes_key(sl, Domain::APP, -1, Some(alias))?;
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001442 }
1443
1444 Ok(imported_key_aliases)
1445}
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001446
1447/// Generate attested EC-P_256 key with device id attestation.
1448pub fn generate_key_with_attest_id(
David Drysdale79092242024-06-18 13:13:43 +01001449 sl: &SecLevel,
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001450 algorithm: Algorithm,
1451 alias: Option<String>,
1452 att_challenge: &[u8],
1453 attest_key: &KeyDescriptor,
1454 attest_id: Tag,
1455 value: Vec<u8>,
1456) -> binder::Result<KeyMetadata> {
1457 assert!(algorithm == Algorithm::RSA || algorithm == Algorithm::EC);
1458
1459 let mut ec_gen_params;
1460 if algorithm == Algorithm::EC {
1461 ec_gen_params = AuthSetBuilder::new()
1462 .no_auth_required()
1463 .algorithm(Algorithm::EC)
1464 .purpose(KeyPurpose::SIGN)
1465 .purpose(KeyPurpose::VERIFY)
1466 .digest(Digest::SHA_2_256)
1467 .ec_curve(EcCurve::P_256)
1468 .attestation_challenge(att_challenge.to_vec());
1469 } else {
1470 ec_gen_params = AuthSetBuilder::new()
1471 .no_auth_required()
1472 .algorithm(Algorithm::RSA)
1473 .rsa_public_exponent(65537)
1474 .key_size(2048)
1475 .purpose(KeyPurpose::SIGN)
1476 .purpose(KeyPurpose::VERIFY)
1477 .digest(Digest::SHA_2_256)
1478 .padding_mode(PaddingMode::RSA_PKCS1_1_5_SIGN)
1479 .attestation_challenge(att_challenge.to_vec());
1480 }
1481
1482 match attest_id {
1483 Tag::ATTESTATION_ID_BRAND => {
1484 ec_gen_params = ec_gen_params.attestation_device_brand(value);
1485 }
1486 Tag::ATTESTATION_ID_DEVICE => {
1487 ec_gen_params = ec_gen_params.attestation_device_name(value);
1488 }
1489 Tag::ATTESTATION_ID_PRODUCT => {
1490 ec_gen_params = ec_gen_params.attestation_device_product_name(value);
1491 }
1492 Tag::ATTESTATION_ID_SERIAL => {
1493 ec_gen_params = ec_gen_params.attestation_device_serial(value);
1494 }
1495 Tag::ATTESTATION_ID_MANUFACTURER => {
1496 ec_gen_params = ec_gen_params.attestation_device_manufacturer(value);
1497 }
1498 Tag::ATTESTATION_ID_MODEL => {
1499 ec_gen_params = ec_gen_params.attestation_device_model(value);
1500 }
1501 Tag::ATTESTATION_ID_IMEI => {
1502 ec_gen_params = ec_gen_params.attestation_device_imei(value);
1503 }
1504 Tag::ATTESTATION_ID_SECOND_IMEI => {
1505 ec_gen_params = ec_gen_params.attestation_device_second_imei(value);
1506 }
1507 _ => {
1508 panic!("Unknown attestation id");
1509 }
1510 }
1511
David Drysdale79092242024-06-18 13:13:43 +01001512 sl.binder.generateKey(
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001513 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: None },
1514 Some(attest_key),
1515 &ec_gen_params,
1516 0,
1517 b"entropy",
1518 )
1519}
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001520
1521/// Generate Key and validate key characteristics.
1522pub fn generate_key(
David Drysdale79092242024-06-18 13:13:43 +01001523 sl: &SecLevel,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001524 gen_params: &AuthSetBuilder,
1525 alias: &str,
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +00001526) -> binder::Result<Option<KeyMetadata>> {
1527 let key_metadata = match sl.binder.generateKey(
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001528 &KeyDescriptor {
1529 domain: Domain::APP,
1530 nspace: -1,
1531 alias: Some(alias.to_string()),
1532 blob: None,
1533 },
1534 None,
1535 gen_params,
1536 0,
1537 b"entropy",
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +00001538 ) {
1539 Ok(metadata) => metadata,
1540 Err(e) => {
1541 return if is_rkp_only_unknown_on_gsi(sl.level)
1542 && e.service_specific_error() == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED.0
1543 {
1544 // GSI replaces the values for remote_prov_prop properties (since they’re
1545 // system_internal_prop properties), so on GSI the properties are not
1546 // reliable indicators of whether StrongBox/TEE are RKP-only or not.
1547 // Test can be skipped if it generates a key with attestation but doesn't provide
1548 // an ATTEST_KEY and rkp-only property is undetermined.
1549 Ok(None)
1550 } else {
1551 Err(e)
1552 };
1553 }
1554 };
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001555
1556 if gen_params.iter().any(|kp| {
1557 matches!(
1558 kp.value,
1559 KeyParameterValue::Algorithm(Algorithm::RSA)
1560 | KeyParameterValue::Algorithm(Algorithm::EC)
1561 )
1562 }) {
1563 assert!(key_metadata.certificate.is_some());
1564 if gen_params.iter().any(|kp| kp.tag == Tag::ATTESTATION_CHALLENGE) {
1565 assert!(key_metadata.certificateChain.is_some());
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +00001566 let mut cert_chain: Vec<u8> = Vec::new();
1567 cert_chain.extend(key_metadata.certificate.as_ref().unwrap());
1568 cert_chain.extend(key_metadata.certificateChain.as_ref().unwrap());
Rajesh Nyamagoudb1c8e832023-06-06 01:39:44 +00001569 let strict_issuer_check =
1570 !(gen_params.iter().any(|kp| kp.tag == Tag::DEVICE_UNIQUE_ATTESTATION));
1571 validate_certchain_with_strict_issuer_check(&cert_chain, strict_issuer_check)
1572 .expect("Error while validating cert chain");
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +00001573 }
1574
1575 if let Some(challenge_param) =
1576 gen_params.iter().find(|kp| kp.tag == Tag::ATTESTATION_CHALLENGE)
1577 {
1578 if let KeyParameterValue::Blob(val) = &challenge_param.value {
1579 let att_challenge = get_value_from_attest_record(
1580 key_metadata.certificate.as_ref().unwrap(),
1581 challenge_param.tag,
1582 key_metadata.keySecurityLevel,
1583 )
1584 .expect("Attestation challenge verification failed.");
1585 assert_eq!(&att_challenge, val);
1586 }
1587
1588 let att_app_id = get_value_from_attest_record(
1589 key_metadata.certificate.as_ref().unwrap(),
1590 Tag::ATTESTATION_APPLICATION_ID,
1591 SecurityLevel::KEYSTORE,
1592 )
1593 .expect("Attestation application id verification failed.");
1594 assert!(!att_app_id.is_empty());
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001595 }
1596 }
David Drysdale79092242024-06-18 13:13:43 +01001597 check_key_authorizations(sl, &key_metadata.authorizations, gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001598
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +00001599 Ok(Some(key_metadata))
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001600}
1601
1602/// Generate a key using given authorizations and create an operation using the generated key.
1603pub fn create_key_and_operation(
David Drysdale79092242024-06-18 13:13:43 +01001604 sl: &SecLevel,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001605 gen_params: &AuthSetBuilder,
1606 op_params: &AuthSetBuilder,
1607 alias: &str,
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +00001608) -> binder::Result<Option<CreateOperationResponse>> {
1609 let Some(key_metadata) = generate_key(sl, gen_params, alias)? else {
1610 return Ok(None);
1611 };
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001612
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +00001613 sl.binder.createOperation(&key_metadata.key, op_params, false).map(Some)
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001614}