---
title: 毕昇JDK 8 KAEProvider 易用性增强介绍-官方技术文章-鲲鹏社区
description: 本文主要对毕昇JDK 8 KAEProvider 易用性增强功能、测试用例代码及新增属性配置进行介绍。
keywords: JDK,毕昇,KAEProvider,易用性增强介绍,官方技术文章,鲲鹏社区,背景,新增功能介绍
url: https://www.hikunpeng.com/developer/techArticles/20230818-2?envFlag=1
section: (其他)
---

# 毕昇JDK 8 KAEProvider 易用性增强介绍-官方技术文章-鲲鹏社区

URL: https://www.hikunpeng.com/developer/techArticles/20230818-2?envFlag=1
描述: 本文主要对毕昇JDK 8 KAEProvider 易用性增强功能、测试用例代码及新增属性配置进行介绍。
关键词: JDK,毕昇,KAEProvider,易用性增强介绍,官方技术文章,鲲鹏社区,背景,新增功能介绍

官方技术文章 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles)

毕昇JDK 8 KAEProvider 易用性增强介绍

毕昇JDK 8 KAEProvider 易用性增强介绍

javajdk

发表于 2022/12/09

0

## 背景

KAE（Kunpeng Accelerate Engine）加解密是鲲鹏处理器提供的硬件加速方案，可以显著降低处理器消耗，提高处理器效率。毕昇 JDK 基于 JCA 框架，为用户提供使用 KAE 来进行加解密的 KAEProvider，用户只需要在 java.security 文件中进行配置，或者简单修改代码即可使用 KAE 带来的加速效果，使用方便，更多的 KAEProvider 介绍可以参考 《毕昇 JDK8 支持鲲鹏硬件加解密特性详解和使用介绍》。目前 KAEProvider 对于 kae openssl 引擎支持较好，对于其他的 openssl 引擎（例如 uadk_engine [1] ）支持还有待完善。KAEProvider 先前版本存在如下待优化点：

1. kaeprovider.conf 文件不支持用户自定义路径。

2. kae 引擎加载日志不支持用户自定义路径。

3. KAEProvider 将 openssl 引擎名称固定为 kae，无法直接使用其他 openssl 引擎（如uadk_engine）。

4. uadk_engine 引擎编译时未链接 libcryto.so，执行 ENGINE_by_id 函数过程中找不到 libcryto 相关函数符号，导致获取 uadk_engine 引擎失败。

5. KAEProvider 实现的每个算法固定使用 openssl 软算或使能 KAE 硬件加速其中的一种。以 AES 算法为例，openssl 软算性能比硬件加速高，目前 KAEProvider 实现的 AES 固定使用 openssl 软算，随着硬件升级以及硬件算法优化，当 AES 硬件加速效果比软算性能高时，用户使用 AES 进行加解密时无法切换到 KAE 硬件加速。

6. 不同引擎支持的硬件加速算法不同，kae 支持的算法[2]和 uadk 支持的算法[3]不一样，kae 引擎不支持 SHA256 算法，而 uadk_engine 引擎支持。由于 KAEProvider 实现的 SHA256 算法固定使用 openssl 软算，用户在使用 uadk_engine 引擎时无法使用硬件加速功能。

7. 使用 SM4 算法加密或解密 MappedByteBuffer 数据时，每次只能处理 4096 字节数据，数据量太小，KAE 硬件加速效果不明显。

## 新增功能介绍

### 1. 配置 KAEProvider 调试日志

增强JDK原有的 java.security.debug 系统属性，将其值配置为 kae 时，打印 KAEProvider 调试日志，方便用户开发调试。

```bash
java -Djava.security.debug=kae ProviderTest
```

### 2. 配置 kaeprovider.conf 路径

原先 kaeprovider.conf 存放在 jre/lib/ext 目录，本次易用性增强变更路径为 jre/lib 目录，同时新增系统属性 kae.conf，支持用户自定义 kaeprovider.conf 路径。

```bash
java -Djava.security.debug=kae -Dkae.conf=/home/user/kaeprovider.conf ProviderTest
```

### 3. 配置引擎加载日志路径

新增属性 kae.log.file，支持用户自定义引擎加载日志。

（1）引擎加载日志路径

```bash
java -Djava.security.debug=kae -Dkae.log=true -Dkae.log.file=/home/user/logs/kae.log ProviderTest
```

引擎加载日志解读

| 日志 | 描述 |
| --- | ---|
| uadk_engine engine  was found | 表示使用的是 uadk_engine |
| Non-KAEProvider | 表示打印的算法不使用 KAEProvider，而是使用 JDK 实现的算法 |
| KAEProvider | 表示打印的算法使用 KAEProvider |
| Use openssl soft  calculation | 表示打印的算法使用 openssl 软算 |
| enable KAE  hardware acceleration | 表示使用鲲鹏硬件加速 |

```bash
java -Dkae.log=true -Dkae.log.file=/home/xiezhaokun/logs/kae.log -Dkae.engine.id=uadk_engine -Dkae.libcrypto.useGlobalMode=true -Dkae.md5=false  ProviderTest
```

