Require 20 keys per session and 10 sessions
Merge from widevine repo of http://go/wvgerrit/20981 OMECrypto v12 requires at least 20 keys per session and at least 10 sessions. This CL updates the unit tests to verify this, and updates level 3 and mock code to conform. This CL also updates the level 3 oemcrypto to support 16 sessions and 320 keys total. b/30140448 Minimum 20 keys per OEMCrypto_Session Change-Id: Idd38d8f2cdfd6acde6fa7622b5912372bee9e488
This commit is contained in:
@@ -75,7 +75,9 @@ Session::Session()
|
||||
mac_key_server_(wvcdm::MAC_KEY_SIZE),
|
||||
mac_key_client_(wvcdm::MAC_KEY_SIZE),
|
||||
enc_key_(wvcdm::KEY_SIZE),
|
||||
public_rsa_(0) {}
|
||||
public_rsa_(0),
|
||||
num_keys_(4) {} // Most tests only use 4 keys.
|
||||
// Other tests will explicitly call set_num_keys.
|
||||
|
||||
Session::~Session() {
|
||||
if (!forced_session_id_ && open_) close();
|
||||
@@ -200,7 +202,7 @@ void Session::LoadTestKeys(const std::string& pst, bool new_mac_keys) {
|
||||
session_id(), message_ptr(), sizeof(MessageData),
|
||||
&signature_[0], signature_.size(),
|
||||
encrypted_license_.mac_key_iv, encrypted_license_.mac_keys,
|
||||
kNumKeys, key_array_, pst_ptr, pst.length()));
|
||||
num_keys_, key_array_, pst_ptr, pst.length()));
|
||||
// Update new generated keys.
|
||||
memcpy(&mac_key_server_[0], license_.mac_keys, wvcdm::MAC_KEY_SIZE);
|
||||
memcpy(&mac_key_client_[0], license_.mac_keys + wvcdm::MAC_KEY_SIZE,
|
||||
@@ -210,13 +212,13 @@ void Session::LoadTestKeys(const std::string& pst, bool new_mac_keys) {
|
||||
OEMCrypto_SUCCESS,
|
||||
OEMCrypto_LoadKeys(session_id(), message_ptr(), sizeof(MessageData),
|
||||
&signature_[0], signature_.size(), NULL, NULL,
|
||||
kNumKeys, key_array_, pst_ptr, pst.length()));
|
||||
num_keys_, key_array_, pst_ptr, pst.length()));
|
||||
}
|
||||
VerifyTestKeys();
|
||||
}
|
||||
|
||||
void Session::VerifyTestKeys() {
|
||||
for (unsigned int i = 0; i < kNumKeys; i++) {
|
||||
for (unsigned int i = 0; i < num_keys_; i++) {
|
||||
KeyControlBlock block;
|
||||
size_t size = sizeof(block);
|
||||
OEMCryptoResult sts = OEMCrypto_QueryKeyControl(
|
||||
@@ -268,15 +270,14 @@ void Session::SetKeyId(int index, const string& key_id) {
|
||||
memcpy(key.key_id, key_id.data(), key.key_id_length);
|
||||
}
|
||||
|
||||
void Session::FillSimpleMessage(
|
||||
uint32_t duration, uint32_t control, uint32_t nonce,
|
||||
const std::string& pst) {
|
||||
void Session::FillSimpleMessage(uint32_t duration, uint32_t control,
|
||||
uint32_t nonce, const std::string& pst) {
|
||||
EXPECT_EQ(OEMCrypto_SUCCESS,
|
||||
OEMCrypto_GetRandom(license_.mac_key_iv,
|
||||
sizeof(license_.mac_key_iv)));
|
||||
EXPECT_EQ(OEMCrypto_SUCCESS,
|
||||
OEMCrypto_GetRandom(license_.mac_keys, sizeof(license_.mac_keys)));
|
||||
for (unsigned int i = 0; i < kNumKeys; i++) {
|
||||
for (unsigned int i = 0; i < num_keys_; i++) {
|
||||
memset(license_.keys[i].key_id, 0, kTestKeyIdMaxLength);
|
||||
license_.keys[i].key_id_length = kDefaultKeyIdLength;
|
||||
memset(license_.keys[i].key_id, i, license_.keys[i].key_id_length);
|
||||
@@ -331,7 +332,7 @@ void Session::EncryptAndSign() {
|
||||
AES_cbc_encrypt(&license_.mac_keys[0], &encrypted_license_.mac_keys[0],
|
||||
2 * wvcdm::MAC_KEY_SIZE, &aes_key, iv_buffer, AES_ENCRYPT);
|
||||
|
||||
for (unsigned int i = 0; i < kNumKeys; i++) {
|
||||
for (unsigned int i = 0; i < num_keys_; i++) {
|
||||
memcpy(iv_buffer, &license_.keys[i].control_iv[0], wvcdm::KEY_IV_SIZE);
|
||||
AES_set_encrypt_key(&license_.keys[i].key_data[0], 128, &aes_key);
|
||||
AES_cbc_encrypt(
|
||||
@@ -397,7 +398,7 @@ void Session::ClientSignMessage(const vector<uint8_t>& data,
|
||||
|
||||
void Session::FillKeyArray(const MessageData& data,
|
||||
OEMCrypto_KeyObject* key_array) {
|
||||
for (unsigned int i = 0; i < kNumKeys; i++) {
|
||||
for (unsigned int i = 0; i < num_keys_; i++) {
|
||||
key_array[i].key_id = data.keys[i].key_id;
|
||||
key_array[i].key_id_length = data.keys[i].key_id_length;
|
||||
key_array[i].key_data_iv = data.keys[i].key_iv;
|
||||
@@ -451,12 +452,13 @@ void Session::EncryptCTR(
|
||||
}
|
||||
|
||||
void Session::TestDecryptCTR(bool select_key_first,
|
||||
OEMCryptoResult expected_result) {
|
||||
OEMCryptoResult expected_result,
|
||||
int key_index) {
|
||||
OEMCryptoResult sts;
|
||||
if (select_key_first) {
|
||||
// Select the key (from FillSimpleMessage)
|
||||
sts = OEMCrypto_SelectKey(session_id(), license_.keys[0].key_id,
|
||||
license_.keys[0].key_id_length);
|
||||
sts = OEMCrypto_SelectKey(session_id(), license_.keys[key_index].key_id,
|
||||
license_.keys[key_index].key_id_length);
|
||||
ASSERT_EQ(OEMCrypto_SUCCESS, sts);
|
||||
}
|
||||
|
||||
@@ -468,7 +470,7 @@ void Session::TestDecryptCTR(bool select_key_first,
|
||||
EXPECT_EQ(OEMCrypto_SUCCESS,
|
||||
OEMCrypto_GetRandom(&encryptionIv[0], wvcdm::KEY_IV_SIZE));
|
||||
vector<uint8_t> encryptedData(unencryptedData.size());
|
||||
EncryptCTR(unencryptedData, license_.keys[0].key_data, &encryptionIv[0],
|
||||
EncryptCTR(unencryptedData, license_.keys[key_index].key_data, &encryptionIv[0],
|
||||
&encryptedData);
|
||||
|
||||
// Describe the output
|
||||
|
||||
Reference in New Issue
Block a user