利用STACK_OF宏可以快速实现一个自动增长的堆栈,由于堆栈可以作为一个数组来使用,所以OpenSSL中很多地方都使用了。STACK_OF宏来实现大小不固定的数组。
typedef struct stack_st {
int num; //当前的堆栈元素数量
char **data; //堆栈元素,其实就是一系列的指针
int sorted;
int num_alloc; //当前的最大容量
int (*comp)(const char * const *, const char * const *);
} STACK;
#define STACK_OF(type) struct stack_st_##type
#define PREDECLARE_STACK_OF(type) STACK_OF(type);
#define DECLARE_STACK_OF(type) /
STACK_OF(type) /
{ /
STACK stack; /
};
//实现一个stack的分配操作
STACK *sk_new(int (*c)(const char * const *, const char * const *))
{
STACK *ret;
int i;
(STACK *)OPENSSL_malloc(sizeof(STACK)); //分配STACK本身
ret->data=(char **)OPENSSL_malloc(sizeof(char *)*MIN_NODES); //分配堆栈中的指针,最小分配MIN_NODES个
for (i=0; i<MIN_NODES; i++) //初始化
ret->data[i]=NULL;
ret->comp=c;
ret->num_alloc=MIN_NODES;
ret->num=0;
ret->sorted=0;
return(ret);
...
}
//实现了push操作
int sk_insert(STACK *st, char *data, int loc)
{
char **s;
if(st == NULL) return 0;
if (st->num_alloc <= st->num+1) { //如果空间不够了,那么再分配,其实就是增加原来的空间
s=(char **)OPENSSL_realloc((char *)st->data,
(unsigned int)sizeof(char *)*st->num_alloc*2);
if (s == NULL)
return(0);
st->data=s;
st->num_alloc*=2;
}
if ((loc >= (int)st->num) || (loc < 0))
st->data[st->num]=data;
else {
int i;
char **f,**t;
f=(char **)st->data;
t=(char **)&(st->data[1]);
for (i=st->num; i>=loc; i--)
t[i]=f[i];
st->data[loc]=data;
}
st->num++;
st->sorted=0;
return(st->num);
}
这个结构主要是为了迎合一些拥有变长字段的结构体,在linux内核中也不乏这样的策略,比如netfilter和路由表等等,这个设计十分符合协议的设计,十分符合拥有定长头和变长数据的数据结构的设计,我十分喜欢,如果说brk是操作系统层次的分配,而malloc是库的分配的话,我宁愿相信这种自动增长的堆栈是一种更加合理的malloc或者更加合理的slab,它比传统的malloc更能有效组织同类型数据,并且代表了一种更高层次的资源分配,通过这个数据结构可以理解数组和指针的区别,可以得到一种和谭浩强不同的一种理解内存构造的方式。
分享到:
相关推荐
openssl rc4 java 实现,我已经和C++的运算结果对比过了的
实现EVP_aes_128(256)_ecb模式,适合初学者熟悉openssl中的加密解密函数。可运行..
本模板程序定义了实现openssl ENGINE的Engine框架。 实现的基本思路是要通过Engine来替换openssl原来的 ASE-CBC算法和MD5算法。 本程序定义了必须实现的接口。用户只需要根据程序中 的说明,实现相应的接口即可...
此资源包含了LINUX 下 OPENSSL 的证书生成和CS 模型实现的源代码。可以简单的实现通信
基于openssl和ndk,实现c++版MD5及位运算生成一个32位的字符串;该模块是一个集成了openssl静态库的资源,下载后可直接运行。
openssl实现服务器和客户端
介绍OPENSSL的ENGINE机制,以及简单实现
利用C++ openssl库实现DES加密算法的CBC模式加解密。源码直接可以利用。 供初学者参考。
openssl 1.0.2d版本中实现openssl 加解密 engine 的适配,实现了AES128/256,RSA算的的engine引擎
linux c 使用openssl实现SHA1WithRSA实现,签名,验签
java的ssl客户端编程与LINUX的OpenSSL服务器通讯的实现及有关文档 附件中包含本人开发工程中使用过的DEMO程序及制作证书的解本文件
openssl动态调用dll实现传输,可以通过证书进行验证,然后在通过TCP/IP协议进行传输. 只需要IP地址与端口号 版本 V1.1.0
openssl中文简介.doc
需要了解 ECC 加密的,可以参考一下,这个是基于openssl 的ECC 算法。解压后,test_ecc 里面是测试代码,大家看看,就明白了ECC算法的流程,里面有生成key,加密、解密。
Qt利用OpenSSl实现RSA数字签名 http://blog.csdn.net/usister/article/details/74390949资源描述 欢迎评论
基于OpenSSL的SM2软实现库及测试程序
基于Openssl算法库实现的SM2算法。实现数字签名和密钥交换,公钥加密没有实现。全部源代码,需要Openssl库支持,VC工程。 KDF使用标准HASH算法,没有使用SM3。 可参考作者的SM3算法实现KDF。 ECC曲线使用SM2算法建议...
对sha256在openssl库中调用和组装生成可以执行的基于openssl库的sha256模块,可供之后的生日攻击和长度扩展攻击等使用该模块。 可以运行test.cpp对该模块的散列加密功能进行简单测试。 运行指导 将源码clone到...
qt openssl相关操作
1.该程序是基于OpenSSL的使用纯C语言来实现RSA加解密的,在Linux环境下开发完成,建议在Linux环境下使用(在Windows环境下需要自行修改); 2.该程序具有生成RSA密钥对、RSA公钥加密和RSA私钥解密的功能,支持手动...