strongswan对称算法plugin
文章目录
- 面向对象-父类
- 面向对象-子类
- 插件PLUGIN
- libstrongswan库初始化算法和加载插件
- 算法使用
面向对象-父类
strongswan/src/libstrongswan/crypto/crypters/crypter.c
和crypters/crypter.h
里将对称算法接口抽象封装成了一个父类struct crypter_t
, crypter_t结构体里成员函数都是对称算法运算相关的具体实现函数。
struct crypter_t {bool (*encrypt)(crypter_t *this, chunk_t data, chunk_t iv,chunk_t *encrypted) __attribute__((warn_unused_result));bool (*decrypt)(crypter_t *this, chunk_t data, chunk_t iv,chunk_t *decrypted) __attribute__((warn_unused_result));size_t (*get_block_size)(crypter_t *this);size_t (*get_iv_size)(crypter_t *this);size_t (*get_key_size)(crypter_t *this);bool (*set_key)(crypter_t *this,chunk_t key) __attribute__((warn_unused_result));void (*destroy)(crypter_t *this);};
面向对象-子类
private_aes_crypter_t作为子类继承了父类crypter_t
strongswan里AES对称算法软算法实现:
# ls strongswan/src/libstrongswan/plugins/aes
aes_crypter.c aes_crypter.h aes_plugin.c aes_plugin.h Makefile.am
Makefile.am会把plugins/aes/目录下根据libstrongswan-aes.la生成库文件。
struct private_aes_crypter_t {aes_crypter_t public; /* struct aes_crypter_t里只有一个成员crypter_t crypter; */uint32_t aes_Nkey;uint32_t aes_Nrnd;uint32_t aes_e_key[AES_KS_LENGTH];uint32_t aes_d_key[AES_KS_LENGTH];uint32_t key_size;bool has_iv;
};
aes_crypter.c里的加密和解密的软算法实现函数如下:
static void encrypt_block(const private_aes_crypter_t *this,const unsigned char in_blk[], unsigned char out_blk[]);
static void decrypt_block(const private_aes_crypter_t *this,const unsigned char in_blk[], unsigned char out_blk[]);
用METHOD对private_aes_crypter_t里成员函数指针如encrypt,decrypt,set_key, set_iv等的实现函数进行声明和定义,METHOD声明的函数具体为_encrypt, _decrypt,_get_block_size,_get_iv_size,_get_key_size,_set_key,_destroy。
aes_crypter_create主要完成算法实例对象的初始化
INIT(this,.public = {.crypter = {.encrypt = _encrypt,.decrypt = _decrypt,.get_block_size = _get_block_size,.get_iv_size = _get_iv_size,.get_key_size = _get_key_size,.set_key = _set_key,.destroy = _destroy,},},.key_size = key_size,.aes_Nkey = key_size / 4,.has_iv = has_iv,);
插件PLUGIN
find_plugin 根据libstrongswan-aes.so文件名查找插件并load_plugin,在load_plugin里先create_plugin,如果找不到会先dlopen再create_plugin。
/*** Tries to find the plugin with the given name in the given path.*/
static bool find_plugin(char *path, char *name, char *buf, char **file)
{struct stat stb;if (path && snprintf(buf, PATH_MAX, "%s/libstrongswan-%s.so",path, name) < PATH_MAX){if (stat(buf, &stb) == 0){*file = buf;return TRUE;}}return FALSE;
}
plugin里plugin_feature
与aes_crypter_create
绑定上了关系
static plugin_feature_t f[] = {PLUGIN_REGISTER(CRYPTER, aes_crypter_create),PLUGIN_PROVIDE(CRYPTER, ENCR_AES_CBC, 16),PLUGIN_PROVIDE(CRYPTER, ENCR_AES_CBC, 24),PLUGIN_PROVIDE(CRYPTER, ENCR_AES_CBC, 32),PLUGIN_PROVIDE(CRYPTER, ENCR_AES_ECB, 16),PLUGIN_PROVIDE(CRYPTER, ENCR_AES_ECB, 24),PLUGIN_PROVIDE(CRYPTER, ENCR_AES_ECB, 32),};
libstrongswan库初始化算法和加载插件
strongswan/libstrongswan/library.c
里面bool library_init(char *settings, const char *namespace);
函数中有段代码段如下:
this->public.crypto = crypto_factory_create();
this->public.plugins = plugin_loader_create();
算法使用
以libipsec/esp_context.c里对密码算法的调用为例
/*** Create AEAD wrapper around traditional encryption/integrity algorithms*/
static bool create_traditional(private_esp_context_t *this, int enc_alg,chunk_t enc_key, int int_alg, chunk_t int_key)
{crypter_t *crypter = NULL;signer_t *signer = NULL;iv_gen_t *ivg;switch (enc_alg){case ENCR_AES_CTR:case ENCR_CAMELLIA_CTR:/* the key includes a 4 byte salt */crypter = lib->crypto->create_crypter(lib->crypto, enc_alg,enc_key.len - 4);break;default:crypter = lib->crypto->create_crypter(lib->crypto, enc_alg,enc_key.len);break;}if (!crypter){DBG1(DBG_ESP, "failed to create ESP context: unsupported encryption ""algorithm %N", encryption_algorithm_names, enc_alg);goto failed;}if (!crypter->set_key(crypter, enc_key)){DBG1(DBG_ESP, "failed to create ESP context: setting encryption key ""failed");goto failed;}signer = lib->crypto->create_signer(lib->crypto, int_alg);if (!signer){DBG1(DBG_ESP, "failed to create ESP context: unsupported integrity ""algorithm %N", integrity_algorithm_names, int_alg);goto failed;}if (!signer->set_key(signer, int_key)){DBG1(DBG_ESP, "failed to create ESP context: setting signature key ""failed");goto failed;}ivg = iv_gen_create_for_alg(enc_alg);if (!ivg){DBG1(DBG_ESP, "failed to create ESP context: creating iv gen failed");goto failed;}this->aead = aead_create(crypter, signer, ivg);return TRUE;failed:DESTROY_IF(crypter);DESTROY_IF(signer);return FALSE;
}
其中crypter_t *crypter为算法实例或者对象,最后this->aead = aead_create(crypter, signer, ivg);
集成到aead。
在libipsec/esp_packet.c里,ESP数据包的实例初始化为:
static private_esp_packet_t *esp_packet_create_internal(packet_t *packet)
{private_esp_packet_t *this;INIT(this,.public = {.packet = {.set_source = _set_source,.get_source = _get_source,.set_destination = _set_destination,.get_destination = _get_destination,.get_data = _get_data,.set_data = _set_data,.get_dscp = _get_dscp,.set_dscp = _set_dscp,.get_metadata = _get_metadata,.set_metadata = _set_metadata,.skip_bytes = _skip_bytes,.clone = _clone_,.destroy = _destroy,},.get_source = _get_source,.get_destination = _get_destination,.get_next_header = _get_next_header,.parse_header = _parse_header,.decrypt = _decrypt,.encrypt = _encrypt,.get_payload = _get_payload,.extract_payload = _extract_payload,.destroy = _destroy,},.packet = packet,.next_header = IPPROTO_NONE,);return this;
}
代码段中涉及到的加解密接口为
.decrypt = _decrypt,.encrypt = _encrypt,
以_encrypt为例
METHOD(esp_packet_t, encrypt, status_t,private_esp_packet_t *this, esp_context_t *esp_context, uint32_t spi)
{....../* encrypt/authenticate the content inline */if (!aead->encrypt(aead, ciphertext, aad, iv, NULL)){DBG1(DBG_ESP, "ESP encryption or ICV generation failed");writer->destroy(writer);return FAILED;}......
}
以上就是一系列的嵌套过程,这样面向对象模块化的设计可以让用户忽略不必过分关心的细节,这也是面向对象的好处,而且模块化让代码结构更加低耦合高内聚。
strongswan对称算法plugin相关推荐
- ASP.NET之对称算法加密
一:什么是对称算法? 对称算法也被称作单密钥算法,也就是加密密钥能从解密密钥中推算出来,同样解密密钥也能从加密密钥中推算出来,说白了,就是加密密钥和解密密钥是同一个密钥,对称算法的安全性依赖于密钥,密 ...
- 加密解密技术—对称算法加密
一:什么是对称算法? 对称算法也被称作单密钥算法,也就是加密密钥能从解密密钥中推算出来,同样解密密钥也能从加密密钥中推算出来,说白了,就是加密密钥和解密密钥是同一个密钥,对称算法的安全性依赖于密钥,密 ...
- php对称算法_php里简单的对称加密算法
这里讲解一下php里的对称加密算法,很简单,使用base64的方法,不过也挺实用的.复杂的也有,比如AES,DES等 前几天突发奇想要往数据库里保存一些机密的东西,然后就想着怎么让别人即使进入到了数据 ...
- Linux crypto相关知识的汇总 Linux加密框架crypto对称算法和哈希算法加密模式
参考链接 Linux加密框架中的算法和算法模式(二)_家有一希的博客-CSDN博客 对称算法 分组算法模式 ECB模式 ECB模式下,明文数据被分为大小合适的分组,然后对每个分组独立进行加密或解密 如 ...
- python自带的对称算法_一种基于对称算法和专用加载模块的Python程序模块加密方法...
一种基于对称算法和专用加载模块的Python程序模块加密方法 [专利说明]一种基于对称算法和专用加载模块的Python程序模块加密方法 技术领域 [0001]本发明涉及一种网络安全技术,具体涉及一种P ...
- 信息安全——对称算法与非对称算法
信息化时代的飞速发展,给人们的生活带来了翻天覆地的变化.人们在享受网络数据便利交互的同时,也面临着一个重大的问题--信息安全.从开始的邮件沟通.QQ聊天,演变到现在的手机移动支付,保护个人信息与数据, ...
- 国密SM4对称算法实现说明(原SMS4无线局域网算法标准)
国密SM4对称算法实现说明(原SMS4无线局域网算法标准) SM4分组密码算法,原名SMS4,国家密码管理局于2012年3月21日发布:http://www.oscca.gov.cn/News/201 ...
- C# 对称算法,加密解密类
C# 对称算法,加密解密类 调用有先获取类实例,提供了解密和加密函数. using System.IO; using System; using System.Text.RegularExpres ...
- 数据传输加密——非对称加密算法RSA+对称算法AES(适用于java,android和Web)
本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 转载请注明出处:http://blog.csdn.net/chay_chan/article/details/58605605 数据 ...
最新文章
- 高性能dhcp服务器,基于线程池机制的高性能DHCP服务器研究与实现
- 五邑大学数据结构邢润丹实验_哪个大学楼最高:全国大学高楼海拔高度排名
- Seen.js – 使用 SVG 或者 Canvas 渲染 3D 场景
- 前端学习(2354):image组件的基本使用
- caffe编译出现 libcudart.so.8.0 cannot open shared object file: No such file or directory的错去
- python二维向量运算模拟_Python数学基础之向量定义与向量运算(附代码)
- 在 Coding 上搭建 Hexo 个人博客!
- 【个人项目总结】四则运算生成器
- PHP计算计算时间差,php中计算时间差的几种方法
- windows下安装完MySQL,为什么cmd不识别命令?
- eclipse搭建javaweb开发环境
- 电脑主机前面的耳机插孔没声音怎么办?旧时光 oldtimeblog
- 最多50名同学的学号,姓名,及三科成绩,计算每位同学的平均成绩,并找出平均分的最高分和最低分
- CentOS 7静态IP在主机重启后失效解决
- 微信小程序图片处理方案,解决加载缓慢,影响用户体验
- python数据库-6
- Yeelight LED智能灯泡(彩光版)代码控制(含pdf资料)
- 附近商家位置java开发附近定位
- 小程序底部导航iphoneX判断
- 第二十九节 C++ 继承之向基类传递参数