1 /*
2 * Copyright (C) 2019 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 #ifndef ANDROID_DRMUTILS_H
18 #define ANDROID_DRMUTILS_H
19
20 #include <android/hardware/drm/1.0/ICryptoFactory.h>
21 #include <android/hardware/drm/1.0/IDrmFactory.h>
22 #include <utils/Errors.h> // for status_t
23 #include <utils/StrongPointer.h>
24 #include <vector>
25
26 using namespace ::android::hardware::drm;
27
28 namespace android {
29
30 struct ICrypto;
31 struct IDrm;
32
33 namespace DrmUtils {
34
35 bool UseDrmService();
36
37 sp<IDrm> MakeDrm(status_t *pstatus = nullptr);
38
39 sp<ICrypto> MakeCrypto(status_t *pstatus = nullptr);
40
41 template<typename BA, typename PARCEL>
WriteByteArray(PARCEL & obj,const BA & vec)42 void WriteByteArray(PARCEL &obj, const BA &vec) {
43 obj.writeInt32(vec.size());
44 if (vec.size()) {
45 obj.write(vec.data(), vec.size());
46 }
47 }
48
49 template<typename ET, typename BA, typename PARCEL>
WriteEventToParcel(PARCEL & obj,ET eventType,const BA & sessionId,const BA & data)50 void WriteEventToParcel(
51 PARCEL &obj,
52 ET eventType,
53 const BA &sessionId,
54 const BA &data) {
55 WriteByteArray(obj, sessionId);
56 WriteByteArray(obj, data);
57 obj.writeInt32(eventType);
58 }
59
60 template<typename BA, typename PARCEL>
WriteExpirationUpdateToParcel(PARCEL & obj,const BA & sessionId,int64_t expiryTimeInMS)61 void WriteExpirationUpdateToParcel(
62 PARCEL &obj,
63 const BA &sessionId,
64 int64_t expiryTimeInMS) {
65 WriteByteArray(obj, sessionId);
66 obj.writeInt64(expiryTimeInMS);
67 }
68
69 template<typename BA, typename KSL, typename PARCEL>
WriteKeysChange(PARCEL & obj,const BA & sessionId,const KSL & keyStatusList,bool hasNewUsableKey)70 void WriteKeysChange(
71 PARCEL &obj,
72 const BA &sessionId,
73 const KSL &keyStatusList,
74 bool hasNewUsableKey) {
75 WriteByteArray(obj, sessionId);
76 obj.writeInt32(keyStatusList.size());
77 for (const auto &keyStatus : keyStatusList) {
78 WriteByteArray(obj, keyStatus.keyId);
79 obj.writeInt32(keyStatus.type);
80 }
81 obj.writeInt32(hasNewUsableKey);
82 }
83
84 std::vector<sp<::V1_0::IDrmFactory>> MakeDrmFactories(const uint8_t uuid[16] = nullptr);
85
86 std::vector<sp<::V1_0::IDrmPlugin>> MakeDrmPlugins(const uint8_t uuid[16],
87 const char *appPackageName);
88
89 std::vector<sp<::V1_0::ICryptoFactory>> MakeCryptoFactories(const uint8_t uuid[16]);
90
91 std::vector<sp<::V1_0::ICryptoPlugin>> MakeCryptoPlugins(const uint8_t uuid[16],
92 const void *initData, size_t initDataSize);
93
94 } // namespace DrmUtils
95
96 } // namespace android
97
98 #endif // ANDROID_DRMUTILS_H
99