/ CRYPTOGRAPHY

DockerではじめるHElib【Windows+Docker+HElib+VS Code】

FHEのライブラリ「HElib」の環境をWindows+Docker+HElib+VSCodeの構成で構築する.

Requirement

  • WSL2
  • Windows10 Proやenterprise,EducationなどHyper-Vが使える環境

WSL2有効化

  • 管理者としてPowershellを開いて以下のコマンドを実行
$ dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
$ dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all
$ wsl --set-default-version 2

Hyper-V有効化

  • Windows ボタンを右クリックし、[アプリと機能] を選択.
  • 右側の関連する設定にある [プログラムと機能] を選択.
  • [Windows の機能の有効化または無効化] を選択.
  • [Hyper-V] を選択して、 [OK] をクリック.
    winbox
    参考:Windows 10 での Hyper-V の有効化 | Microsoft Docs

Docker Desktop for Windowsインストール

  • Docker Desktop for Windowsのインストーラをダウンロードする.
  • ダウンロード後,誘導に従ってDocker Desktopをインストールする.結構時間がかかる.
  • インストール後,Close and restartでWindowsを再起動する.
  • 再起動後にDocker Desktopを起動する.WSL2の設定を正常にできていない場合は以下のようなエラーが出るので上の章を参考に設定を再確認する.
    wsl2error

Remote Developmentインストール

VSCodeの拡張機能「Remote Container」が非常に使いやすいので,今回はこれをパックに含む拡張機能「Remote Development」を使って開発環境を整える.

  • VSCode上でCtrl+Shift+Xでストアを開いて「Remote Development」をインストール.念のためVSCodeを再起動する.

HElibインストール

  • dockerコマンドが使えるかPowershell上で以下のコマンドで確認する.
$ docker ps
(以下出力結果)
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

エラー出なく,このような表示が出ていれば問題ない.

  • HElibをGitHubからgit cloneなりDownload ZIPからダウンロードして解凍するなりしてローカルで操作できるようにする.
  • 上でダウンロードしたDockerfileのあるディレクトリ内で以下のコマンドをPowerShellで実行してDockerfileからimageを構築する.
$ docker build -t user1/helib ./
(以下出力結果)
[+] Building 698.8s (9/9) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                                                  0.0s 
 => => transferring dockerfile: 32B                                                                                                                                                                   0.0s 
 => [internal] load .dockerignore                                                                                                                                                                     0.0s 
 => => transferring context: 35B                                                                                                                                                                      0.0s 
 => [internal] load metadata for docker.io/library/ubuntu:18.04                                                                                                                                       2.9s 
 => [auth] library/ubuntu:pull token for registry-1.docker.io                                                                                                                                         0.0s 
 => [internal] load build context                                                                                                                                                                    69.6s 
 => => transferring context: 3.19GB                                                                                                                                                                  69.6s 
 => CACHED [1/3] FROM docker.io/library/ubuntu:18.04@sha256:fd25e706f3dea2a5ff705dbc3353cf37f08307798f3e360a13e9385840f73fb3                                                                          0.0s 
 => [2/3] COPY ./ /root/HElib/                                                                                                                                                                       38.3s 
 => [3/3] RUN apt update &&     apt install -y build-essential wget git cmake m4 libgmp-dev file &&     cd ~ &&     wget https://www.shoup.net/ntl/ntl-11.4.1.tar.gz &&     tar --no-same-owner -x  576.8s 
 => exporting to image                                                                                                                                                                               10.8s 
 => => exporting layers                                                                                                                                                                              10.8s 
 => => writing image sha256:d670141249827cca87e37d871f749b2cc43351c7833a686b43a267df2d35ef44                                                                                                          0.0s 
 => => naming to docker.io/user1/helib    

ubuntu18.04等をダウンロードしたりしてそれなりに時間がかかるので気長に待つこと.

[補足]
user1の部分は,Docker Hubのユーザ名にしておくと今後Docker Hubにpushできるようになる.ユーザ名以外にしているとdenied: requested access to the resource is deniedというエラーが出る可能性がある.これはdocker image tag 元のタグ名 user1/helibで解決できる.

  • imageができているか以下のコマンドで確認する.
$  docker images
(以下出力結果)
REPOSITORY     TAG       IMAGE ID       CREATED              SIZE
user1/helib    latest    d67014124982   About a minute ago   4.13GB

SIZEなどは異なる場合がある.
Docker Desktopでも正常にbuildできているか確認する.
dockerimage.png

  • Docker Desktop上からコンテナを作成する.
    今作成したimageの右にあるRUNをクリックしてoptional SettingsからContainer Nameを指定して作成することを推奨.今回はHElib_testとする. newcontainer.png
    Containers / Apps一覧にコンテナが作成されたことを確認する.
    container_test.png
    コンテナ一覧は以下のコマンドでも確認できる.
