#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"

#: ../content/wrappers/ajax.md:block 1 (paragraph)
msgid "Title: Ajax Filename: ../common/wrappingS-AJAX.js"
msgstr ""

#: ../content/wrappers/ajax.md:block 2 (paragraph)
msgid ""
"XHR may be misused to exfiltrate data from the browser to the server. We "
"provide a wrapper that either blocks all XHR requests or lets the user "
"decide."
msgstr ""

#: ../content/wrappers/ajax.md:block 3 (paragraph)
msgid "**Known bug**: There are two flaws in the current implementation:"
msgstr ""

#: ../content/wrappers/ajax.md:block 4 (unordered list)
msgid ""
"There are many ways (see e.g. https://github.com/cure53/HTTPLeaks) to "
"replace XHR and consequently evade the wrapper. This can be mitigating by "
"monitoring the requests using Web Request API."
msgstr ""

#: ../content/wrappers/ajax.md:block 4 (unordered list)
msgid ""
"The confirm method puts a lot of responsibility on the user who needs to "
"have a good knowledge about the requests on each visited page."
msgstr ""

#: ../content/wrappers/ajax.md:block 5 (paragraph)
msgid ""
"**Note**: We expect to remove the wrapper once we release JShelter with "
"Fingerprint Detector (FPD). FPD should solve both issues above."
msgstr ""

#: ../content/wrappers/battery-cr.md:block 1 (paragraph)
msgid "Title: Battery level Filename: ../common/wrappingS-BATTERY-CR.js"
msgstr ""

#: ../content/wrappers/battery-cr.md:block 2 (paragraph)
msgid ""
"The `navigator.getBattery()` reports the state of the battery and can be "
"misused to fingerprint users for a short term. The API was removed from "
"Firefox, but is still supported in browsers derived from Chromium. The "
"wrapper mimics Firefox behaviour."
msgstr ""

#: ../content/wrappers/battery-cr.md:block 3 (paragraph)
msgid "**See also**: <https://lukaszolejnik.com/battery>"
msgstr ""

#: ../content/wrappers/battery-cr.md:block 4 (paragraph)
msgid ""
"**Known bug**: Because we mimic Firefox behaviour, a Chromium derived "
"browser becomes more easily fingerprintable. This can be fixed by properly "
"wrapping `BatteryManager.prototype` getters and setters."
msgstr ""

#: ../content/wrappers/be.md:block 1 (paragraph)
msgid "Title: Beacon API Filename: ../common/wrappingS-BE.js"
msgstr ""

#: ../content/wrappers/be.md:block 2 (paragraph)
msgid ""
"The `navigator.sendBeacon()` method asynchronously sends a small amount of "
"data over HTTP to a web server. It is intended to be used for sending "
"analytics data to a web server. For more details see the MDN docs on the "
"[Beacon API](https://developer.mozilla.org/en-US/docs/Web/API/Beacon_API) "
"and [sendBeacon](https://developer.mozilla.org/en-"
"US/docs/Web/API/Navigator/sendBeacon)."
msgstr ""

#: ../content/wrappers/be.md:block 3 (paragraph)
msgid ""
"`navigator.sendBeacon` is the only method currently defined for the Beacon "
"API."
msgstr ""

#: ../content/wrappers/coop-scheduling.md:block 1 (paragraph)
msgid ""
"Title: Cooperative Scheduling Filename: ../common/wrappingS-COOP-"
"SCHEDULING.js"
msgstr ""

#: ../content/wrappers/coop-scheduling.md:block 2 (paragraph)
msgid ""
"The `window.requestIdleCallback()` API can schedule background tasks such "
"that they do not introduce delays to other high priority tasks that share "
"the same event loop, such as input processing, animations and frame "
"compositing."
msgstr ""

#: ../content/wrappers/coop-scheduling.md:block 3 (paragraph)
msgid ""
"But the API leaks information about the other tasks running in the browser "
"as it leaks information on currently scheduled tasks, vsync deadlines, user-"
"interaction and so on."
msgstr ""

#: ../content/wrappers/coop-scheduling.md:block 4 (paragraph)
msgid "JShelter modifies the return call to:"
msgstr ""

#: ../content/wrappers/coop-scheduling.md:block 5 (ordered list)
msgid ""
"Never leak the information that the call was triggered by an expired "
"timeout."
msgstr ""

#: ../content/wrappers/coop-scheduling.md:block 5 (ordered list)
msgid ""
"Fake the information on remaining time in synchronization with the "
"`Date.now()` wrapper. Returns up to 50% more time compared to the original "
"value."
msgstr ""

#: ../content/wrappers/dm.md:block 1 (paragraph)
msgid "Title: Device memory Filename: ../common/wrappingS-DM.js"
msgstr ""

#: ../content/wrappers/dm.md:block 2 (paragraph)
msgid ""
"This file contains a wrapper for "
"[navigator.deviceMemory](https://developer.mozilla.org/en-"
"US/docs/Web/API/Navigator/deviceMemory)."
msgstr ""

#: ../content/wrappers/dm.md:block 3 (paragraph)
msgid ""
"The goal is to prevent fingerprinting by modifying the return value of the "
"`navigator.deviceMemory` parameter."
msgstr ""

#: ../content/wrappers/dm.md:block 4 (paragraph)
msgid "This wrapper operates with three levels of protection:"
msgstr ""

#: ../content/wrappers/dm.md:block 5 (unordered list)
msgid "(0) - return random valid value from range [0.25 - real value]"
msgstr ""

#: ../content/wrappers/dm.md:block 5 (unordered list)
msgid "(1) - return random valid value from range [0.25 - 8]"
msgstr ""

#: ../content/wrappers/dm.md:block 5 (unordered list)
msgid "(2) - return 4"
msgstr ""

#: ../content/wrappers/dm.md:block 6 (paragraph)
msgid ""
"These approaches are inspired by the algorithms created by [Brave "
"Software](https://brave.com) available "
"[here](https://github.com/brave/brave-"
"core/blob/master/chromium_src/third_party/blink/renderer/core/frame/navigator_device_memory.cc)."
msgstr ""

#: ../content/wrappers/dom.md:block 1 (paragraph)
msgid "Title: DOM API Filename: ../common/wrappingS-DOM.js"
msgstr ""

#: ../content/wrappers/dom.md:block 2 (paragraph)
msgid ""
"The events carry timestamp of their creation. As we allow wrapping of "
"several ways to obtain timestamps, we need to provide the same precision for"
" the Event API."
msgstr ""

#: ../content/wrappers/ecma-array.md:block 1 (paragraph)
msgid "Title: ECMAscript arrays Filename: ../common/wrappingS-ECMA-ARRAY.js"
msgstr ""

#: ../content/wrappers/ecma-array.md:block 2 (paragraph)
msgid ""
"This wrapper aims on prevention of microarchitectural attacks like Meltdown "
"and Spectre. This code was originally a part of "
"[ChromeZero](https://github.com/IAIK/ChromeZero)."
msgstr ""

#: ../content/wrappers/ecma-array.md:block 3 (paragraph)
msgid "**Known bug**: The `subarray()` method always ruturns the full array."
msgstr ""

#: ../content/wrappers/ecma-array.md:block 4 (paragraph)
msgid "The wrappers support the following behaviour:"
msgstr ""

#: ../content/wrappers/ecma-array.md:block 5 (unordered list)
msgid ""
"Offset: The content of the buffer is shifted by a fix offset. This is a "
"faster method but can be removed."
msgstr ""

#: ../content/wrappers/ecma-array.md:block 5 (unordered list)
msgid ""
"Random mapping: All items are mapped randomly. This is a slower method but "
"more reliable."
msgstr ""

#: ../content/wrappers/ecma-array.md:block 6 (paragraph)
msgid ""
"**See also**: "
"<https://www.fit.vut.cz/study/thesis/22374/?year=0&sup=Pol%C4%8D%C3%A1k>, "
"especially Sect. 5.1"
msgstr ""

