0%

openssl 和 wolfssl 及交叉编译移植

嵌入式方案中使用openssl以及wolfssl记录

openssl

介绍

转载 OpenSSL 详细介绍

对称加密算法

OpenSSL 一共提供了 8 种对称加密算法,其中 7 种是分组加密算法,仅有的一种流加密算法是 RC4。这 7 种分组加密算法分别是

  • AES
  • DES
  • Blowfish
  • CAST
  • IDEA
  • RC2
  • RC5

都支持电子密码本模式(ECB)加密分组链接模式(CBC)加密反馈模式(CFB)输出反馈模式(OFB)四种常用的分组密码加密模式。其中,AES 使用的加密反馈模式(CFB)输出反馈模式(OFB)分组长度是 128 位,其它算法使用的则是 64 位。事实上,DES 算法里面不仅仅是常用的DES 算法,还支持三个密钥和两个密钥3DES 算法。

虽然每种加密算法都定义了自己的接口函数,但是OpenSSL 还使用EVP 封装了所有的对称加密算法,使得各种对成加密算法能够使用统一的 API 接口EVP_EncryptEVP_Decrypt 进行数据的加密和解密,大大提供了代码的可重用性能。

非对称加密算法

OpenSSL 一共实现了 4 种非对称加密算法,包括

  • DH,一般用户密钥交换
  • RSA,既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密
  • DSA,一般只用于数字签名
  • ECcrypto/ec/ ecdsa_sign.c 实现了签名算法;crypto/ec/ec dh_ossl.c 实现了密钥交换算法

** 跟对称加密算法相似,OpenSSL 也使用 EVP 技术对不同功能的非对称加密算法进行封装,提供了统一的 API 接口。如果使用非对称加密算法进行密钥交换或者密钥加密,则使用 EVP_Seal 和 EVP_Open 进行加密和解密;如果使用非对称加密算法进行数字签名,则使用EVP_SignEVP_Verify 进行签名和验证。 **

信息摘要算法

OpenSSL 实现了 5 种信息摘要算法,分别是 MD2、MD5、MDC2、SHA(SHA1)和 RIPEMD。SHA 算法事实上包括了 SHA 和 SHA1 两种信息摘要算法,此外,OpenSSL 还实现了 DSS 标准中规定的两种信息摘要算法 DSS 和 DSS1。

OpenSSL 采用 EVP_Digest 接口作为信息摘要算法统一的 EVP 接口,对所有信息摘要算法进行了封装,提供了代码的重用性。

密钥和证书管理

密钥和证书管理是 PKI 的一个重要组成部分,OpenSSL 为之提供了丰富的功能,支持多种标准。

首先,OpenSSL 实现了 ASN.1 的证书和密钥相关标准,提供了对证书、公钥、私钥、证书请求以及 CRL 等数据对象的 DER、PEM 和 BASE64 的编解码功能。OpenSSL 提供了产生各种公开密钥对和对称密钥的方法、函数和应用程序,同时提供了对公钥和私钥的 DER 编解码功能。并实现了私钥的 PKCS#12 和 PKCS#8 的编解码功能。OpenSSL 在标准中提供了对私钥的加密保护功能,使得密钥可以安全地进行存储和分发。

在此基础上,OpenSSL 实现了对证书的 X.509 标准编解码、PKCS#12 格式的编解码以及 PKCS#7 的编解码功能。并提供了一种文本数据库,支持证书的管理功能,包括证书密钥产生、请求产生、证书签发、吊销和验证等功能。

事实上,OpenSSL 提供的 CA 应用程序就是一个小型的证书管理中心(CA),实现了证书签发的整个流程和证书管理的大部分机制。

Engine 机制

Engine 机制的出现是在 OpenSSL 的 0.9.6 版的事情,开始的时候是将普通版本跟支持 Engine 的版本分开的,到了 OpenSSL 的 0.9.7 版,Engine 机制集成到了 OpenSSL 的内核中,成为了 OpenSSL 不可缺少的一部分。

Engine 机制目的是为了使 OpenSSL 能够透明地使用第三方提供的软件加密库或者硬件加密设备进行加密。OpenSSL 的 Engine 机制成功地达到了这个目的,这使得 OpenSSL 已经不仅仅使一个加密库,而是提供了一个通用地加密接口,能够与绝大部分加密库或者加密设备协调工作。当然,要使特定加密库或加密设备更 OpenSSL 协调工作,需要写少量的接口代码,但是这样的工作量并不大,虽然还是需要一点密码学的知识。Engine 机制的功能跟 Windows 提供的 CSP 功能目标是基本相同的。

