blob: 24ce6e197db07a05b41aa3dee2a029af4233fc50 [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
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +000017use anyhow::Result;
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +000018use core::ops::Range;
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +000019use nix::unistd::getuid;
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +000020use std::collections::HashSet;
21use std::fmt::Write;
22
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +000023use binder::ThreadState;
24
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +000025use android_hardware_security_keymint::aidl::android::hardware::security::keymint::{
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +000026 Algorithm::Algorithm, BlockMode::BlockMode, Digest::Digest, EcCurve::EcCurve,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +000027 ErrorCode::ErrorCode, HardwareAuthenticatorType::HardwareAuthenticatorType,
28 KeyOrigin::KeyOrigin, KeyParameter::KeyParameter, KeyParameterValue::KeyParameterValue,
29 KeyPurpose::KeyPurpose, PaddingMode::PaddingMode, Tag::Tag,
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +000030};
31use android_system_keystore2::aidl::android::system::keystore2::{
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +000032 AuthenticatorSpec::AuthenticatorSpec, Authorization::Authorization,
33 CreateOperationResponse::CreateOperationResponse, Domain::Domain,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +000034 IKeystoreSecurityLevel::IKeystoreSecurityLevel, KeyDescriptor::KeyDescriptor,
35 KeyMetadata::KeyMetadata, ResponseCode::ResponseCode,
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +000036};
37
38use crate::authorizations::AuthSetBuilder;
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +000039use android_system_keystore2::binder::{ExceptionCode, Result as BinderResult};
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +000040
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +000041use crate::ffi_test_utils::{get_os_patchlevel, get_os_version, get_vendor_patchlevel};
42
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +000043/// Shell namespace.
44pub const SELINUX_SHELL_NAMESPACE: i64 = 1;
Rajesh Nyamagouddc6fb232021-12-08 21:27:15 +000045/// Vold namespace.
46pub const SELINUX_VOLD_NAMESPACE: i64 = 100;
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +000047
Rajesh Nyamagoudfa7c0f12021-12-02 17:15:48 +000048/// SU context.
49pub const TARGET_SU_CTX: &str = "u:r:su:s0";
50
51/// Vold context
52pub const TARGET_VOLD_CTX: &str = "u:r:vold:s0";
53
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +000054/// Allowed tags in generated/imported key authorizations.
55/// See hardware/interfaces/security/keymint/aidl/android/hardware/security/keymint/Tag.aidl for the
56/// list feature tags.
57/// Note: This list need to be updated whenever a new Tag is introduced and is expected to be added
58/// in key authorizations.
59pub const ALLOWED_TAGS_IN_KEY_AUTHS: &[Tag] = &[
60 Tag::ACTIVE_DATETIME,
61 Tag::ALGORITHM,
62 Tag::ALLOW_WHILE_ON_BODY,
63 Tag::AUTH_TIMEOUT,
64 Tag::BLOCK_MODE,
65 Tag::BOOTLOADER_ONLY,
66 Tag::BOOT_PATCHLEVEL,
67 Tag::CALLER_NONCE,
68 Tag::CREATION_DATETIME,
69 Tag::DIGEST,
70 Tag::EARLY_BOOT_ONLY,
71 Tag::EC_CURVE,
72 Tag::IDENTITY_CREDENTIAL_KEY,
73 Tag::INCLUDE_UNIQUE_ID,
74 Tag::KEY_SIZE,
75 Tag::MAX_BOOT_LEVEL,
76 Tag::MAX_USES_PER_BOOT,
77 Tag::MIN_MAC_LENGTH,
78 Tag::NO_AUTH_REQUIRED,
79 Tag::ORIGIN,
80 Tag::ORIGINATION_EXPIRE_DATETIME,
81 Tag::OS_PATCHLEVEL,
82 Tag::OS_VERSION,
83 Tag::PADDING,
84 Tag::PURPOSE,
85 Tag::ROLLBACK_RESISTANCE,
86 Tag::RSA_OAEP_MGF_DIGEST,
87 Tag::RSA_PUBLIC_EXPONENT,
88 Tag::STORAGE_KEY,
89 Tag::TRUSTED_CONFIRMATION_REQUIRED,
90 Tag::TRUSTED_USER_PRESENCE_REQUIRED,
91 Tag::UNLOCKED_DEVICE_REQUIRED,
92 Tag::USAGE_COUNT_LIMIT,
93 Tag::USAGE_EXPIRE_DATETIME,
94 Tag::USER_AUTH_TYPE,
95 Tag::USER_ID,
96 Tag::USER_SECURE_ID,
97 Tag::VENDOR_PATCHLEVEL,
98];
99
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000100/// Key parameters to generate a key.
101pub struct KeyParams {
102 /// Key Size.
103 pub key_size: i32,
104 /// Key Purposes.
105 pub purpose: Vec<KeyPurpose>,
106 /// Padding Mode.
107 pub padding: Option<PaddingMode>,
108 /// Digest.
109 pub digest: Option<Digest>,
110 /// MFG Digest.
111 pub mgf_digest: Option<Digest>,
112 /// Block Mode.
113 pub block_mode: Option<BlockMode>,
114 /// Attestation challenge.
115 pub att_challenge: Option<Vec<u8>>,
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000116}
117
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000118/// DER-encoded PKCS#8 format RSA key. Generated using:
119/// openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -outform der | hexdump -e '30/1 "%02X" "\n"'
120pub static RSA_2048_KEY: &[u8] = &[
121 0x30, 0x82, 0x04, 0xBD, 0x02, 0x01, 0x00, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7,
122 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x04, 0xA7, 0x30, 0x82, 0x04, 0xA3, 0x02, 0x01,
123 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, 0xE5, 0x14, 0xE3, 0xC2, 0x43, 0xF3, 0x0F, 0xCC, 0x22, 0x73,
124 0x9C, 0x84, 0xCC, 0x1B, 0x6C, 0x97, 0x4B, 0xC9, 0xDF, 0x1F, 0xE2, 0xB8, 0x80, 0x85, 0xF9, 0x27,
125 0xAB, 0x97, 0x94, 0x58, 0x4B, 0xC9, 0x40, 0x94, 0x5A, 0xB4, 0xD4, 0xF8, 0xD0, 0x36, 0xC4, 0x86,
126 0x17, 0x7D, 0xA2, 0x48, 0x6D, 0x40, 0xF0, 0xB9, 0x61, 0x4F, 0xCE, 0x65, 0x80, 0x88, 0x81, 0x59,
127 0x95, 0x11, 0x24, 0xF4, 0x36, 0xB7, 0xB7, 0x37, 0x44, 0xF4, 0x6C, 0x1C, 0xEB, 0x04, 0x19, 0x78,
128 0xB2, 0x29, 0x4D, 0x21, 0x44, 0x16, 0x57, 0x58, 0x6D, 0x7D, 0x56, 0xB5, 0x99, 0xDD, 0xD2, 0xAD,
129 0x02, 0x9A, 0x72, 0x16, 0x67, 0xD6, 0x00, 0x9F, 0x69, 0xE0, 0x25, 0xEE, 0x7C, 0x86, 0x54, 0x27,
130 0x4B, 0x50, 0xEF, 0x60, 0x52, 0x60, 0x82, 0xAA, 0x09, 0x15, 0x72, 0xD2, 0xEB, 0x01, 0x52, 0x04,
131 0x39, 0x60, 0xBC, 0x5E, 0x95, 0x07, 0xC8, 0xC2, 0x3A, 0x3A, 0xE2, 0xA4, 0x99, 0x6B, 0x27, 0xE3,
132 0xA3, 0x55, 0x69, 0xC4, 0xB3, 0x2D, 0x19, 0xC4, 0x34, 0x76, 0xFC, 0x27, 0xDA, 0x22, 0xB2, 0x62,
133 0x69, 0x25, 0xDE, 0x0D, 0xE7, 0x54, 0x3C, 0xBB, 0x61, 0xD2, 0x20, 0xDA, 0x7B, 0x6E, 0x63, 0xBD,
134 0x9A, 0x4B, 0xCD, 0x75, 0xC6, 0xA1, 0x5E, 0x1C, 0x3E, 0xD5, 0x63, 0x59, 0x22, 0x7E, 0xE0, 0x6C,
135 0x98, 0x25, 0x63, 0x97, 0x56, 0xDF, 0x71, 0xF5, 0x4C, 0x78, 0xE9, 0xE1, 0xD5, 0xFC, 0xF8, 0x5A,
136 0x5B, 0xF6, 0x1D, 0xFA, 0x5A, 0x99, 0x4C, 0x99, 0x19, 0x21, 0x1D, 0xF5, 0x24, 0x07, 0xEF, 0x8A,
137 0xC9, 0x9F, 0xE7, 0x3F, 0xBB, 0x46, 0x1A, 0x16, 0x96, 0xC6, 0xD6, 0x12, 0x7E, 0xDA, 0xCB, 0xEB,
138 0x2F, 0x1D, 0x3B, 0x31, 0xCC, 0x55, 0x63, 0xA2, 0x6F, 0x8A, 0xDE, 0x35, 0x52, 0x40, 0x04, 0xBF,
139 0xE0, 0x82, 0x32, 0xE1, 0x6D, 0x8B, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, 0x00, 0x2D,
140 0x1F, 0x71, 0x41, 0x79, 0xBA, 0xED, 0xD8, 0xAA, 0xCC, 0x94, 0xFE, 0xFF, 0x69, 0x43, 0x79, 0x85,
141 0xBF, 0x2C, 0xC9, 0x0E, 0x12, 0x83, 0x96, 0x60, 0x1E, 0x75, 0x49, 0x35, 0x3A, 0x33, 0x2B, 0x60,
142 0x22, 0x18, 0xBF, 0xD7, 0xD7, 0x6E, 0xC3, 0xEA, 0xEF, 0xF2, 0xBE, 0x97, 0x71, 0xA6, 0xBB, 0x8C,
143 0xEF, 0x27, 0x00, 0xDE, 0x49, 0xD6, 0x08, 0x8D, 0x5A, 0x04, 0xE7, 0xCC, 0x9C, 0xA2, 0x0E, 0x8B,
144 0xF3, 0x42, 0x0C, 0xD7, 0x22, 0xD7, 0x14, 0x06, 0xA4, 0x64, 0x8B, 0x88, 0x1A, 0xCE, 0x5B, 0x8C,
145 0x36, 0xE9, 0xD2, 0x2F, 0x7B, 0x33, 0xE4, 0xA2, 0xB3, 0xDB, 0x78, 0x6A, 0x92, 0x89, 0x3F, 0x78,
146 0xFD, 0xED, 0x8F, 0xEE, 0x48, 0xCC, 0x94, 0x75, 0x0D, 0x0C, 0x63, 0xD3, 0xD2, 0xE8, 0x47, 0x04,
147 0x55, 0xD3, 0xD6, 0x3A, 0xB8, 0xDA, 0xFB, 0x76, 0x99, 0x48, 0x68, 0x0A, 0x92, 0xA2, 0xCD, 0xF7,
148 0x45, 0x8B, 0x50, 0xFE, 0xF9, 0x1A, 0x33, 0x24, 0x3C, 0x2E, 0xDE, 0x88, 0xAD, 0xB2, 0x5B, 0x9F,
149 0x44, 0xEA, 0xD1, 0x9F, 0xC7, 0x9F, 0x02, 0x5E, 0x31, 0x61, 0xB3, 0xD6, 0xE2, 0xE1, 0xBC, 0xFB,
150 0x1C, 0xDB, 0xBD, 0xB2, 0x9A, 0xE5, 0xEF, 0xDA, 0xCD, 0x29, 0xA5, 0x45, 0xCC, 0x67, 0x01, 0x8B,
151 0x1C, 0x1D, 0x0E, 0x8F, 0x73, 0x69, 0x4D, 0x4D, 0xF6, 0x9D, 0xA6, 0x6C, 0x9A, 0x1C, 0xF4, 0x5C,
152 0xE4, 0x83, 0x9A, 0x77, 0x12, 0x01, 0xBD, 0xCE, 0x66, 0x3A, 0x4B, 0x3D, 0x6E, 0xE0, 0x6E, 0x82,
153 0x98, 0xDE, 0x74, 0x11, 0x47, 0xEC, 0x7A, 0x3A, 0xA9, 0xD8, 0x48, 0x00, 0x26, 0x64, 0x47, 0x7B,
154 0xAE, 0x55, 0x9D, 0x29, 0x22, 0xB4, 0xB3, 0xB9, 0xB1, 0x64, 0xEA, 0x3B, 0x5A, 0xD3, 0x3F, 0x8D,
155 0x0F, 0x14, 0x7E, 0x4E, 0xB8, 0x1B, 0x06, 0xFC, 0xB1, 0x7E, 0xCD, 0xB9, 0x1A, 0x4E, 0xA1, 0x02,
156 0x81, 0x81, 0x00, 0xF9, 0xDE, 0xEE, 0xED, 0x13, 0x2F, 0xBB, 0xE7, 0xE2, 0xB3, 0x2D, 0x98, 0xD2,
157 0xE8, 0x25, 0x07, 0x5A, 0x1E, 0x51, 0x0A, 0xC8, 0xAD, 0x50, 0x4B, 0x80, 0xC6, 0x22, 0xF5, 0x9B,
158 0x08, 0xE6, 0x3D, 0x01, 0xC6, 0x3E, 0xC8, 0xD2, 0x54, 0x9F, 0x91, 0x77, 0x95, 0xCD, 0xCA, 0xC7,
159 0xE7, 0x47, 0x94, 0xA9, 0x5F, 0x4E, 0xBE, 0x31, 0x3D, 0xB4, 0xAF, 0x43, 0x0F, 0xDC, 0x8D, 0x9C,
160 0x1E, 0x52, 0x7B, 0x72, 0x21, 0x34, 0xB3, 0x96, 0x7C, 0x9C, 0xB8, 0x51, 0x65, 0x60, 0xAC, 0x3D,
161 0x11, 0x32, 0xB8, 0xD6, 0x34, 0x35, 0x66, 0xD0, 0x30, 0xB9, 0xE9, 0x67, 0x2C, 0x87, 0x73, 0x43,
162 0x9C, 0x12, 0x16, 0x7D, 0x4A, 0xD9, 0xA3, 0x4C, 0x24, 0x64, 0x6A, 0x32, 0x8E, 0xC3, 0xD8, 0x00,
163 0x90, 0x5C, 0x4D, 0x65, 0x01, 0x53, 0x8A, 0xD0, 0x87, 0xCE, 0x96, 0xEF, 0xFA, 0x73, 0x03, 0xF1,
164 0xDC, 0x1B, 0x9B, 0x02, 0x81, 0x81, 0x00, 0xEA, 0xB3, 0x69, 0x00, 0x11, 0x0E, 0x50, 0xAA, 0xD3,
165 0x22, 0x51, 0x78, 0x9D, 0xFF, 0x05, 0x62, 0xBC, 0x9A, 0x67, 0x86, 0xE1, 0xC5, 0x02, 0x2D, 0x14,
166 0x11, 0x29, 0x30, 0xE7, 0x90, 0x5D, 0x72, 0x6F, 0xC5, 0x62, 0xEB, 0xD4, 0xB0, 0x3F, 0x3D, 0xDC,
167 0xB9, 0xFC, 0x2B, 0x5C, 0xBD, 0x9E, 0x71, 0x81, 0x5C, 0xC5, 0xFE, 0xDF, 0x69, 0x73, 0x12, 0x66,
168 0x92, 0x06, 0xD4, 0xD5, 0x8F, 0xDF, 0x14, 0x2E, 0x9C, 0xD0, 0x4C, 0xC2, 0x4D, 0x31, 0x2E, 0x47,
169 0xA5, 0xDC, 0x8A, 0x83, 0x7B, 0xE8, 0xA5, 0xC3, 0x03, 0x98, 0xD8, 0xBF, 0xF4, 0x7D, 0x6E, 0x87,
170 0x55, 0xE4, 0x0F, 0x15, 0x10, 0xC8, 0x76, 0x4F, 0xAD, 0x1D, 0x1C, 0x95, 0x41, 0x9D, 0x88, 0xEC,
171 0x8C, 0xDA, 0xBA, 0x90, 0x7F, 0x8D, 0xD9, 0x8B, 0x47, 0x6C, 0x0C, 0xFF, 0xBA, 0x73, 0x00, 0x20,
172 0x1F, 0xF7, 0x7E, 0x5F, 0xF4, 0xEC, 0xD1, 0x02, 0x81, 0x80, 0x16, 0xB7, 0x43, 0xB5, 0x5D, 0xD7,
173 0x2B, 0x18, 0x0B, 0xAE, 0x0A, 0x69, 0x28, 0x53, 0x5E, 0x7A, 0x6A, 0xA0, 0xF2, 0xF1, 0x2E, 0x09,
174 0x43, 0x91, 0x79, 0xA5, 0x89, 0xAC, 0x16, 0x6A, 0x1A, 0xB4, 0x55, 0x22, 0xF6, 0xB6, 0x3F, 0x18,
175 0xDE, 0x60, 0xD5, 0x24, 0x53, 0x4F, 0x2A, 0x19, 0x46, 0x92, 0xA7, 0x4B, 0x38, 0xD7, 0x65, 0x96,
176 0x9C, 0x84, 0x8A, 0x6E, 0x38, 0xB8, 0xCF, 0x06, 0x9A, 0xAD, 0x0A, 0x55, 0x26, 0x7B, 0x65, 0x24,
177 0xF3, 0x02, 0x76, 0xB3, 0xE6, 0xB4, 0x01, 0xE1, 0x3C, 0x61, 0x3D, 0x68, 0x05, 0xAA, 0xD1, 0x26,
178 0x7C, 0xE0, 0x51, 0x36, 0xE5, 0x21, 0x7F, 0x76, 0x02, 0xD6, 0xF4, 0x91, 0x07, 0x74, 0x27, 0x09,
179 0xEF, 0xEF, 0x0F, 0xA5, 0x96, 0xFC, 0x5E, 0x20, 0xC1, 0xA3, 0x6F, 0x99, 0x4D, 0x45, 0x03, 0x6C,
180 0x35, 0x45, 0xD7, 0x8F, 0x47, 0x41, 0x86, 0x8D, 0x62, 0x1D, 0x02, 0x81, 0x81, 0x00, 0xC3, 0x93,
181 0x85, 0xA7, 0xFC, 0x8E, 0x85, 0x42, 0x14, 0x76, 0xC0, 0x95, 0x56, 0x73, 0xB0, 0xB5, 0x3A, 0x9D,
182 0x20, 0x30, 0x11, 0xEA, 0xED, 0x89, 0x4A, 0xF3, 0x91, 0xF3, 0xA2, 0xC3, 0x76, 0x5B, 0x6A, 0x30,
183 0x7D, 0xE2, 0x2F, 0x76, 0x3E, 0xFC, 0xF9, 0xF6, 0x31, 0xE0, 0xA0, 0x83, 0x92, 0x88, 0xDB, 0x57,
184 0xC7, 0xD6, 0x3F, 0xAD, 0xCB, 0xAA, 0x45, 0xB6, 0xE1, 0xE2, 0x71, 0xA4, 0x56, 0x2C, 0xA7, 0x3B,
185 0x1D, 0x89, 0x19, 0x50, 0xE1, 0xEE, 0xC2, 0xDD, 0xC0, 0x0D, 0xDC, 0xCB, 0x60, 0x6E, 0xE1, 0x37,
186 0x1A, 0x23, 0x64, 0xB2, 0x03, 0xE4, 0x1A, 0xFA, 0xC3, 0xF4, 0x9D, 0x85, 0x42, 0xC6, 0xF4, 0x56,
187 0x39, 0xB0, 0x1B, 0xE0, 0x75, 0xBA, 0x28, 0x04, 0xA8, 0x30, 0x57, 0x41, 0x33, 0x9F, 0x58, 0xA4,
188 0xC7, 0xB1, 0x7D, 0x58, 0x8D, 0x84, 0x49, 0x40, 0xDA, 0x28, 0x81, 0x25, 0xC4, 0x41, 0x02, 0x81,
189 0x80, 0x13, 0x20, 0x65, 0xD5, 0x96, 0x98, 0x8D, 0x16, 0x73, 0xA1, 0x31, 0x73, 0x79, 0xBA, 0xEC,
190 0xB0, 0xD9, 0x0C, 0xF6, 0xEF, 0x2F, 0xC2, 0xE7, 0x96, 0x9B, 0xA1, 0x2D, 0xE9, 0xFB, 0x45, 0xB9,
191 0xD0, 0x30, 0xE2, 0xBD, 0x30, 0x4F, 0xB6, 0xFE, 0x24, 0x02, 0xCF, 0x8D, 0x51, 0x48, 0x45, 0xD9,
192 0xF7, 0x20, 0x53, 0x1C, 0x0B, 0xA9, 0x7E, 0xC2, 0xA2, 0x65, 0xCC, 0x3E, 0x0E, 0x0D, 0xF1, 0x62,
193 0xDD, 0x5F, 0xBC, 0x55, 0x9B, 0x58, 0x26, 0x40, 0x6A, 0xEE, 0x02, 0x55, 0x36, 0xE9, 0xBA, 0x82,
194 0x5A, 0xFD, 0x3C, 0xDF, 0xA6, 0x26, 0x32, 0x81, 0xA9, 0x5E, 0x46, 0xBE, 0xBA, 0xDC, 0xD3, 0x2A,
195 0x3A, 0x3B, 0xC1, 0x4E, 0xF7, 0x1A, 0xDC, 0x4B, 0xAF, 0x67, 0x1B, 0x3A, 0x83, 0x0D, 0x04, 0xDE,
196 0x27, 0x47, 0xFC, 0xE6, 0x39, 0x89, 0x7B, 0x66, 0xF9, 0x50, 0x4D, 0xF1, 0xAC, 0x20, 0x43, 0x7E,
197 0xEE,
198];
199
200/// DER-encoded PKCS#8 format EC key. Generated using:
201/// openssl ecparam -name prime256v1 -genkey | openssl pkcs8 -topk8 -nocrypt -outform der | hexdump -e '30/1 "%02X" "\n"'
202pub static EC_P_256_KEY: &[u8] = &[
203 0x30, 0x81, 0x87, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02,
204 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07, 0x04, 0x6D, 0x30, 0x6B, 0x02,
205 0x01, 0x01, 0x04, 0x20, 0xB9, 0x1D, 0xAF, 0x50, 0xFD, 0xD8, 0x6A, 0x40, 0xAB, 0x2C, 0xCB, 0x54,
206 0x4E, 0xED, 0xF1, 0x64, 0xBC, 0x30, 0x25, 0xFB, 0xC4, 0x69, 0x00, 0x34, 0x1A, 0x82, 0xA3, 0x72,
207 0x5D, 0xC7, 0xA9, 0x85, 0xA1, 0x44, 0x03, 0x42, 0x00, 0x04, 0xE8, 0x53, 0x0A, 0xF2, 0xD3, 0x68,
208 0x40, 0x48, 0x8C, 0xB4, 0x2F, 0x11, 0x34, 0xD7, 0xF4, 0x4A, 0x5C, 0x33, 0xFF, 0xF6, 0x2B, 0xF7,
209 0x98, 0x0F, 0x02, 0xA5, 0xD7, 0x4F, 0xF9, 0xDE, 0x60, 0x9C, 0x6E, 0xB0, 0x45, 0xDA, 0x3F, 0xF4,
210 0x34, 0x23, 0x9B, 0x4C, 0x3A, 0x09, 0x9C, 0x5E, 0x5D, 0x37, 0x96, 0xAC, 0x4A, 0xE7, 0x65, 0x2B,
211 0xD6, 0x84, 0x98, 0xEA, 0x96, 0x91, 0xFB, 0x78, 0xED, 0x86,
212];
213
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +0000214/// DER-encoded PKCS#8 format RSA key -
215/// Size: 2048
216/// Public Exponent: 65537
217/// Purpose: WRAP_KEY, ENCRYPT, DECRYPT
218/// Encryption scheme: RSAES-PKCS1-v1_5
219/// Digest: SHA_2_256
220/// Padding: RSA_OAEP
221/// This sample wrapping_key is taken from KeyMint tests
222/// (see hardware/interfaces/security/keymint/aidl/vts/functional/KeyMintTest.cpp).
223/// Similarly more test keys can be generated with below command -
224/// openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -outform der | hexdump -e '30/1 "%02X" "\n"'
225pub static WRAPPING_KEY: &[u8] = &[
226 0x30, 0x82, 0x04, 0xbe, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
227 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x04, 0xa8, 0x30, 0x82, 0x04, 0xa4, 0x02, 0x01,
228 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, 0xae, 0xc3, 0x67, 0x93, 0x1d, 0x89, 0x00, 0xce, 0x56, 0xb0,
229 0x06, 0x7f, 0x7d, 0x70, 0xe1, 0xfc, 0x65, 0x3f, 0x3f, 0x34, 0xd1, 0x94, 0xc1, 0xfe, 0xd5, 0x00,
230 0x18, 0xfb, 0x43, 0xdb, 0x93, 0x7b, 0x06, 0xe6, 0x73, 0xa8, 0x37, 0x31, 0x3d, 0x56, 0xb1, 0xc7,
231 0x25, 0x15, 0x0a, 0x3f, 0xef, 0x86, 0xac, 0xbd, 0xdc, 0x41, 0xbb, 0x75, 0x9c, 0x28, 0x54, 0xea,
232 0xe3, 0x2d, 0x35, 0x84, 0x1e, 0xfb, 0x5c, 0x18, 0xd8, 0x2b, 0xc9, 0x0a, 0x1c, 0xb5, 0xc1, 0xd5,
233 0x5a, 0xdf, 0x24, 0x5b, 0x02, 0x91, 0x1f, 0x0b, 0x7c, 0xda, 0x88, 0xc4, 0x21, 0xff, 0x0e, 0xba,
234 0xfe, 0x7c, 0x0d, 0x23, 0xbe, 0x31, 0x2d, 0x7b, 0xd5, 0x92, 0x1f, 0xfa, 0xea, 0x13, 0x47, 0xc1,
235 0x57, 0x40, 0x6f, 0xef, 0x71, 0x8f, 0x68, 0x26, 0x43, 0xe4, 0xe5, 0xd3, 0x3c, 0x67, 0x03, 0xd6,
236 0x1c, 0x0c, 0xf7, 0xac, 0x0b, 0xf4, 0x64, 0x5c, 0x11, 0xf5, 0xc1, 0x37, 0x4c, 0x38, 0x86, 0x42,
237 0x74, 0x11, 0xc4, 0x49, 0x79, 0x67, 0x92, 0xe0, 0xbe, 0xf7, 0x5d, 0xec, 0x85, 0x8a, 0x21, 0x23,
238 0xc3, 0x67, 0x53, 0xe0, 0x2a, 0x95, 0xa9, 0x6d, 0x7c, 0x45, 0x4b, 0x50, 0x4d, 0xe3, 0x85, 0xa6,
239 0x42, 0xe0, 0xdf, 0xc3, 0xe6, 0x0a, 0xc3, 0xa7, 0xee, 0x49, 0x91, 0xd0, 0xd4, 0x8b, 0x01, 0x72,
240 0xa9, 0x5f, 0x95, 0x36, 0xf0, 0x2b, 0xa1, 0x3c, 0xec, 0xcc, 0xb9, 0x2b, 0x72, 0x7d, 0xb5, 0xc2,
241 0x7e, 0x5b, 0x2f, 0x5c, 0xec, 0x09, 0x60, 0x0b, 0x28, 0x6a, 0xf5, 0xcf, 0x14, 0xc4, 0x20, 0x24,
242 0xc6, 0x1d, 0xdf, 0xe7, 0x1c, 0x2a, 0x8d, 0x74, 0x58, 0xf1, 0x85, 0x23, 0x4c, 0xb0, 0x0e, 0x01,
243 0xd2, 0x82, 0xf1, 0x0f, 0x8f, 0xc6, 0x72, 0x1d, 0x2a, 0xed, 0x3f, 0x48, 0x33, 0xcc, 0xa2, 0xbd,
244 0x8f, 0xa6, 0x28, 0x21, 0xdd, 0x55, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, 0x00, 0x43,
245 0x14, 0x47, 0xb6, 0x25, 0x19, 0x08, 0x11, 0x2b, 0x1e, 0xe7, 0x6f, 0x99, 0xf3, 0x71, 0x1a, 0x52,
246 0xb6, 0x63, 0x09, 0x60, 0x04, 0x6c, 0x2d, 0xe7, 0x0d, 0xe1, 0x88, 0xd8, 0x33, 0xf8, 0xb8, 0xb9,
247 0x1e, 0x4d, 0x78, 0x5c, 0xae, 0xee, 0xaf, 0x4f, 0x0f, 0x74, 0x41, 0x4e, 0x2c, 0xda, 0x40, 0x64,
248 0x1f, 0x7f, 0xe2, 0x4f, 0x14, 0xc6, 0x7a, 0x88, 0x95, 0x9b, 0xdb, 0x27, 0x76, 0x6d, 0xf9, 0xe7,
249 0x10, 0xb6, 0x30, 0xa0, 0x3a, 0xdc, 0x68, 0x3b, 0x5d, 0x2c, 0x43, 0x08, 0x0e, 0x52, 0xbe, 0xe7,
250 0x1e, 0x9e, 0xae, 0xb6, 0xde, 0x29, 0x7a, 0x5f, 0xea, 0x10, 0x72, 0x07, 0x0d, 0x18, 0x1c, 0x82,
251 0x2b, 0xcc, 0xff, 0x08, 0x7d, 0x63, 0xc9, 0x40, 0xba, 0x8a, 0x45, 0xf6, 0x70, 0xfe, 0xb2, 0x9f,
252 0xb4, 0x48, 0x4d, 0x1c, 0x95, 0xe6, 0xd2, 0x57, 0x9b, 0xa0, 0x2a, 0xae, 0x0a, 0x00, 0x90, 0x0c,
253 0x3e, 0xbf, 0x49, 0x0e, 0x3d, 0x2c, 0xd7, 0xee, 0x8d, 0x0e, 0x20, 0xc5, 0x36, 0xe4, 0xdc, 0x5a,
254 0x50, 0x97, 0x27, 0x28, 0x88, 0xcd, 0xdd, 0x7e, 0x91, 0xf2, 0x28, 0xb1, 0xc4, 0xd7, 0x47, 0x4c,
255 0x55, 0xb8, 0xfc, 0xd6, 0x18, 0xc4, 0xa9, 0x57, 0xbb, 0xdd, 0xd5, 0xad, 0x74, 0x07, 0xcc, 0x31,
256 0x2d, 0x8d, 0x98, 0xa5, 0xca, 0xf7, 0xe0, 0x8f, 0x4a, 0x0d, 0x6b, 0x45, 0xbb, 0x41, 0xc6, 0x52,
257 0x65, 0x9d, 0x5a, 0x5b, 0xa0, 0x5b, 0x66, 0x37, 0x37, 0xa8, 0x69, 0x62, 0x81, 0x86, 0x5b, 0xa2,
258 0x0f, 0xbd, 0xd7, 0xf8, 0x51, 0xe6, 0xc5, 0x6e, 0x8c, 0xbe, 0x0d, 0xdb, 0xbf, 0x24, 0xdc, 0x03,
259 0xb2, 0xd2, 0xcb, 0x4c, 0x3d, 0x54, 0x0f, 0xb0, 0xaf, 0x52, 0xe0, 0x34, 0xa2, 0xd0, 0x66, 0x98,
260 0xb1, 0x28, 0xe5, 0xf1, 0x01, 0xe3, 0xb5, 0x1a, 0x34, 0xf8, 0xd8, 0xb4, 0xf8, 0x61, 0x81, 0x02,
261 0x81, 0x81, 0x00, 0xde, 0x39, 0x2e, 0x18, 0xd6, 0x82, 0xc8, 0x29, 0x26, 0x6c, 0xc3, 0x45, 0x4e,
262 0x1d, 0x61, 0x66, 0x24, 0x2f, 0x32, 0xd9, 0xa1, 0xd1, 0x05, 0x77, 0x75, 0x3e, 0x90, 0x4e, 0xa7,
263 0xd0, 0x8b, 0xff, 0x84, 0x1b, 0xe5, 0xba, 0xc8, 0x2a, 0x16, 0x4c, 0x59, 0x70, 0x00, 0x70, 0x47,
264 0xb8, 0xc5, 0x17, 0xdb, 0x8f, 0x8f, 0x84, 0xe3, 0x7b, 0xd5, 0x98, 0x85, 0x61, 0xbd, 0xf5, 0x03,
265 0xd4, 0xdc, 0x2b, 0xdb, 0x38, 0xf8, 0x85, 0x43, 0x4a, 0xe4, 0x2c, 0x35, 0x5f, 0x72, 0x5c, 0x9a,
266 0x60, 0xf9, 0x1f, 0x07, 0x88, 0xe1, 0xf1, 0xa9, 0x72, 0x23, 0xb5, 0x24, 0xb5, 0x35, 0x7f, 0xdf,
267 0x72, 0xe2, 0xf6, 0x96, 0xba, 0xb7, 0xd7, 0x8e, 0x32, 0xbf, 0x92, 0xba, 0x8e, 0x18, 0x64, 0xea,
268 0xb1, 0x22, 0x9e, 0x91, 0x34, 0x61, 0x30, 0x74, 0x8a, 0x6e, 0x3c, 0x12, 0x4f, 0x91, 0x49, 0xd7,
269 0x1c, 0x74, 0x35, 0x02, 0x81, 0x81, 0x00, 0xc9, 0x53, 0x87, 0xc0, 0xf9, 0xd3, 0x5f, 0x13, 0x7b,
270 0x57, 0xd0, 0xd6, 0x5c, 0x39, 0x7c, 0x5e, 0x21, 0xcc, 0x25, 0x1e, 0x47, 0x00, 0x8e, 0xd6, 0x2a,
271 0x54, 0x24, 0x09, 0xc8, 0xb6, 0xb6, 0xac, 0x7f, 0x89, 0x67, 0xb3, 0x86, 0x3c, 0xa6, 0x45, 0xfc,
272 0xce, 0x49, 0x58, 0x2a, 0x9a, 0xa1, 0x73, 0x49, 0xdb, 0x6c, 0x4a, 0x95, 0xaf, 0xfd, 0xae, 0x0d,
273 0xae, 0x61, 0x2e, 0x1a, 0xfa, 0xc9, 0x9e, 0xd3, 0x9a, 0x2d, 0x93, 0x4c, 0x88, 0x04, 0x40, 0xae,
274 0xd8, 0x83, 0x2f, 0x98, 0x43, 0x16, 0x3a, 0x47, 0xf2, 0x7f, 0x39, 0x21, 0x99, 0xdc, 0x12, 0x02,
275 0xf9, 0xa0, 0xf9, 0xbd, 0x08, 0x30, 0x80, 0x07, 0xcb, 0x1e, 0x4e, 0x7f, 0x58, 0x30, 0x93, 0x66,
276 0xa7, 0xde, 0x25, 0xf7, 0xc3, 0xc9, 0xb8, 0x80, 0x67, 0x7c, 0x06, 0x8e, 0x1b, 0xe9, 0x36, 0xe8,
277 0x12, 0x88, 0x81, 0x52, 0x52, 0xa8, 0xa1, 0x02, 0x81, 0x80, 0x57, 0xff, 0x8c, 0xa1, 0x89, 0x50,
278 0x80, 0xb2, 0xca, 0xe4, 0x86, 0xef, 0x0a, 0xdf, 0xd7, 0x91, 0xfb, 0x02, 0x35, 0xc0, 0xb8, 0xb3,
279 0x6c, 0xd6, 0xc1, 0x36, 0xe5, 0x2e, 0x40, 0x85, 0xf4, 0xea, 0x5a, 0x06, 0x32, 0x12, 0xa4, 0xf1,
280 0x05, 0xa3, 0x76, 0x47, 0x43, 0xe5, 0x32, 0x81, 0x98, 0x8a, 0xba, 0x07, 0x3f, 0x6e, 0x00, 0x27,
281 0x29, 0x8e, 0x1c, 0x43, 0x78, 0x55, 0x6e, 0x0e, 0xfc, 0xa0, 0xe1, 0x4e, 0xce, 0x1a, 0xf7, 0x6a,
282 0xd0, 0xb0, 0x30, 0xf2, 0x7a, 0xf6, 0xf0, 0xab, 0x35, 0xfb, 0x73, 0xa0, 0x60, 0xd8, 0xb1, 0xa0,
283 0xe1, 0x42, 0xfa, 0x26, 0x47, 0xe9, 0x3b, 0x32, 0xe3, 0x6d, 0x82, 0x82, 0xae, 0x0a, 0x4d, 0xe5,
284 0x0a, 0xb7, 0xaf, 0xe8, 0x55, 0x00, 0xa1, 0x6f, 0x43, 0xa6, 0x47, 0x19, 0xd6, 0xe2, 0xb9, 0x43,
285 0x98, 0x23, 0x71, 0x9c, 0xd0, 0x8b, 0xcd, 0x03, 0x17, 0x81, 0x02, 0x81, 0x81, 0x00, 0xba, 0x73,
286 0xb0, 0xbb, 0x28, 0xe3, 0xf8, 0x1e, 0x9b, 0xd1, 0xc5, 0x68, 0x71, 0x3b, 0x10, 0x12, 0x41, 0xac,
287 0xc6, 0x07, 0x97, 0x6c, 0x4d, 0xdc, 0xcc, 0x90, 0xe6, 0x5b, 0x65, 0x56, 0xca, 0x31, 0x51, 0x60,
288 0x58, 0xf9, 0x2b, 0x6e, 0x09, 0xf3, 0xb1, 0x60, 0xff, 0x0e, 0x37, 0x4e, 0xc4, 0x0d, 0x78, 0xae,
289 0x4d, 0x49, 0x79, 0xfd, 0xe6, 0xac, 0x06, 0xa1, 0xa4, 0x00, 0xc6, 0x1d, 0xd3, 0x12, 0x54, 0x18,
290 0x6a, 0xf3, 0x0b, 0x22, 0xc1, 0x05, 0x82, 0xa8, 0xa4, 0x3e, 0x34, 0xfe, 0x94, 0x9c, 0x5f, 0x3b,
291 0x97, 0x55, 0xba, 0xe7, 0xba, 0xa7, 0xb7, 0xb7, 0xa6, 0xbd, 0x03, 0xb3, 0x8c, 0xef, 0x55, 0xc8,
292 0x68, 0x85, 0xfc, 0x6c, 0x19, 0x78, 0xb9, 0xce, 0xe7, 0xef, 0x33, 0xda, 0x50, 0x7c, 0x9d, 0xf6,
293 0xb9, 0x27, 0x7c, 0xff, 0x1e, 0x6a, 0xaa, 0x5d, 0x57, 0xac, 0xa5, 0x28, 0x46, 0x61, 0x02, 0x81,
294 0x81, 0x00, 0xc9, 0x31, 0x61, 0x7c, 0x77, 0x82, 0x9d, 0xfb, 0x12, 0x70, 0x50, 0x2b, 0xe9, 0x19,
295 0x5c, 0x8f, 0x28, 0x30, 0x88, 0x5f, 0x57, 0xdb, 0xa8, 0x69, 0x53, 0x68, 0x11, 0xe6, 0x86, 0x42,
296 0x36, 0xd0, 0xc4, 0x73, 0x6a, 0x00, 0x08, 0xa1, 0x45, 0xaf, 0x36, 0xb8, 0x35, 0x7a, 0x7c, 0x3d,
297 0x13, 0x99, 0x66, 0xd0, 0x4c, 0x4e, 0x00, 0x93, 0x4e, 0xa1, 0xae, 0xde, 0x3b, 0xb6, 0xb8, 0xec,
298 0x84, 0x1d, 0xc9, 0x5e, 0x3f, 0x57, 0x97, 0x51, 0xe2, 0xbf, 0xdf, 0xe2, 0x7a, 0xe7, 0x78, 0x98,
299 0x3f, 0x95, 0x93, 0x56, 0x21, 0x07, 0x23, 0x28, 0x7b, 0x0a, 0xff, 0xcc, 0x9f, 0x72, 0x70, 0x44,
300 0xd4, 0x8c, 0x37, 0x3f, 0x1b, 0xab, 0xde, 0x07, 0x24, 0xfa, 0x17, 0xa4, 0xfd, 0x4d, 0xa0, 0x90,
301 0x2c, 0x7c, 0x9b, 0x9b, 0xf2, 0x7b, 0xa6, 0x1b, 0xe6, 0xad, 0x02, 0xdf, 0xdd, 0xda, 0x8f, 0x4e,
302 0x68, 0x22,
303];
304
305/// WrappedKeyData as ASN.1 DER-encoded data corresponding to the `SecureKeyWrapper` schema
306/// specified in IKeyMintDevice.aidl. Wrapped key parameters are -
307/// Algorithm: AES
308/// Key size: 256
309/// Block mode: ECB
310/// Padding mode: PKCS7
311/// This sample wrapped_key is taken from KeyMint tests (see KeyMintTest.cpp).
312pub static WRAPPED_KEY: &[u8] = &[
313 0x30, 0x82, 0x01, 0x79, 0x02, 0x01, 0x00, 0x04, 0x82, 0x01, 0x00, 0x93, 0x4b, 0xf9, 0x4e, 0x2a,
314 0xa2, 0x8a, 0x3f, 0x83, 0xc9, 0xf7, 0x92, 0x97, 0x25, 0x02, 0x62, 0xfb, 0xe3, 0x27, 0x6b, 0x5a,
315 0x1c, 0x91, 0x15, 0x9b, 0xbf, 0xa3, 0xef, 0x89, 0x57, 0xaa, 0xc8, 0x4b, 0x59, 0xb3, 0x0b, 0x45,
316 0x5a, 0x79, 0xc2, 0x97, 0x34, 0x80, 0x82, 0x3d, 0x8b, 0x38, 0x63, 0xc3, 0xde, 0xef, 0x4a, 0x8e,
317 0x24, 0x35, 0x90, 0x26, 0x8d, 0x80, 0xe1, 0x87, 0x51, 0xa0, 0xe1, 0x30, 0xf6, 0x7c, 0xe6, 0xa1,
318 0xac, 0xe9, 0xf7, 0x9b, 0x95, 0xe0, 0x97, 0x47, 0x4f, 0xeb, 0xc9, 0x81, 0x19, 0x5b, 0x1d, 0x13,
319 0xa6, 0x90, 0x86, 0xc0, 0x86, 0x3f, 0x66, 0xa7, 0xb7, 0xfd, 0xb4, 0x87, 0x92, 0x22, 0x7b, 0x1a,
320 0xc5, 0xe2, 0x48, 0x9f, 0xeb, 0xdf, 0x08, 0x7a, 0xb5, 0x48, 0x64, 0x83, 0x03, 0x3a, 0x6f, 0x00,
321 0x1c, 0xa5, 0xd1, 0xec, 0x1e, 0x27, 0xf5, 0xc3, 0x0f, 0x4c, 0xec, 0x26, 0x42, 0x07, 0x4a, 0x39,
322 0xae, 0x68, 0xae, 0xe5, 0x52, 0xe1, 0x96, 0x62, 0x7a, 0x8e, 0x3d, 0x86, 0x7e, 0x67, 0xa8, 0xc0,
323 0x1b, 0x11, 0xe7, 0x5f, 0x13, 0xcc, 0xa0, 0xa9, 0x7a, 0xb6, 0x68, 0xb5, 0x0c, 0xda, 0x07, 0xa8,
324 0xec, 0xb7, 0xcd, 0x8e, 0x3d, 0xd7, 0x00, 0x9c, 0x96, 0x36, 0x53, 0x4f, 0x6f, 0x23, 0x9c, 0xff,
325 0xe1, 0xfc, 0x8d, 0xaa, 0x46, 0x6f, 0x78, 0xb6, 0x76, 0xc7, 0x11, 0x9e, 0xfb, 0x96, 0xbc, 0xe4,
326 0xe6, 0x9c, 0xa2, 0xa2, 0x5d, 0x0b, 0x34, 0xed, 0x9c, 0x3f, 0xf9, 0x99, 0xb8, 0x01, 0x59, 0x7d,
327 0x52, 0x20, 0xe3, 0x07, 0xea, 0xa5, 0xbe, 0xe5, 0x07, 0xfb, 0x94, 0xd1, 0xfa, 0x69, 0xf9, 0xe5,
328 0x19, 0xb2, 0xde, 0x31, 0x5b, 0xac, 0x92, 0xc3, 0x6f, 0x2e, 0xa1, 0xfa, 0x1d, 0xf4, 0x47, 0x8c,
329 0x0d, 0xde, 0xde, 0xae, 0x8c, 0x70, 0xe0, 0x23, 0x3c, 0xd0, 0x98, 0x04, 0x0c, 0xd7, 0x96, 0xb0,
330 0x2c, 0x37, 0x0f, 0x1f, 0xa4, 0xcc, 0x01, 0x24, 0xf1, 0x30, 0x2e, 0x02, 0x01, 0x03, 0x30, 0x29,
331 0xa1, 0x08, 0x31, 0x06, 0x02, 0x01, 0x00, 0x02, 0x01, 0x01, 0xa2, 0x03, 0x02, 0x01, 0x20, 0xa3,
332 0x04, 0x02, 0x02, 0x01, 0x00, 0xa4, 0x05, 0x31, 0x03, 0x02, 0x01, 0x01, 0xa6, 0x05, 0x31, 0x03,
333 0x02, 0x01, 0x40, 0xbf, 0x83, 0x77, 0x02, 0x05, 0x00, 0x04, 0x20, 0xcc, 0xd5, 0x40, 0x85, 0x5f,
334 0x83, 0x3a, 0x5e, 0x14, 0x80, 0xbf, 0xd2, 0xd3, 0x6f, 0xaf, 0x3a, 0xee, 0xe1, 0x5d, 0xf5, 0xbe,
335 0xab, 0xe2, 0x69, 0x1b, 0xc8, 0x2d, 0xde, 0x2a, 0x7a, 0xa9, 0x10, 0x04, 0x10, 0x64, 0xc9, 0xf6,
336 0x89, 0xc6, 0x0f, 0xf6, 0x22, 0x3a, 0xb6, 0xe6, 0x99, 0x9e, 0x0e, 0xb6, 0xe5,
337];
338
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000339/// To map Keystore errors.
340#[derive(thiserror::Error, Debug, Eq, PartialEq)]
341pub enum Error {
342 /// Keystore2 error code
343 #[error("ResponseCode {0:?}")]
344 Rc(ResponseCode),
345 /// Keymint error code
346 #[error("ErrorCode {0:?}")]
347 Km(ErrorCode),
348 /// Exception
349 #[error("Binder exception {0:?}")]
350 Binder(ExceptionCode),
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000351 /// This is returned if the C implementation of extractSubjectFromCertificate failed.
352 #[error("Failed to validate certificate chain.")]
353 ValidateCertChainFailed,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +0000354 /// Error code to indicate error in ASN.1 DER-encoded data creation.
355 #[error("Failed to create and encode ASN.1 data.")]
356 DerEncodeFailed,
Rajesh Nyamagoud28abde62023-04-01 01:32:32 +0000357 /// Error code to indicate error while using keystore-engine API.
358 #[error("Failed to perform crypto op using keystore-engine APIs.")]
359 Keystore2EngineOpFailed,
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +0000360 /// Error code to indicate error in attestation-id validation.
361 #[error("Failed to validate attestation-id.")]
362 ValidateAttestIdFailed,
363 /// Error code to indicate error in getting value from attest record.
364 #[error("Failed to get value from attest record.")]
365 AttestRecordGetValueFailed,
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000366}
367
368/// Keystore2 error mapping.
369pub fn map_ks_error<T>(r: BinderResult<T>) -> Result<T, Error> {
370 r.map_err(|s| {
371 match s.exception_code() {
372 ExceptionCode::SERVICE_SPECIFIC => {
373 match s.service_specific_error() {
374 se if se < 0 => {
375 // Negative service specific errors are KM error codes.
376 Error::Km(ErrorCode(se))
377 }
378 se => {
379 // Positive service specific errors are KS response codes.
380 Error::Rc(ResponseCode(se))
381 }
382 }
383 }
384 // We create `Error::Binder` to preserve the exception code
385 // for logging.
386 e_code => Error::Binder(e_code),
387 }
388 })
389}
390
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000391/// Verify that given key param is listed in given authorizations list.
392pub fn check_key_param(authorizations: &[Authorization], key_param: &KeyParameter) -> bool {
393 authorizations.iter().any(|auth| &auth.keyParameter == key_param)
394}
395
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000396/// Verify the given key authorizations with the expected authorizations.
397pub fn check_key_authorizations(
398 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| {
404 assert!(
405 ALLOWED_TAGS_IN_KEY_AUTHS.contains(&auth.keyParameter.tag),
406 "key authorization is not allowed: {:#?}",
407 auth.keyParameter
408 );
409 true
410 });
411
412 //Check allowed-expected-key-parameters are present in given key authorizations list.
413 expected_params.iter().all(|key_param| {
414 if ALLOWED_TAGS_IN_KEY_AUTHS.contains(&key_param.tag) {
415 assert!(
416 check_key_param(authorizations, key_param),
417 "Key parameter not found: {:#?}",
418 key_param
419 );
420 }
421 true
422 });
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000423
424 check_common_auths(authorizations, expected_key_origin);
425}
426
427/// Verify common key authorizations.
428fn check_common_auths(authorizations: &[Authorization], expected_key_origin: KeyOrigin) {
429 assert!(check_key_param(
430 authorizations,
431 &KeyParameter {
432 tag: Tag::OS_VERSION,
433 value: KeyParameterValue::Integer(get_os_version().try_into().unwrap())
434 }
435 ));
436 assert!(check_key_param(
437 authorizations,
438 &KeyParameter {
439 tag: Tag::OS_PATCHLEVEL,
440 value: KeyParameterValue::Integer(get_os_patchlevel().try_into().unwrap())
441 }
442 ));
443
444 // Access denied for finding vendor-patch-level ("ro.vendor.build.security_patch") property
445 // in a test running with `untrusted_app` context. Keeping this check to verify
446 // vendor-patch-level in tests running with `su` context.
447 if getuid().is_root() {
448 assert!(check_key_param(
449 authorizations,
450 &KeyParameter {
451 tag: Tag::VENDOR_PATCHLEVEL,
452 value: KeyParameterValue::Integer(get_vendor_patchlevel().try_into().unwrap())
453 }
454 ));
455 }
456 assert!(check_key_param(
457 authorizations,
458 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(expected_key_origin) }
459 ));
460 assert!(check_key_param(
461 authorizations,
462 &KeyParameter {
463 tag: Tag::USER_ID,
464 value: KeyParameterValue::Integer(
465 rustutils::users::multiuser_get_user_id(ThreadState::get_calling_uid())
466 .try_into()
467 .unwrap()
468 )
469 }
470 ));
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000471}
472
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000473/// Generate EC Key using given security level and domain with below key parameters and
474/// optionally allow the generated key to be attested with factory provisioned attest key using
475/// given challenge and application id -
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000476/// Purposes: SIGN and VERIFY
477/// Digest: SHA_2_256
478/// Curve: P_256
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000479pub fn generate_ec_p256_signing_key(
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000480 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000481 domain: Domain,
482 nspace: i64,
483 alias: Option<String>,
484 att_challenge: Option<&[u8]>,
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000485) -> binder::Result<KeyMetadata> {
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000486 let mut key_attest = false;
487 let mut gen_params = AuthSetBuilder::new()
Rajesh Nyamagoudc7d064d2022-08-20 01:45:17 +0000488 .no_auth_required()
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000489 .algorithm(Algorithm::EC)
490 .purpose(KeyPurpose::SIGN)
491 .purpose(KeyPurpose::VERIFY)
492 .digest(Digest::SHA_2_256)
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000493 .ec_curve(EcCurve::P_256);
494
495 if let Some(challenge) = att_challenge {
496 key_attest = true;
497 gen_params = gen_params.clone().attestation_challenge(challenge.to_vec());
498 }
499
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000500 match sec_level.generateKey(
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000501 &KeyDescriptor { domain, nspace, alias, blob: None },
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000502 None,
503 &gen_params,
504 0,
505 b"entropy",
506 ) {
507 Ok(key_metadata) => {
508 assert!(key_metadata.certificate.is_some());
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000509 if key_attest {
510 assert!(key_metadata.certificateChain.is_some());
511 }
512 if domain == Domain::BLOB {
513 assert!(key_metadata.key.blob.is_some());
514 }
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000515
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000516 check_key_authorizations(
517 &key_metadata.authorizations,
518 &gen_params,
519 KeyOrigin::GENERATED,
520 );
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000521 Ok(key_metadata)
522 }
523 Err(e) => Err(e),
524 }
525}
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000526
527/// Generate EC signing key.
Rajesh Nyamagoudc7d064d2022-08-20 01:45:17 +0000528pub fn generate_ec_key(
529 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000530 domain: Domain,
531 nspace: i64,
532 alias: Option<String>,
533 ec_curve: EcCurve,
534 digest: Digest,
535) -> binder::Result<KeyMetadata> {
536 let gen_params = AuthSetBuilder::new()
537 .no_auth_required()
538 .algorithm(Algorithm::EC)
539 .purpose(KeyPurpose::SIGN)
540 .purpose(KeyPurpose::VERIFY)
541 .digest(digest)
542 .ec_curve(ec_curve);
543
544 let key_metadata = sec_level.generateKey(
545 &KeyDescriptor { domain, nspace, alias, blob: None },
546 None,
547 &gen_params,
548 0,
549 b"entropy",
550 )?;
551
552 // Must have a public key.
553 assert!(key_metadata.certificate.is_some());
554
555 // Should not have an attestation record.
556 assert!(key_metadata.certificateChain.is_none());
557
558 if domain == Domain::BLOB {
559 assert!(key_metadata.key.blob.is_some());
560 } else {
561 assert!(key_metadata.key.blob.is_none());
562 }
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000563 check_key_authorizations(&key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000564 Ok(key_metadata)
565}
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000566
567/// Generate a RSA key with the given key parameters, alias, domain and namespace.
568pub fn generate_rsa_key(
569 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
570 domain: Domain,
571 nspace: i64,
572 alias: Option<String>,
573 key_params: &KeyParams,
574 attest_key: Option<&KeyDescriptor>,
575) -> binder::Result<KeyMetadata> {
576 let mut gen_params = AuthSetBuilder::new()
577 .no_auth_required()
578 .algorithm(Algorithm::RSA)
579 .rsa_public_exponent(65537)
580 .key_size(key_params.key_size);
581
582 for purpose in &key_params.purpose {
583 gen_params = gen_params.purpose(*purpose);
584 }
585 if let Some(value) = key_params.digest {
586 gen_params = gen_params.digest(value)
587 }
588 if let Some(value) = key_params.padding {
589 gen_params = gen_params.padding_mode(value);
590 }
591 if let Some(value) = key_params.mgf_digest {
592 gen_params = gen_params.mgf_digest(value);
593 }
594 if let Some(value) = key_params.block_mode {
595 gen_params = gen_params.block_mode(value)
596 }
597 if let Some(value) = &key_params.att_challenge {
598 gen_params = gen_params.attestation_challenge(value.to_vec())
599 }
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000600
601 let key_metadata = sec_level.generateKey(
602 &KeyDescriptor { domain, nspace, alias, blob: None },
603 attest_key,
604 &gen_params,
605 0,
606 b"entropy",
607 )?;
608
609 // Must have a public key.
610 assert!(key_metadata.certificate.is_some());
611
David Drysdale38f2ca32023-01-10 13:10:51 +0000612 if attest_key.is_none() && key_params.att_challenge.is_some() {
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000613 // Should have an attestation record.
614 assert!(key_metadata.certificateChain.is_some());
615 } else {
616 // Should not have an attestation record.
617 assert!(key_metadata.certificateChain.is_none());
618 }
619
620 assert!(
621 (domain == Domain::BLOB && key_metadata.key.blob.is_some())
622 || key_metadata.key.blob.is_none()
623 );
624
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000625 check_key_authorizations(&key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000626 // If `RSA_OAEP_MGF_DIGEST` tag is not mentioned explicitly while generating/importing a key,
627 // then make sure `RSA_OAEP_MGF_DIGEST` tag with default value (SHA1) must not be included in
628 // key authorization list.
629 if key_params.mgf_digest.is_none() {
630 assert!(!check_key_param(
631 &key_metadata.authorizations,
632 &KeyParameter {
633 tag: Tag::RSA_OAEP_MGF_DIGEST,
634 value: KeyParameterValue::Digest(Digest::SHA1)
635 }
636 ));
637 }
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000638 Ok(key_metadata)
639}
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000640
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000641/// Generate AES/3DES key.
642pub fn generate_sym_key(
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000643 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000644 algorithm: Algorithm,
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000645 size: i32,
646 alias: &str,
647 padding_mode: &PaddingMode,
648 block_mode: &BlockMode,
649 min_mac_len: Option<i32>,
650) -> binder::Result<KeyMetadata> {
651 let mut gen_params = AuthSetBuilder::new()
652 .no_auth_required()
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000653 .algorithm(algorithm)
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000654 .purpose(KeyPurpose::ENCRYPT)
655 .purpose(KeyPurpose::DECRYPT)
656 .key_size(size)
657 .padding_mode(*padding_mode)
658 .block_mode(*block_mode);
659
660 if let Some(val) = min_mac_len {
661 gen_params = gen_params.min_mac_length(val);
662 }
663
664 let key_metadata = sec_level.generateKey(
665 &KeyDescriptor {
666 domain: Domain::APP,
667 nspace: -1,
668 alias: Some(alias.to_string()),
669 blob: None,
670 },
671 None,
672 &gen_params,
673 0,
674 b"entropy",
675 )?;
676
677 // Should not have public certificate.
678 assert!(key_metadata.certificate.is_none());
679
680 // Should not have an attestation record.
681 assert!(key_metadata.certificateChain.is_none());
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000682 check_key_authorizations(&key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000683 Ok(key_metadata)
684}
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000685
686/// Generate HMAC key.
687pub fn generate_hmac_key(
688 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
689 alias: &str,
690 key_size: i32,
691 min_mac_len: i32,
692 digest: Digest,
693) -> binder::Result<KeyMetadata> {
694 let gen_params = AuthSetBuilder::new()
695 .no_auth_required()
696 .algorithm(Algorithm::HMAC)
697 .purpose(KeyPurpose::SIGN)
698 .purpose(KeyPurpose::VERIFY)
699 .key_size(key_size)
700 .min_mac_length(min_mac_len)
701 .digest(digest);
702
703 let key_metadata = sec_level.generateKey(
704 &KeyDescriptor {
705 domain: Domain::APP,
706 nspace: -1,
707 alias: Some(alias.to_string()),
708 blob: None,
709 },
710 None,
711 &gen_params,
712 0,
713 b"entropy",
714 )?;
715
716 // Should not have public certificate.
717 assert!(key_metadata.certificate.is_none());
718
719 // Should not have an attestation record.
720 assert!(key_metadata.certificateChain.is_none());
721
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000722 check_key_authorizations(&key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000723 Ok(key_metadata)
724}
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000725
726/// Generate RSA or EC attestation keys using below parameters -
727/// Purpose: ATTEST_KEY
728/// Digest: Digest::SHA_2_256
729/// Padding: PaddingMode::RSA_PKCS1_1_5_SIGN
730/// RSA-Key-Size: 2048
731/// EC-Curve: EcCurve::P_256
732pub fn generate_attestation_key(
733 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
734 algorithm: Algorithm,
735 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000736) -> binder::Result<KeyMetadata> {
737 assert!(algorithm == Algorithm::RSA || algorithm == Algorithm::EC);
738
739 if algorithm == Algorithm::RSA {
740 let alias = "ks_rsa_attest_test_key";
741 let metadata = generate_rsa_key(
742 sec_level,
743 Domain::APP,
744 -1,
745 Some(alias.to_string()),
746 &KeyParams {
747 key_size: 2048,
748 purpose: vec![KeyPurpose::ATTEST_KEY],
749 padding: Some(PaddingMode::RSA_PKCS1_1_5_SIGN),
750 digest: Some(Digest::SHA_2_256),
751 mgf_digest: None,
752 block_mode: None,
753 att_challenge: Some(att_challenge.to_vec()),
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000754 },
755 None,
756 )
757 .unwrap();
758 Ok(metadata)
759 } else {
760 let metadata = generate_ec_attestation_key(
761 sec_level,
762 att_challenge,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000763 Digest::SHA_2_256,
764 EcCurve::P_256,
765 )
766 .unwrap();
767
768 Ok(metadata)
769 }
770}
771
772/// Generate EC attestation key with the given
773/// curve, attestation-challenge and attestation-app-id.
774pub fn generate_ec_attestation_key(
775 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
776 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000777 digest: Digest,
778 ec_curve: EcCurve,
779) -> binder::Result<KeyMetadata> {
780 let alias = "ks_attest_ec_test_key";
781 let gen_params = AuthSetBuilder::new()
782 .no_auth_required()
783 .algorithm(Algorithm::EC)
784 .purpose(KeyPurpose::ATTEST_KEY)
785 .ec_curve(ec_curve)
786 .digest(digest)
David Drysdale38f2ca32023-01-10 13:10:51 +0000787 .attestation_challenge(att_challenge.to_vec());
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000788
789 let attestation_key_metadata = sec_level.generateKey(
790 &KeyDescriptor {
791 domain: Domain::APP,
792 nspace: -1,
793 alias: Some(alias.to_string()),
794 blob: None,
795 },
796 None,
797 &gen_params,
798 0,
799 b"entropy",
800 )?;
801
802 // Should have public certificate.
803 assert!(attestation_key_metadata.certificate.is_some());
804 // Should have an attestation record.
805 assert!(attestation_key_metadata.certificateChain.is_some());
806
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000807 check_key_authorizations(
808 &attestation_key_metadata.authorizations,
809 &gen_params,
810 KeyOrigin::GENERATED,
811 );
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000812 Ok(attestation_key_metadata)
813}
814
815/// Generate EC-P-256 key and attest it with given attestation key.
816pub fn generate_ec_256_attested_key(
817 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
818 alias: Option<String>,
819 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000820 attest_key: &KeyDescriptor,
821) -> binder::Result<KeyMetadata> {
822 let ec_gen_params = AuthSetBuilder::new()
823 .no_auth_required()
824 .algorithm(Algorithm::EC)
825 .purpose(KeyPurpose::SIGN)
826 .purpose(KeyPurpose::VERIFY)
827 .digest(Digest::SHA_2_256)
828 .ec_curve(EcCurve::P_256)
David Drysdale38f2ca32023-01-10 13:10:51 +0000829 .attestation_challenge(att_challenge.to_vec());
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000830
831 let ec_key_metadata = sec_level
832 .generateKey(
833 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: None },
834 Some(attest_key),
835 &ec_gen_params,
836 0,
837 b"entropy",
838 )
839 .unwrap();
840
841 // Should have public certificate.
842 assert!(ec_key_metadata.certificate.is_some());
843 // Shouldn't have an attestation record.
844 assert!(ec_key_metadata.certificateChain.is_none());
845
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000846 check_key_authorizations(&ec_key_metadata.authorizations, &ec_gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000847 Ok(ec_key_metadata)
848}
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000849
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000850/// Imports above defined RSA key - `RSA_2048_KEY` and validates imported key parameters.
851pub fn import_rsa_2048_key(
852 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
853 domain: Domain,
854 nspace: i64,
855 alias: Option<String>,
856 import_params: AuthSetBuilder,
857) -> binder::Result<KeyMetadata> {
858 let key_metadata = sec_level
859 .importKey(
860 &KeyDescriptor { domain, nspace, alias, blob: None },
861 None,
862 &import_params,
863 0,
864 RSA_2048_KEY,
865 )
866 .unwrap();
867
868 assert!(key_metadata.certificate.is_some());
869 assert!(key_metadata.certificateChain.is_none());
870
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000871 check_key_authorizations(&key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000872
873 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000874 assert!(check_key_param(
875 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000876 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::RSA) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000877 ));
878
879 assert!(check_key_param(
880 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000881 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(2048) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000882 ));
883
884 assert!(check_key_param(
885 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000886 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000887 ));
888
889 assert!(check_key_param(
890 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000891 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000892 tag: Tag::RSA_PUBLIC_EXPONENT,
893 value: KeyParameterValue::LongInteger(65537)
894 }
895 ));
896
897 assert!(check_key_param(
898 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000899 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000900 tag: Tag::PADDING,
901 value: KeyParameterValue::PaddingMode(PaddingMode::RSA_PSS)
902 }
903 ));
904
905 assert!(check_key_param(
906 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000907 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000908 ));
909
910 Ok(key_metadata)
911}
912
913/// Imports above defined EC key - `EC_P_256_KEY` and validates imported key parameters.
914pub fn import_ec_p_256_key(
915 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
916 domain: Domain,
917 nspace: i64,
918 alias: Option<String>,
919 import_params: AuthSetBuilder,
920) -> binder::Result<KeyMetadata> {
921 let key_metadata = sec_level
922 .importKey(
923 &KeyDescriptor { domain, nspace, alias, blob: None },
924 None,
925 &import_params,
926 0,
927 EC_P_256_KEY,
928 )
929 .unwrap();
930
931 assert!(key_metadata.certificate.is_some());
932 assert!(key_metadata.certificateChain.is_none());
933
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000934 check_key_authorizations(&key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000935
936 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000937 assert!(check_key_param(
938 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000939 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::EC) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000940 ));
941
942 assert!(check_key_param(
943 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000944 &KeyParameter { tag: Tag::EC_CURVE, value: KeyParameterValue::EcCurve(EcCurve::P_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000945 ));
946
947 assert!(check_key_param(
948 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000949 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000950 ));
951 assert!(check_key_param(
952 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000953 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000954 ));
955
956 Ok(key_metadata)
957}
958
959/// Import sample AES key and validate its key parameters.
960pub fn import_aes_key(
961 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
962 domain: Domain,
963 nspace: i64,
964 alias: Option<String>,
965) -> binder::Result<KeyMetadata> {
966 static AES_KEY: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
967 let key_size = AES_KEY.len() * 8;
968
969 let import_params = AuthSetBuilder::new()
970 .no_auth_required()
971 .algorithm(Algorithm::AES)
972 .block_mode(BlockMode::ECB)
973 .key_size(key_size.try_into().unwrap())
974 .purpose(KeyPurpose::ENCRYPT)
975 .purpose(KeyPurpose::DECRYPT)
976 .padding_mode(PaddingMode::PKCS7);
977
978 let key_metadata = sec_level.importKey(
979 &KeyDescriptor { domain, nspace, alias, blob: None },
980 None,
981 &import_params,
982 0,
983 AES_KEY,
984 )?;
985
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000986 check_key_authorizations(&key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000987
988 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000989 assert!(check_key_param(
990 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000991 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::AES) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000992 ));
993 assert!(check_key_param(
994 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000995 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(128) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000996 ));
997 assert!(check_key_param(
998 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000999 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001000 tag: Tag::PADDING,
1001 value: KeyParameterValue::PaddingMode(PaddingMode::PKCS7)
1002 }
1003 ));
1004 assert!(check_key_param(
1005 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001006 &KeyParameter { tag: Tag::BLOCK_MODE, value: KeyParameterValue::BlockMode(BlockMode::ECB) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001007 ));
1008 assert!(check_key_param(
1009 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001010 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001011 ));
1012
1013 Ok(key_metadata)
1014}
1015
1016/// Import sample 3DES key and validate its key parameters.
1017pub fn import_3des_key(
1018 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1019 domain: Domain,
1020 nspace: i64,
1021 alias: Option<String>,
1022) -> binder::Result<KeyMetadata> {
1023 static TRIPLE_DES_KEY: &[u8] = &[
1024 0xa4, 0x9d, 0x75, 0x64, 0x19, 0x9e, 0x97, 0xcb, 0x52, 0x9d, 0x2c, 0x9d, 0x97, 0xbf, 0x2f,
1025 0x98, 0xd3, 0x5e, 0xdf, 0x57, 0xba, 0x1f, 0x73, 0x58,
1026 ];
1027
1028 let import_params = AuthSetBuilder::new()
1029 .no_auth_required()
1030 .algorithm(Algorithm::TRIPLE_DES)
1031 .block_mode(BlockMode::ECB)
1032 .key_size(168)
1033 .purpose(KeyPurpose::ENCRYPT)
1034 .purpose(KeyPurpose::DECRYPT)
1035 .padding_mode(PaddingMode::PKCS7);
1036
1037 let key_metadata = sec_level.importKey(
1038 &KeyDescriptor { domain, nspace, alias, blob: None },
1039 None,
1040 &import_params,
1041 0,
1042 TRIPLE_DES_KEY,
1043 )?;
1044
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001045 check_key_authorizations(&key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001046
1047 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001048 assert!(check_key_param(
1049 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001050 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001051 tag: Tag::ALGORITHM,
1052 value: KeyParameterValue::Algorithm(Algorithm::TRIPLE_DES)
1053 }
1054 ));
1055 assert!(check_key_param(
1056 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001057 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(168) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001058 ));
1059 assert!(check_key_param(
1060 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001061 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001062 tag: Tag::PADDING,
1063 value: KeyParameterValue::PaddingMode(PaddingMode::PKCS7)
1064 }
1065 ));
1066 assert!(check_key_param(
1067 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001068 &KeyParameter { tag: Tag::BLOCK_MODE, value: KeyParameterValue::BlockMode(BlockMode::ECB) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001069 ));
1070 assert!(check_key_param(
1071 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001072 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001073 ));
1074
1075 Ok(key_metadata)
1076}
1077
1078/// Import sample HMAC key and validate its key parameters.
1079pub fn import_hmac_key(
1080 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1081 domain: Domain,
1082 nspace: i64,
1083 alias: Option<String>,
1084) -> binder::Result<KeyMetadata> {
1085 static HMAC_KEY: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
1086 let key_size = HMAC_KEY.len() * 8;
1087
1088 let import_params = AuthSetBuilder::new()
1089 .no_auth_required()
1090 .algorithm(Algorithm::HMAC)
1091 .key_size(key_size.try_into().unwrap())
1092 .purpose(KeyPurpose::SIGN)
1093 .purpose(KeyPurpose::VERIFY)
1094 .digest(Digest::SHA_2_256)
1095 .min_mac_length(256);
1096
1097 let key_metadata = sec_level.importKey(
1098 &KeyDescriptor { domain, nspace, alias, blob: None },
1099 None,
1100 &import_params,
1101 0,
1102 HMAC_KEY,
1103 )?;
1104
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001105 check_key_authorizations(&key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001106
1107 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001108 assert!(check_key_param(
1109 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001110 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::HMAC) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001111 ));
1112 assert!(check_key_param(
1113 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001114 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(128) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001115 ));
1116 assert!(check_key_param(
1117 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001118 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001119 ));
1120 assert!(check_key_param(
1121 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001122 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001123 ));
1124
1125 Ok(key_metadata)
1126}
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001127
1128/// Imports RSA encryption key with WRAP_KEY purpose.
1129pub fn import_wrapping_key(
1130 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1131 wrapping_key_data: &[u8],
1132 wrapping_key_alias: Option<String>,
1133) -> binder::Result<KeyMetadata> {
1134 let wrapping_key_params = AuthSetBuilder::new()
1135 .no_auth_required()
1136 .algorithm(Algorithm::RSA)
1137 .digest(Digest::SHA_2_256)
1138 .purpose(KeyPurpose::ENCRYPT)
1139 .purpose(KeyPurpose::DECRYPT)
1140 .purpose(KeyPurpose::WRAP_KEY)
1141 .padding_mode(PaddingMode::RSA_OAEP)
1142 .key_size(2048)
1143 .rsa_public_exponent(65537)
1144 .cert_not_before(0)
1145 .cert_not_after(253402300799000);
1146
1147 sec_level.importKey(
1148 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias: wrapping_key_alias, blob: None },
1149 None,
1150 &wrapping_key_params,
1151 0,
1152 wrapping_key_data,
1153 )
1154}
1155
1156/// Import wrapped key using given wrapping key.
1157pub fn import_wrapped_key(
1158 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1159 alias: Option<String>,
1160 wrapping_key_metadata: &KeyMetadata,
1161 wrapped_key: Option<Vec<u8>>,
1162) -> binder::Result<KeyMetadata> {
1163 let unwrap_params =
1164 AuthSetBuilder::new().digest(Digest::SHA_2_256).padding_mode(PaddingMode::RSA_OAEP);
1165
1166 let authenticator_spec: &[AuthenticatorSpec] = &[AuthenticatorSpec {
1167 authenticatorType: HardwareAuthenticatorType::NONE,
1168 authenticatorId: 0,
1169 }];
1170
1171 let key_metadata = sec_level.importWrappedKey(
1172 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: wrapped_key },
1173 &wrapping_key_metadata.key,
1174 None,
1175 &unwrap_params,
1176 authenticator_spec,
1177 )?;
1178
1179 Ok(key_metadata)
1180}
1181
1182/// Import wrapping key and then import wrapped key using wrapping key.
1183pub fn import_wrapping_key_and_wrapped_key(
1184 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1185 domain: Domain,
1186 nspace: i64,
1187 alias: Option<String>,
1188 wrapping_key_alias: Option<String>,
1189 wrapping_key_params: AuthSetBuilder,
1190) -> binder::Result<KeyMetadata> {
1191 let wrapping_key_metadata = sec_level.importKey(
1192 &KeyDescriptor { domain, nspace, alias: wrapping_key_alias, blob: None },
1193 None,
1194 &wrapping_key_params,
1195 0,
1196 WRAPPING_KEY,
1197 )?;
1198
1199 import_wrapped_key(sec_level, alias, &wrapping_key_metadata, Some(WRAPPED_KEY.to_vec()))
1200}
1201
1202/// Import given key material as AES-256-GCM-NONE transport key.
1203pub fn import_transport_key(
1204 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1205 transport_key_alias: Option<String>,
1206 transport_key: &[u8],
1207) -> binder::Result<KeyMetadata> {
1208 let transport_key_params = AuthSetBuilder::new()
1209 .no_auth_required()
1210 .algorithm(Algorithm::AES)
1211 .block_mode(BlockMode::GCM)
1212 .padding_mode(PaddingMode::NONE)
1213 .key_size(256)
1214 .caller_nonce()
1215 .min_mac_length(128)
1216 .purpose(KeyPurpose::ENCRYPT)
1217 .purpose(KeyPurpose::DECRYPT);
1218
1219 sec_level.importKey(
1220 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias: transport_key_alias, blob: None },
1221 None,
1222 &transport_key_params,
1223 0,
1224 transport_key,
1225 )
1226}
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001227
1228/// Generate EC key with purpose AGREE_KEY.
1229pub fn generate_ec_agree_key(
1230 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1231 ec_curve: EcCurve,
1232 digest: Digest,
1233 domain: Domain,
1234 nspace: i64,
1235 alias: Option<String>,
1236) -> binder::Result<KeyMetadata> {
1237 let gen_params = AuthSetBuilder::new()
1238 .no_auth_required()
1239 .algorithm(Algorithm::EC)
1240 .purpose(KeyPurpose::AGREE_KEY)
1241 .digest(digest)
1242 .ec_curve(ec_curve);
1243
1244 match sec_level.generateKey(
1245 &KeyDescriptor { domain, nspace, alias, blob: None },
1246 None,
1247 &gen_params,
1248 0,
1249 b"entropy",
1250 ) {
1251 Ok(key_metadata) => {
1252 assert!(key_metadata.certificate.is_some());
1253 if domain == Domain::BLOB {
1254 assert!(key_metadata.key.blob.is_some());
1255 }
1256
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001257 check_key_authorizations(
1258 &key_metadata.authorizations,
1259 &gen_params,
1260 KeyOrigin::GENERATED,
1261 );
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001262 Ok(key_metadata)
1263 }
1264 Err(e) => Err(e),
1265 }
1266}
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001267
1268/// Helper method to import AES keys `total_count` of times.
1269pub fn import_aes_keys(
1270 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1271 alias_prefix: String,
1272 total_count: Range<i32>,
1273) -> binder::Result<HashSet<String>> {
1274 let mut imported_key_aliases = HashSet::new();
1275
1276 // Import Total number of keys with given alias prefix.
1277 for count in total_count {
1278 let mut alias = String::new();
1279 write!(alias, "{}_{}", alias_prefix, count).unwrap();
1280 imported_key_aliases.insert(alias.clone());
1281
1282 import_aes_key(sec_level, Domain::APP, -1, Some(alias))?;
1283 }
1284
1285 Ok(imported_key_aliases)
1286}
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001287
1288/// Generate attested EC-P_256 key with device id attestation.
1289pub fn generate_key_with_attest_id(
1290 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1291 algorithm: Algorithm,
1292 alias: Option<String>,
1293 att_challenge: &[u8],
1294 attest_key: &KeyDescriptor,
1295 attest_id: Tag,
1296 value: Vec<u8>,
1297) -> binder::Result<KeyMetadata> {
1298 assert!(algorithm == Algorithm::RSA || algorithm == Algorithm::EC);
1299
1300 let mut ec_gen_params;
1301 if algorithm == Algorithm::EC {
1302 ec_gen_params = AuthSetBuilder::new()
1303 .no_auth_required()
1304 .algorithm(Algorithm::EC)
1305 .purpose(KeyPurpose::SIGN)
1306 .purpose(KeyPurpose::VERIFY)
1307 .digest(Digest::SHA_2_256)
1308 .ec_curve(EcCurve::P_256)
1309 .attestation_challenge(att_challenge.to_vec());
1310 } else {
1311 ec_gen_params = AuthSetBuilder::new()
1312 .no_auth_required()
1313 .algorithm(Algorithm::RSA)
1314 .rsa_public_exponent(65537)
1315 .key_size(2048)
1316 .purpose(KeyPurpose::SIGN)
1317 .purpose(KeyPurpose::VERIFY)
1318 .digest(Digest::SHA_2_256)
1319 .padding_mode(PaddingMode::RSA_PKCS1_1_5_SIGN)
1320 .attestation_challenge(att_challenge.to_vec());
1321 }
1322
1323 match attest_id {
1324 Tag::ATTESTATION_ID_BRAND => {
1325 ec_gen_params = ec_gen_params.attestation_device_brand(value);
1326 }
1327 Tag::ATTESTATION_ID_DEVICE => {
1328 ec_gen_params = ec_gen_params.attestation_device_name(value);
1329 }
1330 Tag::ATTESTATION_ID_PRODUCT => {
1331 ec_gen_params = ec_gen_params.attestation_device_product_name(value);
1332 }
1333 Tag::ATTESTATION_ID_SERIAL => {
1334 ec_gen_params = ec_gen_params.attestation_device_serial(value);
1335 }
1336 Tag::ATTESTATION_ID_MANUFACTURER => {
1337 ec_gen_params = ec_gen_params.attestation_device_manufacturer(value);
1338 }
1339 Tag::ATTESTATION_ID_MODEL => {
1340 ec_gen_params = ec_gen_params.attestation_device_model(value);
1341 }
1342 Tag::ATTESTATION_ID_IMEI => {
1343 ec_gen_params = ec_gen_params.attestation_device_imei(value);
1344 }
1345 Tag::ATTESTATION_ID_SECOND_IMEI => {
1346 ec_gen_params = ec_gen_params.attestation_device_second_imei(value);
1347 }
1348 _ => {
1349 panic!("Unknown attestation id");
1350 }
1351 }
1352
1353 sec_level.generateKey(
1354 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: None },
1355 Some(attest_key),
1356 &ec_gen_params,
1357 0,
1358 b"entropy",
1359 )
1360}
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001361
1362/// Generate Key and validate key characteristics.
1363pub fn generate_key(
1364 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1365 gen_params: &AuthSetBuilder,
1366 alias: &str,
1367) -> binder::Result<KeyMetadata> {
1368 let key_metadata = sec_level.generateKey(
1369 &KeyDescriptor {
1370 domain: Domain::APP,
1371 nspace: -1,
1372 alias: Some(alias.to_string()),
1373 blob: None,
1374 },
1375 None,
1376 gen_params,
1377 0,
1378 b"entropy",
1379 )?;
1380
1381 if gen_params.iter().any(|kp| {
1382 matches!(
1383 kp.value,
1384 KeyParameterValue::Algorithm(Algorithm::RSA)
1385 | KeyParameterValue::Algorithm(Algorithm::EC)
1386 )
1387 }) {
1388 assert!(key_metadata.certificate.is_some());
1389 if gen_params.iter().any(|kp| kp.tag == Tag::ATTESTATION_CHALLENGE) {
1390 assert!(key_metadata.certificateChain.is_some());
1391 }
1392 }
1393 check_key_authorizations(&key_metadata.authorizations, gen_params, KeyOrigin::GENERATED);
1394
1395 Ok(key_metadata)
1396}
1397
1398/// Generate a key using given authorizations and create an operation using the generated key.
1399pub fn create_key_and_operation(
1400 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1401 gen_params: &AuthSetBuilder,
1402 op_params: &AuthSetBuilder,
1403 alias: &str,
1404) -> binder::Result<CreateOperationResponse> {
1405 let key_metadata = generate_key(sec_level, gen_params, alias)?;
1406
1407 sec_level.createOperation(&key_metadata.key, op_params, false)
1408}