Android Open Source - conceal Tail Input Stream Test






From Project

Back to project page conceal.

License

The source code is released under:

BSD License For Conceal software Copyright (c) 2014, Facebook, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that...

If you think the Android project conceal listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 *  Copyright (c) 2014, Facebook, Inc.// ww  w . jav  a2 s  .c o  m
 *  All rights reserved.
 *
 *  This source code is licensed under the BSD-style license found in the
 *  LICENSE file in the root directory of this source tree. An additional grant
 *  of patent rights can be found in the PATENTS file in the same directory.
 *
 */

package com.facebook.crypto.streams;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Random;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class TailInputStreamTest {

  private TailInputStream mTailInputStream;
  private InputStream mInputStream;
  private byte[] mInputData;

  private final int TAIL_LENGTH = 16;

  @Before
  public void setUp() {
    mInputData = new byte[TAIL_LENGTH * 20 + 7];
    Random random = new Random();
    random.nextBytes(mInputData);
    mInputStream = new ByteArrayInputStream(mInputData);
    mTailInputStream = new TailInputStream(mInputStream, TAIL_LENGTH);
  }

  @Test
  public void testReadInSmallIncrements() throws IOException {
    byte[] temp = new byte[TAIL_LENGTH / 3];
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    readFully(mTailInputStream, temp, outputStream);
    byte[] tail = mTailInputStream.getTail();
    byte[] readData = outputStream.toByteArray();
    TailBufferHelper.verifyDataAndTailMatch(mInputData, readData, tail, TAIL_LENGTH);
  }

  @Test
  public void testReadInTagSizeIncrements() throws IOException {
    byte[] temp = new byte[TAIL_LENGTH];
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    readFully(mTailInputStream, temp, outputStream);
    byte[] tail = mTailInputStream.getTail();
    byte[] readData = outputStream.toByteArray();
    TailBufferHelper.verifyDataAndTailMatch(mInputData, readData, tail, TAIL_LENGTH);
  }

  @Test
  public void testReadInLargeIncrements() throws IOException {
    byte[] temp = new byte[TAIL_LENGTH * 2 + 3];
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    readFully(mTailInputStream, temp, outputStream);
    byte[] tail = mTailInputStream.getTail();
    byte[] readData = outputStream.toByteArray();
    TailBufferHelper.verifyDataAndTailMatch(mInputData, readData, tail, TAIL_LENGTH);
  }

  @Test
  public void testReadOneByteAtATime() throws IOException {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    int read;
    while ((read = mTailInputStream.read()) != -1) {
      outputStream.write(read);
    }
    byte[] tail = mTailInputStream.getTail();
    byte[] readData = outputStream.toByteArray();
    TailBufferHelper.verifyDataAndTailMatch(mInputData, readData, tail, TAIL_LENGTH);
  }

  @Test(expected = IOException.class)
  public void throwsWhenTailNotSufficient() throws IOException {
    byte[] data = new byte[TAIL_LENGTH - 1];
    TailInputStream tailStream =
        new TailInputStream(new ByteArrayInputStream(data), TAIL_LENGTH);
    byte[] temp = new byte[TAIL_LENGTH * 2 + 3];
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    readFully(tailStream, temp, outputStream);
    tailStream.getTail();
  }

  @Test
  public void testBytesReturnedByUnderlyingStreamIsReduced() throws IOException {
    InputStream inputStream = new ByteReducingInputStream(mInputStream, 2);
    TailInputStream tailInputStream =
        new TailInputStream(inputStream, TAIL_LENGTH);
    byte[] temp = new byte[TAIL_LENGTH * 2 + 3];
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    readFully(tailInputStream, temp, outputStream);
    byte[] tail = tailInputStream.getTail();
    byte[] readData = outputStream.toByteArray();
    TailBufferHelper.verifyDataAndTailMatch(mInputData, readData, tail, TAIL_LENGTH);
  }

  private void readFully(InputStream input,
      byte[] tempBuffer,
      ByteArrayOutputStream output) throws IOException {
    int read = 0;
    while ((read = input.read(tempBuffer)) != -1) {
      Assert.assertTrue(read > 0);
      output.write(tempBuffer, 0, read);
    }
  }

  private static class ByteReducingInputStream extends FilterInputStream {

    private final float mReduction;

    protected ByteReducingInputStream(InputStream in, float reduction) {
      super(in);
      mReduction = reduction;
    }

    public int read(byte[] buffer, int offset, int count) throws IOException {
      int newCount = (int) ((float) count / mReduction);
      return in.read(buffer, offset, newCount);
    }
  }
}




