一种生成利用智能卡登录远程计算机的判据的方法

文档序号:7807708阅读:507来源:国知局
一种生成利用智能卡登录远程计算机的判据的方法
【专利摘要】本发明公开一种生成利用智能卡登录远程计算机的判据的方法,包括:当第一函数被调用时,中间件创建CSP上下文对象,将智能卡对象的索引和容器对象的索引保存到CSP上下文对象中;当第二函数被调用时,中间件在CSP上下文对象中执行将智能卡对象中的所有容器对象和所有证书对象注册至当前系统证书库中;将当前系统证书库的句柄和句柄长度分别赋值给第三参数和第四参数;当第三函数被调用时,中间件在CSP上下文对象中查找非对称交换密钥在智能卡中的引用索引;当第十函数被调用时,中间件下层应用使用与引用索引对应的私钥对CSP上下文对象中的哈希值进行签名,中间件将签名结果作为利用智能卡登录远程计算机的判据。
【专利说明】一种生成利用智能卡登录远程计算机的判据的方法

【技术领域】
[0001] 本发明涉及计算机领域,具体涉及一种生成利用智能卡登录远程计算机的判据的 方法。

【背景技术】
[0002] 在Windows xp及之前的操作系统中,所有的可执行程序都运行在同一个会话的上 下文中,并没有将资源进行隔离。上层应用与智能卡进行正常通讯的过程中,中间件需要对 智能卡进行实时监控,即创建一个子线程,用来不停地枚举操作系统中的读卡器,通过分析 读卡器的状态来完成对智能卡设备的监控。以上所述方法同样适用利用智能卡登录远程计 算机的环境中。
[0003] 在Windows Vista以及之后出现的操作系统版本中,操作系统可以有多个会话,可 执行程序可以运行在不同的会话上下文中。会话之间存在会话隔离,如运行在会话〇中的 程序A,不能够访问运行在会话1中的某个对象和资源。除此之外还有权限和特权等检查, 与之前的技术相比访问各种资源的过程都变得更加严格,即在Windows Vista以及之后出 现的操作系统中以前的方法不再适用于智能卡登录远程计算机的环境中。
[0004] 因此,在新版本的操作系统中,如何能在远程计算机中实时的监控本地计算机上 的智能卡,是我们能够实现远程桌面登录和更新智能卡缓存的亟待解决的问题。


【发明内容】

