文章目录

  • 面向对象-父类
  • 面向对象-子类
  • 插件PLUGIN
  • libstrongswan库初始化算法和加载插件
  • 算法使用

面向对象-父类

strongswan/src/libstrongswan/crypto/crypters/crypter.ccrypters/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

strongswanAES对称算法软算法实现:

# 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_featureaes_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相关推荐

  1. ASP.NET之对称算法加密

    一:什么是对称算法? 对称算法也被称作单密钥算法,也就是加密密钥能从解密密钥中推算出来,同样解密密钥也能从加密密钥中推算出来,说白了,就是加密密钥和解密密钥是同一个密钥,对称算法的安全性依赖于密钥,密 ...

  2. 加密解密技术—对称算法加密

    一:什么是对称算法? 对称算法也被称作单密钥算法,也就是加密密钥能从解密密钥中推算出来,同样解密密钥也能从加密密钥中推算出来,说白了,就是加密密钥和解密密钥是同一个密钥,对称算法的安全性依赖于密钥,密 ...

  3. php对称算法_php里简单的对称加密算法

    这里讲解一下php里的对称加密算法,很简单,使用base64的方法,不过也挺实用的.复杂的也有,比如AES,DES等 前几天突发奇想要往数据库里保存一些机密的东西,然后就想着怎么让别人即使进入到了数据 ...

  4. Linux crypto相关知识的汇总 Linux加密框架crypto对称算法和哈希算法加密模式

    参考链接 Linux加密框架中的算法和算法模式(二)_家有一希的博客-CSDN博客 对称算法 分组算法模式 ECB模式 ECB模式下,明文数据被分为大小合适的分组,然后对每个分组独立进行加密或解密 如 ...

  5. python自带的对称算法_一种基于对称算法和专用加载模块的Python程序模块加密方法...

    一种基于对称算法和专用加载模块的Python程序模块加密方法 [专利说明]一种基于对称算法和专用加载模块的Python程序模块加密方法 技术领域 [0001]本发明涉及一种网络安全技术,具体涉及一种P ...

  6. 信息安全——对称算法与非对称算法

    信息化时代的飞速发展,给人们的生活带来了翻天覆地的变化.人们在享受网络数据便利交互的同时,也面临着一个重大的问题--信息安全.从开始的邮件沟通.QQ聊天,演变到现在的手机移动支付,保护个人信息与数据, ...

  7. 国密SM4对称算法实现说明(原SMS4无线局域网算法标准)

    国密SM4对称算法实现说明(原SMS4无线局域网算法标准) SM4分组密码算法,原名SMS4,国家密码管理局于2012年3月21日发布:http://www.oscca.gov.cn/News/201 ...

  8. C# 对称算法,加密解密类

    C# 对称算法,加密解密类 调用有先获取类实例,提供了解密和加密函数. using System.IO;  using System;  using System.Text.RegularExpres ...

  9. 数据传输加密——非对称加密算法RSA+对称算法AES(适用于java,android和Web)

    本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 转载请注明出处:http://blog.csdn.net/chay_chan/article/details/58605605 数据 ...

最新文章

  1. 高性能dhcp服务器,基于线程池机制的高性能DHCP服务器研究与实现
  2. 五邑大学数据结构邢润丹实验_哪个大学楼最高:全国大学高楼海拔高度排名
  3. Seen.js – 使用 SVG 或者 Canvas 渲染 3D 场景
  4. 前端学习(2354):image组件的基本使用
  5. caffe编译出现 libcudart.so.8.0 cannot open shared object file: No such file or directory的错去
  6. python二维向量运算模拟_Python数学基础之向量定义与向量运算(附代码)
  7. 在 Coding 上搭建 Hexo 个人博客!
  8. 【个人项目总结】四则运算生成器
  9. PHP计算计算时间差,php中计算时间差的几种方法
  10. windows下安装完MySQL,为什么cmd不识别命令?
  11. eclipse搭建javaweb开发环境
  12. 电脑主机前面的耳机插孔没声音怎么办?旧时光 oldtimeblog
  13. 最多50名同学的学号,姓名,及三科成绩,计算每位同学的平均成绩,并找出平均分的最高分和最低分
  14. CentOS 7静态IP在主机重启后失效解决
  15. 微信小程序图片处理方案,解决加载缓慢,影响用户体验
  16. python数据库-6
  17. Yeelight LED智能灯泡(彩光版)代码控制(含pdf资料)
  18. 附近商家位置java开发附近定位
  19. 小程序底部导航iphoneX判断
  20. 第二十九节 C++ 继承之向基类传递参数

热门文章

  1. 云在天之南——我的七天七夜(感动普达措)
  2. css直角线_直角符号和垂直符号 过射线的端点和刚作的点,画射线
  3. NanoPi-M1 Plus(全志H3)踩坑记录
  4. DTCloud 第1天
  5. 复杂网络上的博弈及其演化动力学读书笔记
  6. 数字福建物联网首批重点实验室建设启动 厦门两所高校入围
  7. 期权实时行情数据 API 数据接口
  8. 机器学习-近9年双色球开奖数据的频繁项集
  9. MATLAB——计算立方体的法向量
  10. 希捷1TB硬盘正式发布