DRM Pluging uses CDM core's generic crypto API.
[ Merge of http://go/wvgerrit/173170 ] This CL updates the Widevine's Android DRM plugin to use the generic crypto operations provided by CDM core rather than its own implementation. Bug: 274984456 Test: atest WvtsDeviceTestCases Change-Id: I94e1c92c7da577aad5ec43bd3bf0bb380b607b80
This commit is contained in:
@@ -265,40 +265,28 @@ class MockCDM : public WvContentDecryptionModule {
|
||||
(const CdmIdentifier &, wvcdm::RequestedSecurityLevel,
|
||||
const std::string &, const std::string &),
|
||||
(override));
|
||||
|
||||
// Generic crypto API.
|
||||
MOCK_METHOD(CdmResponseType, GenericEncrypt,
|
||||
(const CdmSessionId &, const wvcdm::KeyId &, const std::string &,
|
||||
const std::string &, wvcdm::CdmEncryptionAlgorithm,
|
||||
std::string *));
|
||||
MOCK_METHOD(CdmResponseType, GenericDecrypt,
|
||||
(const CdmSessionId &, const wvcdm::KeyId &, const std::string &,
|
||||
const std::string &, wvcdm::CdmEncryptionAlgorithm,
|
||||
std::string *));
|
||||
MOCK_METHOD(CdmResponseType, GenericSign,
|
||||
(const CdmSessionId &, const wvcdm::KeyId &, const std::string &,
|
||||
wvcdm::CdmSigningAlgorithm, std::string *));
|
||||
MOCK_METHOD(CdmResponseType, GenericVerify,
|
||||
(const CdmSessionId &, const wvcdm::KeyId &, const std::string &,
|
||||
wvcdm::CdmSigningAlgorithm, const std::string &));
|
||||
};
|
||||
|
||||
class MockCrypto : public WVGenericCryptoInterface {
|
||||
public:
|
||||
MOCK_METHOD(OEMCryptoResult, selectKey,
|
||||
(const OEMCrypto_SESSION, const uint8_t *, size_t), (override));
|
||||
|
||||
MOCK_METHOD(OEMCryptoResult, encrypt,
|
||||
(OEMCrypto_SESSION, const uint8_t *, size_t, const uint8_t *,
|
||||
OEMCrypto_Algorithm, uint8_t *),
|
||||
(override));
|
||||
|
||||
MOCK_METHOD(OEMCryptoResult, decrypt,
|
||||
(OEMCrypto_SESSION, const uint8_t *, size_t, const uint8_t *,
|
||||
OEMCrypto_Algorithm, uint8_t *),
|
||||
(override));
|
||||
|
||||
MOCK_METHOD(OEMCryptoResult, sign,
|
||||
(OEMCrypto_SESSION, const uint8_t *, size_t, OEMCrypto_Algorithm,
|
||||
uint8_t *, size_t *),
|
||||
(override));
|
||||
|
||||
MOCK_METHOD(OEMCryptoResult, verify,
|
||||
(OEMCrypto_SESSION, const uint8_t *, size_t, OEMCrypto_Algorithm,
|
||||
const uint8_t *, size_t),
|
||||
(override));
|
||||
|
||||
MOCK_METHOD(OEMCryptoResult, loadDeviceRSAKey,
|
||||
(OEMCrypto_SESSION, const uint8_t *, size_t), (override));
|
||||
|
||||
MOCK_METHOD(OEMCryptoResult, generateRSASignature,
|
||||
(OEMCrypto_SESSION, const uint8_t *, size_t, uint8_t *, size_t *,
|
||||
RSA_Padding_Scheme),
|
||||
(override));
|
||||
public:
|
||||
MOCK_METHOD(OEMCryptoResult, loadDeviceRSAKey,
|
||||
(OEMCrypto_SESSION, const uint8_t *, size_t), (override));
|
||||
};
|
||||
|
||||
} // anonymous namespace
|
||||
@@ -1904,19 +1892,6 @@ TEST_F(WVDrmPluginHalTest, CallsGenericEncrypt) {
|
||||
iv.assign(ivRaw, ivRaw + KEY_IV_SIZE);
|
||||
std::vector<uint8_t> output;
|
||||
|
||||
{
|
||||
InSequence calls;
|
||||
|
||||
EXPECT_CALL(mCrypto, selectKey(4, _, KEY_ID_SIZE))
|
||||
.With(Args<1, 2>(ElementsAreArray(keyIdRaw, KEY_ID_SIZE)))
|
||||
.Times(1);
|
||||
|
||||
EXPECT_CALL(mCrypto, encrypt(4, _, kDataSize, IsIV(ivRaw),
|
||||
OEMCrypto_AES_CBC_128_NO_PADDING, _))
|
||||
.With(Args<1, 2>(ElementsAreArray(inputRaw, kDataSize)))
|
||||
.Times(1);
|
||||
}
|
||||
|
||||
// Provide expected behavior to support session creation
|
||||
EXPECT_CALL(*mCdm, OpenSession(StrEq("com.widevine"), _, _, _, _))
|
||||
.Times(AtLeast(1))
|
||||
@@ -1927,6 +1902,11 @@ TEST_F(WVDrmPluginHalTest, CallsGenericEncrypt) {
|
||||
.Times(AtLeast(1))
|
||||
.WillRepeatedly(Invoke(setSessionIdOnMap<4>));
|
||||
|
||||
EXPECT_CALL(*mCdm,
|
||||
GenericEncrypt(mCdmSessionId, _, _, _,
|
||||
wvcdm::kEncryptionAlgorithmAesCbc128, NotNull()))
|
||||
.WillOnce(testing::Return(CdmResponseType(wvcdm::NO_ERROR)));
|
||||
|
||||
EXPECT_CALL(*mCdm, CloseSession(_)).Times(AtLeast(0));
|
||||
|
||||
SessionId sessionId;
|
||||
@@ -1962,19 +1942,6 @@ TEST_F(WVDrmPluginHalTest, CallsGenericDecrypt) {
|
||||
iv.assign(ivRaw, ivRaw + KEY_IV_SIZE);
|
||||
std::vector<uint8_t> output;
|
||||
|
||||
{
|
||||
InSequence calls;
|
||||
|
||||
EXPECT_CALL(mCrypto, selectKey(4, _, KEY_ID_SIZE))
|
||||
.With(Args<1, 2>(ElementsAreArray(keyIdRaw, KEY_ID_SIZE)))
|
||||
.Times(1);
|
||||
|
||||
EXPECT_CALL(mCrypto, decrypt(4, _, kDataSize, IsIV(ivRaw),
|
||||
OEMCrypto_AES_CBC_128_NO_PADDING, _))
|
||||
.With(Args<1, 2>(ElementsAreArray(inputRaw, kDataSize)))
|
||||
.Times(1);
|
||||
}
|
||||
|
||||
// Provide expected behavior to support session creation
|
||||
EXPECT_CALL(*mCdm, OpenSession(StrEq("com.widevine"), _, _, _, _))
|
||||
.Times(AtLeast(1))
|
||||
@@ -1985,6 +1952,11 @@ TEST_F(WVDrmPluginHalTest, CallsGenericDecrypt) {
|
||||
.Times(AtLeast(1))
|
||||
.WillRepeatedly(Invoke(setSessionIdOnMap<4>));
|
||||
|
||||
EXPECT_CALL(*mCdm,
|
||||
GenericDecrypt(mCdmSessionId, _, _, _,
|
||||
wvcdm::kEncryptionAlgorithmAesCbc128, NotNull()))
|
||||
.WillOnce(testing::Return(CdmResponseType(wvcdm::NO_ERROR)));
|
||||
|
||||
EXPECT_CALL(*mCdm, CloseSession(_)).Times(AtLeast(0));
|
||||
|
||||
SessionId sessionId;
|
||||
@@ -2014,26 +1986,6 @@ TEST_F(WVDrmPluginHalTest, CallsGenericSign) {
|
||||
keyId.assign(keyIdRaw, keyIdRaw + KEY_ID_SIZE);
|
||||
std::vector<uint8_t> message;
|
||||
message.assign(messageRaw, messageRaw + kDataSize);
|
||||
std::vector<uint8_t> signature;
|
||||
|
||||
{
|
||||
InSequence calls;
|
||||
|
||||
EXPECT_CALL(mCrypto, selectKey(4, _, KEY_ID_SIZE))
|
||||
.With(Args<1, 2>(ElementsAreArray(keyIdRaw, KEY_ID_SIZE)))
|
||||
.Times(1);
|
||||
|
||||
EXPECT_CALL(mCrypto,
|
||||
sign(4, _, kDataSize, OEMCrypto_HMAC_SHA256, _, Pointee(0)))
|
||||
.With(Args<1, 2>(ElementsAreArray(messageRaw, kDataSize)))
|
||||
.WillOnce(DoAll(SetArgPointee<5>(64),
|
||||
testing::Return(OEMCrypto_ERROR_SHORT_BUFFER)));
|
||||
|
||||
EXPECT_CALL(mCrypto,
|
||||
sign(4, _, kDataSize, OEMCrypto_HMAC_SHA256, _, Pointee(64)))
|
||||
.With(Args<1, 2>(ElementsAreArray(messageRaw, kDataSize)))
|
||||
.Times(1);
|
||||
}
|
||||
|
||||
// Provide expected behavior to support session creation
|
||||
EXPECT_CALL(*mCdm, OpenSession(StrEq("com.widevine"), _, _, _, _))
|
||||
@@ -2045,6 +1997,12 @@ TEST_F(WVDrmPluginHalTest, CallsGenericSign) {
|
||||
.Times(AtLeast(1))
|
||||
.WillRepeatedly(Invoke(setSessionIdOnMap<4>));
|
||||
|
||||
const std::string kFakeSign = "super secure signature generated";
|
||||
EXPECT_CALL(*mCdm, GenericSign(mCdmSessionId, _, _,
|
||||
wvcdm::kSigningAlgorithmHmacSha256, NotNull()))
|
||||
.WillOnce(DoAll(SetArgPointee<4>(kFakeSign),
|
||||
testing::Return(CdmResponseType(wvcdm::NO_ERROR))));
|
||||
|
||||
EXPECT_CALL(*mCdm, CloseSession(_)).Times(AtLeast(0));
|
||||
|
||||
SessionId sessionId;
|
||||
@@ -2054,9 +2012,12 @@ TEST_F(WVDrmPluginHalTest, CallsGenericSign) {
|
||||
ret = mPlugin->setMacAlgorithm(sessionId, std::string("HmacSHA256"));
|
||||
EXPECT_TRUE(ret.isOk());
|
||||
|
||||
std::vector<uint8_t> signature;
|
||||
ret = mPlugin->sign(sessionId, keyId, message, &signature);
|
||||
EXPECT_TRUE(ret.isOk());
|
||||
ASSERT_NE(0u, signature.size());
|
||||
|
||||
const std::vector<uint8_t> kFakeSignVec(kFakeSign.begin(), kFakeSign.end());
|
||||
ASSERT_EQ(signature, kFakeSignVec);
|
||||
}
|
||||
|
||||
TEST_F(WVDrmPluginHalTest, CallsGenericVerify) {
|
||||
@@ -2080,29 +2041,9 @@ TEST_F(WVDrmPluginHalTest, CallsGenericVerify) {
|
||||
std::vector<uint8_t> signature;
|
||||
signature.assign(signatureRaw, signatureRaw + kSignatureSize);
|
||||
|
||||
{
|
||||
InSequence calls;
|
||||
|
||||
EXPECT_CALL(mCrypto, selectKey(4, _, KEY_ID_SIZE))
|
||||
.With(Args<1, 2>(ElementsAreArray(keyIdRaw, KEY_ID_SIZE)))
|
||||
.Times(1);
|
||||
|
||||
EXPECT_CALL(mCrypto, verify(4, _, kDataSize, OEMCrypto_HMAC_SHA256, _,
|
||||
kSignatureSize))
|
||||
.With(AllOf(Args<1, 2>(ElementsAreArray(messageRaw, kDataSize)),
|
||||
Args<4, 5>(ElementsAreArray(signatureRaw, kSignatureSize))))
|
||||
.WillOnce(testing::Return(OEMCrypto_SUCCESS));
|
||||
|
||||
EXPECT_CALL(mCrypto, selectKey(4, _, KEY_ID_SIZE))
|
||||
.With(Args<1, 2>(ElementsAreArray(keyIdRaw, KEY_ID_SIZE)))
|
||||
.Times(1);
|
||||
|
||||
EXPECT_CALL(mCrypto, verify(4, _, kDataSize, OEMCrypto_HMAC_SHA256, _,
|
||||
kSignatureSize))
|
||||
.With(AllOf(Args<1, 2>(ElementsAreArray(messageRaw, kDataSize)),
|
||||
Args<4, 5>(ElementsAreArray(signatureRaw, kSignatureSize))))
|
||||
.WillOnce(testing::Return(OEMCrypto_ERROR_SIGNATURE_FAILURE));
|
||||
}
|
||||
const wvcdm::CdmResponseType kSignatureOkResponse(wvcdm::NO_ERROR);
|
||||
const wvcdm::CdmResponseType kSignatureBadResponse(
|
||||
wvcdm::UNKNOWN_ERROR, OEMCrypto_ERROR_SIGNATURE_FAILURE, "GenericVerify");
|
||||
|
||||
// Provide expected behavior to support session creation
|
||||
EXPECT_CALL(*mCdm, OpenSession(StrEq("com.widevine"), _, _, _, _))
|
||||
@@ -2114,6 +2055,11 @@ TEST_F(WVDrmPluginHalTest, CallsGenericVerify) {
|
||||
.Times(AtLeast(1))
|
||||
.WillRepeatedly(Invoke(setSessionIdOnMap<4>));
|
||||
|
||||
EXPECT_CALL(*mCdm, GenericVerify(mCdmSessionId, _, _,
|
||||
wvcdm::kSigningAlgorithmHmacSha256, _))
|
||||
.WillOnce(testing::Return(kSignatureOkResponse))
|
||||
.WillOnce(testing::Return(kSignatureBadResponse));
|
||||
|
||||
EXPECT_CALL(*mCdm, CloseSession(_)).Times(AtLeast(0));
|
||||
|
||||
SessionId sessionId;
|
||||
|
||||
Reference in New Issue
Block a user