从本机代码返回托管状态会损坏返回的对象

马修敌人

我正在尝试使用C ++ / CLI和yubico的libu2f-host(https://github.com/Yubico/libu2f-host在WPF程序中为U2F身份验证构建实现我在C ++ / CLI中具有完全本机的功能dll会调用相应的libu2f函数,然后返回指向u2f_reply(我自己的类)的指针,该指针包含响应和错误代码。但是,当dll的托管部分接收到此对象时,响应代码仍然正确,但响应字符串似乎已完全损坏。

我尝试立即返回char指针,然后使用marshal将其转换为托管字符串,并且尝试使用标准C#字符串。我尝试使用memcpy将响应复制到reply-> response中,但是没有运气。

Managed_U2F_Reply^ Utilities::AuthenticateU2F(System::String^ challenge)
{
    IntPtr ptrToChallenge = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(challenge);
    u2f_reply* reply = NativeUtilities::AuthenticateU2F(static_cast<char*>(ptrToChallenge.ToPointer()));
    //clean up before return
    System::Runtime::InteropServices::Marshal::FreeHGlobal(ptrToChallenge);
    Managed_U2F_Reply^ managedReply = gcnew Managed_U2F_Reply();
    managedReply->ResultCode = reply->responseCode;
    if (managedReply->ResultCode == 0)
    {
        managedReply->Response = gcnew String(reply->response, 0, reply->length);
    }
    return managedReply;
}
struct u2f_reply
{
    int responseCode;
    int length;
    char* response;
};
u2f_reply* NativeUtilities::AuthenticateU2F(char* challenge)
{
    u2f_reply* reply = new u2f_reply();
    char response[2048] = { 0 };
    size_t response_len = sizeof(response);
    u2fh_devs* devs = NULL;
    u2fh_rc rc;
    u2fh_initflags flags = (u2fh_initflags)0;
    rc = u2fh_global_init(flags);
    if (rc != U2FH_OK)
    {
        reply->responseCode = rc;
        return reply;
    }
    rc = u2fh_devs_init(&devs);
    if (rc != U2FH_OK)
    {
        reply->responseCode = rc;
        return reply;
    }
    rc = u2fh_devs_discover(devs, NULL);
    if (rc != U2FH_OK)
    {
        reply->responseCode = rc;
        return reply;
    }
    rc = u2fh_authenticate2(devs, challenge, "https://demo.yubico.com", response, &response_len, U2FH_REQUEST_USER_PRESENCE);
    if (rc != U2FH_OK)
    {
        reply->responseCode = rc;
        return reply;
    }
    u2fh_devs_done(devs);
    u2fh_global_done();
    reply->length = response_len;
    reply->response = response;//adding printf here prints it out correctly, yet it doesn't when I call it in Utilities::AuthenticateU2F
    reply->responseCode = rc;
    return reply;
}

我希望它返回一个带有响应数据的json对象,如下所示:https : //developers.yubico.com/libu2f-host/,但是我得到了一个随机的ASCII字符串(不能在此处粘贴)并且没有错误

马修敌人

感谢Hans Passant,我使用以下方法解决了该问题:

u2f_reply* NativeUtilities::AuthenticateU2F(char* challenge)
{
    u2f_reply* reply = new u2f_reply();
    char response[2048] = { 0 };
    size_t response_len = sizeof(response);
    u2fh_devs* devs = NULL;
    u2fh_rc rc;
    u2fh_initflags flags = (u2fh_initflags)0;
    rc = u2fh_global_init(flags);
    if (rc != U2FH_OK)
    {
        reply->responseCode = rc;
        return reply;
    }
    rc = u2fh_devs_init(&devs);
    if (rc != U2FH_OK)
    {
        reply->responseCode = rc;
        return reply;
    }
    rc = u2fh_devs_discover(devs, NULL);
    if (rc != U2FH_OK)
    {
        reply->responseCode = rc;
        return reply;
    }
    rc = u2fh_authenticate2(devs, challenge, "https://demo.yubico.com", response, &response_len, U2FH_REQUEST_USER_PRESENCE);
    if (rc != U2FH_OK)
    {
        reply->responseCode = rc;
        return reply;
    }
    u2fh_devs_done(devs);
    u2fh_global_done();
    reply->length = response_len;
    reply->response = new char[response_len];
    memcpy_s(reply->response, response_len, response, response_len);
    reply->responseCode = rc;
    return reply;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

原始状态与托管状态的示例

服务对象返回状态

带有Cloudflare的S3托管网站返回任何路线的404状态代码

React(Facebook):受控复选框的托管状态

Flink如何处理托管状态的序列化?

状态返回未定义-反应本机

从graphql Yoga返回状态代码

HttpUrlConnection返回-1状态代码

为什么读取无阻塞套接字会返回错误状态代码

MVC3。当返回500状态代码时,浏览器会自行发出警报

即使出现“内部错误”,Rest API 也会返回状态代码 201

C#更改返回的类对象是否会更改原始状态?

使用 DotNetZip 压缩 pdf 文件会返回损坏的存档

友好恢复已损坏,继续返回退出状态1

为什么在常规IDE(如Visual Studio代码)上编译时,“ this”会返回Empty对象?

为什么打印 itertools.takewhile() 返回的对象的内容会破坏后面使用它的代码?

从托管代码调用本机函数

Spring MVC @RestController @ResponseBody类中如何使用HTTP状态代码响应以返回对象?

在C#中返回状态代码或复杂对象的理想方法是什么?

带有正确 HTTP 状态代码的 Web API PUT 返回对象

Web Api-如何返回带有201状态代码的动态对象

这段代码会返回false吗?

如何从SPA返回HTTP 404状态代码?

卷曲以返回http状态代码以及响应

Alamofire返回错误的HTTP状态代码成功

创建但不返回数据的端点的状态代码

在烧瓶中返回HTTP状态代码201

在烧瓶中返回HTTP状态代码201

Django频道daphne返回200状态代码