Browser-based cpu fingerprinting is possible

javascript-only test for cache sizes by testing latency at different sizes. works in safer mode.

function cache() {
    const sizesKB = [16, 32, 64, 96, 128, 256, 512, 1024, 2048, 3072, 4096, 8192, 12288, 16384, 20480, 24576, 32768, 49152];
    const results = [];
    const unrollFactor = 8;
    const ops = 8_000_000 / unrollFactor;

    for (let i = 0; i < sizesKB.length; i++) {
        const sizeKB = sizesKB[i];
        const numElements = (sizeKB * 1024) / 4;
        const data = new Uint32Array(numElements);

        for (let j = 0; j < numElements; j++) {
            data[j] = (j + 10007) % numElements;
        }

        let ptr = 0;
        for (let k = 0; k < 100_000; k++) {
            ptr = data[ptr];
        }
        let start = performance.now();
        while (performance.now() === start) { }

        start = performance.now();
        for (let k = 0; k < ops; k++) {
            ptr = data[ptr]; ptr = data[ptr]; ptr = data[ptr]; ptr = data[ptr];
            ptr = data[ptr]; ptr = data[ptr]; ptr = data[ptr]; ptr = data[ptr];
        }
        const end = performance.now();

        results.push({
            Size: sizeKB >= 1024 ? (sizeKB / 1024) + "MB" : sizeKB + "KB",
            "ns": Math.round((end - start) * 1_000_000 / (ops * unrollFactor))
        });
    }
    console.table(results);
}
cache();
1 Like