bug: 8621460 Merge of https://widevine-internal-review.googlesource.com/#/c/4955/ from Widevine CDM repository. Change-Id: I30cf4314283db51c8e706c026501784259c87c13
176 lines
5.1 KiB
C++
176 lines
5.1 KiB
C++
// Copyright 2013 Google Inc. All Rights Reserved.
|
|
|
|
//
|
|
// OEMCrypto unit tests
|
|
//
|
|
#include <gtest/gtest.h>
|
|
#include <map>
|
|
#include <stdint.h>
|
|
#include <string>
|
|
#include <sys/types.h>
|
|
|
|
#include "OEMCryptoCENC.h"
|
|
#include "string_conversions.h"
|
|
#include "wv_cdm_constants.h"
|
|
#include "wv_keybox.h"
|
|
|
|
using namespace std;
|
|
|
|
namespace wvoec {
|
|
|
|
static wvoec_mock::WidevineKeybox kValidKeybox02 = {
|
|
// Sample keybox used for test vectors
|
|
{
|
|
// deviceID
|
|
0x54, 0x65, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x30, // TestKey02
|
|
0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
|
|
}, {
|
|
// key
|
|
0x76, 0x5d, 0xce, 0x01, 0x04, 0x89, 0xb3, 0xd0,
|
|
0xdf, 0xce, 0x54, 0x8a, 0x49, 0xda, 0xdc, 0xb6,
|
|
}, {
|
|
// data
|
|
0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x10, 0x19,
|
|
0x92, 0x27, 0x0b, 0x1f, 0x1a, 0xd5, 0xc6, 0x93,
|
|
0x19, 0x3f, 0xaa, 0x74, 0x1f, 0xdd, 0x5f, 0xb4,
|
|
0xe9, 0x40, 0x2f, 0x34, 0xa4, 0x92, 0xf4, 0xae,
|
|
0x9a, 0x52, 0x39, 0xbc, 0xb7, 0x24, 0x38, 0x13,
|
|
0xab, 0xf4, 0x92, 0x96, 0xc4, 0x81, 0x60, 0x33,
|
|
0xd8, 0xb8, 0x09, 0xc7, 0x55, 0x0e, 0x12, 0xfa,
|
|
0xa8, 0x98, 0x62, 0x8a, 0xec, 0xea, 0x74, 0x8a,
|
|
0x4b, 0xfa, 0x5a, 0x9e, 0xb6, 0x49, 0x0d, 0x80,
|
|
}, {
|
|
// magic
|
|
0x6b, 0x62, 0x6f, 0x78,
|
|
}, {
|
|
// Crc
|
|
0x2a, 0x3b, 0x3e, 0xe4,
|
|
}
|
|
};
|
|
|
|
static wvoec_mock::WidevineKeybox kValidKeybox03 = {
|
|
// Sample keybox used for test vectors
|
|
{
|
|
// deviceID
|
|
0x54, 0x65, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x30, // TestKey03
|
|
0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
|
|
}, {
|
|
// key
|
|
0x25, 0xe5, 0x2a, 0x02, 0x29, 0x68, 0x04, 0xa2,
|
|
0x92, 0xfd, 0x7c, 0x67, 0x0b, 0x67, 0x1f, 0x31,
|
|
}, {
|
|
// data
|
|
0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x10, 0x19,
|
|
0xf4, 0x0a, 0x0e, 0xa2, 0x0a, 0x71, 0xd5, 0x92,
|
|
0xfa, 0xa3, 0x25, 0xc6, 0x4b, 0x76, 0xf1, 0x64,
|
|
0xf4, 0x60, 0xa0, 0x30, 0x72, 0x23, 0xbe, 0x03,
|
|
0xcd, 0xde, 0x7a, 0x06, 0xd4, 0x01, 0xeb, 0xdc,
|
|
0xe0, 0x50, 0xc0, 0x53, 0x0a, 0x50, 0xb0, 0x37,
|
|
0xe5, 0x05, 0x25, 0x0e, 0xa4, 0xc8, 0x5a, 0xff,
|
|
0x46, 0x6e, 0xa5, 0x31, 0xf3, 0xdd, 0x94, 0xb7,
|
|
0xe0, 0xd3, 0xf9, 0x04, 0xb2, 0x54, 0xb1, 0x64,
|
|
}, {
|
|
// magic
|
|
0x6b, 0x62, 0x6f, 0x78,
|
|
}, {
|
|
// Crc
|
|
0xa1, 0x99, 0x5f, 0x46,
|
|
}
|
|
};
|
|
|
|
// Define CAN_INSTALL_KEYBOX if you are compiling with the reference
|
|
// implementation of OEMCrypto, or if your version of OEMCrypto supports
|
|
// OEMCrypto_InstallKeybox and OEMCrypto_WrapKeybox.
|
|
#if defined(CAN_INSTALL_KEYBOX)
|
|
// The Below tests are based on a specific keybox which is installed for testing.
|
|
|
|
class OEMCryptoKeyboxTest : public ::testing::Test {
|
|
|
|
protected:
|
|
virtual void SetUp() {
|
|
}
|
|
|
|
void install_keybox(wvoec_mock::WidevineKeybox& keybox, bool good) {
|
|
ASSERT_EQ(OEMCrypto_SUCCESS, OEMCrypto_Initialize())
|
|
<< "OEMCrypto_Initialize failed.";
|
|
OEMCryptoResult sts;
|
|
uint8_t wrapped[sizeof(wvoec_mock::WidevineKeybox)];
|
|
size_t length = sizeof(wvoec_mock::WidevineKeybox);
|
|
sts = OEMCrypto_WrapKeybox(reinterpret_cast<uint8_t*>(&keybox),
|
|
sizeof(keybox),
|
|
wrapped,
|
|
&length,
|
|
NULL, 0);
|
|
ASSERT_EQ(OEMCrypto_SUCCESS, sts);
|
|
sts = OEMCrypto_InstallKeybox(wrapped, sizeof(keybox));
|
|
if( good ) {
|
|
ASSERT_EQ(OEMCrypto_SUCCESS, sts);
|
|
} else {
|
|
// Can return error now, or return error on IsKeyboxValid.
|
|
}
|
|
}
|
|
|
|
virtual void TearDown() {
|
|
OEMCrypto_Terminate();
|
|
}
|
|
public:
|
|
|
|
};
|
|
|
|
TEST_F(OEMCryptoKeyboxTest, DefaultKeybox) {
|
|
ASSERT_EQ(OEMCrypto_SUCCESS, OEMCrypto_Initialize())
|
|
<< "OEMCrypto_Initialize failed.";
|
|
OEMCryptoResult sts;
|
|
sts = OEMCrypto_IsKeyboxValid();
|
|
ASSERT_EQ(OEMCrypto_SUCCESS, sts);
|
|
}
|
|
|
|
TEST_F(OEMCryptoKeyboxTest, GoodKeybox) {
|
|
wvoec_mock::WidevineKeybox keybox = kValidKeybox02;
|
|
OEMCryptoResult sts;
|
|
install_keybox(keybox, true);
|
|
sts = OEMCrypto_IsKeyboxValid();
|
|
ASSERT_EQ(OEMCrypto_SUCCESS, sts);
|
|
|
|
keybox = kValidKeybox03;
|
|
install_keybox(keybox, true);
|
|
sts = OEMCrypto_IsKeyboxValid();
|
|
ASSERT_EQ(OEMCrypto_SUCCESS, sts);
|
|
}
|
|
|
|
TEST_F(OEMCryptoKeyboxTest, BadCRCKeybox) {
|
|
wvoec_mock::WidevineKeybox keybox = kValidKeybox02;
|
|
keybox.crc_[1] = 42;
|
|
OEMCryptoResult sts;
|
|
install_keybox(keybox, false);
|
|
sts = OEMCrypto_IsKeyboxValid();
|
|
ASSERT_EQ(OEMCrypto_ERROR_BAD_CRC, sts);
|
|
}
|
|
|
|
TEST_F(OEMCryptoKeyboxTest, BadMagicKeybox) {
|
|
wvoec_mock::WidevineKeybox keybox = kValidKeybox02;
|
|
keybox.magic_[1] = 42;
|
|
OEMCryptoResult sts;
|
|
install_keybox(keybox, false);
|
|
sts = OEMCrypto_IsKeyboxValid();
|
|
ASSERT_EQ(OEMCrypto_ERROR_BAD_MAGIC, sts);
|
|
}
|
|
|
|
|
|
TEST_F(OEMCryptoKeyboxTest, BadDataKeybox) {
|
|
wvoec_mock::WidevineKeybox keybox = kValidKeybox02;
|
|
keybox.data_[1] = 42;
|
|
OEMCryptoResult sts;
|
|
install_keybox(keybox, false);
|
|
sts = OEMCrypto_IsKeyboxValid();
|
|
ASSERT_EQ(OEMCrypto_ERROR_BAD_CRC, sts);
|
|
}
|
|
|
|
#endif // CAN_INSTALL_KEYBOX
|
|
|
|
} // namespace wvoec
|