blob: 7de9ffc7f3cc97d212322cce20d389c9bd0406c6 [file] [log] [blame]
Robert Berry76cf0832017-12-15 23:01:22 +00001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.server.locksettings.recoverablekeystore.storage;
18
Dmitry Dementyevad884712017-12-20 12:38:36 -080019import static com.google.common.truth.Truth.assertThat;
Brett Chabota26eda92018-07-23 13:08:30 -070020
Robert Berry76cf0832017-12-15 23:01:22 +000021import static org.junit.Assert.assertArrayEquals;
22import static org.junit.Assert.assertEquals;
23import static org.junit.Assert.assertNull;
24import static org.junit.Assert.assertTrue;
25
Brett Chabota26eda92018-07-23 13:08:30 -070026import android.content.Context;
27import android.security.keystore.recovery.RecoveryController;
28
29import androidx.test.InstrumentationRegistry;
30import androidx.test.filters.SmallTest;
31import androidx.test.runner.AndroidJUnit4;
32
33import com.android.server.locksettings.recoverablekeystore.TestData;
34import com.android.server.locksettings.recoverablekeystore.WrappedKey;
35
Robert Berry76cf0832017-12-15 23:01:22 +000036import org.junit.After;
37import org.junit.Before;
38import org.junit.Test;
39import org.junit.runner.RunWith;
40
Robert Berry76cf0832017-12-15 23:01:22 +000041import java.io.File;
42import java.nio.charset.StandardCharsets;
Bo Zhu5b81fa62017-12-21 14:36:11 -080043import java.security.KeyPairGenerator;
44import java.security.PublicKey;
45import java.security.spec.ECGenParameterSpec;
Dmitry Dementyev77183ef2018-01-05 15:46:00 -080046import java.util.List;
Robert Berry76cf0832017-12-15 23:01:22 +000047import java.util.Map;
48
49@SmallTest
50@RunWith(AndroidJUnit4.class)
51public class RecoverableKeyStoreDbTest {
52 private static final String DATABASE_FILE_NAME = "recoverablekeystore.db";
53
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -070054 private static final String TEST_ROOT_CERT_ALIAS = "trusted_root";
55 private static final String TEST_ROOT_CERT_ALIAS2 = "another_trusted_root";
56
Robert Berry76cf0832017-12-15 23:01:22 +000057 private RecoverableKeyStoreDb mRecoverableKeyStoreDb;
58 private File mDatabaseFile;
59
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -080060 private static final byte[] SERVER_PARAMS =
61 new byte[]{1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2};
62
63 private static final byte[] SERVER_PARAMS2 =
64 new byte[]{1, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4};
65
Robert Berry76cf0832017-12-15 23:01:22 +000066 @Before
67 public void setUp() {
68 Context context = InstrumentationRegistry.getTargetContext();
69 mDatabaseFile = context.getDatabasePath(DATABASE_FILE_NAME);
70 mRecoverableKeyStoreDb = RecoverableKeyStoreDb.newInstance(context);
71 }
72
73 @After
74 public void tearDown() {
75 mRecoverableKeyStoreDb.close();
76 mDatabaseFile.delete();
77 }
78
79 @Test
80 public void insertKey_replacesOldKey() {
81 int userId = 12;
Robert Berryb7c06ea2017-12-21 13:37:23 +000082 int uid = 10009;
Bo Zhu7ebcd662019-01-04 17:00:58 -080083 String alias = "test-alias";
Robert Berry76cf0832017-12-15 23:01:22 +000084
Bo Zhu7ebcd662019-01-04 17:00:58 -080085 byte[] nonce = getUtf8Bytes("nonce1");
86 byte[] keyMaterial = getUtf8Bytes("keymaterial1");
87 byte[] keyMetadata = null;
88 int generationId = 1;
89 WrappedKey wrappedKey = new WrappedKey(nonce, keyMaterial, keyMetadata, generationId);
90 mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKey);
Robert Berry76cf0832017-12-15 23:01:22 +000091
Robert Berryb7c06ea2017-12-21 13:37:23 +000092 WrappedKey retrievedKey = mRecoverableKeyStoreDb.getKey(uid, alias);
Robert Berry76cf0832017-12-15 23:01:22 +000093 assertArrayEquals(nonce, retrievedKey.getNonce());
94 assertArrayEquals(keyMaterial, retrievedKey.getKeyMaterial());
Bo Zhu7ebcd662019-01-04 17:00:58 -080095 assertArrayEquals(keyMetadata, retrievedKey.getKeyMetadata());
96 assertEquals(generationId, retrievedKey.getPlatformKeyGenerationId());
97
98 nonce = getUtf8Bytes("nonce2");
99 keyMaterial = getUtf8Bytes("keymaterial2");
100 keyMetadata = getUtf8Bytes("keymetadata2");
101 generationId = 2;
102 wrappedKey = new WrappedKey(nonce, keyMaterial, keyMetadata, generationId);
103 mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKey);
104
105 retrievedKey = mRecoverableKeyStoreDb.getKey(uid, alias);
106 assertArrayEquals(nonce, retrievedKey.getNonce());
107 assertArrayEquals(keyMaterial, retrievedKey.getKeyMaterial());
108 assertArrayEquals(keyMetadata, retrievedKey.getKeyMetadata());
109 assertEquals(generationId, retrievedKey.getPlatformKeyGenerationId());
Robert Berry76cf0832017-12-15 23:01:22 +0000110 }
111
112 @Test
Robert Berrybc088402017-12-18 13:10:41 +0000113 public void insertKey_allowsTwoUidsToHaveSameAlias() {
Robert Berryb7c06ea2017-12-21 13:37:23 +0000114 int userId = 6;
Robert Berrybc088402017-12-18 13:10:41 +0000115 String alias = "pcoulton";
116 WrappedKey key1 = new WrappedKey(
117 getUtf8Bytes("nonce1"),
118 getUtf8Bytes("key1"),
Bo Zhu7ebcd662019-01-04 17:00:58 -0800119 /*metadata=*/ null,
Robert Berrybc088402017-12-18 13:10:41 +0000120 /*platformKeyGenerationId=*/ 1);
121 WrappedKey key2 = new WrappedKey(
122 getUtf8Bytes("nonce2"),
123 getUtf8Bytes("key2"),
Bo Zhu7ebcd662019-01-04 17:00:58 -0800124 /*metadata=*/ null,
Robert Berrybc088402017-12-18 13:10:41 +0000125 /*platformKeyGenerationId=*/ 1);
126
Robert Berryb7c06ea2017-12-21 13:37:23 +0000127 mRecoverableKeyStoreDb.insertKey(userId, /*uid=*/ 1, alias, key1);
128 mRecoverableKeyStoreDb.insertKey(userId, /*uid=*/ 2, alias, key2);
Robert Berrybc088402017-12-18 13:10:41 +0000129
130 assertArrayEquals(
131 getUtf8Bytes("nonce1"),
132 mRecoverableKeyStoreDb.getKey(1, alias).getNonce());
133 assertArrayEquals(
134 getUtf8Bytes("nonce2"),
135 mRecoverableKeyStoreDb.getKey(2, alias).getNonce());
136 }
137
138 @Test
Robert Berry5daccec2018-01-06 19:16:25 +0000139 public void removeKey_removesAKey() {
140 int userId = 6;
141 int uid = 60001;
142 String alias = "rupertbates";
143 WrappedKey key = new WrappedKey(
144 getUtf8Bytes("nonce1"),
145 getUtf8Bytes("key1"),
Bo Zhu7ebcd662019-01-04 17:00:58 -0800146 /*metadata=*/ null,
Robert Berry5daccec2018-01-06 19:16:25 +0000147 /*platformKeyGenerationId=*/ 1);
148 mRecoverableKeyStoreDb.insertKey(userId, uid, alias, key);
149
150 assertTrue(mRecoverableKeyStoreDb.removeKey(uid, alias));
151
152 assertNull(mRecoverableKeyStoreDb.getKey(uid, alias));
153 }
154
155 @Test
Robert Berry76cf0832017-12-15 23:01:22 +0000156 public void getKey_returnsNullIfNoKey() {
157 WrappedKey key = mRecoverableKeyStoreDb.getKey(
158 /*userId=*/ 1, /*alias=*/ "hello");
159
160 assertNull(key);
161 }
162
163 @Test
164 public void getKey_returnsInsertedKey() {
165 int userId = 12;
Robert Berryb7c06ea2017-12-21 13:37:23 +0000166 int uid = 1009;
Robert Berry76cf0832017-12-15 23:01:22 +0000167 int generationId = 6;
Dmitry Dementyevad884712017-12-20 12:38:36 -0800168 int status = 120;
Robert Berry76cf0832017-12-15 23:01:22 +0000169 String alias = "test";
170 byte[] nonce = getUtf8Bytes("nonce");
171 byte[] keyMaterial = getUtf8Bytes("keymaterial");
Bo Zhu7ebcd662019-01-04 17:00:58 -0800172 byte[] keyMetadata = getUtf8Bytes("keymetametametadata");
173
174 WrappedKey wrappedKey = new WrappedKey(nonce, keyMaterial, keyMetadata, generationId, 120);
Robert Berryb7c06ea2017-12-21 13:37:23 +0000175 mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKey);
Robert Berry76cf0832017-12-15 23:01:22 +0000176
Robert Berryb7c06ea2017-12-21 13:37:23 +0000177 WrappedKey retrievedKey = mRecoverableKeyStoreDb.getKey(uid, alias);
Robert Berry76cf0832017-12-15 23:01:22 +0000178
179 assertArrayEquals(nonce, retrievedKey.getNonce());
180 assertArrayEquals(keyMaterial, retrievedKey.getKeyMaterial());
Bo Zhu7ebcd662019-01-04 17:00:58 -0800181 assertArrayEquals(keyMetadata, retrievedKey.getKeyMetadata());
Robert Berry67b228c2017-12-18 19:26:22 +0000182 assertEquals(generationId, retrievedKey.getPlatformKeyGenerationId());
Dmitry Dementyevad884712017-12-20 12:38:36 -0800183 assertEquals(status,retrievedKey.getRecoveryStatus());
Robert Berry76cf0832017-12-15 23:01:22 +0000184 }
185
186 @Test
187 public void getAllKeys_getsKeysWithUserIdAndGenerationId() {
188 int userId = 12;
Robert Berryb7c06ea2017-12-21 13:37:23 +0000189 int uid = 1009;
Robert Berry76cf0832017-12-15 23:01:22 +0000190 int generationId = 6;
Bo Zhu7ebcd662019-01-04 17:00:58 -0800191
192 String alias1 = "alias1";
193 byte[] nonce1 = getUtf8Bytes("nonce1");
194 byte[] keyMaterial1 = getUtf8Bytes("keymaterial1");
195 byte[] keyMetadata1 = getUtf8Bytes("keyallmetadata1");
196 WrappedKey wrappedKey1 = new WrappedKey(nonce1, keyMaterial1, keyMetadata1, generationId);
197 mRecoverableKeyStoreDb.insertKey(userId, uid, alias1, wrappedKey1);
198
199 String alias2 = "alias2";
200 byte[] nonce2 = getUtf8Bytes("nonce2");
201 byte[] keyMaterial2 = getUtf8Bytes("keymaterial2");
202 byte[] keyMetadata2 = null;
203 WrappedKey wrappedKey2 = new WrappedKey(nonce2, keyMaterial2, keyMetadata2, generationId);
204 mRecoverableKeyStoreDb.insertKey(userId, uid, alias2, wrappedKey2);
Robert Berry76cf0832017-12-15 23:01:22 +0000205
Dmitry Dementyev77183ef2018-01-05 15:46:00 -0800206 Map<String, WrappedKey> keys = mRecoverableKeyStoreDb.getAllKeys(userId, uid, generationId);
Bo Zhu7ebcd662019-01-04 17:00:58 -0800207 assertEquals(2, keys.size());
Robert Berry76cf0832017-12-15 23:01:22 +0000208
Bo Zhu7ebcd662019-01-04 17:00:58 -0800209 assertTrue(keys.containsKey(alias1));
210 WrappedKey retrievedKey1 = keys.get(alias1);
211 assertArrayEquals(nonce1, retrievedKey1.getNonce());
212 assertArrayEquals(keyMaterial1, retrievedKey1.getKeyMaterial());
213 assertArrayEquals(keyMetadata1, retrievedKey1.getKeyMetadata());
214 assertEquals(generationId, retrievedKey1.getPlatformKeyGenerationId());
215
216 assertTrue(keys.containsKey(alias2));
217 WrappedKey retrievedKey2 = keys.get(alias2);
218 assertArrayEquals(nonce2, retrievedKey2.getNonce());
219 assertArrayEquals(keyMaterial2, retrievedKey2.getKeyMaterial());
220 assertArrayEquals(keyMetadata2, retrievedKey2.getKeyMetadata());
221 assertEquals(generationId, retrievedKey2.getPlatformKeyGenerationId());
Robert Berry76cf0832017-12-15 23:01:22 +0000222 }
223
224 @Test
225 public void getAllKeys_doesNotReturnKeysWithBadGenerationId() {
226 int userId = 12;
Robert Berryb7c06ea2017-12-21 13:37:23 +0000227 int uid = 6000;
Robert Berry76cf0832017-12-15 23:01:22 +0000228 WrappedKey wrappedKey = new WrappedKey(
Robert Berry67b228c2017-12-18 19:26:22 +0000229 getUtf8Bytes("nonce"),
230 getUtf8Bytes("keymaterial"),
Bo Zhu7ebcd662019-01-04 17:00:58 -0800231 /*metadata=*/ null,
Robert Berry67b228c2017-12-18 19:26:22 +0000232 /*platformKeyGenerationId=*/ 5);
Robert Berry76cf0832017-12-15 23:01:22 +0000233 mRecoverableKeyStoreDb.insertKey(
Robert Berryb7c06ea2017-12-21 13:37:23 +0000234 userId, uid, /*alias=*/ "test", wrappedKey);
Robert Berry76cf0832017-12-15 23:01:22 +0000235
236 Map<String, WrappedKey> keys = mRecoverableKeyStoreDb.getAllKeys(
Dmitry Dementyev77183ef2018-01-05 15:46:00 -0800237 userId, uid, /*generationId=*/ 7);
Robert Berry76cf0832017-12-15 23:01:22 +0000238
239 assertTrue(keys.isEmpty());
240 }
241
242 @Test
243 public void getAllKeys_doesNotReturnKeysWithBadUserId() {
244 int generationId = 12;
Robert Berryb7c06ea2017-12-21 13:37:23 +0000245 int uid = 10009;
Robert Berry76cf0832017-12-15 23:01:22 +0000246 WrappedKey wrappedKey = new WrappedKey(
Bo Zhu7ebcd662019-01-04 17:00:58 -0800247 getUtf8Bytes("nonce"), getUtf8Bytes("keymaterial"), /*metadata=*/ null,
248 generationId);
Robert Berry76cf0832017-12-15 23:01:22 +0000249 mRecoverableKeyStoreDb.insertKey(
Robert Berryb7c06ea2017-12-21 13:37:23 +0000250 /*userId=*/ 1, uid, /*alias=*/ "test", wrappedKey);
Robert Berry76cf0832017-12-15 23:01:22 +0000251
252 Map<String, WrappedKey> keys = mRecoverableKeyStoreDb.getAllKeys(
Dmitry Dementyev77183ef2018-01-05 15:46:00 -0800253 /*userId=*/ 2, uid, generationId);
Robert Berry76cf0832017-12-15 23:01:22 +0000254
255 assertTrue(keys.isEmpty());
256 }
257
Robert Berrybc088402017-12-18 13:10:41 +0000258 @Test
259 public void getPlatformKeyGenerationId_returnsGenerationId() {
260 int userId = 42;
261 int generationId = 24;
262 mRecoverableKeyStoreDb.setPlatformKeyGenerationId(userId, generationId);
263
264 assertEquals(generationId, mRecoverableKeyStoreDb.getPlatformKeyGenerationId(userId));
265 }
266
267 @Test
268 public void getPlatformKeyGenerationId_returnsMinusOneIfNoEntry() {
269 assertEquals(-1, mRecoverableKeyStoreDb.getPlatformKeyGenerationId(42));
270 }
271
272 @Test
273 public void setPlatformKeyGenerationId_replacesOldEntry() {
274 int userId = 42;
275 mRecoverableKeyStoreDb.setPlatformKeyGenerationId(userId, 1);
276 mRecoverableKeyStoreDb.setPlatformKeyGenerationId(userId, 2);
277
278 assertEquals(2, mRecoverableKeyStoreDb.getPlatformKeyGenerationId(userId));
279 }
280
Dmitry Dementyevad884712017-12-20 12:38:36 -0800281 @Test
282 public void setRecoveryStatus_withSingleKey() {
283 int userId = 12;
284 int uid = 1009;
285 int generationId = 6;
286 int status = 120;
287 int status2 = 121;
288 String alias = "test";
289 byte[] nonce = getUtf8Bytes("nonce");
290 byte[] keyMaterial = getUtf8Bytes("keymaterial");
Bo Zhu7ebcd662019-01-04 17:00:58 -0800291 byte[] keyMetadata = null;
292
293 WrappedKey wrappedKey = new WrappedKey(nonce, keyMaterial, keyMetadata, generationId,
294 status);
Dmitry Dementyevad884712017-12-20 12:38:36 -0800295 mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKey);
296
297 WrappedKey retrievedKey = mRecoverableKeyStoreDb.getKey(uid, alias);
298 assertThat(retrievedKey.getRecoveryStatus()).isEqualTo(status);
299
300 mRecoverableKeyStoreDb.setRecoveryStatus(uid, alias, status2);
301
302 retrievedKey = mRecoverableKeyStoreDb.getKey(uid, alias);
303 assertThat(retrievedKey.getRecoveryStatus()).isEqualTo(status2);
304 }
305
306 @Test
307 public void getStatusForAllKeys_with3Keys() {
308 int userId = 12;
309 int uid = 1009;
310 int generationId = 6;
311 int status = 120;
312 int status2 = 121;
313 String alias = "test";
314 String alias2 = "test2";
315 String alias3 = "test3";
316 byte[] nonce = getUtf8Bytes("nonce");
317 byte[] keyMaterial = getUtf8Bytes("keymaterial");
Bo Zhu7ebcd662019-01-04 17:00:58 -0800318 byte[] keyMetadata = null;
Dmitry Dementyevad884712017-12-20 12:38:36 -0800319
Bo Zhu7ebcd662019-01-04 17:00:58 -0800320 WrappedKey wrappedKey = new WrappedKey(nonce, keyMaterial, keyMetadata, generationId,
321 status);
Dmitry Dementyevad884712017-12-20 12:38:36 -0800322 mRecoverableKeyStoreDb.insertKey(userId, uid, alias2, wrappedKey);
Bo Zhu7ebcd662019-01-04 17:00:58 -0800323 WrappedKey wrappedKey2 = new WrappedKey(nonce, keyMaterial, keyMetadata, generationId,
324 status);
325 mRecoverableKeyStoreDb.insertKey(userId, uid, alias3, wrappedKey2);
326 WrappedKey wrappedKeyWithDefaultStatus = new WrappedKey(nonce, keyMaterial, keyMetadata,
327 generationId);
Dmitry Dementyevad884712017-12-20 12:38:36 -0800328 mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKeyWithDefaultStatus);
329
330 Map<String, Integer> statuses = mRecoverableKeyStoreDb.getStatusForAllKeys(uid);
331 assertThat(statuses).hasSize(3);
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -0700332 assertThat(statuses).containsEntry(alias,
333 RecoveryController.RECOVERY_STATUS_SYNC_IN_PROGRESS);
Dmitry Dementyevad884712017-12-20 12:38:36 -0800334 assertThat(statuses).containsEntry(alias2, status);
335 assertThat(statuses).containsEntry(alias3, status);
336
337 int updates = mRecoverableKeyStoreDb.setRecoveryStatus(uid, alias, status2);
338 assertThat(updates).isEqualTo(1);
339 updates = mRecoverableKeyStoreDb.setRecoveryStatus(uid, alias3, status2);
340 assertThat(updates).isEqualTo(1);
341 statuses = mRecoverableKeyStoreDb.getStatusForAllKeys(uid);
342
343 assertThat(statuses).hasSize(3);
344 assertThat(statuses).containsEntry(alias, status2); // updated from default
345 assertThat(statuses).containsEntry(alias2, status);
346 assertThat(statuses).containsEntry(alias3, status2); // updated
347 }
348
349 @Test
350 public void setRecoveryStatus_withEmptyDatabase() throws Exception{
351 int uid = 1009;
352 String alias = "test";
353 int status = 120;
354 int updates = mRecoverableKeyStoreDb.setRecoveryStatus(uid, alias, status);
355 assertThat(updates).isEqualTo(0); // database was empty
356 }
357
358
359 @Test
360 public void getStatusForAllKeys_withEmptyDatabase() {
361 int uid = 1009;
362 Map<String, Integer> statuses = mRecoverableKeyStoreDb.getStatusForAllKeys(uid);
363 assertThat(statuses).hasSize(0);
364 }
365
Andreas Gampebd666412018-02-19 10:47:28 -0800366 @Test
Dmitry Dementyev3f2d1712018-01-24 11:11:40 -0800367 public void testInvalidateKeysWithOldGenerationId_withSingleKey() {
368 int userId = 12;
369 int uid = 1009;
370 int generationId = 6;
371 int status = 120;
372 int status2 = 121;
373 String alias = "test";
374 byte[] nonce = getUtf8Bytes("nonce");
375 byte[] keyMaterial = getUtf8Bytes("keymaterial");
Bo Zhu7ebcd662019-01-04 17:00:58 -0800376 byte[] keyMetadata = null;
377
378 WrappedKey wrappedKey = new WrappedKey(nonce, keyMaterial, keyMetadata, generationId,
379 status);
Dmitry Dementyev3f2d1712018-01-24 11:11:40 -0800380 mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKey);
381
382 WrappedKey retrievedKey = mRecoverableKeyStoreDb.getKey(uid, alias);
383 assertThat(retrievedKey.getRecoveryStatus()).isEqualTo(status);
384
385 mRecoverableKeyStoreDb.setRecoveryStatus(uid, alias, status2);
386 mRecoverableKeyStoreDb.invalidateKeysWithOldGenerationId(userId, generationId + 1);
387
388 retrievedKey = mRecoverableKeyStoreDb.getKey(uid, alias);
389 assertThat(retrievedKey.getRecoveryStatus())
390 .isEqualTo(RecoveryController.RECOVERY_STATUS_PERMANENT_FAILURE);
391 }
392
Bo Zhu5b81fa62017-12-21 14:36:11 -0800393 @Test
Aseem Kumar3326da52018-03-12 18:05:16 -0700394 public void testInvalidateKeysForUserIdOnCustomScreenLock() {
395 int userId = 12;
396 int uid = 1009;
397 int generationId = 6;
398 int status = 120;
399 int status2 = 121;
400 String alias = "test";
401 byte[] nonce = getUtf8Bytes("nonce");
402 byte[] keyMaterial = getUtf8Bytes("keymaterial");
Bo Zhu7ebcd662019-01-04 17:00:58 -0800403 byte[] keyMetadata = null;
404
405 WrappedKey wrappedKey = new WrappedKey(nonce, keyMaterial, keyMetadata, generationId,
406 status);
Aseem Kumar3326da52018-03-12 18:05:16 -0700407 mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKey);
408
409 WrappedKey retrievedKey = mRecoverableKeyStoreDb.getKey(uid, alias);
410 assertThat(retrievedKey.getRecoveryStatus()).isEqualTo(status);
411
412 mRecoverableKeyStoreDb.setRecoveryStatus(uid, alias, status2);
413 mRecoverableKeyStoreDb.invalidateKeysForUserIdOnCustomScreenLock(userId);
414
415 retrievedKey = mRecoverableKeyStoreDb.getKey(uid, alias);
416 assertThat(retrievedKey.getRecoveryStatus())
417 .isEqualTo(RecoveryController.RECOVERY_STATUS_PERMANENT_FAILURE);
418 }
419
420 @Test
Bo Zhu5b81fa62017-12-21 14:36:11 -0800421 public void setRecoveryServicePublicKey_replaceOldKey() throws Exception {
422 int userId = 12;
423 int uid = 10009;
424 PublicKey pubkey1 = genRandomPublicKey();
425 PublicKey pubkey2 = genRandomPublicKey();
426 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid, pubkey1);
427 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid, pubkey2);
428 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid)).isEqualTo(
429 pubkey2);
430 }
431
432 @Test
Bo Zhu584b923f2017-12-22 16:05:15 -0800433 public void getRecoveryServicePublicKey_returnsNullIfNoKey() throws Exception {
434 int userId = 12;
435 int uid = 10009;
436 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid)).isNull();
437
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800438 mRecoverableKeyStoreDb.setServerParams(userId, uid, SERVER_PARAMS);
Bo Zhu584b923f2017-12-22 16:05:15 -0800439 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid)).isNull();
440 }
441
442 @Test
443 public void getRecoveryServicePublicKey_returnsInsertedKey() throws Exception {
444 int userId = 12;
Bo Zhu5b81fa62017-12-21 14:36:11 -0800445 int uid = 10009;
446 PublicKey pubkey = genRandomPublicKey();
Bo Zhu584b923f2017-12-22 16:05:15 -0800447 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid, pubkey);
448 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid)).isEqualTo(
Bo Zhu5b81fa62017-12-21 14:36:11 -0800449 pubkey);
450 }
451
Andreas Gampebd666412018-02-19 10:47:28 -0800452 @Test
Bo Zhu14d993d2018-02-03 21:38:48 -0800453 public void setRecoveryServiceCertPath_replaceOldValue() throws Exception {
454 int userId = 12;
455 int uid = 10009;
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -0700456 mRecoverableKeyStoreDb.setRecoveryServiceCertPath(userId, uid, TEST_ROOT_CERT_ALIAS,
457 TestData.CERT_PATH_1);
458 mRecoverableKeyStoreDb.setRecoveryServiceCertPath(userId, uid, TEST_ROOT_CERT_ALIAS,
Bo Zhu14d993d2018-02-03 21:38:48 -0800459 TestData.CERT_PATH_2);
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -0700460 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
461 TEST_ROOT_CERT_ALIAS)).isEqualTo(TestData.CERT_PATH_2);
462 }
463
464 @Test
465 public void setRecoveryServiceCertPath_updateValuesForCorrectRootCert() throws Exception {
466 int userId = 12;
467 int uid = 10009;
468 mRecoverableKeyStoreDb.setRecoveryServiceCertPath(userId, uid, TEST_ROOT_CERT_ALIAS,
469 TestData.CERT_PATH_1);
470 mRecoverableKeyStoreDb.setRecoveryServiceCertPath(userId, uid, TEST_ROOT_CERT_ALIAS2,
471 TestData.CERT_PATH_1);
472
473 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
474 TEST_ROOT_CERT_ALIAS)).isEqualTo(TestData.CERT_PATH_1);
475 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
476 TEST_ROOT_CERT_ALIAS2)).isEqualTo(TestData.CERT_PATH_1);
477
478 mRecoverableKeyStoreDb.setRecoveryServiceCertPath(userId, uid, TEST_ROOT_CERT_ALIAS2,
479 TestData.CERT_PATH_2);
480
481 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
482 TEST_ROOT_CERT_ALIAS)).isEqualTo(TestData.CERT_PATH_1);
483 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
484 TEST_ROOT_CERT_ALIAS2)).isEqualTo(TestData.CERT_PATH_2);
Bo Zhu14d993d2018-02-03 21:38:48 -0800485 }
486
487 @Test
488 public void getRecoveryServiceCertPath_returnsNullIfNoValue() throws Exception {
489 int userId = 12;
490 int uid = 10009;
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -0700491 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
492 TEST_ROOT_CERT_ALIAS)).isNull();
Bo Zhu14d993d2018-02-03 21:38:48 -0800493 }
494
495 @Test
496 public void getRecoveryServiceCertPath_returnsInsertedValue() throws Exception {
497 int userId = 12;
498 int uid = 10009;
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -0700499 mRecoverableKeyStoreDb.setRecoveryServiceCertPath(userId, uid, TEST_ROOT_CERT_ALIAS,
Bo Zhu14d993d2018-02-03 21:38:48 -0800500 TestData.CERT_PATH_1);
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -0700501 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
502 TEST_ROOT_CERT_ALIAS)).isEqualTo(TestData.CERT_PATH_1);
Bo Zhu14d993d2018-02-03 21:38:48 -0800503 }
504
505 @Test
506 public void setRecoveryServiceCertSerial_replaceOldValue() throws Exception {
507 int userId = 12;
508 int uid = 10009;
509
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -0700510 mRecoverableKeyStoreDb.setRecoveryServiceCertSerial(userId, uid, TEST_ROOT_CERT_ALIAS, 1L);
511 mRecoverableKeyStoreDb.setRecoveryServiceCertSerial(userId, uid, TEST_ROOT_CERT_ALIAS, 3L);
512 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
513 TEST_ROOT_CERT_ALIAS)).isEqualTo(3L);
514 }
515
516 @Test
517 public void setRecoveryServiceCertSerial_updateValuesForCorrectRootCert() throws Exception {
518 int userId = 12;
519 int uid = 10009;
520 mRecoverableKeyStoreDb.setRecoveryServiceCertSerial(userId, uid, TEST_ROOT_CERT_ALIAS, 1L);
521 mRecoverableKeyStoreDb.setRecoveryServiceCertSerial(userId, uid, TEST_ROOT_CERT_ALIAS2, 1L);
522
523 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
524 TEST_ROOT_CERT_ALIAS)).isEqualTo(1L);
525 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
526 TEST_ROOT_CERT_ALIAS2)).isEqualTo(1L);
527
528 mRecoverableKeyStoreDb.setRecoveryServiceCertSerial(userId, uid, TEST_ROOT_CERT_ALIAS2, 3L);
529
530 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
531 TEST_ROOT_CERT_ALIAS)).isEqualTo(1L);
532 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
533 TEST_ROOT_CERT_ALIAS2)).isEqualTo(3L);
Bo Zhu14d993d2018-02-03 21:38:48 -0800534 }
535
536 @Test
537 public void getRecoveryServiceCertSerial_returnsNullIfNoValue() throws Exception {
538 int userId = 12;
539 int uid = 10009;
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -0700540 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
541 TEST_ROOT_CERT_ALIAS)).isNull();
542 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
543 TEST_ROOT_CERT_ALIAS2)).isNull();
Bo Zhu14d993d2018-02-03 21:38:48 -0800544 }
545
546 @Test
547 public void getRecoveryServiceCertSerial_returnsInsertedValue() throws Exception {
548 int userId = 12;
549 int uid = 10009;
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -0700550 mRecoverableKeyStoreDb.setRecoveryServiceCertSerial(userId, uid,
551 TEST_ROOT_CERT_ALIAS, 1234L);
552 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
553 TEST_ROOT_CERT_ALIAS)).isEqualTo(1234L);
Bo Zhu14d993d2018-02-03 21:38:48 -0800554 }
555
Bo Zhu5b81fa62017-12-21 14:36:11 -0800556 @Test
Dmitry Dementyev77183ef2018-01-05 15:46:00 -0800557 public void getRecoveryAgents_returnsUidIfSet() throws Exception {
Robert Berry91044042017-12-27 12:05:58 +0000558 int userId = 12;
559 int uid = 190992;
560 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid, genRandomPublicKey());
561
Dmitry Dementyev77183ef2018-01-05 15:46:00 -0800562 assertThat(mRecoverableKeyStoreDb.getRecoveryAgents(userId)).contains(uid);
Robert Berry91044042017-12-27 12:05:58 +0000563 }
564
565 @Test
Dmitry Dementyev77183ef2018-01-05 15:46:00 -0800566 public void getRecoveryAgents_returnsEmptyListIfThereAreNoAgents() throws Exception {
567 int userId = 12;
568 assertThat(mRecoverableKeyStoreDb.getRecoveryAgents(userId)).isEmpty();
569 assertThat(mRecoverableKeyStoreDb.getRecoveryAgents(userId)).isNotNull();
570 }
571
572 @Test
573 public void getRecoveryAgents_withTwoAgents() throws Exception {
574 int userId = 12;
575 int uid1 = 190992;
576 int uid2 = 190993;
577 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid1, genRandomPublicKey());
578 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid2, genRandomPublicKey());
579 List<Integer> agents = mRecoverableKeyStoreDb.getRecoveryAgents(userId);
580
581 assertThat(agents).hasSize(2);
582 assertThat(agents).contains(uid1);
583 assertThat(agents).contains(uid2);
Robert Berry91044042017-12-27 12:05:58 +0000584 }
585
Andreas Gampebd666412018-02-19 10:47:28 -0800586 @Test
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -0700587 public void setActiveRootOfTrust_emptyDefaultValue() throws Exception {
588 int userId = 12;
589 int uid = 10009;
590 assertThat(mRecoverableKeyStoreDb.getActiveRootOfTrust(userId, uid)).isEqualTo(null);
591 }
592
593 @Test
594 public void setActiveRootOfTrust_updateValue() throws Exception {
595 int userId = 12;
596 int uid = 10009;
597 mRecoverableKeyStoreDb.setActiveRootOfTrust(userId, uid, "root");
598 assertThat(mRecoverableKeyStoreDb.getActiveRootOfTrust(userId, uid)).isEqualTo("root");
599
600 mRecoverableKeyStoreDb.setActiveRootOfTrust(userId, uid, "root2");
601 assertThat(mRecoverableKeyStoreDb.getActiveRootOfTrust(userId, uid)).isEqualTo("root2");
602 }
603
604 @Test
Dmitry Dementyevbdfdf532017-12-27 11:58:45 -0800605 public void setRecoverySecretTypes_emptyDefaultValue() throws Exception {
606 int userId = 12;
607 int uid = 10009;
608 assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid)).isEqualTo(
609 new int[]{}); // default
610 }
611
612 @Test
613 public void setRecoverySecretTypes_updateValue() throws Exception {
614 int userId = 12;
615 int uid = 10009;
616 int[] types1 = new int[]{1};
617 int[] types2 = new int[]{2};
618
619 mRecoverableKeyStoreDb.setRecoverySecretTypes(userId, uid, types1);
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -0700620 assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid)).isEqualTo(types1);
Dmitry Dementyevbdfdf532017-12-27 11:58:45 -0800621 mRecoverableKeyStoreDb.setRecoverySecretTypes(userId, uid, types2);
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -0700622 assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid)).isEqualTo(types2);
Dmitry Dementyevbdfdf532017-12-27 11:58:45 -0800623 }
624
625 @Test
626 public void setRecoverySecretTypes_withMultiElementArrays() throws Exception {
627 int userId = 12;
628 int uid = 10009;
629 int[] types1 = new int[]{11, 2000};
630 int[] types2 = new int[]{1, 2, 3};
631 int[] types3 = new int[]{};
632
633 mRecoverableKeyStoreDb.setRecoverySecretTypes(userId, uid, types1);
634 assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid)).isEqualTo(
635 types1);
636 mRecoverableKeyStoreDb.setRecoverySecretTypes(userId, uid, types2);
637 assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid)).isEqualTo(
638 types2);
639 mRecoverableKeyStoreDb.setRecoverySecretTypes(userId, uid, types3);
640 assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid)).isEqualTo(
641 types3);
642 }
643
644 @Test
645 public void setRecoverySecretTypes_withDifferentUid() throws Exception {
646 int userId = 12;
647 int uid1 = 10011;
648 int uid2 = 10012;
649 int[] types1 = new int[]{1};
650 int[] types2 = new int[]{2};
651
652 mRecoverableKeyStoreDb.setRecoverySecretTypes(userId, uid1, types1);
653 mRecoverableKeyStoreDb.setRecoverySecretTypes(userId, uid2, types2);
654 assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid1)).isEqualTo(
655 types1);
656 assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid2)).isEqualTo(
657 types2);
658 }
659
660 @Test
661 public void setRecoveryServiceMetadataMethods() throws Exception {
662 int userId = 12;
663 int uid = 10009;
664
665 PublicKey pubkey1 = genRandomPublicKey();
666 int[] types1 = new int[]{1};
Dmitry Dementyevbdfdf532017-12-27 11:58:45 -0800667
668 PublicKey pubkey2 = genRandomPublicKey();
669 int[] types2 = new int[]{2};
Dmitry Dementyevbdfdf532017-12-27 11:58:45 -0800670
671 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid, pubkey1);
672 mRecoverableKeyStoreDb.setRecoverySecretTypes(userId, uid, types1);
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800673 mRecoverableKeyStoreDb.setServerParams(userId, uid, SERVER_PARAMS);
Dmitry Dementyevbdfdf532017-12-27 11:58:45 -0800674
675 assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid)).isEqualTo(
676 types1);
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800677 assertThat(mRecoverableKeyStoreDb.getServerParams(userId, uid)).isEqualTo(
678 SERVER_PARAMS);
Dmitry Dementyevbdfdf532017-12-27 11:58:45 -0800679 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid)).isEqualTo(
680 pubkey1);
681
682 // Check that the methods don't interfere with each other.
683 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid, pubkey2);
684 mRecoverableKeyStoreDb.setRecoverySecretTypes(userId, uid, types2);
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800685 mRecoverableKeyStoreDb.setServerParams(userId, uid, SERVER_PARAMS2);
Dmitry Dementyevbdfdf532017-12-27 11:58:45 -0800686
687 assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid)).isEqualTo(
688 types2);
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800689 assertThat(mRecoverableKeyStoreDb.getServerParams(userId, uid)).isEqualTo(
690 SERVER_PARAMS2);
Dmitry Dementyevbdfdf532017-12-27 11:58:45 -0800691 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid)).isEqualTo(
692 pubkey2);
693 }
694
Robert Berry91044042017-12-27 12:05:58 +0000695 @Test
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800696 public void setServerParams_replaceOldValue() throws Exception {
Bo Zhu584b923f2017-12-22 16:05:15 -0800697 int userId = 12;
698 int uid = 10009;
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800699
700 mRecoverableKeyStoreDb.setServerParams(userId, uid, SERVER_PARAMS);
701 mRecoverableKeyStoreDb.setServerParams(userId, uid, SERVER_PARAMS2);
702 assertThat(mRecoverableKeyStoreDb.getServerParams(userId, uid)).isEqualTo(
703 SERVER_PARAMS2);
Bo Zhu584b923f2017-12-22 16:05:15 -0800704 }
705
706 @Test
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800707 public void getServerParams_returnsNullIfNoValue() throws Exception {
Bo Zhu584b923f2017-12-22 16:05:15 -0800708 int userId = 12;
709 int uid = 10009;
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800710 assertThat(mRecoverableKeyStoreDb.getServerParams(userId, uid)).isNull();
Bo Zhu584b923f2017-12-22 16:05:15 -0800711
712 PublicKey pubkey = genRandomPublicKey();
713 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid, pubkey);
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800714 assertThat(mRecoverableKeyStoreDb.getServerParams(userId, uid)).isNull();
Bo Zhu584b923f2017-12-22 16:05:15 -0800715 }
716
717 @Test
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800718 public void getServerParams_returnsInsertedValue() throws Exception {
Bo Zhu584b923f2017-12-22 16:05:15 -0800719 int userId = 12;
720 int uid = 10009;
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800721 mRecoverableKeyStoreDb.setServerParams(userId, uid, SERVER_PARAMS);
722 assertThat(mRecoverableKeyStoreDb.getServerParams(userId, uid)).isEqualTo(SERVER_PARAMS);
Bo Zhu584b923f2017-12-22 16:05:15 -0800723 }
724
725 @Test
Dmitry Dementyev77183ef2018-01-05 15:46:00 -0800726 public void setCounterId_defaultValueAndTwoUpdates() throws Exception {
727 int userId = 12;
728 int uid = 10009;
729 long value1 = 111L;
730 long value2 = 222L;
731 assertThat(mRecoverableKeyStoreDb.getCounterId(userId, uid)).isNull();
732
733 mRecoverableKeyStoreDb.setCounterId(userId, uid, value1);
734 assertThat(mRecoverableKeyStoreDb.getCounterId(userId, uid)).isEqualTo(
735 value1);
736
737 mRecoverableKeyStoreDb.setCounterId(userId, uid, value2);
738 assertThat(mRecoverableKeyStoreDb.getCounterId(userId, uid)).isEqualTo(
739 value2);
740 }
741
742 @Test
743 public void setSnapshotVersion_defaultValueAndTwoUpdates() throws Exception {
744 int userId = 12;
745 int uid = 10009;
746 long value1 = 111L;
747 long value2 = 222L;
748 assertThat(mRecoverableKeyStoreDb.getSnapshotVersion(userId, uid)).isNull();
749 mRecoverableKeyStoreDb.setSnapshotVersion(userId, uid, value1);
750 assertThat(mRecoverableKeyStoreDb.getSnapshotVersion(userId, uid)).isEqualTo(
751 value1);
752 mRecoverableKeyStoreDb.setSnapshotVersion(userId, uid, value2);
753 assertThat(mRecoverableKeyStoreDb.getSnapshotVersion(userId, uid)).isEqualTo(
754 value2);
755 }
756
757 @Test
758 public void setShouldCreateSnapshot_defaultValueAndTwoUpdates() throws Exception {
759 int userId = 12;
760 int uid = 10009;
761 boolean value1 = true;
762 boolean value2 = false;
763 assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isEqualTo(false);
764 mRecoverableKeyStoreDb.setShouldCreateSnapshot(userId, uid, value1);
765 assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isEqualTo(value1);
766 mRecoverableKeyStoreDb.setShouldCreateSnapshot(userId, uid, value2);
767 assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isEqualTo(
768 value2);
769 }
770
771 @Test
Bo Zhu584b923f2017-12-22 16:05:15 -0800772 public void setRecoveryServiceMetadataEntry_allowsAUserToHaveTwoUids() throws Exception {
Bo Zhu5b81fa62017-12-21 14:36:11 -0800773 int userId = 12;
774 int uid1 = 10009;
775 int uid2 = 20009;
776 PublicKey pubkey = genRandomPublicKey();
777 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid1, pubkey);
778 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid2, pubkey);
779 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid1)).isEqualTo(
780 pubkey);
781 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid2)).isEqualTo(
782 pubkey);
783 }
784
785 @Test
Bo Zhu584b923f2017-12-22 16:05:15 -0800786 public void setRecoveryServiceMetadataEntry_allowsTwoUsersToHaveTheSameUid() throws Exception {
787 int userId1 = 12;
788 int userId2 = 23;
Bo Zhu5b81fa62017-12-21 14:36:11 -0800789 int uid = 10009;
Bo Zhu584b923f2017-12-22 16:05:15 -0800790 PublicKey pubkey = genRandomPublicKey();
791 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId1, uid, pubkey);
792 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId2, uid, pubkey);
793 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId1, uid)).isEqualTo(
794 pubkey);
795 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId2, uid)).isEqualTo(
796 pubkey);
Bo Zhu5b81fa62017-12-21 14:36:11 -0800797 }
798
799 @Test
Bo Zhu584b923f2017-12-22 16:05:15 -0800800 public void setRecoveryServiceMetadataEntry_updatesColumnsSeparately() throws Exception {
Bo Zhu5b81fa62017-12-21 14:36:11 -0800801 int userId = 12;
802 int uid = 10009;
Bo Zhu584b923f2017-12-22 16:05:15 -0800803 PublicKey pubkey1 = genRandomPublicKey();
804 PublicKey pubkey2 = genRandomPublicKey();
Bo Zhu584b923f2017-12-22 16:05:15 -0800805
806 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid, pubkey1);
Bo Zhu5b81fa62017-12-21 14:36:11 -0800807 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid)).isEqualTo(
Bo Zhu584b923f2017-12-22 16:05:15 -0800808 pubkey1);
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800809 assertThat(mRecoverableKeyStoreDb.getServerParams(userId, uid)).isNull();
Bo Zhu584b923f2017-12-22 16:05:15 -0800810
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800811 mRecoverableKeyStoreDb.setServerParams(userId, uid, SERVER_PARAMS);
Bo Zhu584b923f2017-12-22 16:05:15 -0800812 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid)).isEqualTo(
813 pubkey1);
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800814 assertThat(mRecoverableKeyStoreDb.getServerParams(userId, uid)).isEqualTo(SERVER_PARAMS);
Bo Zhu584b923f2017-12-22 16:05:15 -0800815
816 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid, pubkey2);
817 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid)).isEqualTo(
818 pubkey2);
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800819 assertThat(mRecoverableKeyStoreDb.getServerParams(userId, uid)).isEqualTo(SERVER_PARAMS);
Bo Zhu5b81fa62017-12-21 14:36:11 -0800820 }
821
Robert Berry76cf0832017-12-15 23:01:22 +0000822 private static byte[] getUtf8Bytes(String s) {
823 return s.getBytes(StandardCharsets.UTF_8);
824 }
Bo Zhu5b81fa62017-12-21 14:36:11 -0800825
826 private static PublicKey genRandomPublicKey() throws Exception {
827 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");
828 keyPairGenerator.initialize(new ECGenParameterSpec("secp256r1"));
829 return keyPairGenerator.generateKeyPair().getPublic();
830 }
Robert Berry76cf0832017-12-15 23:01:22 +0000831}