Merge "Reduce Duplication in CryptoPlugin"
This commit is contained in:
@@ -45,6 +45,9 @@ class WVCryptoPlugin : public android::CryptoPlugin {
|
|||||||
wvcdm::CdmSessionId mSessionId;
|
wvcdm::CdmSessionId mSessionId;
|
||||||
|
|
||||||
wvcdm::CdmSessionId configureTestMode(const void* data, size_t size);
|
wvcdm::CdmSessionId configureTestMode(const void* data, size_t size);
|
||||||
|
android::status_t attemptDecrypt(
|
||||||
|
const wvcdm::CdmDecryptionParameters& params,
|
||||||
|
bool haveEncryptedSubsamples, android::AString* errorDetailMsg);
|
||||||
static wvcdm::CdmResponseType countEncryptedBlocksInPatternedRange(
|
static wvcdm::CdmResponseType countEncryptedBlocksInPatternedRange(
|
||||||
size_t range, const Pattern& pattern, uint64_t* result);
|
size_t range, const Pattern& pattern, uint64_t* result);
|
||||||
static void incrementIV(uint64_t increaseBy, std::vector<uint8_t>* ivPtr);
|
static void incrementIV(uint64_t increaseBy, std::vector<uint8_t>* ivPtr);
|
||||||
|
|||||||
@@ -189,41 +189,10 @@ ssize_t WVCryptoPlugin::decrypt(bool secure, const uint8_t key[KEY_ID_SIZE],
|
|||||||
params.decrypt_buffer_offset = offset;
|
params.decrypt_buffer_offset = offset;
|
||||||
params.subsample_flags = clearFlags;
|
params.subsample_flags = clearFlags;
|
||||||
|
|
||||||
CdmResponseType res = mCDM->Decrypt(mSessionId, haveEncryptedSubsamples,
|
status_t res = attemptDecrypt(params, haveEncryptedSubsamples,
|
||||||
params);
|
errorDetailMsg);
|
||||||
|
if (res != android::OK) {
|
||||||
if (!isCdmResponseTypeSuccess(res)) {
|
return res;
|
||||||
ALOGE("Decrypt error result in session %s during unencrypted block: %d",
|
|
||||||
mSessionId.c_str(), res);
|
|
||||||
if (res == wvcdm::INSUFFICIENT_CRYPTO_RESOURCES) {
|
|
||||||
errorDetailMsg->setTo(
|
|
||||||
"Error decrypting data: insufficient crypto resources");
|
|
||||||
// This error is actionable by the app and should be passed up.
|
|
||||||
return mapCdmResponseType(res);
|
|
||||||
} else if (res == wvcdm::NEED_KEY) {
|
|
||||||
errorDetailMsg->setTo(
|
|
||||||
"Error decrypting data: requested key has not been loaded");
|
|
||||||
// This error is actionable by the app and should be passed up.
|
|
||||||
return mapCdmResponseType(res);
|
|
||||||
} else if (res == wvcdm::SESSION_NOT_FOUND_FOR_DECRYPT) {
|
|
||||||
errorDetailMsg->setTo(
|
|
||||||
"Error decrypting data: session not found, possibly reclaimed");
|
|
||||||
// This error is actionable by the app and should be passed up.
|
|
||||||
return mapCdmResponseType(res);
|
|
||||||
} else if (res == wvcdm::DECRYPT_ERROR) {
|
|
||||||
errorDetailMsg->setTo(
|
|
||||||
"Error decrypting data: unspecified error");
|
|
||||||
// This error is actionable by the app and should be passed up.
|
|
||||||
return mapCdmResponseType(res);
|
|
||||||
} else if (res == wvcdm::INSUFFICIENT_OUTPUT_PROTECTION) {
|
|
||||||
errorDetailMsg->setTo(
|
|
||||||
"Error decrypting data: insufficient output protection");
|
|
||||||
// This error is actionable by the app and should be passed up.
|
|
||||||
return mapCdmResponseType(res);
|
|
||||||
} else {
|
|
||||||
// Swallow the specifics of other errors to obscure decrypt internals.
|
|
||||||
return kErrorCDMGeneric;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
offset += subSample.mNumBytesOfClearData;
|
offset += subSample.mNumBytesOfClearData;
|
||||||
@@ -239,41 +208,10 @@ ssize_t WVCryptoPlugin::decrypt(bool secure, const uint8_t key[KEY_ID_SIZE],
|
|||||||
params.decrypt_buffer_offset = offset;
|
params.decrypt_buffer_offset = offset;
|
||||||
params.subsample_flags = encryptedFlags;
|
params.subsample_flags = encryptedFlags;
|
||||||
|
|
||||||
CdmResponseType res = mCDM->Decrypt(mSessionId, haveEncryptedSubsamples,
|
status_t res = attemptDecrypt(params, haveEncryptedSubsamples,
|
||||||
params);
|
errorDetailMsg);
|
||||||
|
if (res != android::OK) {
|
||||||
if (!isCdmResponseTypeSuccess(res)) {
|
return res;
|
||||||
ALOGE("Decrypt error result in session %s during encrypted block: %d",
|
|
||||||
mSessionId.c_str(), res);
|
|
||||||
if (res == wvcdm::INSUFFICIENT_CRYPTO_RESOURCES) {
|
|
||||||
errorDetailMsg->setTo(
|
|
||||||
"Error decrypting data: insufficient crypto resources");
|
|
||||||
// This error is actionable by the app and should be passed up.
|
|
||||||
return mapCdmResponseType(res);
|
|
||||||
} else if (res == wvcdm::NEED_KEY) {
|
|
||||||
errorDetailMsg->setTo(
|
|
||||||
"Error decrypting data: requested key has not been loaded");
|
|
||||||
// This error is actionable by the app and should be passed up.
|
|
||||||
return mapCdmResponseType(res);
|
|
||||||
} else if (res == wvcdm::SESSION_NOT_FOUND_FOR_DECRYPT) {
|
|
||||||
errorDetailMsg->setTo(
|
|
||||||
"Error decrypting data: session not found, possibly reclaimed");
|
|
||||||
// This error is actionable by the app and should be passed up.
|
|
||||||
return mapCdmResponseType(res);
|
|
||||||
} else if (res == wvcdm::DECRYPT_ERROR) {
|
|
||||||
errorDetailMsg->setTo(
|
|
||||||
"Error decrypting data: unspecified error");
|
|
||||||
// This error is actionable by the app and should be passed up.
|
|
||||||
return mapCdmResponseType(res);
|
|
||||||
} else if (res == wvcdm::INSUFFICIENT_OUTPUT_PROTECTION) {
|
|
||||||
errorDetailMsg->setTo(
|
|
||||||
"Error decrypting data: insufficient output protection");
|
|
||||||
// This error is actionable by the app and should be passed up.
|
|
||||||
return mapCdmResponseType(res);
|
|
||||||
} else {
|
|
||||||
// Swallow the specifics of other errors to obscure decrypt internals.
|
|
||||||
return kErrorCDMGeneric;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
offset += subSample.mNumBytesOfEncryptedData;
|
offset += subSample.mNumBytesOfEncryptedData;
|
||||||
@@ -291,9 +229,9 @@ ssize_t WVCryptoPlugin::decrypt(bool secure, const uint8_t key[KEY_ID_SIZE],
|
|||||||
increment = (blockOffset + subSample.mNumBytesOfEncryptedData) /
|
increment = (blockOffset + subSample.mNumBytesOfEncryptedData) /
|
||||||
kAESBlockSize;
|
kAESBlockSize;
|
||||||
} else {
|
} else {
|
||||||
res = countEncryptedBlocksInPatternedRange(
|
CdmResponseType countRes = countEncryptedBlocksInPatternedRange(
|
||||||
subSample.mNumBytesOfEncryptedData, pattern, &increment);
|
subSample.mNumBytesOfEncryptedData, pattern, &increment);
|
||||||
if (!isCdmResponseTypeSuccess(res)) {
|
if (!isCdmResponseTypeSuccess(countRes)) {
|
||||||
// Swallow the specifics of the error to obscure decrypt internals.
|
// Swallow the specifics of the error to obscure decrypt internals.
|
||||||
return kErrorCDMGeneric;
|
return kErrorCDMGeneric;
|
||||||
}
|
}
|
||||||
@@ -342,10 +280,54 @@ ssize_t WVCryptoPlugin::decrypt(bool secure, const uint8_t key[KEY_ID_SIZE],
|
|||||||
return kErrorTestMode;
|
return kErrorTestMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return static_cast<ssize_t>(offset);
|
return static_cast<ssize_t>(offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
status_t WVCryptoPlugin::attemptDecrypt(const CdmDecryptionParameters& params,
|
||||||
|
bool haveEncryptedSubsamples,
|
||||||
|
AString* errorDetailMsg) {
|
||||||
|
CdmResponseType res = mCDM->Decrypt(mSessionId, haveEncryptedSubsamples,
|
||||||
|
params);
|
||||||
|
|
||||||
|
if (isCdmResponseTypeSuccess(res)) {
|
||||||
|
return android::OK;
|
||||||
|
} else {
|
||||||
|
ALOGE("Decrypt error result in session %s during %s block: %d",
|
||||||
|
mSessionId.c_str(),
|
||||||
|
params.is_encrypted ? "encrypted" : "unencrypted",
|
||||||
|
res);
|
||||||
|
if (res == wvcdm::INSUFFICIENT_CRYPTO_RESOURCES) {
|
||||||
|
errorDetailMsg->setTo(
|
||||||
|
"Error decrypting data: insufficient crypto resources");
|
||||||
|
// This error is actionable by the app and should be passed up.
|
||||||
|
return mapCdmResponseType(res);
|
||||||
|
} else if (res == wvcdm::NEED_KEY) {
|
||||||
|
errorDetailMsg->setTo(
|
||||||
|
"Error decrypting data: requested key has not been loaded");
|
||||||
|
// This error is actionable by the app and should be passed up.
|
||||||
|
return mapCdmResponseType(res);
|
||||||
|
} else if (res == wvcdm::SESSION_NOT_FOUND_FOR_DECRYPT) {
|
||||||
|
errorDetailMsg->setTo(
|
||||||
|
"Error decrypting data: session not found, possibly reclaimed");
|
||||||
|
// This error is actionable by the app and should be passed up.
|
||||||
|
return mapCdmResponseType(res);
|
||||||
|
} else if (res == wvcdm::DECRYPT_ERROR) {
|
||||||
|
errorDetailMsg->setTo(
|
||||||
|
"Error decrypting data: unspecified error");
|
||||||
|
// This error is actionable by the app and should be passed up.
|
||||||
|
return mapCdmResponseType(res);
|
||||||
|
} else if (res == wvcdm::INSUFFICIENT_OUTPUT_PROTECTION) {
|
||||||
|
errorDetailMsg->setTo(
|
||||||
|
"Error decrypting data: insufficient output protection");
|
||||||
|
// This error is actionable by the app and should be passed up.
|
||||||
|
return mapCdmResponseType(res);
|
||||||
|
} else {
|
||||||
|
// Swallow the specifics of other errors to obscure decrypt internals.
|
||||||
|
return kErrorCDMGeneric;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
CdmResponseType WVCryptoPlugin::countEncryptedBlocksInPatternedRange(
|
CdmResponseType WVCryptoPlugin::countEncryptedBlocksInPatternedRange(
|
||||||
size_t range, const Pattern& pattern, uint64_t* result) {
|
size_t range, const Pattern& pattern, uint64_t* result) {
|
||||||
if (result == NULL || range % kAESBlockSize != 0) {
|
if (result == NULL || range % kAESBlockSize != 0) {
|
||||||
|
|||||||
Reference in New Issue
Block a user