@Override public RandomAccessBucket createShadow() { RandomAccessBucket copy = underlying.createShadow(); return new EncryptedRandomAccessBucket(type, copy, masterKey); }
public EncryptedRandomAccessBucket(EncryptedRandomAccessBufferType type, RandomAccessBucket underlying, MasterSecret masterKey) { this.type = type; this.underlying = underlying; this.masterKey = masterKey; baseSetup(masterKey); }
@Override public InputStream getInputStream() throws IOException { return new BufferedInputStream(getInputStreamUnbuffered()); }
r.nextBytes(buf); FileBucket fb = new FileBucket(tempFile, false, false, false, true); EncryptedRandomAccessBucket erab = new EncryptedRandomAccessBucket(types[0], fb, secret); OutputStream os = erab.getOutputStream(); os.write(buf, 0, buf.length); os.close(); InputStream is = erab.getInputStream(); byte[] tmp = new byte[buf.length]; is.read(tmp, 0, buf.length); ObjectInputStream ois = new ObjectInputStream(dis); EncryptedRandomAccessBucket restored = (EncryptedRandomAccessBucket) ois.readObject(); restored.onResume(context); assertEquals(buf.length, restored.size()); assertEquals(erab, restored); tmp = new byte[buf.length]; is = erab.getInputStream(); is.read(tmp, 0, buf.length); assertArrayEquals(buf, tmp); is.close(); restored.free();
r.nextBytes(buf); FileBucket fb = new FileBucket(tempFile, false, false, false, true); EncryptedRandomAccessBucket erab = new EncryptedRandomAccessBucket(types[0], fb, secret); OutputStream os = erab.getOutputStream(); os.write(buf, 0, buf.length); os.close(); InputStream is = erab.getInputStream(); byte[] tmp = new byte[buf.length]; is.read(tmp, 0, buf.length); ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); erab.storeTo(dos); dos.close(); DataInputStream dis = new DataInputStream(new ByteArrayInputStream(baos.toByteArray())); context.setPersistentMasterSecret(secret); EncryptedRandomAccessBucket restored = (EncryptedRandomAccessBucket) BucketTools.restoreFrom(dis, context.persistentFG, context.persistentFileTracker, secret); assertEquals(buf.length, restored.size()); assertEquals(erab, restored); tmp = new byte[buf.length]; is = erab.getInputStream(); is.read(tmp, 0, buf.length); assertArrayEquals(buf, tmp); is.close(); restored.free();
@Override public InputStream getInputStreamUnbuffered() throws IOException { if(size() == 0) return new NullInputStream(); if(isFreed){ throw new IOException("This RandomAccessBuffer has already been closed. This should not" + " happen."); } InputStream is = underlying.getInputStreamUnbuffered(); try { return new MyInputStream(is, setup(is)); } catch (GeneralSecurityException e) { Logger.error(this, "Unable to read encrypted bucket: "+e, e); throw new IOException(e); } }
@Override public OutputStream getOutputStream() throws IOException { return new BufferedOutputStream(getOutputStreamUnbuffered()); }
private File getFile(TempBucket bucket) { if(!this.enableCrypto()) return ((TempFileBucket)(((TempBucket) bucket).getUnderlying())).getFile(); else { EncryptedRandomAccessBucket erab = (EncryptedRandomAccessBucket) bucket.getUnderlying(); RandomAccessBucket b = erab.getUnderlying(); if(b instanceof PaddedRandomAccessBucket) { b = ((PaddedRandomAccessBucket)b).getUnderlying(); } return ((TempFileBucket) b).getFile(); } }
@Override protected Bucket makeBucket(long size) throws IOException { ArrayBucket underlying = new ArrayBucket(); return new EncryptedRandomAccessBucket(types[0], underlying, secret); }
@Override public void onResume(ClientContext context) throws ResumeFailedException { underlying.onResume(context); this.masterKey = context.getPersistentMasterSecret(); baseSetup(masterKey); }
private RandomAccessBucket _makeFileBucket() throws IOException { RandomAccessBucket ret = new TempFileBucket(filenameGenerator.makeRandomFilename(), filenameGenerator, true); // Do we want it to be encrypted? if(reallyEncrypt) { ret = new PaddedRandomAccessBucket(ret); ret = new EncryptedRandomAccessBucket(CRYPT_TYPE, ret, secret); } return ret; }
public EncryptedRandomAccessBucket(DataInputStream dis, FilenameGenerator fg, PersistentFileTracker persistentFileTracker, MasterSecret masterKey2) throws IOException, ResumeFailedException, StorageFormatException { type = EncryptedRandomAccessBufferType.getByBitmask(dis.readInt()); if(type == null) throw new ResumeFailedException("Unknown EncryptedRandomAccessBucket type"); underlying = (RandomAccessBucket) BucketTools.restoreFrom(dis, fg, persistentFileTracker, masterKey2); this.baseSetup(masterKey2); }
/** Create a persistent temporary bucket. Encrypted if appropriate. Wrapped in a * DelayedFreeBucket so that they will not be deleted until after the transaction deleting * them in the database commits. */ @Override public RandomAccessBucket makeBucket(long size) throws IOException { RandomAccessBucket rawBucket = null; boolean mustWrap = true; if(rawBucket == null) rawBucket = new PersistentTempFileBucket(fg.makeRandomFilename(), fg, this); synchronized(encryptLock) { if(encrypt) { rawBucket = new PaddedRandomAccessBucket(rawBucket); rawBucket = new EncryptedRandomAccessBucket(TempBucketFactory.CRYPT_TYPE, rawBucket, secret); } } if(mustWrap) rawBucket = new DelayedFreeRandomAccessBucket(this, rawBucket); return rawBucket; }
return new RAFBucket(dis, fg, persistentFileTracker, masterKey); case EncryptedRandomAccessBucket.MAGIC: return new EncryptedRandomAccessBucket(dis, fg, persistentFileTracker, masterKey); default: throw new StorageFormatException("Unknown magic value for bucket "+magic);