blob: c40e944d1d1f868aa76e0dba646583788d0cdab3 [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.
396pub fn assert_km_error<T: std::fmt::Debug>(result: &BinderResult<T>, want: ErrorCode) {
397 match result {
398 Ok(_) => panic!("Expected KeyMint error {want:?}, found success"),
399 Err(s) => {
400 assert_eq!(
401 s.exception_code(),
402 ExceptionCode::SERVICE_SPECIFIC,
403 "Expected KeyMint service-specific error {want:?}, got {result:?}"
404 );
405 assert_eq!(
406 s.service_specific_error(),
407 want.0,
408 "Expected KeyMint service-specific error {want:?}, got {result:?}"
409 );
410 }
411 }
412}
413
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000414/// Get the value of the given system property, if the given system property doesn't exist
415/// then returns an empty byte vector.
416pub fn get_system_prop(name: &str) -> Vec<u8> {
417 match rustutils::system_properties::read(name) {
418 Ok(Some(value)) => value.as_bytes().to_vec(),
419 _ => vec![],
420 }
421}
422
423/// Determines whether test is running on GSI.
424pub fn is_gsi() -> bool {
425 // This file is only present on GSI builds.
426 PathBuf::from("/system/system_ext/etc/init/init.gsi.rc").as_path().is_file()
427}
428
429/// Determines whether the test is on a GSI build where the rkp-only status of the device is
430/// unknown. GSI replaces the values for remote_prov_prop properties (since they’re
431/// system_internal_prop properties), so on GSI the properties are not reliable indicators of
432/// whether StrongBox/TEE is RKP-only or not.
433pub fn is_rkp_only_unknown_on_gsi(sec_level: SecurityLevel) -> bool {
434 if sec_level == SecurityLevel::TRUSTED_ENVIRONMENT {
435 is_gsi() && get_system_prop(TEE_KEYMINT_RKP_ONLY).is_empty()
436 } else {
437 is_gsi() && get_system_prop(STRONGBOX_KEYMINT_RKP_ONLY).is_empty()
438 }
439}
440
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000441/// Verify that given key param is listed in given authorizations list.
442pub fn check_key_param(authorizations: &[Authorization], key_param: &KeyParameter) -> bool {
443 authorizations.iter().any(|auth| &auth.keyParameter == key_param)
444}
445
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000446/// Verify the given key authorizations with the expected authorizations.
447pub fn check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +0100448 sl: &SecLevel,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000449 authorizations: &[Authorization],
450 expected_params: &[KeyParameter],
451 expected_key_origin: KeyOrigin,
452) {
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000453 // Make sure key authorizations contains only `ALLOWED_TAGS_IN_KEY_AUTHS`
454 authorizations.iter().all(|auth| {
Rajesh Nyamagoud19236362024-07-10 20:52:28 +0000455 // Ignore `INVALID` tag
456 if auth.keyParameter.tag == Tag::INVALID {
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000457 return true;
458 }
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000459 assert!(
460 ALLOWED_TAGS_IN_KEY_AUTHS.contains(&auth.keyParameter.tag),
461 "key authorization is not allowed: {:#?}",
462 auth.keyParameter
463 );
464 true
465 });
466
David Drysdale79092242024-06-18 13:13:43 +0100467 // Check allowed-expected-key-parameters are present in given key authorizations list.
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000468 expected_params.iter().all(|key_param| {
Rajesh Nyamagoud17a92612023-10-17 16:15:05 +0000469 // `INCLUDE_UNIQUE_ID` is not strictly expected to be in key authorizations but has been
470 // put there by some implementations so cope with that.
471 if key_param.tag == Tag::INCLUDE_UNIQUE_ID
472 && !authorizations.iter().any(|auth| auth.keyParameter.tag == key_param.tag)
473 {
474 return true;
475 }
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000476
David Drysdale83153592024-07-16 10:25:08 +0100477 // `Tag::RSA_OAEP_MGF_DIGEST` was added in KeyMint 1.0, but the KeyMint VTS tests didn't
478 // originally check for its presence and so some implementations of early versions (< 3) of
479 // the KeyMint HAL don't include it (cf. b/297306437 and aosp/2758513).
480 //
481 // Given that Keymaster implementations will also omit this tag, skip the check for it
482 // altogether (and rely on the updated KeyMint VTS tests to ensure that up-level KeyMint
483 // implementations correctly populate this tag).
484 if matches!(key_param.tag, Tag::RSA_OAEP_MGF_DIGEST) {
485 return true;
486 }
487
Rajesh Nyamagoudc63a83d2024-09-04 16:48:10 +0000488 // Don't check these parameters if the underlying device is a Keymaster implementation.
David Drysdale79092242024-06-18 13:13:43 +0100489 if sl.is_keymaster() {
Rajesh Nyamagoudc63a83d2024-09-04 16:48:10 +0000490 if matches!(
491 key_param.tag,
492 // `Tag::USAGE_COUNT_LIMIT` was added in KeyMint 1.0.
493 Tag::USAGE_COUNT_LIMIT |
494 // Keymaster implementations may not consistently include `Tag::VENDOR_PATCHLEVEL`
495 // in generated key characteristics.
496 Tag::VENDOR_PATCHLEVEL
497 ) {
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000498 return true;
499 }
Rajesh Nyamagoudc63a83d2024-09-04 16:48:10 +0000500 // `KeyPurpose::ATTEST_KEY` was added in KeyMint 1.0.
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000501 if key_param.tag == Tag::PURPOSE
502 && key_param.value == KeyParameterValue::KeyPurpose(KeyPurpose::ATTEST_KEY)
503 {
504 return true;
505 }
506 }
507
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000508 if ALLOWED_TAGS_IN_KEY_AUTHS.contains(&key_param.tag) {
509 assert!(
510 check_key_param(authorizations, key_param),
511 "Key parameter not found: {:#?}",
512 key_param
513 );
514 }
515 true
516 });
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000517
David Drysdale79092242024-06-18 13:13:43 +0100518 check_common_auths(sl, authorizations, expected_key_origin);
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000519}
520
521/// Verify common key authorizations.
David Drysdale79092242024-06-18 13:13:43 +0100522fn check_common_auths(
523 sl: &SecLevel,
524 authorizations: &[Authorization],
525 expected_key_origin: KeyOrigin,
526) {
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000527 assert!(check_key_param(
528 authorizations,
529 &KeyParameter {
530 tag: Tag::OS_VERSION,
531 value: KeyParameterValue::Integer(get_os_version().try_into().unwrap())
532 }
533 ));
534 assert!(check_key_param(
535 authorizations,
536 &KeyParameter {
537 tag: Tag::OS_PATCHLEVEL,
538 value: KeyParameterValue::Integer(get_os_patchlevel().try_into().unwrap())
539 }
540 ));
541
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000542 assert!(check_key_param(
543 authorizations,
544 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(expected_key_origin) }
545 ));
546 assert!(check_key_param(
547 authorizations,
548 &KeyParameter {
549 tag: Tag::USER_ID,
550 value: KeyParameterValue::Integer(
551 rustutils::users::multiuser_get_user_id(ThreadState::get_calling_uid())
552 .try_into()
553 .unwrap()
554 )
555 }
556 ));
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +0000557
David Drysdale79092242024-06-18 13:13:43 +0100558 if sl.is_keymint() {
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +0000559 assert!(authorizations
560 .iter()
561 .map(|auth| &auth.keyParameter)
562 .any(|key_param| key_param.tag == Tag::CREATION_DATETIME));
Rajesh Nyamagoudfcae6fd2024-09-11 16:10:16 +0000563
564 // Access denied for finding vendor-patch-level ("ro.vendor.build.security_patch") property
565 // in a test running with `untrusted_app` context. Keeping this check to verify
566 // vendor-patch-level in tests running with `su` context.
567 if getuid().is_root() {
568 // Keymaster implementations may not consistently include `Tag::VENDOR_PATCHLEVEL`
569 // in generated key characteristics. So, checking this if the underlying device is a
570 // KeyMint implementation.
571 assert!(check_key_param(
572 authorizations,
573 &KeyParameter {
574 tag: Tag::VENDOR_PATCHLEVEL,
575 value: KeyParameterValue::Integer(get_vendor_patchlevel().try_into().unwrap())
576 }
577 ));
578 }
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +0000579 }
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000580}
581
Rajesh Nyamagoudf436a932023-05-12 01:16:07 +0000582/// Get the key `Authorization` for the given auth `Tag`.
583pub fn get_key_auth(authorizations: &[Authorization], tag: Tag) -> Option<&Authorization> {
584 let auths: Vec<&Authorization> =
585 authorizations.iter().filter(|auth| auth.keyParameter.tag == tag).collect();
586
587 if !auths.is_empty() {
588 Some(auths[0])
589 } else {
590 None
591 }
592}
593
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000594/// Generate EC Key using given security level and domain with below key parameters and
595/// optionally allow the generated key to be attested with factory provisioned attest key using
596/// given challenge and application id -
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000597/// Purposes: SIGN and VERIFY
598/// Digest: SHA_2_256
599/// Curve: P_256
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000600pub fn generate_ec_p256_signing_key(
David Drysdale79092242024-06-18 13:13:43 +0100601 sl: &SecLevel,
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000602 domain: Domain,
603 nspace: i64,
604 alias: Option<String>,
605 att_challenge: Option<&[u8]>,
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000606) -> binder::Result<KeyMetadata> {
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000607 let mut key_attest = false;
608 let mut gen_params = AuthSetBuilder::new()
Rajesh Nyamagoudc7d064d2022-08-20 01:45:17 +0000609 .no_auth_required()
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000610 .algorithm(Algorithm::EC)
611 .purpose(KeyPurpose::SIGN)
612 .purpose(KeyPurpose::VERIFY)
613 .digest(Digest::SHA_2_256)
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000614 .ec_curve(EcCurve::P_256);
615
616 if let Some(challenge) = att_challenge {
617 key_attest = true;
618 gen_params = gen_params.clone().attestation_challenge(challenge.to_vec());
619 }
620
David Drysdale79092242024-06-18 13:13:43 +0100621 match sl.binder.generateKey(
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000622 &KeyDescriptor { domain, nspace, alias, blob: None },
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000623 None,
624 &gen_params,
625 0,
626 b"entropy",
627 ) {
628 Ok(key_metadata) => {
629 assert!(key_metadata.certificate.is_some());
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000630 if key_attest {
631 assert!(key_metadata.certificateChain.is_some());
632 }
633 if domain == Domain::BLOB {
634 assert!(key_metadata.key.blob.is_some());
635 }
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000636
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000637 check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +0100638 sl,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000639 &key_metadata.authorizations,
640 &gen_params,
641 KeyOrigin::GENERATED,
642 );
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000643 Ok(key_metadata)
644 }
645 Err(e) => Err(e),
646 }
647}
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000648
649/// Generate EC signing key.
Rajesh Nyamagoudc7d064d2022-08-20 01:45:17 +0000650pub fn generate_ec_key(
David Drysdale79092242024-06-18 13:13:43 +0100651 sl: &SecLevel,
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000652 domain: Domain,
653 nspace: i64,
654 alias: Option<String>,
655 ec_curve: EcCurve,
656 digest: Digest,
657) -> binder::Result<KeyMetadata> {
658 let gen_params = AuthSetBuilder::new()
659 .no_auth_required()
660 .algorithm(Algorithm::EC)
661 .purpose(KeyPurpose::SIGN)
662 .purpose(KeyPurpose::VERIFY)
663 .digest(digest)
664 .ec_curve(ec_curve);
665
David Drysdale79092242024-06-18 13:13:43 +0100666 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000667 &KeyDescriptor { domain, nspace, alias, blob: None },
668 None,
669 &gen_params,
670 0,
671 b"entropy",
672 )?;
673
674 // Must have a public key.
675 assert!(key_metadata.certificate.is_some());
676
677 // Should not have an attestation record.
678 assert!(key_metadata.certificateChain.is_none());
679
680 if domain == Domain::BLOB {
681 assert!(key_metadata.key.blob.is_some());
682 } else {
683 assert!(key_metadata.key.blob.is_none());
684 }
David Drysdale79092242024-06-18 13:13:43 +0100685 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000686 Ok(key_metadata)
687}
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000688
689/// Generate a RSA key with the given key parameters, alias, domain and namespace.
690pub fn generate_rsa_key(
David Drysdale79092242024-06-18 13:13:43 +0100691 sl: &SecLevel,
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000692 domain: Domain,
693 nspace: i64,
694 alias: Option<String>,
695 key_params: &KeyParams,
696 attest_key: Option<&KeyDescriptor>,
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000697) -> binder::Result<Option<KeyMetadata>> {
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000698 let mut gen_params = AuthSetBuilder::new()
699 .no_auth_required()
700 .algorithm(Algorithm::RSA)
701 .rsa_public_exponent(65537)
702 .key_size(key_params.key_size);
703
704 for purpose in &key_params.purpose {
705 gen_params = gen_params.purpose(*purpose);
706 }
707 if let Some(value) = key_params.digest {
708 gen_params = gen_params.digest(value)
709 }
710 if let Some(value) = key_params.padding {
711 gen_params = gen_params.padding_mode(value);
712 }
713 if let Some(value) = key_params.mgf_digest {
714 gen_params = gen_params.mgf_digest(value);
715 }
716 if let Some(value) = key_params.block_mode {
717 gen_params = gen_params.block_mode(value)
718 }
719 if let Some(value) = &key_params.att_challenge {
720 gen_params = gen_params.attestation_challenge(value.to_vec())
721 }
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000722
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000723 let key_metadata = match sl.binder.generateKey(
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000724 &KeyDescriptor { domain, nspace, alias, blob: None },
725 attest_key,
726 &gen_params,
727 0,
728 b"entropy",
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000729 ) {
730 Ok(metadata) => metadata,
731 Err(e) => {
732 return if is_rkp_only_unknown_on_gsi(sl.level)
733 && e.service_specific_error() == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED.0
734 {
735 // GSI replaces the values for remote_prov_prop properties (since they’re
736 // system_internal_prop properties), so on GSI the properties are not
737 // reliable indicators of whether StrongBox/TEE are RKP-only or not.
738 // Test can be skipped if it generates a key with attestation but doesn't provide
739 // an ATTEST_KEY and rkp-only property is undetermined.
740 Ok(None)
741 } else {
742 Err(e)
743 };
744 }
745 };
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000746
747 // Must have a public key.
748 assert!(key_metadata.certificate.is_some());
749
David Drysdale38f2ca32023-01-10 13:10:51 +0000750 if attest_key.is_none() && key_params.att_challenge.is_some() {
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000751 // Should have an attestation record.
752 assert!(key_metadata.certificateChain.is_some());
753 } else {
754 // Should not have an attestation record.
755 assert!(key_metadata.certificateChain.is_none());
756 }
757
758 assert!(
759 (domain == Domain::BLOB && key_metadata.key.blob.is_some())
760 || key_metadata.key.blob.is_none()
761 );
762
David Drysdale79092242024-06-18 13:13:43 +0100763 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000764 // If `RSA_OAEP_MGF_DIGEST` tag is not mentioned explicitly while generating/importing a key,
765 // then make sure `RSA_OAEP_MGF_DIGEST` tag with default value (SHA1) must not be included in
766 // key authorization list.
767 if key_params.mgf_digest.is_none() {
768 assert!(!check_key_param(
769 &key_metadata.authorizations,
770 &KeyParameter {
771 tag: Tag::RSA_OAEP_MGF_DIGEST,
772 value: KeyParameterValue::Digest(Digest::SHA1)
773 }
774 ));
775 }
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000776 Ok(Some(key_metadata))
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000777}
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000778
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000779/// Generate AES/3DES key.
780pub fn generate_sym_key(
David Drysdale79092242024-06-18 13:13:43 +0100781 sl: &SecLevel,
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000782 algorithm: Algorithm,
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000783 size: i32,
784 alias: &str,
785 padding_mode: &PaddingMode,
786 block_mode: &BlockMode,
787 min_mac_len: Option<i32>,
788) -> binder::Result<KeyMetadata> {
789 let mut gen_params = AuthSetBuilder::new()
790 .no_auth_required()
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000791 .algorithm(algorithm)
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000792 .purpose(KeyPurpose::ENCRYPT)
793 .purpose(KeyPurpose::DECRYPT)
794 .key_size(size)
795 .padding_mode(*padding_mode)
796 .block_mode(*block_mode);
797
798 if let Some(val) = min_mac_len {
799 gen_params = gen_params.min_mac_length(val);
800 }
801
David Drysdale79092242024-06-18 13:13:43 +0100802 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000803 &KeyDescriptor {
804 domain: Domain::APP,
805 nspace: -1,
806 alias: Some(alias.to_string()),
807 blob: None,
808 },
809 None,
810 &gen_params,
811 0,
812 b"entropy",
813 )?;
814
815 // Should not have public certificate.
816 assert!(key_metadata.certificate.is_none());
817
818 // Should not have an attestation record.
819 assert!(key_metadata.certificateChain.is_none());
David Drysdale79092242024-06-18 13:13:43 +0100820 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000821 Ok(key_metadata)
822}
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000823
824/// Generate HMAC key.
825pub fn generate_hmac_key(
David Drysdale79092242024-06-18 13:13:43 +0100826 sl: &SecLevel,
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000827 alias: &str,
828 key_size: i32,
829 min_mac_len: i32,
830 digest: Digest,
831) -> binder::Result<KeyMetadata> {
832 let gen_params = AuthSetBuilder::new()
833 .no_auth_required()
834 .algorithm(Algorithm::HMAC)
835 .purpose(KeyPurpose::SIGN)
836 .purpose(KeyPurpose::VERIFY)
837 .key_size(key_size)
838 .min_mac_length(min_mac_len)
839 .digest(digest);
840
David Drysdale79092242024-06-18 13:13:43 +0100841 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000842 &KeyDescriptor {
843 domain: Domain::APP,
844 nspace: -1,
845 alias: Some(alias.to_string()),
846 blob: None,
847 },
848 None,
849 &gen_params,
850 0,
851 b"entropy",
852 )?;
853
854 // Should not have public certificate.
855 assert!(key_metadata.certificate.is_none());
856
857 // Should not have an attestation record.
858 assert!(key_metadata.certificateChain.is_none());
859
David Drysdale79092242024-06-18 13:13:43 +0100860 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000861 Ok(key_metadata)
862}
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000863
864/// Generate RSA or EC attestation keys using below parameters -
865/// Purpose: ATTEST_KEY
866/// Digest: Digest::SHA_2_256
867/// Padding: PaddingMode::RSA_PKCS1_1_5_SIGN
868/// RSA-Key-Size: 2048
869/// EC-Curve: EcCurve::P_256
870pub fn generate_attestation_key(
David Drysdale79092242024-06-18 13:13:43 +0100871 sl: &SecLevel,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000872 algorithm: Algorithm,
873 att_challenge: &[u8],
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000874) -> binder::Result<Option<KeyMetadata>> {
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000875 assert!(algorithm == Algorithm::RSA || algorithm == Algorithm::EC);
876
877 if algorithm == Algorithm::RSA {
878 let alias = "ks_rsa_attest_test_key";
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000879 generate_rsa_key(
David Drysdale79092242024-06-18 13:13:43 +0100880 sl,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000881 Domain::APP,
882 -1,
883 Some(alias.to_string()),
884 &KeyParams {
885 key_size: 2048,
886 purpose: vec![KeyPurpose::ATTEST_KEY],
887 padding: Some(PaddingMode::RSA_PKCS1_1_5_SIGN),
888 digest: Some(Digest::SHA_2_256),
889 mgf_digest: None,
890 block_mode: None,
891 att_challenge: Some(att_challenge.to_vec()),
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000892 },
893 None,
894 )
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000895 } else {
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000896 generate_ec_attestation_key(sl, att_challenge, Digest::SHA_2_256, EcCurve::P_256)
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000897 }
898}
899
900/// Generate EC attestation key with the given
901/// curve, attestation-challenge and attestation-app-id.
902pub fn generate_ec_attestation_key(
David Drysdale79092242024-06-18 13:13:43 +0100903 sl: &SecLevel,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000904 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000905 digest: Digest,
906 ec_curve: EcCurve,
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000907) -> binder::Result<Option<KeyMetadata>> {
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000908 let alias = "ks_attest_ec_test_key";
909 let gen_params = AuthSetBuilder::new()
910 .no_auth_required()
911 .algorithm(Algorithm::EC)
912 .purpose(KeyPurpose::ATTEST_KEY)
913 .ec_curve(ec_curve)
914 .digest(digest)
David Drysdale38f2ca32023-01-10 13:10:51 +0000915 .attestation_challenge(att_challenge.to_vec());
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000916
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000917 let attestation_key_metadata = match sl.binder.generateKey(
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000918 &KeyDescriptor {
919 domain: Domain::APP,
920 nspace: -1,
921 alias: Some(alias.to_string()),
922 blob: None,
923 },
924 None,
925 &gen_params,
926 0,
927 b"entropy",
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000928 ) {
929 Ok(metadata) => metadata,
930 Err(e) => {
931 return if is_rkp_only_unknown_on_gsi(sl.level)
932 && e.service_specific_error() == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED.0
933 {
934 // GSI replaces the values for remote_prov_prop properties (since they’re
935 // system_internal_prop properties), so on GSI the properties are not
936 // reliable indicators of whether StrongBox/TEE are RKP-only or not.
937 // Test can be skipped if it generates a key with attestation but doesn't provide
938 // an ATTEST_KEY and rkp-only property is undetermined.
939 Ok(None)
940 } else {
941 Err(e)
942 };
943 }
944 };
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000945
946 // Should have public certificate.
947 assert!(attestation_key_metadata.certificate.is_some());
948 // Should have an attestation record.
949 assert!(attestation_key_metadata.certificateChain.is_some());
950
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000951 check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +0100952 sl,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000953 &attestation_key_metadata.authorizations,
954 &gen_params,
955 KeyOrigin::GENERATED,
956 );
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000957 Ok(Some(attestation_key_metadata))
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000958}
959
960/// Generate EC-P-256 key and attest it with given attestation key.
961pub fn generate_ec_256_attested_key(
David Drysdale79092242024-06-18 13:13:43 +0100962 sl: &SecLevel,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000963 alias: Option<String>,
964 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000965 attest_key: &KeyDescriptor,
966) -> binder::Result<KeyMetadata> {
967 let ec_gen_params = AuthSetBuilder::new()
968 .no_auth_required()
969 .algorithm(Algorithm::EC)
970 .purpose(KeyPurpose::SIGN)
971 .purpose(KeyPurpose::VERIFY)
972 .digest(Digest::SHA_2_256)
973 .ec_curve(EcCurve::P_256)
David Drysdale38f2ca32023-01-10 13:10:51 +0000974 .attestation_challenge(att_challenge.to_vec());
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000975
David Drysdale79092242024-06-18 13:13:43 +0100976 let ec_key_metadata = sl
977 .binder
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000978 .generateKey(
979 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: None },
980 Some(attest_key),
981 &ec_gen_params,
982 0,
983 b"entropy",
984 )
985 .unwrap();
986
987 // Should have public certificate.
988 assert!(ec_key_metadata.certificate.is_some());
989 // Shouldn't have an attestation record.
990 assert!(ec_key_metadata.certificateChain.is_none());
991
David Drysdale79092242024-06-18 13:13:43 +0100992 check_key_authorizations(
993 sl,
994 &ec_key_metadata.authorizations,
995 &ec_gen_params,
996 KeyOrigin::GENERATED,
997 );
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000998 Ok(ec_key_metadata)
999}
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001000
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001001/// Imports above defined RSA key - `RSA_2048_KEY` and validates imported key parameters.
1002pub fn import_rsa_2048_key(
David Drysdale79092242024-06-18 13:13:43 +01001003 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001004 domain: Domain,
1005 nspace: i64,
1006 alias: Option<String>,
1007 import_params: AuthSetBuilder,
1008) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +01001009 let key_metadata = sl
1010 .binder
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001011 .importKey(
1012 &KeyDescriptor { domain, nspace, alias, blob: None },
1013 None,
1014 &import_params,
1015 0,
1016 RSA_2048_KEY,
1017 )
1018 .unwrap();
1019
1020 assert!(key_metadata.certificate.is_some());
1021 assert!(key_metadata.certificateChain.is_none());
1022
David Drysdale79092242024-06-18 13:13:43 +01001023 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001024
1025 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001026 assert!(check_key_param(
1027 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001028 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::RSA) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001029 ));
1030
1031 assert!(check_key_param(
1032 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001033 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(2048) }
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::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
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 {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001044 tag: Tag::RSA_PUBLIC_EXPONENT,
1045 value: KeyParameterValue::LongInteger(65537)
1046 }
1047 ));
1048
1049 assert!(check_key_param(
1050 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001051 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001052 tag: Tag::PADDING,
1053 value: KeyParameterValue::PaddingMode(PaddingMode::RSA_PSS)
1054 }
1055 ));
1056
1057 assert!(check_key_param(
1058 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001059 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001060 ));
1061
1062 Ok(key_metadata)
1063}
1064
1065/// Imports above defined EC key - `EC_P_256_KEY` and validates imported key parameters.
1066pub fn import_ec_p_256_key(
David Drysdale79092242024-06-18 13:13:43 +01001067 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001068 domain: Domain,
1069 nspace: i64,
1070 alias: Option<String>,
1071 import_params: AuthSetBuilder,
1072) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +01001073 let key_metadata = sl
1074 .binder
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001075 .importKey(
1076 &KeyDescriptor { domain, nspace, alias, blob: None },
1077 None,
1078 &import_params,
1079 0,
1080 EC_P_256_KEY,
1081 )
1082 .unwrap();
1083
1084 assert!(key_metadata.certificate.is_some());
1085 assert!(key_metadata.certificateChain.is_none());
1086
David Drysdale79092242024-06-18 13:13:43 +01001087 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001088
1089 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001090 assert!(check_key_param(
1091 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001092 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::EC) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001093 ));
1094
1095 assert!(check_key_param(
1096 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001097 &KeyParameter { tag: Tag::EC_CURVE, value: KeyParameterValue::EcCurve(EcCurve::P_256) }
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::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001103 ));
1104 assert!(check_key_param(
1105 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001106 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001107 ));
1108
1109 Ok(key_metadata)
1110}
1111
1112/// Import sample AES key and validate its key parameters.
1113pub fn import_aes_key(
David Drysdale79092242024-06-18 13:13:43 +01001114 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001115 domain: Domain,
1116 nspace: i64,
1117 alias: Option<String>,
1118) -> binder::Result<KeyMetadata> {
1119 static AES_KEY: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
1120 let key_size = AES_KEY.len() * 8;
1121
1122 let import_params = AuthSetBuilder::new()
1123 .no_auth_required()
1124 .algorithm(Algorithm::AES)
1125 .block_mode(BlockMode::ECB)
1126 .key_size(key_size.try_into().unwrap())
1127 .purpose(KeyPurpose::ENCRYPT)
1128 .purpose(KeyPurpose::DECRYPT)
1129 .padding_mode(PaddingMode::PKCS7);
1130
David Drysdale79092242024-06-18 13:13:43 +01001131 let key_metadata = sl.binder.importKey(
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001132 &KeyDescriptor { domain, nspace, alias, blob: None },
1133 None,
1134 &import_params,
1135 0,
1136 AES_KEY,
1137 )?;
1138
David Drysdale79092242024-06-18 13:13:43 +01001139 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001140
1141 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001142 assert!(check_key_param(
1143 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001144 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::AES) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001145 ));
1146 assert!(check_key_param(
1147 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001148 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(128) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001149 ));
1150 assert!(check_key_param(
1151 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001152 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001153 tag: Tag::PADDING,
1154 value: KeyParameterValue::PaddingMode(PaddingMode::PKCS7)
1155 }
1156 ));
1157 assert!(check_key_param(
1158 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001159 &KeyParameter { tag: Tag::BLOCK_MODE, value: KeyParameterValue::BlockMode(BlockMode::ECB) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001160 ));
1161 assert!(check_key_param(
1162 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001163 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001164 ));
1165
1166 Ok(key_metadata)
1167}
1168
1169/// Import sample 3DES key and validate its key parameters.
1170pub fn import_3des_key(
David Drysdale79092242024-06-18 13:13:43 +01001171 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001172 domain: Domain,
1173 nspace: i64,
1174 alias: Option<String>,
1175) -> binder::Result<KeyMetadata> {
1176 static TRIPLE_DES_KEY: &[u8] = &[
1177 0xa4, 0x9d, 0x75, 0x64, 0x19, 0x9e, 0x97, 0xcb, 0x52, 0x9d, 0x2c, 0x9d, 0x97, 0xbf, 0x2f,
1178 0x98, 0xd3, 0x5e, 0xdf, 0x57, 0xba, 0x1f, 0x73, 0x58,
1179 ];
1180
1181 let import_params = AuthSetBuilder::new()
1182 .no_auth_required()
1183 .algorithm(Algorithm::TRIPLE_DES)
1184 .block_mode(BlockMode::ECB)
1185 .key_size(168)
1186 .purpose(KeyPurpose::ENCRYPT)
1187 .purpose(KeyPurpose::DECRYPT)
1188 .padding_mode(PaddingMode::PKCS7);
1189
David Drysdale79092242024-06-18 13:13:43 +01001190 let key_metadata = sl.binder.importKey(
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001191 &KeyDescriptor { domain, nspace, alias, blob: None },
1192 None,
1193 &import_params,
1194 0,
1195 TRIPLE_DES_KEY,
1196 )?;
1197
David Drysdale79092242024-06-18 13:13:43 +01001198 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001199
1200 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001201 assert!(check_key_param(
1202 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001203 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001204 tag: Tag::ALGORITHM,
1205 value: KeyParameterValue::Algorithm(Algorithm::TRIPLE_DES)
1206 }
1207 ));
1208 assert!(check_key_param(
1209 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001210 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(168) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001211 ));
1212 assert!(check_key_param(
1213 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001214 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001215 tag: Tag::PADDING,
1216 value: KeyParameterValue::PaddingMode(PaddingMode::PKCS7)
1217 }
1218 ));
1219 assert!(check_key_param(
1220 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001221 &KeyParameter { tag: Tag::BLOCK_MODE, value: KeyParameterValue::BlockMode(BlockMode::ECB) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001222 ));
1223 assert!(check_key_param(
1224 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001225 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001226 ));
1227
1228 Ok(key_metadata)
1229}
1230
1231/// Import sample HMAC key and validate its key parameters.
1232pub fn import_hmac_key(
David Drysdale79092242024-06-18 13:13:43 +01001233 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001234 domain: Domain,
1235 nspace: i64,
1236 alias: Option<String>,
1237) -> binder::Result<KeyMetadata> {
1238 static HMAC_KEY: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
1239 let key_size = HMAC_KEY.len() * 8;
1240
1241 let import_params = AuthSetBuilder::new()
1242 .no_auth_required()
1243 .algorithm(Algorithm::HMAC)
1244 .key_size(key_size.try_into().unwrap())
1245 .purpose(KeyPurpose::SIGN)
1246 .purpose(KeyPurpose::VERIFY)
1247 .digest(Digest::SHA_2_256)
1248 .min_mac_length(256);
1249
David Drysdale79092242024-06-18 13:13:43 +01001250 let key_metadata = sl.binder.importKey(
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001251 &KeyDescriptor { domain, nspace, alias, blob: None },
1252 None,
1253 &import_params,
1254 0,
1255 HMAC_KEY,
1256 )?;
1257
David Drysdale79092242024-06-18 13:13:43 +01001258 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001259
1260 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001261 assert!(check_key_param(
1262 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001263 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::HMAC) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001264 ));
1265 assert!(check_key_param(
1266 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001267 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(128) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001268 ));
1269 assert!(check_key_param(
1270 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001271 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001272 ));
1273 assert!(check_key_param(
1274 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001275 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001276 ));
1277
1278 Ok(key_metadata)
1279}
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001280
1281/// Imports RSA encryption key with WRAP_KEY purpose.
1282pub fn import_wrapping_key(
David Drysdale79092242024-06-18 13:13:43 +01001283 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001284 wrapping_key_data: &[u8],
1285 wrapping_key_alias: Option<String>,
1286) -> binder::Result<KeyMetadata> {
1287 let wrapping_key_params = AuthSetBuilder::new()
1288 .no_auth_required()
1289 .algorithm(Algorithm::RSA)
1290 .digest(Digest::SHA_2_256)
1291 .purpose(KeyPurpose::ENCRYPT)
1292 .purpose(KeyPurpose::DECRYPT)
1293 .purpose(KeyPurpose::WRAP_KEY)
1294 .padding_mode(PaddingMode::RSA_OAEP)
1295 .key_size(2048)
1296 .rsa_public_exponent(65537)
1297 .cert_not_before(0)
1298 .cert_not_after(253402300799000);
1299
David Drysdale79092242024-06-18 13:13:43 +01001300 sl.binder.importKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001301 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias: wrapping_key_alias, blob: None },
1302 None,
1303 &wrapping_key_params,
1304 0,
1305 wrapping_key_data,
1306 )
1307}
1308
1309/// Import wrapped key using given wrapping key.
1310pub fn import_wrapped_key(
David Drysdale79092242024-06-18 13:13:43 +01001311 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001312 alias: Option<String>,
1313 wrapping_key_metadata: &KeyMetadata,
1314 wrapped_key: Option<Vec<u8>>,
1315) -> binder::Result<KeyMetadata> {
1316 let unwrap_params =
1317 AuthSetBuilder::new().digest(Digest::SHA_2_256).padding_mode(PaddingMode::RSA_OAEP);
1318
1319 let authenticator_spec: &[AuthenticatorSpec] = &[AuthenticatorSpec {
1320 authenticatorType: HardwareAuthenticatorType::NONE,
1321 authenticatorId: 0,
1322 }];
1323
David Drysdale79092242024-06-18 13:13:43 +01001324 let key_metadata = sl.binder.importWrappedKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001325 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: wrapped_key },
1326 &wrapping_key_metadata.key,
1327 None,
1328 &unwrap_params,
1329 authenticator_spec,
1330 )?;
1331
1332 Ok(key_metadata)
1333}
1334
1335/// Import wrapping key and then import wrapped key using wrapping key.
1336pub fn import_wrapping_key_and_wrapped_key(
David Drysdale79092242024-06-18 13:13:43 +01001337 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001338 domain: Domain,
1339 nspace: i64,
1340 alias: Option<String>,
1341 wrapping_key_alias: Option<String>,
1342 wrapping_key_params: AuthSetBuilder,
1343) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +01001344 let wrapping_key_metadata = sl.binder.importKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001345 &KeyDescriptor { domain, nspace, alias: wrapping_key_alias, blob: None },
1346 None,
1347 &wrapping_key_params,
1348 0,
1349 WRAPPING_KEY,
1350 )?;
1351
David Drysdale79092242024-06-18 13:13:43 +01001352 import_wrapped_key(sl, alias, &wrapping_key_metadata, Some(WRAPPED_KEY.to_vec()))
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001353}
1354
1355/// Import given key material as AES-256-GCM-NONE transport key.
1356pub fn import_transport_key(
David Drysdale79092242024-06-18 13:13:43 +01001357 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001358 transport_key_alias: Option<String>,
1359 transport_key: &[u8],
1360) -> binder::Result<KeyMetadata> {
1361 let transport_key_params = AuthSetBuilder::new()
1362 .no_auth_required()
1363 .algorithm(Algorithm::AES)
1364 .block_mode(BlockMode::GCM)
1365 .padding_mode(PaddingMode::NONE)
1366 .key_size(256)
1367 .caller_nonce()
1368 .min_mac_length(128)
1369 .purpose(KeyPurpose::ENCRYPT)
1370 .purpose(KeyPurpose::DECRYPT);
1371
David Drysdale79092242024-06-18 13:13:43 +01001372 sl.binder.importKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001373 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias: transport_key_alias, blob: None },
1374 None,
1375 &transport_key_params,
1376 0,
1377 transport_key,
1378 )
1379}
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001380
1381/// Generate EC key with purpose AGREE_KEY.
1382pub fn generate_ec_agree_key(
David Drysdale79092242024-06-18 13:13:43 +01001383 sl: &SecLevel,
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001384 ec_curve: EcCurve,
1385 digest: Digest,
1386 domain: Domain,
1387 nspace: i64,
1388 alias: Option<String>,
1389) -> binder::Result<KeyMetadata> {
1390 let gen_params = AuthSetBuilder::new()
1391 .no_auth_required()
1392 .algorithm(Algorithm::EC)
1393 .purpose(KeyPurpose::AGREE_KEY)
1394 .digest(digest)
1395 .ec_curve(ec_curve);
1396
David Drysdale79092242024-06-18 13:13:43 +01001397 match sl.binder.generateKey(
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001398 &KeyDescriptor { domain, nspace, alias, blob: None },
1399 None,
1400 &gen_params,
1401 0,
1402 b"entropy",
1403 ) {
1404 Ok(key_metadata) => {
1405 assert!(key_metadata.certificate.is_some());
1406 if domain == Domain::BLOB {
1407 assert!(key_metadata.key.blob.is_some());
1408 }
1409
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001410 check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +01001411 sl,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001412 &key_metadata.authorizations,
1413 &gen_params,
1414 KeyOrigin::GENERATED,
1415 );
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001416 Ok(key_metadata)
1417 }
1418 Err(e) => Err(e),
1419 }
1420}
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001421
1422/// Helper method to import AES keys `total_count` of times.
1423pub fn import_aes_keys(
David Drysdale79092242024-06-18 13:13:43 +01001424 sl: &SecLevel,
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001425 alias_prefix: String,
1426 total_count: Range<i32>,
1427) -> binder::Result<HashSet<String>> {
1428 let mut imported_key_aliases = HashSet::new();
1429
1430 // Import Total number of keys with given alias prefix.
1431 for count in total_count {
1432 let mut alias = String::new();
1433 write!(alias, "{}_{}", alias_prefix, count).unwrap();
1434 imported_key_aliases.insert(alias.clone());
1435
David Drysdale79092242024-06-18 13:13:43 +01001436 import_aes_key(sl, Domain::APP, -1, Some(alias))?;
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001437 }
1438
1439 Ok(imported_key_aliases)
1440}
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001441
1442/// Generate attested EC-P_256 key with device id attestation.
1443pub fn generate_key_with_attest_id(
David Drysdale79092242024-06-18 13:13:43 +01001444 sl: &SecLevel,
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001445 algorithm: Algorithm,
1446 alias: Option<String>,
1447 att_challenge: &[u8],
1448 attest_key: &KeyDescriptor,
1449 attest_id: Tag,
1450 value: Vec<u8>,
1451) -> binder::Result<KeyMetadata> {
1452 assert!(algorithm == Algorithm::RSA || algorithm == Algorithm::EC);
1453
1454 let mut ec_gen_params;
1455 if algorithm == Algorithm::EC {
1456 ec_gen_params = AuthSetBuilder::new()
1457 .no_auth_required()
1458 .algorithm(Algorithm::EC)
1459 .purpose(KeyPurpose::SIGN)
1460 .purpose(KeyPurpose::VERIFY)
1461 .digest(Digest::SHA_2_256)
1462 .ec_curve(EcCurve::P_256)
1463 .attestation_challenge(att_challenge.to_vec());
1464 } else {
1465 ec_gen_params = AuthSetBuilder::new()
1466 .no_auth_required()
1467 .algorithm(Algorithm::RSA)
1468 .rsa_public_exponent(65537)
1469 .key_size(2048)
1470 .purpose(KeyPurpose::SIGN)
1471 .purpose(KeyPurpose::VERIFY)
1472 .digest(Digest::SHA_2_256)
1473 .padding_mode(PaddingMode::RSA_PKCS1_1_5_SIGN)
1474 .attestation_challenge(att_challenge.to_vec());
1475 }
1476
1477 match attest_id {
1478 Tag::ATTESTATION_ID_BRAND => {
1479 ec_gen_params = ec_gen_params.attestation_device_brand(value);
1480 }
1481 Tag::ATTESTATION_ID_DEVICE => {
1482 ec_gen_params = ec_gen_params.attestation_device_name(value);
1483 }
1484 Tag::ATTESTATION_ID_PRODUCT => {
1485 ec_gen_params = ec_gen_params.attestation_device_product_name(value);
1486 }
1487 Tag::ATTESTATION_ID_SERIAL => {
1488 ec_gen_params = ec_gen_params.attestation_device_serial(value);
1489 }
1490 Tag::ATTESTATION_ID_MANUFACTURER => {
1491 ec_gen_params = ec_gen_params.attestation_device_manufacturer(value);
1492 }
1493 Tag::ATTESTATION_ID_MODEL => {
1494 ec_gen_params = ec_gen_params.attestation_device_model(value);
1495 }
1496 Tag::ATTESTATION_ID_IMEI => {
1497 ec_gen_params = ec_gen_params.attestation_device_imei(value);
1498 }
1499 Tag::ATTESTATION_ID_SECOND_IMEI => {
1500 ec_gen_params = ec_gen_params.attestation_device_second_imei(value);
1501 }
1502 _ => {
1503 panic!("Unknown attestation id");
1504 }
1505 }
1506
David Drysdale79092242024-06-18 13:13:43 +01001507 sl.binder.generateKey(
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001508 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: None },
1509 Some(attest_key),
1510 &ec_gen_params,
1511 0,
1512 b"entropy",
1513 )
1514}
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001515
1516/// Generate Key and validate key characteristics.
1517pub fn generate_key(
David Drysdale79092242024-06-18 13:13:43 +01001518 sl: &SecLevel,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001519 gen_params: &AuthSetBuilder,
1520 alias: &str,
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +00001521) -> binder::Result<Option<KeyMetadata>> {
1522 let key_metadata = match sl.binder.generateKey(
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001523 &KeyDescriptor {
1524 domain: Domain::APP,
1525 nspace: -1,
1526 alias: Some(alias.to_string()),
1527 blob: None,
1528 },
1529 None,
1530 gen_params,
1531 0,
1532 b"entropy",
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +00001533 ) {
1534 Ok(metadata) => metadata,
1535 Err(e) => {
1536 return if is_rkp_only_unknown_on_gsi(sl.level)
1537 && e.service_specific_error() == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED.0
1538 {
1539 // GSI replaces the values for remote_prov_prop properties (since they’re
1540 // system_internal_prop properties), so on GSI the properties are not
1541 // reliable indicators of whether StrongBox/TEE are RKP-only or not.
1542 // Test can be skipped if it generates a key with attestation but doesn't provide
1543 // an ATTEST_KEY and rkp-only property is undetermined.
1544 Ok(None)
1545 } else {
1546 Err(e)
1547 };
1548 }
1549 };
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001550
1551 if gen_params.iter().any(|kp| {
1552 matches!(
1553 kp.value,
1554 KeyParameterValue::Algorithm(Algorithm::RSA)
1555 | KeyParameterValue::Algorithm(Algorithm::EC)
1556 )
1557 }) {
1558 assert!(key_metadata.certificate.is_some());
1559 if gen_params.iter().any(|kp| kp.tag == Tag::ATTESTATION_CHALLENGE) {
1560 assert!(key_metadata.certificateChain.is_some());
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +00001561 let mut cert_chain: Vec<u8> = Vec::new();
1562 cert_chain.extend(key_metadata.certificate.as_ref().unwrap());
1563 cert_chain.extend(key_metadata.certificateChain.as_ref().unwrap());
Rajesh Nyamagoudb1c8e832023-06-06 01:39:44 +00001564 let strict_issuer_check =
1565 !(gen_params.iter().any(|kp| kp.tag == Tag::DEVICE_UNIQUE_ATTESTATION));
1566 validate_certchain_with_strict_issuer_check(&cert_chain, strict_issuer_check)
1567 .expect("Error while validating cert chain");
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +00001568 }
1569
1570 if let Some(challenge_param) =
1571 gen_params.iter().find(|kp| kp.tag == Tag::ATTESTATION_CHALLENGE)
1572 {
1573 if let KeyParameterValue::Blob(val) = &challenge_param.value {
1574 let att_challenge = get_value_from_attest_record(
1575 key_metadata.certificate.as_ref().unwrap(),
1576 challenge_param.tag,
1577 key_metadata.keySecurityLevel,
1578 )
1579 .expect("Attestation challenge verification failed.");
1580 assert_eq!(&att_challenge, val);
1581 }
1582
1583 let att_app_id = get_value_from_attest_record(
1584 key_metadata.certificate.as_ref().unwrap(),
1585 Tag::ATTESTATION_APPLICATION_ID,
1586 SecurityLevel::KEYSTORE,
1587 )
1588 .expect("Attestation application id verification failed.");
1589 assert!(!att_app_id.is_empty());
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001590 }
1591 }
David Drysdale79092242024-06-18 13:13:43 +01001592 check_key_authorizations(sl, &key_metadata.authorizations, gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001593
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +00001594 Ok(Some(key_metadata))
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001595}
1596
1597/// Generate a key using given authorizations and create an operation using the generated key.
1598pub fn create_key_and_operation(
David Drysdale79092242024-06-18 13:13:43 +01001599 sl: &SecLevel,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001600 gen_params: &AuthSetBuilder,
1601 op_params: &AuthSetBuilder,
1602 alias: &str,
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +00001603) -> binder::Result<Option<CreateOperationResponse>> {
1604 let Some(key_metadata) = generate_key(sl, gen_params, alias)? else {
1605 return Ok(None);
1606 };
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001607
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +00001608 sl.binder.createOperation(&key_metadata.key, op_params, false).map(Some)
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001609}