1 /* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <dcf/DrmRawContent.h> 18 19 20 DrmRawContent::DrmRawContent(istream& inRawData) 21 { 22 uint32_t count = inRawData.stream_size(); 23 24 if (count <= MAX_PIECE_LEN) 25 { 26 uint8_t* data = new uint8_t[count]; 27 28 if(!data) 29 { 30 return; 31 } 32 33 inRawData.read(data,count); 34 35 const uint8_t* dcf = data; 36 37 //parse DCF file header 38 if(false == parseDcfHeader(dcf)) 39 { 40 delete []data; 41 return; 42 } 43 44 dcf = data; 45 dcf += FIX_HEADER_LEN; 46 47 if(dcf >= (data + count)) 48 { 49 return; 50 } 51 52 // parse container box 53 FullBox conFullBox(dcf); 54 55 if(DCF_CONTAINER_BOX != conFullBox.getType()) 56 { 57 return; 58 } 59 60 //check whether it is multipart DCF or not 61 do 62 { 63 uint64_t size = conFullBox.getSize(); 64 65 mContainer.push_back(new DcfContainer(dcf,inRawData,dcf-data)); 66 67 dcf += size; 68 69 // come to the end of raw content 70 if(dcf >= (data + count)) 71 { 72 break; 73 } 74 75 conFullBox = FullBox(dcf); 76 }while(DCF_CONTAINER_BOX == conFullBox.getType()); 77 78 // compute DCF hash using Sha1Agent 79 Sha1Agent drmSha1Hash; 80 drmSha1Hash.computeHash(data,dcf-data,mDcfHash); 81 82 //// parse mutable box 83 84 delete []data; 85 } 86 } 87 88 DrmRawContent::~DrmRawContent() 89 { 90 uint32_t size = mContainer.size(); 91 92 for(uint32_t i = 0; i < size; i++) 93 { 94 delete mContainer[i]; 95 } 96 97 mContainer.clear(); 98 } 99 100 vector<DcfContainer*> DrmRawContent::getContents(void) const 101 { 102 return mContainer; 103 } 104 105 uint32_t DrmRawContent::getDcfHashLen() const 106 { 107 return DCF_HASH_LEN; 108 } 109 110 void DrmRawContent::getDcfHash(uint8_t* outDcfHash) const 111 { 112 if(outDcfHash) 113 { 114 memcpy(outDcfHash,mDcfHash,DCF_HASH_LEN); 115 } 116 117 return; 118 } 119 120 bool DrmRawContent::parseDcfHeader(const uint8_t* dcfHead) 121 { 122 if(!dcfHead) 123 { 124 return false; 125 } 126 127 if(FIX_HEADER_LEN != ntohl(*(uint32_t *)dcfHead)) 128 { 129 return false; 130 } 131 132 dcfHead += 4; 133 uint32_t type = *(uint32_t *)dcfHead; 134 135 if(DCF_FILE_TYPE != type) 136 { 137 return false; 138 } 139 140 dcfHead += 4; 141 type = *(uint32_t *)dcfHead; 142 143 if(DCF_FILE_BRAND != type) 144 { 145 return false; 146 } 147 148 dcfHead += 4; 149 if(2 != ntohl(*(uint32_t *)dcfHead)) 150 { 151 return false; 152 } 153 154 dcfHead += 4; 155 type = *(uint32_t *)dcfHead; 156 157 if(DCF_FILE_BRAND != type) 158 { 159 return false; 160 } 161 162 dcfHead += 4; 163 return true; 164 } 165