小编fgr*_*ieu的帖子

从通用浏览器访问智能卡的架构?或者:如何弥合从浏览器到PC/SC堆栈的差距?

从通用浏览器(通过http(s)连接到服务器),最好是从Javascript访问本地智能卡的可能的客户端架构有哪些,最终用户的安装麻烦最少?服务器需要能够至少向卡发出其选择的APDU(或者可能将其中的一部分委托给它生成的客户端代码).我假设在工作PC/SC堆栈的客户端可用,配有智能卡读卡器.自XP,现代OS X和Unix以来,至少在Windows上这是一个合理的假设.

到目前为止,我已确定了以下选项:

  1. 一些自定义ActiveX.这就是我现有的应用程序使用的(我们在内部开发),一旦获得安装ActiveX的许可,对IE的客户来说非常容易,但它与"通用浏览器"要求不匹配.
    更新:ActiveX主要由不推荐使用的IE支持,包括IE11; 但不是边缘.
  2. 一些PC/SC浏览器扩展使用Netscape Plugin API,这似乎是上面的平滑扩展.我找到的唯一现成的是SConnect,但它似乎还没有活着,它的API 文档(webarchive)不再正式提供,并且它与特定的智能卡供应商有很强的联系.原则可能很好,但为每个平台制作这样的插件将是很多工作.
    更新:许多浏览器都删除了NPAPI支持,包括Chrome和Firefox.
  3. 一个Java Applet,运行在Oracle的JVM(1.)6或更高版本之上,随附javax.smartcardio.从功能的角度来看,这很好,有充分的记录,我可以忍受一些已知的错误,但我害怕在接受Java-as-a-browser-extension时不可抗拒的向下螺旋.

还有其他想法吗?

另外:是否有某种方法可以防止浏览器滥用浏览器所拥有的任何PC/SC接口(例如,提供3个错误的PIN来阻止卡片,只是为了它的肮脏;或者制造一些更邪恶的东西).

cross-browser smartcard pcsc

52
推荐指数
4
解决办法
3万
查看次数

从什么版本的Visual Studio开始vsnprintf大部分都符合标准?

根据微软的文档vsnprintf,该功能至少是2003年版Visual Studio中C(++)运行时库的一部分.

int vsnprintf( char *buffer,        // Storage location for output
               size_t count,        // Maximum number of characters to write
               const char *format,  // Format specification
               va_list argptr )     // Pointer to list of other arguments
Run Code Online (Sandbox Code Playgroud)

我问:Visual Studio的哪个版本是vsnprintfx86和x64的捆绑C(++)RTL的实现,符合C99标准(ISO/IEC 9899:1999),假设

  • #define _CRT_SECURE_NO_WARNINGS以前执行#include <stdio.h>,这是现代版本的Visual Studio RTL所必需的;
  • 如果count大于零,则buffer指向(至少)count可写字符;
  • 格式不NULL符合Microsoft的格式规范语法,适用于特定版本的RTL;
  • 的值count和字符,以产生均足够小以适合类型的数目int;

并且我们希望符合(包括标称输入的基本功能)这些要求(由标准的规范暗示snprintf,vsnprintf引用):

  1. 在上述假设下不产生未定义的行为(包括调用Microsoft的无效参数处理程序);
  2. buffer==NULL和时返回要写入的长度(不包括终止空字符) …

c c++ standards printf visual-studio

14
推荐指数
1
解决办法
993
查看次数

如何在固定宽度类型上强制无符号算术?

以下(C99和更新)代码想要计算一个方块,限制为与原始固定宽度类型相同的位数.

    #include <stdint.h>
     uint8_t  sqr8( uint8_t x) { return x*x; }
    uint16_t sqr16(uint16_t x) { return x*x; }
    uint32_t sqr32(uint32_t x) { return x*x; }
    uint64_t sqr64(uint64_t x) { return x*x; }
Run Code Online (Sandbox Code Playgroud)

问题是:取决于int大小,可以对提升为(signed)int的参数执行一些乘法,结果溢出(signed)int,因此就标准而言是未定义的结果; 并且可以想象错误的结果,特别是在(越来越罕见的)不使用二进制补码的机器.

如果int是32位(分别为16位,64位,80位或128位),即发生对于sqr16(相应的sqr8,sqr32,sqr64)时x0xFFFFF(相应的0xFF,0xFFFFFFFF,0xFFFFFFFFFFFFFFFF).4个功能都不能在C99下正式移植!!

C11或更高版本,或某些版本的C++,是否解决了这种不幸的情况?