#: ../content/wrappers/ecma-date.md:block 1 (paragraph)
msgid "Title: ECMAscript date Filename: ../common/wrappingS-ECMA-DATE.js"
msgstr ""

#: ../content/wrappers/ecma-date.md:block 2 (paragraph)
msgid ""
"This wrapper aims on prevention of microarchitectural attacks, clock-skew "
"attacks, and other time related attacks. The goal is to limit the precision "
"of the time returned by the Date object."
msgstr ""

#: ../content/wrappers/ecma-date.md:block 3 (paragraph)
msgid ""
"**See also**: "
"<https://www.fit.vut.cz/study/thesis/22308/?year=0&sup=Pol%C4%8D%C3%A1k>, "
"especially Sect. 7.2."
msgstr ""

#: ../content/wrappers/ecma-date.md:block 4 (paragraph)
msgid ""
"**See also**: Tom Van Goethem, Wouter Joosen, Nick Nikiforakis. The Clock is"
" Still Ticking: Timing Attacks in the Modern Web. CCS'15. "
"[Link](https://lirias.kuleuven.be/retrieve/389086), "
"[DOI](http://dx.doi.org/10.1145/2810103.2813632)"
msgstr ""

#: ../content/wrappers/ecma-date.md:block 5 (paragraph)
msgid ""
"**See also**: Schwarz, M., Lipp, M. a Gruss, D. JavaScript Zero: Real "
"JavaScript and Zero Side-Channel Attacks. NDSS'18."
msgstr ""

#: ../content/wrappers/ecma-date.md:block 6 (paragraph)
msgid ""
"**See also**: Schwarz M., Maurice C., Gruss D., Mangard S. (2017) Fantastic "
"Timers and Where to Find Them: High-Resolution Microarchitectural Attacks in"
" JavaScript. In: Kiayias A. (eds) Financial Cryptography and Data Security. "
"FC 2017. Lecture Notes in Computer Science, vol 10322. Springer, Cham. "
"https://doi.org/10.1007/978-3-319-70972-7_13"
msgstr ""

#: ../content/wrappers/ecma-date.md:block 8 (unordered list)
msgid ""
"Round timestamp: Limit the precision by removing (a part of) the decimal "
"part of the timestamp."
msgstr ""

#: ../content/wrappers/ecma-date.md:block 8 (unordered list)
msgid ""
"Randomize after rounding: Create a fake decimal part to confuse attackers "
"and to create timestamps that look similar to expected timestamps."
msgstr ""

#: ../content/wrappers/ecma-shared.md:block 1 (paragraph)
msgid ""
"Title: ECMA shared buffers Filename: ../common/wrappingS-ECMA-SHARED.js"
msgstr ""

#: ../content/wrappers/ecma-shared.md:block 2 (paragraph)
msgid ""
"This wrapper aims on prevention of misusing `SharedArrayBuffer` to create "
"perfect timers and to perfrom microarchitectural attacks. This code was "
"originally a part of [ChromeZero](https://github.com/IAIK/ChromeZero)."
msgstr ""

#: ../content/wrappers/ecma-shared.md:block 3 (paragraph)
msgid ""
"**See also**: "
"https://www.fit.vut.cz/study/thesis/22374/?year=0&sup=Pol%C4%8D%C3%A1k, "
"especially Sect. 5.1"
msgstr ""

#: ../content/wrappers/eme.md:block 1 (paragraph)
msgid "Title: Encrypted Media Extensions Filename: ../common/wrappingS-EME.js"
msgstr ""

#: ../content/wrappers/eme.md:block 2 (paragraph)
msgid ""
"`Navigator.requestMediaKeySystemAccess()` provides access to "
"`MediaKeySystemAccess` object that allows to query supported encryption "
"mechanisms and other information about the system."
msgstr ""

#: ../content/wrappers/eme.md:block 3 (paragraph)
msgid ""
"For example, visit https://www.fit.vutbr.cz/~polcak/jsr/hdcp/ and try a "
"different browser or computer."
msgstr ""

#: ../content/wrappers/eme.md:block 4 (paragraph)
msgid ""
"**See also**: https://w3c.github.io/encrypted-media/ **See also**: "
"https://developer.mozilla.org/en-"
"US/docs/Web/API/Navigator/requestMediaKeySystemAccess **See also**: "
"https://developer.mozilla.org/en-US/docs/Web/API/MediaKeySystemAccess **See "
"also**: https://developer.mozilla.org/en-"
"US/docs/Web/API/MediaKeySystemAccess/getConfiguration"
msgstr ""

#: ../content/wrappers/eme.md:block 5 (paragraph)
msgid "We provide two modes of protection:"
msgstr ""

#: ../content/wrappers/eme.md:block 6 (ordered list)
msgid "Strict approach prevents accessing the API."
msgstr ""

#: ../content/wrappers/eme.md:block 6 (ordered list)
msgid ""
"Farbling approach changes the output to a non-existing key system with 12.5%"
" probability."
msgstr ""

#: ../content/wrappers/geo.md:block 1 (paragraph)
msgid "Title: Geolocation Filename: ../common/wrappingS-GEO.js"
msgstr ""

#: ../content/wrappers/geo.md:block 2 (paragraph)
msgid ""
"The goal is to prevent leaks of user current position. The Geolocation API "
"also provides access to high precision timestamps which can be used to "
"various web attacks (see for example, "
"http://www.jucs.org/jucs_21_9/clock_skew_based_computer, "
"https://lirias.kuleuven.be/retrieve/389086)."
msgstr ""

#: ../content/wrappers/geo.md:block 3 (paragraph)
msgid ""
"Although it is true that the user needs to specificaly approve access to "
"location facilities, these wrappers aim on improving the control of the "
"precision of the geolocation."
msgstr ""

#: ../content/wrappers/geo.md:block 4 (paragraph)
msgid "The wrappers support the following controls:"
msgstr ""

#: ../content/wrappers/geo.md:block 5 (unordered list)
msgid ""
"Accurate data: the extension provides precise geolocation position but "
"modifies the time precision in conformance with the Date and Performance "
"wrappers."
msgstr ""

#: ../content/wrappers/geo.md:block 5 (unordered list)
msgid ""
"Modified position: the extension modifies the time precision of the time "
"stamps in conformance with the Date and Performance wrappers, and "
"additionally, allows to limit the precision of the current position to "
"hundered of meters, kilometers, tens, or hundereds of kilometers."
msgstr ""

#: ../content/wrappers/geo.md:block 6 (paragraph)
msgid "When modifying position:"
msgstr ""

#: ../content/wrappers/geo.md:block 7 (unordered list)
msgid ""
"Repeated calls of `navigator.geolocation.getCurrentPosition()` return the "
"same position without page load and typically return another position after "
"page reload."
msgstr ""

#: ../content/wrappers/geo.md:block 7 (unordered list)
msgid "`navigator.geolocation.watchPosition()` does not change position."
msgstr ""

#: ../content/wrappers/gp.md:block 1 (paragraph)
msgid "Title: Gamepad Filename: ../common/wrappingS-GP.js"
msgstr ""

#: ../content/wrappers/gp.md:block 2 (paragraph)
msgid ""
"navigator.getGamepads() allows any page script to learn the gamepads "
"connected to the computer if the feature is not blocked by the Feature-"
"Policy."
msgstr ""

#: ../content/wrappers/gp.md:block 3 (paragraph)
msgid ""
"The \"Fingerprinting the Fingerprinters\" paper (see reference below) "
"observed that the interface is used in the wild to fingerprint users. As it "
"is likely that only a minority of users have a gamepad connected and the API"
" provides additional information on the HW, it is likely that users with a "
"gamepad connected are easily fingerprintable."
msgstr ""

