BearSSL是用C语言实现的SSL/TLS协议,它的源码可直接通过git clone https://www.bearssl.org/git/BearSSL 下载,它的license是MIT,最新版本为0.6。

BearSSL的主要特性是:

(1). 正确且安全:对不安全的协议版本和算法选择是不支持的,密码算法的实现默认采用固定时间(constant-time)。

(2). 较少的代码(Be small, both in RAM and code footprint)。

(3). 支持多平台,既支持windows, linux, macOS,又支持小型嵌入式系统。

(4). 可扩展。

编译源码:

(1). Linux:直接执行make即可在build目录下生成动态库和静态库。

(2). Windows:修改src/inner.h文件,在#include “config.h”行后添加以下语句,然后将src目录下的.c文件加入vs工程中即可设置生成动态库或静态库:

#ifdef _MSC_VER
#ifndef inline
#define inline __inline
#endif
#endif

以下为测试代码:

#include "funset.hpp"
#include <string.h>
#include <string>
#include <vector>
#include "bearssl_hash.h"
#include "bearssl_block.h"namespace {void print(const char* name, const unsigned char* data, unsigned int len)
{fprintf(stdout, "%s:", name);for (unsigned i = 0; i < len; ++i) {fprintf(stdout, "%02X", data[i]);}fprintf(stdout, "\n");
}}int test_bearssl_1()
{// compute a hash functionconst std::string data1 = "https://blog.csdn.net/fengbingchun";unsigned char hash_output_sha256[br_sha256_SIZE] = { 0 };br_sha256_context csha256;br_sha256_init(&csha256);br_sha256_update(&csha256, data1.c_str(), data1.length());br_sha256_out(&csha256, hash_output_sha256);print("sha256", hash_output_sha256, br_sha256_SIZE);const std::string data2 = "https://github.com/fengbingchun";unsigned char hash_output_sha1[br_sha1_SIZE] = { 0 };br_sha1_context csha1;br_sha1_init(&csha1);br_sha1_update(&csha1, data2.c_str(), data2.length());br_sha1_out(&csha1, hash_output_sha1);print("sha1", hash_output_sha1, br_sha1_SIZE);// aes cbc encryption/decryptionstatic const char* const key = "012346789abcdef";static const char* const iv_src = "ABCDEF9876543210";char* data3_src = "!@#$%^&*()_-+={]";br_aes_big_cbcenc_keys cbcenc_ctx;br_aes_big_cbcenc_init(&cbcenc_ctx, key, br_aes_big_BLOCK_SIZE);std::vector<unsigned char> iv(br_aes_big_BLOCK_SIZE, 0);memcpy(iv.data(), iv_src, br_aes_big_BLOCK_SIZE);if (strlen(data3_src) % br_aes_big_BLOCK_SIZE != 0) {fprintf(stdout, "data length (in bytes, MUST be multiple of 16): %d\n", strlen(data3_src));return -1;}std::vector<unsigned char> data3(br_aes_big_BLOCK_SIZE, 0);memcpy(data3.data(), data3_src, br_aes_big_BLOCK_SIZE);print("data3 src", data3.data(), br_aes_big_BLOCK_SIZE);br_aes_big_cbcenc_run(&cbcenc_ctx, iv.data(), data3.data(), br_aes_big_BLOCK_SIZE);print("data3 enc", data3.data(), br_aes_big_BLOCK_SIZE);br_aes_big_cbcdec_keys cbcdec_ctx;br_aes_big_cbcdec_init(&cbcdec_ctx, key, br_aes_big_BLOCK_SIZE);std::vector<unsigned char> iv2(br_aes_big_BLOCK_SIZE, 0);memcpy(iv2.data(), iv_src, br_aes_big_BLOCK_SIZE);br_aes_big_cbcdec_run(&cbcdec_ctx, iv2.data(), data3.data(), br_aes_big_BLOCK_SIZE);print("data3 dec", data3.data(), br_aes_big_BLOCK_SIZE);fprintf(stdout, "data3 src:          : %s\n", data3_src);fprintf(stdout, "data3 decrypt result: %s\n", data3.data());return 0;
}

执行结果如下图所示:

GitHub:https://github.com/fengbingchun/OpenSSL_Test