BIO 机制

BIO 机制是 OpenSSL 提供的一种高层 IO 接口,该接口封装了几乎所有类型的 IO 接口,如内存访问、文件访问以及 Socket 等。这使得代码的重用性大幅度提高,OpenSSL 提供 API 的复杂性也降低了很多。

OpenSSL 目录及功能描述

  • Crypto 存放 OpenSSL 所有加密算法源码文件和相关标注如 X.509 源码文件,是 OpenSSL 中最重要的目录,包含了 OpenSSL 密码算法库的所有内容
  • SSL 存放 OpenSSL 中 SSL 协议各个版本和 TLS 1.0 协议源码文件,包含了 OpenSSL 协议库的所有内容
  • Apps 存放 OpenSSL 中所有应用程序源码文件,如 CA、X509 等应用程序的源文件就存放在这里
  • Doc 存放了 OpenSSL 中所有的使用说明文档,包含三个部分:应用程序说明文档、加密算法库 API 说明文档以及 SSL 协议 API 说明文档
  • Demos 存放了一些基于 OpenSSL 的应用程序例子,这些例子一般都很简单,演示怎么使用 OpenSSL 其中的一个功能
  • Include 存放了使用 OpenSSL 的库时需要的头文件
  • Test 存放了 OpenSSL 自身功能测试程序的源码文件

OpenSSL 算法目录

openSSL 的算法目录 Crypto 目录包含了 OpenSSL 密码算法库的所有源代码文件,是 OpenSSL 中最重要的目录之一。OpenSSL 的密码算法库包含了 OpenSSL 中所有密码算法、密钥管理和证书管理相关标准的实现,在 Windows 下编译后的库文件名为 libeay32.lib,在 Linux 下编译后生产的库文件名为 libcrypto.a。Crypto 目录下包含了众多的子目录,这些目录大多数以相关的算法或标准名称的简写命名。当然,并非所有这些目录存放的源文件都是密码算法和标准,有些是 OpenSSL 本身的一些相关功能文件,如 BIO、DSO 和 EVP 等。

Crypto 子目录列表

  • Aes 对称算法,美国新的对称加密算法标准 AES 算法源码
  • Bf 对称算法,Blowfish 对称加密算法源码
  • Cast 对称算法,CAST 对称加密算法源码
  • Des 对称算法,包括了 DES 和 3DES 对称加密算法源码
  • Idea 对称算法,IDEA 对称加密算法源码
  • Rc2 对称算法,RC2 对称加密算法源码
  • Rc4 对称算法,RC4 对称加密算法源码
  • Rc5 对称算法,RC5 对称加密算法源码
  • Dh 非对称算法,DH 非对称密钥交换算法源码
  • Dsa 非对称算法,DSA 非对称算法源码,用于数字签名
  • Ec 非对称算法,EC 椭圆曲线算法源码
  • Rsa 非对称算法,RSA 非对称加密算法源码,既可以用于密钥交换,也可以用于数字签名
  • Md2 信息摘要算法,MD2 信息摘要算法源码
  • Md5 信息摘要算法,MD5 信息摘要算法源码
  • Mdc2 信息摘要算法,MDC2 信息摘要算法源码
  • Sha 信息摘要算法,SHA 信息摘要算法源码,包括了 SHA1 算法
  • Ripemd 信息摘要算法,RIPEMD-160 信息摘要算法源码
  • Comp 数据压缩算法数据压缩算法的函数接口,目前没有压缩算法,只是定义了一些空的接口函数
  • Asn1 PKI 相关标准 ASN.1 标准实现源码,只实现了 PKI 相关的部分,不是完全实现。包括 DER 编解码等功能
  • Ocsp PKI 相关标准 OCSP(在线证书服务协议)实现源码
  • Pem PKI 相关标准 PEM 标准实现源码,包括了 PEM 的编解码功能
  • Pkcs7 PKI 相关标准 PKCS#7 标准实现源码。PKCS#7 是实现加密信息封装的标准,包括了证书封装的标准和加密数据的封装标准
  • Pkcs12 PKI 相关标准 PKCS#12 标准实现源码。包括了 PKCS#12 文件的编解码功能。PKCS#12 是一种常用的证书和密钥封装格式
  • X509 PKI 相关标准 X.509 标准的实现源码。包括了 X.509 的编解码功能,证书管理功能等。X509v3 PKI 相关标准 X.509 第三版扩展功能的实现源码
  • Krb5 其它标准支持支持 Kerberos 协议的一些接口函数和结构定义
  • Hmac 其它标准支持 HMAC 标准的支持结构和函数源源代码
  • Lhash 其它标准支持动态 HASH 表结构和函数源代码
  • Bio 自定义 OpenSSL 自身定义的一种抽象 IO 接口,封装了各种平台的几乎所有 IO 接口,如文件、内存、缓存、标准输入输出以及 Socket 等等
  • Bn 自定义 OpenSSL 实现大数管理的结构及其函数
  • Buffer 自定义 OpenSSL 自定义的缓冲区结构体
  • Conf 自定义 OpenSSL 自定义的管理配置结构和函数
  • Dso 自定义 OpenSSL 自定义的加载动态库的管理函数接口。如使用 Engine 机制就用到了这些函数提供的功能
  • Engine 自定义 OpenSSL 自定义的 Engine 机制源代码。Engine 机制运行 OpenSSL 使用第三方提供的软件密码算法库或者硬件加密设备进行数据加密等运算。相当于 Windows 平台的 CSP 机制

