我想在openvpn配置中使用我自己的哈希算法我想我应该在openssl(library)中定义它,并以MD5算法为例来了解它是如何定义的我做了一些类似MD5的事情,但是我的算法还没有添加我使用命令“openvpn--show digests”检查这个。你能给我介绍一些关于这个的文件吗?我在crypto/evp/m_myhash.c(比如m_md5.c)中添加了“m_myhash.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
我在文件{"MYHASH","myhash",NID_myhash,8,&(lvalues[5973]),0},中将crypto/objects/obj_dat.h添加到这个结构中
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/c c gost),并使用md_digest evp struct定义了一个新的摘要(可以从gost摘要算法:engines/ccgost/gost_md.c获得帮助)。然后我加载我的引擎并使用它的摘要算法。
有关更多细节,可以将此Introduce GOST R 34.11-2012 hash function作为示例。

07-24 19:02