#: ../content/wrappers/gp.md:block 4 (paragraph)
msgid ""
"As we expect that the majority of the users does not have a gamepad "
"connected, we provide only a single mitigation - the wrapped APIs return an "
"empty list."
msgstr ""

#: ../content/wrappers/gp.md:block 5 (paragraph)
msgid ""
"**Known bug**: The standard provides an event `gamepadconnected` and "
"`gamepaddisconnected` that fires at least on the window object. We do not "
"mitigate the event to fire and consequently, it is possible that an "
"adversary can learn that a gamepad was (dis)connected but there was no "
"change in the result of the `navigator.getGamepads()` API."
msgstr ""

#: ../content/wrappers/gp.md:block 6 (paragraph)
msgid ""
"The gamepad representing object carries a timestamp of the last change of "
"the gamepad. As we allow wrapping of several ways to obtain timestamps, we "
"need to provide the same precision for the Gamepad object."
msgstr ""

#: ../content/wrappers/gp.md:block 7 (paragraph)
msgid ""
"**See also**: U. Iqbal, S. Englehardt and Z. Shafiq, [Fingerprinting the "
"Fingerprinters: Learning to Detect Browser Fingerprinting "
"Behaviors](https://github.com/uiowa-irl/FP-"
"Inspector/blob/master/Data/potential_fingerprinting_APIs.md) in 2021 2021 "
"IEEE Symposium on Security and Privacy (SP), San Francisco, CA, US, 2021 pp."
" 283-301"
msgstr ""

#: ../content/wrappers/h-c.md:block 1 (paragraph)
msgid "Title: HTML Canvas Filename: ../common/wrappingS-H-C.js"
msgstr ""

#: ../content/wrappers/h-c.md:block 2 (paragraph)
msgid ""
"This file contains wrappers for calls related to the Canvas API, about which"
" you can read more at MDN:"
msgstr ""

#: ../content/wrappers/h-c.md:block 3 (unordered list)
msgid ""
"[Canvas API](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API)"
msgstr ""

#: ../content/wrappers/h-c.md:block 3 (unordered list)
msgid ""
"[CanvasRenderingContext2D](https://developer.mozilla.org/en-"
"US/docs/Web/API/CanvasRenderingContext2D)"
msgstr ""

#: ../content/wrappers/h-c.md:block 3 (unordered list)
msgid ""
"[OffscreenCanvas](https://developer.mozilla.org/en-"
"US/docs/Web/API/OffscreenCanvas)"
msgstr ""

#: ../content/wrappers/h-c.md:block 4 (paragraph)
msgid ""
"The goal is to prevent fingerprinting by modifying the values that can be "
"read from the canvas. So the visual content of wrapped canvases as displayed"
" on the screen is the same as intended."
msgstr ""

#: ../content/wrappers/h-c.md:block 5 (paragraph)
msgid ""
"The modified content can be either an empty image or a fake image that is "
"modified according to session and domain keys to be different than the "
"original albeit very similar (i.e. the approach inspired by the algorithms "
"created by [Brave Software](https://brave.com) available "
"[here](https://github.com/brave/brave-"
"core/blob/master/chromium_src/third_party/blink/renderer/core/execution_context/execution_context.cc)."
msgstr ""

#: ../content/wrappers/h-c.md:block 6 (paragraph)
msgid ""
"Note that both approaches are detectable by a fingerprinter that checks if a"
" predetermined image inserted to the canvas is the same as the read one, see"
" [here](https://arkenfox.github.io/TZP/tests/canvasnoise.html) for an "
"example, Nevertheless, the aim of the wrappers is to limit the "
"finerprintability."
msgstr ""

#: ../content/wrappers/h-c.md:block 7 (paragraph)
msgid ""
"Also note that a determined fingerprinter can reveal the modifications and "
"consequently uncover the original image. This can be avoided with the "
"approach that completely clears the data stored in the canvas. Use the "
"modifications based on session and domain keys if you want to provide an "
"image that is similar to the original or if you want to produce a fake image"
" that is not obviously spoofed to a naked eye. Otherwise, use the clearing "
"approach."
msgstr ""

#: ../content/wrappers/hrt.md:block 1 (paragraph)
msgid "Title: HTML Performance Filename: ../common/wrappingS-HRT.js"
msgstr ""

#: ../content/wrappers/hrt.md:block 2 (paragraph)
msgid ""
"This wrapper aims on prevention of microarchitectural attacks, clock-skew "
"attacks, and other time related attacks. The goal is to limit the precision "
"of the time returned by the Performance API."
msgstr ""

#: ../content/wrappers/hrt.md:block 3 (paragraph)
msgid ""
"**See also**: "
"https://www.fit.vut.cz/study/thesis/22308/?year=0&sup=Pol%C4%8D%C3%A1k, "
"especially Sect. 7.2."
msgstr ""

#: ../content/wrappers/hrt.md:block 4 (paragraph)
msgid ""
"**See also**: Tom Van Goethem, Wouter Joosen, Nick Nikiforakis. The Clock is"
" Still Ticking: Timing Attacks in the Modern Web. CCS'15. DOI: "
"http://dx.doi.org/10.1145/2810103.2813632. "
"https://lirias.kuleuven.be/retrieve/389086"
msgstr ""

#: ../content/wrappers/html5.md:block 1 (paragraph)
msgid "Title: HTML multimedia Filename: ../common/wrappingS-HTML5.js"
msgstr ""

#: ../content/wrappers/html5.md:block 2 (paragraph)
msgid ""
"Supported codecs (multimedia media types) can be misued for fingerprinting, "
"see for example the [FPMon paper](https://fpmon.github.io/fingerprinting-"
"monitor/files/FPMON.pdf)."
msgstr ""

#: ../content/wrappers/html5.md:block 3 (paragraph)
msgid "JShelter provides two modes of protection:"
msgstr ""

#: ../content/wrappers/html5.md:block 4 (ordered list)
msgid "Strict approach returns all media types as not supported."
msgstr ""

#: ../content/wrappers/html5.md:block 4 (ordered list)
msgid "Modifies the output of probably/maybe supported codecs."
msgstr ""

#: ../content/wrappers/html-ls.md:block 1 (paragraph)
msgid "Title: HTML Workers Filename: ../common/wrappingS-HTML-LS.js"
msgstr ""

#: ../content/wrappers/html-ls.md:block 2 (paragraph)
msgid ""
"This wrapper aims on prevention of microarchitectural attacks. This code was"
" originally a part of [ChromeZero](https://github.com/IAIK/ChromeZero)."
msgstr ""

#: ../content/wrappers/html-ls.md:block 4 (unordered list)
msgid "Polyfill: Completely eliminates the paralelism."
msgstr ""

#: ../content/wrappers/html-ls.md:block 4 (unordered list)
msgid ""
"Randomly slow messages: Add noise to the `postMessage` method execution."
msgstr ""

#: ../content/wrappers/html-ls.md:block 5 (paragraph)
msgid ""
"**See also**: Lipp, M., Gruss, D., Schwarz, M., Bidner, D., Maurice, C. et "
"al. Practical Keystroke Timing Attacks in Sandboxed JavaScript. In:. August "
"2017, s. 191–209. ISBN 978-3-319-66398-2."
msgstr ""

#: ../content/wrappers/html-ls.md:block 7 (paragraph)
msgid ""
"**See also**: "
"<https://www.fit.vut.cz/study/thesis/22374/?year=0&sup=Pol%C4%8D%C3%A1k>"
msgstr ""

#: ../content/wrappers/html.md:block 1 (paragraph)
msgid "Title: HTML window name Filename: ../common/wrappingS-HTML.js"
msgstr ""

#: ../content/wrappers/html.md:block 2 (paragraph)
msgid ""
"`window.name` provides a simple cross-origin tracking method of the same "
"tab:"
msgstr ""

