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

Side by Side Diff: Source/modules/crypto/NormalizeAlgorithm.cpp

Issue 23361019: WebCrypto: properly normalize optional numeric parameters. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 4 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 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 are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * 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 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 228
229 bool getUint8Array(const Dictionary& raw, const char* propertyName, RefPtr<Uint8 Array>& array, const ExceptionContext& context, ExceptionState& es) 229 bool getUint8Array(const Dictionary& raw, const char* propertyName, RefPtr<Uint8 Array>& array, const ExceptionContext& context, ExceptionState& es)
230 { 230 {
231 if (!raw.get(propertyName, array) || !array) { 231 if (!raw.get(propertyName, array) || !array) {
232 es.throwTypeError(context.toString(propertyName, "Missing or not a Uint8 Array")); 232 es.throwTypeError(context.toString(propertyName, "Missing or not a Uint8 Array"));
233 return false; 233 return false;
234 } 234 }
235 return true; 235 return true;
236 } 236 }
237 237
238 // Gets an integer according to WebIDL's [EnforceRange].
238 bool getInteger(const Dictionary& raw, const char* propertyName, double& value, double minValue, double maxValue, const ExceptionContext& context, ExceptionStat e& es) 239 bool getInteger(const Dictionary& raw, const char* propertyName, double& value, double minValue, double maxValue, const ExceptionContext& context, ExceptionStat e& es)
239 { 240 {
240 double number; 241 double number;
241 if (!raw.get(propertyName, number)) { 242 if (!raw.get(propertyName, number)) {
242 es.throwTypeError(context.toString(propertyName, "Missing or not a numbe r")); 243 es.throwTypeError(context.toString(propertyName, "Missing or not a numbe r"));
243 return false; 244 return false;
244 } 245 }
245 246
246 // Convert to an integer according to WebIDL's [EnforceRange]. 247 if (std::isnan(number)) {
247 if (std::isinf(number) || std::isnan(number)) { 248 es.throwTypeError(context.toString(propertyName, "Is not a number"));
249 return false;
250 }
251 if (std::isinf(number)) {
248 es.throwTypeError(context.toString(propertyName, "Outside of numeric ran ge")); 252 es.throwTypeError(context.toString(propertyName, "Outside of numeric ran ge"));
249 return false; 253 return false;
250 } 254 }
251 255
252 number = trunc(number); 256 number = trunc(number);
253 257
254 if (number < minValue || number > maxValue) { 258 if (number < minValue || number > maxValue) {
255 es.throwTypeError(context.toString(propertyName, "Outside of numeric ran ge")); 259 es.throwTypeError(context.toString(propertyName, "Outside of numeric ran ge"));
256 return false; 260 return false;
257 } 261 }
258 262
259 value = number; 263 value = number;
260 return true; 264 return true;
261 } 265 }
262 266
263 bool getOptionalInteger(const Dictionary& raw, const char* propertyName, bool& h asValue, double& value, double minValue, double maxValue, const ExceptionContext & context, ExceptionState& es)
264 {
265 double number;
266 if (!raw.get(propertyName, number)) {
267 // FIXME: If the property exists but is NOT a number, should fail.
268 hasValue = false;
269 return true;
270 }
271
272 hasValue = true;
273 return getInteger(raw, propertyName, value, minValue, maxValue, context, es) ;
274 }
275
276 bool getUint32(const Dictionary& raw, const char* propertyName, uint32_t& value, const ExceptionContext& context, ExceptionState& es) 267 bool getUint32(const Dictionary& raw, const char* propertyName, uint32_t& value, const ExceptionContext& context, ExceptionState& es)
277 { 268 {
278 double number; 269 double number;
279 if (!getInteger(raw, propertyName, number, 0, 0xFFFFFFFF, context, es)) 270 if (!getInteger(raw, propertyName, number, 0, 0xFFFFFFFF, context, es))
280 return false; 271 return false;
281 value = number; 272 value = number;
282 return true; 273 return true;
283 } 274 }
284 275
285 bool getUint16(const Dictionary& raw, const char* propertyName, uint16_t& value, const ExceptionContext& context, ExceptionState& es) 276 bool getUint16(const Dictionary& raw, const char* propertyName, uint16_t& value, const ExceptionContext& context, ExceptionState& es)
286 { 277 {
287 double number; 278 double number;
288 if (!getInteger(raw, propertyName, number, 0, 0xFFFF, context, es)) 279 if (!getInteger(raw, propertyName, number, 0, 0xFFFF, context, es))
289 return false; 280 return false;
290 value = number; 281 value = number;
291 return true; 282 return true;
292 } 283 }
293 284
294 bool getOptionalUint32(const Dictionary& raw, const char* propertyName, bool& ha sValue, uint32_t& value, const ExceptionContext& context, ExceptionState& es)
295 {
296 double number;
297 if (!getOptionalInteger(raw, propertyName, hasValue, number, 0, 0xFFFFFFFF, context, es))
298 return false;
299 if (hasValue)
300 value = number;
301 return true;
302 }
303
304 bool parseAesCbcParams(const Dictionary& raw, OwnPtr<WebKit::WebCryptoAlgorithmP arams>& params, const ExceptionContext& context, ExceptionState& es) 285 bool parseAesCbcParams(const Dictionary& raw, OwnPtr<WebKit::WebCryptoAlgorithmP arams>& params, const ExceptionContext& context, ExceptionState& es)
305 { 286 {
306 RefPtr<ArrayBufferView> iv; 287 RefPtr<ArrayBufferView> iv;
307 if (!getArrayBufferView(raw, "iv", iv, context, es)) 288 if (!getArrayBufferView(raw, "iv", iv, context, es))
308 return false; 289 return false;
309 290
310 if (iv->byteLength() != 16) { 291 if (iv->byteLength() != 16) {
311 es.throwTypeError(context.toString("iv", "Must be 16 bytes")); 292 es.throwTypeError(context.toString("iv", "Must be 16 bytes"));
312 return false; 293 return false;
313 } 294 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 params = adoptPtr(new WebKit::WebCryptoHmacParams(hash)); 330 params = adoptPtr(new WebKit::WebCryptoHmacParams(hash));
350 return true; 331 return true;
351 } 332 }
352 333
353 bool parseHmacKeyParams(const Dictionary& raw, OwnPtr<WebKit::WebCryptoAlgorithm Params>& params, const ExceptionContext& context, ExceptionState& es) 334 bool parseHmacKeyParams(const Dictionary& raw, OwnPtr<WebKit::WebCryptoAlgorithm Params>& params, const ExceptionContext& context, ExceptionState& es)
354 { 335 {
355 WebKit::WebCryptoAlgorithm hash; 336 WebKit::WebCryptoAlgorithm hash;
356 if (!parseHash(raw, hash, context, es)) 337 if (!parseHash(raw, hash, context, es))
357 return false; 338 return false;
358 339
359 bool hasLength; 340 bool hasLength = raw.hasValue("length");
360 uint32_t length; 341 uint32_t length = 0;
361 if (!getOptionalUint32(raw, "length", hasLength, length, context, es)) 342 if (hasLength && !getUint32(raw, "length", length, context, es))
362 return false; 343 return false;
363 344
364 params = adoptPtr(new WebKit::WebCryptoHmacKeyParams(hash, hasLength, length )); 345 params = adoptPtr(new WebKit::WebCryptoHmacKeyParams(hash, hasLength, length ));
365 return true; 346 return true;
366 } 347 }
367 348
368 bool parseRsaSsaParams(const Dictionary& raw, OwnPtr<WebKit::WebCryptoAlgorithmP arams>& params, const ExceptionContext& context, ExceptionState& es) 349 bool parseRsaSsaParams(const Dictionary& raw, OwnPtr<WebKit::WebCryptoAlgorithmP arams>& params, const ExceptionContext& context, ExceptionState& es)
369 { 350 {
370 WebKit::WebCryptoAlgorithm hash; 351 WebKit::WebCryptoAlgorithm hash;
371 if (!parseHash(raw, hash, context, es)) 352 if (!parseHash(raw, hash, context, es))
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 } 447 }
467 448
468 } // namespace 449 } // namespace
469 450
470 bool normalizeAlgorithm(const Dictionary& raw, AlgorithmOperation op, WebKit::We bCryptoAlgorithm& algorithm, ExceptionState& es) 451 bool normalizeAlgorithm(const Dictionary& raw, AlgorithmOperation op, WebKit::We bCryptoAlgorithm& algorithm, ExceptionState& es)
471 { 452 {
472 return normalizeAlgorithm(raw, op, algorithm, ExceptionContext(), es); 453 return normalizeAlgorithm(raw, op, algorithm, ExceptionContext(), es);
473 } 454 }
474 455
475 } // namespace WebCore 456 } // namespace WebCore
OLDNEW
« Source/bindings/v8/Dictionary.h ('K') | « Source/bindings/v8/Dictionary.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698