Chromium Code Reviews| Index: third_party/WebKit/Source/modules/crypto/NormalizeAlgorithm.cpp |
| diff --git a/third_party/WebKit/Source/modules/crypto/NormalizeAlgorithm.cpp b/third_party/WebKit/Source/modules/crypto/NormalizeAlgorithm.cpp |
| index d09a7b0f0f7fc89a2a87814d0a4e568affd4efd1..8cd5f51105d7e6d5baa36ea666e662348c946d36 100644 |
| --- a/third_party/WebKit/Source/modules/crypto/NormalizeAlgorithm.cpp |
| +++ b/third_party/WebKit/Source/modules/crypto/NormalizeAlgorithm.cpp |
| @@ -46,6 +46,10 @@ |
| #include <algorithm> |
| #include <memory> |
| +// FIXME: Change the interface for constructing WebCryptoAlgorithmParams |
|
haraken
2016/07/18 22:41:57
TODO(your name)
eroman
2016/07/18 23:15:25
Done.
|
| +// to allow transferring byte parameters (whereas currently it makes a |
| +// copy). |
| + |
| namespace blink { |
| namespace { |
| @@ -270,11 +274,18 @@ private: |
| Vector<const char*, 10> m_messages; |
| }; |
| +static Vector<uint8_t> copyBytes(const DOMArrayPiece& source) |
| +{ |
| + Vector<uint8_t> result; |
| + result.append(reinterpret_cast<const uint8_t*>(source.data()), source.byteLength()); |
| + return result; |
| +} |
| + |
| // Defined by the WebCrypto spec as: |
| // |
| // typedef (ArrayBuffer or ArrayBufferView) BufferSource; |
| // |
| -bool getOptionalBufferSource(const Dictionary& raw, const char* propertyName, bool& hasProperty, BufferSource& buffer, const ErrorContext& context, AlgorithmError* error) |
| +bool getOptionalBufferSource(const Dictionary& raw, const char* propertyName, bool& hasProperty, Vector<uint8_t>& bytes, const ErrorContext& context, AlgorithmError* error) |
| { |
| hasProperty = false; |
| v8::Local<v8::Value> v8Value; |
| @@ -283,12 +294,12 @@ bool getOptionalBufferSource(const Dictionary& raw, const char* propertyName, bo |
| hasProperty = true; |
| if (v8Value->IsArrayBufferView()) { |
| - buffer.setArrayBufferView(V8ArrayBufferView::toImpl(v8::Local<v8::Object>::Cast(v8Value))); |
| + bytes = copyBytes(V8ArrayBufferView::toImpl(v8::Local<v8::Object>::Cast(v8Value))); |
| return true; |
| } |
| if (v8Value->IsArrayBuffer()) { |
| - buffer.setArrayBuffer(V8ArrayBuffer::toImpl(v8::Local<v8::Object>::Cast(v8Value))); |
| + bytes = copyBytes(V8ArrayBuffer::toImpl(v8::Local<v8::Object>::Cast(v8Value))); |
| return true; |
| } |
| @@ -299,10 +310,10 @@ bool getOptionalBufferSource(const Dictionary& raw, const char* propertyName, bo |
| return true; |
| } |
| -bool getBufferSource(const Dictionary& raw, const char* propertyName, BufferSource& buffer, const ErrorContext& context, AlgorithmError* error) |
| +bool getBufferSource(const Dictionary& raw, const char* propertyName, Vector<uint8_t>& bytes, const ErrorContext& context, AlgorithmError* error) |
| { |
| bool hasProperty; |
| - bool ok = getOptionalBufferSource(raw, propertyName, hasProperty, buffer, context, error); |
| + bool ok = getOptionalBufferSource(raw, propertyName, hasProperty, bytes, context, error); |
| if (!hasProperty) { |
| setTypeError(context.toString(propertyName, "Missing required property"), error); |
| return false; |
| @@ -310,26 +321,28 @@ bool getBufferSource(const Dictionary& raw, const char* propertyName, BufferSour |
| return ok; |
| } |
| -bool getUint8Array(const Dictionary& raw, const char* propertyName, DOMUint8Array*& array, const ErrorContext& context, AlgorithmError* error) |
| +bool getUint8Array(const Dictionary& raw, const char* propertyName, Vector<uint8_t>& bytes, const ErrorContext& context, AlgorithmError* error) |
| { |
| + DOMUint8Array* array = nullptr; |
| if (!DictionaryHelper::get(raw, propertyName, array) || !array) { |
| setTypeError(context.toString(propertyName, "Missing or not a Uint8Array"), error); |
| return false; |
| } |
| + bytes = copyBytes(array); |
| return true; |
| } |
| // Defined by the WebCrypto spec as: |
| // |
| // typedef Uint8Array BigInteger; |
| -bool getBigInteger(const Dictionary& raw, const char* propertyName, DOMUint8Array*& array, const ErrorContext& context, AlgorithmError* error) |
| +bool getBigInteger(const Dictionary& raw, const char* propertyName, Vector<uint8_t>& bytes, const ErrorContext& context, AlgorithmError* error) |
| { |
| - if (!getUint8Array(raw, propertyName, array, context, error)) |
| + if (!getUint8Array(raw, propertyName, bytes, context, error)) |
| return false; |
| - if (!array->byteLength()) { |
| + if (bytes.isEmpty()) { |
| // Empty BigIntegers represent 0 according to the spec |
| - array = DOMUint8Array::create(1); |
| + bytes.fill(0, 1); |
| } |
| return true; |
| @@ -451,13 +464,11 @@ bool getAlgorithmIdentifier(const Dictionary& raw, const char* propertyName, Alg |
| // }; |
| bool parseAesCbcParams(const Dictionary& raw, std::unique_ptr<WebCryptoAlgorithmParams>& params, const ErrorContext& context, AlgorithmError* error) |
| { |
| - BufferSource ivBufferSource; |
| - if (!getBufferSource(raw, "iv", ivBufferSource, context, error)) |
| + Vector<uint8_t> iv; |
| + if (!getBufferSource(raw, "iv", iv, context, error)) |
| return false; |
| - DOMArrayPiece iv(ivBufferSource); |
| - |
| - params = wrapUnique(new WebCryptoAesCbcParams(iv.bytes(), iv.byteLength())); |
| + params = wrapUnique(new WebCryptoAesCbcParams(iv.data(), iv.size())); |
| return true; |
| } |
| @@ -565,7 +576,7 @@ bool parseRsaHashedKeyGenParams(const Dictionary& raw, std::unique_ptr<WebCrypto |
| if (!getUint32(raw, "modulusLength", modulusLength, context, error)) |
| return false; |
| - DOMUint8Array* publicExponent = nullptr; |
| + Vector<uint8_t> publicExponent; |
| if (!getBigInteger(raw, "publicExponent", publicExponent, context, error)) |
| return false; |
| @@ -573,7 +584,7 @@ bool parseRsaHashedKeyGenParams(const Dictionary& raw, std::unique_ptr<WebCrypto |
| if (!parseHash(raw, hash, context, error)) |
| return false; |
| - params = wrapUnique(new WebCryptoRsaHashedKeyGenParams(hash, modulusLength, static_cast<const unsigned char*>(publicExponent->baseAddress()), publicExponent->byteLength())); |
| + params = wrapUnique(new WebCryptoRsaHashedKeyGenParams(hash, modulusLength, publicExponent.data(), publicExponent.size())); |
| return true; |
| } |
| @@ -585,16 +596,15 @@ bool parseRsaHashedKeyGenParams(const Dictionary& raw, std::unique_ptr<WebCrypto |
| // }; |
| bool parseAesCtrParams(const Dictionary& raw, std::unique_ptr<WebCryptoAlgorithmParams>& params, const ErrorContext& context, AlgorithmError* error) |
| { |
| - BufferSource counterBufferSource; |
| - if (!getBufferSource(raw, "counter", counterBufferSource, context, error)) |
| + Vector<uint8_t> counter; |
| + if (!getBufferSource(raw, "counter", counter, context, error)) |
| return false; |
| - DOMArrayPiece counter(counterBufferSource); |
| uint8_t length; |
| if (!getUint8(raw, "length", length, context, error)) |
| return false; |
| - params = wrapUnique(new WebCryptoAesCtrParams(length, counter.bytes(), counter.byteLength())); |
| + params = wrapUnique(new WebCryptoAesCtrParams(length, counter.data(), counter.size())); |
| return true; |
| } |
| @@ -607,13 +617,13 @@ bool parseAesCtrParams(const Dictionary& raw, std::unique_ptr<WebCryptoAlgorithm |
| // } |
| bool parseAesGcmParams(const Dictionary& raw, std::unique_ptr<WebCryptoAlgorithmParams>& params, const ErrorContext& context, AlgorithmError* error) |
| { |
| - BufferSource ivBufferSource; |
| - if (!getBufferSource(raw, "iv", ivBufferSource, context, error)) |
| + Vector<uint8_t> iv; |
| + if (!getBufferSource(raw, "iv", iv, context, error)) |
| return false; |
| bool hasAdditionalData; |
| - BufferSource additionalDataBufferSource; |
| - if (!getOptionalBufferSource(raw, "additionalData", hasAdditionalData, additionalDataBufferSource, context, error)) |
| + Vector<uint8_t> additionalData; |
| + if (!getOptionalBufferSource(raw, "additionalData", hasAdditionalData, additionalData, context, error)) |
| return false; |
| uint8_t tagLength = 0; |
| @@ -621,10 +631,7 @@ bool parseAesGcmParams(const Dictionary& raw, std::unique_ptr<WebCryptoAlgorithm |
| if (!getOptionalUint8(raw, "tagLength", hasTagLength, tagLength, context, error)) |
| return false; |
| - DOMArrayPiece iv(ivBufferSource); |
| - DOMArrayPiece additionalData(additionalDataBufferSource, DOMArrayPiece::AllowNullPointToNullWithZeroSize); |
| - |
| - params = wrapUnique(new WebCryptoAesGcmParams(iv.bytes(), iv.byteLength(), hasAdditionalData, additionalData.bytes(), additionalData.byteLength(), hasTagLength, tagLength)); |
| + params = wrapUnique(new WebCryptoAesGcmParams(iv.data(), iv.size(), hasAdditionalData, additionalData.data(), additionalData.size(), hasTagLength, tagLength)); |
| return true; |
| } |
| @@ -636,12 +643,11 @@ bool parseAesGcmParams(const Dictionary& raw, std::unique_ptr<WebCryptoAlgorithm |
| bool parseRsaOaepParams(const Dictionary& raw, std::unique_ptr<WebCryptoAlgorithmParams>& params, const ErrorContext& context, AlgorithmError* error) |
| { |
| bool hasLabel; |
| - BufferSource labelBufferSource; |
| - if (!getOptionalBufferSource(raw, "label", hasLabel, labelBufferSource, context, error)) |
| + Vector<uint8_t> label; |
| + if (!getOptionalBufferSource(raw, "label", hasLabel, label, context, error)) |
| return false; |
| - DOMArrayPiece label(labelBufferSource, DOMArrayPiece::AllowNullPointToNullWithZeroSize); |
| - params = wrapUnique(new WebCryptoRsaOaepParams(hasLabel, label.bytes(), label.byteLength())); |
| + params = wrapUnique(new WebCryptoRsaOaepParams(hasLabel, label.data(), label.size())); |
| return true; |
| } |
| @@ -770,12 +776,10 @@ bool parseEcdhKeyDeriveParams(const Dictionary& raw, std::unique_ptr<WebCryptoAl |
| // }; |
| bool parsePbkdf2Params(const Dictionary& raw, std::unique_ptr<WebCryptoAlgorithmParams>& params, const ErrorContext& context, AlgorithmError* error) |
| { |
| - BufferSource saltBufferSource; |
| - if (!getBufferSource(raw, "salt", saltBufferSource, context, error)) |
| + Vector<uint8_t> salt; |
| + if (!getBufferSource(raw, "salt", salt, context, error)) |
| return false; |
| - DOMArrayPiece salt(saltBufferSource); |
| - |
| uint32_t iterations; |
| if (!getUint32(raw, "iterations", iterations, context, error)) |
| return false; |
| @@ -783,7 +787,7 @@ bool parsePbkdf2Params(const Dictionary& raw, std::unique_ptr<WebCryptoAlgorithm |
| WebCryptoAlgorithm hash; |
| if (!parseHash(raw, hash, context, error)) |
| return false; |
| - params = wrapUnique(new WebCryptoPbkdf2Params(hash, salt.bytes(), salt.byteLength(), iterations)); |
| + params = wrapUnique(new WebCryptoPbkdf2Params(hash, salt.data(), salt.size(), iterations)); |
| return true; |
| } |
| @@ -819,17 +823,14 @@ bool parseHkdfParams(const Dictionary& raw, std::unique_ptr<WebCryptoAlgorithmPa |
| WebCryptoAlgorithm hash; |
| if (!parseHash(raw, hash, context, error)) |
| return false; |
| - BufferSource saltBufferSource; |
| - if (!getBufferSource(raw, "salt", saltBufferSource, context, error)) |
| + Vector<uint8_t> salt; |
| + if (!getBufferSource(raw, "salt", salt, context, error)) |
| return false; |
| - BufferSource infoBufferSource; |
| - if (!getBufferSource(raw, "info", infoBufferSource, context, error)) |
| + Vector<uint8_t> info; |
| + if (!getBufferSource(raw, "info", info, context, error)) |
| return false; |
| - DOMArrayPiece salt(saltBufferSource); |
| - DOMArrayPiece info(infoBufferSource); |
| - |
| - params = wrapUnique(new WebCryptoHkdfParams(hash, salt.bytes(), salt.byteLength(), info.bytes(), info.byteLength())); |
| + params = wrapUnique(new WebCryptoHkdfParams(hash, salt.data(), salt.size(), info.data(), info.size())); |
| return true; |
| } |