#: ../content/wrappers/html.md:block 4 (paragraph)
msgid "Go to completely different web site and window.name stays the same."
msgstr ""

#: ../content/wrappers/html.md:block 5 (paragraph)
msgid ""
"**See also**: https://2019.www.torproject.org/projects/torbrowser/design/ "
"provides a library build on top of `window.name`: "
"https://www.thomasfrank.se/sessionvars.html."
msgstr ""

#: ../content/wrappers/html.md:block 6 (paragraph)
msgid ""
"**See also**: https://html.spec.whatwg.org/#history-traversal; this feature "
"should not be ncessary for Firefox 86 or newer "
"https://bugzilla.mozilla.org/show_bug.cgi?id=444222."
msgstr ""

#: ../content/wrappers/idle.md:block 1 (paragraph)
msgid "Title: Idle detection Filename: ../common/wrappingS-IDLE.js"
msgstr ""

#: ../content/wrappers/idle.md:block 2 (paragraph)
msgid ""
"**See also**: https://web.dev/idle-detection/ **See also**: "
"https://developer.mozilla.org/en-US/docs/Web/API/IdleDetector"
msgstr ""

#: ../content/wrappers/idle.md:block 3 (paragraph)
msgid ""
"The Idle Detection API can detect inactive users and locked screens. "
"JShelter either removes the API (IdleDetector), or disables permission "
"requests and returns user activity and unlocked screen (for previously "
"granted permissions), or just always report user activity and unlocked "
"screen."
msgstr ""

#: ../content/wrappers/idle.md:block 4 (paragraph)
msgid ""
"**Known bug**: JShelter does not block events, so the page is notified that "
"something changed but it cannot read what changed."
msgstr ""

#: ../content/wrappers/mcs.md:block 1 (paragraph)
msgid "Title: Media devices Filename: ../common/wrappingS-MCS.js"
msgstr ""

#: ../content/wrappers/mcs.md:block 2 (paragraph)
msgid ""
"This file contains wrapper for MediaDevices.enumerateDevices "
"https://developer.mozilla.org/en-"
"US/docs/Web/API/MediaDevices/enumerateDevices"
msgstr ""

#: ../content/wrappers/mcs.md:block 3 (paragraph)
msgid ""
"The goal is to prevent fingerprinting by modifying return value of "
"enumerateDevices."
msgstr ""

#: ../content/wrappers/mcs.md:block 5 (unordered list)
msgid "(0) - return promise with shuffled array"
msgstr ""

#: ../content/wrappers/mcs.md:block 5 (unordered list)
msgid ""
"(1) - return promise with shuffled array with additional 0-4 fake devices"
msgstr ""

#: ../content/wrappers/mcs.md:block 5 (unordered list)
msgid "(2) - return empty promise"
msgstr ""

#: ../content/wrappers/mcs.md:block 6 (paragraph)
msgid ""
"The shuffling approach is inspired by the algorithms created by [Brave "
"Software](https://brave.com) available "
"[here](https://github.com/brave/brave-"
"core/blob/master/chromium_src/third_party/blink/renderer/modules/mediastream/media_devices.cc)."
msgstr ""

#: ../content/wrappers/media-capabilities.md:block 1 (paragraph)
msgid ""
"Title: Media capabilities Filename: ../common/wrappingS-MEDIA-"
"CAPABILITIES.js"
msgstr ""

#: ../content/wrappers/media-capabilities.md:block 2 (paragraph)
msgid ""
"`` provides access to `MediaKeySystemAccess` object that allows to query "
"supported codecs and other informations about the system."
msgstr ""

#: ../content/wrappers/media-capabilities.md:block 4 (paragraph)
msgid "**See also**: https://w3c.github.io/media-capabilities/"
msgstr ""

#: ../content/wrappers/media-capabilities.md:block 6 (ordered list)
msgid ""
"Farbling approach changes the output to a non-existing codec with 12.5% "
"probability."
msgstr ""

#: ../content/wrappers/net.md:block 1 (paragraph)
msgid "Title: Network information Filename: ../common/wrappingS-NET.js"
msgstr ""

#: ../content/wrappers/net.md:block 2 (paragraph)
msgid ""
"This file contains a wrapper for "
"[NetworkInformation](https://developer.mozilla.org/en-"
"US/docs/Web/API/NetworkInformation#specifications)."
msgstr ""

#: ../content/wrappers/net.md:block 3 (paragraph)
msgid ""
"NetworkInformation allows sites to learn about local network conditions by "
"querying `navigator.connection`. Fingerprinters can misuse the feature. "
"Long-term observers may learn about traveling patterns through observation "
"of repeated values (for example a network at work, home, travel, etc.)."
msgstr ""

#: ../content/wrappers/net.md:block 4 (paragraph)
msgid ""
"We implement the same protection as Brave: https://github.com/brave/brave-"
"browser/issues/20122."
msgstr ""

#: ../content/wrappers/nfc.md:block 1 (paragraph)
msgid "Title: Web NFC Filename: ../common/wrappingS-NFC.js"
msgstr ""

#: ../content/wrappers/nfc.md:block 2 (paragraph)
msgid ""
"This file contains a wrapper for [Web NFC "
"API](https://developer.mozilla.org/en-US/docs/Web/API/Web_NFC_API)."
msgstr ""

#: ../content/wrappers/nfc.md:block 3 (paragraph)
msgid "This API is not broadly supported and we just disable all objects."
msgstr ""

#: ../content/wrappers/np.md:block 1 (paragraph)
msgid "Title: Navigator Plugins Filename: ../common/wrappingS-NP.js"
msgstr ""

#: ../content/wrappers/np.md:block 2 (paragraph)
msgid ""
"This file contains wrappers for NavigatorPlugins. See the MDN docs on the "
"[plugins](https://developer.mozilla.org/en-"
"US/docs/Web/API/NavigatorPlugins/plugins) and [MIME "
"types](https://developer.mozilla.org/en-"
"US/docs/Web/API/NavigatorPlugins/mimeTypes)."
msgstr ""

#: ../content/wrappers/np.md:block 3 (paragraph)
msgid ""
"The goal is to prevent fingerprinting by modifying value returned by getters"
" navigator.plugins and navigator.mimeTypes"
msgstr ""

#: ../content/wrappers/np.md:block 5 (unordered list)
msgid ""
"(0) - replace by shuffled edited PluginArray with two added fake plugins, "
"edited MimeTypeArray"
msgstr ""

#: ../content/wrappers/np.md:block 5 (unordered list)
msgid ""
"(1) - replace by shuffled PluginArray with two fake plugins, empty "
"MimeTypeArray"
msgstr ""

#: ../content/wrappers/np.md:block 5 (unordered list)
msgid "(2) - replace by empty PluginArray and MimeTypeArray"
msgstr ""

#: ../content/wrappers/np.md:block 6 (paragraph)
msgid ""
"These approaches are inspired by the algorithms created by [Brave "
"Software](https://brave.com) available "
"[here](https://github.com/brave/brave-"
"core/blob/master/chromium_src/third_party/blink/renderer/modules/plugins/dom_plugin_array.cc)."
msgstr ""

#: ../content/wrappers/np.md:block 7 (paragraph)
msgid ""
"The purpose of the wrappers is solely to prevent fingerprinting. However, "
"browsers modyfing the array stand out of the crowd, which makes them more "
"fingerprintable. Consequently, JShelter does not modify an empty list. So no"
" matter the configuration, an empty list is not populated by the wrappers."
msgstr ""

#: ../content/wrappers/np.md:block 8 (paragraph)
msgid "If PDF inline viewing is supported, Firefox returns 5 plugins:"
msgstr ""

#: ../content/wrappers/np.md:block 9 (unordered list)
msgid "\"PDF Viewer\""
msgstr ""

