blob: e2f0b3e3bce1f3c0128266c7fb6bf65126a9c25d [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
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000395/// Get the value of the given system property, if the given system property doesn't exist
396/// then returns an empty byte vector.
397pub fn get_system_prop(name: &str) -> Vec<u8> {
398 match rustutils::system_properties::read(name) {
399 Ok(Some(value)) => value.as_bytes().to_vec(),
400 _ => vec![],
401 }
402}
403
404/// Determines whether test is running on GSI.
405pub fn is_gsi() -> bool {
406 // This file is only present on GSI builds.
407 PathBuf::from("/system/system_ext/etc/init/init.gsi.rc").as_path().is_file()
408}
409
410/// Determines whether the test is on a GSI build where the rkp-only status of the device is
411/// unknown. GSI replaces the values for remote_prov_prop properties (since they’re
412/// system_internal_prop properties), so on GSI the properties are not reliable indicators of
413/// whether StrongBox/TEE is RKP-only or not.
414pub fn is_rkp_only_unknown_on_gsi(sec_level: SecurityLevel) -> bool {
415 if sec_level == SecurityLevel::TRUSTED_ENVIRONMENT {
416 is_gsi() && get_system_prop(TEE_KEYMINT_RKP_ONLY).is_empty()
417 } else {
418 is_gsi() && get_system_prop(STRONGBOX_KEYMINT_RKP_ONLY).is_empty()
419 }
420}
421
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000422/// Verify that given key param is listed in given authorizations list.
423pub fn check_key_param(authorizations: &[Authorization], key_param: &KeyParameter) -> bool {
424 authorizations.iter().any(|auth| &auth.keyParameter == key_param)
425}
426
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000427/// Verify the given key authorizations with the expected authorizations.
428pub fn check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +0100429 sl: &SecLevel,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000430 authorizations: &[Authorization],
431 expected_params: &[KeyParameter],
432 expected_key_origin: KeyOrigin,
433) {
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000434 // Make sure key authorizations contains only `ALLOWED_TAGS_IN_KEY_AUTHS`
435 authorizations.iter().all(|auth| {
Rajesh Nyamagoud19236362024-07-10 20:52:28 +0000436 // Ignore `INVALID` tag
437 if auth.keyParameter.tag == Tag::INVALID {
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000438 return true;
439 }
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000440 assert!(
441 ALLOWED_TAGS_IN_KEY_AUTHS.contains(&auth.keyParameter.tag),
442 "key authorization is not allowed: {:#?}",
443 auth.keyParameter
444 );
445 true
446 });
447
David Drysdale79092242024-06-18 13:13:43 +0100448 // Check allowed-expected-key-parameters are present in given key authorizations list.
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000449 expected_params.iter().all(|key_param| {
Rajesh Nyamagoud17a92612023-10-17 16:15:05 +0000450 // `INCLUDE_UNIQUE_ID` is not strictly expected to be in key authorizations but has been
451 // put there by some implementations so cope with that.
452 if key_param.tag == Tag::INCLUDE_UNIQUE_ID
453 && !authorizations.iter().any(|auth| auth.keyParameter.tag == key_param.tag)
454 {
455 return true;
456 }
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000457
David Drysdale83153592024-07-16 10:25:08 +0100458 // `Tag::RSA_OAEP_MGF_DIGEST` was added in KeyMint 1.0, but the KeyMint VTS tests didn't
459 // originally check for its presence and so some implementations of early versions (< 3) of
460 // the KeyMint HAL don't include it (cf. b/297306437 and aosp/2758513).
461 //
462 // Given that Keymaster implementations will also omit this tag, skip the check for it
463 // altogether (and rely on the updated KeyMint VTS tests to ensure that up-level KeyMint
464 // implementations correctly populate this tag).
465 if matches!(key_param.tag, Tag::RSA_OAEP_MGF_DIGEST) {
466 return true;
467 }
468
Rajesh Nyamagoudc63a83d2024-09-04 16:48:10 +0000469 // Don't check these parameters if the underlying device is a Keymaster implementation.
David Drysdale79092242024-06-18 13:13:43 +0100470 if sl.is_keymaster() {
Rajesh Nyamagoudc63a83d2024-09-04 16:48:10 +0000471 if matches!(
472 key_param.tag,
473 // `Tag::USAGE_COUNT_LIMIT` was added in KeyMint 1.0.
474 Tag::USAGE_COUNT_LIMIT |
475 // Keymaster implementations may not consistently include `Tag::VENDOR_PATCHLEVEL`
476 // in generated key characteristics.
477 Tag::VENDOR_PATCHLEVEL
478 ) {
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000479 return true;
480 }
Rajesh Nyamagoudc63a83d2024-09-04 16:48:10 +0000481 // `KeyPurpose::ATTEST_KEY` was added in KeyMint 1.0.
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000482 if key_param.tag == Tag::PURPOSE
483 && key_param.value == KeyParameterValue::KeyPurpose(KeyPurpose::ATTEST_KEY)
484 {
485 return true;
486 }
487 }
488
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000489 if ALLOWED_TAGS_IN_KEY_AUTHS.contains(&key_param.tag) {
490 assert!(
491 check_key_param(authorizations, key_param),
492 "Key parameter not found: {:#?}",
493 key_param
494 );
495 }
496 true
497 });
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000498
David Drysdale79092242024-06-18 13:13:43 +0100499 check_common_auths(sl, authorizations, expected_key_origin);
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000500}
501
502/// Verify common key authorizations.
David Drysdale79092242024-06-18 13:13:43 +0100503fn check_common_auths(
504 sl: &SecLevel,
505 authorizations: &[Authorization],
506 expected_key_origin: KeyOrigin,
507) {
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000508 assert!(check_key_param(
509 authorizations,
510 &KeyParameter {
511 tag: Tag::OS_VERSION,
512 value: KeyParameterValue::Integer(get_os_version().try_into().unwrap())
513 }
514 ));
515 assert!(check_key_param(
516 authorizations,
517 &KeyParameter {
518 tag: Tag::OS_PATCHLEVEL,
519 value: KeyParameterValue::Integer(get_os_patchlevel().try_into().unwrap())
520 }
521 ));
522
523 // Access denied for finding vendor-patch-level ("ro.vendor.build.security_patch") property
524 // in a test running with `untrusted_app` context. Keeping this check to verify
525 // vendor-patch-level in tests running with `su` context.
526 if getuid().is_root() {
527 assert!(check_key_param(
528 authorizations,
529 &KeyParameter {
530 tag: Tag::VENDOR_PATCHLEVEL,
531 value: KeyParameterValue::Integer(get_vendor_patchlevel().try_into().unwrap())
532 }
533 ));
534 }
535 assert!(check_key_param(
536 authorizations,
537 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(expected_key_origin) }
538 ));
539 assert!(check_key_param(
540 authorizations,
541 &KeyParameter {
542 tag: Tag::USER_ID,
543 value: KeyParameterValue::Integer(
544 rustutils::users::multiuser_get_user_id(ThreadState::get_calling_uid())
545 .try_into()
546 .unwrap()
547 )
548 }
549 ));
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +0000550
David Drysdale79092242024-06-18 13:13:43 +0100551 if sl.is_keymint() {
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +0000552 assert!(authorizations
553 .iter()
554 .map(|auth| &auth.keyParameter)
555 .any(|key_param| key_param.tag == Tag::CREATION_DATETIME));
556 }
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000557}
558
Rajesh Nyamagoudf436a932023-05-12 01:16:07 +0000559/// Get the key `Authorization` for the given auth `Tag`.
560pub fn get_key_auth(authorizations: &[Authorization], tag: Tag) -> Option<&Authorization> {
561 let auths: Vec<&Authorization> =
562 authorizations.iter().filter(|auth| auth.keyParameter.tag == tag).collect();
563
564 if !auths.is_empty() {
565 Some(auths[0])
566 } else {
567 None
568 }
569}
570
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000571/// Generate EC Key using given security level and domain with below key parameters and
572/// optionally allow the generated key to be attested with factory provisioned attest key using
573/// given challenge and application id -
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000574/// Purposes: SIGN and VERIFY
575/// Digest: SHA_2_256
576/// Curve: P_256
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000577pub fn generate_ec_p256_signing_key(
David Drysdale79092242024-06-18 13:13:43 +0100578 sl: &SecLevel,
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000579 domain: Domain,
580 nspace: i64,
581 alias: Option<String>,
582 att_challenge: Option<&[u8]>,
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000583) -> binder::Result<KeyMetadata> {
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000584 let mut key_attest = false;
585 let mut gen_params = AuthSetBuilder::new()
Rajesh Nyamagoudc7d064d2022-08-20 01:45:17 +0000586 .no_auth_required()
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000587 .algorithm(Algorithm::EC)
588 .purpose(KeyPurpose::SIGN)
589 .purpose(KeyPurpose::VERIFY)
590 .digest(Digest::SHA_2_256)
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000591 .ec_curve(EcCurve::P_256);
592
593 if let Some(challenge) = att_challenge {
594 key_attest = true;
595 gen_params = gen_params.clone().attestation_challenge(challenge.to_vec());
596 }
597
David Drysdale79092242024-06-18 13:13:43 +0100598 match sl.binder.generateKey(
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000599 &KeyDescriptor { domain, nspace, alias, blob: None },
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000600 None,
601 &gen_params,
602 0,
603 b"entropy",
604 ) {
605 Ok(key_metadata) => {
606 assert!(key_metadata.certificate.is_some());
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000607 if key_attest {
608 assert!(key_metadata.certificateChain.is_some());
609 }
610 if domain == Domain::BLOB {
611 assert!(key_metadata.key.blob.is_some());
612 }
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000613
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000614 check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +0100615 sl,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000616 &key_metadata.authorizations,
617 &gen_params,
618 KeyOrigin::GENERATED,
619 );
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000620 Ok(key_metadata)
621 }
622 Err(e) => Err(e),
623 }
624}
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000625
626/// Generate EC signing key.
Rajesh Nyamagoudc7d064d2022-08-20 01:45:17 +0000627pub fn generate_ec_key(
David Drysdale79092242024-06-18 13:13:43 +0100628 sl: &SecLevel,
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000629 domain: Domain,
630 nspace: i64,
631 alias: Option<String>,
632 ec_curve: EcCurve,
633 digest: Digest,
634) -> binder::Result<KeyMetadata> {
635 let gen_params = AuthSetBuilder::new()
636 .no_auth_required()
637 .algorithm(Algorithm::EC)
638 .purpose(KeyPurpose::SIGN)
639 .purpose(KeyPurpose::VERIFY)
640 .digest(digest)
641 .ec_curve(ec_curve);
642
David Drysdale79092242024-06-18 13:13:43 +0100643 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000644 &KeyDescriptor { domain, nspace, alias, blob: None },
645 None,
646 &gen_params,
647 0,
648 b"entropy",
649 )?;
650
651 // Must have a public key.
652 assert!(key_metadata.certificate.is_some());
653
654 // Should not have an attestation record.
655 assert!(key_metadata.certificateChain.is_none());
656
657 if domain == Domain::BLOB {
658 assert!(key_metadata.key.blob.is_some());
659 } else {
660 assert!(key_metadata.key.blob.is_none());
661 }
David Drysdale79092242024-06-18 13:13:43 +0100662 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000663 Ok(key_metadata)
664}
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000665
666/// Generate a RSA key with the given key parameters, alias, domain and namespace.
667pub fn generate_rsa_key(
David Drysdale79092242024-06-18 13:13:43 +0100668 sl: &SecLevel,
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000669 domain: Domain,
670 nspace: i64,
671 alias: Option<String>,
672 key_params: &KeyParams,
673 attest_key: Option<&KeyDescriptor>,
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000674) -> binder::Result<Option<KeyMetadata>> {
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000675 let mut gen_params = AuthSetBuilder::new()
676 .no_auth_required()
677 .algorithm(Algorithm::RSA)
678 .rsa_public_exponent(65537)
679 .key_size(key_params.key_size);
680
681 for purpose in &key_params.purpose {
682 gen_params = gen_params.purpose(*purpose);
683 }
684 if let Some(value) = key_params.digest {
685 gen_params = gen_params.digest(value)
686 }
687 if let Some(value) = key_params.padding {
688 gen_params = gen_params.padding_mode(value);
689 }
690 if let Some(value) = key_params.mgf_digest {
691 gen_params = gen_params.mgf_digest(value);
692 }
693 if let Some(value) = key_params.block_mode {
694 gen_params = gen_params.block_mode(value)
695 }
696 if let Some(value) = &key_params.att_challenge {
697 gen_params = gen_params.attestation_challenge(value.to_vec())
698 }
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000699
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000700 let key_metadata = match sl.binder.generateKey(
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000701 &KeyDescriptor { domain, nspace, alias, blob: None },
702 attest_key,
703 &gen_params,
704 0,
705 b"entropy",
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000706 ) {
707 Ok(metadata) => metadata,
708 Err(e) => {
709 return if is_rkp_only_unknown_on_gsi(sl.level)
710 && e.service_specific_error() == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED.0
711 {
712 // GSI replaces the values for remote_prov_prop properties (since they’re
713 // system_internal_prop properties), so on GSI the properties are not
714 // reliable indicators of whether StrongBox/TEE are RKP-only or not.
715 // Test can be skipped if it generates a key with attestation but doesn't provide
716 // an ATTEST_KEY and rkp-only property is undetermined.
717 Ok(None)
718 } else {
719 Err(e)
720 };
721 }
722 };
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000723
724 // Must have a public key.
725 assert!(key_metadata.certificate.is_some());
726
David Drysdale38f2ca32023-01-10 13:10:51 +0000727 if attest_key.is_none() && key_params.att_challenge.is_some() {
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000728 // Should have an attestation record.
729 assert!(key_metadata.certificateChain.is_some());
730 } else {
731 // Should not have an attestation record.
732 assert!(key_metadata.certificateChain.is_none());
733 }
734
735 assert!(
736 (domain == Domain::BLOB && key_metadata.key.blob.is_some())
737 || key_metadata.key.blob.is_none()
738 );
739
David Drysdale79092242024-06-18 13:13:43 +0100740 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000741 // If `RSA_OAEP_MGF_DIGEST` tag is not mentioned explicitly while generating/importing a key,
742 // then make sure `RSA_OAEP_MGF_DIGEST` tag with default value (SHA1) must not be included in
743 // key authorization list.
744 if key_params.mgf_digest.is_none() {
745 assert!(!check_key_param(
746 &key_metadata.authorizations,
747 &KeyParameter {
748 tag: Tag::RSA_OAEP_MGF_DIGEST,
749 value: KeyParameterValue::Digest(Digest::SHA1)
750 }
751 ));
752 }
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000753 Ok(Some(key_metadata))
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000754}
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000755
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000756/// Generate AES/3DES key.
757pub fn generate_sym_key(
David Drysdale79092242024-06-18 13:13:43 +0100758 sl: &SecLevel,
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000759 algorithm: Algorithm,
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000760 size: i32,
761 alias: &str,
762 padding_mode: &PaddingMode,
763 block_mode: &BlockMode,
764 min_mac_len: Option<i32>,
765) -> binder::Result<KeyMetadata> {
766 let mut gen_params = AuthSetBuilder::new()
767 .no_auth_required()
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000768 .algorithm(algorithm)
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000769 .purpose(KeyPurpose::ENCRYPT)
770 .purpose(KeyPurpose::DECRYPT)
771 .key_size(size)
772 .padding_mode(*padding_mode)
773 .block_mode(*block_mode);
774
775 if let Some(val) = min_mac_len {
776 gen_params = gen_params.min_mac_length(val);
777 }
778
David Drysdale79092242024-06-18 13:13:43 +0100779 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000780 &KeyDescriptor {
781 domain: Domain::APP,
782 nspace: -1,
783 alias: Some(alias.to_string()),
784 blob: None,
785 },
786 None,
787 &gen_params,
788 0,
789 b"entropy",
790 )?;
791
792 // Should not have public certificate.
793 assert!(key_metadata.certificate.is_none());
794
795 // Should not have an attestation record.
796 assert!(key_metadata.certificateChain.is_none());
David Drysdale79092242024-06-18 13:13:43 +0100797 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000798 Ok(key_metadata)
799}
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000800
801/// Generate HMAC key.
802pub fn generate_hmac_key(
David Drysdale79092242024-06-18 13:13:43 +0100803 sl: &SecLevel,
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000804 alias: &str,
805 key_size: i32,
806 min_mac_len: i32,
807 digest: Digest,
808) -> binder::Result<KeyMetadata> {
809 let gen_params = AuthSetBuilder::new()
810 .no_auth_required()
811 .algorithm(Algorithm::HMAC)
812 .purpose(KeyPurpose::SIGN)
813 .purpose(KeyPurpose::VERIFY)
814 .key_size(key_size)
815 .min_mac_length(min_mac_len)
816 .digest(digest);
817
David Drysdale79092242024-06-18 13:13:43 +0100818 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000819 &KeyDescriptor {
820 domain: Domain::APP,
821 nspace: -1,
822 alias: Some(alias.to_string()),
823 blob: None,
824 },
825 None,
826 &gen_params,
827 0,
828 b"entropy",
829 )?;
830
831 // Should not have public certificate.
832 assert!(key_metadata.certificate.is_none());
833
834 // Should not have an attestation record.
835 assert!(key_metadata.certificateChain.is_none());
836
David Drysdale79092242024-06-18 13:13:43 +0100837 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000838 Ok(key_metadata)
839}
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000840
841/// Generate RSA or EC attestation keys using below parameters -
842/// Purpose: ATTEST_KEY
843/// Digest: Digest::SHA_2_256
844/// Padding: PaddingMode::RSA_PKCS1_1_5_SIGN
845/// RSA-Key-Size: 2048
846/// EC-Curve: EcCurve::P_256
847pub fn generate_attestation_key(
David Drysdale79092242024-06-18 13:13:43 +0100848 sl: &SecLevel,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000849 algorithm: Algorithm,
850 att_challenge: &[u8],
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000851) -> binder::Result<Option<KeyMetadata>> {
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000852 assert!(algorithm == Algorithm::RSA || algorithm == Algorithm::EC);
853
854 if algorithm == Algorithm::RSA {
855 let alias = "ks_rsa_attest_test_key";
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000856 generate_rsa_key(
David Drysdale79092242024-06-18 13:13:43 +0100857 sl,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000858 Domain::APP,
859 -1,
860 Some(alias.to_string()),
861 &KeyParams {
862 key_size: 2048,
863 purpose: vec![KeyPurpose::ATTEST_KEY],
864 padding: Some(PaddingMode::RSA_PKCS1_1_5_SIGN),
865 digest: Some(Digest::SHA_2_256),
866 mgf_digest: None,
867 block_mode: None,
868 att_challenge: Some(att_challenge.to_vec()),
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000869 },
870 None,
871 )
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000872 } else {
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000873 generate_ec_attestation_key(sl, att_challenge, Digest::SHA_2_256, EcCurve::P_256)
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000874 }
875}
876
877/// Generate EC attestation key with the given
878/// curve, attestation-challenge and attestation-app-id.
879pub fn generate_ec_attestation_key(
David Drysdale79092242024-06-18 13:13:43 +0100880 sl: &SecLevel,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000881 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000882 digest: Digest,
883 ec_curve: EcCurve,
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000884) -> binder::Result<Option<KeyMetadata>> {
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000885 let alias = "ks_attest_ec_test_key";
886 let gen_params = AuthSetBuilder::new()
887 .no_auth_required()
888 .algorithm(Algorithm::EC)
889 .purpose(KeyPurpose::ATTEST_KEY)
890 .ec_curve(ec_curve)
891 .digest(digest)
David Drysdale38f2ca32023-01-10 13:10:51 +0000892 .attestation_challenge(att_challenge.to_vec());
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000893
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000894 let attestation_key_metadata = match sl.binder.generateKey(
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000895 &KeyDescriptor {
896 domain: Domain::APP,
897 nspace: -1,
898 alias: Some(alias.to_string()),
899 blob: None,
900 },
901 None,
902 &gen_params,
903 0,
904 b"entropy",
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000905 ) {
906 Ok(metadata) => metadata,
907 Err(e) => {
908 return if is_rkp_only_unknown_on_gsi(sl.level)
909 && e.service_specific_error() == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED.0
910 {
911 // GSI replaces the values for remote_prov_prop properties (since they’re
912 // system_internal_prop properties), so on GSI the properties are not
913 // reliable indicators of whether StrongBox/TEE are RKP-only or not.
914 // Test can be skipped if it generates a key with attestation but doesn't provide
915 // an ATTEST_KEY and rkp-only property is undetermined.
916 Ok(None)
917 } else {
918 Err(e)
919 };
920 }
921 };
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000922
923 // Should have public certificate.
924 assert!(attestation_key_metadata.certificate.is_some());
925 // Should have an attestation record.
926 assert!(attestation_key_metadata.certificateChain.is_some());
927
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000928 check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +0100929 sl,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000930 &attestation_key_metadata.authorizations,
931 &gen_params,
932 KeyOrigin::GENERATED,
933 );
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000934 Ok(Some(attestation_key_metadata))
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000935}
936
937/// Generate EC-P-256 key and attest it with given attestation key.
938pub fn generate_ec_256_attested_key(
David Drysdale79092242024-06-18 13:13:43 +0100939 sl: &SecLevel,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000940 alias: Option<String>,
941 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000942 attest_key: &KeyDescriptor,
943) -> binder::Result<KeyMetadata> {
944 let ec_gen_params = AuthSetBuilder::new()
945 .no_auth_required()
946 .algorithm(Algorithm::EC)
947 .purpose(KeyPurpose::SIGN)
948 .purpose(KeyPurpose::VERIFY)
949 .digest(Digest::SHA_2_256)
950 .ec_curve(EcCurve::P_256)
David Drysdale38f2ca32023-01-10 13:10:51 +0000951 .attestation_challenge(att_challenge.to_vec());
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000952
David Drysdale79092242024-06-18 13:13:43 +0100953 let ec_key_metadata = sl
954 .binder
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000955 .generateKey(
956 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: None },
957 Some(attest_key),
958 &ec_gen_params,
959 0,
960 b"entropy",
961 )
962 .unwrap();
963
964 // Should have public certificate.
965 assert!(ec_key_metadata.certificate.is_some());
966 // Shouldn't have an attestation record.
967 assert!(ec_key_metadata.certificateChain.is_none());
968
David Drysdale79092242024-06-18 13:13:43 +0100969 check_key_authorizations(
970 sl,
971 &ec_key_metadata.authorizations,
972 &ec_gen_params,
973 KeyOrigin::GENERATED,
974 );
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000975 Ok(ec_key_metadata)
976}
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000977
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000978/// Imports above defined RSA key - `RSA_2048_KEY` and validates imported key parameters.
979pub fn import_rsa_2048_key(
David Drysdale79092242024-06-18 13:13:43 +0100980 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000981 domain: Domain,
982 nspace: i64,
983 alias: Option<String>,
984 import_params: AuthSetBuilder,
985) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +0100986 let key_metadata = sl
987 .binder
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000988 .importKey(
989 &KeyDescriptor { domain, nspace, alias, blob: None },
990 None,
991 &import_params,
992 0,
993 RSA_2048_KEY,
994 )
995 .unwrap();
996
997 assert!(key_metadata.certificate.is_some());
998 assert!(key_metadata.certificateChain.is_none());
999
David Drysdale79092242024-06-18 13:13:43 +01001000 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001001
1002 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001003 assert!(check_key_param(
1004 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001005 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::RSA) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001006 ));
1007
1008 assert!(check_key_param(
1009 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001010 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(2048) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001011 ));
1012
1013 assert!(check_key_param(
1014 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001015 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001016 ));
1017
1018 assert!(check_key_param(
1019 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001020 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001021 tag: Tag::RSA_PUBLIC_EXPONENT,
1022 value: KeyParameterValue::LongInteger(65537)
1023 }
1024 ));
1025
1026 assert!(check_key_param(
1027 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001028 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001029 tag: Tag::PADDING,
1030 value: KeyParameterValue::PaddingMode(PaddingMode::RSA_PSS)
1031 }
1032 ));
1033
1034 assert!(check_key_param(
1035 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001036 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001037 ));
1038
1039 Ok(key_metadata)
1040}
1041
1042/// Imports above defined EC key - `EC_P_256_KEY` and validates imported key parameters.
1043pub fn import_ec_p_256_key(
David Drysdale79092242024-06-18 13:13:43 +01001044 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001045 domain: Domain,
1046 nspace: i64,
1047 alias: Option<String>,
1048 import_params: AuthSetBuilder,
1049) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +01001050 let key_metadata = sl
1051 .binder
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001052 .importKey(
1053 &KeyDescriptor { domain, nspace, alias, blob: None },
1054 None,
1055 &import_params,
1056 0,
1057 EC_P_256_KEY,
1058 )
1059 .unwrap();
1060
1061 assert!(key_metadata.certificate.is_some());
1062 assert!(key_metadata.certificateChain.is_none());
1063
David Drysdale79092242024-06-18 13:13:43 +01001064 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001065
1066 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001067 assert!(check_key_param(
1068 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001069 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::EC) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001070 ));
1071
1072 assert!(check_key_param(
1073 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001074 &KeyParameter { tag: Tag::EC_CURVE, value: KeyParameterValue::EcCurve(EcCurve::P_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001075 ));
1076
1077 assert!(check_key_param(
1078 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001079 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001080 ));
1081 assert!(check_key_param(
1082 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001083 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001084 ));
1085
1086 Ok(key_metadata)
1087}
1088
1089/// Import sample AES key and validate its key parameters.
1090pub fn import_aes_key(
David Drysdale79092242024-06-18 13:13:43 +01001091 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001092 domain: Domain,
1093 nspace: i64,
1094 alias: Option<String>,
1095) -> binder::Result<KeyMetadata> {
1096 static AES_KEY: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
1097 let key_size = AES_KEY.len() * 8;
1098
1099 let import_params = AuthSetBuilder::new()
1100 .no_auth_required()
1101 .algorithm(Algorithm::AES)
1102 .block_mode(BlockMode::ECB)
1103 .key_size(key_size.try_into().unwrap())
1104 .purpose(KeyPurpose::ENCRYPT)
1105 .purpose(KeyPurpose::DECRYPT)
1106 .padding_mode(PaddingMode::PKCS7);
1107
David Drysdale79092242024-06-18 13:13:43 +01001108 let key_metadata = sl.binder.importKey(
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001109 &KeyDescriptor { domain, nspace, alias, blob: None },
1110 None,
1111 &import_params,
1112 0,
1113 AES_KEY,
1114 )?;
1115
David Drysdale79092242024-06-18 13:13:43 +01001116 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001117
1118 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001119 assert!(check_key_param(
1120 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001121 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::AES) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001122 ));
1123 assert!(check_key_param(
1124 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001125 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(128) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001126 ));
1127 assert!(check_key_param(
1128 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001129 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001130 tag: Tag::PADDING,
1131 value: KeyParameterValue::PaddingMode(PaddingMode::PKCS7)
1132 }
1133 ));
1134 assert!(check_key_param(
1135 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001136 &KeyParameter { tag: Tag::BLOCK_MODE, value: KeyParameterValue::BlockMode(BlockMode::ECB) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001137 ));
1138 assert!(check_key_param(
1139 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001140 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001141 ));
1142
1143 Ok(key_metadata)
1144}
1145
1146/// Import sample 3DES key and validate its key parameters.
1147pub fn import_3des_key(
David Drysdale79092242024-06-18 13:13:43 +01001148 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001149 domain: Domain,
1150 nspace: i64,
1151 alias: Option<String>,
1152) -> binder::Result<KeyMetadata> {
1153 static TRIPLE_DES_KEY: &[u8] = &[
1154 0xa4, 0x9d, 0x75, 0x64, 0x19, 0x9e, 0x97, 0xcb, 0x52, 0x9d, 0x2c, 0x9d, 0x97, 0xbf, 0x2f,
1155 0x98, 0xd3, 0x5e, 0xdf, 0x57, 0xba, 0x1f, 0x73, 0x58,
1156 ];
1157
1158 let import_params = AuthSetBuilder::new()
1159 .no_auth_required()
1160 .algorithm(Algorithm::TRIPLE_DES)
1161 .block_mode(BlockMode::ECB)
1162 .key_size(168)
1163 .purpose(KeyPurpose::ENCRYPT)
1164 .purpose(KeyPurpose::DECRYPT)
1165 .padding_mode(PaddingMode::PKCS7);
1166
David Drysdale79092242024-06-18 13:13:43 +01001167 let key_metadata = sl.binder.importKey(
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001168 &KeyDescriptor { domain, nspace, alias, blob: None },
1169 None,
1170 &import_params,
1171 0,
1172 TRIPLE_DES_KEY,
1173 )?;
1174
David Drysdale79092242024-06-18 13:13:43 +01001175 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001176
1177 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001178 assert!(check_key_param(
1179 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001180 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001181 tag: Tag::ALGORITHM,
1182 value: KeyParameterValue::Algorithm(Algorithm::TRIPLE_DES)
1183 }
1184 ));
1185 assert!(check_key_param(
1186 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001187 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(168) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001188 ));
1189 assert!(check_key_param(
1190 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001191 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001192 tag: Tag::PADDING,
1193 value: KeyParameterValue::PaddingMode(PaddingMode::PKCS7)
1194 }
1195 ));
1196 assert!(check_key_param(
1197 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001198 &KeyParameter { tag: Tag::BLOCK_MODE, value: KeyParameterValue::BlockMode(BlockMode::ECB) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001199 ));
1200 assert!(check_key_param(
1201 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001202 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001203 ));
1204
1205 Ok(key_metadata)
1206}
1207
1208/// Import sample HMAC key and validate its key parameters.
1209pub fn import_hmac_key(
David Drysdale79092242024-06-18 13:13:43 +01001210 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001211 domain: Domain,
1212 nspace: i64,
1213 alias: Option<String>,
1214) -> binder::Result<KeyMetadata> {
1215 static HMAC_KEY: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
1216 let key_size = HMAC_KEY.len() * 8;
1217
1218 let import_params = AuthSetBuilder::new()
1219 .no_auth_required()
1220 .algorithm(Algorithm::HMAC)
1221 .key_size(key_size.try_into().unwrap())
1222 .purpose(KeyPurpose::SIGN)
1223 .purpose(KeyPurpose::VERIFY)
1224 .digest(Digest::SHA_2_256)
1225 .min_mac_length(256);
1226
David Drysdale79092242024-06-18 13:13:43 +01001227 let key_metadata = sl.binder.importKey(
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001228 &KeyDescriptor { domain, nspace, alias, blob: None },
1229 None,
1230 &import_params,
1231 0,
1232 HMAC_KEY,
1233 )?;
1234
David Drysdale79092242024-06-18 13:13:43 +01001235 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001236
1237 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001238 assert!(check_key_param(
1239 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001240 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::HMAC) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001241 ));
1242 assert!(check_key_param(
1243 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001244 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(128) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001245 ));
1246 assert!(check_key_param(
1247 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001248 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001249 ));
1250 assert!(check_key_param(
1251 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001252 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001253 ));
1254
1255 Ok(key_metadata)
1256}
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001257
1258/// Imports RSA encryption key with WRAP_KEY purpose.
1259pub fn import_wrapping_key(
David Drysdale79092242024-06-18 13:13:43 +01001260 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001261 wrapping_key_data: &[u8],
1262 wrapping_key_alias: Option<String>,
1263) -> binder::Result<KeyMetadata> {
1264 let wrapping_key_params = AuthSetBuilder::new()
1265 .no_auth_required()
1266 .algorithm(Algorithm::RSA)
1267 .digest(Digest::SHA_2_256)
1268 .purpose(KeyPurpose::ENCRYPT)
1269 .purpose(KeyPurpose::DECRYPT)
1270 .purpose(KeyPurpose::WRAP_KEY)
1271 .padding_mode(PaddingMode::RSA_OAEP)
1272 .key_size(2048)
1273 .rsa_public_exponent(65537)
1274 .cert_not_before(0)
1275 .cert_not_after(253402300799000);
1276
David Drysdale79092242024-06-18 13:13:43 +01001277 sl.binder.importKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001278 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias: wrapping_key_alias, blob: None },
1279 None,
1280 &wrapping_key_params,
1281 0,
1282 wrapping_key_data,
1283 )
1284}
1285
1286/// Import wrapped key using given wrapping key.
1287pub fn import_wrapped_key(
David Drysdale79092242024-06-18 13:13:43 +01001288 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001289 alias: Option<String>,
1290 wrapping_key_metadata: &KeyMetadata,
1291 wrapped_key: Option<Vec<u8>>,
1292) -> binder::Result<KeyMetadata> {
1293 let unwrap_params =
1294 AuthSetBuilder::new().digest(Digest::SHA_2_256).padding_mode(PaddingMode::RSA_OAEP);
1295
1296 let authenticator_spec: &[AuthenticatorSpec] = &[AuthenticatorSpec {
1297 authenticatorType: HardwareAuthenticatorType::NONE,
1298 authenticatorId: 0,
1299 }];
1300
David Drysdale79092242024-06-18 13:13:43 +01001301 let key_metadata = sl.binder.importWrappedKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001302 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: wrapped_key },
1303 &wrapping_key_metadata.key,
1304 None,
1305 &unwrap_params,
1306 authenticator_spec,
1307 )?;
1308
1309 Ok(key_metadata)
1310}
1311
1312/// Import wrapping key and then import wrapped key using wrapping key.
1313pub fn import_wrapping_key_and_wrapped_key(
David Drysdale79092242024-06-18 13:13:43 +01001314 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001315 domain: Domain,
1316 nspace: i64,
1317 alias: Option<String>,
1318 wrapping_key_alias: Option<String>,
1319 wrapping_key_params: AuthSetBuilder,
1320) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +01001321 let wrapping_key_metadata = sl.binder.importKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001322 &KeyDescriptor { domain, nspace, alias: wrapping_key_alias, blob: None },
1323 None,
1324 &wrapping_key_params,
1325 0,
1326 WRAPPING_KEY,
1327 )?;
1328
David Drysdale79092242024-06-18 13:13:43 +01001329 import_wrapped_key(sl, alias, &wrapping_key_metadata, Some(WRAPPED_KEY.to_vec()))
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001330}
1331
1332/// Import given key material as AES-256-GCM-NONE transport key.
1333pub fn import_transport_key(
David Drysdale79092242024-06-18 13:13:43 +01001334 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001335 transport_key_alias: Option<String>,
1336 transport_key: &[u8],
1337) -> binder::Result<KeyMetadata> {
1338 let transport_key_params = AuthSetBuilder::new()
1339 .no_auth_required()
1340 .algorithm(Algorithm::AES)
1341 .block_mode(BlockMode::GCM)
1342 .padding_mode(PaddingMode::NONE)
1343 .key_size(256)
1344 .caller_nonce()
1345 .min_mac_length(128)
1346 .purpose(KeyPurpose::ENCRYPT)
1347 .purpose(KeyPurpose::DECRYPT);
1348
David Drysdale79092242024-06-18 13:13:43 +01001349 sl.binder.importKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001350 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias: transport_key_alias, blob: None },
1351 None,
1352 &transport_key_params,
1353 0,
1354 transport_key,
1355 )
1356}
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001357
1358/// Generate EC key with purpose AGREE_KEY.
1359pub fn generate_ec_agree_key(
David Drysdale79092242024-06-18 13:13:43 +01001360 sl: &SecLevel,
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001361 ec_curve: EcCurve,
1362 digest: Digest,
1363 domain: Domain,
1364 nspace: i64,
1365 alias: Option<String>,
1366) -> binder::Result<KeyMetadata> {
1367 let gen_params = AuthSetBuilder::new()
1368 .no_auth_required()
1369 .algorithm(Algorithm::EC)
1370 .purpose(KeyPurpose::AGREE_KEY)
1371 .digest(digest)
1372 .ec_curve(ec_curve);
1373
David Drysdale79092242024-06-18 13:13:43 +01001374 match sl.binder.generateKey(
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001375 &KeyDescriptor { domain, nspace, alias, blob: None },
1376 None,
1377 &gen_params,
1378 0,
1379 b"entropy",
1380 ) {
1381 Ok(key_metadata) => {
1382 assert!(key_metadata.certificate.is_some());
1383 if domain == Domain::BLOB {
1384 assert!(key_metadata.key.blob.is_some());
1385 }
1386
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001387 check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +01001388 sl,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001389 &key_metadata.authorizations,
1390 &gen_params,
1391 KeyOrigin::GENERATED,
1392 );
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001393 Ok(key_metadata)
1394 }
1395 Err(e) => Err(e),
1396 }
1397}
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001398
1399/// Helper method to import AES keys `total_count` of times.
1400pub fn import_aes_keys(
David Drysdale79092242024-06-18 13:13:43 +01001401 sl: &SecLevel,
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001402 alias_prefix: String,
1403 total_count: Range<i32>,
1404) -> binder::Result<HashSet<String>> {
1405 let mut imported_key_aliases = HashSet::new();
1406
1407 // Import Total number of keys with given alias prefix.
1408 for count in total_count {
1409 let mut alias = String::new();
1410 write!(alias, "{}_{}", alias_prefix, count).unwrap();
1411 imported_key_aliases.insert(alias.clone());
1412
David Drysdale79092242024-06-18 13:13:43 +01001413 import_aes_key(sl, Domain::APP, -1, Some(alias))?;
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001414 }
1415
1416 Ok(imported_key_aliases)
1417}
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001418
1419/// Generate attested EC-P_256 key with device id attestation.
1420pub fn generate_key_with_attest_id(
David Drysdale79092242024-06-18 13:13:43 +01001421 sl: &SecLevel,
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001422 algorithm: Algorithm,
1423 alias: Option<String>,
1424 att_challenge: &[u8],
1425 attest_key: &KeyDescriptor,
1426 attest_id: Tag,
1427 value: Vec<u8>,
1428) -> binder::Result<KeyMetadata> {
1429 assert!(algorithm == Algorithm::RSA || algorithm == Algorithm::EC);
1430
1431 let mut ec_gen_params;
1432 if algorithm == Algorithm::EC {
1433 ec_gen_params = AuthSetBuilder::new()
1434 .no_auth_required()
1435 .algorithm(Algorithm::EC)
1436 .purpose(KeyPurpose::SIGN)
1437 .purpose(KeyPurpose::VERIFY)
1438 .digest(Digest::SHA_2_256)
1439 .ec_curve(EcCurve::P_256)
1440 .attestation_challenge(att_challenge.to_vec());
1441 } else {
1442 ec_gen_params = AuthSetBuilder::new()
1443 .no_auth_required()
1444 .algorithm(Algorithm::RSA)
1445 .rsa_public_exponent(65537)
1446 .key_size(2048)
1447 .purpose(KeyPurpose::SIGN)
1448 .purpose(KeyPurpose::VERIFY)
1449 .digest(Digest::SHA_2_256)
1450 .padding_mode(PaddingMode::RSA_PKCS1_1_5_SIGN)
1451 .attestation_challenge(att_challenge.to_vec());
1452 }
1453
1454 match attest_id {
1455 Tag::ATTESTATION_ID_BRAND => {
1456 ec_gen_params = ec_gen_params.attestation_device_brand(value);
1457 }
1458 Tag::ATTESTATION_ID_DEVICE => {
1459 ec_gen_params = ec_gen_params.attestation_device_name(value);
1460 }
1461 Tag::ATTESTATION_ID_PRODUCT => {
1462 ec_gen_params = ec_gen_params.attestation_device_product_name(value);
1463 }
1464 Tag::ATTESTATION_ID_SERIAL => {
1465 ec_gen_params = ec_gen_params.attestation_device_serial(value);
1466 }
1467 Tag::ATTESTATION_ID_MANUFACTURER => {
1468 ec_gen_params = ec_gen_params.attestation_device_manufacturer(value);
1469 }
1470 Tag::ATTESTATION_ID_MODEL => {
1471 ec_gen_params = ec_gen_params.attestation_device_model(value);
1472 }
1473 Tag::ATTESTATION_ID_IMEI => {
1474 ec_gen_params = ec_gen_params.attestation_device_imei(value);
1475 }
1476 Tag::ATTESTATION_ID_SECOND_IMEI => {
1477 ec_gen_params = ec_gen_params.attestation_device_second_imei(value);
1478 }
1479 _ => {
1480 panic!("Unknown attestation id");
1481 }
1482 }
1483
David Drysdale79092242024-06-18 13:13:43 +01001484 sl.binder.generateKey(
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001485 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: None },
1486 Some(attest_key),
1487 &ec_gen_params,
1488 0,
1489 b"entropy",
1490 )
1491}
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001492
1493/// Generate Key and validate key characteristics.
1494pub fn generate_key(
David Drysdale79092242024-06-18 13:13:43 +01001495 sl: &SecLevel,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001496 gen_params: &AuthSetBuilder,
1497 alias: &str,
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +00001498) -> binder::Result<Option<KeyMetadata>> {
1499 let key_metadata = match sl.binder.generateKey(
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001500 &KeyDescriptor {
1501 domain: Domain::APP,
1502 nspace: -1,
1503 alias: Some(alias.to_string()),
1504 blob: None,
1505 },
1506 None,
1507 gen_params,
1508 0,
1509 b"entropy",
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +00001510 ) {
1511 Ok(metadata) => metadata,
1512 Err(e) => {
1513 return if is_rkp_only_unknown_on_gsi(sl.level)
1514 && e.service_specific_error() == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED.0
1515 {
1516 // GSI replaces the values for remote_prov_prop properties (since they’re
1517 // system_internal_prop properties), so on GSI the properties are not
1518 // reliable indicators of whether StrongBox/TEE are RKP-only or not.
1519 // Test can be skipped if it generates a key with attestation but doesn't provide
1520 // an ATTEST_KEY and rkp-only property is undetermined.
1521 Ok(None)
1522 } else {
1523 Err(e)
1524 };
1525 }
1526 };
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001527
1528 if gen_params.iter().any(|kp| {
1529 matches!(
1530 kp.value,
1531 KeyParameterValue::Algorithm(Algorithm::RSA)
1532 | KeyParameterValue::Algorithm(Algorithm::EC)
1533 )
1534 }) {
1535 assert!(key_metadata.certificate.is_some());
1536 if gen_params.iter().any(|kp| kp.tag == Tag::ATTESTATION_CHALLENGE) {
1537 assert!(key_metadata.certificateChain.is_some());
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +00001538 let mut cert_chain: Vec<u8> = Vec::new();
1539 cert_chain.extend(key_metadata.certificate.as_ref().unwrap());
1540 cert_chain.extend(key_metadata.certificateChain.as_ref().unwrap());
Rajesh Nyamagoudb1c8e832023-06-06 01:39:44 +00001541 let strict_issuer_check =
1542 !(gen_params.iter().any(|kp| kp.tag == Tag::DEVICE_UNIQUE_ATTESTATION));
1543 validate_certchain_with_strict_issuer_check(&cert_chain, strict_issuer_check)
1544 .expect("Error while validating cert chain");
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +00001545 }
1546
1547 if let Some(challenge_param) =
1548 gen_params.iter().find(|kp| kp.tag == Tag::ATTESTATION_CHALLENGE)
1549 {
1550 if let KeyParameterValue::Blob(val) = &challenge_param.value {
1551 let att_challenge = get_value_from_attest_record(
1552 key_metadata.certificate.as_ref().unwrap(),
1553 challenge_param.tag,
1554 key_metadata.keySecurityLevel,
1555 )
1556 .expect("Attestation challenge verification failed.");
1557 assert_eq!(&att_challenge, val);
1558 }
1559
1560 let att_app_id = get_value_from_attest_record(
1561 key_metadata.certificate.as_ref().unwrap(),
1562 Tag::ATTESTATION_APPLICATION_ID,
1563 SecurityLevel::KEYSTORE,
1564 )
1565 .expect("Attestation application id verification failed.");
1566 assert!(!att_app_id.is_empty());
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001567 }
1568 }
David Drysdale79092242024-06-18 13:13:43 +01001569 check_key_authorizations(sl, &key_metadata.authorizations, gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001570
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +00001571 Ok(Some(key_metadata))
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001572}
1573
1574/// Generate a key using given authorizations and create an operation using the generated key.
1575pub fn create_key_and_operation(
David Drysdale79092242024-06-18 13:13:43 +01001576 sl: &SecLevel,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001577 gen_params: &AuthSetBuilder,
1578 op_params: &AuthSetBuilder,
1579 alias: &str,
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +00001580) -> binder::Result<Option<CreateOperationResponse>> {
1581 let Some(key_metadata) = generate_key(sl, gen_params, alias)? else {
1582 return Ok(None);
1583 };
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001584
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +00001585 sl.binder.createOperation(&key_metadata.key, op_params, false).map(Some)
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001586}