构建基于sm4的wasm
前言
一直有个想法,想基于 https://github.com/guanzhi/GmSSL
构建出自定义的国密加解密方案,无奈C语言开发并不熟悉,而每次windows下构建开发环境,经常碰到文件无法下载,或者无法执行的问题。
突发奇想,另辟蹊径通过linux去运行,于是乎便有了如下操作方式。我们是基于docker进行的,所以各位看官得先把docker搭好了再继续 =)
1. 镜像文件编辑
# Dockerfile
# 基础镜像选择 Ubuntu
FROM ubuntu:22.04
# 安装构建工具和依赖
RUN apt update && \
apt install -y git build-essential cmake perl wget curl \
python3 python3-pip clang lld unzip
# 假设你已经将 emsdk.zip 和 GmSSL.zip 放在了与 Dockerfile 相同的目录下
COPY emsdk.zip /
COPY GmSSL.zip /
# 安装 Emscripten SDK
RUN unzip /emsdk.zip -d /emsdk && \
chmod +x /emsdk/emsdk && \
cd /emsdk && \
./emsdk install latest && \
./emsdk activate latest && \
echo "source /emsdk/emsdk_env.sh" >> /root/.bashrc
# 解压 GmSSL 源码
RUN unzip /GmSSL.zip -d /gmssl
WORKDIR /gmssl
注意上面的有两个 zip 文件,其实分别对应git仓库的下载
https://github.com/emscripten-core/emsdk.git
https://github.com/guanzhi/GmSSL
因为git clone 可能无法正常下载,所以提前用zip方式下载下来,然后和Dockerfile放在一起
2. 启动容器
docker build -t gmssl-wasm .
3.进入容器
docker run -it gmssl-wasm bash
4.启用 emsdk 环境 + 构建
source /emsdk/emsdk_env.sh
mkdir -p /gmssl/build && cd /gmssl/build
emcmake cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_SHARED_LIBS=OFF \
-DGMSSL_NO_ASM=ON \
-DGMSSL_BUILD_TEST=OFF \
-DCMAKE_INSTALL_PREFIX=./dist
emmake make -j$(nproc)
emmake make install
至此,将会在dist
文件夹中出现构建好的 libgmssl.a
等文件,后续我们生成 wasm 将会利用这些文件
5. 新建 wrapper 文件夹,用于构建 wasm
5.1 新建 sm4_wrapper.c 文件
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include "gmssl/sm4.h"
// 128-bit 对称加密:块大小固定为 16 字节
int sm4_encrypt_block(uint8_t *key, uint8_t *in, uint8_t *out) {
SM4_KEY sm4_key