[0005] 本发明为解决现有技术中存在的上述问题,提出了一种生成利用智能卡登录远程 计算机的判据的方法。
[0006] 本发明采取的技术方案是:
[0007] -种生成利用智能卡登录远程计算机的判据的方法,包括:
[0008] 步骤A0 :当中间件检测到函数被调用时,判断被调用的函数类型,如为第一函数 则执行步骤A1,如为第二函数时执行步骤B1,如为第三函数则执行步骤C1,如为第十函数 则执行步骤L1 ;
[0009] 步骤A1 :所述中间件在全局CSP对象数组创建CSP上下文对象,设置CSP上下文 对象标识,并将所述CSP上下文对象标识和所述CSP上下文对象建立映射关系,将所述CSP 上下文对象标识存储到所述第一函数的第一参数值所指向的内存地址中;
[0010] 步骤A2 :所述中间件从所述第一函数的第二参数值中解析出容器名和读卡器名;
[0011] 步骤A3 :所述中间件判断是否监控到与所述读卡器名所对应的读卡器中的智能 卡,是则执行步骤A4,否则报错,结束;
[0012] 步骤A4 :所述中间件在线程记录列表里面查找是否存在与当前会话对应的监控 线程,是则执行步骤A6,否则执行步骤A5 ;监控线程用于监控本地智能卡的插拔并实时更 新智能卡列表;
[0013] 步骤A5 :所述中间件获取当前运行线程的模拟令牌并保存;将所述模拟令牌作为 创建线程参数,创建与当前会话对应的监控线程,将所述监控线程的句柄保存在监控线程 数组中与当前会话ID所对应的位置,执行步骤A6 ;
[0014] 步骤A6 :所述中间件判断所有智能卡对象中的读卡器名是否与所述解析得到的 读卡器名匹配,是则将匹配上的智能卡对象的索引保存到所述创建的CSP上下文对象中, 执行步骤A7,否则报错,结束;
[0015] 步骤A7 :所述中间件判断所述解析得到的容器名是否为空,是则根据默认的筛选 条件找出默认容器对象,并将所述默认容器对象的索引保存到所述创建的CSP上下文对象 中,返回步骤A0,否则根据所述解析得到的容器名在与所述匹配上的智能卡对象中获取对 应的容器对象,并将获取到的容器对象的索引保存到所述创建的CSP上下文对象中,所述 第一函数返回成功信息,返回步骤A0 ;
[0016] 步骤B1 :所述中间件根据所述第二函数的第一参数值在全局CSP对象数组中查找 对应的CSP上下文对象,如找到则获取当前系统证书库的句柄,执行步骤B2,如未找到则报 错赁结束;
[0017] 步骤B2 :所述中间件根据找到的所述CSP上下文对象中的智能卡对象的索引获取 对应的智能卡对象;
[0018] 步骤B3 :所述中间件将所述智能卡对象中的所有容器对象和每个容器对象中的 所有证书对象一起注册至当前系统证书库中;
[0019] 步骤Μ :所述中间件将所述当前系统证书库的句柄赋值给所述第二函数的第三 参数,将所述当前系统证书库的句柄的长度赋值给所述第二函数的第四参数,返回步骤 Α0 ;
[0020] 步骤C1 :所述中间件根据所述第三函数的第一参数值在全局CSP对象数组中查找 对应的CSP上下文对象,如找到则执行步骤C2,否则报错,结束;
[0021] 步骤C2 :所述中间件根据找到的所述CSP上下文对象中的智能卡对象索引和容器 索引获取对应的容器对象,在所述容器对象的所有证书对象中查找非对称交换密钥在智能 卡中的引用索引,如找到则将所述第三函数的第三参数赋值为第一预设值,所述第三函数 返回成功信息,返回步骤Α0 ;如未找到则报错,结束;
[0022] 步骤L1 :所述中间件根据所述第十函数的第一参数值在全局CSP对象数组中查找 对应的CSP上下文对象,如找到则执行步骤L2,否则报错,结束;
[0023] 步骤L2 :所述中间件根据找到的所述CSP上下文对象中的智能卡对象索引和容器 索引获取对应的容器对象,并判断所述容器对象是否有效,是则执行步骤L3,否则报错,结 束;
[0024] 步骤L3 :所述中间件根据所述第十函数的第二参数值在所述CSP上下文对象中查 找有效哈希对象,如找到则从找到的所述有效哈希对象中获取哈希值,执行步骤L4,否则报 错赁结束;
[0025] 步骤L4 :所述中间件根据所述第十函数的第三参数值在获取到的容器对象中查 找证书对象,根据所述证书对象获取非对称交换密钥的私钥在智能卡中的引用索引,根据 所述引用索引生成签名指令并发送给下层应用;
[0026] 步骤L5 :所述中间件根据所述下层应用的返回值判断签名是否成功,是则将签名 结果作为利用智能卡登录远程计算机的判据,所述第十函数返回成功信息,返回步骤Α0,否 则报错,结束。
[0027] 进一步地,在所述步骤A1中的将所述CSP上下文对象标识存储到所述第一函数的 第一参数值所指向的内存地址中之前包括:中间件判断所述第一函数的第一参数值是否为 空指针,是则报错,结束;否则继续。
[0028] 进一步地,所述步骤A2包括:
[0029] 步骤A2-1 :所述中间件判断所述第一函数的第二参数值的长度是否小于第二预 设值,是则报错,结束;否则执行步骤A2-2 ;
[0030] 步骤A2-2 :所述中间件判断所述第一函数的第二参数值的前四个字符是否为第 一预设字符串,是则执行步骤A2-3,否则报错,结束;
[0031] 步骤A2-3 :所述中间件从所述第一函数的第二参数的第五个字符开始向后查找 第一预设字符,如找到则将第五个字符到第一预设字符之间的字符串作为读卡器名,将第 一预设字符开始之后的所有字符作为容器名,执行步骤A3 ;如未找到则报错,结束。
[0032] 进一步地,在所述步骤A3之前还包括:所述中间件检查所述第一函数的第三参数 值的标志位,如符合第一条件则报错,结束;如果符合第二条件则在所述CSP上下文对象中 将CSP上下文记录为静默模式的状态,执行步骤A3。
[0033] 进一步地,所述步骤A4包括:所述中间件调用一个全局函数,所述全局函数调用 系统API获取当前进程所属会话的会话ID,将所述会话ID作为数组下标,在全局函数所维 护的监控线程数组中查找是否有与所述数组下标所对应的值,如果查找出来的值为空,则 所述当前会话没有对应的监控线程,执行步骤A5,如果查找出来的值不为空,则所述当前会 话存在对应的监控线程,执行步骤A6。
[0034] 进一步地,所述中间件判断第一函数被调用时还包括:
[0035] 步骤S1 :所述监控线程调用系统函数获取模拟令牌,并将模拟令牌设置为当前监 控线程的令牌;
[0036] 步骤S2 :所述监控线程枚举当前操作系统中的智能卡的动作,如有卡插入则执行 步骤S3,如有卡拔出则执行步骤S4 ;
[0037] 步骤S3 :所述监控线程为插入的智能卡分配索引,根据与插入智能卡对应的读卡 器构建智能卡对象,并将构建的智能卡对象存储到智能卡列表中与所述索引对应的位置 中,从智能卡中读取智能卡信息并存储到共享内存中,执行步骤S5 ;
[0038] 步骤S4 :所述监控线程根据与删除的智能卡对应的索引定位到智能卡列表的对 应位置,删除所述对应位置中的智能卡对象,清除共享内存中存储的拔出的智能卡的信息, 执行步骤S5 ;
[0039] 步骤S5 :所述监控线程判断是否要退出运行状态,是则执行步骤S6,否则返回步 骤S2 ;
[0040] 步骤S6 :所述监控线程将当前监控线程的令牌设置为空,删除模拟令牌。
[0041] 进一步地,所述步骤A5与步骤A6之间还包括:所述中间件在预设时间内判断所述 智能卡列表是否为空,是则报错,否则执行步骤A6。
[0042] 进一步地,所述步骤A7之前包括:所述中间件对所述智能卡列表中的每个智能卡 对象索引对应的智能卡对象都进行预读,将每个智能卡上对象中的公有对象读取出来,保 存在共享内存中。
[0043] 进一步地,所述步骤A7中的所述根据默认的筛选条件找出默认容器对象具体为:
[0044] 步骤A7-1 :所述中间件判断所述匹配上的智能卡对象中是否存在容器对象,是则 执行步骤A7-2,否则报错,结束;
[0045] 步骤A7-2 :所述中间件获取远程计算机所属的域名,将所述获取的域名和容器 对象中所有证书对象中的证书域名进行对比,如果只有一个证书域名和所述获取的域名 匹配,则获取匹配上的证书域名所属的证书对象,执行步骤A7-3 ;如果有多个证书域名和 所述获取的域名匹配,则获取匹配上的最后一个证书域名所属的证书对象,然后执行步骤 A7-3 ;如果没有证书和所述获取的域名匹配,中间件获取容器对象中的第一个证书对象,执 行步骤A7-3 ;
[0046] 步骤A7-3 :所述中间件将获取到的证书对象所属容器对象作为默认容器对象。
[0047] 进一步地,所述步骤B2与所述步骤B3之间包括:所述中间件判断所述智能卡对象 是否为空,是则报错,结束,否则执行步骤B3。
[0048] 进一步地,所述步骤Μ具体包括:
[0049] 步骤Β4-1 :所述中间件判断所述第二函数的第三参数值是否为空,是则将所述当 前系统证书库的句柄的长度赋值给所述第二函数的第四参数,删除所述当前系统证书库的 句柄,返回步骤Α0 ;否则执行步骤Β4-2 ;
[0050] 步骤Β4-2 :所述中间件判断所述当前系统证书库的句柄的长度是否大于所述第 二函数的第四参数值,是则所述中间件删除所述当前系统证书库的句柄,报错,结束;否则 所述中间件将所述当前系统证书库的句柄的长度赋值给所述第二函数的第四参数,将所述 当前系统证书库的句柄赋值给所述第二函数的第三参数,返回步骤Α0。
[0051] 进一步地,上述方法还包括:所述步骤Β1之前还包括:
[0052] 步骤Β0 :所述中间件判断所述第二函数的第二参数值,如为0χ2Α则执行步骤Β1, 如为0x06则执行步骤Β5,如为0x04则执行步骤Β10,如为0x01则执行步骤Β14 ;
[0053] 步骤Β5 :所述中间件根据所述第二函数的第一参数值在全局CSP对象数组中查找 对应的CSP上下文对象,如找到则执行步骤Β6,如未找到则报错,结束;
[0054] 步骤Β6 :所述中间件判断找到的CSP上下文对象中的容器索引是否为空,是则报 错,结束,否则执行步骤Β7;
[0055] 步骤Β7 :所述中间件判断所述第二函数的第三参数值是否为空,是则执行步骤 Β8,否则根据找到的所述CSP上下文对象中的智能卡对象索引和容器索引获取对应的容器 对象,将所述获取的容器对象中容器名的长度赋值给所述第二函数的第四参数,返回步骤 Α0 ;
[0056] 步骤Β8 :所述中间件根据所述容器索引和找到的CSP上下文对象中的智能卡索引 获取对应的容器对象,判断所述容器对象中容器名的长度是否大于所述第二函数的第四参 数值,是则报错,结束;否则执行步骤Β9 ;
[0057] 步骤Β9 :所述中间件将所述容器对象中容器名的长度赋值给所述第二函数的第 四参数,将所述容器对象中的容器名赋值给所述第二函数的第三参数,返回步骤Α0 ;
[0058] 步骤Β10 :所述中间件根据所述第二函数的第一参数值在全局CSP对象数组中查 找其对应的CSP上下文对象,如找到则执行步骤Β11,如未找到则报错,结束;
[0059] 步骤Β11 :所述中间件获取所述中间件在windows平台所注册的CSP名称;
[0060] 步骤B12 :所述中间件判断所述第二函数的第三参数值是否为空,是则执行步骤 B13 ;否则将所述CSP名称的长度赋值给所述第二函数的第四参数,返回步骤A0 ;
[0061] 步骤B13 :所述中间件判断所述CSP名称的长度是否大于所述第二函数的第四参 数值,是则报错,结束;否则将所述CSP名称的长度赋值给所述第二函数的第四参数,将所 述CSP名称赋值给所述第二函数的第三参数,第二函数返回成功信息,返回步骤A0 ;
[0062] 步骤B14 :所述中间件根据所述第二函数的第一参数值在全局CSP对象数组中查 找对应的CSP上下文对象,如找到则执行步骤B15,如未找到则报错,结束;
[0063] 步骤B15 :所述中间件根据预置数据结构生成一个算法并将其存储到算法列表 中;
[0064] 步骤B16 :所述中间件将所述第二函数的第五参数值和第一设定值进行与运算并 判断运算结果是否等于第二设定值,是则将所述CSP上下文对象中的算法列表查询变量赋 值为初始值,执行步骤B17 ;否则获取所述CSP上下文对象中的算法列表查询变量,执行步 骤 B17 ;
[0065] 步骤B17 :所述中间件判断找到的CSP上下文对象中的算法列表查询变量与算法 列表的长度是否相等,是则报错,结束;否则执行步骤B18 ;
[0066] 步骤B18 :所述中间件判断所述第二函数的第三参数值是否为空,是则执行步骤 B20,否则执行步骤B19 ;
[0067] 步骤B19 :所述中间件将所述预置数据结构的长度赋值给所述第二函数的第四参 数,返回步骤A0;
[0068] 步骤B20 :所述中间件判断所述预置数据结构的长度是否大于所述第二函数的第 四参数值,是则报错,结束;否则执行步骤B21 ;
[0069] 步骤B21 :所述中间件将所述算法列表中偏移地址为所述算法列表查询变量的算 法赋值给所述第二函数的第三参数,将所述预置数据结构的长度赋值给所述第二函数的第 四参数,更新所述算法列表查询变量,所述第二函数返回成功信息,返回步骤A0。
[0070] 进一步地,所述步骤B1中的所述获取当前系统证书库的句柄具体为:
[0071] 所述中间件调用系统函数API CertOpenStore打开当前系统证书库,得到当前系 统证书库的句柄,判断所述当前系统证书库的句柄是否为空,是则报错,结束,否则执行步 骤B2。
[0072] 进一步地,所述步骤C1与步骤C2之间还包括:
[0073] 所述中间件判断所述第三函数的第二参数值是否为预定值,是则执行步骤C2,否 则报错,结束。
[0074] 进一步地,上述方法还包括:所述步骤A0中当所述中间件检测到第四函数被调用 时执行步骤D1 ;
[0075] 步骤D1 :所述中间件通过所述第四函数的第一参数值在全局CSP对象数组中查找 对应的CSP上下文对象,如找到则执行步骤D1,如未找到则报错,结束;
[0076] 步骤D2 :所述中间件判断所述第四函数的第二参数值和第三参数值是否分别为 第一预设值和第二预设值,是则执行步骤D3,否则执行其他操作;
[0077] 步骤D3 :所述中间件根据找到的所述CSP上下文对象中的智能卡对象索引和容器 索引获取对应的容器对象,查找所述容器对象中的证书对象;
[0078] 步骤D4:所述中间件判断所述找到的证书对象是否为空,是则报错,结束,否则执 行步骤D5 ;
[0079] 步骤D5 :所述中间件将所述证书对象中所保存的证书和所述证书的长度分别赋 值给所述第四函数的第四参数和第五参数,所述第四函数返回成功信息,返回步骤A0。
[0080] 进一步地,上述方法还包括:所述步骤A0中当所述中间件检测到第五函数被调用 时执行步骤E1 ;
[0081] 步骤E1 :所述中间件根据所述第五函数的第一参数值在全局CSP对象数组中查找 对应的CSP上下文对象,如找到则执行步骤E2,如未找到则报错,结束;
[0082] 步骤E2 :所述中间件根据找到的所述CSP上下文对象中的智能卡对象索引和容器 索引找到对应的容器对象,删除所述容器对象中的与所述第五函数的第二参数所对应的证 书对象中的密钥对象,所述第五函数返回成功信息,返回步骤A0。
[0083] 进一步地,所述根据找到的所述CSP上下文对象中的智能卡对象索引和容器索引 获取对应的容器对象,包括:
[0084] 所述中间件根据找到的CSP上下文对象中的智能卡对象索引获取对应的智能卡 对象,根据找到的CSP上下文对象中的容器索引在所述获取到的智能卡对象中获取对应的 容器对象。
[0085] 进一步地,上述方法还包括:所述步骤A0中当中间件检测到第六函数被调用时执 行步骤F1 ;
[0086] 步骤F1 :所述中间件根据所述第六函数的第一参数值在全局CSP对象数组中查找 其对应的CSP上下文对象,如找到在执行步骤F2,如未找到则报错,结束;
[0087] 步骤F2 :所述中间件判断所述第六函数的第二参数值是否为第三预设值,是则执 行步骤F3,否则报错,结束;
[0088] 步骤F3 :所述中间件判断所述第六函数的第三参数值是否为空,是则报错,结束; 否则执行步骤F4;
[0089] 步骤F4 :所述中间件将所述第六函数的第三参数值作为用户PIN,通过内部应用 程序验证用户PIN的有效性;
[0090] 步骤F5 :所述中间件判断所述用户PIN是否验证成功,是则所述第六函数返回成 功信息,返回步骤A0 ;否则所述第六函数返回失败信息,结束。
[0091] 进一步地,上述方法还包括:所述步骤A0中当中间件检测到第七函数被调用时执 行步骤G1 ;
[0092] 步骤G1 :所述中间件根据所述第七函数的第一参数值在全局CSP对象数组中查找 其对应的CSP上下文对象,如找到则执行步骤G2,如未找到,则报错,结束;
[0093] 步骤G2 :所述中间件创建一个哈希对象,根据所述第七函数的第二参数值来设置 哈希算法,将所述哈希对象赋值给所述第七函数的第五参数,并将所述哈希对象存储到查 找到的CSP上下文对象中;
[0094] 步骤G3 :所述中间件判断所述第七函数的第二参数值是否为第四预设值,是则返 回步骤A0,否则清空所述创建的哈希对象,所述第七函数返回成功信息,返回步骤A0。
[0095] 进一步地,所述步骤G2中根据所述第七函数的第二参数值来设置哈希算法具体 为:
[0096] 若所述第七函数的第二参数值为0x8001,则将哈希算法设置为MD2 ;若所述第七 函数的第二参数值为0x8003,则将哈希算法设置为MD5 ;若所述第七函数的第二参数值为 0x8004,则将哈希算法设置为SHA1 ;若所述第七函数的第二参数值为0x800C,则将哈希算 法设置为SHA256 ;若所述第七函数的第二参数值0x800D,则将哈希算法设置为SHA384 ;若 所述第七函数的第二参数值为0x800E,则将哈希算法设置为SHA512 ;若所述第七函数的第 二参数值为0x8009,则将哈希算法设置为HMAC。
[0097] 进一步地,上述方法还包括:所述步骤A0中当中间件检测到第八函数被调用时执 行步骤H1 ;
[0098] 步骤H1 :所述中间件根据所述第八函数的第一参数值在全局CSP对象数组中查找 其对应的CSP上下文对象,如找到则执行步骤H2,如未找到则报错,结束;
[0099] 步骤H2 :所述中间件通过所述第八函数的第二参数值在找到的CSP上下文对象中 查找哈希对象,如找到则执行步骤H3,如未找到则报错,结束;
[0100] 步骤H3 :所述中间件判断所述第八函数的第三参数值是否为第五预设值,是则所 述中间件用所述第八函数的第四参数值替换所述找到的哈希对象中的哈希值,所述第八函 数返回成功信息,返回步骤A0,否则报错,结束。
[0101] 进一步地,上述方法还包括:所述步骤A0中当中间件检测到第九函数被调用时执 行步骤II ;
[0102] 步骤II :所述中间件根据所述第九函数的第一参数值在全局CSP对象数组中查找 对应的CSP上下文对象,如找到则执行步骤12,如未找到则报错,结束;
[0103] 步骤12 :所述中间件通过所述第九函数的第二参数值在找到的CSP上下文对象中 查找哈希对象,如找到则根据预先设置的哈希算法对所述第九函数的第三参数值进行哈希 计算,将计算得到的哈希值保存在找到的哈希对象中,所述第九函数返回成功信息,返回步 骤A0;如未找到则报错,结束。
[0104] 进一步地,所述步骤L4中的所述中间件根据所述第十函数的第三参数值在获取 到的容器对象中查找证书对象具体为:如所述第十函数的第三参数值为0x01,则在获取到 的容器对象中获取交换证书对象;如所述第十函数的第三参数值为0x02,则在获取到的容 器对象中获取签名证书对象,如无法找到任何证书对象,则报错,结束。
[0105] 进一步地,所述步骤L4与所述步骤L5之间包括:所述下层应用接收到签名指令 后,使用签名指令中的引用索引所对应的私钥对所述中间件获取到的哈希值进行签名,并 将所述签名结果返回给所述中间件。
[0106] 进一步地,上述方法还包括:所述步骤A0中当中间件检测到第十一函数被调用时 执行步骤J1 ;
[0107] 步骤J1 :所述中间件根据所述第十一函数的第一参数值在全局CSP对象数组中查 找对应的CSP上下文对象,如找到则执行步骤J2,如未找到则报错,结束;
[0108] 步骤J2 :所述中间件删除所述CSP上下文对象,返回步骤A0。
[0109] 本发明的有益效果是:通过采用本发明提出的技术方案,适用于所有Windows版 本的操作系统,远程计算机上运行的中间件可以实时地监控本地计算机的USB接口上的智 能卡的插拔动作,实现与本地计算机的智能卡进行通讯,从而保证在智能卡登录过程中的 读卡器可以正常工作。且通过采用缓存技术,可提高远程计算机访问智能卡的速度、减少了 系统的负担并提高了软件的运行效率。

