xref: /OK3568_Linux_fs/external/security/librkcrypto/README.md (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun# librkcrypto
2*4882a593Smuzhiyun
3*4882a593Smuzhiyunlibrkcrypto提供基于硬件的算法接口,支持使用DMA的方式对数据进行计算,可用于各种加解密、认证等场景。
4*4882a593Smuzhiyun
5*4882a593Smuzhiyunlibrkcrypto依赖于kernel crypto驱动实现,驱动开发和应用API开发请参考文档`Rockchip_Developer_Guide_Crypto_HWRNG_CN.pdf`。
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun## 版本号查询
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun通过以下方式查询API版本号。
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun- **strings命令查询**
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun```bash
14*4882a593Smuzhiyun# 以linux平台64位为例
15*4882a593Smuzhiyun$ strings /lib64/librkcrypto.so |grep api |grep version
16*4882a593Smuzhiyunrkcrypto api version 1.2.0
17*4882a593Smuzhiyun```
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun- **日志打印**
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun当每个进程首次调用librkcrypto时,会打印版本号
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun```bash
24*4882a593SmuzhiyunRKCRYPTO I[rk_crypto_init, 262]: rkcrypto api version 1.2.0
25*4882a593Smuzhiyun```
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun## 适用芯片平台
28*4882a593Smuzhiyun
29*4882a593SmuzhiyunRK3588 | RK356x | RV1109 | RV1126 | RK3326/PX30 | RK3308 | RV1106/03
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun部分API不适用于部分芯片平台,详见应用开发说明文档。
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun## 版本依赖
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun### V1.2.0
36*4882a593Smuzhiyun
37*4882a593Smuzhiyunkernel-4.19 需更新至以下提交:
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun```shell
40*4882a593Smuzhiyunc255a0aa097a crypto: rockchip: rk3326/px30 add aes gcm support
41*4882a593Smuzhiyun```
42*4882a593Smuzhiyun
43*4882a593Smuzhiyunkernel-5.10 需更新至以下提交:
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun```shell
46*4882a593Smuzhiyun47e85085826d crypto: rockchip: rk3326/px30 add aes gcm support
47*4882a593Smuzhiyun```
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun### V1.1.0
50*4882a593Smuzhiyun
51*4882a593Smuzhiyunkernel-4.19 需更新至以下提交:
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun```shell
54*4882a593Smuzhiyun1e549d833bc3 crypto: rockchip: v2: ahash init/update/final use hardware crypto
55*4882a593Smuzhiyun```
56*4882a593Smuzhiyun
57*4882a593Smuzhiyunkernel-5.10 需更新至以下提交:
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun```shell
60*4882a593Smuzhiyun4d2020372e7e crypto: rockchip: v2: ahash fix hash_algo2name setting error.
61*4882a593Smuzhiyun```
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun若需要使用 otp key 加解密功能,rkbin需更新至以下提交:
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun1. RK3588
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun   ```shell
68*4882a593Smuzhiyun   23ca562 rk3588: bl32: update version to v1.07
69*4882a593Smuzhiyun   ```
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun2. RK356x
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun   ```shell
74*4882a593Smuzhiyun   86e9bb7 rk3568: bl32: update version to v2.07
75*4882a593Smuzhiyun   ```
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun3. RV1109/RV1126
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun   ```shell
80*4882a593Smuzhiyun   42eea81 rv1126: tee: update version to v2.05
81*4882a593Smuzhiyun   ```
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun## 目录说明
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun**demo:** API使用示例
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun**docs:** 应用开发说明文档
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun**include:** 头文件
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun**src:** 用户空间的驱动及API实现
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun**test:** API测试代码
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun**third_party:** 第三方开源代码
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun## 编译说明
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun### Android
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun- **编译lib、test、demo**
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun```bash
104*4882a593Smuzhiyun# 在android工程目录下执行
105*4882a593Smuzhiyun$ source build/envsetup.sh
106*4882a593Smuzhiyun$ lunch rk3588_s-userdebug    # 以RK3588为例
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun# cd 到librkcypto目录,执行
109*4882a593Smuzhiyun$ mm
110*4882a593Smuzhiyun```
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun编译成功后,根据配置的芯片平台编译出32-bit或64-bit目标文件librkcrypto.so、librkcrypto_test、librkcrypto_demo。Android编译日志将打印目标文件所在的目录。
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun### Linux
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun- **编译lib、test**
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun```bash
119*4882a593Smuzhiyun# 在linux工程中的librkcrypto目录下执行
120*4882a593Smuzhiyun$ ./build.sh       # 编译32-bit和64-bit
121*4882a593Smuzhiyun$ ./build.sh 32    # 只编译32-bit
122*4882a593Smuzhiyun$ ./build.sh 64    # 只编译64-bit
123*4882a593Smuzhiyun```
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun编译成功后,在librkcrypto/out/target目录生成目标文件librkcrypto.solibrkcrypto.a、librkcrypto_test。
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun- **编译demo**
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun```bash
130*4882a593Smuzhiyun# 在librkcrypto工程目录下执行
131*4882a593Smuzhiyun$ cd demo
132*4882a593Smuzhiyun$ make 32    # 或 $ make,只编译32-bit
133*4882a593Smuzhiyun$ make 64    # 只编译64-bit
134*4882a593Smuzhiyun$ make clean # 清除目标文件
135*4882a593Smuzhiyun```
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun编译成功后,在librkcrypto/demo目录生成目标文件librkcrypto_demo。
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun## 使用说明
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun- **头文件**
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun以下是外部程序调用librkcrypto API所需的头文件。
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun```c
146*4882a593Smuzhiyun#include "rkcrypto_common.h"     // 通用
147*4882a593Smuzhiyun#include "rkcrypto_core.h"       // 调用cipher、hash、hmac等接口时引用
148*4882a593Smuzhiyun#include "rkcrypto_mem.h"        // 调用支持dma_fd的接口时引用
149*4882a593Smuzhiyun#include "rkcrypto_otp_key.h"    // 调用otp_key相关接口时引用
150*4882a593Smuzhiyun#include "rkcrypto_random.h"     // 调用随机数接口时引用
151*4882a593Smuzhiyun```
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun- **库文件**
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun  `librkcrypto.so`
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun  `librkcrypto.a` (linux平台)
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun- **日志打印**
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun  rkcrypto的日志等级划分如下:
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun  等级1 - TRACE_ERROR:错误信息
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun  等级2 - TRACE_INFO:常用信息,例如版本号信息等,默认是等级2
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun  等级3 - TRACE_DEBUG:一般的调试信息
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun  等级4 - TRACE_VERBOSE:冗长的调试信息
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun  可以通过以下方式,按需设置日志等级,设置后将打印当前和低于当前等级的日志,注意设备重启后默认是等级2:
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun  - 使用rkcrypto提供的API:
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun  ```c
176*4882a593Smuzhiyun  RK_RES rkcrypto_set_trace_level(enum RKCRYPTO_TRACE_LEVEL level);
177*4882a593Smuzhiyun  ```
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun  - 使用指令:
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun  ```shell
182*4882a593Smuzhiyun  # Android
183*4882a593Smuzhiyun  setprop vendor.rkcrypto.trace.level 1/2/3/4
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun  # Linux
186*4882a593Smuzhiyun  export rkcrypto_trace_level=1/2/3/4
187*4882a593Smuzhiyun  ```
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun- **应用开发说明文档**
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun  `Rockchip_Developer_Guide_Crypto_HWRNG_CN.pdf`
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun## FAQ
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun- **编译链依赖**
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun  CMake中默认编译链为gcc 10.3版本,即`gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf`和`gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu`。
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun  若没有该编译链版本,编译时会报类似如下错误:
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun  ```makefile
202*4882a593Smuzhiyun  make[2]: librkcrypto/../../prebuilts/gcc/linux-x86/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-gcc: Command not found
203*4882a593Smuzhiyun  ```
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun  可以修改CMakeLists.txt中的编译链路径和版本:
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun  ```makefile
208*4882a593Smuzhiyun  set (TOOLCHAIN_PREBUILTS "${CMAKE_CURRENT_SOURCE_DIR}/../../prebuilts")
209*4882a593Smuzhiyun  set (TOOLCHAIN_PATH_ARM32 "gcc/linux-x86/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin")
210*4882a593Smuzhiyun  set (TOOLCHAIN_PATH_AARCH64 "gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin")
211*4882a593Smuzhiyun  ```
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun  若运行时出现如下报错,则是编译链GLIBC版本与设备上GLIBC版本不一致,请修改编译链版本或者修改设备GLIBC版本。
214*4882a593Smuzhiyun
215*4882a593Smuzhiyun  ```shell
216*4882a593Smuzhiyun  version 'GLIBC_2.29' not found (required by /lib/librkcrypto.so)
217*4882a593Smuzhiyun  ```
218*4882a593Smuzhiyun
219