Как победить квантовый компьютер с помощь 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