From 59580f40ab55090b5336e5a996d00f77c81269ab Mon Sep 17 00:00:00 2001 From: Rahul Frias Date: Wed, 9 Mar 2016 01:13:47 -0800 Subject: [PATCH] Add CDM integration tests for HLS [ Merge of https://go/wvgerrit/17083 ] b/27559429 Change-Id: I65a0a163e0e14bf711c257d7ab2c9486ec002c07 --- .../cdm/core/test/test_printers.cpp | 2 + .../cdm/test/request_license_test.cpp | 438 +++++++++++++++++- 2 files changed, 437 insertions(+), 3 deletions(-) diff --git a/libwvdrmengine/cdm/core/test/test_printers.cpp b/libwvdrmengine/cdm/core/test/test_printers.cpp index 7147f8a9..f532e025 100644 --- a/libwvdrmengine/cdm/core/test/test_printers.cpp +++ b/libwvdrmengine/cdm/core/test/test_printers.cpp @@ -335,6 +335,8 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) { case LICENSE_RENEWAL_PROHIBITED: *os << "LICENSE_RENEWAL_PROHIBITED"; case SESSION_FILE_HANDLE_INIT_ERROR: *os << "SESSION_FILE_HANDLE_INIT_ERROR"; break; + case INCORRECT_CRYPTO_MODE: *os << "INCORRECT_CRYPTO_MODE"; + break; default: *os << "Unknown CdmResponseType"; break; diff --git a/libwvdrmengine/cdm/test/request_license_test.cpp b/libwvdrmengine/cdm/test/request_license_test.cpp index e56f2340..f55ad74f 100644 --- a/libwvdrmengine/cdm/test/request_license_test.cpp +++ b/libwvdrmengine/cdm/test/request_license_test.cpp @@ -437,6 +437,323 @@ RenewWithClientIdTestConfiguration {true, false, false, false, "Test: Usage reporting with client Id"}}; +// provider:"widevine_test", +// content_id":"aGxzX3NhbXBsZV9hZXNfc3RyZWFtaW5n" (hls_sample_aes_streaming) +// key_id:613db35603320eb8e7ea24bdeea3fdb8 +// key:78a1dc0646119707e903514d8a00735f +const std::string kAttributeListSampleAes = + "#EXT-X-KEY:" + "METHOD=SAMPLE-AES," + "KEYFORMAT=\"com.widevine\"," + "KEYFORMATVERSIONS=\"1\"," + "URI=\"data:text/" + "plain;base64," + "ew0KICAgInByb3ZpZGVyIjoid2lkZXZpbmVfdGVzdCIsDQogICAiY29udGVudF9pZCI6ImFHeH" + "pYM05oYlhCc1pWOWhaWE5mYzNSeVpXRnRhVzVuIiwNCiAgICJrZXlfaWRzIjoNCiAgIFsNCiAg" + "ICAgICI2MTNkYjM1NjAzMzIwZWI4ZTdlYTI0YmRlZWEzZmRiOCINCiAgIF0NCn0=\"," + "IV=0x9FBE45DD47DA7EBA09A3E24CBA95C9AF"; + +// provider:"widevine_test", +// content_id":"aGxzX2Flc18xMjhfc3RyZWFtaW5n" (hls_aes_128_streaming) +// key_id:ab6531ff6e6ea15e387b019e59c2de0a +// key:78a1dc0646119707e903514d8a00735f +const std::string kAttributeListAes128 = + "#EXT-X-KEY:" + "METHOD=AES-128," + "KEYFORMAT=\"com.widevine\"," + "KEYFORMATVERSIONS=\"1\"," + "URI=\"data:text/" + "plain;base64," + "ew0KICAgInByb3ZpZGVyIjoid2lkZXZpbmVfdGVzdCIsDQogICAiY29udGVudF9pZCI6ImFHeH" + "pYMkZsYzE4eE1qaGZjM1J5WldGdGFXNW4iLA0KICAgImtleV9pZHMiOg0KICAgWw0KICAgICAg" + "ImFiNjUzMWZmNmU2ZWExNWUzODdiMDE5ZTU5YzJkZTBhIg0KICAgXQ0KfQ==\"," + "IV=0x9FBE45DD47DA7EBA09A3E24CBA95C9AF"; + +const std::string kAttributeListKeyFormatNonWidevine = + "#EXT-X-KEY:METHOD=SAMPLE-AES,KEYFORMAT=\"com.example\",KEYFORMATVERSIONS=" + "\"1\",URI=\"data:text/" + "plain;base64," + "eyAKICAgInByb3ZpZGVyIjoiY2FzdCIsCiAgICJjb250ZW50X2lkIjoiU0VKUElGTkJUVkJNUl" + "NBeCIsCiAgICJrZXlfaWRzIjoKICAgWwogICAgICAiZDhlMzQ0ODM1ZTM1NzA3MjUzZDU3MWYz" + "NjE0ZTdmMmYiCiAgIF0KfQ==\",IV=0x9FBE45DD47DA7EBA09A3E24CBA95C9AF"; + +const std::string kAttributeListKeyFormatVersionUnregonized = + "#EXT-X-KEY:METHOD=SAMPLE-AES,KEYFORMAT=\"com.widevine\",KEYFORMATVERSIONS=" + "\"2\",URI=\"data:text/" + "plain;base64," + "eyAKICAgInByb3ZpZGVyIjoiY2FzdCIsCiAgICJjb250ZW50X2lkIjoiU0VKUElGTkJUVkJNUl" + "NBeCIsCiAgICJrZXlfaWRzIjoKICAgWwogICAgICAiZDhlMzQ0ODM1ZTM1NzA3MjUzZDU3MWYz" + "NjE0ZTdmMmYiCiAgIF0KfQ==\",IV=0x9FBE45DD47DA7EBA09A3E24CBA95C9AF"; + +const std::string kAttributeListUnspecifiedIv = + "#EXT-X-KEY:" + "METHOD=SAMPLE-AES," + "KEYFORMAT=\"com.widevine\"," + "KEYFORMATVERSIONS=\"1\"," + "URI=\"data:text/plain;base64,ew0KICAgInByb3ZpZGVyIjoid2lkZXZpbmVfdGVzdCIsD" + "QogICAiY29udGVudF9pZCI6ImFHeHpYM05oYlhCc1pWOWhaWE5mYzNSeVpXRnRhVzVuIiwNCiA" + "gICJrZXlfaWRzIjoNCiAgIFsNCiAgICAgICI3OGExZGMwNjQ2MTE5NzA3ZTkwMzUxNGQ4YTAwN" + "zM1ZiINCiAgIF0NCn0=\","; + +const std::string kAttributeListUnspecifiedMethod = + "#EXT-X-KEY:" + "KEYFORMAT=\"com.widevine\"," + "KEYFORMATVERSIONS=\"1\"," + "URI=\"data:text/plain;base64,ew0KICAgInByb3ZpZGVyIjoid2lkZXZpbmVfdGVzdCIsD" + "QogICAiY29udGVudF9pZCI6ImFHeHpYM05oYlhCc1pWOWhaWE5mYzNSeVpXRnRhVzVuIiwNCiA" + "gICJrZXlfaWRzIjoNCiAgIFsNCiAgICAgICI3OGExZGMwNjQ2MTE5NzA3ZTkwMzUxNGQ4YTAwN" + "zM1ZiINCiAgIF0NCn0=\"," + "IV=0x9FBE45DD47DA7EBA09A3E24CBA95C9AF"; + +struct HlsSegmentInfo { + bool start_segment; + std::string iv; + std::string clear_data; + std::string encrypted_data; +}; + +HlsSegmentInfo kAes128PartialSegmentInfo[] = { + { + true, wvcdm::a2bs_hex("9FBE45DD47DA7EBA09A3E24CBA95C9AF"), + wvcdm::a2bs_hex( + "AD868A6AC55C10D564FC23B8ACFF407DAAF4ED2743520E02CDA9680D9EA88E9148" + "84604C8DA8A53CE33DB9FF8F1C5BB6BB97F37B39906BF41596555C1BCCE9ED0293" + "59C4CF5906B6AB5BF60FBB3F1A1C7C59ACFC7E4FB4AD8E623C04D503A3DDAD868A" + "6AC55C10D564FC23B8ACFF407DAAF4ED2743520E02CDA9680D9EA88E918DF21FDC" + "42F166880D97A2225CD5C9EA5E7B752F4CF81BBDBE98E542EE10E1C6595D259A1E" + "4A8B6D7744CD98C5D3F921ADC252EB7D8AF6B916044B676A574747942AC20A89FF" + "79F4C2F25FBA99D6A44618A8C0420B27D54E3DA17B77C9D43CCA217CE9BDE99BD9" + "1E9733A1A00B9B557AC3A433DC92633546156817FAE26B6E1C"), + wvcdm::a2bs_hex( + "E7C566D86E98C36D2DCA54A966E7B469B6094B9201F200932F8EB5E1A94FB0B977" + "FAB8DFDAD57C677E279615F4EAFA872CA8EFF83179E4DE2AB78E6B41A860C42203" + "4B875AC282406E03AC01F2E407A55DE38C6C35707F34B3319646FA016A01CE9056" + "E55D28C48ED72F10FA6625656ED62B758CBADA757DDC52533C9CBD54FC1A46F827" + "CC7B69BA66AE19A15D725FCBB972B23C83F95C0F00F481A7C9AC8687B3A4AD15AD" + "A2ABBB84D8E3CBEC3E8771720A35234070799173B37219127141922CBA8CB2DC48" + "EC2477832D1AE477942DCDA93C0886AF72D71E56DA3D7737E49670B024639A195B" + "7377C7F45A797C6E5DBB1BB2843DA3FC76043E33687BEF3172"), + }, + { + false, wvcdm::a2bs_hex("BB1BB2843DA3FC76043E33687BEF3172"), + wvcdm::a2bs_hex( + "64ab17b3e3dfab47245c7cce4543d4fc7a26dcf248f19f9b59f3c92601440b3617" + "c8ed0c96c656549e461f38708cd47a434066f8df28ccc28b79252eee3f9c2d7f6c" + "68ebe40141fe818fe082ca523c03d69ddaf183a93c022327fedc5582c5abca9d34" + "2b71263a67f9cb2336f12108aaaef464f17177e44e9b0c4e56e61da53c2150b440" + "5cc82d994dfd9bf4087c761956d6688a9705db4cf350381085f383c49666d4aed1" + "35c519c1f0b5cba06e287feea96ea367bf54e7368dcf998276c6e46497e0c50e20" + "fef74e42cb518fe7f22ef27202428688f86404e8278587017012c1d65537c6cbd7" + "dde04aae338d68115a9f430afc100ab83cdadf45dca39db685"), + wvcdm::a2bs_hex( + "5E61E95F918560A046682BB03CF3DBAB6E052150AEB3D46F458CF7480BF8F875E2" + "833367415656E4BA2B01421A0B18C18F802657573BF0B239173114AFE992BCD852" + "955301FAE562FC6BCC3AC89A4CA58BEC1BCCD07C89165DF77F29F42AE052858BA3" + "AC59A82652E6B432CB4993C707755C32EEF137111160A086CFC4FB15E5F76B1DAF" + "2E8217C51BDB4DE0B987288A68F88824DBD7BF4D2978147A4AE4DA019AAA2A59E9" + "94C294768D86FDADED52931E7ACEBC915C8124785E4BE9CE89BFFA631C3F5E67C4" + "EE5BA77A83B6E582DF2C1907FA572B61D656DCF9B8DEAE4B81508378732F952152" + "CF7DCAB0A3CA3EE8E5F72D24E96647EBBAAA2394BD6EC458EF"), + }, +}; + +HlsSegmentInfo kAes128MultiSegmentInfo[] = { + { + true, wvcdm::a2bs_hex("9FBE45DD47DA7EBA09A3E24CBA95C9AF"), + wvcdm::a2bs_hex( + "AD868A6AC55C10D564FC23B8ACFF407DAAF4ED2743520E02CDA9680D9EA88E9148" + "84604C8DA8A53CE33DB9FF8F1C5BB6BB97F37B39906BF41596555C1BCCE9ED0293" + "59C4CF5906B6AB5BF60FBB3F1A1C7C59ACFC7E4FB4AD8E623C04D503A3DDAD868A" + "6AC55C10D564FC23B8ACFF407DAAF4ED2743520E02CDA9680D9EA88E918DF21FDC" + "42F166880D97A2225CD5C9EA5E7B752F4CF81BBDBE98E542EE10E1C6595D259A1E" + "4A8B6D7744CD98C5D3F921ADC252EB7D8AF6B916044B676A574747942AC20A89FF" + "79F4C2F25FBA99D6A44618A8C0420B27D54E3DA17B77C9D43CCA217CE9BDE99BD9" + "1E9733A1A00B9B557AC3A433DC92633546156817FAE26B6E1C"), + wvcdm::a2bs_hex( + "E7C566D86E98C36D2DCA54A966E7B469B6094B9201F200932F8EB5E1A94FB0B977" + "FAB8DFDAD57C677E279615F4EAFA872CA8EFF83179E4DE2AB78E6B41A860C42203" + "4B875AC282406E03AC01F2E407A55DE38C6C35707F34B3319646FA016A01CE9056" + "E55D28C48ED72F10FA6625656ED62B758CBADA757DDC52533C9CBD54FC1A46F827" + "CC7B69BA66AE19A15D725FCBB972B23C83F95C0F00F481A7C9AC8687B3A4AD15AD" + "A2ABBB84D8E3CBEC3E8771720A35234070799173B37219127141922CBA8CB2DC48" + "EC2477832D1AE477942DCDA93C0886AF72D71E56DA3D7737E49670B024639A195B" + "7377C7F45A797C6E5DBB1BB2843DA3FC76043E33687BEF3172"), + }, + { + true, wvcdm::a2bs_hex("9FBE45DD47DA7EBA09A3E24CBA95C9AF"), + wvcdm::a2bs_hex( + "64AB17B3E3DFAB47245C7CCE4543D4FC7A26DCF248F19F9B59F3C92601440B3617" + "C8ED0C96C656549E461F38708CD47A434066F8DF28CCC28B79252EEE3F9C2D7F6C" + "68EBE40141FE818FE082CA523C03D69DDAF183A93C022327FEDC5582C5ABCA9D34" + "2B71263A67F9CB2336F12108AAAEF464F17177E44E9B0C4E56E61DA53C2150B440" + "5CC82D994DFD9BF4087C761956D6688A9705DB4CF350381085F383C49666D4AED1" + "35C519C1F0B5CBA06E287FEEA96EA367BF54E7368DCF998276C6E46497E0C50E20" + "FEF74E42CB518FE7F22EF27202428688F86404E8278587017012C1D65537C6CBD7" + "DDE04AAE338D68115A9F430AFC100AB83CDADF45DCA39DB685"), + wvcdm::a2bs_hex( + "BDA1AF662A108B3D34421B001E589A64E378CBE5386C17999F5C9E7079F52F56E3" + "EEC51C75BCD1C44FFE38709218C66B61A1CB8A7274E89F210D2D6C52905FC963DC" + "3F8D79B4EC016642AE3C8AF8D3E322A6EABE4761902D4D79FA3D2D7B827FC5797B" + "D909B5C14325643164915D528557F48A95EB3FD2437A7D553197559822AADE0A6A" + "A617729FCC58AAF581E78F7C332ED85F3470707E29AFF7BD9D8E785798311CA74C" + "C9FB1226EDF74A803B171A891DD56393FB1322D47988E1055095C5F35CF83DB5A3" + "940D329B51DDC89EC463712E9B32AEA8877AFE8C5BED67AE700FFC4CCEFFBC4021" + "0E7ECA01DFF357ADF4D73A80D2B0C46867B33A5605DFDBD06E"), + }, +}; + +HlsSegmentInfo kSampleAes10ByteSegmentInfo[] = { + { + true, wvcdm::a2bs_hex("9FBE45DD47DA7EBA09A3E24CBA95C9AF"), + wvcdm::a2bs_hex("4884604C8DA8A53CE33D"), + wvcdm::a2bs_hex("4884604C8DA8A53CE33D"), + }, +}; + +HlsSegmentInfo kSampleAes16ByteSegmentInfo[] = { + { + true, wvcdm::a2bs_hex("9FBE45DD47DA7EBA09A3E24CBA95C9AF"), + wvcdm::a2bs_hex("4884604C8DA8A53CE33DB9FF8F1C5BB6"), + wvcdm::a2bs_hex("8E6B884AB604495C675CA38F0425E23E"), + }, +}; + +HlsSegmentInfo kSampleAes18ByteSegmentInfo[] = { + { + true, wvcdm::a2bs_hex("9FBE45DD47DA7EBA09A3E24CBA95C9AF"), + wvcdm::a2bs_hex("4884604C8DA8A53CE33DB9FF8F1C5BB6BB97"), + wvcdm::a2bs_hex("8E6B884AB604495C675CA38F0425E23EBB97"), + }, +}; + +HlsSegmentInfo kSampleAes160ByteSegmentInfo[] = { + { + true, wvcdm::a2bs_hex("9FBE45DD47DA7EBA09A3E24CBA95C9AF"), + wvcdm::a2bs_hex("4884604C8DA8A53CE33DB9FF8F1C5BB6BB97F37B39906BF4159655" + "5C1BCCE9ED029359C4CF5906B6AB5BF60FBB3F1A1C7C59ACFC7E4F" + "B4AD8E623C04D503A3DDAD868A6AC55C10D564FC23B8ACFF407DAA" + "F4ED2743520E02CDA9680D9EA88E918DF21FDC42F166880D97A222" + "5CD5C9EA5E7B752F4CF81BBDBE98E542EE10E1C6595D259A1E4A8B" + "6D7744CD98C5D3F921ADC252EB7D8AF6B916044B676A574747"), + wvcdm::a2bs_hex("8E6B884AB604495C675CA38F0425E23EBB97F37B39906BF4159655" + "5C1BCCE9ED029359C4CF5906B6AB5BF60FBB3F1A1C7C59ACFC7E4F" + "B4AD8E623C04D503A3DDAD868A6AC55C10D564FC23B8ACFF407DAA" + "F4ED2743520E02CDA9680D9EA88E918DF21FDC42F166880D97A222" + "5CD5C9EA5E7B752F4CF81BBDBE98E542EE10E1C6595D259A1E4A8B" + "6D7744CD98C5D3F921ADC252EB7D8AF6B916044B676A574747"), + }, +}; + +HlsSegmentInfo kSampleAes175ByteSegmentInfo[] = { + { + true, wvcdm::a2bs_hex("9FBE45DD47DA7EBA09A3E24CBA95C9AF"), + wvcdm::a2bs_hex( + "4884604C8DA8A53CE33DB9FF8F1C5BB6BB97F37B39906BF41596555C1BCC" + "E9ED029359C4CF5906B6AB5BF60FBB3F1A1C7C59ACFC7E4FB4AD8E623C04" + "D503A3DDAD868A6AC55C10D564FC23B8ACFF407DAAF4ED2743520E02CDA9" + "680D9EA88E918DF21FDC42F166880D97A2225CD5C9EA5E7B752F4CF81BBD" + "BE98E542EE10E1C6595D259A1E4A8B6D7744CD98C5D3F921ADC252EB7D8A" + "F6B916044B676A574747942AC20A89FF79F4C2F25FBA99D6A4"), + wvcdm::a2bs_hex("8E6B884AB604495C675CA38F0425E23EBB97F37B39906BF4159655" + "5C1BCCE9ED029359C4CF5906B6AB5BF60FBB3F1A1C7C59ACFC7E4F" + "B4AD8E623C04D503A3DDAD868A6AC55C10D564FC23B8ACFF407DAA" + "F4ED2743520E02CDA9680D9EA88E918DF21FDC42F166880D97A222" + "5CD5C9EA5E7B752F4CF81BBDBE98E542EE10E1C6595D259A1E4A8B" + "6D7744CD98C5D3F921ADC252EB7D8AF6B916044B676A574747942A" + "C20A89FF79F4C2F25FBA99D6A4"), + }, +}; + +HlsSegmentInfo kSampleAes176ByteSegmentInfo[] = { + { + true, wvcdm::a2bs_hex("9FBE45DD47DA7EBA09A3E24CBA95C9AF"), + wvcdm::a2bs_hex( + "4884604C8DA8A53CE33DB9FF8F1C5BB6BB97F37B39906BF41596555C1BCC" + "E9ED029359C4CF5906B6AB5BF60FBB3F1A1C7C59ACFC7E4FB4AD8E623C04" + "D503A3DDAD868A6AC55C10D564FC23B8ACFF407DAAF4ED2743520E02CDA9" + "680D9EA88E918DF21FDC42F166880D97A2225CD5C9EA5E7B752F4CF81BBD" + "BE98E542EE10E1C6595D259A1E4A8B6D7744CD98C5D3F921ADC252EB7D8A" + "F6B916044B676A574747942AC20A89FF79F4C2F25FBA99D6A446"), + wvcdm::a2bs_hex("8E6B884AB604495C675CA38F0425E23EBB97F37B39906BF4159655" + "5C1BCCE9ED029359C4CF5906B6AB5BF60FBB3F1A1C7C59ACFC7E4F" + "B4AD8E623C04D503A3DDAD868A6AC55C10D564FC23B8ACFF407DAA" + "F4ED2743520E02CDA9680D9EA88E918DF21FDC42F166880D97A222" + "5CD5C9EA5E7B752F4CF81BBDBE98E542EE10E1C6595D259A1E4A8B" + "6D7744CD98C5D3F921ADC252EB7D8AF6B916044B676A574747FBDC" + "189C42C3C213A71DBCF73A05A1A1"), + }, +}; + +HlsSegmentInfo kSampleAes192ByteSegmentInfo[] = { + { + true, wvcdm::a2bs_hex("9FBE45DD47DA7EBA09A3E24CBA95C9AF"), + wvcdm::a2bs_hex( + "4884604C8DA8A53CE33DB9FF8F1C5BB6BB97F37B39906BF41596555C1BCCE9ED02" + "9359C4CF5906B6AB5BF60FBB3F1A1C7C59ACFC7E4FB4AD8E623C04D503A3DDAD86" + "8A6AC55C10D564FC23B8ACFF407DAAF4ED2743520E02CDA9680D9EA88E918DF21F" + "DC42F166880D97A2225CD5C9EA5E7B752F4CF81BBDBE98E542EE10E1C6595D259A" + "1E4A8B6D7744CD98C5D3F921ADC252EB7D8AF6B916044B676A574747942AC20A89" + "FF79F4C2F25FBA99D6A44618A8C0420B27D54E3DA17B77C9D43CCA"), + wvcdm::a2bs_hex( + "8E6B884AB604495C675CA38F0425E23EBB97F37B39906BF41596555C1BCCE9ED02" + "9359C4CF5906B6AB5BF60FBB3F1A1C7C59ACFC7E4FB4AD8E623C04D503A3DDAD86" + "8A6AC55C10D564FC23B8ACFF407DAAF4ED2743520E02CDA9680D9EA88E918DF21F" + "DC42F166880D97A2225CD5C9EA5E7B752F4CF81BBDBE98E542EE10E1C6595D259A" + "1E4A8B6D7744CD98C5D3F921ADC252EB7D8AF6B916044B676A574747FBDC189C42" + "C3C213A71DBCF73A05A1A118A8C0420B27D54E3DA17B77C9D43CCA"), + }, +}; + +HlsSegmentInfo kSampleAes338ByteSegmentInfo[] = { + { + true, wvcdm::a2bs_hex("9FBE45DD47DA7EBA09A3E24CBA95C9AF"), + wvcdm::a2bs_hex( + "4884604C8DA8A53CE33DB9FF8F1C5BB6BB97F37B39906BF41596555C1BCCE9ED02" + "9359C4CF5906B6AB5BF60FBB3F1A1C7C59ACFC7E4FB4AD8E623C04D503A3DDAD86" + "8A6AC55C10D564FC23B8ACFF407DAAF4ED2743520E02CDA9680D9EA88E918DF21F" + "DC42F166880D97A2225CD5C9EA5E7B752F4CF81BBDBE98E542EE10E1C6595D259A" + "1E4A8B6D7744CD98C5D3F921ADC252EB7D8AF6B916044B676A574747942AC20A89" + "FF79F4C2F25FBA99D6A44618A8C0420B27D54E3DA17B77C9D43CCA217CE9BDE99B" + "D91E9733A1A00B9B557AC3A433DC92633546156817FAE26B6E1C942AC20A89FF79" + "F4C2F25FBA99D6A44618A8C0420B27D54E3DA17B77C9D43CCAE7C566D86E98C36D" + "2DCA54A966E7B469B6094B9201F200932F8EB5E1A94FB0B977FAB8DFDAD57C677E" + "279615F4EAFA872CA8EFF83179E4DE2AB78E6B41A860C422034B875AC282406E03" + "AC01F2E407A55DE3"), + wvcdm::a2bs_hex( + "8E6B884AB604495C675CA38F0425E23EBB97F37B39906BF41596555C1BCCE9ED02" + "9359C4CF5906B6AB5BF60FBB3F1A1C7C59ACFC7E4FB4AD8E623C04D503A3DDAD86" + "8A6AC55C10D564FC23B8ACFF407DAAF4ED2743520E02CDA9680D9EA88E918DF21F" + "DC42F166880D97A2225CD5C9EA5E7B752F4CF81BBDBE98E542EE10E1C6595D259A" + "1E4A8B6D7744CD98C5D3F921ADC252EB7D8AF6B916044B676A574747FBDC189C42" + "C3C213A71DBCF73A05A1A118A8C0420B27D54E3DA17B77C9D43CCA217CE9BDE99B" + "D91E9733A1A00B9B557AC3A433DC92633546156817FAE26B6E1C942AC20A89FF79" + "F4C2F25FBA99D6A44618A8C0420B27D54E3DA17B77C9D43CCAE7C566D86E98C36D" + "2DCA54A966E7B469B6094B9201F200932F8EB5E1A94FB0B977FAB8DFDAD57C677E" + "279615F4EAFA872CA8EFF83179E4DE2AB78E6B41A860C44A27BD03EAB2D3CFCB2C" + "F4F5AA93E7025DE3"), + }, +}; + +struct HlsDecryptionInfo { + bool sample_aes; + size_t number_of_segments; + HlsSegmentInfo* segment_info; + const std::string& attribute_list; +}; + +HlsDecryptionInfo kHlsDecryptionTestVectors[] = { + {false, 1, &kAes128PartialSegmentInfo[0], kAttributeListAes128}, + {false, 2, &kAes128PartialSegmentInfo[0], kAttributeListAes128}, + {false, 2, &kAes128MultiSegmentInfo[0], kAttributeListAes128}, + {true, 1, &kSampleAes10ByteSegmentInfo[0], kAttributeListSampleAes}, + {true, 1, &kSampleAes16ByteSegmentInfo[0], kAttributeListSampleAes}, + {true, 1, &kSampleAes18ByteSegmentInfo[0], kAttributeListSampleAes}, + {true, 1, &kSampleAes160ByteSegmentInfo[0], kAttributeListSampleAes}, + {true, 1, &kSampleAes175ByteSegmentInfo[0], kAttributeListSampleAes}, + {true, 1, &kSampleAes176ByteSegmentInfo[0], kAttributeListSampleAes}, + {true, 1, &kSampleAes192ByteSegmentInfo[0], kAttributeListSampleAes}, + {true, 1, &kSampleAes338ByteSegmentInfo[0], kAttributeListSampleAes}, +}; } // namespace namespace wvcdm { @@ -503,6 +820,24 @@ class TestWvCdmEventListener : public WvCdmEventListener { int64_t new_expiry_time_seconds)); }; +class TestWvCdmHlsEventListener : public WvCdmEventListener { + public: + TestWvCdmHlsEventListener() : WvCdmEventListener() {} + virtual void OnSessionRenewalNeeded(const CdmSessionId&) {} + virtual void OnSessionKeysChange(const CdmSessionId&, + const CdmKeyStatusMap& keys_status, + bool) { + key_status_map_ = keys_status; + } + + virtual void OnExpirationUpdate(const CdmSessionId&, + int64_t) {} + + CdmKeyStatusMap GetKeyStatusMap() { return key_status_map_; } + private: + CdmKeyStatusMap key_status_map_; +}; + class WvCdmRequestLicenseTest : public WvCdmTestBase { public: WvCdmRequestLicenseTest() {} @@ -538,12 +873,24 @@ class WvCdmRequestLicenseTest : public WvCdmTestBase { CdmAppParameterMap& app_parameters, CdmLicenseType license_type, CdmClientPropertySet* property_set) { + std::string init_data_type = "video/mp4"; + GenerateKeyRequest(wvcdm::KEY_MESSAGE, init_data_type, init_data, + app_parameters, license_type, property_set); + } + + void GenerateKeyRequest(CdmResponseType expected_response, + const std::string& init_data_type, + const std::string& init_data, + CdmAppParameterMap& app_parameters, + CdmLicenseType license_type, + CdmClientPropertySet* property_set) { CdmKeyRequest key_request; std::string key_set_id; - EXPECT_EQ(wvcdm::KEY_MESSAGE, + EXPECT_EQ(expected_response, decryptor_.GenerateKeyRequest( - session_id_, key_set_id, "video/mp4", init_data, license_type, - app_parameters, property_set, EMPTY_ORIGIN, &key_request)); + session_id_, key_set_id, init_data_type, init_data, + license_type, app_parameters, property_set, EMPTY_ORIGIN, + &key_request)); key_msg_ = key_request.message; EXPECT_EQ(0u, key_request.url.size()); } @@ -2815,6 +3162,91 @@ TEST(VersionNumberTest, VersionNumberChangeCanary) { "this test after changing it?"; } +TEST_F(WvCdmRequestLicenseTest, AddHlsStreamingKeyTest) { + decryptor_.OpenSession(g_key_system, NULL, EMPTY_ORIGIN, NULL, &session_id_); + CdmAppParameterMap app_parameters; + GenerateKeyRequest(wvcdm::KEY_MESSAGE, HLS_INIT_DATA_FORMAT, + kAttributeListSampleAes, app_parameters, + kLicenseTypeStreaming, NULL); + //TODO(rfrias): Remove once we switch to git-on-borg + std::string license_server = "https://proxy.uat.widevine.com/proxy"; + VerifyKeyRequestResponse(license_server, g_client_auth, false); + decryptor_.CloseSession(session_id_); +} + +class WvHlsInitDataTest + : public WvCdmRequestLicenseTest, + public ::testing::WithParamInterface {}; + +TEST_P(WvHlsInitDataTest, InvalidHlsFormatTest) { + decryptor_.OpenSession(g_key_system, NULL, EMPTY_ORIGIN, NULL, &session_id_); + CdmAppParameterMap app_parameters; + std::string init_data = GetParam(); + GenerateKeyRequest(wvcdm::INIT_DATA_NOT_FOUND, HLS_INIT_DATA_FORMAT, + init_data, app_parameters, kLicenseTypeStreaming, NULL); + decryptor_.CloseSession(session_id_); +} + +INSTANTIATE_TEST_CASE_P(Cdm, WvHlsInitDataTest, + ::testing::Values( + kAttributeListKeyFormatNonWidevine, + kAttributeListKeyFormatVersionUnregonized, + kAttributeListUnspecifiedIv, + kAttributeListUnspecifiedMethod)); + +class WvHlsDecryptionTest + : public WvCdmRequestLicenseTest, + public ::testing::WithParamInterface {}; + +TEST_P(WvHlsDecryptionTest, HlsDecryptionTest) { + Provision(kLevel3); + TestWvCdmClientPropertySet client_property_set; + client_property_set.set_security_level(QUERY_VALUE_SECURITY_LEVEL_L3); + HlsDecryptionInfo* info = GetParam(); + + TestWvCdmHlsEventListener listener; + decryptor_.OpenSession(g_key_system, &client_property_set, EMPTY_ORIGIN, + &listener, &session_id_); + CdmAppParameterMap app_parameters; + GenerateKeyRequest(wvcdm::KEY_MESSAGE, HLS_INIT_DATA_FORMAT, + info->attribute_list, app_parameters, + kLicenseTypeStreaming, NULL); + //TODO(rfrias): Remove once we switch to git-on-borg + std::string license_server = "https://proxy.uat.widevine.com/proxy"; + VerifyKeyRequestResponse(license_server, g_client_auth, false); + CdmKeyStatusMap key_status_map = listener.GetKeyStatusMap(); + EXPECT_EQ(1u, key_status_map.size()); + KeyId key_id = key_status_map.begin()->first; + EXPECT_EQ(KEY_ID_SIZE, key_id.size()); + + for (size_t i = 0; i < info->number_of_segments; ++i) { + HlsSegmentInfo* data = info->segment_info + i; + std::vector output_buffer(data->encrypted_data.size(), 0); + std::vector iv(data->iv.begin(), data->iv.end()); + CdmDecryptionParameters decryption_parameters( + &key_id, reinterpret_cast(data->encrypted_data.c_str()), + data->encrypted_data.size(), &iv, 0, &output_buffer[0]); + decryption_parameters.is_encrypted = true; + decryption_parameters.is_secure = false; + decryption_parameters.cipher_mode = kCipherModeCbc; + if (info->sample_aes) { + decryption_parameters.pattern_descriptor.encrypt_blocks = 1; + decryption_parameters.pattern_descriptor.skip_blocks = 9; + } + EXPECT_EQ(NO_ERROR, decryptor_.Decrypt(session_id_, false, + decryption_parameters)); + EXPECT_EQ(data->clear_data, + std::string(reinterpret_cast(&output_buffer[0]), + output_buffer.size())); + } + + decryptor_.CloseSession(session_id_); +} + +INSTANTIATE_TEST_CASE_P(Cdm, WvHlsDecryptionTest, + ::testing::Range(&kHlsDecryptionTestVectors[0], + &kHlsDecryptionTestVectors[11])); + } // namespace wvcdm void show_menu(char* prog_name) {