• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 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 DRM_HAL_AIDL_H_
18 #define DRM_HAL_AIDL_H_
19 
20 #include <memory>
21 #include <aidl/android/hardware/drm/BnDrmPluginListener.h>
22 #include <aidl/android/hardware/drm/IDrmFactory.h>
23 #include <aidl/android/hardware/drm/IDrmPlugin.h>
24 #include <aidl/android/media/BnResourceManagerClient.h>
25 #include <mediadrm/DrmMetrics.h>
26 #include <mediadrm/DrmSessionManager.h>
27 #include <mediadrm/DrmHalListener.h>
28 #include <mediadrm/IDrm.h>
29 
30 using IDrmPluginAidl = ::aidl::android::hardware::drm::IDrmPlugin;
31 using IDrmFactoryAidl = ::aidl::android::hardware::drm::IDrmFactory;
32 using EventTypeAidl = ::aidl::android::hardware::drm::EventType;
33 using KeyStatusAidl = ::aidl::android::hardware::drm::KeyStatus;
34 using ::aidl::android::hardware::drm::Uuid;
35 
36 namespace android {
37 struct DrmHalAidl : public IDrm{
38     struct DrmSessionClient;
39     DrmHalAidl();
40     virtual ~DrmHalAidl();
41     virtual status_t initCheck() const;
42     virtual status_t isCryptoSchemeSupported(const uint8_t uuid[16], const String8& mimeType,
43                                              DrmPlugin::SecurityLevel securityLevel, bool* result);
44     virtual status_t createPlugin(const uint8_t uuid[16], const String8& appPackageName);
45     virtual status_t destroyPlugin();
46     virtual status_t openSession(DrmPlugin::SecurityLevel securityLevel,
47                                  Vector<uint8_t>& sessionId);
48     virtual status_t closeSession(Vector<uint8_t> const& sessionId);
49     virtual status_t getKeyRequest(Vector<uint8_t> const& sessionId,
50                                    Vector<uint8_t> const& initData, String8 const& mimeType,
51                                    DrmPlugin::KeyType keyType,
52                                    KeyedVector<String8, String8> const& optionalParameters,
53                                    Vector<uint8_t>& request, String8& defaultUrl,
54                                    DrmPlugin::KeyRequestType* keyRequestType);
55     virtual status_t provideKeyResponse(Vector<uint8_t> const& sessionId,
56                                         Vector<uint8_t> const& response, Vector<uint8_t>& keySetId);
57     virtual status_t removeKeys(Vector<uint8_t> const& keySetId);
58     virtual status_t restoreKeys(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keySetId);
59     virtual status_t queryKeyStatus(Vector<uint8_t> const& sessionId,
60                                     KeyedVector<String8, String8>& infoMap) const;
61     virtual status_t getProvisionRequest(String8 const& certType, String8 const& certAuthority,
62                                          Vector<uint8_t>& request, String8& defaultUrl);
63     virtual status_t provideProvisionResponse(Vector<uint8_t> const& response,
64                                               Vector<uint8_t>& certificate,
65                                               Vector<uint8_t>& wrappedKey);
66     virtual status_t getSecureStops(List<Vector<uint8_t>>& secureStops);
67     virtual status_t getSecureStopIds(List<Vector<uint8_t>>& secureStopIds);
68     virtual status_t getSecureStop(Vector<uint8_t> const& ssid, Vector<uint8_t>& secureStop);
69     virtual status_t releaseSecureStops(Vector<uint8_t> const& ssRelease);
70     virtual status_t removeSecureStop(Vector<uint8_t> const& ssid);
71     virtual status_t removeAllSecureStops();
72     virtual status_t getHdcpLevels(DrmPlugin::HdcpLevel* connectedLevel,
73                                    DrmPlugin::HdcpLevel* maxLevel) const;
74     virtual status_t getNumberOfSessions(uint32_t* currentSessions, uint32_t* maxSessions) const;
75     virtual status_t getSecurityLevel(Vector<uint8_t> const& sessionId,
76                                       DrmPlugin::SecurityLevel* level) const;
77     virtual status_t getOfflineLicenseKeySetIds(List<Vector<uint8_t>>& keySetIds) const;
78     virtual status_t removeOfflineLicense(Vector<uint8_t> const& keySetId);
79     virtual status_t getOfflineLicenseState(Vector<uint8_t> const& keySetId,
80                                             DrmPlugin::OfflineLicenseState* licenseState) const;
81     virtual status_t getPropertyString(String8 const& name, String8& value) const;
82     virtual status_t getPropertyByteArray(String8 const& name, Vector<uint8_t>& value) const;
83     virtual status_t setPropertyString(String8 const& name, String8 const& value) const;
84     virtual status_t setPropertyByteArray(String8 const& name, Vector<uint8_t> const& value) const;
85     virtual status_t getMetrics(const sp<IDrmMetricsConsumer>& consumer);
86     virtual status_t setCipherAlgorithm(Vector<uint8_t> const& sessionId, String8 const& algorithm);
87     virtual status_t setMacAlgorithm(Vector<uint8_t> const& sessionId, String8 const& algorithm);
88     virtual status_t encrypt(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
89                              Vector<uint8_t> const& input, Vector<uint8_t> const& iv,
90                              Vector<uint8_t>& output);
91     virtual status_t decrypt(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
92                              Vector<uint8_t> const& input, Vector<uint8_t> const& iv,
93                              Vector<uint8_t>& output);
94     virtual status_t sign(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
95                           Vector<uint8_t> const& message, Vector<uint8_t>& signature);
96     virtual status_t verify(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
97                             Vector<uint8_t> const& message, Vector<uint8_t> const& signature,
98                             bool& match);
99     virtual status_t signRSA(Vector<uint8_t> const& sessionId, String8 const& algorithm,
100                              Vector<uint8_t> const& message, Vector<uint8_t> const& wrappedKey,
101                              Vector<uint8_t>& signature);
102     virtual status_t setListener(const sp<IDrmClient>& listener);
103     virtual status_t requiresSecureDecoder(const char* mime, bool* required) const;
104     virtual status_t requiresSecureDecoder(const char* mime, DrmPlugin::SecurityLevel securityLevel,
105                                            bool* required) const;
106     virtual status_t setPlaybackId(Vector<uint8_t> const& sessionId, const char* playbackId);
107     virtual status_t getLogMessages(Vector<drm::V1_4::LogMessage>& logs) const;
108     virtual status_t getSupportedSchemes(std::vector<uint8_t> &schemes) const;
109 
110     ::ndk::ScopedAStatus onEvent(EventTypeAidl in_eventType,
111                                  const std::vector<uint8_t>& in_sessionId,
112                                  const std::vector<uint8_t>& in_data);
113     ::ndk::ScopedAStatus onExpirationUpdate(const std::vector<uint8_t>& in_sessionId,
114                                             int64_t in_expiryTimeInMS);
115     ::ndk::ScopedAStatus onKeysChange(const std::vector<uint8_t>& in_sessionId,
116                                       const std::vector<KeyStatusAidl>& in_keyStatusList,
117                                       bool in_hasNewUsableKey);
118     ::ndk::ScopedAStatus onSessionLostState(const std::vector<uint8_t>& in_sessionId);
119   private:
120     static Mutex mLock;
121     mutable MediaDrmMetrics mMetrics;
122     std::shared_ptr<DrmHalListener> mListener;
123     const std::vector<std::shared_ptr<IDrmFactoryAidl>> mFactories;
124     std::shared_ptr<IDrmPluginAidl> mPlugin;
125     status_t mInitCheck;
126     std::vector<std::shared_ptr<DrmSessionClient>> mOpenSessions;
127     void cleanup();
128     void closeOpenSessions();
129     std::string reportPluginMetrics() const;
130     std::string reportFrameworkMetrics(const std::string& pluginMetrics) const;
131     status_t getPropertyStringInternal(String8 const& name, String8& value) const;
132     status_t getPropertyByteArrayInternal(String8 const& name, Vector<uint8_t>& value) const;
133     DISALLOW_EVIL_CONSTRUCTORS(DrmHalAidl);
134 };
135 
136 }  // namespace android
137 
138 #endif // DRM_HAL_AIDL_H_