【专利附图】

【附图说明】
[0110] 图1为本发明实施例1提供的一种生成利用智能卡登录远程计算机的判据的方法 流程图;
[0111] 图2-图6为本发明实施例2提供的一种生成利用智能卡登录远程计算机的判据 的方法流程图;
[0112] 图7为本发明实施例2中的监控线程工作流程图。

【具体实施方式】
[0113] 为更近一步阐述本发明为达成预订目的所采取的技术手段及功效,以下结合附图 及较佳实施例,对依据发明提出的一种利用智能卡登录远程计算机的方法及装置,其具体 实施方式、特征及其功效,说明如后。
[0114] 用户在本地计算机安装中间件时中间件在本地计算机注册表智能卡目录下添加 注册项,以建立智能卡和中间件的关系;当有智能卡插入本地计算机时,智能卡向系统上报 ATR (Answer to reset),系统根据ATR值在注册表智能卡目录下匹配注册项,找到对应的中 间件,系统第一次调用第一函数时,将智能卡读卡器名作为第一函数的第二参数的组成部 分。
[0115] 实施例1
[0116] 本发明实施例1提供一种生成利用智能卡登录远程计算机的判据的方法,如图1 所示,包括:
[0117] 步骤A0 :当中间件检测到函数被调用时,判断被调用的函数类型,如为第一函数 则执行步骤A1,如为第二函数时执行步骤B1,如为第三函数则执行步骤C1,如为第十函数 则执行步骤L1 ;
[0118] 具体的,在本实施例中,上层应用通过调用第一函数来申请一个CSP上下文对象, 后续的所有操作都在CSP上下文对象中进行;上层应用通过调用第二函数来查询CSP属性, 如证书;上层应用通过调用第三函数来检索容器对象中的密钥对象;上层应用通过调用第 十函数来对摘要值进行签名;
[0119] 步骤A1 :中间件在全局CSP对象数组创建CSP上下文对象,设置对应的CSP上下 文对象标识,并将所述CSP上下文对象标识和所述CSP上下文对象建立映射关系,将CSP上 下文对象标识存储到第一参数值所指向的内存地址中;
[0120] 在本实施例中,在步骤A1中的将CSP上下文对象标识存储到第一参数值所指向的 内存地址中之前包括:中间件判断第一函数的第一参数值是否为空指针,是则报错,结束; 否则继续。
[0121] 步骤A2 :中间件从第一函数的第二参数值中解析出容器名和读卡器名;
[0122] 步骤A3 :中间件判断是否监控到与该读卡器名所对应的读卡器中的智能卡,是则 执行步骤A4,否则报错,结束;
[0123] 具体的,在本实施例中,在步骤A3之前还包括:中间件检查第一函数的第三参数 值的标志位,如符合第一条件则报错,结束;如果符合第二条件则在CSP上下文对象中将 CSP上下文记录为静默模式的状态,执行步骤A3。
[0124] 步骤A4:中间件在线程记录列表里面查找是否存在与当前会话对应的监控线程, 是则执行步骤A6,否则执行步骤A5 ;
[0125] 其中,监控线程用于监控本地智能卡的插拔并实时更新智能卡列表;
[0126] 具体的,本实施例中的监控线程执行以下操作:
[0127] 步骤S1 :监控线程调用系统函数获取模拟令牌,并将模拟令牌设置为当前监控线 程的令牌;
[0128] 步骤S2 :监控线程枚举当前操作系统中的智能卡的动作,如有卡插入则执行步骤 S3,如有卡拔出则执行步骤S4 ;
[0129] 步骤S3 :监控线程为插入的智能卡分配索引,根据与插入智能卡对应的读卡器构 建智能卡对象,并将构建的智能卡对象存储到智能卡列表中与索引对应的位置中,从智能 卡中读取智能卡信息并存储到共享内存中,执行步骤S5 ;
[0130] 步骤S4 :监控线程根据与删除的智能卡对应的索引定位到智能卡列表的对应位 置,删除对应位置中的智能卡对象,清除共享内存中存储的拔出的智能卡的信息,执行步骤 S5 ;
[0131] 步骤S5 :监控线程判断是否要退出运行状态,是则执行步骤S6,否则返回步骤 S2 ;
[0132] 步骤S6 :监控线程将当前监控线程的令牌设置为空,删除模拟令牌。
[0133] 步骤A5 :中间件获取当前运行线程的模拟令牌并保存;将模拟令牌作为创建线程 参数,创建与当前会话对应的监控线程,将监控线程的句柄保存在监控线程数组中与当前 会话ID所对应的位置,执行步骤A6 ;
[0134] 步骤A6 :中间件判断所有智能卡对象中的读卡器名是否与解析得到的读卡器名 匹配,是则将匹配上的智能卡对象的索引保存到创建的CSP上下文对象中,执行步骤A7,否 则报错,结束;
[0135] 优选的,在步骤A5与步骤A6之间还包括:中间件在预设时间内判断智能卡列表是 否为空,是则报错,结束,否则执行步骤A6。
[0136] 步骤A7 :中间件判断解析得到的容器名是否为空,是则根据默认的筛选条件找出 默认容器对象,并将默认容器对象的索引保存到创建的CSP上下文对象中,返回步骤A0,否 则根据解析得到的容器名在与匹配上的智能卡对象中获取对应的容器对象,并将获取到的 容器对象的索引保存到创建的CSP上下文对象中,第一函数返回成功信息,返回步骤A0 ;
[0137] 在本实施例中,步骤A7中的根据默认的筛选条件找出默认容器对象,具体为:
[0138] 步骤A7-1 :中间件判断匹配上的智能卡对象中是否存在容器对象,是则执行步骤 A7-2,否则报错,结束;
[0139] 步骤A7-2 :中间件获取远程计算机所属的域名,将获取的域名和容器对象中所有 证书对象中的证书域名进行对比,如果只有一个证书域名和获取的域名匹配,则获取匹配 上的证书域名所属的证书对象,执行步骤A7-3 ;如果有多个证书域名和获取的域名匹配, 则获取匹配上的最后一个证书域名所属的证书对象,然后执行步骤A7-3;如果没有证书和 获取的域名匹配,中间件获取容器对象中的第一个证书对象,执行步骤A7-3 ;
[0140] 步骤A7-3 :中间件将获取到的证书对象所属容器对象作为默认容器对象,返回步 骤AO。
[0141] 具体的,在本实施例中,步骤A7之前包括:中间件对智能卡列表中的每个智能卡 对象索引对应的智能卡对象都进行预读,将每个智能卡对象中的公有对象读取出来,保存 在共享内存中。
[0142] 步骤B1 :中间件根据第二函数的第一参数值在全局CSP对象数组中查找对应的 CSP上下文对象,如找到则获取当前系统证书库的句柄,执行步骤B2,如未找到则报错,结 束;
[0143] 在本实施例中,步骤B1中的获取系统证书库的句柄具体为:
[0144] 中间件调用系统函数API CertOpenStore打开当前系统证书库,得到当前系统证 书库的句柄,判断当前系统证书库的句柄是否为空,是则报错,结束,否则执行步骤B2。
[0145] 步骤B2 :中间件根据找到的CSP上下文对象中的智能卡对象的索引获取对应的智 能卡对象;
[0146] 步骤B3 :中间件将智能卡对象中的所有容器对象和每个容器对象中的所有证书 对象一起注册至当前系统证书库中;
[0147] 具体的,在本实施例中,步骤B2与步骤B3之间包括:中间件判断智能卡对象是否 为空,是则报错,结束,否则执行步骤B3。
[0148] 步骤Μ :中间件将当前系统证书库的句柄赋值给第二函数的第三参数,将当前系 统证书库的句柄的长度赋值给第二函数的第四参数,返回步骤Α0 ;
[0149] 在本实施例中,步骤Μ具体包括:
[0150] 步骤Β4-1 :中间件判断第二函数的第三参数值是否为空,是则将当前系统证书库 的句柄的长度赋值给第二函数的第四参数,删除当前系统证书库的句柄,返回步骤Α0 ;否 则执行步骤Β4-2 ;
[0151] 步骤Β4-2 :中间件判断当前系统证书库的句柄的长度是否大于第二函数的第四 参数值,是则中间件删除当前系统证书库的句柄,报错,结束;否则中间件将当前系统证书 库的句柄的长度赋值给第二函数的第四参数,将当前系统证书库的句柄赋值给第二函数的 第三参数,返回步骤Α0。
[0152] 步骤C1 :中间件根据第三函数的第一参数值在全局CSP对象数组中查找对应的 CSP上下文对象,如找到则执行步骤C2,否则报错,结束;
[0153] 步骤C2 :中间件根据找到的CSP上下文对象中的智能卡对象索引和容器索引获取 对应的容器对象,在容器对象的所有证书对象中查找非对称交换密钥在智能卡中的引用索 弓丨,如找到则将第三函数的第三参数赋值为第一预设值,第三函数返回成功信息,返回步骤 Α0 ;如未找到则报错,结束;
[0154] 优选的,在本实施例中,步骤C1与步骤C2之间还包括:
[0155] 中间件判断第三函数的第二参数值是否为预定值,是则执行步骤C2,否则报错,结 束。
[0156] 在本实施例中,步骤C2中的中间件根据找到的CSP上下文对象中的智能卡对象索 引获取对应的智能卡对象,根据找到的CSP上下文对象中的容器索引在获取到的智能卡对 象中获取对应的容器对象。
[0157] 步骤L1 :中间件根据第十函数的第一参数值在全局CSP对象数组中查找对应的 CSP上下文对象,如找到则执行步骤L2,否则报错,结束;
[0158] 步骤L2 :中间件根据找到的CSP上下文对象中的智能卡对象索引和容器索引获取 对应的容器对象,并判断容器对象是否有效,是则执行步骤L3,否则报错,结束;
[0159] 在本实施例中,步骤L2中,中间件根据找到的CSP上下文对象中的智能卡对象索 引和容器索引获取对应的容器对象,具体为:中间件根据找到的CSP上下文对象中的智能 卡对象索引获取对应的智能卡对象,根据找到的CSP上下文对象中的容器索引在获取到的 智能卡对象中获取对应的容器对象。
[0160] 步骤L3 :中间件根据第十函数的第二参数值在CSP上下文对象中查找有效哈希对 象,如找到则从找到的有效哈希对象中获取哈希值,执行步骤L4,如未找到则报错,结束;
[0161] 步骤L4:中间件根据第十函数的第三参数值在获取到的容器对象中查找证书对 象,根据证书对象获取非对称交换密钥的私钥在智能卡中的引用索引,根据引用索引生成 签名指令并发送给下层应用;
[0162] 具体的,在本实施例中,步骤L4中的中间件根据第十函数的第三参数值在获取到 的容器对象中查找证书对象具体为:如第十函数的第三参数值为0x01,则在获取到的容器 对象中获取交换证书对象;如第十函数的第三参数值为0x02,则在获取到的容器对象中获 取签名证书对象,如无法找到任何证书对象,则报错,结束。
[0163] 步骤L5 :中间件根据下层应用的返回值判断签名是否成功,是则将签名结果作为 利用智能卡登录远程计算机的判据,第十函数返回成功信息,返回步骤A0,否则报错,结束。
[0164] 优选的,在本实施例中,步骤L4与步骤L5之间包括:下层应用接收到签名指令后, 使用签名指令中的引用索引所对应的私钥对中间件获取到的哈希值进行签名,并将签名结 果返回给中间件。
[0165] 在本实施例中,上层应用还可以调用第四函数来查询密钥对象的参数,调用第五 函数来销毁一个密钥对象,调用第六函数来修改CSP的属性,调用第七函数来创建一个哈 希对象,调用第八函数来修改哈希对象的参数,调用第九函数来对待签名数据进行哈希计 算,调用第十一函数来删除一个CSP上下文对象;具体实现过程在实施例2进行详细说明。
[0166] 实施例2
[0167] 本发明实施例2提供一种生成利用智能卡登录远程计算机的判据的方法,如图 2-图6所示,包括:
[0168] 步骤101 :当中间件检测到函数被调用时,判断被调用的函数类型,如为第一函数 则执行步骤102,如为第二函数则执行步骤116,如为第三函数则执行步骤139,如为第四函 数则执行步骤142,如为第五函数则执行步骤147,如为第六函数则执行步骤149,如为第七 函数则执行步骤154,如为第八函数则执行步骤158,如为第九函数则执行步骤161,如为第 十函数则执行步骤164,如为第十一函数则执行步骤171 ;
[0169] 具体的,在本实施例中,当远程计算机检测到有智能卡插入时,从智能卡中获取 ATR,根据该ATR查找对应的中间件,并调用找到的中间件中的第一函数,通过调用第一函 数向中间件申请CSP(英文全称:Cryptographic Service Provider,中文全称:加密服务 提供程序)句柄;
[0170] 具体的,在本实施例中,第一函数为:CPAcquireContext函数,参数包括:第一参 数phProv (表示CSP句柄的首地址,第一次调用为空)、第二参数pszldentity (表示指定的 容器ID)、第三参数dwFlags ;上层应用通过调用第一函数来申请一个CSP上下文对象,第一 函数返回的对象句柄可被其它CSP函数作为参数使用。
[0171] 第二函数具体为CPGetProvParam函数,其中,第一参数为phProv,第二参数为 dwParam,第三参数为pbData,第四参数为*pdwDataLen ;上层应用通过调用第二函数来查 询CSP属性,如查询CSP支持的算法、查询容器名、证书等,查询的具体数据类型由第二参数 指定。
[0172] 第三函数为CPGetUserKey函数,第一参数为hProv,第二参数为dwKeySpec,第三 参数为*phU SerKey ;上层应用通过调用第三函数来检索容器对象中的密钥对象,第二参数 用于指定查询什么类型的密钥对。
[0173] 第四函数为CPGetKeyParam函数,第一参数为hProv,第二参数为hKey,第三参数 为dwParam,第四参数为*pbData,第五参数为*pdwDataLen,第六参数为dwFlags ;上层应用 通过调用第四函数来查询密钥对象的参数。
[0174] 第五函数为CPDestroyKey函数,第一参数为hProv,第二参数为hKey ;上层应用通 过调用第五函数来销毁hProv所对应的CSP上下文对象中的密钥对象;上层应用通过调用 第五函数来销毁一个密钥对象。
[0175] 第六函数为CPSetProvParam函数,第一参数hProv,第二参数dwParam,第三参数 为pbData ;上层应用通过调用第六函数来修改CSP的属性,修改的具体属性的类型由第二 参数指定。
[0176] 第七函数为CPCreateHash,第一参数pProv,第二参数为Algid,第三参数为hKey, 第四参数为dwFlags,第五参数为phHash ;上层应用通过调用第七函数来创建一个哈希对 象。
[0177] 第八函数为CPSetHashParam函数,第一参数hProv,第二参数hHash,第三参数 dwParam,第四参数*pbData,第五参数dwFlags ;上层应用通过调用第八函数来修改哈希对 象的参数。
[0178] 第九函数为CPHashData,第一参数hProv,第二参数为hHash,第三参数为pbData ; 上层应用通过调用第九函数来对待签名数据进行哈希计算。
[0179] 第十函数为CPSignHash函数,第一参数hProv,第二参数hHash,第三参数 dwKeySpec,第四参数sDescription,第五参数dwFlags,第六参数pbSignature,第七参数 pdwSigLen ;上层应用通过调用第十函数来对摘要值进行签名。
[0180] 第^^一函数为CPRealeseContext函数,第一参数为prov ;上层应用通过调用第三 函数来删除一个CSP上下文对象。
[0181] 步骤102 :中间件在全局CSP对象数组创建CSP上下文对象,设置对应的CSP上下 文对象标识并将CSP上下文对象和该CSP上下文对象标识建立映射关系;
[0182] 在本实施例中,将CSP上下文对象和CSP上下文对象标识建立映射关系具体为:将 CSP上下文对象保存至全局CSP对象数组的CSP上下文对象标识所指向的位置,CSP上下文 对象标识的初始值为〇, CSP上下文对象标识的值随着每次CPAcquireContext被上层调用 而依次递增,CSP上下文对象在全局CSP对象数组中的位置与CSP上下文对象标识--对 应;
[0183] 本实施例中中间件在创建CSP上下文对象时同时创建监控线程列表和智能卡列 表,CSP上下文对象包括:智能卡对象的索引、容器索引和证书用途;智能卡对象的索引与 智能卡列表 对应,根据容器索引可以在智能卡列表中找到对应的容器对象;
[0184] 步骤103 :中间件判断第一函数的第一参数值是否为空指针,是则报错,结束;否 则将CSP上下文对象标识存储到第一函数的第一参数值所指向的内存地址中,执行步骤 104 ;
[0185] 本实施例中该步骤报错具体为:记录程序最后错误码为0x00000087,第一函数返 回 0x0000 ;
[0186] 步骤104 :中间件从第一函数的第二参数值中解析出容器名和读卡器名;
[0187] 具体的,步骤104包括:
[0188] 步骤104-1 :判断第一函数的第二参数值的长度是否小于第二预设值,是则报错, 结束,否则执行步骤104-2;
[0189] 优选的,本实施例中的第二预设值为5 ;
[0190] 步骤104-2 :判断第一函数的第二参数值的前四个字符是否为第一预设字符串, 是则执行步骤104-3,否则报错,结束;
[0191] 具体的,本实施例中的第一预设字符串为\\. \ ;
[0192] 步骤104-3 :从第一函数的第二参数值的第五个字符开始向后查找第一预设字 符,如找到则将第五个字符至第一预设字符前一位的字符串作为读卡器名,将第一预设字 符开始之后的所有字符作为容器名,执行步骤105 ;如未找到则报错,结束;
[0193] 具体的,本实施例中的第一预设字符为\ ;
[0194] 步骤105 :中间件检查第一函数的第三参数值的标志位,如符合第一条件则报错, 结束;如果符合第二条件则在CSP上下文对象中将CSP上下文记录为静默模式的状态,执行 步骤106 ;
[0195] 具体的,第一条件为第三参数值的第4位和第5位同时为1,或者是第4位、第29 位、第30位、第31位、第32位同时为1,或者是第5位、第29位、第30位、第31位、第32位 同时为1,第二条件为第三参数值的第7位为1 ;
[0196] 本实施例中步骤105中的报错具体为:记录程序最后错误码为0x80090009,第一 函数返回0x0000 ;
[0197] 在本实施例中,第一函数的第三参数值是32bit的无符号整形变量;
[0198] 具体的,在本实施例中,如在CSP上下文对象中将CSP上下文记录为静默模式的 状态则表示中间件在之后处理需要验PIN码时不会主动弹出PIN码输入框,而是通过调用 CPSetProvParam函数来进行验证PIN码操作;
[0199] 步骤106 :中间件判断是否监控到与该读卡器名所对应的读卡器中的智能卡,是 则执行步骤107,否则报错,结束;
[0200] 优选的,在本实施例中,中间件判断在预设时间内是否监控到与该读卡器名所对 应的读卡器中的智能卡;
[0201] 步骤106中的报错具体为:记录程序最后错误码为0x8010000C,第一函数返回 0x0000 ;优选的,预设时间为20秒;
[0202] 步骤107 :中间件在线程记录列表里面查找是否存在与当前会话对应的监控线 程,是则执行步骤110,否则执行步骤108。
[0203] 在本实施例中,操作系统启动后会开启不同的会话,每个会话下有多个进程,一个 进程下会创建不同的线程;具体的,本实施例中的当前会话为登录远程计算机的会话;监 控线程用于监控本地智能卡的插拔并实时更新智能卡列表;
[0204] 具体的,步骤107包括:中间件调用一个全局函数funA,funA首先调用系统API获 取当前进程所属会话的会话ID,将此会话ID作为数组下标,在funA所维护的监控线程数组 中查找是否有与该数组下标所对应的值,如果查找出来的值为空,说明该会话没有对应的 监控线程,如果查找出来的值不为空,则该会话存在对应的监控线程。
[0205] 例如:funA获取到当前进程属于Sessionl,则当前会话ID等于1。如果监控线程 数组变量是m_array,funA将会判断111_3?^7[1]的值是否为空,是则Sessionl不存在对应 的监控线程,否则Sessionl存在对应的监控线程。
[0206] 步骤108 :中间件调用操作系统API的函数OpenThreadToken,获取当前运行线程 的模拟令牌并保存。
[0207] 在本实施例中,当前运行线程为调用中间件的线程;
[0208] 具体的,本实施例中函数OpenThreadToken的第二个参数指定为Τ0ΚΕΝ_ MPERS0NATE (0x0004)即第二参数就是模拟令牌。
[0209] 步骤109 :中间件将模拟令牌作为创建线程参数,创建与当前会话对应的监控线 程,将监控线程的句柄保存在监控线程数组中与当前会话ID所对应的位置;
[0210] 本实施例中通过监控线程的句柄可以判断有没有用于监控当前会话的监控线 程;
[0211] 在本实施例中,中间件创建监控线程之后,监控线程开始运行,监控线程具体工作 流程如图7所示,包括 :
[0212] 步骤S1 :监控线程调用系统函数获取模拟令牌,并将模拟令牌设置为当前监控线 程的令牌;
[0213] 具体的,在本实施例中,步骤S1中,监控程序调用系统API SetThreadToken函数, 该函数的第一参数值为0x00,第二参数为m_imToken,将第二参数作为模拟令牌;
[0214] 步骤S2 :监控线程枚举当前操作系统中的智能卡的动作,如有卡插入则执行步骤 S3,如有卡拔出则执行步骤S4 ;
[0215] 具体的,在本实施例中,监控线程每隔五秒就枚举操作系统中的读卡器一遍,然后 测试读卡器的状态,根据读卡器的状态来判断是否已经有智能卡插入;当有智能卡插入时, 监控线程会从读卡器得到智能卡的ATR,然后根据这个ATR值判断智能卡类型是否符合条 件(厂商所关心的设备型号),如果符合的话则在中间件维护的智能卡列表创建此智能卡 对应的智能卡对象,智能卡的ID就是读卡器名称。
[0216] 步骤S3 :监控线程为插入的智能卡分配索引,根据与插入智能卡对应的读卡器构 建智能卡对象,并将构建的智能卡对象存储到智能卡列表中与索引对应的位置中,从智能 卡中读取智能卡信息并存储到共享内存中,执行步骤S5 ;
[0217] 步骤S4 :监控线程根据与删除的智能卡对应的索引定位到智能卡列表的对应位 置,删除对应位置中的智能卡对象,清除共享内存中存储的拔出的智能卡的信息,执行步骤 S5 ;
[0218] 步骤S5 :监控线程判断是否要退出运行状态,是则执行步骤S6,否则返回步骤 S2 ;
[0219] 步骤S6 :监控线程将当前监控线程的令牌设置为空,删除模拟令牌;
[0220] 具体的,监控线程调用系统API SetThreadToken函数删除模拟令牌,该函数的第 一个参数为0x00,第二个参数为0x00。
[0221] 步骤110 :中间件判断智能卡列表是否为空,是则执行步骤112,否则执行步骤 111 ;
[0222] 在本实施例中,智能卡列表是主线程和监控线程共有的资源,监控线程负责更新, 主线程负责读取;
[0223] 本实施例中的智能卡列表中包括智能卡对象,智能卡对象中有容器列表,容器列 表中有容器对象和证书对象,证书对象中有具体的证书内容;
[0224] 步骤111 :中间件判断所有智能卡对象中的读卡器名是否与解析得到的读卡器名 匹配,是则执行步骤113,否则执行步骤112 ;
[0225] 在本实施例中,智能卡列表中保存有智能卡对象,每个智能卡对象对应着一个已 经被中间件识别的硬件智能卡,智能卡对象中保存的信息包括:智能卡的ATR、Reader名 (读卡器名)、智能卡型号、中间件和智能卡通信的指令集;
[0226] 步骤112 :中间件判断是否到达预设时间,是则报错,结束,否则返回步骤110 ;
[0227] 在本实施例中该步骤中报错具体为:记录程序最后错误码为0x8010000C,第一函 数返回0x0000 ;
[0228] 具体的,在本实施例中,预设时间为20秒,即中间件最多等待监控线程20秒,让监 控程序有充分的时间处理和智能卡的交互,中间件每隔一秒就会去检查智能卡列表,如果 智能卡列表不为空,则立即执行112 ;如果超过了 20秒且智能卡列表还处于空的状态,则中 间件等待超时,记录程序最后错误码为0x8010000C,第一函数返回0x0000 ;
[0229] 步骤113 :中间件将匹配的智能卡对象的索引保存到创建的CSP上下文对象中;
[0230] 步骤114 :中间件对智能卡列表中的每个智能卡对象索引对应的智能卡都进行预 读,将每个智能卡上的公有对象读取出来,保存在共享内存中;
[0231] 步骤115 :中间件判断解析的容器名是否为空,是则根据默认的筛选条件找出默 认容器对象,并将默认容器对象的索引保存到创建的CSP上下文对象中,返回步骤101,否 则根据容器名在匹配上的智能卡对象中获取对应的容器对象,并将获取到的容器对象的索 引保存到创建的CSP上下文对象中,第一函数返回成功信息,返回步骤101 ;
[0232] 具体的,在本实施例中,步骤115中根据默认的筛选条件找出默认容器对象包括:
[0233] 步骤115-1 :中间件判断所述匹配上的智能卡对象中是否存在容器对象,是则执 行步骤115-2,否则向上层应用程序返回NTE_BAD_KEYSET (0x80090016)的错误,结束;
[0234] 步骤115-2 :中间件获取远程计算机所属的域名A,然后将域名A和容器对象中 所有证书对象中的证书DN(英文全称Domain Name,中文全称:域名)进行对比,如果只有 一个证书DN和域名A匹配,则获取匹配上的证书DN所属的证书对象,执行115-3 ;如果有 多个证书DN和域名A匹配,则获取匹配上的最后一个证书域名所属的证书对象,然后执行 115-3 ;如果没有证书DN和域名A匹配,中间件获取容器对象中的第一个证书对象,然后执 行 115-3 ;
[0235] 步骤115-3 :中间件将获取到的证书对象所属容器对象作为默认容器对象;
[0236] 步骤116 :中间件判断第二函数的第二参数值,如为0x06则执行步骤117 ;如为 0x2A则执行步骤122,如为0x04则执行步骤127,如为0x01则执行步骤131 ;
[0237] 步骤117 :中间件根据第二函数的第一参数值在全局CSP对象数组中查找对应的 CSP上下文对象,如找到则执行步骤118,如未找到则报错,结束;
[0238] 本实施例中步骤117中的报错具体为:记录程序最后错误码为0x80090001,第二 函数返回0x0000 ;
[0239] 步骤118 :中间件判断CSP上下文对象中的容器索引是否为空,是则报错,结束,否 则执行步骤119 ;
[0240] 本实施例中步骤118中的报错具体为:记录程序最后错误码为0x8009000A,第二 函数返回0x0000 ;
[0241] 步骤119 :中间件判断第二函数的第三参数值是否为空,是则执行步骤120,否则 根据容器索引和CSP上下文对象中的智能卡索引获取对应的容器对象,将获取的容器对象 中容器名的长度赋值给第二函数的第四参数,第二函数返回0x0001,返回步骤101 ;
[0242] 步骤120 :中间件根据容器索引和CSP上下文对象中的智能卡索引获取对应的容 器对象,判断容器对象中容器名的长度是否大于第二函数的第四参数值,是则报错,结束; 否则执行步骤121 ;
[0243] 本实施例中,步骤120中报错具体为:记录程序最后错误码为0x00000234,函数返 回 0x0000
[0244] 步骤121 :中间件将容器对象中容器名的长度赋值给第二函数的第四参数,将容 器名赋值给第二函数的第三参数,第二函数返回0x0001,返回步骤101 ;
[0245] 步骤122 :中间件根据第二函数的第一参数值在全局CSP对象数组中查找其对应 的CSP上下文对象,如找到则中间件获取当前系统证书库的句柄,执行步骤123,如未找到 则报错,结束;
[0246] 本实施例中,步骤122的报错具体为:记录程序最后错误码为0x80090001,第二函 数返回0x0000 ;
[0247] 具体的,中间件获取当前系统证书库的句柄包括:中间件调用系统函数 APICertOpenStore打开系统证书库,得到当前系统证书库的句柄,判断当前系统证书库的 句柄是否为空,是则记录程序最后错误码为0x00000122,第二函数返回0x0000,结束,否则 执行步骤123 ;
[0248] 步骤123 :中间件根据CSP上下文对象中的智能卡对象的索引获取对应的智能卡 对象,判断智能卡对象是否为空,是则报错,结束,否则执行步骤124 ;
[0249] 具体的,该步骤中的报错为:记录程序最后错误码为0x0000087,函数返回 0x0000 ;
[0250] 步骤124 :中间件通过调用系统函数APICertAddEncodedCertificateToStore将智 能卡对象中的所有容器对象和每个容器对象中的所有证书对象一起注册至当前系统证书 库中;
[0251] 步骤125 :中间件判断第二函数的第三参数值是否为空,是则将当前系统证书库 的句柄的长度赋值给第二函数的第四参数,调用系统函数APICertCloseStore删除当前系 统证书库的句柄,函数返回0x0001,返回步骤101 ;否则执行126 ;
[0252] 步骤126 :中间件判断当前系统证书库的句柄的长度是否大于第二函数的第四参 数值,是则中间件调用系统函数API CertCloseStore删除当前系统证书库的句柄,报错,结 束;否则将当前系统证书库的句柄的长度赋值给第二函数的第四参数,将当前系统证书库 的句柄赋值给第二函数的第三参数,第二函数返回0x0001,返回步骤101 ;
[0253] 在本实施例中,步骤126中的报错具体为:记录程序最后错误码为0x00000234,函 数返回0x0000 ;
[0254] 步骤127 :中间件根据第二函数的第一参数值在全局CSP对象数组中查找对应的 CSP上下文对象,如找到则执行步骤128,如未找到则报错,结束;
[0255] 在本实施例中,步骤127中的报错具体为:记录程序最后错误码为0x80090001,函 数返回0x0000 ;
[0256] 步骤128 :中间件获取中间件在windows平台所注册的CSP名称;
[0257] 步骤129 :中间件判断第二函数的第三参数值是否为空,是则执行步骤130 ;否则 将CSP名称的长度赋值给第二函数的第四参数,第二函数返回0x0001,返回步骤101 ;
[0258] 步骤130 :中间件判断CSP名称的长度是否大于第二函数的第四参数值,是则报 错,结束;否则将CSP名称的长度赋值给第二函数的第四参数,将CSP名称赋值给第二函数 的第三参数,第二函数返回0x0001,返回步骤101 ;
[0259] 具体的,本实施例步骤130的报错为:记录程序最后错误码为0x00000234,函数返 回 0x0000 ;
[0260] 步骤131 :中间件根据第二函数的第一参数值在全局CSP对象数组中查找对应的 CSP上下文对象,如找到则执行步骤132,如未找到则报错,结束;
[0261] 本实施例中,步骤131的报错具体为;记录程序最后错误码为0x80090001,函数返 回 0x0000 ;
[0262] 步骤132 :中间件根据预置数据结构生成一个算法并将其存储到算法列表中;
[0263] 在本实施例中,预置数据算法具体为:PR0V_ENUMALGS数据结构,包括:4个字节标 识算法类型,4字节标识密钥长度、4个字节标识算法名称长度、20个字节标识算法名称;在 本实施例中存储有一个算法列表,算法列表的基本元素就是PR〇V_ENUMALGS,此算法列表是 中间件支持的所有算法;
[0264] 步骤133 :中间件将第二函数的第五参数值和第一设定值进行与运算并判断运算 结果是否等于第二设定值,是则将找到的CSP上下文对象中的算法列表查询变量赋值为初 始值,执行步骤134 ;否则获取找到的CSP上下文对象中的算法列表查询变量的值,执行步 骤 134 ;
[0265] 具体的,在本实施例中,算法列表查询变量记录着算法列表查询的偏移量,赋值为 初始值也就是对之前的查询状态进行清空,优选的初始值为〇,第一设定值为0x0001,第二 设定值为1 ;
[0266] 步骤134 :中间件判断找到的CSP上下文对象的算法列表查询变量的值与算法列 表的长度是否相等,是则报错,结束;否则执行步骤135 ;
[0267] 本实施例中,步骤134具体为:记录程序最后错误码为0x00000259,函数返回 0x0000 ;
[0268] 步骤135 :中间件判断第二函数的第三参数值是否为空,是则执行步骤137,否则 执行步骤136 ;
[0269] 步骤136 :中间件将预置数据结构的长度赋值给第二函数的第四参数,第二函数 返回0x0001,返回步骤101 ;
[0270] 步骤137 :中间件判断预置数据结构的长度是否大于第二函数的第四参数值,是 则报错,结束;否则执行步骤138 ;
[0271] 具体的,在本实施例中,步骤137的报错为:记录程序最后错误码为0x00000234, 函数返回0x0000 ;
[0272] 步骤138 :中间件将算法列表中偏移地址为算法列表查询变量的算法赋值给第二 函数的第三参数,将预置数据结构的长度赋值给第二函数的第四参数,更新算法列表查询 变量,第二函数返回0x0001,返回步骤101 ;
[0273] 优选的,本实施例中的更新算法列表查询变量为:算法列表查询变量自加1 ;
[0274] 步骤139 :中间件根据第三函数的第一参数值在全局CSP对象数组中查找对应的 CSP上下文对象,如找到则执行步骤140,如未找到则报错,结束;
[0275] 本实施例中步骤139的报错具体为:记录程序最后错误码为0x80090001,第三函 数返回0x0000 ;
[0276] 步骤140 :中间件判断第三函数的第二参数值是否为预定值,是则执行步骤141, 否则报错,结束;
[0277] 本实施例中步骤140中报错具体为:记录程序最后错误码为0x8009000D,第三函 数的返回0x0000 ;优选的,该步骤的预定值为1 ;
[0278] 步骤141 :中间件根据CSP上下文对象中的智能卡对象索引和容器索引获取对应 的容器对象,在容器对象的所有证书对象中查找非对称交换密钥在智能卡中的引用索引, 如找到则将第三函数的第三参数赋值为第一预设值,第三函数返回0x0001,返回步骤101 ; 如未找到则报错,结束;
[0279] 在本实施例中,步骤141中的报错具体为:记录程序最后错误码为0x8009000D,第 三函数返回0x0000 ;优选的,第一预设值为OxFFFFOFlA ;
[0280] 具体的,本实施例中的非对称交换密钥包括公钥对象和私钥对象;
[0281] 步骤142 :中间件通过第四函数的第一参数值在全局CSP对象数组中查找其对应 的CSP上下文对象,如找到则执行步骤143,如未找到,则报错,结束;
[0282] 具体的,该步骤中的报错为:记录程序最后错误码为0x80090001,函数返回 0x0000 ;
[0283] 步骤143 :中间件判断第四函数的第二参数值和第三参数值是否分别为第一预设 值和第二预设值,是则执行步骤144,否则执行其他操作;
[0284] 具体的,在本实施例中,第一预设值为OxFFFFOFlA,第二预设值为26 ;
[0285] 步骤144 :中间件根据CSP上下文对象中的智能卡对象索引和容器索引获取对应 的容器对象,查找容器对象中的证书对象;
[0286] 在本实施例中,中间件根据CSP上下文对象中的智能卡对象索引和容器索引获取 对应的容器对象,包括:中间件根据找到的CSP上下文对象中的智能卡对象索引获取对应 的智能卡对象,根据找到的CSP上下文对象中的容器索引在获取到的智能卡对象中获取对 应的容器对象。
[0287] 步骤145 :中间件判断找到的证书对象是否为空,是则报错,结束;否则执行步骤 146 ;
[0288] 具体的,本实施例中步骤145的报错具体为:记录程序最后错误码为0x8009000A, 函数返回0x0000,结束;
[0289] 步骤146 :中间件将证书对象中所保存的证书和该证书的长度分别赋值给第四函 数的第四参数和第五参数,第四函数返回0x0001,返回步骤101 ;
[0290] 步骤147 :中间件根据第五函数的第一参数值在全局CSP对象数组中查找对应的 CSP上下文对象,如找到则执行步骤148,如未找到则报错,结束;
[0291] 本实施例中的步骤147中报错具体为:记录程序最后错误码为0x80090001,函数 返回 0x00000 ;
[0292] 步骤148 :中间件根据找到的CSP上下文对象中的智能卡对象索引和容器索引找 到对应的容器对象,删除所述容器对象中的与第五函数的第二参数所对应的证书对象中的 密钥对象,第五函数返回0x00001,返回步骤101 ;
[0293] 步骤149 :中间件根据第六函数的第一参数值在全局CSP对象数组中查找对应的 CSP上下文对象,如找到则执行步骤150,如未找到则报错,结束;
[0294] 具体的,本实施例中该步骤149的报错为:记录程序最后错误码为0x80090001,函 数返回0x0000 ;
[0295] 步骤150 :中间件判断第六函数的第二参数值是否为第三预设值,是则执行步骤 151,否则报错,结束;
[0296] 具体的,本实施例中该步骤150的报错为:记录程序最后错误码为0x80090020,函 数返回0x0000,结束;优选的第三预设值为0x20 ;
[0297] 在本实施例中,如第六函数的第二参数值为0x20则中间件向智能卡要求验证 PIN,获取用户权限;
[0298] 步骤151 :中间件判断第六函数的第三参数值是否为空,是则报错,结束;否则执 行步骤152 ;
[0299] 具体的,本实施例中该步骤151的报错为:记录程序最后错误码为0x80090020,第 六函数返回0x0000 ;
[0300] 步骤152 :中间件将第六函数的第三参数值作为用户PIN,通过内部C0S验证用户 PIN的有效性;
[0301] 步骤153 :中间件判断用户PIN码是否验证成功,是则第六函数返回0x0001,返回 步骤101 ;否则第六函数返回0x0000,结束;
[0302] 在本实施例中,0x0001表示验证成功,0x0000表示验证失败;
[0303] 步骤154 :中间件根据第七函数的第一参数值在全局CSP对象数组中查找对应的 CSP上下文对象,如找到则执行步骤155,如未找到,则报错,结束;
[0304] 具体的,该步骤中的报错为:记录程序最后错误码为0x80090001,函数返回 0x0000 ;
[0305] 步骤155 :中间件创建一个哈希对象m_hash,根据第七函数的第二参数值设置哈 希算法;
[0306] 具体的,在本实施例中,若Algid = 0x8001,哈希算法设置为MD2 ;若Algid = 0x8003,哈希算法设置为MD5 ;若Algid = 0x8004,哈希算法设置为SHA1 ;若Algid = 0x800C,哈希算法设置为SHA256 ;若Algid = 0x800D,哈希算法设置为SHA384 ;若Algid = 0x800E,哈希算法设置为SHA512 ;若Algid = 0x8009,哈希算法设置为HMAC ;其中Algid的 值也可设置为其他不同的数据来表示不同的哈希算法;
[0307] 步骤156 :中间件将哈希对象赋值给第七函数的第五参数,并将哈希对象存储到 查找到的CSP上下文对象中;
[0308] 步骤157 :中间件判断第七函数的第二参数值是否为第四预设值,是则第七函数 返回0x0001,返回步骤101,否则清空创建的哈希对象,第七函数返回0x0001,返回步骤 101 ;
[0309] 优选的,本实施例中的第四预设值为0x8009 ;
[0310] 步骤158 :中间件根据第八函数的第一参数值在全局CSP对象数组中查找对应的 CSP上下文对象,如找到则执行步骤159,如未找到,则报错,结束;
[0311] 具体的,步骤158中的报错为:记录程序最后错误码为0x80090001,函数返回 0x0000 ;
[0312] 步骤159 :中间件通过第八函数的第二参数值在找到的CSP上下文对象中查找有 效哈希对象,如找到则执行步骤160,如未找到则报错,结束;
[0313] 在本实施例中,步骤159中的报错具体为:记录程序最后错误码为0x80090001,函 数返回0x0000 ;
[0314] 步骤160 :中间件判断第八函数的第三参数值是否为第五预设值,是则用第八函 数的第四参数值赋值替换找到的哈希对象中的哈希值,第八函数返回0x0001,返回步骤 101,否则报错,结束;
[0315] 具体的,该步骤中的报错为:记录程序最后错误码为0X8009000A,函数返回 0x0000 ;优选的,第五预设值为0x02 ;
[0316] 步骤161 :中间件根据第九函数的第一参数值在全局CSP对象数组中查找对应的 CSP上下文对象,如找到则执行步骤162,如未找到则报错,结束;
[0317] 在本实施例中,步骤161中的报错具体为:记录程序最后错误码为0x80090001,第 九函数返回0x0000 ;
[0318] 步骤162 :中间件通过第九函数的第二参数值在找到的CSP上下文对象中查找有 效哈希对象,如找到则执行步骤163,如未找到则报错,结束;
[0319] 在本实施例中,步骤162中的报错具体为:记录程序最后错误码为0x80090001,第 九函数返回0x0000 ;
[0320] 步骤163 :中间件根据预先设置的哈希算法对第九函数的第三参数值进行哈希计 算,将计算得到的哈希值保存在找到的哈希对象中,第九函数返回0x0001,返回步骤101 ;
[0321] 步骤164 :中间件根据第十函数的第一参数值在全局CSP对象数组中查找对应的 CSP上下文对象,如找到则执行步骤165,如未找到则报错,结束;
[0322] 具体的,本实施例中该步骤中的报错为:记录程序最后错误码为0x80090001,函 数返回0x0000 ;
[0323] 步骤165 :中间件根据找到的CSP上下文对象中的智能卡对象索引和容器索引获 取对应的容器对象,判断该容器对象是否有效,是则执行步骤166,否则报错,结束;
[0324] 在本实施例中,步骤165中的报错具体为:记录程序最后错误码为0x80090001,第 十函数返回0x0000 ;
[0325] 步骤166 :中间件根据第十函数的第二参数值在CSP上下文对象中查找有效哈希 对象,如找到则执行步骤167,如未找到则报错,结束;
[0326] 具体的,步骤166中的报错为:记录程序最后错误码为0x80090001,函数返回 0x0000 ;
[0327] 步骤167 :中间件从找到的有效哈希对象中获取哈希值;
[0328] 步骤168 :中间件根据第十函数的第三参数值在获取到的容器对象中查找证书对 象;
[0329] 具体的,在本实施例中,如第三参数值为0x01,则在当前智能卡中获取交换证书对 象;如第三参数值为0x02,则在当前智能卡中获取签名证书对象,如无法找到任何证书对 象,则记录程序最后错误码为0x80090003,第十函数返回0x0000,结束;
[0330] 步骤169 :中间件根据证书对象获取非对称交换密钥的私钥在智能卡中的引用索 弓丨,根据引用索引生成签名指令并发送给下层应用;
[0331] 在本实施例中,下层应用接收到签名指令后,使用签名指令中的引用索引所对应 的私钥对中间件获取到的哈希值进行签名,并将所述签名结果返回给所述中间件;
[0332] 步骤170 :中间件根据下层应用的返回值判断签名是否成功,是则将签名结果作 为利用智能卡登录远程计算机的判据,第十函数返回0x0001,返回步骤101,否则报错,结 束;
[0333] 具体的,本实施例中步骤170中的报错为:记录程序最后错误码为0x80090020L, 第十函数返回0x0000。
[0334] 步骤171 :中间件根据第i^一函数的第一参数值在全局CSP对象数组中查找对应 的CSP上下文对象,如找到则执行步骤172,如未找到则报错,结束;
[0335] 具体的,该步骤中的报错为:记录程序最后错误码为0x80090001,第三函数返回 0x0000 ;
[0336] 步骤172 :中间件删除CSP上下文对象,第i^一函数返回0x0001,返回步骤101。
[0337] 在本实施例中,中间件根据找到的CSP上下文对象中的智能卡对象索引和容器索 引获取对应容器对象,包括:中间件根据找到的CSP上下文对象中的智能卡对象索引获取 对应的智能卡对象,根据找到的CSP上下文对象中的容器索引在获取到的智能卡对象中获 取对应的容器对象。
[0338] 在本实施例中,CSP上下文对象创建之后的所有操作都在CSP上下文对象中进行; 0x0001为成功信息,0x0000为失败信息。
[0339] 以上所述,仅为本发明较佳的【具体实施方式】,但本发明的保护范围并不局限于此, 任何熟悉本【技术领域】的技术人员在本发明公开的技术范围内,可轻易想到的变化或替换, 都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围 为准。
【权利要求】
1. 一种生成利用智能卡登录远程计算机的判据的方法,其特征在于,包括: 步骤A0 :当中间件检测到函数被调用时,判断被调用的函数类型,如为第一函数则执 行步骤A1,如为第二函数时执行步骤B1,如为第三函数则执行步骤C1,如为第十函数则执 行步骤L1 ; 步骤A1 :所述中间件在全局CSP对象数组创建CSP上下文对象,设置CSP上下文对象 标识,并将所述CSP上下文对象标识和所述CSP上下文对象建立映射关系,将所述CSP上下 文对象标识存储到所述第一函数的第一参数值所指向的内存地址中; 步骤A2 :所述中间件从所述第一函数的第二参数值中解析出容器名和读卡器名; 步骤A3 :所述中间件判断是否监控到与所述读卡器名所对应的读卡器中的智能卡,是 则执行步骤A4,否则报错,结束; 步骤A4:所述中间件在线程记录列表里面查找是否存在与当前会话对应的监控线程, 是则执行步骤A6,否则执行步骤A5 ;监控线程用于监控本地智能卡的插拔并实时更新智能 卡列表; 步骤A5 :所述中间件获取当前运行线程的模拟令牌并保存;将所述模拟令牌作为创建 线程参数,创建与当前会话对应的监控线程,将所述监控线程的句柄保存在监控线程数组 中与当前会话ID所对应的位置,执行步骤A6 ; 步骤A6:所述中间件判断所有智能卡对象中的读卡器名是否与所述解析得到的读卡 器名匹配,是则将匹配上的智能卡对象的索引保存到所述创建的CSP上下文对象中,执行 步骤A7,否则报错,结束; 步骤A7 :所述中间件判断所述解析得到的容器名是否为空,是则根据默认的筛选条件 找出默认容器对象,并将所述默认容器对象的索引保存到所述创建的CSP上下文对象中, 返回步骤A0,否则根据所述解析得到的容器名在与所述匹配上的智能卡对象中获取对应的 容器对象,并将获取到的容器对象的索引保存到所述创建的CSP上下文对象中,所述第一 函数返回成功信息,返回步骤A0 ; 步骤B1 :所述中间件根据所述第二函数的第一参数值在全局CSP对象数组中查找对应 的CSP上下文对象,如找到则获取当前系统证书库的句柄,执行步骤B2,如未找到则报错, 结束; 步骤B2:所述中间件根据找到的所述CSP上下文对象中的智能卡对象的索引获取对应 的智能卡对象; 步骤B3:所述中间件将所述智能卡对象中的所有容器对象和每个容器对象中的所有 证书对象一起注册至当前系统证书库中; 步骤Μ :所述中间件将所述当前系统证书库的句柄赋值给所述第二函数的第三参数, 将所述当前系统证书库的句柄的长度赋值给所述第二函数的第四参数,返回步骤Α0; 步骤C1 :所述中间件根据所述第三函数的第一参数值在全局CSP对象数组中查找对应 的CSP上下文对象,如找到则执行步骤C2,否则报错,结束; 步骤C2 :所述中间件根据找到的所述CSP上下文对象中的智能卡对象索引和容器索引 获取对应的容器对象,在所述容器对象的所有证书对象中查找非对称交换密钥在智能卡中 的引用索引,如找到则将所述第三函数的第三参数赋值为第一预设值,所述第三函数返回 成功信息,返回步骤Α0 ;如未找到则报错,结束; 步骤LI :所述中间件根据所述第十函数的第一参数值在全局CSP对象数组中查找对应 的CSP上下文对象,如找到则执行步骤L2,否则报错,结束; 步骤L2 :所述中间件根据找到的所述CSP上下文对象中的智能卡对象索引和容器索引 获取对应的容器对象,并判断所述容器对象是否有效,是则执行步骤L3,否则报错,结束; 步骤L3 :所述中间件根据所述第十函数的第二参数值在所述CSP上下文对象中查找有 效哈希对象,如找到则从找到的所述有效哈希对象中获取哈希值,执行步骤L4,否则报错, 结束; 步骤L4:所述中间件根据所述第十函数的第三参数值在获取到的容器对象中查找证 书对象,根据所述证书对象获取非对称交换密钥的私钥在智能卡中的引用索引,根据所述 引用索引生成签名指令并发送给下层应用; 步骤L5:所述中间件根据所述下层应用的返回值判断签名是否成功,是则将签名结果 作为利用智能卡登录远程计算机的判据,所述第十函数返回成功信息,返回步骤A0,否则报 错,结束。
2. 如权利要求1所述的方法,其特征在于,在所述步骤A1中的将所述CSP上下文对象 标识存储到所述第一函数的第一参数值所指向的内存地址中之前包括:中间件判断所述第 一函数的第一参数值是否为空指针,是则报错,结束;否则继续。
3. 如权利要求1所述的方法,其特征在于,所述步骤A2包括: 步骤A2-1 :所述中间件判断所述第一函数的第二参数值的长度是否小于第二预设值, 是则报错,结束;否则执行步骤A2-2 ; 步骤A2-2:所述中间件判断所述第一函数的第二参数值的前四个字符是否为第一预 设字符串,是则执行步骤A2-3,否则报错,结束; 步骤A2-3 :所述中间件从所述第一函数的第二参数的第五个字符开始向后查找第一 预设字符,如找到则将第五个字符到第一预设字符之间的字符串作为读卡器名,将第一预 设字符开始之后的所有字符作为容器名,执行步骤A3;如未找到则报错,结束。
4. 如权利要求1所述的方法,其特征在于,在所述步骤A3之前还包括:所述中间件检 查所述第一函数的第三参数值的标志位,如符合第一条件则报错,结束;如果符合第二条件 则在所述CSP上下文对象中将CSP上下文记录为静默模式的状态,执行步骤A3。
5. 如权利要求1所述的方法,其特征在于,所述步骤A4包括:所述中间件调用一个全 局函数,所述全局函数调用系统API获取当前进程所属会话的会话ID,将所述会话ID作为 数组下标,在全局函数所维护的监控线程数组中查找是否有与所述数组下标所对应的值, 如果查找出来的值为空,则所述当前会话没有对应的监控线程,执行步骤A5,如果查找出来 的值不为空,则所述当前会话存在对应的监控线程,执行步骤A6。
6. 如权利要求1所述的方法,其特征在于,所述中间件判断第一函数被调用时还包括: 步骤S1 :所述监控线程调用系统函数获取模拟令牌,并将模拟令牌设置为当前监控线 程的令牌; 步骤S2 :所述监控线程枚举当前操作系统中的智能卡的动作,如有卡插入则执行步骤 S3,如有卡拔出则执行步骤S4 ; 步骤S3 :所述监控线程为插入的智能卡分配索引,根据与插入智能卡对应的读卡器构 建智能卡对象,并将构建的智能卡对象存储到智能卡列表中与所述索引对应的位置中,从 智能卡中读取智能卡信息并存储到共享内存中,执行步骤S5 ; 步骤S4 :所述监控线程根据与删除的智能卡对应的索引定位到智能卡列表的对应位 置,删除所述对应位置中的智能卡对象,清除共享内存中存储的拔出的智能卡的信息,执行 步骤S5 ; 步骤S5:所述监控线程判断是否要退出运行状态,是则执行步骤S6,否则返回步骤 S2 ; 步骤S6 :所述监控线程将当前监控线程的令牌设置为空,删除模拟令牌。
7. 如权利要求1所述的方法,其特征在于,所述步骤A5与步骤A6之间还包括:所述中 间件在预设时间内判断所述智能卡列表是否为空,是则报错,否则执行步骤A6。
8. 如权利要求1所述的方法,其特征在于,所述步骤A7之前包括:所述中间件对所述 智能卡列表中的每个智能卡对象索引对应的智能卡对象都进行预读,将每个智能卡上对象 中的公有对象读取出来,保存在共享内存中。
9. 如权利要求1所述的方法,其特征在于,所述步骤A7中的所述根据默认的筛选条件 找出默认容器对象具体为: 步骤A7-1 :所述中间件判断所述匹配上的智能卡对象中是否存在容器对象,是则执行 步骤A7-2,否则报错,结束; 步骤A7-2 :所述中间件获取远程计算机所属的域名,将所述获取的域名和容器对象中 所有证书对象中的证书域名进行对比,如果只有一个证书域名和所述获取的域名匹配,则 获取匹配上的证书域名所属的证书对象,执行步骤A7-3 ;如果有多个证书域名和所述获取 的域名匹配,则获取匹配上的最后一个证书域名所属的证书对象,然后执行步骤A7-3;如 果没有证书和所述获取的域名匹配,中间件获取容器对象中的第一个证书对象,执行步骤 A7-3 ; 步骤A7-3 :所述中间件将获取到的证书对象所属容器对象作为默认容器对象。
10. 如权利要求1所述的方法,其特征在于,所述步骤B2与所述步骤B3之间包括:所 述中间件判断所述智能卡对象是否为空,是则报错,结束,否则执行步骤B3。
11. 如权利要求1所述的方法,其特征在于,所述步骤B4具体包括: 步骤B4-1 :所述中间件判断所述第二函数的第三参数值是否为空,是则将所述当前系 统证书库的句柄的长度赋值给所述第二函数的第四参数,删除所述当前系统证书库的句 柄,返回步骤A0 ;否则执行步骤B4-2 ; 步骤B4-2 :所述中间件判断所述当前系统证书库的句柄的长度是否大于所述第二函 数的第四参数值,是则所述中间件删除所述当前系统证书库的句柄,报错,结束;否则所述 中间件将所述当前系统证书库的句柄的长度赋值给所述第二函数的第四参数,将所述当前 系统证书库的句柄赋值给所述第二函数的第三参数,返回步骤A0。
12. 如权利要求1所述的方法,其特征在于,还包括:所述步骤B1之前还包括: 步骤B0 :所述中间件判断所述第二函数的第二参数值,如为0x2A则执行步骤B1,如为 0x06则执行步骤B5,如为0x04则执行步骤B10,如为0x01则执行步骤B14 ; 步骤B5 :所述中间件根据所述第二函数的第一参数值在全局CSP对象数组中查找对应 的CSP上下文对象,如找到则执行步骤B6,如未找到则报错,结束; 步骤B6 :所述中间件判断找到的CSP上下文对象中的容器索引是否为空,是则报错,结 束,否则执行步骤B7; 步骤B7 :所述中间件判断所述第二函数的第三参数值是否为空,是则执行步骤B8,否 则根据找到的所述CSP上下文对象中的智能卡对象索引和容器索引获取对应的容器对象, 将所述获取的容器对象中容器名的长度赋值给所述第二函数的第四参数,返回步骤A0 ; 步骤B8 :所述中间件根据所述容器索引和找到的CSP上下文对象中的智能卡索引获 取对应的容器对象,判断所述容器对象中容器名的长度是否大于所述第二函数的第四参数 值,是则报错,结束;否则执行步骤B9 ; 步骤B9 :所述中间件将所述容器对象中容器名的长度赋值给所述第二函数的第四参 数,将所述容器对象中的容器名赋值给所述第二函数的第三参数,返回步骤A0 ; 步骤B10 :所述中间件根据所述第二函数的第一参数值在全局CSP对象数组中查找其 对应的CSP上下文对象,如找到则执行步骤B11,如未找到则报错,结束; 步骤B11 :所述中间件获取所述中间件在windows平台所注册的CSP名称; 步骤B12 :所述中间件判断所述第二函数的第三参数值是否为空,是则执行步骤B13 ; 否则将所述CSP名称的长度赋值给所述第二函数的第四参数,返回步骤A0 ; 步骤B13 :所述中间件判断所述CSP名称的长度是否大于所述第二函数的第四参数值, 是则报错,结束;否则将所述CSP名称的长度赋值给所述第二函数的第四参数,将所述CSP 名称赋值给所述第二函数的第三参数,第二函数返回成功信息,返回步骤A0 ; 步骤B14 :所述中间件根据所述第二函数的第一参数值在全局CSP对象数组中查找对 应的CSP上下文对象,如找到则执行步骤B15,如未找到则报错,结束; 步骤B15 :所述中间件根据预置数据结构生成一个算法并将其存储到算法列表中; 步骤B16 :所述中间件将所述第二函数的第五参数值和第一设定值进行与运算并判断 运算结果是否等于第二设定值,是则将所述CSP上下文对象中的算法列表查询变量赋值 为初始值,执行步骤B17 ;否则获取所述CSP上下文对象中的算法列表查询变量,执行步骤 B17 ; 步骤B17 :所述中间件判断找到的CSP上下文对象中的算法列表查询变量与算法列表 的长度是否相等,是则报错,结束;否则执行步骤B18 ; 步骤B18 :所述中间件判断所述第二函数的第三参数值是否为空,是则执行步骤B20, 否则执行步骤B19; 步骤B19:所述中间件将所述预置数据结构的长度赋值给所述第二函数的第四参数, 返回步骤A0 ; 步骤B20:所述中间件判断所述预置数据结构的长度是否大于所述第二函数的第四参 数值,是则报错,结束;否则执行步骤B21 ; 步骤B21 :所述中间件将所述算法列表中偏移地址为所述算法列表查询变量的算法赋 值给所述第二函数的第三参数,将所述预置数据结构的长度赋值给所述第二函数的第四参 数,更新所述算法列表查询变量,所述第二函数返回成功信息,返回步骤A0。
13.如权利要求1所述的方法,其特征在于,所述步骤B1中的所述获取当前系统证书库 的句柄具体为: 所述中间件调用系统函数API CertOpenStore打开当前系统证书库,得到当前系统证 书库的句柄,判断所述当前系统证书库的句柄是否为空,是则报错,结束,否则执行步骤B2。
14. 如权利要求1所述的方法,其特征在于,所述步骤Cl与步骤C2之间还包括: 所述中间件判断所述第三函数的第二参数值是否为预定值,是则执行步骤C2,否则报 错,结束。
15. 如权利要求1所述的方法,其特征在于,还包括:所述步骤A0中当所述中间件检测 到第四函数被调用时执行步骤D1 ; 步骤D1 :所述中间件通过所述第四函数的第一参数值在全局CSP对象数组中查找对应 的CSP上下文对象,如找到则执行步骤D1,如未找到则报错,结束; 步骤D2 :所述中间件判断所述第四函数的第二参数值和第三参数值是否分别为第一 预设值和第二预设值,是则执行步骤D3,否则执行其他操作; 步骤D3 :所述中间件根据找到的所述CSP上下文对象中的智能卡对象索引和容器索引 获取对应的容器对象,查找所述容器对象中的证书对象; 步骤D4 :所述中间件判断所述找到的证书对象是否为空,是则报错,结束,否则执行步 骤D5 ; 步骤D5 :所述中间件将所述证书对象中所保存的证书和所述证书的长度分别赋值给 所述第四函数的第四参数和第五参数,所述第四函数返回成功信息,返回步骤A0。
16. 如权利要求15所述的方法,其特征在于,还包括:所述步骤A0中当所述中间件检 测到第五函数被调用时执行步骤E1 ; 步骤E1 :所述中间件根据所述第五函数的第一参数值在全局CSP对象数组中查找对应 的CSP上下文对象,如找到则执行步骤E2,如未找到则报错,结束; 步骤E2 :所述中间件根据找到的所述CSP上下文对象中的智能卡对象索引和容器索引 找到对应的容器对象,删除所述容器对象中的与所述第五函数的第二参数所对应的证书对 象中的密钥对象,所述第五函数返回成功信息,返回步骤A0。
17. 如权利要求1或12或15或16所述的方法,其特征在于,所述根据找到的所述CSP 上下文对象中的智能卡对象索引和容器索引获取对应的容器对象,包括: 所述中间件根据找到的CSP上下文对象中的智能卡对象索引获取对应的智能卡对象, 根据找到的CSP上下文对象中的容器索引在所述获取到的智能卡对象中获取对应的容器 对象。
18. 如权利要求16所述的方法,其特征在于,还包括:所述步骤A0中当中间件检测到 第六函数被调用时执行步骤F1 ; 步骤F1 :所述中间件根据所述第六函数的第一参数值在全局CSP对象数组中查找其对 应的CSP上下文对象,如找到在执行步骤F2,如未找到则报错,结束; 步骤F2:所述中间件判断所述第六函数的第二参数值是否为第三预设值,是则执行步 骤F3,否则报错,结束; 步骤F3 :所述中间件判断所述第六函数的第三参数值是否为空,是则报错,结束;否则 执行步骤F4 ; 步骤F4 :所述中间件将所述第六函数的第三参数值作为用户PIN,通过内部应用程序 验证用户PIN的有效性; 步骤F5 :所述中间件判断所述用户PIN是否验证成功,是则所述第六函数返回成功信 息,返回步骤A0 ;否则所述第六函数返回失败信息,结束。
19. 如权利要求18所述的方法,其特征在于,还包括:所述步骤AO中当中间件检测到 第七函数被调用时执行步骤G1 ; 步骤G1 :所述中间件根据所述第七函数的第一参数值在全局CSP对象数组中查找其对 应的CSP上下文对象,如找到则执行步骤G2,如未找到,则报错,结束; 步骤G2 :所述中间件创建一个哈希对象,根据所述第七函数的第二参数值来设置哈希 算法,将所述哈希对象赋值给所述第七函数的第五参数,并将所述哈希对象存储到查找到 的CSP上下文对象中; 步骤G3 :所述中间件判断所述第七函数的第二参数值是否为第四预设值,是则返回步 骤A0,否则清空所述创建的哈希对象,所述第七函数返回成功信息,返回步骤A0。
20. 如权利要求19所述的方法,其特征在于,所述步骤G2中根据所述第七函数的第二 参数值来设置哈希算法具体为: 若所述第七函数的第二参数值为0x8001,则将哈希算法设置为MD2 ;若所述第七函 数的第二参数值为0x8003,则将哈希算法设置为MD5 ;若所述第七函数的第二参数值为 0x8004,则将哈希算法设置为SHA1 ;若所述第七函数的第二参数值为0x800C,则将哈希算 法设置为SHA256 ;若所述第七函数的第二参数值0x800D,则将哈希算法设置为SHA384 ;若 所述第七函数的第二参数值为0x800E,则将哈希算法设置为SHA512 ;若所述第七函数的第 二参数值为0x8009,则将哈希算法设置为HMAC。
21. 如权利要求19所述的方法,其特征在于,还包括:所述步骤A0中当中间件检测到 第八函数被调用时执行步骤H1 ; 步骤H1 :所述中间件根据所述第八函数的第一参数值在全局CSP对象数组中查找其对 应的CSP上下文对象,如找到则执行步骤H2,如未找到则报错,结束; 步骤H2 :所述中间件通过所述第八函数的第二参数值在找到的CSP上下文对象中查找 哈希对象,如找到则执行步骤H3,如未找到则报错,结束; 步骤H3 :所述中间件判断所述第八函数的第三参数值是否为第五预设值,是则所述中 间件用所述第八函数的第四参数值替换所述找到的哈希对象中的哈希值,所述第八函数返 回成功信息,返回步骤A0,否则报错,结束。
22. 如权利要求21所述的方法,其特征在于,还包括:所述步骤A0中当中间件检测到 第九函数被调用时执行步骤II ; 步骤11 :所述中间件根据所述第九函数的第一参数值在全局CSP对象数组中查找对应 的CSP上下文对象,如找到则执行步骤12,如未找到则报错,结束; 步骤12 :所述中间件通过所述第九函数的第二参数值在找到的CSP上下文对象中查 找哈希对象,如找到则根据预先设置的哈希算法对所述第九函数的第三参数值进行哈希计 算,将计算得到的哈希值保存在找到的哈希对象中,所述第九函数返回成功信息,返回步骤 A0 ;如未找到则报错,结束。
23. 如权利要求1所述的方法,其特征在于,所述步骤L4中的所述中间件根据所述第十 函数的第三参数值在获取到的容器对象中查找证书对象具体为:如所述第十函数的第三参 数值为0x01,则在获取到的容器对象中获取交换证书对象;如所述第十函数的第三参数值 为0x02,则在获取到的容器对象中获取签名证书对象,如无法找到任何证书对象,则报错, 结束。
24. 如权利要求1所述的方法,其特征在于,所述步骤L4与所述步骤L5之间包括:所 述下层应用接收到签名指令后,使用签名指令中的引用索引所对应的私钥对所述中间件获 取到的哈希值进行签名,并将所述签名结果返回给所述中间件。
25. 如权利要求22所述的方法,其特征在于,还包括:所述步骤A0中当中间件检测到 第十一函数被调用时执行步骤J1 ; 步骤J1 :所述中间件根据所述第十一函数的第一参数值在全局CSP对象数组中查找对 应的CSP上下文对象,如找到则执行步骤J2,如未找到则报错,结束; 步骤J2 :所述中间件删除所述CSP上下文对象,返回步骤A0。
【文档编号】H04L29/08GK104092745SQ201410305903
【公开日】2014年10月8日 申请日期:2014年6月30日 优先权日:2014年6月30日
【发明者】陆舟, 于华章 申请人:飞天诚信科技股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1