Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 16dfdcff authored by John "Juce" Bruce's avatar John "Juce" Bruce Committed by Edwin Wong
Browse files

Implement OpenSSL-Based Decryptor

Implements an object that does AES-CTR-128 by invoking OpenSSL.

Change-Id: I8457899ec8b69bd8f0d727029985c9580911cf99
parent 47a86fb3
Loading
Loading
Loading
Loading
+67 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2014 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 "ClearKeyCryptoPlugin"
#include <utils/Log.h>

#include <openssl/aes.h>

#include "AesCtrDecryptor.h"

namespace clearkeydrm {

static const size_t kBlockBitCount = kBlockSize * 8;

android::status_t AesCtrDecryptor::decrypt(const android::Vector<uint8_t>& key,
        const Iv iv, const uint8_t* source,
        uint8_t* destination,
        const SubSample* subSamples,
        size_t numSubSamples,
        size_t* bytesDecryptedOut) {
    uint32_t blockOffset = 0;
    uint8_t previousEncryptedCounter[kBlockSize];
    memset(previousEncryptedCounter, 0, kBlockSize);

    size_t offset = 0;
    AES_KEY opensslKey;
    AES_set_encrypt_key(key.array(), kBlockBitCount, &opensslKey);
    Iv opensslIv;
    memcpy(opensslIv, iv, sizeof(opensslIv));

    for (size_t i = 0; i < numSubSamples; ++i) {
        const SubSample& subSample = subSamples[i];

        if (subSample.mNumBytesOfClearData > 0) {
            memcpy(destination + offset, source + offset,
                    subSample.mNumBytesOfClearData);
            offset += subSample.mNumBytesOfClearData;
        }

        if (subSample.mNumBytesOfEncryptedData > 0) {
            AES_ctr128_encrypt(source + offset, destination + offset,
                    subSample.mNumBytesOfEncryptedData, &opensslKey,
                    opensslIv, previousEncryptedCounter,
                    &blockOffset);
            offset += subSample.mNumBytesOfEncryptedData;
        }
    }

    *bytesDecryptedOut = offset;
    return android::OK;
}

} // namespace clearkeydrm
+44 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2014 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 CLEARKEY_AES_CTR_DECRYPTOR_H_
#define CLEARKEY_AES_CTR_DECRYPTOR_H_

#include <media/stagefright/foundation/ABase.h>
#include <Utils.h>
#include <utils/Errors.h>
#include <utils/Vector.h>

#include "ClearKeyTypes.h"

namespace clearkeydrm {

class AesCtrDecryptor {
public:
    AesCtrDecryptor() {}

    android::status_t decrypt(const android::Vector<uint8_t>& key, const Iv iv,
            const uint8_t* source, uint8_t* destination,
            const SubSample* subSamples, size_t numSubSamples,
            size_t* bytesDecryptedOut);

private:
    DISALLOW_EVIL_CONSTRUCTORS(AesCtrDecryptor);
};

} // namespace clearkeydrm

#endif // CLEARKEY_AES_CTR_DECRYPTOR_H_
+13 −0
Original line number Diff line number Diff line
@@ -17,10 +17,14 @@ LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES := \
    AesCtrDecryptor.cpp \
    JsonWebKey.cpp \
    Utils.cpp \

LOCAL_C_INCLUDES := \
    bionic \
    external/jsmn \
    external/openssl/include \
    frameworks/av/drm/mediadrm/plugins/clearkey \
    frameworks/av/include \
    frameworks/native/include \
@@ -30,10 +34,19 @@ LOCAL_MODULE := libdrmclearkeyplugin
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_SHARED_LIBRARIES)/mediadrm

LOCAL_SHARED_LIBRARIES := \
    libcrypto \
    liblog \
    libstagefright_foundation \
    libutils \

LOCAL_STATIC_LIBRARIES := \
    libjsmn \

LOCAL_MODULE_TAGS := optional

include $(BUILD_SHARED_LIBRARY)

#########################################################################
# Build unit tests

include $(LOCAL_PATH)/tests/Android.mk
+2 −1
Original line number Diff line number Diff line
@@ -18,12 +18,13 @@
#define CLEARKEY_TYPES_H_

#include <media/hardware/CryptoAPI.h>
#include <openssl/aes.h>
#include <utils/KeyedVector.h>
#include <utils/Vector.h>

namespace clearkeydrm {

const uint8_t kBlockSize = 16;
const uint8_t kBlockSize = AES_BLOCK_SIZE;
typedef uint8_t KeyId[kBlockSize];
typedef uint8_t Iv[kBlockSize];