### 4. 指定 openssl 引擎 id

新增属性 kae.engine.id，支持用户指定 openssl 引擎 id。新增属性 kae.libcrypto.useGlobalMode 支持用户配置加载 libcrypto 使用是 dlopen RTLD_GLOBAL 模式还是 RTLD_LOCAL 模式。dlopen 的 RTLD_GLOBAL 模式和 RTLD_LOCAL 模式说明可以参考dlopen(3) — Linux manual page[4]。

```bash
java -Dkae.log=true -Dkae.log.file=/home/xiezhaokun/logs/kae.log -Dkae.engine.id=uadk_engine -Dkae.libcrypto.useGlobalMode=true   ProviderTest
```

### 5. 配置是否使能 KAE 引擎硬件加速

新增属性 kae.[algorithm].useKaeEngine 开启或禁用某类算法使用硬件加速，其中 algorithm 为 digest、aes、sm4、hmac、rsa、dh、ec。新增属性 kae.engine.disabledAlgorithms 批量禁用某些特定算法使用硬件加速。

（1）默认情况

```bash
java -Dkae.log=true -Dkae.log.file=/home/xiezhaokun/logs/kae.log -Dkae.engine.id=uadk_engine -Dkae.libcrypto.useGlobalMode=true  ProviderTest
```

（2）通过 kae.[algorithm].useKaeEngine 属性开启或禁用某类算法

例如：禁用摘要算法使用硬件加速、使能hmac算法使用硬件加速

```bash
java -Dkae.log=true -Dkae.log.file=/home/xiezhaokun/logs/kae.log -Dkae.engine.id=uadk_engine -Dkae.libcrypto.useGlobalMode=true -Dkae.digest.useKaeEngine=false -Dkae.hmac.useKaeEngine=true  ProviderTest
```

（3）通过 kae.engine.disabledAlgorithms 属性禁用某些特定算法使用硬件加速

例如：禁用md5、sm3算法使用硬件加速

```bash
java -Dkae.log=true -Dkae.log.file=/home/xiezhaokun/logs/kae.log -Dkae.engine.id=uadk_engine -Dkae.libcrypto.useGlobalMode=true -Dkae.engine.disabledAlgorithms="md5,sm3"  ProviderTest
```

### 6. 配置 SM4 算法每次处理 MappedByteBuffer 数据块大小

用户使用 SM4 算法加密或解密 MappedByteBuffer 数据时，每次只能处理 4096 字节数据。本次易用性增强新增属性 kae.sm4.maxChunkSize，支持用户自定义使用 SM4 加密或解密 MappedByteBuffer 数据时每次处理的数据块大小。

```bash
java -Djava.security.debug=kae  -Dkae.sm4.maxChunkSize=65536  SM4Test
```

## 测试用例代码

ProviderTest.java

```bash
import org.openeuler.security.openssl.KAEProvider;
public class ProviderTest {
 public static void main(String[] args) {
  new KAEProvider();
 }
}
```

SM4Test.java

```bash
import org.openeuler.security.openssl.KAEProvider;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.ByteBuffer;
import java.security.Security;

public class SM4Test {
 private static byte[] sourceBytes = "test".getBytes();
 static SecretKeySpec secretKey = new SecretKeySpec("sm4EncryptionKey".getBytes(), "SM4");

 public static void main(String[] args) throws Exception {
  Security.insertProviderAt(new KAEProvider(), 1);
  ByteBuffer input = ByteBuffer.allocateDirect(sourceBytes.length);
  input.put(sourceBytes);
  input.flip();
  ByteBuffer output = ByteBuffer.allocateDirect(sourceBytes.length + 16);
  Cipher cipher = Cipher.getInstance("SM4");
  cipher.init(Cipher.ENCRYPT_MODE, secretKey);
  cipher.update(input, output);
  cipher.doFinal();
  output.clear();
  input.clear();
 }
}
```

## 属性配置一览表

原先的KAEProvider只支持kaeprovider.conf属性配置，本次易用性增强新增支持系统属性配置功能。

### 1. kaeprovider.conf 属性

（1）历史版本支持的属性

kae.[algorithm] 、kae.log 属性为 8u342 之前版本支持的属性，新版本也支持。kae.[algorithm] 属性配置某个算法是否使用 KAEProvider，true 表示使用 KAEProvider ，false 表示使用 JDK 软算。kae.log 属性用于配置是否开启引擎加载的日志记录，具体描述见如下表格：

| 属性名 | 值类型 | 默认值 | 描述 |
| --- | --- | --- | ---|
| kae.md5 | boolean | true | 配置 md5 是否使用 KAEProvider |
| kae.sha256 | boolean | true | 配置 sha256 是否使用 KAEProvider |
| kae.sha384 | boolean | true | 配置 sha384 是否使用 KAEProvider |
| kae.sm3 | boolean | true | 配置 sm3 是否使用 KAEProvider |
| kae.rsa | boolean | true | 配置 rsa 是否使用 KAEProvider |
| kae.aes | boolean | true | 配置 aes 是否使用 KAEProvider |
| kae.sm4 | boolean | true | 配置 sm4 是否使用 KAEProvider |
| kae.hmac | boolean | true | 配置 hmac 是否使用 KAEProvider |
| kae.dh | boolean | true | 配置 dh 是否使用 KAEProvider |
| kae.ec | boolean | true | 配置 ec 是否使用 KAEProvider |
| kae.log | boolean | true | 配置是否开启引擎加载的日志记录 |

