public static AEADOutputStream createAES(OutputStream os, byte[] key, SecureRandom random) throws IOException { return innerCreateAES(os, key, random); }
@Override public void write(int b) throws IOException { write(new byte[] { (byte)b }); }
/** Check whether we can close the stream early. * @throws IOException */ public void testCloseEarly() throws IOException { ArrayBucket input = new ArrayBucket(); BucketTools.fill(input, 2048); int keysize = 16; Random random = new Random(0x47f6709f); byte[] key = new byte[keysize]; random.nextBytes(key); Bucket output = new ArrayBucket(); OutputStream os = output.getOutputStream(); AEADOutputStream cos = AEADOutputStream.innerCreateAES(os, key, random); BucketTools.copyTo(input, cos, 2048); cos.close(); InputStream is = output.getInputStream(); AEADInputStream cis = AEADInputStream.createAES(is, key); byte[] first1KReadEncrypted = new byte[1024]; new DataInputStream(cis).readFully(first1KReadEncrypted); byte[] first1KReadOriginal = new byte[1024]; new DataInputStream(input.getInputStream()).readFully(first1KReadOriginal); assertTrue(Arrays.equals(first1KReadEncrypted, first1KReadOriginal)); cis.close(); }
@Override public OutputStream getOutputStreamUnbuffered() throws IOException { synchronized(this) { if(readOnly) throw new IOException("Read only"); } OutputStream os = underlying.getOutputStreamUnbuffered(); return AEADOutputStream.createAES(os, key, NodeStarter.getGlobalSecureRandom()); }
/** For unit tests only */ static AEADOutputStream innerCreateAES(OutputStream os, byte[] key, Random random) throws IOException { AESEngine mainCipher = new AESEngine(); AESLightEngine hashCipher = new AESLightEngine(); byte[] nonce = new byte[mainCipher.getBlockSize()]; random.nextBytes(nonce); nonce[0] &= 0x7F; return new AEADOutputStream(os, key, nonce, hashCipher, mainCipher); }
Bucket output = new ArrayBucket(); OutputStream os = output.getOutputStream(); AEADOutputStream cos = AEADOutputStream.innerCreateAES(new NoCloseProxyOutputStream(os), key, random); BucketTools.copyTo(input, cos, -1); cos.close();
public void checkSuccessfulRoundTrip(int keysize, Random random, Bucket input, Bucket output, Bucket decoded) throws IOException { byte[] key = new byte[keysize]; random.nextBytes(key); OutputStream os = output.getOutputStream(); AEADOutputStream cos = AEADOutputStream.innerCreateAES(os, key, random); BucketTools.copyTo(input, cos, -1); cos.close(); assertTrue(output.size() > input.size()); InputStream is = output.getInputStream(); AEADInputStream cis = AEADInputStream.createAES(is, key); BucketTools.copyFrom(decoded, cis, -1); assertEquals(decoded.size(), input.size()); assertTrue(BucketTools.equalBuckets(decoded, input)); }
@Override public void write(byte[] buf) throws IOException { write(buf, 0, buf.length); }
public void checkSuccessfulRoundTripRandomSplits(int keysize, Random random, Bucket input, Bucket output, Bucket decoded) throws IOException { byte[] key = new byte[keysize]; random.nextBytes(key); OutputStream os = output.getOutputStream(); AEADOutputStream cos = AEADOutputStream.innerCreateAES(os, key, random); BucketTools.copyTo(input, new RandomShortWriteOutputStream(cos, random), -1); cos.close(); assertTrue(output.size() > input.size()); InputStream is = output.getInputStream(); AEADInputStream cis = AEADInputStream.createAES(is, key); BucketTools.copyFrom(decoded, new RandomShortReadInputStream(cis, random), -1); assertEquals(decoded.size(), input.size()); assertTrue(BucketTools.equalBuckets(decoded, input)); }
public void checkFailedCorruptedRoundTrip(int keysize, Random random, Bucket input, Bucket output, Bucket decoded) throws IOException { byte[] key = new byte[keysize]; random.nextBytes(key); OutputStream os = output.getOutputStream(); CorruptingOutputStream kos = new CorruptingOutputStream(os, 16L, input.size() + 16, 10, random); AEADOutputStream cos = AEADOutputStream.innerCreateAES(kos, key, random); BucketTools.copyTo(input, cos, -1); cos.close(); assertTrue(output.size() > input.size()); InputStream is = output.getInputStream(); AEADInputStream cis = AEADInputStream.createAES(is, key); try { BucketTools.copyFrom(decoded, cis, -1); cis.close(); fail("Checksum error should have been seen"); } catch (AEADVerificationFailedException e) { // Expected. } assertEquals(decoded.size(), input.size()); assertFalse(BucketTools.equalBuckets(decoded, input)); }