Merge "Add Detail Error Messages" into jb-mr2-dev

This commit is contained in:
Jeff Tinker
2013-04-18 23:11:24 +00:00
committed by Android (Google) Code Review
3 changed files with 41 additions and 16 deletions

View File

@@ -10,12 +10,19 @@
namespace wvdrm {
using android::ERROR_DRM_VENDOR_MIN;
using android::ERROR_DRM_VENDOR_MAX;
enum {
kErrorNeedProvisioning = ERROR_DRM_VENDOR_MIN,
kErrorDeviceRevoked = ERROR_DRM_VENDOR_MIN + 1,
kErrorIncorrectBufferSize = ERROR_DRM_VENDOR_MIN + 2,
kErrorCDMGeneric = ERROR_DRM_VENDOR_MIN + 3,
kErrorNeedProvisioning = ERROR_DRM_VENDOR_MIN,
kErrorDeviceRevoked = ERROR_DRM_VENDOR_MIN + 1,
kErrorIncorrectBufferSize = ERROR_DRM_VENDOR_MIN + 2,
kErrorCDMGeneric = ERROR_DRM_VENDOR_MIN + 3,
kErrorUnsupportedCrypto = ERROR_DRM_VENDOR_MIN + 4,
kErrorCannotGuaranteeSecurity = ERROR_DRM_VENDOR_MIN + 5,
kErrorExpectedUnencrypted = ERROR_DRM_VENDOR_MIN + 6,
// Used by crypto test mode
kErrorTestMode = ERROR_DRM_VENDOR_MAX,
};
} // namespace wvdrm

View File

@@ -18,6 +18,7 @@
#include "utils/Errors.h"
#include "utils/String8.h"
#include "wv_cdm_constants.h"
#include "WVErrors.h"
namespace wvdrm {
@@ -71,7 +72,8 @@ ssize_t WVCryptoPlugin::decrypt(bool secure, const uint8_t key[KEY_ID_SIZE],
size_t numSubSamples, void* dstPtr,
AString* errorDetailMsg) {
if (mode != kMode_Unencrypted && mode != kMode_AES_CTR) {
return ERROR_DRM_CANNOT_HANDLE;
errorDetailMsg->setTo("Encryption mode is not supported by Widevine CDM.");
return kErrorUnsupportedCrypto;
}
// If the caller requested secure decrypt, verify that we can comply.
@@ -82,10 +84,12 @@ ssize_t WVCryptoPlugin::decrypt(bool secure, const uint8_t key[KEY_ID_SIZE],
if (!isCdmResponseTypeSuccess(res)) {
ALOGE("Error querying CDM status: %u", res);
return ERROR_DRM_CANNOT_HANDLE;
errorDetailMsg->setTo("Unable to verify ability to decode securely.");
return kErrorCannotGuaranteeSecurity;
} else if (status[QUERY_KEY_SECURITY_LEVEL] !=
QUERY_VALUE_SECURITY_LEVEL_L1) {
return ERROR_DRM_CANNOT_HANDLE;
errorDetailMsg->setTo("Secure decode is not supported on this device.");
return kErrorCannotGuaranteeSecurity;
}
}
@@ -103,7 +107,9 @@ ssize_t WVCryptoPlugin::decrypt(bool secure, const uint8_t key[KEY_ID_SIZE],
const SubSample &subSample = subSamples[i];
if (mode == kMode_Unencrypted && subSample.mNumBytesOfEncryptedData != 0) {
return ERROR_DRM_DECRYPT;
errorDetailMsg->setTo("Encrypted subsamples found in allegedly "
"unencrypted data.");
return kErrorExpectedUnencrypted;
}
// "Decrypt" any unencrypted data. Per the ISO-CENC standard, clear data
@@ -117,7 +123,8 @@ ssize_t WVCryptoPlugin::decrypt(bool secure, const uint8_t key[KEY_ID_SIZE],
if (!isCdmResponseTypeSuccess(res)) {
ALOGE("Decrypt error result in session %s during unencrypted block: %d",
mSessionId.c_str(), res);
return mapCdmResponseType(res);
errorDetailMsg->setTo("Error decrypting data.");
return kErrorCDMGeneric;
}
offset += subSample.mNumBytesOfClearData;
@@ -134,7 +141,8 @@ ssize_t WVCryptoPlugin::decrypt(bool secure, const uint8_t key[KEY_ID_SIZE],
if (!isCdmResponseTypeSuccess(res)) {
ALOGE("Decrypt error result in session %s during encrypted block: %d",
mSessionId.c_str(), res);
return mapCdmResponseType(res);
errorDetailMsg->setTo("Error decrypting data.");
return kErrorCDMGeneric;
}
offset += subSample.mNumBytesOfEncryptedData;
@@ -158,8 +166,8 @@ ssize_t WVCryptoPlugin::decrypt(bool secure, const uint8_t key[KEY_ID_SIZE],
buf.appendFormat("%02x", digest[i]);
}
*errorDetailMsg = AString(buf.string());
return ERROR_DRM_VENDOR_MIN;
errorDetailMsg->setTo(buf.string());
return kErrorTestMode;
}

View File

@@ -107,12 +107,17 @@ TEST_F(WVCryptoPluginTest, RejectsSecureDecodeOnL3) {
.WillOnce(DoAll(SetArgPointee<0>(l3Map),
Return(wvcdm::NO_ERROR)));
ssize_t res = plugin.decrypt(true, keyId, iv, CryptoPlugin::kMode_AES_CTR,
in, subSamples, kSubSampleCount, out, NULL);
AString errorDetailMessage;
EXPECT_LT(res, static_cast<ssize_t>(0)) <<
ssize_t res = plugin.decrypt(true, keyId, iv, CryptoPlugin::kMode_AES_CTR,
in, subSamples, kSubSampleCount, out,
&errorDetailMessage);
EXPECT_LT(res, 0) <<
"WVCryptoPlugin allowed decryption to proceed despite being asked for an "
"unsupported security level";
EXPECT_GT(errorDetailMessage.size(), 0u) <<
"WVCryptoPlugin did not report a detailed error message.";
}
TEST_F(WVCryptoPluginTest, AttemptsToDecrypt) {
@@ -144,9 +149,14 @@ TEST_F(WVCryptoPluginTest, AttemptsToDecrypt) {
.WillOnce(Return(wvcdm::NO_ERROR));
}
AString errorDetailMessage;
ssize_t res = plugin.decrypt(false, keyId, iv, CryptoPlugin::kMode_AES_CTR,
in, subSamples, kSubSampleCount, out, NULL);
in, subSamples, kSubSampleCount, out,
&errorDetailMessage);
EXPECT_EQ(static_cast<ssize_t>(kDataSize), res) <<
"WVCryptoPlugin decrypted the wrong number of bytes";
EXPECT_EQ(0u, errorDetailMessage.size()) <<
"WVCryptoPlugin reported a detailed error message.";
}