diff options
author | James Dong <jdong@google.com> | 2012-03-28 10:42:44 -0700 |
---|---|---|
committer | James Dong <jdong@google.com> | 2012-03-28 10:42:44 -0700 |
commit | d927a1d99630c05ff773f0e9e8791ca9a965e020 (patch) | |
tree | 760f8a19e317d68f937eda312efab59200880ecd /drm | |
parent | f9c1f9935b349fe1a3f27be4462026dd212f8b78 (diff) | |
download | frameworks_base-d927a1d99630c05ff773f0e9e8791ca9a965e020.zip frameworks_base-d927a1d99630c05ff773f0e9e8791ca9a965e020.tar.gz frameworks_base-d927a1d99630c05ff773f0e9e8791ca9a965e020.tar.bz2 |
Deleted the media, camera, drm related files since they are relocated
Change-Id: I9bc5573ee07e30b305b5b879023aa9ec69e10b91
Diffstat (limited to 'drm')
60 files changed, 0 insertions, 12411 deletions
diff --git a/drm/common/Android.mk b/drm/common/Android.mk deleted file mode 100644 index f1136c9..0000000 --- a/drm/common/Android.mk +++ /dev/null @@ -1,43 +0,0 @@ -# -# Copyright (C) 2010 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES:= \ - DrmConstraints.cpp \ - DrmMetadata.cpp \ - DrmConvertedStatus.cpp \ - DrmEngineBase.cpp \ - DrmInfo.cpp \ - DrmInfoRequest.cpp \ - DrmInfoStatus.cpp \ - DrmRights.cpp \ - DrmSupportInfo.cpp \ - IDrmManagerService.cpp \ - IDrmServiceListener.cpp \ - DrmInfoEvent.cpp \ - ReadWriteUtils.cpp - -LOCAL_C_INCLUDES := \ - $(TOP)/frameworks/base/include \ - $(TOP)/frameworks/base/drm/libdrmframework/include \ - $(TOP)/frameworks/base/drm/libdrmframework/plugins/common/include - -LOCAL_MODULE:= libdrmframeworkcommon - -LOCAL_MODULE_TAGS := optional - -include $(BUILD_STATIC_LIBRARY) diff --git a/drm/common/DrmConstraints.cpp b/drm/common/DrmConstraints.cpp deleted file mode 100644 index 4a4d798..0000000 --- a/drm/common/DrmConstraints.cpp +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <drm/DrmConstraints.h> - -using namespace android; - -const String8 DrmConstraints::MAX_REPEAT_COUNT("max_repeat_count"); -const String8 DrmConstraints::REMAINING_REPEAT_COUNT("remaining_repeat_count"); -const String8 DrmConstraints::LICENSE_START_TIME("license_start_time"); -const String8 DrmConstraints::LICENSE_EXPIRY_TIME("license_expiry_time"); -const String8 DrmConstraints::LICENSE_AVAILABLE_TIME("license_available_time"); -const String8 DrmConstraints::EXTENDED_METADATA("extended_metadata"); - -int DrmConstraints::getCount(void) const { - return mConstraintMap.size(); -} - -status_t DrmConstraints::put(const String8* key, const char* value) { - int length = strlen(value); - char* charValue = new char[length + 1]; - if (NULL != charValue) { - strncpy(charValue, value, length); - charValue[length] = '\0'; - mConstraintMap.add(*key, charValue); - } - return DRM_NO_ERROR; -} - -String8 DrmConstraints::get(const String8& key) const { - if (NULL != getValue(&key)) { - return String8(getValue(&key)); - } - return String8(""); -} - -const char* DrmConstraints::getValue(const String8* key) const { - if (NAME_NOT_FOUND != mConstraintMap.indexOfKey(*key)) { - return mConstraintMap.valueFor(*key); - } - return NULL; -} - -const char* DrmConstraints::getAsByteArray(const String8* key) const { - return getValue(key); -} - -bool DrmConstraints::KeyIterator::hasNext() { - return mIndex < mDrmConstraints->mConstraintMap.size(); -} - -const String8& DrmConstraints::KeyIterator::next() { - const String8& key = mDrmConstraints->mConstraintMap.keyAt(mIndex); - mIndex++; - return key; -} - -DrmConstraints::KeyIterator DrmConstraints::keyIterator() { - return KeyIterator(this); -} - -DrmConstraints::KeyIterator::KeyIterator(const DrmConstraints::KeyIterator& keyIterator) - : mDrmConstraints(keyIterator.mDrmConstraints), - mIndex(keyIterator.mIndex) { -} - -DrmConstraints::KeyIterator& DrmConstraints::KeyIterator::operator=( - const DrmConstraints::KeyIterator& keyIterator) { - mDrmConstraints = keyIterator.mDrmConstraints; - mIndex = keyIterator.mIndex; - return *this; -} - - -DrmConstraints::Iterator DrmConstraints::iterator() { - return Iterator(this); -} - -DrmConstraints::Iterator::Iterator(const DrmConstraints::Iterator& iterator) : - mDrmConstraints(iterator.mDrmConstraints), - mIndex(iterator.mIndex) { -} - -DrmConstraints::Iterator& DrmConstraints::Iterator::operator=( - const DrmConstraints::Iterator& iterator) { - mDrmConstraints = iterator.mDrmConstraints; - mIndex = iterator.mIndex; - return *this; -} - -bool DrmConstraints::Iterator::hasNext() { - return mIndex < mDrmConstraints->mConstraintMap.size(); -} - -String8 DrmConstraints::Iterator::next() { - String8 value = String8(mDrmConstraints->mConstraintMap.editValueAt(mIndex)); - mIndex++; - return value; -} - diff --git a/drm/common/DrmConvertedStatus.cpp b/drm/common/DrmConvertedStatus.cpp deleted file mode 100644 index 5d035f5..0000000 --- a/drm/common/DrmConvertedStatus.cpp +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <drm/DrmConvertedStatus.h> - -using namespace android; - -DrmConvertedStatus::DrmConvertedStatus( - int _statusCode, const DrmBuffer* _convertedData, int _offset) : - statusCode(_statusCode), - convertedData(_convertedData), - offset(_offset) { - -} - diff --git a/drm/common/DrmEngineBase.cpp b/drm/common/DrmEngineBase.cpp deleted file mode 100644 index 1c345a2..0000000 --- a/drm/common/DrmEngineBase.cpp +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "DrmEngineBase.h" - -using namespace android; - -DrmEngineBase::DrmEngineBase() { - -} - -DrmEngineBase::~DrmEngineBase() { - -} - -DrmConstraints* DrmEngineBase::getConstraints( - int uniqueId, const String8* path, int action) { - return onGetConstraints(uniqueId, path, action); -} - -DrmMetadata* DrmEngineBase::getMetadata(int uniqueId, const String8* path) { - return onGetMetadata(uniqueId, path); -} - -status_t DrmEngineBase::initialize(int uniqueId) { - return onInitialize(uniqueId); -} - -status_t DrmEngineBase::setOnInfoListener( - int uniqueId, const IDrmEngine::OnInfoListener* infoListener) { - return onSetOnInfoListener(uniqueId, infoListener); -} - -status_t DrmEngineBase::terminate(int uniqueId) { - return onTerminate(uniqueId); -} - -bool DrmEngineBase::canHandle(int uniqueId, const String8& path) { - return onCanHandle(uniqueId, path); -} - -DrmInfoStatus* DrmEngineBase::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) { - return onProcessDrmInfo(uniqueId, drmInfo); -} - -status_t DrmEngineBase::saveRights( - int uniqueId, const DrmRights& drmRights, - const String8& rightsPath, const String8& contentPath) { - return onSaveRights(uniqueId, drmRights, rightsPath, contentPath); -} - -DrmInfo* DrmEngineBase::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest) { - return onAcquireDrmInfo(uniqueId, drmInfoRequest); -} - -String8 DrmEngineBase::getOriginalMimeType(int uniqueId, const String8& path) { - return onGetOriginalMimeType(uniqueId, path); -} - -int DrmEngineBase::getDrmObjectType(int uniqueId, const String8& path, const String8& mimeType) { - return onGetDrmObjectType(uniqueId, path, mimeType); -} - -int DrmEngineBase::checkRightsStatus(int uniqueId, const String8& path, int action) { - return onCheckRightsStatus(uniqueId, path, action); -} - -status_t DrmEngineBase::consumeRights( - int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) { - return onConsumeRights(uniqueId, decryptHandle, action, reserve); -} - -status_t DrmEngineBase::setPlaybackStatus( - int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) { - return onSetPlaybackStatus(uniqueId, decryptHandle, playbackStatus, position); -} - -bool DrmEngineBase::validateAction( - int uniqueId, const String8& path, - int action, const ActionDescription& description) { - return onValidateAction(uniqueId, path, action, description); -} - -status_t DrmEngineBase::removeRights(int uniqueId, const String8& path) { - return onRemoveRights(uniqueId, path); -} - -status_t DrmEngineBase::removeAllRights(int uniqueId) { - return onRemoveAllRights(uniqueId); -} - -status_t DrmEngineBase::openConvertSession(int uniqueId, int convertId) { - return onOpenConvertSession(uniqueId, convertId); -} - -DrmConvertedStatus* DrmEngineBase::convertData( - int uniqueId, int convertId, const DrmBuffer* inputData) { - return onConvertData(uniqueId, convertId, inputData); -} - -DrmConvertedStatus* DrmEngineBase::closeConvertSession(int uniqueId, int convertId) { - return onCloseConvertSession(uniqueId, convertId); -} - -DrmSupportInfo* DrmEngineBase::getSupportInfo(int uniqueId) { - return onGetSupportInfo(uniqueId); -} - -status_t DrmEngineBase::openDecryptSession( - int uniqueId, DecryptHandle* decryptHandle, - int fd, off64_t offset, off64_t length, const char* mime) { - - if (!mime || mime[0] == '\0') { - return onOpenDecryptSession(uniqueId, decryptHandle, fd, offset, length); - } - - return onOpenDecryptSession(uniqueId, decryptHandle, fd, offset, length, mime); -} - -status_t DrmEngineBase::openDecryptSession( - int uniqueId, DecryptHandle* decryptHandle, - const char* uri, const char* mime) { - if (!mime || mime[0] == '\0') { - return onOpenDecryptSession(uniqueId, decryptHandle, uri); - } - return onOpenDecryptSession(uniqueId, decryptHandle, uri, mime); -} - -status_t DrmEngineBase::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { - return onCloseDecryptSession(uniqueId, decryptHandle); -} - -status_t DrmEngineBase::initializeDecryptUnit( - int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, const DrmBuffer* headerInfo) { - return onInitializeDecryptUnit(uniqueId, decryptHandle, decryptUnitId, headerInfo); -} - -status_t DrmEngineBase::decrypt( - int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, - const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) { - return onDecrypt(uniqueId, decryptHandle, decryptUnitId, encBuffer, decBuffer, IV); -} - -status_t DrmEngineBase::finalizeDecryptUnit( - int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) { - return onFinalizeDecryptUnit(uniqueId, decryptHandle, decryptUnitId); -} - -ssize_t DrmEngineBase::pread( - int uniqueId, DecryptHandle* decryptHandle, void* buffer, ssize_t numBytes, off64_t offset) { - return onPread(uniqueId, decryptHandle, buffer, numBytes, offset); -} - diff --git a/drm/common/DrmInfo.cpp b/drm/common/DrmInfo.cpp deleted file mode 100644 index ddcab33..0000000 --- a/drm/common/DrmInfo.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <drm/DrmInfo.h> - -using namespace android; - -DrmInfo::DrmInfo(int infoType, const DrmBuffer& drmBuffer, const String8& mimeType) : - mInfoType(infoType), - mData(drmBuffer), - mMimeType(mimeType) { - -} - -int DrmInfo::getInfoType(void) const { - return mInfoType; -} - -String8 DrmInfo::getMimeType(void) const { - return mMimeType; -} - -const DrmBuffer& DrmInfo::getData(void) const { - return mData; -} - -int DrmInfo::getCount(void) const { - return mAttributes.size(); -} - -status_t DrmInfo::put(const String8& key, const String8& value) { - mAttributes.add(key, value); - return DRM_NO_ERROR; -} - -String8 DrmInfo::get(const String8& key) const { - if (NAME_NOT_FOUND != mAttributes.indexOfKey(key)) { - return mAttributes.valueFor(key); - } - return String8(""); -} - -int DrmInfo::indexOfKey(const String8& key) const { - return mAttributes.indexOfKey(key); -} - -DrmInfo::KeyIterator DrmInfo::keyIterator() const { - return KeyIterator(this); -} - -DrmInfo::Iterator DrmInfo::iterator() const { - return Iterator(this); -} - -// KeyIterator implementation -DrmInfo::KeyIterator::KeyIterator(const DrmInfo::KeyIterator& keyIterator) : - mDrmInfo(keyIterator.mDrmInfo), mIndex(keyIterator.mIndex) { - -} - -bool DrmInfo::KeyIterator::hasNext() { - return (mIndex < mDrmInfo->mAttributes.size()); -} - -const String8& DrmInfo::KeyIterator::next() { - const String8& key = mDrmInfo->mAttributes.keyAt(mIndex); - mIndex++; - return key; -} - -DrmInfo::KeyIterator& DrmInfo::KeyIterator::operator=(const DrmInfo::KeyIterator& keyIterator) { - mDrmInfo = keyIterator.mDrmInfo; - mIndex = keyIterator.mIndex; - return *this; -} - -// Iterator implementation -DrmInfo::Iterator::Iterator(const DrmInfo::Iterator& iterator) - : mDrmInfo(iterator.mDrmInfo), mIndex(iterator.mIndex) { - -} - -DrmInfo::Iterator& DrmInfo::Iterator::operator=(const DrmInfo::Iterator& iterator) { - mDrmInfo = iterator.mDrmInfo; - mIndex = iterator.mIndex; - return *this; -} - -bool DrmInfo::Iterator::hasNext() { - return mIndex < mDrmInfo->mAttributes.size(); -} - -String8& DrmInfo::Iterator::next() { - String8& value = mDrmInfo->mAttributes.editValueAt(mIndex); - mIndex++; - return value; -} - diff --git a/drm/common/DrmInfoEvent.cpp b/drm/common/DrmInfoEvent.cpp deleted file mode 100644 index 27a5a2d..0000000 --- a/drm/common/DrmInfoEvent.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <utils/String8.h> -#include <drm/DrmInfoEvent.h> - -using namespace android; - -DrmInfoEvent::DrmInfoEvent(int uniqueId, int infoType, const String8 message) - : mUniqueId(uniqueId), - mInfoType(infoType), - mMessage(message) { - -} - -int DrmInfoEvent::getUniqueId() const { - return mUniqueId; -} - -int DrmInfoEvent::getType() const { - return mInfoType; -} - -const String8 DrmInfoEvent::getMessage() const { - return mMessage; -} - diff --git a/drm/common/DrmInfoRequest.cpp b/drm/common/DrmInfoRequest.cpp deleted file mode 100644 index a646859..0000000 --- a/drm/common/DrmInfoRequest.cpp +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <drm/DrmInfoRequest.h> - -using namespace android; - -const String8 DrmInfoRequest::ACCOUNT_ID("account_id"); -const String8 DrmInfoRequest::SUBSCRIPTION_ID("subscription_id"); - -DrmInfoRequest::DrmInfoRequest(int infoType, const String8& mimeType) : - mInfoType(infoType), mMimeType(mimeType) { - -} - -String8 DrmInfoRequest::getMimeType(void) const { - return mMimeType; -} - -int DrmInfoRequest::getInfoType(void) const { - return mInfoType; -} - -int DrmInfoRequest::getCount(void) const { - return mRequestInformationMap.size(); -} - -status_t DrmInfoRequest::put(const String8& key, const String8& value) { - mRequestInformationMap.add(key, value); - return DRM_NO_ERROR; -} - -String8 DrmInfoRequest::get(const String8& key) const { - if (NAME_NOT_FOUND != mRequestInformationMap.indexOfKey(key)) { - return mRequestInformationMap.valueFor(key); - } - return String8(""); -} - -DrmInfoRequest::KeyIterator DrmInfoRequest::keyIterator() const { - return KeyIterator(this); -} - -DrmInfoRequest::Iterator DrmInfoRequest::iterator() const { - return Iterator(this); -} - -// KeyIterator implementation -DrmInfoRequest::KeyIterator::KeyIterator(const DrmInfoRequest::KeyIterator& keyIterator) - : mDrmInfoRequest(keyIterator.mDrmInfoRequest), - mIndex(keyIterator.mIndex) { - -} - -bool DrmInfoRequest::KeyIterator::hasNext() { - return (mIndex < mDrmInfoRequest->mRequestInformationMap.size()); -} - -const String8& DrmInfoRequest::KeyIterator::next() { - const String8& key = mDrmInfoRequest->mRequestInformationMap.keyAt(mIndex); - mIndex++; - return key; -} - -DrmInfoRequest::KeyIterator& DrmInfoRequest::KeyIterator::operator=( - const DrmInfoRequest::KeyIterator& keyIterator) { - mDrmInfoRequest = keyIterator.mDrmInfoRequest; - mIndex = keyIterator.mIndex; - return *this; -} - -// Iterator implementation -DrmInfoRequest::Iterator::Iterator(const DrmInfoRequest::Iterator& iterator) : - mDrmInfoRequest(iterator.mDrmInfoRequest), mIndex(iterator.mIndex) { -} - -DrmInfoRequest::Iterator& DrmInfoRequest::Iterator::operator=( - const DrmInfoRequest::Iterator& iterator) { - mDrmInfoRequest = iterator.mDrmInfoRequest; - mIndex = iterator.mIndex; - return *this; -} - -bool DrmInfoRequest::Iterator::hasNext() { - return mIndex < mDrmInfoRequest->mRequestInformationMap.size(); -} - -String8& DrmInfoRequest::Iterator::next() { - String8& value = mDrmInfoRequest->mRequestInformationMap.editValueAt(mIndex); - mIndex++; - return value; -} - diff --git a/drm/common/DrmInfoStatus.cpp b/drm/common/DrmInfoStatus.cpp deleted file mode 100644 index 8ec7311..0000000 --- a/drm/common/DrmInfoStatus.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <drm/DrmInfoStatus.h> - -using namespace android; - -DrmInfoStatus::DrmInfoStatus( - int _statusCode, int _infoType, const DrmBuffer* _drmBuffer, const String8& _mimeType) : - statusCode(_statusCode), - infoType(_infoType), - drmBuffer(_drmBuffer), - mimeType(_mimeType) { - -} - diff --git a/drm/common/DrmMetadata.cpp b/drm/common/DrmMetadata.cpp deleted file mode 100644 index 2a4b8c8..0000000 --- a/drm/common/DrmMetadata.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <drm/DrmMetadata.h> - -using namespace android; - -int DrmMetadata::getCount(void) const { - return mMetadataMap.size(); -} - -status_t DrmMetadata::put(const String8* key, - const char* value) { - if((value != NULL) && (key != NULL)) { - int length = strlen(value); - char* charValue = new char[length + 1]; - - memcpy(charValue, value, length); - charValue[length] = '\0'; - mMetadataMap.add(*key, charValue); - } - return NO_ERROR; -} - -String8 DrmMetadata::get(const String8& key) const { - if (NULL != getValue(&key)) { - return String8(getValue(&key)); - } - else { - return String8(""); - } -} - -const char* DrmMetadata::getValue(const String8* key) const { - if(key != NULL) { - if (NAME_NOT_FOUND != mMetadataMap.indexOfKey(*key)) { - return mMetadataMap.valueFor(*key); - } - else { - return NULL; - } - } else { - return NULL; - } -} - -const char* DrmMetadata::getAsByteArray(const String8* key) const { - return getValue(key); -} - -bool DrmMetadata::KeyIterator::hasNext() { - return mIndex < mDrmMetadata->mMetadataMap.size(); -} - -const String8& DrmMetadata::KeyIterator::next() { - const String8& key = mDrmMetadata->mMetadataMap.keyAt(mIndex); - mIndex++; - return key; -} - -DrmMetadata::KeyIterator DrmMetadata::keyIterator() { - return KeyIterator(this); -} - -DrmMetadata::KeyIterator::KeyIterator(const DrmMetadata::KeyIterator& keyIterator) : - mDrmMetadata(keyIterator.mDrmMetadata), - mIndex(keyIterator.mIndex) { - ALOGV("DrmMetadata::KeyIterator::KeyIterator"); -} - -DrmMetadata::KeyIterator& DrmMetadata::KeyIterator::operator=(const DrmMetadata::KeyIterator& keyIterator) { - ALOGV("DrmMetadata::KeyIterator::operator="); - mDrmMetadata = keyIterator.mDrmMetadata; - mIndex = keyIterator.mIndex; - return *this; -} - - -DrmMetadata::Iterator DrmMetadata::iterator() { - return Iterator(this); -} - -DrmMetadata::Iterator::Iterator(const DrmMetadata::Iterator& iterator) : - mDrmMetadata(iterator.mDrmMetadata), - mIndex(iterator.mIndex) { - ALOGV("DrmMetadata::Iterator::Iterator"); -} - -DrmMetadata::Iterator& DrmMetadata::Iterator::operator=(const DrmMetadata::Iterator& iterator) { - ALOGV("DrmMetadata::Iterator::operator="); - mDrmMetadata = iterator.mDrmMetadata; - mIndex = iterator.mIndex; - return *this; -} - -bool DrmMetadata::Iterator::hasNext() { - return mIndex < mDrmMetadata->mMetadataMap.size(); -} - -String8 DrmMetadata::Iterator::next() { - String8 value = String8(mDrmMetadata->mMetadataMap.editValueAt(mIndex)); - mIndex++; - return value; -} diff --git a/drm/common/DrmRights.cpp b/drm/common/DrmRights.cpp deleted file mode 100644 index 3aecb3d..0000000 --- a/drm/common/DrmRights.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <drm/DrmRights.h> -#include <ReadWriteUtils.h> - -using namespace android; - -DrmRights::DrmRights(const String8& rightsFilePath, const String8& mimeType, - const String8& accountId, const String8& subscriptionId) : - mMimeType(mimeType), - mAccountId(accountId), - mSubscriptionId(subscriptionId), - mRightsFromFile(NULL) { - int rightsLength = 0; - if (String8("") != rightsFilePath) { - rightsLength = ReadWriteUtils::readBytes(rightsFilePath, &mRightsFromFile); - } - mData = DrmBuffer(mRightsFromFile, rightsLength); -} - -DrmRights::DrmRights(const DrmBuffer& rightsData, const String8& mimeType, - const String8& accountId, const String8& subscriptionId) : - mData(rightsData), - mMimeType(mimeType), - mAccountId(accountId), - mSubscriptionId(subscriptionId), - mRightsFromFile(NULL) { -} - -DrmRights::~DrmRights() { - delete[] mRightsFromFile; mRightsFromFile = NULL; -} - -const DrmBuffer& DrmRights::getData(void) const { - return mData; -} - -String8 DrmRights::getMimeType(void) const { - return mMimeType; -} - -String8 DrmRights::getAccountId(void) const { - return mAccountId; -} - -String8 DrmRights::getSubscriptionId(void) const { - return mSubscriptionId; -} - diff --git a/drm/common/DrmSupportInfo.cpp b/drm/common/DrmSupportInfo.cpp deleted file mode 100644 index 5400bdd..0000000 --- a/drm/common/DrmSupportInfo.cpp +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <drm/DrmSupportInfo.h> -#include <strings.h> - -using namespace android; - -DrmSupportInfo::DrmSupportInfo() { - -} - -DrmSupportInfo::DrmSupportInfo(const DrmSupportInfo& drmSupportInfo): - mMimeTypeVector(drmSupportInfo.mMimeTypeVector), - mFileSuffixVector(drmSupportInfo.mFileSuffixVector), - mDescription(drmSupportInfo.mDescription) { - -} - -bool DrmSupportInfo::operator<(const DrmSupportInfo& drmSupportInfo) const { - // Do we need to check mMimeTypeVector & mFileSuffixVector ? - // Note Vector doesn't overrides "<" operator - return mDescription < drmSupportInfo.mDescription; -} - -bool DrmSupportInfo::operator==(const DrmSupportInfo& drmSupportInfo) const { - // Do we need to check mMimeTypeVector & mFileSuffixVector ? - // Note Vector doesn't overrides "==" operator - return (mDescription == drmSupportInfo.mDescription); -} - -bool DrmSupportInfo::isSupportedMimeType(const String8& mimeType) const { - if (String8("") == mimeType) { - return false; - } - - for (unsigned int i = 0; i < mMimeTypeVector.size(); i++) { - const String8 item = mMimeTypeVector.itemAt(i); - - if (!strcasecmp(item.string(), mimeType.string())) { - return true; - } - } - return false; -} - -bool DrmSupportInfo::isSupportedFileSuffix(const String8& fileType) const { - for (unsigned int i = 0; i < mFileSuffixVector.size(); i++) { - const String8 item = mFileSuffixVector.itemAt(i); - - if (!strcasecmp(item.string(), fileType.string())) { - return true; - } - } - return false; -} - -DrmSupportInfo& DrmSupportInfo::operator=(const DrmSupportInfo& drmSupportInfo) { - mMimeTypeVector = drmSupportInfo.mMimeTypeVector; - mFileSuffixVector = drmSupportInfo.mFileSuffixVector; - mDescription = drmSupportInfo.mDescription; - return *this; -} - -int DrmSupportInfo::getMimeTypeCount(void) const { - return mMimeTypeVector.size(); -} - -int DrmSupportInfo::getFileSuffixCount(void) const { - return mFileSuffixVector.size(); -} - -status_t DrmSupportInfo::addMimeType(const String8& mimeType) { - mMimeTypeVector.push(mimeType); - return DRM_NO_ERROR; -} - -status_t DrmSupportInfo::addFileSuffix(const String8& fileSuffix) { - mFileSuffixVector.push(fileSuffix); - return DRM_NO_ERROR; -} - -status_t DrmSupportInfo::setDescription(const String8& description) { - mDescription = description; - return DRM_NO_ERROR; -} - -String8 DrmSupportInfo::getDescription() const { - return mDescription; -} - -DrmSupportInfo::FileSuffixIterator DrmSupportInfo::getFileSuffixIterator() { - return FileSuffixIterator(this); -} - -DrmSupportInfo::MimeTypeIterator DrmSupportInfo::getMimeTypeIterator() { - return MimeTypeIterator(this); -} - -DrmSupportInfo::FileSuffixIterator::FileSuffixIterator( - const DrmSupportInfo::FileSuffixIterator& iterator) : - mDrmSupportInfo(iterator.mDrmSupportInfo), - mIndex(iterator.mIndex) { - -} - -DrmSupportInfo::FileSuffixIterator& DrmSupportInfo::FileSuffixIterator::operator=( - const DrmSupportInfo::FileSuffixIterator& iterator) { - mDrmSupportInfo = iterator.mDrmSupportInfo; - mIndex = iterator.mIndex; - return *this; -} - -bool DrmSupportInfo::FileSuffixIterator::hasNext() { - return mIndex < mDrmSupportInfo->mFileSuffixVector.size(); -} - -String8& DrmSupportInfo::FileSuffixIterator::next() { - String8& value = mDrmSupportInfo->mFileSuffixVector.editItemAt(mIndex); - mIndex++; - return value; -} - -DrmSupportInfo::MimeTypeIterator::MimeTypeIterator( - const DrmSupportInfo::MimeTypeIterator& iterator) : - mDrmSupportInfo(iterator.mDrmSupportInfo), - mIndex(iterator.mIndex) { - -} - -DrmSupportInfo::MimeTypeIterator& DrmSupportInfo::MimeTypeIterator::operator=( - const DrmSupportInfo::MimeTypeIterator& iterator) { - mDrmSupportInfo = iterator.mDrmSupportInfo; - mIndex = iterator.mIndex; - return *this; -} - -bool DrmSupportInfo::MimeTypeIterator::hasNext() { - return mIndex < mDrmSupportInfo->mMimeTypeVector.size(); -} - -String8& DrmSupportInfo::MimeTypeIterator::next() { - String8& value = mDrmSupportInfo->mMimeTypeVector.editItemAt(mIndex); - mIndex++; - return value; -} diff --git a/drm/common/IDrmManagerService.cpp b/drm/common/IDrmManagerService.cpp deleted file mode 100644 index 43f64f2..0000000 --- a/drm/common/IDrmManagerService.cpp +++ /dev/null @@ -1,1447 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -//#define LOG_NDEBUG 0 -#define LOG_TAG "IDrmManagerService(Native)" -#include <utils/Log.h> - -#include <stdint.h> -#include <sys/types.h> -#include <binder/IPCThreadState.h> - -#include <drm/DrmInfo.h> -#include <drm/DrmConstraints.h> -#include <drm/DrmMetadata.h> -#include <drm/DrmRights.h> -#include <drm/DrmInfoStatus.h> -#include <drm/DrmConvertedStatus.h> -#include <drm/DrmInfoRequest.h> -#include <drm/DrmSupportInfo.h> - -#include "IDrmManagerService.h" - -#define INVALID_BUFFER_LENGTH -1 - -using namespace android; - -static void writeDecryptHandleToParcelData( - const DecryptHandle* handle, Parcel* data) { - data->writeInt32(handle->decryptId); - data->writeString8(handle->mimeType); - data->writeInt32(handle->decryptApiType); - data->writeInt32(handle->status); - - int size = handle->copyControlVector.size(); - data->writeInt32(size); - for (int i = 0; i < size; i++) { - data->writeInt32(handle->copyControlVector.keyAt(i)); - data->writeInt32(handle->copyControlVector.valueAt(i)); - } - - size = handle->extendedData.size(); - data->writeInt32(size); - for (int i = 0; i < size; i++) { - data->writeString8(handle->extendedData.keyAt(i)); - data->writeString8(handle->extendedData.valueAt(i)); - } - - if (NULL != handle->decryptInfo) { - data->writeInt32(handle->decryptInfo->decryptBufferLength); - } else { - data->writeInt32(INVALID_BUFFER_LENGTH); - } -} - -static void readDecryptHandleFromParcelData( - DecryptHandle* handle, const Parcel& data) { - if (0 == data.dataAvail()) { - return; - } - - handle->decryptId = data.readInt32(); - handle->mimeType = data.readString8(); - handle->decryptApiType = data.readInt32(); - handle->status = data.readInt32(); - - int size = data.readInt32(); - for (int i = 0; i < size; i++) { - DrmCopyControl key = (DrmCopyControl)data.readInt32(); - int value = data.readInt32(); - handle->copyControlVector.add(key, value); - } - - size = data.readInt32(); - for (int i = 0; i < size; i++) { - String8 key = data.readString8(); - String8 value = data.readString8(); - handle->extendedData.add(key, value); - } - - handle->decryptInfo = NULL; - const int bufferLen = data.readInt32(); - if (INVALID_BUFFER_LENGTH != bufferLen) { - handle->decryptInfo = new DecryptInfo(); - handle->decryptInfo->decryptBufferLength = bufferLen; - } -} - -static void clearDecryptHandle(DecryptHandle* handle) { - if (handle == NULL) { - return; - } - if (handle->decryptInfo) { - delete handle->decryptInfo; - handle->decryptInfo = NULL; - } - handle->copyControlVector.clear(); - handle->extendedData.clear(); -} - -int BpDrmManagerService::addUniqueId(bool isNative) { - ALOGV("add uniqueid"); - Parcel data, reply; - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(isNative); - remote()->transact(ADD_UNIQUEID, data, &reply); - return reply.readInt32(); -} - -void BpDrmManagerService::removeUniqueId(int uniqueId) { - ALOGV("remove uniqueid"); - Parcel data, reply; - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - remote()->transact(REMOVE_UNIQUEID, data, &reply); -} - -void BpDrmManagerService::addClient(int uniqueId) { - Parcel data, reply; - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - remote()->transact(ADD_CLIENT, data, &reply); -} - -void BpDrmManagerService::removeClient(int uniqueId) { - Parcel data, reply; - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - remote()->transact(REMOVE_CLIENT, data, &reply); -} - -status_t BpDrmManagerService::setDrmServiceListener( - int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) { - ALOGV("setDrmServiceListener"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - data.writeStrongBinder(drmServiceListener->asBinder()); - remote()->transact(SET_DRM_SERVICE_LISTENER, data, &reply); - return reply.readInt32(); -} - -status_t BpDrmManagerService::installDrmEngine(int uniqueId, const String8& drmEngineFile) { - ALOGV("Install DRM Engine"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - data.writeString8(drmEngineFile); - - remote()->transact(INSTALL_DRM_ENGINE, data, &reply); - return reply.readInt32(); -} - -DrmConstraints* BpDrmManagerService::getConstraints( - int uniqueId, const String8* path, const int action) { - ALOGV("Get Constraints"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - data.writeString8(*path); - data.writeInt32(action); - - remote()->transact(GET_CONSTRAINTS_FROM_CONTENT, data, &reply); - - DrmConstraints* drmConstraints = NULL; - if (0 != reply.dataAvail()) { - //Filling Drm Constraints - drmConstraints = new DrmConstraints(); - - const int size = reply.readInt32(); - for (int index = 0; index < size; ++index) { - const String8 key(reply.readString8()); - const int bufferSize = reply.readInt32(); - char* data = NULL; - if (0 < bufferSize) { - data = new char[bufferSize]; - reply.read(data, bufferSize); - } - drmConstraints->put(&key, data); - } - } - return drmConstraints; -} - -DrmMetadata* BpDrmManagerService::getMetadata(int uniqueId, const String8* path) { - ALOGV("Get Metadata"); - Parcel data, reply; - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - - DrmMetadata* drmMetadata = NULL; - data.writeString8(*path); - remote()->transact(GET_METADATA_FROM_CONTENT, data, &reply); - - if (0 != reply.dataAvail()) { - //Filling Drm Metadata - drmMetadata = new DrmMetadata(); - - const int size = reply.readInt32(); - for (int index = 0; index < size; ++index) { - const String8 key(reply.readString8()); - const int bufferSize = reply.readInt32(); - char* data = NULL; - if (0 < bufferSize) { - data = new char[bufferSize]; - reply.read(data, bufferSize); - } - drmMetadata->put(&key, data); - } - } - return drmMetadata; -} - -bool BpDrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) { - ALOGV("Can Handle"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - - data.writeString8(path); - data.writeString8(mimeType); - - remote()->transact(CAN_HANDLE, data, &reply); - - return static_cast<bool>(reply.readInt32()); -} - -DrmInfoStatus* BpDrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) { - ALOGV("Process DRM Info"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - - //Filling DRM info - data.writeInt32(drmInfo->getInfoType()); - const DrmBuffer dataBuffer = drmInfo->getData(); - const int dataBufferSize = dataBuffer.length; - data.writeInt32(dataBufferSize); - if (0 < dataBufferSize) { - data.write(dataBuffer.data, dataBufferSize); - } - data.writeString8(drmInfo->getMimeType()); - - data.writeInt32(drmInfo->getCount()); - DrmInfo::KeyIterator keyIt = drmInfo->keyIterator(); - - while (keyIt.hasNext()) { - const String8 key = keyIt.next(); - data.writeString8(key); - const String8 value = drmInfo->get(key); - data.writeString8((value == String8("")) ? String8("NULL") : value); - } - - remote()->transact(PROCESS_DRM_INFO, data, &reply); - - DrmInfoStatus* drmInfoStatus = NULL; - if (0 != reply.dataAvail()) { - //Filling DRM Info Status - const int statusCode = reply.readInt32(); - const int infoType = reply.readInt32(); - const String8 mimeType = reply.readString8(); - - DrmBuffer* drmBuffer = NULL; - if (0 != reply.dataAvail()) { - const int bufferSize = reply.readInt32(); - char* data = NULL; - if (0 < bufferSize) { - data = new char[bufferSize]; - reply.read(data, bufferSize); - } - drmBuffer = new DrmBuffer(data, bufferSize); - } - drmInfoStatus = new DrmInfoStatus(statusCode, infoType, drmBuffer, mimeType); - } - return drmInfoStatus; -} - -DrmInfo* BpDrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest) { - ALOGV("Acquire DRM Info"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - - //Filling DRM Info Request - data.writeInt32(drmInforequest->getInfoType()); - data.writeString8(drmInforequest->getMimeType()); - - data.writeInt32(drmInforequest->getCount()); - DrmInfoRequest::KeyIterator keyIt = drmInforequest->keyIterator(); - - while (keyIt.hasNext()) { - const String8 key = keyIt.next(); - data.writeString8(key); - const String8 value = drmInforequest->get(key); - data.writeString8((value == String8("")) ? String8("NULL") : value); - } - - remote()->transact(ACQUIRE_DRM_INFO, data, &reply); - - DrmInfo* drmInfo = NULL; - if (0 != reply.dataAvail()) { - //Filling DRM Info - const int infoType = reply.readInt32(); - const int bufferSize = reply.readInt32(); - char* data = NULL; - - if (0 < bufferSize) { - data = new char[bufferSize]; - reply.read(data, bufferSize); - } - drmInfo = new DrmInfo(infoType, DrmBuffer(data, bufferSize), reply.readString8()); - - const int size = reply.readInt32(); - for (int index = 0; index < size; ++index) { - const String8 key(reply.readString8()); - const String8 value(reply.readString8()); - drmInfo->put(key, (value == String8("NULL")) ? String8("") : value); - } - } - return drmInfo; -} - -status_t BpDrmManagerService::saveRights( - int uniqueId, const DrmRights& drmRights, - const String8& rightsPath, const String8& contentPath) { - ALOGV("Save Rights"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - - //Filling Drm Rights - const DrmBuffer dataBuffer = drmRights.getData(); - data.writeInt32(dataBuffer.length); - data.write(dataBuffer.data, dataBuffer.length); - - const String8 mimeType = drmRights.getMimeType(); - data.writeString8((mimeType == String8("")) ? String8("NULL") : mimeType); - - const String8 accountId = drmRights.getAccountId(); - data.writeString8((accountId == String8("")) ? String8("NULL") : accountId); - - const String8 subscriptionId = drmRights.getSubscriptionId(); - data.writeString8((subscriptionId == String8("")) ? String8("NULL") : subscriptionId); - - data.writeString8((rightsPath == String8("")) ? String8("NULL") : rightsPath); - data.writeString8((contentPath == String8("")) ? String8("NULL") : contentPath); - - remote()->transact(SAVE_RIGHTS, data, &reply); - return reply.readInt32(); -} - -String8 BpDrmManagerService::getOriginalMimeType(int uniqueId, const String8& path) { - ALOGV("Get Original MimeType"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - data.writeString8(path); - - remote()->transact(GET_ORIGINAL_MIMETYPE, data, &reply); - return reply.readString8(); -} - -int BpDrmManagerService::getDrmObjectType( - int uniqueId, const String8& path, const String8& mimeType) { - ALOGV("Get Drm object type"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - data.writeString8(path); - data.writeString8(mimeType); - - remote()->transact(GET_DRM_OBJECT_TYPE, data, &reply); - - return reply.readInt32(); -} - -int BpDrmManagerService::checkRightsStatus(int uniqueId, const String8& path, int action) { - ALOGV("checkRightsStatus"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - data.writeString8(path); - data.writeInt32(action); - - remote()->transact(CHECK_RIGHTS_STATUS, data, &reply); - - return reply.readInt32(); -} - -status_t BpDrmManagerService::consumeRights( - int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) { - ALOGV("consumeRights"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - - writeDecryptHandleToParcelData(decryptHandle, &data); - - data.writeInt32(action); - data.writeInt32(static_cast< int>(reserve)); - - remote()->transact(CONSUME_RIGHTS, data, &reply); - return reply.readInt32(); -} - -status_t BpDrmManagerService::setPlaybackStatus( - int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) { - ALOGV("setPlaybackStatus"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - - writeDecryptHandleToParcelData(decryptHandle, &data); - - data.writeInt32(playbackStatus); - data.writeInt64(position); - - remote()->transact(SET_PLAYBACK_STATUS, data, &reply); - return reply.readInt32(); -} - -bool BpDrmManagerService::validateAction( - int uniqueId, const String8& path, - int action, const ActionDescription& description) { - ALOGV("validateAction"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - data.writeString8(path); - data.writeInt32(action); - data.writeInt32(description.outputType); - data.writeInt32(description.configuration); - - remote()->transact(VALIDATE_ACTION, data, &reply); - - return static_cast<bool>(reply.readInt32()); -} - -status_t BpDrmManagerService::removeRights(int uniqueId, const String8& path) { - ALOGV("removeRights"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - data.writeString8(path); - - remote()->transact(REMOVE_RIGHTS, data, &reply); - return reply.readInt32(); -} - -status_t BpDrmManagerService::removeAllRights(int uniqueId) { - ALOGV("removeAllRights"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - - remote()->transact(REMOVE_ALL_RIGHTS, data, &reply); - return reply.readInt32(); -} - -int BpDrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) { - ALOGV("openConvertSession"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - data.writeString8(mimeType); - - remote()->transact(OPEN_CONVERT_SESSION, data, &reply); - return reply.readInt32(); -} - -DrmConvertedStatus* BpDrmManagerService::convertData( - int uniqueId, int convertId, const DrmBuffer* inputData) { - ALOGV("convertData"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - data.writeInt32(convertId); - data.writeInt32(inputData->length); - data.write(inputData->data, inputData->length); - - remote()->transact(CONVERT_DATA, data, &reply); - - DrmConvertedStatus* drmConvertedStatus = NULL; - - if (0 != reply.dataAvail()) { - //Filling DRM Converted Status - const int statusCode = reply.readInt32(); - const off64_t offset = reply.readInt64(); - - DrmBuffer* convertedData = NULL; - if (0 != reply.dataAvail()) { - const int bufferSize = reply.readInt32(); - char* data = NULL; - if (0 < bufferSize) { - data = new char[bufferSize]; - reply.read(data, bufferSize); - } - convertedData = new DrmBuffer(data, bufferSize); - } - drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset); - } - return drmConvertedStatus; -} - -DrmConvertedStatus* BpDrmManagerService::closeConvertSession(int uniqueId, int convertId) { - ALOGV("closeConvertSession"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - data.writeInt32(convertId); - - remote()->transact(CLOSE_CONVERT_SESSION, data, &reply); - - DrmConvertedStatus* drmConvertedStatus = NULL; - - if (0 != reply.dataAvail()) { - //Filling DRM Converted Status - const int statusCode = reply.readInt32(); - const off64_t offset = reply.readInt64(); - - DrmBuffer* convertedData = NULL; - if (0 != reply.dataAvail()) { - const int bufferSize = reply.readInt32(); - char* data = NULL; - if (0 < bufferSize) { - data = new char[bufferSize]; - reply.read(data, bufferSize); - } - convertedData = new DrmBuffer(data, bufferSize); - } - drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset); - } - return drmConvertedStatus; -} - -status_t BpDrmManagerService::getAllSupportInfo( - int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) { - ALOGV("Get All Support Info"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - - remote()->transact(GET_ALL_SUPPORT_INFO, data, &reply); - - //Filling DRM Support Info - const int arraySize = reply.readInt32(); - if (0 < arraySize) { - *drmSupportInfoArray = new DrmSupportInfo[arraySize]; - - for (int index = 0; index < arraySize; ++index) { - DrmSupportInfo drmSupportInfo; - - const int fileSuffixVectorSize = reply.readInt32(); - for (int i = 0; i < fileSuffixVectorSize; ++i) { - drmSupportInfo.addFileSuffix(reply.readString8()); - } - - const int mimeTypeVectorSize = reply.readInt32(); - for (int i = 0; i < mimeTypeVectorSize; ++i) { - drmSupportInfo.addMimeType(reply.readString8()); - } - - drmSupportInfo.setDescription(reply.readString8()); - (*drmSupportInfoArray)[index] = drmSupportInfo; - } - } - *length = arraySize; - return reply.readInt32(); -} - -DecryptHandle* BpDrmManagerService::openDecryptSession( - int uniqueId, int fd, off64_t offset, off64_t length, const char* mime) { - ALOGV("Entering BpDrmManagerService::openDecryptSession"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - data.writeFileDescriptor(fd); - data.writeInt64(offset); - data.writeInt64(length); - String8 mimeType; - if (mime) { - mimeType = mime; - } - data.writeString8(mimeType); - - remote()->transact(OPEN_DECRYPT_SESSION, data, &reply); - - DecryptHandle* handle = NULL; - if (0 != reply.dataAvail()) { - handle = new DecryptHandle(); - readDecryptHandleFromParcelData(handle, reply); - } - return handle; -} - -DecryptHandle* BpDrmManagerService::openDecryptSession( - int uniqueId, const char* uri, const char* mime) { - - ALOGV("Entering BpDrmManagerService::openDecryptSession: mime=%s", mime? mime: "NULL"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - data.writeString8(String8(uri)); - String8 mimeType; - if (mime) { - mimeType = mime; - } - data.writeString8(mimeType); - - remote()->transact(OPEN_DECRYPT_SESSION_FROM_URI, data, &reply); - - DecryptHandle* handle = NULL; - if (0 != reply.dataAvail()) { - handle = new DecryptHandle(); - readDecryptHandleFromParcelData(handle, reply); - } else { - ALOGV("no decryptHandle is generated in service side"); - } - return handle; -} - -status_t BpDrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { - ALOGV("closeDecryptSession"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - - writeDecryptHandleToParcelData(decryptHandle, &data); - - remote()->transact(CLOSE_DECRYPT_SESSION, data, &reply); - - return reply.readInt32(); -} - -status_t BpDrmManagerService::initializeDecryptUnit( - int uniqueId, DecryptHandle* decryptHandle, - int decryptUnitId, const DrmBuffer* headerInfo) { - ALOGV("initializeDecryptUnit"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - - writeDecryptHandleToParcelData(decryptHandle, &data); - - data.writeInt32(decryptUnitId); - - data.writeInt32(headerInfo->length); - data.write(headerInfo->data, headerInfo->length); - - remote()->transact(INITIALIZE_DECRYPT_UNIT, data, &reply); - return reply.readInt32(); -} - -status_t BpDrmManagerService::decrypt( - int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, - const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) { - ALOGV("decrypt"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - - writeDecryptHandleToParcelData(decryptHandle, &data); - - data.writeInt32(decryptUnitId); - data.writeInt32((*decBuffer)->length); - - data.writeInt32(encBuffer->length); - data.write(encBuffer->data, encBuffer->length); - - if (NULL != IV) { - data.writeInt32(IV->length); - data.write(IV->data, IV->length); - } - - remote()->transact(DECRYPT, data, &reply); - - const status_t status = reply.readInt32(); - ALOGV("Return value of decrypt() is %d", status); - - const int size = reply.readInt32(); - (*decBuffer)->length = size; - reply.read((void *)(*decBuffer)->data, size); - - return status; -} - -status_t BpDrmManagerService::finalizeDecryptUnit( - int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) { - ALOGV("finalizeDecryptUnit"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - - writeDecryptHandleToParcelData(decryptHandle, &data); - - data.writeInt32(decryptUnitId); - - remote()->transact(FINALIZE_DECRYPT_UNIT, data, &reply); - return reply.readInt32(); -} - -ssize_t BpDrmManagerService::pread( - int uniqueId, DecryptHandle* decryptHandle, void* buffer, - ssize_t numBytes, off64_t offset) { - ALOGV("read"); - Parcel data, reply; - int result; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - - writeDecryptHandleToParcelData(decryptHandle, &data); - - data.writeInt32(numBytes); - data.writeInt64(offset); - - remote()->transact(PREAD, data, &reply); - result = reply.readInt32(); - if (0 < result) { - reply.read(buffer, result); - } - return result; -} - -IMPLEMENT_META_INTERFACE(DrmManagerService, "drm.IDrmManagerService"); - -status_t BnDrmManagerService::onTransact( - uint32_t code, const Parcel& data, - Parcel* reply, uint32_t flags) { - ALOGV("Entering BnDrmManagerService::onTransact with code %d", code); - - switch (code) { - case ADD_UNIQUEID: - { - ALOGV("BnDrmManagerService::onTransact :ADD_UNIQUEID"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - int uniqueId = addUniqueId(data.readInt32()); - reply->writeInt32(uniqueId); - return DRM_NO_ERROR; - } - - case REMOVE_UNIQUEID: - { - ALOGV("BnDrmManagerService::onTransact :REMOVE_UNIQUEID"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - removeUniqueId(data.readInt32()); - return DRM_NO_ERROR; - } - - case ADD_CLIENT: - { - ALOGV("BnDrmManagerService::onTransact :ADD_CLIENT"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - addClient(data.readInt32()); - return DRM_NO_ERROR; - } - - case REMOVE_CLIENT: - { - ALOGV("BnDrmManagerService::onTransact :REMOVE_CLIENT"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - removeClient(data.readInt32()); - return DRM_NO_ERROR; - } - - case SET_DRM_SERVICE_LISTENER: - { - ALOGV("BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - const sp<IDrmServiceListener> drmServiceListener - = interface_cast<IDrmServiceListener> (data.readStrongBinder()); - - status_t status = setDrmServiceListener(uniqueId, drmServiceListener); - - reply->writeInt32(status); - return DRM_NO_ERROR; - } - - case INSTALL_DRM_ENGINE: - { - ALOGV("BnDrmManagerService::onTransact :INSTALL_DRM_ENGINE"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - const String8 engineFile = data.readString8(); - status_t status = installDrmEngine(uniqueId, engineFile); - - reply->writeInt32(status); - return DRM_NO_ERROR; - } - - case GET_CONSTRAINTS_FROM_CONTENT: - { - ALOGV("BnDrmManagerService::onTransact :GET_CONSTRAINTS_FROM_CONTENT"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - const String8 path = data.readString8(); - - DrmConstraints* drmConstraints - = getConstraints(uniqueId, &path, data.readInt32()); - - if (NULL != drmConstraints) { - //Filling DRM Constraints contents - reply->writeInt32(drmConstraints->getCount()); - - DrmConstraints::KeyIterator keyIt = drmConstraints->keyIterator(); - while (keyIt.hasNext()) { - const String8 key = keyIt.next(); - reply->writeString8(key); - const char* value = drmConstraints->getAsByteArray(&key); - int bufferSize = 0; - if (NULL != value) { - bufferSize = strlen(value); - } - reply->writeInt32(bufferSize + 1); - reply->write(value, bufferSize + 1); - } - } - delete drmConstraints; drmConstraints = NULL; - return DRM_NO_ERROR; - } - - case GET_METADATA_FROM_CONTENT: - { - ALOGV("BnDrmManagerService::onTransact :GET_METADATA_FROM_CONTENT"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - const String8 path = data.readString8(); - - DrmMetadata* drmMetadata = getMetadata(uniqueId, &path); - if (NULL != drmMetadata) { - //Filling DRM Metadata contents - reply->writeInt32(drmMetadata->getCount()); - - DrmMetadata::KeyIterator keyIt = drmMetadata->keyIterator(); - while (keyIt.hasNext()) { - const String8 key = keyIt.next(); - reply->writeString8(key); - const char* value = drmMetadata->getAsByteArray(&key); - int bufferSize = 0; - if (NULL != value) { - bufferSize = strlen(value); - reply->writeInt32(bufferSize + 1); - reply->write(value, bufferSize + 1); - } else { - reply->writeInt32(0); - } - } - } - delete drmMetadata; drmMetadata = NULL; - return NO_ERROR; - } - - case CAN_HANDLE: - { - ALOGV("BnDrmManagerService::onTransact :CAN_HANDLE"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - const String8 path = data.readString8(); - const String8 mimeType = data.readString8(); - - bool result = canHandle(uniqueId, path, mimeType); - - reply->writeInt32(result); - return DRM_NO_ERROR; - } - - case PROCESS_DRM_INFO: - { - ALOGV("BnDrmManagerService::onTransact :PROCESS_DRM_INFO"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - - //Filling DRM info - const int infoType = data.readInt32(); - const int bufferSize = data.readInt32(); - char* buffer = NULL; - if (0 < bufferSize) { - buffer = (char *)data.readInplace(bufferSize); - } - const DrmBuffer drmBuffer(buffer, bufferSize); - DrmInfo* drmInfo = new DrmInfo(infoType, drmBuffer, data.readString8()); - - const int size = data.readInt32(); - for (int index = 0; index < size; ++index) { - const String8 key(data.readString8()); - const String8 value(data.readString8()); - drmInfo->put(key, (value == String8("NULL")) ? String8("") : value); - } - - DrmInfoStatus* drmInfoStatus = processDrmInfo(uniqueId, drmInfo); - - if (NULL != drmInfoStatus) { - //Filling DRM Info Status contents - reply->writeInt32(drmInfoStatus->statusCode); - reply->writeInt32(drmInfoStatus->infoType); - reply->writeString8(drmInfoStatus->mimeType); - - if (NULL != drmInfoStatus->drmBuffer) { - const DrmBuffer* drmBuffer = drmInfoStatus->drmBuffer; - const int bufferSize = drmBuffer->length; - reply->writeInt32(bufferSize); - if (0 < bufferSize) { - reply->write(drmBuffer->data, bufferSize); - } - delete [] drmBuffer->data; - delete drmBuffer; drmBuffer = NULL; - } - } - delete drmInfo; drmInfo = NULL; - delete drmInfoStatus; drmInfoStatus = NULL; - return DRM_NO_ERROR; - } - - case ACQUIRE_DRM_INFO: - { - ALOGV("BnDrmManagerService::onTransact :ACQUIRE_DRM_INFO"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - - //Filling DRM info Request - const int infoType = data.readInt32(); - const String8 mimeType = data.readString8(); - DrmInfoRequest* drmInfoRequest = new DrmInfoRequest(infoType, mimeType); - - const int size = data.readInt32(); - for (int index = 0; index < size; ++index) { - const String8 key(data.readString8()); - const String8 value(data.readString8()); - drmInfoRequest->put(key, (value == String8("NULL")) ? String8("") : value); - } - - DrmInfo* drmInfo = acquireDrmInfo(uniqueId, drmInfoRequest); - - if (NULL != drmInfo) { - //Filling DRM Info - const DrmBuffer drmBuffer = drmInfo->getData(); - reply->writeInt32(drmInfo->getInfoType()); - - const int bufferSize = drmBuffer.length; - reply->writeInt32(bufferSize); - if (0 < bufferSize) { - reply->write(drmBuffer.data, bufferSize); - } - reply->writeString8(drmInfo->getMimeType()); - reply->writeInt32(drmInfo->getCount()); - - DrmInfo::KeyIterator keyIt = drmInfo->keyIterator(); - while (keyIt.hasNext()) { - const String8 key = keyIt.next(); - reply->writeString8(key); - const String8 value = drmInfo->get(key); - reply->writeString8((value == String8("")) ? String8("NULL") : value); - } - delete [] drmBuffer.data; - } - delete drmInfoRequest; drmInfoRequest = NULL; - delete drmInfo; drmInfo = NULL; - return DRM_NO_ERROR; - } - - case SAVE_RIGHTS: - { - ALOGV("BnDrmManagerService::onTransact :SAVE_RIGHTS"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - - //Filling DRM Rights - const int bufferSize = data.readInt32(); - const DrmBuffer drmBuffer((char *)data.readInplace(bufferSize), bufferSize); - - const String8 mimeType(data.readString8()); - const String8 accountId(data.readString8()); - const String8 subscriptionId(data.readString8()); - const String8 rightsPath(data.readString8()); - const String8 contentPath(data.readString8()); - - DrmRights drmRights(drmBuffer, - ((mimeType == String8("NULL")) ? String8("") : mimeType), - ((accountId == String8("NULL")) ? String8("") : accountId), - ((subscriptionId == String8("NULL")) ? String8("") : subscriptionId)); - - const status_t status = saveRights(uniqueId, drmRights, - ((rightsPath == String8("NULL")) ? String8("") : rightsPath), - ((contentPath == String8("NULL")) ? String8("") : contentPath)); - - reply->writeInt32(status); - return DRM_NO_ERROR; - } - - case GET_ORIGINAL_MIMETYPE: - { - ALOGV("BnDrmManagerService::onTransact :GET_ORIGINAL_MIMETYPE"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - const String8 path = data.readString8(); - const String8 originalMimeType = getOriginalMimeType(uniqueId, path); - - reply->writeString8(originalMimeType); - return DRM_NO_ERROR; - } - - case GET_DRM_OBJECT_TYPE: - { - ALOGV("BnDrmManagerService::onTransact :GET_DRM_OBJECT_TYPE"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - const String8 path = data.readString8(); - const String8 mimeType = data.readString8(); - const int drmObjectType = getDrmObjectType(uniqueId, path, mimeType); - - reply->writeInt32(drmObjectType); - return DRM_NO_ERROR; - } - - case CHECK_RIGHTS_STATUS: - { - ALOGV("BnDrmManagerService::onTransact :CHECK_RIGHTS_STATUS"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - const String8 path = data.readString8(); - const int action = data.readInt32(); - const int result = checkRightsStatus(uniqueId, path, action); - - reply->writeInt32(result); - return DRM_NO_ERROR; - } - - case CONSUME_RIGHTS: - { - ALOGV("BnDrmManagerService::onTransact :CONSUME_RIGHTS"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - - DecryptHandle handle; - readDecryptHandleFromParcelData(&handle, data); - - const int action = data.readInt32(); - const bool reserve = static_cast<bool>(data.readInt32()); - const status_t status - = consumeRights(uniqueId, &handle, action, reserve); - reply->writeInt32(status); - - clearDecryptHandle(&handle); - return DRM_NO_ERROR; - } - - case SET_PLAYBACK_STATUS: - { - ALOGV("BnDrmManagerService::onTransact :SET_PLAYBACK_STATUS"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - - DecryptHandle handle; - readDecryptHandleFromParcelData(&handle, data); - - const int playbackStatus = data.readInt32(); - const int64_t position = data.readInt64(); - const status_t status - = setPlaybackStatus(uniqueId, &handle, playbackStatus, position); - reply->writeInt32(status); - - clearDecryptHandle(&handle); - return DRM_NO_ERROR; - } - - case VALIDATE_ACTION: - { - ALOGV("BnDrmManagerService::onTransact :VALIDATE_ACTION"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - const String8 path = data.readString8(); - const int action = data.readInt32(); - const int outputType = data.readInt32(); - const int configuration = data.readInt32(); - bool result = validateAction(uniqueId, path, action, - ActionDescription(outputType, configuration)); - - reply->writeInt32(result); - return DRM_NO_ERROR; - } - - case REMOVE_RIGHTS: - { - ALOGV("BnDrmManagerService::onTransact :REMOVE_RIGHTS"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - int uniqueId = data.readInt32(); - String8 path = data.readString8(); - const status_t status = removeRights(uniqueId, path); - reply->writeInt32(status); - - return DRM_NO_ERROR; - } - - case REMOVE_ALL_RIGHTS: - { - ALOGV("BnDrmManagerService::onTransact :REMOVE_ALL_RIGHTS"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const status_t status = removeAllRights(data.readInt32()); - reply->writeInt32(status); - - return DRM_NO_ERROR; - } - - case OPEN_CONVERT_SESSION: - { - ALOGV("BnDrmManagerService::onTransact :OPEN_CONVERT_SESSION"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - const String8 mimeType = data.readString8(); - const int convertId = openConvertSession(uniqueId, mimeType); - - reply->writeInt32(convertId); - return DRM_NO_ERROR; - } - - case CONVERT_DATA: - { - ALOGV("BnDrmManagerService::onTransact :CONVERT_DATA"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - const int convertId = data.readInt32(); - - //Filling input data - const int bufferSize = data.readInt32(); - DrmBuffer* inputData = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize); - - DrmConvertedStatus* drmConvertedStatus = convertData(uniqueId, convertId, inputData); - - if (NULL != drmConvertedStatus) { - //Filling Drm Converted Ststus - reply->writeInt32(drmConvertedStatus->statusCode); - reply->writeInt64(drmConvertedStatus->offset); - - if (NULL != drmConvertedStatus->convertedData) { - const DrmBuffer* convertedData = drmConvertedStatus->convertedData; - const int bufferSize = convertedData->length; - reply->writeInt32(bufferSize); - if (0 < bufferSize) { - reply->write(convertedData->data, bufferSize); - } - delete [] convertedData->data; - delete convertedData; convertedData = NULL; - } - } - delete inputData; inputData = NULL; - delete drmConvertedStatus; drmConvertedStatus = NULL; - return DRM_NO_ERROR; - } - - case CLOSE_CONVERT_SESSION: - { - ALOGV("BnDrmManagerService::onTransact :CLOSE_CONVERT_SESSION"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - const int convertId = data.readInt32(); - DrmConvertedStatus* drmConvertedStatus - = closeConvertSession(uniqueId, convertId); - - if (NULL != drmConvertedStatus) { - //Filling Drm Converted Ststus - reply->writeInt32(drmConvertedStatus->statusCode); - reply->writeInt64(drmConvertedStatus->offset); - - if (NULL != drmConvertedStatus->convertedData) { - const DrmBuffer* convertedData = drmConvertedStatus->convertedData; - const int bufferSize = convertedData->length; - reply->writeInt32(bufferSize); - if (0 < bufferSize) { - reply->write(convertedData->data, bufferSize); - } - delete [] convertedData->data; - delete convertedData; convertedData = NULL; - } - } - delete drmConvertedStatus; drmConvertedStatus = NULL; - return DRM_NO_ERROR; - } - - case GET_ALL_SUPPORT_INFO: - { - ALOGV("BnDrmManagerService::onTransact :GET_ALL_SUPPORT_INFO"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - int length = 0; - DrmSupportInfo* drmSupportInfoArray = NULL; - - status_t status = getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray); - - reply->writeInt32(length); - for (int i = 0; i < length; ++i) { - DrmSupportInfo drmSupportInfo = drmSupportInfoArray[i]; - - reply->writeInt32(drmSupportInfo.getFileSuffixCount()); - DrmSupportInfo::FileSuffixIterator fileSuffixIt - = drmSupportInfo.getFileSuffixIterator(); - while (fileSuffixIt.hasNext()) { - reply->writeString8(fileSuffixIt.next()); - } - - reply->writeInt32(drmSupportInfo.getMimeTypeCount()); - DrmSupportInfo::MimeTypeIterator mimeTypeIt = drmSupportInfo.getMimeTypeIterator(); - while (mimeTypeIt.hasNext()) { - reply->writeString8(mimeTypeIt.next()); - } - reply->writeString8(drmSupportInfo.getDescription()); - } - delete [] drmSupportInfoArray; drmSupportInfoArray = NULL; - reply->writeInt32(status); - return DRM_NO_ERROR; - } - - case OPEN_DECRYPT_SESSION: - { - ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - const int fd = data.readFileDescriptor(); - - const off64_t offset = data.readInt64(); - const off64_t length = data.readInt64(); - const String8 mime = data.readString8(); - - DecryptHandle* handle - = openDecryptSession(uniqueId, fd, offset, length, mime.string()); - - if (NULL != handle) { - writeDecryptHandleToParcelData(handle, reply); - clearDecryptHandle(handle); - delete handle; handle = NULL; - } - return DRM_NO_ERROR; - } - - case OPEN_DECRYPT_SESSION_FROM_URI: - { - ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - const String8 uri = data.readString8(); - const String8 mime = data.readString8(); - - DecryptHandle* handle = openDecryptSession(uniqueId, uri.string(), mime.string()); - - if (NULL != handle) { - writeDecryptHandleToParcelData(handle, reply); - - clearDecryptHandle(handle); - delete handle; handle = NULL; - } else { - ALOGV("NULL decryptHandle is returned"); - } - return DRM_NO_ERROR; - } - - case CLOSE_DECRYPT_SESSION: - { - ALOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - - DecryptHandle* handle = new DecryptHandle(); - readDecryptHandleFromParcelData(handle, data); - - const status_t status = closeDecryptSession(uniqueId, handle); - reply->writeInt32(status); - return DRM_NO_ERROR; - } - - case INITIALIZE_DECRYPT_UNIT: - { - ALOGV("BnDrmManagerService::onTransact :INITIALIZE_DECRYPT_UNIT"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - - DecryptHandle handle; - readDecryptHandleFromParcelData(&handle, data); - - const int decryptUnitId = data.readInt32(); - - //Filling Header info - const int bufferSize = data.readInt32(); - DrmBuffer* headerInfo = NULL; - headerInfo = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize); - - const status_t status - = initializeDecryptUnit(uniqueId, &handle, decryptUnitId, headerInfo); - reply->writeInt32(status); - - clearDecryptHandle(&handle); - delete headerInfo; headerInfo = NULL; - return DRM_NO_ERROR; - } - - case DECRYPT: - { - ALOGV("BnDrmManagerService::onTransact :DECRYPT"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - - DecryptHandle handle; - readDecryptHandleFromParcelData(&handle, data); - - const int decryptUnitId = data.readInt32(); - const int decBufferSize = data.readInt32(); - - const int encBufferSize = data.readInt32(); - DrmBuffer* encBuffer - = new DrmBuffer((char *)data.readInplace(encBufferSize), encBufferSize); - - char* buffer = NULL; - buffer = new char[decBufferSize]; - DrmBuffer* decBuffer = new DrmBuffer(buffer, decBufferSize); - - DrmBuffer* IV = NULL; - if (0 != data.dataAvail()) { - const int ivBufferlength = data.readInt32(); - IV = new DrmBuffer((char *)data.readInplace(ivBufferlength), ivBufferlength); - } - - const status_t status - = decrypt(uniqueId, &handle, decryptUnitId, encBuffer, &decBuffer, IV); - - reply->writeInt32(status); - - const int size = decBuffer->length; - reply->writeInt32(size); - reply->write(decBuffer->data, size); - - clearDecryptHandle(&handle); - delete encBuffer; encBuffer = NULL; - delete decBuffer; decBuffer = NULL; - delete [] buffer; buffer = NULL; - delete IV; IV = NULL; - return DRM_NO_ERROR; - } - - case FINALIZE_DECRYPT_UNIT: - { - ALOGV("BnDrmManagerService::onTransact :FINALIZE_DECRYPT_UNIT"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - - DecryptHandle handle; - readDecryptHandleFromParcelData(&handle, data); - - const status_t status = finalizeDecryptUnit(uniqueId, &handle, data.readInt32()); - reply->writeInt32(status); - - clearDecryptHandle(&handle); - return DRM_NO_ERROR; - } - - case PREAD: - { - ALOGV("BnDrmManagerService::onTransact :READ"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - - DecryptHandle handle; - readDecryptHandleFromParcelData(&handle, data); - - const int numBytes = data.readInt32(); - char* buffer = new char[numBytes]; - - const off64_t offset = data.readInt64(); - - ssize_t result = pread(uniqueId, &handle, buffer, numBytes, offset); - reply->writeInt32(result); - if (0 < result) { - reply->write(buffer, result); - } - - clearDecryptHandle(&handle); - delete [] buffer, buffer = NULL; - return DRM_NO_ERROR; - } - - default: - return BBinder::onTransact(code, data, reply, flags); - } -} - diff --git a/drm/common/IDrmServiceListener.cpp b/drm/common/IDrmServiceListener.cpp deleted file mode 100644 index 6eeea40..0000000 --- a/drm/common/IDrmServiceListener.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <stdint.h> -#include <sys/types.h> -#include <binder/Parcel.h> -#include <binder/IPCThreadState.h> -#include <drm/drm_framework_common.h> -#include <drm/DrmInfoEvent.h> -#include "IDrmServiceListener.h" - -using namespace android; - -status_t BpDrmServiceListener::notify(const DrmInfoEvent& event) { - Parcel data, reply; - - data.writeInterfaceToken(IDrmServiceListener::getInterfaceDescriptor()); - data.writeInt32(event.getUniqueId()); - data.writeInt32(event.getType()); - data.writeString8(event.getMessage()); - - remote()->transact(NOTIFY, data, &reply); - return reply.readInt32(); -} - -IMPLEMENT_META_INTERFACE(DrmServiceListener, "drm.IDrmServiceListener"); - -status_t BnDrmServiceListener::onTransact( - uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { - - switch (code) { - case NOTIFY: - { - CHECK_INTERFACE(IDrmServiceListener, data, reply); - int uniqueId = data.readInt32(); - int type = data.readInt32(); - const String8& message = data.readString8(); - - status_t status = notify(DrmInfoEvent(uniqueId, type, message)); - reply->writeInt32(status); - - return DRM_NO_ERROR; - } - default: - return BBinder::onTransact(code, data, reply, flags); - } -} - diff --git a/drm/common/ReadWriteUtils.cpp b/drm/common/ReadWriteUtils.cpp deleted file mode 100644 index fd17e98..0000000 --- a/drm/common/ReadWriteUtils.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -//#define LOG_NDEBUG 0 -#define LOG_TAG "ReadWriteUtils" -#include <utils/Log.h> - -#include <ReadWriteUtils.h> -#include <sys/mman.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <fcntl.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <utils/String8.h> - -using namespace android; - -#define FAILURE -1 - -String8 ReadWriteUtils::readBytes(const String8& filePath) { - FILE* file = NULL; - file = fopen(filePath.string(), "r"); - - String8 string(""); - if (NULL != file) { - int fd = fileno(file); - struct stat sb; - - if (fstat(fd, &sb) == 0 && sb.st_size > 0) { - off64_t length = sb.st_size; - char* bytes = new char[length]; - if (length == read(fd, (void*) bytes, length)) { - string.append(bytes, length); - } - delete bytes; - } - fclose(file); - } - return string; -} - -int ReadWriteUtils::readBytes(const String8& filePath, char** buffer) { - FILE* file = NULL; - file = fopen(filePath.string(), "r"); - off64_t length = 0; - - if (NULL != file) { - int fd = fileno(file); - struct stat sb; - - if (fstat(fd, &sb) == 0 && sb.st_size > 0) { - length = sb.st_size; - *buffer = new char[length]; - if (length != read(fd, (void*) *buffer, length)) { - length = FAILURE; - } - } - fclose(file); - } - return length; -} - -void ReadWriteUtils::writeToFile(const String8& filePath, const String8& data) { - FILE* file = NULL; - file = fopen(filePath.string(), "w+"); - - if (NULL != file) { - int fd = fileno(file); - - int size = data.size(); - if (FAILURE != ftruncate(fd, size)) { - if (size != write(fd, data.string(), size)) { - ALOGE("Failed to write the data to: %s", filePath.string()); - } - } - fclose(file); - } -} - -void ReadWriteUtils::appendToFile(const String8& filePath, const String8& data) { - FILE* file = NULL; - file = fopen(filePath.string(), "a+"); - - if (NULL != file) { - int fd = fileno(file); - - int size = data.size(); - if (size != write(fd, data.string(), size)) { - ALOGE("Failed to write the data to: %s", filePath.string()); - } - fclose(file); - } -} - diff --git a/drm/drmserver/Android.mk b/drm/drmserver/Android.mk deleted file mode 100644 index fd417cb..0000000 --- a/drm/drmserver/Android.mk +++ /dev/null @@ -1,41 +0,0 @@ -# -# Copyright (C) 2010 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES:= \ - main_drmserver.cpp \ - DrmManager.cpp \ - DrmManagerService.cpp - -LOCAL_SHARED_LIBRARIES := \ - libmedia \ - libutils \ - libbinder \ - libdl - -LOCAL_STATIC_LIBRARIES := libdrmframeworkcommon - -LOCAL_C_INCLUDES := \ - $(TOP)/frameworks/base/include \ - $(TOP)/frameworks/base/drm/libdrmframework/include \ - $(TOP)/frameworks/base/drm/libdrmframework/plugins/common/include - -LOCAL_MODULE:= drmserver - -LOCAL_MODULE_TAGS := optional - -include $(BUILD_EXECUTABLE) diff --git a/drm/drmserver/DrmManager.cpp b/drm/drmserver/DrmManager.cpp deleted file mode 100644 index 999295a..0000000 --- a/drm/drmserver/DrmManager.cpp +++ /dev/null @@ -1,606 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -//#define LOG_NDEBUG 0 -#define LOG_TAG "DrmManager(Native)" -#include "utils/Log.h" - -#include <utils/String8.h> -#include <drm/DrmInfo.h> -#include <drm/DrmInfoEvent.h> -#include <drm/DrmRights.h> -#include <drm/DrmConstraints.h> -#include <drm/DrmMetadata.h> -#include <drm/DrmInfoStatus.h> -#include <drm/DrmInfoRequest.h> -#include <drm/DrmSupportInfo.h> -#include <drm/DrmConvertedStatus.h> -#include <IDrmEngine.h> - -#include "DrmManager.h" -#include "ReadWriteUtils.h" - -#define DECRYPT_FILE_ERROR -1 - -using namespace android; - -const String8 DrmManager::EMPTY_STRING(""); - -DrmManager::DrmManager() : - mDecryptSessionId(0), - mConvertId(0) { - -} - -DrmManager::~DrmManager() { - -} - -int DrmManager::addUniqueId(bool isNative) { - Mutex::Autolock _l(mLock); - - int temp = 0; - bool foundUniqueId = false; - const int size = mUniqueIdVector.size(); - const int uniqueIdRange = 0xfff; - int maxLoopTimes = (uniqueIdRange - 1) / 2; - srand(time(NULL)); - - while (!foundUniqueId) { - temp = rand() & uniqueIdRange; - - if (isNative) { - // set a flag to differentiate DrmManagerClient - // created from native side and java side - temp |= 0x1000; - } - - int index = 0; - for (; index < size; ++index) { - if (mUniqueIdVector.itemAt(index) == temp) { - foundUniqueId = false; - break; - } - } - if (index == size) { - foundUniqueId = true; - } - - maxLoopTimes --; - LOG_FATAL_IF(maxLoopTimes <= 0, "cannot find an unique ID for this session"); - } - - mUniqueIdVector.push(temp); - return temp; -} - -void DrmManager::removeUniqueId(int uniqueId) { - Mutex::Autolock _l(mLock); - for (unsigned int i = 0; i < mUniqueIdVector.size(); i++) { - if (uniqueId == mUniqueIdVector.itemAt(i)) { - mUniqueIdVector.removeAt(i); - break; - } - } -} - -status_t DrmManager::loadPlugIns() { - - String8 vendorPluginDirPath("/vendor/lib/drm"); - loadPlugIns(vendorPluginDirPath); - - String8 pluginDirPath("/system/lib/drm"); - loadPlugIns(pluginDirPath); - return DRM_NO_ERROR; - -} - -status_t DrmManager::loadPlugIns(const String8& plugInDirPath) { - mPlugInManager.loadPlugIns(plugInDirPath); - Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList(); - for (unsigned int i = 0; i < plugInPathList.size(); ++i) { - String8 plugInPath = plugInPathList[i]; - DrmSupportInfo* info = mPlugInManager.getPlugIn(plugInPath).getSupportInfo(0); - if (NULL != info) { - if (mSupportInfoToPlugInIdMap.indexOfKey(*info) < 0) { - mSupportInfoToPlugInIdMap.add(*info, plugInPath); - } - delete info; - } - } - return DRM_NO_ERROR; -} - -status_t DrmManager::unloadPlugIns() { - Mutex::Autolock _l(mLock); - mConvertSessionMap.clear(); - mDecryptSessionMap.clear(); - mPlugInManager.unloadPlugIns(); - mSupportInfoToPlugInIdMap.clear(); - return DRM_NO_ERROR; -} - -status_t DrmManager::setDrmServiceListener( - int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) { - Mutex::Autolock _l(mListenerLock); - if (NULL != drmServiceListener.get()) { - mServiceListeners.add(uniqueId, drmServiceListener); - } else { - mServiceListeners.removeItem(uniqueId); - } - return DRM_NO_ERROR; -} - -void DrmManager::addClient(int uniqueId) { - Mutex::Autolock _l(mLock); - if (!mSupportInfoToPlugInIdMap.isEmpty()) { - Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); - for (unsigned int index = 0; index < plugInIdList.size(); index++) { - IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInIdList.itemAt(index)); - rDrmEngine.initialize(uniqueId); - rDrmEngine.setOnInfoListener(uniqueId, this); - } - } -} - -void DrmManager::removeClient(int uniqueId) { - Mutex::Autolock _l(mLock); - Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); - for (unsigned int index = 0; index < plugInIdList.size(); index++) { - IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInIdList.itemAt(index)); - rDrmEngine.terminate(uniqueId); - } -} - -DrmConstraints* DrmManager::getConstraints(int uniqueId, const String8* path, const int action) { - Mutex::Autolock _l(mLock); - const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, *path); - if (EMPTY_STRING != plugInId) { - IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); - return rDrmEngine.getConstraints(uniqueId, path, action); - } - return NULL; -} - -DrmMetadata* DrmManager::getMetadata(int uniqueId, const String8* path) { - Mutex::Autolock _l(mLock); - const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, *path); - if (EMPTY_STRING != plugInId) { - IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); - return rDrmEngine.getMetadata(uniqueId, path); - } - return NULL; -} - -status_t DrmManager::installDrmEngine(int uniqueId, const String8& absolutePath) { - Mutex::Autolock _l(mLock); - mPlugInManager.loadPlugIn(absolutePath); - - IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(absolutePath); - rDrmEngine.initialize(uniqueId); - rDrmEngine.setOnInfoListener(uniqueId, this); - - DrmSupportInfo* info = rDrmEngine.getSupportInfo(0); - mSupportInfoToPlugInIdMap.add(*info, absolutePath); - delete info; - - return DRM_NO_ERROR; -} - -bool DrmManager::canHandle(int uniqueId, const String8& path, const String8& mimeType) { - Mutex::Autolock _l(mLock); - const String8 plugInId = getSupportedPlugInId(mimeType); - bool result = (EMPTY_STRING != plugInId) ? true : false; - - if (0 < path.length()) { - if (result) { - IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); - result = rDrmEngine.canHandle(uniqueId, path); - } else { - String8 extension = path.getPathExtension(); - if (String8("") != extension) { - result = canHandle(uniqueId, path); - } - } - } - return result; -} - -DrmInfoStatus* DrmManager::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) { - Mutex::Autolock _l(mLock); - const String8 plugInId = getSupportedPlugInId(drmInfo->getMimeType()); - if (EMPTY_STRING != plugInId) { - IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); - return rDrmEngine.processDrmInfo(uniqueId, drmInfo); - } - return NULL; -} - -bool DrmManager::canHandle(int uniqueId, const String8& path) { - bool result = false; - Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList(); - - for (unsigned int i = 0; i < plugInPathList.size(); ++i) { - IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInPathList[i]); - result = rDrmEngine.canHandle(uniqueId, path); - - if (result) { - break; - } - } - return result; -} - -DrmInfo* DrmManager::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest) { - Mutex::Autolock _l(mLock); - const String8 plugInId = getSupportedPlugInId(drmInfoRequest->getMimeType()); - if (EMPTY_STRING != plugInId) { - IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); - return rDrmEngine.acquireDrmInfo(uniqueId, drmInfoRequest); - } - return NULL; -} - -status_t DrmManager::saveRights(int uniqueId, const DrmRights& drmRights, - const String8& rightsPath, const String8& contentPath) { - Mutex::Autolock _l(mLock); - const String8 plugInId = getSupportedPlugInId(drmRights.getMimeType()); - status_t result = DRM_ERROR_UNKNOWN; - if (EMPTY_STRING != plugInId) { - IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); - result = rDrmEngine.saveRights(uniqueId, drmRights, rightsPath, contentPath); - } - return result; -} - -String8 DrmManager::getOriginalMimeType(int uniqueId, const String8& path) { - Mutex::Autolock _l(mLock); - const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path); - if (EMPTY_STRING != plugInId) { - IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); - return rDrmEngine.getOriginalMimeType(uniqueId, path); - } - return EMPTY_STRING; -} - -int DrmManager::getDrmObjectType(int uniqueId, const String8& path, const String8& mimeType) { - Mutex::Autolock _l(mLock); - const String8 plugInId = getSupportedPlugInId(uniqueId, path, mimeType); - if (EMPTY_STRING != plugInId) { - IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); - return rDrmEngine.getDrmObjectType(uniqueId, path, mimeType); - } - return DrmObjectType::UNKNOWN; -} - -int DrmManager::checkRightsStatus(int uniqueId, const String8& path, int action) { - Mutex::Autolock _l(mLock); - const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path); - if (EMPTY_STRING != plugInId) { - IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); - return rDrmEngine.checkRightsStatus(uniqueId, path, action); - } - return RightsStatus::RIGHTS_INVALID; -} - -status_t DrmManager::consumeRights( - int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) { - status_t result = DRM_ERROR_UNKNOWN; - Mutex::Autolock _l(mDecryptLock); - if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { - IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); - result = drmEngine->consumeRights(uniqueId, decryptHandle, action, reserve); - } - return result; -} - -status_t DrmManager::setPlaybackStatus( - int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) { - status_t result = DRM_ERROR_UNKNOWN; - Mutex::Autolock _l(mDecryptLock); - if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { - IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); - result = drmEngine->setPlaybackStatus(uniqueId, decryptHandle, playbackStatus, position); - } - return result; -} - -bool DrmManager::validateAction( - int uniqueId, const String8& path, int action, const ActionDescription& description) { - Mutex::Autolock _l(mLock); - const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path); - if (EMPTY_STRING != plugInId) { - IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); - return rDrmEngine.validateAction(uniqueId, path, action, description); - } - return false; -} - -status_t DrmManager::removeRights(int uniqueId, const String8& path) { - Mutex::Autolock _l(mLock); - const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path); - status_t result = DRM_ERROR_UNKNOWN; - if (EMPTY_STRING != plugInId) { - IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); - result = rDrmEngine.removeRights(uniqueId, path); - } - return result; -} - -status_t DrmManager::removeAllRights(int uniqueId) { - Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); - status_t result = DRM_ERROR_UNKNOWN; - for (unsigned int index = 0; index < plugInIdList.size(); index++) { - IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInIdList.itemAt(index)); - result = rDrmEngine.removeAllRights(uniqueId); - if (DRM_NO_ERROR != result) { - break; - } - } - return result; -} - -int DrmManager::openConvertSession(int uniqueId, const String8& mimeType) { - Mutex::Autolock _l(mConvertLock); - int convertId = -1; - - const String8 plugInId = getSupportedPlugInId(mimeType); - if (EMPTY_STRING != plugInId) { - IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); - - if (DRM_NO_ERROR == rDrmEngine.openConvertSession(uniqueId, mConvertId + 1)) { - ++mConvertId; - convertId = mConvertId; - mConvertSessionMap.add(convertId, &rDrmEngine); - } - } - return convertId; -} - -DrmConvertedStatus* DrmManager::convertData( - int uniqueId, int convertId, const DrmBuffer* inputData) { - DrmConvertedStatus *drmConvertedStatus = NULL; - - Mutex::Autolock _l(mConvertLock); - if (mConvertSessionMap.indexOfKey(convertId) != NAME_NOT_FOUND) { - IDrmEngine* drmEngine = mConvertSessionMap.valueFor(convertId); - drmConvertedStatus = drmEngine->convertData(uniqueId, convertId, inputData); - } - return drmConvertedStatus; -} - -DrmConvertedStatus* DrmManager::closeConvertSession(int uniqueId, int convertId) { - Mutex::Autolock _l(mConvertLock); - DrmConvertedStatus *drmConvertedStatus = NULL; - - if (mConvertSessionMap.indexOfKey(convertId) != NAME_NOT_FOUND) { - IDrmEngine* drmEngine = mConvertSessionMap.valueFor(convertId); - drmConvertedStatus = drmEngine->closeConvertSession(uniqueId, convertId); - mConvertSessionMap.removeItem(convertId); - } - return drmConvertedStatus; -} - -status_t DrmManager::getAllSupportInfo( - int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) { - Mutex::Autolock _l(mLock); - Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList(); - int size = plugInPathList.size(); - int validPlugins = 0; - - if (0 < size) { - Vector<DrmSupportInfo> drmSupportInfoList; - - for (int i = 0; i < size; ++i) { - String8 plugInPath = plugInPathList[i]; - DrmSupportInfo* drmSupportInfo - = mPlugInManager.getPlugIn(plugInPath).getSupportInfo(0); - if (NULL != drmSupportInfo) { - drmSupportInfoList.add(*drmSupportInfo); - delete drmSupportInfo; drmSupportInfo = NULL; - } - } - - validPlugins = drmSupportInfoList.size(); - if (0 < validPlugins) { - *drmSupportInfoArray = new DrmSupportInfo[validPlugins]; - for (int i = 0; i < validPlugins; ++i) { - (*drmSupportInfoArray)[i] = drmSupportInfoList[i]; - } - } - } - *length = validPlugins; - return DRM_NO_ERROR; -} - -DecryptHandle* DrmManager::openDecryptSession( - int uniqueId, int fd, off64_t offset, off64_t length, const char* mime) { - - Mutex::Autolock _l(mDecryptLock); - status_t result = DRM_ERROR_CANNOT_HANDLE; - Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); - - DecryptHandle* handle = new DecryptHandle(); - if (NULL != handle) { - handle->decryptId = mDecryptSessionId + 1; - - for (unsigned int index = 0; index < plugInIdList.size(); index++) { - String8 plugInId = plugInIdList.itemAt(index); - IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); - result = rDrmEngine.openDecryptSession(uniqueId, handle, fd, offset, length, mime); - - if (DRM_NO_ERROR == result) { - ++mDecryptSessionId; - mDecryptSessionMap.add(mDecryptSessionId, &rDrmEngine); - break; - } - } - } - if (DRM_NO_ERROR != result) { - delete handle; handle = NULL; - } - return handle; -} - -DecryptHandle* DrmManager::openDecryptSession( - int uniqueId, const char* uri, const char* mime) { - Mutex::Autolock _l(mDecryptLock); - status_t result = DRM_ERROR_CANNOT_HANDLE; - Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); - - DecryptHandle* handle = new DecryptHandle(); - if (NULL != handle) { - handle->decryptId = mDecryptSessionId + 1; - - for (unsigned int index = 0; index < plugInIdList.size(); index++) { - String8 plugInId = plugInIdList.itemAt(index); - IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); - result = rDrmEngine.openDecryptSession(uniqueId, handle, uri, mime); - - if (DRM_NO_ERROR == result) { - ++mDecryptSessionId; - mDecryptSessionMap.add(mDecryptSessionId, &rDrmEngine); - break; - } - } - } - if (DRM_NO_ERROR != result) { - delete handle; handle = NULL; - ALOGV("DrmManager::openDecryptSession: no capable plug-in found"); - } - return handle; -} - -status_t DrmManager::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { - Mutex::Autolock _l(mDecryptLock); - status_t result = DRM_ERROR_UNKNOWN; - if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { - IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); - result = drmEngine->closeDecryptSession(uniqueId, decryptHandle); - if (DRM_NO_ERROR == result) { - mDecryptSessionMap.removeItem(decryptHandle->decryptId); - } - } - return result; -} - -status_t DrmManager::initializeDecryptUnit( - int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, const DrmBuffer* headerInfo) { - status_t result = DRM_ERROR_UNKNOWN; - Mutex::Autolock _l(mDecryptLock); - if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { - IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); - result = drmEngine->initializeDecryptUnit(uniqueId, decryptHandle, decryptUnitId, headerInfo); - } - return result; -} - -status_t DrmManager::decrypt(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, - const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) { - status_t result = DRM_ERROR_UNKNOWN; - - Mutex::Autolock _l(mDecryptLock); - if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { - IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); - result = drmEngine->decrypt( - uniqueId, decryptHandle, decryptUnitId, encBuffer, decBuffer, IV); - } - return result; -} - -status_t DrmManager::finalizeDecryptUnit( - int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) { - status_t result = DRM_ERROR_UNKNOWN; - Mutex::Autolock _l(mDecryptLock); - if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { - IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); - result = drmEngine->finalizeDecryptUnit(uniqueId, decryptHandle, decryptUnitId); - } - return result; -} - -ssize_t DrmManager::pread(int uniqueId, DecryptHandle* decryptHandle, - void* buffer, ssize_t numBytes, off64_t offset) { - ssize_t result = DECRYPT_FILE_ERROR; - - Mutex::Autolock _l(mDecryptLock); - if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { - IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); - result = drmEngine->pread(uniqueId, decryptHandle, buffer, numBytes, offset); - } - return result; -} - -String8 DrmManager::getSupportedPlugInId( - int uniqueId, const String8& path, const String8& mimeType) { - String8 plugInId(""); - - if (EMPTY_STRING != mimeType) { - plugInId = getSupportedPlugInId(mimeType); - } else { - plugInId = getSupportedPlugInIdFromPath(uniqueId, path); - } - return plugInId; -} - -String8 DrmManager::getSupportedPlugInId(const String8& mimeType) { - String8 plugInId(""); - - if (EMPTY_STRING != mimeType) { - for (unsigned int index = 0; index < mSupportInfoToPlugInIdMap.size(); index++) { - const DrmSupportInfo& drmSupportInfo = mSupportInfoToPlugInIdMap.keyAt(index); - - if (drmSupportInfo.isSupportedMimeType(mimeType)) { - plugInId = mSupportInfoToPlugInIdMap.valueFor(drmSupportInfo); - break; - } - } - } - return plugInId; -} - -String8 DrmManager::getSupportedPlugInIdFromPath(int uniqueId, const String8& path) { - String8 plugInId(""); - const String8 fileSuffix = path.getPathExtension(); - - for (unsigned int index = 0; index < mSupportInfoToPlugInIdMap.size(); index++) { - const DrmSupportInfo& drmSupportInfo = mSupportInfoToPlugInIdMap.keyAt(index); - - if (drmSupportInfo.isSupportedFileSuffix(fileSuffix)) { - String8 key = mSupportInfoToPlugInIdMap.valueFor(drmSupportInfo); - IDrmEngine& drmEngine = mPlugInManager.getPlugIn(key); - - if (drmEngine.canHandle(uniqueId, path)) { - plugInId = key; - break; - } - } - } - return plugInId; -} - -void DrmManager::onInfo(const DrmInfoEvent& event) { - Mutex::Autolock _l(mListenerLock); - for (unsigned int index = 0; index < mServiceListeners.size(); index++) { - int uniqueId = mServiceListeners.keyAt(index); - - if (uniqueId == event.getUniqueId()) { - sp<IDrmServiceListener> serviceListener = mServiceListeners.valueFor(uniqueId); - serviceListener->notify(event); - } - } -} - diff --git a/drm/drmserver/DrmManagerService.cpp b/drm/drmserver/DrmManagerService.cpp deleted file mode 100644 index 8ba0203..0000000 --- a/drm/drmserver/DrmManagerService.cpp +++ /dev/null @@ -1,308 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -//#define LOG_NDEBUG 0 -#define LOG_TAG "DrmManagerService(Native)" -#include <utils/Log.h> - -#include <private/android_filesystem_config.h> -#include <media/MemoryLeakTrackUtil.h> - -#include <errno.h> -#include <utils/threads.h> -#include <binder/IServiceManager.h> -#include <binder/IPCThreadState.h> -#include <sys/stat.h> -#include "DrmManagerService.h" -#include "DrmManager.h" - -using namespace android; - -static Vector<uid_t> trustedUids; - -static bool isProtectedCallAllowed() { - // TODO - // Following implementation is just for reference. - // Each OEM manufacturer should implement/replace with their own solutions. - bool result = false; - - IPCThreadState* ipcState = IPCThreadState::self(); - uid_t uid = ipcState->getCallingUid(); - - for (unsigned int i = 0; i < trustedUids.size(); ++i) { - if (trustedUids[i] == uid) { - result = true; - break; - } - } - return result; -} - -void DrmManagerService::instantiate() { - ALOGV("instantiate"); - defaultServiceManager()->addService(String16("drm.drmManager"), new DrmManagerService()); - - if (0 >= trustedUids.size()) { - // TODO - // Following implementation is just for reference. - // Each OEM manufacturer should implement/replace with their own solutions. - - // Add trusted uids here - trustedUids.push(AID_MEDIA); - } -} - -DrmManagerService::DrmManagerService() : - mDrmManager(NULL) { - ALOGV("created"); - mDrmManager = new DrmManager(); - mDrmManager->loadPlugIns(); -} - -DrmManagerService::~DrmManagerService() { - ALOGV("Destroyed"); - mDrmManager->unloadPlugIns(); - delete mDrmManager; mDrmManager = NULL; -} - -int DrmManagerService::addUniqueId(bool isNative) { - return mDrmManager->addUniqueId(isNative); -} - -void DrmManagerService::removeUniqueId(int uniqueId) { - mDrmManager->removeUniqueId(uniqueId); -} - -void DrmManagerService::addClient(int uniqueId) { - mDrmManager->addClient(uniqueId); -} - -void DrmManagerService::removeClient(int uniqueId) { - mDrmManager->removeClient(uniqueId); -} - -status_t DrmManagerService::setDrmServiceListener( - int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) { - ALOGV("Entering setDrmServiceListener"); - mDrmManager->setDrmServiceListener(uniqueId, drmServiceListener); - return DRM_NO_ERROR; -} - -status_t DrmManagerService::installDrmEngine(int uniqueId, const String8& drmEngineFile) { - ALOGV("Entering installDrmEngine"); - return mDrmManager->installDrmEngine(uniqueId, drmEngineFile); -} - -DrmConstraints* DrmManagerService::getConstraints( - int uniqueId, const String8* path, const int action) { - ALOGV("Entering getConstraints from content"); - return mDrmManager->getConstraints(uniqueId, path, action); -} - -DrmMetadata* DrmManagerService::getMetadata(int uniqueId, const String8* path) { - ALOGV("Entering getMetadata from content"); - return mDrmManager->getMetadata(uniqueId, path); -} - -bool DrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) { - ALOGV("Entering canHandle"); - return mDrmManager->canHandle(uniqueId, path, mimeType); -} - -DrmInfoStatus* DrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) { - ALOGV("Entering processDrmInfo"); - return mDrmManager->processDrmInfo(uniqueId, drmInfo); -} - -DrmInfo* DrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest) { - ALOGV("Entering acquireDrmInfo"); - return mDrmManager->acquireDrmInfo(uniqueId, drmInfoRequest); -} - -status_t DrmManagerService::saveRights( - int uniqueId, const DrmRights& drmRights, - const String8& rightsPath, const String8& contentPath) { - ALOGV("Entering saveRights"); - return mDrmManager->saveRights(uniqueId, drmRights, rightsPath, contentPath); -} - -String8 DrmManagerService::getOriginalMimeType(int uniqueId, const String8& path) { - ALOGV("Entering getOriginalMimeType"); - return mDrmManager->getOriginalMimeType(uniqueId, path); -} - -int DrmManagerService::getDrmObjectType( - int uniqueId, const String8& path, const String8& mimeType) { - ALOGV("Entering getDrmObjectType"); - return mDrmManager->getDrmObjectType(uniqueId, path, mimeType); -} - -int DrmManagerService::checkRightsStatus( - int uniqueId, const String8& path, int action) { - ALOGV("Entering checkRightsStatus"); - return mDrmManager->checkRightsStatus(uniqueId, path, action); -} - -status_t DrmManagerService::consumeRights( - int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) { - ALOGV("Entering consumeRights"); - if (!isProtectedCallAllowed()) { - return DRM_ERROR_NO_PERMISSION; - } - return mDrmManager->consumeRights(uniqueId, decryptHandle, action, reserve); -} - -status_t DrmManagerService::setPlaybackStatus( - int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) { - ALOGV("Entering setPlaybackStatus"); - if (!isProtectedCallAllowed()) { - return DRM_ERROR_NO_PERMISSION; - } - return mDrmManager->setPlaybackStatus(uniqueId, decryptHandle, playbackStatus, position); -} - -bool DrmManagerService::validateAction( - int uniqueId, const String8& path, - int action, const ActionDescription& description) { - ALOGV("Entering validateAction"); - return mDrmManager->validateAction(uniqueId, path, action, description); -} - -status_t DrmManagerService::removeRights(int uniqueId, const String8& path) { - ALOGV("Entering removeRights"); - return mDrmManager->removeRights(uniqueId, path); -} - -status_t DrmManagerService::removeAllRights(int uniqueId) { - ALOGV("Entering removeAllRights"); - return mDrmManager->removeAllRights(uniqueId); -} - -int DrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) { - ALOGV("Entering openConvertSession"); - return mDrmManager->openConvertSession(uniqueId, mimeType); -} - -DrmConvertedStatus* DrmManagerService::convertData( - int uniqueId, int convertId, const DrmBuffer* inputData) { - ALOGV("Entering convertData"); - return mDrmManager->convertData(uniqueId, convertId, inputData); -} - -DrmConvertedStatus* DrmManagerService::closeConvertSession(int uniqueId, int convertId) { - ALOGV("Entering closeConvertSession"); - return mDrmManager->closeConvertSession(uniqueId, convertId); -} - -status_t DrmManagerService::getAllSupportInfo( - int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) { - ALOGV("Entering getAllSupportInfo"); - return mDrmManager->getAllSupportInfo(uniqueId, length, drmSupportInfoArray); -} - -DecryptHandle* DrmManagerService::openDecryptSession( - int uniqueId, int fd, off64_t offset, off64_t length, const char* mime) { - ALOGV("Entering DrmManagerService::openDecryptSession"); - if (isProtectedCallAllowed()) { - return mDrmManager->openDecryptSession(uniqueId, fd, offset, length, mime); - } - - return NULL; -} - -DecryptHandle* DrmManagerService::openDecryptSession( - int uniqueId, const char* uri, const char* mime) { - ALOGV("Entering DrmManagerService::openDecryptSession with uri"); - if (isProtectedCallAllowed()) { - return mDrmManager->openDecryptSession(uniqueId, uri, mime); - } - - return NULL; -} - -status_t DrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { - ALOGV("Entering closeDecryptSession"); - if (!isProtectedCallAllowed()) { - return DRM_ERROR_NO_PERMISSION; - } - return mDrmManager->closeDecryptSession(uniqueId, decryptHandle); -} - -status_t DrmManagerService::initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, - int decryptUnitId, const DrmBuffer* headerInfo) { - ALOGV("Entering initializeDecryptUnit"); - if (!isProtectedCallAllowed()) { - return DRM_ERROR_NO_PERMISSION; - } - return mDrmManager->initializeDecryptUnit(uniqueId,decryptHandle, decryptUnitId, headerInfo); -} - -status_t DrmManagerService::decrypt( - int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, - const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) { - ALOGV("Entering decrypt"); - if (!isProtectedCallAllowed()) { - return DRM_ERROR_NO_PERMISSION; - } - return mDrmManager->decrypt(uniqueId, decryptHandle, decryptUnitId, encBuffer, decBuffer, IV); -} - -status_t DrmManagerService::finalizeDecryptUnit( - int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) { - ALOGV("Entering finalizeDecryptUnit"); - if (!isProtectedCallAllowed()) { - return DRM_ERROR_NO_PERMISSION; - } - return mDrmManager->finalizeDecryptUnit(uniqueId, decryptHandle, decryptUnitId); -} - -ssize_t DrmManagerService::pread(int uniqueId, DecryptHandle* decryptHandle, - void* buffer, ssize_t numBytes, off64_t offset) { - ALOGV("Entering pread"); - if (!isProtectedCallAllowed()) { - return DRM_ERROR_NO_PERMISSION; - } - return mDrmManager->pread(uniqueId, decryptHandle, buffer, numBytes, offset); -} - -status_t DrmManagerService::dump(int fd, const Vector<String16>& args) -{ - const size_t SIZE = 256; - char buffer[SIZE]; - String8 result; - if (checkCallingPermission(String16("android.permission.DUMP")) == false) { - snprintf(buffer, SIZE, "Permission Denial: " - "can't dump DrmManagerService from pid=%d, uid=%d\n", - IPCThreadState::self()->getCallingPid(), - IPCThreadState::self()->getCallingUid()); - result.append(buffer); - } else { -#if DRM_MEMORY_LEAK_TRACK - bool dumpMem = false; - for (size_t i = 0; i < args.size(); i++) { - if (args[i] == String16("-m")) { - dumpMem = true; - } - } - if (dumpMem) { - dumpMemoryAddresses(fd); - } -#endif - } - write(fd, result.string(), result.size()); - return NO_ERROR; -} - diff --git a/drm/drmserver/main_drmserver.cpp b/drm/drmserver/main_drmserver.cpp deleted file mode 100644 index 434d561..0000000 --- a/drm/drmserver/main_drmserver.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define LOG_TAG "drmserver" -//#define LOG_NDEBUG 0 - -#include <binder/IPCThreadState.h> -#include <binder/ProcessState.h> -#include <binder/IServiceManager.h> -#include <utils/Log.h> - -#include <DrmManagerService.h> - -using namespace android; - -int main(int argc, char** argv) -{ - sp<ProcessState> proc(ProcessState::self()); - sp<IServiceManager> sm = defaultServiceManager(); - ALOGV("ServiceManager: %p", sm.get()); - DrmManagerService::instantiate(); - ProcessState::self()->startThreadPool(); - IPCThreadState::self()->joinThreadPool(); -} - diff --git a/drm/libdrmframework/Android.mk b/drm/libdrmframework/Android.mk deleted file mode 100644 index c534402..0000000 --- a/drm/libdrmframework/Android.mk +++ /dev/null @@ -1,44 +0,0 @@ -# -# Copyright (C) 2010 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -LOCAL_PATH:= $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_SRC_FILES:= \ - DrmManagerClientImpl.cpp \ - DrmManagerClient.cpp - -LOCAL_MODULE:= libdrmframework - -LOCAL_SHARED_LIBRARIES := \ - libutils \ - libbinder \ - libdl - -LOCAL_STATIC_LIBRARIES := \ - libdrmframeworkcommon - -LOCAL_C_INCLUDES += \ - $(TOP)/frameworks/base/drm/libdrmframework/include \ - $(TOP)/frameworks/base/include - - - -LOCAL_MODULE_TAGS := optional - -include $(BUILD_SHARED_LIBRARY) - -include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/drm/libdrmframework/DrmManagerClient.cpp b/drm/libdrmframework/DrmManagerClient.cpp deleted file mode 100644 index 8768c08..0000000 --- a/drm/libdrmframework/DrmManagerClient.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <utils/String8.h> -#include <binder/IServiceManager.h> -#include <drm/DrmManagerClient.h> - -#include "DrmManagerClientImpl.h" - -using namespace android; - -DrmManagerClient::DrmManagerClient(): - mUniqueId(0), mDrmManagerClientImpl(NULL) { - mDrmManagerClientImpl = DrmManagerClientImpl::create(&mUniqueId, true); - mDrmManagerClientImpl->addClient(mUniqueId); -} - -DrmManagerClient::~DrmManagerClient() { - DrmManagerClientImpl::remove(mUniqueId); - mDrmManagerClientImpl->removeClient(mUniqueId); - mDrmManagerClientImpl->setOnInfoListener(mUniqueId, NULL); -} - -status_t DrmManagerClient::setOnInfoListener( - const sp<DrmManagerClient::OnInfoListener>& infoListener) { - return mDrmManagerClientImpl->setOnInfoListener(mUniqueId, infoListener); -} - -DrmConstraints* DrmManagerClient::getConstraints(const String8* path, const int action) { - return mDrmManagerClientImpl->getConstraints(mUniqueId, path, action); -} - -DrmMetadata* DrmManagerClient::getMetadata(const String8* path) { - return mDrmManagerClientImpl->getMetadata(mUniqueId, path); -} - -bool DrmManagerClient::canHandle(const String8& path, const String8& mimeType) { - return mDrmManagerClientImpl->canHandle(mUniqueId, path, mimeType); -} - -DrmInfoStatus* DrmManagerClient::processDrmInfo(const DrmInfo* drmInfo) { - return mDrmManagerClientImpl->processDrmInfo(mUniqueId, drmInfo); -} - -DrmInfo* DrmManagerClient::acquireDrmInfo(const DrmInfoRequest* drmInfoRequest) { - return mDrmManagerClientImpl->acquireDrmInfo(mUniqueId, drmInfoRequest); -} - -status_t DrmManagerClient::saveRights( - const DrmRights& drmRights, const String8& rightsPath, const String8& contentPath) { - return mDrmManagerClientImpl->saveRights(mUniqueId, drmRights, rightsPath, contentPath); -} - -String8 DrmManagerClient::getOriginalMimeType(const String8& path) { - return mDrmManagerClientImpl->getOriginalMimeType(mUniqueId, path); -} - -int DrmManagerClient::getDrmObjectType(const String8& path, const String8& mimeType) { - return mDrmManagerClientImpl->getDrmObjectType( mUniqueId, path, mimeType); -} - -int DrmManagerClient::checkRightsStatus(const String8& path, int action) { - return mDrmManagerClientImpl->checkRightsStatus(mUniqueId, path, action); -} - -status_t DrmManagerClient::consumeRights( - sp<DecryptHandle> &decryptHandle, int action, bool reserve) { - return mDrmManagerClientImpl->consumeRights(mUniqueId, decryptHandle, action, reserve); -} - -status_t DrmManagerClient::setPlaybackStatus( - sp<DecryptHandle> &decryptHandle, int playbackStatus, int64_t position) { - return mDrmManagerClientImpl - ->setPlaybackStatus(mUniqueId, decryptHandle, playbackStatus, position); -} - -bool DrmManagerClient::validateAction( - const String8& path, int action, const ActionDescription& description) { - return mDrmManagerClientImpl->validateAction(mUniqueId, path, action, description); -} - -status_t DrmManagerClient::removeRights(const String8& path) { - return mDrmManagerClientImpl->removeRights(mUniqueId, path); -} - -status_t DrmManagerClient::removeAllRights() { - return mDrmManagerClientImpl->removeAllRights(mUniqueId); -} - -int DrmManagerClient::openConvertSession(const String8& mimeType) { - return mDrmManagerClientImpl->openConvertSession(mUniqueId, mimeType); -} - -DrmConvertedStatus* DrmManagerClient::convertData(int convertId, const DrmBuffer* inputData) { - return mDrmManagerClientImpl->convertData(mUniqueId, convertId, inputData); -} - -DrmConvertedStatus* DrmManagerClient::closeConvertSession(int convertId) { - return mDrmManagerClientImpl->closeConvertSession(mUniqueId, convertId); -} - -status_t DrmManagerClient::getAllSupportInfo(int* length, DrmSupportInfo** drmSupportInfoArray) { - return mDrmManagerClientImpl->getAllSupportInfo(mUniqueId, length, drmSupportInfoArray); -} - -sp<DecryptHandle> DrmManagerClient::openDecryptSession( - int fd, off64_t offset, off64_t length, const char* mime) { - - return mDrmManagerClientImpl->openDecryptSession( - mUniqueId, fd, offset, length, mime); -} - -sp<DecryptHandle> DrmManagerClient::openDecryptSession( - const char* uri, const char* mime) { - - return mDrmManagerClientImpl->openDecryptSession( - mUniqueId, uri, mime); -} - -status_t DrmManagerClient::closeDecryptSession(sp<DecryptHandle> &decryptHandle) { - return mDrmManagerClientImpl->closeDecryptSession(mUniqueId, decryptHandle); -} - -status_t DrmManagerClient::initializeDecryptUnit( - sp<DecryptHandle> &decryptHandle, int decryptUnitId, const DrmBuffer* headerInfo) { - return mDrmManagerClientImpl->initializeDecryptUnit( - mUniqueId, decryptHandle, decryptUnitId, headerInfo); -} - -status_t DrmManagerClient::decrypt( - sp<DecryptHandle> &decryptHandle, int decryptUnitId, - const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) { - return mDrmManagerClientImpl->decrypt( - mUniqueId, decryptHandle, decryptUnitId, encBuffer, decBuffer, IV); -} - -status_t DrmManagerClient::finalizeDecryptUnit( - sp<DecryptHandle> &decryptHandle, int decryptUnitId) { - return mDrmManagerClientImpl->finalizeDecryptUnit(mUniqueId, - decryptHandle, decryptUnitId); -} - -ssize_t DrmManagerClient::pread( - sp<DecryptHandle> &decryptHandle, void* buffer, ssize_t numBytes, off64_t offset) { - return mDrmManagerClientImpl->pread(mUniqueId, decryptHandle, buffer, numBytes, offset); -} - diff --git a/drm/libdrmframework/DrmManagerClientImpl.cpp b/drm/libdrmframework/DrmManagerClientImpl.cpp deleted file mode 100644 index fb0439e..0000000 --- a/drm/libdrmframework/DrmManagerClientImpl.cpp +++ /dev/null @@ -1,351 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -//#define LOG_NDEBUG 0 -#define LOG_TAG "DrmManagerClientImpl(Native)" -#include <utils/Log.h> - -#include <utils/String8.h> -#include <utils/Vector.h> -#include <binder/IServiceManager.h> - -#include "DrmManagerClientImpl.h" - -using namespace android; - -#define INVALID_VALUE -1 - -Mutex DrmManagerClientImpl::sMutex; -sp<IDrmManagerService> DrmManagerClientImpl::sDrmManagerService; -sp<DrmManagerClientImpl::DeathNotifier> DrmManagerClientImpl::sDeathNotifier; -const String8 DrmManagerClientImpl::EMPTY_STRING(""); - -DrmManagerClientImpl* DrmManagerClientImpl::create( - int* pUniqueId, bool isNative) { - *pUniqueId = getDrmManagerService()->addUniqueId(isNative); - - return new DrmManagerClientImpl(); -} - -void DrmManagerClientImpl::remove(int uniqueId) { - getDrmManagerService()->removeUniqueId(uniqueId); -} - -const sp<IDrmManagerService>& DrmManagerClientImpl::getDrmManagerService() { - Mutex::Autolock lock(sMutex); - if (NULL == sDrmManagerService.get()) { - sp<IServiceManager> sm = defaultServiceManager(); - sp<IBinder> binder; - do { - binder = sm->getService(String16("drm.drmManager")); - if (binder != 0) { - break; - } - ALOGW("DrmManagerService not published, waiting..."); - struct timespec reqt; - reqt.tv_sec = 0; - reqt.tv_nsec = 500000000; //0.5 sec - nanosleep(&reqt, NULL); - } while (true); - if (NULL == sDeathNotifier.get()) { - sDeathNotifier = new DeathNotifier(); - } - binder->linkToDeath(sDeathNotifier); - sDrmManagerService = interface_cast<IDrmManagerService>(binder); - } - return sDrmManagerService; -} - -void DrmManagerClientImpl::addClient(int uniqueId) { - getDrmManagerService()->addClient(uniqueId); -} - -void DrmManagerClientImpl::removeClient(int uniqueId) { - getDrmManagerService()->removeClient(uniqueId); -} - -status_t DrmManagerClientImpl::setOnInfoListener( - int uniqueId, - const sp<DrmManagerClient::OnInfoListener>& infoListener) { - Mutex::Autolock _l(mLock); - mOnInfoListener = infoListener; - return getDrmManagerService()->setDrmServiceListener(uniqueId, - (NULL != infoListener.get()) ? this : NULL); -} - -status_t DrmManagerClientImpl::installDrmEngine( - int uniqueId, const String8& drmEngineFile) { - status_t status = DRM_ERROR_UNKNOWN; - if (EMPTY_STRING != drmEngineFile) { - status = getDrmManagerService()->installDrmEngine(uniqueId, drmEngineFile); - } - return status; -} - -DrmConstraints* DrmManagerClientImpl::getConstraints( - int uniqueId, const String8* path, const int action) { - DrmConstraints *drmConstraints = NULL; - if ((NULL != path) && (EMPTY_STRING != *path)) { - drmConstraints = - getDrmManagerService()->getConstraints(uniqueId, path, action); - } - return drmConstraints; -} - -DrmMetadata* DrmManagerClientImpl::getMetadata(int uniqueId, const String8* path) { - DrmMetadata *drmMetadata = NULL; - if ((NULL != path) && (EMPTY_STRING != *path)) { - drmMetadata = getDrmManagerService()->getMetadata(uniqueId, path); - } - return drmMetadata; -} - -bool DrmManagerClientImpl::canHandle( - int uniqueId, const String8& path, const String8& mimeType) { - bool retCode = false; - if ((EMPTY_STRING != path) || (EMPTY_STRING != mimeType)) { - retCode = getDrmManagerService()->canHandle(uniqueId, path, mimeType); - } - return retCode; -} - -DrmInfoStatus* DrmManagerClientImpl::processDrmInfo( - int uniqueId, const DrmInfo* drmInfo) { - DrmInfoStatus *drmInfoStatus = NULL; - if (NULL != drmInfo) { - drmInfoStatus = getDrmManagerService()->processDrmInfo(uniqueId, drmInfo); - } - return drmInfoStatus; -} - -DrmInfo* DrmManagerClientImpl::acquireDrmInfo( - int uniqueId, const DrmInfoRequest* drmInfoRequest) { - DrmInfo* drmInfo = NULL; - if (NULL != drmInfoRequest) { - drmInfo = getDrmManagerService()->acquireDrmInfo(uniqueId, drmInfoRequest); - } - return drmInfo; -} - -status_t DrmManagerClientImpl::saveRights(int uniqueId, const DrmRights& drmRights, - const String8& rightsPath, const String8& contentPath) { - return getDrmManagerService()->saveRights( - uniqueId, drmRights, rightsPath, contentPath); -} - -String8 DrmManagerClientImpl::getOriginalMimeType( - int uniqueId, const String8& path) { - String8 mimeType = EMPTY_STRING; - if (EMPTY_STRING != path) { - mimeType = getDrmManagerService()->getOriginalMimeType(uniqueId, path); - } - return mimeType; -} - -int DrmManagerClientImpl::getDrmObjectType( - int uniqueId, const String8& path, const String8& mimeType) { - int drmOjectType = DrmObjectType::UNKNOWN; - if ((EMPTY_STRING != path) || (EMPTY_STRING != mimeType)) { - drmOjectType = - getDrmManagerService()->getDrmObjectType(uniqueId, path, mimeType); - } - return drmOjectType; -} - -int DrmManagerClientImpl::checkRightsStatus( - int uniqueId, const String8& path, int action) { - int rightsStatus = RightsStatus::RIGHTS_INVALID; - if (EMPTY_STRING != path) { - rightsStatus = - getDrmManagerService()->checkRightsStatus(uniqueId, path, action); - } - return rightsStatus; -} - -status_t DrmManagerClientImpl::consumeRights( - int uniqueId, sp<DecryptHandle> &decryptHandle, - int action, bool reserve) { - status_t status = DRM_ERROR_UNKNOWN; - if (NULL != decryptHandle.get()) { - status = getDrmManagerService()->consumeRights( - uniqueId, decryptHandle.get(), action, reserve); - } - return status; -} - -status_t DrmManagerClientImpl::setPlaybackStatus( - int uniqueId, sp<DecryptHandle> &decryptHandle, - int playbackStatus, int64_t position) { - status_t status = DRM_ERROR_UNKNOWN; - if (NULL != decryptHandle.get()) { - status = getDrmManagerService()->setPlaybackStatus( - uniqueId, decryptHandle.get(), playbackStatus, position); - } - return status; -} - -bool DrmManagerClientImpl::validateAction( - int uniqueId, const String8& path, - int action, const ActionDescription& description) { - bool retCode = false; - if (EMPTY_STRING != path) { - retCode = getDrmManagerService()->validateAction( - uniqueId, path, action, description); - } - return retCode; -} - -status_t DrmManagerClientImpl::removeRights(int uniqueId, const String8& path) { - status_t status = DRM_ERROR_UNKNOWN; - if (EMPTY_STRING != path) { - status = getDrmManagerService()->removeRights(uniqueId, path); - } - return status; -} - -status_t DrmManagerClientImpl::removeAllRights(int uniqueId) { - return getDrmManagerService()->removeAllRights(uniqueId); -} - -int DrmManagerClientImpl::openConvertSession( - int uniqueId, const String8& mimeType) { - int retCode = INVALID_VALUE; - if (EMPTY_STRING != mimeType) { - retCode = getDrmManagerService()->openConvertSession(uniqueId, mimeType); - } - return retCode; -} - -DrmConvertedStatus* DrmManagerClientImpl::convertData( - int uniqueId, int convertId, const DrmBuffer* inputData) { - DrmConvertedStatus* drmConvertedStatus = NULL; - if (NULL != inputData) { - drmConvertedStatus = - getDrmManagerService()->convertData(uniqueId, convertId, inputData); - } - return drmConvertedStatus; -} - -DrmConvertedStatus* DrmManagerClientImpl::closeConvertSession( - int uniqueId, int convertId) { - return getDrmManagerService()->closeConvertSession(uniqueId, convertId); -} - -status_t DrmManagerClientImpl::getAllSupportInfo( - int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) { - status_t status = DRM_ERROR_UNKNOWN; - if ((NULL != drmSupportInfoArray) && (NULL != length)) { - status = getDrmManagerService()->getAllSupportInfo( - uniqueId, length, drmSupportInfoArray); - } - return status; -} - -sp<DecryptHandle> DrmManagerClientImpl::openDecryptSession( - int uniqueId, int fd, off64_t offset, - off64_t length, const char* mime) { - - return getDrmManagerService()->openDecryptSession( - uniqueId, fd, offset, length, mime); -} - -sp<DecryptHandle> DrmManagerClientImpl::openDecryptSession( - int uniqueId, const char* uri, const char* mime) { - - DecryptHandle* handle = NULL; - if (NULL != uri) { - handle = getDrmManagerService()->openDecryptSession(uniqueId, uri, mime); - } - return handle; -} - -status_t DrmManagerClientImpl::closeDecryptSession( - int uniqueId, sp<DecryptHandle> &decryptHandle) { - status_t status = DRM_ERROR_UNKNOWN; - if (NULL != decryptHandle.get()) { - status = getDrmManagerService()->closeDecryptSession( - uniqueId, decryptHandle.get()); - } - return status; -} - -status_t DrmManagerClientImpl::initializeDecryptUnit( - int uniqueId, sp<DecryptHandle> &decryptHandle, - int decryptUnitId, const DrmBuffer* headerInfo) { - status_t status = DRM_ERROR_UNKNOWN; - if ((NULL != decryptHandle.get()) && (NULL != headerInfo)) { - status = getDrmManagerService()->initializeDecryptUnit( - uniqueId, decryptHandle.get(), decryptUnitId, headerInfo); - } - return status; -} - -status_t DrmManagerClientImpl::decrypt( - int uniqueId, sp<DecryptHandle> &decryptHandle, - int decryptUnitId, const DrmBuffer* encBuffer, - DrmBuffer** decBuffer, DrmBuffer* IV) { - status_t status = DRM_ERROR_UNKNOWN; - if ((NULL != decryptHandle.get()) && (NULL != encBuffer) - && (NULL != decBuffer) && (NULL != *decBuffer)) { - status = getDrmManagerService()->decrypt( - uniqueId, decryptHandle.get(), decryptUnitId, - encBuffer, decBuffer, IV); - } - return status; -} - -status_t DrmManagerClientImpl::finalizeDecryptUnit( - int uniqueId, sp<DecryptHandle> &decryptHandle, int decryptUnitId) { - status_t status = DRM_ERROR_UNKNOWN; - if (NULL != decryptHandle.get()) { - status = getDrmManagerService()->finalizeDecryptUnit( - uniqueId, decryptHandle.get(), decryptUnitId); - } - return status; -} - -ssize_t DrmManagerClientImpl::pread(int uniqueId, sp<DecryptHandle> &decryptHandle, - void* buffer, ssize_t numBytes, off64_t offset) { - ssize_t retCode = INVALID_VALUE; - if ((NULL != decryptHandle.get()) && (NULL != buffer) && (0 < numBytes)) { - retCode = getDrmManagerService()->pread( - uniqueId, decryptHandle.get(), buffer, numBytes, offset); - } - return retCode; -} - -status_t DrmManagerClientImpl::notify(const DrmInfoEvent& event) { - if (NULL != mOnInfoListener.get()) { - Mutex::Autolock _l(mLock); - sp<DrmManagerClient::OnInfoListener> listener = mOnInfoListener; - listener->onInfo(event); - } - return DRM_NO_ERROR; -} - -DrmManagerClientImpl::DeathNotifier::~DeathNotifier() { - Mutex::Autolock lock(sMutex); - if (NULL != sDrmManagerService.get()) { - sDrmManagerService->asBinder()->unlinkToDeath(this); - } -} - -void DrmManagerClientImpl::DeathNotifier::binderDied(const wp<IBinder>& who) { - Mutex::Autolock lock(sMutex); - DrmManagerClientImpl::sDrmManagerService.clear(); - ALOGW("DrmManager server died!"); -} - diff --git a/drm/libdrmframework/include/DrmManager.h b/drm/libdrmframework/include/DrmManager.h deleted file mode 100644 index c9167d4..0000000 --- a/drm/libdrmframework/include/DrmManager.h +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __DRM_MANAGER_H__ -#define __DRM_MANAGER_H__ - -#include <utils/Errors.h> -#include <utils/threads.h> -#include <drm/drm_framework_common.h> -#include "IDrmEngine.h" -#include "PlugInManager.h" -#include "IDrmServiceListener.h" - -namespace android { - -class IDrmManager; -class DrmRegistrationInfo; -class DrmUnregistrationInfo; -class DrmRightsAcquisitionInfo; -class DrmConstraints; -class DrmMetadata; -class DrmRights; -class DrmInfo; -class DrmInfoStatus; -class DrmConvertedStatus; -class DrmInfoRequest; -class DrmSupportInfo; -class ActionDescription; - -/** - * This is implementation class for DRM Manager. This class delegates the - * functionality to corresponding DRM Engine. - * - * The DrmManagerService class creates an instance of this class. - * - */ -class DrmManager : public IDrmEngine::OnInfoListener { -public: - DrmManager(); - virtual ~DrmManager(); - -public: - int addUniqueId(bool isNative); - - void removeUniqueId(int uniqueId); - - void addClient(int uniqueId); - - void removeClient(int uniqueId); - - status_t loadPlugIns(); - - status_t loadPlugIns(const String8& plugInDirPath); - - status_t unloadPlugIns(); - - status_t setDrmServiceListener( - int uniqueId, const sp<IDrmServiceListener>& drmServiceListener); - - status_t installDrmEngine(int uniqueId, const String8& drmEngineFile); - - DrmConstraints* getConstraints(int uniqueId, const String8* path, const int action); - - DrmMetadata* getMetadata(int uniqueId, const String8* path); - - bool canHandle(int uniqueId, const String8& path, const String8& mimeType); - - DrmInfoStatus* processDrmInfo(int uniqueId, const DrmInfo* drmInfo); - - DrmInfo* acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest); - - status_t saveRights(int uniqueId, const DrmRights& drmRights, - const String8& rightsPath, const String8& contentPath); - - String8 getOriginalMimeType(int uniqueId, const String8& path); - - int getDrmObjectType(int uniqueId, const String8& path, const String8& mimeType); - - int checkRightsStatus(int uniqueId, const String8& path, int action); - - status_t consumeRights(int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve); - - status_t setPlaybackStatus( - int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position); - - bool validateAction( - int uniqueId, const String8& path, int action, const ActionDescription& description); - - status_t removeRights(int uniqueId, const String8& path); - - status_t removeAllRights(int uniqueId); - - int openConvertSession(int uniqueId, const String8& mimeType); - - DrmConvertedStatus* convertData(int uniqueId, int convertId, const DrmBuffer* inputData); - - DrmConvertedStatus* closeConvertSession(int uniqueId, int convertId); - - status_t getAllSupportInfo(int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray); - - DecryptHandle* openDecryptSession( - int uniqueId, int fd, off64_t offset, off64_t length, const char* mime); - - DecryptHandle* openDecryptSession(int uniqueId, const char* uri, const char* mime); - - status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle); - - status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, - int decryptUnitId, const DrmBuffer* headerInfo); - - status_t decrypt(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, - const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV); - - status_t finalizeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId); - - ssize_t pread(int uniqueId, DecryptHandle* decryptHandle, - void* buffer, ssize_t numBytes, off64_t offset); - - void onInfo(const DrmInfoEvent& event); - -private: - String8 getSupportedPlugInId(int uniqueId, const String8& path, const String8& mimeType); - - String8 getSupportedPlugInId(const String8& mimeType); - - String8 getSupportedPlugInIdFromPath(int uniqueId, const String8& path); - - bool canHandle(int uniqueId, const String8& path); - -private: - Vector<int> mUniqueIdVector; - static const String8 EMPTY_STRING; - - int mDecryptSessionId; - int mConvertId; - Mutex mLock; - Mutex mListenerLock; - Mutex mDecryptLock; - Mutex mConvertLock; - TPlugInManager<IDrmEngine> mPlugInManager; - KeyedVector< DrmSupportInfo, String8 > mSupportInfoToPlugInIdMap; - KeyedVector< int, IDrmEngine*> mConvertSessionMap; - KeyedVector< int, sp<IDrmServiceListener> > mServiceListeners; - KeyedVector< int, IDrmEngine*> mDecryptSessionMap; -}; - -}; - -#endif /* __DRM_MANAGER_H__ */ - diff --git a/drm/libdrmframework/include/DrmManagerClientImpl.h b/drm/libdrmframework/include/DrmManagerClientImpl.h deleted file mode 100644 index 2aa493f..0000000 --- a/drm/libdrmframework/include/DrmManagerClientImpl.h +++ /dev/null @@ -1,432 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __DRM_MANAGER_CLIENT_IMPL_H__ -#define __DRM_MANAGER_CLIENT_IMPL_H__ - -#include <binder/IMemory.h> -#include <utils/threads.h> -#include <drm/DrmManagerClient.h> - -#include "IDrmManagerService.h" - -namespace android { - -class DrmInfoEvent; -/** - * This is implementation class for DrmManagerClient class. - * - * Only the JNI layer creates an instance of this class to delegate - * functionality to Native later. - * - */ -class DrmManagerClientImpl : public BnDrmServiceListener { -private: - DrmManagerClientImpl() { } - -public: - static DrmManagerClientImpl* create(int* pUniqueId, bool isNative); - - static void remove(int uniqueId); - - virtual ~DrmManagerClientImpl() { } - -public: - /** - * Adds the client respective to given unique id. - * - * @param[in] uniqueId Unique identifier for a session - */ - void addClient(int uniqueId); - - /** - * Removes the client respective to given unique id. - * - * @param[in] uniqueId Unique identifier for a session - */ - void removeClient(int uniqueId); - - /** - * Register a callback to be invoked when the caller required to - * receive necessary information - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] infoListener Listener - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - status_t setOnInfoListener( - int uniqueId, const sp<DrmManagerClient::OnInfoListener>& infoListener); - - /** - * Get constraint information associated with input content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] path Path of the protected content - * @param[in] action Actions defined such as, - * Action::DEFAULT, Action::PLAY, etc - * @return DrmConstraints - * key-value pairs of constraint are embedded in it - * @note - * In case of error, return NULL - */ - DrmConstraints* getConstraints(int uniqueId, const String8* path, const int action); - - /** - * Get metadata information associated with input content. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] path Path of the protected content - * @return DrmMetadata - * key-value pairs of metadata are embedded in it - * @note - * In case of error, return NULL - */ - DrmMetadata* getMetadata(int uniqueId, const String8* path); - - /** - * Check whether the given mimetype or path can be handled - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] path Path of the content needs to be handled - * @param[in] mimetype Mimetype of the content needs to be handled - * @return - * True if DrmManager can handle given path or mime type. - */ - bool canHandle(int uniqueId, const String8& path, const String8& mimeType); - - /** - * Executes given drm information based on its type - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] drmInfo Information needs to be processed - * @return DrmInfoStatus - * instance as a result of processing given input - */ - DrmInfoStatus* processDrmInfo(int uniqueId, const DrmInfo* drmInfo); - - /** - * Retrieves necessary information for registration, unregistration or rights - * acquisition information. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] drmInfoRequest Request information to retrieve drmInfo - * @return DrmInfo - * instance as a result of processing given input - */ - DrmInfo* acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest); - - /** - * Save DRM rights to specified rights path - * and make association with content path - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] drmRights DrmRights to be saved - * @param[in] rightsPath File path where rights to be saved - * @param[in] contentPath File path where content was saved - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - status_t saveRights(int uniqueId, const DrmRights& drmRights, - const String8& rightsPath, const String8& contentPath); - - /** - * Retrieves the mime type embedded inside the original content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] path the path of the protected content - * @return String8 - * Returns mime-type of the original content, such as "video/mpeg" - */ - String8 getOriginalMimeType(int uniqueId, const String8& path); - - /** - * Retrieves the type of the protected object (content, rights, etc..) - * using specified path or mimetype. At least one parameter should be non null - * to retrieve DRM object type - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] path Path of the content or null. - * @param[in] mimeType Mime type of the content or null. - * @return type of the DRM content, - * such as DrmObjectType::CONTENT, DrmObjectType::RIGHTS_OBJECT - */ - int getDrmObjectType(int uniqueId, const String8& path, const String8& mimeType); - - /** - * Check whether the given content has valid rights or not - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] path Path of the protected content - * @param[in] action Action to perform (Action::DEFAULT, Action::PLAY, etc) - * @return the status of the rights for the protected content, - * such as RightsStatus::RIGHTS_VALID, RightsStatus::RIGHTS_EXPIRED, etc. - */ - int checkRightsStatus(int uniqueId, const String8& path, int action); - - /** - * Consumes the rights for a content. - * If the reserve parameter is true the rights is reserved until the same - * application calls this api again with the reserve parameter set to false. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the decryption session - * @param[in] action Action to perform. (Action::DEFAULT, Action::PLAY, etc) - * @param[in] reserve True if the rights should be reserved. - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - status_t consumeRights(int uniqueId, sp<DecryptHandle> &decryptHandle, int action, bool reserve); - - /** - * Informs the DRM engine about the playback actions performed on the DRM files. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the decryption session - * @param[in] playbackStatus Playback action (Playback::START, Playback::STOP, Playback::PAUSE) - * @param[in] position Position in the file (in milliseconds) where the start occurs. - * Only valid together with Playback::START. - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - status_t setPlaybackStatus( - int uniqueId, sp<DecryptHandle> &decryptHandle, int playbackStatus, int64_t position); - - /** - * Validates whether an action on the DRM content is allowed or not. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] path Path of the protected content - * @param[in] action Action to validate (Action::PLAY, Action::TRANSFER, etc) - * @param[in] description Detailed description of the action - * @return true if the action is allowed. - */ - bool validateAction( - int uniqueId, const String8& path, int action, const ActionDescription& description); - - /** - * Removes the rights associated with the given protected content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] path Path of the protected content - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - status_t removeRights(int uniqueId, const String8& path); - - /** - * Removes all the rights information of each plug-in associated with - * DRM framework. Will be used in master reset - * - * @param[in] uniqueId Unique identifier for a session - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - status_t removeAllRights(int uniqueId); - - /** - * This API is for Forward Lock based DRM scheme. - * Each time the application tries to download a new DRM file - * which needs to be converted, then the application has to - * begin with calling this API. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] mimeType Description/MIME type of the input data packet - * @return Return handle for the convert session - */ - int openConvertSession(int uniqueId, const String8& mimeType); - - /** - * Accepts and converts the input data which is part of DRM file. - * The resultant converted data and the status is returned in the DrmConvertedInfo - * object. This method will be called each time there are new block - * of data received by the application. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] convertId Handle for the convert session - * @param[in] inputData Input Data which need to be converted - * @return Return object contains the status of the data conversion, - * the output converted data and offset. In this case the - * application will ignore the offset information. - */ - DrmConvertedStatus* convertData(int uniqueId, int convertId, const DrmBuffer* inputData); - - /** - * Informs the Drm Agent when there is no more data which need to be converted - * or when an error occurs. Upon successful conversion of the complete data, - * the agent will inform that where the header and body signature - * should be added. This signature appending is needed to integrity - * protect the converted file. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] convertId Handle for the convert session - * @return Return object contains the status of the data conversion, - * the header and body signature data. It also informs - * the application on which offset these signature data - * should be appended. - */ - DrmConvertedStatus* closeConvertSession(int uniqueId, int convertId); - - /** - * Retrieves all DrmSupportInfo instance that native DRM framework can handle. - * This interface is meant to be used by JNI layer - * - * @param[in] uniqueId Unique identifier for a session - * @param[out] length Number of elements in drmSupportInfoArray - * @param[out] drmSupportInfoArray Array contains all DrmSupportInfo - * that native DRM framework can handle - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - status_t getAllSupportInfo(int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray); - - /** - * Open the decrypt session to decrypt the given protected content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] fd File descriptor of the protected content to be decrypted - * @param[in] offset Start position of the content - * @param[in] length The length of the protected content - * @param[in] mime The mime type of the protected content if it is not NULL or empty - * @return - * Handle for the decryption session - */ - sp<DecryptHandle> openDecryptSession( - int uniqueId, int fd, off64_t offset, off64_t length, const char* mime); - - /** - * Open the decrypt session to decrypt the given protected content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] uri Path of the protected content to be decrypted - * @param[in] mime The mime type of the protected content if it is not NULL or empty - * @return - * Handle for the decryption session - */ - sp<DecryptHandle> openDecryptSession( - int uniqueId, const char* uri, const char* mime); - - /** - * Close the decrypt session for the given handle - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the decryption session - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - status_t closeDecryptSession(int uniqueId, sp<DecryptHandle> &decryptHandle); - - /** - * Initialize decryption for the given unit of the protected content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the decryption session - * @param[in] decryptUnitId ID which specifies decryption unit, such as track ID - * @param[in] headerInfo Information for initializing decryption of this decrypUnit - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - status_t initializeDecryptUnit(int uniqueId, sp<DecryptHandle> &decryptHandle, - int decryptUnitId, const DrmBuffer* headerInfo); - - /** - * Decrypt the protected content buffers for the given unit - * This method will be called any number of times, based on number of - * encrypted streams received from application. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the decryption session - * @param[in] decryptUnitId ID which specifies decryption unit, such as track ID - * @param[in] encBuffer Encrypted data block - * @param[out] decBuffer Decrypted data block - * @param[in] IV Optional buffer - * @return status_t - * Returns the error code for this API - * DRM_NO_ERROR for success, and one of DRM_ERROR_UNKNOWN, DRM_ERROR_LICENSE_EXPIRED - * DRM_ERROR_SESSION_NOT_OPENED, DRM_ERROR_DECRYPT_UNIT_NOT_INITIALIZED, - * DRM_ERROR_DECRYPT for failure. - */ - status_t decrypt(int uniqueId, sp<DecryptHandle> &decryptHandle, int decryptUnitId, - const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV); - - /** - * Finalize decryption for the given unit of the protected content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the decryption session - * @param[in] decryptUnitId ID which specifies decryption unit, such as track ID - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - status_t finalizeDecryptUnit(int uniqueId, sp<DecryptHandle> &decryptHandle, int decryptUnitId); - - /** - * Reads the specified number of bytes from an open DRM file. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the decryption session - * @param[out] buffer Reference to the buffer that should receive the read data. - * @param[in] numBytes Number of bytes to read. - * @param[in] offset Offset with which to update the file position. - * - * @return Number of bytes read. Returns -1 for Failure. - */ - ssize_t pread(int uniqueId, sp<DecryptHandle> &decryptHandle, - void* buffer, ssize_t numBytes, off64_t offset); - - /** - * Notify the event to the registered listener - * - * @param[in] event The event to be notified - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - status_t notify(const DrmInfoEvent& event); - -private: - /** - * Install new DRM Engine Plug-in at the runtime - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] drmEngine Shared Object(so) File in which DRM Engine defined - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - status_t installDrmEngine(int uniqueId, const String8& drmEngineFile); - -private: - Mutex mLock; - sp<DrmManagerClient::OnInfoListener> mOnInfoListener; - - class DeathNotifier: public IBinder::DeathRecipient { - public: - DeathNotifier() {} - virtual ~DeathNotifier(); - virtual void binderDied(const wp<IBinder>& who); - }; - -private: - static Mutex sMutex; - static sp<DeathNotifier> sDeathNotifier; - static sp<IDrmManagerService> sDrmManagerService; - static const sp<IDrmManagerService>& getDrmManagerService(); - static const String8 EMPTY_STRING; -}; - -}; - -#endif /* __DRM_MANAGER_CLIENT_IMPL_H__ */ - diff --git a/drm/libdrmframework/include/DrmManagerService.h b/drm/libdrmframework/include/DrmManagerService.h deleted file mode 100644 index 1a8c2ae..0000000 --- a/drm/libdrmframework/include/DrmManagerService.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __DRM_MANAGER_SERVICE_H__ -#define __DRM_MANAGER_SERVICE_H__ - -#include <utils/RefBase.h> -#include <utils/KeyedVector.h> -#include <binder/IInterface.h> -#include <binder/Parcel.h> -#include "IDrmManagerService.h" -#include "IDrmServiceListener.h" - -namespace android { - -class DrmManager; -class String8; -class Mutex; - -/** - * This is the implementation class for DRM manager service. This delegates - * the responsibility to DrmManager. - * - * The instance of this class is created while starting the DRM manager service. - * - */ -class DrmManagerService : public BnDrmManagerService { -public: - static void instantiate(); - -private: - DrmManagerService(); - virtual ~DrmManagerService(); - -public: - int addUniqueId(bool isNative); - - void removeUniqueId(int uniqueId); - - void addClient(int uniqueId); - - void removeClient(int uniqueId); - - status_t setDrmServiceListener( - int uniqueId, const sp<IDrmServiceListener>& drmServiceListener); - - status_t installDrmEngine(int uniqueId, const String8& drmEngineFile); - - DrmConstraints* getConstraints(int uniqueId, const String8* path, const int action); - - DrmMetadata* getMetadata(int uniqueId, const String8* path); - - bool canHandle(int uniqueId, const String8& path, const String8& mimeType); - - DrmInfoStatus* processDrmInfo(int uniqueId, const DrmInfo* drmInfo); - - DrmInfo* acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest); - - status_t saveRights(int uniqueId, const DrmRights& drmRights, - const String8& rightsPath, const String8& contentPath); - - String8 getOriginalMimeType(int uniqueId, const String8& path); - - int getDrmObjectType(int uniqueId, const String8& path, const String8& mimeType); - - int checkRightsStatus(int uniqueId, const String8& path,int action); - - status_t consumeRights(int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve); - - status_t setPlaybackStatus( - int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position); - - bool validateAction(int uniqueId, const String8& path, - int action, const ActionDescription& description); - - status_t removeRights(int uniqueId, const String8& path); - - status_t removeAllRights(int uniqueId); - - int openConvertSession(int uniqueId, const String8& mimeType); - - DrmConvertedStatus* convertData(int uniqueId, int convertId, const DrmBuffer* inputData); - - DrmConvertedStatus* closeConvertSession(int uniqueId, int convertId); - - status_t getAllSupportInfo(int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray); - - DecryptHandle* openDecryptSession( - int uniqueId, int fd, off64_t offset, off64_t length, const char *mime); - - DecryptHandle* openDecryptSession( - int uniqueId, const char* uri, const char* mime); - - status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle); - - status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, - int decryptUnitId, const DrmBuffer* headerInfo); - - status_t decrypt(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, - const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV); - - status_t finalizeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId); - - ssize_t pread(int uniqueId, DecryptHandle* decryptHandle, - void* buffer, ssize_t numBytes, off64_t offset); - - virtual status_t dump(int fd, const Vector<String16>& args); - -private: - DrmManager* mDrmManager; -}; - -}; - -#endif /* __DRM_MANAGER_SERVICE_H__ */ - diff --git a/drm/libdrmframework/include/IDrmManagerService.h b/drm/libdrmframework/include/IDrmManagerService.h deleted file mode 100644 index a7d21c5..0000000 --- a/drm/libdrmframework/include/IDrmManagerService.h +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __IDRM_MANAGER_SERVICE_H__ -#define __IDRM_MANAGER_SERVICE_H__ - -#include <utils/RefBase.h> -#include <binder/IInterface.h> -#include <binder/Parcel.h> -#include <drm/drm_framework_common.h> -#include "IDrmServiceListener.h" - -namespace android { - -class DrmConstraints; -class DrmMetadata; -class DrmRights; -class DrmInfo; -class DrmInfoStatus; -class DrmInfoRequest; -class DrmSupportInfo; -class DrmConvertedStatus; -class String8; -class ActionDescription; - -/** - * This is the interface class for DRM Manager service. - * - */ -class IDrmManagerService : public IInterface -{ -public: - enum { - ADD_UNIQUEID = IBinder::FIRST_CALL_TRANSACTION, - REMOVE_UNIQUEID, - ADD_CLIENT, - REMOVE_CLIENT, - SET_DRM_SERVICE_LISTENER, - INSTALL_DRM_ENGINE, - GET_CONSTRAINTS_FROM_CONTENT, - GET_METADATA_FROM_CONTENT, - CAN_HANDLE, - PROCESS_DRM_INFO, - ACQUIRE_DRM_INFO, - SAVE_RIGHTS, - GET_ORIGINAL_MIMETYPE, - GET_DRM_OBJECT_TYPE, - CHECK_RIGHTS_STATUS, - CONSUME_RIGHTS, - SET_PLAYBACK_STATUS, - VALIDATE_ACTION, - REMOVE_RIGHTS, - REMOVE_ALL_RIGHTS, - OPEN_CONVERT_SESSION, - CONVERT_DATA, - CLOSE_CONVERT_SESSION, - GET_ALL_SUPPORT_INFO, - OPEN_DECRYPT_SESSION, - OPEN_DECRYPT_SESSION_FROM_URI, - CLOSE_DECRYPT_SESSION, - INITIALIZE_DECRYPT_UNIT, - DECRYPT, - FINALIZE_DECRYPT_UNIT, - PREAD - }; - -public: - DECLARE_META_INTERFACE(DrmManagerService); - -public: - virtual int addUniqueId(bool isNative) = 0; - - virtual void removeUniqueId(int uniqueId) = 0; - - virtual void addClient(int uniqueId) = 0; - - virtual void removeClient(int uniqueId) = 0; - - virtual status_t setDrmServiceListener( - int uniqueId, const sp<IDrmServiceListener>& infoListener) = 0; - - virtual status_t installDrmEngine(int uniqueId, const String8& drmEngineFile) = 0; - - virtual DrmConstraints* getConstraints( - int uniqueId, const String8* path, const int action) = 0; - - virtual DrmMetadata* getMetadata(int uniqueId, const String8* path) = 0; - - virtual bool canHandle(int uniqueId, const String8& path, const String8& mimeType) = 0; - - virtual DrmInfoStatus* processDrmInfo(int uniqueId, const DrmInfo* drmInfo) = 0; - - virtual DrmInfo* acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest) = 0; - - virtual status_t saveRights(int uniqueId, const DrmRights& drmRights, - const String8& rightsPath, const String8& contentPath) = 0; - - virtual String8 getOriginalMimeType(int uniqueId, const String8& path) = 0; - - virtual int getDrmObjectType( - int uniqueId, const String8& path, const String8& mimeType) = 0; - - virtual int checkRightsStatus(int uniqueId, const String8& path, int action) = 0; - - virtual status_t consumeRights( - int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) = 0; - - virtual status_t setPlaybackStatus( - int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) = 0; - - virtual bool validateAction( - int uniqueId, const String8& path, - int action, const ActionDescription& description) = 0; - - virtual status_t removeRights(int uniqueId, const String8& path) = 0; - - virtual status_t removeAllRights(int uniqueId) = 0; - - virtual int openConvertSession(int uniqueId, const String8& mimeType) = 0; - - virtual DrmConvertedStatus* convertData( - int uniqueId, int convertId, const DrmBuffer* inputData) = 0; - - virtual DrmConvertedStatus* closeConvertSession(int uniqueId, int convertId) = 0; - - virtual status_t getAllSupportInfo( - int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) = 0; - - virtual DecryptHandle* openDecryptSession( - int uniqueId, int fd, off64_t offset, - off64_t length, const char* mime) = 0; - - virtual DecryptHandle* openDecryptSession( - int uniqueId, const char* uri, const char* mime) = 0; - - virtual status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) = 0; - - virtual status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, - int decryptUnitId, const DrmBuffer* headerInfo) = 0; - - virtual status_t decrypt(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, - const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) = 0; - - virtual status_t finalizeDecryptUnit( - int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) = 0; - - virtual ssize_t pread(int uniqueId, DecryptHandle* decryptHandle, - void* buffer, ssize_t numBytes,off64_t offset) = 0; -}; - -/** - * This is the Binder implementation class for DRM Manager service. - */ -class BpDrmManagerService: public BpInterface<IDrmManagerService> -{ -public: - BpDrmManagerService(const sp<IBinder>& impl) - : BpInterface<IDrmManagerService>(impl) {} - - virtual int addUniqueId(bool isNative); - - virtual void removeUniqueId(int uniqueId); - - virtual void addClient(int uniqueId); - - virtual void removeClient(int uniqueId); - - virtual status_t setDrmServiceListener( - int uniqueId, const sp<IDrmServiceListener>& infoListener); - - virtual status_t installDrmEngine(int uniqueId, const String8& drmEngineFile); - - virtual DrmConstraints* getConstraints(int uniqueId, const String8* path, const int action); - - virtual DrmMetadata* getMetadata(int uniqueId, const String8* path); - - virtual bool canHandle(int uniqueId, const String8& path, const String8& mimeType); - - virtual DrmInfoStatus* processDrmInfo(int uniqueId, const DrmInfo* drmInfo); - - virtual DrmInfo* acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest); - - virtual status_t saveRights(int uniqueId, const DrmRights& drmRights, - const String8& rightsPath, const String8& contentPath); - - virtual String8 getOriginalMimeType(int uniqueId, const String8& path); - - virtual int getDrmObjectType(int uniqueId, const String8& path, const String8& mimeType); - - virtual int checkRightsStatus(int uniqueId, const String8& path, int action); - - virtual status_t consumeRights( - int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve); - - virtual status_t setPlaybackStatus( - int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position); - - virtual bool validateAction( - int uniqueId, const String8& path, int action, const ActionDescription& description); - - virtual status_t removeRights(int uniqueId, const String8& path); - - virtual status_t removeAllRights(int uniqueId); - - virtual int openConvertSession(int uniqueId, const String8& mimeType); - - virtual DrmConvertedStatus* convertData( - int uniqueId, int convertId, const DrmBuffer* inputData); - - virtual DrmConvertedStatus* closeConvertSession(int uniqueId, int convertId); - - virtual status_t getAllSupportInfo( - int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray); - - virtual DecryptHandle* openDecryptSession( - int uniqueId, int fd, off64_t offset, off64_t length, - const char* mime); - - virtual DecryptHandle* openDecryptSession( - int uniqueId, const char* uri, const char* mime); - - virtual status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle); - - virtual status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, - int decryptUnitId, const DrmBuffer* headerInfo); - - virtual status_t decrypt(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, - const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV); - - virtual status_t finalizeDecryptUnit( - int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId); - - virtual ssize_t pread(int uniqueId, DecryptHandle* decryptHandle, - void* buffer, ssize_t numBytes, off64_t offset); -}; - -/** - * This is the Binder implementation class for DRM Manager service. - */ -class BnDrmManagerService: public BnInterface<IDrmManagerService> -{ -public: - virtual status_t onTransact( - uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0); -}; - -}; - -#endif /* __IDRM_MANAGER_SERVICE_H__ */ - diff --git a/drm/libdrmframework/include/IDrmServiceListener.h b/drm/libdrmframework/include/IDrmServiceListener.h deleted file mode 100644 index 7f7109f..0000000 --- a/drm/libdrmframework/include/IDrmServiceListener.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __IDRM_SERVICE_LISTENER_H__ -#define __IDRM_SERVICE_LISTENER_H__ - -#include <utils/RefBase.h> -#include <binder/IInterface.h> -#include <binder/Parcel.h> - -namespace android { - -class DrmInfoEvent; - -/** - * This is the interface class for DRM service listener. - * - */ -class IDrmServiceListener : public IInterface -{ -public: - enum { - NOTIFY = IBinder::FIRST_CALL_TRANSACTION, - }; - -public: - DECLARE_META_INTERFACE(DrmServiceListener); - -public: - virtual status_t notify(const DrmInfoEvent& event) = 0; -}; - -/** - * This is the Binder implementation class for DRM service listener. - */ -class BpDrmServiceListener: public BpInterface<IDrmServiceListener> -{ -public: - BpDrmServiceListener(const sp<IBinder>& impl) - : BpInterface<IDrmServiceListener>(impl) {} - - virtual status_t notify(const DrmInfoEvent& event); -}; - -/** - * This is the Binder implementation class for DRM service listener. - */ -class BnDrmServiceListener: public BnInterface<IDrmServiceListener> -{ -public: - virtual status_t onTransact( - uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0); -}; - -}; - -#endif /* __IDRM_SERVICE_LISTENER_H__ */ - diff --git a/drm/libdrmframework/include/PlugInManager.h b/drm/libdrmframework/include/PlugInManager.h deleted file mode 100644 index 7bb143f..0000000 --- a/drm/libdrmframework/include/PlugInManager.h +++ /dev/null @@ -1,269 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __PLUGIN_MANAGER_H__ -#define __PLUGIN_MANAGER_H__ - -#include <dlfcn.h> -#include <sys/types.h> -#include <dirent.h> - -#include <utils/String8.h> -#include <utils/Vector.h> -#include <utils/KeyedVector.h> - -namespace android { - -const char* const PLUGIN_MANAGER_CREATE = "create"; -const char* const PLUGIN_MANAGER_DESTROY = "destroy"; -const char* const PLUGIN_EXTENSION = ".so"; - -/** - * This is the template class for Plugin manager. - * - * The DrmManager uses this class to handle the plugins. - * - */ -template<typename Type> -class TPlugInManager { -private: - typedef void* HANDLE; - typedef Type* create_t(void); - typedef void destroy_t(Type*); - typedef create_t* FPCREATE; - typedef destroy_t* FPDESTORY; - - typedef struct _PlugInContainer { - String8 sPath; - HANDLE hHandle; - FPCREATE fpCreate; - FPDESTORY fpDestory; - Type* pInstance; - - _PlugInContainer(): - sPath("") - ,hHandle(NULL) - ,fpCreate(NULL) - ,fpDestory(NULL) - ,pInstance(NULL) - {} - } PlugInContainer; - - typedef KeyedVector<String8, PlugInContainer*> PlugInMap; - PlugInMap m_plugInMap; - - typedef Vector<String8> PlugInIdList; - PlugInIdList m_plugInIdList; - -public: - /** - * Load all the plug-ins in the specified directory - * - * @param[in] rsPlugInDirPath - * Directory path which plug-ins (dynamic library) are stored - * @note Plug-ins should be implemented according to the specification - */ - void loadPlugIns(const String8& rsPlugInDirPath) { - Vector<String8> plugInFileList = getPlugInPathList(rsPlugInDirPath); - - if (!plugInFileList.isEmpty()) { - for (unsigned int i = 0; i < plugInFileList.size(); ++i) { - loadPlugIn(plugInFileList[i]); - } - } - } - - /** - * Unload all the plug-ins - * - */ - void unloadPlugIns() { - for (unsigned int i = 0; i < m_plugInIdList.size(); ++i) { - unloadPlugIn(m_plugInIdList[i]); - } - m_plugInIdList.clear(); - } - - /** - * Get all the IDs of available plug-ins - * - * @return[in] plugInIdList - * String type Vector in which all plug-in IDs are stored - */ - Vector<String8> getPlugInIdList() const { - return m_plugInIdList; - } - - /** - * Get a plug-in reference of specified ID - * - * @param[in] rsPlugInId - * Plug-in ID to be used - * @return plugIn - * Reference of specified plug-in instance - */ - Type& getPlugIn(const String8& rsPlugInId) { - if (!contains(rsPlugInId)) { - // This error case never happens - } - return *(m_plugInMap.valueFor(rsPlugInId)->pInstance); - } - -public: - /** - * Load a plug-in stored in the specified path - * - * @param[in] rsPlugInPath - * Plug-in (dynamic library) file path - * @note Plug-in should be implemented according to the specification - */ - void loadPlugIn(const String8& rsPlugInPath) { - if (contains(rsPlugInPath)) { - return; - } - - PlugInContainer* pPlugInContainer = new PlugInContainer(); - - pPlugInContainer->hHandle = dlopen(rsPlugInPath.string(), RTLD_LAZY); - - if (NULL == pPlugInContainer->hHandle) { - delete pPlugInContainer; - pPlugInContainer = NULL; - return; - } - - pPlugInContainer->sPath = rsPlugInPath; - pPlugInContainer->fpCreate - = (FPCREATE)dlsym(pPlugInContainer->hHandle, PLUGIN_MANAGER_CREATE); - pPlugInContainer->fpDestory - = (FPDESTORY)dlsym(pPlugInContainer->hHandle, PLUGIN_MANAGER_DESTROY); - - if (NULL != pPlugInContainer->fpCreate && NULL != pPlugInContainer->fpDestory) { - pPlugInContainer->pInstance = (Type*)pPlugInContainer->fpCreate(); - m_plugInIdList.add(rsPlugInPath); - m_plugInMap.add(rsPlugInPath, pPlugInContainer); - } else { - dlclose(pPlugInContainer->hHandle); - delete pPlugInContainer; - pPlugInContainer = NULL; - return; - } - } - - /** - * Unload a plug-in stored in the specified path - * - * @param[in] rsPlugInPath - * Plug-in (dynamic library) file path - */ - void unloadPlugIn(const String8& rsPlugInPath) { - if (!contains(rsPlugInPath)) { - return; - } - - PlugInContainer* pPlugInContainer = m_plugInMap.valueFor(rsPlugInPath); - pPlugInContainer->fpDestory(pPlugInContainer->pInstance); - dlclose(pPlugInContainer->hHandle); - - m_plugInMap.removeItem(rsPlugInPath); - delete pPlugInContainer; - pPlugInContainer = NULL; - } - -private: - /** - * True if TPlugInManager contains rsPlugInId - */ - bool contains(const String8& rsPlugInId) { - return m_plugInMap.indexOfKey(rsPlugInId) != NAME_NOT_FOUND; - } - - /** - * Return file path list of plug-ins stored in the specified directory - * - * @param[in] rsDirPath - * Directory path in which plug-ins are stored - * @return plugInFileList - * String type Vector in which file path of plug-ins are stored - */ - Vector<String8> getPlugInPathList(const String8& rsDirPath) { - Vector<String8> fileList; - DIR* pDir = opendir(rsDirPath.string()); - struct dirent* pEntry; - - while (NULL != pDir && NULL != (pEntry = readdir(pDir))) { - if (!isPlugIn(pEntry)) { - continue; - } - String8 plugInPath; - plugInPath += rsDirPath; - plugInPath += "/"; - plugInPath += pEntry->d_name; - - fileList.add(plugInPath); - } - - if (NULL != pDir) { - closedir(pDir); - } - - return fileList; - } - - /** - * True if the input name denotes plug-in - */ - bool isPlugIn(const struct dirent* pEntry) const { - String8 sName(pEntry->d_name); - String8 extension(sName.getPathExtension()); - // Note that the plug-in extension must exactly match case - return extension == String8(PLUGIN_EXTENSION); - } - - /** - * True if the input entry is "." or ".." - */ - bool isDotOrDDot(const struct dirent* pEntry) const { - String8 sName(pEntry->d_name); - return "." == sName || ".." == sName; - } - - /** - * True if input entry is directory - */ - bool isDirectory(const struct dirent* pEntry) const { - return DT_DIR == pEntry->d_type; - } - - /** - * True if input entry is regular file - */ - bool isRegularFile(const struct dirent* pEntry) const { - return DT_REG == pEntry->d_type; - } - - /** - * True if input entry is link - */ - bool isLink(const struct dirent* pEntry) const { - return DT_LNK == pEntry->d_type; - } -}; - -}; - -#endif /* __PLUGIN_MANAGER_H__ */ - diff --git a/drm/libdrmframework/include/ReadWriteUtils.h b/drm/libdrmframework/include/ReadWriteUtils.h deleted file mode 100644 index 529b342..0000000 --- a/drm/libdrmframework/include/ReadWriteUtils.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __READ_WRITE_UTILS_H__ -#define __READ_WRITE_UTILS_H__ - -#include <utils/FileMap.h> -#include <drm/drm_framework_common.h> - -namespace android { - -/** - * This is an utility class which performs IO operations. - * - */ -class ReadWriteUtils { -public: - /** - * Constructor for ReadWriteUtils - */ - ReadWriteUtils() {} - - /** - * Destructor for ReadWriteUtils - */ - virtual ~ReadWriteUtils(); - -public: - /** - * Reads the data from the file path provided - * - * @param[in] filePath Path of the file - * @return Data read from the file - */ - static String8 readBytes(const String8& filePath); - /** - * Reads the data into the given buffer from the file path provided - * - * @param[in] filePath Path of the file - * @param[out] buffer Data read from the file - * @return Length of the data read from the file - */ - static int readBytes(const String8& filePath, char** buffer); - /** - * Writes the data into the file path provided - * - * @param[in] filePath Path of the file - * @param[in] dataBuffer Data to write - */ - static void writeToFile(const String8& filePath, const String8& data); - /** - * Appends the data into the file path provided - * - * @param[in] filePath Path of the file - * @param[in] dataBuffer Data to append - */ - static void appendToFile(const String8& filePath, const String8& data); - -private: - FileMap* mFileMap; -}; - -}; - -#endif /* __READ_WRITE_UTILS_H__ */ - diff --git a/drm/libdrmframework/plugins/Android.mk b/drm/libdrmframework/plugins/Android.mk deleted file mode 100644 index 9ee7961..0000000 --- a/drm/libdrmframework/plugins/Android.mk +++ /dev/null @@ -1,16 +0,0 @@ -# -# Copyright (C) 2010 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -include $(call all-subdir-makefiles) diff --git a/drm/libdrmframework/plugins/common/Android.mk b/drm/libdrmframework/plugins/common/Android.mk deleted file mode 100644 index 9ee7961..0000000 --- a/drm/libdrmframework/plugins/common/Android.mk +++ /dev/null @@ -1,16 +0,0 @@ -# -# Copyright (C) 2010 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -include $(call all-subdir-makefiles) diff --git a/drm/libdrmframework/plugins/common/include/DrmEngineBase.h b/drm/libdrmframework/plugins/common/include/DrmEngineBase.h deleted file mode 100644 index 08f6e6d..0000000 --- a/drm/libdrmframework/plugins/common/include/DrmEngineBase.h +++ /dev/null @@ -1,508 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __DRM_ENGINE_BASE_H__ -#define __DRM_ENGINE_BASE_H__ - -#include <drm/drm_framework_common.h> -#include "IDrmEngine.h" - -namespace android { - -/** - * This class is an interface for plug-in developers - * - * Responsibility of this class is control the sequence of actual plug-in. - * All each plug-in developer has to do is implement onXXX() type virtual interfaces. - */ -class DrmEngineBase : public IDrmEngine { -public: - DrmEngineBase(); - virtual ~DrmEngineBase(); - -public: - DrmConstraints* getConstraints(int uniqueId, const String8* path, int action); - - DrmMetadata* getMetadata(int uniqueId, const String8* path); - - status_t initialize(int uniqueId); - - status_t setOnInfoListener(int uniqueId, const IDrmEngine::OnInfoListener* infoListener); - - status_t terminate(int uniqueId); - - bool canHandle(int uniqueId, const String8& path); - - DrmInfoStatus* processDrmInfo(int uniqueId, const DrmInfo* drmInfo); - - status_t saveRights(int uniqueId, const DrmRights& drmRights, - const String8& rightsPath, const String8& contentPath); - - DrmInfo* acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest); - - String8 getOriginalMimeType(int uniqueId, const String8& path); - - int getDrmObjectType(int uniqueId, const String8& path, const String8& mimeType); - - int checkRightsStatus(int uniqueId, const String8& path, int action); - - status_t consumeRights(int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve); - - status_t setPlaybackStatus( - int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position); - - bool validateAction( - int uniqueId, const String8& path, int action, const ActionDescription& description); - - status_t removeRights(int uniqueId, const String8& path); - - status_t removeAllRights(int uniqueId); - - status_t openConvertSession(int uniqueId, int convertId); - - DrmConvertedStatus* convertData(int uniqueId, int convertId, const DrmBuffer* inputData); - - DrmConvertedStatus* closeConvertSession(int uniqueId, int convertId); - - DrmSupportInfo* getSupportInfo(int uniqueId); - - status_t openDecryptSession( - int uniqueId, DecryptHandle* decryptHandle, - int fd, off64_t offset, off64_t length, const char* mime); - - status_t openDecryptSession( - int uniqueId, DecryptHandle* decryptHandle, - const char* uri, const char* mime); - - status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle); - - status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, - int decryptUnitId, const DrmBuffer* headerInfo); - - status_t decrypt(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, - const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV); - - status_t finalizeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId); - - ssize_t pread(int uniqueId, DecryptHandle* decryptHandle, - void* buffer, ssize_t numBytes, off64_t offset); - -protected: - ///////////////////////////////////////////////////// - // Interface for plug-in developers // - // each plug-in has to implement following method // - ///////////////////////////////////////////////////// - /** - * Get constraint information associated with input content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] path Path of the protected content - * @param[in] action Actions defined such as, - * Action::DEFAULT, Action::PLAY, etc - * @return DrmConstraints - * key-value pairs of constraint are embedded in it - * @note - * In case of error, return NULL - */ - virtual DrmConstraints* onGetConstraints( - int uniqueId, const String8* path, int action) = 0; - - /** - * Get metadata information associated with input content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] path Path of the protected content - * @return DrmMetadata - * key-value pairs of metadata - * @note - * In case of error, return NULL - */ - virtual DrmMetadata* onGetMetadata(int uniqueId, const String8* path) = 0; - - /** - * Initialize plug-in - * - * @param[in] uniqueId Unique identifier for a session - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - virtual status_t onInitialize(int uniqueId) = 0; - - /** - * Register a callback to be invoked when the caller required to - * receive necessary information - * - * @param[in] uniqueId Unique identifier for a session. uniqueId is a random - * number generated in the DRM service. If the DrmManagerClient - * is created in native code, uniqueId will be a number ranged - * from 0x1000 to 0x1fff. If it comes from Java code, the uniqueId - * will be a number ranged from 0x00 to 0xfff. So bit 0x1000 in - * uniqueId could be used in DRM plugins to differentiate native - * OnInfoListener and Java OnInfoListener. - * @param[in] infoListener Listener - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - virtual status_t onSetOnInfoListener( - int uniqueId, const IDrmEngine::OnInfoListener* infoListener) = 0; - - /** - * Terminate the plug-in - * and release resource bound to plug-in - * - * @param[in] uniqueId Unique identifier for a session - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - virtual status_t onTerminate(int uniqueId) = 0; - - /** - * Get whether the given content can be handled by this plugin or not - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] path Path the protected object - * @return bool - * Returns true if this plugin can handle , false in case of not able to handle - */ - virtual bool onCanHandle(int uniqueId, const String8& path) = 0; - - /** - * Executes given drm information based on its type - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] drmInfo Information needs to be processed - * @return DrmInfoStatus - * instance as a result of processing given input - */ - virtual DrmInfoStatus* onProcessDrmInfo(int uniqueId, const DrmInfo* drmInfo) = 0; - - /** - * Save DRM rights to specified rights path - * and make association with content path - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] drmRights DrmRights to be saved - * @param[in] rightsPath File path where rights to be saved - * @param[in] contentPath File path where content was saved - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - virtual status_t onSaveRights(int uniqueId, const DrmRights& drmRights, - const String8& rightspath, const String8& contentPath) = 0; - - /** - * Retrieves necessary information for registration, unregistration or rights - * acquisition information. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] drmInfoRequest Request information to retrieve drmInfo - * @return DrmInfo - * instance as a result of processing given input - */ - virtual DrmInfo* onAcquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest) = 0; - - /** - * Retrieves the mime type embedded inside the original content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] path Path of the protected content - * @return String8 - * Returns mime-type of the original content, such as "video/mpeg" - */ - virtual String8 onGetOriginalMimeType(int uniqueId, const String8& path) = 0; - - /** - * Retrieves the type of the protected object (content, rights, etc..) - * using specified path or mimetype. At least one parameter should be non null - * to retrieve DRM object type - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] path Path of the content or null. - * @param[in] mimeType Mime type of the content or null. - * @return type of the DRM content, - * such as DrmObjectType::CONTENT, DrmObjectType::RIGHTS_OBJECT - */ - virtual int onGetDrmObjectType( - int uniqueId, const String8& path, const String8& mimeType) = 0; - - /** - * Check whether the given content has valid rights or not - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] path Path of the protected content - * @param[in] action Action to perform (Action::DEFAULT, Action::PLAY, etc) - * @return the status of the rights for the protected content, - * such as RightsStatus::RIGHTS_VALID, RightsStatus::RIGHTS_EXPIRED, etc. - */ - virtual int onCheckRightsStatus(int uniqueId, const String8& path, int action) = 0; - - /** - * Consumes the rights for a content. - * If the reserve parameter is true the rights is reserved until the same - * application calls this api again with the reserve parameter set to false. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the decryption session - * @param[in] action Action to perform. (Action::DEFAULT, Action::PLAY, etc) - * @param[in] reserve True if the rights should be reserved. - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - virtual status_t onConsumeRights(int uniqueId, DecryptHandle* decryptHandle, - int action, bool reserve) = 0; - - /** - * Informs the DRM Engine about the playback actions performed on the DRM files. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the decryption session - * @param[in] playbackStatus Playback action (Playback::START, Playback::STOP, Playback::PAUSE) - * @param[in] position Position in the file (in milliseconds) where the start occurs. - * Only valid together with Playback::START. - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - virtual status_t onSetPlaybackStatus( - int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) = 0; - - /** - * Validates whether an action on the DRM content is allowed or not. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] path Path of the protected content - * @param[in] action Action to validate (Action::PLAY, Action::TRANSFER, etc) - * @param[in] description Detailed description of the action - * @return true if the action is allowed. - */ - virtual bool onValidateAction(int uniqueId, const String8& path, - int action, const ActionDescription& description) = 0; - - /** - * Removes the rights associated with the given protected content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] path Path of the protected content - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - virtual status_t onRemoveRights(int uniqueId, const String8& path) = 0; - - /** - * Removes all the rights information of each plug-in associated with - * DRM framework. Will be used in master reset - * - * @param[in] uniqueId Unique identifier for a session - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - virtual status_t onRemoveAllRights(int uniqueId) = 0; - - /** - * This API is for Forward Lock based DRM scheme. - * Each time the application tries to download a new DRM file - * which needs to be converted, then the application has to - * begin with calling this API. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] convertId Handle for the convert session - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - virtual status_t onOpenConvertSession(int uniqueId, int convertId) = 0; - - /** - * Accepts and converts the input data which is part of DRM file. - * The resultant converted data and the status is returned in the DrmConvertedInfo - * object. This method will be called each time there are new block - * of data received by the application. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] convertId Handle for the convert session - * @param[in] inputData Input Data which need to be converted - * @return Return object contains the status of the data conversion, - * the output converted data and offset. In this case the - * application will ignore the offset information. - */ - virtual DrmConvertedStatus* onConvertData( - int uniqueId, int convertId, const DrmBuffer* inputData) = 0; - - /** - * Informs the Drm Agent when there is no more data which need to be converted - * or when an error occurs. Upon successful conversion of the complete data, - * the agent will inform that where the header and body signature - * should be added. This signature appending is needed to integrity - * protect the converted file. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] convertId Handle for the convert session - * @return Return object contains the status of the data conversion, - * the header and body signature data. It also informs - * the application on which offset these signature data - * should be appended. - */ - virtual DrmConvertedStatus* onCloseConvertSession(int uniqueId, int convertId) = 0; - - /** - * Returns the information about the Drm Engine capabilities which includes - * supported MimeTypes and file suffixes. - * - * @param[in] uniqueId Unique identifier for a session - * @return DrmSupportInfo - * instance which holds the capabilities of a plug-in - */ - virtual DrmSupportInfo* onGetSupportInfo(int uniqueId) = 0; - - /** - * Open the decrypt session to decrypt the given protected content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the current decryption session - * @param[in] fd File descriptor of the protected content to be decrypted - * @param[in] offset Start position of the content - * @param[in] length The length of the protected content - * @return - * DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success - */ - virtual status_t onOpenDecryptSession( - int uniqueId, DecryptHandle* decryptHandle, - int fd, off64_t offset, off64_t length) = 0; - - /** - * Open the decrypt session to decrypt the given protected content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the current decryption session - * @param[in] fd File descriptor of the protected content to be decrypted - * @param[in] offset Start position of the content - * @param[in] length The length of the protected content - * @param[in] mime Mime type of the protected content - * drm plugin may do some optimization since the mime type is known. - * @return - * DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success - */ - virtual status_t onOpenDecryptSession( - int uniqueId, DecryptHandle* decryptHandle, - int fd, off64_t offset, off64_t length, - const char* mime) { - - return DRM_ERROR_CANNOT_HANDLE; - } - - /** - * Open the decrypt session to decrypt the given protected content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the current decryption session - * @param[in] uri Path of the protected content to be decrypted - * @return - * DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success - */ - virtual status_t onOpenDecryptSession( - int uniqueId, DecryptHandle* decryptHandle, - const char* uri) = 0; - - /** - * Open the decrypt session to decrypt the given protected content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the current decryption session - * @param[in] uri Path of the protected content to be decrypted - * @param[in] mime Mime type of the protected content. The corresponding - * drm plugin may do some optimization since the mime type is known. - * @return - * DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success - */ - virtual status_t onOpenDecryptSession( - int uniqueId, DecryptHandle* decryptHandle, - const char* uri, const char* mime) { - - return DRM_ERROR_CANNOT_HANDLE; - } - - /** - * Close the decrypt session for the given handle - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the decryption session - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - virtual status_t onCloseDecryptSession(int uniqueId, DecryptHandle* decryptHandle) = 0; - - /** - * Initialize decryption for the given unit of the protected content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptId Handle for the decryption session - * @param[in] decryptUnitId ID Specifies decryption unit, such as track ID - * @param[in] headerInfo Information for initializing decryption of this decrypUnit - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - virtual status_t onInitializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, - int decryptUnitId, const DrmBuffer* headerInfo) = 0; - - /** - * Decrypt the protected content buffers for the given unit - * This method will be called any number of times, based on number of - * encrypted streams received from application. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptId Handle for the decryption session - * @param[in] decryptUnitId ID Specifies decryption unit, such as track ID - * @param[in] encBuffer Encrypted data block - * @param[out] decBuffer Decrypted data block - * @param[in] IV Optional buffer - * @return status_t - * Returns the error code for this API - * DRM_NO_ERROR for success, and one of DRM_ERROR_UNKNOWN, DRM_ERROR_LICENSE_EXPIRED - * DRM_ERROR_SESSION_NOT_OPENED, DRM_ERROR_DECRYPT_UNIT_NOT_INITIALIZED, - * DRM_ERROR_DECRYPT for failure. - */ - virtual status_t onDecrypt(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, - const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) = 0; - - /** - * Finalize decryption for the given unit of the protected content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the decryption session - * @param[in] decryptUnitId ID Specifies decryption unit, such as track ID - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - virtual status_t onFinalizeDecryptUnit( - int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) = 0; - - /** - * Reads the specified number of bytes from an open DRM file. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the decryption session - * @param[out] buffer Reference to the buffer that should receive the read data. - * @param[in] numBytes Number of bytes to read. - * @param[in] offset Offset with which to update the file position. - * - * @return Number of bytes read. Returns -1 for Failure. - */ - virtual ssize_t onPread(int uniqueId, DecryptHandle* decryptHandle, - void* buffer, ssize_t numBytes, off64_t offset) = 0; -}; - -}; - -#endif /* __DRM_ENGINE_BASE_H__ */ - diff --git a/drm/libdrmframework/plugins/common/include/IDrmEngine.h b/drm/libdrmframework/plugins/common/include/IDrmEngine.h deleted file mode 100644 index dcf5977..0000000 --- a/drm/libdrmframework/plugins/common/include/IDrmEngine.h +++ /dev/null @@ -1,420 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __IDRM_ENGINE_H__ -#define __IDRM_ENGINE_H__ - -#include <drm/drm_framework_common.h> - -namespace android { - -class DrmConstraints; -class DrmMetadata; -class DrmRights; -class DrmInfo; -class DrmInfoStatus; -class DrmConvertedStatus; -class DrmInfoRequest; -class DrmSupportInfo; -class DrmInfoEvent; - -/** - * This class is an interface for plug-in user - * - * Responsibility of this class is provide generic interface to DRM Engine Manager. - * Each interface need to be as abstract as possible. - */ -class IDrmEngine { -public: - virtual ~IDrmEngine() { - } - -public: - class OnInfoListener { - - public: - virtual void onInfo(const DrmInfoEvent& event) = 0; - - virtual ~OnInfoListener() { } - }; - -public: - - ////////////////////////////////// - // Implementation of IDrmEngine // - ////////////////////////////////// - - /** - * Initialize plug-in - * - * @param[in] uniqueId Unique identifier for a session - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - virtual status_t initialize(int uniqueId) = 0; - - /** - * Register a callback to be invoked when the caller required to - * receive necessary information - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] infoListener Listener - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - virtual status_t setOnInfoListener( - int uniqueId, const IDrmEngine::OnInfoListener* infoListener) = 0; - - /** - * Terminate the plug-in - * and release resource bound to plug-in - * e.g.) release native resource - * - * @param[in] uniqueId Unique identifier for a session - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - virtual status_t terminate(int uniqueId) = 0; - - /** - * Get constraint information associated with input content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] path Path of the protected content - * @param[in] action Actions defined such as, - * Action::DEFAULT, Action::PLAY, etc - * @return DrmConstraints - * key-value pairs of constraint are embedded in it - * @note - * In case of error, return NULL - */ - virtual DrmConstraints* getConstraints( - int uniqueId, const String8* path, int action) = 0; - - /** - * Get metadata information associated with input content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] path Path of the protected content - * @return DrmMetadata - * key-value pairs of metadata - * @note - * In case of error, return NULL - */ - virtual DrmMetadata* getMetadata(int uniqueId, const String8* path) = 0; - - /** - * Get whether the given content can be handled by this plugin or not - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] path Path the protected object - * @return bool - * true if this plugin can handle , false in case of not able to handle - */ - virtual bool canHandle(int uniqueId, const String8& path) = 0; - - /** - * Executes given drm information based on its type - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] drmInfo Information needs to be processed - * @return DrmInfoStatus - * instance as a result of processing given input - */ - virtual DrmInfoStatus* processDrmInfo(int uniqueId, const DrmInfo* drmInfo) = 0; - - /** - * Retrieves necessary information for registration, unregistration or rights - * acquisition information. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] drmInfoRequest Request information to retrieve drmInfo - * @return DrmInfo - * instance as a result of processing given input - */ - virtual DrmInfo* acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest) = 0; - - /** - * Save DRM rights to specified rights path - * and make association with content path - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] drmRights DrmRights to be saved - * @param[in] rightsPath File path where rights to be saved - * @param[in] contentPath File path where content was saved - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - virtual status_t saveRights(int uniqueId, const DrmRights& drmRights, - const String8& rightsPath, const String8& contentPath) = 0; - - /** - * Retrieves the mime type embedded inside the original content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] path Path of the protected content - * @return String8 - * Returns mime-type of the original content, such as "video/mpeg" - */ - virtual String8 getOriginalMimeType(int uniqueId, const String8& path) = 0; - - /** - * Retrieves the type of the protected object (content, rights, etc..) - * using specified path or mimetype. At least one parameter should be non null - * to retrieve DRM object type - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] path Path of the content or null. - * @param[in] mimeType Mime type of the content or null. - * @return type of the DRM content, - * such as DrmObjectType::CONTENT, DrmObjectType::RIGHTS_OBJECT - */ - virtual int getDrmObjectType( - int uniqueId, const String8& path, const String8& mimeType) = 0; - - /** - * Check whether the given content has valid rights or not - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] path Path of the protected content - * @param[in] action Action to perform (Action::DEFAULT, Action::PLAY, etc) - * @return the status of the rights for the protected content, - * such as RightsStatus::RIGHTS_VALID, RightsStatus::RIGHTS_EXPIRED, etc. - */ - virtual int checkRightsStatus(int uniqueId, const String8& path, int action) = 0; - - /** - * Consumes the rights for a content. - * If the reserve parameter is true the rights is reserved until the same - * application calls this api again with the reserve parameter set to false. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the decryption session - * @param[in] action Action to perform. (Action::DEFAULT, Action::PLAY, etc) - * @param[in] reserve True if the rights should be reserved. - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - virtual status_t consumeRights( - int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) = 0; - - /** - * Informs the DRM Engine about the playback actions performed on the DRM files. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the decryption session - * @param[in] playbackStatus Playback action (Playback::START, Playback::STOP, Playback::PAUSE) - * @param[in] position Position in the file (in milliseconds) where the start occurs. - * Only valid together with Playback::START. - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - virtual status_t setPlaybackStatus(int uniqueId, DecryptHandle* decryptHandle, - int playbackStatus, int64_t position) = 0; - - /** - * Validates whether an action on the DRM content is allowed or not. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] path Path of the protected content - * @param[in] action Action to validate (Action::PLAY, Action::TRANSFER, etc) - * @param[in] description Detailed description of the action - * @return true if the action is allowed. - */ - virtual bool validateAction(int uniqueId, const String8& path, - int action, const ActionDescription& description) = 0; - - /** - * Removes the rights associated with the given protected content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] path Path of the protected content - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - virtual status_t removeRights(int uniqueId, const String8& path) = 0; - - /** - * Removes all the rights information of each plug-in associated with - * DRM framework. Will be used in master reset - * - * @param[in] uniqueId Unique identifier for a session - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - virtual status_t removeAllRights(int uniqueId) = 0; - - /** - * This API is for Forward Lock based DRM scheme. - * Each time the application tries to download a new DRM file - * which needs to be converted, then the application has to - * begin with calling this API. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] convertId Handle for the convert session - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - virtual status_t openConvertSession(int uniqueId, int convertId) = 0; - - /** - * Accepts and converts the input data which is part of DRM file. - * The resultant converted data and the status is returned in the DrmConvertedInfo - * object. This method will be called each time there are new block - * of data received by the application. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] convertId Handle for the convert session - * @param[in] inputData Input Data which need to be converted - * @return Return object contains the status of the data conversion, - * the output converted data and offset. In this case the - * application will ignore the offset information. - */ - virtual DrmConvertedStatus* convertData( - int uniqueId, int convertId, const DrmBuffer* inputData) = 0; - - /** - * Informs the Drm Agent when there is no more data which need to be converted - * or when an error occurs. Upon successful conversion of the complete data, - * the agent will inform that where the header and body signature - * should be added. This signature appending is needed to integrity - * protect the converted file. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] convertId Handle for the convert session - * @return Return object contains the status of the data conversion, - * the header and body signature data. It also informs - * the application on which offset these signature data - * should be appended. - */ - virtual DrmConvertedStatus* closeConvertSession( int uniqueId, int convertId) = 0; - - /** - * Returns the information about the Drm Engine capabilities which includes - * supported MimeTypes and file suffixes. - * - * @param[in] uniqueId Unique identifier for a session - * @return DrmSupportInfo - * instance which holds the capabilities of a plug-in - */ - virtual DrmSupportInfo* getSupportInfo(int uniqueId) = 0; - - /** - * Open the decrypt session to decrypt the given protected content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the current decryption session - * @param[in] fd File descriptor of the protected content to be decrypted - * @param[in] offset Start position of the content - * @param[in] length The length of the protected content - * @param[in] mime Mime type of the protected content if it is - * not NULL or empty - * @return - * DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success - */ - virtual status_t openDecryptSession( - int uniqueId, DecryptHandle* decryptHandle, - int fd, off64_t offset, off64_t length, const char* mime) = 0; - - /** - * Open the decrypt session to decrypt the given protected content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the current decryption session - * @param[in] uri Path of the protected content to be decrypted - * @param[in] mime Mime type of the protected content if it is - * not NULL or empty - * @return - * DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success - */ - virtual status_t openDecryptSession( - int uniqueId, DecryptHandle* decryptHandle, - const char* uri, const char* mime) = 0; - - /** - * Close the decrypt session for the given handle - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the decryption session - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - virtual status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) = 0; - - /** - * Initialize decryption for the given unit of the protected content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the decryption session - * @param[in] decryptUnitId ID which specifies decryption unit, such as track ID - * @param[in] headerInfo Information for initializing decryption of this decrypUnit - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - virtual status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, - int decryptUnitId, const DrmBuffer* headerInfo) = 0; - - /** - * Decrypt the protected content buffers for the given unit - * This method will be called any number of times, based on number of - * encrypted streams received from application. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the decryption session - * @param[in] decryptUnitId ID which specifies decryption unit, such as track ID - * @param[in] encBuffer Encrypted data block - * @param[out] decBuffer Decrypted data block - * @param[in] IV Optional buffer - * @return status_t - * Returns the error code for this API - * DRM_NO_ERROR for success, and one of DRM_ERROR_UNKNOWN, DRM_ERROR_LICENSE_EXPIRED - * DRM_ERROR_SESSION_NOT_OPENED, DRM_ERROR_DECRYPT_UNIT_NOT_INITIALIZED, - * DRM_ERROR_DECRYPT for failure. - */ - virtual status_t decrypt(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, - const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) = 0; - - /** - * Finalize decryption for the given unit of the protected content - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the decryption session - * @param[in] decryptUnitId ID which specifies decryption unit, such as track ID - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - virtual status_t finalizeDecryptUnit( - int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) = 0; - - /** - * Reads the specified number of bytes from an open DRM file. - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] decryptHandle Handle for the decryption session - * @param[out] buffer Reference to the buffer that should receive the read data. - * @param[in] numBytes Number of bytes to read. - * @param[in] offset Offset with which to update the file position. - * - * @return Number of bytes read. Returns -1 for Failure. - */ - virtual ssize_t pread(int uniqueId, DecryptHandle* decryptHandle, - void* buffer, ssize_t numBytes, off64_t offset) = 0; -}; - -}; - -#endif /* __IDRM_ENGINE_H__ */ - diff --git a/drm/libdrmframework/plugins/common/util/Android.mk b/drm/libdrmframework/plugins/common/util/Android.mk deleted file mode 100644 index 15dda80..0000000 --- a/drm/libdrmframework/plugins/common/util/Android.mk +++ /dev/null @@ -1,52 +0,0 @@ -# -# Copyright (C) 2010 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -LOCAL_PATH:= $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := \ - src/MimeTypeUtil.cpp - -LOCAL_MODULE := libdrmutility - -LOCAL_SHARED_LIBRARIES := \ - libutils \ - libdl \ - libdvm \ - libandroid_runtime \ - libnativehelper \ - liblog - - -base := frameworks/base - -LOCAL_C_INCLUDES += \ - $(JNI_H_INCLUDE) \ - $(base)/include \ - $(base)/include/drm \ - $(base)/include/drm/plugins \ - $(LOCAL_PATH)/include - - -ifneq ($(TARGET_BUILD_VARIANT),user) -LOCAL_C_INCLUDES += \ - $(LOCAL_PATH)/tools - -endif - -LOCAL_MODULE_TAGS := optional - -include $(BUILD_STATIC_LIBRARY) diff --git a/drm/libdrmframework/plugins/common/util/include/MimeTypeUtil.h b/drm/libdrmframework/plugins/common/util/include/MimeTypeUtil.h deleted file mode 100644 index 4d12a61..0000000 --- a/drm/libdrmframework/plugins/common/util/include/MimeTypeUtil.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __MIMETYPEUTIL_H__ -#define __MIMETYPEUTIL_H__ - -#include <utils/String8.h> - -namespace android { - -class MimeTypeUtil { - -public: - - MimeTypeUtil() {} - - virtual ~MimeTypeUtil() {} - -/** - * May convert the mimetype if there is a well known - * replacement mimetype otherwise the original mimetype - * is returned. - * - * @param mimeType - mimetype in lower case to convert. - * - * @return mimetype or null. - */ -static String8 convertMimeType(String8& mimeType); - -}; -}; - -#endif /* __MIMETYPEUTIL_H__ */ diff --git a/drm/libdrmframework/plugins/common/util/include/SessionMap.h b/drm/libdrmframework/plugins/common/util/include/SessionMap.h deleted file mode 100644 index e563894..0000000 --- a/drm/libdrmframework/plugins/common/util/include/SessionMap.h +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#ifndef __SESSIONMAP_H__ -#define __SESSIONMAP_H__ - -#include <utils/KeyedVector.h> -#include <utils/threads.h> - -namespace android { - -/** - * A thread safe wrapper template class for session handlings for Drm Engines. It wraps a - * pointer type over KeyedVector. It keeps pointer as data in the vector and free up memory - * allocated pointer can be of any type of structure/class meant for keeping session data. - * so session object here means pointer to the session data. - */ -template <typename TValue> -class SessionMap { - -public: - SessionMap() {} - - virtual ~SessionMap() { - Mutex::Autolock lock(mLock); - destroyMap(); - } - - /** - * Adds a new value in the session map table. It expects memory to be allocated already - * for the session object - * - * @param key - key or Session ID - * @param value - session object to add - * - * @return boolean result of adding value. returns false if key is already exist. - */ - bool addValue(int key, TValue value) { - Mutex::Autolock lock(mLock); - if (!isCreatedInternal(key)) { - map.add(key, value); - return true; - } - return false; - } - - /** - * returns the session object by the key - * - * @param key - key or Session ID - * - * @return session object as per the key - */ - TValue getValue(int key) { - Mutex::Autolock lock(mLock); - return getValueInternal(key); - } - - /** - * returns the number of objects in the session map table - * - * @return count of number of session objects. - */ - int getSize() { - Mutex::Autolock lock(mLock); - return map.size(); - } - - /** - * returns the session object by the index in the session map table - * - * @param index - index of the value required - * - * @return session object as per the index - */ - TValue getValueAt(unsigned int index) { - TValue value = NULL; - Mutex::Autolock lock(mLock); - - if (map.size() > index) { - value = map.valueAt(index); - } - return value; - } - - /** - * deletes the object from session map. It also frees up memory for the session object. - * - * @param key - key of the value to be deleted - * - */ - void removeValue(int key) { - Mutex::Autolock lock(mLock); - deleteValue(getValueInternal(key)); - map.removeItem(key); - } - - /** - * decides if session is already created. - * - * @param key - key of the value for the session - * - * @return boolean result of whether session is created - */ - bool isCreated(int key) { - Mutex::Autolock lock(mLock); - return isCreatedInternal(key); - } - - SessionMap<TValue> & operator=(const SessionMap<TValue> & objectCopy) { - Mutex::Autolock lock(mLock); - - destroyMap(); - map = objectCopy.map; - return *this; - } - -private: - KeyedVector<int, TValue> map; - Mutex mLock; - - /** - * free up the memory for the session object. - * Make sure if any reference to the session object anywhere, otherwise it will be a - * dangle pointer after this call. - * - * @param value - session object to free - * - */ - void deleteValue(TValue value) { - delete value; - } - - /** - * free up the memory for the entire map. - * free up any resources in the sessions before calling this funtion. - * - */ - void destroyMap() { - int size = map.size(); - - for (int i = 0; i < size; i++) { - deleteValue(map.valueAt(i)); - } - map.clear(); - } - - /** - * decides if session is already created. - * - * @param key - key of the value for the session - * - * @return boolean result of whether session is created - */ - bool isCreatedInternal(int key) { - return(0 <= map.indexOfKey(key)); - } - - /** - * returns the session object by the key - * - * @param key - key or Session ID - * - * @return session object as per the key - */ - TValue getValueInternal(int key) { - TValue value = NULL; - if (isCreatedInternal(key)) { - value = (TValue) map.valueFor(key); - } - return value; - } -}; - -}; - -#endif /* __SESSIONMAP_H__ */ diff --git a/drm/libdrmframework/plugins/common/util/src/MimeTypeUtil.cpp b/drm/libdrmframework/plugins/common/util/src/MimeTypeUtil.cpp deleted file mode 100644 index 576ed15..0000000 --- a/drm/libdrmframework/plugins/common/util/src/MimeTypeUtil.cpp +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <MimeTypeUtil.h> -#include <utils/Log.h> - -namespace android { - -#undef LOG_TAG -#define LOG_TAG "MimeTypeUtil" - -#ifdef DRM_OMA_FL_ENGINE_DEBUG -#define LOG_NDEBUG 0 -#define LOG_DEBUG(...) ALOGD(__VA_ARGS__) -#else -#define LOG_DEBUG(...) -#endif - -enum { - MIMETYPE_AUDIO = 0, - MIMETYPE_APPLICATION = 1, - MIMETYPE_IMAGE = 2, - MIMETYPE_VIDEO = 3, - MIMETYPE_LAST = -1, -}; - -struct MimeGroup{ - int type; // Audio, video,.. use the enum values - const char* pGroup; // "audio/", "video/",.. should contain the last "/" - int size; // Number of bytes. e.g. "audio/" = 6 bytes -}; - -struct MimeTypeList{ - int type; - const char* pMimeExt; // Everything after the '/' e.g. audio/x-mpeg -> "x-mpeg" - int size; // Number of bytes. e.g. "x-mpeg" = 6 bytes - const char* pMimeType; // Mimetype that should be returned -}; - - -// Known mimetypes by android -static const char mime_type_audio_mpeg[] = "audio/mpeg"; -static const char mime_type_audio_3gpp[] = "audio/3gpp"; -static const char mime_type_audio_amr[] = "audio/amr-wb"; -static const char mime_type_audio_aac[] = "audio/mp4a-latm"; -static const char mime_type_audio_wav[] = "audio/wav"; - -static const char mime_type_video_mpeg4[] = "video/mpeg4"; -static const char mime_type_video_3gpp[] = "video/3gpp"; - -// Known mimetype groups -static const char mime_group_audio[] = "audio/"; -static const char mime_group_application[] = "application/"; -static const char mime_group_image[] = "image/"; -static const char mime_group_video[] = "video/"; -static const char mime_type_unsupported[] = "unsupported/drm.mimetype"; - -static struct MimeGroup mimeGroup[] = { - {MIMETYPE_AUDIO, mime_group_audio, sizeof(mime_group_audio)-1}, - {MIMETYPE_APPLICATION, mime_group_application, sizeof(mime_group_application)-1}, - {MIMETYPE_IMAGE, mime_group_image, sizeof(mime_group_image)-1}, - {MIMETYPE_VIDEO, mime_group_video, sizeof(mime_group_video)-1}, - {MIMETYPE_LAST, NULL, 0} // Must be last entry -}; - -// List of all mimetypes that should be converted. -static struct MimeTypeList mimeTypeList[] = { - // Mp3 mime types - {MIMETYPE_AUDIO, "mp3", sizeof("mp3")-1, mime_type_audio_mpeg}, - {MIMETYPE_AUDIO, "x-mpeg", sizeof("x-mpeg")-1, mime_type_audio_mpeg}, - {MIMETYPE_AUDIO, "x-mp3", sizeof("x-mp3")-1, mime_type_audio_mpeg}, - {MIMETYPE_AUDIO, "mpg", sizeof("mpg")-1, mime_type_audio_mpeg}, - {MIMETYPE_AUDIO, "mpg3", sizeof("mpg")-1, mime_type_audio_mpeg}, - {MIMETYPE_AUDIO, "x-mpg", sizeof("x-mpg")-1, mime_type_audio_mpeg}, - {MIMETYPE_AUDIO, "x-mpegaudio", sizeof("x-mpegaudio")-1, mime_type_audio_mpeg}, - - // 3gpp audio mime types - {MIMETYPE_AUDIO, "3gp", sizeof("3gp")-1, mime_type_audio_3gpp}, - - // Amr audio mime types - {MIMETYPE_AUDIO, "amr", sizeof("amr")-1, mime_type_audio_amr}, - - // Aac audio mime types - {MIMETYPE_AUDIO, "aac", sizeof("aac")-1, mime_type_audio_aac}, - - // Wav audio mime types - {MIMETYPE_AUDIO, "x-wav", sizeof("x-wav")-1, mime_type_audio_wav}, - - // Mpeg4 video mime types - {MIMETYPE_VIDEO, "mpg4", sizeof("mpg4")-1, mime_type_video_mpeg4}, - {MIMETYPE_VIDEO, "mp4v-es", sizeof("mp4v-es")-1, mime_type_video_mpeg4}, - - // 3gpp video mime types - {MIMETYPE_VIDEO, "3gp", sizeof("3gp")-1, mime_type_video_3gpp}, - - // Must be last entry - {MIMETYPE_LAST, NULL, 0, NULL} -}; - -/** - * May convert the mimetype if there is a well known - * replacement mimetype otherwise the original mimetype - * is returned. - * - * If the mimetype is of unsupported group i.e. application/* - * then "unsupported/drm.mimetype" will be returned. - * - * @param mimeType - mimetype in lower case to convert. - * - * @return mimetype or "unsupported/drm.mimetype". - */ -String8 MimeTypeUtil::convertMimeType(String8& mimeType) { - String8 result = mimeType; - const char* pMimeType; - struct MimeGroup* pGroup; - struct MimeTypeList* pMimeItem; - int len; - pMimeType = mimeType.string(); - if (NULL != pMimeType) { - if ((0 == strncmp(pMimeType, mime_group_audio, (sizeof mime_group_audio) - 1)) || - (0 == strncmp(pMimeType, mime_group_video, (sizeof mime_group_video) - 1))) { - /* Check which group the mimetype is */ - pGroup = mimeGroup; - while (MIMETYPE_LAST != pGroup->type) { - if (0 == strncmp(pMimeType, pGroup->pGroup, pGroup->size)) { - break; - } - pGroup++; - } - - /* Go through the mimetype list. Only check items of the correct group */ - if (MIMETYPE_LAST != pGroup->type) { - pMimeItem = mimeTypeList; - len = strlen (pMimeType+pGroup->size); - while (MIMETYPE_LAST != pMimeItem->type) { - if ((pGroup->type == pMimeItem->type) && - (len == pMimeItem->size) && - (0 == strcmp(pMimeType+pGroup->size, pMimeItem->pMimeExt))) { - result = String8(pMimeItem->pMimeType); - break; - } - pMimeItem++; - } - } - } else { - result = String8(mime_type_unsupported); - } - LOG_DEBUG("convertMimeType got mimetype %s, converted into mimetype %s", - pMimeType, result.string()); - } - return result; -} -}; diff --git a/drm/libdrmframework/plugins/forward-lock/Android.mk b/drm/libdrmframework/plugins/forward-lock/Android.mk deleted file mode 100644 index 9ee7961..0000000 --- a/drm/libdrmframework/plugins/forward-lock/Android.mk +++ /dev/null @@ -1,16 +0,0 @@ -# -# Copyright (C) 2010 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -include $(call all-subdir-makefiles) diff --git a/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/Android.mk b/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/Android.mk deleted file mode 100644 index e359dbd..0000000 --- a/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/Android.mk +++ /dev/null @@ -1,70 +0,0 @@ -# -# Copyright (C) 2010 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -# The flag below turns on local debug printouts -#LOCAL_CFLAGS += -DDRM_OMA_FL_ENGINE_DEBUG - -base := frameworks/base - -# Determine whether the DRM framework uses 64-bit data types for file offsets and do the same. -ifneq ($(shell grep -c 'off64_t offset' $(base)/drm/libdrmframework/plugins/common/include/IDrmEngine.h), 0) -LOCAL_CFLAGS += -DUSE_64BIT_DRM_API -endif - -LOCAL_SRC_FILES:= \ - src/FwdLockEngine.cpp - -LOCAL_MODULE := libfwdlockengine - -LOCAL_SHARED_LIBRARIES := \ - libicui18n \ - libicuuc \ - libutils \ - libdl \ - libandroid_runtime \ - libnativehelper \ - libcrypto \ - libssl \ - libdrmframework - -LOCAL_STATIC_LIBRARIES := \ - libdrmutility \ - libdrmframeworkcommon \ - libfwdlock-common \ - libfwdlock-converter \ - libfwdlock-decoder - - - -LOCAL_C_INCLUDES += \ - $(JNI_H_INCLUDE) \ - $(base)/include/drm \ - $(base)/drm/libdrmframework/plugins/common/include \ - $(base)/drm/libdrmframework/plugins/common/util/include \ - $(base)/drm/libdrmframework/plugins/forward-lock/internal-format/common \ - $(base)/drm/libdrmframework/plugins/forward-lock/internal-format/converter \ - $(base)/drm/libdrmframework/plugins/forward-lock/internal-format/decoder \ - $(LOCAL_PATH)/include \ - external/openssl/include - -LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/drm - -LOCAL_MODULE_TAGS := optional - -include $(BUILD_SHARED_LIBRARY) diff --git a/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/include/FwdLockEngine.h b/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/include/FwdLockEngine.h deleted file mode 100644 index c0e408e..0000000 --- a/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/include/FwdLockEngine.h +++ /dev/null @@ -1,567 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __FWDLOCKENGINE_H__ -#define __FWDLOCKENGINE_H__ - -#include <DrmEngineBase.h> -#include <DrmConstraints.h> -#include <DrmRights.h> -#include <DrmInfo.h> -#include <DrmInfoStatus.h> -#include <DrmConvertedStatus.h> -#include <DrmInfoRequest.h> -#include <DrmSupportInfo.h> -#include <DrmInfoEvent.h> - -#include "SessionMap.h" -#include "FwdLockConv.h" - -namespace android { - -/** - * Forward Lock Engine class. - */ -class FwdLockEngine : public android::DrmEngineBase { - -public: - FwdLockEngine(); - virtual ~FwdLockEngine(); - -protected: -/** - * Get constraint information associated with input content. - * - * @param uniqueId Unique identifier for a session - * @param path Path of the protected content - * @param action Actions defined such as, - * Action::DEFAULT, Action::PLAY, etc - * @return DrmConstraints - * key-value pairs of constraint are embedded in it - * @note - * In case of error, return NULL - */ -DrmConstraints* onGetConstraints(int uniqueId, const String8* path, int action); - -/** - * Get metadata information associated with input content. - * - * @param uniqueId Unique identifier for a session - * @param path Path of the protected content - * @return DrmMetadata - * For Forward Lock engine, it returns an empty object - * @note - * In case of error, returns NULL - */ -DrmMetadata* onGetMetadata(int uniqueId, const String8* path); - -/** - * Initialize plug-in. - * - * @param uniqueId Unique identifier for a session - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ -status_t onInitialize(int uniqueId); - -/** - * Register a callback to be invoked when the caller required to - * receive necessary information. - * - * @param uniqueId Unique identifier for a session - * @param infoListener Listener - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ -status_t onSetOnInfoListener(int uniqueId, const IDrmEngine::OnInfoListener* infoListener); - -/** - * Terminate the plug-in and release resources bound to it. - * - * @param uniqueId Unique identifier for a session - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ -status_t onTerminate(int uniqueId); - -/** - * Get whether the given content can be handled by this plugin or not. - * - * @param uniqueId Unique identifier for a session - * @param path Path to the protected object - * @return bool - * Returns true if this plugin can handle , false in case of not able to handle - */ -bool onCanHandle(int uniqueId, const String8& path); - -/** - * Processes the given DRM information as appropriate for its type. - * Not used for Forward Lock Engine. - * - * @param uniqueId Unique identifier for a session - * @param drmInfo Information that needs to be processed - * @return DrmInfoStatus - * instance as a result of processing given input - */ -DrmInfoStatus* onProcessDrmInfo(int uniqueId, const DrmInfo* drmInfo); - -/** - * Save DRM rights to specified rights path - * and make association with content path. - * - * @param uniqueId Unique identifier for a session - * @param drmRights DrmRights to be saved - * @param rightsPath File path where rights to be saved - * @param contentPath File path where content was saved - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ -status_t onSaveRights(int uniqueId, - const DrmRights& drmRights, - const String8& rightsPath, - const String8& contentPath); - -/** - * Retrieves necessary information for registration, unregistration or rights - * acquisition information. - * - * @param uniqueId Unique identifier for a session - * @param drmInfoRequest Request information to retrieve drmInfo - * @return DrmInfo - * instance as a result of processing given input - */ -DrmInfo* onAcquireDrmInfo(int uniqueId, - const DrmInfoRequest* drmInfoRequest); - -/** - * Retrieves the mime type embedded inside the original content. - * - * @param uniqueId Unique identifier for a session - * @param path Path of the protected content - * @return String8 - * Returns mime-type of the original content, such as "video/mpeg" - */ -String8 onGetOriginalMimeType(int uniqueId, const String8& path); - -/** - * Retrieves the type of the protected object (content, rights, etc..) - * using specified path or mimetype. At least one parameter should be non null - * to retrieve DRM object type. - * - * @param uniqueId Unique identifier for a session - * @param path Path of the content or null. - * @param mimeType Mime type of the content or null. - * @return type of the DRM content, - * such as DrmObjectType::CONTENT, DrmObjectType::RIGHTS_OBJECT - */ -int onGetDrmObjectType(int uniqueId, - const String8& path, - const String8& mimeType); - -/** - * Check whether the given content has valid rights or not. - * - * @param uniqueId Unique identifier for a session - * @param path Path of the protected content - * @param action Action to perform (Action::DEFAULT, Action::PLAY, etc) - * @return the status of the rights for the protected content, - * such as RightsStatus::RIGHTS_VALID, RightsStatus::RIGHTS_EXPIRED, etc. - */ -int onCheckRightsStatus(int uniqueId, - const String8& path, - int action); - -/** - * Consumes the rights for a content. - * If the reserve parameter is true the rights are reserved until the same - * application calls this api again with the reserve parameter set to false. - * - * @param uniqueId Unique identifier for a session - * @param decryptHandle Handle for the decryption session - * @param action Action to perform. (Action::DEFAULT, Action::PLAY, etc) - * @param reserve True if the rights should be reserved. - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ -status_t onConsumeRights(int uniqueId, - DecryptHandle* decryptHandle, - int action, - bool reserve); - -/** - * Informs the DRM Engine about the playback actions performed on the DRM files. - * - * @param uniqueId Unique identifier for a session - * @param decryptHandle Handle for the decryption session - * @param playbackStatus Playback action (Playback::START, Playback::STOP, Playback::PAUSE) - * @param position Position in the file (in milliseconds) where the start occurs. - * Only valid together with Playback::START. - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ -#ifdef USE_64BIT_DRM_API -status_t onSetPlaybackStatus(int uniqueId, - DecryptHandle* decryptHandle, - int playbackStatus, - int64_t position); -#else -status_t onSetPlaybackStatus(int uniqueId, - DecryptHandle* decryptHandle, - int playbackStatus, - int position); -#endif - -/** - * Validates whether an action on the DRM content is allowed or not. - * - * @param uniqueId Unique identifier for a session - * @param path Path of the protected content - * @param action Action to validate (Action::PLAY, Action::TRANSFER, etc) - * @param description Detailed description of the action - * @return true if the action is allowed. - */ -bool onValidateAction(int uniqueId, - const String8& path, - int action, - const ActionDescription& description); - -/** - * Removes the rights associated with the given protected content. - * Not used for Forward Lock Engine. - * - * @param uniqueId Unique identifier for a session - * @param path Path of the protected content - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ -status_t onRemoveRights(int uniqueId, const String8& path); - -/** - * Removes all the rights information of each plug-in associated with - * DRM framework. Will be used in master reset but does nothing for - * Forward Lock Engine. - * - * @param uniqueId Unique identifier for a session - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ -status_t onRemoveAllRights(int uniqueId); - -/** - * Starts the Forward Lock file conversion session. - * Each time the application tries to download a new DRM file - * which needs to be converted, then the application has to - * begin with calling this API. The convertId is used as the conversion session key - * and must not be the same for different convert sessions. - * - * @param uniqueId Unique identifier for a session - * @param convertId Handle for the convert session - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ -status_t onOpenConvertSession(int uniqueId, int convertId); - -/** - * Accepts and converts the input data which is part of DRM file. - * The resultant converted data and the status is returned in the DrmConvertedInfo - * object. This method will be called each time there is a new block - * of data received by the application. - * - * @param uniqueId Unique identifier for a session - * @param convertId Handle for the convert session - * @param inputData Input Data which need to be converted - * @return Return object contains the status of the data conversion, - * the output converted data and offset. In this case the - * application will ignore the offset information. - */ -DrmConvertedStatus* onConvertData(int uniqueId, - int convertId, - const DrmBuffer* inputData); - -/** - * Closes the convert session in case of data supply completed or error occurred. - * Upon successful conversion of the complete data, it returns signature calculated over - * the entire data used over a conversion session. This signature must be copied to the offset - * mentioned in the DrmConvertedStatus. Signature is used for data integrity protection. - * - * @param uniqueId Unique identifier for a session - * @param convertId Handle for the convert session - * @return Return object contains the status of the data conversion, - * the header and body signature data. It also informs - * the application about the file offset at which this - * signature data should be written. - */ -DrmConvertedStatus* onCloseConvertSession(int uniqueId, int convertId); - -/** - * Returns the information about the Drm Engine capabilities which includes - * supported MimeTypes and file suffixes. - * - * @param uniqueId Unique identifier for a session - * @return DrmSupportInfo - * instance which holds the capabilities of a plug-in - */ -DrmSupportInfo* onGetSupportInfo(int uniqueId); - -/** - * Open the decrypt session to decrypt the given protected content. - * - * @param uniqueId Unique identifier for a session - * @param decryptHandle Handle for the current decryption session - * @param fd File descriptor of the protected content to be decrypted - * @param offset Start position of the content - * @param length The length of the protected content - * @return - * DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success - */ -#ifdef USE_64BIT_DRM_API -status_t onOpenDecryptSession(int uniqueId, - DecryptHandle* decryptHandle, - int fd, off64_t offset, off64_t length); -#else -status_t onOpenDecryptSession(int uniqueId, - DecryptHandle* decryptHandle, - int fd, int offset, int length); -#endif - -/** - * Open the decrypt session to decrypt the given protected content. - * - * @param uniqueId Unique identifier for a session - * @param decryptHandle Handle for the current decryption session - * @param uri Path of the protected content to be decrypted - * @return - * DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success - */ -status_t onOpenDecryptSession(int uniqueId, - DecryptHandle* decryptHandle, - const char* uri); - -/** - * Close the decrypt session for the given handle. - * - * @param uniqueId Unique identifier for a session - * @param decryptHandle Handle for the decryption session - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ -status_t onCloseDecryptSession(int uniqueId, - DecryptHandle* decryptHandle); - -/** - * Initialize decryption for the given unit of the protected content. - * - * @param uniqueId Unique identifier for a session - * @param decryptHandle Handle for the decryption session - * @param decryptUnitId ID which specifies decryption unit, such as track ID - * @param headerInfo Information for initializing decryption of this decrypUnit - * @return - * DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success - */ -status_t onInitializeDecryptUnit(int uniqueId, - DecryptHandle* decryptHandle, - int decryptUnitId, - const DrmBuffer* headerInfo); - -/** - * Decrypt the protected content buffers for the given unit. - * This method will be called any number of times, based on number of - * encrypted streams received from application. - * - * @param uniqueId Unique identifier for a session - * @param decryptHandle Handle for the decryption session - * @param decryptUnitId ID which specifies decryption unit, such as track ID - * @param encBuffer Encrypted data block - * @param decBuffer Decrypted data block - * @return status_t - * Returns the error code for this API - * DRM_NO_ERROR for success, and one of DRM_ERROR_UNKNOWN, DRM_ERROR_LICENSE_EXPIRED - * DRM_ERROR_SESSION_NOT_OPENED, DRM_ERROR_DECRYPT_UNIT_NOT_INITIALIZED, - * DRM_ERROR_DECRYPT for failure. - */ -status_t onDecrypt(int uniqueId, - DecryptHandle* decryptHandle, - int decryptUnitId, - const DrmBuffer* encBuffer, - DrmBuffer** decBuffer); - -/** - * Decrypt the protected content buffers for the given unit. - * This method will be called any number of times, based on number of - * encrypted streams received from application. - * - * @param uniqueId Unique identifier for a session - * @param decryptId Handle for the decryption session - * @param decryptUnitId ID Specifies decryption unit, such as track ID - * @param encBuffer Encrypted data block - * @param decBuffer Decrypted data block - * @param IV Optional buffer - * @return status_t - * Returns the error code for this API - * DRM_NO_ERROR for success, and one of DRM_ERROR_UNKNOWN, DRM_ERROR_LICENSE_EXPIRED - * DRM_ERROR_SESSION_NOT_OPENED, DRM_ERROR_DECRYPT_UNIT_NOT_INITIALIZED, - * DRM_ERROR_DECRYPT for failure. - */ -status_t onDecrypt(int uniqueId, DecryptHandle* decryptHandle, - int decryptUnitId, const DrmBuffer* encBuffer, - DrmBuffer** decBuffer, DrmBuffer* IV); - -/** - * Finalize decryption for the given unit of the protected content. - * - * @param uniqueId Unique identifier for a session - * @param decryptHandle Handle for the decryption session - * @param decryptUnitId ID Specifies decryption unit, such as track ID - * @return - * DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success - */ -status_t onFinalizeDecryptUnit(int uniqueId, - DecryptHandle* decryptHandle, - int decryptUnitId); - -/** - * Reads the specified number of bytes from an open DRM file. - * - * @param uniqueId Unique identifier for a session - * @param decryptHandle Handle for the decryption session - * @param buffer Reference to the buffer that should receive the read data. - * @param numBytes Number of bytes to read. - * - * @return Number of bytes read. - * @retval -1 Failure. - */ -ssize_t onRead(int uniqueId, - DecryptHandle* decryptHandle, - void* pBuffer, - int numBytes); - -/** - * Updates the file position within an open DRM file. - * - * @param uniqueId Unique identifier for a session - * @param decryptHandle Handle for the decryption session - * @param offset Offset with which to update the file position. - * @param whence One of SEEK_SET, SEEK_CUR, and SEEK_END. - * These constants are defined in unistd.h. - * - * @return New file position. - * @retval ((off_t)-1) Failure. - */ -#ifdef USE_64BIT_DRM_API -off64_t onLseek(int uniqueId, - DecryptHandle* decryptHandle, - off64_t offset, - int whence); -#else -off_t onLseek(int uniqueId, - DecryptHandle* decryptHandle, - off_t offset, - int whence); -#endif - -/** - * Reads the specified number of bytes from an open DRM file. - * - * @param uniqueId Unique identifier for a session - * @param decryptHandle Handle for the decryption session - * @param buffer Reference to the buffer that should receive the read data. - * @param numBytes Number of bytes to read. - * @param offset Offset with which to update the file position. - * - * @return Number of bytes read. Returns -1 for Failure. - */ -#ifdef USE_64BIT_DRM_API -ssize_t onPread(int uniqueId, - DecryptHandle* decryptHandle, - void* buffer, - ssize_t numBytes, - off64_t offset); -#else -ssize_t onPread(int uniqueId, - DecryptHandle* decryptHandle, - void* buffer, - ssize_t numBytes, - off_t offset); -#endif - -private: - - static const String8 Description; - static const String8 FileSuffixes[]; - static const String8 MimeTypes[]; - static bool IsFileSuffixSupported(const String8& suffix); - static bool IsMimeTypeSupported(const String8& mime); - static void AddSupportedMimeTypes(DrmSupportInfo *info); - static void AddSupportedFileSuffixes(DrmSupportInfo *info); - -/** - * Session Class for Forward Lock Conversion. An object of this class is created - * for every conversion. - */ -class ConvertSession { - public : - int uniqueId; - FwdLockConv_Output_t output; - - ConvertSession() { - uniqueId = 0; - memset(&output, 0, sizeof(FwdLockConv_Output_t)); - } - - virtual ~ConvertSession() {} -}; - -/** - * Session Class for Forward Lock decoder. An object of this class is created - * for every decoding session. - */ -class DecodeSession { - public : - int fileDesc; - off_t offset; - - DecodeSession() { - fileDesc = -1; - offset = 0; - } - - DecodeSession(int fd) { - fileDesc = fd; - offset = 0; - } - - virtual ~DecodeSession() {} -}; - -/** - * Session Map Tables for Conversion and Decoding of forward lock files. - */ -SessionMap<ConvertSession*> convertSessionMap; -SessionMap<DecodeSession*> decodeSessionMap; - -/** - * Converts the error code from Forward Lock Converter to DrmConvertStatus error code. - * - * @param Forward Lock Converter error code - * - * @return Status code from DrmConvertStatus. - */ -static int getConvertedStatus(FwdLockConv_Status_t status); -}; - -}; - -#endif /* __FWDLOCKENGINE_H__ */ diff --git a/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/src/FwdLockEngine.cpp b/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/src/FwdLockEngine.cpp deleted file mode 100644 index 4b1b40e..0000000 --- a/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/src/FwdLockEngine.cpp +++ /dev/null @@ -1,695 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "SessionMap.h" -#include "FwdLockEngine.h" -#include <utils/Log.h> -#include <errno.h> -#include <stdio.h> -#include <unistd.h> -#include "drm_framework_common.h" -#include <fcntl.h> -#include <limits.h> -#include <DrmRights.h> -#include <DrmConstraints.h> -#include <DrmMetadata.h> -#include <DrmInfo.h> -#include <DrmInfoStatus.h> -#include <DrmInfoRequest.h> -#include <DrmSupportInfo.h> -#include <DrmConvertedStatus.h> -#include <utils/String8.h> -#include "FwdLockConv.h" -#include "FwdLockFile.h" -#include "FwdLockGlue.h" -#include "MimeTypeUtil.h" - -#undef LOG_TAG -#define LOG_TAG "FwdLockEngine" - -#ifdef DRM_OMA_FL_ENGINE_DEBUG -#define LOG_NDEBUG 0 -#define LOG_VERBOSE(...) ALOGV(__VA_ARGS__) -#else -#define LOG_VERBOSE(...) -#endif - -using namespace android; -// This extern "C" is mandatory to be managed by TPlugInManager -extern "C" IDrmEngine* create() { - return new FwdLockEngine(); -} - -// This extern "C" is mandatory to be managed by TPlugInManager -extern "C" void destroy(IDrmEngine* plugIn) { - delete plugIn; -} - -FwdLockEngine::FwdLockEngine() { - LOG_VERBOSE("FwdLockEngine Construction"); -} - -FwdLockEngine::~FwdLockEngine() { - LOG_VERBOSE("FwdLockEngine Destruction"); - - int size = decodeSessionMap.getSize(); - - for (int i = 0; i < size; i++) { - DecodeSession *session = (DecodeSession*) decodeSessionMap.getValueAt(i); - FwdLockFile_detach(session->fileDesc); - ::close(session->fileDesc); - } - - size = convertSessionMap.getSize(); - for (int i = 0; i < size; i++) { - ConvertSession *convSession = (ConvertSession*) convertSessionMap.getValueAt(i); - FwdLockConv_CloseSession(convSession->uniqueId, &(convSession->output)); - } -} - -int FwdLockEngine::getConvertedStatus(FwdLockConv_Status_t status) { - int retStatus = DrmConvertedStatus::STATUS_ERROR; - - switch(status) { - case FwdLockConv_Status_OK: - retStatus = DrmConvertedStatus::STATUS_OK; - break; - case FwdLockConv_Status_SyntaxError: - case FwdLockConv_Status_InvalidArgument: - case FwdLockConv_Status_UnsupportedFileFormat: - case FwdLockConv_Status_UnsupportedContentTransferEncoding: - ALOGE("FwdLockEngine getConvertedStatus: file conversion Error %d. " - "Returning STATUS_INPUTDATA_ERROR", status); - retStatus = DrmConvertedStatus::STATUS_INPUTDATA_ERROR; - break; - default: - ALOGE("FwdLockEngine getConvertedStatus: file conversion Error %d. " - "Returning STATUS_ERROR", status); - retStatus = DrmConvertedStatus::STATUS_ERROR; - break; - } - - return retStatus; -} - -DrmConstraints* FwdLockEngine::onGetConstraints(int uniqueId, const String8* path, int action) { - DrmConstraints* drmConstraints = NULL; - - LOG_VERBOSE("FwdLockEngine::onGetConstraints"); - - if (NULL != path && - (RightsStatus::RIGHTS_VALID == onCheckRightsStatus(uniqueId, *path, action))) { - // Return the empty constraints to show no error condition. - drmConstraints = new DrmConstraints(); - } - - return drmConstraints; -} - -DrmMetadata* FwdLockEngine::onGetMetadata(int uniqueId, const String8* path) { - DrmMetadata* drmMetadata = NULL; - - LOG_VERBOSE("FwdLockEngine::onGetMetadata"); - - if (NULL != path) { - // Returns empty metadata to show no error condition. - drmMetadata = new DrmMetadata(); - } - - return drmMetadata; -} - -android::status_t FwdLockEngine::onInitialize(int uniqueId) { - LOG_VERBOSE("FwdLockEngine::onInitialize"); - - if (FwdLockGlue_InitializeKeyEncryption()) { - LOG_VERBOSE("FwdLockEngine::onInitialize -- FwdLockGlue_InitializeKeyEncryption succeeded"); - } else { - ALOGE("FwdLockEngine::onInitialize -- FwdLockGlue_InitializeKeyEncryption failed:" - "errno = %d", errno); - } - - return DRM_NO_ERROR; -} - -android::status_t -FwdLockEngine::onSetOnInfoListener(int uniqueId, const IDrmEngine::OnInfoListener* infoListener) { - // Not used - LOG_VERBOSE("FwdLockEngine::onSetOnInfoListener"); - - return DRM_NO_ERROR; -} - -android::status_t FwdLockEngine::onTerminate(int uniqueId) { - LOG_VERBOSE("FwdLockEngine::onTerminate"); - - return DRM_NO_ERROR; -} - -// make sure that lower-case letters are used. -const String8 FwdLockEngine::FileSuffixes[] = { - String8(".fl"), - String8(".dm"), -}; - -// make sure that lower-case letters are used. -const String8 FwdLockEngine::MimeTypes[] = { - String8("application/x-android-drm-fl"), - String8("application/vnd.oma.drm.message"), -}; - -const String8 FwdLockEngine::Description("OMA V1 Forward Lock"); - -void FwdLockEngine::AddSupportedMimeTypes(DrmSupportInfo *info) { - for (size_t i = 0, n = sizeof(MimeTypes)/sizeof(MimeTypes[0]); i < n; ++i) { - info->addMimeType(MimeTypes[i]); - } -} - -void FwdLockEngine::AddSupportedFileSuffixes(DrmSupportInfo *info) { - for (size_t i = 0, n = sizeof(FileSuffixes)/sizeof(FileSuffixes[0]); i < n; ++i) { - info->addFileSuffix(FileSuffixes[i]); - } -} - -bool FwdLockEngine::IsMimeTypeSupported(const String8& mime) { - String8 tmp(mime); - tmp.toLower(); - for (size_t i = 0, n = sizeof(MimeTypes)/sizeof(MimeTypes[0]); i < n; ++i) { - if (tmp == MimeTypes[i]) { - return true; - } - } - return false; -} - -bool FwdLockEngine::IsFileSuffixSupported(const String8& suffix) { - String8 tmp(suffix); - tmp.toLower(); - for (size_t i = 0, n = sizeof(FileSuffixes)/sizeof(FileSuffixes[0]); i < n; ++i) { - if (tmp == FileSuffixes[i]) { - return true; - } - } - return false; -} - -DrmSupportInfo* FwdLockEngine::onGetSupportInfo(int uniqueId) { - DrmSupportInfo* pSupportInfo = new DrmSupportInfo(); - - LOG_VERBOSE("FwdLockEngine::onGetSupportInfo"); - - // fill all Forward Lock mimetypes and extensions - if (NULL != pSupportInfo) { - AddSupportedMimeTypes(pSupportInfo); - AddSupportedFileSuffixes(pSupportInfo); - pSupportInfo->setDescription(Description); - } - - return pSupportInfo; -} - -bool FwdLockEngine::onCanHandle(int uniqueId, const String8& path) { - bool result = false; - - String8 extString = path.getPathExtension(); - return IsFileSuffixSupported(extString); -} - -DrmInfoStatus* FwdLockEngine::onProcessDrmInfo(int uniqueId, const DrmInfo* drmInfo) { - DrmInfoStatus *drmInfoStatus = NULL; - - // Nothing to process - - drmInfoStatus = new DrmInfoStatus((int)DrmInfoStatus::STATUS_OK, 0, NULL, String8("")); - - LOG_VERBOSE("FwdLockEngine::onProcessDrmInfo"); - - return drmInfoStatus; -} - -status_t FwdLockEngine::onSaveRights( - int uniqueId, - const DrmRights& drmRights, - const String8& rightsPath, - const String8& contentPath) { - // No rights to save. Return - LOG_VERBOSE("FwdLockEngine::onSaveRights"); - return DRM_ERROR_UNKNOWN; -} - -DrmInfo* FwdLockEngine::onAcquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest) { - DrmInfo* drmInfo = NULL; - - // Nothing to be done for Forward Lock file - LOG_VERBOSE("FwdLockEngine::onAcquireDrmInfo"); - - return drmInfo; -} - -int FwdLockEngine::onCheckRightsStatus(int uniqueId, - const String8& path, - int action) { - int result = RightsStatus::RIGHTS_INVALID; - - LOG_VERBOSE("FwdLockEngine::onCheckRightsStatus"); - - // Only Transfer action is not allowed for forward Lock files. - if (onCanHandle(uniqueId, path)) { - switch(action) { - case Action::DEFAULT: - case Action::PLAY: - case Action::RINGTONE: - case Action::OUTPUT: - case Action::PREVIEW: - case Action::EXECUTE: - case Action::DISPLAY: - result = RightsStatus::RIGHTS_VALID; - break; - - case Action::TRANSFER: - default: - result = RightsStatus::RIGHTS_INVALID; - break; - } - } - - return result; -} - -status_t FwdLockEngine::onConsumeRights(int uniqueId, - DecryptHandle* decryptHandle, - int action, - bool reserve) { - // No rights consumption - LOG_VERBOSE("FwdLockEngine::onConsumeRights"); - return DRM_NO_ERROR; -} - -bool FwdLockEngine::onValidateAction(int uniqueId, - const String8& path, - int action, - const ActionDescription& description) { - LOG_VERBOSE("FwdLockEngine::onValidateAction"); - - // For the forwardlock engine checkRights and ValidateAction are the same. - return (onCheckRightsStatus(uniqueId, path, action) == RightsStatus::RIGHTS_VALID); -} - -String8 FwdLockEngine::onGetOriginalMimeType(int uniqueId, const String8& path) { - LOG_VERBOSE("FwdLockEngine::onGetOriginalMimeType"); - String8 mimeString = String8(""); - int fileDesc = FwdLockFile_open(path.string()); - - if (-1 < fileDesc) { - const char* pMimeType = FwdLockFile_GetContentType(fileDesc); - - if (NULL != pMimeType) { - String8 contentType = String8(pMimeType); - contentType.toLower(); - mimeString = MimeTypeUtil::convertMimeType(contentType); - } - - FwdLockFile_close(fileDesc); - } - - return mimeString; -} - -int FwdLockEngine::onGetDrmObjectType(int uniqueId, - const String8& path, - const String8& mimeType) { - String8 mimeStr = String8(mimeType); - - LOG_VERBOSE("FwdLockEngine::onGetDrmObjectType"); - - /* Checks whether - * 1. path and mime type both are not empty strings (meaning unavailable) else content is unknown - * 2. if one of them is empty string and if other is known then its a DRM Content Object. - * 3. if both of them are available, then both may be of known type - * (regardless of the relation between them to make it compatible with other DRM Engines) - */ - if (((0 == path.length()) || onCanHandle(uniqueId, path)) && - ((0 == mimeType.length()) || IsMimeTypeSupported(mimeType)) && (mimeType != path) ) { - return DrmObjectType::CONTENT; - } - - return DrmObjectType::UNKNOWN; -} - -status_t FwdLockEngine::onRemoveRights(int uniqueId, const String8& path) { - // No Rights to remove - LOG_VERBOSE("FwdLockEngine::onRemoveRights"); - return DRM_NO_ERROR; -} - -status_t FwdLockEngine::onRemoveAllRights(int uniqueId) { - // No rights to remove - LOG_VERBOSE("FwdLockEngine::onRemoveAllRights"); - return DRM_NO_ERROR; -} - -#ifdef USE_64BIT_DRM_API -status_t FwdLockEngine::onSetPlaybackStatus(int uniqueId, DecryptHandle* decryptHandle, - int playbackStatus, int64_t position) { -#else -status_t FwdLockEngine::onSetPlaybackStatus(int uniqueId, DecryptHandle* decryptHandle, - int playbackStatus, int position) { -#endif - // Not used - LOG_VERBOSE("FwdLockEngine::onSetPlaybackStatus"); - return DRM_NO_ERROR; -} - -status_t FwdLockEngine::onOpenConvertSession(int uniqueId, - int convertId) { - status_t result = DRM_ERROR_UNKNOWN; - LOG_VERBOSE("FwdLockEngine::onOpenConvertSession"); - if (!convertSessionMap.isCreated(convertId)) { - ConvertSession *newSession = new ConvertSession(); - if (FwdLockConv_Status_OK == - FwdLockConv_OpenSession(&(newSession->uniqueId), &(newSession->output))) { - convertSessionMap.addValue(convertId, newSession); - result = DRM_NO_ERROR; - } else { - ALOGE("FwdLockEngine::onOpenConvertSession -- FwdLockConv_OpenSession failed."); - delete newSession; - } - } - return result; -} - -DrmConvertedStatus* FwdLockEngine::onConvertData(int uniqueId, - int convertId, - const DrmBuffer* inputData) { - FwdLockConv_Status_t retStatus = FwdLockConv_Status_InvalidArgument; - DrmBuffer *convResult = new DrmBuffer(NULL, 0); - int offset = -1; - - if (NULL != inputData && convertSessionMap.isCreated(convertId)) { - ConvertSession *convSession = convertSessionMap.getValue(convertId); - - if (NULL != convSession) { - retStatus = FwdLockConv_ConvertData(convSession->uniqueId, - inputData->data, - inputData->length, - &(convSession->output)); - - if (FwdLockConv_Status_OK == retStatus) { - // return bytes from conversion if available - if (convSession->output.fromConvertData.numBytes > 0) { - convResult->data = new char[convSession->output.fromConvertData.numBytes]; - - if (NULL != convResult->data) { - convResult->length = convSession->output.fromConvertData.numBytes; - memcpy(convResult->data, - (char *)convSession->output.fromConvertData.pBuffer, - convResult->length); - } - } - } else { - offset = convSession->output.fromConvertData.errorPos; - } - } - } - return new DrmConvertedStatus(getConvertedStatus(retStatus), convResult, offset); -} - -DrmConvertedStatus* FwdLockEngine::onCloseConvertSession(int uniqueId, - int convertId) { - FwdLockConv_Status_t retStatus = FwdLockConv_Status_InvalidArgument; - DrmBuffer *convResult = new DrmBuffer(NULL, 0); - int offset = -1; - - LOG_VERBOSE("FwdLockEngine::onCloseConvertSession"); - - if (convertSessionMap.isCreated(convertId)) { - ConvertSession *convSession = convertSessionMap.getValue(convertId); - - if (NULL != convSession) { - retStatus = FwdLockConv_CloseSession(convSession->uniqueId, &(convSession->output)); - - if (FwdLockConv_Status_OK == retStatus) { - offset = convSession->output.fromCloseSession.fileOffset; - convResult->data = new char[FWD_LOCK_SIGNATURES_SIZE]; - - if (NULL != convResult->data) { - convResult->length = FWD_LOCK_SIGNATURES_SIZE; - memcpy(convResult->data, - (char *)convSession->output.fromCloseSession.signatures, - convResult->length); - } - } - } - convertSessionMap.removeValue(convertId); - } - return new DrmConvertedStatus(getConvertedStatus(retStatus), convResult, offset); -} - -#ifdef USE_64BIT_DRM_API -status_t FwdLockEngine::onOpenDecryptSession(int uniqueId, - DecryptHandle* decryptHandle, - int fd, - off64_t offset, - off64_t length) { -#else -status_t FwdLockEngine::onOpenDecryptSession(int uniqueId, - DecryptHandle* decryptHandle, - int fd, - int offset, - int length) { -#endif - status_t result = DRM_ERROR_CANNOT_HANDLE; - int fileDesc = -1; - - LOG_VERBOSE("FwdLockEngine::onOpenDecryptSession"); - - if ((-1 < fd) && - (NULL != decryptHandle) && - (!decodeSessionMap.isCreated(decryptHandle->decryptId))) { - fileDesc = dup(fd); - } else { - ALOGE("FwdLockEngine::onOpenDecryptSession parameter error"); - return result; - } - - if (-1 < fileDesc && - -1 < ::lseek(fileDesc, offset, SEEK_SET) && - -1 < FwdLockFile_attach(fileDesc)) { - // check for file integrity. This must be done to protect the content mangling. - int retVal = FwdLockFile_CheckHeaderIntegrity(fileDesc); - DecodeSession* decodeSession = new DecodeSession(fileDesc); - - if (retVal && NULL != decodeSession) { - decodeSessionMap.addValue(decryptHandle->decryptId, decodeSession); - const char *pmime= FwdLockFile_GetContentType(fileDesc); - String8 contentType = String8(pmime == NULL ? "" : pmime); - contentType.toLower(); - decryptHandle->mimeType = MimeTypeUtil::convertMimeType(contentType); - decryptHandle->decryptApiType = DecryptApiType::CONTAINER_BASED; - decryptHandle->status = RightsStatus::RIGHTS_VALID; - decryptHandle->decryptInfo = NULL; - result = DRM_NO_ERROR; - } else { - LOG_VERBOSE("FwdLockEngine::onOpenDecryptSession Integrity Check failed for the fd"); - FwdLockFile_detach(fileDesc); - delete decodeSession; - } - } - - if (DRM_NO_ERROR != result && -1 < fileDesc) { - ::close(fileDesc); - } - - LOG_VERBOSE("FwdLockEngine::onOpenDecryptSession Exit. result = %d", result); - - return result; -} - -status_t FwdLockEngine::onOpenDecryptSession(int uniqueId, - DecryptHandle* decryptHandle, - const char* uri) { - status_t result = DRM_ERROR_CANNOT_HANDLE; - const char fileTag [] = "file://"; - - if (NULL != decryptHandle && NULL != uri && strlen(uri) > sizeof(fileTag)) { - String8 uriTag = String8(uri); - uriTag.toLower(); - - if (0 == strncmp(uriTag.string(), fileTag, sizeof(fileTag) - 1)) { - const char *filePath = strchr(uri + sizeof(fileTag) - 1, '/'); - if (NULL != filePath && onCanHandle(uniqueId, String8(filePath))) { - int fd = open(filePath, O_RDONLY); - - if (-1 < fd) { - // offset is always 0 and length is not used. so any positive size. - result = onOpenDecryptSession(uniqueId, decryptHandle, fd, 0, 1); - - // fd is duplicated already if success. closing the file - close(fd); - } - } - } - } - - return result; -} - -status_t FwdLockEngine::onCloseDecryptSession(int uniqueId, - DecryptHandle* decryptHandle) { - status_t result = DRM_ERROR_UNKNOWN; - LOG_VERBOSE("FwdLockEngine::onCloseDecryptSession"); - - if (NULL != decryptHandle && decodeSessionMap.isCreated(decryptHandle->decryptId)) { - DecodeSession* session = decodeSessionMap.getValue(decryptHandle->decryptId); - if (NULL != session && session->fileDesc > -1) { - FwdLockFile_detach(session->fileDesc); - ::close(session->fileDesc); - decodeSessionMap.removeValue(decryptHandle->decryptId); - result = DRM_NO_ERROR; - } - } - - if (NULL != decryptHandle) { - if (NULL != decryptHandle->decryptInfo) { - delete decryptHandle->decryptInfo; - decryptHandle->decryptInfo = NULL; - } - - decryptHandle->copyControlVector.clear(); - decryptHandle->extendedData.clear(); - - delete decryptHandle; - decryptHandle = NULL; - } - - LOG_VERBOSE("FwdLockEngine::onCloseDecryptSession Exit"); - return result; -} - -status_t FwdLockEngine::onInitializeDecryptUnit(int uniqueId, - DecryptHandle* decryptHandle, - int decryptUnitId, - const DrmBuffer* headerInfo) { - ALOGE("FwdLockEngine::onInitializeDecryptUnit is not supported for this DRM scheme"); - return DRM_ERROR_UNKNOWN; -} - -status_t FwdLockEngine::onDecrypt(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, - const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) { - ALOGE("FwdLockEngine::onDecrypt is not supported for this DRM scheme"); - return DRM_ERROR_UNKNOWN; -} - -status_t FwdLockEngine::onDecrypt(int uniqueId, - DecryptHandle* decryptHandle, - int decryptUnitId, - const DrmBuffer* encBuffer, - DrmBuffer** decBuffer) { - ALOGE("FwdLockEngine::onDecrypt is not supported for this DRM scheme"); - return DRM_ERROR_UNKNOWN; -} - -status_t FwdLockEngine::onFinalizeDecryptUnit(int uniqueId, - DecryptHandle* decryptHandle, - int decryptUnitId) { - ALOGE("FwdLockEngine::onFinalizeDecryptUnit is not supported for this DRM scheme"); - return DRM_ERROR_UNKNOWN; -} - -ssize_t FwdLockEngine::onRead(int uniqueId, - DecryptHandle* decryptHandle, - void* buffer, - int numBytes) { - ssize_t size = -1; - - if (NULL != decryptHandle && - decodeSessionMap.isCreated(decryptHandle->decryptId) && - NULL != buffer && - numBytes > -1) { - DecodeSession* session = decodeSessionMap.getValue(decryptHandle->decryptId); - if (NULL != session && session->fileDesc > -1) { - size = FwdLockFile_read(session->fileDesc, buffer, numBytes); - - if (0 > size) { - session->offset = ((off_t)-1); - } else { - session->offset += size; - } - } - } - - return size; -} - -#ifdef USE_64BIT_DRM_API -off64_t FwdLockEngine::onLseek(int uniqueId, DecryptHandle* decryptHandle, - off64_t offset, int whence) { -#else -off_t FwdLockEngine::onLseek(int uniqueId, DecryptHandle* decryptHandle, - off_t offset, int whence) { -#endif - off_t offval = -1; - - if (NULL != decryptHandle && decodeSessionMap.isCreated(decryptHandle->decryptId)) { - DecodeSession* session = decodeSessionMap.getValue(decryptHandle->decryptId); - if (NULL != session && session->fileDesc > -1) { - offval = FwdLockFile_lseek(session->fileDesc, offset, whence); - session->offset = offval; - } - } - - return offval; -} - -#ifdef USE_64BIT_DRM_API -ssize_t FwdLockEngine::onPread(int uniqueId, - DecryptHandle* decryptHandle, - void* buffer, - ssize_t numBytes, - off64_t offset) { -#else -ssize_t FwdLockEngine::onPread(int uniqueId, - DecryptHandle* decryptHandle, - void* buffer, - ssize_t numBytes, - off_t offset) { -#endif - ssize_t bytesRead = -1; - - DecodeSession* decoderSession = NULL; - - if ((NULL != decryptHandle) && - (NULL != (decoderSession = decodeSessionMap.getValue(decryptHandle->decryptId))) && - (NULL != buffer) && - (numBytes > -1) && - (offset > -1)) { - if (offset != decoderSession->offset) { - decoderSession->offset = onLseek(uniqueId, decryptHandle, offset, SEEK_SET); - } - - if (((off_t)-1) != decoderSession->offset) { - bytesRead = onRead(uniqueId, decryptHandle, buffer, numBytes); - if (bytesRead < 0) { - ALOGE("FwdLockEngine::onPread error reading"); - } - } - } else { - ALOGE("FwdLockEngine::onPread decryptId not found"); - } - - return bytesRead; -} diff --git a/drm/libdrmframework/plugins/forward-lock/internal-format/Android.mk b/drm/libdrmframework/plugins/forward-lock/internal-format/Android.mk deleted file mode 100644 index 9ee7961..0000000 --- a/drm/libdrmframework/plugins/forward-lock/internal-format/Android.mk +++ /dev/null @@ -1,16 +0,0 @@ -# -# Copyright (C) 2010 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -include $(call all-subdir-makefiles) diff --git a/drm/libdrmframework/plugins/forward-lock/internal-format/common/Android.mk b/drm/libdrmframework/plugins/forward-lock/internal-format/common/Android.mk deleted file mode 100644 index 6c5d3cf..0000000 --- a/drm/libdrmframework/plugins/forward-lock/internal-format/common/Android.mk +++ /dev/null @@ -1,32 +0,0 @@ -# -# Copyright (C) 2010 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := \ - FwdLockGlue.c - -LOCAL_C_INCLUDES := \ - external/openssl/include - -LOCAL_SHARED_LIBRARIES := libcrypto - -LOCAL_MODULE := libfwdlock-common - -LOCAL_MODULE_TAGS := optional - -include $(BUILD_STATIC_LIBRARY) diff --git a/drm/libdrmframework/plugins/forward-lock/internal-format/common/FwdLockGlue.c b/drm/libdrmframework/plugins/forward-lock/internal-format/common/FwdLockGlue.c deleted file mode 100644 index 92bda8f..0000000 --- a/drm/libdrmframework/plugins/forward-lock/internal-format/common/FwdLockGlue.c +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <assert.h> -#include <errno.h> -#include <fcntl.h> -#include <pthread.h> -#include <stdlib.h> -#include <string.h> -#include <sys/stat.h> -#include <unistd.h> -#include <openssl/aes.h> - -#include "FwdLockGlue.h" - -#define TRUE 1 -#define FALSE 0 - -#define KEY_SIZE 16 -#define KEY_SIZE_IN_BITS (KEY_SIZE * 8) - -static int isInitialized = FALSE; - -static const char strKeyFilename[] = "/data/drm/fwdlock/kek.dat"; - -static AES_KEY encryptionRoundKeys; -static AES_KEY decryptionRoundKeys; - -/** - * Creates all directories along the fully qualified path of the given file. - * - * @param[in] path A reference to the fully qualified path of a file. - * @param[in] mode The access mode to use for the directories being created. - * - * @return A Boolean value indicating whether the operation was successful. - */ -static int FwdLockGlue_CreateDirectories(const char *path, mode_t mode) { - int result = TRUE; - size_t partialPathLength = strlen(path); - char *partialPath = malloc(partialPathLength + 1); - if (partialPath == NULL) { - result = FALSE; - } else { - size_t i; - for (i = 0; i < partialPathLength; ++i) { - if (path[i] == '/' && i > 0) { - partialPath[i] = '\0'; - if (mkdir(partialPath, mode) != 0 && errno != EEXIST) { - result = FALSE; - break; - } - } - partialPath[i] = path[i]; - } - free(partialPath); - } - return result; -} - -/** - * Initializes the round keys used for encryption and decryption of session keys. First creates a - * device-unique key-encryption key if none exists yet. - */ -static void FwdLockGlue_InitializeRoundKeys() { - unsigned char keyEncryptionKey[KEY_SIZE]; - int fileDesc = open(strKeyFilename, O_RDONLY); - if (fileDesc >= 0) { - if (read(fileDesc, keyEncryptionKey, KEY_SIZE) == KEY_SIZE) { - isInitialized = TRUE; - } - (void)close(fileDesc); - } else if (errno == ENOENT && - FwdLockGlue_GetRandomNumber(keyEncryptionKey, KEY_SIZE) && - FwdLockGlue_CreateDirectories(strKeyFilename, S_IRWXU)) { - fileDesc = open(strKeyFilename, O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR); - if (fileDesc >= 0) { - if (write(fileDesc, keyEncryptionKey, KEY_SIZE) == KEY_SIZE) { - isInitialized = TRUE; - } - (void)close(fileDesc); - } - } - if (isInitialized) { - if (AES_set_encrypt_key(keyEncryptionKey, KEY_SIZE_IN_BITS, &encryptionRoundKeys) != 0 || - AES_set_decrypt_key(keyEncryptionKey, KEY_SIZE_IN_BITS, &decryptionRoundKeys) != 0) { - isInitialized = FALSE; - } - } - memset(keyEncryptionKey, 0, KEY_SIZE); // Zero out key data. -} - -/** - * Validates the padding of a decrypted key. - * - * @param[in] pData A reference to the buffer containing the decrypted key and padding. - * @param[in] decryptedKeyLength The length in bytes of the decrypted key. - * - * @return A Boolean value indicating whether the padding was valid. - */ -static int FwdLockGlue_ValidatePadding(const unsigned char *pData, size_t decryptedKeyLength) { - size_t i; - size_t padding = AES_BLOCK_SIZE - (decryptedKeyLength % AES_BLOCK_SIZE); - pData += decryptedKeyLength; - for (i = 0; i < padding; ++i) { - if ((size_t)*pData != padding) { - return FALSE; - } - ++pData; - } - return TRUE; -} - -int FwdLockGlue_GetRandomNumber(void *pBuffer, size_t numBytes) { - // Generate 'cryptographically secure' random bytes by reading them from "/dev/urandom" (the - // non-blocking version of "/dev/random"). - ssize_t numBytesRead = 0; - int fileDesc = open("/dev/urandom", O_RDONLY); - if (fileDesc >= 0) { - numBytesRead = read(fileDesc, pBuffer, numBytes); - (void)close(fileDesc); - } - return numBytesRead >= 0 && (size_t)numBytesRead == numBytes; -} - -int FwdLockGlue_InitializeKeyEncryption() { - static pthread_once_t once = PTHREAD_ONCE_INIT; - pthread_once(&once, FwdLockGlue_InitializeRoundKeys); - return isInitialized; -} - -size_t FwdLockGlue_GetEncryptedKeyLength(size_t plaintextKeyLength) { - return ((plaintextKeyLength / AES_BLOCK_SIZE) + 2) * AES_BLOCK_SIZE; -} - -int FwdLockGlue_EncryptKey(const void *pPlaintextKey, - size_t plaintextKeyLength, - void *pEncryptedKey, - size_t encryptedKeyLength) { - int result = FALSE; - assert(encryptedKeyLength == FwdLockGlue_GetEncryptedKeyLength(plaintextKeyLength)); - if (FwdLockGlue_InitializeKeyEncryption()) { - unsigned char initVector[AES_BLOCK_SIZE]; - if (FwdLockGlue_GetRandomNumber(initVector, AES_BLOCK_SIZE)) { - size_t padding = AES_BLOCK_SIZE - (plaintextKeyLength % AES_BLOCK_SIZE); - size_t dataLength = encryptedKeyLength - AES_BLOCK_SIZE; - memcpy(pEncryptedKey, pPlaintextKey, plaintextKeyLength); - memset((unsigned char *)pEncryptedKey + plaintextKeyLength, (int)padding, padding); - memcpy((unsigned char *)pEncryptedKey + dataLength, initVector, AES_BLOCK_SIZE); - AES_cbc_encrypt(pEncryptedKey, pEncryptedKey, dataLength, &encryptionRoundKeys, - initVector, AES_ENCRYPT); - result = TRUE; - } - } - return result; -} - -int FwdLockGlue_DecryptKey(const void *pEncryptedKey, - size_t encryptedKeyLength, - void *pDecryptedKey, - size_t decryptedKeyLength) { - int result = FALSE; - assert(encryptedKeyLength == FwdLockGlue_GetEncryptedKeyLength(decryptedKeyLength)); - if (FwdLockGlue_InitializeKeyEncryption()) { - size_t dataLength = encryptedKeyLength - AES_BLOCK_SIZE; - unsigned char *pData = malloc(dataLength); - if (pData != NULL) { - unsigned char initVector[AES_BLOCK_SIZE]; - memcpy(pData, pEncryptedKey, dataLength); - memcpy(initVector, (const unsigned char *)pEncryptedKey + dataLength, AES_BLOCK_SIZE); - AES_cbc_encrypt(pData, pData, dataLength, &decryptionRoundKeys, initVector, - AES_DECRYPT); - memcpy(pDecryptedKey, pData, decryptedKeyLength); - result = FwdLockGlue_ValidatePadding(pData, decryptedKeyLength); - free(pData); - } - } - return result; -} diff --git a/drm/libdrmframework/plugins/forward-lock/internal-format/common/FwdLockGlue.h b/drm/libdrmframework/plugins/forward-lock/internal-format/common/FwdLockGlue.h deleted file mode 100644 index f36f6ea..0000000 --- a/drm/libdrmframework/plugins/forward-lock/internal-format/common/FwdLockGlue.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __FWDLOCKGLUE_H__ -#define __FWDLOCKGLUE_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Generates the specified number of cryptographically secure random bytes. - * - * @param[out] pBuffer A reference to the buffer that should receive the random data. - * @param[in] numBytes The number of random bytes to generate. - * - * @return A Boolean value indicating whether the operation was successful. - */ -int FwdLockGlue_GetRandomNumber(void *pBuffer, size_t numBytes); - -/** - * Performs initialization of the key-encryption key. Should be called once during startup to - * facilitate encryption and decryption of session keys. - * - * @return A Boolean value indicating whether the operation was successful. - */ -int FwdLockGlue_InitializeKeyEncryption(); - -/** - * Returns the length of the encrypted key, given the length of the plaintext key. - * - * @param[in] plaintextKeyLength The length in bytes of the plaintext key. - * - * @return The length in bytes of the encrypted key. - */ -size_t FwdLockGlue_GetEncryptedKeyLength(size_t plaintextKeyLength); - -/** - * Encrypts the given session key using a key-encryption key unique to this device. - * - * @param[in] pPlaintextKey A reference to the buffer containing the plaintext key. - * @param[in] plaintextKeyLength The length in bytes of the plaintext key. - * @param[out] pEncryptedKey A reference to the buffer containing the encrypted key. - * @param[in] encryptedKeyLength The length in bytes of the encrypted key. - * - * @return A Boolean value indicating whether the operation was successful. - */ -int FwdLockGlue_EncryptKey(const void *pPlaintextKey, - size_t plaintextKeyLength, - void *pEncryptedKey, - size_t encryptedKeyLength); - -/** - * Decrypts the given session key using a key-encryption key unique to this device. - * - * @param[in] pEncryptedKey A reference to the buffer containing the encrypted key. - * @param[in] encryptedKeyLength The length in bytes of the encrypted key. - * @param[out] pDecryptedKey A reference to the buffer containing the decrypted key. - * @param[in] decryptedKeyLength The length in bytes of the decrypted key. - * - * @return A Boolean value indicating whether the operation was successful. - */ -int FwdLockGlue_DecryptKey(const void *pEncryptedKey, - size_t encryptedKeyLength, - void *pDecryptedKey, - size_t decryptedKeyLength); - -#ifdef __cplusplus -} -#endif - -#endif // __FWDLOCKGLUE_H__ diff --git a/drm/libdrmframework/plugins/forward-lock/internal-format/converter/Android.mk b/drm/libdrmframework/plugins/forward-lock/internal-format/converter/Android.mk deleted file mode 100644 index 00bb788..0000000 --- a/drm/libdrmframework/plugins/forward-lock/internal-format/converter/Android.mk +++ /dev/null @@ -1,37 +0,0 @@ -# -# Copyright (C) 2010 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := \ - FwdLockConv.c - -LOCAL_C_INCLUDES := \ - frameworks/base/drm/libdrmframework/plugins/forward-lock/internal-format/common \ - external/openssl/include - -LOCAL_SHARED_LIBRARIES := libcrypto - -LOCAL_WHOLE_STATIC_LIBRARIES := libfwdlock-common - -LOCAL_STATIC_LIBRARIES := libfwdlock-common - -LOCAL_MODULE := libfwdlock-converter - -LOCAL_MODULE_TAGS := optional - -include $(BUILD_STATIC_LIBRARY) diff --git a/drm/libdrmframework/plugins/forward-lock/internal-format/converter/FwdLockConv.c b/drm/libdrmframework/plugins/forward-lock/internal-format/converter/FwdLockConv.c deleted file mode 100644 index 299116d..0000000 --- a/drm/libdrmframework/plugins/forward-lock/internal-format/converter/FwdLockConv.c +++ /dev/null @@ -1,1347 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <assert.h> -#include <ctype.h> -#include <fcntl.h> -#include <limits.h> -#include <pthread.h> -#include <string.h> -#include <sys/stat.h> -#include <unistd.h> -#include <openssl/aes.h> -#include <openssl/hmac.h> - -#include "FwdLockConv.h" -#include "FwdLockGlue.h" - -#define TRUE 1 -#define FALSE 0 - -#define INVALID_OFFSET ((off64_t)-1) - -#define MAX_NUM_SESSIONS 32 - -#define OUTPUT_BUFFER_SIZE_INCREMENT 1024 -#define READ_BUFFER_SIZE 1024 - -#define MAX_BOUNDARY_LENGTH 70 -#define MAX_DELIMITER_LENGTH (MAX_BOUNDARY_LENGTH + 4) - -#define STRING_LENGTH_INCREMENT 25 - -#define KEY_SIZE AES_BLOCK_SIZE -#define KEY_SIZE_IN_BITS (KEY_SIZE * 8) - -#define SHA1_HASH_SIZE 20 - -#define FWD_LOCK_VERSION 0 -#define FWD_LOCK_SUBFORMAT 0 -#define USAGE_RESTRICTION_FLAGS 0 -#define CONTENT_TYPE_LENGTH_POS 7 -#define TOP_HEADER_SIZE 8 - -/** - * Data type for the parser states of the converter. - */ -typedef enum FwdLockConv_ParserState { - FwdLockConv_ParserState_WantsOpenDelimiter, - FwdLockConv_ParserState_WantsMimeHeaders, - FwdLockConv_ParserState_WantsBinaryEncodedData, - FwdLockConv_ParserState_WantsBase64EncodedData, - FwdLockConv_ParserState_Done -} FwdLockConv_ParserState_t; - -/** - * Data type for the scanner states of the converter. - */ -typedef enum FwdLockConv_ScannerState { - FwdLockConv_ScannerState_WantsFirstDash, - FwdLockConv_ScannerState_WantsSecondDash, - FwdLockConv_ScannerState_WantsCR, - FwdLockConv_ScannerState_WantsLF, - FwdLockConv_ScannerState_WantsBoundary, - FwdLockConv_ScannerState_WantsBoundaryEnd, - FwdLockConv_ScannerState_WantsMimeHeaderNameStart, - FwdLockConv_ScannerState_WantsMimeHeaderName, - FwdLockConv_ScannerState_WantsMimeHeaderNameEnd, - FwdLockConv_ScannerState_WantsContentTypeStart, - FwdLockConv_ScannerState_WantsContentType, - FwdLockConv_ScannerState_WantsContentTransferEncodingStart, - FwdLockConv_ScannerState_Wants_A_OR_I, - FwdLockConv_ScannerState_Wants_N, - FwdLockConv_ScannerState_Wants_A, - FwdLockConv_ScannerState_Wants_R, - FwdLockConv_ScannerState_Wants_Y, - FwdLockConv_ScannerState_Wants_S, - FwdLockConv_ScannerState_Wants_E, - FwdLockConv_ScannerState_Wants_6, - FwdLockConv_ScannerState_Wants_4, - FwdLockConv_ScannerState_Wants_B, - FwdLockConv_ScannerState_Wants_I, - FwdLockConv_ScannerState_Wants_T, - FwdLockConv_ScannerState_WantsContentTransferEncodingEnd, - FwdLockConv_ScannerState_WantsMimeHeaderValueEnd, - FwdLockConv_ScannerState_WantsMimeHeadersEnd, - FwdLockConv_ScannerState_WantsByte1, - FwdLockConv_ScannerState_WantsByte1_AfterCRLF, - FwdLockConv_ScannerState_WantsByte2, - FwdLockConv_ScannerState_WantsByte3, - FwdLockConv_ScannerState_WantsByte4, - FwdLockConv_ScannerState_WantsPadding, - FwdLockConv_ScannerState_WantsWhitespace, - FwdLockConv_ScannerState_WantsWhitespace_AfterCRLF, - FwdLockConv_ScannerState_WantsDelimiter -} FwdLockConv_ScannerState_t; - -/** - * Data type for the content transfer encoding. - */ -typedef enum FwdLockConv_ContentTransferEncoding { - FwdLockConv_ContentTransferEncoding_Undefined, - FwdLockConv_ContentTransferEncoding_Binary, - FwdLockConv_ContentTransferEncoding_Base64 -} FwdLockConv_ContentTransferEncoding_t; - -/** - * Data type for a dynamically growing string. - */ -typedef struct FwdLockConv_String { - char *ptr; - size_t length; - size_t maxLength; - size_t lengthIncrement; -} FwdLockConv_String_t; - -/** - * Data type for the per-file state information needed by the converter. - */ -typedef struct FwdLockConv_Session { - FwdLockConv_ParserState_t parserState; - FwdLockConv_ScannerState_t scannerState; - FwdLockConv_ScannerState_t savedScannerState; - off64_t numCharsConsumed; - char delimiter[MAX_DELIMITER_LENGTH]; - size_t delimiterLength; - size_t delimiterMatchPos; - FwdLockConv_String_t mimeHeaderName; - FwdLockConv_String_t contentType; - FwdLockConv_ContentTransferEncoding_t contentTransferEncoding; - unsigned char sessionKey[KEY_SIZE]; - void *pEncryptedSessionKey; - size_t encryptedSessionKeyLength; - AES_KEY encryptionRoundKeys; - HMAC_CTX signingContext; - unsigned char topHeader[TOP_HEADER_SIZE]; - unsigned char counter[AES_BLOCK_SIZE]; - unsigned char keyStream[AES_BLOCK_SIZE]; - int keyStreamIndex; - unsigned char ch; - size_t outputBufferSize; - size_t dataOffset; - size_t numDataBytes; -} FwdLockConv_Session_t; - -static FwdLockConv_Session_t *sessionPtrs[MAX_NUM_SESSIONS] = { NULL }; - -static pthread_mutex_t sessionAcquisitionMutex = PTHREAD_MUTEX_INITIALIZER; - -static const FwdLockConv_String_t nullString = { NULL, 0, 0, STRING_LENGTH_INCREMENT }; - -static const unsigned char topHeaderTemplate[] = - { 'F', 'W', 'L', 'K', FWD_LOCK_VERSION, FWD_LOCK_SUBFORMAT, USAGE_RESTRICTION_FLAGS }; - -static const char strContent[] = "content-"; -static const char strType[] = "type"; -static const char strTransferEncoding[] = "transfer-encoding"; -static const char strTextPlain[] = "text/plain"; -static const char strApplicationVndOmaDrmRightsXml[] = "application/vnd.oma.drm.rights+xml"; -static const char strApplicationVndOmaDrmContent[] = "application/vnd.oma.drm.content"; - -static const size_t strlenContent = sizeof strContent - 1; -static const size_t strlenTextPlain = sizeof strTextPlain - 1; - -static const signed char base64Values[] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -2, -1, -1, - -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, - -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 -}; - -/** - * Acquires an unused converter session. - * - * @return A session ID. - */ -static int FwdLockConv_AcquireSession() { - int sessionId = -1; - int i; - pthread_mutex_lock(&sessionAcquisitionMutex); - for (i = 0; i < MAX_NUM_SESSIONS; ++i) { - if (sessionPtrs[i] == NULL) { - sessionPtrs[i] = malloc(sizeof *sessionPtrs[i]); - if (sessionPtrs[i] != NULL) { - sessionId = i; - } - break; - } - } - pthread_mutex_unlock(&sessionAcquisitionMutex); - return sessionId; -} - -/** - * Checks whether a session ID is in range and currently in use. - * - * @param[in] sessionID A session ID. - * - * @return A Boolean value indicating whether the session ID is in range and currently in use. - */ -static int FwdLockConv_IsValidSession(int sessionId) { - return 0 <= sessionId && sessionId < MAX_NUM_SESSIONS && sessionPtrs[sessionId] != NULL; -} - -/** - * Releases a converter session. - * - * @param[in] sessionID A session ID. - */ -static void FwdLockConv_ReleaseSession(int sessionId) { - pthread_mutex_lock(&sessionAcquisitionMutex); - assert(FwdLockConv_IsValidSession(sessionId)); - memset(sessionPtrs[sessionId], 0, sizeof *sessionPtrs[sessionId]); // Zero out key data. - free(sessionPtrs[sessionId]); - sessionPtrs[sessionId] = NULL; - pthread_mutex_unlock(&sessionAcquisitionMutex); -} - -/** - * Derives cryptographically independent keys for encryption and signing from the session key. - * - * @param[in,out] pSession A reference to a converter session. - * - * @return A status code. - */ -static int FwdLockConv_DeriveKeys(FwdLockConv_Session_t *pSession) { - FwdLockConv_Status_t status; - struct FwdLockConv_DeriveKeys_Data { - AES_KEY sessionRoundKeys; - unsigned char value[KEY_SIZE]; - unsigned char key[KEY_SIZE]; - } *pData = malloc(sizeof *pData); - if (pData == NULL) { - status = FwdLockConv_Status_OutOfMemory; - } else { - if (AES_set_encrypt_key(pSession->sessionKey, KEY_SIZE_IN_BITS, - &pData->sessionRoundKeys) != 0) { - status = FwdLockConv_Status_ProgramError; - } else { - // Encrypt the 16-byte value {0, 0, ..., 0} to produce the encryption key. - memset(pData->value, 0, KEY_SIZE); - AES_encrypt(pData->value, pData->key, &pData->sessionRoundKeys); - if (AES_set_encrypt_key(pData->key, KEY_SIZE_IN_BITS, - &pSession->encryptionRoundKeys) != 0) { - status = FwdLockConv_Status_ProgramError; - } else { - // Encrypt the 16-byte value {1, 0, ..., 0} to produce the signing key. - ++pData->value[0]; - AES_encrypt(pData->value, pData->key, &pData->sessionRoundKeys); - HMAC_CTX_init(&pSession->signingContext); - HMAC_Init_ex(&pSession->signingContext, pData->key, KEY_SIZE, EVP_sha1(), NULL); - status = FwdLockConv_Status_OK; - } - } - memset(pData, 0, sizeof pData); // Zero out key data. - free(pData); - } - return status; -} - -/** - * Checks whether a given character is valid in a boundary. Allows some non-standard characters that - * are invalid according to RFC 2046 but nevertheless used by one vendor's DRM packager. Note that - * the boundary may contain leading and internal spaces. - * - * @param[in] ch The character to check. - * - * @return A Boolean value indicating whether the given character is valid in a boundary. - */ -static int FwdLockConv_IsBoundaryChar(int ch) { - return isalnum(ch) || ch == '\'' || ch == '(' || ch == ')' || ch == '+' || ch == '_' || - ch == ',' || ch == '-' || ch == '.' || ch == '/' || ch == ':' || ch == '=' || - ch == '?' || ch == ' ' || ch == '%' || ch == '[' || ch == '&' || ch == '*' || ch == '^'; -} - -/** - * Checks whether a given character should be considered whitespace, using a narrower definition - * than the standard-library isspace() function. - * - * @param[in] ch The character to check. - * - * @return A Boolean value indicating whether the given character should be considered whitespace. - */ -static int FwdLockConv_IsWhitespace(int ch) { - return ch == ' ' || ch == '\t'; -} - -/** - * Removes trailing spaces from the delimiter. - * - * @param[in,out] pSession A reference to a converter session. - * - * @return A status code. - */ -static FwdLockConv_Status_t FwdLockConv_RightTrimDelimiter(FwdLockConv_Session_t *pSession) { - while (pSession->delimiterLength > 4 && - pSession->delimiter[pSession->delimiterLength - 1] == ' ') { - --pSession->delimiterLength; - } - if (pSession->delimiterLength > 4) { - return FwdLockConv_Status_OK; - } - return FwdLockConv_Status_SyntaxError; -} - -/** - * Matches the open delimiter. - * - * @param[in,out] pSession A reference to a converter session. - * @param[in] ch A character. - * - * @return A status code. - */ -static FwdLockConv_Status_t FwdLockConv_MatchOpenDelimiter(FwdLockConv_Session_t *pSession, - int ch) { - FwdLockConv_Status_t status = FwdLockConv_Status_OK; - switch (pSession->scannerState) { - case FwdLockConv_ScannerState_WantsFirstDash: - if (ch == '-') { - pSession->scannerState = FwdLockConv_ScannerState_WantsSecondDash; - } else if (ch == '\r') { - pSession->scannerState = FwdLockConv_ScannerState_WantsLF; - } else { - pSession->scannerState = FwdLockConv_ScannerState_WantsCR; - } - break; - case FwdLockConv_ScannerState_WantsSecondDash: - if (ch == '-') { - // The delimiter starts with "\r\n--" (the open delimiter may omit the initial "\r\n"). - // The rest is the user-defined boundary that should come next. - pSession->delimiter[0] = '\r'; - pSession->delimiter[1] = '\n'; - pSession->delimiter[2] = '-'; - pSession->delimiter[3] = '-'; - pSession->delimiterLength = 4; - pSession->scannerState = FwdLockConv_ScannerState_WantsBoundary; - } else if (ch == '\r') { - pSession->scannerState = FwdLockConv_ScannerState_WantsLF; - } else { - pSession->scannerState = FwdLockConv_ScannerState_WantsCR; - } - break; - case FwdLockConv_ScannerState_WantsCR: - if (ch == '\r') { - pSession->scannerState = FwdLockConv_ScannerState_WantsLF; - } - break; - case FwdLockConv_ScannerState_WantsLF: - if (ch == '\n') { - pSession->scannerState = FwdLockConv_ScannerState_WantsFirstDash; - } else if (ch != '\r') { - pSession->scannerState = FwdLockConv_ScannerState_WantsCR; - } - break; - case FwdLockConv_ScannerState_WantsBoundary: - if (FwdLockConv_IsBoundaryChar(ch)) { - // The boundary may contain leading and internal spaces, so trailing spaces will also be - // matched here. These will be removed later. - if (pSession->delimiterLength < MAX_DELIMITER_LENGTH) { - pSession->delimiter[pSession->delimiterLength++] = ch; - } else if (ch != ' ') { - status = FwdLockConv_Status_SyntaxError; - } - } else if (ch == '\r') { - status = FwdLockConv_RightTrimDelimiter(pSession); - if (status == FwdLockConv_Status_OK) { - pSession->scannerState = FwdLockConv_ScannerState_WantsBoundaryEnd; - } - } else if (ch == '\t') { - status = FwdLockConv_RightTrimDelimiter(pSession); - if (status == FwdLockConv_Status_OK) { - pSession->scannerState = FwdLockConv_ScannerState_WantsWhitespace; - } - } else { - status = FwdLockConv_Status_SyntaxError; - } - break; - case FwdLockConv_ScannerState_WantsWhitespace: - if (ch == '\r') { - pSession->scannerState = FwdLockConv_ScannerState_WantsBoundaryEnd; - } else if (!FwdLockConv_IsWhitespace(ch)) { - status = FwdLockConv_Status_SyntaxError; - } - break; - case FwdLockConv_ScannerState_WantsBoundaryEnd: - if (ch == '\n') { - pSession->parserState = FwdLockConv_ParserState_WantsMimeHeaders; - pSession->scannerState = FwdLockConv_ScannerState_WantsMimeHeaderNameStart; - } else { - status = FwdLockConv_Status_SyntaxError; - } - break; - default: - status = FwdLockConv_Status_ProgramError; - break; - } - return status; -} - -/** - * Checks whether a given character is valid in a MIME header name. - * - * @param[in] ch The character to check. - * - * @return A Boolean value indicating whether the given character is valid in a MIME header name. - */ -static int FwdLockConv_IsMimeHeaderNameChar(int ch) { - return isgraph(ch) && ch != ':'; -} - -/** - * Checks whether a given character is valid in a MIME header value. - * - * @param[in] ch The character to check. - * - * @return A Boolean value indicating whether the given character is valid in a MIME header value. - */ -static int FwdLockConv_IsMimeHeaderValueChar(int ch) { - return isgraph(ch) && ch != ';'; -} - -/** - * Appends a character to the specified dynamically growing string. - * - * @param[in,out] pString A reference to a dynamically growing string. - * @param[in] ch The character to append. - * - * @return A status code. - */ -static FwdLockConv_Status_t FwdLockConv_StringAppend(FwdLockConv_String_t *pString, int ch) { - if (pString->length == pString->maxLength) { - size_t newMaxLength = pString->maxLength + pString->lengthIncrement; - char *newPtr = realloc(pString->ptr, newMaxLength + 1); - if (newPtr == NULL) { - return FwdLockConv_Status_OutOfMemory; - } - pString->ptr = newPtr; - pString->maxLength = newMaxLength; - } - pString->ptr[pString->length++] = ch; - pString->ptr[pString->length] = '\0'; - return FwdLockConv_Status_OK; -} - -/** - * Attempts to recognize the MIME header name and changes the scanner state accordingly. - * - * @param[in,out] pSession A reference to a converter session. - * - * @return A status code. - */ -static FwdLockConv_Status_t FwdLockConv_RecognizeMimeHeaderName(FwdLockConv_Session_t *pSession) { - FwdLockConv_Status_t status = FwdLockConv_Status_OK; - if (strncmp(pSession->mimeHeaderName.ptr, strContent, strlenContent) == 0) { - if (strcmp(pSession->mimeHeaderName.ptr + strlenContent, strType) == 0) { - if (pSession->contentType.ptr == NULL) { - pSession->scannerState = FwdLockConv_ScannerState_WantsContentTypeStart; - } else { - status = FwdLockConv_Status_SyntaxError; - } - } else if (strcmp(pSession->mimeHeaderName.ptr + strlenContent, strTransferEncoding) == 0) { - if (pSession->contentTransferEncoding == - FwdLockConv_ContentTransferEncoding_Undefined) { - pSession->scannerState = FwdLockConv_ScannerState_WantsContentTransferEncodingStart; - } else { - status = FwdLockConv_Status_SyntaxError; - } - } else { - pSession->scannerState = FwdLockConv_ScannerState_WantsCR; - } - } else { - pSession->scannerState = FwdLockConv_ScannerState_WantsCR; - } - return status; -} - -/** - * Applies defaults to missing MIME header values. - * - * @param[in,out] pSession A reference to a converter session. - * - * @return A status code. - */ -static FwdLockConv_Status_t FwdLockConv_ApplyDefaults(FwdLockConv_Session_t *pSession) { - if (pSession->contentType.ptr == NULL) { - // Content type is missing: default to "text/plain". - pSession->contentType.ptr = malloc(sizeof strTextPlain); - if (pSession->contentType.ptr == NULL) { - return FwdLockConv_Status_OutOfMemory; - } - memcpy(pSession->contentType.ptr, strTextPlain, sizeof strTextPlain); - pSession->contentType.length = strlenTextPlain; - pSession->contentType.maxLength = strlenTextPlain; - } - if (pSession->contentTransferEncoding == FwdLockConv_ContentTransferEncoding_Undefined) { - // Content transfer encoding is missing: default to binary. - pSession->contentTransferEncoding = FwdLockConv_ContentTransferEncoding_Binary; - } - return FwdLockConv_Status_OK; -} - -/** - * Verifies that the content type is supported. - * - * @param[in,out] pSession A reference to a converter session. - * - * @return A status code. - */ -static FwdLockConv_Status_t FwdLockConv_VerifyContentType(FwdLockConv_Session_t *pSession) { - FwdLockConv_Status_t status; - if (pSession->contentType.ptr == NULL) { - status = FwdLockConv_Status_ProgramError; - } else if (strcmp(pSession->contentType.ptr, strApplicationVndOmaDrmRightsXml) == 0 || - strcmp(pSession->contentType.ptr, strApplicationVndOmaDrmContent) == 0) { - status = FwdLockConv_Status_UnsupportedFileFormat; - } else { - status = FwdLockConv_Status_OK; - } - return status; -} - -/** - * Writes the header of the output file. - * - * @param[in,out] pSession A reference to a converter session. - * @param[out] pOutput The output from the conversion process. - * - * @return A status code. - */ -static FwdLockConv_Status_t FwdLockConv_WriteHeader(FwdLockConv_Session_t *pSession, - FwdLockConv_Output_t *pOutput) { - FwdLockConv_Status_t status; - if (pSession->contentType.length > UCHAR_MAX) { - status = FwdLockConv_Status_SyntaxError; - } else { - pSession->outputBufferSize = OUTPUT_BUFFER_SIZE_INCREMENT; - pOutput->fromConvertData.pBuffer = malloc(pSession->outputBufferSize); - if (pOutput->fromConvertData.pBuffer == NULL) { - status = FwdLockConv_Status_OutOfMemory; - } else { - size_t encryptedSessionKeyPos = TOP_HEADER_SIZE + pSession->contentType.length; - size_t dataSignaturePos = encryptedSessionKeyPos + pSession->encryptedSessionKeyLength; - size_t headerSignaturePos = dataSignaturePos + SHA1_HASH_SIZE; - pSession->dataOffset = headerSignaturePos + SHA1_HASH_SIZE; - memcpy(pSession->topHeader, topHeaderTemplate, sizeof topHeaderTemplate); - pSession->topHeader[CONTENT_TYPE_LENGTH_POS] = - (unsigned char)pSession->contentType.length; - memcpy(pOutput->fromConvertData.pBuffer, pSession->topHeader, TOP_HEADER_SIZE); - memcpy((char *)pOutput->fromConvertData.pBuffer + TOP_HEADER_SIZE, - pSession->contentType.ptr, pSession->contentType.length); - memcpy((char *)pOutput->fromConvertData.pBuffer + encryptedSessionKeyPos, - pSession->pEncryptedSessionKey, pSession->encryptedSessionKeyLength); - - // Set the signatures to all zeros for now; they will have to be updated later. - memset((char *)pOutput->fromConvertData.pBuffer + dataSignaturePos, 0, - SHA1_HASH_SIZE); - memset((char *)pOutput->fromConvertData.pBuffer + headerSignaturePos, 0, - SHA1_HASH_SIZE); - - pOutput->fromConvertData.numBytes = pSession->dataOffset; - status = FwdLockConv_Status_OK; - } - } - return status; -} - -/** - * Matches the MIME headers. - * - * @param[in,out] pSession A reference to a converter session. - * @param[in] ch A character. - * @param[out] pOutput The output from the conversion process. - * - * @return A status code. - */ -static FwdLockConv_Status_t FwdLockConv_MatchMimeHeaders(FwdLockConv_Session_t *pSession, - int ch, - FwdLockConv_Output_t *pOutput) { - FwdLockConv_Status_t status = FwdLockConv_Status_OK; - switch (pSession->scannerState) { - case FwdLockConv_ScannerState_WantsMimeHeaderNameStart: - if (FwdLockConv_IsMimeHeaderNameChar(ch)) { - pSession->mimeHeaderName.length = 0; - status = FwdLockConv_StringAppend(&pSession->mimeHeaderName, tolower(ch)); - if (status == FwdLockConv_Status_OK) { - pSession->scannerState = FwdLockConv_ScannerState_WantsMimeHeaderName; - } - } else if (ch == '\r') { - pSession->scannerState = FwdLockConv_ScannerState_WantsMimeHeadersEnd; - } else if (!FwdLockConv_IsWhitespace(ch)) { - status = FwdLockConv_Status_SyntaxError; - } - break; - case FwdLockConv_ScannerState_WantsMimeHeaderName: - if (FwdLockConv_IsMimeHeaderNameChar(ch)) { - status = FwdLockConv_StringAppend(&pSession->mimeHeaderName, tolower(ch)); - } else if (ch == ':') { - status = FwdLockConv_RecognizeMimeHeaderName(pSession); - } else if (FwdLockConv_IsWhitespace(ch)) { - pSession->scannerState = FwdLockConv_ScannerState_WantsMimeHeaderNameEnd; - } else { - status = FwdLockConv_Status_SyntaxError; - } - break; - case FwdLockConv_ScannerState_WantsMimeHeaderNameEnd: - if (ch == ':') { - status = FwdLockConv_RecognizeMimeHeaderName(pSession); - } else if (!FwdLockConv_IsWhitespace(ch)) { - status = FwdLockConv_Status_SyntaxError; - } - break; - case FwdLockConv_ScannerState_WantsContentTypeStart: - if (FwdLockConv_IsMimeHeaderValueChar(ch)) { - status = FwdLockConv_StringAppend(&pSession->contentType, tolower(ch)); - if (status == FwdLockConv_Status_OK) { - pSession->scannerState = FwdLockConv_ScannerState_WantsContentType; - } - } else if (!FwdLockConv_IsWhitespace(ch)) { - status = FwdLockConv_Status_SyntaxError; - } - break; - case FwdLockConv_ScannerState_WantsContentType: - if (FwdLockConv_IsMimeHeaderValueChar(ch)) { - status = FwdLockConv_StringAppend(&pSession->contentType, tolower(ch)); - } else if (ch == ';') { - pSession->scannerState = FwdLockConv_ScannerState_WantsCR; - } else if (ch == '\r') { - pSession->scannerState = FwdLockConv_ScannerState_WantsLF; - } else if (FwdLockConv_IsWhitespace(ch)) { - pSession->scannerState = FwdLockConv_ScannerState_WantsMimeHeaderValueEnd; - } else { - status = FwdLockConv_Status_SyntaxError; - } - break; - case FwdLockConv_ScannerState_WantsContentTransferEncodingStart: - if (ch == 'b' || ch == 'B') { - pSession->scannerState = FwdLockConv_ScannerState_Wants_A_OR_I; - } else if (ch == '7' || ch == '8') { - pSession->scannerState = FwdLockConv_ScannerState_Wants_B; - } else if (!FwdLockConv_IsWhitespace(ch)) { - status = FwdLockConv_Status_UnsupportedContentTransferEncoding; - } - break; - case FwdLockConv_ScannerState_Wants_A_OR_I: - if (ch == 'i' || ch == 'I') { - pSession->scannerState = FwdLockConv_ScannerState_Wants_N; - } else if (ch == 'a' || ch == 'A') { - pSession->scannerState = FwdLockConv_ScannerState_Wants_S; - } else { - status = FwdLockConv_Status_UnsupportedContentTransferEncoding; - } - break; - case FwdLockConv_ScannerState_Wants_N: - if (ch == 'n' || ch == 'N') { - pSession->scannerState = FwdLockConv_ScannerState_Wants_A; - } else { - status = FwdLockConv_Status_UnsupportedContentTransferEncoding; - } - break; - case FwdLockConv_ScannerState_Wants_A: - if (ch == 'a' || ch == 'A') { - pSession->scannerState = FwdLockConv_ScannerState_Wants_R; - } else { - status = FwdLockConv_Status_UnsupportedContentTransferEncoding; - } - break; - case FwdLockConv_ScannerState_Wants_R: - if (ch == 'r' || ch == 'R') { - pSession->scannerState = FwdLockConv_ScannerState_Wants_Y; - } else { - status = FwdLockConv_Status_UnsupportedContentTransferEncoding; - } - break; - case FwdLockConv_ScannerState_Wants_Y: - if (ch == 'y' || ch == 'Y') { - pSession->contentTransferEncoding = FwdLockConv_ContentTransferEncoding_Binary; - pSession->scannerState = FwdLockConv_ScannerState_WantsContentTransferEncodingEnd; - } else { - status = FwdLockConv_Status_UnsupportedContentTransferEncoding; - } - break; - case FwdLockConv_ScannerState_Wants_S: - if (ch == 's' || ch == 'S') { - pSession->scannerState = FwdLockConv_ScannerState_Wants_E; - } else { - status = FwdLockConv_Status_UnsupportedContentTransferEncoding; - } - break; - case FwdLockConv_ScannerState_Wants_E: - if (ch == 'e' || ch == 'E') { - pSession->scannerState = FwdLockConv_ScannerState_Wants_6; - } else { - status = FwdLockConv_Status_UnsupportedContentTransferEncoding; - } - break; - case FwdLockConv_ScannerState_Wants_6: - if (ch == '6') { - pSession->scannerState = FwdLockConv_ScannerState_Wants_4; - } else { - status = FwdLockConv_Status_UnsupportedContentTransferEncoding; - } - break; - case FwdLockConv_ScannerState_Wants_4: - if (ch == '4') { - pSession->contentTransferEncoding = FwdLockConv_ContentTransferEncoding_Base64; - pSession->scannerState = FwdLockConv_ScannerState_WantsContentTransferEncodingEnd; - } else { - status = FwdLockConv_Status_UnsupportedContentTransferEncoding; - } - break; - case FwdLockConv_ScannerState_Wants_B: - if (ch == 'b' || ch == 'B') { - pSession->scannerState = FwdLockConv_ScannerState_Wants_I; - } else { - status = FwdLockConv_Status_UnsupportedContentTransferEncoding; - } - break; - case FwdLockConv_ScannerState_Wants_I: - if (ch == 'i' || ch == 'I') { - pSession->scannerState = FwdLockConv_ScannerState_Wants_T; - } else { - status = FwdLockConv_Status_UnsupportedContentTransferEncoding; - } - break; - case FwdLockConv_ScannerState_Wants_T: - if (ch == 't' || ch == 'T') { - pSession->contentTransferEncoding = FwdLockConv_ContentTransferEncoding_Binary; - pSession->scannerState = FwdLockConv_ScannerState_WantsContentTransferEncodingEnd; - } else { - status = FwdLockConv_Status_UnsupportedContentTransferEncoding; - } - break; - case FwdLockConv_ScannerState_WantsContentTransferEncodingEnd: - if (ch == ';') { - pSession->scannerState = FwdLockConv_ScannerState_WantsCR; - } else if (ch == '\r') { - pSession->scannerState = FwdLockConv_ScannerState_WantsLF; - } else if (FwdLockConv_IsWhitespace(ch)) { - pSession->scannerState = FwdLockConv_ScannerState_WantsMimeHeaderValueEnd; - } else { - status = FwdLockConv_Status_UnsupportedContentTransferEncoding; - } - break; - case FwdLockConv_ScannerState_WantsMimeHeaderValueEnd: - if (ch == ';') { - pSession->scannerState = FwdLockConv_ScannerState_WantsCR; - } else if (ch == '\r') { - pSession->scannerState = FwdLockConv_ScannerState_WantsLF; - } else if (!FwdLockConv_IsWhitespace(ch)) { - status = FwdLockConv_Status_SyntaxError; - } - break; - case FwdLockConv_ScannerState_WantsCR: - if (ch == '\r') { - pSession->scannerState = FwdLockConv_ScannerState_WantsLF; - } - break; - case FwdLockConv_ScannerState_WantsLF: - if (ch == '\n') { - pSession->scannerState = FwdLockConv_ScannerState_WantsMimeHeaderNameStart; - } else { - status = FwdLockConv_Status_SyntaxError; - } - break; - case FwdLockConv_ScannerState_WantsMimeHeadersEnd: - if (ch == '\n') { - status = FwdLockConv_ApplyDefaults(pSession); - if (status == FwdLockConv_Status_OK) { - status = FwdLockConv_VerifyContentType(pSession); - } - if (status == FwdLockConv_Status_OK) { - status = FwdLockConv_WriteHeader(pSession, pOutput); - } - if (status == FwdLockConv_Status_OK) { - if (pSession->contentTransferEncoding == - FwdLockConv_ContentTransferEncoding_Binary) { - pSession->parserState = FwdLockConv_ParserState_WantsBinaryEncodedData; - } else { - pSession->parserState = FwdLockConv_ParserState_WantsBase64EncodedData; - } - pSession->scannerState = FwdLockConv_ScannerState_WantsByte1; - } - } else { - status = FwdLockConv_Status_SyntaxError; - } - break; - default: - status = FwdLockConv_Status_ProgramError; - break; - } - return status; -} - -/** - * Increments the counter, treated as a 16-byte little-endian number, by one. - * - * @param[in,out] pSession A reference to a converter session. - */ -static void FwdLockConv_IncrementCounter(FwdLockConv_Session_t *pSession) { - size_t i = 0; - while ((++pSession->counter[i] == 0) && (++i < AES_BLOCK_SIZE)) - ; -} - -/** - * Encrypts the given character and writes it to the output buffer. - * - * @param[in,out] pSession A reference to a converter session. - * @param[in] ch The character to encrypt and write. - * @param[in,out] pOutput The output from the conversion process. - * - * @return A status code. - */ -static FwdLockConv_Status_t FwdLockConv_WriteEncryptedChar(FwdLockConv_Session_t *pSession, - unsigned char ch, - FwdLockConv_Output_t *pOutput) { - if (pOutput->fromConvertData.numBytes == pSession->outputBufferSize) { - void *pBuffer; - pSession->outputBufferSize += OUTPUT_BUFFER_SIZE_INCREMENT; - pBuffer = realloc(pOutput->fromConvertData.pBuffer, pSession->outputBufferSize); - if (pBuffer == NULL) { - return FwdLockConv_Status_OutOfMemory; - } - pOutput->fromConvertData.pBuffer = pBuffer; - } - if (++pSession->keyStreamIndex == AES_BLOCK_SIZE) { - FwdLockConv_IncrementCounter(pSession); - pSession->keyStreamIndex = 0; - } - if (pSession->keyStreamIndex == 0) { - AES_encrypt(pSession->counter, pSession->keyStream, &pSession->encryptionRoundKeys); - } - ch ^= pSession->keyStream[pSession->keyStreamIndex]; - ((unsigned char *)pOutput->fromConvertData.pBuffer)[pOutput->fromConvertData.numBytes++] = ch; - ++pSession->numDataBytes; - return FwdLockConv_Status_OK; -} - -/** - * Matches binary-encoded content data and encrypts it, while looking out for the close delimiter. - * - * @param[in,out] pSession A reference to a converter session. - * @param[in] ch A character. - * @param[in,out] pOutput The output from the conversion process. - * - * @return A status code. - */ -static FwdLockConv_Status_t FwdLockConv_MatchBinaryEncodedData(FwdLockConv_Session_t *pSession, - int ch, - FwdLockConv_Output_t *pOutput) { - FwdLockConv_Status_t status = FwdLockConv_Status_OK; - switch (pSession->scannerState) { - case FwdLockConv_ScannerState_WantsByte1: - if (ch != pSession->delimiter[pSession->delimiterMatchPos]) { - // The partial match of the delimiter turned out to be spurious. Flush the matched bytes - // to the output buffer and start over. - size_t i; - for (i = 0; i < pSession->delimiterMatchPos; ++i) { - status = FwdLockConv_WriteEncryptedChar(pSession, pSession->delimiter[i], pOutput); - if (status != FwdLockConv_Status_OK) { - return status; - } - } - pSession->delimiterMatchPos = 0; - } - if (ch != pSession->delimiter[pSession->delimiterMatchPos]) { - // The current character isn't part of the delimiter. Write it to the output buffer. - status = FwdLockConv_WriteEncryptedChar(pSession, ch, pOutput); - } else if (++pSession->delimiterMatchPos == pSession->delimiterLength) { - // The entire delimiter has been matched. The only valid characters now are the "--" - // that complete the close delimiter (no more message parts are expected). - pSession->scannerState = FwdLockConv_ScannerState_WantsFirstDash; - } - break; - case FwdLockConv_ScannerState_WantsFirstDash: - if (ch == '-') { - pSession->scannerState = FwdLockConv_ScannerState_WantsSecondDash; - } else { - status = FwdLockConv_Status_SyntaxError; - } - break; - case FwdLockConv_ScannerState_WantsSecondDash: - if (ch == '-') { - pSession->parserState = FwdLockConv_ParserState_Done; - } else { - status = FwdLockConv_Status_SyntaxError; - } - break; - default: - status = FwdLockConv_Status_ProgramError; - break; - } - return status; -} - -/** - * Checks whether a given character is valid in base64-encoded data. - * - * @param[in] ch The character to check. - * - * @return A Boolean value indicating whether the given character is valid in base64-encoded data. - */ -static int FwdLockConv_IsBase64Char(int ch) { - return 0 <= ch && ch <= 'z' && base64Values[ch] >= 0; -} - -/** - * Matches base64-encoded content data and encrypts it, while looking out for the close delimiter. - * - * @param[in,out] pSession A reference to a converter session. - * @param[in] ch A character. - * @param[in,out] pOutput The output from the conversion process. - * - * @return A status code. - */ -static FwdLockConv_Status_t FwdLockConv_MatchBase64EncodedData(FwdLockConv_Session_t *pSession, - int ch, - FwdLockConv_Output_t *pOutput) { - FwdLockConv_Status_t status = FwdLockConv_Status_OK; - switch (pSession->scannerState) { - case FwdLockConv_ScannerState_WantsByte1: - case FwdLockConv_ScannerState_WantsByte1_AfterCRLF: - if (FwdLockConv_IsBase64Char(ch)) { - pSession->ch = base64Values[ch] << 2; - pSession->scannerState = FwdLockConv_ScannerState_WantsByte2; - } else if (ch == '\r') { - pSession->savedScannerState = FwdLockConv_ScannerState_WantsByte1_AfterCRLF; - pSession->scannerState = FwdLockConv_ScannerState_WantsLF; - } else if (ch == '-') { - if (pSession->scannerState == FwdLockConv_ScannerState_WantsByte1_AfterCRLF) { - pSession->delimiterMatchPos = 3; - pSession->scannerState = FwdLockConv_ScannerState_WantsDelimiter; - } else { - status = FwdLockConv_Status_SyntaxError; - } - } else if (!FwdLockConv_IsWhitespace(ch)) { - status = FwdLockConv_Status_SyntaxError; - } - break; - case FwdLockConv_ScannerState_WantsByte2: - if (FwdLockConv_IsBase64Char(ch)) { - pSession->ch |= base64Values[ch] >> 4; - status = FwdLockConv_WriteEncryptedChar(pSession, pSession->ch, pOutput); - if (status == FwdLockConv_Status_OK) { - pSession->ch = base64Values[ch] << 4; - pSession->scannerState = FwdLockConv_ScannerState_WantsByte3; - } - } else if (ch == '\r') { - pSession->savedScannerState = pSession->scannerState; - pSession->scannerState = FwdLockConv_ScannerState_WantsLF; - } else if (!FwdLockConv_IsWhitespace(ch)) { - status = FwdLockConv_Status_SyntaxError; - } - break; - case FwdLockConv_ScannerState_WantsByte3: - if (FwdLockConv_IsBase64Char(ch)) { - pSession->ch |= base64Values[ch] >> 2; - status = FwdLockConv_WriteEncryptedChar(pSession, pSession->ch, pOutput); - if (status == FwdLockConv_Status_OK) { - pSession->ch = base64Values[ch] << 6; - pSession->scannerState = FwdLockConv_ScannerState_WantsByte4; - } - } else if (ch == '\r') { - pSession->savedScannerState = pSession->scannerState; - pSession->scannerState = FwdLockConv_ScannerState_WantsLF; - } else if (ch == '=') { - pSession->scannerState = FwdLockConv_ScannerState_WantsPadding; - } else if (!FwdLockConv_IsWhitespace(ch)) { - status = FwdLockConv_Status_SyntaxError; - } - break; - case FwdLockConv_ScannerState_WantsByte4: - if (FwdLockConv_IsBase64Char(ch)) { - pSession->ch |= base64Values[ch]; - status = FwdLockConv_WriteEncryptedChar(pSession, pSession->ch, pOutput); - if (status == FwdLockConv_Status_OK) { - pSession->scannerState = FwdLockConv_ScannerState_WantsByte1; - } - } else if (ch == '\r') { - pSession->savedScannerState = pSession->scannerState; - pSession->scannerState = FwdLockConv_ScannerState_WantsLF; - } else if (ch == '=') { - pSession->scannerState = FwdLockConv_ScannerState_WantsWhitespace; - } else if (!FwdLockConv_IsWhitespace(ch)) { - status = FwdLockConv_Status_SyntaxError; - } - break; - case FwdLockConv_ScannerState_WantsLF: - if (ch == '\n') { - pSession->scannerState = pSession->savedScannerState; - } else { - status = FwdLockConv_Status_SyntaxError; - } - break; - case FwdLockConv_ScannerState_WantsPadding: - if (ch == '=') { - pSession->scannerState = FwdLockConv_ScannerState_WantsWhitespace; - } else { - status = FwdLockConv_Status_SyntaxError; - } - break; - case FwdLockConv_ScannerState_WantsWhitespace: - case FwdLockConv_ScannerState_WantsWhitespace_AfterCRLF: - if (ch == '\r') { - pSession->savedScannerState = FwdLockConv_ScannerState_WantsWhitespace_AfterCRLF; - pSession->scannerState = FwdLockConv_ScannerState_WantsLF; - } else if (ch == '-') { - if (pSession->scannerState == FwdLockConv_ScannerState_WantsWhitespace_AfterCRLF) { - pSession->delimiterMatchPos = 3; - pSession->scannerState = FwdLockConv_ScannerState_WantsDelimiter; - } else { - status = FwdLockConv_Status_SyntaxError; - } - } else if (FwdLockConv_IsWhitespace(ch)) { - pSession->scannerState = FwdLockConv_ScannerState_WantsWhitespace; - } else { - status = FwdLockConv_Status_SyntaxError; - } - break; - case FwdLockConv_ScannerState_WantsDelimiter: - if (ch != pSession->delimiter[pSession->delimiterMatchPos]) { - status = FwdLockConv_Status_SyntaxError; - } else if (++pSession->delimiterMatchPos == pSession->delimiterLength) { - pSession->scannerState = FwdLockConv_ScannerState_WantsFirstDash; - } - break; - case FwdLockConv_ScannerState_WantsFirstDash: - if (ch == '-') { - pSession->scannerState = FwdLockConv_ScannerState_WantsSecondDash; - } else { - status = FwdLockConv_Status_SyntaxError; - } - break; - case FwdLockConv_ScannerState_WantsSecondDash: - if (ch == '-') { - pSession->parserState = FwdLockConv_ParserState_Done; - } else { - status = FwdLockConv_Status_SyntaxError; - } - break; - default: - status = FwdLockConv_Status_ProgramError; - break; - } - return status; -} - -/** - * Pushes a single character into the converter's state machine. - * - * @param[in,out] pSession A reference to a converter session. - * @param[in] ch A character. - * @param[in,out] pOutput The output from the conversion process. - * - * @return A status code. - */ -static FwdLockConv_Status_t FwdLockConv_PushChar(FwdLockConv_Session_t *pSession, - int ch, - FwdLockConv_Output_t *pOutput) { - FwdLockConv_Status_t status; - ++pSession->numCharsConsumed; - switch (pSession->parserState) { - case FwdLockConv_ParserState_WantsOpenDelimiter: - status = FwdLockConv_MatchOpenDelimiter(pSession, ch); - break; - case FwdLockConv_ParserState_WantsMimeHeaders: - status = FwdLockConv_MatchMimeHeaders(pSession, ch, pOutput); - break; - case FwdLockConv_ParserState_WantsBinaryEncodedData: - status = FwdLockConv_MatchBinaryEncodedData(pSession, ch, pOutput); - break; - case FwdLockConv_ParserState_WantsBase64EncodedData: - if (ch == '\n' && pSession->scannerState != FwdLockConv_ScannerState_WantsLF) { - // Repair base64-encoded data that doesn't have carriage returns in its line breaks. - status = FwdLockConv_MatchBase64EncodedData(pSession, '\r', pOutput); - if (status != FwdLockConv_Status_OK) { - break; - } - } - status = FwdLockConv_MatchBase64EncodedData(pSession, ch, pOutput); - break; - case FwdLockConv_ParserState_Done: - status = FwdLockConv_Status_OK; - break; - default: - status = FwdLockConv_Status_ProgramError; - break; - } - return status; -} - -FwdLockConv_Status_t FwdLockConv_OpenSession(int *pSessionId, FwdLockConv_Output_t *pOutput) { - FwdLockConv_Status_t status; - if (pSessionId == NULL || pOutput == NULL) { - status = FwdLockConv_Status_InvalidArgument; - } else { - *pSessionId = FwdLockConv_AcquireSession(); - if (*pSessionId < 0) { - status = FwdLockConv_Status_TooManySessions; - } else { - FwdLockConv_Session_t *pSession = sessionPtrs[*pSessionId]; - pSession->encryptedSessionKeyLength = FwdLockGlue_GetEncryptedKeyLength(KEY_SIZE); - if (pSession->encryptedSessionKeyLength < AES_BLOCK_SIZE) { - // The encrypted session key is used as the CTR-mode nonce, so it must be at least - // the size of a single AES block. - status = FwdLockConv_Status_ProgramError; - } else { - pSession->pEncryptedSessionKey = malloc(pSession->encryptedSessionKeyLength); - if (pSession->pEncryptedSessionKey == NULL) { - status = FwdLockConv_Status_OutOfMemory; - } else { - if (!FwdLockGlue_GetRandomNumber(pSession->sessionKey, KEY_SIZE)) { - status = FwdLockConv_Status_RandomNumberGenerationFailed; - } else if (!FwdLockGlue_EncryptKey(pSession->sessionKey, KEY_SIZE, - pSession->pEncryptedSessionKey, - pSession->encryptedSessionKeyLength)) { - status = FwdLockConv_Status_KeyEncryptionFailed; - } else { - status = FwdLockConv_DeriveKeys(pSession); - } - if (status == FwdLockConv_Status_OK) { - memset(pSession->sessionKey, 0, KEY_SIZE); // Zero out key data. - memcpy(pSession->counter, pSession->pEncryptedSessionKey, AES_BLOCK_SIZE); - pSession->parserState = FwdLockConv_ParserState_WantsOpenDelimiter; - pSession->scannerState = FwdLockConv_ScannerState_WantsFirstDash; - pSession->numCharsConsumed = 0; - pSession->delimiterMatchPos = 0; - pSession->mimeHeaderName = nullString; - pSession->contentType = nullString; - pSession->contentTransferEncoding = - FwdLockConv_ContentTransferEncoding_Undefined; - pSession->keyStreamIndex = -1; - pOutput->fromConvertData.pBuffer = NULL; - pOutput->fromConvertData.errorPos = INVALID_OFFSET; - } else { - free(pSession->pEncryptedSessionKey); - } - } - } - if (status != FwdLockConv_Status_OK) { - FwdLockConv_ReleaseSession(*pSessionId); - *pSessionId = -1; - } - } - } - return status; -} - -FwdLockConv_Status_t FwdLockConv_ConvertData(int sessionId, - const void *pBuffer, - size_t numBytes, - FwdLockConv_Output_t *pOutput) { - FwdLockConv_Status_t status; - if (!FwdLockConv_IsValidSession(sessionId) || pBuffer == NULL || pOutput == NULL) { - status = FwdLockConv_Status_InvalidArgument; - } else { - size_t i; - FwdLockConv_Session_t *pSession = sessionPtrs[sessionId]; - pSession->dataOffset = 0; - pSession->numDataBytes = 0; - pOutput->fromConvertData.numBytes = 0; - status = FwdLockConv_Status_OK; - - for (i = 0; i < numBytes; ++i) { - status = FwdLockConv_PushChar(pSession, ((char *)pBuffer)[i], pOutput); - if (status != FwdLockConv_Status_OK) { - break; - } - } - if (status == FwdLockConv_Status_OK) { - // Update the data signature. - HMAC_Update(&pSession->signingContext, - &((unsigned char *)pOutput->fromConvertData.pBuffer)[pSession->dataOffset], - pSession->numDataBytes); - } else if (status == FwdLockConv_Status_SyntaxError) { - pOutput->fromConvertData.errorPos = pSession->numCharsConsumed; - } - } - return status; -} - -FwdLockConv_Status_t FwdLockConv_CloseSession(int sessionId, FwdLockConv_Output_t *pOutput) { - FwdLockConv_Status_t status; - if (!FwdLockConv_IsValidSession(sessionId) || pOutput == NULL) { - status = FwdLockConv_Status_InvalidArgument; - } else { - FwdLockConv_Session_t *pSession = sessionPtrs[sessionId]; - free(pOutput->fromConvertData.pBuffer); - if (pSession->parserState != FwdLockConv_ParserState_Done) { - pOutput->fromCloseSession.errorPos = pSession->numCharsConsumed; - status = FwdLockConv_Status_SyntaxError; - } else { - // Finalize the data signature. - unsigned int signatureSize = SHA1_HASH_SIZE; - HMAC_Final(&pSession->signingContext, pOutput->fromCloseSession.signatures, - &signatureSize); - if (signatureSize != SHA1_HASH_SIZE) { - status = FwdLockConv_Status_ProgramError; - } else { - // Calculate the header signature, which is a signature of the rest of the header - // including the data signature. - HMAC_Init_ex(&pSession->signingContext, NULL, KEY_SIZE, NULL, NULL); - HMAC_Update(&pSession->signingContext, pSession->topHeader, TOP_HEADER_SIZE); - HMAC_Update(&pSession->signingContext, (unsigned char *)pSession->contentType.ptr, - pSession->contentType.length); - HMAC_Update(&pSession->signingContext, pSession->pEncryptedSessionKey, - pSession->encryptedSessionKeyLength); - HMAC_Update(&pSession->signingContext, pOutput->fromCloseSession.signatures, - SHA1_HASH_SIZE); - HMAC_Final(&pSession->signingContext, - &pOutput->fromCloseSession.signatures[SHA1_HASH_SIZE], &signatureSize); - if (signatureSize != SHA1_HASH_SIZE) { - status = FwdLockConv_Status_ProgramError; - } else { - pOutput->fromCloseSession.fileOffset = TOP_HEADER_SIZE + - pSession->contentType.length + pSession->encryptedSessionKeyLength; - status = FwdLockConv_Status_OK; - } - } - pOutput->fromCloseSession.errorPos = INVALID_OFFSET; - } - free(pSession->mimeHeaderName.ptr); - free(pSession->contentType.ptr); - free(pSession->pEncryptedSessionKey); - HMAC_CTX_cleanup(&pSession->signingContext); - FwdLockConv_ReleaseSession(sessionId); - } - return status; -} - -FwdLockConv_Status_t FwdLockConv_ConvertOpenFile(int inputFileDesc, - FwdLockConv_ReadFunc_t *fpReadFunc, - int outputFileDesc, - FwdLockConv_WriteFunc_t *fpWriteFunc, - FwdLockConv_LSeekFunc_t *fpLSeekFunc, - off64_t *pErrorPos) { - FwdLockConv_Status_t status; - if (pErrorPos != NULL) { - *pErrorPos = INVALID_OFFSET; - } - if (fpReadFunc == NULL || fpWriteFunc == NULL || fpLSeekFunc == NULL || inputFileDesc < 0 || - outputFileDesc < 0) { - status = FwdLockConv_Status_InvalidArgument; - } else { - char *pReadBuffer = malloc(READ_BUFFER_SIZE); - if (pReadBuffer == NULL) { - status = FwdLockConv_Status_OutOfMemory; - } else { - int sessionId; - FwdLockConv_Output_t output; - status = FwdLockConv_OpenSession(&sessionId, &output); - if (status == FwdLockConv_Status_OK) { - ssize_t numBytesRead; - FwdLockConv_Status_t closeStatus; - while ((numBytesRead = - fpReadFunc(inputFileDesc, pReadBuffer, READ_BUFFER_SIZE)) > 0) { - status = FwdLockConv_ConvertData(sessionId, pReadBuffer, (size_t)numBytesRead, - &output); - if (status == FwdLockConv_Status_OK) { - if (output.fromConvertData.pBuffer != NULL && - output.fromConvertData.numBytes > 0) { - ssize_t numBytesWritten = fpWriteFunc(outputFileDesc, - output.fromConvertData.pBuffer, - output.fromConvertData.numBytes); - if (numBytesWritten != (ssize_t)output.fromConvertData.numBytes) { - status = FwdLockConv_Status_FileWriteError; - break; - } - } - } else { - if (status == FwdLockConv_Status_SyntaxError && pErrorPos != NULL) { - *pErrorPos = output.fromConvertData.errorPos; - } - break; - } - } // end while - if (numBytesRead < 0) { - status = FwdLockConv_Status_FileReadError; - } - closeStatus = FwdLockConv_CloseSession(sessionId, &output); - if (status == FwdLockConv_Status_OK) { - if (closeStatus != FwdLockConv_Status_OK) { - if (closeStatus == FwdLockConv_Status_SyntaxError && pErrorPos != NULL) { - *pErrorPos = output.fromCloseSession.errorPos; - } - status = closeStatus; - } else if (fpLSeekFunc(outputFileDesc, output.fromCloseSession.fileOffset, - SEEK_SET) < 0) { - status = FwdLockConv_Status_FileSeekError; - } else if (fpWriteFunc(outputFileDesc, output.fromCloseSession.signatures, - FWD_LOCK_SIGNATURES_SIZE) != FWD_LOCK_SIGNATURES_SIZE) { - status = FwdLockConv_Status_FileWriteError; - } - } - } - free(pReadBuffer); - } - } - return status; -} - -FwdLockConv_Status_t FwdLockConv_ConvertFile(const char *pInputFilename, - const char *pOutputFilename, - off64_t *pErrorPos) { - FwdLockConv_Status_t status; - if (pErrorPos != NULL) { - *pErrorPos = INVALID_OFFSET; - } - if (pInputFilename == NULL || pOutputFilename == NULL) { - status = FwdLockConv_Status_InvalidArgument; - } else { - int inputFileDesc = open(pInputFilename, O_RDONLY); - if (inputFileDesc < 0) { - status = FwdLockConv_Status_FileNotFound; - } else { - int outputFileDesc = open(pOutputFilename, O_CREAT | O_TRUNC | O_WRONLY, - S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); - if (outputFileDesc < 0) { - status = FwdLockConv_Status_FileCreationFailed; - } else { - status = FwdLockConv_ConvertOpenFile(inputFileDesc, read, outputFileDesc, write, - lseek64, pErrorPos); - if (close(outputFileDesc) == 0 && status != FwdLockConv_Status_OK) { - remove(pOutputFilename); - } - } - (void)close(inputFileDesc); - } - } - return status; -} diff --git a/drm/libdrmframework/plugins/forward-lock/internal-format/converter/FwdLockConv.h b/drm/libdrmframework/plugins/forward-lock/internal-format/converter/FwdLockConv.h deleted file mode 100644 index e20c0c3..0000000 --- a/drm/libdrmframework/plugins/forward-lock/internal-format/converter/FwdLockConv.h +++ /dev/null @@ -1,282 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __FWDLOCKCONV_H__ -#define __FWDLOCKCONV_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include <sys/types.h> - -/** - * The size of the data and header signatures combined. The signatures are adjacent to each other in - * the produced output file. - */ -#define FWD_LOCK_SIGNATURES_SIZE (2 * 20) - -/** - * Data type for the output from FwdLockConv_ConvertData. - */ -typedef struct FwdLockConv_ConvertData_Output { - /// The converted data. - void *pBuffer; - - /// The size of the converted data. - size_t numBytes; - - /// The file position where the error occurred, in the case of a syntax error. - off64_t errorPos; -} FwdLockConv_ConvertData_Output_t; - -/** - * Data type for the output from FwdLockConv_CloseSession. - */ -typedef struct FwdLockConv_CloseSession_Output { - /// The final set of signatures. - unsigned char signatures[FWD_LOCK_SIGNATURES_SIZE]; - - /// The offset in the produced output file where the signatures are located. - off64_t fileOffset; - - /// The file position where the error occurred, in the case of a syntax error. - off64_t errorPos; -} FwdLockConv_CloseSession_Output_t; - -/** - * Data type for the output from the conversion process. - */ -typedef union FwdLockConv_Output { - FwdLockConv_ConvertData_Output_t fromConvertData; - FwdLockConv_CloseSession_Output_t fromCloseSession; -} FwdLockConv_Output_t; - -/** - * Data type for the Posix-style read function used by the converter in pull mode. - * - * @param[in] fileDesc The file descriptor of a file opened for reading. - * @param[out] pBuffer A reference to the buffer that should receive the read data. - * @param[in] numBytes The number of bytes to read. - * - * @return The number of bytes read. - * @retval -1 Failure. - */ -typedef ssize_t FwdLockConv_ReadFunc_t(int fileDesc, void *pBuffer, size_t numBytes); - -/** - * Data type for the Posix-style write function used by the converter in pull mode. - * - * @param[in] fileDesc The file descriptor of a file opened for writing. - * @param[in] pBuffer A reference to the buffer containing the data to be written. - * @param[in] numBytes The number of bytes to write. - * - * @return The number of bytes written. - * @retval -1 Failure. - */ -typedef ssize_t FwdLockConv_WriteFunc_t(int fileDesc, const void *pBuffer, size_t numBytes); - -/** - * Data type for the Posix-style lseek function used by the converter in pull mode. - * - * @param[in] fileDesc The file descriptor of a file opened for writing. - * @param[in] offset The offset with which to update the file position. - * @param[in] whence One of SEEK_SET, SEEK_CUR, and SEEK_END. - * - * @return The new file position. - * @retval ((off64_t)-1) Failure. - */ -typedef off64_t FwdLockConv_LSeekFunc_t(int fileDesc, off64_t offset, int whence); - -/** - * The status codes returned by the converter functions. - */ -typedef enum FwdLockConv_Status { - /// The operation was successful. - FwdLockConv_Status_OK = 0, - - /// An actual argument to the function is invalid (a program error on the caller's part). - FwdLockConv_Status_InvalidArgument = 1, - - /// There is not enough free dynamic memory to complete the operation. - FwdLockConv_Status_OutOfMemory = 2, - - /// An error occurred while opening the input file. - FwdLockConv_Status_FileNotFound = 3, - - /// An error occurred while creating the output file. - FwdLockConv_Status_FileCreationFailed = 4, - - /// An error occurred while reading from the input file. - FwdLockConv_Status_FileReadError = 5, - - /// An error occurred while writing to the output file. - FwdLockConv_Status_FileWriteError = 6, - - /// An error occurred while seeking to a new file position within the output file. - FwdLockConv_Status_FileSeekError = 7, - - /// The input file is not a syntactically correct OMA DRM v1 Forward Lock file. - FwdLockConv_Status_SyntaxError = 8, - - /// Support for this DRM file format has been disabled in the current product configuration. - FwdLockConv_Status_UnsupportedFileFormat = 9, - - /// The content transfer encoding is not one of "binary", "base64", "7bit", or "8bit" - /// (case-insensitive). - FwdLockConv_Status_UnsupportedContentTransferEncoding = 10, - - /// The generation of a random number failed. - FwdLockConv_Status_RandomNumberGenerationFailed = 11, - - /// Key encryption failed. - FwdLockConv_Status_KeyEncryptionFailed = 12, - - /// The calculation of a keyed hash for integrity protection failed. - FwdLockConv_Status_IntegrityProtectionFailed = 13, - - /// There are too many ongoing sessions for another one to be opened. - FwdLockConv_Status_TooManySessions = 14, - - /// An unexpected error occurred. - FwdLockConv_Status_ProgramError = 15 -} FwdLockConv_Status_t; - -/** - * Opens a session for converting an OMA DRM v1 Forward Lock file to the internal Forward Lock file - * format. - * - * @param[out] pSessionId The session ID. - * @param[out] pOutput The output from the conversion process (initialized). - * - * @return A status code. - * @retval FwdLockConv_Status_OK - * @retval FwdLockConv_Status_InvalidArgument - * @retval FwdLockConv_Status_TooManySessions - */ -FwdLockConv_Status_t FwdLockConv_OpenSession(int *pSessionId, FwdLockConv_Output_t *pOutput); - -/** - * Supplies the converter with data to convert. The caller is expected to write the converted data - * to file. Can be called an arbitrary number of times. - * - * @param[in] sessionId The session ID. - * @param[in] pBuffer A reference to a buffer containing the data to convert. - * @param[in] numBytes The number of bytes to convert. - * @param[in,out] pOutput The output from the conversion process (allocated/reallocated). - * - * @return A status code. - * @retval FwdLockConv_Status_OK - * @retval FwdLockConv_Status_InvalidArgument - * @retval FwdLockConv_Status_OutOfMemory - * @retval FwdLockConv_Status_SyntaxError - * @retval FwdLockConv_Status_UnsupportedFileFormat - * @retval FwdLockConv_Status_UnsupportedContentTransferEncoding - * @retval FwdLockConv_Status_RandomNumberGenerationFailed - * @retval FwdLockConv_Status_KeyEncryptionFailed - * @retval FwdLockConv_Status_DataEncryptionFailed - */ -FwdLockConv_Status_t FwdLockConv_ConvertData(int sessionId, - const void *pBuffer, - size_t numBytes, - FwdLockConv_Output_t *pOutput); - -/** - * Closes a session for converting an OMA DRM v1 Forward Lock file to the internal Forward Lock - * file format. The caller must update the produced output file at the indicated file offset with - * the final set of signatures. - * - * @param[in] sessionId The session ID. - * @param[in,out] pOutput The output from the conversion process (deallocated and overwritten). - * - * @return A status code. - * @retval FwdLockConv_Status_OK - * @retval FwdLockConv_Status_InvalidArgument - * @retval FwdLockConv_Status_OutOfMemory - * @retval FwdLockConv_Status_IntegrityProtectionFailed - */ -FwdLockConv_Status_t FwdLockConv_CloseSession(int sessionId, FwdLockConv_Output_t *pOutput); - -/** - * Converts an open OMA DRM v1 Forward Lock file to the internal Forward Lock file format in pull - * mode. - * - * @param[in] inputFileDesc The file descriptor of the open input file. - * @param[in] fpReadFunc A reference to a read function that can operate on the open input file. - * @param[in] outputFileDesc The file descriptor of the open output file. - * @param[in] fpWriteFunc A reference to a write function that can operate on the open output file. - * @param[in] fpLSeekFunc A reference to an lseek function that can operate on the open output file. - * @param[out] pErrorPos - * The file position where the error occurred, in the case of a syntax error. May be NULL. - * - * @return A status code. - * @retval FwdLockConv_Status_OK - * @retval FwdLockConv_Status_InvalidArgument - * @retval FwdLockConv_Status_OutOfMemory - * @retval FwdLockConv_Status_FileReadError - * @retval FwdLockConv_Status_FileWriteError - * @retval FwdLockConv_Status_FileSeekError - * @retval FwdLockConv_Status_SyntaxError - * @retval FwdLockConv_Status_UnsupportedFileFormat - * @retval FwdLockConv_Status_UnsupportedContentTransferEncoding - * @retval FwdLockConv_Status_RandomNumberGenerationFailed - * @retval FwdLockConv_Status_KeyEncryptionFailed - * @retval FwdLockConv_Status_DataEncryptionFailed - * @retval FwdLockConv_Status_IntegrityProtectionFailed - * @retval FwdLockConv_Status_TooManySessions - */ -FwdLockConv_Status_t FwdLockConv_ConvertOpenFile(int inputFileDesc, - FwdLockConv_ReadFunc_t *fpReadFunc, - int outputFileDesc, - FwdLockConv_WriteFunc_t *fpWriteFunc, - FwdLockConv_LSeekFunc_t *fpLSeekFunc, - off64_t *pErrorPos); - -/** - * Converts an OMA DRM v1 Forward Lock file to the internal Forward Lock file format in pull mode. - * - * @param[in] pInputFilename A reference to the input filename. - * @param[in] pOutputFilename A reference to the output filename. - * @param[out] pErrorPos - * The file position where the error occurred, in the case of a syntax error. May be NULL. - * - * @return A status code. - * @retval FwdLockConv_Status_OK - * @retval FwdLockConv_Status_InvalidArgument - * @retval FwdLockConv_Status_OutOfMemory - * @retval FwdLockConv_Status_FileNotFound - * @retval FwdLockConv_Status_FileCreationFailed - * @retval FwdLockConv_Status_FileReadError - * @retval FwdLockConv_Status_FileWriteError - * @retval FwdLockConv_Status_FileSeekError - * @retval FwdLockConv_Status_SyntaxError - * @retval FwdLockConv_Status_UnsupportedFileFormat - * @retval FwdLockConv_Status_UnsupportedContentTransferEncoding - * @retval FwdLockConv_Status_RandomNumberGenerationFailed - * @retval FwdLockConv_Status_KeyEncryptionFailed - * @retval FwdLockConv_Status_DataEncryptionFailed - * @retval FwdLockConv_Status_IntegrityProtectionFailed - * @retval FwdLockConv_Status_TooManySessions - */ -FwdLockConv_Status_t FwdLockConv_ConvertFile(const char *pInputFilename, - const char *pOutputFilename, - off64_t *pErrorPos); - -#ifdef __cplusplus -} -#endif - -#endif // __FWDLOCKCONV_H__ diff --git a/drm/libdrmframework/plugins/forward-lock/internal-format/decoder/Android.mk b/drm/libdrmframework/plugins/forward-lock/internal-format/decoder/Android.mk deleted file mode 100644 index b625edf..0000000 --- a/drm/libdrmframework/plugins/forward-lock/internal-format/decoder/Android.mk +++ /dev/null @@ -1,37 +0,0 @@ -# -# Copyright (C) 2010 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := \ - FwdLockFile.c - -LOCAL_C_INCLUDES := \ - frameworks/base/drm/libdrmframework/plugins/forward-lock/internal-format/common \ - external/openssl/include - -LOCAL_SHARED_LIBRARIES := libcrypto - -LOCAL_WHOLE_STATIC_LIBRARIES := libfwdlock-common - -LOCAL_STATIC_LIBRARIES := libfwdlock-common - -LOCAL_MODULE := libfwdlock-decoder - -LOCAL_MODULE_TAGS := optional - -include $(BUILD_STATIC_LIBRARY) diff --git a/drm/libdrmframework/plugins/forward-lock/internal-format/decoder/FwdLockFile.c b/drm/libdrmframework/plugins/forward-lock/internal-format/decoder/FwdLockFile.c deleted file mode 100644 index 365bdec..0000000 --- a/drm/libdrmframework/plugins/forward-lock/internal-format/decoder/FwdLockFile.c +++ /dev/null @@ -1,454 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <utils/Log.h> -#include <assert.h> -#include <errno.h> -#include <fcntl.h> -#include <limits.h> -#include <pthread.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <openssl/aes.h> -#include <openssl/hmac.h> - -#include "FwdLockFile.h" -#include "FwdLockGlue.h" - -#define TRUE 1 -#define FALSE 0 - -#define INVALID_OFFSET ((off64_t)-1) - -#define INVALID_BLOCK_INDEX ((uint64_t)-1) - -#define MAX_NUM_SESSIONS 128 - -#define KEY_SIZE AES_BLOCK_SIZE -#define KEY_SIZE_IN_BITS (KEY_SIZE * 8) - -#define SHA1_HASH_SIZE 20 -#define SHA1_BLOCK_SIZE 64 - -#define FWD_LOCK_VERSION 0 -#define FWD_LOCK_SUBFORMAT 0 -#define USAGE_RESTRICTION_FLAGS 0 -#define CONTENT_TYPE_LENGTH_POS 7 -#define TOP_HEADER_SIZE 8 - -#define SIG_CALC_BUFFER_SIZE (16 * SHA1_BLOCK_SIZE) - -/** - * Data type for the per-file state information needed by the decoder. - */ -typedef struct FwdLockFile_Session { - int fileDesc; - unsigned char topHeader[TOP_HEADER_SIZE]; - char *pContentType; - size_t contentTypeLength; - void *pEncryptedSessionKey; - size_t encryptedSessionKeyLength; - unsigned char dataSignature[SHA1_HASH_SIZE]; - unsigned char headerSignature[SHA1_HASH_SIZE]; - off64_t dataOffset; - off64_t filePos; - AES_KEY encryptionRoundKeys; - HMAC_CTX signingContext; - unsigned char keyStream[AES_BLOCK_SIZE]; - uint64_t blockIndex; -} FwdLockFile_Session_t; - -static FwdLockFile_Session_t *sessionPtrs[MAX_NUM_SESSIONS] = { NULL }; - -static pthread_mutex_t sessionAcquisitionMutex = PTHREAD_MUTEX_INITIALIZER; - -static const unsigned char topHeaderTemplate[] = - { 'F', 'W', 'L', 'K', FWD_LOCK_VERSION, FWD_LOCK_SUBFORMAT, USAGE_RESTRICTION_FLAGS }; - -/** - * Acquires an unused file session for the given file descriptor. - * - * @param[in] fileDesc A file descriptor. - * - * @return A session ID. - */ -static int FwdLockFile_AcquireSession(int fileDesc) { - int sessionId = -1; - if (fileDesc < 0) { - errno = EBADF; - } else { - int i; - pthread_mutex_lock(&sessionAcquisitionMutex); - for (i = 0; i < MAX_NUM_SESSIONS; ++i) { - int candidateSessionId = (fileDesc + i) % MAX_NUM_SESSIONS; - if (sessionPtrs[candidateSessionId] == NULL) { - sessionPtrs[candidateSessionId] = malloc(sizeof **sessionPtrs); - if (sessionPtrs[candidateSessionId] != NULL) { - sessionPtrs[candidateSessionId]->fileDesc = fileDesc; - sessionPtrs[candidateSessionId]->pContentType = NULL; - sessionPtrs[candidateSessionId]->pEncryptedSessionKey = NULL; - sessionId = candidateSessionId; - } - break; - } - } - pthread_mutex_unlock(&sessionAcquisitionMutex); - if (i == MAX_NUM_SESSIONS) { - ALOGE("Too many sessions opened at the same time"); - errno = ENFILE; - } - } - return sessionId; -} - -/** - * Finds the file session associated with the given file descriptor. - * - * @param[in] fileDesc A file descriptor. - * - * @return A session ID. - */ -static int FwdLockFile_FindSession(int fileDesc) { - int sessionId = -1; - if (fileDesc < 0) { - errno = EBADF; - } else { - int i; - pthread_mutex_lock(&sessionAcquisitionMutex); - for (i = 0; i < MAX_NUM_SESSIONS; ++i) { - int candidateSessionId = (fileDesc + i) % MAX_NUM_SESSIONS; - if (sessionPtrs[candidateSessionId] != NULL && - sessionPtrs[candidateSessionId]->fileDesc == fileDesc) { - sessionId = candidateSessionId; - break; - } - } - pthread_mutex_unlock(&sessionAcquisitionMutex); - if (i == MAX_NUM_SESSIONS) { - errno = EBADF; - } - } - return sessionId; -} - -/** - * Releases a file session. - * - * @param[in] sessionID A session ID. - */ -static void FwdLockFile_ReleaseSession(int sessionId) { - pthread_mutex_lock(&sessionAcquisitionMutex); - assert(0 <= sessionId && sessionId < MAX_NUM_SESSIONS && sessionPtrs[sessionId] != NULL); - free(sessionPtrs[sessionId]->pContentType); - free(sessionPtrs[sessionId]->pEncryptedSessionKey); - memset(sessionPtrs[sessionId], 0, sizeof *sessionPtrs[sessionId]); // Zero out key data. - free(sessionPtrs[sessionId]); - sessionPtrs[sessionId] = NULL; - pthread_mutex_unlock(&sessionAcquisitionMutex); -} - -/** - * Derives keys for encryption and signing from the encrypted session key. - * - * @param[in,out] pSession A reference to a file session. - * - * @return A Boolean value indicating whether key derivation was successful. - */ -static int FwdLockFile_DeriveKeys(FwdLockFile_Session_t * pSession) { - int result; - struct FwdLockFile_DeriveKeys_Data { - AES_KEY sessionRoundKeys; - unsigned char value[KEY_SIZE]; - unsigned char key[KEY_SIZE]; - } *pData = malloc(sizeof *pData); - if (pData == NULL) { - result = FALSE; - } else { - result = FwdLockGlue_DecryptKey(pSession->pEncryptedSessionKey, - pSession->encryptedSessionKeyLength, pData->key, KEY_SIZE); - if (result) { - if (AES_set_encrypt_key(pData->key, KEY_SIZE_IN_BITS, &pData->sessionRoundKeys) != 0) { - result = FALSE; - } else { - // Encrypt the 16-byte value {0, 0, ..., 0} to produce the encryption key. - memset(pData->value, 0, KEY_SIZE); - AES_encrypt(pData->value, pData->key, &pData->sessionRoundKeys); - if (AES_set_encrypt_key(pData->key, KEY_SIZE_IN_BITS, - &pSession->encryptionRoundKeys) != 0) { - result = FALSE; - } else { - // Encrypt the 16-byte value {1, 0, ..., 0} to produce the signing key. - ++pData->value[0]; - AES_encrypt(pData->value, pData->key, &pData->sessionRoundKeys); - HMAC_CTX_init(&pSession->signingContext); - HMAC_Init_ex(&pSession->signingContext, pData->key, KEY_SIZE, EVP_sha1(), NULL); - } - } - } - if (!result) { - errno = ENOSYS; - } - memset(pData, 0, sizeof pData); // Zero out key data. - free(pData); - } - return result; -} - -/** - * Calculates the counter, treated as a 16-byte little-endian number, used to generate the keystream - * for the given block. - * - * @param[in] pNonce A reference to the nonce. - * @param[in] blockIndex The index number of the block. - * @param[out] pCounter A reference to the counter. - */ -static void FwdLockFile_CalculateCounter(const unsigned char *pNonce, - uint64_t blockIndex, - unsigned char *pCounter) { - unsigned char carry = 0; - size_t i = 0; - for (; i < sizeof blockIndex; ++i) { - unsigned char part = pNonce[i] + (unsigned char)(blockIndex >> (i * CHAR_BIT)); - pCounter[i] = part + carry; - carry = (part < pNonce[i] || pCounter[i] < part) ? 1 : 0; - } - for (; i < AES_BLOCK_SIZE; ++i) { - pCounter[i] = pNonce[i] + carry; - carry = (pCounter[i] < pNonce[i]) ? 1 : 0; - } -} - -/** - * Decrypts the byte at the current file position using AES-128-CTR. In CTR (or "counter") mode, - * encryption and decryption are performed using the same algorithm. - * - * @param[in,out] pSession A reference to a file session. - * @param[in] pByte The byte to decrypt. - */ -void FwdLockFile_DecryptByte(FwdLockFile_Session_t * pSession, unsigned char *pByte) { - uint64_t blockIndex = pSession->filePos / AES_BLOCK_SIZE; - uint64_t blockOffset = pSession->filePos % AES_BLOCK_SIZE; - if (blockIndex != pSession->blockIndex) { - // The first 16 bytes of the encrypted session key is used as the nonce. - unsigned char counter[AES_BLOCK_SIZE]; - FwdLockFile_CalculateCounter(pSession->pEncryptedSessionKey, blockIndex, counter); - AES_encrypt(counter, pSession->keyStream, &pSession->encryptionRoundKeys); - pSession->blockIndex = blockIndex; - } - *pByte ^= pSession->keyStream[blockOffset]; -} - -int FwdLockFile_attach(int fileDesc) { - int sessionId = FwdLockFile_AcquireSession(fileDesc); - if (sessionId >= 0) { - FwdLockFile_Session_t *pSession = sessionPtrs[sessionId]; - int isSuccess = FALSE; - if (read(fileDesc, pSession->topHeader, TOP_HEADER_SIZE) == TOP_HEADER_SIZE && - memcmp(pSession->topHeader, topHeaderTemplate, sizeof topHeaderTemplate) == 0) { - pSession->contentTypeLength = pSession->topHeader[CONTENT_TYPE_LENGTH_POS]; - assert(pSession->contentTypeLength <= UCHAR_MAX); // Untaint scalar for code checkers. - pSession->pContentType = malloc(pSession->contentTypeLength + 1); - if (pSession->pContentType != NULL && - read(fileDesc, pSession->pContentType, pSession->contentTypeLength) == - (ssize_t)pSession->contentTypeLength) { - pSession->pContentType[pSession->contentTypeLength] = '\0'; - pSession->encryptedSessionKeyLength = FwdLockGlue_GetEncryptedKeyLength(KEY_SIZE); - pSession->pEncryptedSessionKey = malloc(pSession->encryptedSessionKeyLength); - if (pSession->pEncryptedSessionKey != NULL && - read(fileDesc, pSession->pEncryptedSessionKey, - pSession->encryptedSessionKeyLength) == - (ssize_t)pSession->encryptedSessionKeyLength && - read(fileDesc, pSession->dataSignature, SHA1_HASH_SIZE) == - SHA1_HASH_SIZE && - read(fileDesc, pSession->headerSignature, SHA1_HASH_SIZE) == - SHA1_HASH_SIZE) { - isSuccess = FwdLockFile_DeriveKeys(pSession); - } - } - } - if (isSuccess) { - pSession->dataOffset = pSession->contentTypeLength + - pSession->encryptedSessionKeyLength + TOP_HEADER_SIZE + 2 * SHA1_HASH_SIZE; - pSession->filePos = 0; - pSession->blockIndex = INVALID_BLOCK_INDEX; - } else { - FwdLockFile_ReleaseSession(sessionId); - sessionId = -1; - } - } - return (sessionId >= 0) ? 0 : -1; -} - -int FwdLockFile_open(const char *pFilename) { - int fileDesc = open(pFilename, O_RDONLY); - if (fileDesc < 0) { - ALOGE("failed to open file '%s': %s", pFilename, strerror(errno)); - return fileDesc; - } - - if (FwdLockFile_attach(fileDesc) < 0) { - (void)close(fileDesc); - fileDesc = -1; - } - return fileDesc; -} - -ssize_t FwdLockFile_read(int fileDesc, void *pBuffer, size_t numBytes) { - ssize_t numBytesRead; - int sessionId = FwdLockFile_FindSession(fileDesc); - if (sessionId < 0) { - numBytesRead = -1; - } else { - FwdLockFile_Session_t *pSession = sessionPtrs[sessionId]; - ssize_t i; - numBytesRead = read(pSession->fileDesc, pBuffer, numBytes); - for (i = 0; i < numBytesRead; ++i) { - FwdLockFile_DecryptByte(pSession, &((unsigned char *)pBuffer)[i]); - ++pSession->filePos; - } - } - return numBytesRead; -} - -off64_t FwdLockFile_lseek(int fileDesc, off64_t offset, int whence) { - off64_t newFilePos; - int sessionId = FwdLockFile_FindSession(fileDesc); - if (sessionId < 0) { - newFilePos = INVALID_OFFSET; - } else { - FwdLockFile_Session_t *pSession = sessionPtrs[sessionId]; - switch (whence) { - case SEEK_SET: - newFilePos = lseek64(pSession->fileDesc, pSession->dataOffset + offset, whence); - break; - case SEEK_CUR: - case SEEK_END: - newFilePos = lseek64(pSession->fileDesc, offset, whence); - break; - default: - errno = EINVAL; - newFilePos = INVALID_OFFSET; - break; - } - if (newFilePos != INVALID_OFFSET) { - if (newFilePos < pSession->dataOffset) { - // The new file position is illegal for an internal Forward Lock file. Restore the - // original file position. - (void)lseek64(pSession->fileDesc, pSession->dataOffset + pSession->filePos, - SEEK_SET); - errno = EINVAL; - newFilePos = INVALID_OFFSET; - } else { - // The return value should be the file position that lseek64() would have returned - // for the embedded content file. - pSession->filePos = newFilePos - pSession->dataOffset; - newFilePos = pSession->filePos; - } - } - } - return newFilePos; -} - -int FwdLockFile_detach(int fileDesc) { - int sessionId = FwdLockFile_FindSession(fileDesc); - if (sessionId < 0) { - return -1; - } - HMAC_CTX_cleanup(&sessionPtrs[sessionId]->signingContext); - FwdLockFile_ReleaseSession(sessionId); - return 0; -} - -int FwdLockFile_close(int fileDesc) { - return (FwdLockFile_detach(fileDesc) == 0) ? close(fileDesc) : -1; -} - -int FwdLockFile_CheckDataIntegrity(int fileDesc) { - int result; - int sessionId = FwdLockFile_FindSession(fileDesc); - if (sessionId < 0) { - result = FALSE; - } else { - struct FwdLockFile_CheckDataIntegrity_Data { - unsigned char signature[SHA1_HASH_SIZE]; - unsigned char buffer[SIG_CALC_BUFFER_SIZE]; - } *pData = malloc(sizeof *pData); - if (pData == NULL) { - result = FALSE; - } else { - FwdLockFile_Session_t *pSession = sessionPtrs[sessionId]; - if (lseek64(pSession->fileDesc, pSession->dataOffset, SEEK_SET) != - pSession->dataOffset) { - result = FALSE; - } else { - ssize_t numBytesRead; - unsigned int signatureSize = SHA1_HASH_SIZE; - while ((numBytesRead = - read(pSession->fileDesc, pData->buffer, SIG_CALC_BUFFER_SIZE)) > 0) { - HMAC_Update(&pSession->signingContext, pData->buffer, (size_t)numBytesRead); - } - if (numBytesRead < 0) { - result = FALSE; - } else { - HMAC_Final(&pSession->signingContext, pData->signature, &signatureSize); - assert(signatureSize == SHA1_HASH_SIZE); - result = memcmp(pData->signature, pSession->dataSignature, SHA1_HASH_SIZE) == 0; - } - HMAC_Init_ex(&pSession->signingContext, NULL, KEY_SIZE, NULL, NULL); - (void)lseek64(pSession->fileDesc, pSession->dataOffset + pSession->filePos, - SEEK_SET); - } - free(pData); - } - } - return result; -} - -int FwdLockFile_CheckHeaderIntegrity(int fileDesc) { - int result; - int sessionId = FwdLockFile_FindSession(fileDesc); - if (sessionId < 0) { - result = FALSE; - } else { - FwdLockFile_Session_t *pSession = sessionPtrs[sessionId]; - unsigned char signature[SHA1_HASH_SIZE]; - unsigned int signatureSize = SHA1_HASH_SIZE; - HMAC_Update(&pSession->signingContext, pSession->topHeader, TOP_HEADER_SIZE); - HMAC_Update(&pSession->signingContext, (unsigned char *)pSession->pContentType, - pSession->contentTypeLength); - HMAC_Update(&pSession->signingContext, pSession->pEncryptedSessionKey, - pSession->encryptedSessionKeyLength); - HMAC_Update(&pSession->signingContext, pSession->dataSignature, SHA1_HASH_SIZE); - HMAC_Final(&pSession->signingContext, signature, &signatureSize); - assert(signatureSize == SHA1_HASH_SIZE); - result = memcmp(signature, pSession->headerSignature, SHA1_HASH_SIZE) == 0; - HMAC_Init_ex(&pSession->signingContext, NULL, KEY_SIZE, NULL, NULL); - } - return result; -} - -int FwdLockFile_CheckIntegrity(int fileDesc) { - return FwdLockFile_CheckHeaderIntegrity(fileDesc) && FwdLockFile_CheckDataIntegrity(fileDesc); -} - -const char *FwdLockFile_GetContentType(int fileDesc) { - int sessionId = FwdLockFile_FindSession(fileDesc); - if (sessionId < 0) { - return NULL; - } - return sessionPtrs[sessionId]->pContentType; -} diff --git a/drm/libdrmframework/plugins/forward-lock/internal-format/decoder/FwdLockFile.h b/drm/libdrmframework/plugins/forward-lock/internal-format/decoder/FwdLockFile.h deleted file mode 100644 index fc64050..0000000 --- a/drm/libdrmframework/plugins/forward-lock/internal-format/decoder/FwdLockFile.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __FWDLOCKFILE_H__ -#define __FWDLOCKFILE_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include <sys/types.h> - -/** - * Attaches to an open Forward Lock file. The file position is assumed to be at the beginning of the - * file. - * - * @param[in] fileDesc The file descriptor of an open Forward Lock file. - * - * @return A status code. - * @retval 0 Success. - * @retval -1 Failure. - */ -int FwdLockFile_attach(int fileDesc); - -/** - * Opens a Forward Lock file for reading. - * - * @param[in] pFilename A reference to a filename. - * - * @return A file descriptor. - * @retval -1 Failure. - */ -int FwdLockFile_open(const char *pFilename); - -/** - * Reads the specified number of bytes from an open Forward Lock file. - * - * @param[in] fileDesc The file descriptor of an open Forward Lock file. - * @param[out] pBuffer A reference to the buffer that should receive the read data. - * @param[in] numBytes The number of bytes to read. - * - * @return The number of bytes read. - * @retval -1 Failure. - */ -ssize_t FwdLockFile_read(int fileDesc, void *pBuffer, size_t numBytes); - -/** - * Updates the file position within an open Forward Lock file. - * - * @param[in] fileDesc The file descriptor of an open Forward Lock file. - * @param[in] offset The offset with which to update the file position. - * @param[in] whence One of SEEK_SET, SEEK_CUR, and SEEK_END. - * - * @return The new file position. - * @retval ((off64_t)-1) Failure. - */ -off64_t FwdLockFile_lseek(int fileDesc, off64_t offset, int whence); - -/** - * Detaches from an open Forward Lock file. - * - * @param[in] fileDesc The file descriptor of an open Forward Lock file. - * - * @return A status code. - * @retval 0 Success. - * @retval -1 Failure. - */ -int FwdLockFile_detach(int fileDesc); - -/** - * Closes an open Forward Lock file. - * - * @param[in] fileDesc The file descriptor of an open Forward Lock file. - * - * @return A status code. - * @retval 0 Success. - * @retval -1 Failure. - */ -int FwdLockFile_close(int fileDesc); - -/** - * Checks the data integrity of an open Forward Lock file. - * - * @param[in] fileDesc The file descriptor of an open Forward Lock file. - * - * @return A Boolean value indicating whether the integrity check was successful. - */ -int FwdLockFile_CheckDataIntegrity(int fileDesc); - -/** - * Checks the header integrity of an open Forward Lock file. - * - * @param[in] fileDesc The file descriptor of an open Forward Lock file. - * - * @return A Boolean value indicating whether the integrity check was successful. - */ -int FwdLockFile_CheckHeaderIntegrity(int fileDesc); - -/** - * Checks both the data and header integrity of an open Forward Lock file. - * - * @param[in] fileDesc The file descriptor of an open Forward Lock file. - * - * @return A Boolean value indicating whether the integrity check was successful. - */ -int FwdLockFile_CheckIntegrity(int fileDesc); - -/** - * Returns the content type of an open Forward Lock file. - * - * @param[in] fileDesc The file descriptor of an open Forward Lock file. - * - * @return - * A reference to the content type. The reference remains valid as long as the file is kept open. - */ -const char *FwdLockFile_GetContentType(int fileDesc); - -#ifdef __cplusplus -} -#endif - -#endif // __FWDLOCKFILE_H__ diff --git a/drm/libdrmframework/plugins/forward-lock/internal-format/doc/FwdLock.html b/drm/libdrmframework/plugins/forward-lock/internal-format/doc/FwdLock.html deleted file mode 100755 index 8f95cd2..0000000 --- a/drm/libdrmframework/plugins/forward-lock/internal-format/doc/FwdLock.html +++ /dev/null @@ -1,1039 +0,0 @@ -<html> - -<head> -<meta http-equiv=Content-Type content="text/html; charset=windows-1252"> -<meta name=Generator content="Microsoft Word 12 (filtered)"> -<title>Forward Lock Converter and Decoder</title> -<style> -<!-- - /* Font Definitions */ - @font-face - {font-family:SimSun; - panose-1:2 1 6 0 3 1 1 1 1 1;} -@font-face - {font-family:"Cambria Math"; - panose-1:2 4 5 3 5 4 6 3 2 4;} -@font-face - {font-family:Tahoma; - panose-1:2 11 6 4 3 5 4 4 2 4;} -@font-face - {font-family:"Lucida Console","DejaVu Sans Mono"; - panose-1:2 11 6 9 4 5 4 2 2 4;} -@font-face - {font-family:"\@SimSun"; - panose-1:2 1 6 0 3 1 1 1 1 1;} - /* Style Definitions */ - p.MsoNormal, li.MsoNormal, div.MsoNormal - {margin:0cm; - margin-bottom:.0001pt; - font-size:12.0pt; - font-family:"Times New Roman","serif";} -h1 - {margin-right:0cm; - margin-left:21.6pt; - text-indent:-21.6pt; - page-break-after:avoid; - font-size:16.0pt; - font-family:"Arial","sans-serif";} -h2 - {margin-top:12.0pt; - margin-right:0cm; - margin-bottom:3.0pt; - margin-left:28.8pt; - text-indent:-28.8pt; - page-break-after:avoid; - font-size:14.0pt; - font-family:"Arial","sans-serif"; - font-style:italic;} -h3 - {margin-top:12.0pt; - margin-right:0cm; - margin-bottom:3.0pt; - margin-left:36.0pt; - text-indent:-36.0pt; - page-break-after:avoid; - font-size:13.0pt; - font-family:"Arial","sans-serif";} -h4 - {margin-top:12.0pt; - margin-right:0cm; - margin-bottom:3.0pt; - margin-left:43.2pt; - text-indent:-43.2pt; - page-break-after:avoid; - font-size:14.0pt; - font-family:"Times New Roman","serif";} -h5 - {margin-top:12.0pt; - margin-right:0cm; - margin-bottom:3.0pt; - margin-left:50.4pt; - text-indent:-50.4pt; - font-size:13.0pt; - font-family:"Times New Roman","serif"; - font-style:italic;} -h6 - {margin-top:12.0pt; - margin-right:0cm; - margin-bottom:3.0pt; - margin-left:57.6pt; - text-indent:-57.6pt; - font-size:11.0pt; - font-family:"Times New Roman","serif";} -p.MsoHeading7, li.MsoHeading7, div.MsoHeading7 - {margin-top:12.0pt; - margin-right:0cm; - margin-bottom:3.0pt; - margin-left:64.8pt; - text-indent:-64.8pt; - font-size:12.0pt; - font-family:"Times New Roman","serif";} -p.MsoHeading8, li.MsoHeading8, div.MsoHeading8 - {margin-top:12.0pt; - margin-right:0cm; - margin-bottom:3.0pt; - margin-left:72.0pt; - text-indent:-72.0pt; - font-size:12.0pt; - font-family:"Times New Roman","serif"; - font-style:italic;} -p.MsoHeading9, li.MsoHeading9, div.MsoHeading9 - {margin-top:12.0pt; - margin-right:0cm; - margin-bottom:3.0pt; - margin-left:79.2pt; - text-indent:-79.2pt; - font-size:11.0pt; - font-family:"Arial","sans-serif";} -p.MsoToc1, li.MsoToc1, div.MsoToc1 - {margin-top:6.0pt; - margin-right:0cm; - margin-bottom:6.0pt; - margin-left:0cm; - line-height:150%; - font-size:10.5pt; - font-family:"Times New Roman","serif"; - text-transform:uppercase; - font-weight:bold;} -p.MsoToc2, li.MsoToc2, div.MsoToc2 - {margin-top:0cm; - margin-right:0cm; - margin-bottom:0cm; - margin-left:12.0pt; - margin-bottom:.0001pt; - line-height:150%; - font-size:10.5pt; - font-family:"Times New Roman","serif"; - font-variant:small-caps;} -p.MsoToc3, li.MsoToc3, div.MsoToc3 - {margin-top:0cm; - margin-right:0cm; - margin-bottom:0cm; - margin-left:24.0pt; - margin-bottom:.0001pt; - line-height:150%; - font-size:10.5pt; - font-family:"Times New Roman","serif"; - font-style:italic;} -p.MsoToc4, li.MsoToc4, div.MsoToc4 - {margin-top:0cm; - margin-right:0cm; - margin-bottom:0cm; - margin-left:36.0pt; - margin-bottom:.0001pt; - font-size:9.0pt; - font-family:"Times New Roman","serif";} -p.MsoToc5, li.MsoToc5, div.MsoToc5 - {margin-top:0cm; - margin-right:0cm; - margin-bottom:0cm; - margin-left:48.0pt; - margin-bottom:.0001pt; - font-size:9.0pt; - font-family:"Times New Roman","serif";} -p.MsoToc6, li.MsoToc6, div.MsoToc6 - {margin-top:0cm; - margin-right:0cm; - margin-bottom:0cm; - margin-left:60.0pt; - margin-bottom:.0001pt; - font-size:9.0pt; - font-family:"Times New Roman","serif";} -p.MsoToc7, li.MsoToc7, div.MsoToc7 - {margin-top:0cm; - margin-right:0cm; - margin-bottom:0cm; - margin-left:72.0pt; - margin-bottom:.0001pt; - font-size:9.0pt; - font-family:"Times New Roman","serif";} -p.MsoToc8, li.MsoToc8, div.MsoToc8 - {margin-top:0cm; - margin-right:0cm; - margin-bottom:0cm; - margin-left:84.0pt; - margin-bottom:.0001pt; - font-size:9.0pt; - font-family:"Times New Roman","serif";} -p.MsoToc9, li.MsoToc9, div.MsoToc9 - {margin-top:0cm; - margin-right:0cm; - margin-bottom:0cm; - margin-left:96.0pt; - margin-bottom:.0001pt; - font-size:9.0pt; - font-family:"Times New Roman","serif";} -p.MsoFootnoteText, li.MsoFootnoteText, div.MsoFootnoteText - {margin:0cm; - margin-bottom:.0001pt; - font-size:10.0pt; - font-family:"Times New Roman","serif";} -p.MsoHeader, li.MsoHeader, div.MsoHeader - {margin:0cm; - margin-bottom:.0001pt; - font-size:12.0pt; - font-family:"Times New Roman","serif";} -p.MsoFooter, li.MsoFooter, div.MsoFooter - {margin:0cm; - margin-bottom:.0001pt; - font-size:12.0pt; - font-family:"Times New Roman","serif";} -p.MsoCaption, li.MsoCaption, div.MsoCaption - {margin:0cm; - margin-bottom:.0001pt; - font-size:11.0pt; - font-family:"Times New Roman","serif"; - font-weight:bold;} -span.MsoFootnoteReference - {vertical-align:super;} -p.MsoTitle, li.MsoTitle, div.MsoTitle - {margin-top:12.0pt; - margin-right:0cm; - margin-bottom:120.0pt; - margin-left:0cm; - text-align:center; - font-size:16.0pt; - font-family:"Arial","sans-serif"; - font-weight:bold;} -p.MsoBodyText, li.MsoBodyText, div.MsoBodyText - {mso-style-link:"Body Text Char"; - margin-top:0cm; - margin-right:0cm; - margin-bottom:6.0pt; - margin-left:0cm; - font-size:12.0pt; - font-family:"Times New Roman","serif";} -a:link, span.MsoHyperlink - {color:blue; - text-decoration:underline;} -a:visited, span.MsoHyperlinkFollowed - {color:purple; - text-decoration:underline;} -p.MsoAcetate, li.MsoAcetate, div.MsoAcetate - {margin:0cm; - margin-bottom:.0001pt; - font-size:8.0pt; - font-family:"Tahoma","sans-serif";} -span.BodyTextChar - {mso-style-name:"Body Text Char"; - mso-style-link:"Body Text";} - /* Page Definitions */ - @page WordSection1 - {size:595.45pt 841.7pt; - margin:72.0pt 90.0pt 72.0pt 90.0pt;} -div.WordSection1 - {page:WordSection1;} -@page WordSection2 - {size:595.45pt 841.7pt; - margin:72.0pt 90.0pt 72.0pt 90.0pt;} -div.WordSection2 - {page:WordSection2;} - /* List Definitions */ - ol - {margin-bottom:0cm;} -ul - {margin-bottom:0cm;} ---> -</style> - -</head> - -<body lang=EN-US link=blue vlink=purple> - -<div class=WordSection1> - -<p class=MsoTitle>Forward Lock Converter And Decoder</p> - -<p class=MsoToc1><span -class=MsoHyperlink><a href="#_Toc276471422">1<span style='font-size:12.0pt; -line-height:150%;color:windowtext;text-transform:none;font-weight:normal; -text-decoration:none'> </span>Introduction<span style='color:windowtext; -display:none;text-decoration:none'>. </span><span -style='color:windowtext;display:none;text-decoration:none'>3</span></a></span></p> - -<p class=MsoToc1><span class=MsoHyperlink><a href="#_Toc276471423">2<span -style='font-size:12.0pt;line-height:150%;color:windowtext;text-transform:none; -font-weight:normal;text-decoration:none'> </span>Overview<span -style='color:windowtext;display:none;text-decoration:none'>... </span><span -style='color:windowtext;display:none;text-decoration:none'>3</span></a></span></p> - -<p class=MsoToc1><span class=MsoHyperlink><a href="#_Toc276471424">3<span -style='font-size:12.0pt;line-height:150%;color:windowtext;text-transform:none; -font-weight:normal;text-decoration:none'> </span>Use Cases<span -style='color:windowtext;display:none;text-decoration:none'>. </span><span -style='color:windowtext;display:none;text-decoration:none'>4</span></a></span></p> - -<p class=MsoToc2><span class=MsoHyperlink><span style='font-variant:normal !important; -text-transform:uppercase'><a href="#_Toc276471425">3.1<span style='font-size: -12.0pt;line-height:150%;color:windowtext;text-transform:none;text-decoration: -none'> </span>Converter<span style='color:windowtext;display:none; -text-decoration:none'>. </span><span -style='color:windowtext;display:none;text-decoration:none'>4</span></a></span></span></p> - -<p class=MsoToc3><span class=MsoHyperlink><a href="#_Toc276471426">3.1.1<span -style='font-size:12.0pt;line-height:150%;color:windowtext;font-style:normal; -text-decoration:none'> </span>Convert Data (Push-Mode Conversion)<span -style='color:windowtext;display:none;text-decoration:none'> </span><span -style='color:windowtext;display:none;text-decoration:none'>4</span></a></span></p> - -<p class=MsoToc3><span class=MsoHyperlink><a href="#_Toc276471427">3.1.2<span -style='font-size:12.0pt;line-height:150%;color:windowtext;font-style:normal; -text-decoration:none'> </span>Convert File (Pull-Mode Conversion)<span -style='color:windowtext;display:none;text-decoration:none'> </span><span -style='color:windowtext;display:none;text-decoration:none'>6</span></a></span></p> - -<p class=MsoToc2><span class=MsoHyperlink><span style='font-variant:normal !important; -text-transform:uppercase'><a href="#_Toc276471428">3.2<span style='font-size: -12.0pt;line-height:150%;color:windowtext;text-transform:none;text-decoration: -none'> </span>Decoder<span style='color:windowtext;display:none; -text-decoration:none'>. </span><span -style='color:windowtext;display:none;text-decoration:none'>7</span></a></span></span></p> - -<p class=MsoToc3><span class=MsoHyperlink><a href="#_Toc276471429">3.2.1<span -style='font-size:12.0pt;line-height:150%;color:windowtext;font-style:normal; -text-decoration:none'> </span>Check Integrity<span style='color:windowtext; -display:none;text-decoration:none'>. </span><span -style='color:windowtext;display:none;text-decoration:none'>8</span></a></span></p> - -<p class=MsoToc3><span class=MsoHyperlink><a href="#_Toc276471430">3.2.2<span -style='font-size:12.0pt;line-height:150%;color:windowtext;font-style:normal; -text-decoration:none'> </span>Get Content Type<span style='color:windowtext; -display:none;text-decoration:none'>. </span><span -style='color:windowtext;display:none;text-decoration:none'>9</span></a></span></p> - -<p class=MsoToc3><span class=MsoHyperlink><a href="#_Toc276471431">3.2.3<span -style='font-size:12.0pt;line-height:150%;color:windowtext;font-style:normal; -text-decoration:none'> </span>Decode File<span style='color:windowtext; -display:none;text-decoration:none'>. </span><span -style='color:windowtext;display:none;text-decoration:none'>10</span></a></span></p> - -<p class=MsoToc1><span class=MsoHyperlink><a href="#_Toc276471432">4<span -style='font-size:12.0pt;line-height:150%;color:windowtext;text-transform:none; -font-weight:normal;text-decoration:none'> </span>Definition of the -Internal Forward Lock File Format<span style='color:windowtext;display:none; -text-decoration:none'>. </span><span -style='color:windowtext;display:none;text-decoration:none'>11</span></a></span></p> - -<p class=MsoToc2><span class=MsoHyperlink><span style='font-variant:normal !important; -text-transform:uppercase'><a href="#_Toc276471433">4.1<span style='font-size: -12.0pt;line-height:150%;color:windowtext;text-transform:none;text-decoration: -none'> </span>Key Derivation<span style='color:windowtext;display:none; -text-decoration:none'>.. </span><span -style='color:windowtext;display:none;text-decoration:none'>11</span></a></span></span></p> - -<p class=MsoToc2><span class=MsoHyperlink><span style='font-variant:normal !important; -text-transform:uppercase'><a href="#_Toc276471434">4.2<span style='font-size: -12.0pt;line-height:150%;color:windowtext;text-transform:none;text-decoration: -none'> </span>Calculation of the Counters<span style='color:windowtext; -display:none;text-decoration:none'>. </span><span -style='color:windowtext;display:none;text-decoration:none'>12</span></a></span></span></p> - -<p class=MsoToc1><span class=MsoHyperlink><a href="#_Toc276471435">5<span -style='font-size:12.0pt;line-height:150%;color:windowtext;text-transform:none; -font-weight:normal;text-decoration:none'> </span>Unit Test Cases<span -style='color:windowtext;display:none;text-decoration:none'>. </span><span -style='color:windowtext;display:none;text-decoration:none'>12</span></a></span></p> - -<p class=MsoToc1><span class=MsoHyperlink><a href="#_Toc276471436">6<span -style='font-size:12.0pt;line-height:150%;color:windowtext;text-transform:none; -font-weight:normal;text-decoration:none'> </span>References<span -style='color:windowtext;display:none;text-decoration:none'>. </span><span -style='color:windowtext;display:none;text-decoration:none'>12</span></a></span></p> - -<p class=MsoBodyText></p> - -</div> - -<span style='font-size:12.0pt;font-family:"Times New Roman","serif"'><br -clear=all style='page-break-before:right'> -</span> - -<div class=WordSection2> - -<h1><a name="_Toc276471422"></a><a name="_Ref263085474">1<span -style='font:7.0pt "Times New Roman"'> </span>Introduction</a></h1> - -<p class=MsoBodyText>The internal Forward Lock file format is used for encrypting -inherently unencrypted OMA DRM version 1 Forward Lock and Combined Delivery -files so they can be securely stored on externally accessible file system partitions -such as memory stick.</p> - -<p class=MsoBodyText>Our general strategy is to convert such <i>OMA DRM Message</i> -(‘.dm’) files to internal Forward Lock (‘.fl’) files as soon as they are -downloaded or otherwise transferred to the phone, and not actually provide any -decoders for ‘.dm’ files.</p> - -<h1><a name="_Toc276471423">2<span style='font:7.0pt "Times New Roman"'> -</span>Overview</a></h1> - -<p class=MsoBodyText>The <i>Forward Lock Converter</i> converts OMA DRM Message -files to the internal file format. The <i>Forward Lock Decoder</i> provides a -POSIX-level API for transparent reading and seeking through such a converted -file as if it were unencrypted. The API also includes functions for checking a -file’s integrity and getting the MIME type of its embedded content.</p> - -<p class=MsoBodyText style='margin-bottom:24.0pt'>The converter and decoder are -built into two separate libraries, which share common code for random number -generation and key encryption in a third library. For test purposes there is -also a unit test application. See Figure 1.</p> - -<p class=MsoBodyText style='page-break-after:avoid'><img width=288 height=364 -src="images/image001.gif"></p> - -<p class=MsoCaption style='margin-top:12.0pt;margin-right:0cm;margin-bottom: -12.0pt;margin-left:0cm'><a name="_Ref262730885">Figure </a>1. Block diagram illustrating the dependencies between the executable modules.</p> - -<b><span style='font-size:16.0pt;font-family:"Arial","sans-serif"'><br -clear=all style='page-break-before:always'> -</span></b> - -<h1><a name="_Toc276471424">3<span style='font:7.0pt "Times New Roman"'> -</span>Use Cases</a></h1> - -<p class=MsoBodyText>This section describes all the use cases for the converter -and decoder. It shows the sequence of API calls that should be used to solve -these use cases.</p> - -<h2><a name="_Toc276471425">3.1<span style='font:7.0pt "Times New Roman"'> -</span>Converter</a></h2> - -<p class=MsoBodyText>Through the converter API, conversion can be performed in one -of two ways:</p> - -<p class=MsoBodyText style='margin-left:36.0pt;text-indent:-18.0pt'>1.<span -style='font:7.0pt "Times New Roman"'> </span><i>Push-mode -conversion</i> is when the client progressively feeds data to the converter as -it arrives. This is appropriate when data arrives gradually in chunks, with -idle time in between. Consequently, push mode is used for converting files -being downloaded through HTTP. See section 3.1.1.</p> - -<p class=MsoBodyText style='margin-left:36.0pt;text-indent:-18.0pt'>2.<span -style='font:7.0pt "Times New Roman"'> </span><i>Pull-mode -conversion</i> is when the converter drives the process and consumes data from -the client as it needs it. This is appropriate when the entire file to be -converted is readily available. Hence, pull mode is used by the unit test application. -See section 3.1.2.</p> - -<p class=MsoBodyText>Internally, pull-mode conversion is implemented in terms -of the API for push-mode conversion.</p> - -<h3><a name="_Toc276471426"></a><a name="_Ref263085478">3.1.1<span -style='font:7.0pt "Times New Roman"'> </span>Convert Data -(Push-Mode Conversion)</a></h3> - -<p class=MsoBodyText>Push-mode conversion is performed as follows (see also Figure 2):</p> - -<p class=MsoBodyText style='margin-left:36.0pt;text-indent:-18.0pt'>1.<span -style='font:7.0pt "Times New Roman"'> </span><span -style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockConv_OpenSession</span> -initializes the output parameter and returns a <i>session ID</i> to be used in -subsequent calls to the API. The output parameter is a union of return values -whose correct use at any given moment is determined by the API function last -called.</p> - -<p class=MsoBodyText style='margin-left:36.0pt;text-indent:-18.0pt'>2.<span -style='font:7.0pt "Times New Roman"'> </span><span -style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockConv_ConvertData</span> -is called repeatedly until no more input data remains. Each call converts the -maximum amount of data possible and writes it to the output buffer. The client then -writes this data to file.</p> - -<p class=MsoBodyText style='margin-left:36.0pt;text-indent:-18.0pt'>3.<span -style='font:7.0pt "Times New Roman"'> </span><span -style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockConv_CloseSession</span> -cleans up the session and deallocates the output buffer. If all has gone well, a -two-part cryptographic signature of the output file is calculated. The client -must go back and rewrite part of the file header with this updated signature -information.</p> - -<p class=MsoBodyText>Every time a file is being converted, the converter calls <span -style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockGlue_GetRandomNumber</span> -to generate a new, unique session key. No two converted files look alike, even -if the original files are the same.</p> - -<p class=MsoBodyText><b>Note:</b> The random bytes cannot come from any bare-minimum -implementation of the C-library <span style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>rand</span> -function—they must be cryptographically secure. Otherwise, security will be -compromised.</p> - -<p class=MsoBodyText>The session key is encrypted and stored within the -converted file. Key encryption is performed using <span style='font-size:10.0pt; -font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockGlue_GetEncryptedKeyLength</span> and <span -style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockGlue_EncryptKey</span>. -These two functions, together with the corresponding decryption function (<span -style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockGlue_DecryptKey</span>), -are the integration points where an OEM manufacturer may implement their own -key-encryption scheme.</p> - -<p class=MsoBodyText><b>Note:</b> The key-encryption key must be unique to each -device; this is what makes the files forward lock–protected. Ideally, it should -be derived from secret hardware parameters, but at the very least it should be -persistent from one master reset to the next.</p> - -<div style='margin-bottom:24.0pt;border:solid windowtext 1.0pt;padding:1.0pt 4.0pt 1.0pt 4.0pt; -background:#F2F2F2'> - -<p class=MsoBodyText style='background:#F2F2F2;border: -none;padding:0cm'><b>Note:</b> In the open-source implementation of the <span -style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>libfwdlock-common</span> -library, a random key-encryption key is generated and stored in plaintext in -the file system, without being obfuscated in any way (doing so would be futile -since the source code is openly available). This key must be kept secret from -the user, and shouldn’t be possible to extract through backup-and-restore -functionality or the like. OEM manufacturers will probably want to implement a -truly hardware-based device-unique key.</p> - -</div> - -<p class=MsoBodyText style='page-break-after:avoid'><img width=531 height=563 -src="images/image002.gif"></p> - -<p class=MsoCaption style='margin-top:6.0pt;margin-right:0cm;margin-bottom: -12.0pt;margin-left:0cm'><a name="_Ref263085187">Figure </a>2. Converter UC: Convert Data.</p> - -<b><span style='font-size:13.0pt;font-family:"Arial","sans-serif"'><br -clear=all style='page-break-before:always'> -</span></b> - -<h3><a name="_Toc276471427"></a><a name="_Ref263163082">3.1.2<span -style='font:7.0pt "Times New Roman"'> </span>Convert File -(Pull-Mode Conversion)</a></h3> - -<p class=MsoBodyText>Pull-mode conversion is performed by calling <span -style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_ConvertFile</span> -with the filename, unless there is need for a specialized <span -style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>read</span> function, in -which case <span style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_ConvertOpenFile</span> -should be used directly instead. See Figure 3.</p> - -<p class=MsoBodyText style='margin-bottom:24.0pt'>Internally, <span -style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_ConvertFile</span> -calls <span style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_ConvertOpenFile</span>. -The latter then proceeds with the conversion using the push-mode API, acting as -the client in the previous use case; see section 3.1.1.</p> - -<p class=MsoBodyText style='page-break-after:avoid'><img width=531 height=731 -src="images/image003.gif"></p> - -<p class=MsoCaption style='margin-top:6.0pt;margin-right:0cm;margin-bottom: -12.0pt;margin-left:0cm'><a name="_Ref263085208">Figure </a>3. Converter UC: Convert File.</p> - -<b><i><span style='font-size:14.0pt;font-family:"Arial","sans-serif"'><br -clear=all style='page-break-before:always'> -</span></i></b> - -<h2><a name="_Toc276471428">3.2<span style='font:7.0pt "Times New Roman"'> -</span>Decoder</a></h2> - -<p class=MsoBodyText>The decoder API allows the client to do the following:</p> - -<p class=MsoBodyText style='margin-left:36.0pt;text-indent:-18.0pt'>1.<span -style='font:7.0pt "Times New Roman"'> </span>Check -the integrity of an internal Forward Lock file, i.e., detect whether it has -been manipulated in any way; see section 3.2.1.</p> - -<p class=MsoBodyText style='margin-left:36.0pt;text-indent:-18.0pt'>2.<span -style='font:7.0pt "Times New Roman"'> </span>Get -the MIME type of the embedded content (the “original” MIME type before DRM protection -was applied); see section 3.2.2.</p> - -<p class=MsoBodyText style='margin-left:36.0pt;text-indent:-18.0pt'>3.<span -style='font:7.0pt "Times New Roman"'> </span>Decode -the file by random access, i.e., read and seek through it in an arbitrary -manner; see section 3.2.3.</p> - -<p class=MsoBodyText>All subsequent operations on a file first require it to be -opened. Opening a file returns a <i>file descriptor</i>—a handle to be used in -these subsequent operations.</p> - -<p class=MsoBodyText>If the filename is known, an internal Forward Lock file -can be opened using <span style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_open</span>. -If only the file descriptor of an already open file is available, a decoding -session can instead be initialized using <span style='font-size:10.0pt; -font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_attach</span>.</p> - -<p class=MsoBodyText>Internally, <span style='font-size:10.0pt;font-family: -"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_open</span> calls <span style='font-size:10.0pt; -font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_attach</span>. For efficiency -reasons, <span style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_attach</span> -therefore assumes that the file position is at the beginning of the file when -the function gets called. A client who calls it directly must make sure that -this assumption holds.</p> - -<p class=MsoBodyText>When a file is being attached, the session key stored in -the file during conversion is decrypted using <span style='font-size:10.0pt; -font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockGlue_GetEncryptedKeyLength</span> and <span -style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockGlue_DecryptKey</span>, -in order to set up for decoding and integrity checking.</p> - -<p class=MsoBodyText>For just getting the content type, however, retrieving the -session key would strictly speaking not be necessary, so there is an -opportunity here to optimize for that if it proves necessary later.</p> - -<p class=MsoBodyText>Symmetrical to <span style='font-size:10.0pt;font-family: -"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_open</span> and <span style='font-size:10.0pt; -font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_attach</span>, there are also functions -for closing a file or detaching from it:</p> - -<p class=MsoBodyText style='margin-left:36.0pt;text-indent:-18.0pt'>1.<span -style='font:7.0pt "Times New Roman"'> </span>If -it was opened with <span style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_open</span> -it should be closed with <span style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_close</span>.</p> - -<p class=MsoBodyText style='margin-left:36.0pt;text-indent:-18.0pt'>2.<span -style='font:7.0pt "Times New Roman"'> </span>If -it was attached with <span style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_attach</span> -it should be detached with <span style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_detach</span>.</p> - -<b><span style='font-size:13.0pt;font-family:"Arial","sans-serif"'><br -clear=all style='page-break-before:always'> -</span></b> - -<h3><a name="_Ref263163099"></a><a name="_Toc276471429">3.2.1<span -style='font:7.0pt "Times New Roman"'> </span>Check Integrity</a></h3> - -<p class=MsoBodyText>There are three methods for checking the integrity of an -internal Forward Lock file, in whole or in part (see also Figure 4):</p> - -<p class=MsoBodyText style='margin-left:36.0pt;text-indent:-18.0pt'>1.<span -style='font:7.0pt "Times New Roman"'> </span><span -style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_CheckDataIntegrity</span>, -which checks the integrity of the encrypted content data.</p> - -<p class=MsoBodyText style='margin-left:36.0pt;text-indent:-18.0pt'>2.<span -style='font:7.0pt "Times New Roman"'> </span><span -style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_CheckHeaderIntegrity</span>, -which checks the integrity of the file header, including the content type and -other fields not currently supported but reserved for future use.</p> - -<p class=MsoBodyText style='margin-left:36.0pt;text-indent:-18.0pt'>3.<span -style='font:7.0pt "Times New Roman"'> </span><span -style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_CheckIntegrity</span>, -which internally calls first <span style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_CheckHeaderIntegrity</span> -and then <span style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_CheckDataIntegrity</span>.</p> - -<p class=MsoBodyText style='margin-bottom:24.0pt'><span style='font-size:10.0pt; -font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_CheckHeaderIntegrity</span> is -generally much faster than <span style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_CheckDataIntegrity</span>, -whose running time is directly proportional to the size of the file.</p> - -<p class=MsoBodyText style='page-break-after:avoid'><img width=543 height=575 -src="images/image004.gif"></p> - -<p class=MsoCaption style='margin-top:6.0pt;margin-right:0cm;margin-bottom: -12.0pt;margin-left:0cm'><a name="_Ref263163308">Figure </a>4. Decoder UC: Check Integrity.</p> - -<b><span style='font-size:13.0pt;font-family:"Arial","sans-serif"'><br -clear=all style='page-break-before:always'> -</span></b> - -<h3><a name="_Toc276471430"></a><a name="_Ref263163117">3.2.2<span -style='font:7.0pt "Times New Roman"'> </span>Get Content Type</a></h3> - -<p class=MsoBodyText style='margin-bottom:24.0pt'><span style='font-size:10.0pt; -font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_GetContentType</span> returns a -read-only reference to an ASCII string containing the MIME type of the -embedded content. This reference is valid as long as the file is kept open. -Clients who need access to the content type after closing the file should make -a copy of the string. See Figure 5 below.</p> - -<p class=MsoBodyText style='page-break-after:avoid'><img width=543 height=488 -src="images/image005.gif"></p> - -<p class=MsoCaption style='margin-top:6.0pt;margin-right:0cm;margin-bottom: -12.0pt;margin-left:0cm'><a name="_Ref263163392">Figure </a>5. Decoder UC: Get Content Type.</p> - -<b><span style='font-size:13.0pt;font-family:"Arial","sans-serif"'><br -clear=all style='page-break-before:always'> -</span></b> - -<h3><a name="_Toc276471431"></a><a name="_Ref263163137">3.2.3<span -style='font:7.0pt "Times New Roman"'> </span>Decode File</a></h3> - -<p class=MsoBodyText>After opening an internal Forward Lock file (or attaching -to an already open one), it can be transparently read from as if it were -unencrypted. Any number of calls to read data from the current file position or -set it to a new one (which is what <span style='font-size:10.0pt;font-family: -"Lucida Console","DejaVu Sans Mono"'>lseek</span> does) can be made in any order; this is what we -call <i>random access</i>. See Figure 6.</p> - -<p class=MsoBodyText>The Forward Lock Decoder versions of the <span -style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>read</span>, <span -style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>lseek</span>, and <span -style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>close</span> functions -have the exact same signatures as their POSIX counterparts. So, for example, -the call <span style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_lseek(fd, -0, SEEK_END)</span> returns the size of the embedded content data, i.e., the -size of the original file before DRM protection.</p> - -<p class=MsoBodyText style='margin-bottom:24.0pt'>Moreover, <span -style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>FwdLockFile_open</span> -is like regular POSIX <span style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'>open</span> -except it takes only the filename as a parameter—access is always read-only.</p> - -<p class=MsoBodyText style='page-break-after:avoid'><img width=543 height=522 -src="images/image006.gif"></p> - -<p class=MsoCaption style='margin-top:6.0pt;margin-right:0cm;margin-bottom: -12.0pt;margin-left:0cm'><a name="_Ref263166303">Figure </a>6. Decoder UC: Decode File.</p> - -<b><span style='font-size:16.0pt;font-family:"Arial","sans-serif"'><br -clear=all style='page-break-before:always'> -</span></b> - -<h1><a name="_Toc276471432">4<span style='font:7.0pt "Times New Roman"'> -</span>Definition of the Internal Forward Lock File Format</a></h1> - -<p class=MsoBodyText style='margin-bottom:12.0pt'>The inner structure of an internal -Forward Lock file is defined in Table 1 below.</p> - -<table class=MsoNormalTable border=1 cellspacing=0 cellpadding=0 - style='border-collapse:collapse;border:none'> - <tr> - <td width=111 valign=top style='width:83.4pt;border:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'><b>Offset [bytes]</b></p> - </td> - <td width=96 valign=top style='width:72.0pt;border:solid windowtext 1.0pt; - border-left:none;padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'><b>Size [bytes]</b></p> - </td> - <td width=361 valign=top style='width:270.85pt;border:solid windowtext 1.0pt; - border-left:none;padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'><b>Description</b></p> - </td> - </tr> - <tr> - <td width=111 valign=top style='width:83.4pt;border:solid windowtext 1.0pt; - border-top:none;padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>0</p> - </td> - <td width=96 valign=top style='width:72.0pt;border-top:none;border-left:none; - border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>4</p> - </td> - <td width=361 valign=top style='width:270.85pt;border-top:none;border-left: - none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>The file signature (so-called - <i>magic number</i>): a four-character code consisting of the letters - F-W-L-K.</p> - </td> - </tr> - <tr> - <td width=111 valign=top style='width:83.4pt;border:solid windowtext 1.0pt; - border-top:none;padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>4</p> - </td> - <td width=96 valign=top style='width:72.0pt;border-top:none;border-left:none; - border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>1</p> - </td> - <td width=361 valign=top style='width:270.85pt;border-top:none;border-left: - none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>Version number (0 for the - first version).</p> - </td> - </tr> - <tr> - <td width=111 valign=top style='width:83.4pt;border:solid windowtext 1.0pt; - border-top:none;padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>5</p> - </td> - <td width=96 valign=top style='width:72.0pt;border-top:none;border-left:none; - border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>1</p> - </td> - <td width=361 valign=top style='width:270.85pt;border-top:none;border-left: - none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>Indicates the subformat:</p> - <p class=MsoNormal style='page-break-after:avoid'><i>0x00 Forward Lock</i></p> - <p class=MsoNormal style='page-break-after:avoid'><i>0x01 Combined Delivery</i></p> - </td> - </tr> - <tr> - <td width=111 valign=top style='width:83.4pt;border:solid windowtext 1.0pt; - border-top:none;padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>6</p> - </td> - <td width=96 valign=top style='width:72.0pt;border-top:none;border-left:none; - border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>1</p> - </td> - <td width=361 valign=top style='width:270.85pt;border-top:none;border-left: - none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>Usage restriction flags (prohibitions - against usage as ringtone or as wallpaper and screen saver). Also indicates - if the file is bound to a specific SIM card.</p> - <p class=MsoNormal style='page-break-after:avoid'><i>0x00 No usage - restrictions</i></p> - <p class=MsoNormal style='page-break-after:avoid'><i>0x01 Ringtone usage - prohibited</i></p> - <p class=MsoNormal style='page-break-after:avoid'><i>0x02 Screen usage - prohibited</i></p> - <p class=MsoNormal style='page-break-after:avoid'><i>0x80 Bound to SIM</i></p> - <p class=MsoNormal style='page-break-after:avoid'>(Any number of these may be - OR-ed together.)</p> - </td> - </tr> - <tr> - <td width=111 valign=top style='width:83.4pt;border:solid windowtext 1.0pt; - border-top:none;padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>7</p> - </td> - <td width=96 valign=top style='width:72.0pt;border-top:none;border-left:none; - border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>1</p> - </td> - <td width=361 valign=top style='width:270.85pt;border-top:none;border-left: - none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>Length of the MIME content - type (<i>k</i>).</p> - </td> - </tr> - <tr> - <td width=111 valign=top style='width:83.4pt;border:solid windowtext 1.0pt; - border-top:none;padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>8</p> - </td> - <td width=96 valign=top style='width:72.0pt;border-top:none;border-left:none; - border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'><i>k</i></p> - </td> - <td width=361 valign=top style='width:270.85pt;border-top:none;border-left: - none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>The MIME content type - (ASCII-encoded without null-character termination).</p> - </td> - </tr> - <tr> - <td width=111 valign=top style='width:83.4pt;border:solid windowtext 1.0pt; - border-top:none;padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>8+<i>k</i></p> - </td> - <td width=96 valign=top style='width:72.0pt;border-top:none;border-left:none; - border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'><i>l </i>= 0 or 16</p> - </td> - <td width=361 valign=top style='width:270.85pt;border-top:none;border-left: - none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>If the subformat is - Combined Delivery, this field contains the auto-generated content ID (16 bytes). - If not, this field is zero-size.</p> - </td> - </tr> - <tr> - <td width=111 valign=top style='width:83.4pt;border:solid windowtext 1.0pt; - border-top:none;padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>8+<i>k</i>+<i>l</i></p> - </td> - <td width=96 valign=top style='width:72.0pt;border-top:none;border-left:none; - border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'><i>m </i>= 0 or 9</p> - </td> - <td width=361 valign=top style='width:270.85pt;border-top:none;border-left: - none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>If the file is bound to a - specific SIM card, this field contains the 9-byte packed IMSI number. If not, - this field is zero-size.</p> - </td> - </tr> - <tr> - <td width=111 valign=top style='width:83.4pt;border:solid windowtext 1.0pt; - border-top:none;padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>8+<i>k</i>+<i>l</i>+<i>m</i></p> - </td> - <td width=96 valign=top style='width:72.0pt;border-top:none;border-left:none; - border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'><i>n</i> ≥ 16</p> - </td> - <td width=361 valign=top style='width:270.85pt;border-top:none;border-left: - none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>The encrypted session key, the - first sixteen bytes of which are also used as the CTR-mode <i>nonce</i> (similar - to the CBC-mode <i>initialization vector</i>).</p> - </td> - </tr> - <tr> - <td width=111 valign=top style='width:83.4pt;border:solid windowtext 1.0pt; - border-top:none;padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>8+<i>k</i>+<i>l</i>+<i>m</i>+<i>n</i></p> - </td> - <td width=96 valign=top style='width:72.0pt;border-top:none;border-left:none; - border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>20</p> - </td> - <td width=361 valign=top style='width:270.85pt;border-top:none;border-left: - none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>Data signature—the SHA-1 - HMAC of the encrypted content data.</p> - </td> - </tr> - <tr> - <td width=111 valign=top style='width:83.4pt;border:solid windowtext 1.0pt; - border-top:none;padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>28+<i>k</i>+<i>l</i>+<i>m</i>+<i>n</i></p> - </td> - <td width=96 valign=top style='width:72.0pt;border-top:none;border-left:none; - border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>20</p> - </td> - <td width=361 valign=top style='width:270.85pt;border-top:none;border-left: - none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>Header signature—the SHA-1 - HMAC of all the fields above, including the encrypted session key and data - signature.</p> - </td> - </tr> - <tr> - <td width=111 valign=top style='width:83.4pt;border:solid windowtext 1.0pt; - border-top:none;padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>48+<i>k</i>+<i>l</i>+<i>m</i>+<i>n</i></p> - </td> - <td width=96 valign=top style='width:72.0pt;border-top:none;border-left:none; - border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'><i><to the end of the - file></i></p> - </td> - <td width=361 valign=top style='width:270.85pt;border-top:none;border-left: - none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; - padding:0cm 5.4pt 0cm 5.4pt'> - <p class=MsoNormal style='page-break-after:avoid'>The content data encrypted - using 128-bit AES in CTR mode.</p> - </td> - </tr> -</table> - -<p class=MsoCaption style='margin-top:6.0pt;margin-right:0cm;margin-bottom: -12.0pt;margin-left:0cm;page-break-after:avoid'><a name="_Ref151269206">Table </a>1. Definition of the fields of an internal Forward Lock file.</p> - -<p class=MsoBodyText>As of now, neither Combined Delivery nor usage -restrictions (including SIM binding) are supported. These fields are reserved -for future use.</p> - -<h2><a name="_Toc276471433">4.1<span style='font:7.0pt "Times New Roman"'> -</span>Key Derivation</a></h2> - -<p class=MsoBodyText>The session key consists of sixteen bytes fetched from a -cryptographically secure random number generator. From the session key, two -separate keys are derived: one used for encryption, the other for signing.</p> - -<p class=MsoBodyText>The encryption key is the output from encrypting the -16-byte all-zero input block {0, 0, …, 0} using 128-bit AES with the random session -key as the key. The signing key is the output from encrypting the 16-byte input -block {1, 0, …, 0} the same way. The keys so derived will be cryptographically -independent from each other.</p> - -<p class=MsoBodyText>The session key is encrypted using a hardware-dependent -key-encryption key unique to each device. The encrypted session key is stored -inside the file, and its first sixteen bytes are also used as the <i>nonce</i> -for the CTR-mode encryption of the content data.</p> - -<h2><a name="_Toc276471434">4.2<span style='font:7.0pt "Times New Roman"'> -</span>Calculation of the Counters</a></h2> - -<p class=MsoBodyText>Using CTR (“counter”) mode, a block cipher such as AES can -be turned into a stream cipher. The process of encryption and decryption is -well defined in [1], except for the specifics of the calculation of the -counters. For the internal Forward Lock file format, the counters are -calculated as follows:</p> - -<p class=MsoBodyText style='margin-left:36.0pt;text-indent:-18.0pt'>1.<span -style='font:7.0pt "Times New Roman"'> </span>The -nonce is interpreted as a 128-bit unsigned integer in little-endian format.</p> - -<p class=MsoBodyText style='margin-left:36.0pt;text-indent:-18.0pt'>2.<span -style='font:7.0pt "Times New Roman"'> </span>The -zero-based block sequence number (also a little-endian unsigned integer) is -added modulo 2<sup>128</sup> to the nonce to produce the counter for a given -block.</p> - -<h1><a name="_Toc276471435">5<span style='font:7.0pt "Times New Roman"'> -</span>Unit Test Cases</a></h1> - -<p class=MsoBodyText>Unit test cases for the converter and decoder come in two -varieties:</p> - -<p class=MsoBodyText style='margin-left:36.0pt;text-indent:-18.0pt'>1.<span -style='font:7.0pt "Times New Roman"'> </span><i>Black-box</i> -test cases aim to verify that you get sensible results from malformed or -“tricky” input data.</p> - -<p class=MsoBodyText style='margin-left:36.0pt;text-indent:-18.0pt'>2.<span -style='font:7.0pt "Times New Roman"'> </span><i>White-box</i> -test cases aim to maximize code coverage using knowledge of code internals.</p> - -<p class=MsoBodyText>The black-box test cases are dependent on a specifically -designed set of input files found in the <span style='font-size:10.0pt; -font-family:"Lucida Console","DejaVu Sans Mono"'>forward-lock/internal-format/test/res</span> -directory in the repository. For ‘tests’ variants of the software, these input -files will be automatically installed in the file system image during build.</p> - -<p class=MsoBodyText>Run the test cases from the ADB shell command line as -follows:</p> - -<p class=MsoNormal style='margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; -margin-left:21.55pt'><span style='font-size:10.0pt;font-family:"Lucida Console","DejaVu Sans Mono"'># -gtest_fwdlock</span></p> - -<p class=MsoBodyText>If all black-box but no white-box test cases fail, the -input files probably can’t be found in the working directory.</p> - -<h1><a name="_Toc276471436">6<span style='font:7.0pt "Times New Roman"'> -</span>References</a></h1> - -<p class=MsoBodyText style='margin-left:28.9pt;text-indent:-28.9pt'>[1]<span -style='font:7.0pt "Times New Roman"'> -</span><a -href="http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf">Dworkin, -Morris: “Recommendation for Block Cipher Modes of Operation—Methods and -Techniques,” NIST Special Publication 800-38A, December 2001.</a><a -name="_Ref151269073"></a></p> - -</div> - -</body> - -</html> diff --git a/drm/libdrmframework/plugins/forward-lock/internal-format/doc/images/image001.gif b/drm/libdrmframework/plugins/forward-lock/internal-format/doc/images/image001.gif Binary files differdeleted file mode 100644 index ee94513..0000000 --- a/drm/libdrmframework/plugins/forward-lock/internal-format/doc/images/image001.gif +++ /dev/null diff --git a/drm/libdrmframework/plugins/forward-lock/internal-format/doc/images/image002.gif b/drm/libdrmframework/plugins/forward-lock/internal-format/doc/images/image002.gif Binary files differdeleted file mode 100644 index 8c12f46..0000000 --- a/drm/libdrmframework/plugins/forward-lock/internal-format/doc/images/image002.gif +++ /dev/null diff --git a/drm/libdrmframework/plugins/forward-lock/internal-format/doc/images/image003.gif b/drm/libdrmframework/plugins/forward-lock/internal-format/doc/images/image003.gif Binary files differdeleted file mode 100644 index 9e019ca..0000000 --- a/drm/libdrmframework/plugins/forward-lock/internal-format/doc/images/image003.gif +++ /dev/null diff --git a/drm/libdrmframework/plugins/forward-lock/internal-format/doc/images/image004.gif b/drm/libdrmframework/plugins/forward-lock/internal-format/doc/images/image004.gif Binary files differdeleted file mode 100644 index cae1d01..0000000 --- a/drm/libdrmframework/plugins/forward-lock/internal-format/doc/images/image004.gif +++ /dev/null diff --git a/drm/libdrmframework/plugins/forward-lock/internal-format/doc/images/image005.gif b/drm/libdrmframework/plugins/forward-lock/internal-format/doc/images/image005.gif Binary files differdeleted file mode 100644 index 0d87be9..0000000 --- a/drm/libdrmframework/plugins/forward-lock/internal-format/doc/images/image005.gif +++ /dev/null diff --git a/drm/libdrmframework/plugins/forward-lock/internal-format/doc/images/image006.gif b/drm/libdrmframework/plugins/forward-lock/internal-format/doc/images/image006.gif Binary files differdeleted file mode 100644 index 9445b6b..0000000 --- a/drm/libdrmframework/plugins/forward-lock/internal-format/doc/images/image006.gif +++ /dev/null diff --git a/drm/libdrmframework/plugins/passthru/Android.mk b/drm/libdrmframework/plugins/passthru/Android.mk deleted file mode 100644 index d0d1439..0000000 --- a/drm/libdrmframework/plugins/passthru/Android.mk +++ /dev/null @@ -1,42 +0,0 @@ -# -# Copyright (C) 2010 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES:= \ - src/DrmPassthruPlugIn.cpp - -LOCAL_MODULE := libdrmpassthruplugin - -LOCAL_STATIC_LIBRARIES := libdrmframeworkcommon - -LOCAL_SHARED_LIBRARIES := \ - libutils \ - libdl - - -LOCAL_C_INCLUDES += \ - $(TOP)/frameworks/base/drm/libdrmframework/include \ - $(TOP)/frameworks/base/drm/libdrmframework/plugins/passthru/include \ - $(TOP)/frameworks/base/drm/libdrmframework/plugins/common/include \ - $(TOP)/frameworks/base/include - -# Set the following flag to enable the decryption passthru flow -#LOCAL_CFLAGS += -DENABLE_PASSTHRU_DECRYPTION - -LOCAL_MODULE_TAGS := optional - -include $(BUILD_SHARED_LIBRARY) diff --git a/drm/libdrmframework/plugins/passthru/include/DrmPassthruPlugIn.h b/drm/libdrmframework/plugins/passthru/include/DrmPassthruPlugIn.h deleted file mode 100644 index f941f70..0000000 --- a/drm/libdrmframework/plugins/passthru/include/DrmPassthruPlugIn.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __DRM_PASSTHRU_PLUGIN_H__ -#define __DRM_PASSTHRU_PLUGIN_H__ - -#include <DrmEngineBase.h> - -namespace android { - -class DrmPassthruPlugIn : public DrmEngineBase { - -public: - DrmPassthruPlugIn(); - virtual ~DrmPassthruPlugIn(); - -protected: - DrmConstraints* onGetConstraints(int uniqueId, const String8* path, int action); - - DrmMetadata* onGetMetadata(int uniqueId, const String8* path); - - status_t onInitialize(int uniqueId); - - status_t onSetOnInfoListener(int uniqueId, const IDrmEngine::OnInfoListener* infoListener); - - status_t onTerminate(int uniqueId); - - bool onCanHandle(int uniqueId, const String8& path); - - DrmInfoStatus* onProcessDrmInfo(int uniqueId, const DrmInfo* drmInfo); - - status_t onSaveRights(int uniqueId, const DrmRights& drmRights, - const String8& rightsPath, const String8& contentPath); - - DrmInfo* onAcquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest); - - String8 onGetOriginalMimeType(int uniqueId, const String8& path); - - int onGetDrmObjectType(int uniqueId, const String8& path, const String8& mimeType); - - int onCheckRightsStatus(int uniqueId, const String8& path, int action); - - status_t onConsumeRights(int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve); - - status_t onSetPlaybackStatus( - int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position); - - bool onValidateAction( - int uniqueId, const String8& path, int action, const ActionDescription& description); - - status_t onRemoveRights(int uniqueId, const String8& path); - - status_t onRemoveAllRights(int uniqueId); - - status_t onOpenConvertSession(int uniqueId, int convertId); - - DrmConvertedStatus* onConvertData(int uniqueId, int convertId, const DrmBuffer* inputData); - - DrmConvertedStatus* onCloseConvertSession(int uniqueId, int convertId); - - DrmSupportInfo* onGetSupportInfo(int uniqueId); - - status_t onOpenDecryptSession( - int uniqueId, DecryptHandle* decryptHandle, int fd, off64_t offset, off64_t length); - - status_t onOpenDecryptSession( - int uniqueId, DecryptHandle* decryptHandle, const char* uri); - - status_t onCloseDecryptSession(int uniqueId, DecryptHandle* decryptHandle); - - status_t onInitializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, - int decryptUnitId, const DrmBuffer* headerInfo); - - status_t onDecrypt(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, - const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV); - - status_t onFinalizeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId); - - ssize_t onPread(int uniqueId, DecryptHandle* decryptHandle, - void* buffer, ssize_t numBytes, off64_t offset); - -private: - DecryptHandle* openDecryptSessionImpl(); -}; - -}; - -#endif /* __DRM_PASSTHRU_PLUGIN_H__ */ - diff --git a/drm/libdrmframework/plugins/passthru/src/DrmPassthruPlugIn.cpp b/drm/libdrmframework/plugins/passthru/src/DrmPassthruPlugIn.cpp deleted file mode 100644 index a3eac3e..0000000 --- a/drm/libdrmframework/plugins/passthru/src/DrmPassthruPlugIn.cpp +++ /dev/null @@ -1,305 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -//#define LOG_NDEBUG 0 -#define LOG_TAG "DrmPassthruPlugIn" -#include <utils/Log.h> - -#include <drm/DrmRights.h> -#include <drm/DrmConstraints.h> -#include <drm/DrmMetadata.h> -#include <drm/DrmInfo.h> -#include <drm/DrmInfoEvent.h> -#include <drm/DrmInfoStatus.h> -#include <drm/DrmConvertedStatus.h> -#include <drm/DrmInfoRequest.h> -#include <drm/DrmSupportInfo.h> -#include <DrmPassthruPlugIn.h> - -using namespace android; - - -// This extern "C" is mandatory to be managed by TPlugInManager -extern "C" IDrmEngine* create() { - return new DrmPassthruPlugIn(); -} - -// This extern "C" is mandatory to be managed by TPlugInManager -extern "C" void destroy(IDrmEngine* pPlugIn) { - delete pPlugIn; - pPlugIn = NULL; -} - -DrmPassthruPlugIn::DrmPassthruPlugIn() - : DrmEngineBase() { - -} - -DrmPassthruPlugIn::~DrmPassthruPlugIn() { - -} - -DrmMetadata* DrmPassthruPlugIn::onGetMetadata(int uniqueId, const String8* path) { - return NULL; -} - -DrmConstraints* DrmPassthruPlugIn::onGetConstraints( - int uniqueId, const String8* path, int action) { - ALOGV("DrmPassthruPlugIn::onGetConstraints From Path: %d", uniqueId); - DrmConstraints* drmConstraints = new DrmConstraints(); - - String8 value("dummy_available_time"); - char* charValue = NULL; - charValue = new char[value.length() + 1]; - strncpy(charValue, value.string(), value.length()); - - //Just add dummy available time for verification - drmConstraints->put(&(DrmConstraints::LICENSE_AVAILABLE_TIME), charValue); - - return drmConstraints; -} - -DrmInfoStatus* DrmPassthruPlugIn::onProcessDrmInfo(int uniqueId, const DrmInfo* drmInfo) { - ALOGV("DrmPassthruPlugIn::onProcessDrmInfo - Enter : %d", uniqueId); - DrmInfoStatus* drmInfoStatus = NULL; - if (NULL != drmInfo) { - switch (drmInfo->getInfoType()) { - case DrmInfoRequest::TYPE_REGISTRATION_INFO: { - const DrmBuffer* emptyBuffer = new DrmBuffer(); - drmInfoStatus = new DrmInfoStatus(DrmInfoStatus::STATUS_OK, - DrmInfoRequest::TYPE_REGISTRATION_INFO, emptyBuffer, drmInfo->getMimeType()); - break; - } - case DrmInfoRequest::TYPE_UNREGISTRATION_INFO: { - const DrmBuffer* emptyBuffer = new DrmBuffer(); - drmInfoStatus = new DrmInfoStatus(DrmInfoStatus::STATUS_OK, - DrmInfoRequest::TYPE_UNREGISTRATION_INFO, emptyBuffer, drmInfo->getMimeType()); - break; - } - case DrmInfoRequest::TYPE_RIGHTS_ACQUISITION_INFO: { - String8 licenseString("dummy_license_string"); - const int bufferSize = licenseString.size(); - char* data = NULL; - data = new char[bufferSize]; - memcpy(data, licenseString.string(), bufferSize); - const DrmBuffer* buffer = new DrmBuffer(data, bufferSize); - drmInfoStatus = new DrmInfoStatus(DrmInfoStatus::STATUS_OK, - DrmInfoRequest::TYPE_RIGHTS_ACQUISITION_INFO, buffer, drmInfo->getMimeType()); - break; - } - } - } - ALOGV("DrmPassthruPlugIn::onProcessDrmInfo - Exit"); - return drmInfoStatus; -} - -status_t DrmPassthruPlugIn::onSetOnInfoListener( - int uniqueId, const IDrmEngine::OnInfoListener* infoListener) { - ALOGV("DrmPassthruPlugIn::onSetOnInfoListener : %d", uniqueId); - return DRM_NO_ERROR; -} - -status_t DrmPassthruPlugIn::onInitialize(int uniqueId) { - ALOGV("DrmPassthruPlugIn::onInitialize : %d", uniqueId); - return DRM_NO_ERROR; -} - -status_t DrmPassthruPlugIn::onTerminate(int uniqueId) { - ALOGV("DrmPassthruPlugIn::onTerminate : %d", uniqueId); - return DRM_NO_ERROR; -} - -DrmSupportInfo* DrmPassthruPlugIn::onGetSupportInfo(int uniqueId) { - ALOGV("DrmPassthruPlugIn::onGetSupportInfo : %d", uniqueId); - DrmSupportInfo* drmSupportInfo = new DrmSupportInfo(); - // Add mimetype's - drmSupportInfo->addMimeType(String8("application/vnd.passthru.drm")); - // Add File Suffixes - drmSupportInfo->addFileSuffix(String8(".passthru")); - // Add plug-in description - drmSupportInfo->setDescription(String8("Passthru plug-in")); - return drmSupportInfo; -} - -status_t DrmPassthruPlugIn::onSaveRights(int uniqueId, const DrmRights& drmRights, - const String8& rightsPath, const String8& contentPath) { - ALOGV("DrmPassthruPlugIn::onSaveRights : %d", uniqueId); - return DRM_NO_ERROR; -} - -DrmInfo* DrmPassthruPlugIn::onAcquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest) { - ALOGV("DrmPassthruPlugIn::onAcquireDrmInfo : %d", uniqueId); - DrmInfo* drmInfo = NULL; - - if (NULL != drmInfoRequest) { - String8 dataString("dummy_acquistion_string"); - int length = dataString.length(); - char* data = NULL; - data = new char[length]; - memcpy(data, dataString.string(), length); - drmInfo = new DrmInfo(drmInfoRequest->getInfoType(), - DrmBuffer(data, length), drmInfoRequest->getMimeType()); - } - return drmInfo; -} - -bool DrmPassthruPlugIn::onCanHandle(int uniqueId, const String8& path) { - ALOGV("DrmPassthruPlugIn::canHandle: %s ", path.string()); - String8 extension = path.getPathExtension(); - extension.toLower(); - return (String8(".passthru") == extension); -} - -String8 DrmPassthruPlugIn::onGetOriginalMimeType(int uniqueId, const String8& path) { - ALOGV("DrmPassthruPlugIn::onGetOriginalMimeType() : %d", uniqueId); - return String8("video/passthru"); -} - -int DrmPassthruPlugIn::onGetDrmObjectType( - int uniqueId, const String8& path, const String8& mimeType) { - ALOGV("DrmPassthruPlugIn::onGetDrmObjectType() : %d", uniqueId); - return DrmObjectType::UNKNOWN; -} - -int DrmPassthruPlugIn::onCheckRightsStatus(int uniqueId, const String8& path, int action) { - ALOGV("DrmPassthruPlugIn::onCheckRightsStatus() : %d", uniqueId); - int rightsStatus = RightsStatus::RIGHTS_VALID; - return rightsStatus; -} - -status_t DrmPassthruPlugIn::onConsumeRights(int uniqueId, DecryptHandle* decryptHandle, - int action, bool reserve) { - ALOGV("DrmPassthruPlugIn::onConsumeRights() : %d", uniqueId); - return DRM_NO_ERROR; -} - -status_t DrmPassthruPlugIn::onSetPlaybackStatus(int uniqueId, DecryptHandle* decryptHandle, - int playbackStatus, int64_t position) { - ALOGV("DrmPassthruPlugIn::onSetPlaybackStatus() : %d", uniqueId); - return DRM_NO_ERROR; -} - -bool DrmPassthruPlugIn::onValidateAction(int uniqueId, const String8& path, - int action, const ActionDescription& description) { - ALOGV("DrmPassthruPlugIn::onValidateAction() : %d", uniqueId); - return true; -} - -status_t DrmPassthruPlugIn::onRemoveRights(int uniqueId, const String8& path) { - ALOGV("DrmPassthruPlugIn::onRemoveRights() : %d", uniqueId); - return DRM_NO_ERROR; -} - -status_t DrmPassthruPlugIn::onRemoveAllRights(int uniqueId) { - ALOGV("DrmPassthruPlugIn::onRemoveAllRights() : %d", uniqueId); - return DRM_NO_ERROR; -} - -status_t DrmPassthruPlugIn::onOpenConvertSession(int uniqueId, int convertId) { - ALOGV("DrmPassthruPlugIn::onOpenConvertSession() : %d", uniqueId); - return DRM_NO_ERROR; -} - -DrmConvertedStatus* DrmPassthruPlugIn::onConvertData( - int uniqueId, int convertId, const DrmBuffer* inputData) { - ALOGV("DrmPassthruPlugIn::onConvertData() : %d", uniqueId); - DrmBuffer* convertedData = NULL; - - if (NULL != inputData && 0 < inputData->length) { - int length = inputData->length; - char* data = NULL; - data = new char[length]; - convertedData = new DrmBuffer(data, length); - memcpy(convertedData->data, inputData->data, length); - } - return new DrmConvertedStatus(DrmConvertedStatus::STATUS_OK, convertedData, 0 /*offset*/); -} - -DrmConvertedStatus* DrmPassthruPlugIn::onCloseConvertSession(int uniqueId, int convertId) { - ALOGV("DrmPassthruPlugIn::onCloseConvertSession() : %d", uniqueId); - return new DrmConvertedStatus(DrmConvertedStatus::STATUS_OK, NULL, 0 /*offset*/); -} - -status_t DrmPassthruPlugIn::onOpenDecryptSession( - int uniqueId, DecryptHandle* decryptHandle, int fd, off64_t offset, off64_t length) { - ALOGV("DrmPassthruPlugIn::onOpenDecryptSession() : %d", uniqueId); - -#ifdef ENABLE_PASSTHRU_DECRYPTION - decryptHandle->mimeType = String8("video/passthru"); - decryptHandle->decryptApiType = DecryptApiType::ELEMENTARY_STREAM_BASED; - decryptHandle->status = DRM_NO_ERROR; - decryptHandle->decryptInfo = NULL; - return DRM_NO_ERROR; -#endif - - return DRM_ERROR_CANNOT_HANDLE; -} - -status_t DrmPassthruPlugIn::onOpenDecryptSession( - int uniqueId, DecryptHandle* decryptHandle, const char* uri) { - return DRM_ERROR_CANNOT_HANDLE; -} - -status_t DrmPassthruPlugIn::onCloseDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { - ALOGV("DrmPassthruPlugIn::onCloseDecryptSession() : %d", uniqueId); - if (NULL != decryptHandle) { - if (NULL != decryptHandle->decryptInfo) { - delete decryptHandle->decryptInfo; decryptHandle->decryptInfo = NULL; - } - delete decryptHandle; decryptHandle = NULL; - } - return DRM_NO_ERROR; -} - -status_t DrmPassthruPlugIn::onInitializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, - int decryptUnitId, const DrmBuffer* headerInfo) { - ALOGV("DrmPassthruPlugIn::onInitializeDecryptUnit() : %d", uniqueId); - return DRM_NO_ERROR; -} - -status_t DrmPassthruPlugIn::onDecrypt(int uniqueId, DecryptHandle* decryptHandle, - int decryptUnitId, const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) { - ALOGV("DrmPassthruPlugIn::onDecrypt() : %d", uniqueId); - /** - * As a workaround implementation passthru would copy the given - * encrypted buffer as it is to decrypted buffer. Note, decBuffer - * memory has to be allocated by the caller. - */ - if (NULL != (*decBuffer) && 0 < (*decBuffer)->length) { - if ((*decBuffer)->length >= encBuffer->length) { - memcpy((*decBuffer)->data, encBuffer->data, encBuffer->length); - (*decBuffer)->length = encBuffer->length; - } else { - ALOGE("decBuffer size (%d) too small to hold %d bytes", - (*decBuffer)->length, encBuffer->length); - return DRM_ERROR_UNKNOWN; - } - } - return DRM_NO_ERROR; -} - -status_t DrmPassthruPlugIn::onFinalizeDecryptUnit( - int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) { - ALOGV("DrmPassthruPlugIn::onFinalizeDecryptUnit() : %d", uniqueId); - return DRM_NO_ERROR; -} - -ssize_t DrmPassthruPlugIn::onPread(int uniqueId, DecryptHandle* decryptHandle, - void* buffer, ssize_t numBytes, off64_t offset) { - ALOGV("DrmPassthruPlugIn::onPread() : %d", uniqueId); - return 0; -} - |