blob: 6056f815b7b677b01c6613b8d51be66ce93dd134 [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 */
16
17#include "CryptoPlugin.h"
18#include "TypeConvert.h"
19
20#include <media/stagefright/foundation/AString.h>
21
22#include <hidlmemory/mapping.h>
23#include <android/hidl/memory/1.0/IMemory.h>
Jeff Tinkerd59d3622016-12-16 01:34:52 -080024#include <utils/Log.h>
Jeff Tinkerb075caa2016-12-06 23:15:20 -080025
26using android::hidl::memory::V1_0::IMemory;
27
28
29namespace android {
30namespace hardware {
31namespace drm {
32namespace crypto {
33namespace V1_0 {
34namespace implementation {
35
36 // Methods from ::android::hardware::drm::crypto::V1_0::ICryptoPlugin follow
37 Return<bool> CryptoPlugin::requiresSecureDecoderComponent(
38 const hidl_string& mime) {
39 return mLegacyPlugin->requiresSecureDecoderComponent(mime);
40 }
41
42 Return<void> CryptoPlugin::notifyResolution(uint32_t width,
43 uint32_t height) {
44 mLegacyPlugin->notifyResolution(width, height);
45 return Void();
46 }
47
48 Return<Status> CryptoPlugin::setMediaDrmSession(
49 const hidl_vec<uint8_t>& sessionId) {
50 return toStatus(mLegacyPlugin->setMediaDrmSession(toVector(sessionId)));
51 }
52
53 Return<void> CryptoPlugin::decrypt(bool secure,
54 const hidl_array<uint8_t, 16>& keyId,
55 const hidl_array<uint8_t, 16>& iv, Mode mode,
56 const Pattern& pattern, const hidl_vec<SubSample>& subSamples,
Jeff Tinkerd59d3622016-12-16 01:34:52 -080057 const hidl_memory& source, const DestinationBuffer& destination,
Jeff Tinkerb075caa2016-12-06 23:15:20 -080058 decrypt_cb _hidl_cb) {
59
60 android::CryptoPlugin::Mode legacyMode;
61 switch(mode) {
62 case Mode::UNENCRYPTED:
63 legacyMode = android::CryptoPlugin::kMode_Unencrypted;
64 break;
65 case Mode::AES_CTR:
66 legacyMode = android::CryptoPlugin::kMode_AES_CTR;
67 break;
68 case Mode::AES_CBC_CTS:
69 legacyMode = android::CryptoPlugin::kMode_AES_WV;
70 break;
71 case Mode::AES_CBC:
72 legacyMode = android::CryptoPlugin::kMode_AES_CBC;
73 break;
74 }
75 android::CryptoPlugin::Pattern legacyPattern;
76 legacyPattern.mEncryptBlocks = pattern.encryptBlocks;
77 legacyPattern.mSkipBlocks = pattern.skipBlocks;
78
79 android::CryptoPlugin::SubSample *legacySubSamples =
80 new android::CryptoPlugin::SubSample[subSamples.size()];
81
82 for (size_t i = 0; i < subSamples.size(); i++) {
83 legacySubSamples[i].mNumBytesOfClearData
84 = subSamples[i].numBytesOfClearData;
85 legacySubSamples[i].mNumBytesOfEncryptedData
86 = subSamples[i].numBytesOfEncryptedData;
87 }
88
89 AString detailMessage;
90
91 void *destPtr = NULL;
Jeff Tinkerd59d3622016-12-16 01:34:52 -080092 sp<IMemory> sharedSourceMemory = mapMemory(source);
93 sp<IMemory> sharedDestinationMemory;
Jeff Tinkerb075caa2016-12-06 23:15:20 -080094
95 if (destination.type == BufferType::SHARED_MEMORY) {
Jeff Tinkerd59d3622016-12-16 01:34:52 -080096 sharedDestinationMemory = mapMemory(destination.nonsecureMemory);
97 sharedDestinationMemory->update();
98 destPtr = sharedDestinationMemory->getPointer();
Jeff Tinkerb075caa2016-12-06 23:15:20 -080099 } else if (destination.type == BufferType::NATIVE_HANDLE) {
100 native_handle_t *handle = const_cast<native_handle_t *>(
101 destination.secureMemory.getNativeHandle());
102 destPtr = static_cast<void *>(handle);
103 }
104 ssize_t result = mLegacyPlugin->decrypt(secure, keyId.data(), iv.data(),
Jeff Tinkerd59d3622016-12-16 01:34:52 -0800105 legacyMode, legacyPattern, sharedSourceMemory->getPointer(),
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800106 legacySubSamples, subSamples.size(), destPtr, &detailMessage);
107
108 if (destination.type == BufferType::SHARED_MEMORY) {
Jeff Tinkerd59d3622016-12-16 01:34:52 -0800109 sharedDestinationMemory->commit();
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800110 }
Jeff Tinkerd59d3622016-12-16 01:34:52 -0800111
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800112 delete[] legacySubSamples;
113
114 uint32_t status;
115 uint32_t bytesWritten;
116
117 if (result >= 0) {
118 status = android::OK;
119 bytesWritten = result;
120 } else {
121 status = -result;
122 bytesWritten = 0;
123 }
124
Jeff Tinker01f0a5a2017-01-12 09:22:18 -0800125 _hidl_cb(toStatus(status), bytesWritten, detailMessage.c_str());
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800126 return Void();
127 }
128
129} // namespace implementation
130} // namespace V1_0
131} // namespace crypto
132} // namespace drm
133} // namespace hardware
134} // namespace android