Benchmarking and Unmasking
In this code drop we introduce the benchmarking tests that allow us to
compare the performance of different implementations. Like the other
tests, any implementation can link with them to create their own
binary.
There are two types of benchmarks:
1 - Throughput, which measures the speed that a function can process
information (bits per second). These are used for AEAD decrypt
and license white-box decrypt functions.
2 - Samples, which measures the min, 25% percentile, median, 75%
percentile, and max observed values. These is used for all other
functions as a way to measure the execute duration of a call.
The other change in this code drop is the update to the unmasking
function to only unmask a subset of the bytes in the masked buffer.
This was added to better align with the decoder behaviour in the CDM.
This commit is contained in:
@@ -25,13 +25,13 @@ class LicenseWhiteboxMaskedDecryptTest : public LicenseWhiteboxTestBase {
|
||||
|
||||
// Because we are going to use the same buffer for both tests, make sure it
|
||||
// will be large enough for either.
|
||||
plaintext_size_ = std::max(golden_data_.CBCContent().ciphertext.size(),
|
||||
golden_data_.CTRContent().ciphertext.size());
|
||||
plaintext_.resize(plaintext_size_);
|
||||
masked_text_size_ = std::max(golden_data_.CBCContent().ciphertext.size(),
|
||||
golden_data_.CTRContent().ciphertext.size());
|
||||
masked_text_.resize(masked_text_size_);
|
||||
|
||||
// We have no idea how big the secret string will be, but it should be safe
|
||||
// to assume it won't be larger than the plaintext.
|
||||
secret_string_size_ = plaintext_size_;
|
||||
secret_string_size_ = masked_text_size_;
|
||||
secret_string_.resize(secret_string_size_);
|
||||
|
||||
golden_data_.MakeKeyIdDifferent(&non_content_key_id_);
|
||||
@@ -82,7 +82,9 @@ class LicenseWhiteboxMaskedDecryptTest : public LicenseWhiteboxTestBase {
|
||||
size_t secret_string_size_;
|
||||
std::vector<uint8_t> secret_string_;
|
||||
|
||||
size_t plaintext_size_;
|
||||
size_t masked_text_size_;
|
||||
std::vector<uint8_t> masked_text_;
|
||||
|
||||
std::vector<uint8_t> plaintext_;
|
||||
};
|
||||
|
||||
@@ -96,16 +98,16 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, DecodeKeyWithCbcDataInCbcMode) {
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.data(),
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.size(),
|
||||
golden_data_.CBCDecodeKey().content->iv.data(),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), plaintext_.data(),
|
||||
&plaintext_size_),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), masked_text_.data(),
|
||||
&masked_text_size_),
|
||||
WB_RESULT_OK);
|
||||
plaintext_.resize(plaintext_size_);
|
||||
masked_text_.resize(masked_text_size_);
|
||||
|
||||
// Returned data is masked, so it should be the correct size but not
|
||||
// match the original text.
|
||||
ASSERT_EQ(plaintext_.size(),
|
||||
ASSERT_EQ(masked_text_.size(),
|
||||
golden_data_.CBCDecodeKey().content->plaintext.size());
|
||||
ASSERT_NE(plaintext_, golden_data_.CBCDecodeKey().content->plaintext);
|
||||
ASSERT_NE(masked_text_, golden_data_.CBCDecodeKey().content->plaintext);
|
||||
|
||||
// Now unmask the data.
|
||||
ASSERT_EQ(
|
||||
@@ -115,8 +117,12 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, DecodeKeyWithCbcDataInCbcMode) {
|
||||
secret_string_.data(), &secret_string_size_),
|
||||
WB_RESULT_OK);
|
||||
secret_string_.resize(secret_string_size_);
|
||||
WB_License_Unmask(secret_string_.data(), secret_string_.size(),
|
||||
plaintext_.data(), plaintext_.size());
|
||||
|
||||
plaintext_.resize(masked_text_size_);
|
||||
WB_License_Unmask(masked_text_.data(), 0, masked_text_size_,
|
||||
secret_string_.data(), secret_string_.size(),
|
||||
plaintext_.data());
|
||||
|
||||
ASSERT_EQ(plaintext_, golden_data_.CBCDecodeKey().content->plaintext);
|
||||
}
|
||||
|
||||
@@ -130,16 +136,16 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, DecodeKeyWithCtrDataInCtrMode) {
|
||||
golden_data_.CTRDecodeKey().content->ciphertext.data(),
|
||||
golden_data_.CTRDecodeKey().content->ciphertext.size(),
|
||||
golden_data_.CTRDecodeKey().content->iv.data(),
|
||||
golden_data_.CTRDecodeKey().content->iv.size(), plaintext_.data(),
|
||||
&plaintext_size_),
|
||||
golden_data_.CTRDecodeKey().content->iv.size(), masked_text_.data(),
|
||||
&masked_text_size_),
|
||||
WB_RESULT_OK);
|
||||
plaintext_.resize(plaintext_size_);
|
||||
masked_text_.resize(masked_text_size_);
|
||||
|
||||
// Returned data is masked, so it should be the correct size but not
|
||||
// match the original text.
|
||||
ASSERT_EQ(plaintext_.size(),
|
||||
ASSERT_EQ(masked_text_.size(),
|
||||
golden_data_.CTRDecodeKey().content->plaintext.size());
|
||||
ASSERT_NE(plaintext_, golden_data_.CTRDecodeKey().content->plaintext);
|
||||
ASSERT_NE(masked_text_, golden_data_.CTRDecodeKey().content->plaintext);
|
||||
|
||||
// Now unmask the data.
|
||||
ASSERT_EQ(
|
||||
@@ -149,8 +155,12 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, DecodeKeyWithCtrDataInCtrMode) {
|
||||
secret_string_.data(), &secret_string_size_),
|
||||
WB_RESULT_OK);
|
||||
secret_string_.resize(secret_string_size_);
|
||||
WB_License_Unmask(secret_string_.data(), secret_string_.size(),
|
||||
plaintext_.data(), plaintext_.size());
|
||||
|
||||
plaintext_.resize(masked_text_size_);
|
||||
WB_License_Unmask(masked_text_.data(), 0, masked_text_size_,
|
||||
secret_string_.data(), secret_string_.size(),
|
||||
plaintext_.data());
|
||||
|
||||
ASSERT_EQ(plaintext_, golden_data_.CTRDecodeKey().content->plaintext);
|
||||
}
|
||||
|
||||
@@ -166,15 +176,15 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, DecodeKeyWithCbcDataInCtrMode) {
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.data(),
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.size(),
|
||||
golden_data_.CBCDecodeKey().content->iv.data(),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), plaintext_.data(),
|
||||
&plaintext_size_),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), masked_text_.data(),
|
||||
&masked_text_size_),
|
||||
WB_RESULT_OK);
|
||||
plaintext_.resize(plaintext_size_);
|
||||
masked_text_.resize(masked_text_size_);
|
||||
|
||||
// Whatever is returned must not be the original text.
|
||||
ASSERT_EQ(plaintext_.size(),
|
||||
ASSERT_EQ(masked_text_.size(),
|
||||
golden_data_.CBCDecodeKey().content->plaintext.size());
|
||||
ASSERT_NE(plaintext_, golden_data_.CBCDecodeKey().content->plaintext);
|
||||
ASSERT_NE(masked_text_, golden_data_.CBCDecodeKey().content->plaintext);
|
||||
|
||||
// Now unmask the data. Still should not match.
|
||||
ASSERT_EQ(
|
||||
@@ -184,9 +194,13 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, DecodeKeyWithCbcDataInCtrMode) {
|
||||
secret_string_.data(), &secret_string_size_),
|
||||
WB_RESULT_OK);
|
||||
secret_string_.resize(secret_string_size_);
|
||||
WB_License_Unmask(secret_string_.data(), secret_string_.size(),
|
||||
plaintext_.data(), plaintext_.size());
|
||||
ASSERT_NE(plaintext_, golden_data_.CBCDecodeKey().content->plaintext);
|
||||
|
||||
plaintext_.resize(masked_text_size_);
|
||||
WB_License_Unmask(masked_text_.data(), 0, masked_text_size_,
|
||||
secret_string_.data(), secret_string_.size(),
|
||||
plaintext_.data());
|
||||
|
||||
ASSERT_NE(masked_text_, golden_data_.CBCDecodeKey().content->plaintext);
|
||||
}
|
||||
|
||||
// We try to decrypt CTR encrypted data in CBC mode. All operations should be
|
||||
@@ -201,15 +215,15 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, DecodeKeyWithCtrDataInCbcMode) {
|
||||
golden_data_.CTRDecodeKey().content->ciphertext.data(),
|
||||
golden_data_.CTRDecodeKey().content->ciphertext.size(),
|
||||
golden_data_.CTRDecodeKey().content->iv.data(),
|
||||
golden_data_.CTRDecodeKey().content->iv.size(), plaintext_.data(),
|
||||
&plaintext_size_),
|
||||
golden_data_.CTRDecodeKey().content->iv.size(), masked_text_.data(),
|
||||
&masked_text_size_),
|
||||
WB_RESULT_OK);
|
||||
plaintext_.resize(plaintext_size_);
|
||||
masked_text_.resize(masked_text_size_);
|
||||
|
||||
// Whatever is returned must not be the original text.
|
||||
ASSERT_EQ(plaintext_.size(),
|
||||
ASSERT_EQ(masked_text_.size(),
|
||||
golden_data_.CTRDecodeKey().content->plaintext.size());
|
||||
ASSERT_NE(plaintext_, golden_data_.CTRDecodeKey().content->plaintext);
|
||||
ASSERT_NE(masked_text_, golden_data_.CTRDecodeKey().content->plaintext);
|
||||
|
||||
// Now unmask the data. Still should not match.
|
||||
ASSERT_EQ(
|
||||
@@ -219,9 +233,13 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, DecodeKeyWithCtrDataInCbcMode) {
|
||||
secret_string_.data(), &secret_string_size_),
|
||||
WB_RESULT_OK);
|
||||
secret_string_.resize(secret_string_size_);
|
||||
WB_License_Unmask(secret_string_.data(), secret_string_.size(),
|
||||
plaintext_.data(), plaintext_.size());
|
||||
ASSERT_NE(plaintext_, golden_data_.CTRDecodeKey().content->plaintext);
|
||||
|
||||
plaintext_.resize(masked_text_size_);
|
||||
WB_License_Unmask(masked_text_.data(), 0, masked_text_size_,
|
||||
secret_string_.data(), secret_string_.size(),
|
||||
plaintext_.data());
|
||||
|
||||
ASSERT_NE(masked_text_, golden_data_.CTRDecodeKey().content->plaintext);
|
||||
}
|
||||
|
||||
TEST_F(LicenseWhiteboxMaskedDecryptTest, CryptoKeyWithCbcDataInCbcMode) {
|
||||
@@ -234,16 +252,16 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, CryptoKeyWithCbcDataInCbcMode) {
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.data(),
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.size(),
|
||||
golden_data_.CBCDecodeKey().content->iv.data(),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), plaintext_.data(),
|
||||
&plaintext_size_),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), masked_text_.data(),
|
||||
&masked_text_size_),
|
||||
WB_RESULT_OK);
|
||||
plaintext_.resize(plaintext_size_);
|
||||
masked_text_.resize(masked_text_size_);
|
||||
|
||||
// Returned data is masked, so it should be the correct size but not
|
||||
// match the original text.
|
||||
ASSERT_EQ(plaintext_.size(),
|
||||
ASSERT_EQ(masked_text_.size(),
|
||||
golden_data_.CBCDecodeKey().content->plaintext.size());
|
||||
ASSERT_NE(plaintext_, golden_data_.CBCDecodeKey().content->plaintext);
|
||||
ASSERT_NE(masked_text_, golden_data_.CBCDecodeKey().content->plaintext);
|
||||
|
||||
// Now unmask the data.
|
||||
ASSERT_EQ(
|
||||
@@ -253,8 +271,12 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, CryptoKeyWithCbcDataInCbcMode) {
|
||||
secret_string_.data(), &secret_string_size_),
|
||||
WB_RESULT_OK);
|
||||
secret_string_.resize(secret_string_size_);
|
||||
WB_License_Unmask(secret_string_.data(), secret_string_.size(),
|
||||
plaintext_.data(), plaintext_.size());
|
||||
|
||||
plaintext_.resize(masked_text_size_);
|
||||
WB_License_Unmask(masked_text_.data(), 0, masked_text_size_,
|
||||
secret_string_.data(), secret_string_.size(),
|
||||
plaintext_.data());
|
||||
|
||||
ASSERT_EQ(plaintext_, golden_data_.CBCDecodeKey().content->plaintext);
|
||||
}
|
||||
|
||||
@@ -268,16 +290,16 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, CryptoKeyWithCtrDataInCtrMode) {
|
||||
golden_data_.CTRDecodeKey().content->ciphertext.data(),
|
||||
golden_data_.CTRDecodeKey().content->ciphertext.size(),
|
||||
golden_data_.CTRDecodeKey().content->iv.data(),
|
||||
golden_data_.CTRDecodeKey().content->iv.size(), plaintext_.data(),
|
||||
&plaintext_size_),
|
||||
golden_data_.CTRDecodeKey().content->iv.size(), masked_text_.data(),
|
||||
&masked_text_size_),
|
||||
WB_RESULT_OK);
|
||||
plaintext_.resize(plaintext_size_);
|
||||
masked_text_.resize(masked_text_size_);
|
||||
|
||||
// Returned data is masked, so it should be the correct size but not
|
||||
// match the original text.
|
||||
ASSERT_EQ(plaintext_.size(),
|
||||
ASSERT_EQ(masked_text_.size(),
|
||||
golden_data_.CTRDecodeKey().content->plaintext.size());
|
||||
ASSERT_NE(plaintext_, golden_data_.CTRDecodeKey().content->plaintext);
|
||||
ASSERT_NE(masked_text_, golden_data_.CTRDecodeKey().content->plaintext);
|
||||
|
||||
// Now unmask the data.
|
||||
ASSERT_EQ(
|
||||
@@ -287,8 +309,12 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, CryptoKeyWithCtrDataInCtrMode) {
|
||||
secret_string_.data(), &secret_string_size_),
|
||||
WB_RESULT_OK);
|
||||
secret_string_.resize(secret_string_size_);
|
||||
WB_License_Unmask(secret_string_.data(), secret_string_.size(),
|
||||
plaintext_.data(), plaintext_.size());
|
||||
|
||||
plaintext_.resize(masked_text_size_);
|
||||
WB_License_Unmask(masked_text_.data(), 0, masked_text_size_,
|
||||
secret_string_.data(), secret_string_.size(),
|
||||
plaintext_.data());
|
||||
|
||||
ASSERT_EQ(plaintext_, golden_data_.CTRDecodeKey().content->plaintext);
|
||||
}
|
||||
|
||||
@@ -304,15 +330,15 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, CryptoKeyWithCbcDataInCtrMode) {
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.data(),
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.size(),
|
||||
golden_data_.CBCDecodeKey().content->iv.data(),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), plaintext_.data(),
|
||||
&plaintext_size_),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), masked_text_.data(),
|
||||
&masked_text_size_),
|
||||
WB_RESULT_OK);
|
||||
plaintext_.resize(plaintext_size_);
|
||||
masked_text_.resize(masked_text_size_);
|
||||
|
||||
// Whatever is returned must not be the original text.
|
||||
ASSERT_EQ(plaintext_.size(),
|
||||
ASSERT_EQ(masked_text_.size(),
|
||||
golden_data_.CBCDecodeKey().content->plaintext.size());
|
||||
ASSERT_NE(plaintext_, golden_data_.CBCDecodeKey().content->plaintext);
|
||||
ASSERT_NE(masked_text_, golden_data_.CBCDecodeKey().content->plaintext);
|
||||
|
||||
// Now unmask the data. Still should not match.
|
||||
ASSERT_EQ(
|
||||
@@ -322,9 +348,13 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, CryptoKeyWithCbcDataInCtrMode) {
|
||||
secret_string_.data(), &secret_string_size_),
|
||||
WB_RESULT_OK);
|
||||
secret_string_.resize(secret_string_size_);
|
||||
WB_License_Unmask(secret_string_.data(), secret_string_.size(),
|
||||
plaintext_.data(), plaintext_.size());
|
||||
ASSERT_NE(plaintext_, golden_data_.CBCDecodeKey().content->plaintext);
|
||||
|
||||
plaintext_.resize(masked_text_size_);
|
||||
WB_License_Unmask(masked_text_.data(), 0, masked_text_size_,
|
||||
secret_string_.data(), secret_string_.size(),
|
||||
plaintext_.data());
|
||||
|
||||
ASSERT_NE(masked_text_, golden_data_.CBCDecodeKey().content->plaintext);
|
||||
}
|
||||
|
||||
// We try to decrypt CTR encrypted data in CBC mode. All operations should be
|
||||
@@ -339,15 +369,15 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, CryptoKeyWithCtrDataInCbcMode) {
|
||||
golden_data_.CTRCryptoKey().content->ciphertext.data(),
|
||||
golden_data_.CTRCryptoKey().content->ciphertext.size(),
|
||||
golden_data_.CTRCryptoKey().content->iv.data(),
|
||||
golden_data_.CTRCryptoKey().content->iv.size(), plaintext_.data(),
|
||||
&plaintext_size_),
|
||||
golden_data_.CTRCryptoKey().content->iv.size(), masked_text_.data(),
|
||||
&masked_text_size_),
|
||||
WB_RESULT_OK);
|
||||
plaintext_.resize(plaintext_size_);
|
||||
masked_text_.resize(masked_text_size_);
|
||||
|
||||
// Whatever is returned must not be the original text.
|
||||
ASSERT_EQ(plaintext_.size(),
|
||||
ASSERT_EQ(masked_text_.size(),
|
||||
golden_data_.CTRCryptoKey().content->plaintext.size());
|
||||
ASSERT_NE(plaintext_, golden_data_.CTRCryptoKey().content->plaintext);
|
||||
ASSERT_NE(masked_text_, golden_data_.CTRCryptoKey().content->plaintext);
|
||||
|
||||
// Now unmask the data. Still should not match.
|
||||
ASSERT_EQ(
|
||||
@@ -357,9 +387,13 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, CryptoKeyWithCtrDataInCbcMode) {
|
||||
secret_string_.data(), &secret_string_size_),
|
||||
WB_RESULT_OK);
|
||||
secret_string_.resize(secret_string_size_);
|
||||
WB_License_Unmask(secret_string_.data(), secret_string_.size(),
|
||||
plaintext_.data(), plaintext_.size());
|
||||
ASSERT_NE(plaintext_, golden_data_.CTRCryptoKey().content->plaintext);
|
||||
|
||||
plaintext_.resize(masked_text_size_);
|
||||
WB_License_Unmask(masked_text_.data(), 0, masked_text_size_,
|
||||
secret_string_.data(), secret_string_.size(),
|
||||
plaintext_.data());
|
||||
|
||||
ASSERT_NE(masked_text_, golden_data_.CTRCryptoKey().content->plaintext);
|
||||
}
|
||||
|
||||
TEST_F(LicenseWhiteboxMaskedDecryptTest, CryptoKeyWithCbcDataAndPKCS8Padding) {
|
||||
@@ -372,16 +406,16 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, CryptoKeyWithCbcDataAndPKCS8Padding) {
|
||||
golden_data_.CBCCryptoKey().content->ciphertext.data(),
|
||||
golden_data_.CBCCryptoKey().content->ciphertext.size(),
|
||||
golden_data_.CBCCryptoKey().content->iv.data(),
|
||||
golden_data_.CBCCryptoKey().content->iv.size(), plaintext_.data(),
|
||||
&plaintext_size_),
|
||||
golden_data_.CBCCryptoKey().content->iv.size(), masked_text_.data(),
|
||||
&masked_text_size_),
|
||||
WB_RESULT_OK);
|
||||
plaintext_.resize(plaintext_size_);
|
||||
masked_text_.resize(masked_text_size_);
|
||||
|
||||
// Returned data is masked, so it should be the correct size but not
|
||||
// match the original text.
|
||||
ASSERT_EQ(plaintext_.size(),
|
||||
ASSERT_EQ(masked_text_.size(),
|
||||
golden_data_.CBCCryptoKey().content->plaintext.size());
|
||||
ASSERT_NE(plaintext_, golden_data_.CBCCryptoKey().content->plaintext);
|
||||
ASSERT_NE(masked_text_, golden_data_.CBCCryptoKey().content->plaintext);
|
||||
|
||||
// Now unmask the data.
|
||||
ASSERT_EQ(
|
||||
@@ -391,8 +425,12 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, CryptoKeyWithCbcDataAndPKCS8Padding) {
|
||||
secret_string_.data(), &secret_string_size_),
|
||||
WB_RESULT_OK);
|
||||
secret_string_.resize(secret_string_size_);
|
||||
WB_License_Unmask(secret_string_.data(), secret_string_.size(),
|
||||
plaintext_.data(), plaintext_.size());
|
||||
|
||||
plaintext_.resize(masked_text_size_);
|
||||
WB_License_Unmask(masked_text_.data(), 0, masked_text_size_,
|
||||
secret_string_.data(), secret_string_.size(),
|
||||
plaintext_.data());
|
||||
|
||||
ASSERT_EQ(plaintext_, golden_data_.CBCCryptoKey().content->plaintext);
|
||||
}
|
||||
|
||||
@@ -406,16 +444,16 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, CryptoKeyWithCtrDataAndPKCS8Padding) {
|
||||
golden_data_.CTRCryptoKey().content->ciphertext.data(),
|
||||
golden_data_.CTRCryptoKey().content->ciphertext.size(),
|
||||
golden_data_.CTRCryptoKey().content->iv.data(),
|
||||
golden_data_.CTRCryptoKey().content->iv.size(), plaintext_.data(),
|
||||
&plaintext_size_),
|
||||
golden_data_.CTRCryptoKey().content->iv.size(), masked_text_.data(),
|
||||
&masked_text_size_),
|
||||
WB_RESULT_OK);
|
||||
plaintext_.resize(plaintext_size_);
|
||||
masked_text_.resize(masked_text_size_);
|
||||
|
||||
// Returned data is masked, so it should be the correct size but not
|
||||
// match the original text.
|
||||
ASSERT_EQ(plaintext_.size(),
|
||||
ASSERT_EQ(masked_text_.size(),
|
||||
golden_data_.CTRCryptoKey().content->plaintext.size());
|
||||
ASSERT_NE(plaintext_, golden_data_.CTRCryptoKey().content->plaintext);
|
||||
ASSERT_NE(masked_text_, golden_data_.CTRCryptoKey().content->plaintext);
|
||||
|
||||
// Now unmask the data.
|
||||
ASSERT_EQ(
|
||||
@@ -425,8 +463,12 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, CryptoKeyWithCtrDataAndPKCS8Padding) {
|
||||
secret_string_.data(), &secret_string_size_),
|
||||
WB_RESULT_OK);
|
||||
secret_string_.resize(secret_string_size_);
|
||||
WB_License_Unmask(secret_string_.data(), secret_string_.size(),
|
||||
plaintext_.data(), plaintext_.size());
|
||||
|
||||
plaintext_.resize(masked_text_size_);
|
||||
WB_License_Unmask(masked_text_.data(), 0, masked_text_size_,
|
||||
secret_string_.data(), secret_string_.size(),
|
||||
plaintext_.data());
|
||||
|
||||
ASSERT_EQ(plaintext_, golden_data_.CTRCryptoKey().content->plaintext);
|
||||
}
|
||||
|
||||
@@ -445,16 +487,16 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, SuccessWithMultipleKeys) {
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.data(),
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.size(),
|
||||
golden_data_.CBCDecodeKey().content->iv.data(),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), plaintext_.data(),
|
||||
&plaintext_size_),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), masked_text_.data(),
|
||||
&masked_text_size_),
|
||||
WB_RESULT_OK);
|
||||
plaintext_.resize(plaintext_size_);
|
||||
masked_text_.resize(masked_text_size_);
|
||||
|
||||
// Returned data is masked, so it should be the correct size but not
|
||||
// match the original text.
|
||||
ASSERT_EQ(plaintext_.size(),
|
||||
ASSERT_EQ(masked_text_.size(),
|
||||
golden_data_.CBCDecodeKey().content->plaintext.size());
|
||||
ASSERT_NE(plaintext_, golden_data_.CBCDecodeKey().content->plaintext);
|
||||
ASSERT_NE(masked_text_, golden_data_.CBCDecodeKey().content->plaintext);
|
||||
|
||||
// Now unmask the data.
|
||||
ASSERT_EQ(
|
||||
@@ -464,14 +506,18 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, SuccessWithMultipleKeys) {
|
||||
secret_string_.data(), &secret_string_size_),
|
||||
WB_RESULT_OK);
|
||||
secret_string_.resize(secret_string_size_);
|
||||
WB_License_Unmask(secret_string_.data(), secret_string_.size(),
|
||||
plaintext_.data(), plaintext_.size());
|
||||
|
||||
plaintext_.resize(masked_text_size_);
|
||||
WB_License_Unmask(masked_text_.data(), 0, masked_text_size_,
|
||||
secret_string_.data(), secret_string_.size(),
|
||||
plaintext_.data());
|
||||
|
||||
ASSERT_EQ(plaintext_, golden_data_.CBCDecodeKey().content->plaintext);
|
||||
|
||||
// Reset our output buffer.
|
||||
plaintext_.clear();
|
||||
plaintext_size_ = golden_data_.CTRDecodeKey().content->plaintext.size();
|
||||
plaintext_.resize(plaintext_size_);
|
||||
masked_text_.clear();
|
||||
masked_text_size_ = golden_data_.CTRDecodeKey().content->plaintext.size();
|
||||
masked_text_.resize(masked_text_size_);
|
||||
|
||||
ASSERT_EQ(
|
||||
WB_License_MaskedDecrypt(
|
||||
@@ -480,20 +526,20 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, SuccessWithMultipleKeys) {
|
||||
golden_data_.CTRDecodeKey().content->ciphertext.data(),
|
||||
golden_data_.CTRDecodeKey().content->ciphertext.size(),
|
||||
golden_data_.CTRDecodeKey().content->iv.data(),
|
||||
golden_data_.CTRDecodeKey().content->iv.size(), plaintext_.data(),
|
||||
&plaintext_size_),
|
||||
golden_data_.CTRDecodeKey().content->iv.size(), masked_text_.data(),
|
||||
&masked_text_size_),
|
||||
WB_RESULT_OK);
|
||||
plaintext_.resize(plaintext_size_);
|
||||
masked_text_.resize(masked_text_size_);
|
||||
|
||||
// Returned data is masked, so it should be the correct size but not
|
||||
// match the original text.
|
||||
ASSERT_EQ(plaintext_.size(),
|
||||
ASSERT_EQ(masked_text_.size(),
|
||||
golden_data_.CTRDecodeKey().content->plaintext.size());
|
||||
ASSERT_NE(plaintext_, golden_data_.CTRDecodeKey().content->plaintext);
|
||||
ASSERT_NE(masked_text_, golden_data_.CTRDecodeKey().content->plaintext);
|
||||
|
||||
// Now unmask the data.
|
||||
secret_string_.clear();
|
||||
secret_string_size_ = plaintext_.size();
|
||||
secret_string_size_ = masked_text_.size();
|
||||
secret_string_.resize(secret_string_size_);
|
||||
ASSERT_EQ(
|
||||
WB_License_GetSecretString(whitebox_, WB_CIPHER_MODE_CTR,
|
||||
@@ -502,8 +548,12 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, SuccessWithMultipleKeys) {
|
||||
secret_string_.data(), &secret_string_size_),
|
||||
WB_RESULT_OK);
|
||||
secret_string_.resize(secret_string_size_);
|
||||
WB_License_Unmask(secret_string_.data(), secret_string_.size(),
|
||||
plaintext_.data(), plaintext_.size());
|
||||
|
||||
plaintext_.resize(masked_text_size_);
|
||||
WB_License_Unmask(masked_text_.data(), 0, masked_text_size_,
|
||||
secret_string_.data(), secret_string_.size(),
|
||||
plaintext_.data());
|
||||
|
||||
ASSERT_EQ(plaintext_, golden_data_.CTRDecodeKey().content->plaintext);
|
||||
}
|
||||
|
||||
@@ -517,8 +567,8 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, InvalidParameterForNullWhitebox) {
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.data(),
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.size(),
|
||||
golden_data_.CBCDecodeKey().content->iv.data(),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), plaintext_.data(),
|
||||
&plaintext_size_),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), masked_text_.data(),
|
||||
&masked_text_size_),
|
||||
WB_RESULT_INVALID_PARAMETER);
|
||||
}
|
||||
|
||||
@@ -537,7 +587,7 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, InvalidParameterForInvalidCipherMode) {
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.size(),
|
||||
golden_data_.CBCDecodeKey().content->iv.data(),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(),
|
||||
plaintext_.data(), &plaintext_size_),
|
||||
masked_text_.data(), &masked_text_size_),
|
||||
WB_RESULT_INVALID_PARAMETER);
|
||||
}
|
||||
|
||||
@@ -551,7 +601,7 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, InvalidParameterForNullKeyId) {
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.size(),
|
||||
golden_data_.CBCDecodeKey().content->iv.data(),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(),
|
||||
plaintext_.data(), &plaintext_size_),
|
||||
masked_text_.data(), &masked_text_size_),
|
||||
WB_RESULT_INVALID_PARAMETER);
|
||||
}
|
||||
|
||||
@@ -564,8 +614,8 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, InvalidParameterForNullZeroKeyIdSize) {
|
||||
0, golden_data_.CBCDecodeKey().content->ciphertext.data(),
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.size(),
|
||||
golden_data_.CBCDecodeKey().content->iv.data(),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), plaintext_.data(),
|
||||
&plaintext_size_),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), masked_text_.data(),
|
||||
&masked_text_size_),
|
||||
WB_RESULT_INVALID_PARAMETER);
|
||||
}
|
||||
|
||||
@@ -578,8 +628,8 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, InvalidParameterForNullInputData) {
|
||||
golden_data_.CBCDecodeKey().id.size(), nullptr,
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.size(),
|
||||
golden_data_.CBCDecodeKey().content->iv.data(),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), plaintext_.data(),
|
||||
&plaintext_size_),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), masked_text_.data(),
|
||||
&masked_text_size_),
|
||||
WB_RESULT_INVALID_PARAMETER);
|
||||
}
|
||||
|
||||
@@ -595,8 +645,8 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest,
|
||||
golden_data_.CBCDecodeKey().id.size(),
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.data(), 14,
|
||||
golden_data_.CBCDecodeKey().content->iv.data(),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), plaintext_.data(),
|
||||
&plaintext_size_),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), masked_text_.data(),
|
||||
&masked_text_size_),
|
||||
WB_RESULT_INVALID_PARAMETER);
|
||||
}
|
||||
|
||||
@@ -610,8 +660,8 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, InvalidParameterForZeroInputDataSize) {
|
||||
golden_data_.CBCDecodeKey().id.size(),
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.data(), 0,
|
||||
golden_data_.CBCDecodeKey().content->iv.data(),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), plaintext_.data(),
|
||||
&plaintext_size_),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), masked_text_.data(),
|
||||
&masked_text_size_),
|
||||
WB_RESULT_INVALID_PARAMETER);
|
||||
}
|
||||
|
||||
@@ -624,8 +674,8 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, InvalidParameterForNullIV) {
|
||||
golden_data_.CBCDecodeKey().id.size(),
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.data(),
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.size(), nullptr,
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), plaintext_.data(),
|
||||
&plaintext_size_),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), masked_text_.data(),
|
||||
&masked_text_size_),
|
||||
WB_RESULT_INVALID_PARAMETER);
|
||||
}
|
||||
|
||||
@@ -639,8 +689,8 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, InvalidParameterForInvalidIVSize) {
|
||||
golden_data_.CBCDecodeKey().id.size(),
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.data(),
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.size(),
|
||||
golden_data_.CBCDecodeKey().content->iv.data(), 9, plaintext_.data(),
|
||||
&plaintext_size_),
|
||||
golden_data_.CBCDecodeKey().content->iv.data(), 9,
|
||||
masked_text_.data(), &masked_text_size_),
|
||||
WB_RESULT_INVALID_PARAMETER);
|
||||
}
|
||||
|
||||
@@ -655,7 +705,7 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, InvalidParameterForNullOutput) {
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.size(),
|
||||
golden_data_.CBCDecodeKey().content->iv.data(),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), nullptr,
|
||||
&plaintext_size_),
|
||||
&masked_text_size_),
|
||||
WB_RESULT_INVALID_PARAMETER);
|
||||
}
|
||||
|
||||
@@ -669,7 +719,7 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, InvalidParameterForNullOutputSize) {
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.data(),
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.size(),
|
||||
golden_data_.CBCDecodeKey().content->iv.data(),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), plaintext_.data(),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), masked_text_.data(),
|
||||
nullptr),
|
||||
WB_RESULT_INVALID_PARAMETER);
|
||||
}
|
||||
@@ -687,7 +737,7 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, KeyUnavailableForMissingKeyId) {
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.size(),
|
||||
golden_data_.CBCDecodeKey().content->iv.data(),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(),
|
||||
plaintext_.data(), &plaintext_size_),
|
||||
masked_text_.data(), &masked_text_size_),
|
||||
WB_RESULT_KEY_UNAVAILABLE);
|
||||
}
|
||||
|
||||
@@ -701,7 +751,7 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, KeyUnavailableForNonContentKey) {
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.size(),
|
||||
golden_data_.CBCDecodeKey().content->iv.data(),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(),
|
||||
plaintext_.data(), &plaintext_size_),
|
||||
masked_text_.data(), &masked_text_size_),
|
||||
WB_RESULT_KEY_UNAVAILABLE);
|
||||
}
|
||||
|
||||
@@ -719,7 +769,7 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest,
|
||||
golden_data_.CBCHardwareKey().content->ciphertext.size(),
|
||||
golden_data_.CBCHardwareKey().content->iv.data(),
|
||||
golden_data_.CBCHardwareKey().content->iv.size(),
|
||||
plaintext_.data(), &plaintext_size_),
|
||||
masked_text_.data(), &masked_text_size_),
|
||||
WB_RESULT_INSUFFICIENT_SECURITY_LEVEL);
|
||||
}
|
||||
|
||||
@@ -734,8 +784,8 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, InvalidState) {
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.data(),
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.size(),
|
||||
golden_data_.CBCDecodeKey().content->iv.data(),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), plaintext_.data(),
|
||||
&plaintext_size_),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), masked_text_.data(),
|
||||
&masked_text_size_),
|
||||
WB_RESULT_INVALID_STATE);
|
||||
}
|
||||
|
||||
@@ -744,7 +794,7 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, BufferTooSmall) {
|
||||
|
||||
// Our ciphertext will be large enough that we should not need to worry about
|
||||
// using a constant here.
|
||||
plaintext_size_ = 8;
|
||||
masked_text_size_ = 8;
|
||||
|
||||
ASSERT_EQ(
|
||||
WB_License_MaskedDecrypt(
|
||||
@@ -753,14 +803,52 @@ TEST_F(LicenseWhiteboxMaskedDecryptTest, BufferTooSmall) {
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.data(),
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.size(),
|
||||
golden_data_.CBCDecodeKey().content->iv.data(),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), plaintext_.data(),
|
||||
&plaintext_size_),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), masked_text_.data(),
|
||||
&masked_text_size_),
|
||||
WB_RESULT_BUFFER_TOO_SMALL);
|
||||
|
||||
// We don't use padding so the reported plaintext size should be the same as
|
||||
// the cipher text size.
|
||||
ASSERT_EQ(plaintext_size_,
|
||||
ASSERT_EQ(masked_text_size_,
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.size());
|
||||
}
|
||||
|
||||
// Check that the result of unmasking only a small portion of the data is the
|
||||
// same as when we unmask the whole buffer.
|
||||
TEST_F(LicenseWhiteboxMaskedDecryptTest, SuccessForSubRangeUnmask) {
|
||||
LoadLicense(TestLicenseBuilder::NoPadding());
|
||||
|
||||
ASSERT_EQ(
|
||||
WB_License_MaskedDecrypt(
|
||||
whitebox_, WB_CIPHER_MODE_CBC, golden_data_.CBCDecodeKey().id.data(),
|
||||
golden_data_.CBCDecodeKey().id.size(),
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.data(),
|
||||
golden_data_.CBCDecodeKey().content->ciphertext.size(),
|
||||
golden_data_.CBCDecodeKey().content->iv.data(),
|
||||
golden_data_.CBCDecodeKey().content->iv.size(), masked_text_.data(),
|
||||
&masked_text_size_),
|
||||
WB_RESULT_OK);
|
||||
|
||||
ASSERT_EQ(
|
||||
WB_License_GetSecretString(whitebox_, WB_CIPHER_MODE_CBC,
|
||||
golden_data_.CBCDecodeKey().id.data(),
|
||||
golden_data_.CBCDecodeKey().id.size(),
|
||||
secret_string_.data(), &secret_string_size_),
|
||||
WB_RESULT_OK);
|
||||
secret_string_.resize(secret_string_size_);
|
||||
|
||||
std::vector<uint8_t> full_unmask(masked_text_size_);
|
||||
std::vector<uint8_t> partial_unmask(3);
|
||||
|
||||
WB_License_Unmask(masked_text_.data(), 0, masked_text_size_,
|
||||
secret_string_.data(), secret_string_.size(),
|
||||
full_unmask.data());
|
||||
WB_License_Unmask(masked_text_.data(), 4, partial_unmask.size(),
|
||||
secret_string_.data(), secret_string_.size(),
|
||||
partial_unmask.data());
|
||||
|
||||
ASSERT_EQ(full_unmask[4], partial_unmask[0]);
|
||||
ASSERT_EQ(full_unmask[5], partial_unmask[1]);
|
||||
ASSERT_EQ(full_unmask[6], partial_unmask[2]);
|
||||
}
|
||||
} // namespace widevine
|
||||
|
||||
Reference in New Issue
Block a user