Android Open Source - conceal Native Mac






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./*from w  w  w .jav a2s. 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.mac;

import java.io.IOException;

import com.facebook.crypto.exception.CryptoInitializationException;
import com.facebook.crypto.util.Assertions;
import com.facebook.crypto.util.NativeCryptoLibrary;
import com.facebook.proguard.annotations.DoNotStrip;

@DoNotStrip
public class NativeMac {

  public static final String FAILURE = "Failure";
  public static final int KEY_LENGTH = 64;

  private static final String MAC_ALREADY_INIT = "Mac has already been initialized";
  private static final String MAC_NOT_INIT = "Mac has not been initialized";
  private static final String MAC_NOT_FINALIZED = "Mac has not been finalized";

  private STATE mCurrentState = STATE.UNINITIALIZED;

  private final NativeCryptoLibrary mNativeCryptoLibrary;

  private enum STATE {
    UNINITIALIZED,
    INITIALIZED,
    FINALIZED,
  };

  public NativeMac(NativeCryptoLibrary nativeCryptoLibrary) {
    mNativeCryptoLibrary = nativeCryptoLibrary;
  }

  public void init(byte[] key, int len) throws CryptoInitializationException, IOException {
    Assertions.checkState(mCurrentState == STATE.UNINITIALIZED, MAC_ALREADY_INIT);
    mNativeCryptoLibrary.ensureCryptoLoaded();
    if (nativeInit(key, len) == nativeFailure()) {
      throw new IOException(FAILURE);
    }
    mCurrentState = STATE.INITIALIZED;
  }

  public void update(byte read) throws IOException {
    Assertions.checkState(mCurrentState == STATE.INITIALIZED, MAC_NOT_INIT);
    if (nativeUpdate(read) == nativeFailure()) {
      throw new IOException(FAILURE);
    }
  }

  public void update(byte[] buffer, int offset, int len) throws IOException {
    Assertions.checkState(mCurrentState == STATE.INITIALIZED, MAC_NOT_INIT);
    if (nativeUpdate(buffer, offset, len) == nativeFailure()) {
      throw new IOException(FAILURE);
    }
  }

  public byte[] doFinal() throws IOException {
    Assertions.checkState(mCurrentState == STATE.INITIALIZED, MAC_NOT_INIT);
    mCurrentState = STATE.FINALIZED;
    byte[] toReturn = nativeDoFinal();
    if (toReturn == null) {
      throw new IOException(FAILURE);
    }

    return toReturn;
  }

  public void destroy() throws IOException {
    Assertions.checkState(mCurrentState == STATE.FINALIZED, MAC_NOT_FINALIZED);
    if (nativeDestroy() == nativeFailure()) {
      throw new IOException(FAILURE);
    }
    mCurrentState = STATE.UNINITIALIZED;
  }

  public int getMacLength() {
    return nativeGetMacLength();
  }

  // Used to store the HMAC context.
  @DoNotStrip
  private int mCtxPtr;

  // The integer value representing failure in JNI world.
  private static native int nativeFailure();

  private native int nativeInit(byte[] key, int len);

  private native int nativeUpdate(byte read);
  private native int nativeUpdate(byte[] buffer, int offset, int len);

  private native byte[] nativeDoFinal();

  private native int nativeDestroy();

  private native int nativeGetMacLength();
}




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