blob: 932a769c86bc4f2c2f3c3a38fb1b7594e800a1a5 [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
Dmitry Dementyev89f12d52019-02-28 12:26:01 -0800282 public void getUserSerialNumbers_returnsSerialNumbers() {
283 int userId = 42;
284 int userId2 = 44;
285 Long serialNumber = 24L;
286 Long serialNumber2 = 25L;
287 mRecoverableKeyStoreDb.setUserSerialNumber(userId, serialNumber);
288 mRecoverableKeyStoreDb.setUserSerialNumber(userId2, serialNumber2);
289
290 assertEquals(2, mRecoverableKeyStoreDb.getUserSerialNumbers().size());
291 assertEquals(serialNumber, mRecoverableKeyStoreDb.getUserSerialNumbers().get(userId));
292 assertEquals(serialNumber2, mRecoverableKeyStoreDb.getUserSerialNumbers().get(userId2));
293 }
294
295 @Test
296 public void getUserSerialNumbers_returnsMinusOneIfNoEntry() {
297 int userId = 42;
298 int generationId = 24;
299 Long serialNumber = -1L;
300 // Don't set serial number
301 mRecoverableKeyStoreDb.setPlatformKeyGenerationId(userId, generationId);
302
303 assertEquals(1, mRecoverableKeyStoreDb.getUserSerialNumbers().size());
304 assertEquals(serialNumber, mRecoverableKeyStoreDb.getUserSerialNumbers().get(userId));
305 }
306
307 @Test
308 public void removeUserFromAllTables_removesData() throws Exception {
309 int userId = 12;
310 int generationId = 24;
311 int[] types = new int[]{1};
312 int uid = 10009;
313 mRecoverableKeyStoreDb.setRecoveryServiceCertSerial(userId, uid,
314 TEST_ROOT_CERT_ALIAS, 1234L);
315 mRecoverableKeyStoreDb.setPlatformKeyGenerationId(userId, generationId);
316 mRecoverableKeyStoreDb.setActiveRootOfTrust(userId, uid, "root");
317 mRecoverableKeyStoreDb.setRecoverySecretTypes(userId, uid, types);
318
319 mRecoverableKeyStoreDb.removeUserFromAllTables(userId);
320
321 // RootOfTrust
322 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
323 TEST_ROOT_CERT_ALIAS)).isNull();
324 // UserMetadata
325 assertThat(mRecoverableKeyStoreDb.getPlatformKeyGenerationId(userId)).isEqualTo(-1);
326 // RecoveryServiceMetadata
327 assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid)).isEmpty();
328 }
329
330 @Test
Dmitry Dementyevad884712017-12-20 12:38:36 -0800331 public void setRecoveryStatus_withSingleKey() {
332 int userId = 12;
333 int uid = 1009;
334 int generationId = 6;
335 int status = 120;
336 int status2 = 121;
337 String alias = "test";
338 byte[] nonce = getUtf8Bytes("nonce");
339 byte[] keyMaterial = getUtf8Bytes("keymaterial");
Bo Zhu7ebcd662019-01-04 17:00:58 -0800340 byte[] keyMetadata = null;
341
342 WrappedKey wrappedKey = new WrappedKey(nonce, keyMaterial, keyMetadata, generationId,
343 status);
Dmitry Dementyevad884712017-12-20 12:38:36 -0800344 mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKey);
345
346 WrappedKey retrievedKey = mRecoverableKeyStoreDb.getKey(uid, alias);
347 assertThat(retrievedKey.getRecoveryStatus()).isEqualTo(status);
348
349 mRecoverableKeyStoreDb.setRecoveryStatus(uid, alias, status2);
350
351 retrievedKey = mRecoverableKeyStoreDb.getKey(uid, alias);
352 assertThat(retrievedKey.getRecoveryStatus()).isEqualTo(status2);
353 }
354
355 @Test
356 public void getStatusForAllKeys_with3Keys() {
357 int userId = 12;
358 int uid = 1009;
359 int generationId = 6;
360 int status = 120;
361 int status2 = 121;
362 String alias = "test";
363 String alias2 = "test2";
364 String alias3 = "test3";
365 byte[] nonce = getUtf8Bytes("nonce");
366 byte[] keyMaterial = getUtf8Bytes("keymaterial");
Bo Zhu7ebcd662019-01-04 17:00:58 -0800367 byte[] keyMetadata = null;
Dmitry Dementyevad884712017-12-20 12:38:36 -0800368
Bo Zhu7ebcd662019-01-04 17:00:58 -0800369 WrappedKey wrappedKey = new WrappedKey(nonce, keyMaterial, keyMetadata, generationId,
370 status);
Dmitry Dementyevad884712017-12-20 12:38:36 -0800371 mRecoverableKeyStoreDb.insertKey(userId, uid, alias2, wrappedKey);
Bo Zhu7ebcd662019-01-04 17:00:58 -0800372 WrappedKey wrappedKey2 = new WrappedKey(nonce, keyMaterial, keyMetadata, generationId,
373 status);
374 mRecoverableKeyStoreDb.insertKey(userId, uid, alias3, wrappedKey2);
375 WrappedKey wrappedKeyWithDefaultStatus = new WrappedKey(nonce, keyMaterial, keyMetadata,
376 generationId);
Dmitry Dementyevad884712017-12-20 12:38:36 -0800377 mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKeyWithDefaultStatus);
378
379 Map<String, Integer> statuses = mRecoverableKeyStoreDb.getStatusForAllKeys(uid);
380 assertThat(statuses).hasSize(3);
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -0700381 assertThat(statuses).containsEntry(alias,
382 RecoveryController.RECOVERY_STATUS_SYNC_IN_PROGRESS);
Dmitry Dementyevad884712017-12-20 12:38:36 -0800383 assertThat(statuses).containsEntry(alias2, status);
384 assertThat(statuses).containsEntry(alias3, status);
385
386 int updates = mRecoverableKeyStoreDb.setRecoveryStatus(uid, alias, status2);
387 assertThat(updates).isEqualTo(1);
388 updates = mRecoverableKeyStoreDb.setRecoveryStatus(uid, alias3, status2);
389 assertThat(updates).isEqualTo(1);
390 statuses = mRecoverableKeyStoreDb.getStatusForAllKeys(uid);
391
392 assertThat(statuses).hasSize(3);
393 assertThat(statuses).containsEntry(alias, status2); // updated from default
394 assertThat(statuses).containsEntry(alias2, status);
395 assertThat(statuses).containsEntry(alias3, status2); // updated
396 }
397
398 @Test
399 public void setRecoveryStatus_withEmptyDatabase() throws Exception{
400 int uid = 1009;
401 String alias = "test";
402 int status = 120;
403 int updates = mRecoverableKeyStoreDb.setRecoveryStatus(uid, alias, status);
404 assertThat(updates).isEqualTo(0); // database was empty
405 }
406
407
408 @Test
409 public void getStatusForAllKeys_withEmptyDatabase() {
410 int uid = 1009;
411 Map<String, Integer> statuses = mRecoverableKeyStoreDb.getStatusForAllKeys(uid);
412 assertThat(statuses).hasSize(0);
413 }
414
Andreas Gampebd666412018-02-19 10:47:28 -0800415 @Test
Dmitry Dementyev3f2d1712018-01-24 11:11:40 -0800416 public void testInvalidateKeysWithOldGenerationId_withSingleKey() {
417 int userId = 12;
418 int uid = 1009;
419 int generationId = 6;
420 int status = 120;
421 int status2 = 121;
422 String alias = "test";
423 byte[] nonce = getUtf8Bytes("nonce");
424 byte[] keyMaterial = getUtf8Bytes("keymaterial");
Bo Zhu7ebcd662019-01-04 17:00:58 -0800425 byte[] keyMetadata = null;
426
427 WrappedKey wrappedKey = new WrappedKey(nonce, keyMaterial, keyMetadata, generationId,
428 status);
Dmitry Dementyev3f2d1712018-01-24 11:11:40 -0800429 mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKey);
430
431 WrappedKey retrievedKey = mRecoverableKeyStoreDb.getKey(uid, alias);
432 assertThat(retrievedKey.getRecoveryStatus()).isEqualTo(status);
433
434 mRecoverableKeyStoreDb.setRecoveryStatus(uid, alias, status2);
435 mRecoverableKeyStoreDb.invalidateKeysWithOldGenerationId(userId, generationId + 1);
436
437 retrievedKey = mRecoverableKeyStoreDb.getKey(uid, alias);
438 assertThat(retrievedKey.getRecoveryStatus())
439 .isEqualTo(RecoveryController.RECOVERY_STATUS_PERMANENT_FAILURE);
440 }
441
Bo Zhu5b81fa62017-12-21 14:36:11 -0800442 @Test
Aseem Kumar3326da52018-03-12 18:05:16 -0700443 public void testInvalidateKeysForUserIdOnCustomScreenLock() {
444 int userId = 12;
445 int uid = 1009;
446 int generationId = 6;
447 int status = 120;
448 int status2 = 121;
449 String alias = "test";
450 byte[] nonce = getUtf8Bytes("nonce");
451 byte[] keyMaterial = getUtf8Bytes("keymaterial");
Bo Zhu7ebcd662019-01-04 17:00:58 -0800452 byte[] keyMetadata = null;
453
454 WrappedKey wrappedKey = new WrappedKey(nonce, keyMaterial, keyMetadata, generationId,
455 status);
Aseem Kumar3326da52018-03-12 18:05:16 -0700456 mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKey);
457
458 WrappedKey retrievedKey = mRecoverableKeyStoreDb.getKey(uid, alias);
459 assertThat(retrievedKey.getRecoveryStatus()).isEqualTo(status);
460
461 mRecoverableKeyStoreDb.setRecoveryStatus(uid, alias, status2);
462 mRecoverableKeyStoreDb.invalidateKeysForUserIdOnCustomScreenLock(userId);
463
464 retrievedKey = mRecoverableKeyStoreDb.getKey(uid, alias);
465 assertThat(retrievedKey.getRecoveryStatus())
466 .isEqualTo(RecoveryController.RECOVERY_STATUS_PERMANENT_FAILURE);
467 }
468
469 @Test
Bo Zhu5b81fa62017-12-21 14:36:11 -0800470 public void setRecoveryServicePublicKey_replaceOldKey() throws Exception {
471 int userId = 12;
472 int uid = 10009;
473 PublicKey pubkey1 = genRandomPublicKey();
474 PublicKey pubkey2 = genRandomPublicKey();
475 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid, pubkey1);
476 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid, pubkey2);
477 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid)).isEqualTo(
478 pubkey2);
479 }
480
481 @Test
Bo Zhu584b923f2017-12-22 16:05:15 -0800482 public void getRecoveryServicePublicKey_returnsNullIfNoKey() throws Exception {
483 int userId = 12;
484 int uid = 10009;
485 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid)).isNull();
486
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800487 mRecoverableKeyStoreDb.setServerParams(userId, uid, SERVER_PARAMS);
Bo Zhu584b923f2017-12-22 16:05:15 -0800488 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid)).isNull();
489 }
490
491 @Test
492 public void getRecoveryServicePublicKey_returnsInsertedKey() throws Exception {
493 int userId = 12;
Bo Zhu5b81fa62017-12-21 14:36:11 -0800494 int uid = 10009;
495 PublicKey pubkey = genRandomPublicKey();
Bo Zhu584b923f2017-12-22 16:05:15 -0800496 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid, pubkey);
497 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid)).isEqualTo(
Bo Zhu5b81fa62017-12-21 14:36:11 -0800498 pubkey);
499 }
500
Andreas Gampebd666412018-02-19 10:47:28 -0800501 @Test
Bo Zhu14d993d2018-02-03 21:38:48 -0800502 public void setRecoveryServiceCertPath_replaceOldValue() throws Exception {
503 int userId = 12;
504 int uid = 10009;
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -0700505 mRecoverableKeyStoreDb.setRecoveryServiceCertPath(userId, uid, TEST_ROOT_CERT_ALIAS,
506 TestData.CERT_PATH_1);
507 mRecoverableKeyStoreDb.setRecoveryServiceCertPath(userId, uid, TEST_ROOT_CERT_ALIAS,
Bo Zhu14d993d2018-02-03 21:38:48 -0800508 TestData.CERT_PATH_2);
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -0700509 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
510 TEST_ROOT_CERT_ALIAS)).isEqualTo(TestData.CERT_PATH_2);
511 }
512
513 @Test
514 public void setRecoveryServiceCertPath_updateValuesForCorrectRootCert() throws Exception {
515 int userId = 12;
516 int uid = 10009;
517 mRecoverableKeyStoreDb.setRecoveryServiceCertPath(userId, uid, TEST_ROOT_CERT_ALIAS,
518 TestData.CERT_PATH_1);
519 mRecoverableKeyStoreDb.setRecoveryServiceCertPath(userId, uid, TEST_ROOT_CERT_ALIAS2,
520 TestData.CERT_PATH_1);
521
522 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
523 TEST_ROOT_CERT_ALIAS)).isEqualTo(TestData.CERT_PATH_1);
524 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
525 TEST_ROOT_CERT_ALIAS2)).isEqualTo(TestData.CERT_PATH_1);
526
527 mRecoverableKeyStoreDb.setRecoveryServiceCertPath(userId, uid, TEST_ROOT_CERT_ALIAS2,
528 TestData.CERT_PATH_2);
529
530 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
531 TEST_ROOT_CERT_ALIAS)).isEqualTo(TestData.CERT_PATH_1);
532 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
533 TEST_ROOT_CERT_ALIAS2)).isEqualTo(TestData.CERT_PATH_2);
Bo Zhu14d993d2018-02-03 21:38:48 -0800534 }
535
536 @Test
537 public void getRecoveryServiceCertPath_returnsNullIfNoValue() throws Exception {
538 int userId = 12;
539 int uid = 10009;
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -0700540 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
541 TEST_ROOT_CERT_ALIAS)).isNull();
Bo Zhu14d993d2018-02-03 21:38:48 -0800542 }
543
544 @Test
545 public void getRecoveryServiceCertPath_returnsInsertedValue() throws Exception {
546 int userId = 12;
547 int uid = 10009;
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -0700548 mRecoverableKeyStoreDb.setRecoveryServiceCertPath(userId, uid, TEST_ROOT_CERT_ALIAS,
Bo Zhu14d993d2018-02-03 21:38:48 -0800549 TestData.CERT_PATH_1);
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -0700550 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
551 TEST_ROOT_CERT_ALIAS)).isEqualTo(TestData.CERT_PATH_1);
Bo Zhu14d993d2018-02-03 21:38:48 -0800552 }
553
554 @Test
555 public void setRecoveryServiceCertSerial_replaceOldValue() throws Exception {
556 int userId = 12;
557 int uid = 10009;
558
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -0700559 mRecoverableKeyStoreDb.setRecoveryServiceCertSerial(userId, uid, TEST_ROOT_CERT_ALIAS, 1L);
560 mRecoverableKeyStoreDb.setRecoveryServiceCertSerial(userId, uid, TEST_ROOT_CERT_ALIAS, 3L);
561 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
562 TEST_ROOT_CERT_ALIAS)).isEqualTo(3L);
563 }
564
565 @Test
566 public void setRecoveryServiceCertSerial_updateValuesForCorrectRootCert() throws Exception {
567 int userId = 12;
568 int uid = 10009;
569 mRecoverableKeyStoreDb.setRecoveryServiceCertSerial(userId, uid, TEST_ROOT_CERT_ALIAS, 1L);
570 mRecoverableKeyStoreDb.setRecoveryServiceCertSerial(userId, uid, TEST_ROOT_CERT_ALIAS2, 1L);
571
572 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
573 TEST_ROOT_CERT_ALIAS)).isEqualTo(1L);
574 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
575 TEST_ROOT_CERT_ALIAS2)).isEqualTo(1L);
576
577 mRecoverableKeyStoreDb.setRecoveryServiceCertSerial(userId, uid, TEST_ROOT_CERT_ALIAS2, 3L);
578
579 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
580 TEST_ROOT_CERT_ALIAS)).isEqualTo(1L);
581 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
582 TEST_ROOT_CERT_ALIAS2)).isEqualTo(3L);
Bo Zhu14d993d2018-02-03 21:38:48 -0800583 }
584
585 @Test
586 public void getRecoveryServiceCertSerial_returnsNullIfNoValue() throws Exception {
587 int userId = 12;
588 int uid = 10009;
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -0700589 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
590 TEST_ROOT_CERT_ALIAS)).isNull();
591 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
592 TEST_ROOT_CERT_ALIAS2)).isNull();
Bo Zhu14d993d2018-02-03 21:38:48 -0800593 }
594
595 @Test
596 public void getRecoveryServiceCertSerial_returnsInsertedValue() throws Exception {
597 int userId = 12;
598 int uid = 10009;
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -0700599 mRecoverableKeyStoreDb.setRecoveryServiceCertSerial(userId, uid,
600 TEST_ROOT_CERT_ALIAS, 1234L);
601 assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
602 TEST_ROOT_CERT_ALIAS)).isEqualTo(1234L);
Bo Zhu14d993d2018-02-03 21:38:48 -0800603 }
604
Bo Zhu5b81fa62017-12-21 14:36:11 -0800605 @Test
Dmitry Dementyev77183ef2018-01-05 15:46:00 -0800606 public void getRecoveryAgents_returnsUidIfSet() throws Exception {
Robert Berry91044042017-12-27 12:05:58 +0000607 int userId = 12;
608 int uid = 190992;
609 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid, genRandomPublicKey());
610
Dmitry Dementyev77183ef2018-01-05 15:46:00 -0800611 assertThat(mRecoverableKeyStoreDb.getRecoveryAgents(userId)).contains(uid);
Robert Berry91044042017-12-27 12:05:58 +0000612 }
613
614 @Test
Dmitry Dementyev77183ef2018-01-05 15:46:00 -0800615 public void getRecoveryAgents_returnsEmptyListIfThereAreNoAgents() throws Exception {
616 int userId = 12;
617 assertThat(mRecoverableKeyStoreDb.getRecoveryAgents(userId)).isEmpty();
618 assertThat(mRecoverableKeyStoreDb.getRecoveryAgents(userId)).isNotNull();
619 }
620
621 @Test
622 public void getRecoveryAgents_withTwoAgents() throws Exception {
623 int userId = 12;
624 int uid1 = 190992;
625 int uid2 = 190993;
626 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid1, genRandomPublicKey());
627 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid2, genRandomPublicKey());
628 List<Integer> agents = mRecoverableKeyStoreDb.getRecoveryAgents(userId);
629
630 assertThat(agents).hasSize(2);
631 assertThat(agents).contains(uid1);
632 assertThat(agents).contains(uid2);
Robert Berry91044042017-12-27 12:05:58 +0000633 }
634
Andreas Gampebd666412018-02-19 10:47:28 -0800635 @Test
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -0700636 public void setActiveRootOfTrust_emptyDefaultValue() throws Exception {
637 int userId = 12;
638 int uid = 10009;
639 assertThat(mRecoverableKeyStoreDb.getActiveRootOfTrust(userId, uid)).isEqualTo(null);
640 }
641
642 @Test
643 public void setActiveRootOfTrust_updateValue() throws Exception {
644 int userId = 12;
645 int uid = 10009;
646 mRecoverableKeyStoreDb.setActiveRootOfTrust(userId, uid, "root");
647 assertThat(mRecoverableKeyStoreDb.getActiveRootOfTrust(userId, uid)).isEqualTo("root");
648
649 mRecoverableKeyStoreDb.setActiveRootOfTrust(userId, uid, "root2");
650 assertThat(mRecoverableKeyStoreDb.getActiveRootOfTrust(userId, uid)).isEqualTo("root2");
651 }
652
653 @Test
Dmitry Dementyevbdfdf532017-12-27 11:58:45 -0800654 public void setRecoverySecretTypes_emptyDefaultValue() throws Exception {
655 int userId = 12;
656 int uid = 10009;
657 assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid)).isEqualTo(
658 new int[]{}); // default
659 }
660
661 @Test
662 public void setRecoverySecretTypes_updateValue() throws Exception {
663 int userId = 12;
664 int uid = 10009;
665 int[] types1 = new int[]{1};
666 int[] types2 = new int[]{2};
667
668 mRecoverableKeyStoreDb.setRecoverySecretTypes(userId, uid, types1);
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -0700669 assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid)).isEqualTo(types1);
Dmitry Dementyevbdfdf532017-12-27 11:58:45 -0800670 mRecoverableKeyStoreDb.setRecoverySecretTypes(userId, uid, types2);
Dmitry Dementyevf34fc7e2018-03-26 17:31:29 -0700671 assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid)).isEqualTo(types2);
Dmitry Dementyevbdfdf532017-12-27 11:58:45 -0800672 }
673
674 @Test
675 public void setRecoverySecretTypes_withMultiElementArrays() throws Exception {
676 int userId = 12;
677 int uid = 10009;
678 int[] types1 = new int[]{11, 2000};
679 int[] types2 = new int[]{1, 2, 3};
680 int[] types3 = new int[]{};
681
682 mRecoverableKeyStoreDb.setRecoverySecretTypes(userId, uid, types1);
683 assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid)).isEqualTo(
684 types1);
685 mRecoverableKeyStoreDb.setRecoverySecretTypes(userId, uid, types2);
686 assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid)).isEqualTo(
687 types2);
688 mRecoverableKeyStoreDb.setRecoverySecretTypes(userId, uid, types3);
689 assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid)).isEqualTo(
690 types3);
691 }
692
693 @Test
694 public void setRecoverySecretTypes_withDifferentUid() throws Exception {
695 int userId = 12;
696 int uid1 = 10011;
697 int uid2 = 10012;
698 int[] types1 = new int[]{1};
699 int[] types2 = new int[]{2};
700
701 mRecoverableKeyStoreDb.setRecoverySecretTypes(userId, uid1, types1);
702 mRecoverableKeyStoreDb.setRecoverySecretTypes(userId, uid2, types2);
703 assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid1)).isEqualTo(
704 types1);
705 assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid2)).isEqualTo(
706 types2);
707 }
708
709 @Test
710 public void setRecoveryServiceMetadataMethods() throws Exception {
711 int userId = 12;
712 int uid = 10009;
713
714 PublicKey pubkey1 = genRandomPublicKey();
715 int[] types1 = new int[]{1};
Dmitry Dementyevbdfdf532017-12-27 11:58:45 -0800716
717 PublicKey pubkey2 = genRandomPublicKey();
718 int[] types2 = new int[]{2};
Dmitry Dementyevbdfdf532017-12-27 11:58:45 -0800719
720 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid, pubkey1);
721 mRecoverableKeyStoreDb.setRecoverySecretTypes(userId, uid, types1);
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800722 mRecoverableKeyStoreDb.setServerParams(userId, uid, SERVER_PARAMS);
Dmitry Dementyevbdfdf532017-12-27 11:58:45 -0800723
724 assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid)).isEqualTo(
725 types1);
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800726 assertThat(mRecoverableKeyStoreDb.getServerParams(userId, uid)).isEqualTo(
727 SERVER_PARAMS);
Dmitry Dementyevbdfdf532017-12-27 11:58:45 -0800728 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid)).isEqualTo(
729 pubkey1);
730
731 // Check that the methods don't interfere with each other.
732 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid, pubkey2);
733 mRecoverableKeyStoreDb.setRecoverySecretTypes(userId, uid, types2);
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800734 mRecoverableKeyStoreDb.setServerParams(userId, uid, SERVER_PARAMS2);
Dmitry Dementyevbdfdf532017-12-27 11:58:45 -0800735
736 assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid)).isEqualTo(
737 types2);
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800738 assertThat(mRecoverableKeyStoreDb.getServerParams(userId, uid)).isEqualTo(
739 SERVER_PARAMS2);
Dmitry Dementyevbdfdf532017-12-27 11:58:45 -0800740 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid)).isEqualTo(
741 pubkey2);
742 }
743
Robert Berry91044042017-12-27 12:05:58 +0000744 @Test
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800745 public void setServerParams_replaceOldValue() throws Exception {
Bo Zhu584b923f2017-12-22 16:05:15 -0800746 int userId = 12;
747 int uid = 10009;
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800748
749 mRecoverableKeyStoreDb.setServerParams(userId, uid, SERVER_PARAMS);
750 mRecoverableKeyStoreDb.setServerParams(userId, uid, SERVER_PARAMS2);
751 assertThat(mRecoverableKeyStoreDb.getServerParams(userId, uid)).isEqualTo(
752 SERVER_PARAMS2);
Bo Zhu584b923f2017-12-22 16:05:15 -0800753 }
754
755 @Test
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800756 public void getServerParams_returnsNullIfNoValue() throws Exception {
Bo Zhu584b923f2017-12-22 16:05:15 -0800757 int userId = 12;
758 int uid = 10009;
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800759 assertThat(mRecoverableKeyStoreDb.getServerParams(userId, uid)).isNull();
Bo Zhu584b923f2017-12-22 16:05:15 -0800760
761 PublicKey pubkey = genRandomPublicKey();
762 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid, pubkey);
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800763 assertThat(mRecoverableKeyStoreDb.getServerParams(userId, uid)).isNull();
Bo Zhu584b923f2017-12-22 16:05:15 -0800764 }
765
766 @Test
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800767 public void getServerParams_returnsInsertedValue() throws Exception {
Bo Zhu584b923f2017-12-22 16:05:15 -0800768 int userId = 12;
769 int uid = 10009;
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800770 mRecoverableKeyStoreDb.setServerParams(userId, uid, SERVER_PARAMS);
771 assertThat(mRecoverableKeyStoreDb.getServerParams(userId, uid)).isEqualTo(SERVER_PARAMS);
Bo Zhu584b923f2017-12-22 16:05:15 -0800772 }
773
774 @Test
Dmitry Dementyev77183ef2018-01-05 15:46:00 -0800775 public void setCounterId_defaultValueAndTwoUpdates() throws Exception {
776 int userId = 12;
777 int uid = 10009;
778 long value1 = 111L;
779 long value2 = 222L;
780 assertThat(mRecoverableKeyStoreDb.getCounterId(userId, uid)).isNull();
781
782 mRecoverableKeyStoreDb.setCounterId(userId, uid, value1);
783 assertThat(mRecoverableKeyStoreDb.getCounterId(userId, uid)).isEqualTo(
784 value1);
785
786 mRecoverableKeyStoreDb.setCounterId(userId, uid, value2);
787 assertThat(mRecoverableKeyStoreDb.getCounterId(userId, uid)).isEqualTo(
788 value2);
789 }
790
791 @Test
792 public void setSnapshotVersion_defaultValueAndTwoUpdates() throws Exception {
793 int userId = 12;
794 int uid = 10009;
795 long value1 = 111L;
796 long value2 = 222L;
797 assertThat(mRecoverableKeyStoreDb.getSnapshotVersion(userId, uid)).isNull();
798 mRecoverableKeyStoreDb.setSnapshotVersion(userId, uid, value1);
799 assertThat(mRecoverableKeyStoreDb.getSnapshotVersion(userId, uid)).isEqualTo(
800 value1);
801 mRecoverableKeyStoreDb.setSnapshotVersion(userId, uid, value2);
802 assertThat(mRecoverableKeyStoreDb.getSnapshotVersion(userId, uid)).isEqualTo(
803 value2);
804 }
805
806 @Test
807 public void setShouldCreateSnapshot_defaultValueAndTwoUpdates() throws Exception {
808 int userId = 12;
809 int uid = 10009;
810 boolean value1 = true;
811 boolean value2 = false;
812 assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isEqualTo(false);
813 mRecoverableKeyStoreDb.setShouldCreateSnapshot(userId, uid, value1);
814 assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isEqualTo(value1);
815 mRecoverableKeyStoreDb.setShouldCreateSnapshot(userId, uid, value2);
816 assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isEqualTo(
817 value2);
818 }
819
820 @Test
Bo Zhu584b923f2017-12-22 16:05:15 -0800821 public void setRecoveryServiceMetadataEntry_allowsAUserToHaveTwoUids() throws Exception {
Bo Zhu5b81fa62017-12-21 14:36:11 -0800822 int userId = 12;
823 int uid1 = 10009;
824 int uid2 = 20009;
825 PublicKey pubkey = genRandomPublicKey();
826 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid1, pubkey);
827 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid2, pubkey);
828 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid1)).isEqualTo(
829 pubkey);
830 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid2)).isEqualTo(
831 pubkey);
832 }
833
834 @Test
Bo Zhu584b923f2017-12-22 16:05:15 -0800835 public void setRecoveryServiceMetadataEntry_allowsTwoUsersToHaveTheSameUid() throws Exception {
836 int userId1 = 12;
837 int userId2 = 23;
Bo Zhu5b81fa62017-12-21 14:36:11 -0800838 int uid = 10009;
Bo Zhu584b923f2017-12-22 16:05:15 -0800839 PublicKey pubkey = genRandomPublicKey();
840 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId1, uid, pubkey);
841 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId2, uid, pubkey);
842 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId1, uid)).isEqualTo(
843 pubkey);
844 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId2, uid)).isEqualTo(
845 pubkey);
Bo Zhu5b81fa62017-12-21 14:36:11 -0800846 }
847
848 @Test
Bo Zhu584b923f2017-12-22 16:05:15 -0800849 public void setRecoveryServiceMetadataEntry_updatesColumnsSeparately() throws Exception {
Bo Zhu5b81fa62017-12-21 14:36:11 -0800850 int userId = 12;
851 int uid = 10009;
Bo Zhu584b923f2017-12-22 16:05:15 -0800852 PublicKey pubkey1 = genRandomPublicKey();
853 PublicKey pubkey2 = genRandomPublicKey();
Bo Zhu584b923f2017-12-22 16:05:15 -0800854
855 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid, pubkey1);
Bo Zhu5b81fa62017-12-21 14:36:11 -0800856 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid)).isEqualTo(
Bo Zhu584b923f2017-12-22 16:05:15 -0800857 pubkey1);
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800858 assertThat(mRecoverableKeyStoreDb.getServerParams(userId, uid)).isNull();
Bo Zhu584b923f2017-12-22 16:05:15 -0800859
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800860 mRecoverableKeyStoreDb.setServerParams(userId, uid, SERVER_PARAMS);
Bo Zhu584b923f2017-12-22 16:05:15 -0800861 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid)).isEqualTo(
862 pubkey1);
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800863 assertThat(mRecoverableKeyStoreDb.getServerParams(userId, uid)).isEqualTo(SERVER_PARAMS);
Bo Zhu584b923f2017-12-22 16:05:15 -0800864
865 mRecoverableKeyStoreDb.setRecoveryServicePublicKey(userId, uid, pubkey2);
866 assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid)).isEqualTo(
867 pubkey2);
Dmitry Dementyev7d8c78a2018-01-12 19:14:07 -0800868 assertThat(mRecoverableKeyStoreDb.getServerParams(userId, uid)).isEqualTo(SERVER_PARAMS);
Bo Zhu5b81fa62017-12-21 14:36:11 -0800869 }
870
Robert Berry76cf0832017-12-15 23:01:22 +0000871 private static byte[] getUtf8Bytes(String s) {
872 return s.getBytes(StandardCharsets.UTF_8);
873 }
Bo Zhu5b81fa62017-12-21 14:36:11 -0800874
875 private static PublicKey genRandomPublicKey() throws Exception {
876 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");
877 keyPairGenerator.initialize(new ECGenParameterSpec("secp256r1"));
878 return keyPairGenerator.generateKeyPair().getPublic();
879 }
Robert Berry76cf0832017-12-15 23:01:22 +0000880}