Как победить квантовый компьютер с помощь WebAssembly?

XBSoftware

{
Тема: Как победить квантовый компьютер с помощь WebAssembly?,
Спикер: Владимир Дашукевич,
Компания: XBSoftware,
Конференция: HolyJS
}

Вопросы на сегодня:

  1. Насколько надежны современные криптографические алгоритмы, используемые в браузерах?
  2. Как эту ситуацию может изменить квантовый компьютер?
  3. Как мы можем повлиять на это?

Криптография обеспечивает:

  1. Конфиденциальность
  2. Целостность информации
  3. Аутентифика́ция

Алгоритм шифрования RSA

  1. Выбираем два простых числа: p = 5, q = 13

ОЧЕНЬ ДОЛГО

RSA-2048

ECDHE

Выводы

  1. Алгоритмы асимметричного шифрования играют важнейшую роль в шифровании данных

Питер Шор

Алгоритм Шора

Алгоритм Шора

Квантовый компьютер

Суперпозиция

1/√2 |0> + 1/√2 |1>

1/√2|0> + 1/√2|1>

Бит и кубит

Гейты (Gate)

Современный квантовый компьютер

Постквантовая криптография

А стоит ли нам готовиться?

США

PQCrypto

Постквантовая криптография

Канада

D-Wave

Россия

Беларусь

Выводы:

SIDH

Диффи Хеллман

Схема обмена ключей:

WebAssembly

Что такое WebAssembly

  1. Это низкоуровневый байт-код, предназначенный для исполнения в браузере.

LLVM

C/C++ -> IR -> WASM

C/C++ -> IR -> WASM

C/C++ -> asm.js -> WASM

Binaryen

WebAssembly материалы:

  1. WebAssembly Demystified
  2. WebAssembly In Action
  3. Compiling for the Web with WebAssembly (Google I/O '17)
  4. Practical WebAssembly

Как скомпилировать код для WebAssembly

  1. Скачать Emscripten
            fetch("fun.wasm").then(response =>
              	response.arrayBuffer()
            ).then(bytes =>
            	WebAssembly.instantiate(bytes, importObject)
            ).then(instance =>
            	instance.exports.exported_func();
            )
        
            fetch("fun.wasm").then(response =>
              	response.arrayBuffer()
            ).then(bytes =>
            	WebAssembly.instantiate(bytes, importObject)
            ).then(instance =>
            	instance.exports.exported_func();
            )
        
            fetch("fun.wasm").then(response =>
              	response.arrayBuffer()
            ).then(bytes =>
            	WebAssembly.instantiate(bytes, importObject)
            ).then(instance =>
            	instance.exports.exported_func();
            )
        
            fetch("fun.wasm").then(response =>
              	response.arrayBuffer()
            ).then(bytes =>
            	WebAssembly.instantiate(bytes, importObject)
            ).then(instance =>
            	instance.exports.exported_func();
            )
        

Failed!

Проблемы компиляции в WebAssembly

Типы данных

WebAssembly Spec

WebAssembly.Memory

            let m = new WebAssembly.Memory({initial:10, maximum:100});
            var i32 = new Uint32Array(instance.exports.mem.buffer);
            for (var i = 0; i < 10; i++) {
              i32[i] = i;
            }
        

Проблемы компиляции в WebAssembly

  1. С - язык со строгой статической типизацией
  2. Сборщик мусора и управление памятью
  3. Указание публичных методов нашего модуля

Сборщик мусора

            let a = [];
            let b = [1,2,3,4];
            let c = [{}, true, 3, "hello"];
            let d = { key1: 1, key2: c};
        
            int main() {
            	int *ptr_one;
            	ptr_one = (int *)malloc(sizeof(int));
            	free(ptr_one);
            	return 0;
            }
        

Способы управления памятью в WebAssembly

  1. WebAssembly.Memory.prototype.grow()
  2. Реализации heap на С скомпелированные в WASM
  3. Зарание выставить память в exports
  4. Emscripten: _free и _malloc

Проблемы компиляции в WebAssembly

  1. С - язык со строгой статической типизацией
  2. Сборщик мусора и управление памятью
  3. Указание публичных методов нашего модуля (main функция)

Вызов WebAssembly из JS

            fetch("fun.wasm").then(response =>
              	response.arrayBuffer()
            ).then(bytes =>
            	WebAssembly.instantiate(bytes, importObject)
            ).then(instance =>
            	instance.exports.exported_func();
            )
        

WebAssembly.Table

            var tbl = new WebAssembly.Table({
            		initial:2, element:"anyfunc"
            });
            console.log(tbl.length); // "2"
            console.log(tbl.get(0)()); // результат вызова 1 функции
            console.log(tbl.get(1)()); // результат вызова 2 функции
        
            var tbl = new WebAssembly.Table({
            		initial:2, element:"anyfunc"
            });
            console.log(tbl.length); // "2"
            console.log(tbl.get(0)()); // результат вызова 1 функции
            console.log(tbl.get(1)()); // результат вызова 2 функции
        
            var tbl = new WebAssembly.Table({
            		initial:2, element:"anyfunc"
            });
            console.log(tbl.length); // "2"
            console.log(tbl.get(0)()); // результат вызова 1 функции
            console.log(tbl.get(1)()); // результат вызова 2 функции
        

Экспорт функций из C

  1. Перечислить все в EXPORTED_FUNCTIONS параметре (cwrap, ccall, _secret)
  2. Использовать EMSCRIPTEN_KEEPALIVE дерективы (rust: #[no_mangle])
  3. Использовать конструкцию extern "C"

Проблемы компиляции в WebAssembly

  1. С - язык со строгой статической типизацией
  2. Сборщик мусора и управление памятью
  3. Указание публичных методов нашего модуля

Все шаги:

Failed!

Сервер

Запуск SIDH на сервере:

  1. Написать сервер на С

N-API

Адаптер для N-API

  1. Все работает в "отдельном" V8: napi_env

Выводы:

Ссылки:

Раунд!

Ваши вопросы:

Facebook: dashukevich.vova
Twitter: life__777