blob: cf0c4f0d8950f59820a13341e6fda1379f707e25 [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 Nyamagoud75dfa0c2023-05-11 00:31:40 +000041
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +000042/// Shell namespace.
43pub const SELINUX_SHELL_NAMESPACE: i64 = 1;
Rajesh Nyamagouddc6fb232021-12-08 21:27:15 +000044/// Vold namespace.
45pub const SELINUX_VOLD_NAMESPACE: i64 = 100;
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +000046
Rajesh Nyamagoudfa7c0f12021-12-02 17:15:48 +000047/// SU context.
48pub const TARGET_SU_CTX: &str = "u:r:su:s0";
49
50/// Vold context
51pub const TARGET_VOLD_CTX: &str = "u:r:vold:s0";
52
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +000053/// Allowed tags in generated/imported key authorizations.
54/// See hardware/interfaces/security/keymint/aidl/android/hardware/security/keymint/Tag.aidl for the
55/// list feature tags.
56/// Note: This list need to be updated whenever a new Tag is introduced and is expected to be added
57/// in key authorizations.
58pub const ALLOWED_TAGS_IN_KEY_AUTHS: &[Tag] = &[
59 Tag::ACTIVE_DATETIME,
60 Tag::ALGORITHM,
61 Tag::ALLOW_WHILE_ON_BODY,
62 Tag::AUTH_TIMEOUT,
63 Tag::BLOCK_MODE,
64 Tag::BOOTLOADER_ONLY,
65 Tag::BOOT_PATCHLEVEL,
66 Tag::CALLER_NONCE,
67 Tag::CREATION_DATETIME,
68 Tag::DIGEST,
69 Tag::EARLY_BOOT_ONLY,
70 Tag::EC_CURVE,
71 Tag::IDENTITY_CREDENTIAL_KEY,
72 Tag::INCLUDE_UNIQUE_ID,
73 Tag::KEY_SIZE,
74 Tag::MAX_BOOT_LEVEL,
75 Tag::MAX_USES_PER_BOOT,
76 Tag::MIN_MAC_LENGTH,
77 Tag::NO_AUTH_REQUIRED,
78 Tag::ORIGIN,
79 Tag::ORIGINATION_EXPIRE_DATETIME,
80 Tag::OS_PATCHLEVEL,
81 Tag::OS_VERSION,
82 Tag::PADDING,
83 Tag::PURPOSE,
84 Tag::ROLLBACK_RESISTANCE,
85 Tag::RSA_OAEP_MGF_DIGEST,
86 Tag::RSA_PUBLIC_EXPONENT,
87 Tag::STORAGE_KEY,
88 Tag::TRUSTED_CONFIRMATION_REQUIRED,
89 Tag::TRUSTED_USER_PRESENCE_REQUIRED,
90 Tag::UNLOCKED_DEVICE_REQUIRED,
91 Tag::USAGE_COUNT_LIMIT,
92 Tag::USAGE_EXPIRE_DATETIME,
93 Tag::USER_AUTH_TYPE,
94 Tag::USER_ID,
95 Tag::USER_SECURE_ID,
96 Tag::VENDOR_PATCHLEVEL,
97];
98
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +000099/// Key parameters to generate a key.
100pub struct KeyParams {
101 /// Key Size.
102 pub key_size: i32,
103 /// Key Purposes.
104 pub purpose: Vec<KeyPurpose>,
105 /// Padding Mode.
106 pub padding: Option<PaddingMode>,
107 /// Digest.
108 pub digest: Option<Digest>,
109 /// MFG Digest.
110 pub mgf_digest: Option<Digest>,
111 /// Block Mode.
112 pub block_mode: Option<BlockMode>,
113 /// Attestation challenge.
114 pub att_challenge: Option<Vec<u8>>,
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000115}
116
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000117/// DER-encoded PKCS#8 format RSA key. Generated using:
118/// openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -outform der | hexdump -e '30/1 "%02X" "\n"'
119pub static RSA_2048_KEY: &[u8] = &[
120 0x30, 0x82, 0x04, 0xBD, 0x02, 0x01, 0x00, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7,
121 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x04, 0xA7, 0x30, 0x82, 0x04, 0xA3, 0x02, 0x01,
122 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, 0xE5, 0x14, 0xE3, 0xC2, 0x43, 0xF3, 0x0F, 0xCC, 0x22, 0x73,
123 0x9C, 0x84, 0xCC, 0x1B, 0x6C, 0x97, 0x4B, 0xC9, 0xDF, 0x1F, 0xE2, 0xB8, 0x80, 0x85, 0xF9, 0x27,
124 0xAB, 0x97, 0x94, 0x58, 0x4B, 0xC9, 0x40, 0x94, 0x5A, 0xB4, 0xD4, 0xF8, 0xD0, 0x36, 0xC4, 0x86,
125 0x17, 0x7D, 0xA2, 0x48, 0x6D, 0x40, 0xF0, 0xB9, 0x61, 0x4F, 0xCE, 0x65, 0x80, 0x88, 0x81, 0x59,
126 0x95, 0x11, 0x24, 0xF4, 0x36, 0xB7, 0xB7, 0x37, 0x44, 0xF4, 0x6C, 0x1C, 0xEB, 0x04, 0x19, 0x78,
127 0xB2, 0x29, 0x4D, 0x21, 0x44, 0x16, 0x57, 0x58, 0x6D, 0x7D, 0x56, 0xB5, 0x99, 0xDD, 0xD2, 0xAD,
128 0x02, 0x9A, 0x72, 0x16, 0x67, 0xD6, 0x00, 0x9F, 0x69, 0xE0, 0x25, 0xEE, 0x7C, 0x86, 0x54, 0x27,
129 0x4B, 0x50, 0xEF, 0x60, 0x52, 0x60, 0x82, 0xAA, 0x09, 0x15, 0x72, 0xD2, 0xEB, 0x01, 0x52, 0x04,
130 0x39, 0x60, 0xBC, 0x5E, 0x95, 0x07, 0xC8, 0xC2, 0x3A, 0x3A, 0xE2, 0xA4, 0x99, 0x6B, 0x27, 0xE3,
131 0xA3, 0x55, 0x69, 0xC4, 0xB3, 0x2D, 0x19, 0xC4, 0x34, 0x76, 0xFC, 0x27, 0xDA, 0x22, 0xB2, 0x62,
132 0x69, 0x25, 0xDE, 0x0D, 0xE7, 0x54, 0x3C, 0xBB, 0x61, 0xD2, 0x20, 0xDA, 0x7B, 0x6E, 0x63, 0xBD,
133 0x9A, 0x4B, 0xCD, 0x75, 0xC6, 0xA1, 0x5E, 0x1C, 0x3E, 0xD5, 0x63, 0x59, 0x22, 0x7E, 0xE0, 0x6C,
134 0x98, 0x25, 0x63, 0x97, 0x56, 0xDF, 0x71, 0xF5, 0x4C, 0x78, 0xE9, 0xE1, 0xD5, 0xFC, 0xF8, 0x5A,
135 0x5B, 0xF6, 0x1D, 0xFA, 0x5A, 0x99, 0x4C, 0x99, 0x19, 0x21, 0x1D, 0xF5, 0x24, 0x07, 0xEF, 0x8A,
136 0xC9, 0x9F, 0xE7, 0x3F, 0xBB, 0x46, 0x1A, 0x16, 0x96, 0xC6, 0xD6, 0x12, 0x7E, 0xDA, 0xCB, 0xEB,
137 0x2F, 0x1D, 0x3B, 0x31, 0xCC, 0x55, 0x63, 0xA2, 0x6F, 0x8A, 0xDE, 0x35, 0x52, 0x40, 0x04, 0xBF,
138 0xE0, 0x82, 0x32, 0xE1, 0x6D, 0x8B, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, 0x00, 0x2D,
139 0x1F, 0x71, 0x41, 0x79, 0xBA, 0xED, 0xD8, 0xAA, 0xCC, 0x94, 0xFE, 0xFF, 0x69, 0x43, 0x79, 0x85,
140 0xBF, 0x2C, 0xC9, 0x0E, 0x12, 0x83, 0x96, 0x60, 0x1E, 0x75, 0x49, 0x35, 0x3A, 0x33, 0x2B, 0x60,
141 0x22, 0x18, 0xBF, 0xD7, 0xD7, 0x6E, 0xC3, 0xEA, 0xEF, 0xF2, 0xBE, 0x97, 0x71, 0xA6, 0xBB, 0x8C,
142 0xEF, 0x27, 0x00, 0xDE, 0x49, 0xD6, 0x08, 0x8D, 0x5A, 0x04, 0xE7, 0xCC, 0x9C, 0xA2, 0x0E, 0x8B,
143 0xF3, 0x42, 0x0C, 0xD7, 0x22, 0xD7, 0x14, 0x06, 0xA4, 0x64, 0x8B, 0x88, 0x1A, 0xCE, 0x5B, 0x8C,
144 0x36, 0xE9, 0xD2, 0x2F, 0x7B, 0x33, 0xE4, 0xA2, 0xB3, 0xDB, 0x78, 0x6A, 0x92, 0x89, 0x3F, 0x78,
145 0xFD, 0xED, 0x8F, 0xEE, 0x48, 0xCC, 0x94, 0x75, 0x0D, 0x0C, 0x63, 0xD3, 0xD2, 0xE8, 0x47, 0x04,
146 0x55, 0xD3, 0xD6, 0x3A, 0xB8, 0xDA, 0xFB, 0x76, 0x99, 0x48, 0x68, 0x0A, 0x92, 0xA2, 0xCD, 0xF7,
147 0x45, 0x8B, 0x50, 0xFE, 0xF9, 0x1A, 0x33, 0x24, 0x3C, 0x2E, 0xDE, 0x88, 0xAD, 0xB2, 0x5B, 0x9F,
148 0x44, 0xEA, 0xD1, 0x9F, 0xC7, 0x9F, 0x02, 0x5E, 0x31, 0x61, 0xB3, 0xD6, 0xE2, 0xE1, 0xBC, 0xFB,
149 0x1C, 0xDB, 0xBD, 0xB2, 0x9A, 0xE5, 0xEF, 0xDA, 0xCD, 0x29, 0xA5, 0x45, 0xCC, 0x67, 0x01, 0x8B,
150 0x1C, 0x1D, 0x0E, 0x8F, 0x73, 0x69, 0x4D, 0x4D, 0xF6, 0x9D, 0xA6, 0x6C, 0x9A, 0x1C, 0xF4, 0x5C,
151 0xE4, 0x83, 0x9A, 0x77, 0x12, 0x01, 0xBD, 0xCE, 0x66, 0x3A, 0x4B, 0x3D, 0x6E, 0xE0, 0x6E, 0x82,
152 0x98, 0xDE, 0x74, 0x11, 0x47, 0xEC, 0x7A, 0x3A, 0xA9, 0xD8, 0x48, 0x00, 0x26, 0x64, 0x47, 0x7B,
153 0xAE, 0x55, 0x9D, 0x29, 0x22, 0xB4, 0xB3, 0xB9, 0xB1, 0x64, 0xEA, 0x3B, 0x5A, 0xD3, 0x3F, 0x8D,
154 0x0F, 0x14, 0x7E, 0x4E, 0xB8, 0x1B, 0x06, 0xFC, 0xB1, 0x7E, 0xCD, 0xB9, 0x1A, 0x4E, 0xA1, 0x02,
155 0x81, 0x81, 0x00, 0xF9, 0xDE, 0xEE, 0xED, 0x13, 0x2F, 0xBB, 0xE7, 0xE2, 0xB3, 0x2D, 0x98, 0xD2,
156 0xE8, 0x25, 0x07, 0x5A, 0x1E, 0x51, 0x0A, 0xC8, 0xAD, 0x50, 0x4B, 0x80, 0xC6, 0x22, 0xF5, 0x9B,
157 0x08, 0xE6, 0x3D, 0x01, 0xC6, 0x3E, 0xC8, 0xD2, 0x54, 0x9F, 0x91, 0x77, 0x95, 0xCD, 0xCA, 0xC7,
158 0xE7, 0x47, 0x94, 0xA9, 0x5F, 0x4E, 0xBE, 0x31, 0x3D, 0xB4, 0xAF, 0x43, 0x0F, 0xDC, 0x8D, 0x9C,
159 0x1E, 0x52, 0x7B, 0x72, 0x21, 0x34, 0xB3, 0x96, 0x7C, 0x9C, 0xB8, 0x51, 0x65, 0x60, 0xAC, 0x3D,
160 0x11, 0x32, 0xB8, 0xD6, 0x34, 0x35, 0x66, 0xD0, 0x30, 0xB9, 0xE9, 0x67, 0x2C, 0x87, 0x73, 0x43,
161 0x9C, 0x12, 0x16, 0x7D, 0x4A, 0xD9, 0xA3, 0x4C, 0x24, 0x64, 0x6A, 0x32, 0x8E, 0xC3, 0xD8, 0x00,
162 0x90, 0x5C, 0x4D, 0x65, 0x01, 0x53, 0x8A, 0xD0, 0x87, 0xCE, 0x96, 0xEF, 0xFA, 0x73, 0x03, 0xF1,
163 0xDC, 0x1B, 0x9B, 0x02, 0x81, 0x81, 0x00, 0xEA, 0xB3, 0x69, 0x00, 0x11, 0x0E, 0x50, 0xAA, 0xD3,
164 0x22, 0x51, 0x78, 0x9D, 0xFF, 0x05, 0x62, 0xBC, 0x9A, 0x67, 0x86, 0xE1, 0xC5, 0x02, 0x2D, 0x14,
165 0x11, 0x29, 0x30, 0xE7, 0x90, 0x5D, 0x72, 0x6F, 0xC5, 0x62, 0xEB, 0xD4, 0xB0, 0x3F, 0x3D, 0xDC,
166 0xB9, 0xFC, 0x2B, 0x5C, 0xBD, 0x9E, 0x71, 0x81, 0x5C, 0xC5, 0xFE, 0xDF, 0x69, 0x73, 0x12, 0x66,
167 0x92, 0x06, 0xD4, 0xD5, 0x8F, 0xDF, 0x14, 0x2E, 0x9C, 0xD0, 0x4C, 0xC2, 0x4D, 0x31, 0x2E, 0x47,
168 0xA5, 0xDC, 0x8A, 0x83, 0x7B, 0xE8, 0xA5, 0xC3, 0x03, 0x98, 0xD8, 0xBF, 0xF4, 0x7D, 0x6E, 0x87,
169 0x55, 0xE4, 0x0F, 0x15, 0x10, 0xC8, 0x76, 0x4F, 0xAD, 0x1D, 0x1C, 0x95, 0x41, 0x9D, 0x88, 0xEC,
170 0x8C, 0xDA, 0xBA, 0x90, 0x7F, 0x8D, 0xD9, 0x8B, 0x47, 0x6C, 0x0C, 0xFF, 0xBA, 0x73, 0x00, 0x20,
171 0x1F, 0xF7, 0x7E, 0x5F, 0xF4, 0xEC, 0xD1, 0x02, 0x81, 0x80, 0x16, 0xB7, 0x43, 0xB5, 0x5D, 0xD7,
172 0x2B, 0x18, 0x0B, 0xAE, 0x0A, 0x69, 0x28, 0x53, 0x5E, 0x7A, 0x6A, 0xA0, 0xF2, 0xF1, 0x2E, 0x09,
173 0x43, 0x91, 0x79, 0xA5, 0x89, 0xAC, 0x16, 0x6A, 0x1A, 0xB4, 0x55, 0x22, 0xF6, 0xB6, 0x3F, 0x18,
174 0xDE, 0x60, 0xD5, 0x24, 0x53, 0x4F, 0x2A, 0x19, 0x46, 0x92, 0xA7, 0x4B, 0x38, 0xD7, 0x65, 0x96,
175 0x9C, 0x84, 0x8A, 0x6E, 0x38, 0xB8, 0xCF, 0x06, 0x9A, 0xAD, 0x0A, 0x55, 0x26, 0x7B, 0x65, 0x24,
176 0xF3, 0x02, 0x76, 0xB3, 0xE6, 0xB4, 0x01, 0xE1, 0x3C, 0x61, 0x3D, 0x68, 0x05, 0xAA, 0xD1, 0x26,
177 0x7C, 0xE0, 0x51, 0x36, 0xE5, 0x21, 0x7F, 0x76, 0x02, 0xD6, 0xF4, 0x91, 0x07, 0x74, 0x27, 0x09,
178 0xEF, 0xEF, 0x0F, 0xA5, 0x96, 0xFC, 0x5E, 0x20, 0xC1, 0xA3, 0x6F, 0x99, 0x4D, 0x45, 0x03, 0x6C,
179 0x35, 0x45, 0xD7, 0x8F, 0x47, 0x41, 0x86, 0x8D, 0x62, 0x1D, 0x02, 0x81, 0x81, 0x00, 0xC3, 0x93,
180 0x85, 0xA7, 0xFC, 0x8E, 0x85, 0x42, 0x14, 0x76, 0xC0, 0x95, 0x56, 0x73, 0xB0, 0xB5, 0x3A, 0x9D,
181 0x20, 0x30, 0x11, 0xEA, 0xED, 0x89, 0x4A, 0xF3, 0x91, 0xF3, 0xA2, 0xC3, 0x76, 0x5B, 0x6A, 0x30,
182 0x7D, 0xE2, 0x2F, 0x76, 0x3E, 0xFC, 0xF9, 0xF6, 0x31, 0xE0, 0xA0, 0x83, 0x92, 0x88, 0xDB, 0x57,
183 0xC7, 0xD6, 0x3F, 0xAD, 0xCB, 0xAA, 0x45, 0xB6, 0xE1, 0xE2, 0x71, 0xA4, 0x56, 0x2C, 0xA7, 0x3B,
184 0x1D, 0x89, 0x19, 0x50, 0xE1, 0xEE, 0xC2, 0xDD, 0xC0, 0x0D, 0xDC, 0xCB, 0x60, 0x6E, 0xE1, 0x37,
185 0x1A, 0x23, 0x64, 0xB2, 0x03, 0xE4, 0x1A, 0xFA, 0xC3, 0xF4, 0x9D, 0x85, 0x42, 0xC6, 0xF4, 0x56,
186 0x39, 0xB0, 0x1B, 0xE0, 0x75, 0xBA, 0x28, 0x04, 0xA8, 0x30, 0x57, 0x41, 0x33, 0x9F, 0x58, 0xA4,
187 0xC7, 0xB1, 0x7D, 0x58, 0x8D, 0x84, 0x49, 0x40, 0xDA, 0x28, 0x81, 0x25, 0xC4, 0x41, 0x02, 0x81,
188 0x80, 0x13, 0x20, 0x65, 0xD5, 0x96, 0x98, 0x8D, 0x16, 0x73, 0xA1, 0x31, 0x73, 0x79, 0xBA, 0xEC,
189 0xB0, 0xD9, 0x0C, 0xF6, 0xEF, 0x2F, 0xC2, 0xE7, 0x96, 0x9B, 0xA1, 0x2D, 0xE9, 0xFB, 0x45, 0xB9,
190 0xD0, 0x30, 0xE2, 0xBD, 0x30, 0x4F, 0xB6, 0xFE, 0x24, 0x02, 0xCF, 0x8D, 0x51, 0x48, 0x45, 0xD9,
191 0xF7, 0x20, 0x53, 0x1C, 0x0B, 0xA9, 0x7E, 0xC2, 0xA2, 0x65, 0xCC, 0x3E, 0x0E, 0x0D, 0xF1, 0x62,
192 0xDD, 0x5F, 0xBC, 0x55, 0x9B, 0x58, 0x26, 0x40, 0x6A, 0xEE, 0x02, 0x55, 0x36, 0xE9, 0xBA, 0x82,
193 0x5A, 0xFD, 0x3C, 0xDF, 0xA6, 0x26, 0x32, 0x81, 0xA9, 0x5E, 0x46, 0xBE, 0xBA, 0xDC, 0xD3, 0x2A,
194 0x3A, 0x3B, 0xC1, 0x4E, 0xF7, 0x1A, 0xDC, 0x4B, 0xAF, 0x67, 0x1B, 0x3A, 0x83, 0x0D, 0x04, 0xDE,
195 0x27, 0x47, 0xFC, 0xE6, 0x39, 0x89, 0x7B, 0x66, 0xF9, 0x50, 0x4D, 0xF1, 0xAC, 0x20, 0x43, 0x7E,
196 0xEE,
197];
198
199/// DER-encoded PKCS#8 format EC key. Generated using:
200/// openssl ecparam -name prime256v1 -genkey | openssl pkcs8 -topk8 -nocrypt -outform der | hexdump -e '30/1 "%02X" "\n"'
201pub static EC_P_256_KEY: &[u8] = &[
202 0x30, 0x81, 0x87, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02,
203 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07, 0x04, 0x6D, 0x30, 0x6B, 0x02,
204 0x01, 0x01, 0x04, 0x20, 0xB9, 0x1D, 0xAF, 0x50, 0xFD, 0xD8, 0x6A, 0x40, 0xAB, 0x2C, 0xCB, 0x54,
205 0x4E, 0xED, 0xF1, 0x64, 0xBC, 0x30, 0x25, 0xFB, 0xC4, 0x69, 0x00, 0x34, 0x1A, 0x82, 0xA3, 0x72,
206 0x5D, 0xC7, 0xA9, 0x85, 0xA1, 0x44, 0x03, 0x42, 0x00, 0x04, 0xE8, 0x53, 0x0A, 0xF2, 0xD3, 0x68,
207 0x40, 0x48, 0x8C, 0xB4, 0x2F, 0x11, 0x34, 0xD7, 0xF4, 0x4A, 0x5C, 0x33, 0xFF, 0xF6, 0x2B, 0xF7,
208 0x98, 0x0F, 0x02, 0xA5, 0xD7, 0x4F, 0xF9, 0xDE, 0x60, 0x9C, 0x6E, 0xB0, 0x45, 0xDA, 0x3F, 0xF4,
209 0x34, 0x23, 0x9B, 0x4C, 0x3A, 0x09, 0x9C, 0x5E, 0x5D, 0x37, 0x96, 0xAC, 0x4A, 0xE7, 0x65, 0x2B,
210 0xD6, 0x84, 0x98, 0xEA, 0x96, 0x91, 0xFB, 0x78, 0xED, 0x86,
211];
212
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +0000213/// DER-encoded PKCS#8 format RSA key -
214/// Size: 2048
215/// Public Exponent: 65537
216/// Purpose: WRAP_KEY, ENCRYPT, DECRYPT
217/// Encryption scheme: RSAES-PKCS1-v1_5
218/// Digest: SHA_2_256
219/// Padding: RSA_OAEP
220/// This sample wrapping_key is taken from KeyMint tests
221/// (see hardware/interfaces/security/keymint/aidl/vts/functional/KeyMintTest.cpp).
222/// Similarly more test keys can be generated with below command -
223/// openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -outform der | hexdump -e '30/1 "%02X" "\n"'
224pub static WRAPPING_KEY: &[u8] = &[
225 0x30, 0x82, 0x04, 0xbe, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
226 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x04, 0xa8, 0x30, 0x82, 0x04, 0xa4, 0x02, 0x01,
227 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, 0xae, 0xc3, 0x67, 0x93, 0x1d, 0x89, 0x00, 0xce, 0x56, 0xb0,
228 0x06, 0x7f, 0x7d, 0x70, 0xe1, 0xfc, 0x65, 0x3f, 0x3f, 0x34, 0xd1, 0x94, 0xc1, 0xfe, 0xd5, 0x00,
229 0x18, 0xfb, 0x43, 0xdb, 0x93, 0x7b, 0x06, 0xe6, 0x73, 0xa8, 0x37, 0x31, 0x3d, 0x56, 0xb1, 0xc7,
230 0x25, 0x15, 0x0a, 0x3f, 0xef, 0x86, 0xac, 0xbd, 0xdc, 0x41, 0xbb, 0x75, 0x9c, 0x28, 0x54, 0xea,
231 0xe3, 0x2d, 0x35, 0x84, 0x1e, 0xfb, 0x5c, 0x18, 0xd8, 0x2b, 0xc9, 0x0a, 0x1c, 0xb5, 0xc1, 0xd5,
232 0x5a, 0xdf, 0x24, 0x5b, 0x02, 0x91, 0x1f, 0x0b, 0x7c, 0xda, 0x88, 0xc4, 0x21, 0xff, 0x0e, 0xba,
233 0xfe, 0x7c, 0x0d, 0x23, 0xbe, 0x31, 0x2d, 0x7b, 0xd5, 0x92, 0x1f, 0xfa, 0xea, 0x13, 0x47, 0xc1,
234 0x57, 0x40, 0x6f, 0xef, 0x71, 0x8f, 0x68, 0x26, 0x43, 0xe4, 0xe5, 0xd3, 0x3c, 0x67, 0x03, 0xd6,
235 0x1c, 0x0c, 0xf7, 0xac, 0x0b, 0xf4, 0x64, 0x5c, 0x11, 0xf5, 0xc1, 0x37, 0x4c, 0x38, 0x86, 0x42,
236 0x74, 0x11, 0xc4, 0x49, 0x79, 0x67, 0x92, 0xe0, 0xbe, 0xf7, 0x5d, 0xec, 0x85, 0x8a, 0x21, 0x23,
237 0xc3, 0x67, 0x53, 0xe0, 0x2a, 0x95, 0xa9, 0x6d, 0x7c, 0x45, 0x4b, 0x50, 0x4d, 0xe3, 0x85, 0xa6,
238 0x42, 0xe0, 0xdf, 0xc3, 0xe6, 0x0a, 0xc3, 0xa7, 0xee, 0x49, 0x91, 0xd0, 0xd4, 0x8b, 0x01, 0x72,
239 0xa9, 0x5f, 0x95, 0x36, 0xf0, 0x2b, 0xa1, 0x3c, 0xec, 0xcc, 0xb9, 0x2b, 0x72, 0x7d, 0xb5, 0xc2,
240 0x7e, 0x5b, 0x2f, 0x5c, 0xec, 0x09, 0x60, 0x0b, 0x28, 0x6a, 0xf5, 0xcf, 0x14, 0xc4, 0x20, 0x24,
241 0xc6, 0x1d, 0xdf, 0xe7, 0x1c, 0x2a, 0x8d, 0x74, 0x58, 0xf1, 0x85, 0x23, 0x4c, 0xb0, 0x0e, 0x01,
242 0xd2, 0x82, 0xf1, 0x0f, 0x8f, 0xc6, 0x72, 0x1d, 0x2a, 0xed, 0x3f, 0x48, 0x33, 0xcc, 0xa2, 0xbd,
243 0x8f, 0xa6, 0x28, 0x21, 0xdd, 0x55, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, 0x00, 0x43,
244 0x14, 0x47, 0xb6, 0x25, 0x19, 0x08, 0x11, 0x2b, 0x1e, 0xe7, 0x6f, 0x99, 0xf3, 0x71, 0x1a, 0x52,
245 0xb6, 0x63, 0x09, 0x60, 0x04, 0x6c, 0x2d, 0xe7, 0x0d, 0xe1, 0x88, 0xd8, 0x33, 0xf8, 0xb8, 0xb9,
246 0x1e, 0x4d, 0x78, 0x5c, 0xae, 0xee, 0xaf, 0x4f, 0x0f, 0x74, 0x41, 0x4e, 0x2c, 0xda, 0x40, 0x64,
247 0x1f, 0x7f, 0xe2, 0x4f, 0x14, 0xc6, 0x7a, 0x88, 0x95, 0x9b, 0xdb, 0x27, 0x76, 0x6d, 0xf9, 0xe7,
248 0x10, 0xb6, 0x30, 0xa0, 0x3a, 0xdc, 0x68, 0x3b, 0x5d, 0x2c, 0x43, 0x08, 0x0e, 0x52, 0xbe, 0xe7,
249 0x1e, 0x9e, 0xae, 0xb6, 0xde, 0x29, 0x7a, 0x5f, 0xea, 0x10, 0x72, 0x07, 0x0d, 0x18, 0x1c, 0x82,
250 0x2b, 0xcc, 0xff, 0x08, 0x7d, 0x63, 0xc9, 0x40, 0xba, 0x8a, 0x45, 0xf6, 0x70, 0xfe, 0xb2, 0x9f,
251 0xb4, 0x48, 0x4d, 0x1c, 0x95, 0xe6, 0xd2, 0x57, 0x9b, 0xa0, 0x2a, 0xae, 0x0a, 0x00, 0x90, 0x0c,
252 0x3e, 0xbf, 0x49, 0x0e, 0x3d, 0x2c, 0xd7, 0xee, 0x8d, 0x0e, 0x20, 0xc5, 0x36, 0xe4, 0xdc, 0x5a,
253 0x50, 0x97, 0x27, 0x28, 0x88, 0xcd, 0xdd, 0x7e, 0x91, 0xf2, 0x28, 0xb1, 0xc4, 0xd7, 0x47, 0x4c,
254 0x55, 0xb8, 0xfc, 0xd6, 0x18, 0xc4, 0xa9, 0x57, 0xbb, 0xdd, 0xd5, 0xad, 0x74, 0x07, 0xcc, 0x31,
255 0x2d, 0x8d, 0x98, 0xa5, 0xca, 0xf7, 0xe0, 0x8f, 0x4a, 0x0d, 0x6b, 0x45, 0xbb, 0x41, 0xc6, 0x52,
256 0x65, 0x9d, 0x5a, 0x5b, 0xa0, 0x5b, 0x66, 0x37, 0x37, 0xa8, 0x69, 0x62, 0x81, 0x86, 0x5b, 0xa2,
257 0x0f, 0xbd, 0xd7, 0xf8, 0x51, 0xe6, 0xc5, 0x6e, 0x8c, 0xbe, 0x0d, 0xdb, 0xbf, 0x24, 0xdc, 0x03,
258 0xb2, 0xd2, 0xcb, 0x4c, 0x3d, 0x54, 0x0f, 0xb0, 0xaf, 0x52, 0xe0, 0x34, 0xa2, 0xd0, 0x66, 0x98,
259 0xb1, 0x28, 0xe5, 0xf1, 0x01, 0xe3, 0xb5, 0x1a, 0x34, 0xf8, 0xd8, 0xb4, 0xf8, 0x61, 0x81, 0x02,
260 0x81, 0x81, 0x00, 0xde, 0x39, 0x2e, 0x18, 0xd6, 0x82, 0xc8, 0x29, 0x26, 0x6c, 0xc3, 0x45, 0x4e,
261 0x1d, 0x61, 0x66, 0x24, 0x2f, 0x32, 0xd9, 0xa1, 0xd1, 0x05, 0x77, 0x75, 0x3e, 0x90, 0x4e, 0xa7,
262 0xd0, 0x8b, 0xff, 0x84, 0x1b, 0xe5, 0xba, 0xc8, 0x2a, 0x16, 0x4c, 0x59, 0x70, 0x00, 0x70, 0x47,
263 0xb8, 0xc5, 0x17, 0xdb, 0x8f, 0x8f, 0x84, 0xe3, 0x7b, 0xd5, 0x98, 0x85, 0x61, 0xbd, 0xf5, 0x03,
264 0xd4, 0xdc, 0x2b, 0xdb, 0x38, 0xf8, 0x85, 0x43, 0x4a, 0xe4, 0x2c, 0x35, 0x5f, 0x72, 0x5c, 0x9a,
265 0x60, 0xf9, 0x1f, 0x07, 0x88, 0xe1, 0xf1, 0xa9, 0x72, 0x23, 0xb5, 0x24, 0xb5, 0x35, 0x7f, 0xdf,
266 0x72, 0xe2, 0xf6, 0x96, 0xba, 0xb7, 0xd7, 0x8e, 0x32, 0xbf, 0x92, 0xba, 0x8e, 0x18, 0x64, 0xea,
267 0xb1, 0x22, 0x9e, 0x91, 0x34, 0x61, 0x30, 0x74, 0x8a, 0x6e, 0x3c, 0x12, 0x4f, 0x91, 0x49, 0xd7,
268 0x1c, 0x74, 0x35, 0x02, 0x81, 0x81, 0x00, 0xc9, 0x53, 0x87, 0xc0, 0xf9, 0xd3, 0x5f, 0x13, 0x7b,
269 0x57, 0xd0, 0xd6, 0x5c, 0x39, 0x7c, 0x5e, 0x21, 0xcc, 0x25, 0x1e, 0x47, 0x00, 0x8e, 0xd6, 0x2a,
270 0x54, 0x24, 0x09, 0xc8, 0xb6, 0xb6, 0xac, 0x7f, 0x89, 0x67, 0xb3, 0x86, 0x3c, 0xa6, 0x45, 0xfc,
271 0xce, 0x49, 0x58, 0x2a, 0x9a, 0xa1, 0x73, 0x49, 0xdb, 0x6c, 0x4a, 0x95, 0xaf, 0xfd, 0xae, 0x0d,
272 0xae, 0x61, 0x2e, 0x1a, 0xfa, 0xc9, 0x9e, 0xd3, 0x9a, 0x2d, 0x93, 0x4c, 0x88, 0x04, 0x40, 0xae,
273 0xd8, 0x83, 0x2f, 0x98, 0x43, 0x16, 0x3a, 0x47, 0xf2, 0x7f, 0x39, 0x21, 0x99, 0xdc, 0x12, 0x02,
274 0xf9, 0xa0, 0xf9, 0xbd, 0x08, 0x30, 0x80, 0x07, 0xcb, 0x1e, 0x4e, 0x7f, 0x58, 0x30, 0x93, 0x66,
275 0xa7, 0xde, 0x25, 0xf7, 0xc3, 0xc9, 0xb8, 0x80, 0x67, 0x7c, 0x06, 0x8e, 0x1b, 0xe9, 0x36, 0xe8,
276 0x12, 0x88, 0x81, 0x52, 0x52, 0xa8, 0xa1, 0x02, 0x81, 0x80, 0x57, 0xff, 0x8c, 0xa1, 0x89, 0x50,
277 0x80, 0xb2, 0xca, 0xe4, 0x86, 0xef, 0x0a, 0xdf, 0xd7, 0x91, 0xfb, 0x02, 0x35, 0xc0, 0xb8, 0xb3,
278 0x6c, 0xd6, 0xc1, 0x36, 0xe5, 0x2e, 0x40, 0x85, 0xf4, 0xea, 0x5a, 0x06, 0x32, 0x12, 0xa4, 0xf1,
279 0x05, 0xa3, 0x76, 0x47, 0x43, 0xe5, 0x32, 0x81, 0x98, 0x8a, 0xba, 0x07, 0x3f, 0x6e, 0x00, 0x27,
280 0x29, 0x8e, 0x1c, 0x43, 0x78, 0x55, 0x6e, 0x0e, 0xfc, 0xa0, 0xe1, 0x4e, 0xce, 0x1a, 0xf7, 0x6a,
281 0xd0, 0xb0, 0x30, 0xf2, 0x7a, 0xf6, 0xf0, 0xab, 0x35, 0xfb, 0x73, 0xa0, 0x60, 0xd8, 0xb1, 0xa0,
282 0xe1, 0x42, 0xfa, 0x26, 0x47, 0xe9, 0x3b, 0x32, 0xe3, 0x6d, 0x82, 0x82, 0xae, 0x0a, 0x4d, 0xe5,
283 0x0a, 0xb7, 0xaf, 0xe8, 0x55, 0x00, 0xa1, 0x6f, 0x43, 0xa6, 0x47, 0x19, 0xd6, 0xe2, 0xb9, 0x43,
284 0x98, 0x23, 0x71, 0x9c, 0xd0, 0x8b, 0xcd, 0x03, 0x17, 0x81, 0x02, 0x81, 0x81, 0x00, 0xba, 0x73,
285 0xb0, 0xbb, 0x28, 0xe3, 0xf8, 0x1e, 0x9b, 0xd1, 0xc5, 0x68, 0x71, 0x3b, 0x10, 0x12, 0x41, 0xac,
286 0xc6, 0x07, 0x97, 0x6c, 0x4d, 0xdc, 0xcc, 0x90, 0xe6, 0x5b, 0x65, 0x56, 0xca, 0x31, 0x51, 0x60,
287 0x58, 0xf9, 0x2b, 0x6e, 0x09, 0xf3, 0xb1, 0x60, 0xff, 0x0e, 0x37, 0x4e, 0xc4, 0x0d, 0x78, 0xae,
288 0x4d, 0x49, 0x79, 0xfd, 0xe6, 0xac, 0x06, 0xa1, 0xa4, 0x00, 0xc6, 0x1d, 0xd3, 0x12, 0x54, 0x18,
289 0x6a, 0xf3, 0x0b, 0x22, 0xc1, 0x05, 0x82, 0xa8, 0xa4, 0x3e, 0x34, 0xfe, 0x94, 0x9c, 0x5f, 0x3b,
290 0x97, 0x55, 0xba, 0xe7, 0xba, 0xa7, 0xb7, 0xb7, 0xa6, 0xbd, 0x03, 0xb3, 0x8c, 0xef, 0x55, 0xc8,
291 0x68, 0x85, 0xfc, 0x6c, 0x19, 0x78, 0xb9, 0xce, 0xe7, 0xef, 0x33, 0xda, 0x50, 0x7c, 0x9d, 0xf6,
292 0xb9, 0x27, 0x7c, 0xff, 0x1e, 0x6a, 0xaa, 0x5d, 0x57, 0xac, 0xa5, 0x28, 0x46, 0x61, 0x02, 0x81,
293 0x81, 0x00, 0xc9, 0x31, 0x61, 0x7c, 0x77, 0x82, 0x9d, 0xfb, 0x12, 0x70, 0x50, 0x2b, 0xe9, 0x19,
294 0x5c, 0x8f, 0x28, 0x30, 0x88, 0x5f, 0x57, 0xdb, 0xa8, 0x69, 0x53, 0x68, 0x11, 0xe6, 0x86, 0x42,
295 0x36, 0xd0, 0xc4, 0x73, 0x6a, 0x00, 0x08, 0xa1, 0x45, 0xaf, 0x36, 0xb8, 0x35, 0x7a, 0x7c, 0x3d,
296 0x13, 0x99, 0x66, 0xd0, 0x4c, 0x4e, 0x00, 0x93, 0x4e, 0xa1, 0xae, 0xde, 0x3b, 0xb6, 0xb8, 0xec,
297 0x84, 0x1d, 0xc9, 0x5e, 0x3f, 0x57, 0x97, 0x51, 0xe2, 0xbf, 0xdf, 0xe2, 0x7a, 0xe7, 0x78, 0x98,
298 0x3f, 0x95, 0x93, 0x56, 0x21, 0x07, 0x23, 0x28, 0x7b, 0x0a, 0xff, 0xcc, 0x9f, 0x72, 0x70, 0x44,
299 0xd4, 0x8c, 0x37, 0x3f, 0x1b, 0xab, 0xde, 0x07, 0x24, 0xfa, 0x17, 0xa4, 0xfd, 0x4d, 0xa0, 0x90,
300 0x2c, 0x7c, 0x9b, 0x9b, 0xf2, 0x7b, 0xa6, 0x1b, 0xe6, 0xad, 0x02, 0xdf, 0xdd, 0xda, 0x8f, 0x4e,
301 0x68, 0x22,
302];
303
304/// WrappedKeyData as ASN.1 DER-encoded data corresponding to the `SecureKeyWrapper` schema
305/// specified in IKeyMintDevice.aidl. Wrapped key parameters are -
306/// Algorithm: AES
307/// Key size: 256
308/// Block mode: ECB
309/// Padding mode: PKCS7
310/// This sample wrapped_key is taken from KeyMint tests (see KeyMintTest.cpp).
311pub static WRAPPED_KEY: &[u8] = &[
312 0x30, 0x82, 0x01, 0x79, 0x02, 0x01, 0x00, 0x04, 0x82, 0x01, 0x00, 0x93, 0x4b, 0xf9, 0x4e, 0x2a,
313 0xa2, 0x8a, 0x3f, 0x83, 0xc9, 0xf7, 0x92, 0x97, 0x25, 0x02, 0x62, 0xfb, 0xe3, 0x27, 0x6b, 0x5a,
314 0x1c, 0x91, 0x15, 0x9b, 0xbf, 0xa3, 0xef, 0x89, 0x57, 0xaa, 0xc8, 0x4b, 0x59, 0xb3, 0x0b, 0x45,
315 0x5a, 0x79, 0xc2, 0x97, 0x34, 0x80, 0x82, 0x3d, 0x8b, 0x38, 0x63, 0xc3, 0xde, 0xef, 0x4a, 0x8e,
316 0x24, 0x35, 0x90, 0x26, 0x8d, 0x80, 0xe1, 0x87, 0x51, 0xa0, 0xe1, 0x30, 0xf6, 0x7c, 0xe6, 0xa1,
317 0xac, 0xe9, 0xf7, 0x9b, 0x95, 0xe0, 0x97, 0x47, 0x4f, 0xeb, 0xc9, 0x81, 0x19, 0x5b, 0x1d, 0x13,
318 0xa6, 0x90, 0x86, 0xc0, 0x86, 0x3f, 0x66, 0xa7, 0xb7, 0xfd, 0xb4, 0x87, 0x92, 0x22, 0x7b, 0x1a,
319 0xc5, 0xe2, 0x48, 0x9f, 0xeb, 0xdf, 0x08, 0x7a, 0xb5, 0x48, 0x64, 0x83, 0x03, 0x3a, 0x6f, 0x00,
320 0x1c, 0xa5, 0xd1, 0xec, 0x1e, 0x27, 0xf5, 0xc3, 0x0f, 0x4c, 0xec, 0x26, 0x42, 0x07, 0x4a, 0x39,
321 0xae, 0x68, 0xae, 0xe5, 0x52, 0xe1, 0x96, 0x62, 0x7a, 0x8e, 0x3d, 0x86, 0x7e, 0x67, 0xa8, 0xc0,
322 0x1b, 0x11, 0xe7, 0x5f, 0x13, 0xcc, 0xa0, 0xa9, 0x7a, 0xb6, 0x68, 0xb5, 0x0c, 0xda, 0x07, 0xa8,
323 0xec, 0xb7, 0xcd, 0x8e, 0x3d, 0xd7, 0x00, 0x9c, 0x96, 0x36, 0x53, 0x4f, 0x6f, 0x23, 0x9c, 0xff,
324 0xe1, 0xfc, 0x8d, 0xaa, 0x46, 0x6f, 0x78, 0xb6, 0x76, 0xc7, 0x11, 0x9e, 0xfb, 0x96, 0xbc, 0xe4,
325 0xe6, 0x9c, 0xa2, 0xa2, 0x5d, 0x0b, 0x34, 0xed, 0x9c, 0x3f, 0xf9, 0x99, 0xb8, 0x01, 0x59, 0x7d,
326 0x52, 0x20, 0xe3, 0x07, 0xea, 0xa5, 0xbe, 0xe5, 0x07, 0xfb, 0x94, 0xd1, 0xfa, 0x69, 0xf9, 0xe5,
327 0x19, 0xb2, 0xde, 0x31, 0x5b, 0xac, 0x92, 0xc3, 0x6f, 0x2e, 0xa1, 0xfa, 0x1d, 0xf4, 0x47, 0x8c,
328 0x0d, 0xde, 0xde, 0xae, 0x8c, 0x70, 0xe0, 0x23, 0x3c, 0xd0, 0x98, 0x04, 0x0c, 0xd7, 0x96, 0xb0,
329 0x2c, 0x37, 0x0f, 0x1f, 0xa4, 0xcc, 0x01, 0x24, 0xf1, 0x30, 0x2e, 0x02, 0x01, 0x03, 0x30, 0x29,
330 0xa1, 0x08, 0x31, 0x06, 0x02, 0x01, 0x00, 0x02, 0x01, 0x01, 0xa2, 0x03, 0x02, 0x01, 0x20, 0xa3,
331 0x04, 0x02, 0x02, 0x01, 0x00, 0xa4, 0x05, 0x31, 0x03, 0x02, 0x01, 0x01, 0xa6, 0x05, 0x31, 0x03,
332 0x02, 0x01, 0x40, 0xbf, 0x83, 0x77, 0x02, 0x05, 0x00, 0x04, 0x20, 0xcc, 0xd5, 0x40, 0x85, 0x5f,
333 0x83, 0x3a, 0x5e, 0x14, 0x80, 0xbf, 0xd2, 0xd3, 0x6f, 0xaf, 0x3a, 0xee, 0xe1, 0x5d, 0xf5, 0xbe,
334 0xab, 0xe2, 0x69, 0x1b, 0xc8, 0x2d, 0xde, 0x2a, 0x7a, 0xa9, 0x10, 0x04, 0x10, 0x64, 0xc9, 0xf6,
335 0x89, 0xc6, 0x0f, 0xf6, 0x22, 0x3a, 0xb6, 0xe6, 0x99, 0x9e, 0x0e, 0xb6, 0xe5,
336];
337
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000338/// To map Keystore errors.
339#[derive(thiserror::Error, Debug, Eq, PartialEq)]
340pub enum Error {
341 /// Keystore2 error code
342 #[error("ResponseCode {0:?}")]
343 Rc(ResponseCode),
344 /// Keymint error code
345 #[error("ErrorCode {0:?}")]
346 Km(ErrorCode),
347 /// Exception
348 #[error("Binder exception {0:?}")]
349 Binder(ExceptionCode),
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000350 /// This is returned if the C implementation of extractSubjectFromCertificate failed.
351 #[error("Failed to validate certificate chain.")]
352 ValidateCertChainFailed,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +0000353 /// Error code to indicate error in ASN.1 DER-encoded data creation.
354 #[error("Failed to create and encode ASN.1 data.")]
355 DerEncodeFailed,
Rajesh Nyamagoud28abde62023-04-01 01:32:32 +0000356 /// Error code to indicate error while using keystore-engine API.
357 #[error("Failed to perform crypto op using keystore-engine APIs.")]
358 Keystore2EngineOpFailed,
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +0000359 /// Error code to indicate error in attestation-id validation.
360 #[error("Failed to validate attestation-id.")]
361 ValidateAttestIdFailed,
362 /// Error code to indicate error in getting value from attest record.
363 #[error("Failed to get value from attest record.")]
364 AttestRecordGetValueFailed,
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000365}
366
367/// Keystore2 error mapping.
368pub fn map_ks_error<T>(r: BinderResult<T>) -> Result<T, Error> {
369 r.map_err(|s| {
370 match s.exception_code() {
371 ExceptionCode::SERVICE_SPECIFIC => {
372 match s.service_specific_error() {
373 se if se < 0 => {
374 // Negative service specific errors are KM error codes.
375 Error::Km(ErrorCode(se))
376 }
377 se => {
378 // Positive service specific errors are KS response codes.
379 Error::Rc(ResponseCode(se))
380 }
381 }
382 }
383 // We create `Error::Binder` to preserve the exception code
384 // for logging.
385 e_code => Error::Binder(e_code),
386 }
387 })
388}
389
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000390/// Verify that given key param is listed in given authorizations list.
391pub fn check_key_param(authorizations: &[Authorization], key_param: &KeyParameter) -> bool {
392 authorizations.iter().any(|auth| &auth.keyParameter == key_param)
393}
394
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000395/// Verify the given key authorizations with the expected authorizations.
396pub fn check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +0100397 sl: &SecLevel,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000398 authorizations: &[Authorization],
399 expected_params: &[KeyParameter],
400 expected_key_origin: KeyOrigin,
401) {
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000402 // Make sure key authorizations contains only `ALLOWED_TAGS_IN_KEY_AUTHS`
403 authorizations.iter().all(|auth| {
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000404 // Ignore `INVALID` tag if the backend is Keymaster and not KeyMint.
405 // Keymaster allows INVALID tag for unsupported key parameters.
David Drysdale79092242024-06-18 13:13:43 +0100406 if sl.is_keymaster() && auth.keyParameter.tag == Tag::INVALID {
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000407 return true;
408 }
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000409 assert!(
410 ALLOWED_TAGS_IN_KEY_AUTHS.contains(&auth.keyParameter.tag),
411 "key authorization is not allowed: {:#?}",
412 auth.keyParameter
413 );
414 true
415 });
416
David Drysdale79092242024-06-18 13:13:43 +0100417 // Check allowed-expected-key-parameters are present in given key authorizations list.
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000418 expected_params.iter().all(|key_param| {
Rajesh Nyamagoud17a92612023-10-17 16:15:05 +0000419 // `INCLUDE_UNIQUE_ID` is not strictly expected to be in key authorizations but has been
420 // put there by some implementations so cope with that.
421 if key_param.tag == Tag::INCLUDE_UNIQUE_ID
422 && !authorizations.iter().any(|auth| auth.keyParameter.tag == key_param.tag)
423 {
424 return true;
425 }
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000426
David Drysdale83153592024-07-16 10:25:08 +0100427 // `Tag::RSA_OAEP_MGF_DIGEST` was added in KeyMint 1.0, but the KeyMint VTS tests didn't
428 // originally check for its presence and so some implementations of early versions (< 3) of
429 // the KeyMint HAL don't include it (cf. b/297306437 and aosp/2758513).
430 //
431 // Given that Keymaster implementations will also omit this tag, skip the check for it
432 // altogether (and rely on the updated KeyMint VTS tests to ensure that up-level KeyMint
433 // implementations correctly populate this tag).
434 if matches!(key_param.tag, Tag::RSA_OAEP_MGF_DIGEST) {
435 return true;
436 }
437
David Drysdale79092242024-06-18 13:13:43 +0100438 if sl.is_keymaster() {
David Drysdale83153592024-07-16 10:25:08 +0100439 // `Tag::USAGE_COUNT_LIMIT` was added in KeyMint 1.0, so don't check for it if the
440 // underlying device is a Keymaster implementation.
441 if matches!(key_param.tag, Tag::USAGE_COUNT_LIMIT) {
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000442 return true;
443 }
David Drysdale83153592024-07-16 10:25:08 +0100444 // `KeyPurpose::ATTEST_KEY` was added in KeyMint 1.0, so don't check for it if the
445 // underlying device is a Keymaster implementation.
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000446 if key_param.tag == Tag::PURPOSE
447 && key_param.value == KeyParameterValue::KeyPurpose(KeyPurpose::ATTEST_KEY)
448 {
449 return true;
450 }
451 }
452
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000453 if ALLOWED_TAGS_IN_KEY_AUTHS.contains(&key_param.tag) {
454 assert!(
455 check_key_param(authorizations, key_param),
456 "Key parameter not found: {:#?}",
457 key_param
458 );
459 }
460 true
461 });
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000462
David Drysdale79092242024-06-18 13:13:43 +0100463 check_common_auths(sl, authorizations, expected_key_origin);
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000464}
465
466/// Verify common key authorizations.
David Drysdale79092242024-06-18 13:13:43 +0100467fn check_common_auths(
468 sl: &SecLevel,
469 authorizations: &[Authorization],
470 expected_key_origin: KeyOrigin,
471) {
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000472 assert!(check_key_param(
473 authorizations,
474 &KeyParameter {
475 tag: Tag::OS_VERSION,
476 value: KeyParameterValue::Integer(get_os_version().try_into().unwrap())
477 }
478 ));
479 assert!(check_key_param(
480 authorizations,
481 &KeyParameter {
482 tag: Tag::OS_PATCHLEVEL,
483 value: KeyParameterValue::Integer(get_os_patchlevel().try_into().unwrap())
484 }
485 ));
486
487 // Access denied for finding vendor-patch-level ("ro.vendor.build.security_patch") property
488 // in a test running with `untrusted_app` context. Keeping this check to verify
489 // vendor-patch-level in tests running with `su` context.
490 if getuid().is_root() {
491 assert!(check_key_param(
492 authorizations,
493 &KeyParameter {
494 tag: Tag::VENDOR_PATCHLEVEL,
495 value: KeyParameterValue::Integer(get_vendor_patchlevel().try_into().unwrap())
496 }
497 ));
498 }
499 assert!(check_key_param(
500 authorizations,
501 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(expected_key_origin) }
502 ));
503 assert!(check_key_param(
504 authorizations,
505 &KeyParameter {
506 tag: Tag::USER_ID,
507 value: KeyParameterValue::Integer(
508 rustutils::users::multiuser_get_user_id(ThreadState::get_calling_uid())
509 .try_into()
510 .unwrap()
511 )
512 }
513 ));
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +0000514
David Drysdale79092242024-06-18 13:13:43 +0100515 if sl.is_keymint() {
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +0000516 assert!(authorizations
517 .iter()
518 .map(|auth| &auth.keyParameter)
519 .any(|key_param| key_param.tag == Tag::CREATION_DATETIME));
520 }
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000521}
522
Rajesh Nyamagoudf436a932023-05-12 01:16:07 +0000523/// Get the key `Authorization` for the given auth `Tag`.
524pub fn get_key_auth(authorizations: &[Authorization], tag: Tag) -> Option<&Authorization> {
525 let auths: Vec<&Authorization> =
526 authorizations.iter().filter(|auth| auth.keyParameter.tag == tag).collect();
527
528 if !auths.is_empty() {
529 Some(auths[0])
530 } else {
531 None
532 }
533}
534
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000535/// Generate EC Key using given security level and domain with below key parameters and
536/// optionally allow the generated key to be attested with factory provisioned attest key using
537/// given challenge and application id -
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000538/// Purposes: SIGN and VERIFY
539/// Digest: SHA_2_256
540/// Curve: P_256
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000541pub fn generate_ec_p256_signing_key(
David Drysdale79092242024-06-18 13:13:43 +0100542 sl: &SecLevel,
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000543 domain: Domain,
544 nspace: i64,
545 alias: Option<String>,
546 att_challenge: Option<&[u8]>,
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000547) -> binder::Result<KeyMetadata> {
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000548 let mut key_attest = false;
549 let mut gen_params = AuthSetBuilder::new()
Rajesh Nyamagoudc7d064d2022-08-20 01:45:17 +0000550 .no_auth_required()
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000551 .algorithm(Algorithm::EC)
552 .purpose(KeyPurpose::SIGN)
553 .purpose(KeyPurpose::VERIFY)
554 .digest(Digest::SHA_2_256)
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000555 .ec_curve(EcCurve::P_256);
556
557 if let Some(challenge) = att_challenge {
558 key_attest = true;
559 gen_params = gen_params.clone().attestation_challenge(challenge.to_vec());
560 }
561
David Drysdale79092242024-06-18 13:13:43 +0100562 match sl.binder.generateKey(
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000563 &KeyDescriptor { domain, nspace, alias, blob: None },
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000564 None,
565 &gen_params,
566 0,
567 b"entropy",
568 ) {
569 Ok(key_metadata) => {
570 assert!(key_metadata.certificate.is_some());
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000571 if key_attest {
572 assert!(key_metadata.certificateChain.is_some());
573 }
574 if domain == Domain::BLOB {
575 assert!(key_metadata.key.blob.is_some());
576 }
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000577
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000578 check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +0100579 sl,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000580 &key_metadata.authorizations,
581 &gen_params,
582 KeyOrigin::GENERATED,
583 );
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000584 Ok(key_metadata)
585 }
586 Err(e) => Err(e),
587 }
588}
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000589
590/// Generate EC signing key.
Rajesh Nyamagoudc7d064d2022-08-20 01:45:17 +0000591pub fn generate_ec_key(
David Drysdale79092242024-06-18 13:13:43 +0100592 sl: &SecLevel,
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000593 domain: Domain,
594 nspace: i64,
595 alias: Option<String>,
596 ec_curve: EcCurve,
597 digest: Digest,
598) -> binder::Result<KeyMetadata> {
599 let gen_params = AuthSetBuilder::new()
600 .no_auth_required()
601 .algorithm(Algorithm::EC)
602 .purpose(KeyPurpose::SIGN)
603 .purpose(KeyPurpose::VERIFY)
604 .digest(digest)
605 .ec_curve(ec_curve);
606
David Drysdale79092242024-06-18 13:13:43 +0100607 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000608 &KeyDescriptor { domain, nspace, alias, blob: None },
609 None,
610 &gen_params,
611 0,
612 b"entropy",
613 )?;
614
615 // Must have a public key.
616 assert!(key_metadata.certificate.is_some());
617
618 // Should not have an attestation record.
619 assert!(key_metadata.certificateChain.is_none());
620
621 if domain == Domain::BLOB {
622 assert!(key_metadata.key.blob.is_some());
623 } else {
624 assert!(key_metadata.key.blob.is_none());
625 }
David Drysdale79092242024-06-18 13:13:43 +0100626 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000627 Ok(key_metadata)
628}
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000629
630/// Generate a RSA key with the given key parameters, alias, domain and namespace.
631pub fn generate_rsa_key(
David Drysdale79092242024-06-18 13:13:43 +0100632 sl: &SecLevel,
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000633 domain: Domain,
634 nspace: i64,
635 alias: Option<String>,
636 key_params: &KeyParams,
637 attest_key: Option<&KeyDescriptor>,
638) -> binder::Result<KeyMetadata> {
639 let mut gen_params = AuthSetBuilder::new()
640 .no_auth_required()
641 .algorithm(Algorithm::RSA)
642 .rsa_public_exponent(65537)
643 .key_size(key_params.key_size);
644
645 for purpose in &key_params.purpose {
646 gen_params = gen_params.purpose(*purpose);
647 }
648 if let Some(value) = key_params.digest {
649 gen_params = gen_params.digest(value)
650 }
651 if let Some(value) = key_params.padding {
652 gen_params = gen_params.padding_mode(value);
653 }
654 if let Some(value) = key_params.mgf_digest {
655 gen_params = gen_params.mgf_digest(value);
656 }
657 if let Some(value) = key_params.block_mode {
658 gen_params = gen_params.block_mode(value)
659 }
660 if let Some(value) = &key_params.att_challenge {
661 gen_params = gen_params.attestation_challenge(value.to_vec())
662 }
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000663
David Drysdale79092242024-06-18 13:13:43 +0100664 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000665 &KeyDescriptor { domain, nspace, alias, blob: None },
666 attest_key,
667 &gen_params,
668 0,
669 b"entropy",
670 )?;
671
672 // Must have a public key.
673 assert!(key_metadata.certificate.is_some());
674
David Drysdale38f2ca32023-01-10 13:10:51 +0000675 if attest_key.is_none() && key_params.att_challenge.is_some() {
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000676 // Should have an attestation record.
677 assert!(key_metadata.certificateChain.is_some());
678 } else {
679 // Should not have an attestation record.
680 assert!(key_metadata.certificateChain.is_none());
681 }
682
683 assert!(
684 (domain == Domain::BLOB && key_metadata.key.blob.is_some())
685 || key_metadata.key.blob.is_none()
686 );
687
David Drysdale79092242024-06-18 13:13:43 +0100688 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000689 // If `RSA_OAEP_MGF_DIGEST` tag is not mentioned explicitly while generating/importing a key,
690 // then make sure `RSA_OAEP_MGF_DIGEST` tag with default value (SHA1) must not be included in
691 // key authorization list.
692 if key_params.mgf_digest.is_none() {
693 assert!(!check_key_param(
694 &key_metadata.authorizations,
695 &KeyParameter {
696 tag: Tag::RSA_OAEP_MGF_DIGEST,
697 value: KeyParameterValue::Digest(Digest::SHA1)
698 }
699 ));
700 }
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000701 Ok(key_metadata)
702}
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000703
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000704/// Generate AES/3DES key.
705pub fn generate_sym_key(
David Drysdale79092242024-06-18 13:13:43 +0100706 sl: &SecLevel,
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000707 algorithm: Algorithm,
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000708 size: i32,
709 alias: &str,
710 padding_mode: &PaddingMode,
711 block_mode: &BlockMode,
712 min_mac_len: Option<i32>,
713) -> binder::Result<KeyMetadata> {
714 let mut gen_params = AuthSetBuilder::new()
715 .no_auth_required()
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000716 .algorithm(algorithm)
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000717 .purpose(KeyPurpose::ENCRYPT)
718 .purpose(KeyPurpose::DECRYPT)
719 .key_size(size)
720 .padding_mode(*padding_mode)
721 .block_mode(*block_mode);
722
723 if let Some(val) = min_mac_len {
724 gen_params = gen_params.min_mac_length(val);
725 }
726
David Drysdale79092242024-06-18 13:13:43 +0100727 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000728 &KeyDescriptor {
729 domain: Domain::APP,
730 nspace: -1,
731 alias: Some(alias.to_string()),
732 blob: None,
733 },
734 None,
735 &gen_params,
736 0,
737 b"entropy",
738 )?;
739
740 // Should not have public certificate.
741 assert!(key_metadata.certificate.is_none());
742
743 // Should not have an attestation record.
744 assert!(key_metadata.certificateChain.is_none());
David Drysdale79092242024-06-18 13:13:43 +0100745 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000746 Ok(key_metadata)
747}
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000748
749/// Generate HMAC key.
750pub fn generate_hmac_key(
David Drysdale79092242024-06-18 13:13:43 +0100751 sl: &SecLevel,
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000752 alias: &str,
753 key_size: i32,
754 min_mac_len: i32,
755 digest: Digest,
756) -> binder::Result<KeyMetadata> {
757 let gen_params = AuthSetBuilder::new()
758 .no_auth_required()
759 .algorithm(Algorithm::HMAC)
760 .purpose(KeyPurpose::SIGN)
761 .purpose(KeyPurpose::VERIFY)
762 .key_size(key_size)
763 .min_mac_length(min_mac_len)
764 .digest(digest);
765
David Drysdale79092242024-06-18 13:13:43 +0100766 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000767 &KeyDescriptor {
768 domain: Domain::APP,
769 nspace: -1,
770 alias: Some(alias.to_string()),
771 blob: None,
772 },
773 None,
774 &gen_params,
775 0,
776 b"entropy",
777 )?;
778
779 // Should not have public certificate.
780 assert!(key_metadata.certificate.is_none());
781
782 // Should not have an attestation record.
783 assert!(key_metadata.certificateChain.is_none());
784
David Drysdale79092242024-06-18 13:13:43 +0100785 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000786 Ok(key_metadata)
787}
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000788
789/// Generate RSA or EC attestation keys using below parameters -
790/// Purpose: ATTEST_KEY
791/// Digest: Digest::SHA_2_256
792/// Padding: PaddingMode::RSA_PKCS1_1_5_SIGN
793/// RSA-Key-Size: 2048
794/// EC-Curve: EcCurve::P_256
795pub fn generate_attestation_key(
David Drysdale79092242024-06-18 13:13:43 +0100796 sl: &SecLevel,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000797 algorithm: Algorithm,
798 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000799) -> binder::Result<KeyMetadata> {
800 assert!(algorithm == Algorithm::RSA || algorithm == Algorithm::EC);
801
802 if algorithm == Algorithm::RSA {
803 let alias = "ks_rsa_attest_test_key";
804 let metadata = generate_rsa_key(
David Drysdale79092242024-06-18 13:13:43 +0100805 sl,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000806 Domain::APP,
807 -1,
808 Some(alias.to_string()),
809 &KeyParams {
810 key_size: 2048,
811 purpose: vec![KeyPurpose::ATTEST_KEY],
812 padding: Some(PaddingMode::RSA_PKCS1_1_5_SIGN),
813 digest: Some(Digest::SHA_2_256),
814 mgf_digest: None,
815 block_mode: None,
816 att_challenge: Some(att_challenge.to_vec()),
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000817 },
818 None,
819 )
820 .unwrap();
821 Ok(metadata)
822 } else {
David Drysdale79092242024-06-18 13:13:43 +0100823 let metadata =
824 generate_ec_attestation_key(sl, att_challenge, Digest::SHA_2_256, EcCurve::P_256)
825 .unwrap();
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000826
827 Ok(metadata)
828 }
829}
830
831/// Generate EC attestation key with the given
832/// curve, attestation-challenge and attestation-app-id.
833pub fn generate_ec_attestation_key(
David Drysdale79092242024-06-18 13:13:43 +0100834 sl: &SecLevel,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000835 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000836 digest: Digest,
837 ec_curve: EcCurve,
838) -> binder::Result<KeyMetadata> {
839 let alias = "ks_attest_ec_test_key";
840 let gen_params = AuthSetBuilder::new()
841 .no_auth_required()
842 .algorithm(Algorithm::EC)
843 .purpose(KeyPurpose::ATTEST_KEY)
844 .ec_curve(ec_curve)
845 .digest(digest)
David Drysdale38f2ca32023-01-10 13:10:51 +0000846 .attestation_challenge(att_challenge.to_vec());
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000847
David Drysdale79092242024-06-18 13:13:43 +0100848 let attestation_key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000849 &KeyDescriptor {
850 domain: Domain::APP,
851 nspace: -1,
852 alias: Some(alias.to_string()),
853 blob: None,
854 },
855 None,
856 &gen_params,
857 0,
858 b"entropy",
859 )?;
860
861 // Should have public certificate.
862 assert!(attestation_key_metadata.certificate.is_some());
863 // Should have an attestation record.
864 assert!(attestation_key_metadata.certificateChain.is_some());
865
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000866 check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +0100867 sl,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000868 &attestation_key_metadata.authorizations,
869 &gen_params,
870 KeyOrigin::GENERATED,
871 );
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000872 Ok(attestation_key_metadata)
873}
874
875/// Generate EC-P-256 key and attest it with given attestation key.
876pub fn generate_ec_256_attested_key(
David Drysdale79092242024-06-18 13:13:43 +0100877 sl: &SecLevel,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000878 alias: Option<String>,
879 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000880 attest_key: &KeyDescriptor,
881) -> binder::Result<KeyMetadata> {
882 let ec_gen_params = AuthSetBuilder::new()
883 .no_auth_required()
884 .algorithm(Algorithm::EC)
885 .purpose(KeyPurpose::SIGN)
886 .purpose(KeyPurpose::VERIFY)
887 .digest(Digest::SHA_2_256)
888 .ec_curve(EcCurve::P_256)
David Drysdale38f2ca32023-01-10 13:10:51 +0000889 .attestation_challenge(att_challenge.to_vec());
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000890
David Drysdale79092242024-06-18 13:13:43 +0100891 let ec_key_metadata = sl
892 .binder
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000893 .generateKey(
894 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: None },
895 Some(attest_key),
896 &ec_gen_params,
897 0,
898 b"entropy",
899 )
900 .unwrap();
901
902 // Should have public certificate.
903 assert!(ec_key_metadata.certificate.is_some());
904 // Shouldn't have an attestation record.
905 assert!(ec_key_metadata.certificateChain.is_none());
906
David Drysdale79092242024-06-18 13:13:43 +0100907 check_key_authorizations(
908 sl,
909 &ec_key_metadata.authorizations,
910 &ec_gen_params,
911 KeyOrigin::GENERATED,
912 );
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000913 Ok(ec_key_metadata)
914}
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000915
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000916/// Imports above defined RSA key - `RSA_2048_KEY` and validates imported key parameters.
917pub fn import_rsa_2048_key(
David Drysdale79092242024-06-18 13:13:43 +0100918 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000919 domain: Domain,
920 nspace: i64,
921 alias: Option<String>,
922 import_params: AuthSetBuilder,
923) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +0100924 let key_metadata = sl
925 .binder
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000926 .importKey(
927 &KeyDescriptor { domain, nspace, alias, blob: None },
928 None,
929 &import_params,
930 0,
931 RSA_2048_KEY,
932 )
933 .unwrap();
934
935 assert!(key_metadata.certificate.is_some());
936 assert!(key_metadata.certificateChain.is_none());
937
David Drysdale79092242024-06-18 13:13:43 +0100938 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000939
940 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000941 assert!(check_key_param(
942 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000943 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::RSA) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000944 ));
945
946 assert!(check_key_param(
947 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000948 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(2048) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000949 ));
950
951 assert!(check_key_param(
952 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000953 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000954 ));
955
956 assert!(check_key_param(
957 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000958 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000959 tag: Tag::RSA_PUBLIC_EXPONENT,
960 value: KeyParameterValue::LongInteger(65537)
961 }
962 ));
963
964 assert!(check_key_param(
965 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000966 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000967 tag: Tag::PADDING,
968 value: KeyParameterValue::PaddingMode(PaddingMode::RSA_PSS)
969 }
970 ));
971
972 assert!(check_key_param(
973 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000974 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000975 ));
976
977 Ok(key_metadata)
978}
979
980/// Imports above defined EC key - `EC_P_256_KEY` and validates imported key parameters.
981pub fn import_ec_p_256_key(
David Drysdale79092242024-06-18 13:13:43 +0100982 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000983 domain: Domain,
984 nspace: i64,
985 alias: Option<String>,
986 import_params: AuthSetBuilder,
987) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +0100988 let key_metadata = sl
989 .binder
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000990 .importKey(
991 &KeyDescriptor { domain, nspace, alias, blob: None },
992 None,
993 &import_params,
994 0,
995 EC_P_256_KEY,
996 )
997 .unwrap();
998
999 assert!(key_metadata.certificate.is_some());
1000 assert!(key_metadata.certificateChain.is_none());
1001
David Drysdale79092242024-06-18 13:13:43 +01001002 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001003
1004 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001005 assert!(check_key_param(
1006 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001007 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::EC) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001008 ));
1009
1010 assert!(check_key_param(
1011 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001012 &KeyParameter { tag: Tag::EC_CURVE, value: KeyParameterValue::EcCurve(EcCurve::P_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001013 ));
1014
1015 assert!(check_key_param(
1016 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001017 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001018 ));
1019 assert!(check_key_param(
1020 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001021 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001022 ));
1023
1024 Ok(key_metadata)
1025}
1026
1027/// Import sample AES key and validate its key parameters.
1028pub fn import_aes_key(
David Drysdale79092242024-06-18 13:13:43 +01001029 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001030 domain: Domain,
1031 nspace: i64,
1032 alias: Option<String>,
1033) -> binder::Result<KeyMetadata> {
1034 static AES_KEY: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
1035 let key_size = AES_KEY.len() * 8;
1036
1037 let import_params = AuthSetBuilder::new()
1038 .no_auth_required()
1039 .algorithm(Algorithm::AES)
1040 .block_mode(BlockMode::ECB)
1041 .key_size(key_size.try_into().unwrap())
1042 .purpose(KeyPurpose::ENCRYPT)
1043 .purpose(KeyPurpose::DECRYPT)
1044 .padding_mode(PaddingMode::PKCS7);
1045
David Drysdale79092242024-06-18 13:13:43 +01001046 let key_metadata = sl.binder.importKey(
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001047 &KeyDescriptor { domain, nspace, alias, blob: None },
1048 None,
1049 &import_params,
1050 0,
1051 AES_KEY,
1052 )?;
1053
David Drysdale79092242024-06-18 13:13:43 +01001054 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001055
1056 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001057 assert!(check_key_param(
1058 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001059 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::AES) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001060 ));
1061 assert!(check_key_param(
1062 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001063 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(128) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001064 ));
1065 assert!(check_key_param(
1066 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001067 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001068 tag: Tag::PADDING,
1069 value: KeyParameterValue::PaddingMode(PaddingMode::PKCS7)
1070 }
1071 ));
1072 assert!(check_key_param(
1073 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001074 &KeyParameter { tag: Tag::BLOCK_MODE, value: KeyParameterValue::BlockMode(BlockMode::ECB) }
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 3DES key and validate its key parameters.
1085pub fn import_3des_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 TRIPLE_DES_KEY: &[u8] = &[
1092 0xa4, 0x9d, 0x75, 0x64, 0x19, 0x9e, 0x97, 0xcb, 0x52, 0x9d, 0x2c, 0x9d, 0x97, 0xbf, 0x2f,
1093 0x98, 0xd3, 0x5e, 0xdf, 0x57, 0xba, 0x1f, 0x73, 0x58,
1094 ];
1095
1096 let import_params = AuthSetBuilder::new()
1097 .no_auth_required()
1098 .algorithm(Algorithm::TRIPLE_DES)
1099 .block_mode(BlockMode::ECB)
1100 .key_size(168)
1101 .purpose(KeyPurpose::ENCRYPT)
1102 .purpose(KeyPurpose::DECRYPT)
1103 .padding_mode(PaddingMode::PKCS7);
1104
David Drysdale79092242024-06-18 13:13:43 +01001105 let key_metadata = sl.binder.importKey(
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001106 &KeyDescriptor { domain, nspace, alias, blob: None },
1107 None,
1108 &import_params,
1109 0,
1110 TRIPLE_DES_KEY,
1111 )?;
1112
David Drysdale79092242024-06-18 13:13:43 +01001113 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001114
1115 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001116 assert!(check_key_param(
1117 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001118 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001119 tag: Tag::ALGORITHM,
1120 value: KeyParameterValue::Algorithm(Algorithm::TRIPLE_DES)
1121 }
1122 ));
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(168) }
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 HMAC key and validate its key parameters.
1147pub fn import_hmac_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 HMAC_KEY: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
1154 let key_size = HMAC_KEY.len() * 8;
1155
1156 let import_params = AuthSetBuilder::new()
1157 .no_auth_required()
1158 .algorithm(Algorithm::HMAC)
1159 .key_size(key_size.try_into().unwrap())
1160 .purpose(KeyPurpose::SIGN)
1161 .purpose(KeyPurpose::VERIFY)
1162 .digest(Digest::SHA_2_256)
1163 .min_mac_length(256);
1164
David Drysdale79092242024-06-18 13:13:43 +01001165 let key_metadata = sl.binder.importKey(
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001166 &KeyDescriptor { domain, nspace, alias, blob: None },
1167 None,
1168 &import_params,
1169 0,
1170 HMAC_KEY,
1171 )?;
1172
David Drysdale79092242024-06-18 13:13:43 +01001173 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001174
1175 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001176 assert!(check_key_param(
1177 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001178 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::HMAC) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001179 ));
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(128) }
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 { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001187 ));
1188 assert!(check_key_param(
1189 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001190 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001191 ));
1192
1193 Ok(key_metadata)
1194}
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001195
1196/// Imports RSA encryption key with WRAP_KEY purpose.
1197pub fn import_wrapping_key(
David Drysdale79092242024-06-18 13:13:43 +01001198 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001199 wrapping_key_data: &[u8],
1200 wrapping_key_alias: Option<String>,
1201) -> binder::Result<KeyMetadata> {
1202 let wrapping_key_params = AuthSetBuilder::new()
1203 .no_auth_required()
1204 .algorithm(Algorithm::RSA)
1205 .digest(Digest::SHA_2_256)
1206 .purpose(KeyPurpose::ENCRYPT)
1207 .purpose(KeyPurpose::DECRYPT)
1208 .purpose(KeyPurpose::WRAP_KEY)
1209 .padding_mode(PaddingMode::RSA_OAEP)
1210 .key_size(2048)
1211 .rsa_public_exponent(65537)
1212 .cert_not_before(0)
1213 .cert_not_after(253402300799000);
1214
David Drysdale79092242024-06-18 13:13:43 +01001215 sl.binder.importKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001216 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias: wrapping_key_alias, blob: None },
1217 None,
1218 &wrapping_key_params,
1219 0,
1220 wrapping_key_data,
1221 )
1222}
1223
1224/// Import wrapped key using given wrapping key.
1225pub fn import_wrapped_key(
David Drysdale79092242024-06-18 13:13:43 +01001226 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001227 alias: Option<String>,
1228 wrapping_key_metadata: &KeyMetadata,
1229 wrapped_key: Option<Vec<u8>>,
1230) -> binder::Result<KeyMetadata> {
1231 let unwrap_params =
1232 AuthSetBuilder::new().digest(Digest::SHA_2_256).padding_mode(PaddingMode::RSA_OAEP);
1233
1234 let authenticator_spec: &[AuthenticatorSpec] = &[AuthenticatorSpec {
1235 authenticatorType: HardwareAuthenticatorType::NONE,
1236 authenticatorId: 0,
1237 }];
1238
David Drysdale79092242024-06-18 13:13:43 +01001239 let key_metadata = sl.binder.importWrappedKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001240 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: wrapped_key },
1241 &wrapping_key_metadata.key,
1242 None,
1243 &unwrap_params,
1244 authenticator_spec,
1245 )?;
1246
1247 Ok(key_metadata)
1248}
1249
1250/// Import wrapping key and then import wrapped key using wrapping key.
1251pub fn import_wrapping_key_and_wrapped_key(
David Drysdale79092242024-06-18 13:13:43 +01001252 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001253 domain: Domain,
1254 nspace: i64,
1255 alias: Option<String>,
1256 wrapping_key_alias: Option<String>,
1257 wrapping_key_params: AuthSetBuilder,
1258) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +01001259 let wrapping_key_metadata = sl.binder.importKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001260 &KeyDescriptor { domain, nspace, alias: wrapping_key_alias, blob: None },
1261 None,
1262 &wrapping_key_params,
1263 0,
1264 WRAPPING_KEY,
1265 )?;
1266
David Drysdale79092242024-06-18 13:13:43 +01001267 import_wrapped_key(sl, alias, &wrapping_key_metadata, Some(WRAPPED_KEY.to_vec()))
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001268}
1269
1270/// Import given key material as AES-256-GCM-NONE transport key.
1271pub fn import_transport_key(
David Drysdale79092242024-06-18 13:13:43 +01001272 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001273 transport_key_alias: Option<String>,
1274 transport_key: &[u8],
1275) -> binder::Result<KeyMetadata> {
1276 let transport_key_params = AuthSetBuilder::new()
1277 .no_auth_required()
1278 .algorithm(Algorithm::AES)
1279 .block_mode(BlockMode::GCM)
1280 .padding_mode(PaddingMode::NONE)
1281 .key_size(256)
1282 .caller_nonce()
1283 .min_mac_length(128)
1284 .purpose(KeyPurpose::ENCRYPT)
1285 .purpose(KeyPurpose::DECRYPT);
1286
David Drysdale79092242024-06-18 13:13:43 +01001287 sl.binder.importKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001288 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias: transport_key_alias, blob: None },
1289 None,
1290 &transport_key_params,
1291 0,
1292 transport_key,
1293 )
1294}
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001295
1296/// Generate EC key with purpose AGREE_KEY.
1297pub fn generate_ec_agree_key(
David Drysdale79092242024-06-18 13:13:43 +01001298 sl: &SecLevel,
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001299 ec_curve: EcCurve,
1300 digest: Digest,
1301 domain: Domain,
1302 nspace: i64,
1303 alias: Option<String>,
1304) -> binder::Result<KeyMetadata> {
1305 let gen_params = AuthSetBuilder::new()
1306 .no_auth_required()
1307 .algorithm(Algorithm::EC)
1308 .purpose(KeyPurpose::AGREE_KEY)
1309 .digest(digest)
1310 .ec_curve(ec_curve);
1311
David Drysdale79092242024-06-18 13:13:43 +01001312 match sl.binder.generateKey(
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001313 &KeyDescriptor { domain, nspace, alias, blob: None },
1314 None,
1315 &gen_params,
1316 0,
1317 b"entropy",
1318 ) {
1319 Ok(key_metadata) => {
1320 assert!(key_metadata.certificate.is_some());
1321 if domain == Domain::BLOB {
1322 assert!(key_metadata.key.blob.is_some());
1323 }
1324
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001325 check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +01001326 sl,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001327 &key_metadata.authorizations,
1328 &gen_params,
1329 KeyOrigin::GENERATED,
1330 );
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001331 Ok(key_metadata)
1332 }
1333 Err(e) => Err(e),
1334 }
1335}
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001336
1337/// Helper method to import AES keys `total_count` of times.
1338pub fn import_aes_keys(
David Drysdale79092242024-06-18 13:13:43 +01001339 sl: &SecLevel,
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001340 alias_prefix: String,
1341 total_count: Range<i32>,
1342) -> binder::Result<HashSet<String>> {
1343 let mut imported_key_aliases = HashSet::new();
1344
1345 // Import Total number of keys with given alias prefix.
1346 for count in total_count {
1347 let mut alias = String::new();
1348 write!(alias, "{}_{}", alias_prefix, count).unwrap();
1349 imported_key_aliases.insert(alias.clone());
1350
David Drysdale79092242024-06-18 13:13:43 +01001351 import_aes_key(sl, Domain::APP, -1, Some(alias))?;
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001352 }
1353
1354 Ok(imported_key_aliases)
1355}
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001356
1357/// Generate attested EC-P_256 key with device id attestation.
1358pub fn generate_key_with_attest_id(
David Drysdale79092242024-06-18 13:13:43 +01001359 sl: &SecLevel,
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001360 algorithm: Algorithm,
1361 alias: Option<String>,
1362 att_challenge: &[u8],
1363 attest_key: &KeyDescriptor,
1364 attest_id: Tag,
1365 value: Vec<u8>,
1366) -> binder::Result<KeyMetadata> {
1367 assert!(algorithm == Algorithm::RSA || algorithm == Algorithm::EC);
1368
1369 let mut ec_gen_params;
1370 if algorithm == Algorithm::EC {
1371 ec_gen_params = AuthSetBuilder::new()
1372 .no_auth_required()
1373 .algorithm(Algorithm::EC)
1374 .purpose(KeyPurpose::SIGN)
1375 .purpose(KeyPurpose::VERIFY)
1376 .digest(Digest::SHA_2_256)
1377 .ec_curve(EcCurve::P_256)
1378 .attestation_challenge(att_challenge.to_vec());
1379 } else {
1380 ec_gen_params = AuthSetBuilder::new()
1381 .no_auth_required()
1382 .algorithm(Algorithm::RSA)
1383 .rsa_public_exponent(65537)
1384 .key_size(2048)
1385 .purpose(KeyPurpose::SIGN)
1386 .purpose(KeyPurpose::VERIFY)
1387 .digest(Digest::SHA_2_256)
1388 .padding_mode(PaddingMode::RSA_PKCS1_1_5_SIGN)
1389 .attestation_challenge(att_challenge.to_vec());
1390 }
1391
1392 match attest_id {
1393 Tag::ATTESTATION_ID_BRAND => {
1394 ec_gen_params = ec_gen_params.attestation_device_brand(value);
1395 }
1396 Tag::ATTESTATION_ID_DEVICE => {
1397 ec_gen_params = ec_gen_params.attestation_device_name(value);
1398 }
1399 Tag::ATTESTATION_ID_PRODUCT => {
1400 ec_gen_params = ec_gen_params.attestation_device_product_name(value);
1401 }
1402 Tag::ATTESTATION_ID_SERIAL => {
1403 ec_gen_params = ec_gen_params.attestation_device_serial(value);
1404 }
1405 Tag::ATTESTATION_ID_MANUFACTURER => {
1406 ec_gen_params = ec_gen_params.attestation_device_manufacturer(value);
1407 }
1408 Tag::ATTESTATION_ID_MODEL => {
1409 ec_gen_params = ec_gen_params.attestation_device_model(value);
1410 }
1411 Tag::ATTESTATION_ID_IMEI => {
1412 ec_gen_params = ec_gen_params.attestation_device_imei(value);
1413 }
1414 Tag::ATTESTATION_ID_SECOND_IMEI => {
1415 ec_gen_params = ec_gen_params.attestation_device_second_imei(value);
1416 }
1417 _ => {
1418 panic!("Unknown attestation id");
1419 }
1420 }
1421
David Drysdale79092242024-06-18 13:13:43 +01001422 sl.binder.generateKey(
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001423 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: None },
1424 Some(attest_key),
1425 &ec_gen_params,
1426 0,
1427 b"entropy",
1428 )
1429}
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001430
1431/// Generate Key and validate key characteristics.
1432pub fn generate_key(
David Drysdale79092242024-06-18 13:13:43 +01001433 sl: &SecLevel,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001434 gen_params: &AuthSetBuilder,
1435 alias: &str,
1436) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +01001437 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001438 &KeyDescriptor {
1439 domain: Domain::APP,
1440 nspace: -1,
1441 alias: Some(alias.to_string()),
1442 blob: None,
1443 },
1444 None,
1445 gen_params,
1446 0,
1447 b"entropy",
1448 )?;
1449
1450 if gen_params.iter().any(|kp| {
1451 matches!(
1452 kp.value,
1453 KeyParameterValue::Algorithm(Algorithm::RSA)
1454 | KeyParameterValue::Algorithm(Algorithm::EC)
1455 )
1456 }) {
1457 assert!(key_metadata.certificate.is_some());
1458 if gen_params.iter().any(|kp| kp.tag == Tag::ATTESTATION_CHALLENGE) {
1459 assert!(key_metadata.certificateChain.is_some());
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +00001460 let mut cert_chain: Vec<u8> = Vec::new();
1461 cert_chain.extend(key_metadata.certificate.as_ref().unwrap());
1462 cert_chain.extend(key_metadata.certificateChain.as_ref().unwrap());
Rajesh Nyamagoudb1c8e832023-06-06 01:39:44 +00001463 let strict_issuer_check =
1464 !(gen_params.iter().any(|kp| kp.tag == Tag::DEVICE_UNIQUE_ATTESTATION));
1465 validate_certchain_with_strict_issuer_check(&cert_chain, strict_issuer_check)
1466 .expect("Error while validating cert chain");
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +00001467 }
1468
1469 if let Some(challenge_param) =
1470 gen_params.iter().find(|kp| kp.tag == Tag::ATTESTATION_CHALLENGE)
1471 {
1472 if let KeyParameterValue::Blob(val) = &challenge_param.value {
1473 let att_challenge = get_value_from_attest_record(
1474 key_metadata.certificate.as_ref().unwrap(),
1475 challenge_param.tag,
1476 key_metadata.keySecurityLevel,
1477 )
1478 .expect("Attestation challenge verification failed.");
1479 assert_eq!(&att_challenge, val);
1480 }
1481
1482 let att_app_id = get_value_from_attest_record(
1483 key_metadata.certificate.as_ref().unwrap(),
1484 Tag::ATTESTATION_APPLICATION_ID,
1485 SecurityLevel::KEYSTORE,
1486 )
1487 .expect("Attestation application id verification failed.");
1488 assert!(!att_app_id.is_empty());
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001489 }
1490 }
David Drysdale79092242024-06-18 13:13:43 +01001491 check_key_authorizations(sl, &key_metadata.authorizations, gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001492
1493 Ok(key_metadata)
1494}
1495
1496/// Generate a key using given authorizations and create an operation using the generated key.
1497pub fn create_key_and_operation(
David Drysdale79092242024-06-18 13:13:43 +01001498 sl: &SecLevel,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001499 gen_params: &AuthSetBuilder,
1500 op_params: &AuthSetBuilder,
1501 alias: &str,
1502) -> binder::Result<CreateOperationResponse> {
David Drysdale79092242024-06-18 13:13:43 +01001503 let key_metadata = generate_key(sl, gen_params, alias)?;
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001504
David Drysdale79092242024-06-18 13:13:43 +01001505 sl.binder.createOperation(&key_metadata.key, op_params, false)
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001506}