【问题标题】:std::bad_alloc using Botan for PKCS#11std::bad_alloc 使用 Botan 进行 PKCS#11
【发布时间】:2019-12-21 00:40:36
【问题描述】:

我是 C++ 新手,我真的坚持使用 Botan 连接到硬件加密令牌。我不知道我是否错过了 libs 或 dll 的任何设置。

我基于Building Botan library in Windows 10构建了Botan库。 botan.libbotan.dll 是在构建后在 lib 文件夹中创建的。

然后我使用以下简单代码在 Visual Studio 2019 中创建一个控制台应用程序:

#include <iostream>
#include <botan/botan.h>

#include <botan/p11.h>
#include <botan/p11_slot.h>
#include <botan/p11_session.h>
#include <botan/p11_module.h>
#include <botan/p11_object.h>
#include <botan/p11_randomgenerator.h>

#include <botan/p11_x509.h>
#include <botan/x509_dn.h>

using namespace Botan; 
using namespace PKCS11;

int main()
{
    Botan::PKCS11::Module module("C:\\Windows\\System32\\ShuttleCsp11_3003.dll");
    // Sometimes useful if a newly connected token is not detected by the PKCS#11 module
    module.reload();

    Botan::PKCS11::Info info = module.get_info();

    // print library version
    std::cout << std::to_string(info.libraryVersion.major) << "."
        << std::to_string(info.libraryVersion.minor) << std::endl;
}

这是我准备运行的设置:

配置属性→VC++ 目录:

  1. 包含目录 → 添加 C:\Botan\include\botan-2;
  2. 可执行目录 → 添加 C:\Botan\bin;
  3. 库目录→添加C:\Botan\lib;
  4. 源码目录→添加C:\Botan\src;
  5. 其他包含库 → 添加 C:\Botan\include\botan-2

链接器

  1. 附加库目录→添加C:\Botan\lib;
  2. 输入 → 附加依赖 → 添加 C:\Botan\lib\botan.lib

我还安装了 dll 在 System32 文件夹中的令牌驱动程序;

当我使用 x86 构建 Botan 库时,我使用以下配置调试项目:

我需要你帮助解决的错误是:

Unhandled exception at 0x74CD2CF2 in ConsoleApplication1.exe: Microsoft C++ exception:
std::bad_alloc at memory location 0x004FF1AC.

这行代码出现了这个错误:

Botan::PKCS11::Module module("C:\\Windows\\System32\\ShuttleCsp11_3003.dll");

这是调用栈

请注意,我在调试文件夹中复制了 botan.dll 和 ShuttleCsp11_3003.dll。

请大家帮忙,谢谢

【问题讨论】:

  • 尝试将调试符号从 Botan 库的输出目录复制到项目的 Debug 文件夹并开始调试。这可以解释上升异常点的一些细节。
  • @Alexander 请您解释一下我应该怎么做,谢谢
  • 构建调试版 Botan。将 botan.dllbotan.pdb 文件复制到测试项目的 Debug 文件夹中。当您开始调试您的测试应用程序时,异常点将不是内存中的虚拟地址。
  • @Alexander 我构建了 Botan 的调试版本,将这些文件复制到调试文件夹中。但问题是我如何包含在应用程序中。我的意思是在这种情况下,“#include ”不起作用,因为在调试模式下构建具有不同的包含路径并且没有 lib 文件夹。 botan.lib 和botan.dll 在botan 文件夹的主根目录中创建。如何处理包含和库目录?
  • @BzH 可能值得尝试使用另一个 pkcs#11 库(例如 SoftHSM)...祝你好运!

标签: c++ visual-studio cryptography pkcs#11 botan


【解决方案1】:

使用 Vcpkg,这是一个由 Microsoft 创建的工具,可帮助获取和构建开源 C 和 C++ 库,使用单行 shell 命令行自动安装 botan 并集成到您的 VS 2019 项目中。

从 GitHub 安装 vcpkg 后,在 PowerShell 提示符下键入以下命令以下载并安装包含所有依赖项的库:

.\vcpkg install botan:x86-windows

使用它来自动(或者您可以手动执行)将库集成到您的 VS 项目中。

.\vcpkg integrate install

这里是严重错误,这就是你的项目无法识别命名空间和包含文件的原因,包含目录→添加C:\Botan\include\botan-2不正确检查目录/文件名 botan-2,它不应该存在。

  • 应该是 C:\Botan\include;因为您的程序在文件夹路径中包含 botan(例如 #include "botan/botan.h")

将 dll 文件复制到您的项目目录(用于调试测试)和您的应用程序文件夹(调试或发布版本),并且在加载 PKCS#11 共享库时不要忘记更正 dll 文件夹路径。

【讨论】:

  • 集成后如何处理包含。 vcpkg 一切正常,但是在 VS2019 中创建了一个新的控制台应用程序之后,我该如何使用 Botan 方法。我是否应该使用命名空间。我应该设置任何配置吗?非常感谢
  • 如果您使用集成安装 botan 库将自动链接到您的 vs 2019 项目。否则,您可以从 vcpkg 安装目录手动链接。
  • 我使用集成安装成功,但代码行Botan::PKCS11::Module module("C:\\Windows\\System32\\ShuttleCsp11_3003.dll"); 有错误说它不知道Botan。我也尝试写#include &lt;botan.h&gt;,但 VS 无法识别它。 '使用命名空间 Botan;'也没有工作。我是 C++ 新手。也许那里有一个简单的错误。因为我确信使用 VCPKG 一切都会成功
  • 求助于手动链接。在 vcpkg\installed 下包含头文件夹和 lib 文件夹,并将 dll 文件复制到您的应用程序文件夹。可以确定你在 vs 项目设置中选择了带有多线程 DLL 的 x64 项目。
  • vcpkg 生成库的发布和调试版本。所以你可以通过引入合适的断点在 VC 中调试你的代码。 github.com/randombit/botan 下提供了几个植物代码用于测试。因此,您可以通过指定的 pin 找出异常是否是在会话登录期间。