Added OEMCrypto build information validation test.
[ Merge of http://go/wvgerrit/219212 ] This CL adds a new OEMCrypto test CheckBuildInformation*API17 which ensures that OEMCrypto_BuildInformation() is generating valid build information. Bug: 348498112 Bug: 348497732 Change-Id: I22f9878d8ffa05b2b1b1b6ec28718e231438d4a7 Merged-In: I22f9878d8ffa05b2b1b1b6ec28718e231438d4a7
This commit is contained in:
@@ -2,11 +2,22 @@
|
|||||||
// source code may only be used and distributed under the Widevine
|
// source code may only be used and distributed under the Widevine
|
||||||
// License Agreement.
|
// License Agreement.
|
||||||
//
|
//
|
||||||
|
|
||||||
#include "oemcrypto_basic_test.h"
|
#include "oemcrypto_basic_test.h"
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <map>
|
||||||
|
#include <ostream>
|
||||||
|
#include <set>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <jsmn.h>
|
||||||
|
|
||||||
|
#include "OEMCryptoCENC.h"
|
||||||
#include "clock.h"
|
#include "clock.h"
|
||||||
#include "jsmn.h"
|
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "oemcrypto_corpus_generator_helper.h"
|
#include "oemcrypto_corpus_generator_helper.h"
|
||||||
#include "oemcrypto_resource_test.h"
|
#include "oemcrypto_resource_test.h"
|
||||||
@@ -316,6 +327,119 @@ TEST_F(OEMCryptoClientTest, CheckNullBuildInformationAPI17) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Verifies that OEMCrypto_BuildInformation() is behaving as expected
|
||||||
|
// by assigning appropriate values to the build info size.
|
||||||
|
TEST_F(OEMCryptoClientTest, CheckBuildInformation_OutputLengthAPI17) {
|
||||||
|
constexpr size_t kZero = 0;
|
||||||
|
constexpr char kNullChar = '\0';
|
||||||
|
|
||||||
|
// Allocating single byte to avoid potential null dereference.
|
||||||
|
std::string build_info(1, kNullChar);
|
||||||
|
size_t build_info_length = 0;
|
||||||
|
|
||||||
|
OEMCryptoResult result =
|
||||||
|
OEMCrypto_BuildInformation(&build_info[0], &build_info_length);
|
||||||
|
|
||||||
|
ASSERT_EQ(result, OEMCrypto_ERROR_SHORT_BUFFER);
|
||||||
|
ASSERT_GT(build_info_length, kZero)
|
||||||
|
<< "Signaling ERROR_SHORT_BUFFER should have assigned a length";
|
||||||
|
|
||||||
|
// Force a ERROR_SHORT_BUFFER using a non-zero value.
|
||||||
|
// Note: It is assumed that vendors will provide more than a single
|
||||||
|
// character of info.
|
||||||
|
const size_t second_attempt_length =
|
||||||
|
(build_info_length >= 2) ? build_info_length / 2 : 1;
|
||||||
|
build_info.assign(second_attempt_length, kNullChar);
|
||||||
|
build_info_length = build_info.size();
|
||||||
|
|
||||||
|
result = OEMCrypto_BuildInformation(&build_info[0], &build_info_length);
|
||||||
|
ASSERT_EQ(result, OEMCrypto_ERROR_SHORT_BUFFER)
|
||||||
|
<< "second_attempt_length = " << second_attempt_length
|
||||||
|
<< ", build_info_length" << build_info_length;
|
||||||
|
// OEM specified build info length should be larger than the
|
||||||
|
// original length if returning ERROR_SHORT_BUFFER.
|
||||||
|
ASSERT_GT(build_info_length, second_attempt_length);
|
||||||
|
|
||||||
|
// Final attempt with a buffer large enough buffer, padding to
|
||||||
|
// ensure the caller truncates.
|
||||||
|
constexpr size_t kBufferPadSize = 42;
|
||||||
|
const size_t expected_length = build_info_length;
|
||||||
|
const size_t final_attempt_length = expected_length + kBufferPadSize;
|
||||||
|
build_info.assign(final_attempt_length, kNullChar);
|
||||||
|
build_info_length = build_info.size();
|
||||||
|
|
||||||
|
result = OEMCrypto_BuildInformation(&build_info[0], &build_info_length);
|
||||||
|
|
||||||
|
ASSERT_EQ(result, OEMCrypto_SUCCESS)
|
||||||
|
<< "final_attempt_length = " << final_attempt_length
|
||||||
|
<< ", expected_length = " << expected_length
|
||||||
|
<< ", build_info_length = " << build_info_length;
|
||||||
|
// Ensure not empty.
|
||||||
|
ASSERT_GT(build_info_length, kZero) << "Build info cannot be empty";
|
||||||
|
// Ensure it was truncated down from the padded length.
|
||||||
|
ASSERT_LT(build_info_length, final_attempt_length)
|
||||||
|
<< "Should have truncated from oversized buffer: expected_length = "
|
||||||
|
<< expected_length;
|
||||||
|
// Ensure the real length is within the size originally specified.
|
||||||
|
// OK if final length is smaller than estimated length.
|
||||||
|
ASSERT_LE(build_info_length, expected_length);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verifies that OEMCrypto_BuildInformation() is behaving as expected
|
||||||
|
// by checking the resulting contents.
|
||||||
|
// Does not validate whether output if valid JSON for v18.
|
||||||
|
TEST_F(OEMCryptoClientTest, CheckBuildInformation_OutputContentAPI17) {
|
||||||
|
constexpr size_t kZero = 0;
|
||||||
|
constexpr char kNullChar = '\0';
|
||||||
|
|
||||||
|
// Allocating single byte to avoid potential null dereference.
|
||||||
|
std::string build_info(1, kNullChar);
|
||||||
|
size_t build_info_length = 0;
|
||||||
|
OEMCryptoResult result =
|
||||||
|
OEMCrypto_BuildInformation(&build_info[0], &build_info_length);
|
||||||
|
ASSERT_EQ(result, OEMCrypto_ERROR_SHORT_BUFFER);
|
||||||
|
ASSERT_GT(build_info_length, kZero)
|
||||||
|
<< "Signaling ERROR_SHORT_BUFFER should have assigned a length";
|
||||||
|
|
||||||
|
// Expect successful acquisition of build information.
|
||||||
|
const size_t expected_length = build_info_length;
|
||||||
|
build_info.assign(expected_length, kNullChar);
|
||||||
|
result = OEMCrypto_BuildInformation(&build_info[0], &build_info_length);
|
||||||
|
ASSERT_EQ(result, OEMCrypto_SUCCESS)
|
||||||
|
<< "expected_length = " << expected_length
|
||||||
|
<< ", build_info_length = " << build_info_length;
|
||||||
|
// Ensure not empty.
|
||||||
|
ASSERT_GT(build_info_length, kZero) << "Build info cannot be empty";
|
||||||
|
// Ensure the real length is within the size originally specified.
|
||||||
|
ASSERT_LE(build_info_length, expected_length)
|
||||||
|
<< "Cannot specify success if buffer was too small";
|
||||||
|
build_info.resize(build_info_length);
|
||||||
|
|
||||||
|
// Ensure there isn't a trailing null byte.
|
||||||
|
ASSERT_NE(build_info.back(), kNullChar)
|
||||||
|
<< "Build info must not contain trailing null byte";
|
||||||
|
|
||||||
|
// Ensure all build info characters are printable, or a limited
|
||||||
|
// set of white space characters (case of JSON build info).
|
||||||
|
const auto is_valid_build_info_white_space = [](const char& ch) -> bool {
|
||||||
|
constexpr char kSpace = ' ';
|
||||||
|
constexpr char kLineFeed = '\n';
|
||||||
|
constexpr char kTab = '\t';
|
||||||
|
return ch == kLineFeed || ch == kTab || ch == kSpace;
|
||||||
|
};
|
||||||
|
const auto is_valid_build_info_char = [&](const char& ch) -> bool {
|
||||||
|
return ::isprint(ch) || is_valid_build_info_white_space(ch);
|
||||||
|
};
|
||||||
|
ASSERT_TRUE(std::all_of(build_info.begin(), build_info.end(),
|
||||||
|
is_valid_build_info_char))
|
||||||
|
<< "Build info is not printable: " << wvutil::b2a_hex(build_info);
|
||||||
|
|
||||||
|
// Ensure build info isn't just white space.
|
||||||
|
ASSERT_FALSE(std::all_of(build_info.begin(), build_info.end(),
|
||||||
|
is_valid_build_info_white_space))
|
||||||
|
<< "Build info is just white space: " << wvutil::b2a_hex(build_info);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(OEMCryptoClientTest, CheckJsonBuildInformationAPI18) {
|
TEST_F(OEMCryptoClientTest, CheckJsonBuildInformationAPI18) {
|
||||||
if (wvoec::global_features.api_version < 18) {
|
if (wvoec::global_features.api_version < 18) {
|
||||||
GTEST_SKIP() << "Test for versions 18 and up only.";
|
GTEST_SKIP() << "Test for versions 18 and up only.";
|
||||||
|
|||||||
Reference in New Issue
Block a user