/* Copyright (C) 2013 Tobias Baum <tbaum at tntinteractive.de> This file is a part of Portalsammler. Portalsammler is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Portalsammler is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Portalsammler. If not, see <http://www.gnu.org/licenses/>. */ package de.tntinteractive.portalsammler.engine; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.security.SecureRandom; import java.util.Arrays; import org.junit.Test; public final class SecureStoreTest { private static final SettingKey USER = new SettingKey("user"); private static final SettingKey PASSWORD = new SettingKey("password"); @Test public void testReadAndWriteSourceSettings() throws Exception { final SecureRandom srand = new InsecureRandom(); final byte[] key = CryptoHelper.generateKey(srand); final StorageLayer stubStorage = new StubStorage(); final SecureStore s1 = SecureStore.createEmpty(stubStorage, srand, key); final SourceSettings settings1 = new SourceSettings(); settings1.set(USER, "123"); settings1.set(PASSWORD, "abc"); s1.getSettings().putSettings("diba", settings1); final SourceSettings settings2 = new SourceSettings(); settings2.set(USER, "456"); settings2.set(PASSWORD, "789"); s1.getSettings().putSettings("hanvb", settings2); s1.writeMetadata(); final SecureStore s2 = SecureStore.readFrom(stubStorage, srand, key); assertEquals(settings1, s2.getSettings().getSettings("diba")); assertEquals(settings2, s2.getSettings().getSettings("hanvb")); } @Test public void testStoreDocument() throws Exception { final SecureRandom srand = new InsecureRandom(); final byte[] key = CryptoHelper.generateKey(srand); final StorageLayer stubStorage = new StubStorage(); final SecureStore s = SecureStore.createEmpty(stubStorage, srand, key); final DocumentInfo metadata = DocumentInfo.create("id1", DocumentFormat.PDF); final byte[] content = new byte[] {1, 2, 3, 4, 5}; s.storeDocument(metadata, content); assertTrue(s.containsDocument(metadata)); assertTrue(Arrays.equals(content, s.getDocument(metadata))); assertFalse(s.isRead(metadata)); } @Test public void testStoreTwoDocuments() throws Exception { final SecureRandom srand = new InsecureRandom(); final byte[] key = CryptoHelper.generateKey(srand); final StorageLayer stubStorage = new StubStorage(); final SecureStore s = SecureStore.createEmpty(stubStorage, srand, key); final DocumentInfo metadata1 = DocumentInfo.create("id1", DocumentFormat.PDF); final byte[] content1 = new byte[] {1, 2, 3, 4, 5}; s.storeDocument(metadata1, content1); final DocumentInfo metadata2 = DocumentInfo.create("id2", DocumentFormat.PDF); final byte[] content2 = new byte[] {7, 8, 9, 10}; s.storeDocument(metadata2, content2); final DocumentInfo metadata3 = DocumentInfo.create("id3", DocumentFormat.PDF); assertTrue(s.containsDocument(metadata1)); assertTrue(Arrays.equals(content1, s.getDocument(metadata1))); assertTrue(s.containsDocument(metadata2)); assertTrue(Arrays.equals(content2, s.getDocument(metadata2))); assertFalse(s.containsDocument(metadata3)); } @Test public void testStoreTwoDocumentsWithReopen() throws Exception { final SecureRandom srand = new InsecureRandom(); final byte[] key = CryptoHelper.generateKey(srand); final StorageLayer stubStorage = new StubStorage(); final SecureStore s1 = SecureStore.createEmpty(stubStorage, srand, key); final DocumentInfo metadata1 = DocumentInfo.create("id1", DocumentFormat.PDF); final byte[] content1 = new byte[] {1, 2, 3, 4, 5}; s1.storeDocument(metadata1, content1); s1.writeMetadata(); final SecureStore s2 = SecureStore.readFrom(stubStorage, srand, key); final DocumentInfo metadata2 = DocumentInfo.create("id2", DocumentFormat.PDF); final byte[] content2 = new byte[] {7, 8, 9, 10}; s2.storeDocument(metadata2, content2); assertTrue(s2.containsDocument(metadata1)); assertTrue(Arrays.equals(content1, s2.getDocument(metadata1))); assertTrue(s2.containsDocument(metadata2)); assertTrue(Arrays.equals(content2, s2.getDocument(metadata2))); } @Test public void testMarkAsRead() throws Exception { final SecureRandom srand = new InsecureRandom(); final byte[] key = CryptoHelper.generateKey(srand); final SecureStore s = SecureStore.createEmpty(new StubStorage(), srand, key); final DocumentInfo metadata = DocumentInfo.create("id1", DocumentFormat.PDF); s.storeDocument(metadata, new byte[] {1, 2, 3, 4, 5}); s.markAsRead(metadata); assertTrue(s.isRead(metadata)); } @Test public void testStoreReadAndUnreadIsKeptAfterReopen() throws Exception { final SecureRandom srand = new InsecureRandom(); final byte[] key = CryptoHelper.generateKey(srand); final StorageLayer stubStorage = new StubStorage(); final SecureStore s1 = SecureStore.createEmpty(stubStorage, srand, key); final DocumentInfo metadata1 = DocumentInfo.create("id1", DocumentFormat.PDF); s1.storeDocument(metadata1, new byte[] {1, 2, 3, 4, 5}); s1.writeMetadata(); final DocumentInfo metadata2 = DocumentInfo.create("id2", DocumentFormat.PDF); s1.storeDocument(metadata2, new byte[] {7, 8, 9, 10}); s1.markAsRead(metadata2); final SecureStore s2 = SecureStore.readFrom(stubStorage, srand, key); assertFalse(s2.isRead(metadata1)); assertTrue(s2.isRead(metadata2)); } @Test public void testRecrypt() throws Exception { final SecureRandom srand = new InsecureRandom(); final byte[] key1 = CryptoHelper.generateKey(srand); final StorageLayer stubStorage = new StubStorage(); final SecureStore s1 = SecureStore.createEmpty(stubStorage, srand, key1); final DocumentInfo metadata1 = DocumentInfo.create("id1", DocumentFormat.PDF); s1.storeDocument(metadata1, new byte[] {1, 2, 3, 4, 5}); s1.writeMetadata(); final byte[] key2 = CryptoHelper.generateKey(srand); final SecureStore s2 = s1.recrypt(key2); assertTrue(Arrays.equals(new byte[] {1, 2, 3, 4, 5}, s2.getDocument(metadata1))); } }