#: ../content/wrappers/np.md:block 9 (unordered list)
msgid "\"Chrome PDF Viewer\""
msgstr ""

#: ../content/wrappers/np.md:block 9 (unordered list)
msgid "\"Chromium PDF Viewer\""
msgstr ""

#: ../content/wrappers/np.md:block 9 (unordered list)
msgid "\"Microsoft Edge PDF Viewer\""
msgstr ""

#: ../content/wrappers/np.md:block 9 (unordered list)
msgid "\"WebKit built-in PDF\""
msgstr ""

#: ../content/wrappers/np.md:block 10 (paragraph)
msgid ""
"A list containing exactly these plugins is treated as the empty list and it "
"is not modified."
msgstr ""

#: ../content/wrappers/pt2.md:block 1 (paragraph)
msgid "Title: Performance Timeline (L2) Filename: ../common/wrappingS-PT2.js"
msgstr ""

#: ../content/wrappers/pt2.md:block 2 (paragraph)
msgid ""
"This wrapper aims on prevention of microarchitectural attacks, clock-skew "
"attacks, and other time related attacks. The goal is to limit the precision "
"of the time returned by the Performance Timeline API."
msgstr ""

#: ../content/wrappers/sensor-accelerometer.md:block 1 (paragraph)
msgid ""
"Title: Accelerometer Filename: ../common/wrappingS-SENSOR-ACCELEROMETER.js"
msgstr ""

#: ../content/wrappers/sensor-accelerometer.md:block 2 (paragraph)
msgid ""
"MOTIVATION Readings from the Accelerometer, LinearAccelerationSensor, and "
"GravitySensor of the Generic Sensor API should be secured as they provide a "
"potentially valuable data for creating fingerprints. There are multiple "
"options. A unique fingerprint can be obtained by describing the device's "
"vibrations (See "
"https://link.springer.com/chapter/10.1007/978-3-319-30806-7_7). Using "
"trajectory inference and matching of the model to map data, one may use the "
"readings from the Accelerometer to determing the device's position (See "
"https://www.researchgate.net/publication/220990763_ACComplice_Location_ "
"inference_using_accelerometers_on_smartphones)."
msgstr ""

#: ../content/wrappers/sensor-accelerometer.md:block 3 (paragraph)
msgid ""
"WRAPPING The wrapper replaces the \"XYZ\" getters of the Accelerometer "
"sensor, LinearAccelerationSensor, and GravitySensor. The wrapping's goal is "
"to simulate a stationary device that is lying bottom down on a flat surface,"
" e.g., a cell phone on the table. In such a case, only the `z` axis is "
"affected by gravity. The `x` and `y` axes values should be set to zero. Yet,"
" there could be vibrations that may change values a little bit, e.g., to "
"spin around -0.1 to +0.1. This usually does not happed with every reading "
"but only in intervals of seconds. And thus, after a few seconds we pseudo-"
"randomly change these values. For the LinearAccelerationSensor, the returned"
" values should represent the acceleration without the conribution of "
"gravity. For stationary devices, the `x` and `y` are zeroes, while the 'z' "
"portion fluctuates between 0 and 0.1 on the examined devices. The wrapper "
"simulates the same behavior. Lastly, the GravitySensor's readings are "
"calculated as the difference between the previous two."
msgstr ""

#: ../content/wrappers/sensor-accelerometer.md:block 4 (paragraph)
msgid ""
"POSSIBLE IMPROVEMENTS Currently, we assume te device is lying on a flat "
"surface bottom down, and thus only the `z` is affected by gravity. As "
"improvement, we can also assume the device is in an oblique position. In "
"this case, the gravitational acceleration would affect two or three axes. "
"Those will have to be updated properly to create a realistic behavior."
msgstr ""

#: ../content/wrappers/sensor-accel.md:block 1 (paragraph)
msgid "Title: Accelerometer Filename: ../common/wrappingS-SENSOR-ACCEL.js"
msgstr ""

#: ../content/wrappers/sensor-accel.md:block 2 (paragraph)
msgid ""
"MOTIVATION Readings from the Accelerometer, LinearAccelerationSensor, and "
"GravitySensor of the Generic Sensor API should be secured as they provide a "
"potentially valuable data for creating fingerprints. There are multiple "
"options. A unique fingerprint can be obtained by describing the device's "
"vibrations (See "
"https://link.springer.com/chapter/10.1007/978-3-319-30806-7_7). Using "
"trajectory inference and matching of the model to map data, one may use the "
"readings from the Accelerometer to determing the device's position (See "
"https://www.researchgate.net/publication/220990763_ACComplice_Location_ "
"inference_using_accelerometers_on_smartphones). Accelerometer readings can "
"also be used for determining human walking patterns (See "
"https://www.researchgate.net/publication/322835708_Classifying_Human_ "
"Walking_Patterns_using_Accelerometer_Data_from_Smartphone)."
msgstr ""

#: ../content/wrappers/sensor-accel.md:block 3 (paragraph)
msgid ""
"WRAPPING The wrapper replaces the \"XYZ\" getters of the Accelerometer "
"sensor, LinearAccelerationSensor, and GravitySensor. The wrapping's goal is "
"to simulate a stationary device that can be possibly rotated. The rotation "
"of the device is represented by the fake rotation matrix \"orient.rotMat\"."
msgstr ""

#: ../content/wrappers/sensor-accel.md:block 4 (paragraph)
msgid ""
"The GravitySensor should provide readings of gravity acceleration applied to"
" the device. This is represented by a vector made of x, y, z portions. To "
"get this faked gravity vector for the device, the reference vector [0, 0, "
"9.8] is multipled with the rotation matrix. Wrappers for the GravitySensor's"
" getters return x, y, z portions of the fake gravity vector."
msgstr ""

#: ../content/wrappers/sensor-accel.md:block 5 (paragraph)
msgid ""
"Next, the LinearAccelerationSensor should return acceleration values without"
" the contribution of gravity. For a stationary device, it should be all "
"zeroes. Yet, there could be vibrations that may change values a little bit, "
"e.g., spin around -0.1 to +0.1, as seen on the examined devices. This "
"usually does not happed with every reading but only in intervals of seconds."
" And thus, after a few seconds we pseudo-randomly change these values."
msgstr ""

#: ../content/wrappers/sensor-accel.md:block 6 (paragraph)
msgid ""
"Finally, the Accelerometer sensor combines the previous two. Our wrappers "
"thus return tha values from the LinearAccelerationSensor with the fake "
"gravity vector portions added."
msgstr ""

#: ../content/wrappers/sensor-accel.md:block 7 (paragraph)
msgid ""
"POSSIBLE IMPROVEMENTS Support for simulation of a non-stationary device "
"where the rotation can change. Currently, the calculation of the gravity "
"vector is done only once by the initDataGenerator() where the reference "
"vector is multiplied with the rotation matrix. If orient.rotMat could "
"change, the dataGen would have to be updated periodically. Moreover, such a "
"change should also be taken into account in wrappers for other movement-"
"related sensors (Gyroscope, etc.)."
msgstr ""

#: ../content/wrappers/sensor-gyro.md:block 1 (paragraph)
msgid "Title: Gyroscope Filename: ../common/wrappingS-SENSOR-GYRO.js"
msgstr ""

#: ../content/wrappers/sensor-gyro.md:block 2 (paragraph)
msgid ""
"MOTIVATION Gyroscope readings can be used for speech recognition: "
"https://crypto.stanford.edu/gyrophone/ and various fingerprinting "
"operations. For stationary devices, the resonance of the unique internal or "
"external sounds affects angular velocities affect the Gyroscope and allow to"
" create a fingerprint: "
"https://www.researchgate.net/publication/356678825_Mobile_Device_Fingerprint_Identification_Using_Gyroscope_Resonance"
" For moving devices, one of the options is using the Gyroscope analyze human"
" walking patterns: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7071017/"
msgstr ""

