Android Open Source - conceal Native Mac Layered 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.//w  ww  .  ja va2 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;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Random;

import android.test.InstrumentationTestCase;

import com.facebook.crypto.keychain.KeyChain;
import com.facebook.crypto.util.NativeCryptoLibrary;
import com.facebook.crypto.util.SystemNativeCryptoLibrary;

import com.google.common.io.ByteStreams;

public class NativeMacLayeredInputStreamTest extends InstrumentationTestCase {

  private byte[] mData;
  private byte[] mDataWithMac;
  private NativeCryptoLibrary mNativeCryptoLibrary;
  private Crypto mCrypto;
  private Entity mEntity;
  private KeyChain mKeyChain;

  public void setUp() throws Exception {
    mNativeCryptoLibrary = new SystemNativeCryptoLibrary();
    mKeyChain = new FakeKeyChain();
    mCrypto = new Crypto(mKeyChain, mNativeCryptoLibrary);

    mData = new byte[CryptoTestUtils.NUM_DATA_BYTES];
    Random random = new Random();
    random.nextBytes(mData);

    ByteArrayOutputStream bout = new ByteArrayOutputStream();
    mEntity = new Entity(CryptoTestUtils.ENTITY_NAME);
    OutputStream outputStream = mCrypto.getMacOutputStream(bout, mEntity);
    outputStream.write(mData);
    outputStream.close();
    mDataWithMac = bout.toByteArray();
  }

  public void testMacValidIfDataNotTamperedReadOneByteAtATime() throws Exception {
    InputStream macStream = mCrypto.getMacInputStream(
      new ByteArrayInputStream(mDataWithMac),
      mEntity);
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    int read;
    while ((read = macStream.read()) != -1) {
      output.write(read);
    }
    macStream.close();
    assertTrue(Arrays.equals(mData, output.toByteArray()));
  }

  public void testMacValidIfDataNotTampered() throws Exception {
    InputStream macStream = mCrypto.getMacInputStream(
        new ByteArrayInputStream(mDataWithMac),
        mEntity);
    byte[] output = ByteStreams.toByteArray(macStream);
    macStream.close();
    assertTrue(Arrays.equals(mData, output));
  }

  public void testMacNotValidIfDataTampered() throws Exception {
    byte[] tamperedData = mDataWithMac.clone();
    tamperedData[4] += 1;
    InputStream macStream = mCrypto.getMacInputStream(
        new ByteArrayInputStream(tamperedData),
        mEntity);
    try {
      ByteStreams.toByteArray(macStream);
    } catch (IOException e) {
      return;
    }
    fail("Mac should not be valid");
  }

  public void testMacNotValidIfMacTampered() throws Exception {
    byte[] tamperedData = mDataWithMac.clone();
    tamperedData[tamperedData.length - 1] += 1;
    InputStream macStream = mCrypto.getMacInputStream(
        new ByteArrayInputStream(tamperedData),
        mEntity);
    try {
      ByteStreams.toByteArray(macStream);
    } catch (IOException e) {
      return;
    }
    fail("Mac should not be valid");
  }

  public void testMacNotValidIfEntityDifferent() throws Exception {
    Entity fakeEntity = new Entity(CryptoTestUtils.FAKE_ENTITY_NAME);
    InputStream macStream = mCrypto.getMacInputStream(
        new ByteArrayInputStream(mDataWithMac),
        fakeEntity);
    try {
      ByteStreams.toByteArray(macStream);
    } catch (IOException e) {
      return;
    }
    fail("Mac should not be valid");
  }

  public void testThrowsOnCloseIfAllDataNotRead() throws Exception {
    InputStream macStream = mCrypto.getMacInputStream(
        new ByteArrayInputStream(mDataWithMac),
        mEntity);
    byte[] plainData = new byte[mDataWithMac.length - 200];
    macStream.read(plainData);
    try {
      macStream.close();
    } catch (IOException e) {
      return;
    }
    fail("Mac should not be valid");
  }

  public void testCompatibleWithJavaMac() throws Exception {
    Mac mac = Mac.getInstance("HmacSHA1");
    mac.init(new SecretKeySpec(mKeyChain.getMacKey(), "HmacSHA1"));
    byte[] entityBytes = mEntity.getBytes();
    byte[] aadBytes = CryptoSerializerHelper.computeBytesToAuthenticate(entityBytes,
        VersionCodes.MAC_SERIALIZATION_VERSION,
        VersionCodes.MAC_ID);

    mac.update(aadBytes);
    byte[] macBytes = mac.doFinal(mData);

    byte[] dataWithMac = CryptoSerializerHelper.createMacData(mData, macBytes);
    InputStream macStream = mCrypto.getMacInputStream(
        new ByteArrayInputStream(dataWithMac),
        mEntity);
    ByteStreams.toByteArray(macStream);
  }
}




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