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