blob: 258c68f472285ed7510f818a6ecb22161b8192d9 [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
David Drysdale79092242024-06-18 13:13:43 +0100469 if sl.is_keymaster() {
David Drysdale83153592024-07-16 10:25:08 +0100470 // `Tag::USAGE_COUNT_LIMIT` was added in KeyMint 1.0, so don't check for it if the
471 // underlying device is a Keymaster implementation.
472 if matches!(key_param.tag, Tag::USAGE_COUNT_LIMIT) {
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000473 return true;
474 }
David Drysdale83153592024-07-16 10:25:08 +0100475 // `KeyPurpose::ATTEST_KEY` was added in KeyMint 1.0, so don't check for it if the
476 // underlying device is a Keymaster implementation.
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000477 if key_param.tag == Tag::PURPOSE
478 && key_param.value == KeyParameterValue::KeyPurpose(KeyPurpose::ATTEST_KEY)
479 {
480 return true;
481 }
482 }
483
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000484 if ALLOWED_TAGS_IN_KEY_AUTHS.contains(&key_param.tag) {
485 assert!(
486 check_key_param(authorizations, key_param),
487 "Key parameter not found: {:#?}",
488 key_param
489 );
490 }
491 true
492 });
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000493
David Drysdale79092242024-06-18 13:13:43 +0100494 check_common_auths(sl, authorizations, expected_key_origin);
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000495}
496
497/// Verify common key authorizations.
David Drysdale79092242024-06-18 13:13:43 +0100498fn check_common_auths(
499 sl: &SecLevel,
500 authorizations: &[Authorization],
501 expected_key_origin: KeyOrigin,
502) {
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000503 assert!(check_key_param(
504 authorizations,
505 &KeyParameter {
506 tag: Tag::OS_VERSION,
507 value: KeyParameterValue::Integer(get_os_version().try_into().unwrap())
508 }
509 ));
510 assert!(check_key_param(
511 authorizations,
512 &KeyParameter {
513 tag: Tag::OS_PATCHLEVEL,
514 value: KeyParameterValue::Integer(get_os_patchlevel().try_into().unwrap())
515 }
516 ));
517
518 // Access denied for finding vendor-patch-level ("ro.vendor.build.security_patch") property
519 // in a test running with `untrusted_app` context. Keeping this check to verify
520 // vendor-patch-level in tests running with `su` context.
521 if getuid().is_root() {
522 assert!(check_key_param(
523 authorizations,
524 &KeyParameter {
525 tag: Tag::VENDOR_PATCHLEVEL,
526 value: KeyParameterValue::Integer(get_vendor_patchlevel().try_into().unwrap())
527 }
528 ));
529 }
530 assert!(check_key_param(
531 authorizations,
532 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(expected_key_origin) }
533 ));
534 assert!(check_key_param(
535 authorizations,
536 &KeyParameter {
537 tag: Tag::USER_ID,
538 value: KeyParameterValue::Integer(
539 rustutils::users::multiuser_get_user_id(ThreadState::get_calling_uid())
540 .try_into()
541 .unwrap()
542 )
543 }
544 ));
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +0000545
David Drysdale79092242024-06-18 13:13:43 +0100546 if sl.is_keymint() {
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +0000547 assert!(authorizations
548 .iter()
549 .map(|auth| &auth.keyParameter)
550 .any(|key_param| key_param.tag == Tag::CREATION_DATETIME));
551 }
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000552}
553
Rajesh Nyamagoudf436a932023-05-12 01:16:07 +0000554/// Get the key `Authorization` for the given auth `Tag`.
555pub fn get_key_auth(authorizations: &[Authorization], tag: Tag) -> Option<&Authorization> {
556 let auths: Vec<&Authorization> =
557 authorizations.iter().filter(|auth| auth.keyParameter.tag == tag).collect();
558
559 if !auths.is_empty() {
560 Some(auths[0])
561 } else {
562 None
563 }
564}
565
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000566/// Generate EC Key using given security level and domain with below key parameters and
567/// optionally allow the generated key to be attested with factory provisioned attest key using
568/// given challenge and application id -
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000569/// Purposes: SIGN and VERIFY
570/// Digest: SHA_2_256
571/// Curve: P_256
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000572pub fn generate_ec_p256_signing_key(
David Drysdale79092242024-06-18 13:13:43 +0100573 sl: &SecLevel,
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000574 domain: Domain,
575 nspace: i64,
576 alias: Option<String>,
577 att_challenge: Option<&[u8]>,
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000578) -> binder::Result<KeyMetadata> {
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000579 let mut key_attest = false;
580 let mut gen_params = AuthSetBuilder::new()
Rajesh Nyamagoudc7d064d2022-08-20 01:45:17 +0000581 .no_auth_required()
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000582 .algorithm(Algorithm::EC)
583 .purpose(KeyPurpose::SIGN)
584 .purpose(KeyPurpose::VERIFY)
585 .digest(Digest::SHA_2_256)
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000586 .ec_curve(EcCurve::P_256);
587
588 if let Some(challenge) = att_challenge {
589 key_attest = true;
590 gen_params = gen_params.clone().attestation_challenge(challenge.to_vec());
591 }
592
David Drysdale79092242024-06-18 13:13:43 +0100593 match sl.binder.generateKey(
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000594 &KeyDescriptor { domain, nspace, alias, blob: None },
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000595 None,
596 &gen_params,
597 0,
598 b"entropy",
599 ) {
600 Ok(key_metadata) => {
601 assert!(key_metadata.certificate.is_some());
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000602 if key_attest {
603 assert!(key_metadata.certificateChain.is_some());
604 }
605 if domain == Domain::BLOB {
606 assert!(key_metadata.key.blob.is_some());
607 }
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000608
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000609 check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +0100610 sl,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000611 &key_metadata.authorizations,
612 &gen_params,
613 KeyOrigin::GENERATED,
614 );
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000615 Ok(key_metadata)
616 }
617 Err(e) => Err(e),
618 }
619}
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000620
621/// Generate EC signing key.
Rajesh Nyamagoudc7d064d2022-08-20 01:45:17 +0000622pub fn generate_ec_key(
David Drysdale79092242024-06-18 13:13:43 +0100623 sl: &SecLevel,
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000624 domain: Domain,
625 nspace: i64,
626 alias: Option<String>,
627 ec_curve: EcCurve,
628 digest: Digest,
629) -> binder::Result<KeyMetadata> {
630 let gen_params = AuthSetBuilder::new()
631 .no_auth_required()
632 .algorithm(Algorithm::EC)
633 .purpose(KeyPurpose::SIGN)
634 .purpose(KeyPurpose::VERIFY)
635 .digest(digest)
636 .ec_curve(ec_curve);
637
David Drysdale79092242024-06-18 13:13:43 +0100638 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000639 &KeyDescriptor { domain, nspace, alias, blob: None },
640 None,
641 &gen_params,
642 0,
643 b"entropy",
644 )?;
645
646 // Must have a public key.
647 assert!(key_metadata.certificate.is_some());
648
649 // Should not have an attestation record.
650 assert!(key_metadata.certificateChain.is_none());
651
652 if domain == Domain::BLOB {
653 assert!(key_metadata.key.blob.is_some());
654 } else {
655 assert!(key_metadata.key.blob.is_none());
656 }
David Drysdale79092242024-06-18 13:13:43 +0100657 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000658 Ok(key_metadata)
659}
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000660
661/// Generate a RSA key with the given key parameters, alias, domain and namespace.
662pub fn generate_rsa_key(
David Drysdale79092242024-06-18 13:13:43 +0100663 sl: &SecLevel,
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000664 domain: Domain,
665 nspace: i64,
666 alias: Option<String>,
667 key_params: &KeyParams,
668 attest_key: Option<&KeyDescriptor>,
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000669) -> binder::Result<Option<KeyMetadata>> {
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000670 let mut gen_params = AuthSetBuilder::new()
671 .no_auth_required()
672 .algorithm(Algorithm::RSA)
673 .rsa_public_exponent(65537)
674 .key_size(key_params.key_size);
675
676 for purpose in &key_params.purpose {
677 gen_params = gen_params.purpose(*purpose);
678 }
679 if let Some(value) = key_params.digest {
680 gen_params = gen_params.digest(value)
681 }
682 if let Some(value) = key_params.padding {
683 gen_params = gen_params.padding_mode(value);
684 }
685 if let Some(value) = key_params.mgf_digest {
686 gen_params = gen_params.mgf_digest(value);
687 }
688 if let Some(value) = key_params.block_mode {
689 gen_params = gen_params.block_mode(value)
690 }
691 if let Some(value) = &key_params.att_challenge {
692 gen_params = gen_params.attestation_challenge(value.to_vec())
693 }
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000694
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000695 let key_metadata = match sl.binder.generateKey(
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000696 &KeyDescriptor { domain, nspace, alias, blob: None },
697 attest_key,
698 &gen_params,
699 0,
700 b"entropy",
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000701 ) {
702 Ok(metadata) => metadata,
703 Err(e) => {
704 return if is_rkp_only_unknown_on_gsi(sl.level)
705 && e.service_specific_error() == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED.0
706 {
707 // GSI replaces the values for remote_prov_prop properties (since they’re
708 // system_internal_prop properties), so on GSI the properties are not
709 // reliable indicators of whether StrongBox/TEE are RKP-only or not.
710 // Test can be skipped if it generates a key with attestation but doesn't provide
711 // an ATTEST_KEY and rkp-only property is undetermined.
712 Ok(None)
713 } else {
714 Err(e)
715 };
716 }
717 };
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000718
719 // Must have a public key.
720 assert!(key_metadata.certificate.is_some());
721
David Drysdale38f2ca32023-01-10 13:10:51 +0000722 if attest_key.is_none() && key_params.att_challenge.is_some() {
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000723 // Should have an attestation record.
724 assert!(key_metadata.certificateChain.is_some());
725 } else {
726 // Should not have an attestation record.
727 assert!(key_metadata.certificateChain.is_none());
728 }
729
730 assert!(
731 (domain == Domain::BLOB && key_metadata.key.blob.is_some())
732 || key_metadata.key.blob.is_none()
733 );
734
David Drysdale79092242024-06-18 13:13:43 +0100735 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000736 // If `RSA_OAEP_MGF_DIGEST` tag is not mentioned explicitly while generating/importing a key,
737 // then make sure `RSA_OAEP_MGF_DIGEST` tag with default value (SHA1) must not be included in
738 // key authorization list.
739 if key_params.mgf_digest.is_none() {
740 assert!(!check_key_param(
741 &key_metadata.authorizations,
742 &KeyParameter {
743 tag: Tag::RSA_OAEP_MGF_DIGEST,
744 value: KeyParameterValue::Digest(Digest::SHA1)
745 }
746 ));
747 }
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000748 Ok(Some(key_metadata))
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000749}
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000750
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000751/// Generate AES/3DES key.
752pub fn generate_sym_key(
David Drysdale79092242024-06-18 13:13:43 +0100753 sl: &SecLevel,
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000754 algorithm: Algorithm,
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000755 size: i32,
756 alias: &str,
757 padding_mode: &PaddingMode,
758 block_mode: &BlockMode,
759 min_mac_len: Option<i32>,
760) -> binder::Result<KeyMetadata> {
761 let mut gen_params = AuthSetBuilder::new()
762 .no_auth_required()
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000763 .algorithm(algorithm)
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000764 .purpose(KeyPurpose::ENCRYPT)
765 .purpose(KeyPurpose::DECRYPT)
766 .key_size(size)
767 .padding_mode(*padding_mode)
768 .block_mode(*block_mode);
769
770 if let Some(val) = min_mac_len {
771 gen_params = gen_params.min_mac_length(val);
772 }
773
David Drysdale79092242024-06-18 13:13:43 +0100774 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000775 &KeyDescriptor {
776 domain: Domain::APP,
777 nspace: -1,
778 alias: Some(alias.to_string()),
779 blob: None,
780 },
781 None,
782 &gen_params,
783 0,
784 b"entropy",
785 )?;
786
787 // Should not have public certificate.
788 assert!(key_metadata.certificate.is_none());
789
790 // Should not have an attestation record.
791 assert!(key_metadata.certificateChain.is_none());
David Drysdale79092242024-06-18 13:13:43 +0100792 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000793 Ok(key_metadata)
794}
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000795
796/// Generate HMAC key.
797pub fn generate_hmac_key(
David Drysdale79092242024-06-18 13:13:43 +0100798 sl: &SecLevel,
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000799 alias: &str,
800 key_size: i32,
801 min_mac_len: i32,
802 digest: Digest,
803) -> binder::Result<KeyMetadata> {
804 let gen_params = AuthSetBuilder::new()
805 .no_auth_required()
806 .algorithm(Algorithm::HMAC)
807 .purpose(KeyPurpose::SIGN)
808 .purpose(KeyPurpose::VERIFY)
809 .key_size(key_size)
810 .min_mac_length(min_mac_len)
811 .digest(digest);
812
David Drysdale79092242024-06-18 13:13:43 +0100813 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000814 &KeyDescriptor {
815 domain: Domain::APP,
816 nspace: -1,
817 alias: Some(alias.to_string()),
818 blob: None,
819 },
820 None,
821 &gen_params,
822 0,
823 b"entropy",
824 )?;
825
826 // Should not have public certificate.
827 assert!(key_metadata.certificate.is_none());
828
829 // Should not have an attestation record.
830 assert!(key_metadata.certificateChain.is_none());
831
David Drysdale79092242024-06-18 13:13:43 +0100832 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000833 Ok(key_metadata)
834}
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000835
836/// Generate RSA or EC attestation keys using below parameters -
837/// Purpose: ATTEST_KEY
838/// Digest: Digest::SHA_2_256
839/// Padding: PaddingMode::RSA_PKCS1_1_5_SIGN
840/// RSA-Key-Size: 2048
841/// EC-Curve: EcCurve::P_256
842pub fn generate_attestation_key(
David Drysdale79092242024-06-18 13:13:43 +0100843 sl: &SecLevel,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000844 algorithm: Algorithm,
845 att_challenge: &[u8],
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000846) -> binder::Result<Option<KeyMetadata>> {
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000847 assert!(algorithm == Algorithm::RSA || algorithm == Algorithm::EC);
848
849 if algorithm == Algorithm::RSA {
850 let alias = "ks_rsa_attest_test_key";
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000851 generate_rsa_key(
David Drysdale79092242024-06-18 13:13:43 +0100852 sl,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000853 Domain::APP,
854 -1,
855 Some(alias.to_string()),
856 &KeyParams {
857 key_size: 2048,
858 purpose: vec![KeyPurpose::ATTEST_KEY],
859 padding: Some(PaddingMode::RSA_PKCS1_1_5_SIGN),
860 digest: Some(Digest::SHA_2_256),
861 mgf_digest: None,
862 block_mode: None,
863 att_challenge: Some(att_challenge.to_vec()),
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000864 },
865 None,
866 )
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000867 } else {
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000868 generate_ec_attestation_key(sl, att_challenge, Digest::SHA_2_256, EcCurve::P_256)
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000869 }
870}
871
872/// Generate EC attestation key with the given
873/// curve, attestation-challenge and attestation-app-id.
874pub fn generate_ec_attestation_key(
David Drysdale79092242024-06-18 13:13:43 +0100875 sl: &SecLevel,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000876 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000877 digest: Digest,
878 ec_curve: EcCurve,
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000879) -> binder::Result<Option<KeyMetadata>> {
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000880 let alias = "ks_attest_ec_test_key";
881 let gen_params = AuthSetBuilder::new()
882 .no_auth_required()
883 .algorithm(Algorithm::EC)
884 .purpose(KeyPurpose::ATTEST_KEY)
885 .ec_curve(ec_curve)
886 .digest(digest)
David Drysdale38f2ca32023-01-10 13:10:51 +0000887 .attestation_challenge(att_challenge.to_vec());
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000888
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000889 let attestation_key_metadata = match sl.binder.generateKey(
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000890 &KeyDescriptor {
891 domain: Domain::APP,
892 nspace: -1,
893 alias: Some(alias.to_string()),
894 blob: None,
895 },
896 None,
897 &gen_params,
898 0,
899 b"entropy",
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000900 ) {
901 Ok(metadata) => metadata,
902 Err(e) => {
903 return if is_rkp_only_unknown_on_gsi(sl.level)
904 && e.service_specific_error() == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED.0
905 {
906 // GSI replaces the values for remote_prov_prop properties (since they’re
907 // system_internal_prop properties), so on GSI the properties are not
908 // reliable indicators of whether StrongBox/TEE are RKP-only or not.
909 // Test can be skipped if it generates a key with attestation but doesn't provide
910 // an ATTEST_KEY and rkp-only property is undetermined.
911 Ok(None)
912 } else {
913 Err(e)
914 };
915 }
916 };
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000917
918 // Should have public certificate.
919 assert!(attestation_key_metadata.certificate.is_some());
920 // Should have an attestation record.
921 assert!(attestation_key_metadata.certificateChain.is_some());
922
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000923 check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +0100924 sl,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000925 &attestation_key_metadata.authorizations,
926 &gen_params,
927 KeyOrigin::GENERATED,
928 );
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +0000929 Ok(Some(attestation_key_metadata))
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000930}
931
932/// Generate EC-P-256 key and attest it with given attestation key.
933pub fn generate_ec_256_attested_key(
David Drysdale79092242024-06-18 13:13:43 +0100934 sl: &SecLevel,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000935 alias: Option<String>,
936 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000937 attest_key: &KeyDescriptor,
938) -> binder::Result<KeyMetadata> {
939 let ec_gen_params = AuthSetBuilder::new()
940 .no_auth_required()
941 .algorithm(Algorithm::EC)
942 .purpose(KeyPurpose::SIGN)
943 .purpose(KeyPurpose::VERIFY)
944 .digest(Digest::SHA_2_256)
945 .ec_curve(EcCurve::P_256)
David Drysdale38f2ca32023-01-10 13:10:51 +0000946 .attestation_challenge(att_challenge.to_vec());
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000947
David Drysdale79092242024-06-18 13:13:43 +0100948 let ec_key_metadata = sl
949 .binder
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000950 .generateKey(
951 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: None },
952 Some(attest_key),
953 &ec_gen_params,
954 0,
955 b"entropy",
956 )
957 .unwrap();
958
959 // Should have public certificate.
960 assert!(ec_key_metadata.certificate.is_some());
961 // Shouldn't have an attestation record.
962 assert!(ec_key_metadata.certificateChain.is_none());
963
David Drysdale79092242024-06-18 13:13:43 +0100964 check_key_authorizations(
965 sl,
966 &ec_key_metadata.authorizations,
967 &ec_gen_params,
968 KeyOrigin::GENERATED,
969 );
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000970 Ok(ec_key_metadata)
971}
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000972
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000973/// Imports above defined RSA key - `RSA_2048_KEY` and validates imported key parameters.
974pub fn import_rsa_2048_key(
David Drysdale79092242024-06-18 13:13:43 +0100975 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000976 domain: Domain,
977 nspace: i64,
978 alias: Option<String>,
979 import_params: AuthSetBuilder,
980) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +0100981 let key_metadata = sl
982 .binder
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000983 .importKey(
984 &KeyDescriptor { domain, nspace, alias, blob: None },
985 None,
986 &import_params,
987 0,
988 RSA_2048_KEY,
989 )
990 .unwrap();
991
992 assert!(key_metadata.certificate.is_some());
993 assert!(key_metadata.certificateChain.is_none());
994
David Drysdale79092242024-06-18 13:13:43 +0100995 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000996
997 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000998 assert!(check_key_param(
999 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001000 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::RSA) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001001 ));
1002
1003 assert!(check_key_param(
1004 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001005 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(2048) }
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::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
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 {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001016 tag: Tag::RSA_PUBLIC_EXPONENT,
1017 value: KeyParameterValue::LongInteger(65537)
1018 }
1019 ));
1020
1021 assert!(check_key_param(
1022 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001023 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001024 tag: Tag::PADDING,
1025 value: KeyParameterValue::PaddingMode(PaddingMode::RSA_PSS)
1026 }
1027 ));
1028
1029 assert!(check_key_param(
1030 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001031 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001032 ));
1033
1034 Ok(key_metadata)
1035}
1036
1037/// Imports above defined EC key - `EC_P_256_KEY` and validates imported key parameters.
1038pub fn import_ec_p_256_key(
David Drysdale79092242024-06-18 13:13:43 +01001039 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001040 domain: Domain,
1041 nspace: i64,
1042 alias: Option<String>,
1043 import_params: AuthSetBuilder,
1044) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +01001045 let key_metadata = sl
1046 .binder
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001047 .importKey(
1048 &KeyDescriptor { domain, nspace, alias, blob: None },
1049 None,
1050 &import_params,
1051 0,
1052 EC_P_256_KEY,
1053 )
1054 .unwrap();
1055
1056 assert!(key_metadata.certificate.is_some());
1057 assert!(key_metadata.certificateChain.is_none());
1058
David Drysdale79092242024-06-18 13:13:43 +01001059 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001060
1061 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001062 assert!(check_key_param(
1063 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001064 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::EC) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001065 ));
1066
1067 assert!(check_key_param(
1068 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001069 &KeyParameter { tag: Tag::EC_CURVE, value: KeyParameterValue::EcCurve(EcCurve::P_256) }
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::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001075 ));
1076 assert!(check_key_param(
1077 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001078 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001079 ));
1080
1081 Ok(key_metadata)
1082}
1083
1084/// Import sample AES key and validate its key parameters.
1085pub fn import_aes_key(
David Drysdale79092242024-06-18 13:13:43 +01001086 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001087 domain: Domain,
1088 nspace: i64,
1089 alias: Option<String>,
1090) -> binder::Result<KeyMetadata> {
1091 static AES_KEY: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
1092 let key_size = AES_KEY.len() * 8;
1093
1094 let import_params = AuthSetBuilder::new()
1095 .no_auth_required()
1096 .algorithm(Algorithm::AES)
1097 .block_mode(BlockMode::ECB)
1098 .key_size(key_size.try_into().unwrap())
1099 .purpose(KeyPurpose::ENCRYPT)
1100 .purpose(KeyPurpose::DECRYPT)
1101 .padding_mode(PaddingMode::PKCS7);
1102
David Drysdale79092242024-06-18 13:13:43 +01001103 let key_metadata = sl.binder.importKey(
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001104 &KeyDescriptor { domain, nspace, alias, blob: None },
1105 None,
1106 &import_params,
1107 0,
1108 AES_KEY,
1109 )?;
1110
David Drysdale79092242024-06-18 13:13:43 +01001111 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001112
1113 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001114 assert!(check_key_param(
1115 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001116 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::AES) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001117 ));
1118 assert!(check_key_param(
1119 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001120 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(128) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001121 ));
1122 assert!(check_key_param(
1123 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001124 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001125 tag: Tag::PADDING,
1126 value: KeyParameterValue::PaddingMode(PaddingMode::PKCS7)
1127 }
1128 ));
1129 assert!(check_key_param(
1130 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001131 &KeyParameter { tag: Tag::BLOCK_MODE, value: KeyParameterValue::BlockMode(BlockMode::ECB) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001132 ));
1133 assert!(check_key_param(
1134 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001135 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001136 ));
1137
1138 Ok(key_metadata)
1139}
1140
1141/// Import sample 3DES key and validate its key parameters.
1142pub fn import_3des_key(
David Drysdale79092242024-06-18 13:13:43 +01001143 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001144 domain: Domain,
1145 nspace: i64,
1146 alias: Option<String>,
1147) -> binder::Result<KeyMetadata> {
1148 static TRIPLE_DES_KEY: &[u8] = &[
1149 0xa4, 0x9d, 0x75, 0x64, 0x19, 0x9e, 0x97, 0xcb, 0x52, 0x9d, 0x2c, 0x9d, 0x97, 0xbf, 0x2f,
1150 0x98, 0xd3, 0x5e, 0xdf, 0x57, 0xba, 0x1f, 0x73, 0x58,
1151 ];
1152
1153 let import_params = AuthSetBuilder::new()
1154 .no_auth_required()
1155 .algorithm(Algorithm::TRIPLE_DES)
1156 .block_mode(BlockMode::ECB)
1157 .key_size(168)
1158 .purpose(KeyPurpose::ENCRYPT)
1159 .purpose(KeyPurpose::DECRYPT)
1160 .padding_mode(PaddingMode::PKCS7);
1161
David Drysdale79092242024-06-18 13:13:43 +01001162 let key_metadata = sl.binder.importKey(
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001163 &KeyDescriptor { domain, nspace, alias, blob: None },
1164 None,
1165 &import_params,
1166 0,
1167 TRIPLE_DES_KEY,
1168 )?;
1169
David Drysdale79092242024-06-18 13:13:43 +01001170 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001171
1172 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001173 assert!(check_key_param(
1174 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001175 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001176 tag: Tag::ALGORITHM,
1177 value: KeyParameterValue::Algorithm(Algorithm::TRIPLE_DES)
1178 }
1179 ));
1180 assert!(check_key_param(
1181 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001182 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(168) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001183 ));
1184 assert!(check_key_param(
1185 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001186 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001187 tag: Tag::PADDING,
1188 value: KeyParameterValue::PaddingMode(PaddingMode::PKCS7)
1189 }
1190 ));
1191 assert!(check_key_param(
1192 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001193 &KeyParameter { tag: Tag::BLOCK_MODE, value: KeyParameterValue::BlockMode(BlockMode::ECB) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001194 ));
1195 assert!(check_key_param(
1196 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001197 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001198 ));
1199
1200 Ok(key_metadata)
1201}
1202
1203/// Import sample HMAC key and validate its key parameters.
1204pub fn import_hmac_key(
David Drysdale79092242024-06-18 13:13:43 +01001205 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001206 domain: Domain,
1207 nspace: i64,
1208 alias: Option<String>,
1209) -> binder::Result<KeyMetadata> {
1210 static HMAC_KEY: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
1211 let key_size = HMAC_KEY.len() * 8;
1212
1213 let import_params = AuthSetBuilder::new()
1214 .no_auth_required()
1215 .algorithm(Algorithm::HMAC)
1216 .key_size(key_size.try_into().unwrap())
1217 .purpose(KeyPurpose::SIGN)
1218 .purpose(KeyPurpose::VERIFY)
1219 .digest(Digest::SHA_2_256)
1220 .min_mac_length(256);
1221
David Drysdale79092242024-06-18 13:13:43 +01001222 let key_metadata = sl.binder.importKey(
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001223 &KeyDescriptor { domain, nspace, alias, blob: None },
1224 None,
1225 &import_params,
1226 0,
1227 HMAC_KEY,
1228 )?;
1229
David Drysdale79092242024-06-18 13:13:43 +01001230 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001231
1232 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001233 assert!(check_key_param(
1234 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001235 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::HMAC) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001236 ));
1237 assert!(check_key_param(
1238 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001239 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(128) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001240 ));
1241 assert!(check_key_param(
1242 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001243 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001244 ));
1245 assert!(check_key_param(
1246 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001247 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001248 ));
1249
1250 Ok(key_metadata)
1251}
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001252
1253/// Imports RSA encryption key with WRAP_KEY purpose.
1254pub fn import_wrapping_key(
David Drysdale79092242024-06-18 13:13:43 +01001255 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001256 wrapping_key_data: &[u8],
1257 wrapping_key_alias: Option<String>,
1258) -> binder::Result<KeyMetadata> {
1259 let wrapping_key_params = AuthSetBuilder::new()
1260 .no_auth_required()
1261 .algorithm(Algorithm::RSA)
1262 .digest(Digest::SHA_2_256)
1263 .purpose(KeyPurpose::ENCRYPT)
1264 .purpose(KeyPurpose::DECRYPT)
1265 .purpose(KeyPurpose::WRAP_KEY)
1266 .padding_mode(PaddingMode::RSA_OAEP)
1267 .key_size(2048)
1268 .rsa_public_exponent(65537)
1269 .cert_not_before(0)
1270 .cert_not_after(253402300799000);
1271
David Drysdale79092242024-06-18 13:13:43 +01001272 sl.binder.importKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001273 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias: wrapping_key_alias, blob: None },
1274 None,
1275 &wrapping_key_params,
1276 0,
1277 wrapping_key_data,
1278 )
1279}
1280
1281/// Import wrapped key using given wrapping key.
1282pub fn import_wrapped_key(
David Drysdale79092242024-06-18 13:13:43 +01001283 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001284 alias: Option<String>,
1285 wrapping_key_metadata: &KeyMetadata,
1286 wrapped_key: Option<Vec<u8>>,
1287) -> binder::Result<KeyMetadata> {
1288 let unwrap_params =
1289 AuthSetBuilder::new().digest(Digest::SHA_2_256).padding_mode(PaddingMode::RSA_OAEP);
1290
1291 let authenticator_spec: &[AuthenticatorSpec] = &[AuthenticatorSpec {
1292 authenticatorType: HardwareAuthenticatorType::NONE,
1293 authenticatorId: 0,
1294 }];
1295
David Drysdale79092242024-06-18 13:13:43 +01001296 let key_metadata = sl.binder.importWrappedKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001297 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: wrapped_key },
1298 &wrapping_key_metadata.key,
1299 None,
1300 &unwrap_params,
1301 authenticator_spec,
1302 )?;
1303
1304 Ok(key_metadata)
1305}
1306
1307/// Import wrapping key and then import wrapped key using wrapping key.
1308pub fn import_wrapping_key_and_wrapped_key(
David Drysdale79092242024-06-18 13:13:43 +01001309 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001310 domain: Domain,
1311 nspace: i64,
1312 alias: Option<String>,
1313 wrapping_key_alias: Option<String>,
1314 wrapping_key_params: AuthSetBuilder,
1315) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +01001316 let wrapping_key_metadata = sl.binder.importKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001317 &KeyDescriptor { domain, nspace, alias: wrapping_key_alias, blob: None },
1318 None,
1319 &wrapping_key_params,
1320 0,
1321 WRAPPING_KEY,
1322 )?;
1323
David Drysdale79092242024-06-18 13:13:43 +01001324 import_wrapped_key(sl, alias, &wrapping_key_metadata, Some(WRAPPED_KEY.to_vec()))
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001325}
1326
1327/// Import given key material as AES-256-GCM-NONE transport key.
1328pub fn import_transport_key(
David Drysdale79092242024-06-18 13:13:43 +01001329 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001330 transport_key_alias: Option<String>,
1331 transport_key: &[u8],
1332) -> binder::Result<KeyMetadata> {
1333 let transport_key_params = AuthSetBuilder::new()
1334 .no_auth_required()
1335 .algorithm(Algorithm::AES)
1336 .block_mode(BlockMode::GCM)
1337 .padding_mode(PaddingMode::NONE)
1338 .key_size(256)
1339 .caller_nonce()
1340 .min_mac_length(128)
1341 .purpose(KeyPurpose::ENCRYPT)
1342 .purpose(KeyPurpose::DECRYPT);
1343
David Drysdale79092242024-06-18 13:13:43 +01001344 sl.binder.importKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001345 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias: transport_key_alias, blob: None },
1346 None,
1347 &transport_key_params,
1348 0,
1349 transport_key,
1350 )
1351}
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001352
1353/// Generate EC key with purpose AGREE_KEY.
1354pub fn generate_ec_agree_key(
David Drysdale79092242024-06-18 13:13:43 +01001355 sl: &SecLevel,
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001356 ec_curve: EcCurve,
1357 digest: Digest,
1358 domain: Domain,
1359 nspace: i64,
1360 alias: Option<String>,
1361) -> binder::Result<KeyMetadata> {
1362 let gen_params = AuthSetBuilder::new()
1363 .no_auth_required()
1364 .algorithm(Algorithm::EC)
1365 .purpose(KeyPurpose::AGREE_KEY)
1366 .digest(digest)
1367 .ec_curve(ec_curve);
1368
David Drysdale79092242024-06-18 13:13:43 +01001369 match sl.binder.generateKey(
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001370 &KeyDescriptor { domain, nspace, alias, blob: None },
1371 None,
1372 &gen_params,
1373 0,
1374 b"entropy",
1375 ) {
1376 Ok(key_metadata) => {
1377 assert!(key_metadata.certificate.is_some());
1378 if domain == Domain::BLOB {
1379 assert!(key_metadata.key.blob.is_some());
1380 }
1381
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001382 check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +01001383 sl,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001384 &key_metadata.authorizations,
1385 &gen_params,
1386 KeyOrigin::GENERATED,
1387 );
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001388 Ok(key_metadata)
1389 }
1390 Err(e) => Err(e),
1391 }
1392}
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001393
1394/// Helper method to import AES keys `total_count` of times.
1395pub fn import_aes_keys(
David Drysdale79092242024-06-18 13:13:43 +01001396 sl: &SecLevel,
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001397 alias_prefix: String,
1398 total_count: Range<i32>,
1399) -> binder::Result<HashSet<String>> {
1400 let mut imported_key_aliases = HashSet::new();
1401
1402 // Import Total number of keys with given alias prefix.
1403 for count in total_count {
1404 let mut alias = String::new();
1405 write!(alias, "{}_{}", alias_prefix, count).unwrap();
1406 imported_key_aliases.insert(alias.clone());
1407
David Drysdale79092242024-06-18 13:13:43 +01001408 import_aes_key(sl, Domain::APP, -1, Some(alias))?;
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001409 }
1410
1411 Ok(imported_key_aliases)
1412}
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001413
1414/// Generate attested EC-P_256 key with device id attestation.
1415pub fn generate_key_with_attest_id(
David Drysdale79092242024-06-18 13:13:43 +01001416 sl: &SecLevel,
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001417 algorithm: Algorithm,
1418 alias: Option<String>,
1419 att_challenge: &[u8],
1420 attest_key: &KeyDescriptor,
1421 attest_id: Tag,
1422 value: Vec<u8>,
1423) -> binder::Result<KeyMetadata> {
1424 assert!(algorithm == Algorithm::RSA || algorithm == Algorithm::EC);
1425
1426 let mut ec_gen_params;
1427 if algorithm == Algorithm::EC {
1428 ec_gen_params = AuthSetBuilder::new()
1429 .no_auth_required()
1430 .algorithm(Algorithm::EC)
1431 .purpose(KeyPurpose::SIGN)
1432 .purpose(KeyPurpose::VERIFY)
1433 .digest(Digest::SHA_2_256)
1434 .ec_curve(EcCurve::P_256)
1435 .attestation_challenge(att_challenge.to_vec());
1436 } else {
1437 ec_gen_params = AuthSetBuilder::new()
1438 .no_auth_required()
1439 .algorithm(Algorithm::RSA)
1440 .rsa_public_exponent(65537)
1441 .key_size(2048)
1442 .purpose(KeyPurpose::SIGN)
1443 .purpose(KeyPurpose::VERIFY)
1444 .digest(Digest::SHA_2_256)
1445 .padding_mode(PaddingMode::RSA_PKCS1_1_5_SIGN)
1446 .attestation_challenge(att_challenge.to_vec());
1447 }
1448
1449 match attest_id {
1450 Tag::ATTESTATION_ID_BRAND => {
1451 ec_gen_params = ec_gen_params.attestation_device_brand(value);
1452 }
1453 Tag::ATTESTATION_ID_DEVICE => {
1454 ec_gen_params = ec_gen_params.attestation_device_name(value);
1455 }
1456 Tag::ATTESTATION_ID_PRODUCT => {
1457 ec_gen_params = ec_gen_params.attestation_device_product_name(value);
1458 }
1459 Tag::ATTESTATION_ID_SERIAL => {
1460 ec_gen_params = ec_gen_params.attestation_device_serial(value);
1461 }
1462 Tag::ATTESTATION_ID_MANUFACTURER => {
1463 ec_gen_params = ec_gen_params.attestation_device_manufacturer(value);
1464 }
1465 Tag::ATTESTATION_ID_MODEL => {
1466 ec_gen_params = ec_gen_params.attestation_device_model(value);
1467 }
1468 Tag::ATTESTATION_ID_IMEI => {
1469 ec_gen_params = ec_gen_params.attestation_device_imei(value);
1470 }
1471 Tag::ATTESTATION_ID_SECOND_IMEI => {
1472 ec_gen_params = ec_gen_params.attestation_device_second_imei(value);
1473 }
1474 _ => {
1475 panic!("Unknown attestation id");
1476 }
1477 }
1478
David Drysdale79092242024-06-18 13:13:43 +01001479 sl.binder.generateKey(
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001480 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: None },
1481 Some(attest_key),
1482 &ec_gen_params,
1483 0,
1484 b"entropy",
1485 )
1486}
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001487
1488/// Generate Key and validate key characteristics.
1489pub fn generate_key(
David Drysdale79092242024-06-18 13:13:43 +01001490 sl: &SecLevel,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001491 gen_params: &AuthSetBuilder,
1492 alias: &str,
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +00001493) -> binder::Result<Option<KeyMetadata>> {
1494 let key_metadata = match sl.binder.generateKey(
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001495 &KeyDescriptor {
1496 domain: Domain::APP,
1497 nspace: -1,
1498 alias: Some(alias.to_string()),
1499 blob: None,
1500 },
1501 None,
1502 gen_params,
1503 0,
1504 b"entropy",
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +00001505 ) {
1506 Ok(metadata) => metadata,
1507 Err(e) => {
1508 return if is_rkp_only_unknown_on_gsi(sl.level)
1509 && e.service_specific_error() == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED.0
1510 {
1511 // GSI replaces the values for remote_prov_prop properties (since they’re
1512 // system_internal_prop properties), so on GSI the properties are not
1513 // reliable indicators of whether StrongBox/TEE are RKP-only or not.
1514 // Test can be skipped if it generates a key with attestation but doesn't provide
1515 // an ATTEST_KEY and rkp-only property is undetermined.
1516 Ok(None)
1517 } else {
1518 Err(e)
1519 };
1520 }
1521 };
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001522
1523 if gen_params.iter().any(|kp| {
1524 matches!(
1525 kp.value,
1526 KeyParameterValue::Algorithm(Algorithm::RSA)
1527 | KeyParameterValue::Algorithm(Algorithm::EC)
1528 )
1529 }) {
1530 assert!(key_metadata.certificate.is_some());
1531 if gen_params.iter().any(|kp| kp.tag == Tag::ATTESTATION_CHALLENGE) {
1532 assert!(key_metadata.certificateChain.is_some());
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +00001533 let mut cert_chain: Vec<u8> = Vec::new();
1534 cert_chain.extend(key_metadata.certificate.as_ref().unwrap());
1535 cert_chain.extend(key_metadata.certificateChain.as_ref().unwrap());
Rajesh Nyamagoudb1c8e832023-06-06 01:39:44 +00001536 let strict_issuer_check =
1537 !(gen_params.iter().any(|kp| kp.tag == Tag::DEVICE_UNIQUE_ATTESTATION));
1538 validate_certchain_with_strict_issuer_check(&cert_chain, strict_issuer_check)
1539 .expect("Error while validating cert chain");
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +00001540 }
1541
1542 if let Some(challenge_param) =
1543 gen_params.iter().find(|kp| kp.tag == Tag::ATTESTATION_CHALLENGE)
1544 {
1545 if let KeyParameterValue::Blob(val) = &challenge_param.value {
1546 let att_challenge = get_value_from_attest_record(
1547 key_metadata.certificate.as_ref().unwrap(),
1548 challenge_param.tag,
1549 key_metadata.keySecurityLevel,
1550 )
1551 .expect("Attestation challenge verification failed.");
1552 assert_eq!(&att_challenge, val);
1553 }
1554
1555 let att_app_id = get_value_from_attest_record(
1556 key_metadata.certificate.as_ref().unwrap(),
1557 Tag::ATTESTATION_APPLICATION_ID,
1558 SecurityLevel::KEYSTORE,
1559 )
1560 .expect("Attestation application id verification failed.");
1561 assert!(!att_app_id.is_empty());
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001562 }
1563 }
David Drysdale79092242024-06-18 13:13:43 +01001564 check_key_authorizations(sl, &key_metadata.authorizations, gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001565
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +00001566 Ok(Some(key_metadata))
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001567}
1568
1569/// Generate a key using given authorizations and create an operation using the generated key.
1570pub fn create_key_and_operation(
David Drysdale79092242024-06-18 13:13:43 +01001571 sl: &SecLevel,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001572 gen_params: &AuthSetBuilder,
1573 op_params: &AuthSetBuilder,
1574 alias: &str,
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +00001575) -> binder::Result<Option<CreateOperationResponse>> {
1576 let Some(key_metadata) = generate_key(sl, gen_params, alias)? else {
1577 return Ok(None);
1578 };
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001579
Rajesh Nyamagoud94f25032024-08-15 21:12:20 +00001580 sl.binder.createOperation(&key_metadata.key, op_params, false).map(Some)
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001581}