When I use internet banking with my bank I use something called PIN sentry, i.e. this:
(wikimedia commons image)
To use it I insert my chip-an-pin card (chip side in) and press one of the three top buttons: IDENTIFY, RESPOND or SIGN. The sentry asks me for the PIN and produces an 8 digit code which I then use inside internet banking.
The sentry itself does not contain any keys that are to my account (and EMV already uses public key cryptography anyway) since I can use the PIN sentry of someone else. But I wonder what it actually does to generate those digits.
At first I thought it performed an offline authorization for 1 unit of currency, an authorization that would simply never be cleared. Then the sentry will print the first digits of the HMAC. But this guess has two problems:
At some point the card will want to go online and refuse to perform an offline authorization. I tested this (by using the sentry several times in sequence and the card never rejected it).
EMV has UN (unpredictable number, i.e. random number, at
9F37) which is generated by the card and send as part of a transaction. As far as I am aware the UN is used in the HMAC calculation, therefore an issuer checking HMAC needs the UN. But, if the issuer receives only the digits from HMAC he cannot verify it.
So yeah, I'm out of ideas how this thing can work. But I have yet one more question on this device and PCI-DSS. The summary of the question is therefore:
The PIN sentry generates an 8 digit numeric code, that's relatively easy to bruteforce. How can this be PCI compliant?
It is unlikely that the PIN sentry makes a transaction for one unit of currency. How therefore it can use the chip to validate the PIN and produce an output that can be checked by the issuer?