package freenet.node;
import static org.junit.Assert.*;
import java.io.File;
import java.io.IOException;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import freenet.crypt.DummyRandomSource;
import freenet.crypt.MasterSecret;
import freenet.support.io.FileUtil;
public class MasterKeysTest {
private File base = new File("tmp.master-keys-test");
@Before
public void setUp() {
FileUtil.removeAll(base);
base.mkdir();
MasterKeys.ITERATE_TIME = 100; // Speed up test.
}
@After
public void tearDown() {
FileUtil.removeAll(base);
}
@Test
public void testRestartNoPassword() throws MasterKeysWrongPasswordException, MasterKeysFileSizeException, IOException {
testRestart("");
}
@Test
public void testRestartWithPassword() throws MasterKeysWrongPasswordException, MasterKeysFileSizeException, IOException {
testRestart("password");
}
private void testRestart(String password) throws MasterKeysWrongPasswordException, MasterKeysFileSizeException, IOException {
File keysFile = new File(base, "test.master.keys");
DummyRandomSource random = new DummyRandomSource(77391);
MasterKeys original = MasterKeys.read(keysFile, random, password);
byte[] clientCacheMasterKey = original.clientCacheMasterKey;
DatabaseKey dkey = original.createDatabaseKey(random);
MasterSecret tempfileMasterSecret = original.getPersistentMasterSecret();
MasterKeys restored = MasterKeys.read(keysFile, random, password);
assertArrayEquals(clientCacheMasterKey, restored.clientCacheMasterKey);
assertEquals(dkey,restored.createDatabaseKey(random));
assertEquals(tempfileMasterSecret, restored.getPersistentMasterSecret());
}
@Test
public void testChangePasswordEmptyToSomething() throws MasterKeysWrongPasswordException, MasterKeysFileSizeException, IOException {
testChangePassword("", "password");
}
@Test
public void testChangePasswordEmptyToEmpty() throws MasterKeysWrongPasswordException, MasterKeysFileSizeException, IOException {
testChangePassword("", "");
}
@Test
public void testChangePasswordSomethingToEmpty() throws MasterKeysWrongPasswordException, MasterKeysFileSizeException, IOException {
testChangePassword("password", "");
}
@Test
public void testChangePasswordSomethingToSomething() throws MasterKeysWrongPasswordException, MasterKeysFileSizeException, IOException {
testChangePassword("password", "new password");
}
private void testChangePassword(String oldPassword, String newPassword) throws MasterKeysWrongPasswordException, MasterKeysFileSizeException, IOException {
File keysFile = new File(base, "test.master.keys");
DummyRandomSource random = new DummyRandomSource(77391);
MasterKeys original = MasterKeys.read(keysFile, random, oldPassword);
byte[] clientCacheMasterKey = original.clientCacheMasterKey;
DatabaseKey dkey = original.createDatabaseKey(random);
MasterSecret tempfileMasterSecret = original.getPersistentMasterSecret();
// Change password.
original.changePassword(keysFile, newPassword, random);
// Now restore.
if(!oldPassword.equals(newPassword)) {
try {
MasterKeys.read(keysFile, random, oldPassword);
fail("Old password should not work!");
} catch (MasterKeysWrongPasswordException e) {
// Ok.
}
}
MasterKeys restored = MasterKeys.read(keysFile, random, newPassword);
assertArrayEquals(clientCacheMasterKey, restored.clientCacheMasterKey);
assertEquals(dkey,restored.createDatabaseKey(random));
assertEquals(tempfileMasterSecret, restored.getPersistentMasterSecret());
}
}