Err 自定义 OpenSSL 自定义的错误信息处理机制

  • Evp 自定义 OpenSSL 定义的一组高层算法封装函数,包括了对称加密算法封装、非对称加密算法封装、签名验证算法封装以及信息摘要算法封装,类似

PKCS#11 提供的接口标准

  • Objects 自定义 OpenSSL 管理各种数据对象的定义和函数。事实上,Objects 的 OID 是根据 ASN.1 的标准进行命名的,不完全是 OpenSSL 自定义的结构

Rand 自定义 OpenSSL 的安全随机数产生函数和管理函数

  • Stack 自定义定义了 OpenSSL 中 STACK 结构和相关管理函数
  • Threads 自定义 OpenSSL 处理线程的一些机制
  • Txt_db 自定义 OpenSSL 提供的文本证书库的管理机制
  • Ui 自定义 OpenSSL 定义的一下用户接口交换函数
  • Perlasm 自定义编译的时候需要用到的一些 Perl 辅助配置文件

编译

转载 OpenSSL 的编译系统,主要内容

Make 命令是几乎大部分 Linux 下软件的编译基石,它输入的配置文件是 Makefile。但是很多开源软件为了适应各种不同的客户机配置,通常会在 Makefile 之前添加一个 automake 的过程,就是通过对机器硬件和机器上安装的库的检测来动态的确定编译的行为。

OpenSSL 的编译系统自成一派。虽然最后也是依赖 Makefile 文件的 make 系统,但是并不是使用 automake 的通用做法。一般的 automake 是首先执行一个叫 configure 的文件,这个文件的执行后就会生成一个 Makefile 文件,之后再调用 make 命令即可。但是 OpenSSL 调用的命令文件是 config,里面虽然的目的和 configure.sh 一致,但是实际使用的系统是差别很大的。config 这个 Shell 脚本文件里面实际是调用的 Perl 脚本。

实际的编译程序仍然是一个叫Configure的文件。这个文件支持的命令行参数远比config要多很多:

./Configure -h
Configuring OpenSSL version 1.1.1-pre7-dev (0x10101007L) for
Using os-specific seed configuration
Warning! target  doesn't exist!
Usage: Configure [no-<cipher> ...] [enable-<cipher> ...] [-Dxxx] [-lxxx] [-Lxxx] [-fxxx] [-Kxxx] [no-hw-xxx|no-hw] [[no-]threads] [[no-]shared] [[no-]zlib|zlib-dynamic] [no-asm] [no-dso] [no-egd] [sctp] [386] [--prefix=DIR] [--openssldir=OPENSSLDIR] [--with-xxx[=vvv]] [--config=FILE] os/compiler[:flags]

整个config文件都在为Configure文件自动的生成这些命令行参数。所以我们在一台机器上编译过之后,可以手动的拿到这些命令行参数,然后后续只直接调用Configure文件即可。这样就可以手动的对一些参数进行修改了。

  1. Linux 环境下 openssl 交叉编译、安装和裁剪
  2. openssl 编译参数选项
  3. openssl_configure.md
  4. 交叉编译 openssl、gmssl 的正确方式
  5. openssl 在 arm 下的交叉编译
  6. 使用 ARM GCC 编译 openssl
  7. openssl 简易文档

