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.so、librkcrypto.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