#: ../content/wrappers/sensor-gyro.md:block 3 (paragraph)
msgid ""
"WRAPPING The Gyroscope sensor provides readings of the angular velocity of "
"the device alongthe x/y/z axes. For a stationary device, all velocities "
"should be zero in an ideal state. As we observed on the examined devices, "
"device sensor imperfections andlittle vibrations cause the `x`, `y` and `z` "
"to oscillate between -0.002 and 0.002 on the examined devices. The wrapper "
"simulates the same behavior."
msgstr ""

#: ../content/wrappers/sensor-gyro.md:block 4 (paragraph)
msgid ""
"POSSIBLE IMPROVEMENTS Support for simulation of a non-stationary device. "
"This would require modifications to other movement-related sensors "
"(Accelerometer, etc.)"
msgstr ""

#: ../content/wrappers/sensor-light.md:block 1 (paragraph)
msgid ""
"Title: Ambient light sensor Filename: ../common/wrappingS-SENSOR-LIGHT.js"
msgstr ""

#: ../content/wrappers/sensor-light.md:block 2 (paragraph)
msgid ""
"MOTIVATION The AmbientLightSensor returns illuminance of the device's "
"environment. This is another value that describes the nearby physical "
"surrounding of the device, and can thus be used together with other readings"
" for creating a unique fingerprint."
msgstr ""

#: ../content/wrappers/sensor-light.md:block 3 (paragraph)
msgid ""
"WRAPPING On examined stationary devices inside an office, the illuminance "
"measured was between 500 and 900, depending on the concrete position's light"
" conditions. All measured values were rounded to nearest 50 illuminance "
"value. The wrapper silumlates the same behavior. At start, a pseudorandom "
"illuminance value is drawn. As we simulate a stationary device, this value "
"remains constant for all AmbientLightSensor.prototype.illuminance calls."
msgstr ""

#: ../content/wrappers/sensor-light.md:block 4 (paragraph)
msgid "POSSIBLE IMPROVEMENTS Simulation of changes in the illuminance."
msgstr ""

#: ../content/wrappers/sensor-magnet.md:block 1 (paragraph)
msgid "Title: Magnet Filename: ../common/wrappingS-SENSOR-MAGNET.js"
msgstr ""

#: ../content/wrappers/sensor-magnet.md:block 2 (paragraph)
msgid "MOTIVATION"
msgstr ""

#: ../content/wrappers/sensor-magnet.md:block 3 (paragraph)
msgid ""
"Magnetometer is a platform sensor available under the Generic Sensor API. "
"Magnetometer measures strength and direction of the magnetic field at "
"device's location. The interface offers sensor readings using three "
"properties: x, y, and z. Each returns a number that describes the magnetic "
"field aroud the particular axis. The numbers have a double precision and can"
" be positive or negative, depending on the orientation of the field. The "
"total strength of the magnetic field (M) can be calculated as M = sqrt(x^2 +"
" z^2 + y^2). The unit is in microtesla (µT)."
msgstr ""

#: ../content/wrappers/sensor-magnet.md:block 4 (paragraph)
msgid ""
"The Earth's magnetic field ranges between approximately 25 and 65 µT. "
"Concrete values depend on location, altitude, weather, interference made by "
"other electric. devices, etc. While we consider it is unlikely that someone "
"determines the precise location of the device from the Mangetometer values, "
"its data can be used for fingerprinting. For instance, it can be determined "
"wheter the device is moving or not. In case of a stationary device, we can "
"make a fingerprint from the device's orientation. Another fingerprintable "
"value is the average total strength of the field, which should remain stable"
" if the device is at the same position and in the same environment."
msgstr ""

#: ../content/wrappers/sensor-magnet.md:block 5 (paragraph)
msgid "WRAPPING"
msgstr ""

#: ../content/wrappers/sensor-magnet.md:block 6 (paragraph)
msgid ""
"To protect the device, we are wrapping the x, y, z getters of the "
"`Magnetometer.prototype` object. Instead of using the original data, we use "
"artificially generated values that look like actual sensor readings."
msgstr ""

#: ../content/wrappers/sensor-magnet.md:block 7 (paragraph)
msgid ""
"At every moment, our wrapper stores information about the previous reading. "
"Each rewrapped getter first checks the `timestamp` value of the sensor "
"object. If there is no difference from the previous reading's timestamp, the"
" wrapper returns the last measured value. Otherwise, it provides a new fake "
"reading."
msgstr ""

#: ../content/wrappers/sensor-magnet.md:block 8 (paragraph)
msgid ""
"We designed our fake field generator to fulfill the following properties:"
msgstr ""

#: ../content/wrappers/sensor-magnet.md:block 9 (unordered list)
msgid ""
"The randomness of the generator should be high enough to prevent attackers "
"from deducing the sensor values."
msgstr ""

#: ../content/wrappers/sensor-magnet.md:block 9 (unordered list)
msgid ""
"Multiple scripts from the same website that access readings with the same "
"timestamp must get the same results. And thus:"
msgstr ""

#: ../content/wrappers/sensor-magnet.md:block 9 (unordered list)
msgid ""
"The readings are deterministic - e.g., for a given website and time, we must"
" be able to say what values to return."
msgstr ""

#: ../content/wrappers/sensor-magnet.md:block 10 (paragraph)
msgid ""
"For every \"random\" draw, we use the Mulberry32 sen_prng that is seeded "
"with a value generated from the `domainHash` which ensures deterministic "
"behavior for the given website. First, we choose the desired total strength "
"`M` of the magnetic field at our simulated location. This is a pseudo-random"
" number from 25 to 60 uT, like on the Earth."
msgstr ""

#: ../content/wrappers/sensor-magnet.md:block 11 (paragraph)
msgid "We support two variants of settings the initial axes orientaton:"
msgstr ""

#: ../content/wrappers/sensor-magnet.md:block 12 (unordered list)
msgid ""
"A pseudorandom draw (RANDOM_AXES_ORIENTATION = true) - the original "
"implementation"
msgstr ""

#: ../content/wrappers/sensor-magnet.md:block 12 (unordered list)
msgid ""
"Calculation from the faked device rotation (shared by other wrappers) - "
"improved version"
msgstr ""

#: ../content/wrappers/sensor-magnet.md:block 13 (paragraph)
msgid ""
"For both methods, the orientation is defined by a number from -1 to 1 for "
"each axis: `baseX`, `baseY`, and `baseZ`. By modifying the above-shown "
"formula, we calculate the `multiplier` that needs to be applied to the base "
"values to get the desired field. The calculation is done as follows:"
msgstr ""

#: ../content/wrappers/sensor-magnet.md:block 14 (unordered list)
msgid ""
"mult = (M * sqrt(baseX^2 + baseY^2 + baseZ^2) / (baseX^2 + baseY^2 + "
"baseZ^2)) Now, we know that for axis `x`, the value should fluctuate around "
"`baseX * mult`, etc."
msgstr ""

#: ../content/wrappers/sensor-magnet.md:block 15 (paragraph)
msgid ""
"How much the field changes over time is specified by the fluctuation factor "
"(0;1] that can also be configured. For instance, 0.2 means that the magnetic"
" field on the axis may change from the base value by 20% in both positive "
"and negative way."
msgstr ""

#: ../content/wrappers/sensor-magnet.md:block 16 (paragraph)
msgid ""
"The fluctuation is simulated by using a series of **sine** functions for "
"each axis. Each sine has a unique amplitude, phase shift, and period. The "
"number of sines per axis is chosen pseudorandomly based on the wrapper "
"settings. For initial experiments, we used around 20 to 30 sines for each "
"axis. The optimal configuration is in question. More sines give less "
"predictable results, but also increase the computing complexity that could "
"have a negative impact on the browser's performance."
msgstr ""