交叉编译时,需要关注的参数

  • CC
  • –prefix
  • –cross-compile
  • no-shared
  • no-asm

例如如下命令

./Configure --prefix=/opt/openssl --cross-compile-prefix=arm-linux-gnueabihf- no-asm shared linux-armv4
make
make install

嵌入式裁剪

./config --prefix=/home/zqjun/openssl5350 no-shared no-zlib no-asm no-threads no-sse2no-compno-dso no-gmp no-rfc3779 no-krb5 no-rc5 no-zlib-dynamic no-hw no-cipherno-md2 no-md4 no-mdc2 no-rc2 no-idea no-camellia no-ec no-ecdsa no-ecdhno-store no-ripemd no-des no-rc4 no-bf no-cast no-dsa no-dh no-ssl no-ssl2no-ssl3 no-tls no-perlasm
---------------------
./config --prefic=/home/zqjun/openssl5350 shared no-zlib no-asm no-threads no-sse2 no-compno-gmp no-rfc3779 no-krb5 no-rc5 no-zlib-dynamic no-hw no-cipher no-md2 no-md4 no-mdc2no-rc2 no-idea no-camellia no-ec no-ecdsa no-ecdh no-store no-ripemd no-des no-rc4no-bf no-cast no-dsa no-dh no-ssl no-ssl2 no-ssl3 no-tls no-perlasm

Makefile

注意事项:

  1. 生成libssl.alibcrypto.a,注意引用库的顺序为:-lssl -lcrypto,如果为-lcrypto –lssl,编译时会出现错误
  2. 动态编译时不能出现 no-dso 参数,因为编译过程中有些函数需要链接相应动态库
  3. 编译完成后使用 XXX-strip 把相应的符号去掉,安装后的库会更小一些

执行配置之后会有如下输出

./config --prefix=`pwd`/prefix no-shared no-asm no-zlib no-async
Operating system: x86_64-whatever-linux2
Configuring OpenSSL version 1.1.1-pre7-dev (0x10101007L) for linux-x86_64
Using os-specific seed configuration
Creating configdata.pm
Creating Makefile

**********************************************************************
***                                                                ***
***   If you want to report a building issue, please include the   ***
***   output from this command:                                    ***
***                                                                ***
***     perl configdata.pm --dump                                  ***
***                                                                ***
**********************************************************************

生成的Makefile

LIBS=apps/libapps.a libcrypto.a libssl.a test/libtestutil.a
INSTALL_LIBS=libcrypto.a libssl.a
libssl.a: ssl/bio_ssl.o ssl/d1_lib.o ssl/d1_msg.o ssl/d1_srtp.o ssl/methods.o ssl/packet.o ssl/pqueue.o ...
libcrypto.a: crypto/aes/aes_cbc.o crypto/aes/aes_cfb.o crypto/aes/aes_core.o crypto/aes/aes_ecb.o ... engines/e_afalg.o engines/e_capi.o engines/e_padlock.o
  • libssl.a为目录ssl集合
  • libcrypto.a为目录cryptoengines集合

wolfssl

介绍

wolfSSL

wolfSSL (原名 CyaSSLyet another SSL),是一个提供传输层安全协议(SSL/TLS)功能的软件库,主要针对嵌入式系系统 发展。以开放原始码及商用许可两种方式释出,提供 SSL/TLS 功能(SSL 3.0, TLS 1.0/1.1/ 1.2,DTLS 1.0/1.2),以 C 语言 写成。提供了与 OpenSSL 兼容的 API 界面,让原有使用 OpenSSL 的软件可以容易的移植过来。

交叉编译移植

  1. ESP32 移植 wolfssl 方法
  2. wolfssl 移植替换 openssl
  3. CHAPTER 2: BUILDING WOLFSSL
  4. BUILD OPTIONS (**./CONFIGURE** OPTIONS)

使用configure完成交叉编译配置,首先修改config.sub添加需要移植的host,然后

./configure --prefix=`pwd`/prefix --host=csky-linux --enable-sslv3 --enable-ecc --enable-tlsx --enable-stunnel --enable-opensslextra --disable-examples --enable-static

