No-Typo-Check: From a third party header file Bug: 260918793 Test: unit tests Test: atp v2/widevine-eng/drm_compliance Change-Id: I36effd6a10a99bdb2399ab1f4a0fad026d607c70
72 lines
3.0 KiB
C++
72 lines
3.0 KiB
C++
// Copyright 2019 Google LLC. All Rights Reserved. This file and proprietary
|
|
// source code may only be used and distributed under the Widevine
|
|
// License Agreement.
|
|
|
|
#ifndef CDM_OEC_DECRYPT_FALLBACK_CHAIN_H_
|
|
#define CDM_OEC_DECRYPT_FALLBACK_CHAIN_H_
|
|
|
|
#include "OEMCryptoCENC.h"
|
|
#include "disallow_copy_and_assign.h"
|
|
#include "oemcrypto_fuzz_structs.h"
|
|
|
|
namespace wvoec {
|
|
|
|
// This class groups static methods relating to providing proper fallback
|
|
// behavior when calling DecryptCENC in OEMCrypto v16. Outside code can leverage
|
|
// this behavior by passing the samples to be decrypted to Decrypt(), which will
|
|
// set off the chain of fallback functions as needed.
|
|
//
|
|
// The behavior of this class is pathological. For each block of data, it will
|
|
// greedily try every possible way of passing data to OEMCrypto until one works.
|
|
// In the order tried, the ways to send data are:
|
|
// 1) Multiple Samples at once
|
|
// 2) Individual Samples one at a time
|
|
// 3) Individual Subsamples one at a time
|
|
// 4) Individual Half-Subsamples one at a time
|
|
// On a device that only accepts half-subsamples, the way OEMCrypto v15 did,
|
|
// this results in many needless roundtrips to OEMCrypto. This would be
|
|
// inefficient behavior for a real CDM, but for the sake of testing, we want to
|
|
// use the maximal way the OEMCrypto implementation will accept the data. And,
|
|
// for implementations that do not accept multiple samples or subsamples per
|
|
// call, we want to test that they correctly reject larger calls.
|
|
class DecryptFallbackChain {
|
|
public:
|
|
static OEMCryptoResult Decrypt(
|
|
const uint8_t* key_handle, size_t key_handle_length,
|
|
const OEMCrypto_SampleDescription* samples, size_t samples_length,
|
|
OEMCryptoCipherMode cipher_mode,
|
|
const OEMCrypto_CENCEncryptPatternDesc* pattern);
|
|
|
|
private:
|
|
static OEMCryptoResult DecryptSample(
|
|
const uint8_t* key_handle, size_t key_handle_length,
|
|
const OEMCrypto_SampleDescription& sample,
|
|
OEMCryptoCipherMode cipher_mode,
|
|
const OEMCrypto_CENCEncryptPatternDesc* pattern);
|
|
|
|
static OEMCryptoResult DecryptSubsample(
|
|
const uint8_t* key_handle, size_t key_handle_length,
|
|
const OEMCrypto_SampleDescription& sample,
|
|
const OEMCrypto_CENCEncryptPatternDesc* pattern,
|
|
OEMCryptoCipherMode cipher_mode);
|
|
|
|
static OEMCryptoResult DecryptSubsampleHalf(
|
|
const uint8_t* key_handle, size_t key_handle_length,
|
|
const OEMCrypto_SampleDescription& sample,
|
|
const OEMCrypto_CENCEncryptPatternDesc* pattern,
|
|
OEMCryptoCipherMode cipher_mode);
|
|
|
|
// There is no reason to have an instance of this class.
|
|
DecryptFallbackChain() = delete;
|
|
CORE_DISALLOW_COPY_AND_ASSIGN(DecryptFallbackChain);
|
|
};
|
|
|
|
void WriteDecryptCencCorpus(OEMCryptoCipherMode cipher_mode,
|
|
const OEMCrypto_SampleDescription* samples,
|
|
const OEMCrypto_CENCEncryptPatternDesc* pattern,
|
|
size_t samples_length);
|
|
|
|
} // namespace wvoec
|
|
|
|
#endif // CDM_OEC_DECRYPT_FALLBACK_CHAIN_H_
|