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

Unified Diff: third_party/WebKit/Source/modules/crypto/NormalizeAlgorithm.cpp

Issue 2141843002: Copy array buffer data used by WebCrypto in the order expected by draft specification. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Change FIXME --> TODO(eroman) Created 4 years, 5 months 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 side-by-side diff with in-line comments
Download patch
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..592f4dcdc975c70e8db31a7549a13c245ff6d16d 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>
+// TODO(eroman): Change the interface for constructing
+// WebCryptoAlgorithmParams 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;
}

Powered by Google App Engine
This is Rietveld 408576698