---
Configuration summary for wolfssl version 3.11.0

   * Installation prefix:        /data/OpenSourceCode/thirdparty/wolfssl/prefix
   * System type:                unknown-linux-gnu
   * Host CPU:                   csky
   * C Compiler:                 csky-linux-gcc
   * C Flags:                     -Werror -Wno-pragmas -Wall -Wno-strict-aliasing -Wextra -Wunknown-pragmas --param=ssp-buffer-size=1 -Waddress -Warray-bounds -Wbad-function-cast -Wchar-subscripts -Wcomment -Wfloat-equal -Wformat-security -Wformat=2 -Wmissing-field-initializers -Wmissing-noreturn -Wmissing-prototypes -Wnested-externs -Wnormalized=id -Woverride-init -Wpointer-arith -Wpointer-sign -Wredundant-decls -Wshadow -Wsign-compare -Wstrict-overflow=1 -Wswitch-enum -Wundef -Wunused -Wunused-result -Wunused-variable -Wwrite-strings -fwrapv
   * C++ Compiler:               csky-linux-g++
   * C++ Flags:                  -g -O2
   * CPP Flags:                   -fvisibility=hidden
   * CCAS Flags:
   * LIB Flags:                   -pie -z relro -z now -Werror
   * Debug enabled:              no
   * Warnings as failure:        yes
   * make -j:                    5
   * VCS checkout:               yes

   Features
   * Single threaded:            no
   * Filesystem:                 yes
   * OpenSSH Build:              no
   * OpenSSL Extra API:          yes
   * Max Strength Build:         no
   * Distro Build:               no
   * fastmath:                   no
   * sniffer:                    no
   * snifftest:                  no
   * ARC4:                       no
   * AES:                        yes
   * AES-NI:                     no
   * AES-GCM:                    yes
   * AES-CCM:                    no
   * AES-CTR:                    no
   * DES3:                       yes
   * IDEA:                       no
   * Camellia:                   no
   * NULL Cipher:                no
   * MD5:                        yes
   * RIPEMD:                     no
   * SHA:                        yes
   * SHA-224:                    no
   * SHA-512:                    no
   * BLAKE2:                     no
   * CMAC:                       no
   * keygen:                     no
   * certgen:                    no
   * certreq:                    no
   * certext:                    no
   * HC-128:                     no
   * RABBIT:                     no
   * CHACHA:                     yes
   * Hash DRBG:                  yes
   * PWDBASED:                   yes
   * scrypt:                     no
   * wolfCrypt Only:             no
   * HKDF:                       no
   * X9.63 KDF:                  no
   * MD4:                        yes
   * PSK:                        yes
   * Poly1305:                   yes
   * LEANPSK:                    no
   * LEANTLS:                    no
   * RSA:                        yes
   * DSA:                        no
   * DH:                         yes
   * ECC:                        yes
   * CURVE25519:                 no
   * ED25519:                    no
   * FPECC:                      no
   * ECC_ENCRYPT:                no
   * ASN:                        yes
   * Anonymous cipher:           no
   * CODING:                     yes
   * MEMORY:                     yes
   * I/O POOL:                   no
   * LIGHTY:                     no
   * HAPROXY:                    no
   * STUNNEL:                    yes
   * NGINX:                      no
   * ERROR_STRINGS:              yes
   * DTLS:                       no
   * SCTP:                       no
   * Old TLS Versions:           yes
   * SSL version 3.0:            yes
   * OCSP:                       yes
   * OCSP Stapling:              no
   * OCSP Stapling v2:           no
   * CRL:                        yes
   * CRL-MONITOR:                no
   * Persistent session cache:   no
   * Persistent cert    cache:   no
   * Atomic User Record Layer:   no
   * Public Key Callbacks:       no
   * NTRU:                       no
   * Whitewood netRandom:        no
   * Server Name Indication:     yes
   * ALPN:                       yes
   * Maximum Fragment Length:    yes
   * Truncated HMAC:             yes
   * Supported Elliptic Curves:  yes
   * Session Ticket:             no
   * Extended Master Secret:     yes
   * Renegotiation Indication:   no
   * Secure Renegotiation:       no
   * All TLS Extensions:         yes
   * PKCS#7                      no
   * wolfSCEP                    no
   * Secure Remote Password      no
   * Small Stack:                no
   * valgrind unit tests:        no
   * LIBZ:                       no
   * Examples:                   no
   * User Crypto:                no
   * Fast RSA:                   no
   * Async Crypto:               no
   * Cavium:                     no
   * ARM ASM:                    no
   * AES Key Wrap:               no
   * Write duplicate:            no
   * Intel Quick Assist:         no

---

