1e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/*
2e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Copyright (C) 2013 The Android Open Source Project
3e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *
4e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Licensed under the Apache License, Version 2.0 (the "License");
5e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * you may not use this file except in compliance with the License.
6e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * You may obtain a copy of the License at
7e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *
8e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *      http://www.apache.org/licenses/LICENSE-2.0
9e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *
10e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Unless required by applicable law or agreed to in writing, software
11e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * distributed under the License is distributed on an "AS IS" BASIS,
12e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * See the License for the specific language governing permissions and
14e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * limitations under the License.
15e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */
16e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
17e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#ifndef DRM_H_
18e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
19e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#define DRM_H_
20e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
21e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include "SharedLibrary.h"
22e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
23e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/IDrm.h>
24e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/IDrmClient.h>
25e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <utils/threads.h>
26e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
27e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramannamespace android {
28e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
29e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass DrmFactory;
30e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass DrmPlugin;
31e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct DrmSessionClientInterface;
32e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
33e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct Drm : public BnDrm,
34e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman             public IBinder::DeathRecipient,
35e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman             public DrmPluginListener {
36e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    Drm();
37e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual ~Drm();
38e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
39e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t initCheck() const;
40e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
41e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType);
42e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
43e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t createPlugin(const uint8_t uuid[16], const String8 &appPackageName);
44e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
45e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t destroyPlugin();
46e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
47e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t openSession(Vector<uint8_t> &sessionId);
48e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
49e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t closeSession(Vector<uint8_t> const &sessionId);
50e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
51e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t
52e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        getKeyRequest(Vector<uint8_t> const &sessionId,
53e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                      Vector<uint8_t> const &initData,
54e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                      String8 const &mimeType, DrmPlugin::KeyType keyType,
55e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                      KeyedVector<String8, String8> const &optionalParameters,
56e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                      Vector<uint8_t> &request, String8 &defaultUrl,
57e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                      DrmPlugin::KeyRequestType *keyRequestType);
58e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
59e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t provideKeyResponse(Vector<uint8_t> const &sessionId,
60e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                        Vector<uint8_t> const &response,
61e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                        Vector<uint8_t> &keySetId);
62e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
63e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t removeKeys(Vector<uint8_t> const &keySetId);
64e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
65e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t restoreKeys(Vector<uint8_t> const &sessionId,
66e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                 Vector<uint8_t> const &keySetId);
67e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
68e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t queryKeyStatus(Vector<uint8_t> const &sessionId,
69e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                    KeyedVector<String8, String8> &infoMap) const;
70e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
71e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t getProvisionRequest(String8 const &certType,
72e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                         String8 const &certAuthority,
73e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                         Vector<uint8_t> &request,
74e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                         String8 &defaulUrl);
75e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
76e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t provideProvisionResponse(Vector<uint8_t> const &response,
77e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                              Vector<uint8_t> &certificate,
78e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                              Vector<uint8_t> &wrappedKey);
79e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
80e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t getSecureStops(List<Vector<uint8_t> > &secureStops);
81e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop);
82e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
83e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t releaseSecureStops(Vector<uint8_t> const &ssRelease);
84e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t releaseAllSecureStops();
85e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
86e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t getPropertyString(String8 const &name, String8 &value ) const;
87e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t getPropertyByteArray(String8 const &name,
88e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                          Vector<uint8_t> &value ) const;
89e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t setPropertyString(String8 const &name, String8 const &value ) const;
90e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t setPropertyByteArray(String8 const &name,
91e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                          Vector<uint8_t> const &value ) const;
92e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
93e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t setCipherAlgorithm(Vector<uint8_t> const &sessionId,
94e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                        String8 const &algorithm);
95e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
96e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t setMacAlgorithm(Vector<uint8_t> const &sessionId,
97e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                     String8 const &algorithm);
98e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
99e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t encrypt(Vector<uint8_t> const &sessionId,
100e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                             Vector<uint8_t> const &keyId,
101e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                             Vector<uint8_t> const &input,
102e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                             Vector<uint8_t> const &iv,
103e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                             Vector<uint8_t> &output);
104e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
105e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t decrypt(Vector<uint8_t> const &sessionId,
106e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                             Vector<uint8_t> const &keyId,
107e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                             Vector<uint8_t> const &input,
108e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                             Vector<uint8_t> const &iv,
109e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                             Vector<uint8_t> &output);
110e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
111e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t sign(Vector<uint8_t> const &sessionId,
112e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                          Vector<uint8_t> const &keyId,
113e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                          Vector<uint8_t> const &message,
114e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                          Vector<uint8_t> &signature);
115e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
116e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t verify(Vector<uint8_t> const &sessionId,
117e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                            Vector<uint8_t> const &keyId,
118e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                            Vector<uint8_t> const &message,
119e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                            Vector<uint8_t> const &signature,
120e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                            bool &match);
121e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
122e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t signRSA(Vector<uint8_t> const &sessionId,
123e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                             String8 const &algorithm,
124e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                             Vector<uint8_t> const &message,
125e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                             Vector<uint8_t> const &wrappedKey,
126e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                             Vector<uint8_t> &signature);
127e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
128e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t setListener(const sp<IDrmClient>& listener);
129e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
130e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual void sendEvent(DrmPlugin::EventType eventType, int extra,
131e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                           Vector<uint8_t> const *sessionId,
132e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                           Vector<uint8_t> const *data);
133e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
134e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual void sendExpirationUpdate(Vector<uint8_t> const *sessionId,
135e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                      int64_t expiryTimeInMS);
136e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
137e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual void sendKeysChange(Vector<uint8_t> const *sessionId,
138e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                Vector<DrmPlugin::KeyStatus> const *keyStatusList,
139e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                                bool hasNewUsableKey);
140e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
141e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual void binderDied(const wp<IBinder> &the_late_who);
142e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
143e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanprivate:
144e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    static Mutex mLock;
145e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
146e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    status_t mInitCheck;
147e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
148e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    sp<DrmSessionClientInterface> mDrmSessionClient;
149e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
150e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    sp<IDrmClient> mListener;
151e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    mutable Mutex mEventLock;
152e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    mutable Mutex mNotifyLock;
153e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
154e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    sp<SharedLibrary> mLibrary;
155e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    DrmFactory *mFactory;
156e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    DrmPlugin *mPlugin;
157e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
158e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    static KeyedVector<Vector<uint8_t>, String8> mUUIDToLibraryPathMap;
159e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    static KeyedVector<String8, wp<SharedLibrary> > mLibraryPathToOpenLibraryMap;
160e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    static Mutex mMapLock;
161e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
162e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    void findFactoryForScheme(const uint8_t uuid[16]);
163e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    bool loadLibraryForScheme(const String8 &path, const uint8_t uuid[16]);
164e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    void closeFactory();
165e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    void writeByteArray(Parcel &obj, Vector<uint8_t> const *array);
166e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
167e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    DISALLOW_EVIL_CONSTRUCTORS(Drm);
168e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman};
169e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
170e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}  // namespace android
171e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
172e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#endif  // CRYPTO_H_
173