
# SKCN-MLWE：基于模格MLWE的通用和模块化的密钥协商协议   
-----

   对于 基于MLWE的通用和模块化的密钥协商协议， 我们给出了 SKCN-MLWE-KE-Recommended 和 SKCN-MLWE-PKE-Recommended  算法程序 在 Windows 和 Linux 系统下的实现，
实现代码保存在 参考实现\MLWE-KEX 文件夹中。 下面我们针对基于MLWE的通用和模块化的密钥封装协议 算法程序的安装方法和目录结构进行介绍。

## Windows 版本程序 及目录结构

MLWE 解决方案打包在MLWE-KEX-Windows.zip文件中，解压出MLWE-KEX-Windows目录，该解决方案包含两个子Project，分别是MLWE-KE和MLWE-PKE。

### MLWE-KEX-Windows 目录结构
MLWE-KEX-Windows的目录结构为：

- build 构建程序目录，编译后的文件存于此目录 
- Debug vs2010工程目录 
- ipch vs2010工程目录 
- MLWE-KE 算法MLWE-KE子项目工程目录 
- MLWE-PKE 算法MLWE-PKE子项目工程目录 
- openssl 依赖库openssl的头文件及lib
- src 代码目录，其中包括SKCN-MLWE-KE和SKCN-MLWE-PKE，分别对应两个project MLWE-KE和MLWE-PKE的实现代码。

### 代码文件
------

#### MLWE-KE Project

- [kex_test.c](./src/SKCN-MLWE-KE/kex_test.c) 功能测试代码
- [kex_benchmark.c](./src/SKCN-MLWE-KE/kex_benchmark.c) 基准性能测试代码
- [polynomial.c](./src/SKCN-MLWE-KE/polynomial.c) 
- [io.c](./src/SKCN-MLWE-KE/io.c) 
- [speed.c](./src/SKCN-MLWE-KE/speed.c) 
- [vector.c](./src/SKCN-MLWE-KE/vector.c) 
- [okcn.c](./src/SKCN-MLWE-KE/okcn.c) 
- [rng.c](./src/SKCN-MLWE-KE/rng.c) 
- [main.c](./src/SKCN-MLWE-KE/main.c) 
- [kex.c](./src/SKCN-MLWE-KE/kex.c) 
- [kex_test.c](./src/SKCN-MLWE-KE/kex_test.c) 
- [kex_benchmark.c](./src/SKCN-MLWE-KE/kex_benchmark.c) 
- [vector.h](./src/SKCN-MLWE-KE/vector.h) 
- [polynomial.h](./src/SKCN-MLWE-KE/polynomial.h) 
- [okcn.h](./src/SKCN-MLWE-KE/okcn.h) 
- [io.h](./src/SKCN-MLWE-KE/io.h) 
- [parameter.h](./src/SKCN-MLWE-KE/parameter.h) 
- [rng.h](./src/SKCN-MLWE-KE/rng.h) 
- [kex_api.h](./src/SKCN-MLWE-KE/kex_api.h) 


#### MLWE-PKE Project
- [kex_test.c](./src/SKCN-MLWE-PKE/kex_test.c) 功能测试代码
- [kex_benchmark.c](./src/SKCN-MLWE-PKE/kex_benchmark.c) 基准性能测试代码
- [speed.c](./src/SKCN-MLWE-PKE/speed.c) 
- [polynomial.c](./src/SKCN-MLWE-PKE/polynomial.c) 
- [io.c](./src/SKCN-MLWE-PKE/io.c) 
- [vector.c](./src/SKCN-MLWE-PKE/vector.c) 
- [rng.c](./src/SKCN-MLWE-PKE/rng.c) 
- [okcn.c](./src/SKCN-MLWE-PKE/okcn.c) 
- [main.c](./src/SKCN-MLWE-PKE/main.c) 
- [kex.c](./src/SKCN-MLWE-PKE/kex.c) 
- [vector.h](./src/SKCN-MLWE-PKE/vector.h) 
- [polynomial.h](./src/SKCN-MLWE-PKE/polynomial.h) 
- [okcn.h](./src/SKCN-MLWE-PKE/okcn.h) 
- [io.h](./src/SKCN-MLWE-PKE/io.h) 
- [parameter.h](./src/SKCN-MLWE-PKE/parameter.h) 
- [rng.h](./src/SKCN-MLWE-PKE/rng.h) 
- [kex_api.h](./src/SKCN-MLWE-PKE/kex_api.h) 

 

### 安装运行说明
------
1. 请先安装vs2010,进行目录，双击MLWE-KEX.sln打开工程。
2. 编译生成测试程序MLWE-KE.exe和MLWE-PKE.exe位于build目录下
3. run_benchmark.bat 执行基准性能测试。 



### 测试
------
可执行程序位于build目录下，主要有以下四个可执行程序

