EVP简介

Openssl EVP提供了丰富的密码学中的各种函数。
Openssl 中实现了各种对称算法、摘要算法以及签名/验签算法。 EVP 函数将这些具体的算法进行了封装。

EVP 主要封装了如下功能函数:
1)实现了 base64 编解码 BIO;
2)实现了加解密 BIO;
3)实现了摘要 BIO;
4)实现了 reliable BIO;
5)封装了摘要算法;
6)封装了对称加解密算法;
7)封装了非对称密钥的加密(公钥)、解密(私钥)、签名与验证以及辅助函数;
7)基于口令的加密(PBE);
8)对称密钥处理;
9)数字信封:数字信封用对方的公钥加密对称密钥,数据则用此对称密钥加密。发送给对方时,同时发送对称密钥密文和数据密文。接收方首先用自己的私钥解密密钥密文,得到对称密钥,然后用它解密数据。
10)其他辅助函数。

EVP相关数据结构

EVP相关数据结构
声明在文件openssl-1.1.0c\include\opensslossl_typ.h
EVP相关算法上下文数据结构定义在文件openssl-1.1.0c\crypto\evp\evp_locl.h中。
EVP相关算法数据结构定义在文件openssl-1.1.0c\crypto\include\internal\evp_int.h中。

typedef struct evp_cipher_st EVP_CIPHER;
typedef struct evp_cipher_ctx_st EVP_CIPHER_CTX;
typedef struct evp_md_st EVP_MD;
typedef struct evp_md_ctx_st EVP_MD_CTX;
typedef struct evp_pkey_st EVP_PKEY;typedef struct evp_pkey_asn1_method_st EVP_PKEY_ASN1_METHOD;typedef struct evp_pkey_method_st EVP_PKEY_METHOD;
typedef struct evp_pkey_ctx_st EVP_PKEY_CTX;typedef struct evp_Encode_Ctx_st EVP_ENCODE_CTX;

EVP_CIPHER

EVP_CIPHER用来存放对称加密相关的信息以及算法。

struct evp_cipher_st {int nid;  //对称算法 nidint block_size;  //对称算法每次加解密的字节数/* Default value for variable length ciphers */int key_len;  //对称算法的密钥长度字节数int iv_len;  //对称算法的填充长度/* Various flags */unsigned long flags;  //用于标记/* init key *//*加密初始化函数,用来初始化 ctx, key 为对称密钥值, iv 为初始化向量, enc用于指明是要加密还是解密,这些信息存放在 ctx 中*/int (*init) (EVP_CIPHER_CTX *ctx, const unsigned char *key,const unsigned char *iv, int enc);/* encrypt/decrypt data *//*对称运算函数,用于加密或解密*/int (*do_cipher) (EVP_CIPHER_CTX *ctx, unsigned char *out,const unsigned char *in, size_t inl);/* cleanup ctx 清除上下文函数*/int (*cleanup) (EVP_CIPHER_CTX *);/* how big ctx->cipher_data needs to be */int ctx_size;/* Populate a ASN1_TYPE with parameters *//*设置上下文参数函数*/int (*set_asn1_parameters) (EVP_CIPHER_CTX *, ASN1_TYPE *);/* Get parameters from a ASN1_TYPE *//*获取上下文参数函数*/int (*get_asn1_parameters) (EVP_CIPHER_CTX *, ASN1_TYPE *);/* Miscellaneous operations 控制函数,实现各种其他操作*/int (*ctrl) (EVP_CIPHER_CTX *, int type, int arg, void *ptr);/* Application data 用于存放应用数据*/void *app_data;
} /* EVP_CIPHER */ ;

对称算法上下文结构EVP_CIPHER_CTX ,此结构主要用来维护加解密状态,存放中间以及最后结果。因为加密或解密时,当数据很多时,可能会用到 Update 函数,并且每次加密或解密的输入数据长度任意的,并不一定是对称算法 block_size 的整数倍,所以需要用该结构来存放中间未加密的数据。

struct evp_cipher_ctx_st {const EVP_CIPHER *cipher;ENGINE *engine;             /* functional reference if 'cipher' is* ENGINE-provided */int encrypt;                /* encrypt or decrypt */int buf_len;                /* number we have left */unsigned char oiv[EVP_MAX_IV_LENGTH]; /* original iv */unsigned char iv[EVP_MAX_IV_LENGTH]; /* working iv */unsigned char buf[EVP_MAX_BLOCK_LENGTH]; /* saved partial block */int num;                    /* used by cfb/ofb/ctr mode *//* FIXME: Should this even exist? It appears unused */void *app_data;             /* application stuff */int key_len;                /* May change for variable length cipher */unsigned long flags;        /* Various flags */void *cipher_data;          /* per EVP data */int final_used;int block_mask;unsigned char final[EVP_MAX_BLOCK_LENGTH]; /* possible final block */
} /* EVP_CIPHER_CTX */ ;