$ docker ps
(以下出力結果)
CONTAINER ID   IMAGE                COMMAND       CREATED         STATUS         PORTS     NAMES
0c92ea6b5769   user1/helib:latest   "/bin/bash"   3 minutes ago   Up 3 minutes             HElib_test

HElibコンテナ起動

  • VSCode上で左のアイコン一覧からRemote Explorerをクリックして,先ほど作成したコンテナをAttach to Containerdockerattach.png 上図のuser1/helib:latest(/HElib_test)の下のようにアイコンに●がついていない場合はコンテナがactiveでないので,Docker DesktopのContainers / Apps一覧からSTARTし,$ docker psにてactiveになったか確認する. helibroot.png正常に実行できていればコンテナを起動でき,VSCode上からbashを叩けるようになる.

HElibを試す!

いよいよHElibを触っていく.今回はHElib/examplesにあるサンプルコードをmakeして実行してみる.

root@0c92ea6b5769:~# cd /root/HElib/examples/
root@0c92ea6b5769:~/HElib/examples# mkdir build
root@0c92ea6b5769:~/HElib/examples# cd build/
root@0c92ea6b5769:~/HElib/examples/build# cmake [-Dhelib_DIR=/root/HElib/share/cmake/helib] /root/HElib/examples/ ..
-- The CXX compiler identification is GNU 7.5.0
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /root/HElib/examples/build
root@0c92ea6b5769:~/HElib/examples/build# make -j 16
Scanning dependencies of target BGV_packed_arithmetic
Scanning dependencies of target BGV_country_db_lookup
Scanning dependencies of target BGV_binary_arithmetic
[ 16%] Building CXX object BGV_country_db_lookup/CMakeFiles/BGV_country_db_lookup.dir/BGV_country_db_lookup.cpp.o
[ 50%] Building CXX object BGV_binary_arithmetic/CMakeFiles/BGV_binary_arithmetic.dir/BGV_binary_arithmetic.cpp.o
[ 50%] Building CXX object BGV_packed_arithmetic/CMakeFiles/BGV_packed_arithmetic.dir/BGV_packed_arithmetic.cpp.o
[ 66%] Linking CXX executable ../bin/BGV_packed_arithmetic
[ 66%] Built target BGV_packed_arithmetic
[ 83%] Linking CXX executable ../bin/BGV_binary_arithmetic
[ 83%] Built target BGV_binary_arithmetic
[100%] Linking CXX executable ../bin/BGV_country_db_lookup
[100%] Built target BGV_country_db_lookup
root@0c92ea6b5769:~/HElib/examples/build# cd bin/
root@0c92ea6b5769:~/HElib/examples/build/bin# ls
BGV_binary_arithmetic  BGV_country_db_lookup  BGV_packed_arithmetic
root@0c92ea6b5769:~/HElib/examples/build/bin# ./BGV_binary_arithmetic 

*********************************************************
*            Basic Binary Arithmetic Example            *
*            ===============================            *
*                                                       *
* This is a sample program for education purposes only. *
* It attempts to demonstrate the use of the API for the *
* binary arithmetic operations that can be performed.   *
*                                                       *
*********************************************************
Initialising context object...
Building modulus chain...
m = 4095, p = 2, phi(m) = 1728
  ord(p) = 12
  normBnd = 2.25463
  polyNormBnd = 22.5545
  factors = [3 5 7 13]
  generator 2341 has order (== Z_m^*) of 6
  generator 3277 has order (== Z_m^*) of 4
  generator 911 has order (== Z_m^*) of 6

Security: 24.2499
Creating secret key...
Number of slots: 144
Pre-encryption data:
a = 3967
b = 56631
c = 8570
a*b+c = 224663747
a+b+c = 69168
popcnt(a) = 11
root@0c92ea6b5769:~/HElib/examples/build/bin# code /root/HElib/examples/BGV_binary_arithmetic/BGV_binary_arithmetic.cpp 

サンプルコードを動かせた.

まとめ

今回はWindows+Docker+HElib+VSCodeの構成でHElibの環境構築を行った.以前winとubuntu20.04をデュアルブートしてubuntu内にHElib環境を構築したことがあったが,依存ライブラリを探してくるのが大変だったり,探してきても新しいバージョンではうまく動作しないライブラリがあったり,依存ライブラリが依存するライブラリがどれだか分かりにくかったり,まーーーーーーーーーーーーーー面倒だった.
それに,本当にエラーが起きないか怪しかったので,Dockerfileから勝手に必要なファイル群を持ってきて環境構築してくれるのは本当にありがたい.

これでやっとコーディングに取り掛かれる…

teahat

teahat

I'm t3ahat.

Read More

Tags

Latest Posts