blob: badc48061f05c5837d47e7db119eaf6b9c9c7ac1 [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,
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +000029 KeyPurpose::KeyPurpose, PaddingMode::PaddingMode, SecurityLevel::SecurityLevel, 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 Nyamagoud5f6db2f2023-06-01 17:22:32 +000041use crate::ffi_test_utils::{
42 get_os_patchlevel, get_os_version, get_value_from_attest_record, get_vendor_patchlevel,
43 validate_certchain,
44};
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +000045
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +000046/// Shell namespace.
47pub const SELINUX_SHELL_NAMESPACE: i64 = 1;
Rajesh Nyamagouddc6fb232021-12-08 21:27:15 +000048/// Vold namespace.
49pub const SELINUX_VOLD_NAMESPACE: i64 = 100;
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +000050
Rajesh Nyamagoudfa7c0f12021-12-02 17:15:48 +000051/// SU context.
52pub const TARGET_SU_CTX: &str = "u:r:su:s0";
53
54/// Vold context
55pub const TARGET_VOLD_CTX: &str = "u:r:vold:s0";
56
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +000057/// Allowed tags in generated/imported key authorizations.
58/// See hardware/interfaces/security/keymint/aidl/android/hardware/security/keymint/Tag.aidl for the
59/// list feature tags.
60/// Note: This list need to be updated whenever a new Tag is introduced and is expected to be added
61/// in key authorizations.
62pub const ALLOWED_TAGS_IN_KEY_AUTHS: &[Tag] = &[
63 Tag::ACTIVE_DATETIME,
64 Tag::ALGORITHM,
65 Tag::ALLOW_WHILE_ON_BODY,
66 Tag::AUTH_TIMEOUT,
67 Tag::BLOCK_MODE,
68 Tag::BOOTLOADER_ONLY,
69 Tag::BOOT_PATCHLEVEL,
70 Tag::CALLER_NONCE,
71 Tag::CREATION_DATETIME,
72 Tag::DIGEST,
73 Tag::EARLY_BOOT_ONLY,
74 Tag::EC_CURVE,
75 Tag::IDENTITY_CREDENTIAL_KEY,
76 Tag::INCLUDE_UNIQUE_ID,
77 Tag::KEY_SIZE,
78 Tag::MAX_BOOT_LEVEL,
79 Tag::MAX_USES_PER_BOOT,
80 Tag::MIN_MAC_LENGTH,
81 Tag::NO_AUTH_REQUIRED,
82 Tag::ORIGIN,
83 Tag::ORIGINATION_EXPIRE_DATETIME,
84 Tag::OS_PATCHLEVEL,
85 Tag::OS_VERSION,
86 Tag::PADDING,
87 Tag::PURPOSE,
88 Tag::ROLLBACK_RESISTANCE,
89 Tag::RSA_OAEP_MGF_DIGEST,
90 Tag::RSA_PUBLIC_EXPONENT,
91 Tag::STORAGE_KEY,
92 Tag::TRUSTED_CONFIRMATION_REQUIRED,
93 Tag::TRUSTED_USER_PRESENCE_REQUIRED,
94 Tag::UNLOCKED_DEVICE_REQUIRED,
95 Tag::USAGE_COUNT_LIMIT,
96 Tag::USAGE_EXPIRE_DATETIME,
97 Tag::USER_AUTH_TYPE,
98 Tag::USER_ID,
99 Tag::USER_SECURE_ID,
100 Tag::VENDOR_PATCHLEVEL,
101];
102
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000103/// Key parameters to generate a key.
104pub struct KeyParams {
105 /// Key Size.
106 pub key_size: i32,
107 /// Key Purposes.
108 pub purpose: Vec<KeyPurpose>,
109 /// Padding Mode.
110 pub padding: Option<PaddingMode>,
111 /// Digest.
112 pub digest: Option<Digest>,
113 /// MFG Digest.
114 pub mgf_digest: Option<Digest>,
115 /// Block Mode.
116 pub block_mode: Option<BlockMode>,
117 /// Attestation challenge.
118 pub att_challenge: Option<Vec<u8>>,
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000119}
120
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000121/// DER-encoded PKCS#8 format RSA key. Generated using:
122/// openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -outform der | hexdump -e '30/1 "%02X" "\n"'
123pub static RSA_2048_KEY: &[u8] = &[
124 0x30, 0x82, 0x04, 0xBD, 0x02, 0x01, 0x00, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7,
125 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x04, 0xA7, 0x30, 0x82, 0x04, 0xA3, 0x02, 0x01,
126 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, 0xE5, 0x14, 0xE3, 0xC2, 0x43, 0xF3, 0x0F, 0xCC, 0x22, 0x73,
127 0x9C, 0x84, 0xCC, 0x1B, 0x6C, 0x97, 0x4B, 0xC9, 0xDF, 0x1F, 0xE2, 0xB8, 0x80, 0x85, 0xF9, 0x27,
128 0xAB, 0x97, 0x94, 0x58, 0x4B, 0xC9, 0x40, 0x94, 0x5A, 0xB4, 0xD4, 0xF8, 0xD0, 0x36, 0xC4, 0x86,
129 0x17, 0x7D, 0xA2, 0x48, 0x6D, 0x40, 0xF0, 0xB9, 0x61, 0x4F, 0xCE, 0x65, 0x80, 0x88, 0x81, 0x59,
130 0x95, 0x11, 0x24, 0xF4, 0x36, 0xB7, 0xB7, 0x37, 0x44, 0xF4, 0x6C, 0x1C, 0xEB, 0x04, 0x19, 0x78,
131 0xB2, 0x29, 0x4D, 0x21, 0x44, 0x16, 0x57, 0x58, 0x6D, 0x7D, 0x56, 0xB5, 0x99, 0xDD, 0xD2, 0xAD,
132 0x02, 0x9A, 0x72, 0x16, 0x67, 0xD6, 0x00, 0x9F, 0x69, 0xE0, 0x25, 0xEE, 0x7C, 0x86, 0x54, 0x27,
133 0x4B, 0x50, 0xEF, 0x60, 0x52, 0x60, 0x82, 0xAA, 0x09, 0x15, 0x72, 0xD2, 0xEB, 0x01, 0x52, 0x04,
134 0x39, 0x60, 0xBC, 0x5E, 0x95, 0x07, 0xC8, 0xC2, 0x3A, 0x3A, 0xE2, 0xA4, 0x99, 0x6B, 0x27, 0xE3,
135 0xA3, 0x55, 0x69, 0xC4, 0xB3, 0x2D, 0x19, 0xC4, 0x34, 0x76, 0xFC, 0x27, 0xDA, 0x22, 0xB2, 0x62,
136 0x69, 0x25, 0xDE, 0x0D, 0xE7, 0x54, 0x3C, 0xBB, 0x61, 0xD2, 0x20, 0xDA, 0x7B, 0x6E, 0x63, 0xBD,
137 0x9A, 0x4B, 0xCD, 0x75, 0xC6, 0xA1, 0x5E, 0x1C, 0x3E, 0xD5, 0x63, 0x59, 0x22, 0x7E, 0xE0, 0x6C,
138 0x98, 0x25, 0x63, 0x97, 0x56, 0xDF, 0x71, 0xF5, 0x4C, 0x78, 0xE9, 0xE1, 0xD5, 0xFC, 0xF8, 0x5A,
139 0x5B, 0xF6, 0x1D, 0xFA, 0x5A, 0x99, 0x4C, 0x99, 0x19, 0x21, 0x1D, 0xF5, 0x24, 0x07, 0xEF, 0x8A,
140 0xC9, 0x9F, 0xE7, 0x3F, 0xBB, 0x46, 0x1A, 0x16, 0x96, 0xC6, 0xD6, 0x12, 0x7E, 0xDA, 0xCB, 0xEB,
141 0x2F, 0x1D, 0x3B, 0x31, 0xCC, 0x55, 0x63, 0xA2, 0x6F, 0x8A, 0xDE, 0x35, 0x52, 0x40, 0x04, 0xBF,
142 0xE0, 0x82, 0x32, 0xE1, 0x6D, 0x8B, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, 0x00, 0x2D,
143 0x1F, 0x71, 0x41, 0x79, 0xBA, 0xED, 0xD8, 0xAA, 0xCC, 0x94, 0xFE, 0xFF, 0x69, 0x43, 0x79, 0x85,
144 0xBF, 0x2C, 0xC9, 0x0E, 0x12, 0x83, 0x96, 0x60, 0x1E, 0x75, 0x49, 0x35, 0x3A, 0x33, 0x2B, 0x60,
145 0x22, 0x18, 0xBF, 0xD7, 0xD7, 0x6E, 0xC3, 0xEA, 0xEF, 0xF2, 0xBE, 0x97, 0x71, 0xA6, 0xBB, 0x8C,
146 0xEF, 0x27, 0x00, 0xDE, 0x49, 0xD6, 0x08, 0x8D, 0x5A, 0x04, 0xE7, 0xCC, 0x9C, 0xA2, 0x0E, 0x8B,
147 0xF3, 0x42, 0x0C, 0xD7, 0x22, 0xD7, 0x14, 0x06, 0xA4, 0x64, 0x8B, 0x88, 0x1A, 0xCE, 0x5B, 0x8C,
148 0x36, 0xE9, 0xD2, 0x2F, 0x7B, 0x33, 0xE4, 0xA2, 0xB3, 0xDB, 0x78, 0x6A, 0x92, 0x89, 0x3F, 0x78,
149 0xFD, 0xED, 0x8F, 0xEE, 0x48, 0xCC, 0x94, 0x75, 0x0D, 0x0C, 0x63, 0xD3, 0xD2, 0xE8, 0x47, 0x04,
150 0x55, 0xD3, 0xD6, 0x3A, 0xB8, 0xDA, 0xFB, 0x76, 0x99, 0x48, 0x68, 0x0A, 0x92, 0xA2, 0xCD, 0xF7,
151 0x45, 0x8B, 0x50, 0xFE, 0xF9, 0x1A, 0x33, 0x24, 0x3C, 0x2E, 0xDE, 0x88, 0xAD, 0xB2, 0x5B, 0x9F,
152 0x44, 0xEA, 0xD1, 0x9F, 0xC7, 0x9F, 0x02, 0x5E, 0x31, 0x61, 0xB3, 0xD6, 0xE2, 0xE1, 0xBC, 0xFB,
153 0x1C, 0xDB, 0xBD, 0xB2, 0x9A, 0xE5, 0xEF, 0xDA, 0xCD, 0x29, 0xA5, 0x45, 0xCC, 0x67, 0x01, 0x8B,
154 0x1C, 0x1D, 0x0E, 0x8F, 0x73, 0x69, 0x4D, 0x4D, 0xF6, 0x9D, 0xA6, 0x6C, 0x9A, 0x1C, 0xF4, 0x5C,
155 0xE4, 0x83, 0x9A, 0x77, 0x12, 0x01, 0xBD, 0xCE, 0x66, 0x3A, 0x4B, 0x3D, 0x6E, 0xE0, 0x6E, 0x82,
156 0x98, 0xDE, 0x74, 0x11, 0x47, 0xEC, 0x7A, 0x3A, 0xA9, 0xD8, 0x48, 0x00, 0x26, 0x64, 0x47, 0x7B,
157 0xAE, 0x55, 0x9D, 0x29, 0x22, 0xB4, 0xB3, 0xB9, 0xB1, 0x64, 0xEA, 0x3B, 0x5A, 0xD3, 0x3F, 0x8D,
158 0x0F, 0x14, 0x7E, 0x4E, 0xB8, 0x1B, 0x06, 0xFC, 0xB1, 0x7E, 0xCD, 0xB9, 0x1A, 0x4E, 0xA1, 0x02,
159 0x81, 0x81, 0x00, 0xF9, 0xDE, 0xEE, 0xED, 0x13, 0x2F, 0xBB, 0xE7, 0xE2, 0xB3, 0x2D, 0x98, 0xD2,
160 0xE8, 0x25, 0x07, 0x5A, 0x1E, 0x51, 0x0A, 0xC8, 0xAD, 0x50, 0x4B, 0x80, 0xC6, 0x22, 0xF5, 0x9B,
161 0x08, 0xE6, 0x3D, 0x01, 0xC6, 0x3E, 0xC8, 0xD2, 0x54, 0x9F, 0x91, 0x77, 0x95, 0xCD, 0xCA, 0xC7,
162 0xE7, 0x47, 0x94, 0xA9, 0x5F, 0x4E, 0xBE, 0x31, 0x3D, 0xB4, 0xAF, 0x43, 0x0F, 0xDC, 0x8D, 0x9C,
163 0x1E, 0x52, 0x7B, 0x72, 0x21, 0x34, 0xB3, 0x96, 0x7C, 0x9C, 0xB8, 0x51, 0x65, 0x60, 0xAC, 0x3D,
164 0x11, 0x32, 0xB8, 0xD6, 0x34, 0x35, 0x66, 0xD0, 0x30, 0xB9, 0xE9, 0x67, 0x2C, 0x87, 0x73, 0x43,
165 0x9C, 0x12, 0x16, 0x7D, 0x4A, 0xD9, 0xA3, 0x4C, 0x24, 0x64, 0x6A, 0x32, 0x8E, 0xC3, 0xD8, 0x00,
166 0x90, 0x5C, 0x4D, 0x65, 0x01, 0x53, 0x8A, 0xD0, 0x87, 0xCE, 0x96, 0xEF, 0xFA, 0x73, 0x03, 0xF1,
167 0xDC, 0x1B, 0x9B, 0x02, 0x81, 0x81, 0x00, 0xEA, 0xB3, 0x69, 0x00, 0x11, 0x0E, 0x50, 0xAA, 0xD3,
168 0x22, 0x51, 0x78, 0x9D, 0xFF, 0x05, 0x62, 0xBC, 0x9A, 0x67, 0x86, 0xE1, 0xC5, 0x02, 0x2D, 0x14,
169 0x11, 0x29, 0x30, 0xE7, 0x90, 0x5D, 0x72, 0x6F, 0xC5, 0x62, 0xEB, 0xD4, 0xB0, 0x3F, 0x3D, 0xDC,
170 0xB9, 0xFC, 0x2B, 0x5C, 0xBD, 0x9E, 0x71, 0x81, 0x5C, 0xC5, 0xFE, 0xDF, 0x69, 0x73, 0x12, 0x66,
171 0x92, 0x06, 0xD4, 0xD5, 0x8F, 0xDF, 0x14, 0x2E, 0x9C, 0xD0, 0x4C, 0xC2, 0x4D, 0x31, 0x2E, 0x47,
172 0xA5, 0xDC, 0x8A, 0x83, 0x7B, 0xE8, 0xA5, 0xC3, 0x03, 0x98, 0xD8, 0xBF, 0xF4, 0x7D, 0x6E, 0x87,
173 0x55, 0xE4, 0x0F, 0x15, 0x10, 0xC8, 0x76, 0x4F, 0xAD, 0x1D, 0x1C, 0x95, 0x41, 0x9D, 0x88, 0xEC,
174 0x8C, 0xDA, 0xBA, 0x90, 0x7F, 0x8D, 0xD9, 0x8B, 0x47, 0x6C, 0x0C, 0xFF, 0xBA, 0x73, 0x00, 0x20,
175 0x1F, 0xF7, 0x7E, 0x5F, 0xF4, 0xEC, 0xD1, 0x02, 0x81, 0x80, 0x16, 0xB7, 0x43, 0xB5, 0x5D, 0xD7,
176 0x2B, 0x18, 0x0B, 0xAE, 0x0A, 0x69, 0x28, 0x53, 0x5E, 0x7A, 0x6A, 0xA0, 0xF2, 0xF1, 0x2E, 0x09,
177 0x43, 0x91, 0x79, 0xA5, 0x89, 0xAC, 0x16, 0x6A, 0x1A, 0xB4, 0x55, 0x22, 0xF6, 0xB6, 0x3F, 0x18,
178 0xDE, 0x60, 0xD5, 0x24, 0x53, 0x4F, 0x2A, 0x19, 0x46, 0x92, 0xA7, 0x4B, 0x38, 0xD7, 0x65, 0x96,
179 0x9C, 0x84, 0x8A, 0x6E, 0x38, 0xB8, 0xCF, 0x06, 0x9A, 0xAD, 0x0A, 0x55, 0x26, 0x7B, 0x65, 0x24,
180 0xF3, 0x02, 0x76, 0xB3, 0xE6, 0xB4, 0x01, 0xE1, 0x3C, 0x61, 0x3D, 0x68, 0x05, 0xAA, 0xD1, 0x26,
181 0x7C, 0xE0, 0x51, 0x36, 0xE5, 0x21, 0x7F, 0x76, 0x02, 0xD6, 0xF4, 0x91, 0x07, 0x74, 0x27, 0x09,
182 0xEF, 0xEF, 0x0F, 0xA5, 0x96, 0xFC, 0x5E, 0x20, 0xC1, 0xA3, 0x6F, 0x99, 0x4D, 0x45, 0x03, 0x6C,
183 0x35, 0x45, 0xD7, 0x8F, 0x47, 0x41, 0x86, 0x8D, 0x62, 0x1D, 0x02, 0x81, 0x81, 0x00, 0xC3, 0x93,
184 0x85, 0xA7, 0xFC, 0x8E, 0x85, 0x42, 0x14, 0x76, 0xC0, 0x95, 0x56, 0x73, 0xB0, 0xB5, 0x3A, 0x9D,
185 0x20, 0x30, 0x11, 0xEA, 0xED, 0x89, 0x4A, 0xF3, 0x91, 0xF3, 0xA2, 0xC3, 0x76, 0x5B, 0x6A, 0x30,
186 0x7D, 0xE2, 0x2F, 0x76, 0x3E, 0xFC, 0xF9, 0xF6, 0x31, 0xE0, 0xA0, 0x83, 0x92, 0x88, 0xDB, 0x57,
187 0xC7, 0xD6, 0x3F, 0xAD, 0xCB, 0xAA, 0x45, 0xB6, 0xE1, 0xE2, 0x71, 0xA4, 0x56, 0x2C, 0xA7, 0x3B,
188 0x1D, 0x89, 0x19, 0x50, 0xE1, 0xEE, 0xC2, 0xDD, 0xC0, 0x0D, 0xDC, 0xCB, 0x60, 0x6E, 0xE1, 0x37,
189 0x1A, 0x23, 0x64, 0xB2, 0x03, 0xE4, 0x1A, 0xFA, 0xC3, 0xF4, 0x9D, 0x85, 0x42, 0xC6, 0xF4, 0x56,
190 0x39, 0xB0, 0x1B, 0xE0, 0x75, 0xBA, 0x28, 0x04, 0xA8, 0x30, 0x57, 0x41, 0x33, 0x9F, 0x58, 0xA4,
191 0xC7, 0xB1, 0x7D, 0x58, 0x8D, 0x84, 0x49, 0x40, 0xDA, 0x28, 0x81, 0x25, 0xC4, 0x41, 0x02, 0x81,
192 0x80, 0x13, 0x20, 0x65, 0xD5, 0x96, 0x98, 0x8D, 0x16, 0x73, 0xA1, 0x31, 0x73, 0x79, 0xBA, 0xEC,
193 0xB0, 0xD9, 0x0C, 0xF6, 0xEF, 0x2F, 0xC2, 0xE7, 0x96, 0x9B, 0xA1, 0x2D, 0xE9, 0xFB, 0x45, 0xB9,
194 0xD0, 0x30, 0xE2, 0xBD, 0x30, 0x4F, 0xB6, 0xFE, 0x24, 0x02, 0xCF, 0x8D, 0x51, 0x48, 0x45, 0xD9,
195 0xF7, 0x20, 0x53, 0x1C, 0x0B, 0xA9, 0x7E, 0xC2, 0xA2, 0x65, 0xCC, 0x3E, 0x0E, 0x0D, 0xF1, 0x62,
196 0xDD, 0x5F, 0xBC, 0x55, 0x9B, 0x58, 0x26, 0x40, 0x6A, 0xEE, 0x02, 0x55, 0x36, 0xE9, 0xBA, 0x82,
197 0x5A, 0xFD, 0x3C, 0xDF, 0xA6, 0x26, 0x32, 0x81, 0xA9, 0x5E, 0x46, 0xBE, 0xBA, 0xDC, 0xD3, 0x2A,
198 0x3A, 0x3B, 0xC1, 0x4E, 0xF7, 0x1A, 0xDC, 0x4B, 0xAF, 0x67, 0x1B, 0x3A, 0x83, 0x0D, 0x04, 0xDE,
199 0x27, 0x47, 0xFC, 0xE6, 0x39, 0x89, 0x7B, 0x66, 0xF9, 0x50, 0x4D, 0xF1, 0xAC, 0x20, 0x43, 0x7E,
200 0xEE,
201];
202
203/// DER-encoded PKCS#8 format EC key. Generated using:
204/// openssl ecparam -name prime256v1 -genkey | openssl pkcs8 -topk8 -nocrypt -outform der | hexdump -e '30/1 "%02X" "\n"'
205pub static EC_P_256_KEY: &[u8] = &[
206 0x30, 0x81, 0x87, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02,
207 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07, 0x04, 0x6D, 0x30, 0x6B, 0x02,
208 0x01, 0x01, 0x04, 0x20, 0xB9, 0x1D, 0xAF, 0x50, 0xFD, 0xD8, 0x6A, 0x40, 0xAB, 0x2C, 0xCB, 0x54,
209 0x4E, 0xED, 0xF1, 0x64, 0xBC, 0x30, 0x25, 0xFB, 0xC4, 0x69, 0x00, 0x34, 0x1A, 0x82, 0xA3, 0x72,
210 0x5D, 0xC7, 0xA9, 0x85, 0xA1, 0x44, 0x03, 0x42, 0x00, 0x04, 0xE8, 0x53, 0x0A, 0xF2, 0xD3, 0x68,
211 0x40, 0x48, 0x8C, 0xB4, 0x2F, 0x11, 0x34, 0xD7, 0xF4, 0x4A, 0x5C, 0x33, 0xFF, 0xF6, 0x2B, 0xF7,
212 0x98, 0x0F, 0x02, 0xA5, 0xD7, 0x4F, 0xF9, 0xDE, 0x60, 0x9C, 0x6E, 0xB0, 0x45, 0xDA, 0x3F, 0xF4,
213 0x34, 0x23, 0x9B, 0x4C, 0x3A, 0x09, 0x9C, 0x5E, 0x5D, 0x37, 0x96, 0xAC, 0x4A, 0xE7, 0x65, 0x2B,
214 0xD6, 0x84, 0x98, 0xEA, 0x96, 0x91, 0xFB, 0x78, 0xED, 0x86,
215];
216
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +0000217/// DER-encoded PKCS#8 format RSA key -
218/// Size: 2048
219/// Public Exponent: 65537
220/// Purpose: WRAP_KEY, ENCRYPT, DECRYPT
221/// Encryption scheme: RSAES-PKCS1-v1_5
222/// Digest: SHA_2_256
223/// Padding: RSA_OAEP
224/// This sample wrapping_key is taken from KeyMint tests
225/// (see hardware/interfaces/security/keymint/aidl/vts/functional/KeyMintTest.cpp).
226/// Similarly more test keys can be generated with below command -
227/// openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -outform der | hexdump -e '30/1 "%02X" "\n"'
228pub static WRAPPING_KEY: &[u8] = &[
229 0x30, 0x82, 0x04, 0xbe, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
230 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x04, 0xa8, 0x30, 0x82, 0x04, 0xa4, 0x02, 0x01,
231 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, 0xae, 0xc3, 0x67, 0x93, 0x1d, 0x89, 0x00, 0xce, 0x56, 0xb0,
232 0x06, 0x7f, 0x7d, 0x70, 0xe1, 0xfc, 0x65, 0x3f, 0x3f, 0x34, 0xd1, 0x94, 0xc1, 0xfe, 0xd5, 0x00,
233 0x18, 0xfb, 0x43, 0xdb, 0x93, 0x7b, 0x06, 0xe6, 0x73, 0xa8, 0x37, 0x31, 0x3d, 0x56, 0xb1, 0xc7,
234 0x25, 0x15, 0x0a, 0x3f, 0xef, 0x86, 0xac, 0xbd, 0xdc, 0x41, 0xbb, 0x75, 0x9c, 0x28, 0x54, 0xea,
235 0xe3, 0x2d, 0x35, 0x84, 0x1e, 0xfb, 0x5c, 0x18, 0xd8, 0x2b, 0xc9, 0x0a, 0x1c, 0xb5, 0xc1, 0xd5,
236 0x5a, 0xdf, 0x24, 0x5b, 0x02, 0x91, 0x1f, 0x0b, 0x7c, 0xda, 0x88, 0xc4, 0x21, 0xff, 0x0e, 0xba,
237 0xfe, 0x7c, 0x0d, 0x23, 0xbe, 0x31, 0x2d, 0x7b, 0xd5, 0x92, 0x1f, 0xfa, 0xea, 0x13, 0x47, 0xc1,
238 0x57, 0x40, 0x6f, 0xef, 0x71, 0x8f, 0x68, 0x26, 0x43, 0xe4, 0xe5, 0xd3, 0x3c, 0x67, 0x03, 0xd6,
239 0x1c, 0x0c, 0xf7, 0xac, 0x0b, 0xf4, 0x64, 0x5c, 0x11, 0xf5, 0xc1, 0x37, 0x4c, 0x38, 0x86, 0x42,
240 0x74, 0x11, 0xc4, 0x49, 0x79, 0x67, 0x92, 0xe0, 0xbe, 0xf7, 0x5d, 0xec, 0x85, 0x8a, 0x21, 0x23,
241 0xc3, 0x67, 0x53, 0xe0, 0x2a, 0x95, 0xa9, 0x6d, 0x7c, 0x45, 0x4b, 0x50, 0x4d, 0xe3, 0x85, 0xa6,
242 0x42, 0xe0, 0xdf, 0xc3, 0xe6, 0x0a, 0xc3, 0xa7, 0xee, 0x49, 0x91, 0xd0, 0xd4, 0x8b, 0x01, 0x72,
243 0xa9, 0x5f, 0x95, 0x36, 0xf0, 0x2b, 0xa1, 0x3c, 0xec, 0xcc, 0xb9, 0x2b, 0x72, 0x7d, 0xb5, 0xc2,
244 0x7e, 0x5b, 0x2f, 0x5c, 0xec, 0x09, 0x60, 0x0b, 0x28, 0x6a, 0xf5, 0xcf, 0x14, 0xc4, 0x20, 0x24,
245 0xc6, 0x1d, 0xdf, 0xe7, 0x1c, 0x2a, 0x8d, 0x74, 0x58, 0xf1, 0x85, 0x23, 0x4c, 0xb0, 0x0e, 0x01,
246 0xd2, 0x82, 0xf1, 0x0f, 0x8f, 0xc6, 0x72, 0x1d, 0x2a, 0xed, 0x3f, 0x48, 0x33, 0xcc, 0xa2, 0xbd,
247 0x8f, 0xa6, 0x28, 0x21, 0xdd, 0x55, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, 0x00, 0x43,
248 0x14, 0x47, 0xb6, 0x25, 0x19, 0x08, 0x11, 0x2b, 0x1e, 0xe7, 0x6f, 0x99, 0xf3, 0x71, 0x1a, 0x52,
249 0xb6, 0x63, 0x09, 0x60, 0x04, 0x6c, 0x2d, 0xe7, 0x0d, 0xe1, 0x88, 0xd8, 0x33, 0xf8, 0xb8, 0xb9,
250 0x1e, 0x4d, 0x78, 0x5c, 0xae, 0xee, 0xaf, 0x4f, 0x0f, 0x74, 0x41, 0x4e, 0x2c, 0xda, 0x40, 0x64,
251 0x1f, 0x7f, 0xe2, 0x4f, 0x14, 0xc6, 0x7a, 0x88, 0x95, 0x9b, 0xdb, 0x27, 0x76, 0x6d, 0xf9, 0xe7,
252 0x10, 0xb6, 0x30, 0xa0, 0x3a, 0xdc, 0x68, 0x3b, 0x5d, 0x2c, 0x43, 0x08, 0x0e, 0x52, 0xbe, 0xe7,
253 0x1e, 0x9e, 0xae, 0xb6, 0xde, 0x29, 0x7a, 0x5f, 0xea, 0x10, 0x72, 0x07, 0x0d, 0x18, 0x1c, 0x82,
254 0x2b, 0xcc, 0xff, 0x08, 0x7d, 0x63, 0xc9, 0x40, 0xba, 0x8a, 0x45, 0xf6, 0x70, 0xfe, 0xb2, 0x9f,
255 0xb4, 0x48, 0x4d, 0x1c, 0x95, 0xe6, 0xd2, 0x57, 0x9b, 0xa0, 0x2a, 0xae, 0x0a, 0x00, 0x90, 0x0c,
256 0x3e, 0xbf, 0x49, 0x0e, 0x3d, 0x2c, 0xd7, 0xee, 0x8d, 0x0e, 0x20, 0xc5, 0x36, 0xe4, 0xdc, 0x5a,
257 0x50, 0x97, 0x27, 0x28, 0x88, 0xcd, 0xdd, 0x7e, 0x91, 0xf2, 0x28, 0xb1, 0xc4, 0xd7, 0x47, 0x4c,
258 0x55, 0xb8, 0xfc, 0xd6, 0x18, 0xc4, 0xa9, 0x57, 0xbb, 0xdd, 0xd5, 0xad, 0x74, 0x07, 0xcc, 0x31,
259 0x2d, 0x8d, 0x98, 0xa5, 0xca, 0xf7, 0xe0, 0x8f, 0x4a, 0x0d, 0x6b, 0x45, 0xbb, 0x41, 0xc6, 0x52,
260 0x65, 0x9d, 0x5a, 0x5b, 0xa0, 0x5b, 0x66, 0x37, 0x37, 0xa8, 0x69, 0x62, 0x81, 0x86, 0x5b, 0xa2,
261 0x0f, 0xbd, 0xd7, 0xf8, 0x51, 0xe6, 0xc5, 0x6e, 0x8c, 0xbe, 0x0d, 0xdb, 0xbf, 0x24, 0xdc, 0x03,
262 0xb2, 0xd2, 0xcb, 0x4c, 0x3d, 0x54, 0x0f, 0xb0, 0xaf, 0x52, 0xe0, 0x34, 0xa2, 0xd0, 0x66, 0x98,
263 0xb1, 0x28, 0xe5, 0xf1, 0x01, 0xe3, 0xb5, 0x1a, 0x34, 0xf8, 0xd8, 0xb4, 0xf8, 0x61, 0x81, 0x02,
264 0x81, 0x81, 0x00, 0xde, 0x39, 0x2e, 0x18, 0xd6, 0x82, 0xc8, 0x29, 0x26, 0x6c, 0xc3, 0x45, 0x4e,
265 0x1d, 0x61, 0x66, 0x24, 0x2f, 0x32, 0xd9, 0xa1, 0xd1, 0x05, 0x77, 0x75, 0x3e, 0x90, 0x4e, 0xa7,
266 0xd0, 0x8b, 0xff, 0x84, 0x1b, 0xe5, 0xba, 0xc8, 0x2a, 0x16, 0x4c, 0x59, 0x70, 0x00, 0x70, 0x47,
267 0xb8, 0xc5, 0x17, 0xdb, 0x8f, 0x8f, 0x84, 0xe3, 0x7b, 0xd5, 0x98, 0x85, 0x61, 0xbd, 0xf5, 0x03,
268 0xd4, 0xdc, 0x2b, 0xdb, 0x38, 0xf8, 0x85, 0x43, 0x4a, 0xe4, 0x2c, 0x35, 0x5f, 0x72, 0x5c, 0x9a,
269 0x60, 0xf9, 0x1f, 0x07, 0x88, 0xe1, 0xf1, 0xa9, 0x72, 0x23, 0xb5, 0x24, 0xb5, 0x35, 0x7f, 0xdf,
270 0x72, 0xe2, 0xf6, 0x96, 0xba, 0xb7, 0xd7, 0x8e, 0x32, 0xbf, 0x92, 0xba, 0x8e, 0x18, 0x64, 0xea,
271 0xb1, 0x22, 0x9e, 0x91, 0x34, 0x61, 0x30, 0x74, 0x8a, 0x6e, 0x3c, 0x12, 0x4f, 0x91, 0x49, 0xd7,
272 0x1c, 0x74, 0x35, 0x02, 0x81, 0x81, 0x00, 0xc9, 0x53, 0x87, 0xc0, 0xf9, 0xd3, 0x5f, 0x13, 0x7b,
273 0x57, 0xd0, 0xd6, 0x5c, 0x39, 0x7c, 0x5e, 0x21, 0xcc, 0x25, 0x1e, 0x47, 0x00, 0x8e, 0xd6, 0x2a,
274 0x54, 0x24, 0x09, 0xc8, 0xb6, 0xb6, 0xac, 0x7f, 0x89, 0x67, 0xb3, 0x86, 0x3c, 0xa6, 0x45, 0xfc,
275 0xce, 0x49, 0x58, 0x2a, 0x9a, 0xa1, 0x73, 0x49, 0xdb, 0x6c, 0x4a, 0x95, 0xaf, 0xfd, 0xae, 0x0d,
276 0xae, 0x61, 0x2e, 0x1a, 0xfa, 0xc9, 0x9e, 0xd3, 0x9a, 0x2d, 0x93, 0x4c, 0x88, 0x04, 0x40, 0xae,
277 0xd8, 0x83, 0x2f, 0x98, 0x43, 0x16, 0x3a, 0x47, 0xf2, 0x7f, 0x39, 0x21, 0x99, 0xdc, 0x12, 0x02,
278 0xf9, 0xa0, 0xf9, 0xbd, 0x08, 0x30, 0x80, 0x07, 0xcb, 0x1e, 0x4e, 0x7f, 0x58, 0x30, 0x93, 0x66,
279 0xa7, 0xde, 0x25, 0xf7, 0xc3, 0xc9, 0xb8, 0x80, 0x67, 0x7c, 0x06, 0x8e, 0x1b, 0xe9, 0x36, 0xe8,
280 0x12, 0x88, 0x81, 0x52, 0x52, 0xa8, 0xa1, 0x02, 0x81, 0x80, 0x57, 0xff, 0x8c, 0xa1, 0x89, 0x50,
281 0x80, 0xb2, 0xca, 0xe4, 0x86, 0xef, 0x0a, 0xdf, 0xd7, 0x91, 0xfb, 0x02, 0x35, 0xc0, 0xb8, 0xb3,
282 0x6c, 0xd6, 0xc1, 0x36, 0xe5, 0x2e, 0x40, 0x85, 0xf4, 0xea, 0x5a, 0x06, 0x32, 0x12, 0xa4, 0xf1,
283 0x05, 0xa3, 0x76, 0x47, 0x43, 0xe5, 0x32, 0x81, 0x98, 0x8a, 0xba, 0x07, 0x3f, 0x6e, 0x00, 0x27,
284 0x29, 0x8e, 0x1c, 0x43, 0x78, 0x55, 0x6e, 0x0e, 0xfc, 0xa0, 0xe1, 0x4e, 0xce, 0x1a, 0xf7, 0x6a,
285 0xd0, 0xb0, 0x30, 0xf2, 0x7a, 0xf6, 0xf0, 0xab, 0x35, 0xfb, 0x73, 0xa0, 0x60, 0xd8, 0xb1, 0xa0,
286 0xe1, 0x42, 0xfa, 0x26, 0x47, 0xe9, 0x3b, 0x32, 0xe3, 0x6d, 0x82, 0x82, 0xae, 0x0a, 0x4d, 0xe5,
287 0x0a, 0xb7, 0xaf, 0xe8, 0x55, 0x00, 0xa1, 0x6f, 0x43, 0xa6, 0x47, 0x19, 0xd6, 0xe2, 0xb9, 0x43,
288 0x98, 0x23, 0x71, 0x9c, 0xd0, 0x8b, 0xcd, 0x03, 0x17, 0x81, 0x02, 0x81, 0x81, 0x00, 0xba, 0x73,
289 0xb0, 0xbb, 0x28, 0xe3, 0xf8, 0x1e, 0x9b, 0xd1, 0xc5, 0x68, 0x71, 0x3b, 0x10, 0x12, 0x41, 0xac,
290 0xc6, 0x07, 0x97, 0x6c, 0x4d, 0xdc, 0xcc, 0x90, 0xe6, 0x5b, 0x65, 0x56, 0xca, 0x31, 0x51, 0x60,
291 0x58, 0xf9, 0x2b, 0x6e, 0x09, 0xf3, 0xb1, 0x60, 0xff, 0x0e, 0x37, 0x4e, 0xc4, 0x0d, 0x78, 0xae,
292 0x4d, 0x49, 0x79, 0xfd, 0xe6, 0xac, 0x06, 0xa1, 0xa4, 0x00, 0xc6, 0x1d, 0xd3, 0x12, 0x54, 0x18,
293 0x6a, 0xf3, 0x0b, 0x22, 0xc1, 0x05, 0x82, 0xa8, 0xa4, 0x3e, 0x34, 0xfe, 0x94, 0x9c, 0x5f, 0x3b,
294 0x97, 0x55, 0xba, 0xe7, 0xba, 0xa7, 0xb7, 0xb7, 0xa6, 0xbd, 0x03, 0xb3, 0x8c, 0xef, 0x55, 0xc8,
295 0x68, 0x85, 0xfc, 0x6c, 0x19, 0x78, 0xb9, 0xce, 0xe7, 0xef, 0x33, 0xda, 0x50, 0x7c, 0x9d, 0xf6,
296 0xb9, 0x27, 0x7c, 0xff, 0x1e, 0x6a, 0xaa, 0x5d, 0x57, 0xac, 0xa5, 0x28, 0x46, 0x61, 0x02, 0x81,
297 0x81, 0x00, 0xc9, 0x31, 0x61, 0x7c, 0x77, 0x82, 0x9d, 0xfb, 0x12, 0x70, 0x50, 0x2b, 0xe9, 0x19,
298 0x5c, 0x8f, 0x28, 0x30, 0x88, 0x5f, 0x57, 0xdb, 0xa8, 0x69, 0x53, 0x68, 0x11, 0xe6, 0x86, 0x42,
299 0x36, 0xd0, 0xc4, 0x73, 0x6a, 0x00, 0x08, 0xa1, 0x45, 0xaf, 0x36, 0xb8, 0x35, 0x7a, 0x7c, 0x3d,
300 0x13, 0x99, 0x66, 0xd0, 0x4c, 0x4e, 0x00, 0x93, 0x4e, 0xa1, 0xae, 0xde, 0x3b, 0xb6, 0xb8, 0xec,
301 0x84, 0x1d, 0xc9, 0x5e, 0x3f, 0x57, 0x97, 0x51, 0xe2, 0xbf, 0xdf, 0xe2, 0x7a, 0xe7, 0x78, 0x98,
302 0x3f, 0x95, 0x93, 0x56, 0x21, 0x07, 0x23, 0x28, 0x7b, 0x0a, 0xff, 0xcc, 0x9f, 0x72, 0x70, 0x44,
303 0xd4, 0x8c, 0x37, 0x3f, 0x1b, 0xab, 0xde, 0x07, 0x24, 0xfa, 0x17, 0xa4, 0xfd, 0x4d, 0xa0, 0x90,
304 0x2c, 0x7c, 0x9b, 0x9b, 0xf2, 0x7b, 0xa6, 0x1b, 0xe6, 0xad, 0x02, 0xdf, 0xdd, 0xda, 0x8f, 0x4e,
305 0x68, 0x22,
306];
307
308/// WrappedKeyData as ASN.1 DER-encoded data corresponding to the `SecureKeyWrapper` schema
309/// specified in IKeyMintDevice.aidl. Wrapped key parameters are -
310/// Algorithm: AES
311/// Key size: 256
312/// Block mode: ECB
313/// Padding mode: PKCS7
314/// This sample wrapped_key is taken from KeyMint tests (see KeyMintTest.cpp).
315pub static WRAPPED_KEY: &[u8] = &[
316 0x30, 0x82, 0x01, 0x79, 0x02, 0x01, 0x00, 0x04, 0x82, 0x01, 0x00, 0x93, 0x4b, 0xf9, 0x4e, 0x2a,
317 0xa2, 0x8a, 0x3f, 0x83, 0xc9, 0xf7, 0x92, 0x97, 0x25, 0x02, 0x62, 0xfb, 0xe3, 0x27, 0x6b, 0x5a,
318 0x1c, 0x91, 0x15, 0x9b, 0xbf, 0xa3, 0xef, 0x89, 0x57, 0xaa, 0xc8, 0x4b, 0x59, 0xb3, 0x0b, 0x45,
319 0x5a, 0x79, 0xc2, 0x97, 0x34, 0x80, 0x82, 0x3d, 0x8b, 0x38, 0x63, 0xc3, 0xde, 0xef, 0x4a, 0x8e,
320 0x24, 0x35, 0x90, 0x26, 0x8d, 0x80, 0xe1, 0x87, 0x51, 0xa0, 0xe1, 0x30, 0xf6, 0x7c, 0xe6, 0xa1,
321 0xac, 0xe9, 0xf7, 0x9b, 0x95, 0xe0, 0x97, 0x47, 0x4f, 0xeb, 0xc9, 0x81, 0x19, 0x5b, 0x1d, 0x13,
322 0xa6, 0x90, 0x86, 0xc0, 0x86, 0x3f, 0x66, 0xa7, 0xb7, 0xfd, 0xb4, 0x87, 0x92, 0x22, 0x7b, 0x1a,
323 0xc5, 0xe2, 0x48, 0x9f, 0xeb, 0xdf, 0x08, 0x7a, 0xb5, 0x48, 0x64, 0x83, 0x03, 0x3a, 0x6f, 0x00,
324 0x1c, 0xa5, 0xd1, 0xec, 0x1e, 0x27, 0xf5, 0xc3, 0x0f, 0x4c, 0xec, 0x26, 0x42, 0x07, 0x4a, 0x39,
325 0xae, 0x68, 0xae, 0xe5, 0x52, 0xe1, 0x96, 0x62, 0x7a, 0x8e, 0x3d, 0x86, 0x7e, 0x67, 0xa8, 0xc0,
326 0x1b, 0x11, 0xe7, 0x5f, 0x13, 0xcc, 0xa0, 0xa9, 0x7a, 0xb6, 0x68, 0xb5, 0x0c, 0xda, 0x07, 0xa8,
327 0xec, 0xb7, 0xcd, 0x8e, 0x3d, 0xd7, 0x00, 0x9c, 0x96, 0x36, 0x53, 0x4f, 0x6f, 0x23, 0x9c, 0xff,
328 0xe1, 0xfc, 0x8d, 0xaa, 0x46, 0x6f, 0x78, 0xb6, 0x76, 0xc7, 0x11, 0x9e, 0xfb, 0x96, 0xbc, 0xe4,
329 0xe6, 0x9c, 0xa2, 0xa2, 0x5d, 0x0b, 0x34, 0xed, 0x9c, 0x3f, 0xf9, 0x99, 0xb8, 0x01, 0x59, 0x7d,
330 0x52, 0x20, 0xe3, 0x07, 0xea, 0xa5, 0xbe, 0xe5, 0x07, 0xfb, 0x94, 0xd1, 0xfa, 0x69, 0xf9, 0xe5,
331 0x19, 0xb2, 0xde, 0x31, 0x5b, 0xac, 0x92, 0xc3, 0x6f, 0x2e, 0xa1, 0xfa, 0x1d, 0xf4, 0x47, 0x8c,
332 0x0d, 0xde, 0xde, 0xae, 0x8c, 0x70, 0xe0, 0x23, 0x3c, 0xd0, 0x98, 0x04, 0x0c, 0xd7, 0x96, 0xb0,
333 0x2c, 0x37, 0x0f, 0x1f, 0xa4, 0xcc, 0x01, 0x24, 0xf1, 0x30, 0x2e, 0x02, 0x01, 0x03, 0x30, 0x29,
334 0xa1, 0x08, 0x31, 0x06, 0x02, 0x01, 0x00, 0x02, 0x01, 0x01, 0xa2, 0x03, 0x02, 0x01, 0x20, 0xa3,
335 0x04, 0x02, 0x02, 0x01, 0x00, 0xa4, 0x05, 0x31, 0x03, 0x02, 0x01, 0x01, 0xa6, 0x05, 0x31, 0x03,
336 0x02, 0x01, 0x40, 0xbf, 0x83, 0x77, 0x02, 0x05, 0x00, 0x04, 0x20, 0xcc, 0xd5, 0x40, 0x85, 0x5f,
337 0x83, 0x3a, 0x5e, 0x14, 0x80, 0xbf, 0xd2, 0xd3, 0x6f, 0xaf, 0x3a, 0xee, 0xe1, 0x5d, 0xf5, 0xbe,
338 0xab, 0xe2, 0x69, 0x1b, 0xc8, 0x2d, 0xde, 0x2a, 0x7a, 0xa9, 0x10, 0x04, 0x10, 0x64, 0xc9, 0xf6,
339 0x89, 0xc6, 0x0f, 0xf6, 0x22, 0x3a, 0xb6, 0xe6, 0x99, 0x9e, 0x0e, 0xb6, 0xe5,
340];
341
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000342/// To map Keystore errors.
343#[derive(thiserror::Error, Debug, Eq, PartialEq)]
344pub enum Error {
345 /// Keystore2 error code
346 #[error("ResponseCode {0:?}")]
347 Rc(ResponseCode),
348 /// Keymint error code
349 #[error("ErrorCode {0:?}")]
350 Km(ErrorCode),
351 /// Exception
352 #[error("Binder exception {0:?}")]
353 Binder(ExceptionCode),
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000354 /// This is returned if the C implementation of extractSubjectFromCertificate failed.
355 #[error("Failed to validate certificate chain.")]
356 ValidateCertChainFailed,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +0000357 /// Error code to indicate error in ASN.1 DER-encoded data creation.
358 #[error("Failed to create and encode ASN.1 data.")]
359 DerEncodeFailed,
Rajesh Nyamagoud28abde62023-04-01 01:32:32 +0000360 /// Error code to indicate error while using keystore-engine API.
361 #[error("Failed to perform crypto op using keystore-engine APIs.")]
362 Keystore2EngineOpFailed,
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +0000363 /// Error code to indicate error in attestation-id validation.
364 #[error("Failed to validate attestation-id.")]
365 ValidateAttestIdFailed,
366 /// Error code to indicate error in getting value from attest record.
367 #[error("Failed to get value from attest record.")]
368 AttestRecordGetValueFailed,
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000369}
370
371/// Keystore2 error mapping.
372pub fn map_ks_error<T>(r: BinderResult<T>) -> Result<T, Error> {
373 r.map_err(|s| {
374 match s.exception_code() {
375 ExceptionCode::SERVICE_SPECIFIC => {
376 match s.service_specific_error() {
377 se if se < 0 => {
378 // Negative service specific errors are KM error codes.
379 Error::Km(ErrorCode(se))
380 }
381 se => {
382 // Positive service specific errors are KS response codes.
383 Error::Rc(ResponseCode(se))
384 }
385 }
386 }
387 // We create `Error::Binder` to preserve the exception code
388 // for logging.
389 e_code => Error::Binder(e_code),
390 }
391 })
392}
393
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +0000394/// Indicate whether the default device is KeyMint (rather than Keymaster).
395pub fn has_default_keymint() -> bool {
396 binder::is_declared("android.hardware.security.keymint.IKeyMintDevice/default")
397 .expect("Could not check for declared keymint interface")
398}
399
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000400/// Verify that given key param is listed in given authorizations list.
401pub fn check_key_param(authorizations: &[Authorization], key_param: &KeyParameter) -> bool {
402 authorizations.iter().any(|auth| &auth.keyParameter == key_param)
403}
404
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000405/// Verify the given key authorizations with the expected authorizations.
406pub fn check_key_authorizations(
407 authorizations: &[Authorization],
408 expected_params: &[KeyParameter],
409 expected_key_origin: KeyOrigin,
410) {
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000411 // Make sure key authorizations contains only `ALLOWED_TAGS_IN_KEY_AUTHS`
412 authorizations.iter().all(|auth| {
413 assert!(
414 ALLOWED_TAGS_IN_KEY_AUTHS.contains(&auth.keyParameter.tag),
415 "key authorization is not allowed: {:#?}",
416 auth.keyParameter
417 );
418 true
419 });
420
421 //Check allowed-expected-key-parameters are present in given key authorizations list.
422 expected_params.iter().all(|key_param| {
Rajesh Nyamagoud17a92612023-10-17 16:15:05 +0000423 // `INCLUDE_UNIQUE_ID` is not strictly expected to be in key authorizations but has been
424 // put there by some implementations so cope with that.
425 if key_param.tag == Tag::INCLUDE_UNIQUE_ID
426 && !authorizations.iter().any(|auth| auth.keyParameter.tag == key_param.tag)
427 {
428 return true;
429 }
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000430 if ALLOWED_TAGS_IN_KEY_AUTHS.contains(&key_param.tag) {
431 assert!(
432 check_key_param(authorizations, key_param),
433 "Key parameter not found: {:#?}",
434 key_param
435 );
436 }
437 true
438 });
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000439
440 check_common_auths(authorizations, expected_key_origin);
441}
442
443/// Verify common key authorizations.
444fn check_common_auths(authorizations: &[Authorization], expected_key_origin: KeyOrigin) {
445 assert!(check_key_param(
446 authorizations,
447 &KeyParameter {
448 tag: Tag::OS_VERSION,
449 value: KeyParameterValue::Integer(get_os_version().try_into().unwrap())
450 }
451 ));
452 assert!(check_key_param(
453 authorizations,
454 &KeyParameter {
455 tag: Tag::OS_PATCHLEVEL,
456 value: KeyParameterValue::Integer(get_os_patchlevel().try_into().unwrap())
457 }
458 ));
459
460 // Access denied for finding vendor-patch-level ("ro.vendor.build.security_patch") property
461 // in a test running with `untrusted_app` context. Keeping this check to verify
462 // vendor-patch-level in tests running with `su` context.
463 if getuid().is_root() {
464 assert!(check_key_param(
465 authorizations,
466 &KeyParameter {
467 tag: Tag::VENDOR_PATCHLEVEL,
468 value: KeyParameterValue::Integer(get_vendor_patchlevel().try_into().unwrap())
469 }
470 ));
471 }
472 assert!(check_key_param(
473 authorizations,
474 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(expected_key_origin) }
475 ));
476 assert!(check_key_param(
477 authorizations,
478 &KeyParameter {
479 tag: Tag::USER_ID,
480 value: KeyParameterValue::Integer(
481 rustutils::users::multiuser_get_user_id(ThreadState::get_calling_uid())
482 .try_into()
483 .unwrap()
484 )
485 }
486 ));
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +0000487
488 if has_default_keymint() {
489 assert!(authorizations
490 .iter()
491 .map(|auth| &auth.keyParameter)
492 .any(|key_param| key_param.tag == Tag::CREATION_DATETIME));
493 }
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000494}
495
Rajesh Nyamagoudf436a932023-05-12 01:16:07 +0000496/// Get the key `Authorization` for the given auth `Tag`.
497pub fn get_key_auth(authorizations: &[Authorization], tag: Tag) -> Option<&Authorization> {
498 let auths: Vec<&Authorization> =
499 authorizations.iter().filter(|auth| auth.keyParameter.tag == tag).collect();
500
501 if !auths.is_empty() {
502 Some(auths[0])
503 } else {
504 None
505 }
506}
507
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000508/// Generate EC Key using given security level and domain with below key parameters and
509/// optionally allow the generated key to be attested with factory provisioned attest key using
510/// given challenge and application id -
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000511/// Purposes: SIGN and VERIFY
512/// Digest: SHA_2_256
513/// Curve: P_256
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000514pub fn generate_ec_p256_signing_key(
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000515 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000516 domain: Domain,
517 nspace: i64,
518 alias: Option<String>,
519 att_challenge: Option<&[u8]>,
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000520) -> binder::Result<KeyMetadata> {
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000521 let mut key_attest = false;
522 let mut gen_params = AuthSetBuilder::new()
Rajesh Nyamagoudc7d064d2022-08-20 01:45:17 +0000523 .no_auth_required()
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000524 .algorithm(Algorithm::EC)
525 .purpose(KeyPurpose::SIGN)
526 .purpose(KeyPurpose::VERIFY)
527 .digest(Digest::SHA_2_256)
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000528 .ec_curve(EcCurve::P_256);
529
530 if let Some(challenge) = att_challenge {
531 key_attest = true;
532 gen_params = gen_params.clone().attestation_challenge(challenge.to_vec());
533 }
534
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000535 match sec_level.generateKey(
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000536 &KeyDescriptor { domain, nspace, alias, blob: None },
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000537 None,
538 &gen_params,
539 0,
540 b"entropy",
541 ) {
542 Ok(key_metadata) => {
543 assert!(key_metadata.certificate.is_some());
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000544 if key_attest {
545 assert!(key_metadata.certificateChain.is_some());
546 }
547 if domain == Domain::BLOB {
548 assert!(key_metadata.key.blob.is_some());
549 }
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000550
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000551 check_key_authorizations(
552 &key_metadata.authorizations,
553 &gen_params,
554 KeyOrigin::GENERATED,
555 );
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000556 Ok(key_metadata)
557 }
558 Err(e) => Err(e),
559 }
560}
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000561
562/// Generate EC signing key.
Rajesh Nyamagoudc7d064d2022-08-20 01:45:17 +0000563pub fn generate_ec_key(
564 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000565 domain: Domain,
566 nspace: i64,
567 alias: Option<String>,
568 ec_curve: EcCurve,
569 digest: Digest,
570) -> binder::Result<KeyMetadata> {
571 let gen_params = AuthSetBuilder::new()
572 .no_auth_required()
573 .algorithm(Algorithm::EC)
574 .purpose(KeyPurpose::SIGN)
575 .purpose(KeyPurpose::VERIFY)
576 .digest(digest)
577 .ec_curve(ec_curve);
578
579 let key_metadata = sec_level.generateKey(
580 &KeyDescriptor { domain, nspace, alias, blob: None },
581 None,
582 &gen_params,
583 0,
584 b"entropy",
585 )?;
586
587 // Must have a public key.
588 assert!(key_metadata.certificate.is_some());
589
590 // Should not have an attestation record.
591 assert!(key_metadata.certificateChain.is_none());
592
593 if domain == Domain::BLOB {
594 assert!(key_metadata.key.blob.is_some());
595 } else {
596 assert!(key_metadata.key.blob.is_none());
597 }
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000598 check_key_authorizations(&key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000599 Ok(key_metadata)
600}
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000601
602/// Generate a RSA key with the given key parameters, alias, domain and namespace.
603pub fn generate_rsa_key(
604 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
605 domain: Domain,
606 nspace: i64,
607 alias: Option<String>,
608 key_params: &KeyParams,
609 attest_key: Option<&KeyDescriptor>,
610) -> binder::Result<KeyMetadata> {
611 let mut gen_params = AuthSetBuilder::new()
612 .no_auth_required()
613 .algorithm(Algorithm::RSA)
614 .rsa_public_exponent(65537)
615 .key_size(key_params.key_size);
616
617 for purpose in &key_params.purpose {
618 gen_params = gen_params.purpose(*purpose);
619 }
620 if let Some(value) = key_params.digest {
621 gen_params = gen_params.digest(value)
622 }
623 if let Some(value) = key_params.padding {
624 gen_params = gen_params.padding_mode(value);
625 }
626 if let Some(value) = key_params.mgf_digest {
627 gen_params = gen_params.mgf_digest(value);
628 }
629 if let Some(value) = key_params.block_mode {
630 gen_params = gen_params.block_mode(value)
631 }
632 if let Some(value) = &key_params.att_challenge {
633 gen_params = gen_params.attestation_challenge(value.to_vec())
634 }
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000635
636 let key_metadata = sec_level.generateKey(
637 &KeyDescriptor { domain, nspace, alias, blob: None },
638 attest_key,
639 &gen_params,
640 0,
641 b"entropy",
642 )?;
643
644 // Must have a public key.
645 assert!(key_metadata.certificate.is_some());
646
David Drysdale38f2ca32023-01-10 13:10:51 +0000647 if attest_key.is_none() && key_params.att_challenge.is_some() {
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000648 // Should have an attestation record.
649 assert!(key_metadata.certificateChain.is_some());
650 } else {
651 // Should not have an attestation record.
652 assert!(key_metadata.certificateChain.is_none());
653 }
654
655 assert!(
656 (domain == Domain::BLOB && key_metadata.key.blob.is_some())
657 || key_metadata.key.blob.is_none()
658 );
659
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000660 check_key_authorizations(&key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000661 // If `RSA_OAEP_MGF_DIGEST` tag is not mentioned explicitly while generating/importing a key,
662 // then make sure `RSA_OAEP_MGF_DIGEST` tag with default value (SHA1) must not be included in
663 // key authorization list.
664 if key_params.mgf_digest.is_none() {
665 assert!(!check_key_param(
666 &key_metadata.authorizations,
667 &KeyParameter {
668 tag: Tag::RSA_OAEP_MGF_DIGEST,
669 value: KeyParameterValue::Digest(Digest::SHA1)
670 }
671 ));
672 }
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000673 Ok(key_metadata)
674}
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000675
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000676/// Generate AES/3DES key.
677pub fn generate_sym_key(
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000678 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000679 algorithm: Algorithm,
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000680 size: i32,
681 alias: &str,
682 padding_mode: &PaddingMode,
683 block_mode: &BlockMode,
684 min_mac_len: Option<i32>,
685) -> binder::Result<KeyMetadata> {
686 let mut gen_params = AuthSetBuilder::new()
687 .no_auth_required()
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000688 .algorithm(algorithm)
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000689 .purpose(KeyPurpose::ENCRYPT)
690 .purpose(KeyPurpose::DECRYPT)
691 .key_size(size)
692 .padding_mode(*padding_mode)
693 .block_mode(*block_mode);
694
695 if let Some(val) = min_mac_len {
696 gen_params = gen_params.min_mac_length(val);
697 }
698
699 let key_metadata = sec_level.generateKey(
700 &KeyDescriptor {
701 domain: Domain::APP,
702 nspace: -1,
703 alias: Some(alias.to_string()),
704 blob: None,
705 },
706 None,
707 &gen_params,
708 0,
709 b"entropy",
710 )?;
711
712 // Should not have public certificate.
713 assert!(key_metadata.certificate.is_none());
714
715 // Should not have an attestation record.
716 assert!(key_metadata.certificateChain.is_none());
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000717 check_key_authorizations(&key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000718 Ok(key_metadata)
719}
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000720
721/// Generate HMAC key.
722pub fn generate_hmac_key(
723 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
724 alias: &str,
725 key_size: i32,
726 min_mac_len: i32,
727 digest: Digest,
728) -> binder::Result<KeyMetadata> {
729 let gen_params = AuthSetBuilder::new()
730 .no_auth_required()
731 .algorithm(Algorithm::HMAC)
732 .purpose(KeyPurpose::SIGN)
733 .purpose(KeyPurpose::VERIFY)
734 .key_size(key_size)
735 .min_mac_length(min_mac_len)
736 .digest(digest);
737
738 let key_metadata = sec_level.generateKey(
739 &KeyDescriptor {
740 domain: Domain::APP,
741 nspace: -1,
742 alias: Some(alias.to_string()),
743 blob: None,
744 },
745 None,
746 &gen_params,
747 0,
748 b"entropy",
749 )?;
750
751 // Should not have public certificate.
752 assert!(key_metadata.certificate.is_none());
753
754 // Should not have an attestation record.
755 assert!(key_metadata.certificateChain.is_none());
756
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000757 check_key_authorizations(&key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000758 Ok(key_metadata)
759}
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000760
761/// Generate RSA or EC attestation keys using below parameters -
762/// Purpose: ATTEST_KEY
763/// Digest: Digest::SHA_2_256
764/// Padding: PaddingMode::RSA_PKCS1_1_5_SIGN
765/// RSA-Key-Size: 2048
766/// EC-Curve: EcCurve::P_256
767pub fn generate_attestation_key(
768 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
769 algorithm: Algorithm,
770 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000771) -> binder::Result<KeyMetadata> {
772 assert!(algorithm == Algorithm::RSA || algorithm == Algorithm::EC);
773
774 if algorithm == Algorithm::RSA {
775 let alias = "ks_rsa_attest_test_key";
776 let metadata = generate_rsa_key(
777 sec_level,
778 Domain::APP,
779 -1,
780 Some(alias.to_string()),
781 &KeyParams {
782 key_size: 2048,
783 purpose: vec![KeyPurpose::ATTEST_KEY],
784 padding: Some(PaddingMode::RSA_PKCS1_1_5_SIGN),
785 digest: Some(Digest::SHA_2_256),
786 mgf_digest: None,
787 block_mode: None,
788 att_challenge: Some(att_challenge.to_vec()),
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000789 },
790 None,
791 )
792 .unwrap();
793 Ok(metadata)
794 } else {
795 let metadata = generate_ec_attestation_key(
796 sec_level,
797 att_challenge,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000798 Digest::SHA_2_256,
799 EcCurve::P_256,
800 )
801 .unwrap();
802
803 Ok(metadata)
804 }
805}
806
807/// Generate EC attestation key with the given
808/// curve, attestation-challenge and attestation-app-id.
809pub fn generate_ec_attestation_key(
810 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
811 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000812 digest: Digest,
813 ec_curve: EcCurve,
814) -> binder::Result<KeyMetadata> {
815 let alias = "ks_attest_ec_test_key";
816 let gen_params = AuthSetBuilder::new()
817 .no_auth_required()
818 .algorithm(Algorithm::EC)
819 .purpose(KeyPurpose::ATTEST_KEY)
820 .ec_curve(ec_curve)
821 .digest(digest)
David Drysdale38f2ca32023-01-10 13:10:51 +0000822 .attestation_challenge(att_challenge.to_vec());
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000823
824 let attestation_key_metadata = sec_level.generateKey(
825 &KeyDescriptor {
826 domain: Domain::APP,
827 nspace: -1,
828 alias: Some(alias.to_string()),
829 blob: None,
830 },
831 None,
832 &gen_params,
833 0,
834 b"entropy",
835 )?;
836
837 // Should have public certificate.
838 assert!(attestation_key_metadata.certificate.is_some());
839 // Should have an attestation record.
840 assert!(attestation_key_metadata.certificateChain.is_some());
841
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000842 check_key_authorizations(
843 &attestation_key_metadata.authorizations,
844 &gen_params,
845 KeyOrigin::GENERATED,
846 );
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000847 Ok(attestation_key_metadata)
848}
849
850/// Generate EC-P-256 key and attest it with given attestation key.
851pub fn generate_ec_256_attested_key(
852 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
853 alias: Option<String>,
854 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000855 attest_key: &KeyDescriptor,
856) -> binder::Result<KeyMetadata> {
857 let ec_gen_params = AuthSetBuilder::new()
858 .no_auth_required()
859 .algorithm(Algorithm::EC)
860 .purpose(KeyPurpose::SIGN)
861 .purpose(KeyPurpose::VERIFY)
862 .digest(Digest::SHA_2_256)
863 .ec_curve(EcCurve::P_256)
David Drysdale38f2ca32023-01-10 13:10:51 +0000864 .attestation_challenge(att_challenge.to_vec());
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000865
866 let ec_key_metadata = sec_level
867 .generateKey(
868 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: None },
869 Some(attest_key),
870 &ec_gen_params,
871 0,
872 b"entropy",
873 )
874 .unwrap();
875
876 // Should have public certificate.
877 assert!(ec_key_metadata.certificate.is_some());
878 // Shouldn't have an attestation record.
879 assert!(ec_key_metadata.certificateChain.is_none());
880
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000881 check_key_authorizations(&ec_key_metadata.authorizations, &ec_gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000882 Ok(ec_key_metadata)
883}
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000884
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000885/// Imports above defined RSA key - `RSA_2048_KEY` and validates imported key parameters.
886pub fn import_rsa_2048_key(
887 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
888 domain: Domain,
889 nspace: i64,
890 alias: Option<String>,
891 import_params: AuthSetBuilder,
892) -> binder::Result<KeyMetadata> {
893 let key_metadata = sec_level
894 .importKey(
895 &KeyDescriptor { domain, nspace, alias, blob: None },
896 None,
897 &import_params,
898 0,
899 RSA_2048_KEY,
900 )
901 .unwrap();
902
903 assert!(key_metadata.certificate.is_some());
904 assert!(key_metadata.certificateChain.is_none());
905
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000906 check_key_authorizations(&key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000907
908 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000909 assert!(check_key_param(
910 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000911 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::RSA) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000912 ));
913
914 assert!(check_key_param(
915 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000916 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(2048) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000917 ));
918
919 assert!(check_key_param(
920 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000921 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000922 ));
923
924 assert!(check_key_param(
925 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000926 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000927 tag: Tag::RSA_PUBLIC_EXPONENT,
928 value: KeyParameterValue::LongInteger(65537)
929 }
930 ));
931
932 assert!(check_key_param(
933 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000934 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000935 tag: Tag::PADDING,
936 value: KeyParameterValue::PaddingMode(PaddingMode::RSA_PSS)
937 }
938 ));
939
940 assert!(check_key_param(
941 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000942 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000943 ));
944
945 Ok(key_metadata)
946}
947
948/// Imports above defined EC key - `EC_P_256_KEY` and validates imported key parameters.
949pub fn import_ec_p_256_key(
950 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
951 domain: Domain,
952 nspace: i64,
953 alias: Option<String>,
954 import_params: AuthSetBuilder,
955) -> binder::Result<KeyMetadata> {
956 let key_metadata = sec_level
957 .importKey(
958 &KeyDescriptor { domain, nspace, alias, blob: None },
959 None,
960 &import_params,
961 0,
962 EC_P_256_KEY,
963 )
964 .unwrap();
965
966 assert!(key_metadata.certificate.is_some());
967 assert!(key_metadata.certificateChain.is_none());
968
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000969 check_key_authorizations(&key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000970
971 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000972 assert!(check_key_param(
973 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000974 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::EC) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000975 ));
976
977 assert!(check_key_param(
978 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000979 &KeyParameter { tag: Tag::EC_CURVE, value: KeyParameterValue::EcCurve(EcCurve::P_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000980 ));
981
982 assert!(check_key_param(
983 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000984 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000985 ));
986 assert!(check_key_param(
987 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000988 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000989 ));
990
991 Ok(key_metadata)
992}
993
994/// Import sample AES key and validate its key parameters.
995pub fn import_aes_key(
996 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
997 domain: Domain,
998 nspace: i64,
999 alias: Option<String>,
1000) -> binder::Result<KeyMetadata> {
1001 static AES_KEY: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
1002 let key_size = AES_KEY.len() * 8;
1003
1004 let import_params = AuthSetBuilder::new()
1005 .no_auth_required()
1006 .algorithm(Algorithm::AES)
1007 .block_mode(BlockMode::ECB)
1008 .key_size(key_size.try_into().unwrap())
1009 .purpose(KeyPurpose::ENCRYPT)
1010 .purpose(KeyPurpose::DECRYPT)
1011 .padding_mode(PaddingMode::PKCS7);
1012
1013 let key_metadata = sec_level.importKey(
1014 &KeyDescriptor { domain, nspace, alias, blob: None },
1015 None,
1016 &import_params,
1017 0,
1018 AES_KEY,
1019 )?;
1020
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001021 check_key_authorizations(&key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001022
1023 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001024 assert!(check_key_param(
1025 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001026 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::AES) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001027 ));
1028 assert!(check_key_param(
1029 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001030 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(128) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001031 ));
1032 assert!(check_key_param(
1033 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001034 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001035 tag: Tag::PADDING,
1036 value: KeyParameterValue::PaddingMode(PaddingMode::PKCS7)
1037 }
1038 ));
1039 assert!(check_key_param(
1040 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001041 &KeyParameter { tag: Tag::BLOCK_MODE, value: KeyParameterValue::BlockMode(BlockMode::ECB) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001042 ));
1043 assert!(check_key_param(
1044 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001045 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001046 ));
1047
1048 Ok(key_metadata)
1049}
1050
1051/// Import sample 3DES key and validate its key parameters.
1052pub fn import_3des_key(
1053 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1054 domain: Domain,
1055 nspace: i64,
1056 alias: Option<String>,
1057) -> binder::Result<KeyMetadata> {
1058 static TRIPLE_DES_KEY: &[u8] = &[
1059 0xa4, 0x9d, 0x75, 0x64, 0x19, 0x9e, 0x97, 0xcb, 0x52, 0x9d, 0x2c, 0x9d, 0x97, 0xbf, 0x2f,
1060 0x98, 0xd3, 0x5e, 0xdf, 0x57, 0xba, 0x1f, 0x73, 0x58,
1061 ];
1062
1063 let import_params = AuthSetBuilder::new()
1064 .no_auth_required()
1065 .algorithm(Algorithm::TRIPLE_DES)
1066 .block_mode(BlockMode::ECB)
1067 .key_size(168)
1068 .purpose(KeyPurpose::ENCRYPT)
1069 .purpose(KeyPurpose::DECRYPT)
1070 .padding_mode(PaddingMode::PKCS7);
1071
1072 let key_metadata = sec_level.importKey(
1073 &KeyDescriptor { domain, nspace, alias, blob: None },
1074 None,
1075 &import_params,
1076 0,
1077 TRIPLE_DES_KEY,
1078 )?;
1079
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001080 check_key_authorizations(&key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001081
1082 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001083 assert!(check_key_param(
1084 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001085 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001086 tag: Tag::ALGORITHM,
1087 value: KeyParameterValue::Algorithm(Algorithm::TRIPLE_DES)
1088 }
1089 ));
1090 assert!(check_key_param(
1091 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001092 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(168) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001093 ));
1094 assert!(check_key_param(
1095 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001096 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001097 tag: Tag::PADDING,
1098 value: KeyParameterValue::PaddingMode(PaddingMode::PKCS7)
1099 }
1100 ));
1101 assert!(check_key_param(
1102 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001103 &KeyParameter { tag: Tag::BLOCK_MODE, value: KeyParameterValue::BlockMode(BlockMode::ECB) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001104 ));
1105 assert!(check_key_param(
1106 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001107 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001108 ));
1109
1110 Ok(key_metadata)
1111}
1112
1113/// Import sample HMAC key and validate its key parameters.
1114pub fn import_hmac_key(
1115 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1116 domain: Domain,
1117 nspace: i64,
1118 alias: Option<String>,
1119) -> binder::Result<KeyMetadata> {
1120 static HMAC_KEY: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
1121 let key_size = HMAC_KEY.len() * 8;
1122
1123 let import_params = AuthSetBuilder::new()
1124 .no_auth_required()
1125 .algorithm(Algorithm::HMAC)
1126 .key_size(key_size.try_into().unwrap())
1127 .purpose(KeyPurpose::SIGN)
1128 .purpose(KeyPurpose::VERIFY)
1129 .digest(Digest::SHA_2_256)
1130 .min_mac_length(256);
1131
1132 let key_metadata = sec_level.importKey(
1133 &KeyDescriptor { domain, nspace, alias, blob: None },
1134 None,
1135 &import_params,
1136 0,
1137 HMAC_KEY,
1138 )?;
1139
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001140 check_key_authorizations(&key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001141
1142 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001143 assert!(check_key_param(
1144 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001145 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::HMAC) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001146 ));
1147 assert!(check_key_param(
1148 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001149 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(128) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001150 ));
1151 assert!(check_key_param(
1152 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001153 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001154 ));
1155 assert!(check_key_param(
1156 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001157 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001158 ));
1159
1160 Ok(key_metadata)
1161}
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001162
1163/// Imports RSA encryption key with WRAP_KEY purpose.
1164pub fn import_wrapping_key(
1165 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1166 wrapping_key_data: &[u8],
1167 wrapping_key_alias: Option<String>,
1168) -> binder::Result<KeyMetadata> {
1169 let wrapping_key_params = AuthSetBuilder::new()
1170 .no_auth_required()
1171 .algorithm(Algorithm::RSA)
1172 .digest(Digest::SHA_2_256)
1173 .purpose(KeyPurpose::ENCRYPT)
1174 .purpose(KeyPurpose::DECRYPT)
1175 .purpose(KeyPurpose::WRAP_KEY)
1176 .padding_mode(PaddingMode::RSA_OAEP)
1177 .key_size(2048)
1178 .rsa_public_exponent(65537)
1179 .cert_not_before(0)
1180 .cert_not_after(253402300799000);
1181
1182 sec_level.importKey(
1183 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias: wrapping_key_alias, blob: None },
1184 None,
1185 &wrapping_key_params,
1186 0,
1187 wrapping_key_data,
1188 )
1189}
1190
1191/// Import wrapped key using given wrapping key.
1192pub fn import_wrapped_key(
1193 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1194 alias: Option<String>,
1195 wrapping_key_metadata: &KeyMetadata,
1196 wrapped_key: Option<Vec<u8>>,
1197) -> binder::Result<KeyMetadata> {
1198 let unwrap_params =
1199 AuthSetBuilder::new().digest(Digest::SHA_2_256).padding_mode(PaddingMode::RSA_OAEP);
1200
1201 let authenticator_spec: &[AuthenticatorSpec] = &[AuthenticatorSpec {
1202 authenticatorType: HardwareAuthenticatorType::NONE,
1203 authenticatorId: 0,
1204 }];
1205
1206 let key_metadata = sec_level.importWrappedKey(
1207 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: wrapped_key },
1208 &wrapping_key_metadata.key,
1209 None,
1210 &unwrap_params,
1211 authenticator_spec,
1212 )?;
1213
1214 Ok(key_metadata)
1215}
1216
1217/// Import wrapping key and then import wrapped key using wrapping key.
1218pub fn import_wrapping_key_and_wrapped_key(
1219 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1220 domain: Domain,
1221 nspace: i64,
1222 alias: Option<String>,
1223 wrapping_key_alias: Option<String>,
1224 wrapping_key_params: AuthSetBuilder,
1225) -> binder::Result<KeyMetadata> {
1226 let wrapping_key_metadata = sec_level.importKey(
1227 &KeyDescriptor { domain, nspace, alias: wrapping_key_alias, blob: None },
1228 None,
1229 &wrapping_key_params,
1230 0,
1231 WRAPPING_KEY,
1232 )?;
1233
1234 import_wrapped_key(sec_level, alias, &wrapping_key_metadata, Some(WRAPPED_KEY.to_vec()))
1235}
1236
1237/// Import given key material as AES-256-GCM-NONE transport key.
1238pub fn import_transport_key(
1239 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1240 transport_key_alias: Option<String>,
1241 transport_key: &[u8],
1242) -> binder::Result<KeyMetadata> {
1243 let transport_key_params = AuthSetBuilder::new()
1244 .no_auth_required()
1245 .algorithm(Algorithm::AES)
1246 .block_mode(BlockMode::GCM)
1247 .padding_mode(PaddingMode::NONE)
1248 .key_size(256)
1249 .caller_nonce()
1250 .min_mac_length(128)
1251 .purpose(KeyPurpose::ENCRYPT)
1252 .purpose(KeyPurpose::DECRYPT);
1253
1254 sec_level.importKey(
1255 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias: transport_key_alias, blob: None },
1256 None,
1257 &transport_key_params,
1258 0,
1259 transport_key,
1260 )
1261}
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001262
1263/// Generate EC key with purpose AGREE_KEY.
1264pub fn generate_ec_agree_key(
1265 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1266 ec_curve: EcCurve,
1267 digest: Digest,
1268 domain: Domain,
1269 nspace: i64,
1270 alias: Option<String>,
1271) -> binder::Result<KeyMetadata> {
1272 let gen_params = AuthSetBuilder::new()
1273 .no_auth_required()
1274 .algorithm(Algorithm::EC)
1275 .purpose(KeyPurpose::AGREE_KEY)
1276 .digest(digest)
1277 .ec_curve(ec_curve);
1278
1279 match sec_level.generateKey(
1280 &KeyDescriptor { domain, nspace, alias, blob: None },
1281 None,
1282 &gen_params,
1283 0,
1284 b"entropy",
1285 ) {
1286 Ok(key_metadata) => {
1287 assert!(key_metadata.certificate.is_some());
1288 if domain == Domain::BLOB {
1289 assert!(key_metadata.key.blob.is_some());
1290 }
1291
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001292 check_key_authorizations(
1293 &key_metadata.authorizations,
1294 &gen_params,
1295 KeyOrigin::GENERATED,
1296 );
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001297 Ok(key_metadata)
1298 }
1299 Err(e) => Err(e),
1300 }
1301}
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001302
1303/// Helper method to import AES keys `total_count` of times.
1304pub fn import_aes_keys(
1305 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1306 alias_prefix: String,
1307 total_count: Range<i32>,
1308) -> binder::Result<HashSet<String>> {
1309 let mut imported_key_aliases = HashSet::new();
1310
1311 // Import Total number of keys with given alias prefix.
1312 for count in total_count {
1313 let mut alias = String::new();
1314 write!(alias, "{}_{}", alias_prefix, count).unwrap();
1315 imported_key_aliases.insert(alias.clone());
1316
1317 import_aes_key(sec_level, Domain::APP, -1, Some(alias))?;
1318 }
1319
1320 Ok(imported_key_aliases)
1321}
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001322
1323/// Generate attested EC-P_256 key with device id attestation.
1324pub fn generate_key_with_attest_id(
1325 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1326 algorithm: Algorithm,
1327 alias: Option<String>,
1328 att_challenge: &[u8],
1329 attest_key: &KeyDescriptor,
1330 attest_id: Tag,
1331 value: Vec<u8>,
1332) -> binder::Result<KeyMetadata> {
1333 assert!(algorithm == Algorithm::RSA || algorithm == Algorithm::EC);
1334
1335 let mut ec_gen_params;
1336 if algorithm == Algorithm::EC {
1337 ec_gen_params = AuthSetBuilder::new()
1338 .no_auth_required()
1339 .algorithm(Algorithm::EC)
1340 .purpose(KeyPurpose::SIGN)
1341 .purpose(KeyPurpose::VERIFY)
1342 .digest(Digest::SHA_2_256)
1343 .ec_curve(EcCurve::P_256)
1344 .attestation_challenge(att_challenge.to_vec());
1345 } else {
1346 ec_gen_params = AuthSetBuilder::new()
1347 .no_auth_required()
1348 .algorithm(Algorithm::RSA)
1349 .rsa_public_exponent(65537)
1350 .key_size(2048)
1351 .purpose(KeyPurpose::SIGN)
1352 .purpose(KeyPurpose::VERIFY)
1353 .digest(Digest::SHA_2_256)
1354 .padding_mode(PaddingMode::RSA_PKCS1_1_5_SIGN)
1355 .attestation_challenge(att_challenge.to_vec());
1356 }
1357
1358 match attest_id {
1359 Tag::ATTESTATION_ID_BRAND => {
1360 ec_gen_params = ec_gen_params.attestation_device_brand(value);
1361 }
1362 Tag::ATTESTATION_ID_DEVICE => {
1363 ec_gen_params = ec_gen_params.attestation_device_name(value);
1364 }
1365 Tag::ATTESTATION_ID_PRODUCT => {
1366 ec_gen_params = ec_gen_params.attestation_device_product_name(value);
1367 }
1368 Tag::ATTESTATION_ID_SERIAL => {
1369 ec_gen_params = ec_gen_params.attestation_device_serial(value);
1370 }
1371 Tag::ATTESTATION_ID_MANUFACTURER => {
1372 ec_gen_params = ec_gen_params.attestation_device_manufacturer(value);
1373 }
1374 Tag::ATTESTATION_ID_MODEL => {
1375 ec_gen_params = ec_gen_params.attestation_device_model(value);
1376 }
1377 Tag::ATTESTATION_ID_IMEI => {
1378 ec_gen_params = ec_gen_params.attestation_device_imei(value);
1379 }
1380 Tag::ATTESTATION_ID_SECOND_IMEI => {
1381 ec_gen_params = ec_gen_params.attestation_device_second_imei(value);
1382 }
1383 _ => {
1384 panic!("Unknown attestation id");
1385 }
1386 }
1387
1388 sec_level.generateKey(
1389 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: None },
1390 Some(attest_key),
1391 &ec_gen_params,
1392 0,
1393 b"entropy",
1394 )
1395}
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001396
1397/// Generate Key and validate key characteristics.
1398pub fn generate_key(
1399 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1400 gen_params: &AuthSetBuilder,
1401 alias: &str,
1402) -> binder::Result<KeyMetadata> {
1403 let key_metadata = sec_level.generateKey(
1404 &KeyDescriptor {
1405 domain: Domain::APP,
1406 nspace: -1,
1407 alias: Some(alias.to_string()),
1408 blob: None,
1409 },
1410 None,
1411 gen_params,
1412 0,
1413 b"entropy",
1414 )?;
1415
1416 if gen_params.iter().any(|kp| {
1417 matches!(
1418 kp.value,
1419 KeyParameterValue::Algorithm(Algorithm::RSA)
1420 | KeyParameterValue::Algorithm(Algorithm::EC)
1421 )
1422 }) {
1423 assert!(key_metadata.certificate.is_some());
1424 if gen_params.iter().any(|kp| kp.tag == Tag::ATTESTATION_CHALLENGE) {
1425 assert!(key_metadata.certificateChain.is_some());
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +00001426 let mut cert_chain: Vec<u8> = Vec::new();
1427 cert_chain.extend(key_metadata.certificate.as_ref().unwrap());
1428 cert_chain.extend(key_metadata.certificateChain.as_ref().unwrap());
1429 validate_certchain(&cert_chain).expect("Error while validating cert chain");
1430 }
1431
1432 if let Some(challenge_param) =
1433 gen_params.iter().find(|kp| kp.tag == Tag::ATTESTATION_CHALLENGE)
1434 {
1435 if let KeyParameterValue::Blob(val) = &challenge_param.value {
1436 let att_challenge = get_value_from_attest_record(
1437 key_metadata.certificate.as_ref().unwrap(),
1438 challenge_param.tag,
1439 key_metadata.keySecurityLevel,
1440 )
1441 .expect("Attestation challenge verification failed.");
1442 assert_eq!(&att_challenge, val);
1443 }
1444
1445 let att_app_id = get_value_from_attest_record(
1446 key_metadata.certificate.as_ref().unwrap(),
1447 Tag::ATTESTATION_APPLICATION_ID,
1448 SecurityLevel::KEYSTORE,
1449 )
1450 .expect("Attestation application id verification failed.");
1451 assert!(!att_app_id.is_empty());
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001452 }
1453 }
1454 check_key_authorizations(&key_metadata.authorizations, gen_params, KeyOrigin::GENERATED);
1455
1456 Ok(key_metadata)
1457}
1458
1459/// Generate a key using given authorizations and create an operation using the generated key.
1460pub fn create_key_and_operation(
1461 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1462 gen_params: &AuthSetBuilder,
1463 op_params: &AuthSetBuilder,
1464 alias: &str,
1465) -> binder::Result<CreateOperationResponse> {
1466 let key_metadata = generate_key(sec_level, gen_params, alias)?;
1467
1468 sec_level.createOperation(&key_metadata.key, op_params, false)
1469}