OEMCrypto v11 Documentation and Headers
Merge from widevine repo of http://go/wvgerrit/16186 These are the OEMCrypto v11 documents and header files. I have updated just enough code so that existing unit tests pass. New unit tests, the reference implementation, and the level 3 implementation are in future CLs. Change-Id: I9bbf1909e047f63a5877320a2d06740a3c4a3e32
This commit is contained in:
@@ -828,6 +828,7 @@ class Session {
|
||||
key_array[i].key_control_iv = data.keys[i].control_iv;
|
||||
key_array[i].key_control =
|
||||
reinterpret_cast<const uint8_t*>(&data.keys[i].control);
|
||||
key_array[i].cipher_mode = OEMCrypto_CipherMode_CTR;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -887,10 +888,14 @@ class Session {
|
||||
destBuffer.type = OEMCrypto_BufferType_Clear;
|
||||
destBuffer.buffer.clear.address = outputBuffer.data();
|
||||
destBuffer.buffer.clear.max_length = outputBuffer.size();
|
||||
OEMCrypto_PatternDesc pattern;
|
||||
pattern.encrypt = 1; // TODO(fredgc): test other values.
|
||||
pattern.skip = 0;
|
||||
pattern.offset = 0;
|
||||
// Decrypt the data
|
||||
sts = OEMCrypto_DecryptCTR(
|
||||
sts = OEMCrypto_DecryptCENC(
|
||||
session_id(), &encryptedData[0], encryptedData.size(), true,
|
||||
&encryptionIv[0], 0, &destBuffer,
|
||||
&encryptionIv[0], 0, &destBuffer, &pattern,
|
||||
OEMCrypto_FirstSubsample | OEMCrypto_LastSubsample);
|
||||
// We only have a few errors that we test are reported.
|
||||
if (expected_result == OEMCrypto_SUCCESS) { // No error.
|
||||
@@ -1283,7 +1288,7 @@ TEST_F(OEMCryptoClientTest, VersionNumber) {
|
||||
cout << " OEMCrypto does not support usage tables." << endl;
|
||||
}
|
||||
ASSERT_GE(version, 8u);
|
||||
ASSERT_LE(version, 10u);
|
||||
ASSERT_LE(version, 11u);
|
||||
}
|
||||
|
||||
const char* HDCPCapabilityAsString(OEMCrypto_HDCP_Capability value) {
|
||||
@@ -2259,6 +2264,10 @@ TEST_F(OEMCryptoSessionTests, DecryptPerformance) {
|
||||
OEMCrypto_DestBufferDesc destBuffer;
|
||||
destBuffer.type = OEMCrypto_BufferType_Clear;
|
||||
destBuffer.buffer.clear.address = &output[0];
|
||||
OEMCrypto_PatternDesc pattern;
|
||||
pattern.encrypt = 1; // TODO(fredgc): test other values.
|
||||
pattern.skip = 0;
|
||||
pattern.offset = 0;
|
||||
|
||||
const char* level = OEMCrypto_SecurityLevel();
|
||||
const int n = 10;
|
||||
@@ -2278,9 +2287,9 @@ TEST_F(OEMCryptoSessionTests, DecryptPerformance) {
|
||||
size_t total = 0;
|
||||
do {
|
||||
ASSERT_EQ(OEMCrypto_SUCCESS,
|
||||
OEMCrypto_DecryptCTR(
|
||||
OEMCrypto_DecryptCENC(
|
||||
s.session_id(), &input[0], length, true,
|
||||
&encryptionIv[0], 0, &destBuffer,
|
||||
&encryptionIv[0], 0, &destBuffer, &pattern,
|
||||
OEMCrypto_FirstSubsample | OEMCrypto_LastSubsample));
|
||||
count++;
|
||||
total += length;
|
||||
@@ -2377,6 +2386,11 @@ class OEMCryptoSessionTestsDecryptEdgeCases : public OEMCryptoSessionTests {
|
||||
s.license().keys[0].key_id_length);
|
||||
ASSERT_EQ(OEMCrypto_SUCCESS, sts);
|
||||
|
||||
OEMCrypto_PatternDesc pattern;
|
||||
pattern.encrypt = 1; // TODO(fredgc): test other values.
|
||||
pattern.skip = 0;
|
||||
pattern.offset = 0;
|
||||
|
||||
// We decrypt three subsamples. each with a block offset.
|
||||
vector<uint8_t> outputBuffer(total_size, 0xaa);
|
||||
size_t buffer_offset = 0;
|
||||
@@ -2395,9 +2409,9 @@ class OEMCryptoSessionTestsDecryptEdgeCases : public OEMCryptoSessionTests {
|
||||
memcpy(aes_iv, &encryptionIv[0], AES_BLOCK_SIZE);
|
||||
size_t iv_increment = buffer_offset / AES_BLOCK_SIZE;
|
||||
ctr128_inc64(iv_increment, aes_iv);
|
||||
sts = OEMCrypto_DecryptCTR(
|
||||
sts = OEMCrypto_DecryptCENC(
|
||||
s.session_id(), &encryptedData[buffer_offset], subsample_size[i],
|
||||
true, aes_iv, block_offset, &destBuffer, subsample_flags);
|
||||
true, aes_iv, block_offset, &destBuffer, &pattern, subsample_flags);
|
||||
ASSERT_EQ(OEMCrypto_SUCCESS, sts);
|
||||
buffer_offset += subsample_size[i];
|
||||
}
|
||||
@@ -2531,11 +2545,15 @@ TEST_F(OEMCryptoSessionTests, DecryptUnencrypted) {
|
||||
destBuffer.type = OEMCrypto_BufferType_Clear;
|
||||
destBuffer.buffer.clear.address = &outputBuffer[0];
|
||||
destBuffer.buffer.clear.max_length = outputBuffer.size();
|
||||
OEMCrypto_PatternDesc pattern;
|
||||
pattern.encrypt = 1; // TODO(fredgc): test other values.
|
||||
pattern.skip = 0;
|
||||
pattern.offset = 0;
|
||||
|
||||
// Decrypt the data
|
||||
sts = OEMCrypto_DecryptCTR(
|
||||
sts = OEMCrypto_DecryptCENC(
|
||||
s.session_id(), &unencryptedData[0], unencryptedData.size(), false,
|
||||
&encryptionIv[0], 0, &destBuffer,
|
||||
&encryptionIv[0], 0, &destBuffer, &pattern,
|
||||
OEMCrypto_FirstSubsample | OEMCrypto_LastSubsample);
|
||||
ASSERT_EQ(OEMCrypto_SUCCESS, sts);
|
||||
ASSERT_EQ(unencryptedData, outputBuffer);
|
||||
@@ -2566,11 +2584,15 @@ TEST_F(OEMCryptoSessionTests, DecryptUnencryptedNoKey) {
|
||||
destBuffer.type = OEMCrypto_BufferType_Clear;
|
||||
destBuffer.buffer.clear.address = &outputBuffer[0];
|
||||
destBuffer.buffer.clear.max_length = outputBuffer.size();
|
||||
OEMCrypto_PatternDesc pattern;
|
||||
pattern.encrypt = 1; // TODO(fredgc): test other values.
|
||||
pattern.skip = 0;
|
||||
pattern.offset = 0;
|
||||
|
||||
// Decrypt the data
|
||||
sts = OEMCrypto_DecryptCTR(
|
||||
sts = OEMCrypto_DecryptCENC(
|
||||
s.session_id(), &unencryptedData[0], unencryptedData.size(), false,
|
||||
&encryptionIv[0], 0, &destBuffer,
|
||||
&encryptionIv[0], 0, &destBuffer, &pattern,
|
||||
OEMCrypto_FirstSubsample | OEMCrypto_LastSubsample);
|
||||
ASSERT_EQ(OEMCrypto_SUCCESS, sts);
|
||||
ASSERT_EQ(unencryptedData, outputBuffer);
|
||||
|
||||
Reference in New Issue
Block a user