17cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root/*
27cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root * Copyright (C) 2010 The Android Open Source Project
37cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root *
47cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root * Licensed under the Apache License, Version 2.0 (the "License");
57cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root * you may not use this file except in compliance with the License.
67cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root * You may obtain a copy of the License at
77cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root *
87cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root *      http://www.apache.org/licenses/LICENSE-2.0
97cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root *
107cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root * Unless required by applicable law or agreed to in writing, software
117cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root * distributed under the License is distributed on an "AS IS" BASIS,
127cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root * See the License for the specific language governing permissions and
147cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root * limitations under the License.
157cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root */
167cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root
177cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root#ifndef OBBFILE_H_
187cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root#define OBBFILE_H_
197cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root
207cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root#include <stdint.h>
2102ca31fbae9f35dd30f79de6927fae11b549391aKenny Root#include <strings.h>
227cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root
237cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root#include <utils/RefBase.h>
247cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root#include <utils/String8.h>
257cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root
267cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Rootnamespace android {
277cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root
2802ca31fbae9f35dd30f79de6927fae11b549391aKenny Root// OBB flags (bit 0)
2902ca31fbae9f35dd30f79de6927fae11b549391aKenny Root#define OBB_OVERLAY         (1 << 0)
303b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root#define OBB_SALTED          (1 << 1)
3102ca31fbae9f35dd30f79de6927fae11b549391aKenny Root
327cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Rootclass ObbFile : public RefBase {
337cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Rootprotected:
347cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    virtual ~ObbFile();
357cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root
367cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Rootpublic:
377cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    ObbFile();
387cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root
397cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    bool readFrom(const char* filename);
407cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    bool readFrom(int fd);
417cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    bool writeTo(const char* filename);
427cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    bool writeTo(int fd);
436e7ac5f0bceddf51947fbf3b376e278df0735603Kenny Root    bool removeFrom(const char* filename);
446e7ac5f0bceddf51947fbf3b376e278df0735603Kenny Root    bool removeFrom(int fd);
457cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root
467cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    const char* getFileName() const {
477cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root        return mFileName;
487cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    }
497cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root
507cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    const String8 getPackageName() const {
517cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root        return mPackageName;
527cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    }
537cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root
547cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    void setPackageName(String8 packageName) {
557cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root        mPackageName = packageName;
567cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    }
577cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root
5802ca31fbae9f35dd30f79de6927fae11b549391aKenny Root    int32_t getVersion() const {
5902ca31fbae9f35dd30f79de6927fae11b549391aKenny Root        return mVersion;
6002ca31fbae9f35dd30f79de6927fae11b549391aKenny Root    }
6102ca31fbae9f35dd30f79de6927fae11b549391aKenny Root
627cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    void setVersion(int32_t version) {
637cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root        mVersion = version;
647cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    }
657cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root
6602ca31fbae9f35dd30f79de6927fae11b549391aKenny Root    int32_t getFlags() const {
6702ca31fbae9f35dd30f79de6927fae11b549391aKenny Root        return mFlags;
6802ca31fbae9f35dd30f79de6927fae11b549391aKenny Root    }
6902ca31fbae9f35dd30f79de6927fae11b549391aKenny Root
7002ca31fbae9f35dd30f79de6927fae11b549391aKenny Root    void setFlags(int32_t flags) {
7102ca31fbae9f35dd30f79de6927fae11b549391aKenny Root        mFlags = flags;
7202ca31fbae9f35dd30f79de6927fae11b549391aKenny Root    }
7302ca31fbae9f35dd30f79de6927fae11b549391aKenny Root
743b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root    const unsigned char* getSalt(size_t* length) const {
753b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root        if ((mFlags & OBB_SALTED) == 0) {
763b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root            *length = 0;
773b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root            return NULL;
783b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root        }
793b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root
803b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root        *length = sizeof(mSalt);
813b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root        return mSalt;
823b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root    }
833b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root
843b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root    bool setSalt(const unsigned char* salt, size_t length) {
853b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root        if (length != sizeof(mSalt)) {
863b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root            return false;
873b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root        }
883b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root
893b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root        memcpy(mSalt, salt, sizeof(mSalt));
903b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root        mFlags |= OBB_SALTED;
913b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root        return true;
923b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root    }
933b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root
9402ca31fbae9f35dd30f79de6927fae11b549391aKenny Root    bool isOverlay() {
9502ca31fbae9f35dd30f79de6927fae11b549391aKenny Root        return (mFlags & OBB_OVERLAY) == OBB_OVERLAY;
9602ca31fbae9f35dd30f79de6927fae11b549391aKenny Root    }
9702ca31fbae9f35dd30f79de6927fae11b549391aKenny Root
9802ca31fbae9f35dd30f79de6927fae11b549391aKenny Root    void setOverlay(bool overlay) {
9902ca31fbae9f35dd30f79de6927fae11b549391aKenny Root        if (overlay) {
10002ca31fbae9f35dd30f79de6927fae11b549391aKenny Root            mFlags |= OBB_OVERLAY;
10102ca31fbae9f35dd30f79de6927fae11b549391aKenny Root        } else {
10202ca31fbae9f35dd30f79de6927fae11b549391aKenny Root            mFlags &= ~OBB_OVERLAY;
10302ca31fbae9f35dd30f79de6927fae11b549391aKenny Root        }
10402ca31fbae9f35dd30f79de6927fae11b549391aKenny Root    }
10502ca31fbae9f35dd30f79de6927fae11b549391aKenny Root
1067cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    static inline uint32_t get4LE(const unsigned char* buf) {
1077cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root        return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
1087cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    }
1097cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root
1107cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    static inline void put4LE(unsigned char* buf, uint32_t val) {
1117cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root        buf[0] = val & 0xFF;
1127cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root        buf[1] = (val >> 8) & 0xFF;
1137cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root        buf[2] = (val >> 16) & 0xFF;
1147cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root        buf[3] = (val >> 24) & 0xFF;
1157cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    }
1167cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root
1177cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Rootprivate:
1187cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    /* Package name this ObbFile is associated with */
1197cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    String8 mPackageName;
1207cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root
1217cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    /* Package version this ObbFile is associated with */
1227cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    int32_t mVersion;
1237cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root
12402ca31fbae9f35dd30f79de6927fae11b549391aKenny Root    /* Flags for this OBB type. */
12502ca31fbae9f35dd30f79de6927fae11b549391aKenny Root    int32_t mFlags;
12602ca31fbae9f35dd30f79de6927fae11b549391aKenny Root
1273b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root    /* Whether the file is salted. */
1283b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root    bool mSalted;
1293b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root
1303b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root    /* The encryption salt. */
1313b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root    unsigned char mSalt[8];
1323b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root
1337cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    const char* mFileName;
1347cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root
1357cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    size_t mFileSize;
1367cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root
1376e7ac5f0bceddf51947fbf3b376e278df0735603Kenny Root    size_t mFooterStart;
1386e7ac5f0bceddf51947fbf3b376e278df0735603Kenny Root
1397cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    unsigned char* mReadBuf;
1407cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root
1417cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root    bool parseObbFile(int fd);
1427cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root};
1437cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root
1447cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root}
1457cee34a051eb0087322c8b965e498f88b1aa52d3Kenny Root#endif /* OBBFILE_H_ */
146