blob: c4161c03efa670f6e380c8b7ab76be974fb22071 [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 Nyamagoud19236362024-07-10 20:52:28 +0000404 // Ignore `INVALID` tag
405 if auth.keyParameter.tag == Tag::INVALID {
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000406 return true;
407 }
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000408 assert!(
409 ALLOWED_TAGS_IN_KEY_AUTHS.contains(&auth.keyParameter.tag),
410 "key authorization is not allowed: {:#?}",
411 auth.keyParameter
412 );
413 true
414 });
415
David Drysdale79092242024-06-18 13:13:43 +0100416 // Check allowed-expected-key-parameters are present in given key authorizations list.
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000417 expected_params.iter().all(|key_param| {
Rajesh Nyamagoud17a92612023-10-17 16:15:05 +0000418 // `INCLUDE_UNIQUE_ID` is not strictly expected to be in key authorizations but has been
419 // put there by some implementations so cope with that.
420 if key_param.tag == Tag::INCLUDE_UNIQUE_ID
421 && !authorizations.iter().any(|auth| auth.keyParameter.tag == key_param.tag)
422 {
423 return true;
424 }
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000425
426 // Ignore below parameters if the backend is Keymaster and not KeyMint.
427 // Keymaster does not support these parameters. These key parameters are introduced in
428 // KeyMint1.0.
David Drysdale79092242024-06-18 13:13:43 +0100429 if sl.is_keymaster() {
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000430 if matches!(key_param.tag, Tag::RSA_OAEP_MGF_DIGEST | Tag::USAGE_COUNT_LIMIT) {
431 return true;
432 }
433 if key_param.tag == Tag::PURPOSE
434 && key_param.value == KeyParameterValue::KeyPurpose(KeyPurpose::ATTEST_KEY)
435 {
436 return true;
437 }
438 }
439
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000440 if ALLOWED_TAGS_IN_KEY_AUTHS.contains(&key_param.tag) {
441 assert!(
442 check_key_param(authorizations, key_param),
443 "Key parameter not found: {:#?}",
444 key_param
445 );
446 }
447 true
448 });
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000449
David Drysdale79092242024-06-18 13:13:43 +0100450 check_common_auths(sl, authorizations, expected_key_origin);
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000451}
452
453/// Verify common key authorizations.
David Drysdale79092242024-06-18 13:13:43 +0100454fn check_common_auths(
455 sl: &SecLevel,
456 authorizations: &[Authorization],
457 expected_key_origin: KeyOrigin,
458) {
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000459 assert!(check_key_param(
460 authorizations,
461 &KeyParameter {
462 tag: Tag::OS_VERSION,
463 value: KeyParameterValue::Integer(get_os_version().try_into().unwrap())
464 }
465 ));
466 assert!(check_key_param(
467 authorizations,
468 &KeyParameter {
469 tag: Tag::OS_PATCHLEVEL,
470 value: KeyParameterValue::Integer(get_os_patchlevel().try_into().unwrap())
471 }
472 ));
473
474 // Access denied for finding vendor-patch-level ("ro.vendor.build.security_patch") property
475 // in a test running with `untrusted_app` context. Keeping this check to verify
476 // vendor-patch-level in tests running with `su` context.
477 if getuid().is_root() {
478 assert!(check_key_param(
479 authorizations,
480 &KeyParameter {
481 tag: Tag::VENDOR_PATCHLEVEL,
482 value: KeyParameterValue::Integer(get_vendor_patchlevel().try_into().unwrap())
483 }
484 ));
485 }
486 assert!(check_key_param(
487 authorizations,
488 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(expected_key_origin) }
489 ));
490 assert!(check_key_param(
491 authorizations,
492 &KeyParameter {
493 tag: Tag::USER_ID,
494 value: KeyParameterValue::Integer(
495 rustutils::users::multiuser_get_user_id(ThreadState::get_calling_uid())
496 .try_into()
497 .unwrap()
498 )
499 }
500 ));
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +0000501
David Drysdale79092242024-06-18 13:13:43 +0100502 if sl.is_keymint() {
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +0000503 assert!(authorizations
504 .iter()
505 .map(|auth| &auth.keyParameter)
506 .any(|key_param| key_param.tag == Tag::CREATION_DATETIME));
507 }
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000508}
509
Rajesh Nyamagoudf436a932023-05-12 01:16:07 +0000510/// Get the key `Authorization` for the given auth `Tag`.
511pub fn get_key_auth(authorizations: &[Authorization], tag: Tag) -> Option<&Authorization> {
512 let auths: Vec<&Authorization> =
513 authorizations.iter().filter(|auth| auth.keyParameter.tag == tag).collect();
514
515 if !auths.is_empty() {
516 Some(auths[0])
517 } else {
518 None
519 }
520}
521
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000522/// Generate EC Key using given security level and domain with below key parameters and
523/// optionally allow the generated key to be attested with factory provisioned attest key using
524/// given challenge and application id -
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000525/// Purposes: SIGN and VERIFY
526/// Digest: SHA_2_256
527/// Curve: P_256
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000528pub fn generate_ec_p256_signing_key(
David Drysdale79092242024-06-18 13:13:43 +0100529 sl: &SecLevel,
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000530 domain: Domain,
531 nspace: i64,
532 alias: Option<String>,
533 att_challenge: Option<&[u8]>,
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000534) -> binder::Result<KeyMetadata> {
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000535 let mut key_attest = false;
536 let mut gen_params = AuthSetBuilder::new()
Rajesh Nyamagoudc7d064d2022-08-20 01:45:17 +0000537 .no_auth_required()
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000538 .algorithm(Algorithm::EC)
539 .purpose(KeyPurpose::SIGN)
540 .purpose(KeyPurpose::VERIFY)
541 .digest(Digest::SHA_2_256)
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000542 .ec_curve(EcCurve::P_256);
543
544 if let Some(challenge) = att_challenge {
545 key_attest = true;
546 gen_params = gen_params.clone().attestation_challenge(challenge.to_vec());
547 }
548
David Drysdale79092242024-06-18 13:13:43 +0100549 match sl.binder.generateKey(
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000550 &KeyDescriptor { domain, nspace, alias, blob: None },
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000551 None,
552 &gen_params,
553 0,
554 b"entropy",
555 ) {
556 Ok(key_metadata) => {
557 assert!(key_metadata.certificate.is_some());
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000558 if key_attest {
559 assert!(key_metadata.certificateChain.is_some());
560 }
561 if domain == Domain::BLOB {
562 assert!(key_metadata.key.blob.is_some());
563 }
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000564
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000565 check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +0100566 sl,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000567 &key_metadata.authorizations,
568 &gen_params,
569 KeyOrigin::GENERATED,
570 );
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000571 Ok(key_metadata)
572 }
573 Err(e) => Err(e),
574 }
575}
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000576
577/// Generate EC signing key.
Rajesh Nyamagoudc7d064d2022-08-20 01:45:17 +0000578pub fn generate_ec_key(
David Drysdale79092242024-06-18 13:13:43 +0100579 sl: &SecLevel,
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000580 domain: Domain,
581 nspace: i64,
582 alias: Option<String>,
583 ec_curve: EcCurve,
584 digest: Digest,
585) -> binder::Result<KeyMetadata> {
586 let gen_params = AuthSetBuilder::new()
587 .no_auth_required()
588 .algorithm(Algorithm::EC)
589 .purpose(KeyPurpose::SIGN)
590 .purpose(KeyPurpose::VERIFY)
591 .digest(digest)
592 .ec_curve(ec_curve);
593
David Drysdale79092242024-06-18 13:13:43 +0100594 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000595 &KeyDescriptor { domain, nspace, alias, blob: None },
596 None,
597 &gen_params,
598 0,
599 b"entropy",
600 )?;
601
602 // Must have a public key.
603 assert!(key_metadata.certificate.is_some());
604
605 // Should not have an attestation record.
606 assert!(key_metadata.certificateChain.is_none());
607
608 if domain == Domain::BLOB {
609 assert!(key_metadata.key.blob.is_some());
610 } else {
611 assert!(key_metadata.key.blob.is_none());
612 }
David Drysdale79092242024-06-18 13:13:43 +0100613 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000614 Ok(key_metadata)
615}
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000616
617/// Generate a RSA key with the given key parameters, alias, domain and namespace.
618pub fn generate_rsa_key(
David Drysdale79092242024-06-18 13:13:43 +0100619 sl: &SecLevel,
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000620 domain: Domain,
621 nspace: i64,
622 alias: Option<String>,
623 key_params: &KeyParams,
624 attest_key: Option<&KeyDescriptor>,
625) -> binder::Result<KeyMetadata> {
626 let mut gen_params = AuthSetBuilder::new()
627 .no_auth_required()
628 .algorithm(Algorithm::RSA)
629 .rsa_public_exponent(65537)
630 .key_size(key_params.key_size);
631
632 for purpose in &key_params.purpose {
633 gen_params = gen_params.purpose(*purpose);
634 }
635 if let Some(value) = key_params.digest {
636 gen_params = gen_params.digest(value)
637 }
638 if let Some(value) = key_params.padding {
639 gen_params = gen_params.padding_mode(value);
640 }
641 if let Some(value) = key_params.mgf_digest {
642 gen_params = gen_params.mgf_digest(value);
643 }
644 if let Some(value) = key_params.block_mode {
645 gen_params = gen_params.block_mode(value)
646 }
647 if let Some(value) = &key_params.att_challenge {
648 gen_params = gen_params.attestation_challenge(value.to_vec())
649 }
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000650
David Drysdale79092242024-06-18 13:13:43 +0100651 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000652 &KeyDescriptor { domain, nspace, alias, blob: None },
653 attest_key,
654 &gen_params,
655 0,
656 b"entropy",
657 )?;
658
659 // Must have a public key.
660 assert!(key_metadata.certificate.is_some());
661
David Drysdale38f2ca32023-01-10 13:10:51 +0000662 if attest_key.is_none() && key_params.att_challenge.is_some() {
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000663 // Should have an attestation record.
664 assert!(key_metadata.certificateChain.is_some());
665 } else {
666 // Should not have an attestation record.
667 assert!(key_metadata.certificateChain.is_none());
668 }
669
670 assert!(
671 (domain == Domain::BLOB && key_metadata.key.blob.is_some())
672 || key_metadata.key.blob.is_none()
673 );
674
David Drysdale79092242024-06-18 13:13:43 +0100675 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000676 // If `RSA_OAEP_MGF_DIGEST` tag is not mentioned explicitly while generating/importing a key,
677 // then make sure `RSA_OAEP_MGF_DIGEST` tag with default value (SHA1) must not be included in
678 // key authorization list.
679 if key_params.mgf_digest.is_none() {
680 assert!(!check_key_param(
681 &key_metadata.authorizations,
682 &KeyParameter {
683 tag: Tag::RSA_OAEP_MGF_DIGEST,
684 value: KeyParameterValue::Digest(Digest::SHA1)
685 }
686 ));
687 }
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000688 Ok(key_metadata)
689}
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000690
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000691/// Generate AES/3DES key.
692pub fn generate_sym_key(
David Drysdale79092242024-06-18 13:13:43 +0100693 sl: &SecLevel,
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000694 algorithm: Algorithm,
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000695 size: i32,
696 alias: &str,
697 padding_mode: &PaddingMode,
698 block_mode: &BlockMode,
699 min_mac_len: Option<i32>,
700) -> binder::Result<KeyMetadata> {
701 let mut gen_params = AuthSetBuilder::new()
702 .no_auth_required()
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000703 .algorithm(algorithm)
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000704 .purpose(KeyPurpose::ENCRYPT)
705 .purpose(KeyPurpose::DECRYPT)
706 .key_size(size)
707 .padding_mode(*padding_mode)
708 .block_mode(*block_mode);
709
710 if let Some(val) = min_mac_len {
711 gen_params = gen_params.min_mac_length(val);
712 }
713
David Drysdale79092242024-06-18 13:13:43 +0100714 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000715 &KeyDescriptor {
716 domain: Domain::APP,
717 nspace: -1,
718 alias: Some(alias.to_string()),
719 blob: None,
720 },
721 None,
722 &gen_params,
723 0,
724 b"entropy",
725 )?;
726
727 // Should not have public certificate.
728 assert!(key_metadata.certificate.is_none());
729
730 // Should not have an attestation record.
731 assert!(key_metadata.certificateChain.is_none());
David Drysdale79092242024-06-18 13:13:43 +0100732 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000733 Ok(key_metadata)
734}
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000735
736/// Generate HMAC key.
737pub fn generate_hmac_key(
David Drysdale79092242024-06-18 13:13:43 +0100738 sl: &SecLevel,
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000739 alias: &str,
740 key_size: i32,
741 min_mac_len: i32,
742 digest: Digest,
743) -> binder::Result<KeyMetadata> {
744 let gen_params = AuthSetBuilder::new()
745 .no_auth_required()
746 .algorithm(Algorithm::HMAC)
747 .purpose(KeyPurpose::SIGN)
748 .purpose(KeyPurpose::VERIFY)
749 .key_size(key_size)
750 .min_mac_length(min_mac_len)
751 .digest(digest);
752
David Drysdale79092242024-06-18 13:13:43 +0100753 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000754 &KeyDescriptor {
755 domain: Domain::APP,
756 nspace: -1,
757 alias: Some(alias.to_string()),
758 blob: None,
759 },
760 None,
761 &gen_params,
762 0,
763 b"entropy",
764 )?;
765
766 // Should not have public certificate.
767 assert!(key_metadata.certificate.is_none());
768
769 // Should not have an attestation record.
770 assert!(key_metadata.certificateChain.is_none());
771
David Drysdale79092242024-06-18 13:13:43 +0100772 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000773 Ok(key_metadata)
774}
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000775
776/// Generate RSA or EC attestation keys using below parameters -
777/// Purpose: ATTEST_KEY
778/// Digest: Digest::SHA_2_256
779/// Padding: PaddingMode::RSA_PKCS1_1_5_SIGN
780/// RSA-Key-Size: 2048
781/// EC-Curve: EcCurve::P_256
782pub fn generate_attestation_key(
David Drysdale79092242024-06-18 13:13:43 +0100783 sl: &SecLevel,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000784 algorithm: Algorithm,
785 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000786) -> binder::Result<KeyMetadata> {
787 assert!(algorithm == Algorithm::RSA || algorithm == Algorithm::EC);
788
789 if algorithm == Algorithm::RSA {
790 let alias = "ks_rsa_attest_test_key";
791 let metadata = generate_rsa_key(
David Drysdale79092242024-06-18 13:13:43 +0100792 sl,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000793 Domain::APP,
794 -1,
795 Some(alias.to_string()),
796 &KeyParams {
797 key_size: 2048,
798 purpose: vec![KeyPurpose::ATTEST_KEY],
799 padding: Some(PaddingMode::RSA_PKCS1_1_5_SIGN),
800 digest: Some(Digest::SHA_2_256),
801 mgf_digest: None,
802 block_mode: None,
803 att_challenge: Some(att_challenge.to_vec()),
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000804 },
805 None,
806 )
807 .unwrap();
808 Ok(metadata)
809 } else {
David Drysdale79092242024-06-18 13:13:43 +0100810 let metadata =
811 generate_ec_attestation_key(sl, att_challenge, Digest::SHA_2_256, EcCurve::P_256)
812 .unwrap();
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000813
814 Ok(metadata)
815 }
816}
817
818/// Generate EC attestation key with the given
819/// curve, attestation-challenge and attestation-app-id.
820pub fn generate_ec_attestation_key(
David Drysdale79092242024-06-18 13:13:43 +0100821 sl: &SecLevel,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000822 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000823 digest: Digest,
824 ec_curve: EcCurve,
825) -> binder::Result<KeyMetadata> {
826 let alias = "ks_attest_ec_test_key";
827 let gen_params = AuthSetBuilder::new()
828 .no_auth_required()
829 .algorithm(Algorithm::EC)
830 .purpose(KeyPurpose::ATTEST_KEY)
831 .ec_curve(ec_curve)
832 .digest(digest)
David Drysdale38f2ca32023-01-10 13:10:51 +0000833 .attestation_challenge(att_challenge.to_vec());
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000834
David Drysdale79092242024-06-18 13:13:43 +0100835 let attestation_key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000836 &KeyDescriptor {
837 domain: Domain::APP,
838 nspace: -1,
839 alias: Some(alias.to_string()),
840 blob: None,
841 },
842 None,
843 &gen_params,
844 0,
845 b"entropy",
846 )?;
847
848 // Should have public certificate.
849 assert!(attestation_key_metadata.certificate.is_some());
850 // Should have an attestation record.
851 assert!(attestation_key_metadata.certificateChain.is_some());
852
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000853 check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +0100854 sl,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000855 &attestation_key_metadata.authorizations,
856 &gen_params,
857 KeyOrigin::GENERATED,
858 );
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000859 Ok(attestation_key_metadata)
860}
861
862/// Generate EC-P-256 key and attest it with given attestation key.
863pub fn generate_ec_256_attested_key(
David Drysdale79092242024-06-18 13:13:43 +0100864 sl: &SecLevel,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000865 alias: Option<String>,
866 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000867 attest_key: &KeyDescriptor,
868) -> binder::Result<KeyMetadata> {
869 let ec_gen_params = AuthSetBuilder::new()
870 .no_auth_required()
871 .algorithm(Algorithm::EC)
872 .purpose(KeyPurpose::SIGN)
873 .purpose(KeyPurpose::VERIFY)
874 .digest(Digest::SHA_2_256)
875 .ec_curve(EcCurve::P_256)
David Drysdale38f2ca32023-01-10 13:10:51 +0000876 .attestation_challenge(att_challenge.to_vec());
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000877
David Drysdale79092242024-06-18 13:13:43 +0100878 let ec_key_metadata = sl
879 .binder
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000880 .generateKey(
881 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: None },
882 Some(attest_key),
883 &ec_gen_params,
884 0,
885 b"entropy",
886 )
887 .unwrap();
888
889 // Should have public certificate.
890 assert!(ec_key_metadata.certificate.is_some());
891 // Shouldn't have an attestation record.
892 assert!(ec_key_metadata.certificateChain.is_none());
893
David Drysdale79092242024-06-18 13:13:43 +0100894 check_key_authorizations(
895 sl,
896 &ec_key_metadata.authorizations,
897 &ec_gen_params,
898 KeyOrigin::GENERATED,
899 );
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000900 Ok(ec_key_metadata)
901}
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000902
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000903/// Imports above defined RSA key - `RSA_2048_KEY` and validates imported key parameters.
904pub fn import_rsa_2048_key(
David Drysdale79092242024-06-18 13:13:43 +0100905 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000906 domain: Domain,
907 nspace: i64,
908 alias: Option<String>,
909 import_params: AuthSetBuilder,
910) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +0100911 let key_metadata = sl
912 .binder
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000913 .importKey(
914 &KeyDescriptor { domain, nspace, alias, blob: None },
915 None,
916 &import_params,
917 0,
918 RSA_2048_KEY,
919 )
920 .unwrap();
921
922 assert!(key_metadata.certificate.is_some());
923 assert!(key_metadata.certificateChain.is_none());
924
David Drysdale79092242024-06-18 13:13:43 +0100925 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000926
927 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000928 assert!(check_key_param(
929 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000930 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::RSA) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000931 ));
932
933 assert!(check_key_param(
934 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000935 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(2048) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000936 ));
937
938 assert!(check_key_param(
939 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000940 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000941 ));
942
943 assert!(check_key_param(
944 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000945 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000946 tag: Tag::RSA_PUBLIC_EXPONENT,
947 value: KeyParameterValue::LongInteger(65537)
948 }
949 ));
950
951 assert!(check_key_param(
952 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000953 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000954 tag: Tag::PADDING,
955 value: KeyParameterValue::PaddingMode(PaddingMode::RSA_PSS)
956 }
957 ));
958
959 assert!(check_key_param(
960 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000961 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000962 ));
963
964 Ok(key_metadata)
965}
966
967/// Imports above defined EC key - `EC_P_256_KEY` and validates imported key parameters.
968pub fn import_ec_p_256_key(
David Drysdale79092242024-06-18 13:13:43 +0100969 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000970 domain: Domain,
971 nspace: i64,
972 alias: Option<String>,
973 import_params: AuthSetBuilder,
974) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +0100975 let key_metadata = sl
976 .binder
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000977 .importKey(
978 &KeyDescriptor { domain, nspace, alias, blob: None },
979 None,
980 &import_params,
981 0,
982 EC_P_256_KEY,
983 )
984 .unwrap();
985
986 assert!(key_metadata.certificate.is_some());
987 assert!(key_metadata.certificateChain.is_none());
988
David Drysdale79092242024-06-18 13:13:43 +0100989 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000990
991 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000992 assert!(check_key_param(
993 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000994 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::EC) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000995 ));
996
997 assert!(check_key_param(
998 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000999 &KeyParameter { tag: Tag::EC_CURVE, value: KeyParameterValue::EcCurve(EcCurve::P_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001000 ));
1001
1002 assert!(check_key_param(
1003 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001004 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001005 ));
1006 assert!(check_key_param(
1007 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001008 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001009 ));
1010
1011 Ok(key_metadata)
1012}
1013
1014/// Import sample AES key and validate its key parameters.
1015pub fn import_aes_key(
David Drysdale79092242024-06-18 13:13:43 +01001016 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001017 domain: Domain,
1018 nspace: i64,
1019 alias: Option<String>,
1020) -> binder::Result<KeyMetadata> {
1021 static AES_KEY: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
1022 let key_size = AES_KEY.len() * 8;
1023
1024 let import_params = AuthSetBuilder::new()
1025 .no_auth_required()
1026 .algorithm(Algorithm::AES)
1027 .block_mode(BlockMode::ECB)
1028 .key_size(key_size.try_into().unwrap())
1029 .purpose(KeyPurpose::ENCRYPT)
1030 .purpose(KeyPurpose::DECRYPT)
1031 .padding_mode(PaddingMode::PKCS7);
1032
David Drysdale79092242024-06-18 13:13:43 +01001033 let key_metadata = sl.binder.importKey(
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001034 &KeyDescriptor { domain, nspace, alias, blob: None },
1035 None,
1036 &import_params,
1037 0,
1038 AES_KEY,
1039 )?;
1040
David Drysdale79092242024-06-18 13:13:43 +01001041 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001042
1043 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001044 assert!(check_key_param(
1045 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001046 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::AES) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001047 ));
1048 assert!(check_key_param(
1049 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001050 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(128) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001051 ));
1052 assert!(check_key_param(
1053 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001054 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001055 tag: Tag::PADDING,
1056 value: KeyParameterValue::PaddingMode(PaddingMode::PKCS7)
1057 }
1058 ));
1059 assert!(check_key_param(
1060 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001061 &KeyParameter { tag: Tag::BLOCK_MODE, value: KeyParameterValue::BlockMode(BlockMode::ECB) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001062 ));
1063 assert!(check_key_param(
1064 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001065 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001066 ));
1067
1068 Ok(key_metadata)
1069}
1070
1071/// Import sample 3DES key and validate its key parameters.
1072pub fn import_3des_key(
David Drysdale79092242024-06-18 13:13:43 +01001073 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001074 domain: Domain,
1075 nspace: i64,
1076 alias: Option<String>,
1077) -> binder::Result<KeyMetadata> {
1078 static TRIPLE_DES_KEY: &[u8] = &[
1079 0xa4, 0x9d, 0x75, 0x64, 0x19, 0x9e, 0x97, 0xcb, 0x52, 0x9d, 0x2c, 0x9d, 0x97, 0xbf, 0x2f,
1080 0x98, 0xd3, 0x5e, 0xdf, 0x57, 0xba, 0x1f, 0x73, 0x58,
1081 ];
1082
1083 let import_params = AuthSetBuilder::new()
1084 .no_auth_required()
1085 .algorithm(Algorithm::TRIPLE_DES)
1086 .block_mode(BlockMode::ECB)
1087 .key_size(168)
1088 .purpose(KeyPurpose::ENCRYPT)
1089 .purpose(KeyPurpose::DECRYPT)
1090 .padding_mode(PaddingMode::PKCS7);
1091
David Drysdale79092242024-06-18 13:13:43 +01001092 let key_metadata = sl.binder.importKey(
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001093 &KeyDescriptor { domain, nspace, alias, blob: None },
1094 None,
1095 &import_params,
1096 0,
1097 TRIPLE_DES_KEY,
1098 )?;
1099
David Drysdale79092242024-06-18 13:13:43 +01001100 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001101
1102 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001103 assert!(check_key_param(
1104 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001105 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001106 tag: Tag::ALGORITHM,
1107 value: KeyParameterValue::Algorithm(Algorithm::TRIPLE_DES)
1108 }
1109 ));
1110 assert!(check_key_param(
1111 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001112 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(168) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001113 ));
1114 assert!(check_key_param(
1115 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001116 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001117 tag: Tag::PADDING,
1118 value: KeyParameterValue::PaddingMode(PaddingMode::PKCS7)
1119 }
1120 ));
1121 assert!(check_key_param(
1122 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001123 &KeyParameter { tag: Tag::BLOCK_MODE, value: KeyParameterValue::BlockMode(BlockMode::ECB) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001124 ));
1125 assert!(check_key_param(
1126 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001127 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001128 ));
1129
1130 Ok(key_metadata)
1131}
1132
1133/// Import sample HMAC key and validate its key parameters.
1134pub fn import_hmac_key(
David Drysdale79092242024-06-18 13:13:43 +01001135 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001136 domain: Domain,
1137 nspace: i64,
1138 alias: Option<String>,
1139) -> binder::Result<KeyMetadata> {
1140 static HMAC_KEY: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
1141 let key_size = HMAC_KEY.len() * 8;
1142
1143 let import_params = AuthSetBuilder::new()
1144 .no_auth_required()
1145 .algorithm(Algorithm::HMAC)
1146 .key_size(key_size.try_into().unwrap())
1147 .purpose(KeyPurpose::SIGN)
1148 .purpose(KeyPurpose::VERIFY)
1149 .digest(Digest::SHA_2_256)
1150 .min_mac_length(256);
1151
David Drysdale79092242024-06-18 13:13:43 +01001152 let key_metadata = sl.binder.importKey(
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001153 &KeyDescriptor { domain, nspace, alias, blob: None },
1154 None,
1155 &import_params,
1156 0,
1157 HMAC_KEY,
1158 )?;
1159
David Drysdale79092242024-06-18 13:13:43 +01001160 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001161
1162 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001163 assert!(check_key_param(
1164 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001165 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::HMAC) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001166 ));
1167 assert!(check_key_param(
1168 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001169 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(128) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001170 ));
1171 assert!(check_key_param(
1172 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001173 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001174 ));
1175 assert!(check_key_param(
1176 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001177 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001178 ));
1179
1180 Ok(key_metadata)
1181}
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001182
1183/// Imports RSA encryption key with WRAP_KEY purpose.
1184pub fn import_wrapping_key(
David Drysdale79092242024-06-18 13:13:43 +01001185 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001186 wrapping_key_data: &[u8],
1187 wrapping_key_alias: Option<String>,
1188) -> binder::Result<KeyMetadata> {
1189 let wrapping_key_params = AuthSetBuilder::new()
1190 .no_auth_required()
1191 .algorithm(Algorithm::RSA)
1192 .digest(Digest::SHA_2_256)
1193 .purpose(KeyPurpose::ENCRYPT)
1194 .purpose(KeyPurpose::DECRYPT)
1195 .purpose(KeyPurpose::WRAP_KEY)
1196 .padding_mode(PaddingMode::RSA_OAEP)
1197 .key_size(2048)
1198 .rsa_public_exponent(65537)
1199 .cert_not_before(0)
1200 .cert_not_after(253402300799000);
1201
David Drysdale79092242024-06-18 13:13:43 +01001202 sl.binder.importKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001203 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias: wrapping_key_alias, blob: None },
1204 None,
1205 &wrapping_key_params,
1206 0,
1207 wrapping_key_data,
1208 )
1209}
1210
1211/// Import wrapped key using given wrapping key.
1212pub fn import_wrapped_key(
David Drysdale79092242024-06-18 13:13:43 +01001213 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001214 alias: Option<String>,
1215 wrapping_key_metadata: &KeyMetadata,
1216 wrapped_key: Option<Vec<u8>>,
1217) -> binder::Result<KeyMetadata> {
1218 let unwrap_params =
1219 AuthSetBuilder::new().digest(Digest::SHA_2_256).padding_mode(PaddingMode::RSA_OAEP);
1220
1221 let authenticator_spec: &[AuthenticatorSpec] = &[AuthenticatorSpec {
1222 authenticatorType: HardwareAuthenticatorType::NONE,
1223 authenticatorId: 0,
1224 }];
1225
David Drysdale79092242024-06-18 13:13:43 +01001226 let key_metadata = sl.binder.importWrappedKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001227 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: wrapped_key },
1228 &wrapping_key_metadata.key,
1229 None,
1230 &unwrap_params,
1231 authenticator_spec,
1232 )?;
1233
1234 Ok(key_metadata)
1235}
1236
1237/// Import wrapping key and then import wrapped key using wrapping key.
1238pub fn import_wrapping_key_and_wrapped_key(
David Drysdale79092242024-06-18 13:13:43 +01001239 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001240 domain: Domain,
1241 nspace: i64,
1242 alias: Option<String>,
1243 wrapping_key_alias: Option<String>,
1244 wrapping_key_params: AuthSetBuilder,
1245) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +01001246 let wrapping_key_metadata = sl.binder.importKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001247 &KeyDescriptor { domain, nspace, alias: wrapping_key_alias, blob: None },
1248 None,
1249 &wrapping_key_params,
1250 0,
1251 WRAPPING_KEY,
1252 )?;
1253
David Drysdale79092242024-06-18 13:13:43 +01001254 import_wrapped_key(sl, alias, &wrapping_key_metadata, Some(WRAPPED_KEY.to_vec()))
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001255}
1256
1257/// Import given key material as AES-256-GCM-NONE transport key.
1258pub fn import_transport_key(
David Drysdale79092242024-06-18 13:13:43 +01001259 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001260 transport_key_alias: Option<String>,
1261 transport_key: &[u8],
1262) -> binder::Result<KeyMetadata> {
1263 let transport_key_params = AuthSetBuilder::new()
1264 .no_auth_required()
1265 .algorithm(Algorithm::AES)
1266 .block_mode(BlockMode::GCM)
1267 .padding_mode(PaddingMode::NONE)
1268 .key_size(256)
1269 .caller_nonce()
1270 .min_mac_length(128)
1271 .purpose(KeyPurpose::ENCRYPT)
1272 .purpose(KeyPurpose::DECRYPT);
1273
David Drysdale79092242024-06-18 13:13:43 +01001274 sl.binder.importKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001275 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias: transport_key_alias, blob: None },
1276 None,
1277 &transport_key_params,
1278 0,
1279 transport_key,
1280 )
1281}
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001282
1283/// Generate EC key with purpose AGREE_KEY.
1284pub fn generate_ec_agree_key(
David Drysdale79092242024-06-18 13:13:43 +01001285 sl: &SecLevel,
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001286 ec_curve: EcCurve,
1287 digest: Digest,
1288 domain: Domain,
1289 nspace: i64,
1290 alias: Option<String>,
1291) -> binder::Result<KeyMetadata> {
1292 let gen_params = AuthSetBuilder::new()
1293 .no_auth_required()
1294 .algorithm(Algorithm::EC)
1295 .purpose(KeyPurpose::AGREE_KEY)
1296 .digest(digest)
1297 .ec_curve(ec_curve);
1298
David Drysdale79092242024-06-18 13:13:43 +01001299 match sl.binder.generateKey(
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001300 &KeyDescriptor { domain, nspace, alias, blob: None },
1301 None,
1302 &gen_params,
1303 0,
1304 b"entropy",
1305 ) {
1306 Ok(key_metadata) => {
1307 assert!(key_metadata.certificate.is_some());
1308 if domain == Domain::BLOB {
1309 assert!(key_metadata.key.blob.is_some());
1310 }
1311
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001312 check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +01001313 sl,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001314 &key_metadata.authorizations,
1315 &gen_params,
1316 KeyOrigin::GENERATED,
1317 );
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001318 Ok(key_metadata)
1319 }
1320 Err(e) => Err(e),
1321 }
1322}
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001323
1324/// Helper method to import AES keys `total_count` of times.
1325pub fn import_aes_keys(
David Drysdale79092242024-06-18 13:13:43 +01001326 sl: &SecLevel,
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001327 alias_prefix: String,
1328 total_count: Range<i32>,
1329) -> binder::Result<HashSet<String>> {
1330 let mut imported_key_aliases = HashSet::new();
1331
1332 // Import Total number of keys with given alias prefix.
1333 for count in total_count {
1334 let mut alias = String::new();
1335 write!(alias, "{}_{}", alias_prefix, count).unwrap();
1336 imported_key_aliases.insert(alias.clone());
1337
David Drysdale79092242024-06-18 13:13:43 +01001338 import_aes_key(sl, Domain::APP, -1, Some(alias))?;
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001339 }
1340
1341 Ok(imported_key_aliases)
1342}
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001343
1344/// Generate attested EC-P_256 key with device id attestation.
1345pub fn generate_key_with_attest_id(
David Drysdale79092242024-06-18 13:13:43 +01001346 sl: &SecLevel,
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001347 algorithm: Algorithm,
1348 alias: Option<String>,
1349 att_challenge: &[u8],
1350 attest_key: &KeyDescriptor,
1351 attest_id: Tag,
1352 value: Vec<u8>,
1353) -> binder::Result<KeyMetadata> {
1354 assert!(algorithm == Algorithm::RSA || algorithm == Algorithm::EC);
1355
1356 let mut ec_gen_params;
1357 if algorithm == Algorithm::EC {
1358 ec_gen_params = AuthSetBuilder::new()
1359 .no_auth_required()
1360 .algorithm(Algorithm::EC)
1361 .purpose(KeyPurpose::SIGN)
1362 .purpose(KeyPurpose::VERIFY)
1363 .digest(Digest::SHA_2_256)
1364 .ec_curve(EcCurve::P_256)
1365 .attestation_challenge(att_challenge.to_vec());
1366 } else {
1367 ec_gen_params = AuthSetBuilder::new()
1368 .no_auth_required()
1369 .algorithm(Algorithm::RSA)
1370 .rsa_public_exponent(65537)
1371 .key_size(2048)
1372 .purpose(KeyPurpose::SIGN)
1373 .purpose(KeyPurpose::VERIFY)
1374 .digest(Digest::SHA_2_256)
1375 .padding_mode(PaddingMode::RSA_PKCS1_1_5_SIGN)
1376 .attestation_challenge(att_challenge.to_vec());
1377 }
1378
1379 match attest_id {
1380 Tag::ATTESTATION_ID_BRAND => {
1381 ec_gen_params = ec_gen_params.attestation_device_brand(value);
1382 }
1383 Tag::ATTESTATION_ID_DEVICE => {
1384 ec_gen_params = ec_gen_params.attestation_device_name(value);
1385 }
1386 Tag::ATTESTATION_ID_PRODUCT => {
1387 ec_gen_params = ec_gen_params.attestation_device_product_name(value);
1388 }
1389 Tag::ATTESTATION_ID_SERIAL => {
1390 ec_gen_params = ec_gen_params.attestation_device_serial(value);
1391 }
1392 Tag::ATTESTATION_ID_MANUFACTURER => {
1393 ec_gen_params = ec_gen_params.attestation_device_manufacturer(value);
1394 }
1395 Tag::ATTESTATION_ID_MODEL => {
1396 ec_gen_params = ec_gen_params.attestation_device_model(value);
1397 }
1398 Tag::ATTESTATION_ID_IMEI => {
1399 ec_gen_params = ec_gen_params.attestation_device_imei(value);
1400 }
1401 Tag::ATTESTATION_ID_SECOND_IMEI => {
1402 ec_gen_params = ec_gen_params.attestation_device_second_imei(value);
1403 }
1404 _ => {
1405 panic!("Unknown attestation id");
1406 }
1407 }
1408
David Drysdale79092242024-06-18 13:13:43 +01001409 sl.binder.generateKey(
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001410 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: None },
1411 Some(attest_key),
1412 &ec_gen_params,
1413 0,
1414 b"entropy",
1415 )
1416}
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001417
1418/// Generate Key and validate key characteristics.
1419pub fn generate_key(
David Drysdale79092242024-06-18 13:13:43 +01001420 sl: &SecLevel,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001421 gen_params: &AuthSetBuilder,
1422 alias: &str,
1423) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +01001424 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001425 &KeyDescriptor {
1426 domain: Domain::APP,
1427 nspace: -1,
1428 alias: Some(alias.to_string()),
1429 blob: None,
1430 },
1431 None,
1432 gen_params,
1433 0,
1434 b"entropy",
1435 )?;
1436
1437 if gen_params.iter().any(|kp| {
1438 matches!(
1439 kp.value,
1440 KeyParameterValue::Algorithm(Algorithm::RSA)
1441 | KeyParameterValue::Algorithm(Algorithm::EC)
1442 )
1443 }) {
1444 assert!(key_metadata.certificate.is_some());
1445 if gen_params.iter().any(|kp| kp.tag == Tag::ATTESTATION_CHALLENGE) {
1446 assert!(key_metadata.certificateChain.is_some());
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +00001447 let mut cert_chain: Vec<u8> = Vec::new();
1448 cert_chain.extend(key_metadata.certificate.as_ref().unwrap());
1449 cert_chain.extend(key_metadata.certificateChain.as_ref().unwrap());
Rajesh Nyamagoudb1c8e832023-06-06 01:39:44 +00001450 let strict_issuer_check =
1451 !(gen_params.iter().any(|kp| kp.tag == Tag::DEVICE_UNIQUE_ATTESTATION));
1452 validate_certchain_with_strict_issuer_check(&cert_chain, strict_issuer_check)
1453 .expect("Error while validating cert chain");
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +00001454 }
1455
1456 if let Some(challenge_param) =
1457 gen_params.iter().find(|kp| kp.tag == Tag::ATTESTATION_CHALLENGE)
1458 {
1459 if let KeyParameterValue::Blob(val) = &challenge_param.value {
1460 let att_challenge = get_value_from_attest_record(
1461 key_metadata.certificate.as_ref().unwrap(),
1462 challenge_param.tag,
1463 key_metadata.keySecurityLevel,
1464 )
1465 .expect("Attestation challenge verification failed.");
1466 assert_eq!(&att_challenge, val);
1467 }
1468
1469 let att_app_id = get_value_from_attest_record(
1470 key_metadata.certificate.as_ref().unwrap(),
1471 Tag::ATTESTATION_APPLICATION_ID,
1472 SecurityLevel::KEYSTORE,
1473 )
1474 .expect("Attestation application id verification failed.");
1475 assert!(!att_app_id.is_empty());
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001476 }
1477 }
David Drysdale79092242024-06-18 13:13:43 +01001478 check_key_authorizations(sl, &key_metadata.authorizations, gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001479
1480 Ok(key_metadata)
1481}
1482
1483/// Generate a key using given authorizations and create an operation using the generated key.
1484pub fn create_key_and_operation(
David Drysdale79092242024-06-18 13:13:43 +01001485 sl: &SecLevel,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001486 gen_params: &AuthSetBuilder,
1487 op_params: &AuthSetBuilder,
1488 alias: &str,
1489) -> binder::Result<CreateOperationResponse> {
David Drysdale79092242024-06-18 13:13:43 +01001490 let key_metadata = generate_key(sl, gen_params, alias)?;
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001491
David Drysdale79092242024-06-18 13:13:43 +01001492 sl.binder.createOperation(&key_metadata.key, op_params, false)
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001493}