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