blob: fb61ede14f9414201ca2ca10dea676ac3fbc5cf3 [file] [log] [blame]
Jeff Tinkerb075caa2016-12-06 23:15:20 -08001/*
2 * Copyright (C) 2016 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 */
Jeff Tinker972a3e32017-01-23 14:02:50 -080016#define LOG_TAG "android.hardware.drm@1.0-impl"
Jeff Tinkerb075caa2016-12-06 23:15:20 -080017
18#include "CryptoPlugin.h"
19#include "TypeConvert.h"
20
Jeff Tinkerb075caa2016-12-06 23:15:20 -080021#include <android/hidl/memory/1.0/IMemory.h>
Jeff Tinkerf21cdaf2017-01-18 11:49:27 -080022#include <hidlmemory/mapping.h>
23#include <media/stagefright/foundation/AString.h>
Jeff Tinkerd59d3622016-12-16 01:34:52 -080024#include <utils/Log.h>
Jeff Tinkerb075caa2016-12-06 23:15:20 -080025
Jeff Tinkerf21cdaf2017-01-18 11:49:27 -080026using android::hardware::hidl_memory;
Jeff Tinkerb075caa2016-12-06 23:15:20 -080027using android::hidl::memory::V1_0::IMemory;
28
Jeff Tinkerb075caa2016-12-06 23:15:20 -080029namespace android {
30namespace hardware {
31namespace drm {
Jeff Tinkerb075caa2016-12-06 23:15:20 -080032namespace V1_0 {
33namespace implementation {
34
Jeff Tinkerda002fe2017-01-19 14:41:11 -080035 // Methods from ::android::hardware::drm::V1_0::ICryptoPlugin follow
Jeff Tinkerb075caa2016-12-06 23:15:20 -080036 Return<bool> CryptoPlugin::requiresSecureDecoderComponent(
37 const hidl_string& mime) {
38 return mLegacyPlugin->requiresSecureDecoderComponent(mime);
39 }
40
41 Return<void> CryptoPlugin::notifyResolution(uint32_t width,
42 uint32_t height) {
43 mLegacyPlugin->notifyResolution(width, height);
44 return Void();
45 }
46
47 Return<Status> CryptoPlugin::setMediaDrmSession(
48 const hidl_vec<uint8_t>& sessionId) {
49 return toStatus(mLegacyPlugin->setMediaDrmSession(toVector(sessionId)));
50 }
51
Jeff Tinkerf21cdaf2017-01-18 11:49:27 -080052 Return<void> CryptoPlugin::setSharedBufferBase(const hidl_memory& base) {
53 mSharedBufferBase = mapMemory(base);
54 return Void();
55 }
56
Jeff Tinkerb075caa2016-12-06 23:15:20 -080057 Return<void> CryptoPlugin::decrypt(bool secure,
58 const hidl_array<uint8_t, 16>& keyId,
59 const hidl_array<uint8_t, 16>& iv, Mode mode,
60 const Pattern& pattern, const hidl_vec<SubSample>& subSamples,
Jeff Tinkerda002fe2017-01-19 14:41:11 -080061 const SharedBuffer& source, uint64_t offset,
Jeff Tinker6fdbe862017-01-11 19:45:23 -080062 const DestinationBuffer& destination,
Jeff Tinkerb075caa2016-12-06 23:15:20 -080063 decrypt_cb _hidl_cb) {
64
Jeff Tinkerdc8e2d02017-01-23 14:24:12 -080065 if (mSharedBufferBase == NULL) {
66 _hidl_cb(Status::BAD_VALUE, 0, "decrypt buffer base not set");
67 return Void();
68 }
69
Jeff Tinkerb075caa2016-12-06 23:15:20 -080070 android::CryptoPlugin::Mode legacyMode;
71 switch(mode) {
72 case Mode::UNENCRYPTED:
73 legacyMode = android::CryptoPlugin::kMode_Unencrypted;
74 break;
75 case Mode::AES_CTR:
76 legacyMode = android::CryptoPlugin::kMode_AES_CTR;
77 break;
78 case Mode::AES_CBC_CTS:
79 legacyMode = android::CryptoPlugin::kMode_AES_WV;
80 break;
81 case Mode::AES_CBC:
82 legacyMode = android::CryptoPlugin::kMode_AES_CBC;
83 break;
84 }
85 android::CryptoPlugin::Pattern legacyPattern;
86 legacyPattern.mEncryptBlocks = pattern.encryptBlocks;
87 legacyPattern.mSkipBlocks = pattern.skipBlocks;
88
89 android::CryptoPlugin::SubSample *legacySubSamples =
90 new android::CryptoPlugin::SubSample[subSamples.size()];
91
92 for (size_t i = 0; i < subSamples.size(); i++) {
93 legacySubSamples[i].mNumBytesOfClearData
94 = subSamples[i].numBytesOfClearData;
95 legacySubSamples[i].mNumBytesOfEncryptedData
96 = subSamples[i].numBytesOfEncryptedData;
97 }
98
99 AString detailMessage;
100
Jeff Tinkerf21cdaf2017-01-18 11:49:27 -0800101 if (source.offset + offset + source.size > mSharedBufferBase->getSize()) {
102 _hidl_cb(Status::ERROR_DRM_CANNOT_HANDLE, 0, "invalid buffer size");
103 return Void();
104 }
Jeff Tinker6fdbe862017-01-11 19:45:23 -0800105
Jeff Tinkerf21cdaf2017-01-18 11:49:27 -0800106 uint8_t *base = static_cast<uint8_t *>
107 (static_cast<void *>(mSharedBufferBase->getPointer()));
108 void *srcPtr = static_cast<void *>(base + source.offset + offset);
Jeff Tinker6fdbe862017-01-11 19:45:23 -0800109
Jeff Tinker6fdbe862017-01-11 19:45:23 -0800110 void *destPtr = NULL;
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800111 if (destination.type == BufferType::SHARED_MEMORY) {
Jeff Tinkerf21cdaf2017-01-18 11:49:27 -0800112 const SharedBuffer& destBuffer = destination.nonsecureMemory;
113 if (destBuffer.offset + destBuffer.size > mSharedBufferBase->getSize()) {
114 _hidl_cb(Status::ERROR_DRM_CANNOT_HANDLE, 0, "invalid buffer size");
115 return Void();
116 }
117 destPtr = static_cast<void *>(base + destination.nonsecureMemory.offset);
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800118 } else if (destination.type == BufferType::NATIVE_HANDLE) {
119 native_handle_t *handle = const_cast<native_handle_t *>(
120 destination.secureMemory.getNativeHandle());
121 destPtr = static_cast<void *>(handle);
122 }
123 ssize_t result = mLegacyPlugin->decrypt(secure, keyId.data(), iv.data(),
Jeff Tinker6fdbe862017-01-11 19:45:23 -0800124 legacyMode, legacyPattern, srcPtr, legacySubSamples,
125 subSamples.size(), destPtr, &detailMessage);
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800126
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800127 delete[] legacySubSamples;
128
129 uint32_t status;
130 uint32_t bytesWritten;
131
132 if (result >= 0) {
133 status = android::OK;
134 bytesWritten = result;
135 } else {
136 status = -result;
137 bytesWritten = 0;
138 }
139
Jeff Tinker01f0a5a2017-01-12 09:22:18 -0800140 _hidl_cb(toStatus(status), bytesWritten, detailMessage.c_str());
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800141 return Void();
142 }
143
144} // namespace implementation
145} // namespace V1_0
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800146} // namespace drm
147} // namespace hardware
148} // namespace android