$ tree -L 2
.
├── bin
│   └── wolfssl-config
├── include
│   ├── cyassl
│   └── wolfssl
├── lib
│   ├── libwolfssl.a
│   ├── libwolfssl.la
│   ├── libwolfssl.so -> libwolfssl.so.12.0.0
│   ├── libwolfssl.so.12 -> libwolfssl.so.12.0.0
│   ├── libwolfssl.so.12.0.0
│   └── pkgconfig
└── share
    └── doc

# 如果不添加`--enable-static`,结果如下,只有动态库
$ tree -L 2
.
├── bin
│   └── wolfssl-config
├── include
│   ├── cyassl
│   └── wolfssl
├── lib
│   ├── libwolfssl.la
│   ├── libwolfssl.so -> libwolfssl.so.12.0.0
│   ├── libwolfssl.so.12 -> libwolfssl.so.12.0.0
│   ├── libwolfssl.so.12.0.0
│   └── pkgconfig
└── share
    └── doc

# 可以使用`--dis-shared`不编译动态库
$ tree -L 2
.
├── bin
│   └── wolfssl-config
├── include
│   ├── cyassl
│   └── wolfssl
├── lib
│   ├── libwolfssl.a
│   ├── libwolfssl.la
│   └── pkgconfig
└── share
    └── doc

configure之后生成的文件,需要注意config.hMakefileoptions.hsetting.h

其中Makefile为编译流程控制,各个选项均可以修改以达到目的。config.hwolfssl的配置文件,包括各种宏定义。分析Makefile可以得到

  • ./wolfssl — 这个文件夹是 wolfssl 的所有头文件
  • ./src — 这个是 wolfssl 功能代码
  • ./wolfcrypt/src — 这个是 wolfssl 的所有加密算法源码实现
  • openssl不同,只存在一个库libwolfssl.a

Prefix

prefix目录如下

$ tree -L 3
.
├── bin
│   └── wolfssl-config
├── include
│   ├── cyassl
│   │   ├── callbacks.h
│   │   ├── certs_test.h
│   │   ├── crl.h
│   │   ├── ctaocrypt
│   │   ├── error-ssl.h
│   │   ├── ocsp.h
│   │   ├── openssl
│   │   ├── options.h
│   │   ├── sniffer_error.h
│   │   ├── sniffer.h
│   │   ├── ssl.h
│   │   ├── test.h
│   │   └── version.h
│   └── wolfssl
│       ├── callbacks.h
│       ├── certs_test.h
│       ├── crl.h
│       ├── error-ssl.h
│       ├── io.h
│       ├── ocsp.h
│       ├── openssl
│       ├── options.h
│       ├── sniffer_error.h
│       ├── sniffer.h
│       ├── ssl.h
│       ├── test.h
│       ├── version.h
│       └── wolfcrypt
├── lib
│   ├── libwolfssl.a
│   ├── libwolfssl.la
│   ├── libwolfssl.so -> libwolfssl.so.12.0.0
│   ├── libwolfssl.so.12 -> libwolfssl.so.12.0.0
│   ├── libwolfssl.so.12.0.0
│   └── pkgconfig
│       └── wolfssl.pc
└── share
    └── doc
        └── wolfssl

其中include存在cyasslwolfssl是为了保证与之前的版本cyassl兼容,同时存在openssl兼容性头文件

使用 wolfssl 替换 openssl

  1. WOLFSSL VERSUS OPENSSL
  2. CHAPTER 13: OPENSSL COMPATIBILITY
  3. wolfssl 移植替换 openssl
  4. 换用 CyaSSL 库

对比

  1. wolfssl 比较小,适合嵌入式环境

    wolfssl 在满足基本需求的同时,又能大大减小固件的大小

  2. wolfssl 性能相对优秀

    和 openssl 对比,wolfssl 的性能更加优秀,关于 openssl 和 wolfssl 的对比,可从 wolfssl 官网得到详尽的答案:openssl 和 wolfssl 的特点对比

  3. wolfssl 方便移植

    wolfssl 除了本地 API 之外,wolfssl 还提供了一个 openssl 兼容性头文件 wolfssl/openssl/ssl.h ,以简化转换为使用 wolfssl 或帮助将现有的 openssl 应用程序移植到 wolfssl。openssl 兼容层将最常用的 openssl 命令的子集映射到 wolfssl 的本地 API 函数。

编译

configure –help 说明链接

交叉编译时需要注意

  1. 使用prefix安装库
  2. 使用库地方export prefix/lib/pkgconfig
  3. 或者使用-L -I指定路径

示例代码

  1. server
  2. client