1ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org/* 2ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org * Copyright (c) 2013 The WebM project authors. All Rights Reserved. 3ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org * 4ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org * Use of this source code is governed by a BSD-style license 5ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org * that can be found in the LICENSE file in the root of the source 6ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org * tree. An additional intellectual property rights grant can be found 7ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org * in the file PATENTS. All contributing project authors may 8ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org * be found in the AUTHORS file in the root of the source tree. 9ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org */ 10ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org 11ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org#include <cstdio> 12ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org#include <cstdlib> 13ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org#include <string> 146ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com#include <vector> 15ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org#include "third_party/googletest/src/include/gtest/gtest.h" 166ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com#include "test/codec_factory.h" 17ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org#include "test/ivf_video_source.h" 18ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org 19ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.orgnamespace { 206ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com// In a real use the 'decrypt_state' parameter will be a pointer to a struct 216ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com// with whatever internal state the decryptor uses. For testing we'll just 226ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com// xor with a constant key, and decrypt_state will point to the start of 236ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com// the original buffer. 246ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.comconst uint8_t test_key[16] = { 256ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com 0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78, 266ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com 0x89, 0x9a, 0xab, 0xbc, 0xcd, 0xde, 0xef, 0xf0 27ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org}; 28ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org 2993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgvoid encrypt_buffer(const uint8_t *src, uint8_t *dst, size_t size, 3093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org ptrdiff_t offset) { 3193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org for (size_t i = 0; i < size; ++i) { 326ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com dst[i] = src[i] ^ test_key[(offset + i) & 15]; 336ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com } 346ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com} 35ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org 366ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.comvoid test_decrypt_cb(void *decrypt_state, const uint8_t *input, 376ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com uint8_t *output, int count) { 38f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org encrypt_buffer(input, output, count, 39f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org input - reinterpret_cast<uint8_t *>(decrypt_state)); 406ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com} 41ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org 42f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org} // namespace 43ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org 446ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.comnamespace libvpx_test { 45ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org 46693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comTEST(TestDecrypt, DecryptWorksVp8) { 47ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org libvpx_test::IVFVideoSource video("vp80-00-comprehensive-001.ivf"); 48ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org video.Init(); 49ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org 50d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_codec_dec_cfg_t dec_cfg = vpx_codec_dec_cfg_t(); 516ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com VP8Decoder decoder(dec_cfg, 0); 52ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org 53ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org video.Begin(); 546ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com 556ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com // no decryption 56ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org vpx_codec_err_t res = decoder.DecodeFrame(video.cxdata(), video.frame_size()); 57ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org ASSERT_EQ(VPX_CODEC_OK, res) << decoder.DecodeError(); 58ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org 596ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com // decrypt frame 60ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org video.Next(); 616ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com 626ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com std::vector<uint8_t> encrypted(video.frame_size()); 6393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org encrypt_buffer(video.cxdata(), &encrypted[0], video.frame_size(), 0); 64693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com vpx_decrypt_init di = { test_decrypt_cb, &encrypted[0] }; 65693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com decoder.Control(VPXD_SET_DECRYPTOR, &di); 666ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com 67693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com res = decoder.DecodeFrame(&encrypted[0], encrypted.size()); 686ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com ASSERT_EQ(VPX_CODEC_OK, res) << decoder.DecodeError(); 69ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org} 70ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org 71ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org} // namespace libvpx_test 72