LPdir没有实现,它的用途是什么?

时间:2015-02-03 09:35:04

标签: c openssl

我在非* nix / Windows / Mac平台上遇到Openssl问题。

同样的C代码(除了一些调整使它在Windows上运行,SSL逻辑是相同的)在Windows上和在我的平台上完美配合。服务器和客户端可以相互验证。 但是在我的平台上,客户端不会对服务器进行身份验证。即使在WIndows上运行客户端时,服务器证书也无效。 我还通过CA和证书所在的命令行对openssl进行了双重检查。所以这是我平台上的一个问题。

当我在我的平台上编译时,我有一些警告,这可能与此有关。

一个是LPDIR_H。我有LPdir_nyi.h(尚未实现)。此文件中的函数查找文件(LP_find_file)并查找文件的END(LP_find_file_end)。也许这就是问题所在。

这些文件何时使用?我找不到这些功能的明显调用,所以我不知道它们是否被openssl使用?

编辑: 我应该补充说,函数SSL_CTX_load_verify_locations正确返回。调查是否由它调用SSL_add_dir_cert_subjects_to_stack。

1 个答案:

答案 0 :(得分:1)

它们是OPENSSL_DIR_readOPENSSL_DIR_end的实现。来自crypto/o_dir.c

/* The routines really come from the Levitte Programming, so to make
   life simple, let's just use the raw files and hack the symbols to
   fit our namespace.  */
#define LP_DIR_CTX OPENSSL_DIR_CTX
#define LP_dir_context_st OPENSSL_dir_context_st
#define LP_find_file OPENSSL_DIR_read
#define LP_find_file_end OPENSSL_DIR_end

#include "o_dir.h"

#define LPDIR_H
#if defined OPENSSL_SYS_UNIX || defined DJGPP
#include "LPdir_unix.c"
#elif defined OPENSSL_SYS_VMS
#include "LPdir_vms.c"
#elif defined OPENSSL_SYS_WIN32
#include "LPdir_win32.c"
#elif defined OPENSSL_SYS_WINCE
#include "LPdir_wince.c"
#else
#include "LPdir_nyi.c"
#endif

是的,他们确实#define函数在#including定义之前命名为其他名称,因此编译器永远不会看到任何符号LP_find_fileLP_find_file_end。就预处理器之后的任何内容而言,它们将被称为OPENSSL_DIR_readOPENSSL_DIR_end

OPENSSL_DIR_read中使用了{p> SSL_add_dir_cert_subjects_to_stack,因此您的问题可能与此相关似乎是合理的。

这些功能也不是非常复杂,重新实现起来应该相当简单。 LP_find_file(好,OPENSSL_DIR_read)在第一次调用目录上下文时(即使用空指针的地址)打开目录上下文,并返回描述上下文和目录中第一个文件名的内容,从第二次调用开始,只需步骤到下一个文件名,直到不再有,然后返回NULLLP_find_file_end / OPENSSL_DIR_end只关闭上下文。我不知道你正在做什么平台,但如果它的API中没有可以很容易映射到这个功能的函数,我会感到惊讶。