1693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com/* 2693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com * Copyright (c) 2013 The WebM project authors. All Rights Reserved. 3693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com * 4693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com * Use of this source code is governed by a BSD-style license 5693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com * that can be found in the LICENSE file in the root of the source 6693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com * tree. An additional intellectual property rights grant can be found 7693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com * in the file PATENTS. All contributing project authors may 8693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com * be found in the AUTHORS file in the root of the source tree. 9693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com */ 10693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com 11693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com#include <cstdio> 12693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com#include <cstdlib> 13693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com#include <string> 14693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com#include <vector> 15693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com#include "third_party/googletest/src/include/gtest/gtest.h" 16693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com#include "test/codec_factory.h" 17693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com#include "test/ivf_video_source.h" 18693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com 19693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comnamespace { 20693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com// In a real use the 'decrypt_state' parameter will be a pointer to a struct 21693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com// with whatever internal state the decryptor uses. For testing we'll just 22693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com// xor with a constant key, and decrypt_state will point to the start of 23693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com// the original buffer. 24693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comconst uint8_t test_key[16] = { 25693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com 0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78, 26693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com 0x89, 0x9a, 0xab, 0xbc, 0xcd, 0xde, 0xef, 0xf0 27693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com}; 28693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com 29693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comvoid encrypt_buffer(const uint8_t *src, uint8_t *dst, size_t size, 30693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com ptrdiff_t offset) { 31693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com for (size_t i = 0; i < size; ++i) { 32693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com dst[i] = src[i] ^ test_key[(offset + i) & 15]; 33693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com } 34693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com} 35693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com 36693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comvoid test_decrypt_cb(void *decrypt_state, const uint8_t *input, 37693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com uint8_t *output, int count) { 38693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com encrypt_buffer(input, output, count, 39693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com input - reinterpret_cast<uint8_t *>(decrypt_state)); 40693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com} 41693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com 42693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com} // namespace 43693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com 44693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comnamespace libvpx_test { 45693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com 46693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comTEST(TestDecrypt, DecryptWorksVp9) { 47693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com libvpx_test::IVFVideoSource video("vp90-2-05-resize.ivf"); 48693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com video.Init(); 49693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com 50d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_codec_dec_cfg_t dec_cfg = vpx_codec_dec_cfg_t(); 51693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com VP9Decoder decoder(dec_cfg, 0); 52693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com 53693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com video.Begin(); 54693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com 55693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com // no decryption 56693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com vpx_codec_err_t res = decoder.DecodeFrame(video.cxdata(), video.frame_size()); 57693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com ASSERT_EQ(VPX_CODEC_OK, res) << decoder.DecodeError(); 58693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com 59693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com // decrypt frame 60693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com video.Next(); 61693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com 62693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com std::vector<uint8_t> encrypted(video.frame_size()); 63693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com 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); 66693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com 67693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com res = decoder.DecodeFrame(&encrypted[0], encrypted.size()); 68693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com ASSERT_EQ(VPX_CODEC_OK, res) << decoder.DecodeError(); 69693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com} 70693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com 71693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com} // namespace libvpx_test 72