脱离VS调试环境调用C++ DLL触发SAM卡认证失败问题求助
SAM卡认证脱离VS调试环境运行失败问题
问题背景
对现有软件做二次开发,实现向智能卡写入数据的功能。原方案通过HSM生成密钥,现根据客户要求切换为使用SAM卡完成密钥生成操作。
代码改造完成后出现异常:程序在Visual Studio(以下简称VS)附加调试状态下运行完全正常,但脱离VS环境直接运行程序时,会触发SAM card authentication failed(SAM卡认证失败)错误。
现状说明
- 认证流程需调用客户提供的C++动态库生成SAM卡对应的APDU指令,该库无源码,属于黑盒组件;SAM卡、可实现与该DLL同等功能的CLI测试程序均由客户提供。
- 已分别针对该DLL、CLI程序开发了C#封装层:调用CLI封装层时,无论VS调试环境还是脱离VS直接运行已安装程序,SAM卡认证流程均正常;调用DLL封装层时,仅VS调试环境下认证正常,脱离VS运行即认证失败。
- 两种场景下使用的C#业务代码完全一致,仅切换DLL/CLI封装调用,唯一变量为运行环境;经初步排查,DLL及其所有依赖项均可正常加载,问题根因暂未定位。
核心SAM卡认证代码
public bool AuthenticateOnSamCard(PCSCReader reader, string transportKey) { // Step 1 var apduStep1 = SAMHandlerCommandExecutor.AuthStep1(); reader.SCard.Connect(reader.SCard.ReaderName, SCARD_SHARE_MODE.Shared, SCARD_PROTOCOL.Tx); var response = reader.Exchange(apduStep1); //-> Auth step var dataStep1 = SAMHandlerCommandExecutor.GetData(response); if (dataStep1[0][0] != 1) { reader.SCard.Disconnect(); return false; } // Step 2 var apduStep2 = SAMHandlerCommandExecutor.AuthStep2(transportKey, dataStep1[1]); response = reader.Exchange(apduStep2[0]); //-> Auth step 2 var dataStep2 = SAMHandlerCommandExecutor.GetData(response); if (dataStep2[0][0] != 1) { reader.SCard.Disconnect(); return false; } // Step 3 var apduStep3 = SAMHandlerCommandExecutor.AuthStep3(transportKey, dataStep2[1], apduStep2); response = reader.Exchange(apduStep3); if (SAMHandlerCommandExecutor.Verify(response)) { Console.WriteLine($"Sam Authentication OK"); Program.Logger.Info($"Sam Authentication OK"); return true; } return false; }
求助诉求
恳请各位技术同仁提供问题排查思路与解决方案建议。
内容的提问来源于stack exchange,提问作者Guillermo Espert
相关产品推荐
相关产品推荐