（2）本次易用性增强新增的属性

kae.[algorithm].useKaeEngine 属性配置某个算法是否使用 kae engine 使能 KAE 硬件加速，true 表示使用 kae engine 使能 KAE 硬件加速，false 表示使用 openssl 软算。当属性 kae.[algorithm] 值为 true 时，属性 kae.[algorithm].useKaeEngine 才会生效。

| 属性名 | 值类型 | 默认值 | 描述 |
| --- | --- | --- | ---|
| kae.digest.useKaeEngine | boolean | TRUE | 配置 digest 算法是否使能 KAE 硬件加速 |
| kae.aes.useKaeEngine | boolean | FALSE | 配置 aes 算法是否使能 KAE 硬件加速 |
| kae.sm4.useKaeEngine | boolean | TRUE | 配置 sm4 算法是否使能 KAE 硬件加速 |
| kae.hmac.useKaeEngine | boolean | FALSE | 配置 hmac 算法是否使能 KAE 硬件加速 |
| kae.rsa.useKaeEngine | boolean | TRUE | 配置 rsa 算法是否使能 KAE 硬件加速 |
| kae.dh.useKaeEngine | boolean | TRUE | 配置 dh 算法是否使能 KAE 硬件加速 |
| kae.ec.useKaeEngine | boolean | FALSE | 预留属性，配置 ec 算法是否使能 KAE硬件加速（Kunpeng 920 暂时不支持 EC 算法，kae.ec=true 时，EC 算法仍然使用 openssl 软算） |
| kae.engine.disabledAlgorithms | String | sha256,sha384 | 通过该属性配置批量禁用某些特定算法，默认禁用sha256,sha384算法，属性可选值如下：md5,sha1,sha224,sha256,sha384,sha512,sm3,aes-128-ecb,aes-128-cbc,aes-128-ctr,aes-128-gcm,aes-192-ecb,aes-192-cbc,aes-192-ctr,aes-192-gcm,aes-256-ecb,aes-256-cbc,aes-256-ctr,aes-256-gcm,sm4-ecb,sm4-cbc,sm4-ctr,sm4-ofb,hmac-md5,hmac-sha1,hmac-sha224,hmac-sha256,hmac-sha384,hmac-sha512,rsa,dh,ec |
| kae.log.file | String | ${user.dir}/kae.log | 配置引擎加载的日志路径 |
| kae.sm4.maxChunkSize | int | 4096 | 配置使用 SM4 算法加密/解密MappedByteBuffer 数据时每次处理数据块大小限制（当配置的属性值为非正整数或者超过 Integer 大小范围时使用默认值 4096） |
| kae.engine.id | String | kae | 配置使用的引擎 id |
| kae.libcrypto.useGlobalMode | boolean | FALSE | 配置加载 libcrypto 使用是 dlopenRTLD_GLOBAL 模式还是 RTLD_LOCAL 模式，true 表示使用使用 RTLD_GLOBAL 模式，false 表示使用RTLD_LOCAL 模式。uadk_engine 时需要该属性值设置为 true |

### 2. 系统属性

系统属性的优先级高于 kaeprovider.conf 属性。系统属性除了支持上述的 kaeprovider.conf 属性，同时还新增如下属性配置：

| 属性名 | 值类型 | 默认值 | 描述 |
| --- | --- | --- | ---|
| kae.conf | String | jre/lib/kaeprovider.conf | 配置 kaeprovider.conf 文件路径 |
| java.security.debug | String | - | JDK 支持的系统属性，本次新增属性值 kae，打印 KAEProvider 加载的 debug 日志 |

## 参考

1.https://gitcode.com/openeuler/uadk_engine [了解详情](https://gitcode.com/openeuler/uadk_engine)

2.https://github.com/kunpengcompute/KAE [了解详情](https://github.com/kunpengcompute/KAE)

3.https://docs.openeuler.org/zh/docs/22.03_LTS/docs/UADK/UADK-quick-start.html [了解详情](https://docs.openeuler.org/zh/docs/22.03_LTS/docs/UADK/UADK-quick-start.html)

4.https://man7.org/linux/man-pages/man3/dlopen.3.html [了解详情](https://man7.org/linux/man-pages/man3/dlopen.3.html)

编者按：毕昇JDK 8u352 版本已发布，其中 KAEProvider 易用性增强作为新特性为用户提供丰富的配置，让 KAEProvider 更好地兼容其他 openssl 引擎，方便用户快速使用鲲鹏处理器提供的硬件加速能力，提升用户的开发效率。

本页内容
