@Override public LockableRandomAccessBuffer toRandomAccessBuffer() throws IOException { if(underlying.size() < type.headerLen) throw new IOException("Converting empty bucket"); underlying.setReadOnly(); LockableRandomAccessBuffer r = underlying.toRandomAccessBuffer(); try { return new EncryptedRandomAccessBuffer(type, r, masterKey, false); } catch (GeneralSecurityException e) { Logger.error(this, "Unable to convert encrypted bucket: "+e, e); throw new IOException(e); } }
@Test (expected = NullPointerException.class) public void testEncryptedRandomAccessThingNullBARAT() throws GeneralSecurityException, IOException { ByteArrayRandomAccessBuffer barat = null; EncryptedRandomAccessBuffer erat = new EncryptedRandomAccessBuffer(types[0], barat, secret, true); }
@Override protected RandomAccessBuffer construct(long size) throws IOException { ByteArrayRandomAccessBuffer barat = new ByteArrayRandomAccessBuffer((int)(size+types[0].headerLen)); try { return new EncryptedRandomAccessBuffer(types[0], barat, secret, true); } catch (GeneralSecurityException e) { throw new Error(e); } }
public static LockableRandomAccessBuffer create(DataInputStream dis, FilenameGenerator fg, PersistentFileTracker persistentFileTracker, MasterSecret masterKey) throws IOException, StorageFormatException, ResumeFailedException { EncryptedRandomAccessBufferType type = EncryptedRandomAccessBufferType.getByBitmask(dis.readInt()); if(type == null) throw new StorageFormatException("Unknown EncryptedRandomAccessBufferType"); LockableRandomAccessBuffer underlying = BucketTools.restoreRAFFrom(dis, fg, persistentFileTracker, masterKey); try { return new EncryptedRandomAccessBuffer(type, underlying, masterKey, false); } catch (GeneralSecurityException e) { Logger.error(EncryptedRandomAccessBuffer.class, "Crypto error resuming: "+e, e); throw new ResumeFailedException(e); } }
@Test (expected = NullPointerException.class) public void testEncryptedRandomAccessThingNullByteArray() throws GeneralSecurityException, IOException { ByteArrayRandomAccessBuffer barat = new ByteArrayRandomAccessBuffer(null); EncryptedRandomAccessBuffer erat = new EncryptedRandomAccessBuffer(types[0], barat, secret, true); }
@Test (expected = NullPointerException.class) public void testEncryptedRandomAccessThingNullInput3() throws GeneralSecurityException, IOException { byte[] bytes = new byte[10]; ByteArrayRandomAccessBuffer barat = new ByteArrayRandomAccessBuffer(bytes); EncryptedRandomAccessBuffer erat = new EncryptedRandomAccessBuffer(types[0], barat, null, true); }
@Test (expected = NullPointerException.class) public void testEncryptedRandomAccessThingNullInput1() throws GeneralSecurityException, IOException { byte[] bytes = new byte[10]; ByteArrayRandomAccessBuffer barat = new ByteArrayRandomAccessBuffer(bytes); EncryptedRandomAccessBuffer erat = new EncryptedRandomAccessBuffer(null, barat, secret, true); }
@Test public void testWrongMagic() throws IOException, GeneralSecurityException{ byte[] bytes = new byte[100]; ByteArrayRandomAccessBuffer barat = new ByteArrayRandomAccessBuffer(bytes); EncryptedRandomAccessBuffer erat = new EncryptedRandomAccessBuffer(types[0], barat, secret, true); erat.close(); ByteArrayRandomAccessBuffer barat2 = new ByteArrayRandomAccessBuffer(bytes); byte[] magic = ByteBuffer.allocate(8).putLong(falseMagic).array(); barat2.pwrite(types[0].headerLen-8, magic, 0, 8); thrown.expect(IOException.class); thrown.expectMessage("This is not an EncryptedRandomAccessBuffer!"); EncryptedRandomAccessBuffer erat2 = new EncryptedRandomAccessBuffer(types[0], barat2, secret, false); }
@Test public void testWrongERATType() throws IOException, GeneralSecurityException { byte[] bytes = new byte[100]; ByteArrayRandomAccessBuffer barat = new ByteArrayRandomAccessBuffer(bytes); EncryptedRandomAccessBuffer erat = new EncryptedRandomAccessBuffer(types[0], barat, secret, true); erat.close(); ByteArrayRandomAccessBuffer barat2 = new ByteArrayRandomAccessBuffer(bytes); thrown.expect(IOException.class); thrown.expectMessage("This is not an EncryptedRandomAccessBuffer"); // Different header lengths. EncryptedRandomAccessBuffer erat2 = new EncryptedRandomAccessBuffer(types[1], barat2, secret, false); }
@Test public void testWrongMasterSecret() throws IOException, GeneralSecurityException{ byte[] bytes = new byte[100]; ByteArrayRandomAccessBuffer barat = new ByteArrayRandomAccessBuffer(bytes); EncryptedRandomAccessBuffer erat = new EncryptedRandomAccessBuffer(types[0], barat, secret, true); erat.close(); ByteArrayRandomAccessBuffer barat2 = new ByteArrayRandomAccessBuffer(bytes); thrown.expect(GeneralSecurityException.class); thrown.expectMessage("MAC is incorrect"); EncryptedRandomAccessBuffer erat2 = new EncryptedRandomAccessBuffer(types[0], barat2, new MasterSecret(), false); }
@Test public void testUnderlyingRandomAccessThingTooSmall() throws GeneralSecurityException, IOException { byte[] bytes = new byte[10]; ByteArrayRandomAccessBuffer barat = new ByteArrayRandomAccessBuffer(bytes); thrown.expect(IOException.class); thrown.expectMessage("Underlying RandomAccessBuffer is not long enough to include the " + "footer."); EncryptedRandomAccessBuffer erat = new EncryptedRandomAccessBuffer(types[0], barat, secret, true); }
@Test public void testClose() throws IOException, GeneralSecurityException { byte[] bytes = new byte[100]; ByteArrayRandomAccessBuffer barat = new ByteArrayRandomAccessBuffer(bytes); EncryptedRandomAccessBuffer erat = new EncryptedRandomAccessBuffer(types[0], barat, secret, true); erat.close(); erat.close(); }
@Test public void testSize() throws IOException, GeneralSecurityException { byte[] bytes = new byte[100]; ByteArrayRandomAccessBuffer barat = new ByteArrayRandomAccessBuffer(bytes); EncryptedRandomAccessBuffer erat = new EncryptedRandomAccessBuffer(types[0], barat, secret, true); assertEquals(erat.size(), barat.size()-types[0].headerLen); }
@Test public void testPreadFileOffsetTooSmall() throws IOException, GeneralSecurityException { byte[] bytes = new byte[100]; ByteArrayRandomAccessBuffer barat = new ByteArrayRandomAccessBuffer(bytes); EncryptedRandomAccessBuffer erat = new EncryptedRandomAccessBuffer(types[0], barat, secret, true); byte[] result = new byte[20]; thrown.expect(IllegalArgumentException.class); thrown.expectMessage("Cannot read before zero"); erat.pread(-1, result, 0, 20); }
@Test public void testPwriteFileOffsetTooSmall() throws IOException, GeneralSecurityException { byte[] bytes = new byte[100]; ByteArrayRandomAccessBuffer barat = new ByteArrayRandomAccessBuffer(bytes); EncryptedRandomAccessBuffer erat = new EncryptedRandomAccessBuffer(types[0], barat, secret, true); byte[] result = new byte[20]; thrown.expect(IllegalArgumentException.class); thrown.expectMessage("Cannot read before zero"); erat.pwrite(-1, result, 0, 20); }
@Test public void testClosePread() throws IOException, GeneralSecurityException { byte[] bytes = new byte[100]; ByteArrayRandomAccessBuffer barat = new ByteArrayRandomAccessBuffer(bytes); EncryptedRandomAccessBuffer erat = new EncryptedRandomAccessBuffer(types[0], barat, secret, true); erat.close(); byte[] result = new byte[20]; thrown.expect(IOException.class); thrown.expectMessage("This RandomAccessBuffer has already been closed. It can no longer" + " be read from."); erat.pread(0, result, 0, 20); }
@Test public void testClosePwrite() throws IOException, GeneralSecurityException { byte[] bytes = new byte[100]; ByteArrayRandomAccessBuffer barat = new ByteArrayRandomAccessBuffer(bytes); EncryptedRandomAccessBuffer erat = new EncryptedRandomAccessBuffer(types[0], barat, secret, true); erat.close(); byte[] result = new byte[20]; thrown.expect(IOException.class); thrown.expectMessage("This RandomAccessBuffer has already been closed. It can no longer" + " be written to."); erat.pwrite(0, result, 0, 20); }
@Test public void testSuccesfulRoundTrip() throws IOException, GeneralSecurityException{ for(EncryptedRandomAccessBufferType type: types){ byte[] bytes = new byte[100]; ByteArrayRandomAccessBuffer barat = new ByteArrayRandomAccessBuffer(bytes); EncryptedRandomAccessBuffer erat = new EncryptedRandomAccessBuffer(type, barat, secret, true); erat.pwrite(0, message, 0, message.length); byte[] result = new byte[message.length]; erat.pread(0, result, 0, result.length); erat.close(); assertArrayEquals(message, result); } }
@Test public void testPwriteFileOffsetTooBig() throws IOException, GeneralSecurityException { byte[] bytes = new byte[100]; ByteArrayRandomAccessBuffer barat = new ByteArrayRandomAccessBuffer(bytes); EncryptedRandomAccessBuffer erat = new EncryptedRandomAccessBuffer(types[0], barat, secret, true); int len = 20; byte[] result = new byte[len]; int offset = 100; thrown.expect(IOException.class); thrown.expectMessage("Cannot write after end: trying to write from "+offset+" to "+ (offset+len)+" on block length "+erat.size()); erat.pwrite(offset, result, 0, len); }
@Test public void testPreadFileOffsetTooBig() throws IOException, GeneralSecurityException { byte[] bytes = new byte[100]; ByteArrayRandomAccessBuffer barat = new ByteArrayRandomAccessBuffer(bytes); EncryptedRandomAccessBuffer erat = new EncryptedRandomAccessBuffer(types[0], barat, secret, true); int len = 20; byte[] result = new byte[len]; int offset = 100; thrown.expect(IOException.class); thrown.expectMessage("Cannot read after end: trying to read from "+offset+" to "+ (offset+len)+" on block length "+erat.size()); erat.pread(offset, result, 0, len); }