#: ../content/wrappers/sensor-magnet.md:block 17 (paragraph)
msgid ""
"For the given timestamp `t`, we make the sum of all sine values at the point"
" `x=t`. The result is then shifted over the y-axis by adding `base[X|Y|Z] * "
"multiplier` to the sum. The initial configuration of the fake field "
"generator was chosen intuitively to resemble the results of the real "
"measurements. Currently, the generator uses at least one sine with the "
"period around 100 us (with 10% tolerance), which seems to be the minimum "
"sampling rate obtainable using the API on mobile devices. Then, at least one"
" sine around 1 s, around 10 s, 1 minute, and 1 hour. When more than 5 sines "
"are used, the cycle repeats using `modulo 5` and creates a new sine with the"
" period around 100 us, but this time the tolerance is 20%. The same follows "
"for seconds, tens of seconds, minutes, hours. The tolerance grows every 5 "
"sines. For 11+ sines, the tolerance is 30% up to the maximum (currently "
"50%). The amplitude of each sine is chosen pseudo- randomly based on the "
"**fluctuation factor** described above. The phase shift of each sine is also"
" pseudo-random number from [0;2PI)."
msgstr ""

#: ../content/wrappers/sensor-magnet.md:block 18 (paragraph)
msgid ""
"Based on the results, this heuristic returns belivable values that look like"
" actual sensor readings. Nevertheless, the generator uses a series of "
"constants, whose optimal values should be a subject of future research and "
"improvements. Perphaps, a correlation analysis with real mesurements could "
"help in the future."
msgstr ""

#: ../content/wrappers/sensor-magnet.md:block 19 (paragraph)
msgid ""
"POSSIBLE IMPROVEMENTS Non-stationary devices can be supported if the "
"baseX,Y,Z is updated with each movement. Do more experiments in real "
"environments and possibly update the reference magnetic field vector, or the"
" sine generator, e.g. by simulating temporary pseudorandom electromagnetic "
"interferences, etc."
msgstr ""

#: ../content/wrappers/sensor.md:block 1 (paragraph)
msgid "Title: Generic sensor Filename: ../common/wrappingS-SENSOR.js"
msgstr ""

#: ../content/wrappers/sensor.md:block 2 (paragraph)
msgid ""
"MOTIVATION The risk of using Generic Sensor API calls for device "
"fingerprinting is mentioned within the W3C Candidate Recommendation Draft, "
"29 July 2021 (https://www.w3.org/TR/2021/CRD-generic-"
"sensor-20210729/#device-fingerprinting) Documented threats include "
"manufacturing imperfections and differences that are unique to the concrete "
"model of the device and can be used for fingerprinting."
msgstr ""

#: ../content/wrappers/sensor.md:block 3 (paragraph)
msgid ""
"We discovered another loophole in the `Sensor.timestamp` attribute. The "
"value describes when the last `Sensor.onreading` event occurred, in "
"millisecond precision. We observed the time origin is not the time of "
"browsing context creation but the last boot time of the device. Exposing "
"such information is dangerous as it allows to fingerprint the user easily. "
"It is unlikely that two different devices will boot at exactly the same "
"time."
msgstr ""

#: ../content/wrappers/sensor.md:block 4 (paragraph)
msgid "Tested with the Magnetometer sensor on the following devices:"
msgstr ""

#: ../content/wrappers/sensor.md:block 5 (unordered list)
msgid ""
"Samsung Galaxy S21 Ultra; Android 11, kernel 5.4.6-215566388-abG99BXXU3AUE1,"
" Build/RP1A.200720.012.G998BXXU3AUE1 Chrome 94.0.4606.71 and Kiwi (Chromium)"
" 94.0.4606.56"
msgstr ""

#: ../content/wrappers/sensor.md:block 5 (unordered list)
msgid ""
"Xiaomi Redmi Note 5; Android 9, kernel 4.4.156-perf+, Build/9 "
"PKQ1.180901.001 Chrome 94.0.4606.71"
msgstr ""

#: ../content/wrappers/sensor.md:block 7 (paragraph)
msgid ""
"The wrapper thus protects device by changing the time origin to the browsing"
" context creation time, whereas the timestamp should still uniquely identify"
" the reading. This is achieved in the following way:"
msgstr ""

#: ../content/wrappers/sensor.md:block 8 (unordered list)
msgid ""
"At the first reading, we calculate the difference between the original value"
" and performance.now(). This gives us the offset between 1) the device boot "
"and 2) the page context initialization."
msgstr ""

#: ../content/wrappers/sensor.md:block 8 (unordered list)
msgid ""
"On every reading, the offset is subtracted from the original value. The "
"resulting value then uniquely identifies the reading sample without exposing"
" the boot time."
msgstr ""

#: ../content/wrappers/sensor.md:block 8 (unordered list)
msgid ""
"Like in the other time precision wrappers, the resulting timestamp is "
"processed by the mitigation function before return. The mitigation may round"
" and (optionally) add noise to the resulting timestamp."
msgstr ""

#: ../content/wrappers/sensor.md:block 9 (paragraph)
msgid ""
"POSSIBLE IMPROVEMENTS in protection level 2, the timestamp origin may be set"
" to a random value based on the session hash. This can serve as a \"fake "
"boot time.\""
msgstr ""

#: ../content/wrappers/sensor-orient.md:block 1 (paragraph)
msgid ""
"Title: Orientation sensor Filename: ../common/wrappingS-SENSOR-ORIENT.js"
msgstr ""

#: ../content/wrappers/sensor-orient.md:block 2 (paragraph)
msgid ""
"MOTIVATION Device orientation sensors can be easily used for fingerprinting."
" As it highly unlikely that two devices visiting the same site will be "
"oriented exactly the same, the orientation itself can serve as a "
"fingerprint."
msgstr ""

#: ../content/wrappers/sensor-orient.md:block 3 (paragraph)
msgid ""
"WRAPPING AbsoluteOrientationSensor returns a quaterion decribing the "
"physical orientation of the device in relation to the Earth's reference "
"coordinate system. The faked orientation of the device is saved inside the "
"\"orient\" global variable that is accessible to all wrappers. The value is "
"chosen pseudorandomly from the domain hash. The wrappper supports possible "
"change of orientation. With each reading, it loads the \"orient\"'s "
"contents, converts the rotation matrix to a quaternion that is returned by "
"the wrapped getter."
msgstr ""

#: ../content/wrappers/sensor-orient.md:block 4 (paragraph)
msgid ""
"RelativeOrientationSensor also describes the orientation, but without regard"
" to the Earth's reference coordinate system. We suppose the coordinate "
"system is chosen at the beginning of the sensor instance creation. As we "
"observed, no matter how the device is oriented, there is always a slight "
"difference from the AbsoluteOrientationSensor's in at least one axis. When "
"the device moves, both sensors' readings change. But their difference should"
" be always constant. And thus, we pseudorandomly generate a deviation from "
"the Earth's reference coordinate system. And for each reading, we take the "
"values from the fake AbsoluteOrientationSensor and modify them by the "
"constant deviation."
msgstr ""

#: ../content/wrappers/sensor-orient.md:block 5 (paragraph)
msgid ""
"POSSIBLE IMPROVEMENTS Study the supported coordinate systems of the "
"RelativeOrientationSensor and modify the wrapper behavior if needed."
msgstr ""

#: ../content/wrappers/vr.md:block 1 (paragraph)
msgid "Title: Virtual Reality 1.1 Filename: ../common/wrappingS-VR.js"
msgstr ""

#: ../content/wrappers/vr.md:block 2 (paragraph)
msgid ""
"navigator.activeVRDisplays() allows any page script to learn the VR displays"
" attached to the computer."
msgstr ""

