From bc9fd2b05728949bfd628e45053000f169e34569 Mon Sep 17 00:00:00 2001 From: winnie-hu Date: Thu, 13 Oct 2022 17:45:50 +0800 Subject: [PATCH] update crypto framework readme Signed-off-by: winnie-hu --- README_zh.md | 37 ++++++++++++++---- .../zh-cn_crypto_framework_architecture.png | Bin 0 -> 32465 bytes 2 files changed, 30 insertions(+), 7 deletions(-) create mode 100755 figures/zh-cn_crypto_framework_architecture.png diff --git a/README_zh.md b/README_zh.md index 0918896..289dc57 100644 --- a/README_zh.md +++ b/README_zh.md @@ -1,7 +1,17 @@ # 加解密算法库框架 ## 简介 -为屏蔽底层硬件和算法库,向上提供统一的密码算法库加解密和证书相关接口。 +加解密算法库框架是一个屏蔽了第三方密码学算法库实现差异的算法框架,提供加解密、签名验签、消息验证码、哈希、安全随机数和证书等相关功能。开发者可以通过调用加解密算法库框架,忽略底层不同三方算法库的差异,实现迅捷开发。 +**图 1** 加解密算法库框架-架构图 + + +![](figures/zh-cn_crypto_framework_architecture.png) + +其中, + +- API接口层:对外提供统一的JS接口,提供的能力包括:密码操作、证书、秘钥材料和生成器等。 +- 框架实现层:通过灵活加载插件层的插件,适配并屏蔽三方算法库的差异。 +- 插件实现层:实现针对具体三方算法库的功能。 ## 目录 ``` @@ -10,21 +20,34 @@ base/security/crypto_framwork ├── interfaces # 对外接口目录 ├── test # unitest ├── common # 内部依赖的公共方法 -├── plugin # 算法适配的插件 +├── plugin # 算法适配的插件实现 │ └── openssl_plugin # openssl 插件 -├── frameworks # api调用SPI的实现 -│ ├── spi # 放SPI的头文件 +├── frameworks # 框架实现层 +│ ├── spi # SPI的接口 │ ├── js │ └── napi # 通过napi封装的JS接口代码实现 │ ├── algorithm_parameter # 算法参数 │ ├── certificate # 证书 │ ├── crypto_operation # 算法操作,包括mac、md、加解密、签名验签、秘钥协商 -│ ├── key -│ └── rand +│ ├── key # 秘钥材料 +│ └── rand # 随机数 ``` +## 约束 +[加解密算法库框架-overview-约束与限制](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/security/cryptoFramework-overview.md#%E7%BA%A6%E6%9D%9F%E4%B8%8E%E9%99%90%E5%88%B6) + + +## 说明 + +### 接口说明 +[加解密算法库框架-API参考](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-cryptoFramework.md) + + +### 使用说明 +[加解密算法库框架-开发指南](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/security/cryptoFramework-guidelines.md) + ## 相关仓 **安全子系统** -[security\_crypto\_framwork](https://gitee.com/openharmony/security_crypto_framwork) \ No newline at end of file +[security\_crypto\_framework](https://gitee.com/openharmony/security_crypto_framework) \ No newline at end of file diff --git a/figures/zh-cn_crypto_framework_architecture.png b/figures/zh-cn_crypto_framework_architecture.png new file mode 100755 index 0000000000000000000000000000000000000000..521a3850ff2216a624e0d732a0ddba60137d7bae GIT binary patch literal 32465 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 QW9Y9a%c~