Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1087)

Side by Side Diff: third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.cpp

Issue 1418113002: RTCPeerConnection.generateCertificate taking AlgorithmIdentifier and using WebCrypto (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase with master Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 26 matching lines...) Expand all
37 #include "bindings/core/v8/Nullable.h" 37 #include "bindings/core/v8/Nullable.h"
38 #include "bindings/core/v8/ScriptPromiseResolver.h" 38 #include "bindings/core/v8/ScriptPromiseResolver.h"
39 #include "bindings/modules/v8/V8RTCCertificate.h" 39 #include "bindings/modules/v8/V8RTCCertificate.h"
40 #include "core/dom/Document.h" 40 #include "core/dom/Document.h"
41 #include "core/dom/ExceptionCode.h" 41 #include "core/dom/ExceptionCode.h"
42 #include "core/dom/ExecutionContext.h" 42 #include "core/dom/ExecutionContext.h"
43 #include "core/frame/LocalFrame.h" 43 #include "core/frame/LocalFrame.h"
44 #include "core/html/VoidCallback.h" 44 #include "core/html/VoidCallback.h"
45 #include "core/loader/FrameLoader.h" 45 #include "core/loader/FrameLoader.h"
46 #include "core/loader/FrameLoaderClient.h" 46 #include "core/loader/FrameLoaderClient.h"
47 #include "modules/crypto/CryptoResultImpl.h"
47 #include "modules/mediastream/MediaConstraintsImpl.h" 48 #include "modules/mediastream/MediaConstraintsImpl.h"
48 #include "modules/mediastream/MediaStreamEvent.h" 49 #include "modules/mediastream/MediaStreamEvent.h"
49 #include "modules/mediastream/RTCDTMFSender.h" 50 #include "modules/mediastream/RTCDTMFSender.h"
50 #include "modules/mediastream/RTCDataChannel.h" 51 #include "modules/mediastream/RTCDataChannel.h"
51 #include "modules/mediastream/RTCDataChannelEvent.h" 52 #include "modules/mediastream/RTCDataChannelEvent.h"
52 #include "modules/mediastream/RTCErrorCallback.h" 53 #include "modules/mediastream/RTCErrorCallback.h"
53 #include "modules/mediastream/RTCIceCandidateEvent.h" 54 #include "modules/mediastream/RTCIceCandidateEvent.h"
54 #include "modules/mediastream/RTCSessionDescription.h" 55 #include "modules/mediastream/RTCSessionDescription.h"
55 #include "modules/mediastream/RTCSessionDescriptionCallback.h" 56 #include "modules/mediastream/RTCSessionDescriptionCallback.h"
56 #include "modules/mediastream/RTCSessionDescriptionRequestImpl.h" 57 #include "modules/mediastream/RTCSessionDescriptionRequestImpl.h"
57 #include "modules/mediastream/RTCStatsCallback.h" 58 #include "modules/mediastream/RTCStatsCallback.h"
58 #include "modules/mediastream/RTCStatsRequestImpl.h" 59 #include "modules/mediastream/RTCStatsRequestImpl.h"
59 #include "modules/mediastream/RTCVoidRequestImpl.h" 60 #include "modules/mediastream/RTCVoidRequestImpl.h"
60 #include "platform/mediastream/RTCConfiguration.h" 61 #include "platform/mediastream/RTCConfiguration.h"
61 #include "platform/mediastream/RTCOfferOptions.h" 62 #include "platform/mediastream/RTCOfferOptions.h"
62 #include "public/platform/Platform.h" 63 #include "public/platform/Platform.h"
64 #include "public/platform/WebCryptoAlgorithmParams.h"
65 #include "public/platform/WebCryptoUtil.h"
63 #include "public/platform/WebMediaStream.h" 66 #include "public/platform/WebMediaStream.h"
64 #include "public/platform/WebRTCCertificate.h" 67 #include "public/platform/WebRTCCertificate.h"
65 #include "public/platform/WebRTCCertificateGenerator.h" 68 #include "public/platform/WebRTCCertificateGenerator.h"
66 #include "public/platform/WebRTCConfiguration.h" 69 #include "public/platform/WebRTCConfiguration.h"
67 #include "public/platform/WebRTCDataChannelHandler.h" 70 #include "public/platform/WebRTCDataChannelHandler.h"
68 #include "public/platform/WebRTCDataChannelInit.h" 71 #include "public/platform/WebRTCDataChannelInit.h"
69 #include "public/platform/WebRTCICECandidate.h" 72 #include "public/platform/WebRTCICECandidate.h"
70 #include "public/platform/WebRTCKeyParams.h" 73 #include "public/platform/WebRTCKeyParams.h"
71 #include "public/platform/WebRTCOfferOptions.h" 74 #include "public/platform/WebRTCOfferOptions.h"
72 #include "public/platform/WebRTCSessionDescription.h" 75 #include "public/platform/WebRTCSessionDescription.h"
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 457
455 WebMediaConstraints constraints = MediaConstraintsImpl::create(mediaConstrai nts, exceptionState); 458 WebMediaConstraints constraints = MediaConstraintsImpl::create(mediaConstrai nts, exceptionState);
456 if (exceptionState.hadException()) 459 if (exceptionState.hadException())
457 return; 460 return;
458 461
459 bool valid = m_peerHandler->updateICE(configuration, constraints); 462 bool valid = m_peerHandler->updateICE(configuration, constraints);
460 if (!valid) 463 if (!valid)
461 exceptionState.throwDOMException(SyntaxError, "Could not update the ICE Agent with the given configuration."); 464 exceptionState.throwDOMException(SyntaxError, "Could not update the ICE Agent with the given configuration.");
462 } 465 }
463 466
464 ScriptPromise RTCPeerConnection::generateCertificate(ScriptState* scriptState, c onst Dictionary& keygenAlgorithm, ExceptionState& exceptionState) 467 ScriptPromise RTCPeerConnection::generateCertificate(ScriptState* scriptState, c onst AlgorithmIdentifier& keygenAlgorithm, ExceptionState& exceptionState)
465 { 468 {
466 // Validate and interpret input |keygenAlgorithm|. 469 // Normalize |keygenAlgorithm| with WebCrypto, making sure it is a recognize d AlgorithmIdentifier.
467 // TODO(hbos): Use WebCrypto normalization process to validate and interpret |keygenAlgorithm|. 470 WebCryptoAlgorithm cryptoAlgorithm;
468 // This may create a dependency between the Blink and WebCrypto modules? crb ug.com/544917 471 AlgorithmError error;
472 if (!normalizeAlgorithm(keygenAlgorithm, WebCryptoOperationGenerateKey, cryp toAlgorithm, &error)) {
473 // Reject generateCertificate with the same error as was produced by Web Crypto.
474 // |result| is garbage collected, no need to delete.
475 CryptoResultImpl* result = CryptoResultImpl::create(scriptState);
476 ScriptPromise promise = result->promise();
477 result->completeWithError(error.errorType, error.errorDetails);
478 return promise;
479 }
480
481 // Convert from WebCrypto representation to recognized WebRTCKeyParams. WebR TC supports a small subset of what are valid AlgorithmIdentifiers.
482 const char* unsupportedParamsString = "The 1st argument provided is an Algor ithmIdentifier with a supported algorithm name, but the parameters are not suppo rted.";
469 Nullable<WebRTCKeyParams> keyParams; 483 Nullable<WebRTCKeyParams> keyParams;
470 String name; 484 switch (cryptoAlgorithm.id()) {
471 if (DictionaryHelper::get(keygenAlgorithm, "name", name)) { 485 case WebCryptoAlgorithmIdRsaSsaPkcs1v1_5:
472 if (name == "RSASSA-PKCS1-v1_5") { 486 // name: "RSASSA-PKCS1-v1_5"
473 // RSA - Supported |keygenAlgorithm|: 487 unsigned publicExponent;
474 // { name: "RSASSA-PKCS1-v1_5", modulusLength: <int>, publicExponent : 65537 } 488 // "publicExponent" must fit in an unsigned int. The only recognized "ha sh" is "SHA-256".
475 int modulusLength = -1; 489 if (bigIntegerToUint(cryptoAlgorithm.rsaHashedKeyGenParams()->publicExpo nent(), publicExponent)
476 int publicExponent = -1; 490 && cryptoAlgorithm.rsaHashedKeyGenParams()->hash().id() == WebCrypto AlgorithmIdSha256) {
477 if (DictionaryHelper::get(keygenAlgorithm, "modulusLength", modulusL ength) 491 unsigned modulusLength = cryptoAlgorithm.rsaHashedKeyGenParams()->mo dulusLengthBits();
478 && modulusLength >= 0 492 keyParams.set(blink::WebRTCKeyParams::createRSA(modulusLength, publi cExponent));
479 && DictionaryHelper::get(keygenAlgorithm, "publicExponent", publ icExponent) 493 } else {
480 && publicExponent >= 0) { 494 return ScriptPromise::rejectWithDOMException(scriptState, DOMExcepti on::create(NotSupportedError, unsupportedParamsString));
481 keyParams.set(blink::WebRTCKeyParams::createRSA(modulusLength, p ublicExponent));
482 }
483 } else if (name == "ECDSA") {
484 // ECDSA - Supported |keygenAlgorithm|:
485 // { name: "ECDSA", namedCurve: "P-256" }
486 String namedCurve;
487 DictionaryHelper::get(keygenAlgorithm, "namedCurve", namedCurve);
488 if (namedCurve == "P-256") {
489 keyParams.set(blink::WebRTCKeyParams::createECDSA(WebRTCECCurveN istP256));
490 }
491 } 495 }
496 break;
497 case WebCryptoAlgorithmIdEcdsa:
498 // name: "ECDSA"
499 // The only recognized "namedCurve" is "P-256".
500 if (cryptoAlgorithm.ecKeyGenParams()->namedCurve() == WebCryptoNamedCurv eP256) {
501 keyParams.set(blink::WebRTCKeyParams::createECDSA(blink::WebRTCECCur veNistP256));
502 } else {
503 return ScriptPromise::rejectWithDOMException(scriptState, DOMExcepti on::create(NotSupportedError, unsupportedParamsString));
504 }
505 break;
506 default:
507 return ScriptPromise::rejectWithDOMException(scriptState, DOMException:: create(NotSupportedError, "The 1st argument provided is an AlgorithmIdentifier, but the algorithm is not supported."));
508 break;
492 } 509 }
493 if (keyParams.isNull()) { 510 ASSERT(!keyParams.isNull());
494 // Invalid argument.
495 return ScriptPromise::rejectWithDOMException(
496 scriptState, DOMException::create(InvalidAccessError, ExceptionMessa ges::argumentNullOrIncorrectType(1, "AlgorithmIdentifier")));
497 }
498 511
499 OwnPtr<WebRTCCertificateGenerator> certificateGenerator = adoptPtr( 512 OwnPtr<WebRTCCertificateGenerator> certificateGenerator = adoptPtr(
500 Platform::current()->createRTCCertificateGenerator()); 513 Platform::current()->createRTCCertificateGenerator());
501 514
502 // Check validity of |keyParams|. 515 // |keyParams| was successfully constructed, but does the certificate genera tor support these parameters?
503 if (!certificateGenerator->isValidKeyParams(keyParams.get())) { 516 if (!certificateGenerator->isSupportedKeyParams(keyParams.get())) {
504 return ScriptPromise::rejectWithDOMException( 517 return ScriptPromise::rejectWithDOMException(scriptState, DOMException:: create(NotSupportedError, unsupportedParamsString));
505 scriptState, DOMException::create(NotSupportedError, "The 1st argume nt provided is an AlgorithmIdentifier, but it has unsupported parameter values." ));
506 } 518 }
507 519
508 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; 520 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
509 ScriptPromise promise = resolver->promise(); 521 ScriptPromise promise = resolver->promise();
510 522
511 WebRTCCertificateObserver* certificateObserver = WebRTCCertificateObserver:: create(resolver); 523 WebRTCCertificateObserver* certificateObserver = WebRTCCertificateObserver:: create(resolver);
512 524
513 // Generate certificate. The |certificateObserver| will resolve the promise asynchronously upon completion. 525 // Generate certificate. The |certificateObserver| will resolve the promise asynchronously upon completion.
514 // The observer will manage its own destruction as well as the resolver's de struction. 526 // The observer will manage its own destruction as well as the resolver's de struction.
515 certificateGenerator->generateCertificate( 527 certificateGenerator->generateCertificate(
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after
957 { 969 {
958 visitor->trace(m_localStreams); 970 visitor->trace(m_localStreams);
959 visitor->trace(m_remoteStreams); 971 visitor->trace(m_remoteStreams);
960 visitor->trace(m_dataChannels); 972 visitor->trace(m_dataChannels);
961 visitor->trace(m_scheduledEvents); 973 visitor->trace(m_scheduledEvents);
962 RefCountedGarbageCollectedEventTargetWithInlineData<RTCPeerConnection>::trac e(visitor); 974 RefCountedGarbageCollectedEventTargetWithInlineData<RTCPeerConnection>::trac e(visitor);
963 ActiveDOMObject::trace(visitor); 975 ActiveDOMObject::trace(visitor);
964 } 976 }
965 977
966 } // namespace blink 978 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698