一个简单,有效的解决方案是:

    #include <stdint.h>
     uint8_t  sqr8( uint8_t x) { return 1u*x*x; }
    uint16_t sqr16(uint16_t x) { return 1u*x*x; }
    uint32_t sqr32(uint32_t …
Run Code Online (Sandbox Code Playgroud)

c c++ standards-compliance c99

14
推荐指数
1
解决办法
919
查看次数

FP操作在各种x86 CPU上是否完全相同?

不同的x86 CPU(具有内置FPU和合理的最新版本,比如已推出这个千禧年)为其浮点基元产生完全相同的结果,假设在被比较的CPU上有相同的指令,相同的输入和相同的操作参数,例如舍入模式?我对时间上的差异感兴趣,也没有对Pentium FDIV错误感兴趣(因为那个事件很古老而不符合资格).

我猜对于加法,减法,否定和舍入到整数的答案是肯定的,因为它们具有精确的定义,我很难想象实现中的差异是什么(可能是检测溢出时的错误/下溢,但在某些应用程序中这将是一场灾难,所以我想这很久以前就已经被捕获并修复了).

乘法似乎更可能有不同的实现:确定两个DPFPN产品的(比如)最近可表示的双精度浮点数(64位,包括52 + 1尾数),有时需要计算其尾数的乘积(关于104位精度,对于少数LSBits来说,可以说是浪费精力.我想知道这是否尝试过,并且做得正确.或许IEEE-754或某些事实上的标准规定了什么?

师似乎更加微妙.

而且,除了常见的设计之外,我怀疑所有更复杂事物(trig函数,日志......)的实现都可以完全同步,因为可以使用各种数学方法.

我问的是纯粹的nosiness的结合; 愿意改善我的答案 ; 并期望一种方法(某些时候)允许在VM中运行的程序检测假装运行的CPU与真实CPU之间的不匹配.

x86 floating-accuracy

9
推荐指数
1
解决办法
685
查看次数

最快的轮询循环 - 如何修剪 1 个 CPU 周期?

在 ARM Cortex M3(类似于 STM32F101)上的实时应用程序¹中,我需要在尽可能紧密的循环中轮询一些内部外设寄存器直到它为零。我使用位带来访问适当的位。(工作)C 代码是

while (*(volatile uint32_t*)kMyBit != 0);
Run Code Online (Sandbox Code Playgroud)

该代码被复制到片上可执行 RAM 中。经过一些手动优化²,轮询循环下降到以下,我将³计时为 6 个周期:

0x00600200 681A      LDR      r2,[r3,#0x00]
0x00600202 2A00      CMP      r2,#0x00
0x00600204 D1FC      BNE      0x00600200
Run Code Online (Sandbox Code Playgroud)

如何降低投票的不确定性?5 个周期的循环符合我的目标:在它变为零后尽可能接近 15.5 个周期对同一位进行采样。

我的规范要求可靠地检测至少 6.5 个 CPU 时钟周期的低脉冲;如果持续时间少于 12.5 个周期,则可靠地将其归类为短;如果它持续超过 18.5 个周期,就可以可靠地对其进行分类。脉冲与 CPU 时钟没有确定的相位关系,这是我唯一准确的时序参考。这需要最多 5 个时钟的轮询循环。实际上,我正在模拟在几十年前的 8 位 CPU 上运行的代码,该 CPU 可以以 5 个时钟周期进行轮询,而这已成为规范。


我试图通过在循环之前插入 NOP 来抵消代码对齐,在我尝试过的许多变体中,但从未观察到任何变化。

我试图反转 CMP 和 LDR,但仍然得到 6 个周期:

0x00600200 681A      LDR      r2,[r3,#0x00]
; we loop here
0x00600202 2A00      CMP      r2,#0x00
0x00600204 681A      LDR      r2,[r3,#0x00]
0x00600206 …
Run Code Online (Sandbox Code Playgroud)

assembly cortex-m3 micro-optimization

8
推荐指数
1
解决办法
532
查看次数

RSA / ECB / OAEPWithSHA-256AndMGF1Padding但使用SHA-256的MGF1吗?

我在Oracle的Java标准加密提供程序中发现了困难的方法

Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
Run Code Online (Sandbox Code Playgroud)

使用以SHA-1实例化的MFG1;SHA-256仅用于对标签进行哈希处理(实际上是空的)。我发现在MFG1中实际使用SHA-256的唯一解决方案(得到该答案注释的帮助)是使用以下替代形式Cipher.init

cipher.init(Cipher.DECRYPT_MODE, privKey, new OAEPParameterSpec(
    "SHA-256", "MGF1", MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT
));
Run Code Online (Sandbox Code Playgroud)

问:有没有转变Cipher.getInstance会认识到,与类似的效果"RSA/ECB/OAEPWithSHA-256AndMGF1Padding",除了与MGF1使用SHA-256?

java cryptography

7
推荐指数
1
解决办法
2861
查看次数

在32位Windows下使用Amd64指令的轻量级方法?

对于某些使用64位变量的CPU绑定代码,使用Amd64指令集而不是x86是有益的.如何在32位Windows(例如Windows XP SP3)下完成?当然,我假设一个现代的,支持Amd64的CPU.我排除了工作但重量级的方法:将完整的64位操作系统作为虚拟机运行,例如在Virtualbox下运行Amd64的Ubuntu.

我知道需要一些程序集,并且会有限制,特别是解决比32位Windows管理更多的内存.但我正在考虑纯粹的计算任务,只需要适量的内存而不需要调用外部函数.

x86-64 cpu-architecture win32-process

6
推荐指数
1
解决办法
644
查看次数

Java Card 2.2.2:临时RSA公钥为瞬态

我正在设计一个Java Card(2.2.2因此经典)applet,它将在每次使用时接收RSA公钥(使用与问题无关的方式进行验证),然后使用该RSA公钥来验证RSA签名.

出于性能和设备寿命的原因,如何将RSA公钥保存在RAM中(而不是将其写入EEPROM/Flash)?

我的问题是,在javacard.security.KeyBuilderJC 2.2.2中,buildKey(byte keyType, short keyLength, boolean keyEncryption)API似乎没有指定瞬态内存的选项; 我也看不见

是否会将我的RSA公钥的所有更改和使用包括在内beginTransaction()abortTransaction()实现我的目标?

smartcard javacard

5
推荐指数
1
解决办法
398
查看次数

WebUSB API 和 PC/SC 智能卡读卡器

是否在 WebUSB API(在那里起草)的范围内能够使用 PC/SC 设备(例如智能卡读卡器),也许假设它们符合 CCID 标准(许多接近这一点并且可以使用通用驱动程序) )?

如果是,是否有任何概念验证代码显示它如何运行以及使用什么现代浏览器和阅读器组合可以运行?


这是2013 年问题的后续。我正在尝试查找此答案中提出的 WebUSB API 解决方案的状态。

browser pcsc webusb

5
推荐指数
1
解决办法
3144
查看次数

在x86-64平台上计算C(++)中64位无符号参数的(a*b)%m FAST?

我正在寻找一个快速的方法来有效地计算(ab)模n  (在该数学意义上)的a,b,n类型的uint64_t.我可以忍受诸如n!=0甚至是前提条件a<n && b<n.

请注意,C表达式(a*b)%n不会删除它,因为产品被截断为64位.我正在寻找,(uint64_t)(((uint128_t)a*b)%n)除了我没有uint128_t(我知道,在Visual C++中).

我正在使用Visual C++(最好)或GCC/clang内部,充分利用x86-64平台上可用的底层硬件; 或者如果便携式inline功能无法做到这一点.

c x86-64 visual-c++

2
推荐指数
1
解决办法
961
查看次数

从python源代码中删除真正是注释的字符串文字?

我需要快速编写(或借用)任何语言的东西,自动过滤大量的python源代码以删除注释.目标是使目标平台上的代码更紧凑(并且作为旁边的逆向工程甚至更加困难).我必须积极地修改代码的行为,并且可以使用一些剩余的注释.我的输入和输出应该是一个.py文本文件,假设是有效的python 2.x(假设:限制为ASCII,我将负责UTF8).

严格地说,我也不会需要删除通过定义的那种评论

注释以散列字符(#)开头,该散列字符不是字符串文字的一部分,并在物理行的末尾结束.

因为python tokenizer已经为我做了,最后代码被分发为.pyc.太糟糕了,因为我清楚地看到如何做的是干净的(唯一稍微棘手的部分是令人费解的字符串常量的语法在Python).

我的问题是,粗略地看一下我必须过滤的python源代码,它显示它包含了很多注释,这些注释不是由引入的#,而只是字符串文字,不执行任何有用的任务.这些被明确地保存在.pyc标记化文件中.他们到处都是,我被告知要方便自动生成文档和编辑.许多真正是注释的字符串文字都嵌入在函数定义中,例如:

def OnForceStatusChoice(self,event):
    """Action when a status is selected"""
    self.ExecutionPanel.SetFocus()
Run Code Online (Sandbox Code Playgroud)

另一方面,有大量的字符串文字是有用的文本,包括要显示给用户的英文文本,以及表的初始化.这使得无法自动安全地识别那些真正是字符串文字的注释的字符串文字.

从我的抽样中,大多数真正是注释的字符串文字似乎都是由"""(很少有例外,我也许可以忍受),但我理解足够的python知道我无法安全地删除所有这些字符串文字.

我可以安全地(或者对编码风格有一些陈述和合理的假设)假设

  1. 如果.py文件中的第一件事,忽略#注释,是一个字符串文字,它可以递归删除?如果是的话,通过忽略(并保留)#评论旁边的其他内容,可以使这条规则变得更强大吗?
  2. 可以删除从任何行的最左列开始的任何字符串文字?
  3. def可以删除在语法匹配函数定义(如上所述)之后开始的任何字符串文字?如果是,我如何精确定义 语法匹配函数定义

请回答我无法从随机的字节集合中告诉python,这与现实相差无几.

python parsing

-3
推荐指数
1
解决办法
582
查看次数