Java Source Code List

com.facebook.android.crypto.keychain.SecureRandomFix.java
com.facebook.android.crypto.keychain.SharedPrefsBackedKeyChainTest.java
com.facebook.android.crypto.keychain.SharedPrefsBackedKeyChain.java
com.facebook.crypto.BouncyCastleHelper.java
com.facebook.crypto.CipherHelper.java
com.facebook.crypto.CryptoSerializerHelper.java
com.facebook.crypto.CryptoTestUtils.java
com.facebook.crypto.Crypto.java
com.facebook.crypto.Entity.java
com.facebook.crypto.FakeKeyChain.java
com.facebook.crypto.FbInstrumentationTestRunner.java
com.facebook.crypto.NativeGCMCipherInputStreamTest.java
com.facebook.crypto.NativeGCMCipherOutputStreamTest.java
com.facebook.crypto.NativeMacLayeredInputStreamTest.java
com.facebook.crypto.NativeMacLayeredOutputStreamTest.java
com.facebook.crypto.SimpleDecryptTest.java
com.facebook.crypto.SimpleEncryptTest.java
com.facebook.crypto.VersionCodes.java
com.facebook.crypto.benchmarks.BenchmarkNativeCryptoLibrary.java
com.facebook.crypto.benchmarks.CipherReadBenchmark.java
com.facebook.crypto.benchmarks.CipherWriteBenchmark.java
com.facebook.crypto.benchmarks.MacBenchmark.java
com.facebook.crypto.benchmarks.cipher.AESCipher.java
com.facebook.crypto.benchmarks.cipher.BaseCipher.java
com.facebook.crypto.benchmarks.cipher.BouncyCastleCCMCipher.java
com.facebook.crypto.benchmarks.cipher.BouncyCastleGCMCipher.java
com.facebook.crypto.benchmarks.cipher.NativeGCMCipherHelper.java
com.facebook.crypto.benchmarks.mac.BaseMac.java
com.facebook.crypto.benchmarks.mac.HMAC.java
com.facebook.crypto.benchmarks.mac.NativeMacHelper.java
com.facebook.crypto.benchmarks.mac.streams.MacLayeredInputStream.java
com.facebook.crypto.benchmarks.mac.streams.MacLayeredOutputStream.java
com.facebook.crypto.cipher.NativeGCMCipherException.java
com.facebook.crypto.cipher.NativeGCMCipher.java
com.facebook.crypto.exception.CryptoInitializationException.java
com.facebook.crypto.exception.KeyChainException.java
com.facebook.crypto.keychain.KeyChain.java
com.facebook.crypto.mac.NativeMac.java
com.facebook.crypto.streams.BetterCipherInputStreamTest.java
com.facebook.crypto.streams.BetterCipherInputStream.java
com.facebook.crypto.streams.FixedSizeByteArrayOutputStream.java
com.facebook.crypto.streams.NativeGCMCipherInputStream.java
com.facebook.crypto.streams.NativeGCMCipherOutputStream.java
com.facebook.crypto.streams.NativeMacLayeredInputStream.java
com.facebook.crypto.streams.NativeMacLayeredOutputStream.java
com.facebook.crypto.streams.TailBufferHelper.java
com.facebook.crypto.streams.TailInputStreamTest.java
com.facebook.crypto.streams.TailInputStream.java
com.facebook.crypto.util.Assertions.java
com.facebook.crypto.util.NativeCryptoLibrary.java
com.facebook.crypto.util.SystemNativeCryptoLibrary.java
com.facebook.proguard.annotations.DoNotStrip.java
com.facebook.proguard.annotations.InternalBuildOnly.java
com.facebook.proguard.annotations.KeepGettersAndSetters.java