开源库BearSSL介绍及使用

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 function
	const 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/decryption
	static 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;
}

执行结果如下图所示:

GitHubhttps://github.com/fengbingchun/OpenSSL_Test

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值