OLD | NEW |
---|---|
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 Loading... | |
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" | |
63 #include "public/platform/WebMediaStream.h" | 65 #include "public/platform/WebMediaStream.h" |
64 #include "public/platform/WebRTCCertificate.h" | 66 #include "public/platform/WebRTCCertificate.h" |
65 #include "public/platform/WebRTCCertificateGenerator.h" | 67 #include "public/platform/WebRTCCertificateGenerator.h" |
66 #include "public/platform/WebRTCConfiguration.h" | 68 #include "public/platform/WebRTCConfiguration.h" |
67 #include "public/platform/WebRTCDataChannelHandler.h" | 69 #include "public/platform/WebRTCDataChannelHandler.h" |
68 #include "public/platform/WebRTCDataChannelInit.h" | 70 #include "public/platform/WebRTCDataChannelInit.h" |
69 #include "public/platform/WebRTCICECandidate.h" | 71 #include "public/platform/WebRTCICECandidate.h" |
70 #include "public/platform/WebRTCKeyParams.h" | 72 #include "public/platform/WebRTCKeyParams.h" |
71 #include "public/platform/WebRTCOfferOptions.h" | 73 #include "public/platform/WebRTCOfferOptions.h" |
72 #include "public/platform/WebRTCSessionDescription.h" | 74 #include "public/platform/WebRTCSessionDescription.h" |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
115 | 117 |
116 void onError() override | 118 void onError() override |
117 { | 119 { |
118 m_resolver->reject(); | 120 m_resolver->reject(); |
119 delete this; | 121 delete this; |
120 } | 122 } |
121 | 123 |
122 Persistent<ScriptPromiseResolver> m_resolver; | 124 Persistent<ScriptPromiseResolver> m_resolver; |
123 }; | 125 }; |
124 | 126 |
127 static bool uint8ArrayToUint32(const WebVector<uint8_t>& exponentBytes, uint32_t * out) | |
128 { | |
129 if (exponentBytes.size() > 4) { | |
130 // |exponentBytes| is of minimal typed array length (at most 7 leading z ero bits for non-zero values) so there | |
eroman
2015/10/22 17:38:34
This implementation is not in line with the WebCry
hta - Chromium
2015/10/23 06:55:00
won't it have to be a change (at least a suggested
hbos_chromium
2015/10/23 09:59:05
@eroman: Ah I misinterpreted that piece of WebCryp
eroman
2015/10/23 19:13:03
@hta: Does not require any spec changes, just addi
eroman
2015/10/23 19:15:52
Oh actually, I withdraw the request to do that ref
hbos_chromium
2015/10/26 13:21:32
Done.
| |
131 // is no need to check for leading 0-bytes. Thus exponentBytes.size() > 4 values do not fit in uint32_t. | |
132 return false; | |
133 } | |
134 // Big-endian: exponentBytes[0] is the most significant byte. | |
135 *out = 0; | |
136 for (size_t i = exponentBytes.size(), shift = 0; i-- > 0; shift += 8) | |
137 *out += (exponentBytes[i] << shift); | |
138 return true; | |
139 } | |
140 | |
125 } // namespace | 141 } // namespace |
126 | 142 |
127 RTCConfiguration* RTCPeerConnection::parseConfiguration(const Dictionary& config uration, ExceptionState& exceptionState) | 143 RTCConfiguration* RTCPeerConnection::parseConfiguration(const Dictionary& config uration, ExceptionState& exceptionState) |
128 { | 144 { |
129 if (configuration.isUndefinedOrNull()) | 145 if (configuration.isUndefinedOrNull()) |
130 return 0; | 146 return 0; |
131 | 147 |
132 RTCIceTransports iceTransports = RTCIceTransportsAll; | 148 RTCIceTransports iceTransports = RTCIceTransportsAll; |
133 String iceTransportsString; | 149 String iceTransportsString; |
134 if (DictionaryHelper::get(configuration, "iceTransports", iceTransportsStrin g)) { | 150 if (DictionaryHelper::get(configuration, "iceTransports", iceTransportsStrin g)) { |
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
466 | 482 |
467 WebMediaConstraints constraints = MediaConstraintsImpl::create(mediaConstrai nts, exceptionState); | 483 WebMediaConstraints constraints = MediaConstraintsImpl::create(mediaConstrai nts, exceptionState); |
468 if (exceptionState.hadException()) | 484 if (exceptionState.hadException()) |
469 return; | 485 return; |
470 | 486 |
471 bool valid = m_peerHandler->updateICE(configuration, constraints); | 487 bool valid = m_peerHandler->updateICE(configuration, constraints); |
472 if (!valid) | 488 if (!valid) |
473 exceptionState.throwDOMException(SyntaxError, "Could not update the ICE Agent with the given configuration."); | 489 exceptionState.throwDOMException(SyntaxError, "Could not update the ICE Agent with the given configuration."); |
474 } | 490 } |
475 | 491 |
476 ScriptPromise RTCPeerConnection::generateCertificate(ScriptState* scriptState, c onst Dictionary& keygenAlgorithm, ExceptionState& exceptionState) | 492 ScriptPromise RTCPeerConnection::generateCertificate(ScriptState* scriptState, c onst AlgorithmIdentifier& keygenAlgorithm, ExceptionState& exceptionState) |
477 { | 493 { |
478 // Validate and interpret input |keygenAlgorithm|. | 494 // Normalize |keygenAlgorithm| with WebCrypto, making sure it is a recognize d AlgorithmIdentifier. |
479 // TODO(hbos): Use WebCrypto normalization process to validate and interpret |keygenAlgorithm|. | 495 WebCryptoAlgorithm cryptoAlgorithm; |
480 // This may create a dependency between the Blink and WebCrypto modules? crb ug.com/544917 | 496 AlgorithmError error; |
497 if (!normalizeAlgorithm(keygenAlgorithm, WebCryptoOperationGenerateKey, cryp toAlgorithm, &error)) { | |
498 // Reject generateCertificate with the same error as was produced by Web Crypto. | |
499 // |result| is garbage collected, no need to delete. | |
500 CryptoResultImpl* result = CryptoResultImpl::create(scriptState); | |
501 ScriptPromise promise = result->promise(); | |
502 result->completeWithError(error.errorType, error.errorDetails); | |
503 return promise; | |
504 } | |
505 | |
506 // Convert from WebCrypto representation to recognized WebRTCKeyParams. WebR TC supports a small subset of what are valid AlgorithmIdentifiers. | |
481 Nullable<WebRTCKeyParams> keyParams; | 507 Nullable<WebRTCKeyParams> keyParams; |
482 String name; | 508 switch (cryptoAlgorithm.id()) { |
483 if (DictionaryHelper::get(keygenAlgorithm, "name", name)) { | 509 case WebCryptoAlgorithmIdRsaSsaPkcs1v1_5: |
484 if (name == "RSASSA-PKCS1-v1_5") { | 510 // name: "RSASSA-PKCS1-v1_5" |
485 // RSA - Supported |keygenAlgorithm|: | 511 uint32_t publicExponent; |
486 // { name: "RSASSA-PKCS1-v1_5", modulusLength: <int>, publicExponent : 65537 } | 512 // "publicExponent" must fit in a uint32_t. |
487 int modulusLength = -1; | 513 // The only recognized "hash" is "SHA-256". |
488 int publicExponent = -1; | 514 if (uint8ArrayToUint32(cryptoAlgorithm.rsaHashedKeyGenParams()->publicEx ponent(), &publicExponent) |
eroman
2015/10/22 17:38:34
nit: extract cryptoAlgorithm.rsaHashedKeyGenParams
hbos_chromium
2015/10/23 09:59:05
Acknowledged. With publicExponentToUint32 it's now
| |
489 if (DictionaryHelper::get(keygenAlgorithm, "modulusLength", modulusL ength) | 515 && cryptoAlgorithm.rsaHashedKeyGenParams()->hash().id() == WebCrypto AlgorithmIdSha256) { |
490 && modulusLength >= 0 | 516 unsigned modulusLength = cryptoAlgorithm.rsaHashedKeyGenParams()->mo dulusLengthBits(); |
491 && DictionaryHelper::get(keygenAlgorithm, "publicExponent", publ icExponent) | 517 keyParams.set(blink::WebRTCKeyParams::createRSA(modulusLength, publi cExponent)); |
492 && publicExponent >= 0) { | |
493 keyParams.set(blink::WebRTCKeyParams::createRSA(modulusLength, p ublicExponent)); | |
494 } | |
495 } else if (name == "ECDSA") { | |
496 // ECDSA - Supported |keygenAlgorithm|: | |
497 // { name: "ECDSA", namedCurve: "P-256" } | |
498 String namedCurve; | |
499 DictionaryHelper::get(keygenAlgorithm, "namedCurve", namedCurve); | |
500 if (namedCurve == "P-256") { | |
501 keyParams.set(blink::WebRTCKeyParams::createECDSA(WebRTCECCurveN istP256)); | |
502 } | |
503 } | 518 } |
hta - Chromium
2015/10/23 06:55:00
More readable to reject the promise from the hidde
hbos_chromium
2015/10/23 09:59:05
Done.
| |
504 } | 519 break; |
505 if (keyParams.isNull()) { | 520 case WebCryptoAlgorithmIdEcdsa: |
506 // Invalid argument. | 521 // name: "ECDSA" |
507 return ScriptPromise::rejectWithDOMException( | 522 // The only recognized "namedCurve" is "P-256". |
508 scriptState, DOMException::create(InvalidAccessError, ExceptionMessa ges::argumentNullOrIncorrectType(1, "AlgorithmIdentifier"))); | 523 if (cryptoAlgorithm.ecKeyGenParams()->namedCurve() == WebCryptoNamedCurv eP256) { |
524 keyParams.set(blink::WebRTCKeyParams::createECDSA(blink::WebRTCECCur veNistP256)); | |
525 } | |
526 break; | |
527 default: | |
528 break; | |
hta - Chromium
2015/10/23 06:55:00
More readable to reject straight from here.
hbos_chromium
2015/10/23 09:59:05
Done.
| |
509 } | 529 } |
510 | 530 |
511 OwnPtr<WebRTCCertificateGenerator> certificateGenerator = adoptPtr( | 531 OwnPtr<WebRTCCertificateGenerator> certificateGenerator = adoptPtr( |
512 Platform::current()->createRTCCertificateGenerator()); | 532 Platform::current()->createRTCCertificateGenerator()); |
513 | 533 |
514 // Check validity of |keyParams|. | 534 // If |keyParams| is null the AlgorithmIdentifier is unrecognized by WebRTC, if isValidKeyParams it is recognized but the parameters unsupported or invalid. |
515 if (!certificateGenerator->isValidKeyParams(keyParams.get())) { | 535 if (keyParams.isNull() || !certificateGenerator->isValidKeyParams(keyParams. get())) { |
516 return ScriptPromise::rejectWithDOMException( | 536 return ScriptPromise::rejectWithDOMException( |
517 scriptState, DOMException::create(NotSupportedError, "The 1st argume nt provided is an AlgorithmIdentifier, but it has unsupported parameter values." )); | 537 scriptState, DOMException::create(NotSupportedError, "The 1st argume nt provided is an AlgorithmIdentifier, but the algorithm or parameters specified are not supported.")); |
hta - Chromium
2015/10/23 06:55:00
You can do better (and more readable) by moving th
hbos_chromium
2015/10/23 09:59:05
Done.
| |
518 } | 538 } |
519 | 539 |
520 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | 540 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; |
521 ScriptPromise promise = resolver->promise(); | 541 ScriptPromise promise = resolver->promise(); |
522 | 542 |
523 WebRTCCertificateObserver* certificateObserver = WebRTCCertificateObserver:: create(resolver); | 543 WebRTCCertificateObserver* certificateObserver = WebRTCCertificateObserver:: create(resolver); |
524 | 544 |
525 // Generate certificate. The |certificateObserver| will resolve the promise asynchronously upon completion. | 545 // Generate certificate. The |certificateObserver| will resolve the promise asynchronously upon completion. |
526 // The observer will manage its own destruction as well as the resolver's de struction. | 546 // The observer will manage its own destruction as well as the resolver's de struction as well. |
hta - Chromium
2015/10/23 06:55:00
Grammar nit: Delete the last "as well".
hbos_chromium
2015/10/23 09:59:05
Oops.
| |
527 certificateGenerator->generateCertificate( | 547 certificateGenerator->generateCertificate( |
528 keyParams.get(), | 548 keyParams.get(), |
529 toDocument(scriptState->executionContext())->url(), | 549 toDocument(scriptState->executionContext())->url(), |
530 toDocument(scriptState->executionContext())->firstPartyForCookies(), | 550 toDocument(scriptState->executionContext())->firstPartyForCookies(), |
531 certificateObserver); | 551 certificateObserver); |
532 | 552 |
533 return promise; | 553 return promise; |
534 } | 554 } |
535 | 555 |
536 void RTCPeerConnection::addIceCandidate(RTCIceCandidate* iceCandidate, Exception State& exceptionState) | 556 void RTCPeerConnection::addIceCandidate(RTCIceCandidate* iceCandidate, Exception State& exceptionState) |
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
969 { | 989 { |
970 visitor->trace(m_localStreams); | 990 visitor->trace(m_localStreams); |
971 visitor->trace(m_remoteStreams); | 991 visitor->trace(m_remoteStreams); |
972 visitor->trace(m_dataChannels); | 992 visitor->trace(m_dataChannels); |
973 visitor->trace(m_scheduledEvents); | 993 visitor->trace(m_scheduledEvents); |
974 RefCountedGarbageCollectedEventTargetWithInlineData<RTCPeerConnection>::trac e(visitor); | 994 RefCountedGarbageCollectedEventTargetWithInlineData<RTCPeerConnection>::trac e(visitor); |
975 ActiveDOMObject::trace(visitor); | 995 ActiveDOMObject::trace(visitor); |
976 } | 996 } |
977 | 997 |
978 } // namespace blink | 998 } // namespace blink |
OLD | NEW |