1b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro/* 2b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * Copyright 2017 The Android Open Source Project 3b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * 4b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * Licensed under the Apache License, Version 2.0 (the "License"); 5b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * you may not use this file except in compliance with the License. 6b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * You may obtain a copy of the License at 7b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * 8b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * http://www.apache.org/licenses/LICENSE-2.0 9b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * 10b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * Unless required by applicable law or agreed to in writing, software 11b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * distributed under the License is distributed on an "AS IS" BASIS, 12b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * See the License for the specific language governing permissions and 14b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * limitations under the License. 15b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro */ 16b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguropackage android.hardware.location; 17b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 18f2b6f014a7c44f5828dfee88d6f3592fa50b64e4Arthur Ishiguroimport android.annotation.SystemApi; 19b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguroimport android.os.Parcel; 20b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguroimport android.os.Parcelable; 21b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguroimport android.util.Log; 22b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 23b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguroimport java.nio.BufferUnderflowException; 24b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguroimport java.nio.ByteBuffer; 25b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguroimport java.nio.ByteOrder; 260d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguroimport java.util.Arrays; 27b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 28b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro/** 29b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * @hide 30b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro */ 31f2b6f014a7c44f5828dfee88d6f3592fa50b64e4Arthur Ishiguro@SystemApi 32b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguropublic final class NanoAppBinary implements Parcelable { 33b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro private static final String TAG = "NanoAppBinary"; 34b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 35b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro /* 36b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * The contents of the app binary. 37b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro */ 38b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro private byte[] mNanoAppBinary; 39b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 40b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro /* 41b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * Contents of the nanoapp binary header. 42b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * 43b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * Only valid if mHasValidHeader is true. 44b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * See nano_app_binary_t in context_hub.h for details. 45b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro */ 46b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro private int mHeaderVersion; 47b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro private int mMagic; 48b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro private long mNanoAppId; 49b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro private int mNanoAppVersion; 50b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro private int mFlags; 51b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro private long mHwHubType; 52b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro private byte mTargetChreApiMajorVersion; 53b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro private byte mTargetChreApiMinorVersion; 54b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 55b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro private boolean mHasValidHeader = false; 56b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 57b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro /* 58b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * The header version used to parse the binary in parseBinaryHeader(). 59b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro */ 60b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro private static final int EXPECTED_HEADER_VERSION = 1; 61b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 62b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro /* 630d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro * The magic value expected in the header as defined in context_hub.h. 64b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro */ 65b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro private static final int EXPECTED_MAGIC_VALUE = 66b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro (((int) 'N' << 0) | ((int) 'A' << 8) | ((int) 'N' << 16) | ((int) 'O' << 24)); 67b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 68b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro /* 69b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * Byte order established in context_hub.h 70b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro */ 71b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro private static final ByteOrder HEADER_ORDER = ByteOrder.LITTLE_ENDIAN; 72b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 730d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro /* 740d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro * The size of the header in bytes as defined in context_hub.h. 750d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro */ 760d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro private static final int HEADER_SIZE_BYTES = 40; 770d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro 780d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro /* 790d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro * The bit fields for mFlags as defined in context_hub.h. 800d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro */ 810d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro private static final int NANOAPP_SIGNED_FLAG_BIT = 0x1; 820d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro private static final int NANOAPP_ENCRYPTED_FLAG_BIT = 0x2; 830d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro 84b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro public NanoAppBinary(byte[] appBinary) { 85b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro mNanoAppBinary = appBinary; 86b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro parseBinaryHeader(); 87b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 88b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 89b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro /* 90b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * Parses the binary header and populates its field using mNanoAppBinary. 91b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro */ 92b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro private void parseBinaryHeader() { 93b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro ByteBuffer buf = ByteBuffer.wrap(mNanoAppBinary).order(HEADER_ORDER); 94b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 95b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro mHasValidHeader = false; 96b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro try { 97b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro mHeaderVersion = buf.getInt(); 98b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro if (mHeaderVersion != EXPECTED_HEADER_VERSION) { 99b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro Log.e(TAG, "Unexpected header version " + mHeaderVersion + " while parsing header" 100b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro + " (expected " + EXPECTED_HEADER_VERSION + ")"); 101b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro return; 102b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 103b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 104b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro mMagic = buf.getInt(); 105b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro mNanoAppId = buf.getLong(); 106b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro mNanoAppVersion = buf.getInt(); 107b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro mFlags = buf.getInt(); 108b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro mHwHubType = buf.getLong(); 109b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro mTargetChreApiMajorVersion = buf.get(); 110b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro mTargetChreApiMinorVersion = buf.get(); 111b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } catch (BufferUnderflowException e) { 112b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro Log.e(TAG, "Not enough contents in nanoapp header"); 113b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro return; 114b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 115b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 116b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro if (mMagic != EXPECTED_MAGIC_VALUE) { 117b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro Log.e(TAG, "Unexpected magic value " + String.format("0x%08X", mMagic) 118b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro + "while parsing header (expected " 119b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro + String.format("0x%08X", EXPECTED_MAGIC_VALUE) + ")"); 120b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } else { 121b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro mHasValidHeader = true; 122b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 123b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 124b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 125b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro /** 126b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * @return the app binary byte array 127b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro */ 1280d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro public byte[] getBinary() { 129b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro return mNanoAppBinary; 130b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 131b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 132b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro /** 1330d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro * @return the app binary byte array without the leading header 1340d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro * 1350d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro * @throws IndexOutOfBoundsException if the nanoapp binary size is smaller than the header size 1360d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro * @throws NullPointerException if the nanoapp binary is null 1370d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro */ 1380d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro public byte[] getBinaryNoHeader() { 1390d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro if (mNanoAppBinary.length < HEADER_SIZE_BYTES) { 1400d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro throw new IndexOutOfBoundsException("NanoAppBinary binary byte size (" 1410d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro + mNanoAppBinary.length + ") is less than header size (" + HEADER_SIZE_BYTES + ")"); 1420d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro } 1430d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro 1440d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro return Arrays.copyOfRange(mNanoAppBinary, HEADER_SIZE_BYTES, mNanoAppBinary.length); 1450d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro } 1460d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro 1470d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro /** 148b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * @return {@code true} if the header is valid, {@code false} otherwise 149b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro */ 150b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro public boolean hasValidHeader() { 151b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro return mHasValidHeader; 152b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 153b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 154b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro /** 155b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * @return the header version 156b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro */ 157b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro public int getHeaderVersion() { 158b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro return mHeaderVersion; 159b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 160b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 161b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro /** 162b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * @return the app ID parsed from the nanoapp header 163b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro */ 164b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro public long getNanoAppId() { 165b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro return mNanoAppId; 166b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 167b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 168b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro /** 169b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * @return the app version parsed from the nanoapp header 170b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro */ 171b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro public int getNanoAppVersion() { 172b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro return mNanoAppVersion; 173b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 174b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 175b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro /** 176b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * @return the compile target hub type parsed from the nanoapp header 177b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro */ 178b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro public long getHwHubType() { 179b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro return mHwHubType; 180b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 181b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 182b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro /** 183b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * @return the target CHRE API major version parsed from the nanoapp header 184b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro */ 185b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro public byte getTargetChreApiMajorVersion() { 186b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro return mTargetChreApiMajorVersion; 187b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 188b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 189b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro /** 190b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * @return the target CHRE API minor version parsed from the nanoapp header 191b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro */ 192b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro public byte getTargetChreApiMinorVersion() { 193b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro return mTargetChreApiMinorVersion; 194b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 195b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 1960d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro /** 1970d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro * Returns the flags for the nanoapp as defined in context_hub.h. 1980d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro * 1990d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro * This method is meant to be used by the Context Hub Service. 2000d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro * 2010d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro * @return the flags for the nanoapp 2020d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro */ 2030d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro public int getFlags() { 2040d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro return mFlags; 2050d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro } 2060d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro 2070d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro /** 2080d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro * @return {@code true} if the nanoapp binary is signed, {@code false} otherwise 2090d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro */ 2100d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro public boolean isSigned() { 2110d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro return (mFlags & NANOAPP_SIGNED_FLAG_BIT) != 0; 2120d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro } 2130d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro 2140d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro /** 2150d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro * @return {@code true} if the nanoapp binary is encrypted, {@code false} otherwise 2160d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro */ 2170d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro public boolean isEncrypted() { 2180d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro return (mFlags & NANOAPP_ENCRYPTED_FLAG_BIT) != 0; 2190d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro } 2200d719c2af9545a114342cba44cbaec3363435975Arthur Ishiguro 221b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro private NanoAppBinary(Parcel in) { 222b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro int binaryLength = in.readInt(); 223b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro mNanoAppBinary = new byte[binaryLength]; 224b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro in.readByteArray(mNanoAppBinary); 225b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 226b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro parseBinaryHeader(); 227b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 228b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 229b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro @Override 230b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro public int describeContents() { 231b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro return 0; 232b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 233b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 234b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro @Override 235b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro public void writeToParcel(Parcel out, int flags) { 236b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro out.writeInt(mNanoAppBinary.length); 237b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro out.writeByteArray(mNanoAppBinary); 238b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 239b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 240b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro public static final Creator<NanoAppBinary> CREATOR = 241b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro new Creator<NanoAppBinary>() { 242b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro @Override 243b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro public NanoAppBinary createFromParcel(Parcel in) { 244b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro return new NanoAppBinary(in); 245b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 246b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 247b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro @Override 248b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro public NanoAppBinary[] newArray(int size) { 249b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro return new NanoAppBinary[size]; 250b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 251b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro }; 252b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro} 253