blob: a733be39dcd6e0b041eba1bdb2bfe5e332917b7e [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,
Rajesh Nyamagoudb1c8e832023-06-06 01:39:44 +000043 validate_certchain_with_strict_issuer_check,
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +000044};
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| {
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000413 // Ignore `INVALID` tag if the backend is Keymaster and not KeyMint.
414 // Keymaster allows INVALID tag for unsupported key parameters.
415 if !has_default_keymint() && auth.keyParameter.tag == Tag::INVALID {
416 return true;
417 }
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000418 assert!(
419 ALLOWED_TAGS_IN_KEY_AUTHS.contains(&auth.keyParameter.tag),
420 "key authorization is not allowed: {:#?}",
421 auth.keyParameter
422 );
423 true
424 });
425
426 //Check allowed-expected-key-parameters are present in given key authorizations list.
427 expected_params.iter().all(|key_param| {
Rajesh Nyamagoud17a92612023-10-17 16:15:05 +0000428 // `INCLUDE_UNIQUE_ID` is not strictly expected to be in key authorizations but has been
429 // put there by some implementations so cope with that.
430 if key_param.tag == Tag::INCLUDE_UNIQUE_ID
431 && !authorizations.iter().any(|auth| auth.keyParameter.tag == key_param.tag)
432 {
433 return true;
434 }
Rajesh Nyamagoud76209212024-02-01 04:45:41 +0000435
436 // Ignore below parameters if the backend is Keymaster and not KeyMint.
437 // Keymaster does not support these parameters. These key parameters are introduced in
438 // KeyMint1.0.
439 if !has_default_keymint() {
440 if matches!(key_param.tag, Tag::RSA_OAEP_MGF_DIGEST | Tag::USAGE_COUNT_LIMIT) {
441 return true;
442 }
443 if key_param.tag == Tag::PURPOSE
444 && key_param.value == KeyParameterValue::KeyPurpose(KeyPurpose::ATTEST_KEY)
445 {
446 return true;
447 }
448 }
449
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000450 if ALLOWED_TAGS_IN_KEY_AUTHS.contains(&key_param.tag) {
451 assert!(
452 check_key_param(authorizations, key_param),
453 "Key parameter not found: {:#?}",
454 key_param
455 );
456 }
457 true
458 });
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000459
460 check_common_auths(authorizations, expected_key_origin);
461}
462
463/// Verify common key authorizations.
464fn check_common_auths(authorizations: &[Authorization], expected_key_origin: KeyOrigin) {
465 assert!(check_key_param(
466 authorizations,
467 &KeyParameter {
468 tag: Tag::OS_VERSION,
469 value: KeyParameterValue::Integer(get_os_version().try_into().unwrap())
470 }
471 ));
472 assert!(check_key_param(
473 authorizations,
474 &KeyParameter {
475 tag: Tag::OS_PATCHLEVEL,
476 value: KeyParameterValue::Integer(get_os_patchlevel().try_into().unwrap())
477 }
478 ));
479
480 // Access denied for finding vendor-patch-level ("ro.vendor.build.security_patch") property
481 // in a test running with `untrusted_app` context. Keeping this check to verify
482 // vendor-patch-level in tests running with `su` context.
483 if getuid().is_root() {
484 assert!(check_key_param(
485 authorizations,
486 &KeyParameter {
487 tag: Tag::VENDOR_PATCHLEVEL,
488 value: KeyParameterValue::Integer(get_vendor_patchlevel().try_into().unwrap())
489 }
490 ));
491 }
492 assert!(check_key_param(
493 authorizations,
494 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(expected_key_origin) }
495 ));
496 assert!(check_key_param(
497 authorizations,
498 &KeyParameter {
499 tag: Tag::USER_ID,
500 value: KeyParameterValue::Integer(
501 rustutils::users::multiuser_get_user_id(ThreadState::get_calling_uid())
502 .try_into()
503 .unwrap()
504 )
505 }
506 ));
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +0000507
508 if has_default_keymint() {
509 assert!(authorizations
510 .iter()
511 .map(|auth| &auth.keyParameter)
512 .any(|key_param| key_param.tag == Tag::CREATION_DATETIME));
513 }
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000514}
515
Rajesh Nyamagoudf436a932023-05-12 01:16:07 +0000516/// Get the key `Authorization` for the given auth `Tag`.
517pub fn get_key_auth(authorizations: &[Authorization], tag: Tag) -> Option<&Authorization> {
518 let auths: Vec<&Authorization> =
519 authorizations.iter().filter(|auth| auth.keyParameter.tag == tag).collect();
520
521 if !auths.is_empty() {
522 Some(auths[0])
523 } else {
524 None
525 }
526}
527
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000528/// Generate EC Key using given security level and domain with below key parameters and
529/// optionally allow the generated key to be attested with factory provisioned attest key using
530/// given challenge and application id -
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000531/// Purposes: SIGN and VERIFY
532/// Digest: SHA_2_256
533/// Curve: P_256
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000534pub fn generate_ec_p256_signing_key(
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000535 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000536 domain: Domain,
537 nspace: i64,
538 alias: Option<String>,
539 att_challenge: Option<&[u8]>,
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000540) -> binder::Result<KeyMetadata> {
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000541 let mut key_attest = false;
542 let mut gen_params = AuthSetBuilder::new()
Rajesh Nyamagoudc7d064d2022-08-20 01:45:17 +0000543 .no_auth_required()
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000544 .algorithm(Algorithm::EC)
545 .purpose(KeyPurpose::SIGN)
546 .purpose(KeyPurpose::VERIFY)
547 .digest(Digest::SHA_2_256)
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000548 .ec_curve(EcCurve::P_256);
549
550 if let Some(challenge) = att_challenge {
551 key_attest = true;
552 gen_params = gen_params.clone().attestation_challenge(challenge.to_vec());
553 }
554
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000555 match sec_level.generateKey(
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000556 &KeyDescriptor { domain, nspace, alias, blob: None },
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000557 None,
558 &gen_params,
559 0,
560 b"entropy",
561 ) {
562 Ok(key_metadata) => {
563 assert!(key_metadata.certificate.is_some());
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000564 if key_attest {
565 assert!(key_metadata.certificateChain.is_some());
566 }
567 if domain == Domain::BLOB {
568 assert!(key_metadata.key.blob.is_some());
569 }
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000570
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000571 check_key_authorizations(
572 &key_metadata.authorizations,
573 &gen_params,
574 KeyOrigin::GENERATED,
575 );
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000576 Ok(key_metadata)
577 }
578 Err(e) => Err(e),
579 }
580}
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000581
582/// Generate EC signing key.
Rajesh Nyamagoudc7d064d2022-08-20 01:45:17 +0000583pub fn generate_ec_key(
584 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000585 domain: Domain,
586 nspace: i64,
587 alias: Option<String>,
588 ec_curve: EcCurve,
589 digest: Digest,
590) -> binder::Result<KeyMetadata> {
591 let gen_params = AuthSetBuilder::new()
592 .no_auth_required()
593 .algorithm(Algorithm::EC)
594 .purpose(KeyPurpose::SIGN)
595 .purpose(KeyPurpose::VERIFY)
596 .digest(digest)
597 .ec_curve(ec_curve);
598
599 let key_metadata = sec_level.generateKey(
600 &KeyDescriptor { domain, nspace, alias, blob: None },
601 None,
602 &gen_params,
603 0,
604 b"entropy",
605 )?;
606
607 // Must have a public key.
608 assert!(key_metadata.certificate.is_some());
609
610 // Should not have an attestation record.
611 assert!(key_metadata.certificateChain.is_none());
612
613 if domain == Domain::BLOB {
614 assert!(key_metadata.key.blob.is_some());
615 } else {
616 assert!(key_metadata.key.blob.is_none());
617 }
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000618 check_key_authorizations(&key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000619 Ok(key_metadata)
620}
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000621
622/// Generate a RSA key with the given key parameters, alias, domain and namespace.
623pub fn generate_rsa_key(
624 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
625 domain: Domain,
626 nspace: i64,
627 alias: Option<String>,
628 key_params: &KeyParams,
629 attest_key: Option<&KeyDescriptor>,
630) -> binder::Result<KeyMetadata> {
631 let mut gen_params = AuthSetBuilder::new()
632 .no_auth_required()
633 .algorithm(Algorithm::RSA)
634 .rsa_public_exponent(65537)
635 .key_size(key_params.key_size);
636
637 for purpose in &key_params.purpose {
638 gen_params = gen_params.purpose(*purpose);
639 }
640 if let Some(value) = key_params.digest {
641 gen_params = gen_params.digest(value)
642 }
643 if let Some(value) = key_params.padding {
644 gen_params = gen_params.padding_mode(value);
645 }
646 if let Some(value) = key_params.mgf_digest {
647 gen_params = gen_params.mgf_digest(value);
648 }
649 if let Some(value) = key_params.block_mode {
650 gen_params = gen_params.block_mode(value)
651 }
652 if let Some(value) = &key_params.att_challenge {
653 gen_params = gen_params.attestation_challenge(value.to_vec())
654 }
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000655
656 let key_metadata = sec_level.generateKey(
657 &KeyDescriptor { domain, nspace, alias, blob: None },
658 attest_key,
659 &gen_params,
660 0,
661 b"entropy",
662 )?;
663
664 // Must have a public key.
665 assert!(key_metadata.certificate.is_some());
666
David Drysdale38f2ca32023-01-10 13:10:51 +0000667 if attest_key.is_none() && key_params.att_challenge.is_some() {
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000668 // Should have an attestation record.
669 assert!(key_metadata.certificateChain.is_some());
670 } else {
671 // Should not have an attestation record.
672 assert!(key_metadata.certificateChain.is_none());
673 }
674
675 assert!(
676 (domain == Domain::BLOB && key_metadata.key.blob.is_some())
677 || key_metadata.key.blob.is_none()
678 );
679
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000680 check_key_authorizations(&key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000681 // If `RSA_OAEP_MGF_DIGEST` tag is not mentioned explicitly while generating/importing a key,
682 // then make sure `RSA_OAEP_MGF_DIGEST` tag with default value (SHA1) must not be included in
683 // key authorization list.
684 if key_params.mgf_digest.is_none() {
685 assert!(!check_key_param(
686 &key_metadata.authorizations,
687 &KeyParameter {
688 tag: Tag::RSA_OAEP_MGF_DIGEST,
689 value: KeyParameterValue::Digest(Digest::SHA1)
690 }
691 ));
692 }
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000693 Ok(key_metadata)
694}
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000695
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000696/// Generate AES/3DES key.
697pub fn generate_sym_key(
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000698 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000699 algorithm: Algorithm,
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000700 size: i32,
701 alias: &str,
702 padding_mode: &PaddingMode,
703 block_mode: &BlockMode,
704 min_mac_len: Option<i32>,
705) -> binder::Result<KeyMetadata> {
706 let mut gen_params = AuthSetBuilder::new()
707 .no_auth_required()
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000708 .algorithm(algorithm)
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000709 .purpose(KeyPurpose::ENCRYPT)
710 .purpose(KeyPurpose::DECRYPT)
711 .key_size(size)
712 .padding_mode(*padding_mode)
713 .block_mode(*block_mode);
714
715 if let Some(val) = min_mac_len {
716 gen_params = gen_params.min_mac_length(val);
717 }
718
719 let key_metadata = sec_level.generateKey(
720 &KeyDescriptor {
721 domain: Domain::APP,
722 nspace: -1,
723 alias: Some(alias.to_string()),
724 blob: None,
725 },
726 None,
727 &gen_params,
728 0,
729 b"entropy",
730 )?;
731
732 // Should not have public certificate.
733 assert!(key_metadata.certificate.is_none());
734
735 // Should not have an attestation record.
736 assert!(key_metadata.certificateChain.is_none());
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000737 check_key_authorizations(&key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000738 Ok(key_metadata)
739}
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000740
741/// Generate HMAC key.
742pub fn generate_hmac_key(
743 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
744 alias: &str,
745 key_size: i32,
746 min_mac_len: i32,
747 digest: Digest,
748) -> binder::Result<KeyMetadata> {
749 let gen_params = AuthSetBuilder::new()
750 .no_auth_required()
751 .algorithm(Algorithm::HMAC)
752 .purpose(KeyPurpose::SIGN)
753 .purpose(KeyPurpose::VERIFY)
754 .key_size(key_size)
755 .min_mac_length(min_mac_len)
756 .digest(digest);
757
758 let key_metadata = sec_level.generateKey(
759 &KeyDescriptor {
760 domain: Domain::APP,
761 nspace: -1,
762 alias: Some(alias.to_string()),
763 blob: None,
764 },
765 None,
766 &gen_params,
767 0,
768 b"entropy",
769 )?;
770
771 // Should not have public certificate.
772 assert!(key_metadata.certificate.is_none());
773
774 // Should not have an attestation record.
775 assert!(key_metadata.certificateChain.is_none());
776
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000777 check_key_authorizations(&key_metadata.authorizations, &gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000778 Ok(key_metadata)
779}
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000780
781/// Generate RSA or EC attestation keys using below parameters -
782/// Purpose: ATTEST_KEY
783/// Digest: Digest::SHA_2_256
784/// Padding: PaddingMode::RSA_PKCS1_1_5_SIGN
785/// RSA-Key-Size: 2048
786/// EC-Curve: EcCurve::P_256
787pub fn generate_attestation_key(
788 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
789 algorithm: Algorithm,
790 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000791) -> binder::Result<KeyMetadata> {
792 assert!(algorithm == Algorithm::RSA || algorithm == Algorithm::EC);
793
794 if algorithm == Algorithm::RSA {
795 let alias = "ks_rsa_attest_test_key";
796 let metadata = generate_rsa_key(
797 sec_level,
798 Domain::APP,
799 -1,
800 Some(alias.to_string()),
801 &KeyParams {
802 key_size: 2048,
803 purpose: vec![KeyPurpose::ATTEST_KEY],
804 padding: Some(PaddingMode::RSA_PKCS1_1_5_SIGN),
805 digest: Some(Digest::SHA_2_256),
806 mgf_digest: None,
807 block_mode: None,
808 att_challenge: Some(att_challenge.to_vec()),
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000809 },
810 None,
811 )
812 .unwrap();
813 Ok(metadata)
814 } else {
815 let metadata = generate_ec_attestation_key(
816 sec_level,
817 att_challenge,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000818 Digest::SHA_2_256,
819 EcCurve::P_256,
820 )
821 .unwrap();
822
823 Ok(metadata)
824 }
825}
826
827/// Generate EC attestation key with the given
828/// curve, attestation-challenge and attestation-app-id.
829pub fn generate_ec_attestation_key(
830 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
831 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000832 digest: Digest,
833 ec_curve: EcCurve,
834) -> binder::Result<KeyMetadata> {
835 let alias = "ks_attest_ec_test_key";
836 let gen_params = AuthSetBuilder::new()
837 .no_auth_required()
838 .algorithm(Algorithm::EC)
839 .purpose(KeyPurpose::ATTEST_KEY)
840 .ec_curve(ec_curve)
841 .digest(digest)
David Drysdale38f2ca32023-01-10 13:10:51 +0000842 .attestation_challenge(att_challenge.to_vec());
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000843
844 let attestation_key_metadata = sec_level.generateKey(
845 &KeyDescriptor {
846 domain: Domain::APP,
847 nspace: -1,
848 alias: Some(alias.to_string()),
849 blob: None,
850 },
851 None,
852 &gen_params,
853 0,
854 b"entropy",
855 )?;
856
857 // Should have public certificate.
858 assert!(attestation_key_metadata.certificate.is_some());
859 // Should have an attestation record.
860 assert!(attestation_key_metadata.certificateChain.is_some());
861
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000862 check_key_authorizations(
863 &attestation_key_metadata.authorizations,
864 &gen_params,
865 KeyOrigin::GENERATED,
866 );
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000867 Ok(attestation_key_metadata)
868}
869
870/// Generate EC-P-256 key and attest it with given attestation key.
871pub fn generate_ec_256_attested_key(
872 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
873 alias: Option<String>,
874 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000875 attest_key: &KeyDescriptor,
876) -> binder::Result<KeyMetadata> {
877 let ec_gen_params = AuthSetBuilder::new()
878 .no_auth_required()
879 .algorithm(Algorithm::EC)
880 .purpose(KeyPurpose::SIGN)
881 .purpose(KeyPurpose::VERIFY)
882 .digest(Digest::SHA_2_256)
883 .ec_curve(EcCurve::P_256)
David Drysdale38f2ca32023-01-10 13:10:51 +0000884 .attestation_challenge(att_challenge.to_vec());
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000885
886 let ec_key_metadata = sec_level
887 .generateKey(
888 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: None },
889 Some(attest_key),
890 &ec_gen_params,
891 0,
892 b"entropy",
893 )
894 .unwrap();
895
896 // Should have public certificate.
897 assert!(ec_key_metadata.certificate.is_some());
898 // Shouldn't have an attestation record.
899 assert!(ec_key_metadata.certificateChain.is_none());
900
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000901 check_key_authorizations(&ec_key_metadata.authorizations, &ec_gen_params, KeyOrigin::GENERATED);
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000902 Ok(ec_key_metadata)
903}
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000904
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000905/// Imports above defined RSA key - `RSA_2048_KEY` and validates imported key parameters.
906pub fn import_rsa_2048_key(
907 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
908 domain: Domain,
909 nspace: i64,
910 alias: Option<String>,
911 import_params: AuthSetBuilder,
912) -> binder::Result<KeyMetadata> {
913 let key_metadata = sec_level
914 .importKey(
915 &KeyDescriptor { domain, nspace, alias, blob: None },
916 None,
917 &import_params,
918 0,
919 RSA_2048_KEY,
920 )
921 .unwrap();
922
923 assert!(key_metadata.certificate.is_some());
924 assert!(key_metadata.certificateChain.is_none());
925
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000926 check_key_authorizations(&key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000927
928 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000929 assert!(check_key_param(
930 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000931 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::RSA) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000932 ));
933
934 assert!(check_key_param(
935 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000936 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(2048) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000937 ));
938
939 assert!(check_key_param(
940 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000941 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000942 ));
943
944 assert!(check_key_param(
945 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000946 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000947 tag: Tag::RSA_PUBLIC_EXPONENT,
948 value: KeyParameterValue::LongInteger(65537)
949 }
950 ));
951
952 assert!(check_key_param(
953 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000954 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000955 tag: Tag::PADDING,
956 value: KeyParameterValue::PaddingMode(PaddingMode::RSA_PSS)
957 }
958 ));
959
960 assert!(check_key_param(
961 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000962 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000963 ));
964
965 Ok(key_metadata)
966}
967
968/// Imports above defined EC key - `EC_P_256_KEY` and validates imported key parameters.
969pub fn import_ec_p_256_key(
970 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
971 domain: Domain,
972 nspace: i64,
973 alias: Option<String>,
974 import_params: AuthSetBuilder,
975) -> binder::Result<KeyMetadata> {
976 let key_metadata = sec_level
977 .importKey(
978 &KeyDescriptor { domain, nspace, alias, blob: None },
979 None,
980 &import_params,
981 0,
982 EC_P_256_KEY,
983 )
984 .unwrap();
985
986 assert!(key_metadata.certificate.is_some());
987 assert!(key_metadata.certificateChain.is_none());
988
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +0000989 check_key_authorizations(&key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000990
991 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000992 assert!(check_key_param(
993 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000994 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::EC) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000995 ));
996
997 assert!(check_key_param(
998 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000999 &KeyParameter { tag: Tag::EC_CURVE, value: KeyParameterValue::EcCurve(EcCurve::P_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001000 ));
1001
1002 assert!(check_key_param(
1003 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001004 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001005 ));
1006 assert!(check_key_param(
1007 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001008 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001009 ));
1010
1011 Ok(key_metadata)
1012}
1013
1014/// Import sample AES key and validate its key parameters.
1015pub fn import_aes_key(
1016 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1017 domain: Domain,
1018 nspace: i64,
1019 alias: Option<String>,
1020) -> binder::Result<KeyMetadata> {
1021 static AES_KEY: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
1022 let key_size = AES_KEY.len() * 8;
1023
1024 let import_params = AuthSetBuilder::new()
1025 .no_auth_required()
1026 .algorithm(Algorithm::AES)
1027 .block_mode(BlockMode::ECB)
1028 .key_size(key_size.try_into().unwrap())
1029 .purpose(KeyPurpose::ENCRYPT)
1030 .purpose(KeyPurpose::DECRYPT)
1031 .padding_mode(PaddingMode::PKCS7);
1032
1033 let key_metadata = sec_level.importKey(
1034 &KeyDescriptor { domain, nspace, alias, blob: None },
1035 None,
1036 &import_params,
1037 0,
1038 AES_KEY,
1039 )?;
1040
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001041 check_key_authorizations(&key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001042
1043 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001044 assert!(check_key_param(
1045 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001046 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::AES) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001047 ));
1048 assert!(check_key_param(
1049 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001050 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(128) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001051 ));
1052 assert!(check_key_param(
1053 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001054 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001055 tag: Tag::PADDING,
1056 value: KeyParameterValue::PaddingMode(PaddingMode::PKCS7)
1057 }
1058 ));
1059 assert!(check_key_param(
1060 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001061 &KeyParameter { tag: Tag::BLOCK_MODE, value: KeyParameterValue::BlockMode(BlockMode::ECB) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001062 ));
1063 assert!(check_key_param(
1064 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001065 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001066 ));
1067
1068 Ok(key_metadata)
1069}
1070
1071/// Import sample 3DES key and validate its key parameters.
1072pub fn import_3des_key(
1073 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1074 domain: Domain,
1075 nspace: i64,
1076 alias: Option<String>,
1077) -> binder::Result<KeyMetadata> {
1078 static TRIPLE_DES_KEY: &[u8] = &[
1079 0xa4, 0x9d, 0x75, 0x64, 0x19, 0x9e, 0x97, 0xcb, 0x52, 0x9d, 0x2c, 0x9d, 0x97, 0xbf, 0x2f,
1080 0x98, 0xd3, 0x5e, 0xdf, 0x57, 0xba, 0x1f, 0x73, 0x58,
1081 ];
1082
1083 let import_params = AuthSetBuilder::new()
1084 .no_auth_required()
1085 .algorithm(Algorithm::TRIPLE_DES)
1086 .block_mode(BlockMode::ECB)
1087 .key_size(168)
1088 .purpose(KeyPurpose::ENCRYPT)
1089 .purpose(KeyPurpose::DECRYPT)
1090 .padding_mode(PaddingMode::PKCS7);
1091
1092 let key_metadata = sec_level.importKey(
1093 &KeyDescriptor { domain, nspace, alias, blob: None },
1094 None,
1095 &import_params,
1096 0,
1097 TRIPLE_DES_KEY,
1098 )?;
1099
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001100 check_key_authorizations(&key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001101
1102 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001103 assert!(check_key_param(
1104 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001105 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001106 tag: Tag::ALGORITHM,
1107 value: KeyParameterValue::Algorithm(Algorithm::TRIPLE_DES)
1108 }
1109 ));
1110 assert!(check_key_param(
1111 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001112 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(168) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001113 ));
1114 assert!(check_key_param(
1115 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001116 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001117 tag: Tag::PADDING,
1118 value: KeyParameterValue::PaddingMode(PaddingMode::PKCS7)
1119 }
1120 ));
1121 assert!(check_key_param(
1122 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001123 &KeyParameter { tag: Tag::BLOCK_MODE, value: KeyParameterValue::BlockMode(BlockMode::ECB) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001124 ));
1125 assert!(check_key_param(
1126 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001127 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001128 ));
1129
1130 Ok(key_metadata)
1131}
1132
1133/// Import sample HMAC key and validate its key parameters.
1134pub fn import_hmac_key(
1135 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1136 domain: Domain,
1137 nspace: i64,
1138 alias: Option<String>,
1139) -> binder::Result<KeyMetadata> {
1140 static HMAC_KEY: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
1141 let key_size = HMAC_KEY.len() * 8;
1142
1143 let import_params = AuthSetBuilder::new()
1144 .no_auth_required()
1145 .algorithm(Algorithm::HMAC)
1146 .key_size(key_size.try_into().unwrap())
1147 .purpose(KeyPurpose::SIGN)
1148 .purpose(KeyPurpose::VERIFY)
1149 .digest(Digest::SHA_2_256)
1150 .min_mac_length(256);
1151
1152 let key_metadata = sec_level.importKey(
1153 &KeyDescriptor { domain, nspace, alias, blob: None },
1154 None,
1155 &import_params,
1156 0,
1157 HMAC_KEY,
1158 )?;
1159
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001160 check_key_authorizations(&key_metadata.authorizations, &import_params, KeyOrigin::IMPORTED);
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001161
1162 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001163 assert!(check_key_param(
1164 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001165 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::HMAC) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001166 ));
1167 assert!(check_key_param(
1168 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001169 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(128) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001170 ));
1171 assert!(check_key_param(
1172 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001173 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001174 ));
1175 assert!(check_key_param(
1176 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001177 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001178 ));
1179
1180 Ok(key_metadata)
1181}
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001182
1183/// Imports RSA encryption key with WRAP_KEY purpose.
1184pub fn import_wrapping_key(
1185 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1186 wrapping_key_data: &[u8],
1187 wrapping_key_alias: Option<String>,
1188) -> binder::Result<KeyMetadata> {
1189 let wrapping_key_params = AuthSetBuilder::new()
1190 .no_auth_required()
1191 .algorithm(Algorithm::RSA)
1192 .digest(Digest::SHA_2_256)
1193 .purpose(KeyPurpose::ENCRYPT)
1194 .purpose(KeyPurpose::DECRYPT)
1195 .purpose(KeyPurpose::WRAP_KEY)
1196 .padding_mode(PaddingMode::RSA_OAEP)
1197 .key_size(2048)
1198 .rsa_public_exponent(65537)
1199 .cert_not_before(0)
1200 .cert_not_after(253402300799000);
1201
1202 sec_level.importKey(
1203 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias: wrapping_key_alias, blob: None },
1204 None,
1205 &wrapping_key_params,
1206 0,
1207 wrapping_key_data,
1208 )
1209}
1210
1211/// Import wrapped key using given wrapping key.
1212pub fn import_wrapped_key(
1213 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1214 alias: Option<String>,
1215 wrapping_key_metadata: &KeyMetadata,
1216 wrapped_key: Option<Vec<u8>>,
1217) -> binder::Result<KeyMetadata> {
1218 let unwrap_params =
1219 AuthSetBuilder::new().digest(Digest::SHA_2_256).padding_mode(PaddingMode::RSA_OAEP);
1220
1221 let authenticator_spec: &[AuthenticatorSpec] = &[AuthenticatorSpec {
1222 authenticatorType: HardwareAuthenticatorType::NONE,
1223 authenticatorId: 0,
1224 }];
1225
1226 let key_metadata = sec_level.importWrappedKey(
1227 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: wrapped_key },
1228 &wrapping_key_metadata.key,
1229 None,
1230 &unwrap_params,
1231 authenticator_spec,
1232 )?;
1233
1234 Ok(key_metadata)
1235}
1236
1237/// Import wrapping key and then import wrapped key using wrapping key.
1238pub fn import_wrapping_key_and_wrapped_key(
1239 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1240 domain: Domain,
1241 nspace: i64,
1242 alias: Option<String>,
1243 wrapping_key_alias: Option<String>,
1244 wrapping_key_params: AuthSetBuilder,
1245) -> binder::Result<KeyMetadata> {
1246 let wrapping_key_metadata = sec_level.importKey(
1247 &KeyDescriptor { domain, nspace, alias: wrapping_key_alias, blob: None },
1248 None,
1249 &wrapping_key_params,
1250 0,
1251 WRAPPING_KEY,
1252 )?;
1253
1254 import_wrapped_key(sec_level, alias, &wrapping_key_metadata, Some(WRAPPED_KEY.to_vec()))
1255}
1256
1257/// Import given key material as AES-256-GCM-NONE transport key.
1258pub fn import_transport_key(
1259 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1260 transport_key_alias: Option<String>,
1261 transport_key: &[u8],
1262) -> binder::Result<KeyMetadata> {
1263 let transport_key_params = AuthSetBuilder::new()
1264 .no_auth_required()
1265 .algorithm(Algorithm::AES)
1266 .block_mode(BlockMode::GCM)
1267 .padding_mode(PaddingMode::NONE)
1268 .key_size(256)
1269 .caller_nonce()
1270 .min_mac_length(128)
1271 .purpose(KeyPurpose::ENCRYPT)
1272 .purpose(KeyPurpose::DECRYPT);
1273
1274 sec_level.importKey(
1275 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias: transport_key_alias, blob: None },
1276 None,
1277 &transport_key_params,
1278 0,
1279 transport_key,
1280 )
1281}
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001282
1283/// Generate EC key with purpose AGREE_KEY.
1284pub fn generate_ec_agree_key(
1285 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1286 ec_curve: EcCurve,
1287 digest: Digest,
1288 domain: Domain,
1289 nspace: i64,
1290 alias: Option<String>,
1291) -> binder::Result<KeyMetadata> {
1292 let gen_params = AuthSetBuilder::new()
1293 .no_auth_required()
1294 .algorithm(Algorithm::EC)
1295 .purpose(KeyPurpose::AGREE_KEY)
1296 .digest(digest)
1297 .ec_curve(ec_curve);
1298
1299 match sec_level.generateKey(
1300 &KeyDescriptor { domain, nspace, alias, blob: None },
1301 None,
1302 &gen_params,
1303 0,
1304 b"entropy",
1305 ) {
1306 Ok(key_metadata) => {
1307 assert!(key_metadata.certificate.is_some());
1308 if domain == Domain::BLOB {
1309 assert!(key_metadata.key.blob.is_some());
1310 }
1311
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001312 check_key_authorizations(
1313 &key_metadata.authorizations,
1314 &gen_params,
1315 KeyOrigin::GENERATED,
1316 );
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001317 Ok(key_metadata)
1318 }
1319 Err(e) => Err(e),
1320 }
1321}
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001322
1323/// Helper method to import AES keys `total_count` of times.
1324pub fn import_aes_keys(
1325 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1326 alias_prefix: String,
1327 total_count: Range<i32>,
1328) -> binder::Result<HashSet<String>> {
1329 let mut imported_key_aliases = HashSet::new();
1330
1331 // Import Total number of keys with given alias prefix.
1332 for count in total_count {
1333 let mut alias = String::new();
1334 write!(alias, "{}_{}", alias_prefix, count).unwrap();
1335 imported_key_aliases.insert(alias.clone());
1336
1337 import_aes_key(sec_level, Domain::APP, -1, Some(alias))?;
1338 }
1339
1340 Ok(imported_key_aliases)
1341}
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001342
1343/// Generate attested EC-P_256 key with device id attestation.
1344pub fn generate_key_with_attest_id(
1345 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1346 algorithm: Algorithm,
1347 alias: Option<String>,
1348 att_challenge: &[u8],
1349 attest_key: &KeyDescriptor,
1350 attest_id: Tag,
1351 value: Vec<u8>,
1352) -> binder::Result<KeyMetadata> {
1353 assert!(algorithm == Algorithm::RSA || algorithm == Algorithm::EC);
1354
1355 let mut ec_gen_params;
1356 if algorithm == Algorithm::EC {
1357 ec_gen_params = AuthSetBuilder::new()
1358 .no_auth_required()
1359 .algorithm(Algorithm::EC)
1360 .purpose(KeyPurpose::SIGN)
1361 .purpose(KeyPurpose::VERIFY)
1362 .digest(Digest::SHA_2_256)
1363 .ec_curve(EcCurve::P_256)
1364 .attestation_challenge(att_challenge.to_vec());
1365 } else {
1366 ec_gen_params = AuthSetBuilder::new()
1367 .no_auth_required()
1368 .algorithm(Algorithm::RSA)
1369 .rsa_public_exponent(65537)
1370 .key_size(2048)
1371 .purpose(KeyPurpose::SIGN)
1372 .purpose(KeyPurpose::VERIFY)
1373 .digest(Digest::SHA_2_256)
1374 .padding_mode(PaddingMode::RSA_PKCS1_1_5_SIGN)
1375 .attestation_challenge(att_challenge.to_vec());
1376 }
1377
1378 match attest_id {
1379 Tag::ATTESTATION_ID_BRAND => {
1380 ec_gen_params = ec_gen_params.attestation_device_brand(value);
1381 }
1382 Tag::ATTESTATION_ID_DEVICE => {
1383 ec_gen_params = ec_gen_params.attestation_device_name(value);
1384 }
1385 Tag::ATTESTATION_ID_PRODUCT => {
1386 ec_gen_params = ec_gen_params.attestation_device_product_name(value);
1387 }
1388 Tag::ATTESTATION_ID_SERIAL => {
1389 ec_gen_params = ec_gen_params.attestation_device_serial(value);
1390 }
1391 Tag::ATTESTATION_ID_MANUFACTURER => {
1392 ec_gen_params = ec_gen_params.attestation_device_manufacturer(value);
1393 }
1394 Tag::ATTESTATION_ID_MODEL => {
1395 ec_gen_params = ec_gen_params.attestation_device_model(value);
1396 }
1397 Tag::ATTESTATION_ID_IMEI => {
1398 ec_gen_params = ec_gen_params.attestation_device_imei(value);
1399 }
1400 Tag::ATTESTATION_ID_SECOND_IMEI => {
1401 ec_gen_params = ec_gen_params.attestation_device_second_imei(value);
1402 }
1403 _ => {
1404 panic!("Unknown attestation id");
1405 }
1406 }
1407
1408 sec_level.generateKey(
1409 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: None },
1410 Some(attest_key),
1411 &ec_gen_params,
1412 0,
1413 b"entropy",
1414 )
1415}
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001416
1417/// Generate Key and validate key characteristics.
1418pub fn generate_key(
1419 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1420 gen_params: &AuthSetBuilder,
1421 alias: &str,
1422) -> binder::Result<KeyMetadata> {
1423 let key_metadata = sec_level.generateKey(
1424 &KeyDescriptor {
1425 domain: Domain::APP,
1426 nspace: -1,
1427 alias: Some(alias.to_string()),
1428 blob: None,
1429 },
1430 None,
1431 gen_params,
1432 0,
1433 b"entropy",
1434 )?;
1435
1436 if gen_params.iter().any(|kp| {
1437 matches!(
1438 kp.value,
1439 KeyParameterValue::Algorithm(Algorithm::RSA)
1440 | KeyParameterValue::Algorithm(Algorithm::EC)
1441 )
1442 }) {
1443 assert!(key_metadata.certificate.is_some());
1444 if gen_params.iter().any(|kp| kp.tag == Tag::ATTESTATION_CHALLENGE) {
1445 assert!(key_metadata.certificateChain.is_some());
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +00001446 let mut cert_chain: Vec<u8> = Vec::new();
1447 cert_chain.extend(key_metadata.certificate.as_ref().unwrap());
1448 cert_chain.extend(key_metadata.certificateChain.as_ref().unwrap());
Rajesh Nyamagoudb1c8e832023-06-06 01:39:44 +00001449 let strict_issuer_check =
1450 !(gen_params.iter().any(|kp| kp.tag == Tag::DEVICE_UNIQUE_ATTESTATION));
1451 validate_certchain_with_strict_issuer_check(&cert_chain, strict_issuer_check)
1452 .expect("Error while validating cert chain");
Rajesh Nyamagoud5f6db2f2023-06-01 17:22:32 +00001453 }
1454
1455 if let Some(challenge_param) =
1456 gen_params.iter().find(|kp| kp.tag == Tag::ATTESTATION_CHALLENGE)
1457 {
1458 if let KeyParameterValue::Blob(val) = &challenge_param.value {
1459 let att_challenge = get_value_from_attest_record(
1460 key_metadata.certificate.as_ref().unwrap(),
1461 challenge_param.tag,
1462 key_metadata.keySecurityLevel,
1463 )
1464 .expect("Attestation challenge verification failed.");
1465 assert_eq!(&att_challenge, val);
1466 }
1467
1468 let att_app_id = get_value_from_attest_record(
1469 key_metadata.certificate.as_ref().unwrap(),
1470 Tag::ATTESTATION_APPLICATION_ID,
1471 SecurityLevel::KEYSTORE,
1472 )
1473 .expect("Attestation application id verification failed.");
1474 assert!(!att_app_id.is_empty());
Rajesh Nyamagoud75dfa0c2023-05-11 00:31:40 +00001475 }
1476 }
1477 check_key_authorizations(&key_metadata.authorizations, gen_params, KeyOrigin::GENERATED);
1478
1479 Ok(key_metadata)
1480}
1481
1482/// Generate a key using given authorizations and create an operation using the generated key.
1483pub fn create_key_and_operation(
1484 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1485 gen_params: &AuthSetBuilder,
1486 op_params: &AuthSetBuilder,
1487 alias: &str,
1488) -> binder::Result<CreateOperationResponse> {
1489 let key_metadata = generate_key(sec_level, gen_params, alias)?;
1490
1491 sec_level.createOperation(&key_metadata.key, op_params, false)
1492}