blob: 81365c82d441a1e38cb76319042cd783741defea [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 Tinker6fdbe862017-01-11 19:45:23 -080057 const hidl_memory& source, uint32_t offset,
58 const DestinationBuffer& destination,
Jeff Tinkerb075caa2016-12-06 23:15:20 -080059 decrypt_cb _hidl_cb) {
60
61 android::CryptoPlugin::Mode legacyMode;
62 switch(mode) {
63 case Mode::UNENCRYPTED:
64 legacyMode = android::CryptoPlugin::kMode_Unencrypted;
65 break;
66 case Mode::AES_CTR:
67 legacyMode = android::CryptoPlugin::kMode_AES_CTR;
68 break;
69 case Mode::AES_CBC_CTS:
70 legacyMode = android::CryptoPlugin::kMode_AES_WV;
71 break;
72 case Mode::AES_CBC:
73 legacyMode = android::CryptoPlugin::kMode_AES_CBC;
74 break;
75 }
76 android::CryptoPlugin::Pattern legacyPattern;
77 legacyPattern.mEncryptBlocks = pattern.encryptBlocks;
78 legacyPattern.mSkipBlocks = pattern.skipBlocks;
79
80 android::CryptoPlugin::SubSample *legacySubSamples =
81 new android::CryptoPlugin::SubSample[subSamples.size()];
82
83 for (size_t i = 0; i < subSamples.size(); i++) {
84 legacySubSamples[i].mNumBytesOfClearData
85 = subSamples[i].numBytesOfClearData;
86 legacySubSamples[i].mNumBytesOfEncryptedData
87 = subSamples[i].numBytesOfEncryptedData;
88 }
89
90 AString detailMessage;
91
Jeff Tinkerd59d3622016-12-16 01:34:52 -080092 sp<IMemory> sharedSourceMemory = mapMemory(source);
Jeff Tinker6fdbe862017-01-11 19:45:23 -080093
94 void *srcPtr = static_cast<void *>(sharedSourceMemory->getPointer());
95 uint8_t *offsetSrc = static_cast<uint8_t *>(srcPtr) + offset;
96 srcPtr = static_cast<void *>(offsetSrc);
97
Jeff Tinkerd59d3622016-12-16 01:34:52 -080098 sp<IMemory> sharedDestinationMemory;
Jeff Tinker6fdbe862017-01-11 19:45:23 -080099 void *destPtr = NULL;
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800100
101 if (destination.type == BufferType::SHARED_MEMORY) {
Jeff Tinkerd59d3622016-12-16 01:34:52 -0800102 sharedDestinationMemory = mapMemory(destination.nonsecureMemory);
103 sharedDestinationMemory->update();
104 destPtr = sharedDestinationMemory->getPointer();
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800105 } else if (destination.type == BufferType::NATIVE_HANDLE) {
106 native_handle_t *handle = const_cast<native_handle_t *>(
107 destination.secureMemory.getNativeHandle());
108 destPtr = static_cast<void *>(handle);
109 }
110 ssize_t result = mLegacyPlugin->decrypt(secure, keyId.data(), iv.data(),
Jeff Tinker6fdbe862017-01-11 19:45:23 -0800111 legacyMode, legacyPattern, srcPtr, legacySubSamples,
112 subSamples.size(), destPtr, &detailMessage);
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800113
114 if (destination.type == BufferType::SHARED_MEMORY) {
Jeff Tinkerd59d3622016-12-16 01:34:52 -0800115 sharedDestinationMemory->commit();
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800116 }
Jeff Tinkerd59d3622016-12-16 01:34:52 -0800117
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800118 delete[] legacySubSamples;
119
120 uint32_t status;
121 uint32_t bytesWritten;
122
123 if (result >= 0) {
124 status = android::OK;
125 bytesWritten = result;
126 } else {
127 status = -result;
128 bytesWritten = 0;
129 }
130
Jeff Tinker01f0a5a2017-01-12 09:22:18 -0800131 _hidl_cb(toStatus(status), bytesWritten, detailMessage.c_str());
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800132 return Void();
133 }
134
135} // namespace implementation
136} // namespace V1_0
137} // namespace crypto
138} // namespace drm
139} // namespace hardware
140} // namespace android