#: ../content/wrappers/vr.md:block 3 (paragraph)
msgid ""
"U. Iqbal, S. Englehardt and Z. Shafiq, \"Fingerprinting the Fingerprinters: "
"Learning to Detect Browser Fingerprinting Behaviors,\" in 2021 2021 IEEE "
"Symposium on Security and Privacy (SP), San Francisco, CA, US, 2021 pp. "
"283-301 observed (https://github.com/uiowa-irl/FP-"
"Inspector/blob/master/Data/potential_fingerprinting_APIs.md) that the "
"interface is used in the wild to fingerprint users. As it is likely that "
"only a minority of users have a VR display connected and the API provides "
"additional information on the HW, it is likely that users with a VR display "
"connected are easily fingerprintable."
msgstr ""

#: ../content/wrappers/vr.md:block 4 (paragraph)
msgid ""
"As we expect that the majority of the users does not have a VR display "
"connected, we provide only a single mitigation - the wrapped APIs returns an"
" empty list."
msgstr ""

#: ../content/wrappers/vr.md:block 5 (paragraph)
msgid ""
"**Known bug**: The standard provides events *vrdisplayconnect*, "
"*vrdisplaydisconnect* *vrdisplayactivate* and *vrdisplaydeactivate* that "
"fires at least on the window object. We do not mitigate the event to fire "
"and consequently, it is possible that an adversary can learn that a VR "
"display was (dis)connected but there was no change in the result of the "
"navigator.activeVRDisplays() API."
msgstr ""

#: ../content/wrappers/vr.md:block 6 (paragraph)
msgid ""
"The VRFrameData object carries a timestamp. As we allow wrapping of several "
"ways to obtain timestamps, we need to provide the same precision for the "
"VRFrameData object."
msgstr ""

#: ../content/wrappers/weba.md:block 1 (paragraph)
msgid "Title: WebAudio Filename: ../common/wrappingS-WEBA.js"
msgstr ""

#: ../content/wrappers/weba.md:block 2 (paragraph)
msgid ""
"This file contains wrappers for AudioBuffer and AnalyserNode related calls"
msgstr ""

#: ../content/wrappers/weba.md:block 3 (unordered list)
msgid "https://developer.mozilla.org/en-US/docs/Web/API/AudioBuffer"
msgstr ""

#: ../content/wrappers/weba.md:block 3 (unordered list)
msgid "https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode"
msgstr ""

#: ../content/wrappers/weba.md:block 4 (paragraph)
msgid ""
"The goal is to prevent fingerprinting by modifying the values from functions"
" which are reading/copying from AudioBuffer and AnalyserNode. So the audio "
"content of wrapped objects is the same as intended."
msgstr ""

#: ../content/wrappers/weba.md:block 5 (paragraph)
msgid ""
"The modified content can be either a white noise based on domain key or a "
"fake audio data that is modified according to domain key to be different "
"than the original albeit very similar (i.e. the approach inspired by the "
"algorithms created by Brave Software <https://brave.com> available at "
"https://github.com/brave/brave-"
"core/blob/master/chromium_src/third_party/blink/renderer/core/execution_context/execution_context.cc.)"
msgstr ""

#: ../content/wrappers/weba.md:block 6 (paragraph)
msgid ""
"**Note**: Both approaches are detectable by a fingerprinter that checks if a"
" predetermined audio is the same as the read one. Nevertheless, the aim of "
"the wrappers is to limit the finerprintability."
msgstr ""

#: ../content/wrappers/weba.md:block 7 (paragraph)
msgid ""
"**Known bug**: Possibly inconsistant data between AudioBuffer and "
"AnalyserNode wrappers."
msgstr ""

#: ../content/wrappers/weba.md:block 8 (paragraph)
msgid ""
"**Known bug**: Inconsistency between AudioBuffer.prototype.copyFromChannel "
"and AudioBuffer.prototype.getChannelData. "
"AudioBuffer.prototype.copyFromChannel should call "
"AudioBuffer.prototype.getChannelData wrapper and then return result of the "
"original call."
msgstr ""

#: ../content/wrappers/webgl.md:block 1 (paragraph)
msgid "Title: WebGL Filename: ../common/wrappingS-WEBGL.js"
msgstr ""

#: ../content/wrappers/webgl.md:block 2 (paragraph)
msgid "This file contains wrappers for WebGL related calls"
msgstr ""

#: ../content/wrappers/webgl.md:block 3 (unordered list)
msgid "https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext"
msgstr ""

#: ../content/wrappers/webgl.md:block 3 (unordered list)
msgid ""
"https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext"
msgstr ""

#: ../content/wrappers/webgl.md:block 4 (paragraph)
msgid ""
"The goal is to prevent fingerprinting by modifying the values from certain "
"WebGLRenderingContext API functions. This includes return values of various "
"functions which can be hardware/software specific and image data reading."
msgstr ""

#: ../content/wrappers/webgl.md:block 5 (paragraph)
msgid ""
"Content is either modified according to domain and session keys to be "
"different than the original albeit very similar or replaced by bottom value "
"which is consistent every time. Both approaches are inspired by the "
"algorithms created by [Brave Software](https://brave.com) available "
"[here](https://github.com/brave/brave-"
"core/$blob/master/chromium_src/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc)"
" and [here](https://github.com/brave/brave-"
"core/blob/master/chromium_src/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.cc)."
msgstr ""

#: ../content/wrappers/webgl.md:block 6 (paragraph)
msgid "This wrapper operates with two levels of protection:"
msgstr ""

#: ../content/wrappers/webgl.md:block 7 (unordered list)
msgid ""
"(0) - return modified results, such as slightly changed image, slightly "
"changed number or random string"
msgstr ""

#: ../content/wrappers/webgl.md:block 7 (unordered list)
msgid ""
"(1) - return bottom values - such as zero, empty string, empty image, null, "
"etc."
msgstr ""

#: ../content/wrappers/webgl.md:block 8 (paragraph)
msgid ""
"Level 0 is trying to force WebGL fingeprint to be unique on every domain and"
" every session. This can be effective when used with other wrappers with "
"same options. This level causes breakage of websites using WebGL only "
"rarely. Level 1 is trying to return as little information as possible while "
"being consistent across domains and sessions. This level can cause breakage "
"on majority of websites using WebGL."
msgstr ""

#: ../content/wrappers/webgl.md:block 9 (paragraph)
msgid ""
"**Note**: Both approaches are detectable by a fingerprinter that checks if a"
" predetermined image is the same as the read one or if specific function "
"returns expected value. Nevertheless, the aim of the wrappers is to limit "
"the finerprintability."
msgstr ""

#: ../content/wrappers/xr.md:block 1 (paragraph)
msgid "Title: Web XR Filename: ../common/wrappingS-XR.js"
msgstr ""

#: ../content/wrappers/xr.md:block 2 (paragraph)
msgid ""
"navigator.xr allows any page script to learn the VR displays attached to the"
" computer and more."
msgstr ""

#: ../content/wrappers/xr.md:block 3 (paragraph)
msgid ""
"U. Iqbal, S. Englehardt and Z. Shafiq, \"Fingerprinting the Fingerprinters: "
"Learning to Detect Browser Fingerprinting Behaviors,\" in 2021 2021 IEEE "
"Symposium on Security and Privacy (SP), San Francisco, CA, US, 2021 pp. "
"283-301 observed (https://github.com/uiowa-irl/FP-"
"Inspector/blob/master/Data/potential_fingerprinting_APIs.md) that the "
"orginal WebVR API is used in the wild to fingerprint users. As it is likely "
"that only a minority of users have a VR display connected and the API "
"provides additional information on the HW, it is likely that users with a VR"
" display connected are easily fingerprintable."
msgstr ""

#: ../content/wrappers/xr.md:block 4 (paragraph)
msgid ""
"As all the API calls are accessible through the navigator.xr API, we provide"
" a single mitigation. We disable the API completely. This might need to be "
"revised once this API is commonly enabled in browsers."
msgstr ""
