一 openssl堆栈
堆栈是一种先进后出的数据结构。openssl大量采用堆栈来存放数据。
它实现了一个通用的堆栈,可以方便的存储任意数据。
它实现了许多基本的堆栈操作,主要有:堆栈拷贝(sk_dup)、构建新堆栈(sk_new_null,sk_new)、插入数据(sk_insert)、删除数据(sk_delete)、查找数据(sk_find,sk_find_ex)、入栈(sk_push)、出栈(sk_pop)、获取堆栈元素个数(sk_num)、获取堆栈值(sk_value)、设置堆栈值(sk_set)和堆栈排序(sk_sort)。
二 openssl堆栈数据结构
openssl堆栈数据结构在stack.h中定义如下:
typedefstruct stack_st
{
int num;
char**data;
int sorted;
int num_alloc;
int(*comp)(constchar*const*,constchar*const*);
}STACK;
各字段意义如下:
num:堆栈中存放数据的个数。
data:用于存放数据地址,每个数据地址存放在data[0]到data[num-1]中。
sorted:堆栈是否已排序,如果排序则值为1,否则为0,堆栈数据一般是无序的,只有当用户调用了sk_sort操作,其值才为1。
comp:堆栈内存放数据的比较函数地址,此函数用于排序和查找操作;当用户生成一个新堆栈时,可以指定comp为用户实现的一个比较函数;或当堆栈已经存在时通过调用sk_set_cmp_func函数来重新指定比较函数。
注意,用户不需要调用底层的堆栈函数(sk_sort、sk_set_cmp_func等),而是调用他通过宏实现的各个函数。
三 openssl堆栈源码
openssl堆栈实现源码位于crypto/stack目录下。下面分析了部分函数。
1、sk_set_cmp_func
此函数用于设置堆栈存放数据的比较函数。由于堆栈不知道用户存放的是什么数据,所以,比较函数必须由用户自己实现。
2、sk_find
根据数据地址来查找它在堆栈中的位置。当堆栈设置了比较函数时,它首先对堆栈进行排序,然后通过二分法进行查找。如果堆栈没有设置比较函数,它只是简单的比较数据地址来查找.
3、sk_sort
本函数对堆栈数据排序。它首先根据sorted来判断是否已经排序,如果未排序则调用了标准C函数qsort进行快速排序。
4、sk_pop_free
本函数用于释放堆栈内存放的数据以及堆栈本身,它需要一个由用户指定的针对具体数据的释放函数。如果用户仅调用sk_free函数,则只会释放堆栈本身所用的内存,而不会释放数据内存。
四 定义用户自己的堆栈函数
用户直接调用最底层的堆栈操作函数是一个麻烦的事情,对此openssl提供了用宏来帮助用户实现接口。用户可以参考safestack.h来定义自己的上层堆栈操作函数,举例如下,safestack.h定义了如下关于GENERAL_NAME数据结构的堆栈操作:
#define sk_GENERAL_NAME_new(st) SKM_sk_new(GENERAL_NAME,(st))
#define sk_GENERAL_NAME_new_null() SKM_sk_new_null(GENERAL_NAME)
#define sk_GENERAL_NAME_free(st) SKM_sk_free(GENERAL_NAME,(st))
#define sk_GENERAL_NAME_num(st) SKM_sk_num(GENERAL_NAME,(st))
#define sk_GENERAL_NAME_value(st, i) SKM_sk_value(GENERAL_NAME,(st),(i))
#define sk_GENERAL_NAME_set(st, i, val) SKM_sk_set(GENERAL_NAME,(st),(i),(val))
#define sk_GENERAL_NAME_zero(st) SKM_sk_zero(GENERAL_NAME,(st))
#define sk_GENERAL_NAME_push(st, val) SKM_sk_push(GENERAL_NAME,(st),(val))
#define sk_GENERAL_NAME_unshift(st, val) SKM_sk_unshift(GENERAL_NAME,(st),(val))
#define sk_GENERAL_NAME_find(st, val) SKM_sk_find(GENERAL_NAME,(st),(val))
#define sk_GENERAL_NAME_find_ex(st, val) SKM_sk_find_ex(GENERAL_NAME,(st),(val))
#define sk_GENERAL_NAME_delete(st, i) SKM_sk_delete(GENERAL_NAME,(st),(i))
#define sk_GENERAL_NAME_delete_ptr(st, ptr) SKM_sk_delete_ptr(GENERAL_NAME,(st),(ptr))
#define sk_GENERAL_NAME_insert(st, val, i) SKM_sk_insert(GENERAL_NAME,(st),(val),(i))
#define sk_GENERAL_NAME_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(GENERAL_NAME,(st),(cmp))
#define sk_GENERAL_NAME_dup(st) SKM_sk_dup(GENERAL_NAME, st)
#define sk_GENERAL_NAME_pop_free(st, free_func) SKM_sk_pop_free(GENERAL_NAME,(st),(free_func))
#define sk_GENERAL_NAME_shift(st) SKM_sk_shift(GENERAL_NAME,(st))
#define sk_GENERAL_NAME_pop(st) SKM_sk_pop(GENERAL_NAME,(st))
#define sk_GENERAL_NAME_sort(st) SKM_sk_sort(GENERAL_NAME,(st))
#define sk_GENERAL_NAME_is_sorted(st) SKM_sk_is_sorted(GENERAL_NAME,(st))
当用户想对GENERAL_NAME数据进行堆栈操作时,调用上面由宏定义的函数即可,即直观又方便。比如用户想设置堆栈数据的比较函数和对堆栈排序时,可分别调用:sk_GENERAL_NAME_set_cmp_func和sk_GENERAL_NAME_sort。
五 openssl堆栈编程实例
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<openssl/safestack.h>
#define sk_Student_new(st) SKM_sk_new(Student,(st))
#define sk_Student_new_null() SKM_sk_new_null(Student)
#define sk_Student_free(st) SKM_sk_free(Student,(st))
#define sk_Student_num(st) SKM_sk_num(Student,(st))
#define sk_Student_value(st, i) SKM_sk_value(Student,(st),(i))
#define sk_Student_set(st, i, val) SKM_sk_set(Student,(st),(i),(val))
#define sk_Student_zero(st) SKM_sk_zero(Student,(st))
#define sk_Student_push(st, val) SKM_sk_push(Student,(st),(val))
#define sk_Student_unshift(st, val) SKM_sk_unshift(Student,(st),(val))
#define sk_Student_find(st, val) SKM_sk_find(Student,(st),(val))
#define sk_Student_delete(st, i) SKM_sk_delete(Student,(st),(i))
#define sk_Student_delete_ptr(st, ptr) SKM_sk_delete_ptr(Student,(st),(ptr))
#define sk_Student_insert(st, val, i) SKM_sk_insert(Student,(st),(val),(i))
#define sk_Student_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(Student,(st),(cmp))
#define sk_Student_dup(st) SKM_sk_dup(Student, st)
#define sk_Student_pop_free(st, free_func) SKM_sk_pop_free(Student,(st),(free_func))
#define sk_Student_shift(st) SKM_sk_shift(Student,(st))
#define sk_Student_pop(st) SKM_sk_pop(Student,(st))
#define sk_Student_sort(st) SKM_sk_sort(Student,(st))
typedefstructStudent_st
{
char*name;
int age;
char*otherInfo;
}Student;
typedef STACK_OF(Student)Students;
Student*Student_Malloc()
{
Student*a=malloc(sizeof(Student));
a->name=(char*)malloc(sizeof(char)*20);
strcpy(a->name,"zcp");
a->otherInfo=(char*)malloc(sizeof(char)*20);
strcpy(a->otherInfo,"no info");
return a;
}
voidStudent_Free(Student*a)
{
free(a->name);
free(a->otherInfo);
free(a);
}
int main()
{
Students*s;
Student*s1,*one;
int i,num;
s=sk_Student_new_null();/* 新建一个堆栈对象 */
s1=Student_Malloc();
sk_Student_push(s,s1);
num=sk_Student_num(s);
for(i=0; i<num; i++)
{
one=sk_Student_value(s,i);
printf("student name : %s\n",one->name);
printf("sutdent age : %d\n",one->age);
printf("student otherinfo : %s\n\n\n",one->otherInfo);
}
sk_Student_pop_free(s,Student_Free);
return0;
}
运行结果
[root@localhost ~]# cd /
[root@localhost /]# cd /openssl-1.1.0c/test
[root@localhost test]# gcc example1.c -o example1 -L/usr/lib -lssl -lcrypto
[root@localhost test]#./example1
student name : zcp
sutdent age :1934268344
student otherinfo : no info
相关推荐
heartleech, 使用完整的OpenSSL堆栈演示"heartbleed" 问题 heartleech这是典型的"n 。Heartbleed"工具。 它可以扫描受 Bug 攻击的系统,然后被用来下载它们。 一些重要功能:确定目标是否受攻击的结论性/结论性判定...
OpenSSL堆栈的实现细节可以在其源代码中找到,通过阅读源码可以更深入地理解其实现机制。 #### 3.4 定义用户自己的堆栈函数 OpenSSL允许用户定义自己的堆栈函数,以满足特定的应用需求。 #### 3.5 编程示例 具体的...
3.1 OpenSSL堆栈:OpenSSL中广泛使用堆栈数据结构来存储和管理对象,如X509证书链。 3.2 数据结构:讨论了堆栈的数据结构设计,包括元素的添加、删除和遍历。 3.3 源码:分析了堆栈相关函数的实现细节。 3.4 定义...
之后,文档详细说明了OpenSSL堆栈的结构和操作。堆栈是计算机科学中常见的数据结构,用于保存和恢复数据,支持后进先出(LIFO)的操作模式。 哈希表是一种通过哈希函数来实现快速数据查找的数据结构,它在OpenSSL...
**3.1 OpenSSL堆栈** - **概念**:堆栈是OpenSSL内部用于存储一组元素的数据结构。 - **应用场景**:在许多地方被用作临时存储数据的容器。 **3.2 数据结构** - **结构体**:`STACK_OF(type)`,其中type是元素的...
1. **OpenSSL堆栈**:在OpenSSL中,堆栈是一种常用的数据结构,用于存储和管理对象,如X509证书链。 2. **数据结构**:OpenSSL使用了许多复杂的数据结构,如BIO( BIOs,Basic Input/Output System)用于抽象输入...
13 2.3 openssl源代码 14 2.4 openssl学习方法 16 第三章openssl堆栈 17 3.1 openssl堆栈 17 3.2 数据结构 17 3.3 源码 17 3.4 定义用户自己的堆栈函数 18 3.5 编程示例 19 第四章 ...
**3.1 OpenSSL堆栈** OpenSSL提供了一种名为STACK的数据结构用于存储多个同类型元素,如证书链中的多个证书对象。 **3.2 数据结构** STACK数据结构通常用于存储一组相同类型的对象,例如X509证书或ASN.1结构。 *...
3.1 openssl堆栈 17 3.2 数据结构 17 3.3 源码 18 3.4 定义用户自己的堆栈函数 18 3.5 编程示例 19 第四章 哈希表 21 4.1 哈希表 21 4.2 哈希表数据结构 21 4.3 函数说明 23 4.4 编程示例 25 第五章 内存分配 27 5.1...
堆栈是 OpenSSL 库中的一种数据结构,用于存储和管理加密数据。堆栈的优点是可以快速地存储和检索加密数据,但是缺点是需要占用一定的内存空间。 openssl 堆栈 OpenSSL 库中的堆栈是指用于存储和管理加密数据的...
13 2.3 openssl源代码 14 2.4 openssl学习方法 16 第三章openssl堆栈 17 3.1 openssl堆栈 17 3.2 数据结构 17 3.3 源码 17 3.4 定义用户自己的堆栈函数 18 3.5 编程示例 19 第四章 ...
**3.1 OpenSSL堆栈** - **定义**: OpenSSL内部使用堆栈来存储和管理一系列对象,如证书链、X509对象等。 - **优点**: 方便管理和访问这些对象。 **3.2 数据结构** - **堆栈结构**: 主要包括`STACK_OF`宏,用于...