开源库BearSSL介绍及使用相关推荐

  1. [转]Facebook的c++开源库folly介绍

    揭秘Facebook官方底层C++函数Folly Facebook近日公布了其官方底层C++函数Folly,Folly(该缩略语表示Facebook开源代码库)其实是C++11组件库,这些组件在设计时 ...

  2. 软件经验|GDAL空间数据开源库开发介绍

    GDAL(Geospatial Data Abstraction Library)是使用C/C++语言编写的用于读写空间数据的一套跨平台开源库.GDAL库可以读取.写入.转换.处理各种栅格数据格式,它 ...

  3. C++开源库详细介绍

    C++在"商业应用"方面,曾经是天下第一的开发语言,但这一桂冠已经被java抢走多年.因为当今商业应用程序类型,已经从桌面应用迅速转移成Web应 用.当Java横行天下之后,MS又 ...

  4. Go开源库Excelize介绍,电子Excel表格操作强大的库

    Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准. 项目作者是续 日,现任阿里巴巴软件工程师,曾就职百 ...

  5. Facebook的c++开源库folly介绍

    folly在Facebook内部广泛使用的一个c++库,是开源的,github地址: https://github.com/facebook/folly 之前的boost库给我们带来了很多方便,比如智 ...

  6. 鲲鹏数据开源库python_google_translator介绍

    2019独角兽企业重金招聘Python工程师标准>>> 原文作者:西安鲲之鹏 原文链接:http://www.site-digger.com/html/articles/201308 ...

  7. 【OMNET++】开源库CoRE4INET介绍

    1.前言 OMNET++是一个可扩展的.模块化的.基于组件的C++仿真库和框架,主要用于构建网络模拟器.CoRE4INET是对INET框架的扩展,用于在OMNeT++仿真系统中基于事件的实时以太网仿真 ...

  8. 【转】DICOM医学图像处理:开源库mDCM与DCMTK的比較分析(一),JPEG无损压缩DCM图像

    转自:https://www.cnblogs.com/mfrbuaa/p/4004114.html 有修订 背景介绍: 近期项目需求,需要使用C#进行最新的UI和相关DICOM3.0医学图像模块的开发 ...

  9. Android 本地缓存开源库 Reservoir 替代SharedPreferences

    一.Android SharedPreferences 简介 众所周知,SharedPreferences是一种轻型的Android数据存储方式,它的本质是基于XML文件存储key-value键值对数 ...

最新文章

  1. LeetCode 832 Flipping an Image
  2. 错误:'sys'未定义解决方法.(asp.net Ajax v1.0.61025版)
  3. UITextFiled使用 + 不常见的需求
  4. 我的win7黑屏解决方案
  5. java取出连续子串_JAVA :在给定一个数组中,可以取得多个连续的子串。在众多子串中,求各元素和为最大值的连续子串...
  6. 电脑屏幕保护怎么取消_STEP考试安排再更新!今年到底要怎么考试?
  7. [转]Unity-移动设备可用的压缩解压缩源码
  8. Dojo学习笔记(8. dojo.event dojo.event.topic dojo.event.browser)
  9. Windows下MySQL压缩包.zip的安装
  10. python中定义结构体
  11. 微信一年“扫码”约占我国GDP 9%,带动近三千万个就业机会
  12. 关于Google Storage的东西
  13. bzoj 4709: [Jsoi2011]柠檬(分段DP+决策单调性)
  14. 软件授权注册码_授权码授予
  15. 不收费的数据恢复软件推荐
  16. 【《系统集成项目管理工程师》必备100题】
  17. 不用担心JDK17收费了,Oracle 推出 JDK 8 的升级替代品
  18. linux sed替换行,shell - 使用Sed替换包含字符串的整行
  19. ASP网站实例教程:IIS安装配置
  20. 有赢有输---Kodu少儿编程第十一天

热门文章

  1. 数字图像处理:(4)二阶微分在数字图像处理中的应用
  2. C语言:随笔5--指针1
  3. 和12岁小同志搞创客开发:手撕代码,做一款数字骰子
  4. python迭代计算_如何在Python中迭代坐标列表并计算它们之间的距离
  5. android 蓝牙 鼠标 app_Razer 雷蛇 那伽梵蛇 Pro 专业版 无线蓝牙鼠标 899元
  6. Udacity机器人软件工程师课程笔记(三十) - 语义分割与实例实现 - 使用keras实现语义分割
  7. Node.js中的express框架,修改内容后自动更新(免重启),express热更新
  8. 在ubuntu 16.04.5 LTS上使用Python 2.7生成带logo的二维码实战
  9. PBR游戏3D模型合集包 PBR Game 3D-Models Bundle February 2022
  10. LTE: MIB和SIB,小区选择和重选规则