blob: fdb2afb14d3c037da2d2c1a5ef308133e42445ca [file] [log] [blame]
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +00001// Copyright 2022, The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15//! This module implements test utils to generate various types of keys.
16
David Drysdale79092242024-06-18 13:13:43 +010017use crate::authorizations::AuthSetBuilder;
18use crate::ffi_test_utils::{
19 get_os_patchlevel, get_os_version, get_value_from_attest_record, get_vendor_patchlevel,
20 validate_certchain_with_strict_issuer_check,
21};
22use crate::SecLevel;
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +000023use android_hardware_security_keymint::aidl::android::hardware::security::keymint::{
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +000024 Algorithm::Algorithm, BlockMode::BlockMode, Digest::Digest, EcCurve::EcCurve,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +000025 ErrorCode::ErrorCode, HardwareAuthenticatorType::HardwareAuthenticatorType,
26 KeyOrigin::KeyOrigin, KeyParameter::KeyParameter, KeyParameterValue::KeyParameterValue,
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +000027 KeyPurpose::KeyPurpose, PaddingMode::PaddingMode, SecurityLevel::SecurityLevel, Tag::Tag,
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +000028};
29use android_system_keystore2::aidl::android::system::keystore2::{
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +000030 AuthenticatorSpec::AuthenticatorSpec, Authorization::Authorization,
David Drysdale79092242024-06-18 13:13:43 +010031 CreateOperationResponse::CreateOperationResponse, Domain::Domain, KeyDescriptor::KeyDescriptor,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +000032 KeyMetadata::KeyMetadata, ResponseCode::ResponseCode,
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +000033};
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +000034use android_system_keystore2::binder::{ExceptionCode, Result as BinderResult};
David Drysdale79092242024-06-18 13:13:43 +010035use anyhow::Result;
36use binder::ThreadState;
37use core::ops::Range;
38use nix::unistd::getuid;
39use std::collections::HashSet;
40use std::fmt::Write;
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +000041
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +000042/// Shell namespace.
43pub const SELINUX_SHELL_NAMESPACE: i64 = 1;
Rajesh Nyamagouddc6fb232021-12-08 21:27:15 +000044/// Vold namespace.
45pub const SELINUX_VOLD_NAMESPACE: i64 = 100;
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +000046
Rajesh Nyamagoudfa7c0f12021-12-02 17:15:48 +000047/// SU context.
48pub const TARGET_SU_CTX: &str = "u:r:su:s0";
49
50/// Vold context
51pub const TARGET_VOLD_CTX: &str = "u:r:vold:s0";
52
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +000053/// Allowed tags in generated/imported key authorizations.
54/// See hardware/interfaces/security/keymint/aidl/android/hardware/security/keymint/Tag.aidl for the
55/// list feature tags.
56/// Note: This list need to be updated whenever a new Tag is introduced and is expected to be added
57/// in key authorizations.
58pub const ALLOWED_TAGS_IN_KEY_AUTHS: &[Tag] = &[
59 Tag::ACTIVE_DATETIME,
60 Tag::ALGORITHM,
61 Tag::ALLOW_WHILE_ON_BODY,
62 Tag::AUTH_TIMEOUT,
63 Tag::BLOCK_MODE,
64 Tag::BOOTLOADER_ONLY,
65 Tag::BOOT_PATCHLEVEL,
66 Tag::CALLER_NONCE,
67 Tag::CREATION_DATETIME,
68 Tag::DIGEST,
69 Tag::EARLY_BOOT_ONLY,
70 Tag::EC_CURVE,
71 Tag::IDENTITY_CREDENTIAL_KEY,
72 Tag::INCLUDE_UNIQUE_ID,
73 Tag::KEY_SIZE,
74 Tag::MAX_BOOT_LEVEL,
75 Tag::MAX_USES_PER_BOOT,
76 Tag::MIN_MAC_LENGTH,
77 Tag::NO_AUTH_REQUIRED,
78 Tag::ORIGIN,
79 Tag::ORIGINATION_EXPIRE_DATETIME,
80 Tag::OS_PATCHLEVEL,
81 Tag::OS_VERSION,
82 Tag::PADDING,
83 Tag::PURPOSE,
84 Tag::ROLLBACK_RESISTANCE,
85 Tag::RSA_OAEP_MGF_DIGEST,
86 Tag::RSA_PUBLIC_EXPONENT,
87 Tag::STORAGE_KEY,
88 Tag::TRUSTED_CONFIRMATION_REQUIRED,
89 Tag::TRUSTED_USER_PRESENCE_REQUIRED,
90 Tag::UNLOCKED_DEVICE_REQUIRED,
91 Tag::USAGE_COUNT_LIMIT,
92 Tag::USAGE_EXPIRE_DATETIME,
93 Tag::USER_AUTH_TYPE,
94 Tag::USER_ID,
95 Tag::USER_SECURE_ID,
96 Tag::VENDOR_PATCHLEVEL,
97];
98
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +000099/// Key parameters to generate a key.
100pub struct KeyParams {
101 /// Key Size.
102 pub key_size: i32,
103 /// Key Purposes.
104 pub purpose: Vec<KeyPurpose>,
105 /// Padding Mode.
106 pub padding: Option<PaddingMode>,
107 /// Digest.
108 pub digest: Option<Digest>,
109 /// MFG Digest.
110 pub mgf_digest: Option<Digest>,
111 /// Block Mode.
112 pub block_mode: Option<BlockMode>,
113 /// Attestation challenge.
114 pub att_challenge: Option<Vec<u8>>,
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000115}
116
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000117/// DER-encoded PKCS#8 format RSA key. Generated using:
118/// openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -outform der | hexdump -e '30/1 "%02X" "\n"'
119pub static RSA_2048_KEY: &[u8] = &[
120 0x30, 0x82, 0x04, 0xBD, 0x02, 0x01, 0x00, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7,
121 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x04, 0xA7, 0x30, 0x82, 0x04, 0xA3, 0x02, 0x01,
122 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, 0xE5, 0x14, 0xE3, 0xC2, 0x43, 0xF3, 0x0F, 0xCC, 0x22, 0x73,
123 0x9C, 0x84, 0xCC, 0x1B, 0x6C, 0x97, 0x4B, 0xC9, 0xDF, 0x1F, 0xE2, 0xB8, 0x80, 0x85, 0xF9, 0x27,
124 0xAB, 0x97, 0x94, 0x58, 0x4B, 0xC9, 0x40, 0x94, 0x5A, 0xB4, 0xD4, 0xF8, 0xD0, 0x36, 0xC4, 0x86,
125 0x17, 0x7D, 0xA2, 0x48, 0x6D, 0x40, 0xF0, 0xB9, 0x61, 0x4F, 0xCE, 0x65, 0x80, 0x88, 0x81, 0x59,
126 0x95, 0x11, 0x24, 0xF4, 0x36, 0xB7, 0xB7, 0x37, 0x44, 0xF4, 0x6C, 0x1C, 0xEB, 0x04, 0x19, 0x78,
127 0xB2, 0x29, 0x4D, 0x21, 0x44, 0x16, 0x57, 0x58, 0x6D, 0x7D, 0x56, 0xB5, 0x99, 0xDD, 0xD2, 0xAD,
128 0x02, 0x9A, 0x72, 0x16, 0x67, 0xD6, 0x00, 0x9F, 0x69, 0xE0, 0x25, 0xEE, 0x7C, 0x86, 0x54, 0x27,
129 0x4B, 0x50, 0xEF, 0x60, 0x52, 0x60, 0x82, 0xAA, 0x09, 0x15, 0x72, 0xD2, 0xEB, 0x01, 0x52, 0x04,
130 0x39, 0x60, 0xBC, 0x5E, 0x95, 0x07, 0xC8, 0xC2, 0x3A, 0x3A, 0xE2, 0xA4, 0x99, 0x6B, 0x27, 0xE3,
131 0xA3, 0x55, 0x69, 0xC4, 0xB3, 0x2D, 0x19, 0xC4, 0x34, 0x76, 0xFC, 0x27, 0xDA, 0x22, 0xB2, 0x62,
132 0x69, 0x25, 0xDE, 0x0D, 0xE7, 0x54, 0x3C, 0xBB, 0x61, 0xD2, 0x20, 0xDA, 0x7B, 0x6E, 0x63, 0xBD,
133 0x9A, 0x4B, 0xCD, 0x75, 0xC6, 0xA1, 0x5E, 0x1C, 0x3E, 0xD5, 0x63, 0x59, 0x22, 0x7E, 0xE0, 0x6C,
134 0x98, 0x25, 0x63, 0x97, 0x56, 0xDF, 0x71, 0xF5, 0x4C, 0x78, 0xE9, 0xE1, 0xD5, 0xFC, 0xF8, 0x5A,
135 0x5B, 0xF6, 0x1D, 0xFA, 0x5A, 0x99, 0x4C, 0x99, 0x19, 0x21, 0x1D, 0xF5, 0x24, 0x07, 0xEF, 0x8A,
136 0xC9, 0x9F, 0xE7, 0x3F, 0xBB, 0x46, 0x1A, 0x16, 0x96, 0xC6, 0xD6, 0x12, 0x7E, 0xDA, 0xCB, 0xEB,
137 0x2F, 0x1D, 0x3B, 0x31, 0xCC, 0x55, 0x63, 0xA2, 0x6F, 0x8A, 0xDE, 0x35, 0x52, 0x40, 0x04, 0xBF,
138 0xE0, 0x82, 0x32, 0xE1, 0x6D, 0x8B, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, 0x00, 0x2D,
139 0x1F, 0x71, 0x41, 0x79, 0xBA, 0xED, 0xD8, 0xAA, 0xCC, 0x94, 0xFE, 0xFF, 0x69, 0x43, 0x79, 0x85,
140 0xBF, 0x2C, 0xC9, 0x0E, 0x12, 0x83, 0x96, 0x60, 0x1E, 0x75, 0x49, 0x35, 0x3A, 0x33, 0x2B, 0x60,
141 0x22, 0x18, 0xBF, 0xD7, 0xD7, 0x6E, 0xC3, 0xEA, 0xEF, 0xF2, 0xBE, 0x97, 0x71, 0xA6, 0xBB, 0x8C,
142 0xEF, 0x27, 0x00, 0xDE, 0x49, 0xD6, 0x08, 0x8D, 0x5A, 0x04, 0xE7, 0xCC, 0x9C, 0xA2, 0x0E, 0x8B,
143 0xF3, 0x42, 0x0C, 0xD7, 0x22, 0xD7, 0x14, 0x06, 0xA4, 0x64, 0x8B, 0x88, 0x1A, 0xCE, 0x5B, 0x8C,
144 0x36, 0xE9, 0xD2, 0x2F, 0x7B, 0x33, 0xE4, 0xA2, 0xB3, 0xDB, 0x78, 0x6A, 0x92, 0x89, 0x3F, 0x78,
145 0xFD, 0xED, 0x8F, 0xEE, 0x48, 0xCC, 0x94, 0x75, 0x0D, 0x0C, 0x63, 0xD3, 0xD2, 0xE8, 0x47, 0x04,
146 0x55, 0xD3, 0xD6, 0x3A, 0xB8, 0xDA, 0xFB, 0x76, 0x99, 0x48, 0x68, 0x0A, 0x92, 0xA2, 0xCD, 0xF7,
147 0x45, 0x8B, 0x50, 0xFE, 0xF9, 0x1A, 0x33, 0x24, 0x3C, 0x2E, 0xDE, 0x88, 0xAD, 0xB2, 0x5B, 0x9F,
148 0x44, 0xEA, 0xD1, 0x9F, 0xC7, 0x9F, 0x02, 0x5E, 0x31, 0x61, 0xB3, 0xD6, 0xE2, 0xE1, 0xBC, 0xFB,
149 0x1C, 0xDB, 0xBD, 0xB2, 0x9A, 0xE5, 0xEF, 0xDA, 0xCD, 0x29, 0xA5, 0x45, 0xCC, 0x67, 0x01, 0x8B,
150 0x1C, 0x1D, 0x0E, 0x8F, 0x73, 0x69, 0x4D, 0x4D, 0xF6, 0x9D, 0xA6, 0x6C, 0x9A, 0x1C, 0xF4, 0x5C,
151 0xE4, 0x83, 0x9A, 0x77, 0x12, 0x01, 0xBD, 0xCE, 0x66, 0x3A, 0x4B, 0x3D, 0x6E, 0xE0, 0x6E, 0x82,
152 0x98, 0xDE, 0x74, 0x11, 0x47, 0xEC, 0x7A, 0x3A, 0xA9, 0xD8, 0x48, 0x00, 0x26, 0x64, 0x47, 0x7B,
153 0xAE, 0x55, 0x9D, 0x29, 0x22, 0xB4, 0xB3, 0xB9, 0xB1, 0x64, 0xEA, 0x3B, 0x5A, 0xD3, 0x3F, 0x8D,
154 0x0F, 0x14, 0x7E, 0x4E, 0xB8, 0x1B, 0x06, 0xFC, 0xB1, 0x7E, 0xCD, 0xB9, 0x1A, 0x4E, 0xA1, 0x02,
155 0x81, 0x81, 0x00, 0xF9, 0xDE, 0xEE, 0xED, 0x13, 0x2F, 0xBB, 0xE7, 0xE2, 0xB3, 0x2D, 0x98, 0xD2,
156 0xE8, 0x25, 0x07, 0x5A, 0x1E, 0x51, 0x0A, 0xC8, 0xAD, 0x50, 0x4B, 0x80, 0xC6, 0x22, 0xF5, 0x9B,
157 0x08, 0xE6, 0x3D, 0x01, 0xC6, 0x3E, 0xC8, 0xD2, 0x54, 0x9F, 0x91, 0x77, 0x95, 0xCD, 0xCA, 0xC7,
158 0xE7, 0x47, 0x94, 0xA9, 0x5F, 0x4E, 0xBE, 0x31, 0x3D, 0xB4, 0xAF, 0x43, 0x0F, 0xDC, 0x8D, 0x9C,
159 0x1E, 0x52, 0x7B, 0x72, 0x21, 0x34, 0xB3, 0x96, 0x7C, 0x9C, 0xB8, 0x51, 0x65, 0x60, 0xAC, 0x3D,
160 0x11, 0x32, 0xB8, 0xD6, 0x34, 0x35, 0x66, 0xD0, 0x30, 0xB9, 0xE9, 0x67, 0x2C, 0x87, 0x73, 0x43,
161 0x9C, 0x12, 0x16, 0x7D, 0x4A, 0xD9, 0xA3, 0x4C, 0x24, 0x64, 0x6A, 0x32, 0x8E, 0xC3, 0xD8, 0x00,
162 0x90, 0x5C, 0x4D, 0x65, 0x01, 0x53, 0x8A, 0xD0, 0x87, 0xCE, 0x96, 0xEF, 0xFA, 0x73, 0x03, 0xF1,
163 0xDC, 0x1B, 0x9B, 0x02, 0x81, 0x81, 0x00, 0xEA, 0xB3, 0x69, 0x00, 0x11, 0x0E, 0x50, 0xAA, 0xD3,
164 0x22, 0x51, 0x78, 0x9D, 0xFF, 0x05, 0x62, 0xBC, 0x9A, 0x67, 0x86, 0xE1, 0xC5, 0x02, 0x2D, 0x14,
165 0x11, 0x29, 0x30, 0xE7, 0x90, 0x5D, 0x72, 0x6F, 0xC5, 0x62, 0xEB, 0xD4, 0xB0, 0x3F, 0x3D, 0xDC,
166 0xB9, 0xFC, 0x2B, 0x5C, 0xBD, 0x9E, 0x71, 0x81, 0x5C, 0xC5, 0xFE, 0xDF, 0x69, 0x73, 0x12, 0x66,
167 0x92, 0x06, 0xD4, 0xD5, 0x8F, 0xDF, 0x14, 0x2E, 0x9C, 0xD0, 0x4C, 0xC2, 0x4D, 0x31, 0x2E, 0x47,
168 0xA5, 0xDC, 0x8A, 0x83, 0x7B, 0xE8, 0xA5, 0xC3, 0x03, 0x98, 0xD8, 0xBF, 0xF4, 0x7D, 0x6E, 0x87,
169 0x55, 0xE4, 0x0F, 0x15, 0x10, 0xC8, 0x76, 0x4F, 0xAD, 0x1D, 0x1C, 0x95, 0x41, 0x9D, 0x88, 0xEC,
170 0x8C, 0xDA, 0xBA, 0x90, 0x7F, 0x8D, 0xD9, 0x8B, 0x47, 0x6C, 0x0C, 0xFF, 0xBA, 0x73, 0x00, 0x20,
171 0x1F, 0xF7, 0x7E, 0x5F, 0xF4, 0xEC, 0xD1, 0x02, 0x81, 0x80, 0x16, 0xB7, 0x43, 0xB5, 0x5D, 0xD7,
172 0x2B, 0x18, 0x0B, 0xAE, 0x0A, 0x69, 0x28, 0x53, 0x5E, 0x7A, 0x6A, 0xA0, 0xF2, 0xF1, 0x2E, 0x09,
173 0x43, 0x91, 0x79, 0xA5, 0x89, 0xAC, 0x16, 0x6A, 0x1A, 0xB4, 0x55, 0x22, 0xF6, 0xB6, 0x3F, 0x18,
174 0xDE, 0x60, 0xD5, 0x24, 0x53, 0x4F, 0x2A, 0x19, 0x46, 0x92, 0xA7, 0x4B, 0x38, 0xD7, 0x65, 0x96,
175 0x9C, 0x84, 0x8A, 0x6E, 0x38, 0xB8, 0xCF, 0x06, 0x9A, 0xAD, 0x0A, 0x55, 0x26, 0x7B, 0x65, 0x24,
176 0xF3, 0x02, 0x76, 0xB3, 0xE6, 0xB4, 0x01, 0xE1, 0x3C, 0x61, 0x3D, 0x68, 0x05, 0xAA, 0xD1, 0x26,
177 0x7C, 0xE0, 0x51, 0x36, 0xE5, 0x21, 0x7F, 0x76, 0x02, 0xD6, 0xF4, 0x91, 0x07, 0x74, 0x27, 0x09,
178 0xEF, 0xEF, 0x0F, 0xA5, 0x96, 0xFC, 0x5E, 0x20, 0xC1, 0xA3, 0x6F, 0x99, 0x4D, 0x45, 0x03, 0x6C,
179 0x35, 0x45, 0xD7, 0x8F, 0x47, 0x41, 0x86, 0x8D, 0x62, 0x1D, 0x02, 0x81, 0x81, 0x00, 0xC3, 0x93,
180 0x85, 0xA7, 0xFC, 0x8E, 0x85, 0x42, 0x14, 0x76, 0xC0, 0x95, 0x56, 0x73, 0xB0, 0xB5, 0x3A, 0x9D,
181 0x20, 0x30, 0x11, 0xEA, 0xED, 0x89, 0x4A, 0xF3, 0x91, 0xF3, 0xA2, 0xC3, 0x76, 0x5B, 0x6A, 0x30,
182 0x7D, 0xE2, 0x2F, 0x76, 0x3E, 0xFC, 0xF9, 0xF6, 0x31, 0xE0, 0xA0, 0x83, 0x92, 0x88, 0xDB, 0x57,
183 0xC7, 0xD6, 0x3F, 0xAD, 0xCB, 0xAA, 0x45, 0xB6, 0xE1, 0xE2, 0x71, 0xA4, 0x56, 0x2C, 0xA7, 0x3B,
184 0x1D, 0x89, 0x19, 0x50, 0xE1, 0xEE, 0xC2, 0xDD, 0xC0, 0x0D, 0xDC, 0xCB, 0x60, 0x6E, 0xE1, 0x37,
185 0x1A, 0x23, 0x64, 0xB2, 0x03, 0xE4, 0x1A, 0xFA, 0xC3, 0xF4, 0x9D, 0x85, 0x42, 0xC6, 0xF4, 0x56,
186 0x39, 0xB0, 0x1B, 0xE0, 0x75, 0xBA, 0x28, 0x04, 0xA8, 0x30, 0x57, 0x41, 0x33, 0x9F, 0x58, 0xA4,
187 0xC7, 0xB1, 0x7D, 0x58, 0x8D, 0x84, 0x49, 0x40, 0xDA, 0x28, 0x81, 0x25, 0xC4, 0x41, 0x02, 0x81,
188 0x80, 0x13, 0x20, 0x65, 0xD5, 0x96, 0x98, 0x8D, 0x16, 0x73, 0xA1, 0x31, 0x73, 0x79, 0xBA, 0xEC,
189 0xB0, 0xD9, 0x0C, 0xF6, 0xEF, 0x2F, 0xC2, 0xE7, 0x96, 0x9B, 0xA1, 0x2D, 0xE9, 0xFB, 0x45, 0xB9,
190 0xD0, 0x30, 0xE2, 0xBD, 0x30, 0x4F, 0xB6, 0xFE, 0x24, 0x02, 0xCF, 0x8D, 0x51, 0x48, 0x45, 0xD9,
191 0xF7, 0x20, 0x53, 0x1C, 0x0B, 0xA9, 0x7E, 0xC2, 0xA2, 0x65, 0xCC, 0x3E, 0x0E, 0x0D, 0xF1, 0x62,
192 0xDD, 0x5F, 0xBC, 0x55, 0x9B, 0x58, 0x26, 0x40, 0x6A, 0xEE, 0x02, 0x55, 0x36, 0xE9, 0xBA, 0x82,
193 0x5A, 0xFD, 0x3C, 0xDF, 0xA6, 0x26, 0x32, 0x81, 0xA9, 0x5E, 0x46, 0xBE, 0xBA, 0xDC, 0xD3, 0x2A,
194 0x3A, 0x3B, 0xC1, 0x4E, 0xF7, 0x1A, 0xDC, 0x4B, 0xAF, 0x67, 0x1B, 0x3A, 0x83, 0x0D, 0x04, 0xDE,
195 0x27, 0x47, 0xFC, 0xE6, 0x39, 0x89, 0x7B, 0x66, 0xF9, 0x50, 0x4D, 0xF1, 0xAC, 0x20, 0x43, 0x7E,
196 0xEE,
197];
198
199/// DER-encoded PKCS#8 format EC key. Generated using:
200/// openssl ecparam -name prime256v1 -genkey | openssl pkcs8 -topk8 -nocrypt -outform der | hexdump -e '30/1 "%02X" "\n"'
201pub static EC_P_256_KEY: &[u8] = &[
202 0x30, 0x81, 0x87, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02,
203 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07, 0x04, 0x6D, 0x30, 0x6B, 0x02,
204 0x01, 0x01, 0x04, 0x20, 0xB9, 0x1D, 0xAF, 0x50, 0xFD, 0xD8, 0x6A, 0x40, 0xAB, 0x2C, 0xCB, 0x54,
205 0x4E, 0xED, 0xF1, 0x64, 0xBC, 0x30, 0x25, 0xFB, 0xC4, 0x69, 0x00, 0x34, 0x1A, 0x82, 0xA3, 0x72,
206 0x5D, 0xC7, 0xA9, 0x85, 0xA1, 0x44, 0x03, 0x42, 0x00, 0x04, 0xE8, 0x53, 0x0A, 0xF2, 0xD3, 0x68,
207 0x40, 0x48, 0x8C, 0xB4, 0x2F, 0x11, 0x34, 0xD7, 0xF4, 0x4A, 0x5C, 0x33, 0xFF, 0xF6, 0x2B, 0xF7,
208 0x98, 0x0F, 0x02, 0xA5, 0xD7, 0x4F, 0xF9, 0xDE, 0x60, 0x9C, 0x6E, 0xB0, 0x45, 0xDA, 0x3F, 0xF4,
209 0x34, 0x23, 0x9B, 0x4C, 0x3A, 0x09, 0x9C, 0x5E, 0x5D, 0x37, 0x96, 0xAC, 0x4A, 0xE7, 0x65, 0x2B,
210 0xD6, 0x84, 0x98, 0xEA, 0x96, 0x91, 0xFB, 0x78, 0xED, 0x86,
211];
212
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +0000213/// DER-encoded PKCS#8 format RSA key -
214/// Size: 2048
215/// Public Exponent: 65537
216/// Purpose: WRAP_KEY, ENCRYPT, DECRYPT
217/// Encryption scheme: RSAES-PKCS1-v1_5
218/// Digest: SHA_2_256
219/// Padding: RSA_OAEP
220/// This sample wrapping_key is taken from KeyMint tests
221/// (see hardware/interfaces/security/keymint/aidl/vts/functional/KeyMintTest.cpp).
222/// Similarly more test keys can be generated with below command -
223/// openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -outform der | hexdump -e '30/1 "%02X" "\n"'
224pub static WRAPPING_KEY: &[u8] = &[
225 0x30, 0x82, 0x04, 0xbe, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
226 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x04, 0xa8, 0x30, 0x82, 0x04, 0xa4, 0x02, 0x01,
227 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, 0xae, 0xc3, 0x67, 0x93, 0x1d, 0x89, 0x00, 0xce, 0x56, 0xb0,
228 0x06, 0x7f, 0x7d, 0x70, 0xe1, 0xfc, 0x65, 0x3f, 0x3f, 0x34, 0xd1, 0x94, 0xc1, 0xfe, 0xd5, 0x00,
229 0x18, 0xfb, 0x43, 0xdb, 0x93, 0x7b, 0x06, 0xe6, 0x73, 0xa8, 0x37, 0x31, 0x3d, 0x56, 0xb1, 0xc7,
230 0x25, 0x15, 0x0a, 0x3f, 0xef, 0x86, 0xac, 0xbd, 0xdc, 0x41, 0xbb, 0x75, 0x9c, 0x28, 0x54, 0xea,
231 0xe3, 0x2d, 0x35, 0x84, 0x1e, 0xfb, 0x5c, 0x18, 0xd8, 0x2b, 0xc9, 0x0a, 0x1c, 0xb5, 0xc1, 0xd5,
232 0x5a, 0xdf, 0x24, 0x5b, 0x02, 0x91, 0x1f, 0x0b, 0x7c, 0xda, 0x88, 0xc4, 0x21, 0xff, 0x0e, 0xba,
233 0xfe, 0x7c, 0x0d, 0x23, 0xbe, 0x31, 0x2d, 0x7b, 0xd5, 0x92, 0x1f, 0xfa, 0xea, 0x13, 0x47, 0xc1,
234 0x57, 0x40, 0x6f, 0xef, 0x71, 0x8f, 0x68, 0x26, 0x43, 0xe4, 0xe5, 0xd3, 0x3c, 0x67, 0x03, 0xd6,
235 0x1c, 0x0c, 0xf7, 0xac, 0x0b, 0xf4, 0x64, 0x5c, 0x11, 0xf5, 0xc1, 0x37, 0x4c, 0x38, 0x86, 0x42,
236 0x74, 0x11, 0xc4, 0x49, 0x79, 0x67, 0x92, 0xe0, 0xbe, 0xf7, 0x5d, 0xec, 0x85, 0x8a, 0x21, 0x23,
237 0xc3, 0x67, 0x53, 0xe0, 0x2a, 0x95, 0xa9, 0x6d, 0x7c, 0x45, 0x4b, 0x50, 0x4d, 0xe3, 0x85, 0xa6,
238 0x42, 0xe0, 0xdf, 0xc3, 0xe6, 0x0a, 0xc3, 0xa7, 0xee, 0x49, 0x91, 0xd0, 0xd4, 0x8b, 0x01, 0x72,
239 0xa9, 0x5f, 0x95, 0x36, 0xf0, 0x2b, 0xa1, 0x3c, 0xec, 0xcc, 0xb9, 0x2b, 0x72, 0x7d, 0xb5, 0xc2,
240 0x7e, 0x5b, 0x2f, 0x5c, 0xec, 0x09, 0x60, 0x0b, 0x28, 0x6a, 0xf5, 0xcf, 0x14, 0xc4, 0x20, 0x24,
241 0xc6, 0x1d, 0xdf, 0xe7, 0x1c, 0x2a, 0x8d, 0x74, 0x58, 0xf1, 0x85, 0x23, 0x4c, 0xb0, 0x0e, 0x01,
242 0xd2, 0x82, 0xf1, 0x0f, 0x8f, 0xc6, 0x72, 0x1d, 0x2a, 0xed, 0x3f, 0x48, 0x33, 0xcc, 0xa2, 0xbd,
243 0x8f, 0xa6, 0x28, 0x21, 0xdd, 0x55, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, 0x00, 0x43,
244 0x14, 0x47, 0xb6, 0x25, 0x19, 0x08, 0x11, 0x2b, 0x1e, 0xe7, 0x6f, 0x99, 0xf3, 0x71, 0x1a, 0x52,
245 0xb6, 0x63, 0x09, 0x60, 0x04, 0x6c, 0x2d, 0xe7, 0x0d, 0xe1, 0x88, 0xd8, 0x33, 0xf8, 0xb8, 0xb9,
246 0x1e, 0x4d, 0x78, 0x5c, 0xae, 0xee, 0xaf, 0x4f, 0x0f, 0x74, 0x41, 0x4e, 0x2c, 0xda, 0x40, 0x64,
247 0x1f, 0x7f, 0xe2, 0x4f, 0x14, 0xc6, 0x7a, 0x88, 0x95, 0x9b, 0xdb, 0x27, 0x76, 0x6d, 0xf9, 0xe7,
248 0x10, 0xb6, 0x30, 0xa0, 0x3a, 0xdc, 0x68, 0x3b, 0x5d, 0x2c, 0x43, 0x08, 0x0e, 0x52, 0xbe, 0xe7,
249 0x1e, 0x9e, 0xae, 0xb6, 0xde, 0x29, 0x7a, 0x5f, 0xea, 0x10, 0x72, 0x07, 0x0d, 0x18, 0x1c, 0x82,
250 0x2b, 0xcc, 0xff, 0x08, 0x7d, 0x63, 0xc9, 0x40, 0xba, 0x8a, 0x45, 0xf6, 0x70, 0xfe, 0xb2, 0x9f,
251 0xb4, 0x48, 0x4d, 0x1c, 0x95, 0xe6, 0xd2, 0x57, 0x9b, 0xa0, 0x2a, 0xae, 0x0a, 0x00, 0x90, 0x0c,
252 0x3e, 0xbf, 0x49, 0x0e, 0x3d, 0x2c, 0xd7, 0xee, 0x8d, 0x0e, 0x20, 0xc5, 0x36, 0xe4, 0xdc, 0x5a,
253 0x50, 0x97, 0x27, 0x28, 0x88, 0xcd, 0xdd, 0x7e, 0x91, 0xf2, 0x28, 0xb1, 0xc4, 0xd7, 0x47, 0x4c,
254 0x55, 0xb8, 0xfc, 0xd6, 0x18, 0xc4, 0xa9, 0x57, 0xbb, 0xdd, 0xd5, 0xad, 0x74, 0x07, 0xcc, 0x31,
255 0x2d, 0x8d, 0x98, 0xa5, 0xca, 0xf7, 0xe0, 0x8f, 0x4a, 0x0d, 0x6b, 0x45, 0xbb, 0x41, 0xc6, 0x52,
256 0x65, 0x9d, 0x5a, 0x5b, 0xa0, 0x5b, 0x66, 0x37, 0x37, 0xa8, 0x69, 0x62, 0x81, 0x86, 0x5b, 0xa2,
257 0x0f, 0xbd, 0xd7, 0xf8, 0x51, 0xe6, 0xc5, 0x6e, 0x8c, 0xbe, 0x0d, 0xdb, 0xbf, 0x24, 0xdc, 0x03,
258 0xb2, 0xd2, 0xcb, 0x4c, 0x3d, 0x54, 0x0f, 0xb0, 0xaf, 0x52, 0xe0, 0x34, 0xa2, 0xd0, 0x66, 0x98,
259 0xb1, 0x28, 0xe5, 0xf1, 0x01, 0xe3, 0xb5, 0x1a, 0x34, 0xf8, 0xd8, 0xb4, 0xf8, 0x61, 0x81, 0x02,
260 0x81, 0x81, 0x00, 0xde, 0x39, 0x2e, 0x18, 0xd6, 0x82, 0xc8, 0x29, 0x26, 0x6c, 0xc3, 0x45, 0x4e,
261 0x1d, 0x61, 0x66, 0x24, 0x2f, 0x32, 0xd9, 0xa1, 0xd1, 0x05, 0x77, 0x75, 0x3e, 0x90, 0x4e, 0xa7,
262 0xd0, 0x8b, 0xff, 0x84, 0x1b, 0xe5, 0xba, 0xc8, 0x2a, 0x16, 0x4c, 0x59, 0x70, 0x00, 0x70, 0x47,
263 0xb8, 0xc5, 0x17, 0xdb, 0x8f, 0x8f, 0x84, 0xe3, 0x7b, 0xd5, 0x98, 0x85, 0x61, 0xbd, 0xf5, 0x03,
264 0xd4, 0xdc, 0x2b, 0xdb, 0x38, 0xf8, 0x85, 0x43, 0x4a, 0xe4, 0x2c, 0x35, 0x5f, 0x72, 0x5c, 0x9a,
265 0x60, 0xf9, 0x1f, 0x07, 0x88, 0xe1, 0xf1, 0xa9, 0x72, 0x23, 0xb5, 0x24, 0xb5, 0x35, 0x7f, 0xdf,
266 0x72, 0xe2, 0xf6, 0x96, 0xba, 0xb7, 0xd7, 0x8e, 0x32, 0xbf, 0x92, 0xba, 0x8e, 0x18, 0x64, 0xea,
267 0xb1, 0x22, 0x9e, 0x91, 0x34, 0x61, 0x30, 0x74, 0x8a, 0x6e, 0x3c, 0x12, 0x4f, 0x91, 0x49, 0xd7,
268 0x1c, 0x74, 0x35, 0x02, 0x81, 0x81, 0x00, 0xc9, 0x53, 0x87, 0xc0, 0xf9, 0xd3, 0x5f, 0x13, 0x7b,
269 0x57, 0xd0, 0xd6, 0x5c, 0x39, 0x7c, 0x5e, 0x21, 0xcc, 0x25, 0x1e, 0x47, 0x00, 0x8e, 0xd6, 0x2a,
270 0x54, 0x24, 0x09, 0xc8, 0xb6, 0xb6, 0xac, 0x7f, 0x89, 0x67, 0xb3, 0x86, 0x3c, 0xa6, 0x45, 0xfc,
271 0xce, 0x49, 0x58, 0x2a, 0x9a, 0xa1, 0x73, 0x49, 0xdb, 0x6c, 0x4a, 0x95, 0xaf, 0xfd, 0xae, 0x0d,
272 0xae, 0x61, 0x2e, 0x1a, 0xfa, 0xc9, 0x9e, 0xd3, 0x9a, 0x2d, 0x93, 0x4c, 0x88, 0x04, 0x40, 0xae,
273 0xd8, 0x83, 0x2f, 0x98, 0x43, 0x16, 0x3a, 0x47, 0xf2, 0x7f, 0x39, 0x21, 0x99, 0xdc, 0x12, 0x02,
274 0xf9, 0xa0, 0xf9, 0xbd, 0x08, 0x30, 0x80, 0x07, 0xcb, 0x1e, 0x4e, 0x7f, 0x58, 0x30, 0x93, 0x66,
275 0xa7, 0xde, 0x25, 0xf7, 0xc3, 0xc9, 0xb8, 0x80, 0x67, 0x7c, 0x06, 0x8e, 0x1b, 0xe9, 0x36, 0xe8,
276 0x12, 0x88, 0x81, 0x52, 0x52, 0xa8, 0xa1, 0x02, 0x81, 0x80, 0x57, 0xff, 0x8c, 0xa1, 0x89, 0x50,
277 0x80, 0xb2, 0xca, 0xe4, 0x86, 0xef, 0x0a, 0xdf, 0xd7, 0x91, 0xfb, 0x02, 0x35, 0xc0, 0xb8, 0xb3,
278 0x6c, 0xd6, 0xc1, 0x36, 0xe5, 0x2e, 0x40, 0x85, 0xf4, 0xea, 0x5a, 0x06, 0x32, 0x12, 0xa4, 0xf1,
279 0x05, 0xa3, 0x76, 0x47, 0x43, 0xe5, 0x32, 0x81, 0x98, 0x8a, 0xba, 0x07, 0x3f, 0x6e, 0x00, 0x27,
280 0x29, 0x8e, 0x1c, 0x43, 0x78, 0x55, 0x6e, 0x0e, 0xfc, 0xa0, 0xe1, 0x4e, 0xce, 0x1a, 0xf7, 0x6a,
281 0xd0, 0xb0, 0x30, 0xf2, 0x7a, 0xf6, 0xf0, 0xab, 0x35, 0xfb, 0x73, 0xa0, 0x60, 0xd8, 0xb1, 0xa0,
282 0xe1, 0x42, 0xfa, 0x26, 0x47, 0xe9, 0x3b, 0x32, 0xe3, 0x6d, 0x82, 0x82, 0xae, 0x0a, 0x4d, 0xe5,
283 0x0a, 0xb7, 0xaf, 0xe8, 0x55, 0x00, 0xa1, 0x6f, 0x43, 0xa6, 0x47, 0x19, 0xd6, 0xe2, 0xb9, 0x43,
284 0x98, 0x23, 0x71, 0x9c, 0xd0, 0x8b, 0xcd, 0x03, 0x17, 0x81, 0x02, 0x81, 0x81, 0x00, 0xba, 0x73,
285 0xb0, 0xbb, 0x28, 0xe3, 0xf8, 0x1e, 0x9b, 0xd1, 0xc5, 0x68, 0x71, 0x3b, 0x10, 0x12, 0x41, 0xac,
286 0xc6, 0x07, 0x97, 0x6c, 0x4d, 0xdc, 0xcc, 0x90, 0xe6, 0x5b, 0x65, 0x56, 0xca, 0x31, 0x51, 0x60,
287 0x58, 0xf9, 0x2b, 0x6e, 0x09, 0xf3, 0xb1, 0x60, 0xff, 0x0e, 0x37, 0x4e, 0xc4, 0x0d, 0x78, 0xae,
288 0x4d, 0x49, 0x79, 0xfd, 0xe6, 0xac, 0x06, 0xa1, 0xa4, 0x00, 0xc6, 0x1d, 0xd3, 0x12, 0x54, 0x18,
289 0x6a, 0xf3, 0x0b, 0x22, 0xc1, 0x05, 0x82, 0xa8, 0xa4, 0x3e, 0x34, 0xfe, 0x94, 0x9c, 0x5f, 0x3b,
290 0x97, 0x55, 0xba, 0xe7, 0xba, 0xa7, 0xb7, 0xb7, 0xa6, 0xbd, 0x03, 0xb3, 0x8c, 0xef, 0x55, 0xc8,
291 0x68, 0x85, 0xfc, 0x6c, 0x19, 0x78, 0xb9, 0xce, 0xe7, 0xef, 0x33, 0xda, 0x50, 0x7c, 0x9d, 0xf6,
292 0xb9, 0x27, 0x7c, 0xff, 0x1e, 0x6a, 0xaa, 0x5d, 0x57, 0xac, 0xa5, 0x28, 0x46, 0x61, 0x02, 0x81,
293 0x81, 0x00, 0xc9, 0x31, 0x61, 0x7c, 0x77, 0x82, 0x9d, 0xfb, 0x12, 0x70, 0x50, 0x2b, 0xe9, 0x19,
294 0x5c, 0x8f, 0x28, 0x30, 0x88, 0x5f, 0x57, 0xdb, 0xa8, 0x69, 0x53, 0x68, 0x11, 0xe6, 0x86, 0x42,
295 0x36, 0xd0, 0xc4, 0x73, 0x6a, 0x00, 0x08, 0xa1, 0x45, 0xaf, 0x36, 0xb8, 0x35, 0x7a, 0x7c, 0x3d,
296 0x13, 0x99, 0x66, 0xd0, 0x4c, 0x4e, 0x00, 0x93, 0x4e, 0xa1, 0xae, 0xde, 0x3b, 0xb6, 0xb8, 0xec,
297 0x84, 0x1d, 0xc9, 0x5e, 0x3f, 0x57, 0x97, 0x51, 0xe2, 0xbf, 0xdf, 0xe2, 0x7a, 0xe7, 0x78, 0x98,
298 0x3f, 0x95, 0x93, 0x56, 0x21, 0x07, 0x23, 0x28, 0x7b, 0x0a, 0xff, 0xcc, 0x9f, 0x72, 0x70, 0x44,
299 0xd4, 0x8c, 0x37, 0x3f, 0x1b, 0xab, 0xde, 0x07, 0x24, 0xfa, 0x17, 0xa4, 0xfd, 0x4d, 0xa0, 0x90,
300 0x2c, 0x7c, 0x9b, 0x9b, 0xf2, 0x7b, 0xa6, 0x1b, 0xe6, 0xad, 0x02, 0xdf, 0xdd, 0xda, 0x8f, 0x4e,
301 0x68, 0x22,
302];
303
304/// WrappedKeyData as ASN.1 DER-encoded data corresponding to the `SecureKeyWrapper` schema
305/// specified in IKeyMintDevice.aidl. Wrapped key parameters are -
306/// Algorithm: AES
307/// Key size: 256
308/// Block mode: ECB
309/// Padding mode: PKCS7
310/// This sample wrapped_key is taken from KeyMint tests (see KeyMintTest.cpp).
311pub static WRAPPED_KEY: &[u8] = &[
312 0x30, 0x82, 0x01, 0x79, 0x02, 0x01, 0x00, 0x04, 0x82, 0x01, 0x00, 0x93, 0x4b, 0xf9, 0x4e, 0x2a,
313 0xa2, 0x8a, 0x3f, 0x83, 0xc9, 0xf7, 0x92, 0x97, 0x25, 0x02, 0x62, 0xfb, 0xe3, 0x27, 0x6b, 0x5a,
314 0x1c, 0x91, 0x15, 0x9b, 0xbf, 0xa3, 0xef, 0x89, 0x57, 0xaa, 0xc8, 0x4b, 0x59, 0xb3, 0x0b, 0x45,
315 0x5a, 0x79, 0xc2, 0x97, 0x34, 0x80, 0x82, 0x3d, 0x8b, 0x38, 0x63, 0xc3, 0xde, 0xef, 0x4a, 0x8e,
316 0x24, 0x35, 0x90, 0x26, 0x8d, 0x80, 0xe1, 0x87, 0x51, 0xa0, 0xe1, 0x30, 0xf6, 0x7c, 0xe6, 0xa1,
317 0xac, 0xe9, 0xf7, 0x9b, 0x95, 0xe0, 0x97, 0x47, 0x4f, 0xeb, 0xc9, 0x81, 0x19, 0x5b, 0x1d, 0x13,
318 0xa6, 0x90, 0x86, 0xc0, 0x86, 0x3f, 0x66, 0xa7, 0xb7, 0xfd, 0xb4, 0x87, 0x92, 0x22, 0x7b, 0x1a,
319 0xc5, 0xe2, 0x48, 0x9f, 0xeb, 0xdf, 0x08, 0x7a, 0xb5, 0x48, 0x64, 0x83, 0x03, 0x3a, 0x6f, 0x00,
320 0x1c, 0xa5, 0xd1, 0xec, 0x1e, 0x27, 0xf5, 0xc3, 0x0f, 0x4c, 0xec, 0x26, 0x42, 0x07, 0x4a, 0x39,
321 0xae, 0x68, 0xae, 0xe5, 0x52, 0xe1, 0x96, 0x62, 0x7a, 0x8e, 0x3d, 0x86, 0x7e, 0x67, 0xa8, 0xc0,
322 0x1b, 0x11, 0xe7, 0x5f, 0x13, 0xcc, 0xa0, 0xa9, 0x7a, 0xb6, 0x68, 0xb5, 0x0c, 0xda, 0x07, 0xa8,
323 0xec, 0xb7, 0xcd, 0x8e, 0x3d, 0xd7, 0x00, 0x9c, 0x96, 0x36, 0x53, 0x4f, 0x6f, 0x23, 0x9c, 0xff,
324 0xe1, 0xfc, 0x8d, 0xaa, 0x46, 0x6f, 0x78, 0xb6, 0x76, 0xc7, 0x11, 0x9e, 0xfb, 0x96, 0xbc, 0xe4,
325 0xe6, 0x9c, 0xa2, 0xa2, 0x5d, 0x0b, 0x34, 0xed, 0x9c, 0x3f, 0xf9, 0x99, 0xb8, 0x01, 0x59, 0x7d,
326 0x52, 0x20, 0xe3, 0x07, 0xea, 0xa5, 0xbe, 0xe5, 0x07, 0xfb, 0x94, 0xd1, 0xfa, 0x69, 0xf9, 0xe5,
327 0x19, 0xb2, 0xde, 0x31, 0x5b, 0xac, 0x92, 0xc3, 0x6f, 0x2e, 0xa1, 0xfa, 0x1d, 0xf4, 0x47, 0x8c,
328 0x0d, 0xde, 0xde, 0xae, 0x8c, 0x70, 0xe0, 0x23, 0x3c, 0xd0, 0x98, 0x04, 0x0c, 0xd7, 0x96, 0xb0,
329 0x2c, 0x37, 0x0f, 0x1f, 0xa4, 0xcc, 0x01, 0x24, 0xf1, 0x30, 0x2e, 0x02, 0x01, 0x03, 0x30, 0x29,
330 0xa1, 0x08, 0x31, 0x06, 0x02, 0x01, 0x00, 0x02, 0x01, 0x01, 0xa2, 0x03, 0x02, 0x01, 0x20, 0xa3,
331 0x04, 0x02, 0x02, 0x01, 0x00, 0xa4, 0x05, 0x31, 0x03, 0x02, 0x01, 0x01, 0xa6, 0x05, 0x31, 0x03,
332 0x02, 0x01, 0x40, 0xbf, 0x83, 0x77, 0x02, 0x05, 0x00, 0x04, 0x20, 0xcc, 0xd5, 0x40, 0x85, 0x5f,
333 0x83, 0x3a, 0x5e, 0x14, 0x80, 0xbf, 0xd2, 0xd3, 0x6f, 0xaf, 0x3a, 0xee, 0xe1, 0x5d, 0xf5, 0xbe,
334 0xab, 0xe2, 0x69, 0x1b, 0xc8, 0x2d, 0xde, 0x2a, 0x7a, 0xa9, 0x10, 0x04, 0x10, 0x64, 0xc9, 0xf6,
335 0x89, 0xc6, 0x0f, 0xf6, 0x22, 0x3a, 0xb6, 0xe6, 0x99, 0x9e, 0x0e, 0xb6, 0xe5,
336];
337
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000338/// To map Keystore errors.
339#[derive(thiserror::Error, Debug, Eq, PartialEq)]
340pub enum Error {
341 /// Keystore2 error code
342 #[error("ResponseCode {0:?}")]
343 Rc(ResponseCode),
344 /// Keymint error code
345 #[error("ErrorCode {0:?}")]
346 Km(ErrorCode),
347 /// Exception
348 #[error("Binder exception {0:?}")]
349 Binder(ExceptionCode),
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000350 /// This is returned if the C implementation of extractSubjectFromCertificate failed.
351 #[error("Failed to validate certificate chain.")]
352 ValidateCertChainFailed,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +0000353 /// Error code to indicate error in ASN.1 DER-encoded data creation.
354 #[error("Failed to create and encode ASN.1 data.")]
355 DerEncodeFailed,
Rajesh Nyamagoud28abde62023-04-01 01:32:32 +0000356 /// Error code to indicate error while using keystore-engine API.
357 #[error("Failed to perform crypto op using keystore-engine APIs.")]
358 Keystore2EngineOpFailed,
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +0000359 /// Error code to indicate error in attestation-id validation.
360 #[error("Failed to validate attestation-id.")]
361 ValidateAttestIdFailed,
362 /// Error code to indicate error in getting value from attest record.
363 #[error("Failed to get value from attest record.")]
364 AttestRecordGetValueFailed,
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000365}
366
367/// Keystore2 error mapping.
368pub fn map_ks_error<T>(r: BinderResult<T>) -> Result<T, Error> {
369 r.map_err(|s| {
370 match s.exception_code() {
371 ExceptionCode::SERVICE_SPECIFIC => {
372 match s.service_specific_error() {
373 se if se < 0 => {
374 // Negative service specific errors are KM error codes.
375 Error::Km(ErrorCode(se))
376 }
377 se => {
378 // Positive service specific errors are KS response codes.
379 Error::Rc(ResponseCode(se))
380 }
381 }
382 }
383 // We create `Error::Binder` to preserve the exception code
384 // for logging.
385 e_code => Error::Binder(e_code),
386 }
387 })
388}
389
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000390/// Verify that given key param is listed in given authorizations list.
391pub fn check_key_param(authorizations: &[Authorization], key_param: &KeyParameter) -> bool {
392 authorizations.iter().any(|auth| &auth.keyParameter == key_param)
393}
394
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000395/// Verify the given key authorizations with the expected authorizations.
396pub fn check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +0100397 sl: &SecLevel,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000398 authorizations: &[Authorization],
399 expected_params: &[KeyParameter],
400 expected_key_origin: KeyOrigin,
401) {
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000402 // Make sure key authorizations contains only `ALLOWED_TAGS_IN_KEY_AUTHS`
403 authorizations.iter().all(|auth| {
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000404 // Ignore `INVALID` tag if the backend is Keymaster and not KeyMint.
405 // Keymaster allows INVALID tag for unsupported key parameters.
David Drysdale79092242024-06-18 13:13:43 +0100406 if sl.is_keymaster() && auth.keyParameter.tag == Tag::INVALID {
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000407 return true;
408 }
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000409 assert!(
410 ALLOWED_TAGS_IN_KEY_AUTHS.contains(&auth.keyParameter.tag),
411 "key authorization is not allowed: {:#?}",
412 auth.keyParameter
413 );
414 true
415 });
416
David Drysdale79092242024-06-18 13:13:43 +0100417 // Check allowed-expected-key-parameters are present in given key authorizations list.
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000418 expected_params.iter().all(|key_param| {
Rajesh Nyamagoud17a92612023-10-17 16:15:05 +0000419 // `INCLUDE_UNIQUE_ID` is not strictly expected to be in key authorizations but has been
420 // put there by some implementations so cope with that.
421 if key_param.tag == Tag::INCLUDE_UNIQUE_ID
422 && !authorizations.iter().any(|auth| auth.keyParameter.tag == key_param.tag)
423 {
424 return true;
425 }
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000426
427 // Ignore below parameters if the backend is Keymaster and not KeyMint.
428 // Keymaster does not support these parameters. These key parameters are introduced in
429 // KeyMint1.0.
David Drysdale79092242024-06-18 13:13:43 +0100430 if sl.is_keymaster() {
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000431 if matches!(key_param.tag, Tag::RSA_OAEP_MGF_DIGEST | Tag::USAGE_COUNT_LIMIT) {
432 return true;
433 }
434 if key_param.tag == Tag::PURPOSE
435 && key_param.value == KeyParameterValue::KeyPurpose(KeyPurpose::ATTEST_KEY)
436 {
437 return true;
438 }
439 }
440
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000441 if ALLOWED_TAGS_IN_KEY_AUTHS.contains(&key_param.tag) {
442 assert!(
443 check_key_param(authorizations, key_param),
444 "Key parameter not found: {:#?}",
445 key_param
446 );
447 }
448 true
449 });
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000450
David Drysdale79092242024-06-18 13:13:43 +0100451 check_common_auths(sl, authorizations, expected_key_origin);
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000452}
453
454/// Verify common key authorizations.
David Drysdale79092242024-06-18 13:13:43 +0100455fn check_common_auths(
456 sl: &SecLevel,
457 authorizations: &[Authorization],
458 expected_key_origin: KeyOrigin,
459) {
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000460 assert!(check_key_param(
461 authorizations,
462 &KeyParameter {
463 tag: Tag::OS_VERSION,
464 value: KeyParameterValue::Integer(get_os_version().try_into().unwrap())
465 }
466 ));
467 assert!(check_key_param(
468 authorizations,
469 &KeyParameter {
470 tag: Tag::OS_PATCHLEVEL,
471 value: KeyParameterValue::Integer(get_os_patchlevel().try_into().unwrap())
472 }
473 ));
474
475 // Access denied for finding vendor-patch-level ("ro.vendor.build.security_patch") property
476 // in a test running with `untrusted_app` context. Keeping this check to verify
477 // vendor-patch-level in tests running with `su` context.
478 if getuid().is_root() {
479 assert!(check_key_param(
480 authorizations,
481 &KeyParameter {
482 tag: Tag::VENDOR_PATCHLEVEL,
483 value: KeyParameterValue::Integer(get_vendor_patchlevel().try_into().unwrap())
484 }
485 ));
486 }
487 assert!(check_key_param(
488 authorizations,
489 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(expected_key_origin) }
490 ));
491 assert!(check_key_param(
492 authorizations,
493 &KeyParameter {
494 tag: Tag::USER_ID,
495 value: KeyParameterValue::Integer(
496 rustutils::users::multiuser_get_user_id(ThreadState::get_calling_uid())
497 .try_into()
498 .unwrap()
499 )
500 }
501 ));
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +0000502
David Drysdale79092242024-06-18 13:13:43 +0100503 if sl.is_keymint() {
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +0000504 assert!(authorizations
505 .iter()
506 .map(|auth| &auth.keyParameter)
507 .any(|key_param| key_param.tag == Tag::CREATION_DATETIME));
508 }
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000509}
510
Rajesh Nyamagoudf436a932023-05-12 01:16:07 +0000511/// Get the key `Authorization` for the given auth `Tag`.
512pub fn get_key_auth(authorizations: &[Authorization], tag: Tag) -> Option<&Authorization> {
513 let auths: Vec<&Authorization> =
514 authorizations.iter().filter(|auth| auth.keyParameter.tag == tag).collect();
515
516 if !auths.is_empty() {
517 Some(auths[0])
518 } else {
519 None
520 }
521}
522
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000523/// Generate EC Key using given security level and domain with below key parameters and
524/// optionally allow the generated key to be attested with factory provisioned attest key using
525/// given challenge and application id -
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000526/// Purposes: SIGN and VERIFY
527/// Digest: SHA_2_256
528/// Curve: P_256
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000529pub fn generate_ec_p256_signing_key(
David Drysdale79092242024-06-18 13:13:43 +0100530 sl: &SecLevel,
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000531 domain: Domain,
532 nspace: i64,
533 alias: Option<String>,
534 att_challenge: Option<&[u8]>,
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000535) -> binder::Result<KeyMetadata> {
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000536 let mut key_attest = false;
537 let mut gen_params = AuthSetBuilder::new()
Rajesh Nyamagoudc7d064d2022-08-20 01:45:17 +0000538 .no_auth_required()
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000539 .algorithm(Algorithm::EC)
540 .purpose(KeyPurpose::SIGN)
541 .purpose(KeyPurpose::VERIFY)
542 .digest(Digest::SHA_2_256)
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000543 .ec_curve(EcCurve::P_256);
544
545 if let Some(challenge) = att_challenge {
546 key_attest = true;
547 gen_params = gen_params.clone().attestation_challenge(challenge.to_vec());
548 }
549
David Drysdale79092242024-06-18 13:13:43 +0100550 match sl.binder.generateKey(
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000551 &KeyDescriptor { domain, nspace, alias, blob: None },
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000552 None,
553 &gen_params,
554 0,
555 b"entropy",
556 ) {
557 Ok(key_metadata) => {
558 assert!(key_metadata.certificate.is_some());
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000559 if key_attest {
560 assert!(key_metadata.certificateChain.is_some());
561 }
562 if domain == Domain::BLOB {
563 assert!(key_metadata.key.blob.is_some());
564 }
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000565
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000566 check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +0100567 sl,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000568 &key_metadata.authorizations,
569 &gen_params,
570 KeyOrigin::GENERATED,
571 );
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000572 Ok(key_metadata)
573 }
574 Err(e) => Err(e),
575 }
576}
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000577
578/// Generate EC signing key.
Rajesh Nyamagoudc7d064d2022-08-20 01:45:17 +0000579pub fn generate_ec_key(
David Drysdale79092242024-06-18 13:13:43 +0100580 sl: &SecLevel,
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000581 domain: Domain,
582 nspace: i64,
583 alias: Option<String>,
584 ec_curve: EcCurve,
585 digest: Digest,
586) -> binder::Result<KeyMetadata> {
587 let gen_params = AuthSetBuilder::new()
588 .no_auth_required()
589 .algorithm(Algorithm::EC)
590 .purpose(KeyPurpose::SIGN)
591 .purpose(KeyPurpose::VERIFY)
592 .digest(digest)
593 .ec_curve(ec_curve);
594
David Drysdale79092242024-06-18 13:13:43 +0100595 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000596 &KeyDescriptor { domain, nspace, alias, blob: None },
597 None,
598 &gen_params,
599 0,
600 b"entropy",
601 )?;
602
603 // Must have a public key.
604 assert!(key_metadata.certificate.is_some());
605
606 // Should not have an attestation record.
607 assert!(key_metadata.certificateChain.is_none());
608
609 if domain == Domain::BLOB {
610 assert!(key_metadata.key.blob.is_some());
611 } else {
612 assert!(key_metadata.key.blob.is_none());
613 }
David Drysdale79092242024-06-18 13:13:43 +0100614 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000615 Ok(key_metadata)
616}
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000617
618/// Generate a RSA key with the given key parameters, alias, domain and namespace.
619pub fn generate_rsa_key(
David Drysdale79092242024-06-18 13:13:43 +0100620 sl: &SecLevel,
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000621 domain: Domain,
622 nspace: i64,
623 alias: Option<String>,
624 key_params: &KeyParams,
625 attest_key: Option<&KeyDescriptor>,
626) -> binder::Result<KeyMetadata> {
627 let mut gen_params = AuthSetBuilder::new()
628 .no_auth_required()
629 .algorithm(Algorithm::RSA)
630 .rsa_public_exponent(65537)
631 .key_size(key_params.key_size);
632
633 for purpose in &key_params.purpose {
634 gen_params = gen_params.purpose(*purpose);
635 }
636 if let Some(value) = key_params.digest {
637 gen_params = gen_params.digest(value)
638 }
639 if let Some(value) = key_params.padding {
640 gen_params = gen_params.padding_mode(value);
641 }
642 if let Some(value) = key_params.mgf_digest {
643 gen_params = gen_params.mgf_digest(value);
644 }
645 if let Some(value) = key_params.block_mode {
646 gen_params = gen_params.block_mode(value)
647 }
648 if let Some(value) = &key_params.att_challenge {
649 gen_params = gen_params.attestation_challenge(value.to_vec())
650 }
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000651
David Drysdale79092242024-06-18 13:13:43 +0100652 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000653 &KeyDescriptor { domain, nspace, alias, blob: None },
654 attest_key,
655 &gen_params,
656 0,
657 b"entropy",
658 )?;
659
660 // Must have a public key.
661 assert!(key_metadata.certificate.is_some());
662
David Drysdale38f2ca32023-01-10 13:10:51 +0000663 if attest_key.is_none() && key_params.att_challenge.is_some() {
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000664 // Should have an attestation record.
665 assert!(key_metadata.certificateChain.is_some());
666 } else {
667 // Should not have an attestation record.
668 assert!(key_metadata.certificateChain.is_none());
669 }
670
671 assert!(
672 (domain == Domain::BLOB && key_metadata.key.blob.is_some())
673 || key_metadata.key.blob.is_none()
674 );
675
David Drysdale79092242024-06-18 13:13:43 +0100676 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000677 // If `RSA_OAEP_MGF_DIGEST` tag is not mentioned explicitly while generating/importing a key,
678 // then make sure `RSA_OAEP_MGF_DIGEST` tag with default value (SHA1) must not be included in
679 // key authorization list.
680 if key_params.mgf_digest.is_none() {
681 assert!(!check_key_param(
682 &key_metadata.authorizations,
683 &KeyParameter {
684 tag: Tag::RSA_OAEP_MGF_DIGEST,
685 value: KeyParameterValue::Digest(Digest::SHA1)
686 }
687 ));
688 }
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000689 Ok(key_metadata)
690}
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000691
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000692/// Generate AES/3DES key.
693pub fn generate_sym_key(
David Drysdale79092242024-06-18 13:13:43 +0100694 sl: &SecLevel,
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000695 algorithm: Algorithm,
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000696 size: i32,
697 alias: &str,
698 padding_mode: &PaddingMode,
699 block_mode: &BlockMode,
700 min_mac_len: Option<i32>,
701) -> binder::Result<KeyMetadata> {
702 let mut gen_params = AuthSetBuilder::new()
703 .no_auth_required()
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000704 .algorithm(algorithm)
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000705 .purpose(KeyPurpose::ENCRYPT)
706 .purpose(KeyPurpose::DECRYPT)
707 .key_size(size)
708 .padding_mode(*padding_mode)
709 .block_mode(*block_mode);
710
711 if let Some(val) = min_mac_len {
712 gen_params = gen_params.min_mac_length(val);
713 }
714
David Drysdale79092242024-06-18 13:13:43 +0100715 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000716 &KeyDescriptor {
717 domain: Domain::APP,
718 nspace: -1,
719 alias: Some(alias.to_string()),
720 blob: None,
721 },
722 None,
723 &gen_params,
724 0,
725 b"entropy",
726 )?;
727
728 // Should not have public certificate.
729 assert!(key_metadata.certificate.is_none());
730
731 // Should not have an attestation record.
732 assert!(key_metadata.certificateChain.is_none());
David Drysdale79092242024-06-18 13:13:43 +0100733 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000734 Ok(key_metadata)
735}
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000736
737/// Generate HMAC key.
738pub fn generate_hmac_key(
David Drysdale79092242024-06-18 13:13:43 +0100739 sl: &SecLevel,
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000740 alias: &str,
741 key_size: i32,
742 min_mac_len: i32,
743 digest: Digest,
744) -> binder::Result<KeyMetadata> {
745 let gen_params = AuthSetBuilder::new()
746 .no_auth_required()
747 .algorithm(Algorithm::HMAC)
748 .purpose(KeyPurpose::SIGN)
749 .purpose(KeyPurpose::VERIFY)
750 .key_size(key_size)
751 .min_mac_length(min_mac_len)
752 .digest(digest);
753
David Drysdale79092242024-06-18 13:13:43 +0100754 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000755 &KeyDescriptor {
756 domain: Domain::APP,
757 nspace: -1,
758 alias: Some(alias.to_string()),
759 blob: None,
760 },
761 None,
762 &gen_params,
763 0,
764 b"entropy",
765 )?;
766
767 // Should not have public certificate.
768 assert!(key_metadata.certificate.is_none());
769
770 // Should not have an attestation record.
771 assert!(key_metadata.certificateChain.is_none());
772
David Drysdale79092242024-06-18 13:13:43 +0100773 check_key_authorizations(sl, &key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000774 Ok(key_metadata)
775}
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000776
777/// Generate RSA or EC attestation keys using below parameters -
778/// Purpose: ATTEST_KEY
779/// Digest: Digest::SHA_2_256
780/// Padding: PaddingMode::RSA_PKCS1_1_5_SIGN
781/// RSA-Key-Size: 2048
782/// EC-Curve: EcCurve::P_256
783pub fn generate_attestation_key(
David Drysdale79092242024-06-18 13:13:43 +0100784 sl: &SecLevel,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000785 algorithm: Algorithm,
786 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000787) -> binder::Result<KeyMetadata> {
788 assert!(algorithm == Algorithm::RSA || algorithm == Algorithm::EC);
789
790 if algorithm == Algorithm::RSA {
791 let alias = "ks_rsa_attest_test_key";
792 let metadata = generate_rsa_key(
David Drysdale79092242024-06-18 13:13:43 +0100793 sl,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000794 Domain::APP,
795 -1,
796 Some(alias.to_string()),
797 &KeyParams {
798 key_size: 2048,
799 purpose: vec![KeyPurpose::ATTEST_KEY],
800 padding: Some(PaddingMode::RSA_PKCS1_1_5_SIGN),
801 digest: Some(Digest::SHA_2_256),
802 mgf_digest: None,
803 block_mode: None,
804 att_challenge: Some(att_challenge.to_vec()),
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000805 },
806 None,
807 )
808 .unwrap();
809 Ok(metadata)
810 } else {
David Drysdale79092242024-06-18 13:13:43 +0100811 let metadata =
812 generate_ec_attestation_key(sl, att_challenge, Digest::SHA_2_256, EcCurve::P_256)
813 .unwrap();
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000814
815 Ok(metadata)
816 }
817}
818
819/// Generate EC attestation key with the given
820/// curve, attestation-challenge and attestation-app-id.
821pub fn generate_ec_attestation_key(
David Drysdale79092242024-06-18 13:13:43 +0100822 sl: &SecLevel,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000823 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000824 digest: Digest,
825 ec_curve: EcCurve,
826) -> binder::Result<KeyMetadata> {
827 let alias = "ks_attest_ec_test_key";
828 let gen_params = AuthSetBuilder::new()
829 .no_auth_required()
830 .algorithm(Algorithm::EC)
831 .purpose(KeyPurpose::ATTEST_KEY)
832 .ec_curve(ec_curve)
833 .digest(digest)
David Drysdale38f2ca32023-01-10 13:10:51 +0000834 .attestation_challenge(att_challenge.to_vec());
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000835
David Drysdale79092242024-06-18 13:13:43 +0100836 let attestation_key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000837 &KeyDescriptor {
838 domain: Domain::APP,
839 nspace: -1,
840 alias: Some(alias.to_string()),
841 blob: None,
842 },
843 None,
844 &gen_params,
845 0,
846 b"entropy",
847 )?;
848
849 // Should have public certificate.
850 assert!(attestation_key_metadata.certificate.is_some());
851 // Should have an attestation record.
852 assert!(attestation_key_metadata.certificateChain.is_some());
853
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000854 check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +0100855 sl,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000856 &attestation_key_metadata.authorizations,
857 &gen_params,
858 KeyOrigin::GENERATED,
859 );
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000860 Ok(attestation_key_metadata)
861}
862
863/// Generate EC-P-256 key and attest it with given attestation key.
864pub fn generate_ec_256_attested_key(
David Drysdale79092242024-06-18 13:13:43 +0100865 sl: &SecLevel,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000866 alias: Option<String>,
867 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000868 attest_key: &KeyDescriptor,
869) -> binder::Result<KeyMetadata> {
870 let ec_gen_params = AuthSetBuilder::new()
871 .no_auth_required()
872 .algorithm(Algorithm::EC)
873 .purpose(KeyPurpose::SIGN)
874 .purpose(KeyPurpose::VERIFY)
875 .digest(Digest::SHA_2_256)
876 .ec_curve(EcCurve::P_256)
David Drysdale38f2ca32023-01-10 13:10:51 +0000877 .attestation_challenge(att_challenge.to_vec());
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000878
David Drysdale79092242024-06-18 13:13:43 +0100879 let ec_key_metadata = sl
880 .binder
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000881 .generateKey(
882 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: None },
883 Some(attest_key),
884 &ec_gen_params,
885 0,
886 b"entropy",
887 )
888 .unwrap();
889
890 // Should have public certificate.
891 assert!(ec_key_metadata.certificate.is_some());
892 // Shouldn't have an attestation record.
893 assert!(ec_key_metadata.certificateChain.is_none());
894
David Drysdale79092242024-06-18 13:13:43 +0100895 check_key_authorizations(
896 sl,
897 &ec_key_metadata.authorizations,
898 &ec_gen_params,
899 KeyOrigin::GENERATED,
900 );
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000901 Ok(ec_key_metadata)
902}
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000903
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000904/// Imports above defined RSA key - `RSA_2048_KEY` and validates imported key parameters.
905pub fn import_rsa_2048_key(
David Drysdale79092242024-06-18 13:13:43 +0100906 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000907 domain: Domain,
908 nspace: i64,
909 alias: Option<String>,
910 import_params: AuthSetBuilder,
911) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +0100912 let key_metadata = sl
913 .binder
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000914 .importKey(
915 &KeyDescriptor { domain, nspace, alias, blob: None },
916 None,
917 &import_params,
918 0,
919 RSA_2048_KEY,
920 )
921 .unwrap();
922
923 assert!(key_metadata.certificate.is_some());
924 assert!(key_metadata.certificateChain.is_none());
925
David Drysdale79092242024-06-18 13:13:43 +0100926 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000927
928 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000929 assert!(check_key_param(
930 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000931 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::RSA) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000932 ));
933
934 assert!(check_key_param(
935 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000936 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(2048) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000937 ));
938
939 assert!(check_key_param(
940 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000941 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000942 ));
943
944 assert!(check_key_param(
945 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000946 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000947 tag: Tag::RSA_PUBLIC_EXPONENT,
948 value: KeyParameterValue::LongInteger(65537)
949 }
950 ));
951
952 assert!(check_key_param(
953 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000954 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000955 tag: Tag::PADDING,
956 value: KeyParameterValue::PaddingMode(PaddingMode::RSA_PSS)
957 }
958 ));
959
960 assert!(check_key_param(
961 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000962 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000963 ));
964
965 Ok(key_metadata)
966}
967
968/// Imports above defined EC key - `EC_P_256_KEY` and validates imported key parameters.
969pub fn import_ec_p_256_key(
David Drysdale79092242024-06-18 13:13:43 +0100970 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000971 domain: Domain,
972 nspace: i64,
973 alias: Option<String>,
974 import_params: AuthSetBuilder,
975) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +0100976 let key_metadata = sl
977 .binder
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000978 .importKey(
979 &KeyDescriptor { domain, nspace, alias, blob: None },
980 None,
981 &import_params,
982 0,
983 EC_P_256_KEY,
984 )
985 .unwrap();
986
987 assert!(key_metadata.certificate.is_some());
988 assert!(key_metadata.certificateChain.is_none());
989
David Drysdale79092242024-06-18 13:13:43 +0100990 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000991
992 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000993 assert!(check_key_param(
994 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000995 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::EC) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000996 ));
997
998 assert!(check_key_param(
999 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001000 &KeyParameter { tag: Tag::EC_CURVE, value: KeyParameterValue::EcCurve(EcCurve::P_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001001 ));
1002
1003 assert!(check_key_param(
1004 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001005 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001006 ));
1007 assert!(check_key_param(
1008 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001009 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001010 ));
1011
1012 Ok(key_metadata)
1013}
1014
1015/// Import sample AES key and validate its key parameters.
1016pub fn import_aes_key(
David Drysdale79092242024-06-18 13:13:43 +01001017 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001018 domain: Domain,
1019 nspace: i64,
1020 alias: Option<String>,
1021) -> binder::Result<KeyMetadata> {
1022 static AES_KEY: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
1023 let key_size = AES_KEY.len() * 8;
1024
1025 let import_params = AuthSetBuilder::new()
1026 .no_auth_required()
1027 .algorithm(Algorithm::AES)
1028 .block_mode(BlockMode::ECB)
1029 .key_size(key_size.try_into().unwrap())
1030 .purpose(KeyPurpose::ENCRYPT)
1031 .purpose(KeyPurpose::DECRYPT)
1032 .padding_mode(PaddingMode::PKCS7);
1033
David Drysdale79092242024-06-18 13:13:43 +01001034 let key_metadata = sl.binder.importKey(
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001035 &KeyDescriptor { domain, nspace, alias, blob: None },
1036 None,
1037 &import_params,
1038 0,
1039 AES_KEY,
1040 )?;
1041
David Drysdale79092242024-06-18 13:13:43 +01001042 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001043
1044 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001045 assert!(check_key_param(
1046 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001047 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::AES) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001048 ));
1049 assert!(check_key_param(
1050 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001051 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(128) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001052 ));
1053 assert!(check_key_param(
1054 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001055 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001056 tag: Tag::PADDING,
1057 value: KeyParameterValue::PaddingMode(PaddingMode::PKCS7)
1058 }
1059 ));
1060 assert!(check_key_param(
1061 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001062 &KeyParameter { tag: Tag::BLOCK_MODE, value: KeyParameterValue::BlockMode(BlockMode::ECB) }
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 { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001067 ));
1068
1069 Ok(key_metadata)
1070}
1071
1072/// Import sample 3DES key and validate its key parameters.
1073pub fn import_3des_key(
David Drysdale79092242024-06-18 13:13:43 +01001074 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001075 domain: Domain,
1076 nspace: i64,
1077 alias: Option<String>,
1078) -> binder::Result<KeyMetadata> {
1079 static TRIPLE_DES_KEY: &[u8] = &[
1080 0xa4, 0x9d, 0x75, 0x64, 0x19, 0x9e, 0x97, 0xcb, 0x52, 0x9d, 0x2c, 0x9d, 0x97, 0xbf, 0x2f,
1081 0x98, 0xd3, 0x5e, 0xdf, 0x57, 0xba, 0x1f, 0x73, 0x58,
1082 ];
1083
1084 let import_params = AuthSetBuilder::new()
1085 .no_auth_required()
1086 .algorithm(Algorithm::TRIPLE_DES)
1087 .block_mode(BlockMode::ECB)
1088 .key_size(168)
1089 .purpose(KeyPurpose::ENCRYPT)
1090 .purpose(KeyPurpose::DECRYPT)
1091 .padding_mode(PaddingMode::PKCS7);
1092
David Drysdale79092242024-06-18 13:13:43 +01001093 let key_metadata = sl.binder.importKey(
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001094 &KeyDescriptor { domain, nspace, alias, blob: None },
1095 None,
1096 &import_params,
1097 0,
1098 TRIPLE_DES_KEY,
1099 )?;
1100
David Drysdale79092242024-06-18 13:13:43 +01001101 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001102
1103 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001104 assert!(check_key_param(
1105 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001106 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001107 tag: Tag::ALGORITHM,
1108 value: KeyParameterValue::Algorithm(Algorithm::TRIPLE_DES)
1109 }
1110 ));
1111 assert!(check_key_param(
1112 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001113 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(168) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001114 ));
1115 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::PADDING,
1119 value: KeyParameterValue::PaddingMode(PaddingMode::PKCS7)
1120 }
1121 ));
1122 assert!(check_key_param(
1123 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001124 &KeyParameter { tag: Tag::BLOCK_MODE, value: KeyParameterValue::BlockMode(BlockMode::ECB) }
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 { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001129 ));
1130
1131 Ok(key_metadata)
1132}
1133
1134/// Import sample HMAC key and validate its key parameters.
1135pub fn import_hmac_key(
David Drysdale79092242024-06-18 13:13:43 +01001136 sl: &SecLevel,
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001137 domain: Domain,
1138 nspace: i64,
1139 alias: Option<String>,
1140) -> binder::Result<KeyMetadata> {
1141 static HMAC_KEY: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
1142 let key_size = HMAC_KEY.len() * 8;
1143
1144 let import_params = AuthSetBuilder::new()
1145 .no_auth_required()
1146 .algorithm(Algorithm::HMAC)
1147 .key_size(key_size.try_into().unwrap())
1148 .purpose(KeyPurpose::SIGN)
1149 .purpose(KeyPurpose::VERIFY)
1150 .digest(Digest::SHA_2_256)
1151 .min_mac_length(256);
1152
David Drysdale79092242024-06-18 13:13:43 +01001153 let key_metadata = sl.binder.importKey(
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001154 &KeyDescriptor { domain, nspace, alias, blob: None },
1155 None,
1156 &import_params,
1157 0,
1158 HMAC_KEY,
1159 )?;
1160
David Drysdale79092242024-06-18 13:13:43 +01001161 check_key_authorizations(sl, &key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001162
1163 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001164 assert!(check_key_param(
1165 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001166 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::HMAC) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001167 ));
1168 assert!(check_key_param(
1169 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001170 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(128) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001171 ));
1172 assert!(check_key_param(
1173 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001174 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001175 ));
1176 assert!(check_key_param(
1177 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001178 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001179 ));
1180
1181 Ok(key_metadata)
1182}
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001183
1184/// Imports RSA encryption key with WRAP_KEY purpose.
1185pub fn import_wrapping_key(
David Drysdale79092242024-06-18 13:13:43 +01001186 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001187 wrapping_key_data: &[u8],
1188 wrapping_key_alias: Option<String>,
1189) -> binder::Result<KeyMetadata> {
1190 let wrapping_key_params = AuthSetBuilder::new()
1191 .no_auth_required()
1192 .algorithm(Algorithm::RSA)
1193 .digest(Digest::SHA_2_256)
1194 .purpose(KeyPurpose::ENCRYPT)
1195 .purpose(KeyPurpose::DECRYPT)
1196 .purpose(KeyPurpose::WRAP_KEY)
1197 .padding_mode(PaddingMode::RSA_OAEP)
1198 .key_size(2048)
1199 .rsa_public_exponent(65537)
1200 .cert_not_before(0)
1201 .cert_not_after(253402300799000);
1202
David Drysdale79092242024-06-18 13:13:43 +01001203 sl.binder.importKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001204 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias: wrapping_key_alias, blob: None },
1205 None,
1206 &wrapping_key_params,
1207 0,
1208 wrapping_key_data,
1209 )
1210}
1211
1212/// Import wrapped key using given wrapping key.
1213pub fn import_wrapped_key(
David Drysdale79092242024-06-18 13:13:43 +01001214 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001215 alias: Option<String>,
1216 wrapping_key_metadata: &KeyMetadata,
1217 wrapped_key: Option<Vec<u8>>,
1218) -> binder::Result<KeyMetadata> {
1219 let unwrap_params =
1220 AuthSetBuilder::new().digest(Digest::SHA_2_256).padding_mode(PaddingMode::RSA_OAEP);
1221
1222 let authenticator_spec: &[AuthenticatorSpec] = &[AuthenticatorSpec {
1223 authenticatorType: HardwareAuthenticatorType::NONE,
1224 authenticatorId: 0,
1225 }];
1226
David Drysdale79092242024-06-18 13:13:43 +01001227 let key_metadata = sl.binder.importWrappedKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001228 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: wrapped_key },
1229 &wrapping_key_metadata.key,
1230 None,
1231 &unwrap_params,
1232 authenticator_spec,
1233 )?;
1234
1235 Ok(key_metadata)
1236}
1237
1238/// Import wrapping key and then import wrapped key using wrapping key.
1239pub fn import_wrapping_key_and_wrapped_key(
David Drysdale79092242024-06-18 13:13:43 +01001240 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001241 domain: Domain,
1242 nspace: i64,
1243 alias: Option<String>,
1244 wrapping_key_alias: Option<String>,
1245 wrapping_key_params: AuthSetBuilder,
1246) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +01001247 let wrapping_key_metadata = sl.binder.importKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001248 &KeyDescriptor { domain, nspace, alias: wrapping_key_alias, blob: None },
1249 None,
1250 &wrapping_key_params,
1251 0,
1252 WRAPPING_KEY,
1253 )?;
1254
David Drysdale79092242024-06-18 13:13:43 +01001255 import_wrapped_key(sl, alias, &wrapping_key_metadata, Some(WRAPPED_KEY.to_vec()))
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001256}
1257
1258/// Import given key material as AES-256-GCM-NONE transport key.
1259pub fn import_transport_key(
David Drysdale79092242024-06-18 13:13:43 +01001260 sl: &SecLevel,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001261 transport_key_alias: Option<String>,
1262 transport_key: &[u8],
1263) -> binder::Result<KeyMetadata> {
1264 let transport_key_params = AuthSetBuilder::new()
1265 .no_auth_required()
1266 .algorithm(Algorithm::AES)
1267 .block_mode(BlockMode::GCM)
1268 .padding_mode(PaddingMode::NONE)
1269 .key_size(256)
1270 .caller_nonce()
1271 .min_mac_length(128)
1272 .purpose(KeyPurpose::ENCRYPT)
1273 .purpose(KeyPurpose::DECRYPT);
1274
David Drysdale79092242024-06-18 13:13:43 +01001275 sl.binder.importKey(
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001276 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias: transport_key_alias, blob: None },
1277 None,
1278 &transport_key_params,
1279 0,
1280 transport_key,
1281 )
1282}
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001283
1284/// Generate EC key with purpose AGREE_KEY.
1285pub fn generate_ec_agree_key(
David Drysdale79092242024-06-18 13:13:43 +01001286 sl: &SecLevel,
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001287 ec_curve: EcCurve,
1288 digest: Digest,
1289 domain: Domain,
1290 nspace: i64,
1291 alias: Option<String>,
1292) -> binder::Result<KeyMetadata> {
1293 let gen_params = AuthSetBuilder::new()
1294 .no_auth_required()
1295 .algorithm(Algorithm::EC)
1296 .purpose(KeyPurpose::AGREE_KEY)
1297 .digest(digest)
1298 .ec_curve(ec_curve);
1299
David Drysdale79092242024-06-18 13:13:43 +01001300 match sl.binder.generateKey(
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001301 &KeyDescriptor { domain, nspace, alias, blob: None },
1302 None,
1303 &gen_params,
1304 0,
1305 b"entropy",
1306 ) {
1307 Ok(key_metadata) => {
1308 assert!(key_metadata.certificate.is_some());
1309 if domain == Domain::BLOB {
1310 assert!(key_metadata.key.blob.is_some());
1311 }
1312
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001313 check_key_authorizations(
David Drysdale79092242024-06-18 13:13:43 +01001314 sl,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001315 &key_metadata.authorizations,
1316 &gen_params,
1317 KeyOrigin::GENERATED,
1318 );
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001319 Ok(key_metadata)
1320 }
1321 Err(e) => Err(e),
1322 }
1323}
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001324
1325/// Helper method to import AES keys `total_count` of times.
1326pub fn import_aes_keys(
David Drysdale79092242024-06-18 13:13:43 +01001327 sl: &SecLevel,
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001328 alias_prefix: String,
1329 total_count: Range<i32>,
1330) -> binder::Result<HashSet<String>> {
1331 let mut imported_key_aliases = HashSet::new();
1332
1333 // Import Total number of keys with given alias prefix.
1334 for count in total_count {
1335 let mut alias = String::new();
1336 write!(alias, "{}_{}", alias_prefix, count).unwrap();
1337 imported_key_aliases.insert(alias.clone());
1338
David Drysdale79092242024-06-18 13:13:43 +01001339 import_aes_key(sl, Domain::APP, -1, Some(alias))?;
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001340 }
1341
1342 Ok(imported_key_aliases)
1343}
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001344
1345/// Generate attested EC-P_256 key with device id attestation.
1346pub fn generate_key_with_attest_id(
David Drysdale79092242024-06-18 13:13:43 +01001347 sl: &SecLevel,
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001348 algorithm: Algorithm,
1349 alias: Option<String>,
1350 att_challenge: &[u8],
1351 attest_key: &KeyDescriptor,
1352 attest_id: Tag,
1353 value: Vec<u8>,
1354) -> binder::Result<KeyMetadata> {
1355 assert!(algorithm == Algorithm::RSA || algorithm == Algorithm::EC);
1356
1357 let mut ec_gen_params;
1358 if algorithm == Algorithm::EC {
1359 ec_gen_params = AuthSetBuilder::new()
1360 .no_auth_required()
1361 .algorithm(Algorithm::EC)
1362 .purpose(KeyPurpose::SIGN)
1363 .purpose(KeyPurpose::VERIFY)
1364 .digest(Digest::SHA_2_256)
1365 .ec_curve(EcCurve::P_256)
1366 .attestation_challenge(att_challenge.to_vec());
1367 } else {
1368 ec_gen_params = AuthSetBuilder::new()
1369 .no_auth_required()
1370 .algorithm(Algorithm::RSA)
1371 .rsa_public_exponent(65537)
1372 .key_size(2048)
1373 .purpose(KeyPurpose::SIGN)
1374 .purpose(KeyPurpose::VERIFY)
1375 .digest(Digest::SHA_2_256)
1376 .padding_mode(PaddingMode::RSA_PKCS1_1_5_SIGN)
1377 .attestation_challenge(att_challenge.to_vec());
1378 }
1379
1380 match attest_id {
1381 Tag::ATTESTATION_ID_BRAND => {
1382 ec_gen_params = ec_gen_params.attestation_device_brand(value);
1383 }
1384 Tag::ATTESTATION_ID_DEVICE => {
1385 ec_gen_params = ec_gen_params.attestation_device_name(value);
1386 }
1387 Tag::ATTESTATION_ID_PRODUCT => {
1388 ec_gen_params = ec_gen_params.attestation_device_product_name(value);
1389 }
1390 Tag::ATTESTATION_ID_SERIAL => {
1391 ec_gen_params = ec_gen_params.attestation_device_serial(value);
1392 }
1393 Tag::ATTESTATION_ID_MANUFACTURER => {
1394 ec_gen_params = ec_gen_params.attestation_device_manufacturer(value);
1395 }
1396 Tag::ATTESTATION_ID_MODEL => {
1397 ec_gen_params = ec_gen_params.attestation_device_model(value);
1398 }
1399 Tag::ATTESTATION_ID_IMEI => {
1400 ec_gen_params = ec_gen_params.attestation_device_imei(value);
1401 }
1402 Tag::ATTESTATION_ID_SECOND_IMEI => {
1403 ec_gen_params = ec_gen_params.attestation_device_second_imei(value);
1404 }
1405 _ => {
1406 panic!("Unknown attestation id");
1407 }
1408 }
1409
David Drysdale79092242024-06-18 13:13:43 +01001410 sl.binder.generateKey(
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001411 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: None },
1412 Some(attest_key),
1413 &ec_gen_params,
1414 0,
1415 b"entropy",
1416 )
1417}
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001418
1419/// Generate Key and validate key characteristics.
1420pub fn generate_key(
David Drysdale79092242024-06-18 13:13:43 +01001421 sl: &SecLevel,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001422 gen_params: &AuthSetBuilder,
1423 alias: &str,
1424) -> binder::Result<KeyMetadata> {
David Drysdale79092242024-06-18 13:13:43 +01001425 let key_metadata = sl.binder.generateKey(
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001426 &KeyDescriptor {
1427 domain: Domain::APP,
1428 nspace: -1,
1429 alias: Some(alias.to_string()),
1430 blob: None,
1431 },
1432 None,
1433 gen_params,
1434 0,
1435 b"entropy",
1436 )?;
1437
1438 if gen_params.iter().any(|kp| {
1439 matches!(
1440 kp.value,
1441 KeyParameterValue::Algorithm(Algorithm::RSA)
1442 | KeyParameterValue::Algorithm(Algorithm::EC)
1443 )
1444 }) {
1445 assert!(key_metadata.certificate.is_some());
1446 if gen_params.iter().any(|kp| kp.tag == Tag::ATTESTATION_CHALLENGE) {
1447 assert!(key_metadata.certificateChain.is_some());
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +00001448 let mut cert_chain: Vec<u8> = Vec::new();
1449 cert_chain.extend(key_metadata.certificate.as_ref().unwrap());
1450 cert_chain.extend(key_metadata.certificateChain.as_ref().unwrap());
Rajesh Nyamagoudb1c8e832023-06-06 01:39:44 +00001451 let strict_issuer_check =
1452 !(gen_params.iter().any(|kp| kp.tag == Tag::DEVICE_UNIQUE_ATTESTATION));
1453 validate_certchain_with_strict_issuer_check(&cert_chain, strict_issuer_check)
1454 .expect("Error while validating cert chain");
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +00001455 }
1456
1457 if let Some(challenge_param) =
1458 gen_params.iter().find(|kp| kp.tag == Tag::ATTESTATION_CHALLENGE)
1459 {
1460 if let KeyParameterValue::Blob(val) = &challenge_param.value {
1461 let att_challenge = get_value_from_attest_record(
1462 key_metadata.certificate.as_ref().unwrap(),
1463 challenge_param.tag,
1464 key_metadata.keySecurityLevel,
1465 )
1466 .expect("Attestation challenge verification failed.");
1467 assert_eq!(&att_challenge, val);
1468 }
1469
1470 let att_app_id = get_value_from_attest_record(
1471 key_metadata.certificate.as_ref().unwrap(),
1472 Tag::ATTESTATION_APPLICATION_ID,
1473 SecurityLevel::KEYSTORE,
1474 )
1475 .expect("Attestation application id verification failed.");
1476 assert!(!att_app_id.is_empty());
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001477 }
1478 }
David Drysdale79092242024-06-18 13:13:43 +01001479 check_key_authorizations(sl, &key_metadata.authorizations, gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001480
1481 Ok(key_metadata)
1482}
1483
1484/// Generate a key using given authorizations and create an operation using the generated key.
1485pub fn create_key_and_operation(
David Drysdale79092242024-06-18 13:13:43 +01001486 sl: &SecLevel,
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001487 gen_params: &AuthSetBuilder,
1488 op_params: &AuthSetBuilder,
1489 alias: &str,
1490) -> binder::Result<CreateOperationResponse> {
David Drysdale79092242024-06-18 13:13:43 +01001491 let key_metadata = generate_key(sl, gen_params, alias)?;
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001492
David Drysdale79092242024-06-18 13:13:43 +01001493 sl.binder.createOperation(&key_metadata.key, op_params, false)
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001494}