openssl 对于各种对称算法实现了上述结构,各个源码位于 cypto/evp 目录下,文件名以 e_开头。 Openssl 通过这些结构来封装了对称算法相关的运算。

EVP_MD

EVP_MD结构用来存放摘要算法信息以及各种计算函数。

struct evp_md_st {int type;  //摘要类型,一般是摘要算法 NIDint pkey_type;  //公钥类型,一般是签名算法 NIDint md_size;  //摘要值大小,为字节数unsigned long flags;  //用于设置标记/*摘要算法初始化函数*/int (*init) (EVP_MD_CTX *ctx);/*多次摘要函数*/int (*update) (EVP_MD_CTX *ctx, const void *data, size_t count);/*摘要完结函数*/int (*final) (EVP_MD_CTX *ctx, unsigned char *md);/*摘要上下文结构复制函数*/int (*copy) (EVP_MD_CTX *to, const EVP_MD_CTX *from);/*清除摘要上下文函数*/int (*cleanup) (EVP_MD_CTX *ctx);int block_size;int ctx_size;               /* how big does the ctx->md_data need to be *//* control function */int (*md_ctrl) (EVP_MD_CTX *ctx, int cmd, int p1, void *p2);
} /* EVP_MD */ ;
struct evp_md_ctx_st {const EVP_MD *digest;/* functional reference if 'digest' is ENGINE-provided */ENGINE *engine;            unsigned long flags;void *md_data;/* Public key context for sign/verify */EVP_PKEY_CTX *pctx;/* Update function: usually copied from EVP_MD */int (*update) (EVP_MD_CTX *ctx, const void *data, size_t count);
} /* EVP_MD_CTX */ ;

openssl 对于各种摘要算法实现了上述结构,各个源码位于 cypto/evp 目录下,文件名以 m_开头。 Openssl 通过这些结构来封装了各个摘要相关的运算。

EVP_PKEY

EVP_PKEY用来存放非对称密钥信息,可以是 RSA、 DSA、 DH 或 ECC 密钥。其中, ptr 用来存放密钥结构地址, attributes 堆栈用来存放密钥属性。

/** Type needs to be a bit field Sub-type needs to be for variations on the* method, as in, can it do arbitrary encryption....*/
struct evp_pkey_st {int type;int save_type;int references;const EVP_PKEY_ASN1_METHOD *ameth;ENGINE *engine;union {void *ptr;
# ifndef OPENSSL_NO_RSAstruct rsa_st *rsa;     /* RSA */
# endif
# ifndef OPENSSL_NO_DSAstruct dsa_st *dsa;     /* DSA */
# endif
# ifndef OPENSSL_NO_DHstruct dh_st *dh;       /* DH */
# endif
# ifndef OPENSSL_NO_ECstruct ec_key_st *ec;   /* ECC */
# endif} pkey;int save_parameters;STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */CRYPTO_RWLOCK *lock;
} /* EVP_PKEY */ ;

EVP源码结构

evp 源码位于 crypto/evp 目录,可以分为如下几类:

1) 全局函数

主要包括 c_allc.c、 c_alld.c 以及 names.c。他们加载 openssl 支持的所有的对称算法和摘要算法,放入到哈希表中。实现了 OpenSSL_add_all_digests、
OpenSSL_add_all_ciphers 以及 OpenSSL_add_all_algorithms(调用了前两个函数)函数。在进行计算时,用户也可以单独加载摘要函数( EVP_add_digest)和对称计算函数( EVP_add_cipher)。

2) BIO 扩充

包括 bio_b64.c、 bio_enc.c、 bio_md.c 和 bio_ok.c,各自实现了 BIO_METHOD方法,分别用于 base64 编解码、对称加解密以及摘要。

3) 摘要算法 EVP 封装

由 digest.c 实现,实现过程中调用了对应摘要算法的回调函数。各个摘要算法提供了自己的 EVP_MD 静态结构,对应源码为 m_xxx.c。

4) 对称算法 EVP 封装

由 evp_enc.c 实现,实现过程调用了具体对称算法函数,实现了 Update 操作。
各种对称算法都提供了一个 EVP_CIPHER 静态结构,对应源码为 e_xxx.c。需要注意的是, e_xxx.c 中不提供完整的加解密运算,它只提供基本的对于一个 block_size数据的计算,完整的计算由 evp_enc.c 来实现。当用户想添加一个自己的对称算法
时,可以参考 e_xxx.c 的实现方式。一般用户至少需要实现如下功能:
- 构造一个新的静态的 EVP_CIPHER 结构;
- 实现 EVP_CIPHER 结构中的 init 函数, 该函数用于设置 iv,设置加解密标记、以及根据外送密钥生成自己的内部密钥;
- 实现 do_cipher 函数,该函数仅对 block_size 字节的数据进行对称运算;
- 实现 cleanup 函数,该函数主要用于清除内存中的密钥信息。

5) 非对称算法 EVP 封装

