如何将我自己的哈希(摘要)算法添加到 openssl
How can add my own hash(digest) algorithm to openssl
我想在 openvpn 配置中使用我自己的哈希算法。我想我应该在openssl(库)中定义它,我以MD5算法为例,看看它是如何定义的。我做了类似 MD5 的操作,但我的算法尚未添加!我使用命令 "openvpn --show-digests" 检查这个。你能给我推荐一些关于这个的文件吗?我在 crypto/evp/m_myhash.c 中添加了 "m_myhash.c"(比如 m_md5.c)
#include <stdio.h>
#include "cryptlib.h"
#ifndef OPENSSL_NO_MD5
# include <openssl/evp.h>
# include <openssl/objects.h>
# include <openssl/x509.h>
# include <openssl/md5.h>
# ifndef OPENSSL_NO_RSA
# include <openssl/rsa.h>
# endif
# include "evp_locl.h"
static int init(EVP_MD_CTX *ctx)
{
return MD5_Init(ctx->md_data);
}
static int update(EVP_MD_CTX *ctx, const void *data, size_t count)
{
return MD5_Update(ctx->md_data, data, count);
}
static int final(EVP_MD_CTX *ctx, unsigned char *md)
{
return MD5_Final(md, ctx->md_data);
}
static const EVP_MD myhash_md = {
NID_md5,
NID_md5WithRSAEncryption,
MD5_DIGEST_LENGTH,
0,
init,
update,
final,
NULL,
NULL,
EVP_PKEY_RSA_method,
MD5_CBLOCK,
sizeof(EVP_MD *) + sizeof(MD5_CTX),
};
const EVP_MD *EVP_myhash(void)
{
return (&myhash_md);
}
#endif
我没有改变函数,我使用了 md5 的函数。(我想了解定义一个新的哈希算法应该如何以及在哪里完成和编译,所以现在我使用 md5 的 init,update,... )
我在 crypto/evp/Makefile 中添加了一些行来编译 m_myhash.c 并生成了它的目标文件。
然后我添加了这个EVP_add_digest(EVP_myhash());
void OpenSSL_add_all_digests(void)
{
#ifndef OPENSSL_NO_MD4
EVP_add_digest(EVP_md4());
#endif
#ifndef OPENSSL_NO_MD5
EVP_add_digest(EVP_md5());
EVP_add_digest_alias(SN_md5, "ssl2-md5");
EVP_add_digest_alias(SN_md5, "ssl3-md5");
EVP_add_digest(EVP_myhash());
#endif
...
}
到此文件 crypto/evp/c_alld.c
.
我添加了这个
#define SN_myhash "MYHASH"
#define LN_myhash "myhash"
#define NID_myhash 920
#define OBJ_myhash OBJ_rsadsi,2L,5L
归档 crypto/evp/c_alld.c
。 (这里最后一行也和md5一样,我不太确定!)
我加了
920, /* OBJ_gholi 1 2 840 113549 2 5 */
我添加了这一行
920, /* OBJ_gholi 1 2 840 113549 2 5 */
归档crypto/objects/obj_dat.h
我在文件 crypto/objects/obj_dat.h
中的这个结构中添加了 {"MYHASH","myhash",NID_myhash,8,&(lvalues[5973]),0},
static const ASN1_OBJECT nid_objs[NUM_NID]={
{"UNDEF","undefined",NID_undef,0,NULL,0},
{"rsadsi","RSA Data Security, Inc.",NID_rsadsi,6,&(lvalues[0]),0},
{"pkcs","RSA Data Security, Inc. PKCS",NID_pkcs,7,&(lvalues[6]),0},
{"MD2","md2",NID_md2,8,&(lvalues[13]),0},
{"MD5","md5",NID_md5,8,&(lvalues[21]),0},
{"MYHASH","myhash",NID_myhash,8,&(lvalues[5973]),0},
{"RC4","rc4",NID_rc4,8,&(lvalues[29]),0},
...
}
我添加了这个
gholi 920
提交 crypto/objects/obj_mac.num
还添加了
const EVP_MD *EVP_gholi(void);
归档crypto/evp/evp.h
我是 openssl 代码的新手,我很确定我可能做了盲目和愚蠢的事情,对此深表歉意!
我找到了答案,我定义了一个像 gost
(engines/ccgost) 这样的新引擎,并使用 MD_DIGEST EVP 结构定义了一个新的摘要(可以从 gost 摘要算法中获得帮助: engines/ccgost/gost_md.c)。然后我加载我的引擎并使用它的摘要算法。
有关更多详细信息,可以将此 Introduce GOST R 34.11-2012 hash function 视为示例。
我想在 openvpn 配置中使用我自己的哈希算法。我想我应该在openssl(库)中定义它,我以MD5算法为例,看看它是如何定义的。我做了类似 MD5 的操作,但我的算法尚未添加!我使用命令 "openvpn --show-digests" 检查这个。你能给我推荐一些关于这个的文件吗?我在 crypto/evp/m_myhash.c 中添加了 "m_myhash.c"(比如 m_md5.c)
#include <stdio.h>
#include "cryptlib.h"
#ifndef OPENSSL_NO_MD5
# include <openssl/evp.h>
# include <openssl/objects.h>
# include <openssl/x509.h>
# include <openssl/md5.h>
# ifndef OPENSSL_NO_RSA
# include <openssl/rsa.h>
# endif
# include "evp_locl.h"
static int init(EVP_MD_CTX *ctx)
{
return MD5_Init(ctx->md_data);
}
static int update(EVP_MD_CTX *ctx, const void *data, size_t count)
{
return MD5_Update(ctx->md_data, data, count);
}
static int final(EVP_MD_CTX *ctx, unsigned char *md)
{
return MD5_Final(md, ctx->md_data);
}
static const EVP_MD myhash_md = {
NID_md5,
NID_md5WithRSAEncryption,
MD5_DIGEST_LENGTH,
0,
init,
update,
final,
NULL,
NULL,
EVP_PKEY_RSA_method,
MD5_CBLOCK,
sizeof(EVP_MD *) + sizeof(MD5_CTX),
};
const EVP_MD *EVP_myhash(void)
{
return (&myhash_md);
}
#endif
我没有改变函数,我使用了 md5 的函数。(我想了解定义一个新的哈希算法应该如何以及在哪里完成和编译,所以现在我使用 md5 的 init,update,... )
我在 crypto/evp/Makefile 中添加了一些行来编译 m_myhash.c 并生成了它的目标文件。
然后我添加了这个EVP_add_digest(EVP_myhash());
void OpenSSL_add_all_digests(void)
{
#ifndef OPENSSL_NO_MD4
EVP_add_digest(EVP_md4());
#endif
#ifndef OPENSSL_NO_MD5
EVP_add_digest(EVP_md5());
EVP_add_digest_alias(SN_md5, "ssl2-md5");
EVP_add_digest_alias(SN_md5, "ssl3-md5");
EVP_add_digest(EVP_myhash());
#endif
...
}
到此文件 crypto/evp/c_alld.c
.
我添加了这个
#define SN_myhash "MYHASH"
#define LN_myhash "myhash"
#define NID_myhash 920
#define OBJ_myhash OBJ_rsadsi,2L,5L
归档 crypto/evp/c_alld.c
。 (这里最后一行也和md5一样,我不太确定!)
我加了
920, /* OBJ_gholi 1 2 840 113549 2 5 */
我添加了这一行
920, /* OBJ_gholi 1 2 840 113549 2 5 */
归档crypto/objects/obj_dat.h
我在文件 crypto/objects/obj_dat.h
{"MYHASH","myhash",NID_myhash,8,&(lvalues[5973]),0},
static const ASN1_OBJECT nid_objs[NUM_NID]={
{"UNDEF","undefined",NID_undef,0,NULL,0},
{"rsadsi","RSA Data Security, Inc.",NID_rsadsi,6,&(lvalues[0]),0},
{"pkcs","RSA Data Security, Inc. PKCS",NID_pkcs,7,&(lvalues[6]),0},
{"MD2","md2",NID_md2,8,&(lvalues[13]),0},
{"MD5","md5",NID_md5,8,&(lvalues[21]),0},
{"MYHASH","myhash",NID_myhash,8,&(lvalues[5973]),0},
{"RC4","rc4",NID_rc4,8,&(lvalues[29]),0},
... }
我添加了这个
gholi 920
提交 crypto/objects/obj_mac.num
还添加了
const EVP_MD *EVP_gholi(void);
归档crypto/evp/evp.h
我是 openssl 代码的新手,我很确定我可能做了盲目和愚蠢的事情,对此深表歉意!
我找到了答案,我定义了一个像 gost
(engines/ccgost) 这样的新引擎,并使用 MD_DIGEST EVP 结构定义了一个新的摘要(可以从 gost 摘要算法中获得帮助: engines/ccgost/gost_md.c)。然后我加载我的引擎并使用它的摘要算法。
有关更多详细信息,可以将此 Introduce GOST R 34.11-2012 hash function 视为示例。