# 基于LWR的通用和模块化的密钥协商协议


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


### liboqs概述
------

liboqs是一个基于C语言的抗量子密码学算法实现库。

### 依赖
------
liboqs的编译依赖于几个基本工具：`autoconf`, `automake` ,`libtool`。在Ubuntu环境下可以接通过`sudo apt-get install autoconf automake libtool`进行安装。

> 注意：为了程序实现的方便，我们将基于LWE和LWR的方案在同一个项目中进行了实现，但这并不影响代码的运行，并且只需要在运行时指定参数就可以运行不同的方案。

### 目录结构说明
-------

- src目录为算法的源代码目录，里面包括每个算法名称命名的子目录以及测试和基本工具目录：

  - common目录下的文件包括一些公用的函数
  - crypto目录下主要是基本的密码学工具
  - kex目录中包含密钥交换的基本函数定义
  - kex_api中包含的是竞赛要求的接口定义
  - kex_lwe_frodo目录下包含frodo方案的代码实现
  - kex_lwe_okcn目录下包含基于lwe的密钥交换方案的代码实现
  - kex_lwr_okcn目录下包含基于lwr的密钥交换的方案的代码实现
  - kex_lwe_akcn目录下包含基于lwe的密钥交换方案的代码实现
  - kex_lwr_akcn目录下包含基于lwr的密钥交换的方案的代码实现
  - test目录下包含性能测试相关的程序
  - benchmark为性能测试目录
- include包含的是所有的头文件
- config和m4目录下包含的是编译的环境配置文件
- docs目录下包含的是每个算法的说明文件

### 源代码功能说明

#### 目录 common下主要文件列表
- common.c 内存相关操作

#### 目录 crypto 下主要文件列表 

- aes.c ase加密函数实现
- rand.c  随机函数实现
- rand_urandom_aesctr.c 随机生成特定数据结构oqs_rand_urandom_aesctr_ctx
- rand_urandom_chacha20.c 随机生成特定数据结构OQS_RAND_urandom_chacha20_ctx
- sha3.c 第三代安全散列算法的实现



#### 目录 kex_api 下主要文件列表

* kex_api.c 根据竞赛要求实现的接口

#### 目录 kex_lwe_frodo下主要文件列表

* kex_lwe_frodo.c frodo方案的实现
* kex_lwe_frodo_macrify.c 相关数学操作的实现
* lwe.c 基于lwe问题的底层数学操作的实现
* lwe_macrify.c  相关数学操作的实现
* lwe_noise.c 取样操作的实现

#### 目录 kex_lwe_okcn下主要文件列表

* kex_lwe_okcn.c 基于lwe问题的okcn方案的实现
* kex_lwe_okcn_macrify.c 相关数学操作的实现
* local.c 类型转换操作的实现
* lwe_okcn_macrify.c 相关数学操作的实现
* lwe_okcn_noise.c 取样操作的实现

#### 目录 kex_lwr_okcn下主要文件列表

* kex_lwe_okcn.c 基于lwr问题的okcn方案的实现
* kex_lwr_okcn_macrify.c 相关数学操作的实现
* lwr.c 类型转换操作的实现
* lwr_macrify.c 相关数学操作的实现
* lwr_noise.c 取样操作的实现

#### 目录 kex_lwe_akcn下主要文件列表

* kex_lwe_akcn.c 基于lwe问题的okcn方案的实现
* kex_lwe_akcn_macrify.c 相关数学操作的实现
* local.c 类型转换操作的实现
* lwe_okcn_macrify.c 相关数学操作的实现
* lwe_okcn_noise.c 取样操作的实现

#### 目录 kex_lwr_akcn下主要文件列表

* kex_lwe_akcn.c 基于lwr问题的okcn方案的实现
* kex_lwr_akcn_macrify.c 相关数学操作的实现
* lwr.c 类型转换操作的实现
* lwr_macrify.c 相关数学操作的实现
* lwr_noise.c 取样操作的实现

#### 目录 test下主要文件列表
* kex_test.c 主要的测试代码
* util.c 辅助测试功能代码

#### 目录 kex下主要文件列表
* kex.c 基于okcn的密钥交换的的具体实现
* kex_test.c 完整性测试和性能测试的实现

#### 目录benchmark下文件列表
- get_time.c            linux下获取当前系统时间、CPU时钟周期等实现
- get_time.win32.c      windows下获取当前系统时间
- myadd.asm windows 下获取CPU时钟周期的实现 
- kex_benchmark.c       测试每个算法过程的性能  
#### 目录 bin 下主要文件列表
- kex.lib liboqs生成的静态库
- kex_test.exe 功能测试程序 
- kex_benchmark.exe 基准性能测试程序
- run_benchmark.bat 基准性能测试脚本
- report.sh 根据run_benchmark.bat 生成的日志抽取并按格式生成报告文本
- report.py 数据处理脚本，将report.sh的输出日志生成xls文件
- run_case.bat case测试脚本


## Windows下的安装与测试

### 环境依赖
运行环境需要下载[VC++2010](https://download.microsoft.com/download/9/3/F/93FCF1E7-E6A4-478B-96E7-D4B285925B00/vc_redist.x86.exe)和[VC++2015](https://download.microsoft.com/download/5/B/C/5BC5DBB3-652D-4DCE-B14A-475AB85EEF6E/vcredist_x86.exe)运行环境支持，如果已经安装了Windows Microsoft Visual Studio系列开发工具，可以不用下载。

### 编译安装
程序实现代码打包在LWR_OKCN_windows.zip 文件中， 解压后得到liboqs文件夹。
使用 Microsoft Visual Studio 2010打开 liboqs/build/vs2010/kex/kex.sln，VS 2010会自动的加载好项目所有文件，直接进行编译即可。编译的文件liboqs.a、kex_test.exe和kex_benchmark.exe生成在bin目录下。


### 运行测试
1. 进行到bin目录
2. 双击kex_text.exe根据选项进行功能测试
3. 双击 run_benchmark.bat进行基准性能测试，测试结果日志输出到 benchmark_cpu.log和 benchmark_time.log中。



## Ubuntu下的安装与测试

### 安装依赖工具和库


- sudo apt-get install autoconf automake libtool


### 编译代码

程序实现代码打包在LWR_OKCN_linux.zip 文件中， 解压后得到Linux 文件夹。 进入此 Linux 文件夹，执行如下命令：

- autoreconf -i
- ./configure
- make clean 
- make all


编译完成之后，会在当前目录下生成两个可执行程序分别是`kex_test`,`kex_benchmark` 和 `liboqs.a` 。

### 运行测试
运行功能测试


- ./kex_test
- 根据选项选择相应的功能进行测试


运行基准性测试

- ./run_benchmark.sh
- 测试结果日志输出到 benchmark_cpu.log和 benchmark_time.log中。