主要是以 p_开头的文件。其中, p_enc.c 封装了公钥加密; p_dec.c 封装了私钥解密; p_lib.c 实现一些辅助函数; p_sign.c 封装了签名函数; p_verify.c 封装了验签函数; p_seal.c 封装了数字信封; p_open.c 封装了解数字信封。

6) 基于口令的加密

包括 p5_crpt2.c、 p5_crpt.c 和 evp_pbe.c。

OpenSSL之EVP(一)——数据结构及源码结构介绍相关推荐

  1. mysql源码包结构,mysql源码结构介绍

    mysql源码非常庞大,直接去看肯定毫无头绪.至少需要知道哪个目录是做什么的,才能有一定的条理.现在对mysql的源码结构做初步介绍 目录结构 ==来自622463 MySQL运维内参:MySQL.G ...

  2. 一、JDK 1.8源码分析-源码结构介绍篇

    1.路漫漫其修远兮 面试中经常被问到有没有看过一些框架的源码,要说看过么,看了不多,要说没看过么,没有系统的看完过,都是用到了去看: 2.如果想走技术这条路,还是好好看看吧,废话不多说,我这个已经开发 ...

  3. pnpm 源码结构及调试指南

    前言 随着前段时间尤大在 vue3 以及 vite 仓库中切换包管理为 pnpm 的 pr 成功 merge,以及 vue 生态中的一些项目例如 VueUse 也切换使用 pnpm,宣告着 vue 生 ...

  4. Redis 数据结构-字典源码分析

    2019独角兽企业重金招聘Python工程师标准>>> 相关文章 Redis 初探-安装与使用 Redis 数据结构-字符串源码分析 本文将从以下几个方面介绍 前言 字典结构图 字典 ...

  5. 数据结构-LinkedList源码解析

    可以关注我的微信公众号:xiaobei109208,每周一篇技术分享哦. "各位周末好呀-" "啊呸,程序员哪里来的周末" ​ 前两天怀着激动的心,颤抖的手写了 ...

  6. 【Android 系统开发】Android框架 与 源码结构

    一. Android 框架 Android框架层级 : Android 自下 而 上 分为 4层; -- Linux内核层; -- 各种库 和 Android运行环境层; -- 应用框架层; -- 应 ...

  7. android源码结构

    android源码结构 Android 2.1 |-- Makefile |-- bionic (bionic C库) |-- bootable (启动引导相关代码) |-- build (存放系统编 ...

  8. Linux内核移植之一:内核源码结构与Makefile分析

    内容来自 韦东山<嵌入式Linux应用开发完全手册> 一.内核介绍 1.版本及其特点 Linux内核的版本号可以从源代码的顶层目录下的Makefile中看到,比如下面几行它们构成了Linu ...

  9. android dts配置_AndroidLinux关于DTS设备树源码的介绍

    Android&Linux关于DTS设备树源码的介绍 Device tree是一种简单的节点和属性的树形结构.属性是键值对,而节点可能包括属性和子节点.画一颗电路板上CPU.总线.设备组成的树 ...

最新文章

  1. UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe6 in position 0: ordinal not in range(128)
  2. ubuntu 升级nodejs 和 npm
  3. Java之Callable和Runnable
  4. 学习,才是最好的投资~
  5. 从小小后视镜看物联网的生态(下)
  6. VC下sql+ado数据库v_strTemp.vt == VT_NULL判断的问题
  7. 推荐系统系列教程之十六:深度和宽度兼具的融合模型
  8. IntelliJ IDEA 面板、菜单介绍
  9. 各部件作用计算机,计算机硬件有哪些部件,各部件的作用是什么?
  10. springboot+vue+Elementui宠物医院管理系统java项目
  11. Linux LTP (一)
  12. Git + Github初入门
  13. Airtest框架和Poco框架常见问题
  14. 计算机动画主要学什么,动画专业主要学什么?
  15. div 设置a4大小_javascript – 拉伸div到A4大小
  16. 6-4 静态成员应用
  17. 托福写作1-opinions on food that are easier to prepare
  18. c连接mysql数据库字符串函数_在mysql数据库—— 字符串函数的运用
  19. VTK Cropping体绘制裁剪
  20. 国外毕业论文写作论证方面如何做好?

热门文章

  1. 在数据库如何对表进行查询
  2. 终端天线—2.IFA天线仿真
  3. spark的学习(2)之计算最受欢迎美食种类然后画词云
  4. 算法导论_第三版PDF
  5. DSPE-PEG-VAP/DCDX/LyP-1/M2pep/GLP-1/HP2/FNB/CPPs/CGKRKb 磷脂-聚乙二醇-多肽
  6. 将vscode打造成无敌的IDE(0)开发神器vscode介绍
  7. kalilinux配合python可以做什么_KaliLinux的主要功能_Kali Linux可以做什么-SEO技术蜘蛛屯...
  8. 关于http请求返回code:415的原因
  9. 莫烦pytorch学习笔记5
  10. nodejs的下载与安装