blob: c845332d6baf6c4523536270c7d52b96666097b8 [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
David Drysdale83153592024-07-16 10:25:08 +0100426 // `Tag::RSA_OAEP_MGF_DIGEST` was added in KeyMint 1.0, but the KeyMint VTS tests didn't
427 // originally check for its presence and so some implementations of early versions (< 3) of
428 // the KeyMint HAL don't include it (cf. b/297306437 and aosp/2758513).
429 //
430 // Given that Keymaster implementations will also omit this tag, skip the check for it
431 // altogether (and rely on the updated KeyMint VTS tests to ensure that up-level KeyMint
432 // implementations correctly populate this tag).
433 if matches!(key_param.tag, Tag::RSA_OAEP_MGF_DIGEST) {
434 return true;
435 }
436
David Drysdale79092242024-06-18 13:13:43 +0100437 if sl.is_keymaster() {
David Drysdale83153592024-07-16 10:25:08 +0100438 // `Tag::USAGE_COUNT_LIMIT` was added in KeyMint 1.0, so don't check for it if the
439 // underlying device is a Keymaster implementation.
440 if matches!(key_param.tag, Tag::USAGE_COUNT_LIMIT) {
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000441 return true;
442 }
David Drysdale83153592024-07-16 10:25:08 +0100443 // `KeyPurpose::ATTEST_KEY` was added in KeyMint 1.0, so don't check for it if the
444 // underlying device is a Keymaster implementation.
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000445 if key_param.tag == Tag::PURPOSE
446 && key_param.value == KeyParameterValue::KeyPurpose(KeyPurpose::ATTEST_KEY)
447 {
448 return true;
449 }
450 }
451
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000452 if ALLOWED_TAGS_IN_KEY_AUTHS.contains(&key_param.tag) {
453 assert!(
454 check_key_param(authorizations, key_param),
455 "Key parameter not found: {:#?}",
456 key_param
457 );
458 }
459 true
460 });
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000461
David Drysdale79092242024-06-18 13:13:43 +0100462 check_common_auths(sl, authorizations, expected_key_origin);
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000463}
464
465/// Verify common key authorizations.
David Drysdale79092242024-06-18 13:13:43 +0100466fn check_common_auths(
467 sl: &SecLevel,
468 authorizations: &[Authorization],
469 expected_key_origin: KeyOrigin,
470) {
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000471 assert!(check_key_param(
472 authorizations,
473 &KeyParameter {
474 tag: Tag::OS_VERSION,
475 value: KeyParameterValue::Integer(get_os_version().try_into().unwrap())
476 }
477 ));
478 assert!(check_key_param(
479 authorizations,
480 &KeyParameter {
481 tag: Tag::OS_PATCHLEVEL,
482 value: KeyParameterValue::Integer(get_os_patchlevel().try_into().unwrap())
483 }
484 ));
485
486 // Access denied for finding vendor-patch-level ("ro.vendor.build.security_patch") property
487 // in a test running with `untrusted_app` context. Keeping this check to verify
488 // vendor-patch-level in tests running with `su` context.
489 if getuid().is_root() {
490 assert!(check_key_param(
491 authorizations,
492 &KeyParameter {
493 tag: Tag::VENDOR_PATCHLEVEL,
494 value: KeyParameterValue::Integer(get_vendor_patchlevel().try_into().unwrap())
495 }
496 ));
497 }
498 assert!(check_key_param(
499 authorizations,
500 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(expected_key_origin) }
501 ));
502 assert!(check_key_param(
503 authorizations,
504 &KeyParameter {
505 tag: Tag::USER_ID,
506 value: KeyParameterValue::Integer(
507 rustutils::users::multiuser_get_user_id(ThreadState::get_calling_uid())
508 .try_into()
509 .unwrap()
510 )
511 }
512 ));
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +0000513
David Drysdale79092242024-06-18 13:13:43 +0100514 if sl.is_keymint() {
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +0000515 assert!(authorizations
516 .iter()
517 .map(|auth| &auth.keyParameter)
518 .any(|key_param| key_param.tag == Tag::CREATION_DATETIME));
519 }
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000520}
521
Rajesh Nyamagoudf436a932023-05-12 01:16:07 +0000522/// Get the key `Authorization` for the given auth `Tag`.
523pub fn get_key_auth(authorizations: &[Authorization], tag: Tag) -> Option<&Authorization> {
524 let auths: Vec<&Authorization> =
525 authorizations.iter().filter(|auth| auth.keyParameter.tag == tag).collect();
526
527 if !auths.is_empty() {
528 Some(auths[0])
529 } else {
530 None
531 }
532}
533
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000534/// Generate EC Key using given security level and domain with below key parameters and
535/// optionally allow the generated key to be attested with factory provisioned attest key using
536/// given challenge and application id -
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000537/// Purposes: SIGN and VERIFY
538/// Digest: SHA_2_256
539/// Curve: P_256
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000540pub fn generate_ec_p256_signing_key(
David Drysdale79092242024-06-18 13:13:43 +0100541 sl: &SecLevel,
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000542 domain: Domain,
543 nspace: i64,
544 alias: Option<String>,
545 att_challenge: Option<&[u8]>,
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000546) -> binder::Result<KeyMetadata> {
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000547 let mut key_attest = false;
548 let mut gen_params = AuthSetBuilder::new()
Rajesh Nyamagoudc7d064d2022-08-20 01:45:17 +0000549 .no_auth_required()
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000550 .algorithm(Algorithm::EC)
551 .purpose(KeyPurpose::SIGN)
552 .purpose(KeyPurpose::VERIFY)
553 .digest(Digest::SHA_2_256)
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000554 .ec_curve(EcCurve::P_256);
555
556 if let Some(challenge) = att_challenge {
557 key_attest = true;
558 gen_params = gen_params.clone().attestation_challenge(challenge.to_vec());
559 }
560
David Drysdale79092242024-06-18 13:13:43 +0100561 match sl.binder.generateKey(
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000562 &KeyDescriptor { domain, nspace, alias, blob: None },
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000563 None,
564 &gen_params,
565 0,
566 b"entropy",
567 ) {
568 Ok(key_metadata) => {
569 assert!(key_metadata.certificate.is_some());
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000570 if key_attest {
571 assert!(key_metadata.certificateChain.is_some());
572 }
573 if domain == Domain::BLOB {
574 assert!(key_metadata.key.blob.is_some());
575 }
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000576
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000577 check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +0100578 sl,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000579 &key_metadata.authorizations,
580 &gen_params,
581 KeyOrigin::GENERATED,
582 );
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000583 Ok(key_metadata)
584 }
585 Err(e) => Err(e),
586 }
587}
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000588
589/// Generate EC signing key.
Rajesh Nyamagoudc7d064d2022-08-20 01:45:17 +0000590pub fn generate_ec_key(
David Drysdale79092242024-06-18 13:13:43 +0100591 sl: &SecLevel,
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000592 domain: Domain,
593 nspace: i64,
594 alias: Option<String>,
595 ec_curve: EcCurve,
596 digest: Digest,
597) -> binder::Result<KeyMetadata> {
598 let gen_params = AuthSetBuilder::new()
599 .no_auth_required()
600 .algorithm(Algorithm::EC)
601 .purpose(KeyPurpose::SIGN)
602 .purpose(KeyPurpose::VERIFY)
603 .digest(digest)
604 .ec_curve(ec_curve);
605
David Drysdale79092242024-06-18 13:13:43 +0100606 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000607 &KeyDescriptor { domain, nspace, alias, blob: None },
608 None,
609 &gen_params,
610 0,
611 b"entropy",
612 )?;
613
614 // Must have a public key.
615 assert!(key_metadata.certificate.is_some());
616
617 // Should not have an attestation record.
618 assert!(key_metadata.certificateChain.is_none());
619
620 if domain == Domain::BLOB {
621 assert!(key_metadata.key.blob.is_some());
622 } else {
623 assert!(key_metadata.key.blob.is_none());
624 }
David Drysdale79092242024-06-18 13:13:43 +0100625 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000626 Ok(key_metadata)
627}
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000628
629/// Generate a RSA key with the given key parameters, alias, domain and namespace.
630pub fn generate_rsa_key(
David Drysdale79092242024-06-18 13:13:43 +0100631 sl: &SecLevel,
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000632 domain: Domain,
633 nspace: i64,
634 alias: Option<String>,
635 key_params: &KeyParams,
636 attest_key: Option<&KeyDescriptor>,
637) -> binder::Result<KeyMetadata> {
638 let mut gen_params = AuthSetBuilder::new()
639 .no_auth_required()
640 .algorithm(Algorithm::RSA)
641 .rsa_public_exponent(65537)
642 .key_size(key_params.key_size);
643
644 for purpose in &key_params.purpose {
645 gen_params = gen_params.purpose(*purpose);
646 }
647 if let Some(value) = key_params.digest {
648 gen_params = gen_params.digest(value)
649 }
650 if let Some(value) = key_params.padding {
651 gen_params = gen_params.padding_mode(value);
652 }
653 if let Some(value) = key_params.mgf_digest {
654 gen_params = gen_params.mgf_digest(value);
655 }
656 if let Some(value) = key_params.block_mode {
657 gen_params = gen_params.block_mode(value)
658 }
659 if let Some(value) = &key_params.att_challenge {
660 gen_params = gen_params.attestation_challenge(value.to_vec())
661 }
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000662
David Drysdale79092242024-06-18 13:13:43 +0100663 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000664 &KeyDescriptor { domain, nspace, alias, blob: None },
665 attest_key,
666 &gen_params,
667 0,
668 b"entropy",
669 )?;
670
671 // Must have a public key.
672 assert!(key_metadata.certificate.is_some());
673
David Drysdale38f2ca32023-01-10 13:10:51 +0000674 if attest_key.is_none() && key_params.att_challenge.is_some() {
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000675 // Should have an attestation record.
676 assert!(key_metadata.certificateChain.is_some());
677 } else {
678 // Should not have an attestation record.
679 assert!(key_metadata.certificateChain.is_none());
680 }
681
682 assert!(
683 (domain == Domain::BLOB && key_metadata.key.blob.is_some())
684 || key_metadata.key.blob.is_none()
685 );
686
David Drysdale79092242024-06-18 13:13:43 +0100687 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000688 // If `RSA_OAEP_MGF_DIGEST` tag is not mentioned explicitly while generating/importing a key,
689 // then make sure `RSA_OAEP_MGF_DIGEST` tag with default value (SHA1) must not be included in
690 // key authorization list.
691 if key_params.mgf_digest.is_none() {
692 assert!(!check_key_param(
693 &key_metadata.authorizations,
694 &KeyParameter {
695 tag: Tag::RSA_OAEP_MGF_DIGEST,
696 value: KeyParameterValue::Digest(Digest::SHA1)
697 }
698 ));
699 }
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000700 Ok(key_metadata)
701}
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000702
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000703/// Generate AES/3DES key.
704pub fn generate_sym_key(
David Drysdale79092242024-06-18 13:13:43 +0100705 sl: &SecLevel,
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000706 algorithm: Algorithm,
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000707 size: i32,
708 alias: &str,
709 padding_mode: &PaddingMode,
710 block_mode: &BlockMode,
711 min_mac_len: Option<i32>,
712) -> binder::Result<KeyMetadata> {
713 let mut gen_params = AuthSetBuilder::new()
714 .no_auth_required()
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000715 .algorithm(algorithm)
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000716 .purpose(KeyPurpose::ENCRYPT)
717 .purpose(KeyPurpose::DECRYPT)
718 .key_size(size)
719 .padding_mode(*padding_mode)
720 .block_mode(*block_mode);
721
722 if let Some(val) = min_mac_len {
723 gen_params = gen_params.min_mac_length(val);
724 }
725
David Drysdale79092242024-06-18 13:13:43 +0100726 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000727 &KeyDescriptor {
728 domain: Domain::APP,
729 nspace: -1,
730 alias: Some(alias.to_string()),
731 blob: None,
732 },
733 None,
734 &gen_params,
735 0,
736 b"entropy",
737 )?;
738
739 // Should not have public certificate.
740 assert!(key_metadata.certificate.is_none());
741
742 // Should not have an attestation record.
743 assert!(key_metadata.certificateChain.is_none());
David Drysdale79092242024-06-18 13:13:43 +0100744 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000745 Ok(key_metadata)
746}
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000747
748/// Generate HMAC key.
749pub fn generate_hmac_key(
David Drysdale79092242024-06-18 13:13:43 +0100750 sl: &SecLevel,
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000751 alias: &str,
752 key_size: i32,
753 min_mac_len: i32,
754 digest: Digest,
755) -> binder::Result<KeyMetadata> {
756 let gen_params = AuthSetBuilder::new()
757 .no_auth_required()
758 .algorithm(Algorithm::HMAC)
759 .purpose(KeyPurpose::SIGN)
760 .purpose(KeyPurpose::VERIFY)
761 .key_size(key_size)
762 .min_mac_length(min_mac_len)
763 .digest(digest);
764
David Drysdale79092242024-06-18 13:13:43 +0100765 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000766 &KeyDescriptor {
767 domain: Domain::APP,
768 nspace: -1,
769 alias: Some(alias.to_string()),
770 blob: None,
771 },
772 None,
773 &gen_params,
774 0,
775 b"entropy",
776 )?;
777
778 // Should not have public certificate.
779 assert!(key_metadata.certificate.is_none());
780
781 // Should not have an attestation record.
782 assert!(key_metadata.certificateChain.is_none());
783
David Drysdale79092242024-06-18 13:13:43 +0100784 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000785 Ok(key_metadata)
786}
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000787
788/// Generate RSA or EC attestation keys using below parameters -
789/// Purpose: ATTEST_KEY
790/// Digest: Digest::SHA_2_256
791/// Padding: PaddingMode::RSA_PKCS1_1_5_SIGN
792/// RSA-Key-Size: 2048
793/// EC-Curve: EcCurve::P_256
794pub fn generate_attestation_key(
David Drysdale79092242024-06-18 13:13:43 +0100795 sl: &SecLevel,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000796 algorithm: Algorithm,
797 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000798) -> binder::Result<KeyMetadata> {
799 assert!(algorithm == Algorithm::RSA || algorithm == Algorithm::EC);
800
801 if algorithm == Algorithm::RSA {
802 let alias = "ks_rsa_attest_test_key";
803 let metadata = generate_rsa_key(
David Drysdale79092242024-06-18 13:13:43 +0100804 sl,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000805 Domain::APP,
806 -1,
807 Some(alias.to_string()),
808 &KeyParams {
809 key_size: 2048,
810 purpose: vec![KeyPurpose::ATTEST_KEY],
811 padding: Some(PaddingMode::RSA_PKCS1_1_5_SIGN),
812 digest: Some(Digest::SHA_2_256),
813 mgf_digest: None,
814 block_mode: None,
815 att_challenge: Some(att_challenge.to_vec()),
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000816 },
817 None,
818 )
819 .unwrap();
820 Ok(metadata)
821 } else {
David Drysdale79092242024-06-18 13:13:43 +0100822 let metadata =
823 generate_ec_attestation_key(sl, att_challenge, Digest::SHA_2_256, EcCurve::P_256)
824 .unwrap();
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000825
826 Ok(metadata)
827 }
828}
829
830/// Generate EC attestation key with the given
831/// curve, attestation-challenge and attestation-app-id.
832pub fn generate_ec_attestation_key(
David Drysdale79092242024-06-18 13:13:43 +0100833 sl: &SecLevel,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000834 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000835 digest: Digest,
836 ec_curve: EcCurve,
837) -> binder::Result<KeyMetadata> {
838 let alias = "ks_attest_ec_test_key";
839 let gen_params = AuthSetBuilder::new()
840 .no_auth_required()
841 .algorithm(Algorithm::EC)
842 .purpose(KeyPurpose::ATTEST_KEY)
843 .ec_curve(ec_curve)
844 .digest(digest)
David Drysdale38f2ca32023-01-10 13:10:51 +0000845 .attestation_challenge(att_challenge.to_vec());
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000846
David Drysdale79092242024-06-18 13:13:43 +0100847 let attestation_key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000848 &KeyDescriptor {
849 domain: Domain::APP,
850 nspace: -1,
851 alias: Some(alias.to_string()),
852 blob: None,
853 },
854 None,
855 &gen_params,
856 0,
857 b"entropy",
858 )?;
859
860 // Should have public certificate.
861 assert!(attestation_key_metadata.certificate.is_some());
862 // Should have an attestation record.
863 assert!(attestation_key_metadata.certificateChain.is_some());
864
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000865 check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +0100866 sl,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000867 &attestation_key_metadata.authorizations,
868 &gen_params,
869 KeyOrigin::GENERATED,
870 );
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000871 Ok(attestation_key_metadata)
872}
873
874/// Generate EC-P-256 key and attest it with given attestation key.
875pub fn generate_ec_256_attested_key(
David Drysdale79092242024-06-18 13:13:43 +0100876 sl: &SecLevel,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000877 alias: Option<String>,
878 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000879 attest_key: &KeyDescriptor,
880) -> binder::Result<KeyMetadata> {
881 let ec_gen_params = AuthSetBuilder::new()
882 .no_auth_required()
883 .algorithm(Algorithm::EC)
884 .purpose(KeyPurpose::SIGN)
885 .purpose(KeyPurpose::VERIFY)
886 .digest(Digest::SHA_2_256)
887 .ec_curve(EcCurve::P_256)
David Drysdale38f2ca32023-01-10 13:10:51 +0000888 .attestation_challenge(att_challenge.to_vec());
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000889
David Drysdale79092242024-06-18 13:13:43 +0100890 let ec_key_metadata = sl
891 .binder
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000892 .generateKey(
893 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: None },
894 Some(attest_key),
895 &ec_gen_params,
896 0,
897 b"entropy",
898 )
899 .unwrap();
900
901 // Should have public certificate.
902 assert!(ec_key_metadata.certificate.is_some());
903 // Shouldn't have an attestation record.
904 assert!(ec_key_metadata.certificateChain.is_none());
905
David Drysdale79092242024-06-18 13:13:43 +0100906 check_key_authorizations(
907 sl,
908 &ec_key_metadata.authorizations,
909 &ec_gen_params,
910 KeyOrigin::GENERATED,
911 );
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000912 Ok(ec_key_metadata)
913}
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000914
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000915/// Imports above defined RSA key - `RSA_2048_KEY` and validates imported key parameters.
916pub fn import_rsa_2048_key(
David Drysdale79092242024-06-18 13:13:43 +0100917 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000918 domain: Domain,
919 nspace: i64,
920 alias: Option<String>,
921 import_params: AuthSetBuilder,
922) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +0100923 let key_metadata = sl
924 .binder
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000925 .importKey(
926 &KeyDescriptor { domain, nspace, alias, blob: None },
927 None,
928 &import_params,
929 0,
930 RSA_2048_KEY,
931 )
932 .unwrap();
933
934 assert!(key_metadata.certificate.is_some());
935 assert!(key_metadata.certificateChain.is_none());
936
David Drysdale79092242024-06-18 13:13:43 +0100937 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000938
939 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000940 assert!(check_key_param(
941 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000942 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::RSA) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000943 ));
944
945 assert!(check_key_param(
946 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000947 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(2048) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000948 ));
949
950 assert!(check_key_param(
951 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000952 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000953 ));
954
955 assert!(check_key_param(
956 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000957 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000958 tag: Tag::RSA_PUBLIC_EXPONENT,
959 value: KeyParameterValue::LongInteger(65537)
960 }
961 ));
962
963 assert!(check_key_param(
964 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000965 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000966 tag: Tag::PADDING,
967 value: KeyParameterValue::PaddingMode(PaddingMode::RSA_PSS)
968 }
969 ));
970
971 assert!(check_key_param(
972 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000973 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000974 ));
975
976 Ok(key_metadata)
977}
978
979/// Imports above defined EC key - `EC_P_256_KEY` and validates imported key parameters.
980pub fn import_ec_p_256_key(
David Drysdale79092242024-06-18 13:13:43 +0100981 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000982 domain: Domain,
983 nspace: i64,
984 alias: Option<String>,
985 import_params: AuthSetBuilder,
986) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +0100987 let key_metadata = sl
988 .binder
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000989 .importKey(
990 &KeyDescriptor { domain, nspace, alias, blob: None },
991 None,
992 &import_params,
993 0,
994 EC_P_256_KEY,
995 )
996 .unwrap();
997
998 assert!(key_metadata.certificate.is_some());
999 assert!(key_metadata.certificateChain.is_none());
1000
David Drysdale79092242024-06-18 13:13:43 +01001001 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001002
1003 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001004 assert!(check_key_param(
1005 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001006 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::EC) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001007 ));
1008
1009 assert!(check_key_param(
1010 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001011 &KeyParameter { tag: Tag::EC_CURVE, value: KeyParameterValue::EcCurve(EcCurve::P_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001012 ));
1013
1014 assert!(check_key_param(
1015 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001016 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001017 ));
1018 assert!(check_key_param(
1019 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001020 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001021 ));
1022
1023 Ok(key_metadata)
1024}
1025
1026/// Import sample AES key and validate its key parameters.
1027pub fn import_aes_key(
David Drysdale79092242024-06-18 13:13:43 +01001028 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001029 domain: Domain,
1030 nspace: i64,
1031 alias: Option<String>,
1032) -> binder::Result<KeyMetadata> {
1033 static AES_KEY: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
1034 let key_size = AES_KEY.len() * 8;
1035
1036 let import_params = AuthSetBuilder::new()
1037 .no_auth_required()
1038 .algorithm(Algorithm::AES)
1039 .block_mode(BlockMode::ECB)
1040 .key_size(key_size.try_into().unwrap())
1041 .purpose(KeyPurpose::ENCRYPT)
1042 .purpose(KeyPurpose::DECRYPT)
1043 .padding_mode(PaddingMode::PKCS7);
1044
David Drysdale79092242024-06-18 13:13:43 +01001045 let key_metadata = sl.binder.importKey(
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001046 &KeyDescriptor { domain, nspace, alias, blob: None },
1047 None,
1048 &import_params,
1049 0,
1050 AES_KEY,
1051 )?;
1052
David Drysdale79092242024-06-18 13:13:43 +01001053 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001054
1055 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001056 assert!(check_key_param(
1057 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001058 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::AES) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001059 ));
1060 assert!(check_key_param(
1061 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001062 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(128) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001063 ));
1064 assert!(check_key_param(
1065 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001066 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001067 tag: Tag::PADDING,
1068 value: KeyParameterValue::PaddingMode(PaddingMode::PKCS7)
1069 }
1070 ));
1071 assert!(check_key_param(
1072 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001073 &KeyParameter { tag: Tag::BLOCK_MODE, value: KeyParameterValue::BlockMode(BlockMode::ECB) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001074 ));
1075 assert!(check_key_param(
1076 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001077 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001078 ));
1079
1080 Ok(key_metadata)
1081}
1082
1083/// Import sample 3DES key and validate its key parameters.
1084pub fn import_3des_key(
David Drysdale79092242024-06-18 13:13:43 +01001085 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001086 domain: Domain,
1087 nspace: i64,
1088 alias: Option<String>,
1089) -> binder::Result<KeyMetadata> {
1090 static TRIPLE_DES_KEY: &[u8] = &[
1091 0xa4, 0x9d, 0x75, 0x64, 0x19, 0x9e, 0x97, 0xcb, 0x52, 0x9d, 0x2c, 0x9d, 0x97, 0xbf, 0x2f,
1092 0x98, 0xd3, 0x5e, 0xdf, 0x57, 0xba, 0x1f, 0x73, 0x58,
1093 ];
1094
1095 let import_params = AuthSetBuilder::new()
1096 .no_auth_required()
1097 .algorithm(Algorithm::TRIPLE_DES)
1098 .block_mode(BlockMode::ECB)
1099 .key_size(168)
1100 .purpose(KeyPurpose::ENCRYPT)
1101 .purpose(KeyPurpose::DECRYPT)
1102 .padding_mode(PaddingMode::PKCS7);
1103
David Drysdale79092242024-06-18 13:13:43 +01001104 let key_metadata = sl.binder.importKey(
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001105 &KeyDescriptor { domain, nspace, alias, blob: None },
1106 None,
1107 &import_params,
1108 0,
1109 TRIPLE_DES_KEY,
1110 )?;
1111
David Drysdale79092242024-06-18 13:13:43 +01001112 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001113
1114 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001115 assert!(check_key_param(
1116 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001117 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001118 tag: Tag::ALGORITHM,
1119 value: KeyParameterValue::Algorithm(Algorithm::TRIPLE_DES)
1120 }
1121 ));
1122 assert!(check_key_param(
1123 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001124 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(168) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001125 ));
1126 assert!(check_key_param(
1127 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001128 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001129 tag: Tag::PADDING,
1130 value: KeyParameterValue::PaddingMode(PaddingMode::PKCS7)
1131 }
1132 ));
1133 assert!(check_key_param(
1134 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001135 &KeyParameter { tag: Tag::BLOCK_MODE, value: KeyParameterValue::BlockMode(BlockMode::ECB) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001136 ));
1137 assert!(check_key_param(
1138 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001139 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001140 ));
1141
1142 Ok(key_metadata)
1143}
1144
1145/// Import sample HMAC key and validate its key parameters.
1146pub fn import_hmac_key(
David Drysdale79092242024-06-18 13:13:43 +01001147 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001148 domain: Domain,
1149 nspace: i64,
1150 alias: Option<String>,
1151) -> binder::Result<KeyMetadata> {
1152 static HMAC_KEY: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
1153 let key_size = HMAC_KEY.len() * 8;
1154
1155 let import_params = AuthSetBuilder::new()
1156 .no_auth_required()
1157 .algorithm(Algorithm::HMAC)
1158 .key_size(key_size.try_into().unwrap())
1159 .purpose(KeyPurpose::SIGN)
1160 .purpose(KeyPurpose::VERIFY)
1161 .digest(Digest::SHA_2_256)
1162 .min_mac_length(256);
1163
David Drysdale79092242024-06-18 13:13:43 +01001164 let key_metadata = sl.binder.importKey(
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001165 &KeyDescriptor { domain, nspace, alias, blob: None },
1166 None,
1167 &import_params,
1168 0,
1169 HMAC_KEY,
1170 )?;
1171
David Drysdale79092242024-06-18 13:13:43 +01001172 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001173
1174 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001175 assert!(check_key_param(
1176 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001177 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::HMAC) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001178 ));
1179 assert!(check_key_param(
1180 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001181 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(128) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001182 ));
1183 assert!(check_key_param(
1184 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001185 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001186 ));
1187 assert!(check_key_param(
1188 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001189 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001190 ));
1191
1192 Ok(key_metadata)
1193}
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001194
1195/// Imports RSA encryption key with WRAP_KEY purpose.
1196pub fn import_wrapping_key(
David Drysdale79092242024-06-18 13:13:43 +01001197 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001198 wrapping_key_data: &[u8],
1199 wrapping_key_alias: Option<String>,
1200) -> binder::Result<KeyMetadata> {
1201 let wrapping_key_params = AuthSetBuilder::new()
1202 .no_auth_required()
1203 .algorithm(Algorithm::RSA)
1204 .digest(Digest::SHA_2_256)
1205 .purpose(KeyPurpose::ENCRYPT)
1206 .purpose(KeyPurpose::DECRYPT)
1207 .purpose(KeyPurpose::WRAP_KEY)
1208 .padding_mode(PaddingMode::RSA_OAEP)
1209 .key_size(2048)
1210 .rsa_public_exponent(65537)
1211 .cert_not_before(0)
1212 .cert_not_after(253402300799000);
1213
David Drysdale79092242024-06-18 13:13:43 +01001214 sl.binder.importKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001215 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias: wrapping_key_alias, blob: None },
1216 None,
1217 &wrapping_key_params,
1218 0,
1219 wrapping_key_data,
1220 )
1221}
1222
1223/// Import wrapped key using given wrapping key.
1224pub fn import_wrapped_key(
David Drysdale79092242024-06-18 13:13:43 +01001225 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001226 alias: Option<String>,
1227 wrapping_key_metadata: &KeyMetadata,
1228 wrapped_key: Option<Vec<u8>>,
1229) -> binder::Result<KeyMetadata> {
1230 let unwrap_params =
1231 AuthSetBuilder::new().digest(Digest::SHA_2_256).padding_mode(PaddingMode::RSA_OAEP);
1232
1233 let authenticator_spec: &[AuthenticatorSpec] = &[AuthenticatorSpec {
1234 authenticatorType: HardwareAuthenticatorType::NONE,
1235 authenticatorId: 0,
1236 }];
1237
David Drysdale79092242024-06-18 13:13:43 +01001238 let key_metadata = sl.binder.importWrappedKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001239 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: wrapped_key },
1240 &wrapping_key_metadata.key,
1241 None,
1242 &unwrap_params,
1243 authenticator_spec,
1244 )?;
1245
1246 Ok(key_metadata)
1247}
1248
1249/// Import wrapping key and then import wrapped key using wrapping key.
1250pub fn import_wrapping_key_and_wrapped_key(
David Drysdale79092242024-06-18 13:13:43 +01001251 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001252 domain: Domain,
1253 nspace: i64,
1254 alias: Option<String>,
1255 wrapping_key_alias: Option<String>,
1256 wrapping_key_params: AuthSetBuilder,
1257) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +01001258 let wrapping_key_metadata = sl.binder.importKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001259 &KeyDescriptor { domain, nspace, alias: wrapping_key_alias, blob: None },
1260 None,
1261 &wrapping_key_params,
1262 0,
1263 WRAPPING_KEY,
1264 )?;
1265
David Drysdale79092242024-06-18 13:13:43 +01001266 import_wrapped_key(sl, alias, &wrapping_key_metadata, Some(WRAPPED_KEY.to_vec()))
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001267}
1268
1269/// Import given key material as AES-256-GCM-NONE transport key.
1270pub fn import_transport_key(
David Drysdale79092242024-06-18 13:13:43 +01001271 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001272 transport_key_alias: Option<String>,
1273 transport_key: &[u8],
1274) -> binder::Result<KeyMetadata> {
1275 let transport_key_params = AuthSetBuilder::new()
1276 .no_auth_required()
1277 .algorithm(Algorithm::AES)
1278 .block_mode(BlockMode::GCM)
1279 .padding_mode(PaddingMode::NONE)
1280 .key_size(256)
1281 .caller_nonce()
1282 .min_mac_length(128)
1283 .purpose(KeyPurpose::ENCRYPT)
1284 .purpose(KeyPurpose::DECRYPT);
1285
David Drysdale79092242024-06-18 13:13:43 +01001286 sl.binder.importKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001287 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias: transport_key_alias, blob: None },
1288 None,
1289 &transport_key_params,
1290 0,
1291 transport_key,
1292 )
1293}
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001294
1295/// Generate EC key with purpose AGREE_KEY.
1296pub fn generate_ec_agree_key(
David Drysdale79092242024-06-18 13:13:43 +01001297 sl: &SecLevel,
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001298 ec_curve: EcCurve,
1299 digest: Digest,
1300 domain: Domain,
1301 nspace: i64,
1302 alias: Option<String>,
1303) -> binder::Result<KeyMetadata> {
1304 let gen_params = AuthSetBuilder::new()
1305 .no_auth_required()
1306 .algorithm(Algorithm::EC)
1307 .purpose(KeyPurpose::AGREE_KEY)
1308 .digest(digest)
1309 .ec_curve(ec_curve);
1310
David Drysdale79092242024-06-18 13:13:43 +01001311 match sl.binder.generateKey(
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001312 &KeyDescriptor { domain, nspace, alias, blob: None },
1313 None,
1314 &gen_params,
1315 0,
1316 b"entropy",
1317 ) {
1318 Ok(key_metadata) => {
1319 assert!(key_metadata.certificate.is_some());
1320 if domain == Domain::BLOB {
1321 assert!(key_metadata.key.blob.is_some());
1322 }
1323
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001324 check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +01001325 sl,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001326 &key_metadata.authorizations,
1327 &gen_params,
1328 KeyOrigin::GENERATED,
1329 );
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001330 Ok(key_metadata)
1331 }
1332 Err(e) => Err(e),
1333 }
1334}
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001335
1336/// Helper method to import AES keys `total_count` of times.
1337pub fn import_aes_keys(
David Drysdale79092242024-06-18 13:13:43 +01001338 sl: &SecLevel,
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001339 alias_prefix: String,
1340 total_count: Range<i32>,
1341) -> binder::Result<HashSet<String>> {
1342 let mut imported_key_aliases = HashSet::new();
1343
1344 // Import Total number of keys with given alias prefix.
1345 for count in total_count {
1346 let mut alias = String::new();
1347 write!(alias, "{}_{}", alias_prefix, count).unwrap();
1348 imported_key_aliases.insert(alias.clone());
1349
David Drysdale79092242024-06-18 13:13:43 +01001350 import_aes_key(sl, Domain::APP, -1, Some(alias))?;
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001351 }
1352
1353 Ok(imported_key_aliases)
1354}
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001355
1356/// Generate attested EC-P_256 key with device id attestation.
1357pub fn generate_key_with_attest_id(
David Drysdale79092242024-06-18 13:13:43 +01001358 sl: &SecLevel,
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001359 algorithm: Algorithm,
1360 alias: Option<String>,
1361 att_challenge: &[u8],
1362 attest_key: &KeyDescriptor,
1363 attest_id: Tag,
1364 value: Vec<u8>,
1365) -> binder::Result<KeyMetadata> {
1366 assert!(algorithm == Algorithm::RSA || algorithm == Algorithm::EC);
1367
1368 let mut ec_gen_params;
1369 if algorithm == Algorithm::EC {
1370 ec_gen_params = AuthSetBuilder::new()
1371 .no_auth_required()
1372 .algorithm(Algorithm::EC)
1373 .purpose(KeyPurpose::SIGN)
1374 .purpose(KeyPurpose::VERIFY)
1375 .digest(Digest::SHA_2_256)
1376 .ec_curve(EcCurve::P_256)
1377 .attestation_challenge(att_challenge.to_vec());
1378 } else {
1379 ec_gen_params = AuthSetBuilder::new()
1380 .no_auth_required()
1381 .algorithm(Algorithm::RSA)
1382 .rsa_public_exponent(65537)
1383 .key_size(2048)
1384 .purpose(KeyPurpose::SIGN)
1385 .purpose(KeyPurpose::VERIFY)
1386 .digest(Digest::SHA_2_256)
1387 .padding_mode(PaddingMode::RSA_PKCS1_1_5_SIGN)
1388 .attestation_challenge(att_challenge.to_vec());
1389 }
1390
1391 match attest_id {
1392 Tag::ATTESTATION_ID_BRAND => {
1393 ec_gen_params = ec_gen_params.attestation_device_brand(value);
1394 }
1395 Tag::ATTESTATION_ID_DEVICE => {
1396 ec_gen_params = ec_gen_params.attestation_device_name(value);
1397 }
1398 Tag::ATTESTATION_ID_PRODUCT => {
1399 ec_gen_params = ec_gen_params.attestation_device_product_name(value);
1400 }
1401 Tag::ATTESTATION_ID_SERIAL => {
1402 ec_gen_params = ec_gen_params.attestation_device_serial(value);
1403 }
1404 Tag::ATTESTATION_ID_MANUFACTURER => {
1405 ec_gen_params = ec_gen_params.attestation_device_manufacturer(value);
1406 }
1407 Tag::ATTESTATION_ID_MODEL => {
1408 ec_gen_params = ec_gen_params.attestation_device_model(value);
1409 }
1410 Tag::ATTESTATION_ID_IMEI => {
1411 ec_gen_params = ec_gen_params.attestation_device_imei(value);
1412 }
1413 Tag::ATTESTATION_ID_SECOND_IMEI => {
1414 ec_gen_params = ec_gen_params.attestation_device_second_imei(value);
1415 }
1416 _ => {
1417 panic!("Unknown attestation id");
1418 }
1419 }
1420
David Drysdale79092242024-06-18 13:13:43 +01001421 sl.binder.generateKey(
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001422 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: None },
1423 Some(attest_key),
1424 &ec_gen_params,
1425 0,
1426 b"entropy",
1427 )
1428}
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001429
1430/// Generate Key and validate key characteristics.
1431pub fn generate_key(
David Drysdale79092242024-06-18 13:13:43 +01001432 sl: &SecLevel,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001433 gen_params: &AuthSetBuilder,
1434 alias: &str,
1435) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +01001436 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001437 &KeyDescriptor {
1438 domain: Domain::APP,
1439 nspace: -1,
1440 alias: Some(alias.to_string()),
1441 blob: None,
1442 },
1443 None,
1444 gen_params,
1445 0,
1446 b"entropy",
1447 )?;
1448
1449 if gen_params.iter().any(|kp| {
1450 matches!(
1451 kp.value,
1452 KeyParameterValue::Algorithm(Algorithm::RSA)
1453 | KeyParameterValue::Algorithm(Algorithm::EC)
1454 )
1455 }) {
1456 assert!(key_metadata.certificate.is_some());
1457 if gen_params.iter().any(|kp| kp.tag == Tag::ATTESTATION_CHALLENGE) {
1458 assert!(key_metadata.certificateChain.is_some());
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +00001459 let mut cert_chain: Vec<u8> = Vec::new();
1460 cert_chain.extend(key_metadata.certificate.as_ref().unwrap());
1461 cert_chain.extend(key_metadata.certificateChain.as_ref().unwrap());
Rajesh Nyamagoudb1c8e832023-06-06 01:39:44 +00001462 let strict_issuer_check =
1463 !(gen_params.iter().any(|kp| kp.tag == Tag::DEVICE_UNIQUE_ATTESTATION));
1464 validate_certchain_with_strict_issuer_check(&cert_chain, strict_issuer_check)
1465 .expect("Error while validating cert chain");
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +00001466 }
1467
1468 if let Some(challenge_param) =
1469 gen_params.iter().find(|kp| kp.tag == Tag::ATTESTATION_CHALLENGE)
1470 {
1471 if let KeyParameterValue::Blob(val) = &challenge_param.value {
1472 let att_challenge = get_value_from_attest_record(
1473 key_metadata.certificate.as_ref().unwrap(),
1474 challenge_param.tag,
1475 key_metadata.keySecurityLevel,
1476 )
1477 .expect("Attestation challenge verification failed.");
1478 assert_eq!(&att_challenge, val);
1479 }
1480
1481 let att_app_id = get_value_from_attest_record(
1482 key_metadata.certificate.as_ref().unwrap(),
1483 Tag::ATTESTATION_APPLICATION_ID,
1484 SecurityLevel::KEYSTORE,
1485 )
1486 .expect("Attestation application id verification failed.");
1487 assert!(!att_app_id.is_empty());
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001488 }
1489 }
David Drysdale79092242024-06-18 13:13:43 +01001490 check_key_authorizations(sl, &key_metadata.authorizations, gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001491
1492 Ok(key_metadata)
1493}
1494
1495/// Generate a key using given authorizations and create an operation using the generated key.
1496pub fn create_key_and_operation(
David Drysdale79092242024-06-18 13:13:43 +01001497 sl: &SecLevel,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001498 gen_params: &AuthSetBuilder,
1499 op_params: &AuthSetBuilder,
1500 alias: &str,
1501) -> binder::Result<CreateOperationResponse> {
David Drysdale79092242024-06-18 13:13:43 +01001502 let key_metadata = generate_key(sl, gen_params, alias)?;
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001503
David Drysdale79092242024-06-18 13:13:43 +01001504 sl.binder.createOperation(&key_metadata.key, op_params, false)
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001505}