summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhclam@chromium.org <hclam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-08 12:48:52 +0000
committerhclam@chromium.org <hclam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-08 12:48:52 +0000
commit8192fb46e35bda86ad844f10d01798dbc7b9022e (patch)
treeda59800b31c74f8359e8ce15552062b6f30acd9b
parent828547559fa942173d3ce576fa2100447b62dd84 (diff)
downloadchromium_src-8192fb46e35bda86ad844f10d01798dbc7b9022e.zip
chromium_src-8192fb46e35bda86ad844f10d01798dbc7b9022e.tar.gz
chromium_src-8192fb46e35bda86ad844f10d01798dbc7b9022e.tar.bz2
Set AES key and IV mask to CastSender
Adding parameters to Cast Streaming Extensions API to configure AES encryption key and IV mask to CastSender. BUG=315931 Review URL: https://codereview.chromium.org/121543003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@243540 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/common/extensions/api/cast_streaming_rtp_stream.idl8
-rw-r--r--chrome/renderer/extensions/cast_streaming_native_handler.cc37
-rw-r--r--chrome/renderer/media/cast_rtp_stream.cc8
-rw-r--r--chrome/renderer/media/cast_rtp_stream.h9
-rw-r--r--chrome/test/data/extensions/api_test/cast_streaming/basics.js41
5 files changed, 86 insertions, 17 deletions
diff --git a/chrome/common/extensions/api/cast_streaming_rtp_stream.idl b/chrome/common/extensions/api/cast_streaming_rtp_stream.idl
index b79cbf1..51fdd1d 100644
--- a/chrome/common/extensions/api/cast_streaming_rtp_stream.idl
+++ b/chrome/common/extensions/api/cast_streaming_rtp_stream.idl
@@ -21,7 +21,7 @@ namespace cast.streaming.rtpStream {
// Synchronization source identifier.
long? ssrc;
- long? feedback_ssrc;
+ long? feedbackSsrc;
long? clockRate;
@@ -38,6 +38,12 @@ namespace cast.streaming.rtpStream {
// Video height in pixels.
long? height;
+ // 16 bytes AES key encoded in Base64.
+ DOMString? aesKey;
+
+ // 16 bytes AES IV (Initialization vector) mask encoded in Base64.
+ DOMString? aesIvMask;
+
// A list of codec specific params.
CodecSpecificParams[] codecSpecificParams;
};
diff --git a/chrome/renderer/extensions/cast_streaming_native_handler.cc b/chrome/renderer/extensions/cast_streaming_native_handler.cc
index 55d0a69..dcc1ede 100644
--- a/chrome/renderer/extensions/cast_streaming_native_handler.cc
+++ b/chrome/renderer/extensions/cast_streaming_native_handler.cc
@@ -6,6 +6,7 @@
#include <functional>
+#include "base/base64.h"
#include "base/logging.h"
#include "base/message_loop/message_loop.h"
#include "chrome/common/extensions/api/cast_streaming_rtp_stream.h"
@@ -35,6 +36,8 @@ const char kRtpStreamNotFound[] = "The RTP stream cannot be found";
const char kUdpTransportNotFound[] = "The UDP transport cannot be found";
const char kInvalidUdpParams[] = "Invalid UDP params";
const char kInvalidRtpParams[] = "Invalid value for RTP params";
+const char kInvalidAesKey[] = "Invalid value for AES key";
+const char kInvalidAesIvMask[] = "Invalid value for AES IV mask";
const char kUnableToConvertArgs[] = "Unable to convert arguments";
const char kUnableToConvertParams[] = "Unable to convert params";
@@ -52,8 +55,9 @@ void FromCastCodecSpecificParams(const CastCodecSpecificParams& cast_params,
ext_params->value = cast_params.value;
}
-void ToCastRtpPayloadParams(const RtpPayloadParams& ext_params,
- CastRtpPayloadParams* cast_params) {
+bool ToCastRtpPayloadParamsOrThrow(v8::Isolate* isolate,
+ const RtpPayloadParams& ext_params,
+ CastRtpPayloadParams* cast_params) {
cast_params->payload_type = ext_params.payload_type;
cast_params->codec_name = ext_params.codec_name;
cast_params->ssrc = ext_params.ssrc ? *ext_params.ssrc : 0;
@@ -67,12 +71,26 @@ void ToCastRtpPayloadParams(const RtpPayloadParams& ext_params,
cast_params->channels = ext_params.channels ? *ext_params.channels : 0;
cast_params->width = ext_params.width ? *ext_params.width : 0;
cast_params->height = ext_params.height ? *ext_params.height : 0;
+ if (ext_params.aes_key &&
+ !base::Base64Decode(*ext_params.aes_key, &cast_params->aes_key)) {
+ isolate->ThrowException(v8::Exception::Error(
+ v8::String::NewFromUtf8(isolate, kInvalidAesKey)));
+ return false;
+ }
+ if (ext_params.aes_iv_mask &&
+ !base::Base64Decode(*ext_params.aes_iv_mask,
+ &cast_params->aes_iv_mask)) {
+ isolate->ThrowException(v8::Exception::Error(
+ v8::String::NewFromUtf8(isolate, kInvalidAesIvMask)));
+ return false;
+ }
for (size_t i = 0; i < ext_params.codec_specific_params.size(); ++i) {
CastCodecSpecificParams cast_codec_params;
ToCastCodecSpecificParams(*ext_params.codec_specific_params[i],
&cast_codec_params);
cast_params->codec_specific_params.push_back(cast_codec_params);
}
+ return true;
}
void FromCastRtpPayloadParams(const CastRtpPayloadParams& cast_params,
@@ -114,14 +132,21 @@ void FromCastRtpCaps(const CastRtpCaps& cast_caps, RtpCaps* ext_caps) {
}
}
-void ToCastRtpParams(const RtpParams& ext_params, CastRtpParams* cast_params) {
+bool ToCastRtpParamsOrThrow(v8::Isolate* isolate,
+ const RtpParams& ext_params,
+ CastRtpParams* cast_params) {
std::copy(ext_params.rtcp_features.begin(), ext_params.rtcp_features.end(),
cast_params->rtcp_features.begin());
for (size_t i = 0; i < ext_params.payloads.size(); ++i) {
CastRtpPayloadParams cast_payload_params;
- ToCastRtpPayloadParams(*ext_params.payloads[i], &cast_payload_params);
+ if (!ToCastRtpPayloadParamsOrThrow(isolate,
+ *ext_params.payloads[i],
+ &cast_payload_params)) {
+ return false;
+ }
cast_params->payloads.push_back(cast_payload_params);
}
+ return true;
}
} // namespace
@@ -277,7 +302,9 @@ void CastStreamingNativeHandler::StartCastRtpStream(
}
CastRtpCaps cast_params;
- ToCastRtpParams(*params, &cast_params);
+ v8::Isolate* isolate = context()->v8_context()->GetIsolate();
+ if (!ToCastRtpParamsOrThrow(isolate, *params, &cast_params))
+ return;
transport->Start(cast_params);
}
diff --git a/chrome/renderer/media/cast_rtp_stream.cc b/chrome/renderer/media/cast_rtp_stream.cc
index cd1a7ae..3f5f8d3 100644
--- a/chrome/renderer/media/cast_rtp_stream.cc
+++ b/chrome/renderer/media/cast_rtp_stream.cc
@@ -54,14 +54,14 @@ CastRtpPayloadParams DefaultVp8Payload() {
CastRtpCaps DefaultAudioCaps() {
CastRtpCaps caps;
caps.payloads.push_back(DefaultOpusPayload());
- // TODO(hclam): Fill in |rtcp_features| and |fec_mechanisms|.
+ // TODO(hclam): Fill in |rtcp_features|.
return caps;
}
CastRtpCaps DefaultVideoCaps() {
CastRtpCaps caps;
caps.payloads.push_back(DefaultVp8Payload());
- // TODO(hclam): Fill in |rtcp_features| and |fec_mechanisms|.
+ // TODO(hclam): Fill in |rtcp_features|.
return caps;
}
@@ -77,6 +77,8 @@ bool ToAudioSenderConfig(const CastRtpParams& params,
config->frequency = payload_params.clock_rate;
config->channels = payload_params.channels;
config->bitrate = payload_params.max_bitrate;
+ config->aes_key = payload_params.aes_key;
+ config->aes_iv_mask = payload_params.aes_iv_mask;
config->codec = media::cast::kPcm16;
if (payload_params.codec_name == kCodecNameOpus)
config->codec = media::cast::kOpus;
@@ -98,6 +100,8 @@ bool ToVideoSenderConfig(const CastRtpParams& params,
config->height = payload_params.height;
config->min_bitrate = config->start_bitrate = payload_params.min_bitrate;
config->max_bitrate = payload_params.max_bitrate;
+ config->aes_key = payload_params.aes_key;
+ config->aes_iv_mask = payload_params.aes_iv_mask;
if (payload_params.codec_name == kCodecNameVp8)
config->codec = media::cast::kVp8;
else
diff --git a/chrome/renderer/media/cast_rtp_stream.h b/chrome/renderer/media/cast_rtp_stream.h
index 08995c8..00c94fd 100644
--- a/chrome/renderer/media/cast_rtp_stream.h
+++ b/chrome/renderer/media/cast_rtp_stream.h
@@ -56,6 +56,12 @@ struct CastRtpPayloadParams {
// Name of the codec used.
std::string codec_name;
+ // AES encryption key.
+ std::string aes_key;
+
+ // AES encryption IV mask.
+ std::string aes_iv_mask;
+
// List of codec specific parameters.
std::vector<CastCodecSpecificParams> codec_specific_params;
@@ -71,9 +77,6 @@ struct CastRtpCaps {
// Names of supported RTCP features.
std::vector<std::string> rtcp_features;
- // Names of supported FEC (Forward Error Correction) mechanisms.
- std::vector<std::string> fec_mechanisms;
-
CastRtpCaps();
~CastRtpCaps();
};
diff --git a/chrome/test/data/extensions/api_test/cast_streaming/basics.js b/chrome/test/data/extensions/api_test/cast_streaming/basics.js
index 73b04ae..bc8c430 100644
--- a/chrome/test/data/extensions/api_test/cast_streaming/basics.js
+++ b/chrome/test/data/extensions/api_test/cast_streaming/basics.js
@@ -6,22 +6,25 @@ var rtpStream = chrome.cast.streaming.rtpStream;
var tabCapture = chrome.tabCapture;
var udpTransport = chrome.cast.streaming.udpTransport;
var createSession = chrome.cast.streaming.session.create;
+var pass = chrome.test.callbackPass;
chrome.test.runTests([
function rtpStreamStart() {
- tabCapture.capture({audio: true, video: true}, function(stream) {
+ console.log("[TEST] rtpStreamStart");
+ tabCapture.capture({audio: true, video: true},
+ pass(function(stream) {
console.log("Got MediaStream.");
chrome.test.assertTrue(!!stream);
createSession(stream.getAudioTracks()[0],
stream.getVideoTracks()[0],
- function(stream, audioId, videoId, udpId) {
+ pass(function(stream, audioId, videoId, udpId) {
console.log("Starting.");
var audioParams = rtpStream.getCaps(audioId);
var videoParams = rtpStream.getCaps(videoId);
rtpStream.start(audioId, audioParams);
rtpStream.start(videoId, videoParams);
udpTransport.start(udpId, {address: "127.0.0.1", port: 2344});
- window.setTimeout(function() {
+ window.setTimeout(pass(function() {
console.log("Stopping.");
rtpStream.stop(audioId);
rtpStream.stop(videoId);
@@ -32,8 +35,34 @@ chrome.test.runTests([
chrome.test.assertEq(audioParams.payloads[0].codecName, "OPUS");
chrome.test.assertEq(videoParams.payloads[0].codecName, "VP8");
chrome.test.succeed();
- }, 0);
- }.bind(null, stream));
- });
+ }), 0);
+ }.bind(null, stream)));
+ }));
+ },
+ function invalidKey() {
+ console.log("[TEST] invalidKey");
+ tabCapture.capture({audio: true, video: true},
+ pass(function(stream) {
+ chrome.test.assertTrue(!!stream);
+ createSession(stream.getAudioTracks()[0],
+ stream.getVideoTracks()[0],
+ pass(function(stream, audioId, videoId, udpId) {
+ // AES key is invalid and exception is expected.
+ try {
+ var audioParams = rtpStream.getCaps(audioId);
+ var videoParams = rtpStream.getCaps(videoId);
+ audioParams.payloads[0].aesKey = "google";
+ videoParams.payloads[0].aesIvMask = "chrome";
+ rtpStream.start(audioId, audioParams);
+ rtpStream.start(videoId, videoParams);
+ } catch (e) {
+ rtpStream.destroy(audioId);
+ rtpStream.destroy(videoId);
+ udpTransport.destroy(udpId);
+ stream.stop();
+ chrome.test.succeed();
+ }
+ }.bind(null, stream)));
+ }));
},
]);