Java Cardにある種のタイミング攻撃をしようとしています。コマンドの送信から取得までの経過時間を測定する方法が必要です答え。winscard.h
インターフェイスを使用しています。言語はc++
です。私は仕事を簡単にするためにwinscard.h
インターフェースへのラッパーを作成しました。たとえば、APDU
を送信する場合は、このコードを使用していますが、これはうまくいくようです。私は私のコードJava CardへのAPDUコマンドの時刻をC++で測定する最も良い方法
byte pbRecvBuffer[258];
long rv;
if (this->sessionHandle >= this->internal.vSessions.size())
throw new SmartCardException("There is no card inserted");
SCARD_IO_REQUEST pioRecvPci;
pioRecvPci.dwProtocol = (this->internal.vSessions)[sessionHandle].dwActiveProtocol;
pioRecvPci.cbPciLength = sizeof(pioRecvPci);
LPSCARD_IO_REQUEST pioSendPci;
if ((this->internal.vSessions)[sessionHandle].dwActiveProtocol == SCARD_PROTOCOL_T1)
pioSendPci = (LPSCARD_IO_REQUEST)SCARD_PCI_T1;
else
pioSendPci = (LPSCARD_IO_REQUEST)SCARD_PCI_T0;
word expected_length = 258;//apdu.getExpectedLen();
word send_length = apdu.getApduLength();
CardSession session = (this->internal.vSessions).operator[](sessionHandle);
byte * data = const_cast<Apdu&>(apdu).getNonConstantData();
auto start = Timer::now();
rv = SCardTransmit(session.hCard, pioSendPci,data,
send_length, &pioRecvPci, pbRecvBuffer,&expected_length);
auto end = Timer::now();
auto duration = (float)(end - start)/Timer::ticks();
return *new ApduResponse(pbRecvBuffer, expected_length,duration);
class Timer
{
public:
static inline int ticks()
{
LARGE_INTEGER ticks;
QueryPerformanceFrequency(&ticks);
return ticks.LowPart;
}
static inline __int64 now()
{
struct { __int32 low, high; } counter;
__asm cpuid
__asm push EDX
__asm rdtsc
__asm mov counter.low, EAX
__asm mov counter.high, EDX
__asm pop EDX
__asm pop EAX
return *(__int64 *)(&counter);
}
}を更新this回答に基づいて 。
エラーコードThe value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
でコードが失敗します。私の推測は、命令rdtsc
は私のIntelプロセッサではサポートされていないということです。私はIntel Broadwell 5500Uを持っています。 。私はこの種の測定を行い、結果的により正確な応答を得るための適切な方法を探しています。
[Linux/Windowsの両方でCPU時間と壁掛け時間を測定するにはどうすればよいですか?](http://stackoverflow.com/questions/17432502/how-can-i-measure-cpu-time-and) -wall-clock-on-both-linux-windows) –
@MichaelRolandがコードを更新し、私の問題をより明確に説明しました – Marga