blob: 0f9ecbe0ef661e6ee0b7546a04b3fc7f0f07ab4f [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;
18
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +000019use core::ops::Range;
20use std::collections::HashSet;
21use std::fmt::Write;
22
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +000023use android_hardware_security_keymint::aidl::android::hardware::security::keymint::{
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +000024 Algorithm::Algorithm, BlockMode::BlockMode, Digest::Digest, EcCurve::EcCurve,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +000025 ErrorCode::ErrorCode, HardwareAuthenticatorType::HardwareAuthenticatorType,
26 KeyOrigin::KeyOrigin, KeyParameter::KeyParameter, KeyParameterValue::KeyParameterValue,
27 KeyPurpose::KeyPurpose, PaddingMode::PaddingMode, Tag::Tag,
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +000028};
29use android_system_keystore2::aidl::android::system::keystore2::{
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +000030 AuthenticatorSpec::AuthenticatorSpec, Authorization::Authorization, Domain::Domain,
31 IKeystoreSecurityLevel::IKeystoreSecurityLevel, KeyDescriptor::KeyDescriptor,
32 KeyMetadata::KeyMetadata, ResponseCode::ResponseCode,
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +000033};
34
35use crate::authorizations::AuthSetBuilder;
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +000036use android_system_keystore2::binder::{ExceptionCode, Result as BinderResult};
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +000037
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +000038/// Shell namespace.
39pub const SELINUX_SHELL_NAMESPACE: i64 = 1;
Rajesh Nyamagouddc6fb232021-12-08 21:27:15 +000040/// Vold namespace.
41pub const SELINUX_VOLD_NAMESPACE: i64 = 100;
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +000042
Rajesh Nyamagoudfa7c0f12021-12-02 17:15:48 +000043/// SU context.
44pub const TARGET_SU_CTX: &str = "u:r:su:s0";
45
46/// Vold context
47pub const TARGET_VOLD_CTX: &str = "u:r:vold:s0";
48
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +000049/// Allowed tags in generated/imported key authorizations.
50/// See hardware/interfaces/security/keymint/aidl/android/hardware/security/keymint/Tag.aidl for the
51/// list feature tags.
52/// Note: This list need to be updated whenever a new Tag is introduced and is expected to be added
53/// in key authorizations.
54pub const ALLOWED_TAGS_IN_KEY_AUTHS: &[Tag] = &[
55 Tag::ACTIVE_DATETIME,
56 Tag::ALGORITHM,
57 Tag::ALLOW_WHILE_ON_BODY,
58 Tag::AUTH_TIMEOUT,
59 Tag::BLOCK_MODE,
60 Tag::BOOTLOADER_ONLY,
61 Tag::BOOT_PATCHLEVEL,
62 Tag::CALLER_NONCE,
63 Tag::CREATION_DATETIME,
64 Tag::DIGEST,
65 Tag::EARLY_BOOT_ONLY,
66 Tag::EC_CURVE,
67 Tag::IDENTITY_CREDENTIAL_KEY,
68 Tag::INCLUDE_UNIQUE_ID,
69 Tag::KEY_SIZE,
70 Tag::MAX_BOOT_LEVEL,
71 Tag::MAX_USES_PER_BOOT,
72 Tag::MIN_MAC_LENGTH,
73 Tag::NO_AUTH_REQUIRED,
74 Tag::ORIGIN,
75 Tag::ORIGINATION_EXPIRE_DATETIME,
76 Tag::OS_PATCHLEVEL,
77 Tag::OS_VERSION,
78 Tag::PADDING,
79 Tag::PURPOSE,
80 Tag::ROLLBACK_RESISTANCE,
81 Tag::RSA_OAEP_MGF_DIGEST,
82 Tag::RSA_PUBLIC_EXPONENT,
83 Tag::STORAGE_KEY,
84 Tag::TRUSTED_CONFIRMATION_REQUIRED,
85 Tag::TRUSTED_USER_PRESENCE_REQUIRED,
86 Tag::UNLOCKED_DEVICE_REQUIRED,
87 Tag::USAGE_COUNT_LIMIT,
88 Tag::USAGE_EXPIRE_DATETIME,
89 Tag::USER_AUTH_TYPE,
90 Tag::USER_ID,
91 Tag::USER_SECURE_ID,
92 Tag::VENDOR_PATCHLEVEL,
93];
94
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +000095/// Key parameters to generate a key.
96pub struct KeyParams {
97 /// Key Size.
98 pub key_size: i32,
99 /// Key Purposes.
100 pub purpose: Vec<KeyPurpose>,
101 /// Padding Mode.
102 pub padding: Option<PaddingMode>,
103 /// Digest.
104 pub digest: Option<Digest>,
105 /// MFG Digest.
106 pub mgf_digest: Option<Digest>,
107 /// Block Mode.
108 pub block_mode: Option<BlockMode>,
109 /// Attestation challenge.
110 pub att_challenge: Option<Vec<u8>>,
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000111}
112
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000113/// DER-encoded PKCS#8 format RSA key. Generated using:
114/// openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -outform der | hexdump -e '30/1 "%02X" "\n"'
115pub static RSA_2048_KEY: &[u8] = &[
116 0x30, 0x82, 0x04, 0xBD, 0x02, 0x01, 0x00, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7,
117 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x04, 0xA7, 0x30, 0x82, 0x04, 0xA3, 0x02, 0x01,
118 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, 0xE5, 0x14, 0xE3, 0xC2, 0x43, 0xF3, 0x0F, 0xCC, 0x22, 0x73,
119 0x9C, 0x84, 0xCC, 0x1B, 0x6C, 0x97, 0x4B, 0xC9, 0xDF, 0x1F, 0xE2, 0xB8, 0x80, 0x85, 0xF9, 0x27,
120 0xAB, 0x97, 0x94, 0x58, 0x4B, 0xC9, 0x40, 0x94, 0x5A, 0xB4, 0xD4, 0xF8, 0xD0, 0x36, 0xC4, 0x86,
121 0x17, 0x7D, 0xA2, 0x48, 0x6D, 0x40, 0xF0, 0xB9, 0x61, 0x4F, 0xCE, 0x65, 0x80, 0x88, 0x81, 0x59,
122 0x95, 0x11, 0x24, 0xF4, 0x36, 0xB7, 0xB7, 0x37, 0x44, 0xF4, 0x6C, 0x1C, 0xEB, 0x04, 0x19, 0x78,
123 0xB2, 0x29, 0x4D, 0x21, 0x44, 0x16, 0x57, 0x58, 0x6D, 0x7D, 0x56, 0xB5, 0x99, 0xDD, 0xD2, 0xAD,
124 0x02, 0x9A, 0x72, 0x16, 0x67, 0xD6, 0x00, 0x9F, 0x69, 0xE0, 0x25, 0xEE, 0x7C, 0x86, 0x54, 0x27,
125 0x4B, 0x50, 0xEF, 0x60, 0x52, 0x60, 0x82, 0xAA, 0x09, 0x15, 0x72, 0xD2, 0xEB, 0x01, 0x52, 0x04,
126 0x39, 0x60, 0xBC, 0x5E, 0x95, 0x07, 0xC8, 0xC2, 0x3A, 0x3A, 0xE2, 0xA4, 0x99, 0x6B, 0x27, 0xE3,
127 0xA3, 0x55, 0x69, 0xC4, 0xB3, 0x2D, 0x19, 0xC4, 0x34, 0x76, 0xFC, 0x27, 0xDA, 0x22, 0xB2, 0x62,
128 0x69, 0x25, 0xDE, 0x0D, 0xE7, 0x54, 0x3C, 0xBB, 0x61, 0xD2, 0x20, 0xDA, 0x7B, 0x6E, 0x63, 0xBD,
129 0x9A, 0x4B, 0xCD, 0x75, 0xC6, 0xA1, 0x5E, 0x1C, 0x3E, 0xD5, 0x63, 0x59, 0x22, 0x7E, 0xE0, 0x6C,
130 0x98, 0x25, 0x63, 0x97, 0x56, 0xDF, 0x71, 0xF5, 0x4C, 0x78, 0xE9, 0xE1, 0xD5, 0xFC, 0xF8, 0x5A,
131 0x5B, 0xF6, 0x1D, 0xFA, 0x5A, 0x99, 0x4C, 0x99, 0x19, 0x21, 0x1D, 0xF5, 0x24, 0x07, 0xEF, 0x8A,
132 0xC9, 0x9F, 0xE7, 0x3F, 0xBB, 0x46, 0x1A, 0x16, 0x96, 0xC6, 0xD6, 0x12, 0x7E, 0xDA, 0xCB, 0xEB,
133 0x2F, 0x1D, 0x3B, 0x31, 0xCC, 0x55, 0x63, 0xA2, 0x6F, 0x8A, 0xDE, 0x35, 0x52, 0x40, 0x04, 0xBF,
134 0xE0, 0x82, 0x32, 0xE1, 0x6D, 0x8B, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, 0x00, 0x2D,
135 0x1F, 0x71, 0x41, 0x79, 0xBA, 0xED, 0xD8, 0xAA, 0xCC, 0x94, 0xFE, 0xFF, 0x69, 0x43, 0x79, 0x85,
136 0xBF, 0x2C, 0xC9, 0x0E, 0x12, 0x83, 0x96, 0x60, 0x1E, 0x75, 0x49, 0x35, 0x3A, 0x33, 0x2B, 0x60,
137 0x22, 0x18, 0xBF, 0xD7, 0xD7, 0x6E, 0xC3, 0xEA, 0xEF, 0xF2, 0xBE, 0x97, 0x71, 0xA6, 0xBB, 0x8C,
138 0xEF, 0x27, 0x00, 0xDE, 0x49, 0xD6, 0x08, 0x8D, 0x5A, 0x04, 0xE7, 0xCC, 0x9C, 0xA2, 0x0E, 0x8B,
139 0xF3, 0x42, 0x0C, 0xD7, 0x22, 0xD7, 0x14, 0x06, 0xA4, 0x64, 0x8B, 0x88, 0x1A, 0xCE, 0x5B, 0x8C,
140 0x36, 0xE9, 0xD2, 0x2F, 0x7B, 0x33, 0xE4, 0xA2, 0xB3, 0xDB, 0x78, 0x6A, 0x92, 0x89, 0x3F, 0x78,
141 0xFD, 0xED, 0x8F, 0xEE, 0x48, 0xCC, 0x94, 0x75, 0x0D, 0x0C, 0x63, 0xD3, 0xD2, 0xE8, 0x47, 0x04,
142 0x55, 0xD3, 0xD6, 0x3A, 0xB8, 0xDA, 0xFB, 0x76, 0x99, 0x48, 0x68, 0x0A, 0x92, 0xA2, 0xCD, 0xF7,
143 0x45, 0x8B, 0x50, 0xFE, 0xF9, 0x1A, 0x33, 0x24, 0x3C, 0x2E, 0xDE, 0x88, 0xAD, 0xB2, 0x5B, 0x9F,
144 0x44, 0xEA, 0xD1, 0x9F, 0xC7, 0x9F, 0x02, 0x5E, 0x31, 0x61, 0xB3, 0xD6, 0xE2, 0xE1, 0xBC, 0xFB,
145 0x1C, 0xDB, 0xBD, 0xB2, 0x9A, 0xE5, 0xEF, 0xDA, 0xCD, 0x29, 0xA5, 0x45, 0xCC, 0x67, 0x01, 0x8B,
146 0x1C, 0x1D, 0x0E, 0x8F, 0x73, 0x69, 0x4D, 0x4D, 0xF6, 0x9D, 0xA6, 0x6C, 0x9A, 0x1C, 0xF4, 0x5C,
147 0xE4, 0x83, 0x9A, 0x77, 0x12, 0x01, 0xBD, 0xCE, 0x66, 0x3A, 0x4B, 0x3D, 0x6E, 0xE0, 0x6E, 0x82,
148 0x98, 0xDE, 0x74, 0x11, 0x47, 0xEC, 0x7A, 0x3A, 0xA9, 0xD8, 0x48, 0x00, 0x26, 0x64, 0x47, 0x7B,
149 0xAE, 0x55, 0x9D, 0x29, 0x22, 0xB4, 0xB3, 0xB9, 0xB1, 0x64, 0xEA, 0x3B, 0x5A, 0xD3, 0x3F, 0x8D,
150 0x0F, 0x14, 0x7E, 0x4E, 0xB8, 0x1B, 0x06, 0xFC, 0xB1, 0x7E, 0xCD, 0xB9, 0x1A, 0x4E, 0xA1, 0x02,
151 0x81, 0x81, 0x00, 0xF9, 0xDE, 0xEE, 0xED, 0x13, 0x2F, 0xBB, 0xE7, 0xE2, 0xB3, 0x2D, 0x98, 0xD2,
152 0xE8, 0x25, 0x07, 0x5A, 0x1E, 0x51, 0x0A, 0xC8, 0xAD, 0x50, 0x4B, 0x80, 0xC6, 0x22, 0xF5, 0x9B,
153 0x08, 0xE6, 0x3D, 0x01, 0xC6, 0x3E, 0xC8, 0xD2, 0x54, 0x9F, 0x91, 0x77, 0x95, 0xCD, 0xCA, 0xC7,
154 0xE7, 0x47, 0x94, 0xA9, 0x5F, 0x4E, 0xBE, 0x31, 0x3D, 0xB4, 0xAF, 0x43, 0x0F, 0xDC, 0x8D, 0x9C,
155 0x1E, 0x52, 0x7B, 0x72, 0x21, 0x34, 0xB3, 0x96, 0x7C, 0x9C, 0xB8, 0x51, 0x65, 0x60, 0xAC, 0x3D,
156 0x11, 0x32, 0xB8, 0xD6, 0x34, 0x35, 0x66, 0xD0, 0x30, 0xB9, 0xE9, 0x67, 0x2C, 0x87, 0x73, 0x43,
157 0x9C, 0x12, 0x16, 0x7D, 0x4A, 0xD9, 0xA3, 0x4C, 0x24, 0x64, 0x6A, 0x32, 0x8E, 0xC3, 0xD8, 0x00,
158 0x90, 0x5C, 0x4D, 0x65, 0x01, 0x53, 0x8A, 0xD0, 0x87, 0xCE, 0x96, 0xEF, 0xFA, 0x73, 0x03, 0xF1,
159 0xDC, 0x1B, 0x9B, 0x02, 0x81, 0x81, 0x00, 0xEA, 0xB3, 0x69, 0x00, 0x11, 0x0E, 0x50, 0xAA, 0xD3,
160 0x22, 0x51, 0x78, 0x9D, 0xFF, 0x05, 0x62, 0xBC, 0x9A, 0x67, 0x86, 0xE1, 0xC5, 0x02, 0x2D, 0x14,
161 0x11, 0x29, 0x30, 0xE7, 0x90, 0x5D, 0x72, 0x6F, 0xC5, 0x62, 0xEB, 0xD4, 0xB0, 0x3F, 0x3D, 0xDC,
162 0xB9, 0xFC, 0x2B, 0x5C, 0xBD, 0x9E, 0x71, 0x81, 0x5C, 0xC5, 0xFE, 0xDF, 0x69, 0x73, 0x12, 0x66,
163 0x92, 0x06, 0xD4, 0xD5, 0x8F, 0xDF, 0x14, 0x2E, 0x9C, 0xD0, 0x4C, 0xC2, 0x4D, 0x31, 0x2E, 0x47,
164 0xA5, 0xDC, 0x8A, 0x83, 0x7B, 0xE8, 0xA5, 0xC3, 0x03, 0x98, 0xD8, 0xBF, 0xF4, 0x7D, 0x6E, 0x87,
165 0x55, 0xE4, 0x0F, 0x15, 0x10, 0xC8, 0x76, 0x4F, 0xAD, 0x1D, 0x1C, 0x95, 0x41, 0x9D, 0x88, 0xEC,
166 0x8C, 0xDA, 0xBA, 0x90, 0x7F, 0x8D, 0xD9, 0x8B, 0x47, 0x6C, 0x0C, 0xFF, 0xBA, 0x73, 0x00, 0x20,
167 0x1F, 0xF7, 0x7E, 0x5F, 0xF4, 0xEC, 0xD1, 0x02, 0x81, 0x80, 0x16, 0xB7, 0x43, 0xB5, 0x5D, 0xD7,
168 0x2B, 0x18, 0x0B, 0xAE, 0x0A, 0x69, 0x28, 0x53, 0x5E, 0x7A, 0x6A, 0xA0, 0xF2, 0xF1, 0x2E, 0x09,
169 0x43, 0x91, 0x79, 0xA5, 0x89, 0xAC, 0x16, 0x6A, 0x1A, 0xB4, 0x55, 0x22, 0xF6, 0xB6, 0x3F, 0x18,
170 0xDE, 0x60, 0xD5, 0x24, 0x53, 0x4F, 0x2A, 0x19, 0x46, 0x92, 0xA7, 0x4B, 0x38, 0xD7, 0x65, 0x96,
171 0x9C, 0x84, 0x8A, 0x6E, 0x38, 0xB8, 0xCF, 0x06, 0x9A, 0xAD, 0x0A, 0x55, 0x26, 0x7B, 0x65, 0x24,
172 0xF3, 0x02, 0x76, 0xB3, 0xE6, 0xB4, 0x01, 0xE1, 0x3C, 0x61, 0x3D, 0x68, 0x05, 0xAA, 0xD1, 0x26,
173 0x7C, 0xE0, 0x51, 0x36, 0xE5, 0x21, 0x7F, 0x76, 0x02, 0xD6, 0xF4, 0x91, 0x07, 0x74, 0x27, 0x09,
174 0xEF, 0xEF, 0x0F, 0xA5, 0x96, 0xFC, 0x5E, 0x20, 0xC1, 0xA3, 0x6F, 0x99, 0x4D, 0x45, 0x03, 0x6C,
175 0x35, 0x45, 0xD7, 0x8F, 0x47, 0x41, 0x86, 0x8D, 0x62, 0x1D, 0x02, 0x81, 0x81, 0x00, 0xC3, 0x93,
176 0x85, 0xA7, 0xFC, 0x8E, 0x85, 0x42, 0x14, 0x76, 0xC0, 0x95, 0x56, 0x73, 0xB0, 0xB5, 0x3A, 0x9D,
177 0x20, 0x30, 0x11, 0xEA, 0xED, 0x89, 0x4A, 0xF3, 0x91, 0xF3, 0xA2, 0xC3, 0x76, 0x5B, 0x6A, 0x30,
178 0x7D, 0xE2, 0x2F, 0x76, 0x3E, 0xFC, 0xF9, 0xF6, 0x31, 0xE0, 0xA0, 0x83, 0x92, 0x88, 0xDB, 0x57,
179 0xC7, 0xD6, 0x3F, 0xAD, 0xCB, 0xAA, 0x45, 0xB6, 0xE1, 0xE2, 0x71, 0xA4, 0x56, 0x2C, 0xA7, 0x3B,
180 0x1D, 0x89, 0x19, 0x50, 0xE1, 0xEE, 0xC2, 0xDD, 0xC0, 0x0D, 0xDC, 0xCB, 0x60, 0x6E, 0xE1, 0x37,
181 0x1A, 0x23, 0x64, 0xB2, 0x03, 0xE4, 0x1A, 0xFA, 0xC3, 0xF4, 0x9D, 0x85, 0x42, 0xC6, 0xF4, 0x56,
182 0x39, 0xB0, 0x1B, 0xE0, 0x75, 0xBA, 0x28, 0x04, 0xA8, 0x30, 0x57, 0x41, 0x33, 0x9F, 0x58, 0xA4,
183 0xC7, 0xB1, 0x7D, 0x58, 0x8D, 0x84, 0x49, 0x40, 0xDA, 0x28, 0x81, 0x25, 0xC4, 0x41, 0x02, 0x81,
184 0x80, 0x13, 0x20, 0x65, 0xD5, 0x96, 0x98, 0x8D, 0x16, 0x73, 0xA1, 0x31, 0x73, 0x79, 0xBA, 0xEC,
185 0xB0, 0xD9, 0x0C, 0xF6, 0xEF, 0x2F, 0xC2, 0xE7, 0x96, 0x9B, 0xA1, 0x2D, 0xE9, 0xFB, 0x45, 0xB9,
186 0xD0, 0x30, 0xE2, 0xBD, 0x30, 0x4F, 0xB6, 0xFE, 0x24, 0x02, 0xCF, 0x8D, 0x51, 0x48, 0x45, 0xD9,
187 0xF7, 0x20, 0x53, 0x1C, 0x0B, 0xA9, 0x7E, 0xC2, 0xA2, 0x65, 0xCC, 0x3E, 0x0E, 0x0D, 0xF1, 0x62,
188 0xDD, 0x5F, 0xBC, 0x55, 0x9B, 0x58, 0x26, 0x40, 0x6A, 0xEE, 0x02, 0x55, 0x36, 0xE9, 0xBA, 0x82,
189 0x5A, 0xFD, 0x3C, 0xDF, 0xA6, 0x26, 0x32, 0x81, 0xA9, 0x5E, 0x46, 0xBE, 0xBA, 0xDC, 0xD3, 0x2A,
190 0x3A, 0x3B, 0xC1, 0x4E, 0xF7, 0x1A, 0xDC, 0x4B, 0xAF, 0x67, 0x1B, 0x3A, 0x83, 0x0D, 0x04, 0xDE,
191 0x27, 0x47, 0xFC, 0xE6, 0x39, 0x89, 0x7B, 0x66, 0xF9, 0x50, 0x4D, 0xF1, 0xAC, 0x20, 0x43, 0x7E,
192 0xEE,
193];
194
195/// DER-encoded PKCS#8 format EC key. Generated using:
196/// openssl ecparam -name prime256v1 -genkey | openssl pkcs8 -topk8 -nocrypt -outform der | hexdump -e '30/1 "%02X" "\n"'
197pub static EC_P_256_KEY: &[u8] = &[
198 0x30, 0x81, 0x87, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02,
199 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07, 0x04, 0x6D, 0x30, 0x6B, 0x02,
200 0x01, 0x01, 0x04, 0x20, 0xB9, 0x1D, 0xAF, 0x50, 0xFD, 0xD8, 0x6A, 0x40, 0xAB, 0x2C, 0xCB, 0x54,
201 0x4E, 0xED, 0xF1, 0x64, 0xBC, 0x30, 0x25, 0xFB, 0xC4, 0x69, 0x00, 0x34, 0x1A, 0x82, 0xA3, 0x72,
202 0x5D, 0xC7, 0xA9, 0x85, 0xA1, 0x44, 0x03, 0x42, 0x00, 0x04, 0xE8, 0x53, 0x0A, 0xF2, 0xD3, 0x68,
203 0x40, 0x48, 0x8C, 0xB4, 0x2F, 0x11, 0x34, 0xD7, 0xF4, 0x4A, 0x5C, 0x33, 0xFF, 0xF6, 0x2B, 0xF7,
204 0x98, 0x0F, 0x02, 0xA5, 0xD7, 0x4F, 0xF9, 0xDE, 0x60, 0x9C, 0x6E, 0xB0, 0x45, 0xDA, 0x3F, 0xF4,
205 0x34, 0x23, 0x9B, 0x4C, 0x3A, 0x09, 0x9C, 0x5E, 0x5D, 0x37, 0x96, 0xAC, 0x4A, 0xE7, 0x65, 0x2B,
206 0xD6, 0x84, 0x98, 0xEA, 0x96, 0x91, 0xFB, 0x78, 0xED, 0x86,
207];
208
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +0000209/// DER-encoded PKCS#8 format RSA key -
210/// Size: 2048
211/// Public Exponent: 65537
212/// Purpose: WRAP_KEY, ENCRYPT, DECRYPT
213/// Encryption scheme: RSAES-PKCS1-v1_5
214/// Digest: SHA_2_256
215/// Padding: RSA_OAEP
216/// This sample wrapping_key is taken from KeyMint tests
217/// (see hardware/interfaces/security/keymint/aidl/vts/functional/KeyMintTest.cpp).
218/// Similarly more test keys can be generated with below command -
219/// openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -outform der | hexdump -e '30/1 "%02X" "\n"'
220pub static WRAPPING_KEY: &[u8] = &[
221 0x30, 0x82, 0x04, 0xbe, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
222 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x04, 0xa8, 0x30, 0x82, 0x04, 0xa4, 0x02, 0x01,
223 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, 0xae, 0xc3, 0x67, 0x93, 0x1d, 0x89, 0x00, 0xce, 0x56, 0xb0,
224 0x06, 0x7f, 0x7d, 0x70, 0xe1, 0xfc, 0x65, 0x3f, 0x3f, 0x34, 0xd1, 0x94, 0xc1, 0xfe, 0xd5, 0x00,
225 0x18, 0xfb, 0x43, 0xdb, 0x93, 0x7b, 0x06, 0xe6, 0x73, 0xa8, 0x37, 0x31, 0x3d, 0x56, 0xb1, 0xc7,
226 0x25, 0x15, 0x0a, 0x3f, 0xef, 0x86, 0xac, 0xbd, 0xdc, 0x41, 0xbb, 0x75, 0x9c, 0x28, 0x54, 0xea,
227 0xe3, 0x2d, 0x35, 0x84, 0x1e, 0xfb, 0x5c, 0x18, 0xd8, 0x2b, 0xc9, 0x0a, 0x1c, 0xb5, 0xc1, 0xd5,
228 0x5a, 0xdf, 0x24, 0x5b, 0x02, 0x91, 0x1f, 0x0b, 0x7c, 0xda, 0x88, 0xc4, 0x21, 0xff, 0x0e, 0xba,
229 0xfe, 0x7c, 0x0d, 0x23, 0xbe, 0x31, 0x2d, 0x7b, 0xd5, 0x92, 0x1f, 0xfa, 0xea, 0x13, 0x47, 0xc1,
230 0x57, 0x40, 0x6f, 0xef, 0x71, 0x8f, 0x68, 0x26, 0x43, 0xe4, 0xe5, 0xd3, 0x3c, 0x67, 0x03, 0xd6,
231 0x1c, 0x0c, 0xf7, 0xac, 0x0b, 0xf4, 0x64, 0x5c, 0x11, 0xf5, 0xc1, 0x37, 0x4c, 0x38, 0x86, 0x42,
232 0x74, 0x11, 0xc4, 0x49, 0x79, 0x67, 0x92, 0xe0, 0xbe, 0xf7, 0x5d, 0xec, 0x85, 0x8a, 0x21, 0x23,
233 0xc3, 0x67, 0x53, 0xe0, 0x2a, 0x95, 0xa9, 0x6d, 0x7c, 0x45, 0x4b, 0x50, 0x4d, 0xe3, 0x85, 0xa6,
234 0x42, 0xe0, 0xdf, 0xc3, 0xe6, 0x0a, 0xc3, 0xa7, 0xee, 0x49, 0x91, 0xd0, 0xd4, 0x8b, 0x01, 0x72,
235 0xa9, 0x5f, 0x95, 0x36, 0xf0, 0x2b, 0xa1, 0x3c, 0xec, 0xcc, 0xb9, 0x2b, 0x72, 0x7d, 0xb5, 0xc2,
236 0x7e, 0x5b, 0x2f, 0x5c, 0xec, 0x09, 0x60, 0x0b, 0x28, 0x6a, 0xf5, 0xcf, 0x14, 0xc4, 0x20, 0x24,
237 0xc6, 0x1d, 0xdf, 0xe7, 0x1c, 0x2a, 0x8d, 0x74, 0x58, 0xf1, 0x85, 0x23, 0x4c, 0xb0, 0x0e, 0x01,
238 0xd2, 0x82, 0xf1, 0x0f, 0x8f, 0xc6, 0x72, 0x1d, 0x2a, 0xed, 0x3f, 0x48, 0x33, 0xcc, 0xa2, 0xbd,
239 0x8f, 0xa6, 0x28, 0x21, 0xdd, 0x55, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, 0x00, 0x43,
240 0x14, 0x47, 0xb6, 0x25, 0x19, 0x08, 0x11, 0x2b, 0x1e, 0xe7, 0x6f, 0x99, 0xf3, 0x71, 0x1a, 0x52,
241 0xb6, 0x63, 0x09, 0x60, 0x04, 0x6c, 0x2d, 0xe7, 0x0d, 0xe1, 0x88, 0xd8, 0x33, 0xf8, 0xb8, 0xb9,
242 0x1e, 0x4d, 0x78, 0x5c, 0xae, 0xee, 0xaf, 0x4f, 0x0f, 0x74, 0x41, 0x4e, 0x2c, 0xda, 0x40, 0x64,
243 0x1f, 0x7f, 0xe2, 0x4f, 0x14, 0xc6, 0x7a, 0x88, 0x95, 0x9b, 0xdb, 0x27, 0x76, 0x6d, 0xf9, 0xe7,
244 0x10, 0xb6, 0x30, 0xa0, 0x3a, 0xdc, 0x68, 0x3b, 0x5d, 0x2c, 0x43, 0x08, 0x0e, 0x52, 0xbe, 0xe7,
245 0x1e, 0x9e, 0xae, 0xb6, 0xde, 0x29, 0x7a, 0x5f, 0xea, 0x10, 0x72, 0x07, 0x0d, 0x18, 0x1c, 0x82,
246 0x2b, 0xcc, 0xff, 0x08, 0x7d, 0x63, 0xc9, 0x40, 0xba, 0x8a, 0x45, 0xf6, 0x70, 0xfe, 0xb2, 0x9f,
247 0xb4, 0x48, 0x4d, 0x1c, 0x95, 0xe6, 0xd2, 0x57, 0x9b, 0xa0, 0x2a, 0xae, 0x0a, 0x00, 0x90, 0x0c,
248 0x3e, 0xbf, 0x49, 0x0e, 0x3d, 0x2c, 0xd7, 0xee, 0x8d, 0x0e, 0x20, 0xc5, 0x36, 0xe4, 0xdc, 0x5a,
249 0x50, 0x97, 0x27, 0x28, 0x88, 0xcd, 0xdd, 0x7e, 0x91, 0xf2, 0x28, 0xb1, 0xc4, 0xd7, 0x47, 0x4c,
250 0x55, 0xb8, 0xfc, 0xd6, 0x18, 0xc4, 0xa9, 0x57, 0xbb, 0xdd, 0xd5, 0xad, 0x74, 0x07, 0xcc, 0x31,
251 0x2d, 0x8d, 0x98, 0xa5, 0xca, 0xf7, 0xe0, 0x8f, 0x4a, 0x0d, 0x6b, 0x45, 0xbb, 0x41, 0xc6, 0x52,
252 0x65, 0x9d, 0x5a, 0x5b, 0xa0, 0x5b, 0x66, 0x37, 0x37, 0xa8, 0x69, 0x62, 0x81, 0x86, 0x5b, 0xa2,
253 0x0f, 0xbd, 0xd7, 0xf8, 0x51, 0xe6, 0xc5, 0x6e, 0x8c, 0xbe, 0x0d, 0xdb, 0xbf, 0x24, 0xdc, 0x03,
254 0xb2, 0xd2, 0xcb, 0x4c, 0x3d, 0x54, 0x0f, 0xb0, 0xaf, 0x52, 0xe0, 0x34, 0xa2, 0xd0, 0x66, 0x98,
255 0xb1, 0x28, 0xe5, 0xf1, 0x01, 0xe3, 0xb5, 0x1a, 0x34, 0xf8, 0xd8, 0xb4, 0xf8, 0x61, 0x81, 0x02,
256 0x81, 0x81, 0x00, 0xde, 0x39, 0x2e, 0x18, 0xd6, 0x82, 0xc8, 0x29, 0x26, 0x6c, 0xc3, 0x45, 0x4e,
257 0x1d, 0x61, 0x66, 0x24, 0x2f, 0x32, 0xd9, 0xa1, 0xd1, 0x05, 0x77, 0x75, 0x3e, 0x90, 0x4e, 0xa7,
258 0xd0, 0x8b, 0xff, 0x84, 0x1b, 0xe5, 0xba, 0xc8, 0x2a, 0x16, 0x4c, 0x59, 0x70, 0x00, 0x70, 0x47,
259 0xb8, 0xc5, 0x17, 0xdb, 0x8f, 0x8f, 0x84, 0xe3, 0x7b, 0xd5, 0x98, 0x85, 0x61, 0xbd, 0xf5, 0x03,
260 0xd4, 0xdc, 0x2b, 0xdb, 0x38, 0xf8, 0x85, 0x43, 0x4a, 0xe4, 0x2c, 0x35, 0x5f, 0x72, 0x5c, 0x9a,
261 0x60, 0xf9, 0x1f, 0x07, 0x88, 0xe1, 0xf1, 0xa9, 0x72, 0x23, 0xb5, 0x24, 0xb5, 0x35, 0x7f, 0xdf,
262 0x72, 0xe2, 0xf6, 0x96, 0xba, 0xb7, 0xd7, 0x8e, 0x32, 0xbf, 0x92, 0xba, 0x8e, 0x18, 0x64, 0xea,
263 0xb1, 0x22, 0x9e, 0x91, 0x34, 0x61, 0x30, 0x74, 0x8a, 0x6e, 0x3c, 0x12, 0x4f, 0x91, 0x49, 0xd7,
264 0x1c, 0x74, 0x35, 0x02, 0x81, 0x81, 0x00, 0xc9, 0x53, 0x87, 0xc0, 0xf9, 0xd3, 0x5f, 0x13, 0x7b,
265 0x57, 0xd0, 0xd6, 0x5c, 0x39, 0x7c, 0x5e, 0x21, 0xcc, 0x25, 0x1e, 0x47, 0x00, 0x8e, 0xd6, 0x2a,
266 0x54, 0x24, 0x09, 0xc8, 0xb6, 0xb6, 0xac, 0x7f, 0x89, 0x67, 0xb3, 0x86, 0x3c, 0xa6, 0x45, 0xfc,
267 0xce, 0x49, 0x58, 0x2a, 0x9a, 0xa1, 0x73, 0x49, 0xdb, 0x6c, 0x4a, 0x95, 0xaf, 0xfd, 0xae, 0x0d,
268 0xae, 0x61, 0x2e, 0x1a, 0xfa, 0xc9, 0x9e, 0xd3, 0x9a, 0x2d, 0x93, 0x4c, 0x88, 0x04, 0x40, 0xae,
269 0xd8, 0x83, 0x2f, 0x98, 0x43, 0x16, 0x3a, 0x47, 0xf2, 0x7f, 0x39, 0x21, 0x99, 0xdc, 0x12, 0x02,
270 0xf9, 0xa0, 0xf9, 0xbd, 0x08, 0x30, 0x80, 0x07, 0xcb, 0x1e, 0x4e, 0x7f, 0x58, 0x30, 0x93, 0x66,
271 0xa7, 0xde, 0x25, 0xf7, 0xc3, 0xc9, 0xb8, 0x80, 0x67, 0x7c, 0x06, 0x8e, 0x1b, 0xe9, 0x36, 0xe8,
272 0x12, 0x88, 0x81, 0x52, 0x52, 0xa8, 0xa1, 0x02, 0x81, 0x80, 0x57, 0xff, 0x8c, 0xa1, 0x89, 0x50,
273 0x80, 0xb2, 0xca, 0xe4, 0x86, 0xef, 0x0a, 0xdf, 0xd7, 0x91, 0xfb, 0x02, 0x35, 0xc0, 0xb8, 0xb3,
274 0x6c, 0xd6, 0xc1, 0x36, 0xe5, 0x2e, 0x40, 0x85, 0xf4, 0xea, 0x5a, 0x06, 0x32, 0x12, 0xa4, 0xf1,
275 0x05, 0xa3, 0x76, 0x47, 0x43, 0xe5, 0x32, 0x81, 0x98, 0x8a, 0xba, 0x07, 0x3f, 0x6e, 0x00, 0x27,
276 0x29, 0x8e, 0x1c, 0x43, 0x78, 0x55, 0x6e, 0x0e, 0xfc, 0xa0, 0xe1, 0x4e, 0xce, 0x1a, 0xf7, 0x6a,
277 0xd0, 0xb0, 0x30, 0xf2, 0x7a, 0xf6, 0xf0, 0xab, 0x35, 0xfb, 0x73, 0xa0, 0x60, 0xd8, 0xb1, 0xa0,
278 0xe1, 0x42, 0xfa, 0x26, 0x47, 0xe9, 0x3b, 0x32, 0xe3, 0x6d, 0x82, 0x82, 0xae, 0x0a, 0x4d, 0xe5,
279 0x0a, 0xb7, 0xaf, 0xe8, 0x55, 0x00, 0xa1, 0x6f, 0x43, 0xa6, 0x47, 0x19, 0xd6, 0xe2, 0xb9, 0x43,
280 0x98, 0x23, 0x71, 0x9c, 0xd0, 0x8b, 0xcd, 0x03, 0x17, 0x81, 0x02, 0x81, 0x81, 0x00, 0xba, 0x73,
281 0xb0, 0xbb, 0x28, 0xe3, 0xf8, 0x1e, 0x9b, 0xd1, 0xc5, 0x68, 0x71, 0x3b, 0x10, 0x12, 0x41, 0xac,
282 0xc6, 0x07, 0x97, 0x6c, 0x4d, 0xdc, 0xcc, 0x90, 0xe6, 0x5b, 0x65, 0x56, 0xca, 0x31, 0x51, 0x60,
283 0x58, 0xf9, 0x2b, 0x6e, 0x09, 0xf3, 0xb1, 0x60, 0xff, 0x0e, 0x37, 0x4e, 0xc4, 0x0d, 0x78, 0xae,
284 0x4d, 0x49, 0x79, 0xfd, 0xe6, 0xac, 0x06, 0xa1, 0xa4, 0x00, 0xc6, 0x1d, 0xd3, 0x12, 0x54, 0x18,
285 0x6a, 0xf3, 0x0b, 0x22, 0xc1, 0x05, 0x82, 0xa8, 0xa4, 0x3e, 0x34, 0xfe, 0x94, 0x9c, 0x5f, 0x3b,
286 0x97, 0x55, 0xba, 0xe7, 0xba, 0xa7, 0xb7, 0xb7, 0xa6, 0xbd, 0x03, 0xb3, 0x8c, 0xef, 0x55, 0xc8,
287 0x68, 0x85, 0xfc, 0x6c, 0x19, 0x78, 0xb9, 0xce, 0xe7, 0xef, 0x33, 0xda, 0x50, 0x7c, 0x9d, 0xf6,
288 0xb9, 0x27, 0x7c, 0xff, 0x1e, 0x6a, 0xaa, 0x5d, 0x57, 0xac, 0xa5, 0x28, 0x46, 0x61, 0x02, 0x81,
289 0x81, 0x00, 0xc9, 0x31, 0x61, 0x7c, 0x77, 0x82, 0x9d, 0xfb, 0x12, 0x70, 0x50, 0x2b, 0xe9, 0x19,
290 0x5c, 0x8f, 0x28, 0x30, 0x88, 0x5f, 0x57, 0xdb, 0xa8, 0x69, 0x53, 0x68, 0x11, 0xe6, 0x86, 0x42,
291 0x36, 0xd0, 0xc4, 0x73, 0x6a, 0x00, 0x08, 0xa1, 0x45, 0xaf, 0x36, 0xb8, 0x35, 0x7a, 0x7c, 0x3d,
292 0x13, 0x99, 0x66, 0xd0, 0x4c, 0x4e, 0x00, 0x93, 0x4e, 0xa1, 0xae, 0xde, 0x3b, 0xb6, 0xb8, 0xec,
293 0x84, 0x1d, 0xc9, 0x5e, 0x3f, 0x57, 0x97, 0x51, 0xe2, 0xbf, 0xdf, 0xe2, 0x7a, 0xe7, 0x78, 0x98,
294 0x3f, 0x95, 0x93, 0x56, 0x21, 0x07, 0x23, 0x28, 0x7b, 0x0a, 0xff, 0xcc, 0x9f, 0x72, 0x70, 0x44,
295 0xd4, 0x8c, 0x37, 0x3f, 0x1b, 0xab, 0xde, 0x07, 0x24, 0xfa, 0x17, 0xa4, 0xfd, 0x4d, 0xa0, 0x90,
296 0x2c, 0x7c, 0x9b, 0x9b, 0xf2, 0x7b, 0xa6, 0x1b, 0xe6, 0xad, 0x02, 0xdf, 0xdd, 0xda, 0x8f, 0x4e,
297 0x68, 0x22,
298];
299
300/// WrappedKeyData as ASN.1 DER-encoded data corresponding to the `SecureKeyWrapper` schema
301/// specified in IKeyMintDevice.aidl. Wrapped key parameters are -
302/// Algorithm: AES
303/// Key size: 256
304/// Block mode: ECB
305/// Padding mode: PKCS7
306/// This sample wrapped_key is taken from KeyMint tests (see KeyMintTest.cpp).
307pub static WRAPPED_KEY: &[u8] = &[
308 0x30, 0x82, 0x01, 0x79, 0x02, 0x01, 0x00, 0x04, 0x82, 0x01, 0x00, 0x93, 0x4b, 0xf9, 0x4e, 0x2a,
309 0xa2, 0x8a, 0x3f, 0x83, 0xc9, 0xf7, 0x92, 0x97, 0x25, 0x02, 0x62, 0xfb, 0xe3, 0x27, 0x6b, 0x5a,
310 0x1c, 0x91, 0x15, 0x9b, 0xbf, 0xa3, 0xef, 0x89, 0x57, 0xaa, 0xc8, 0x4b, 0x59, 0xb3, 0x0b, 0x45,
311 0x5a, 0x79, 0xc2, 0x97, 0x34, 0x80, 0x82, 0x3d, 0x8b, 0x38, 0x63, 0xc3, 0xde, 0xef, 0x4a, 0x8e,
312 0x24, 0x35, 0x90, 0x26, 0x8d, 0x80, 0xe1, 0x87, 0x51, 0xa0, 0xe1, 0x30, 0xf6, 0x7c, 0xe6, 0xa1,
313 0xac, 0xe9, 0xf7, 0x9b, 0x95, 0xe0, 0x97, 0x47, 0x4f, 0xeb, 0xc9, 0x81, 0x19, 0x5b, 0x1d, 0x13,
314 0xa6, 0x90, 0x86, 0xc0, 0x86, 0x3f, 0x66, 0xa7, 0xb7, 0xfd, 0xb4, 0x87, 0x92, 0x22, 0x7b, 0x1a,
315 0xc5, 0xe2, 0x48, 0x9f, 0xeb, 0xdf, 0x08, 0x7a, 0xb5, 0x48, 0x64, 0x83, 0x03, 0x3a, 0x6f, 0x00,
316 0x1c, 0xa5, 0xd1, 0xec, 0x1e, 0x27, 0xf5, 0xc3, 0x0f, 0x4c, 0xec, 0x26, 0x42, 0x07, 0x4a, 0x39,
317 0xae, 0x68, 0xae, 0xe5, 0x52, 0xe1, 0x96, 0x62, 0x7a, 0x8e, 0x3d, 0x86, 0x7e, 0x67, 0xa8, 0xc0,
318 0x1b, 0x11, 0xe7, 0x5f, 0x13, 0xcc, 0xa0, 0xa9, 0x7a, 0xb6, 0x68, 0xb5, 0x0c, 0xda, 0x07, 0xa8,
319 0xec, 0xb7, 0xcd, 0x8e, 0x3d, 0xd7, 0x00, 0x9c, 0x96, 0x36, 0x53, 0x4f, 0x6f, 0x23, 0x9c, 0xff,
320 0xe1, 0xfc, 0x8d, 0xaa, 0x46, 0x6f, 0x78, 0xb6, 0x76, 0xc7, 0x11, 0x9e, 0xfb, 0x96, 0xbc, 0xe4,
321 0xe6, 0x9c, 0xa2, 0xa2, 0x5d, 0x0b, 0x34, 0xed, 0x9c, 0x3f, 0xf9, 0x99, 0xb8, 0x01, 0x59, 0x7d,
322 0x52, 0x20, 0xe3, 0x07, 0xea, 0xa5, 0xbe, 0xe5, 0x07, 0xfb, 0x94, 0xd1, 0xfa, 0x69, 0xf9, 0xe5,
323 0x19, 0xb2, 0xde, 0x31, 0x5b, 0xac, 0x92, 0xc3, 0x6f, 0x2e, 0xa1, 0xfa, 0x1d, 0xf4, 0x47, 0x8c,
324 0x0d, 0xde, 0xde, 0xae, 0x8c, 0x70, 0xe0, 0x23, 0x3c, 0xd0, 0x98, 0x04, 0x0c, 0xd7, 0x96, 0xb0,
325 0x2c, 0x37, 0x0f, 0x1f, 0xa4, 0xcc, 0x01, 0x24, 0xf1, 0x30, 0x2e, 0x02, 0x01, 0x03, 0x30, 0x29,
326 0xa1, 0x08, 0x31, 0x06, 0x02, 0x01, 0x00, 0x02, 0x01, 0x01, 0xa2, 0x03, 0x02, 0x01, 0x20, 0xa3,
327 0x04, 0x02, 0x02, 0x01, 0x00, 0xa4, 0x05, 0x31, 0x03, 0x02, 0x01, 0x01, 0xa6, 0x05, 0x31, 0x03,
328 0x02, 0x01, 0x40, 0xbf, 0x83, 0x77, 0x02, 0x05, 0x00, 0x04, 0x20, 0xcc, 0xd5, 0x40, 0x85, 0x5f,
329 0x83, 0x3a, 0x5e, 0x14, 0x80, 0xbf, 0xd2, 0xd3, 0x6f, 0xaf, 0x3a, 0xee, 0xe1, 0x5d, 0xf5, 0xbe,
330 0xab, 0xe2, 0x69, 0x1b, 0xc8, 0x2d, 0xde, 0x2a, 0x7a, 0xa9, 0x10, 0x04, 0x10, 0x64, 0xc9, 0xf6,
331 0x89, 0xc6, 0x0f, 0xf6, 0x22, 0x3a, 0xb6, 0xe6, 0x99, 0x9e, 0x0e, 0xb6, 0xe5,
332];
333
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000334/// To map Keystore errors.
335#[derive(thiserror::Error, Debug, Eq, PartialEq)]
336pub enum Error {
337 /// Keystore2 error code
338 #[error("ResponseCode {0:?}")]
339 Rc(ResponseCode),
340 /// Keymint error code
341 #[error("ErrorCode {0:?}")]
342 Km(ErrorCode),
343 /// Exception
344 #[error("Binder exception {0:?}")]
345 Binder(ExceptionCode),
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000346 /// This is returned if the C implementation of extractSubjectFromCertificate failed.
347 #[error("Failed to validate certificate chain.")]
348 ValidateCertChainFailed,
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +0000349 /// Error code to indicate error in ASN.1 DER-encoded data creation.
350 #[error("Failed to create and encode ASN.1 data.")]
351 DerEncodeFailed,
Rajesh Nyamagoud28abde62023-04-01 01:32:32 +0000352 /// Error code to indicate error while using keystore-engine API.
353 #[error("Failed to perform crypto op using keystore-engine APIs.")]
354 Keystore2EngineOpFailed,
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +0000355 /// Error code to indicate error in attestation-id validation.
356 #[error("Failed to validate attestation-id.")]
357 ValidateAttestIdFailed,
358 /// Error code to indicate error in getting value from attest record.
359 #[error("Failed to get value from attest record.")]
360 AttestRecordGetValueFailed,
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000361}
362
363/// Keystore2 error mapping.
364pub fn map_ks_error<T>(r: BinderResult<T>) -> Result<T, Error> {
365 r.map_err(|s| {
366 match s.exception_code() {
367 ExceptionCode::SERVICE_SPECIFIC => {
368 match s.service_specific_error() {
369 se if se < 0 => {
370 // Negative service specific errors are KM error codes.
371 Error::Km(ErrorCode(se))
372 }
373 se => {
374 // Positive service specific errors are KS response codes.
375 Error::Rc(ResponseCode(se))
376 }
377 }
378 }
379 // We create `Error::Binder` to preserve the exception code
380 // for logging.
381 e_code => Error::Binder(e_code),
382 }
383 })
384}
385
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000386/// Verify that given key param is listed in given authorizations list.
387pub fn check_key_param(authorizations: &[Authorization], key_param: &KeyParameter) -> bool {
388 authorizations.iter().any(|auth| &auth.keyParameter == key_param)
389}
390
391fn check_key_authorizations(authorizations: &[Authorization], expected_params: &[KeyParameter]) {
392 // Make sure key authorizations contains only `ALLOWED_TAGS_IN_KEY_AUTHS`
393 authorizations.iter().all(|auth| {
394 assert!(
395 ALLOWED_TAGS_IN_KEY_AUTHS.contains(&auth.keyParameter.tag),
396 "key authorization is not allowed: {:#?}",
397 auth.keyParameter
398 );
399 true
400 });
401
402 //Check allowed-expected-key-parameters are present in given key authorizations list.
403 expected_params.iter().all(|key_param| {
404 if ALLOWED_TAGS_IN_KEY_AUTHS.contains(&key_param.tag) {
405 assert!(
406 check_key_param(authorizations, key_param),
407 "Key parameter not found: {:#?}",
408 key_param
409 );
410 }
411 true
412 });
413}
414
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000415/// Generate EC Key using given security level and domain with below key parameters and
416/// optionally allow the generated key to be attested with factory provisioned attest key using
417/// given challenge and application id -
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000418/// Purposes: SIGN and VERIFY
419/// Digest: SHA_2_256
420/// Curve: P_256
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000421pub fn generate_ec_p256_signing_key(
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000422 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000423 domain: Domain,
424 nspace: i64,
425 alias: Option<String>,
426 att_challenge: Option<&[u8]>,
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000427) -> binder::Result<KeyMetadata> {
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000428 let mut key_attest = false;
429 let mut gen_params = AuthSetBuilder::new()
Rajesh Nyamagoudc7d064d2022-08-20 01:45:17 +0000430 .no_auth_required()
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000431 .algorithm(Algorithm::EC)
432 .purpose(KeyPurpose::SIGN)
433 .purpose(KeyPurpose::VERIFY)
434 .digest(Digest::SHA_2_256)
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000435 .ec_curve(EcCurve::P_256);
436
437 if let Some(challenge) = att_challenge {
438 key_attest = true;
439 gen_params = gen_params.clone().attestation_challenge(challenge.to_vec());
440 }
441
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000442 match sec_level.generateKey(
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000443 &KeyDescriptor { domain, nspace, alias, blob: None },
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000444 None,
445 &gen_params,
446 0,
447 b"entropy",
448 ) {
449 Ok(key_metadata) => {
450 assert!(key_metadata.certificate.is_some());
Rajesh Nyamagoudb881d512021-12-10 00:33:15 +0000451 if key_attest {
452 assert!(key_metadata.certificateChain.is_some());
453 }
454 if domain == Domain::BLOB {
455 assert!(key_metadata.key.blob.is_some());
456 }
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000457
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000458 check_key_authorizations(&key_metadata.authorizations, &gen_params);
Rajesh Nyamagoud901386c2022-03-21 20:35:18 +0000459 Ok(key_metadata)
460 }
461 Err(e) => Err(e),
462 }
463}
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000464
465/// Generate EC signing key.
Rajesh Nyamagoudc7d064d2022-08-20 01:45:17 +0000466pub fn generate_ec_key(
467 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000468 domain: Domain,
469 nspace: i64,
470 alias: Option<String>,
471 ec_curve: EcCurve,
472 digest: Digest,
473) -> binder::Result<KeyMetadata> {
474 let gen_params = AuthSetBuilder::new()
475 .no_auth_required()
476 .algorithm(Algorithm::EC)
477 .purpose(KeyPurpose::SIGN)
478 .purpose(KeyPurpose::VERIFY)
479 .digest(digest)
480 .ec_curve(ec_curve);
481
482 let key_metadata = sec_level.generateKey(
483 &KeyDescriptor { domain, nspace, alias, blob: None },
484 None,
485 &gen_params,
486 0,
487 b"entropy",
488 )?;
489
490 // Must have a public key.
491 assert!(key_metadata.certificate.is_some());
492
493 // Should not have an attestation record.
494 assert!(key_metadata.certificateChain.is_none());
495
496 if domain == Domain::BLOB {
497 assert!(key_metadata.key.blob.is_some());
498 } else {
499 assert!(key_metadata.key.blob.is_none());
500 }
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000501 check_key_authorizations(&key_metadata.authorizations, &gen_params);
Rajesh Nyamagouda7766452021-12-13 21:44:19 +0000502 Ok(key_metadata)
503}
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000504
505/// Generate a RSA key with the given key parameters, alias, domain and namespace.
506pub fn generate_rsa_key(
507 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
508 domain: Domain,
509 nspace: i64,
510 alias: Option<String>,
511 key_params: &KeyParams,
512 attest_key: Option<&KeyDescriptor>,
513) -> binder::Result<KeyMetadata> {
514 let mut gen_params = AuthSetBuilder::new()
515 .no_auth_required()
516 .algorithm(Algorithm::RSA)
517 .rsa_public_exponent(65537)
518 .key_size(key_params.key_size);
519
520 for purpose in &key_params.purpose {
521 gen_params = gen_params.purpose(*purpose);
522 }
523 if let Some(value) = key_params.digest {
524 gen_params = gen_params.digest(value)
525 }
526 if let Some(value) = key_params.padding {
527 gen_params = gen_params.padding_mode(value);
528 }
529 if let Some(value) = key_params.mgf_digest {
530 gen_params = gen_params.mgf_digest(value);
531 }
532 if let Some(value) = key_params.block_mode {
533 gen_params = gen_params.block_mode(value)
534 }
535 if let Some(value) = &key_params.att_challenge {
536 gen_params = gen_params.attestation_challenge(value.to_vec())
537 }
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000538
539 let key_metadata = sec_level.generateKey(
540 &KeyDescriptor { domain, nspace, alias, blob: None },
541 attest_key,
542 &gen_params,
543 0,
544 b"entropy",
545 )?;
546
547 // Must have a public key.
548 assert!(key_metadata.certificate.is_some());
549
David Drysdale38f2ca32023-01-10 13:10:51 +0000550 if attest_key.is_none() && key_params.att_challenge.is_some() {
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000551 // Should have an attestation record.
552 assert!(key_metadata.certificateChain.is_some());
553 } else {
554 // Should not have an attestation record.
555 assert!(key_metadata.certificateChain.is_none());
556 }
557
558 assert!(
559 (domain == Domain::BLOB && key_metadata.key.blob.is_some())
560 || key_metadata.key.blob.is_none()
561 );
562
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000563 check_key_authorizations(&key_metadata.authorizations, &gen_params);
564 // If `RSA_OAEP_MGF_DIGEST` tag is not mentioned explicitly while generating/importing a key,
565 // then make sure `RSA_OAEP_MGF_DIGEST` tag with default value (SHA1) must not be included in
566 // key authorization list.
567 if key_params.mgf_digest.is_none() {
568 assert!(!check_key_param(
569 &key_metadata.authorizations,
570 &KeyParameter {
571 tag: Tag::RSA_OAEP_MGF_DIGEST,
572 value: KeyParameterValue::Digest(Digest::SHA1)
573 }
574 ));
575 }
Rajesh Nyamagoud11912ea2021-12-20 20:37:20 +0000576 Ok(key_metadata)
577}
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000578
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000579/// Generate AES/3DES key.
580pub fn generate_sym_key(
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000581 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000582 algorithm: Algorithm,
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000583 size: i32,
584 alias: &str,
585 padding_mode: &PaddingMode,
586 block_mode: &BlockMode,
587 min_mac_len: Option<i32>,
588) -> binder::Result<KeyMetadata> {
589 let mut gen_params = AuthSetBuilder::new()
590 .no_auth_required()
Rajesh Nyamagoudc3523ba2022-08-05 17:38:25 +0000591 .algorithm(algorithm)
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000592 .purpose(KeyPurpose::ENCRYPT)
593 .purpose(KeyPurpose::DECRYPT)
594 .key_size(size)
595 .padding_mode(*padding_mode)
596 .block_mode(*block_mode);
597
598 if let Some(val) = min_mac_len {
599 gen_params = gen_params.min_mac_length(val);
600 }
601
602 let key_metadata = sec_level.generateKey(
603 &KeyDescriptor {
604 domain: Domain::APP,
605 nspace: -1,
606 alias: Some(alias.to_string()),
607 blob: None,
608 },
609 None,
610 &gen_params,
611 0,
612 b"entropy",
613 )?;
614
615 // Should not have public certificate.
616 assert!(key_metadata.certificate.is_none());
617
618 // Should not have an attestation record.
619 assert!(key_metadata.certificateChain.is_none());
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000620 check_key_authorizations(&key_metadata.authorizations, &gen_params);
Rajesh Nyamagoud47409932022-01-08 00:37:13 +0000621 Ok(key_metadata)
622}
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000623
624/// Generate HMAC key.
625pub fn generate_hmac_key(
626 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
627 alias: &str,
628 key_size: i32,
629 min_mac_len: i32,
630 digest: Digest,
631) -> binder::Result<KeyMetadata> {
632 let gen_params = AuthSetBuilder::new()
633 .no_auth_required()
634 .algorithm(Algorithm::HMAC)
635 .purpose(KeyPurpose::SIGN)
636 .purpose(KeyPurpose::VERIFY)
637 .key_size(key_size)
638 .min_mac_length(min_mac_len)
639 .digest(digest);
640
641 let key_metadata = sec_level.generateKey(
642 &KeyDescriptor {
643 domain: Domain::APP,
644 nspace: -1,
645 alias: Some(alias.to_string()),
646 blob: None,
647 },
648 None,
649 &gen_params,
650 0,
651 b"entropy",
652 )?;
653
654 // Should not have public certificate.
655 assert!(key_metadata.certificate.is_none());
656
657 // Should not have an attestation record.
658 assert!(key_metadata.certificateChain.is_none());
659
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000660 check_key_authorizations(&key_metadata.authorizations, &gen_params);
Rajesh Nyamagoud4c6193c2022-02-03 01:15:34 +0000661 Ok(key_metadata)
662}
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000663
664/// Generate RSA or EC attestation keys using below parameters -
665/// Purpose: ATTEST_KEY
666/// Digest: Digest::SHA_2_256
667/// Padding: PaddingMode::RSA_PKCS1_1_5_SIGN
668/// RSA-Key-Size: 2048
669/// EC-Curve: EcCurve::P_256
670pub fn generate_attestation_key(
671 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
672 algorithm: Algorithm,
673 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000674) -> binder::Result<KeyMetadata> {
675 assert!(algorithm == Algorithm::RSA || algorithm == Algorithm::EC);
676
677 if algorithm == Algorithm::RSA {
678 let alias = "ks_rsa_attest_test_key";
679 let metadata = generate_rsa_key(
680 sec_level,
681 Domain::APP,
682 -1,
683 Some(alias.to_string()),
684 &KeyParams {
685 key_size: 2048,
686 purpose: vec![KeyPurpose::ATTEST_KEY],
687 padding: Some(PaddingMode::RSA_PKCS1_1_5_SIGN),
688 digest: Some(Digest::SHA_2_256),
689 mgf_digest: None,
690 block_mode: None,
691 att_challenge: Some(att_challenge.to_vec()),
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000692 },
693 None,
694 )
695 .unwrap();
696 Ok(metadata)
697 } else {
698 let metadata = generate_ec_attestation_key(
699 sec_level,
700 att_challenge,
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000701 Digest::SHA_2_256,
702 EcCurve::P_256,
703 )
704 .unwrap();
705
706 Ok(metadata)
707 }
708}
709
710/// Generate EC attestation key with the given
711/// curve, attestation-challenge and attestation-app-id.
712pub fn generate_ec_attestation_key(
713 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
714 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000715 digest: Digest,
716 ec_curve: EcCurve,
717) -> binder::Result<KeyMetadata> {
718 let alias = "ks_attest_ec_test_key";
719 let gen_params = AuthSetBuilder::new()
720 .no_auth_required()
721 .algorithm(Algorithm::EC)
722 .purpose(KeyPurpose::ATTEST_KEY)
723 .ec_curve(ec_curve)
724 .digest(digest)
David Drysdale38f2ca32023-01-10 13:10:51 +0000725 .attestation_challenge(att_challenge.to_vec());
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000726
727 let attestation_key_metadata = sec_level.generateKey(
728 &KeyDescriptor {
729 domain: Domain::APP,
730 nspace: -1,
731 alias: Some(alias.to_string()),
732 blob: None,
733 },
734 None,
735 &gen_params,
736 0,
737 b"entropy",
738 )?;
739
740 // Should have public certificate.
741 assert!(attestation_key_metadata.certificate.is_some());
742 // Should have an attestation record.
743 assert!(attestation_key_metadata.certificateChain.is_some());
744
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000745 check_key_authorizations(&attestation_key_metadata.authorizations, &gen_params);
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000746 Ok(attestation_key_metadata)
747}
748
749/// Generate EC-P-256 key and attest it with given attestation key.
750pub fn generate_ec_256_attested_key(
751 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
752 alias: Option<String>,
753 att_challenge: &[u8],
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000754 attest_key: &KeyDescriptor,
755) -> binder::Result<KeyMetadata> {
756 let ec_gen_params = AuthSetBuilder::new()
757 .no_auth_required()
758 .algorithm(Algorithm::EC)
759 .purpose(KeyPurpose::SIGN)
760 .purpose(KeyPurpose::VERIFY)
761 .digest(Digest::SHA_2_256)
762 .ec_curve(EcCurve::P_256)
David Drysdale38f2ca32023-01-10 13:10:51 +0000763 .attestation_challenge(att_challenge.to_vec());
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000764
765 let ec_key_metadata = sec_level
766 .generateKey(
767 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: None },
768 Some(attest_key),
769 &ec_gen_params,
770 0,
771 b"entropy",
772 )
773 .unwrap();
774
775 // Should have public certificate.
776 assert!(ec_key_metadata.certificate.is_some());
777 // Shouldn't have an attestation record.
778 assert!(ec_key_metadata.certificateChain.is_none());
779
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000780 check_key_authorizations(&ec_key_metadata.authorizations, &ec_gen_params);
Rajesh Nyamagoud4d483372022-02-09 01:38:23 +0000781 Ok(ec_key_metadata)
782}
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000783
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000784/// Imports above defined RSA key - `RSA_2048_KEY` and validates imported key parameters.
785pub fn import_rsa_2048_key(
786 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
787 domain: Domain,
788 nspace: i64,
789 alias: Option<String>,
790 import_params: AuthSetBuilder,
791) -> binder::Result<KeyMetadata> {
792 let key_metadata = sec_level
793 .importKey(
794 &KeyDescriptor { domain, nspace, alias, blob: None },
795 None,
796 &import_params,
797 0,
798 RSA_2048_KEY,
799 )
800 .unwrap();
801
802 assert!(key_metadata.certificate.is_some());
803 assert!(key_metadata.certificateChain.is_none());
804
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000805 check_key_authorizations(&key_metadata.authorizations, &import_params);
806
807 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000808 assert!(check_key_param(
809 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000810 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::RSA) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000811 ));
812
813 assert!(check_key_param(
814 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000815 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(2048) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000816 ));
817
818 assert!(check_key_param(
819 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000820 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000821 ));
822
823 assert!(check_key_param(
824 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000825 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000826 tag: Tag::RSA_PUBLIC_EXPONENT,
827 value: KeyParameterValue::LongInteger(65537)
828 }
829 ));
830
831 assert!(check_key_param(
832 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000833 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000834 tag: Tag::PADDING,
835 value: KeyParameterValue::PaddingMode(PaddingMode::RSA_PSS)
836 }
837 ));
838
839 assert!(check_key_param(
840 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000841 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000842 ));
843
844 Ok(key_metadata)
845}
846
847/// Imports above defined EC key - `EC_P_256_KEY` and validates imported key parameters.
848pub fn import_ec_p_256_key(
849 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
850 domain: Domain,
851 nspace: i64,
852 alias: Option<String>,
853 import_params: AuthSetBuilder,
854) -> binder::Result<KeyMetadata> {
855 let key_metadata = sec_level
856 .importKey(
857 &KeyDescriptor { domain, nspace, alias, blob: None },
858 None,
859 &import_params,
860 0,
861 EC_P_256_KEY,
862 )
863 .unwrap();
864
865 assert!(key_metadata.certificate.is_some());
866 assert!(key_metadata.certificateChain.is_none());
867
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000868 check_key_authorizations(&key_metadata.authorizations, &import_params);
869
870 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000871 assert!(check_key_param(
872 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000873 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::EC) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000874 ));
875
876 assert!(check_key_param(
877 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000878 &KeyParameter { tag: Tag::EC_CURVE, value: KeyParameterValue::EcCurve(EcCurve::P_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000879 ));
880
881 assert!(check_key_param(
882 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000883 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000884 ));
885 assert!(check_key_param(
886 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000887 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000888 ));
889
890 Ok(key_metadata)
891}
892
893/// Import sample AES key and validate its key parameters.
894pub fn import_aes_key(
895 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
896 domain: Domain,
897 nspace: i64,
898 alias: Option<String>,
899) -> binder::Result<KeyMetadata> {
900 static AES_KEY: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
901 let key_size = AES_KEY.len() * 8;
902
903 let import_params = AuthSetBuilder::new()
904 .no_auth_required()
905 .algorithm(Algorithm::AES)
906 .block_mode(BlockMode::ECB)
907 .key_size(key_size.try_into().unwrap())
908 .purpose(KeyPurpose::ENCRYPT)
909 .purpose(KeyPurpose::DECRYPT)
910 .padding_mode(PaddingMode::PKCS7);
911
912 let key_metadata = sec_level.importKey(
913 &KeyDescriptor { domain, nspace, alias, blob: None },
914 None,
915 &import_params,
916 0,
917 AES_KEY,
918 )?;
919
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000920 check_key_authorizations(&key_metadata.authorizations, &import_params);
921
922 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000923 assert!(check_key_param(
924 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000925 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::AES) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000926 ));
927 assert!(check_key_param(
928 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000929 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(128) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000930 ));
931 assert!(check_key_param(
932 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000933 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000934 tag: Tag::PADDING,
935 value: KeyParameterValue::PaddingMode(PaddingMode::PKCS7)
936 }
937 ));
938 assert!(check_key_param(
939 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000940 &KeyParameter { tag: Tag::BLOCK_MODE, value: KeyParameterValue::BlockMode(BlockMode::ECB) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000941 ));
942 assert!(check_key_param(
943 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000944 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000945 ));
946
947 Ok(key_metadata)
948}
949
950/// Import sample 3DES key and validate its key parameters.
951pub fn import_3des_key(
952 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
953 domain: Domain,
954 nspace: i64,
955 alias: Option<String>,
956) -> binder::Result<KeyMetadata> {
957 static TRIPLE_DES_KEY: &[u8] = &[
958 0xa4, 0x9d, 0x75, 0x64, 0x19, 0x9e, 0x97, 0xcb, 0x52, 0x9d, 0x2c, 0x9d, 0x97, 0xbf, 0x2f,
959 0x98, 0xd3, 0x5e, 0xdf, 0x57, 0xba, 0x1f, 0x73, 0x58,
960 ];
961
962 let import_params = AuthSetBuilder::new()
963 .no_auth_required()
964 .algorithm(Algorithm::TRIPLE_DES)
965 .block_mode(BlockMode::ECB)
966 .key_size(168)
967 .purpose(KeyPurpose::ENCRYPT)
968 .purpose(KeyPurpose::DECRYPT)
969 .padding_mode(PaddingMode::PKCS7);
970
971 let key_metadata = sec_level.importKey(
972 &KeyDescriptor { domain, nspace, alias, blob: None },
973 None,
974 &import_params,
975 0,
976 TRIPLE_DES_KEY,
977 )?;
978
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000979 check_key_authorizations(&key_metadata.authorizations, &import_params);
980
981 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000982 assert!(check_key_param(
983 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000984 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000985 tag: Tag::ALGORITHM,
986 value: KeyParameterValue::Algorithm(Algorithm::TRIPLE_DES)
987 }
988 ));
989 assert!(check_key_param(
990 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000991 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(168) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000992 ));
993 assert!(check_key_param(
994 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +0000995 &KeyParameter {
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +0000996 tag: Tag::PADDING,
997 value: KeyParameterValue::PaddingMode(PaddingMode::PKCS7)
998 }
999 ));
1000 assert!(check_key_param(
1001 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001002 &KeyParameter { tag: Tag::BLOCK_MODE, value: KeyParameterValue::BlockMode(BlockMode::ECB) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001003 ));
1004 assert!(check_key_param(
1005 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001006 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001007 ));
1008
1009 Ok(key_metadata)
1010}
1011
1012/// Import sample HMAC key and validate its key parameters.
1013pub fn import_hmac_key(
1014 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1015 domain: Domain,
1016 nspace: i64,
1017 alias: Option<String>,
1018) -> binder::Result<KeyMetadata> {
1019 static HMAC_KEY: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
1020 let key_size = HMAC_KEY.len() * 8;
1021
1022 let import_params = AuthSetBuilder::new()
1023 .no_auth_required()
1024 .algorithm(Algorithm::HMAC)
1025 .key_size(key_size.try_into().unwrap())
1026 .purpose(KeyPurpose::SIGN)
1027 .purpose(KeyPurpose::VERIFY)
1028 .digest(Digest::SHA_2_256)
1029 .min_mac_length(256);
1030
1031 let key_metadata = sec_level.importKey(
1032 &KeyDescriptor { domain, nspace, alias, blob: None },
1033 None,
1034 &import_params,
1035 0,
1036 HMAC_KEY,
1037 )?;
1038
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001039 check_key_authorizations(&key_metadata.authorizations, &import_params);
1040
1041 // Check below auths explicitly, they might not be addd in import parameters.
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001042 assert!(check_key_param(
1043 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001044 &KeyParameter { tag: Tag::ALGORITHM, value: KeyParameterValue::Algorithm(Algorithm::HMAC) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001045 ));
1046 assert!(check_key_param(
1047 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001048 &KeyParameter { tag: Tag::KEY_SIZE, value: KeyParameterValue::Integer(128) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001049 ));
1050 assert!(check_key_param(
1051 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001052 &KeyParameter { tag: Tag::DIGEST, value: KeyParameterValue::Digest(Digest::SHA_2_256) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001053 ));
1054 assert!(check_key_param(
1055 &key_metadata.authorizations,
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001056 &KeyParameter { tag: Tag::ORIGIN, value: KeyParameterValue::Origin(KeyOrigin::IMPORTED) }
Rajesh Nyamagoudb8402b62022-04-08 01:05:47 +00001057 ));
1058
1059 Ok(key_metadata)
1060}
Rajesh Nyamagoudc946cc42022-04-12 22:49:11 +00001061
1062/// Imports RSA encryption key with WRAP_KEY purpose.
1063pub fn import_wrapping_key(
1064 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1065 wrapping_key_data: &[u8],
1066 wrapping_key_alias: Option<String>,
1067) -> binder::Result<KeyMetadata> {
1068 let wrapping_key_params = AuthSetBuilder::new()
1069 .no_auth_required()
1070 .algorithm(Algorithm::RSA)
1071 .digest(Digest::SHA_2_256)
1072 .purpose(KeyPurpose::ENCRYPT)
1073 .purpose(KeyPurpose::DECRYPT)
1074 .purpose(KeyPurpose::WRAP_KEY)
1075 .padding_mode(PaddingMode::RSA_OAEP)
1076 .key_size(2048)
1077 .rsa_public_exponent(65537)
1078 .cert_not_before(0)
1079 .cert_not_after(253402300799000);
1080
1081 sec_level.importKey(
1082 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias: wrapping_key_alias, blob: None },
1083 None,
1084 &wrapping_key_params,
1085 0,
1086 wrapping_key_data,
1087 )
1088}
1089
1090/// Import wrapped key using given wrapping key.
1091pub fn import_wrapped_key(
1092 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1093 alias: Option<String>,
1094 wrapping_key_metadata: &KeyMetadata,
1095 wrapped_key: Option<Vec<u8>>,
1096) -> binder::Result<KeyMetadata> {
1097 let unwrap_params =
1098 AuthSetBuilder::new().digest(Digest::SHA_2_256).padding_mode(PaddingMode::RSA_OAEP);
1099
1100 let authenticator_spec: &[AuthenticatorSpec] = &[AuthenticatorSpec {
1101 authenticatorType: HardwareAuthenticatorType::NONE,
1102 authenticatorId: 0,
1103 }];
1104
1105 let key_metadata = sec_level.importWrappedKey(
1106 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: wrapped_key },
1107 &wrapping_key_metadata.key,
1108 None,
1109 &unwrap_params,
1110 authenticator_spec,
1111 )?;
1112
1113 Ok(key_metadata)
1114}
1115
1116/// Import wrapping key and then import wrapped key using wrapping key.
1117pub fn import_wrapping_key_and_wrapped_key(
1118 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1119 domain: Domain,
1120 nspace: i64,
1121 alias: Option<String>,
1122 wrapping_key_alias: Option<String>,
1123 wrapping_key_params: AuthSetBuilder,
1124) -> binder::Result<KeyMetadata> {
1125 let wrapping_key_metadata = sec_level.importKey(
1126 &KeyDescriptor { domain, nspace, alias: wrapping_key_alias, blob: None },
1127 None,
1128 &wrapping_key_params,
1129 0,
1130 WRAPPING_KEY,
1131 )?;
1132
1133 import_wrapped_key(sec_level, alias, &wrapping_key_metadata, Some(WRAPPED_KEY.to_vec()))
1134}
1135
1136/// Import given key material as AES-256-GCM-NONE transport key.
1137pub fn import_transport_key(
1138 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1139 transport_key_alias: Option<String>,
1140 transport_key: &[u8],
1141) -> binder::Result<KeyMetadata> {
1142 let transport_key_params = AuthSetBuilder::new()
1143 .no_auth_required()
1144 .algorithm(Algorithm::AES)
1145 .block_mode(BlockMode::GCM)
1146 .padding_mode(PaddingMode::NONE)
1147 .key_size(256)
1148 .caller_nonce()
1149 .min_mac_length(128)
1150 .purpose(KeyPurpose::ENCRYPT)
1151 .purpose(KeyPurpose::DECRYPT);
1152
1153 sec_level.importKey(
1154 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias: transport_key_alias, blob: None },
1155 None,
1156 &transport_key_params,
1157 0,
1158 transport_key,
1159 )
1160}
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001161
1162/// Generate EC key with purpose AGREE_KEY.
1163pub fn generate_ec_agree_key(
1164 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1165 ec_curve: EcCurve,
1166 digest: Digest,
1167 domain: Domain,
1168 nspace: i64,
1169 alias: Option<String>,
1170) -> binder::Result<KeyMetadata> {
1171 let gen_params = AuthSetBuilder::new()
1172 .no_auth_required()
1173 .algorithm(Algorithm::EC)
1174 .purpose(KeyPurpose::AGREE_KEY)
1175 .digest(digest)
1176 .ec_curve(ec_curve);
1177
1178 match sec_level.generateKey(
1179 &KeyDescriptor { domain, nspace, alias, blob: None },
1180 None,
1181 &gen_params,
1182 0,
1183 b"entropy",
1184 ) {
1185 Ok(key_metadata) => {
1186 assert!(key_metadata.certificate.is_some());
1187 if domain == Domain::BLOB {
1188 assert!(key_metadata.key.blob.is_some());
1189 }
1190
Rajesh Nyamagoudd0213ef2023-05-04 00:29:55 +00001191 check_key_authorizations(&key_metadata.authorizations, &gen_params);
Rajesh Nyamagoudaf050562022-11-11 01:56:45 +00001192 Ok(key_metadata)
1193 }
1194 Err(e) => Err(e),
1195 }
1196}
Rajesh Nyamagoud6a823492023-04-07 02:47:27 +00001197
1198/// Helper method to import AES keys `total_count` of times.
1199pub fn import_aes_keys(
1200 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1201 alias_prefix: String,
1202 total_count: Range<i32>,
1203) -> binder::Result<HashSet<String>> {
1204 let mut imported_key_aliases = HashSet::new();
1205
1206 // Import Total number of keys with given alias prefix.
1207 for count in total_count {
1208 let mut alias = String::new();
1209 write!(alias, "{}_{}", alias_prefix, count).unwrap();
1210 imported_key_aliases.insert(alias.clone());
1211
1212 import_aes_key(sec_level, Domain::APP, -1, Some(alias))?;
1213 }
1214
1215 Ok(imported_key_aliases)
1216}
Rajesh Nyamagouda42dee62022-04-22 21:15:55 +00001217
1218/// Generate attested EC-P_256 key with device id attestation.
1219pub fn generate_key_with_attest_id(
1220 sec_level: &binder::Strong<dyn IKeystoreSecurityLevel>,
1221 algorithm: Algorithm,
1222 alias: Option<String>,
1223 att_challenge: &[u8],
1224 attest_key: &KeyDescriptor,
1225 attest_id: Tag,
1226 value: Vec<u8>,
1227) -> binder::Result<KeyMetadata> {
1228 assert!(algorithm == Algorithm::RSA || algorithm == Algorithm::EC);
1229
1230 let mut ec_gen_params;
1231 if algorithm == Algorithm::EC {
1232 ec_gen_params = AuthSetBuilder::new()
1233 .no_auth_required()
1234 .algorithm(Algorithm::EC)
1235 .purpose(KeyPurpose::SIGN)
1236 .purpose(KeyPurpose::VERIFY)
1237 .digest(Digest::SHA_2_256)
1238 .ec_curve(EcCurve::P_256)
1239 .attestation_challenge(att_challenge.to_vec());
1240 } else {
1241 ec_gen_params = AuthSetBuilder::new()
1242 .no_auth_required()
1243 .algorithm(Algorithm::RSA)
1244 .rsa_public_exponent(65537)
1245 .key_size(2048)
1246 .purpose(KeyPurpose::SIGN)
1247 .purpose(KeyPurpose::VERIFY)
1248 .digest(Digest::SHA_2_256)
1249 .padding_mode(PaddingMode::RSA_PKCS1_1_5_SIGN)
1250 .attestation_challenge(att_challenge.to_vec());
1251 }
1252
1253 match attest_id {
1254 Tag::ATTESTATION_ID_BRAND => {
1255 ec_gen_params = ec_gen_params.attestation_device_brand(value);
1256 }
1257 Tag::ATTESTATION_ID_DEVICE => {
1258 ec_gen_params = ec_gen_params.attestation_device_name(value);
1259 }
1260 Tag::ATTESTATION_ID_PRODUCT => {
1261 ec_gen_params = ec_gen_params.attestation_device_product_name(value);
1262 }
1263 Tag::ATTESTATION_ID_SERIAL => {
1264 ec_gen_params = ec_gen_params.attestation_device_serial(value);
1265 }
1266 Tag::ATTESTATION_ID_MANUFACTURER => {
1267 ec_gen_params = ec_gen_params.attestation_device_manufacturer(value);
1268 }
1269 Tag::ATTESTATION_ID_MODEL => {
1270 ec_gen_params = ec_gen_params.attestation_device_model(value);
1271 }
1272 Tag::ATTESTATION_ID_IMEI => {
1273 ec_gen_params = ec_gen_params.attestation_device_imei(value);
1274 }
1275 Tag::ATTESTATION_ID_SECOND_IMEI => {
1276 ec_gen_params = ec_gen_params.attestation_device_second_imei(value);
1277 }
1278 _ => {
1279 panic!("Unknown attestation id");
1280 }
1281 }
1282
1283 sec_level.generateKey(
1284 &KeyDescriptor { domain: Domain::APP, nspace: -1, alias, blob: None },
1285 Some(attest_key),
1286 &ec_gen_params,
1287 0,
1288 b"entropy",
1289 )
1290}