- MLWE-KE.exe MLWE-KE 算法测试程序，双击可进行功能测试
- MLWE-PKE.exe MLWE-PKE 算法测试程序，双击可进行功能测试
- 基准性能测试， 需传参数，形式为 time|cpu   num 第一个参数cpu表示测试CPU时钟周期，time表示测试平均耗时， 第二个参数 num 表示测试的次数




------------------------------------------------------------
## Linux 版本程序 及目录结构
 

MLWE 解决方案打包在MLWE-KEX-Linux.tar文件中，解压出MLWE-KEX-Linux目录，该解决方案包含两个子Project，分别是MLWE-KE和MLWE-PKE。

### MLWE 目录结构
MLWE-KEX-Linux的目录结构为：

- SKCN-MLWE-KE 算法MLKE-KE的算法实现
- SKCN-MLKE-PKE 算法MLKE-PKE的算法实现
- log run_benchmark.sh 后的日志文件目录 

### 代码文件
------

#### MLWE-KE 算法文件

- [kex_test.c](./SKCN-MLWE-KE/kex_test.c) 功能测试代码
- [kex_benchmark.c](./SKCN-MLWE-KE/kex_benchmark.c) 基准性能测试代码
- [polynomial.c](./SKCN-MLWE-KE/polynomial.c) 
- [io.c](./SKCN-MLWE-KE/io.c) 
- [speed.c](./SKCN-MLWE-KE/speed.c) 
- [vector.c](./SKCN-MLWE-KE/vector.c) 
- [okcn.c](./SKCN-MLWE-KE/okcn.c) 
- [rng.c](./SKCN-MLWE-KE/rng.c) 
- [main.c](./SKCN-MLWE-KE/main.c) 
- [kex.c](./SKCN-MLWE-KE/kex.c) 
- [kex_test.c](./SKCN-MLWE-KE/kex_test.c) 
- [kex_benchmark.c](./SKCN-MLWE-KE/kex_benchmark.c) 
- [vector.h](./SKCN-MLWE-KE/vector.h) 
- [polynomial.h](./SKCN-MLWE-KE/polynomial.h) 
- [okcn.h](./SKCN-MLWE-KE/okcn.h) 
- [io.h](./SKCN-MLWE-KE/io.h) 
- [parameter.h](./SKCN-MLWE-KE/parameter.h) 
- [rng.h](./SKCN-MLWE-KE/rng.h) 
- [kex_api.h](./SKCN-MLWE-KE/kex_api.h) 


#### MLWE-PKE 算法文件
- [kex_test.c](./SKCN-MLWE-PKE/kex_test.c) 功能测试代码
- [kex_benchmark.c](./SKCN-MLWE-PKE/kex_benchmark.c) 基准性能测试代码
- [speed.c](./SKCN-MLWE-PKE/speed.c) 
- [polynomial.c](./SKCN-MLWE-PKE/polynomial.c) 
- [io.c](./SKCN-MLWE-PKE/io.c) 
- [vector.c](./SKCN-MLWE-PKE/vector.c) 
- [rng.c](./SKCN-MLWE-PKE/rng.c) 
- [okcn.c](./SKCN-MLWE-PKE/okcn.c) 
- [main.c](./SKCN-MLWE-PKE/main.c) 
- [kex.c](./SKCN-MLWE-PKE/kex.c) 
- [vector.h](./SKCN-MLWE-PKE/vector.h) 
- [polynomial.h](./SKCN-MLWE-PKE/polynomial.h) 
- [okcn.h](./SKCN-MLWE-PKE/okcn.h) 
- [io.h](./SKCN-MLWE-PKE/io.h) 
- [parameter.h](./SKCN-MLWE-PKE/parameter.h) 
- [rng.h](./SKCN-MLWE-PKE/rng.h) 
- [kex_api.h](./SKCN-MLWE-PKE/kex_api.h) 


### 安装运行说明
------
#### 编译

- tar MLKE-KEX-Linux.tar 
- cd MLKE-KEX-Linux
- ./makeall.sh 
 

编译后生成文件kex_test与libskcn.so，具体位置如下：

- SKCN-MLWE-KE/kex_test 算法MLWE-KE的测试程序
- SKCN-MLWE-KE/libskcn.so 算法MLWE-KE的动态库
- SKCN-MLWE-PKE/kex_test 算法MLWE-PKE的测试程序
- SKCN-MLWE-PKE/libskcn.so 算法MLWE-PKE的动态库

#### 测试运行

- cd MLKE-KEX-Linux             首先进入程序根目录
- cd SKCN-MLWE-KE/              进入对应的算法程序目录，这里进入SKCN-MLWE-KE程序目录， 如果想运行 SKCN-MLWE-PKE程序 则：cd SKCN-MLWE-PKE/ 
- export LD_LIBRARY_PATH=./     设置环境变量 
- ./kex_test time 100 200       基准性能测试举例，需传入至少两个参数，第一个参数为time或者cpu,第二个参数为测试算法的次数。 这里分别测试100次和200次，并输出耗时(微秒)测试结果。
- ./kex_test                    功能测试，执行并根据提示操作。